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.
- package/README.md +354 -283
- package/dist/archiver-AVNBYCKQ.js +15340 -0
- package/dist/archiver-AVNBYCKQ.js.map +1 -0
- package/dist/audit-logger-OBPR7CRO.js +22 -0
- package/dist/auth-UOX5K2BE.js +18 -0
- package/dist/autonomy-ZXDBDQUJ.js +86 -0
- package/dist/autonomy-ZXDBDQUJ.js.map +1 -0
- package/dist/aws-s3-Q4LLZZPD.js +146 -0
- package/dist/aws-s3-Q4LLZZPD.js.map +1 -0
- package/dist/backup-restore-PZ7CYYB7.js +16 -0
- package/dist/blocks-R3PODY47.js +23 -0
- package/dist/bot-QRARP4UN.js +36 -0
- package/dist/brain-7XLLM3KC.js +56 -0
- package/dist/camera-monitor-M5CYKUU4.js +335 -0
- package/dist/camera-monitor-M5CYKUU4.js.map +1 -0
- package/dist/{charts-MMXM6BWW.js → charts-V7ARZNKF.js} +2 -2
- package/dist/chunk-22VGGA7S.js +330 -0
- package/dist/chunk-22VGGA7S.js.map +1 -0
- package/dist/chunk-35WYTA3C.js +382 -0
- package/dist/chunk-35WYTA3C.js.map +1 -0
- package/dist/chunk-3E2PSU2C.js +146 -0
- package/dist/chunk-3E2PSU2C.js.map +1 -0
- package/dist/{chunk-L3F43VPB.js → chunk-4GLYY4NN.js} +2 -2
- package/dist/{chunk-L3F43VPB.js.map → chunk-4GLYY4NN.js.map} +1 -1
- package/dist/{chunk-L3PDU3XN.js → chunk-4UOE5TUZ.js} +4 -4
- package/dist/{chunk-6SNHU3CY.js → chunk-66OJ3WB4.js} +2 -2
- package/dist/chunk-6KONMXQ6.js +297 -0
- package/dist/chunk-6KONMXQ6.js.map +1 -0
- package/dist/chunk-6PMVAAA7.js +196 -0
- package/dist/chunk-6PMVAAA7.js.map +1 -0
- package/dist/chunk-766ASQWE.js +32620 -0
- package/dist/chunk-766ASQWE.js.map +1 -0
- package/dist/chunk-7WQO5J2M.js +29 -0
- package/dist/chunk-7WQO5J2M.js.map +1 -0
- package/dist/chunk-APHSRMBS.js +148 -0
- package/dist/chunk-APHSRMBS.js.map +1 -0
- package/dist/{chunk-4LVWXUNC.js → chunk-AYUKPTSM.js} +57 -39
- package/dist/chunk-AYUKPTSM.js.map +1 -0
- package/dist/chunk-BIPYADGB.js +84 -0
- package/dist/chunk-BIPYADGB.js.map +1 -0
- package/dist/chunk-BRBWNV65.js +457 -0
- package/dist/chunk-BRBWNV65.js.map +1 -0
- package/dist/chunk-BXZ6EA52.js +382 -0
- package/dist/chunk-BXZ6EA52.js.map +1 -0
- package/dist/chunk-EVE7MIIY.js +290 -0
- package/dist/chunk-EVE7MIIY.js.map +1 -0
- package/dist/chunk-F3TTNID2.js +138 -0
- package/dist/chunk-F3TTNID2.js.map +1 -0
- package/dist/chunk-H5RQOFO2.js +190 -0
- package/dist/chunk-H5RQOFO2.js.map +1 -0
- package/dist/chunk-HN3F4WSW.js +145 -0
- package/dist/chunk-HN3F4WSW.js.map +1 -0
- package/dist/{chunk-6DRDKB45.js → chunk-I6BDYQIG.js} +20 -9
- package/dist/chunk-I6BDYQIG.js.map +1 -0
- package/dist/chunk-IZJMVV7O.js +347 -0
- package/dist/chunk-IZJMVV7O.js.map +1 -0
- package/dist/chunk-KM22GV7G.js +211 -0
- package/dist/chunk-KM22GV7G.js.map +1 -0
- package/dist/chunk-MGFBLVR7.js +103 -0
- package/dist/chunk-MGFBLVR7.js.map +1 -0
- package/dist/chunk-MQJ2ECQT.js +228 -0
- package/dist/chunk-MQJ2ECQT.js.map +1 -0
- package/dist/{chunk-F6QUZQGI.js → chunk-MXAPLSJ5.js} +2 -2
- package/dist/{chunk-GK3E2I7A.js → chunk-NHMBTUMW.js} +2 -2
- package/dist/chunk-NPRTSZIF.js +131 -0
- package/dist/chunk-NPRTSZIF.js.map +1 -0
- package/dist/chunk-O7IH7JTI.js +1898 -0
- package/dist/chunk-O7IH7JTI.js.map +1 -0
- package/dist/chunk-OCVQGBJK.js +293 -0
- package/dist/chunk-OCVQGBJK.js.map +1 -0
- package/dist/chunk-P6QINGFL.js +332 -0
- package/dist/chunk-P6QINGFL.js.map +1 -0
- package/dist/chunk-PHDZKPNE.js +91 -0
- package/dist/chunk-PHDZKPNE.js.map +1 -0
- package/dist/chunk-PLDDJCW6.js +49 -0
- package/dist/chunk-PTGTGXV2.js +164 -0
- package/dist/chunk-PTGTGXV2.js.map +1 -0
- package/dist/chunk-REMIY4U2.js +171 -0
- package/dist/chunk-REMIY4U2.js.map +1 -0
- package/dist/chunk-RZ4YESBG.js +141 -0
- package/dist/chunk-RZ4YESBG.js.map +1 -0
- package/dist/chunk-SAX5MHK4.js +111 -0
- package/dist/chunk-SAX5MHK4.js.map +1 -0
- package/dist/{chunk-GVJVEWHI.js → chunk-SJSUSJ47.js} +2 -2
- package/dist/chunk-SPPMCAKG.js +777 -0
- package/dist/chunk-SPPMCAKG.js.map +1 -0
- package/dist/chunk-SVAPX2XN.js +2441 -0
- package/dist/chunk-SVAPX2XN.js.map +1 -0
- package/dist/chunk-TVEWKIK3.js +452 -0
- package/dist/chunk-TVEWKIK3.js.map +1 -0
- package/dist/{chunk-HH2HBTQM.js → chunk-TYAGMJNV.js} +5 -5
- package/dist/{chunk-JXUP2X7V.js → chunk-VEHFVBLI.js} +2 -2
- package/dist/chunk-VNX5GMTN.js +128 -0
- package/dist/chunk-VNX5GMTN.js.map +1 -0
- package/dist/chunk-VRD5CYRL.js +1568 -0
- package/dist/chunk-VRD5CYRL.js.map +1 -0
- package/dist/chunk-WLUHNG6X.js +122 -0
- package/dist/chunk-WLUHNG6X.js.map +1 -0
- package/dist/chunk-WRAKK6K6.js +265 -0
- package/dist/chunk-WRAKK6K6.js.map +1 -0
- package/dist/chunk-XKYRH4FM.js +681 -0
- package/dist/chunk-XKYRH4FM.js.map +1 -0
- package/dist/{chunk-GUBEEYDW.js → chunk-XMCVRVTF.js} +2 -2
- package/dist/{chunk-GUBEEYDW.js.map → chunk-XMCVRVTF.js.map} +1 -1
- package/dist/chunk-ZLZKF2PM.js +310 -0
- package/dist/chunk-ZLZKF2PM.js.map +1 -0
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/client-ZQSFPMOB.js +21 -0
- package/dist/clipboard-manager-TEO2GEDN.js +24 -0
- package/dist/commands/setup.js +3 -3
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/start.js +3 -3
- package/dist/commands/status.js +2 -2
- package/dist/commands/stop.js +2 -2
- package/dist/commands/utils.js +2 -2
- package/dist/cron-explain-HHQKPD3M.js +16 -0
- package/dist/crypto-4AP47IKC.js +14 -0
- package/dist/crypto-4AP47IKC.js.map +1 -0
- package/dist/databases-37X4CI2Y.js +21 -0
- package/dist/databases-37X4CI2Y.js.map +1 -0
- package/dist/discord-B3HUPGQ6.js +70 -0
- package/dist/discord-B3HUPGQ6.js.map +1 -0
- package/dist/dist-UISMLMFN.js +21847 -0
- package/dist/dist-UISMLMFN.js.map +1 -0
- package/dist/email-K7LO2IPB.js +268 -0
- package/dist/email-K7LO2IPB.js.map +1 -0
- package/dist/enhanced-retrieval-DNLLEM4Z.js +753 -0
- package/dist/enhanced-retrieval-DNLLEM4Z.js.map +1 -0
- package/dist/enrichment-pipeline-MNHNW65K.js +13 -0
- package/dist/enrichment-pipeline-MNHNW65K.js.map +1 -0
- package/dist/entity-resolution-Y3IUWEAT.js +24 -0
- package/dist/entity-resolution-Y3IUWEAT.js.map +1 -0
- package/dist/env-IWXUVTCB.js +12 -0
- package/dist/env-IWXUVTCB.js.map +1 -0
- package/dist/google-workspace-DKWUVNGC.js +169 -0
- package/dist/google-workspace-DKWUVNGC.js.map +1 -0
- package/dist/hash-tool-ULQYD7B5.js +22 -0
- package/dist/hash-tool-ULQYD7B5.js.map +1 -0
- package/dist/heartbeat-monitor-GCISLXI3.js +22 -0
- package/dist/heartbeat-monitor-GCISLXI3.js.map +1 -0
- package/dist/image-generation-OSU7FP6F.js +486 -0
- package/dist/image-generation-OSU7FP6F.js.map +1 -0
- package/dist/imessage-NGA2XF2V.js +35 -0
- package/dist/imessage-NGA2XF2V.js.map +1 -0
- package/dist/inbox-summarizer-NRI4S7IF.js +47 -0
- package/dist/inbox-summarizer-NRI4S7IF.js.map +1 -0
- package/dist/incident-response-C5J7Q6DT.js +244 -0
- package/dist/incident-response-C5J7Q6DT.js.map +1 -0
- package/dist/inventory-manager-352OHXWD.js +24 -0
- package/dist/inventory-manager-352OHXWD.js.map +1 -0
- package/dist/jira-GSGDBMIG.js +199 -0
- package/dist/jira-GSGDBMIG.js.map +1 -0
- package/dist/json-tool-QE2SYHEG.js +26 -0
- package/dist/json-tool-QE2SYHEG.js.map +1 -0
- package/dist/key-rotation-DPHU4ZTB.js +18 -0
- package/dist/key-rotation-DPHU4ZTB.js.map +1 -0
- package/dist/lib.d.ts +603 -11
- package/dist/lib.js +161 -35
- package/dist/lib.js.map +1 -1
- package/dist/mailchimp-KKNF6QJ7.js +152 -0
- package/dist/mailchimp-KKNF6QJ7.js.map +1 -0
- package/dist/matrix-QVHG76I7.js +279 -0
- package/dist/matrix-QVHG76I7.js.map +1 -0
- package/dist/{mcp-LS7Q3Z5W.js → mcp-3JI6W7ZE.js} +3 -3
- package/dist/mcp-3JI6W7ZE.js.map +1 -0
- package/dist/microsoft365-UCBKJHNX.js +164 -0
- package/dist/microsoft365-UCBKJHNX.js.map +1 -0
- package/dist/ocr-AC7NPX33.js +22 -0
- package/dist/ocr-AC7NPX33.js.map +1 -0
- package/dist/ollama-BOAMSPLJ.js +8 -0
- package/dist/ollama-BOAMSPLJ.js.map +1 -0
- package/dist/pages-MI523RB7.js +26 -0
- package/dist/pages-MI523RB7.js.map +1 -0
- package/dist/pair-JDFTERIK.js +24 -0
- package/dist/pair-JDFTERIK.js.map +1 -0
- package/dist/pairing-IFQYCPNS.js +10 -0
- package/dist/pairing-IFQYCPNS.js.map +1 -0
- package/dist/pdf-ALQVOEJR.js +17 -0
- package/dist/pdf-ALQVOEJR.js.map +1 -0
- package/dist/presentations-DSV5IHG5.js +1002 -0
- package/dist/presentations-DSV5IHG5.js.map +1 -0
- package/dist/prometheus-JNT2BD4L.js +10 -0
- package/dist/prometheus-JNT2BD4L.js.map +1 -0
- package/dist/providers-J4LYPHDR.js +19 -0
- package/dist/providers-J4LYPHDR.js.map +1 -0
- package/dist/qr-code-WIX4PB4U.js +16 -0
- package/dist/qr-code-WIX4PB4U.js.map +1 -0
- package/dist/quickbooks-XB4NII2S.js +190 -0
- package/dist/quickbooks-XB4NII2S.js.map +1 -0
- package/dist/regex-tool-W4ABRKGK.js +24 -0
- package/dist/regex-tool-W4ABRKGK.js.map +1 -0
- package/dist/scheduler-VK4WFERV.js +63 -0
- package/dist/scheduler-VK4WFERV.js.map +1 -0
- package/dist/search-BCLBO5E3.js +25 -0
- package/dist/search-BCLBO5E3.js.map +1 -0
- package/dist/sendgrid-RNXCAFKM.js +152 -0
- package/dist/sendgrid-RNXCAFKM.js.map +1 -0
- package/dist/shopify-NCXYJB4R.js +171 -0
- package/dist/shopify-NCXYJB4R.js.map +1 -0
- package/dist/signal-6CGDFYL2.js +35 -0
- package/dist/signal-6CGDFYL2.js.map +1 -0
- package/dist/slack-IZQWIKOH.js +75 -0
- package/dist/slack-IZQWIKOH.js.map +1 -0
- package/dist/sms-M3JIOTCW.js +23 -0
- package/dist/sms-M3JIOTCW.js.map +1 -0
- package/dist/{src-K7GASHRH.js → src-VYUE6LRA.js} +138 -32
- package/dist/src-VYUE6LRA.js.map +1 -0
- package/dist/stocks-XXWBPOCU.js +14 -0
- package/dist/stocks-XXWBPOCU.js.map +1 -0
- package/dist/text-transform-6SGUA5Z4.js +22 -0
- package/dist/text-transform-6SGUA5Z4.js.map +1 -0
- package/dist/tools-2RLEI2N6.js +38 -0
- package/dist/tools-2RLEI2N6.js.map +1 -0
- package/dist/tunnel-IWMXUML4.js +301 -0
- package/dist/tunnel-IWMXUML4.js.map +1 -0
- package/dist/twilio-53GEW5JT.js +139 -0
- package/dist/twilio-53GEW5JT.js.map +1 -0
- package/dist/unit-converter-ZYXMEZOE.js +14 -0
- package/dist/unit-converter-ZYXMEZOE.js.map +1 -0
- package/dist/whatsapp-LFX6YKCM.js +35 -0
- package/dist/whatsapp-LFX6YKCM.js.map +1 -0
- package/dist/word-document-7B6SJMAY.js +902 -0
- package/dist/word-document-7B6SJMAY.js.map +1 -0
- package/dist/xero-QYO66D45.js +162 -0
- package/dist/xero-QYO66D45.js.map +1 -0
- package/dist/zapier-webhook-TBZ5YF2A.js +106 -0
- package/dist/zapier-webhook-TBZ5YF2A.js.map +1 -0
- package/drizzle/0002_mushy_master_mold.sql +140 -0
- package/drizzle/meta/0002_snapshot.json +3637 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +100 -98
- package/dist/bot-KJ26BG56.js +0 -15
- package/dist/chunk-4LVWXUNC.js.map +0 -1
- package/dist/chunk-4TG2IG5K.js +0 -5249
- package/dist/chunk-4TG2IG5K.js.map +0 -1
- package/dist/chunk-6DRDKB45.js.map +0 -1
- package/dist/chunk-CI6Q63MM.js +0 -1613
- package/dist/chunk-CI6Q63MM.js.map +0 -1
- package/dist/chunk-KHNYJY2Z.js +0 -178
- package/dist/chunk-KHNYJY2Z.js.map +0 -1
- package/dist/chunk-NSBPE2FW.js +0 -17
- package/dist/discord-ZOJFTVTB.js +0 -49
- package/dist/imessage-JFRB6EJ7.js +0 -14
- package/dist/scheduler-EZ7CZMCS.js +0 -42
- package/dist/signal-T3MCSULM.js +0 -14
- package/dist/slack-N2M4FHAJ.js +0 -54
- package/dist/src-K7GASHRH.js.map +0 -1
- package/dist/tools-24GZHYRF.js +0 -16
- package/dist/whatsapp-VCRUPAO5.js +0 -14
- /package/dist/{bot-KJ26BG56.js.map → audit-logger-OBPR7CRO.js.map} +0 -0
- /package/dist/{chunk-NSBPE2FW.js.map → auth-UOX5K2BE.js.map} +0 -0
- /package/dist/{discord-ZOJFTVTB.js.map → backup-restore-PZ7CYYB7.js.map} +0 -0
- /package/dist/{imessage-JFRB6EJ7.js.map → blocks-R3PODY47.js.map} +0 -0
- /package/dist/{mcp-LS7Q3Z5W.js.map → bot-QRARP4UN.js.map} +0 -0
- /package/dist/{scheduler-EZ7CZMCS.js.map → brain-7XLLM3KC.js.map} +0 -0
- /package/dist/{charts-MMXM6BWW.js.map → charts-V7ARZNKF.js.map} +0 -0
- /package/dist/{chunk-L3PDU3XN.js.map → chunk-4UOE5TUZ.js.map} +0 -0
- /package/dist/{chunk-6SNHU3CY.js.map → chunk-66OJ3WB4.js.map} +0 -0
- /package/dist/{chunk-F6QUZQGI.js.map → chunk-MXAPLSJ5.js.map} +0 -0
- /package/dist/{chunk-GK3E2I7A.js.map → chunk-NHMBTUMW.js.map} +0 -0
- /package/dist/{signal-T3MCSULM.js.map → chunk-PLDDJCW6.js.map} +0 -0
- /package/dist/{chunk-GVJVEWHI.js.map → chunk-SJSUSJ47.js.map} +0 -0
- /package/dist/{chunk-HH2HBTQM.js.map → chunk-TYAGMJNV.js.map} +0 -0
- /package/dist/{chunk-JXUP2X7V.js.map → chunk-VEHFVBLI.js.map} +0 -0
- /package/dist/{slack-N2M4FHAJ.js.map → client-ZQSFPMOB.js.map} +0 -0
- /package/dist/{tools-24GZHYRF.js.map → clipboard-manager-TEO2GEDN.js.map} +0 -0
- /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(``);
|
|
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(``);\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-
|
|
3
|
+
} from "./chunk-MXAPLSJ5.js";
|
|
4
4
|
import {
|
|
5
5
|
transcribeAudio
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-SJSUSJ47.js";
|
|
7
7
|
import {
|
|
8
8
|
scheduleReminder
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-AYUKPTSM.js";
|
|
10
10
|
import {
|
|
11
11
|
chatWithTools
|
|
12
|
-
} from "./chunk-
|
|
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-
|
|
806
|
+
//# sourceMappingURL=chunk-TYAGMJNV.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
chatWithTools
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
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
|