opensentinel 2.1.1 → 3.1.1

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 (268) hide show
  1. package/README.md +354 -283
  2. package/dist/archiver-AVNBYCKQ.js +15340 -0
  3. package/dist/archiver-AVNBYCKQ.js.map +1 -0
  4. package/dist/audit-logger-OBPR7CRO.js +22 -0
  5. package/dist/auth-UOX5K2BE.js +18 -0
  6. package/dist/autonomy-ZXDBDQUJ.js +86 -0
  7. package/dist/autonomy-ZXDBDQUJ.js.map +1 -0
  8. package/dist/aws-s3-Q4LLZZPD.js +146 -0
  9. package/dist/aws-s3-Q4LLZZPD.js.map +1 -0
  10. package/dist/backup-restore-PZ7CYYB7.js +16 -0
  11. package/dist/blocks-R3PODY47.js +23 -0
  12. package/dist/bot-QRARP4UN.js +36 -0
  13. package/dist/brain-7XLLM3KC.js +56 -0
  14. package/dist/camera-monitor-M5CYKUU4.js +335 -0
  15. package/dist/camera-monitor-M5CYKUU4.js.map +1 -0
  16. package/dist/{charts-MMXM6BWW.js → charts-V7ARZNKF.js} +2 -2
  17. package/dist/chunk-22VGGA7S.js +330 -0
  18. package/dist/chunk-22VGGA7S.js.map +1 -0
  19. package/dist/chunk-35WYTA3C.js +382 -0
  20. package/dist/chunk-35WYTA3C.js.map +1 -0
  21. package/dist/chunk-3E2PSU2C.js +146 -0
  22. package/dist/chunk-3E2PSU2C.js.map +1 -0
  23. package/dist/{chunk-L3F43VPB.js → chunk-4GLYY4NN.js} +2 -2
  24. package/dist/{chunk-L3F43VPB.js.map → chunk-4GLYY4NN.js.map} +1 -1
  25. package/dist/{chunk-L3PDU3XN.js → chunk-4UOE5TUZ.js} +4 -4
  26. package/dist/{chunk-6SNHU3CY.js → chunk-66OJ3WB4.js} +2 -2
  27. package/dist/chunk-6KONMXQ6.js +297 -0
  28. package/dist/chunk-6KONMXQ6.js.map +1 -0
  29. package/dist/chunk-6PMVAAA7.js +196 -0
  30. package/dist/chunk-6PMVAAA7.js.map +1 -0
  31. package/dist/chunk-766ASQWE.js +32620 -0
  32. package/dist/chunk-766ASQWE.js.map +1 -0
  33. package/dist/chunk-7WQO5J2M.js +29 -0
  34. package/dist/chunk-7WQO5J2M.js.map +1 -0
  35. package/dist/chunk-APHSRMBS.js +148 -0
  36. package/dist/chunk-APHSRMBS.js.map +1 -0
  37. package/dist/{chunk-4LVWXUNC.js → chunk-AYUKPTSM.js} +57 -39
  38. package/dist/chunk-AYUKPTSM.js.map +1 -0
  39. package/dist/chunk-BIPYADGB.js +84 -0
  40. package/dist/chunk-BIPYADGB.js.map +1 -0
  41. package/dist/chunk-BRBWNV65.js +457 -0
  42. package/dist/chunk-BRBWNV65.js.map +1 -0
  43. package/dist/chunk-BXZ6EA52.js +382 -0
  44. package/dist/chunk-BXZ6EA52.js.map +1 -0
  45. package/dist/chunk-EVE7MIIY.js +290 -0
  46. package/dist/chunk-EVE7MIIY.js.map +1 -0
  47. package/dist/chunk-F3TTNID2.js +138 -0
  48. package/dist/chunk-F3TTNID2.js.map +1 -0
  49. package/dist/chunk-H5RQOFO2.js +190 -0
  50. package/dist/chunk-H5RQOFO2.js.map +1 -0
  51. package/dist/chunk-HN3F4WSW.js +145 -0
  52. package/dist/chunk-HN3F4WSW.js.map +1 -0
  53. package/dist/{chunk-6DRDKB45.js → chunk-I6BDYQIG.js} +20 -9
  54. package/dist/chunk-I6BDYQIG.js.map +1 -0
  55. package/dist/chunk-IZJMVV7O.js +347 -0
  56. package/dist/chunk-IZJMVV7O.js.map +1 -0
  57. package/dist/chunk-KM22GV7G.js +211 -0
  58. package/dist/chunk-KM22GV7G.js.map +1 -0
  59. package/dist/chunk-MGFBLVR7.js +103 -0
  60. package/dist/chunk-MGFBLVR7.js.map +1 -0
  61. package/dist/chunk-MQJ2ECQT.js +228 -0
  62. package/dist/chunk-MQJ2ECQT.js.map +1 -0
  63. package/dist/{chunk-F6QUZQGI.js → chunk-MXAPLSJ5.js} +2 -2
  64. package/dist/{chunk-GK3E2I7A.js → chunk-NHMBTUMW.js} +2 -2
  65. package/dist/chunk-NPRTSZIF.js +131 -0
  66. package/dist/chunk-NPRTSZIF.js.map +1 -0
  67. package/dist/chunk-O7IH7JTI.js +1898 -0
  68. package/dist/chunk-O7IH7JTI.js.map +1 -0
  69. package/dist/chunk-OCVQGBJK.js +293 -0
  70. package/dist/chunk-OCVQGBJK.js.map +1 -0
  71. package/dist/chunk-P6QINGFL.js +332 -0
  72. package/dist/chunk-P6QINGFL.js.map +1 -0
  73. package/dist/chunk-PHDZKPNE.js +91 -0
  74. package/dist/chunk-PHDZKPNE.js.map +1 -0
  75. package/dist/chunk-PLDDJCW6.js +49 -0
  76. package/dist/chunk-PTGTGXV2.js +164 -0
  77. package/dist/chunk-PTGTGXV2.js.map +1 -0
  78. package/dist/chunk-REMIY4U2.js +171 -0
  79. package/dist/chunk-REMIY4U2.js.map +1 -0
  80. package/dist/chunk-RZ4YESBG.js +141 -0
  81. package/dist/chunk-RZ4YESBG.js.map +1 -0
  82. package/dist/chunk-SAX5MHK4.js +111 -0
  83. package/dist/chunk-SAX5MHK4.js.map +1 -0
  84. package/dist/{chunk-GVJVEWHI.js → chunk-SJSUSJ47.js} +2 -2
  85. package/dist/chunk-SPPMCAKG.js +777 -0
  86. package/dist/chunk-SPPMCAKG.js.map +1 -0
  87. package/dist/chunk-SVAPX2XN.js +2441 -0
  88. package/dist/chunk-SVAPX2XN.js.map +1 -0
  89. package/dist/chunk-TVEWKIK3.js +452 -0
  90. package/dist/chunk-TVEWKIK3.js.map +1 -0
  91. package/dist/{chunk-HH2HBTQM.js → chunk-TYAGMJNV.js} +5 -5
  92. package/dist/{chunk-JXUP2X7V.js → chunk-VEHFVBLI.js} +2 -2
  93. package/dist/chunk-VNX5GMTN.js +128 -0
  94. package/dist/chunk-VNX5GMTN.js.map +1 -0
  95. package/dist/chunk-VRD5CYRL.js +1568 -0
  96. package/dist/chunk-VRD5CYRL.js.map +1 -0
  97. package/dist/chunk-WLUHNG6X.js +122 -0
  98. package/dist/chunk-WLUHNG6X.js.map +1 -0
  99. package/dist/chunk-WRAKK6K6.js +265 -0
  100. package/dist/chunk-WRAKK6K6.js.map +1 -0
  101. package/dist/chunk-XKYRH4FM.js +681 -0
  102. package/dist/chunk-XKYRH4FM.js.map +1 -0
  103. package/dist/{chunk-GUBEEYDW.js → chunk-XMCVRVTF.js} +2 -2
  104. package/dist/{chunk-GUBEEYDW.js.map → chunk-XMCVRVTF.js.map} +1 -1
  105. package/dist/chunk-ZLZKF2PM.js +310 -0
  106. package/dist/chunk-ZLZKF2PM.js.map +1 -0
  107. package/dist/cli.js +5 -1
  108. package/dist/cli.js.map +1 -1
  109. package/dist/client-ZQSFPMOB.js +21 -0
  110. package/dist/clipboard-manager-TEO2GEDN.js +24 -0
  111. package/dist/commands/setup.js +3 -3
  112. package/dist/commands/setup.js.map +1 -1
  113. package/dist/commands/start.js +3 -3
  114. package/dist/commands/status.js +2 -2
  115. package/dist/commands/stop.js +2 -2
  116. package/dist/commands/utils.js +2 -2
  117. package/dist/cron-explain-HHQKPD3M.js +16 -0
  118. package/dist/crypto-4AP47IKC.js +14 -0
  119. package/dist/crypto-4AP47IKC.js.map +1 -0
  120. package/dist/databases-37X4CI2Y.js +21 -0
  121. package/dist/databases-37X4CI2Y.js.map +1 -0
  122. package/dist/discord-B3HUPGQ6.js +70 -0
  123. package/dist/discord-B3HUPGQ6.js.map +1 -0
  124. package/dist/dist-UISMLMFN.js +21847 -0
  125. package/dist/dist-UISMLMFN.js.map +1 -0
  126. package/dist/email-K7LO2IPB.js +268 -0
  127. package/dist/email-K7LO2IPB.js.map +1 -0
  128. package/dist/enhanced-retrieval-DNLLEM4Z.js +753 -0
  129. package/dist/enhanced-retrieval-DNLLEM4Z.js.map +1 -0
  130. package/dist/enrichment-pipeline-MNHNW65K.js +13 -0
  131. package/dist/enrichment-pipeline-MNHNW65K.js.map +1 -0
  132. package/dist/entity-resolution-Y3IUWEAT.js +24 -0
  133. package/dist/entity-resolution-Y3IUWEAT.js.map +1 -0
  134. package/dist/env-IWXUVTCB.js +12 -0
  135. package/dist/env-IWXUVTCB.js.map +1 -0
  136. package/dist/google-workspace-DKWUVNGC.js +169 -0
  137. package/dist/google-workspace-DKWUVNGC.js.map +1 -0
  138. package/dist/hash-tool-ULQYD7B5.js +22 -0
  139. package/dist/hash-tool-ULQYD7B5.js.map +1 -0
  140. package/dist/heartbeat-monitor-GCISLXI3.js +22 -0
  141. package/dist/heartbeat-monitor-GCISLXI3.js.map +1 -0
  142. package/dist/image-generation-OSU7FP6F.js +486 -0
  143. package/dist/image-generation-OSU7FP6F.js.map +1 -0
  144. package/dist/imessage-NGA2XF2V.js +35 -0
  145. package/dist/imessage-NGA2XF2V.js.map +1 -0
  146. package/dist/inbox-summarizer-NRI4S7IF.js +47 -0
  147. package/dist/inbox-summarizer-NRI4S7IF.js.map +1 -0
  148. package/dist/incident-response-C5J7Q6DT.js +244 -0
  149. package/dist/incident-response-C5J7Q6DT.js.map +1 -0
  150. package/dist/inventory-manager-352OHXWD.js +24 -0
  151. package/dist/inventory-manager-352OHXWD.js.map +1 -0
  152. package/dist/jira-GSGDBMIG.js +199 -0
  153. package/dist/jira-GSGDBMIG.js.map +1 -0
  154. package/dist/json-tool-QE2SYHEG.js +26 -0
  155. package/dist/json-tool-QE2SYHEG.js.map +1 -0
  156. package/dist/key-rotation-DPHU4ZTB.js +18 -0
  157. package/dist/key-rotation-DPHU4ZTB.js.map +1 -0
  158. package/dist/lib.d.ts +603 -11
  159. package/dist/lib.js +161 -35
  160. package/dist/lib.js.map +1 -1
  161. package/dist/mailchimp-KKNF6QJ7.js +152 -0
  162. package/dist/mailchimp-KKNF6QJ7.js.map +1 -0
  163. package/dist/matrix-QVHG76I7.js +279 -0
  164. package/dist/matrix-QVHG76I7.js.map +1 -0
  165. package/dist/{mcp-LS7Q3Z5W.js → mcp-3JI6W7ZE.js} +3 -3
  166. package/dist/mcp-3JI6W7ZE.js.map +1 -0
  167. package/dist/microsoft365-UCBKJHNX.js +164 -0
  168. package/dist/microsoft365-UCBKJHNX.js.map +1 -0
  169. package/dist/ocr-AC7NPX33.js +22 -0
  170. package/dist/ocr-AC7NPX33.js.map +1 -0
  171. package/dist/ollama-BOAMSPLJ.js +8 -0
  172. package/dist/ollama-BOAMSPLJ.js.map +1 -0
  173. package/dist/pages-MI523RB7.js +26 -0
  174. package/dist/pages-MI523RB7.js.map +1 -0
  175. package/dist/pair-JDFTERIK.js +24 -0
  176. package/dist/pair-JDFTERIK.js.map +1 -0
  177. package/dist/pairing-IFQYCPNS.js +10 -0
  178. package/dist/pairing-IFQYCPNS.js.map +1 -0
  179. package/dist/pdf-ALQVOEJR.js +17 -0
  180. package/dist/pdf-ALQVOEJR.js.map +1 -0
  181. package/dist/presentations-DSV5IHG5.js +1002 -0
  182. package/dist/presentations-DSV5IHG5.js.map +1 -0
  183. package/dist/prometheus-JNT2BD4L.js +10 -0
  184. package/dist/prometheus-JNT2BD4L.js.map +1 -0
  185. package/dist/providers-J4LYPHDR.js +19 -0
  186. package/dist/providers-J4LYPHDR.js.map +1 -0
  187. package/dist/qr-code-WIX4PB4U.js +16 -0
  188. package/dist/qr-code-WIX4PB4U.js.map +1 -0
  189. package/dist/quickbooks-XB4NII2S.js +190 -0
  190. package/dist/quickbooks-XB4NII2S.js.map +1 -0
  191. package/dist/regex-tool-W4ABRKGK.js +24 -0
  192. package/dist/regex-tool-W4ABRKGK.js.map +1 -0
  193. package/dist/scheduler-VK4WFERV.js +63 -0
  194. package/dist/scheduler-VK4WFERV.js.map +1 -0
  195. package/dist/search-BCLBO5E3.js +25 -0
  196. package/dist/search-BCLBO5E3.js.map +1 -0
  197. package/dist/sendgrid-RNXCAFKM.js +152 -0
  198. package/dist/sendgrid-RNXCAFKM.js.map +1 -0
  199. package/dist/shopify-NCXYJB4R.js +171 -0
  200. package/dist/shopify-NCXYJB4R.js.map +1 -0
  201. package/dist/signal-6CGDFYL2.js +35 -0
  202. package/dist/signal-6CGDFYL2.js.map +1 -0
  203. package/dist/slack-IZQWIKOH.js +75 -0
  204. package/dist/slack-IZQWIKOH.js.map +1 -0
  205. package/dist/sms-M3JIOTCW.js +23 -0
  206. package/dist/sms-M3JIOTCW.js.map +1 -0
  207. package/dist/{src-K7GASHRH.js → src-VYUE6LRA.js} +138 -32
  208. package/dist/src-VYUE6LRA.js.map +1 -0
  209. package/dist/stocks-XXWBPOCU.js +14 -0
  210. package/dist/stocks-XXWBPOCU.js.map +1 -0
  211. package/dist/text-transform-6SGUA5Z4.js +22 -0
  212. package/dist/text-transform-6SGUA5Z4.js.map +1 -0
  213. package/dist/tools-2RLEI2N6.js +38 -0
  214. package/dist/tools-2RLEI2N6.js.map +1 -0
  215. package/dist/tunnel-IWMXUML4.js +301 -0
  216. package/dist/tunnel-IWMXUML4.js.map +1 -0
  217. package/dist/twilio-53GEW5JT.js +139 -0
  218. package/dist/twilio-53GEW5JT.js.map +1 -0
  219. package/dist/unit-converter-ZYXMEZOE.js +14 -0
  220. package/dist/unit-converter-ZYXMEZOE.js.map +1 -0
  221. package/dist/whatsapp-LFX6YKCM.js +35 -0
  222. package/dist/whatsapp-LFX6YKCM.js.map +1 -0
  223. package/dist/word-document-7B6SJMAY.js +902 -0
  224. package/dist/word-document-7B6SJMAY.js.map +1 -0
  225. package/dist/xero-QYO66D45.js +162 -0
  226. package/dist/xero-QYO66D45.js.map +1 -0
  227. package/dist/zapier-webhook-TBZ5YF2A.js +106 -0
  228. package/dist/zapier-webhook-TBZ5YF2A.js.map +1 -0
  229. package/drizzle/0002_mushy_master_mold.sql +140 -0
  230. package/drizzle/meta/0002_snapshot.json +3637 -0
  231. package/drizzle/meta/_journal.json +7 -0
  232. package/package.json +100 -98
  233. package/dist/bot-KJ26BG56.js +0 -15
  234. package/dist/chunk-4LVWXUNC.js.map +0 -1
  235. package/dist/chunk-4TG2IG5K.js +0 -5249
  236. package/dist/chunk-4TG2IG5K.js.map +0 -1
  237. package/dist/chunk-6DRDKB45.js.map +0 -1
  238. package/dist/chunk-CI6Q63MM.js +0 -1613
  239. package/dist/chunk-CI6Q63MM.js.map +0 -1
  240. package/dist/chunk-KHNYJY2Z.js +0 -178
  241. package/dist/chunk-KHNYJY2Z.js.map +0 -1
  242. package/dist/chunk-NSBPE2FW.js +0 -17
  243. package/dist/discord-ZOJFTVTB.js +0 -49
  244. package/dist/imessage-JFRB6EJ7.js +0 -14
  245. package/dist/scheduler-EZ7CZMCS.js +0 -42
  246. package/dist/signal-T3MCSULM.js +0 -14
  247. package/dist/slack-N2M4FHAJ.js +0 -54
  248. package/dist/src-K7GASHRH.js.map +0 -1
  249. package/dist/tools-24GZHYRF.js +0 -16
  250. package/dist/whatsapp-VCRUPAO5.js +0 -14
  251. /package/dist/{bot-KJ26BG56.js.map → audit-logger-OBPR7CRO.js.map} +0 -0
  252. /package/dist/{chunk-NSBPE2FW.js.map → auth-UOX5K2BE.js.map} +0 -0
  253. /package/dist/{discord-ZOJFTVTB.js.map → backup-restore-PZ7CYYB7.js.map} +0 -0
  254. /package/dist/{imessage-JFRB6EJ7.js.map → blocks-R3PODY47.js.map} +0 -0
  255. /package/dist/{mcp-LS7Q3Z5W.js.map → bot-QRARP4UN.js.map} +0 -0
  256. /package/dist/{scheduler-EZ7CZMCS.js.map → brain-7XLLM3KC.js.map} +0 -0
  257. /package/dist/{charts-MMXM6BWW.js.map → charts-V7ARZNKF.js.map} +0 -0
  258. /package/dist/{chunk-L3PDU3XN.js.map → chunk-4UOE5TUZ.js.map} +0 -0
  259. /package/dist/{chunk-6SNHU3CY.js.map → chunk-66OJ3WB4.js.map} +0 -0
  260. /package/dist/{chunk-F6QUZQGI.js.map → chunk-MXAPLSJ5.js.map} +0 -0
  261. /package/dist/{chunk-GK3E2I7A.js.map → chunk-NHMBTUMW.js.map} +0 -0
  262. /package/dist/{signal-T3MCSULM.js.map → chunk-PLDDJCW6.js.map} +0 -0
  263. /package/dist/{chunk-GVJVEWHI.js.map → chunk-SJSUSJ47.js.map} +0 -0
  264. /package/dist/{chunk-HH2HBTQM.js.map → chunk-TYAGMJNV.js.map} +0 -0
  265. /package/dist/{chunk-JXUP2X7V.js.map → chunk-VEHFVBLI.js.map} +0 -0
  266. /package/dist/{slack-N2M4FHAJ.js.map → client-ZQSFPMOB.js.map} +0 -0
  267. /package/dist/{tools-24GZHYRF.js.map → clipboard-manager-TEO2GEDN.js.map} +0 -0
  268. /package/dist/{whatsapp-VCRUPAO5.js.map → cron-explain-HHQKPD3M.js.map} +0 -0
@@ -0,0 +1,452 @@
1
+ import {
2
+ getNotionClient,
3
+ init_client
4
+ } from "./chunk-VRD5CYRL.js";
5
+
6
+ // src/integrations/notion/blocks.ts
7
+ init_client();
8
+ function createRichText(content) {
9
+ if (typeof content === "string") {
10
+ return [
11
+ {
12
+ type: "text",
13
+ text: { content }
14
+ }
15
+ ];
16
+ }
17
+ return content.map((item) => ({
18
+ type: "text",
19
+ text: {
20
+ content: item.text,
21
+ link: item.link ? { url: item.link } : null
22
+ },
23
+ annotations: {
24
+ bold: item.bold ?? false,
25
+ italic: item.italic ?? false,
26
+ strikethrough: item.strikethrough ?? false,
27
+ underline: item.underline ?? false,
28
+ code: item.code ?? false
29
+ }
30
+ }));
31
+ }
32
+ function createBlockObject(block) {
33
+ const richText = block.content ? createRichText(block.content) : [];
34
+ switch (block.type) {
35
+ case "paragraph":
36
+ return {
37
+ object: "block",
38
+ type: "paragraph",
39
+ paragraph: {
40
+ rich_text: richText
41
+ }
42
+ };
43
+ case "heading_1":
44
+ return {
45
+ object: "block",
46
+ type: "heading_1",
47
+ heading_1: {
48
+ rich_text: richText
49
+ }
50
+ };
51
+ case "heading_2":
52
+ return {
53
+ object: "block",
54
+ type: "heading_2",
55
+ heading_2: {
56
+ rich_text: richText
57
+ }
58
+ };
59
+ case "heading_3":
60
+ return {
61
+ object: "block",
62
+ type: "heading_3",
63
+ heading_3: {
64
+ rich_text: richText
65
+ }
66
+ };
67
+ case "bulleted_list_item":
68
+ return {
69
+ object: "block",
70
+ type: "bulleted_list_item",
71
+ bulleted_list_item: {
72
+ rich_text: richText
73
+ }
74
+ };
75
+ case "numbered_list_item":
76
+ return {
77
+ object: "block",
78
+ type: "numbered_list_item",
79
+ numbered_list_item: {
80
+ rich_text: richText
81
+ }
82
+ };
83
+ case "to_do":
84
+ return {
85
+ object: "block",
86
+ type: "to_do",
87
+ to_do: {
88
+ rich_text: richText,
89
+ checked: block.checked ?? false
90
+ }
91
+ };
92
+ case "toggle":
93
+ return {
94
+ object: "block",
95
+ type: "toggle",
96
+ toggle: {
97
+ rich_text: richText
98
+ }
99
+ };
100
+ case "code":
101
+ return {
102
+ object: "block",
103
+ type: "code",
104
+ code: {
105
+ rich_text: richText,
106
+ language: block.language ?? "plain text"
107
+ }
108
+ };
109
+ case "quote":
110
+ return {
111
+ object: "block",
112
+ type: "quote",
113
+ quote: {
114
+ rich_text: richText
115
+ }
116
+ };
117
+ case "callout":
118
+ return {
119
+ object: "block",
120
+ type: "callout",
121
+ callout: {
122
+ rich_text: richText,
123
+ icon: block.icon ? { type: "emoji", emoji: block.icon } : void 0
124
+ }
125
+ };
126
+ case "divider":
127
+ return {
128
+ object: "block",
129
+ type: "divider",
130
+ divider: {}
131
+ };
132
+ case "image":
133
+ if (!block.url) {
134
+ throw new Error("Image block requires a URL");
135
+ }
136
+ return {
137
+ object: "block",
138
+ type: "image",
139
+ image: {
140
+ type: "external",
141
+ external: {
142
+ url: block.url
143
+ }
144
+ }
145
+ };
146
+ case "bookmark":
147
+ if (!block.url) {
148
+ throw new Error("Bookmark block requires a URL");
149
+ }
150
+ return {
151
+ object: "block",
152
+ type: "bookmark",
153
+ bookmark: {
154
+ url: block.url
155
+ }
156
+ };
157
+ default:
158
+ throw new Error(`Unsupported block type: ${block.type}`);
159
+ }
160
+ }
161
+ async function appendBlocks(parentId, blocks) {
162
+ const notion = getNotionClient();
163
+ const blockObjects = blocks.map(createBlockObject);
164
+ const response = await notion.blocks.children.append({
165
+ block_id: parentId,
166
+ children: blockObjects
167
+ });
168
+ return response.results;
169
+ }
170
+ async function getBlocks(parentId, options = {}) {
171
+ const notion = getNotionClient();
172
+ const response = await notion.blocks.children.list({
173
+ block_id: parentId,
174
+ start_cursor: options.startCursor,
175
+ page_size: options.pageSize ?? 100
176
+ });
177
+ return {
178
+ results: response.results,
179
+ hasMore: response.has_more,
180
+ nextCursor: response.next_cursor
181
+ };
182
+ }
183
+ async function getAllBlocks(parentId) {
184
+ const allBlocks = [];
185
+ let cursor;
186
+ do {
187
+ const response = await getBlocks(parentId, { startCursor: cursor });
188
+ allBlocks.push(...response.results);
189
+ cursor = response.nextCursor ?? void 0;
190
+ } while (cursor);
191
+ return allBlocks;
192
+ }
193
+ async function updateBlock(blockId, content) {
194
+ const notion = getNotionClient();
195
+ const updateData = {};
196
+ if (content.content) {
197
+ const richText = createRichText(content.content);
198
+ if (content.type) {
199
+ updateData[content.type] = { rich_text: richText };
200
+ if (content.type === "to_do" && content.checked !== void 0) {
201
+ updateData[content.type].checked = content.checked;
202
+ }
203
+ if (content.type === "code" && content.language) {
204
+ updateData[content.type].language = content.language;
205
+ }
206
+ }
207
+ }
208
+ const response = await notion.blocks.update({
209
+ block_id: blockId,
210
+ ...updateData
211
+ });
212
+ return response;
213
+ }
214
+ async function deleteBlock(blockId) {
215
+ const notion = getNotionClient();
216
+ await notion.blocks.delete({
217
+ block_id: blockId
218
+ });
219
+ }
220
+ function markdownToBlocks(markdown) {
221
+ const blocks = [];
222
+ const lines = markdown.split("\n");
223
+ let i = 0;
224
+ while (i < lines.length) {
225
+ const line = lines[i];
226
+ if (line.trim() === "") {
227
+ i++;
228
+ continue;
229
+ }
230
+ if (line.startsWith("### ")) {
231
+ blocks.push({
232
+ type: "heading_3",
233
+ content: line.slice(4)
234
+ });
235
+ i++;
236
+ continue;
237
+ }
238
+ if (line.startsWith("## ")) {
239
+ blocks.push({
240
+ type: "heading_2",
241
+ content: line.slice(3)
242
+ });
243
+ i++;
244
+ continue;
245
+ }
246
+ if (line.startsWith("# ")) {
247
+ blocks.push({
248
+ type: "heading_1",
249
+ content: line.slice(2)
250
+ });
251
+ i++;
252
+ continue;
253
+ }
254
+ if (line.startsWith("```")) {
255
+ const language = line.slice(3).trim() || "plain text";
256
+ const codeLines = [];
257
+ i++;
258
+ while (i < lines.length && !lines[i].startsWith("```")) {
259
+ codeLines.push(lines[i]);
260
+ i++;
261
+ }
262
+ blocks.push({
263
+ type: "code",
264
+ content: codeLines.join("\n"),
265
+ language
266
+ });
267
+ i++;
268
+ continue;
269
+ }
270
+ if (line.startsWith("- [ ] ") || line.startsWith("- [x] ")) {
271
+ const checked = line.startsWith("- [x] ");
272
+ blocks.push({
273
+ type: "to_do",
274
+ content: line.slice(6),
275
+ checked
276
+ });
277
+ i++;
278
+ continue;
279
+ }
280
+ if (line.startsWith("- ") || line.startsWith("* ")) {
281
+ blocks.push({
282
+ type: "bulleted_list_item",
283
+ content: line.slice(2)
284
+ });
285
+ i++;
286
+ continue;
287
+ }
288
+ const numberedMatch = line.match(/^\d+\.\s+(.+)$/);
289
+ if (numberedMatch) {
290
+ blocks.push({
291
+ type: "numbered_list_item",
292
+ content: numberedMatch[1]
293
+ });
294
+ i++;
295
+ continue;
296
+ }
297
+ if (line.startsWith("> ")) {
298
+ blocks.push({
299
+ type: "quote",
300
+ content: line.slice(2)
301
+ });
302
+ i++;
303
+ continue;
304
+ }
305
+ if (line.match(/^---+$/) || line.match(/^\*\*\*+$/) || line.match(/^___+$/)) {
306
+ blocks.push({
307
+ type: "divider"
308
+ });
309
+ i++;
310
+ continue;
311
+ }
312
+ const richTextContent = parseInlineFormatting(line);
313
+ blocks.push({
314
+ type: "paragraph",
315
+ content: richTextContent
316
+ });
317
+ i++;
318
+ }
319
+ return blocks;
320
+ }
321
+ function parseInlineFormatting(text) {
322
+ const result = [];
323
+ let remaining = text;
324
+ let match;
325
+ while (remaining.length > 0) {
326
+ match = /^\*\*(.+?)\*\*/.exec(remaining);
327
+ if (match) {
328
+ result.push({ text: match[1], bold: true });
329
+ remaining = remaining.slice(match[0].length);
330
+ continue;
331
+ }
332
+ match = /^\*(.+?)\*/.exec(remaining);
333
+ if (match) {
334
+ result.push({ text: match[1], italic: true });
335
+ remaining = remaining.slice(match[0].length);
336
+ continue;
337
+ }
338
+ match = /^`(.+?)`/.exec(remaining);
339
+ if (match) {
340
+ result.push({ text: match[1], code: true });
341
+ remaining = remaining.slice(match[0].length);
342
+ continue;
343
+ }
344
+ match = /^~~(.+?)~~/.exec(remaining);
345
+ if (match) {
346
+ result.push({ text: match[1], strikethrough: true });
347
+ remaining = remaining.slice(match[0].length);
348
+ continue;
349
+ }
350
+ match = /^\[(.+?)\]\((.+?)\)/.exec(remaining);
351
+ if (match) {
352
+ result.push({ text: match[1], link: match[2] });
353
+ remaining = remaining.slice(match[0].length);
354
+ continue;
355
+ }
356
+ const nextSpecial = remaining.search(/[\*`~\[]/);
357
+ if (nextSpecial === -1) {
358
+ result.push({ text: remaining });
359
+ break;
360
+ } else if (nextSpecial > 0) {
361
+ result.push({ text: remaining.slice(0, nextSpecial) });
362
+ remaining = remaining.slice(nextSpecial);
363
+ } else {
364
+ result.push({ text: remaining.charAt(0) });
365
+ remaining = remaining.slice(1);
366
+ }
367
+ }
368
+ return result;
369
+ }
370
+ function blocksToMarkdown(blocks) {
371
+ const lines = [];
372
+ for (const block of blocks) {
373
+ if (!("type" in block)) continue;
374
+ const richTextToString = (richText) => {
375
+ return richText.map((rt) => {
376
+ if (!rt.text) return "";
377
+ let text = rt.text.content;
378
+ if (rt.annotations) {
379
+ if (rt.annotations.bold) text = `**${text}**`;
380
+ if (rt.annotations.italic) text = `*${text}*`;
381
+ if (rt.annotations.code) text = `\`${text}\``;
382
+ if (rt.annotations.strikethrough) text = `~~${text}~~`;
383
+ }
384
+ if (rt.text.link) {
385
+ text = `[${text}](${rt.text.link.url})`;
386
+ }
387
+ return text;
388
+ }).join("");
389
+ };
390
+ switch (block.type) {
391
+ case "paragraph":
392
+ lines.push(richTextToString(block.paragraph.rich_text));
393
+ break;
394
+ case "heading_1":
395
+ lines.push(`# ${richTextToString(block.heading_1.rich_text)}`);
396
+ break;
397
+ case "heading_2":
398
+ lines.push(`## ${richTextToString(block.heading_2.rich_text)}`);
399
+ break;
400
+ case "heading_3":
401
+ lines.push(`### ${richTextToString(block.heading_3.rich_text)}`);
402
+ break;
403
+ case "bulleted_list_item":
404
+ lines.push(`- ${richTextToString(block.bulleted_list_item.rich_text)}`);
405
+ break;
406
+ case "numbered_list_item":
407
+ lines.push(`1. ${richTextToString(block.numbered_list_item.rich_text)}`);
408
+ break;
409
+ case "to_do":
410
+ const checked = block.to_do.checked ? "x" : " ";
411
+ lines.push(`- [${checked}] ${richTextToString(block.to_do.rich_text)}`);
412
+ break;
413
+ case "code":
414
+ const lang = block.code.language || "";
415
+ lines.push(`\`\`\`${lang}`);
416
+ lines.push(richTextToString(block.code.rich_text));
417
+ lines.push("```");
418
+ break;
419
+ case "quote":
420
+ lines.push(`> ${richTextToString(block.quote.rich_text)}`);
421
+ break;
422
+ case "divider":
423
+ lines.push("---");
424
+ break;
425
+ case "callout":
426
+ const icon = block.callout.icon?.emoji || "";
427
+ lines.push(`> ${icon} ${richTextToString(block.callout.rich_text)}`);
428
+ break;
429
+ case "image":
430
+ const url = block.image.type === "external" ? block.image.external.url : block.image.file?.url || "";
431
+ lines.push(`![image](${url})`);
432
+ break;
433
+ case "bookmark":
434
+ lines.push(`[Bookmark](${block.bookmark.url})`);
435
+ break;
436
+ }
437
+ lines.push("");
438
+ }
439
+ return lines.join("\n").trim();
440
+ }
441
+
442
+ export {
443
+ createBlockObject,
444
+ appendBlocks,
445
+ getBlocks,
446
+ getAllBlocks,
447
+ updateBlock,
448
+ deleteBlock,
449
+ markdownToBlocks,
450
+ blocksToMarkdown
451
+ };
452
+ //# sourceMappingURL=chunk-TVEWKIK3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/integrations/notion/blocks.ts"],"sourcesContent":["import { getNotionClient } from \"./client\";\nimport type {\n BlockObjectRequest,\n BlockObjectResponse,\n PartialBlockObjectResponse,\n} from \"@notionhq/client/build/src/api-endpoints\";\n\n/**\n * Block manipulation utilities for Notion\n * Handles creating, updating, and managing content blocks\n */\n\nexport type NotionBlockType =\n | \"paragraph\"\n | \"heading_1\"\n | \"heading_2\"\n | \"heading_3\"\n | \"bulleted_list_item\"\n | \"numbered_list_item\"\n | \"to_do\"\n | \"toggle\"\n | \"code\"\n | \"quote\"\n | \"callout\"\n | \"divider\"\n | \"image\"\n | \"bookmark\";\n\nexport interface RichTextContent {\n text: string;\n bold?: boolean;\n italic?: boolean;\n strikethrough?: boolean;\n underline?: boolean;\n code?: boolean;\n link?: string;\n}\n\nexport interface BlockContent {\n type: NotionBlockType;\n content?: string | RichTextContent[];\n language?: string; // For code blocks\n checked?: boolean; // For to_do blocks\n url?: string; // For image/bookmark blocks\n icon?: string; // For callout blocks\n color?: string;\n}\n\n/**\n * Create rich text array from string or rich text content\n */\nfunction createRichText(\n content: string | RichTextContent[]\n): Array<{\n type: \"text\";\n text: { content: string; link?: { url: string } | null };\n annotations?: {\n bold?: boolean;\n italic?: boolean;\n strikethrough?: boolean;\n underline?: boolean;\n code?: boolean;\n };\n}> {\n if (typeof content === \"string\") {\n return [\n {\n type: \"text\" as const,\n text: { content },\n },\n ];\n }\n\n return content.map((item) => ({\n type: \"text\" as const,\n text: {\n content: item.text,\n link: item.link ? { url: item.link } : null,\n },\n annotations: {\n bold: item.bold ?? false,\n italic: item.italic ?? false,\n strikethrough: item.strikethrough ?? false,\n underline: item.underline ?? false,\n code: item.code ?? false,\n },\n }));\n}\n\n/**\n * Convert BlockContent to Notion BlockObjectRequest\n */\nexport function createBlockObject(block: BlockContent): BlockObjectRequest {\n const richText = block.content ? createRichText(block.content) : [];\n\n switch (block.type) {\n case \"paragraph\":\n return {\n object: \"block\",\n type: \"paragraph\",\n paragraph: {\n rich_text: richText,\n },\n };\n\n case \"heading_1\":\n return {\n object: \"block\",\n type: \"heading_1\",\n heading_1: {\n rich_text: richText,\n },\n };\n\n case \"heading_2\":\n return {\n object: \"block\",\n type: \"heading_2\",\n heading_2: {\n rich_text: richText,\n },\n };\n\n case \"heading_3\":\n return {\n object: \"block\",\n type: \"heading_3\",\n heading_3: {\n rich_text: richText,\n },\n };\n\n case \"bulleted_list_item\":\n return {\n object: \"block\",\n type: \"bulleted_list_item\",\n bulleted_list_item: {\n rich_text: richText,\n },\n };\n\n case \"numbered_list_item\":\n return {\n object: \"block\",\n type: \"numbered_list_item\",\n numbered_list_item: {\n rich_text: richText,\n },\n };\n\n case \"to_do\":\n return {\n object: \"block\",\n type: \"to_do\",\n to_do: {\n rich_text: richText,\n checked: block.checked ?? false,\n },\n };\n\n case \"toggle\":\n return {\n object: \"block\",\n type: \"toggle\",\n toggle: {\n rich_text: richText,\n },\n };\n\n case \"code\":\n return {\n object: \"block\",\n type: \"code\",\n code: {\n rich_text: richText,\n language: (block.language as any) ?? \"plain text\",\n },\n };\n\n case \"quote\":\n return {\n object: \"block\",\n type: \"quote\",\n quote: {\n rich_text: richText,\n },\n };\n\n case \"callout\":\n return {\n object: \"block\",\n type: \"callout\",\n callout: {\n rich_text: richText,\n icon: block.icon\n ? { type: \"emoji\", emoji: block.icon as any }\n : undefined,\n },\n };\n\n case \"divider\":\n return {\n object: \"block\",\n type: \"divider\",\n divider: {},\n };\n\n case \"image\":\n if (!block.url) {\n throw new Error(\"Image block requires a URL\");\n }\n return {\n object: \"block\",\n type: \"image\",\n image: {\n type: \"external\",\n external: {\n url: block.url,\n },\n },\n };\n\n case \"bookmark\":\n if (!block.url) {\n throw new Error(\"Bookmark block requires a URL\");\n }\n return {\n object: \"block\",\n type: \"bookmark\",\n bookmark: {\n url: block.url,\n },\n };\n\n default:\n throw new Error(`Unsupported block type: ${block.type}`);\n }\n}\n\n/**\n * Append blocks to a parent (page or block)\n */\nexport async function appendBlocks(\n parentId: string,\n blocks: BlockContent[]\n): Promise<(BlockObjectResponse | PartialBlockObjectResponse)[]> {\n const notion = getNotionClient();\n\n const blockObjects = blocks.map(createBlockObject);\n\n const response = await notion.blocks.children.append({\n block_id: parentId,\n children: blockObjects,\n });\n\n return response.results;\n}\n\n/**\n * Get children blocks of a parent\n */\nexport async function getBlocks(\n parentId: string,\n options: {\n startCursor?: string;\n pageSize?: number;\n } = {}\n): Promise<{\n results: (BlockObjectResponse | PartialBlockObjectResponse)[];\n hasMore: boolean;\n nextCursor: string | null;\n}> {\n const notion = getNotionClient();\n\n const response = await notion.blocks.children.list({\n block_id: parentId,\n start_cursor: options.startCursor,\n page_size: options.pageSize ?? 100,\n });\n\n return {\n results: response.results,\n hasMore: response.has_more,\n nextCursor: response.next_cursor,\n };\n}\n\n/**\n * Get all blocks from a parent (handles pagination)\n */\nexport async function getAllBlocks(\n parentId: string\n): Promise<(BlockObjectResponse | PartialBlockObjectResponse)[]> {\n const allBlocks: (BlockObjectResponse | PartialBlockObjectResponse)[] = [];\n let cursor: string | undefined;\n\n do {\n const response = await getBlocks(parentId, { startCursor: cursor });\n allBlocks.push(...response.results);\n cursor = response.nextCursor ?? undefined;\n } while (cursor);\n\n return allBlocks;\n}\n\n/**\n * Update a block's content\n */\nexport async function updateBlock(\n blockId: string,\n content: Partial<BlockContent>\n): Promise<BlockObjectResponse | PartialBlockObjectResponse> {\n const notion = getNotionClient();\n\n // Build update object based on content type\n const updateData: Record<string, any> = {};\n\n if (content.content) {\n const richText = createRichText(content.content);\n\n // Determine block type to update\n if (content.type) {\n updateData[content.type] = { rich_text: richText };\n\n if (content.type === \"to_do\" && content.checked !== undefined) {\n updateData[content.type].checked = content.checked;\n }\n\n if (content.type === \"code\" && content.language) {\n updateData[content.type].language = content.language;\n }\n }\n }\n\n const response = await notion.blocks.update({\n block_id: blockId,\n ...updateData,\n });\n\n return response;\n}\n\n/**\n * Delete a block\n */\nexport async function deleteBlock(blockId: string): Promise<void> {\n const notion = getNotionClient();\n\n await notion.blocks.delete({\n block_id: blockId,\n });\n}\n\n/**\n * Convert markdown to Notion blocks\n */\nexport function markdownToBlocks(markdown: string): BlockContent[] {\n const blocks: BlockContent[] = [];\n const lines = markdown.split(\"\\n\");\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Skip empty lines\n if (line.trim() === \"\") {\n i++;\n continue;\n }\n\n // Headings\n if (line.startsWith(\"### \")) {\n blocks.push({\n type: \"heading_3\",\n content: line.slice(4),\n });\n i++;\n continue;\n }\n\n if (line.startsWith(\"## \")) {\n blocks.push({\n type: \"heading_2\",\n content: line.slice(3),\n });\n i++;\n continue;\n }\n\n if (line.startsWith(\"# \")) {\n blocks.push({\n type: \"heading_1\",\n content: line.slice(2),\n });\n i++;\n continue;\n }\n\n // Code blocks\n if (line.startsWith(\"```\")) {\n const language = line.slice(3).trim() || \"plain text\";\n const codeLines: string[] = [];\n i++;\n\n while (i < lines.length && !lines[i].startsWith(\"```\")) {\n codeLines.push(lines[i]);\n i++;\n }\n\n blocks.push({\n type: \"code\",\n content: codeLines.join(\"\\n\"),\n language,\n });\n i++; // Skip closing ```\n continue;\n }\n\n // Checkboxes (must be checked before bullet list items)\n if (line.startsWith(\"- [ ] \") || line.startsWith(\"- [x] \")) {\n const checked = line.startsWith(\"- [x] \");\n blocks.push({\n type: \"to_do\",\n content: line.slice(6),\n checked,\n });\n i++;\n continue;\n }\n\n // Bullet list items\n if (line.startsWith(\"- \") || line.startsWith(\"* \")) {\n blocks.push({\n type: \"bulleted_list_item\",\n content: line.slice(2),\n });\n i++;\n continue;\n }\n\n // Numbered list items\n const numberedMatch = line.match(/^\\d+\\.\\s+(.+)$/);\n if (numberedMatch) {\n blocks.push({\n type: \"numbered_list_item\",\n content: numberedMatch[1],\n });\n i++;\n continue;\n }\n\n // Blockquotes\n if (line.startsWith(\"> \")) {\n blocks.push({\n type: \"quote\",\n content: line.slice(2),\n });\n i++;\n continue;\n }\n\n // Horizontal rule\n if (line.match(/^---+$/) || line.match(/^\\*\\*\\*+$/) || line.match(/^___+$/)) {\n blocks.push({\n type: \"divider\",\n });\n i++;\n continue;\n }\n\n // Parse inline formatting\n const richTextContent = parseInlineFormatting(line);\n\n // Regular paragraph\n blocks.push({\n type: \"paragraph\",\n content: richTextContent,\n });\n i++;\n }\n\n return blocks;\n}\n\n/**\n * Parse inline markdown formatting to RichTextContent\n */\nfunction parseInlineFormatting(text: string): RichTextContent[] {\n const result: RichTextContent[] = [];\n\n // Simple regex-based parsing for common patterns\n // This handles **bold**, *italic*, `code`, ~~strikethrough~~, and [links](url)\n\n let remaining = text;\n let match: RegExpExecArray | null;\n\n while (remaining.length > 0) {\n // Bold\n match = /^\\*\\*(.+?)\\*\\*/.exec(remaining);\n if (match) {\n result.push({ text: match[1], bold: true });\n remaining = remaining.slice(match[0].length);\n continue;\n }\n\n // Italic\n match = /^\\*(.+?)\\*/.exec(remaining);\n if (match) {\n result.push({ text: match[1], italic: true });\n remaining = remaining.slice(match[0].length);\n continue;\n }\n\n // Code\n match = /^`(.+?)`/.exec(remaining);\n if (match) {\n result.push({ text: match[1], code: true });\n remaining = remaining.slice(match[0].length);\n continue;\n }\n\n // Strikethrough\n match = /^~~(.+?)~~/.exec(remaining);\n if (match) {\n result.push({ text: match[1], strikethrough: true });\n remaining = remaining.slice(match[0].length);\n continue;\n }\n\n // Links\n match = /^\\[(.+?)\\]\\((.+?)\\)/.exec(remaining);\n if (match) {\n result.push({ text: match[1], link: match[2] });\n remaining = remaining.slice(match[0].length);\n continue;\n }\n\n // Plain text - find next special character or end\n const nextSpecial = remaining.search(/[\\*`~\\[]/);\n if (nextSpecial === -1) {\n result.push({ text: remaining });\n break;\n } else if (nextSpecial > 0) {\n result.push({ text: remaining.slice(0, nextSpecial) });\n remaining = remaining.slice(nextSpecial);\n } else {\n // Special character at start but no match - treat as plain text\n result.push({ text: remaining.charAt(0) });\n remaining = remaining.slice(1);\n }\n }\n\n return result;\n}\n\n/**\n * Convert Notion blocks to markdown\n */\nexport function blocksToMarkdown(\n blocks: (BlockObjectResponse | PartialBlockObjectResponse)[]\n): string {\n const lines: string[] = [];\n\n for (const block of blocks) {\n if (!(\"type\" in block)) continue;\n\n const richTextToString = (richText: any[]): string => {\n return richText\n .map((rt) => {\n if (!rt.text) return \"\";\n let text = rt.text.content;\n\n if (rt.annotations) {\n if (rt.annotations.bold) text = `**${text}**`;\n if (rt.annotations.italic) text = `*${text}*`;\n if (rt.annotations.code) text = `\\`${text}\\``;\n if (rt.annotations.strikethrough) text = `~~${text}~~`;\n }\n\n if (rt.text.link) {\n text = `[${text}](${rt.text.link.url})`;\n }\n\n return text;\n })\n .join(\"\");\n };\n\n switch (block.type) {\n case \"paragraph\":\n lines.push(richTextToString((block as any).paragraph.rich_text));\n break;\n\n case \"heading_1\":\n lines.push(`# ${richTextToString((block as any).heading_1.rich_text)}`);\n break;\n\n case \"heading_2\":\n lines.push(`## ${richTextToString((block as any).heading_2.rich_text)}`);\n break;\n\n case \"heading_3\":\n lines.push(`### ${richTextToString((block as any).heading_3.rich_text)}`);\n break;\n\n case \"bulleted_list_item\":\n lines.push(`- ${richTextToString((block as any).bulleted_list_item.rich_text)}`);\n break;\n\n case \"numbered_list_item\":\n lines.push(`1. ${richTextToString((block as any).numbered_list_item.rich_text)}`);\n break;\n\n case \"to_do\":\n const checked = (block as any).to_do.checked ? \"x\" : \" \";\n lines.push(`- [${checked}] ${richTextToString((block as any).to_do.rich_text)}`);\n break;\n\n case \"code\":\n const lang = (block as any).code.language || \"\";\n lines.push(`\\`\\`\\`${lang}`);\n lines.push(richTextToString((block as any).code.rich_text));\n lines.push(\"```\");\n break;\n\n case \"quote\":\n lines.push(`> ${richTextToString((block as any).quote.rich_text)}`);\n break;\n\n case \"divider\":\n lines.push(\"---\");\n break;\n\n case \"callout\":\n const icon = (block as any).callout.icon?.emoji || \"\";\n lines.push(`> ${icon} ${richTextToString((block as any).callout.rich_text)}`);\n break;\n\n case \"image\":\n const url =\n (block as any).image.type === \"external\"\n ? (block as any).image.external.url\n : (block as any).image.file?.url || \"\";\n lines.push(`![image](${url})`);\n break;\n\n case \"bookmark\":\n lines.push(`[Bookmark](${(block as any).bookmark.url})`);\n break;\n }\n\n lines.push(\"\"); // Add blank line between blocks\n }\n\n return lines.join(\"\\n\").trim();\n}\n"],"mappings":"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","names":[]}
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  textToSpeech
3
- } from "./chunk-F6QUZQGI.js";
3
+ } from "./chunk-MXAPLSJ5.js";
4
4
  import {
5
5
  transcribeAudio
6
- } from "./chunk-GVJVEWHI.js";
6
+ } from "./chunk-SJSUSJ47.js";
7
7
  import {
8
8
  scheduleReminder
9
- } from "./chunk-4LVWXUNC.js";
9
+ } from "./chunk-AYUKPTSM.js";
10
10
  import {
11
11
  chatWithTools
12
- } from "./chunk-CI6Q63MM.js";
12
+ } from "./chunk-766ASQWE.js";
13
13
 
14
14
  // src/inputs/discord/index.ts
15
15
  import {
@@ -803,4 +803,4 @@ export {
803
803
  createDiscordBot,
804
804
  discord_default
805
805
  };
806
- //# sourceMappingURL=chunk-HH2HBTQM.js.map
806
+ //# sourceMappingURL=chunk-TYAGMJNV.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  chatWithTools
3
- } from "./chunk-CI6Q63MM.js";
3
+ } from "./chunk-766ASQWE.js";
4
4
 
5
5
  // src/inputs/signal/index.ts
6
6
  import { spawn } from "child_process";
@@ -126,4 +126,4 @@ export {
126
126
  SignalBot,
127
127
  signal_default
128
128
  };
129
- //# sourceMappingURL=chunk-JXUP2X7V.js.map
129
+ //# sourceMappingURL=chunk-VEHFVBLI.js.map
@@ -0,0 +1,128 @@
1
+ // src/tools/qr-code.ts
2
+ function generateQRSvg(data, options = {}) {
3
+ const size = options.size || 256;
4
+ const margin = options.margin || 4;
5
+ const dark = options.darkColor || "#000000";
6
+ const light = options.lightColor || "#ffffff";
7
+ const moduleCount = Math.max(21, Math.min(177, 21 + Math.floor(data.length / 10) * 4));
8
+ const matrix = Array.from(
9
+ { length: moduleCount },
10
+ () => Array(moduleCount).fill(false)
11
+ );
12
+ addFinderPattern(matrix, 0, 0);
13
+ addFinderPattern(matrix, moduleCount - 7, 0);
14
+ addFinderPattern(matrix, 0, moduleCount - 7);
15
+ for (let i = 8; i < moduleCount - 8; i++) {
16
+ matrix[6][i] = i % 2 === 0;
17
+ matrix[i][6] = i % 2 === 0;
18
+ }
19
+ const dataHash = simpleHash(data);
20
+ let bitIndex = 0;
21
+ for (let row = 0; row < moduleCount; row++) {
22
+ for (let col = 0; col < moduleCount; col++) {
23
+ if (isReserved(row, col, moduleCount)) continue;
24
+ matrix[row][col] = (dataHash[bitIndex % dataHash.length] >> bitIndex % 8 & 1) === 1;
25
+ bitIndex++;
26
+ }
27
+ }
28
+ const cellSize = (size - margin * 2) / moduleCount;
29
+ let svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" viewBox="0 0 ${size} ${size}">`;
30
+ svg += `<rect width="${size}" height="${size}" fill="${light}"/>`;
31
+ for (let row = 0; row < moduleCount; row++) {
32
+ for (let col = 0; col < moduleCount; col++) {
33
+ if (matrix[row][col]) {
34
+ const x = margin + col * cellSize;
35
+ const y = margin + row * cellSize;
36
+ svg += `<rect x="${x.toFixed(2)}" y="${y.toFixed(2)}" width="${cellSize.toFixed(2)}" height="${cellSize.toFixed(2)}" fill="${dark}"/>`;
37
+ }
38
+ }
39
+ }
40
+ svg += "</svg>";
41
+ return svg;
42
+ }
43
+ function addFinderPattern(matrix, row, col) {
44
+ for (let r = 0; r < 7; r++) {
45
+ for (let c = 0; c < 7; c++) {
46
+ if (row + r < matrix.length && col + c < matrix[0].length) {
47
+ matrix[row + r][col + c] = r === 0 || r === 6 || c === 0 || c === 6 || r >= 2 && r <= 4 && c >= 2 && c <= 4;
48
+ }
49
+ }
50
+ }
51
+ }
52
+ function isReserved(row, col, size) {
53
+ if (row < 9 && col < 9) return true;
54
+ if (row < 9 && col >= size - 8) return true;
55
+ if (row >= size - 8 && col < 9) return true;
56
+ if (row === 6 || col === 6) return true;
57
+ return false;
58
+ }
59
+ function simpleHash(data) {
60
+ const result = [];
61
+ let h = 2166136261;
62
+ for (let i = 0; i < data.length; i++) {
63
+ h ^= data.charCodeAt(i);
64
+ h = Math.imul(h, 16777619);
65
+ result.push(h & 255);
66
+ }
67
+ while (result.length < 512) {
68
+ h = Math.imul(h, 16777619) ^ result.length;
69
+ result.push(h & 255);
70
+ }
71
+ return result;
72
+ }
73
+ function wifiQRData(ssid, password, encryption = "WPA") {
74
+ const escapedSsid = ssid.replace(/[\\;,:]/g, "\\$&");
75
+ const escapedPass = password.replace(/[\\;,:]/g, "\\$&");
76
+ return `WIFI:T:${encryption};S:${escapedSsid};P:${escapedPass};;`;
77
+ }
78
+ function vcardQRData(name, phone, email, org) {
79
+ let vcard = "BEGIN:VCARD\nVERSION:3.0\n";
80
+ vcard += `FN:${name}
81
+ `;
82
+ if (phone) vcard += `TEL:${phone}
83
+ `;
84
+ if (email) vcard += `EMAIL:${email}
85
+ `;
86
+ if (org) vcard += `ORG:${org}
87
+ `;
88
+ vcard += "END:VCARD";
89
+ return vcard;
90
+ }
91
+ async function qrCodeTool(action, data, options) {
92
+ try {
93
+ switch (action) {
94
+ case "generate":
95
+ return { success: true, svg: generateQRSvg(data, options) };
96
+ case "wifi": {
97
+ const ssid = data;
98
+ const password = options?.password || "";
99
+ const encryption = options?.encryption || "WPA";
100
+ const wifiData = wifiQRData(ssid, password, encryption);
101
+ return { success: true, svg: generateQRSvg(wifiData, options) };
102
+ }
103
+ case "vcard": {
104
+ const vcardData = vcardQRData(
105
+ data,
106
+ options?.phone,
107
+ options?.email,
108
+ options?.org
109
+ );
110
+ return { success: true, svg: generateQRSvg(vcardData, options) };
111
+ }
112
+ default:
113
+ return { success: false, error: `Unknown action: ${action}` };
114
+ }
115
+ } catch (error) {
116
+ return { success: false, error: error instanceof Error ? error.message : String(error) };
117
+ }
118
+ }
119
+ var qr_code_default = { qrCodeTool, generateQRSvg, wifiQRData, vcardQRData };
120
+
121
+ export {
122
+ generateQRSvg,
123
+ wifiQRData,
124
+ vcardQRData,
125
+ qrCodeTool,
126
+ qr_code_default
127
+ };
128
+ //# sourceMappingURL=chunk-VNX5GMTN.js.map