@blocknote/xl-ai 0.39.0 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/dist/blocknote-xl-ai.cjs +7 -17
  2. package/dist/blocknote-xl-ai.cjs.map +1 -1
  3. package/dist/blocknote-xl-ai.js +1817 -1310
  4. package/dist/blocknote-xl-ai.js.map +1 -1
  5. package/dist/webpack-stats.json +1 -1
  6. package/package.json +13 -11
  7. package/src/AIExtension.ts +101 -98
  8. package/src/api/aiRequest/defaultAIRequestSender.ts +42 -0
  9. package/src/api/aiRequest/execute.ts +92 -0
  10. package/src/api/aiRequest/index.ts +3 -0
  11. package/src/api/aiRequest/types.ts +52 -0
  12. package/src/api/formats/PromptBuilder.ts +16 -40
  13. package/src/api/formats/base-tools/createAddBlocksTool.ts +90 -85
  14. package/src/api/formats/base-tools/createUpdateBlockTool.ts +67 -75
  15. package/src/api/formats/base-tools/delete.ts +23 -21
  16. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/Add heading (h1) and code block_1_2b1987665a8c6b76ea1cc84255389571.json +15 -0
  17. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/add a list (end)_1_d09f092a3a86410797b84afbe6a05773.json +15 -0
  18. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/add a new paragraph (empty doc)_1_ca2502e6ccea5088da25c3f548a88adc.json +15 -0
  19. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/add a new paragraph (end)_1_97ed001b6f5aed92d99361bc27ca0de9.json +15 -0
  20. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/add a new paragraph (start)_1_83b238d8e21398ee970fac58c746fe19.json +15 -0
  21. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/Add heading (h1) and code block_1_138de1ba18f0c4a7c084805a95d8aced.json +15 -0
  22. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/add a list (end)_1_e8b5b0d45734575f7ba8e685f6787aca.json +15 -0
  23. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/add a new paragraph (empty doc)_1_1ac8c5c60083d88192ef7e84254cb786.json +15 -0
  24. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/add a new paragraph (end)_1_a33718ee9e8c30a7679da0e2ea5443bf.json +15 -0
  25. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/add a new paragraph (start)_1_9b1a71da901951950261005a76c3444a.json +15 -0
  26. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/Add heading (h1) and code block_1_d64b87442b874d6c9d4a16dcc4f0df14.json +15 -0
  27. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/add a list (end)_1_acd39fdc6762628fe6f6f97d96d70a78.json +15 -0
  28. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/add a new paragraph (empty doc)_1_3912ffdff061476f701b59e0f28a5515.json +15 -0
  29. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/add a new paragraph (end)_1_f047b5323417dfe603d6f28a0f063aa2.json +15 -0
  30. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/add a new paragraph (start)_1_6e56df97b3441430062e0b5d979d53c9.json +15 -0
  31. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/Add heading (h1) and code block_1_787274f40054195631a7e1b7f70b88f0.json +15 -0
  32. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/add a list (end)_1_ac04492f6c52be72c3dc24214a0cf744.json +15 -0
  33. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/add a new paragraph (empty doc)_1_5b51dd620d4b53f36159ec97780b2929.json +15 -0
  34. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/add a new paragraph (end)_1_17d834e2d1cae83d1da0998fdfb46c08.json +15 -0
  35. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/add a new paragraph (start)_1_fded5061f67d6e01b6704bcaf1181daa.json +15 -0
  36. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/add and update paragraph_1_c859fc3e363e6b44c406982880adeaf8.json +15 -0
  37. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/add paragraph and update selection_1_a721c27bc0944c3390dbcf6cbc4aa30d.json +15 -0
  38. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/add and update paragraph_1_fc80a600d06d9b0a834b3a8dc062d077.json +15 -0
  39. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/add paragraph and update selection_1_ea6525e3996561d49f3baaa53e5f4367.json +15 -0
  40. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/add and update paragraph_1_a6ed8e1b1d7287f11052e60d21aa3c61.json +15 -0
  41. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/add paragraph and update selection_1_3f688e4336780f36c03fe2e06fb38ae1.json +15 -0
  42. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/add and update paragraph_1_2ac4e99d05838a4666b65cfe9ffceee9.json +15 -0
  43. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/add paragraph and update selection_1_dafc9c956b17f814f2e5daf2effc4612.json +15 -0
  44. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Delete/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/delete first block_1_24119724ddeddbe1d724375ad7546eef.json +15 -0
  45. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Delete/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/delete first block_1_fd0a1c180a2d6c7165823af96ca7a444.json +15 -0
  46. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Delete/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/delete first block_1_5c60f0de80e4a010dcf6e7b2f534b1d7.json +15 -0
  47. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Delete/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/delete first block_1_9ee58319810833bcc30596aa06091958.json +15 -0
  48. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/clear block formatting_1_327facc19973ed5bf5dfbb06bc842f58.json +15 -0
  49. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/drop mark and link and change text within mark_1_68d51d1950b2878e08616f9effbee616.json +15 -0
  50. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/drop mark and link_1_1acc3cfa3a758ee4118f48b99e56f7b5.json +15 -0
  51. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/modify nested content_1_9158921bdd72e8f26eed1d4a3ccff6a4.json +15 -0
  52. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/modify parent content_1_a2946c73d9c3eeca81e4b4b08213a8a2.json +15 -0
  53. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/plain source block, add mention_1_91c94c8501e2f1d5d25c8e9c360dd3d1.json +15 -0
  54. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/standard update_1_adde6c9d6144449d4c436ed39a9afcb1.json +15 -0
  55. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/styles + ic in source block, remove mark_1_4d2b9b00dc36b2bb12aae561adde829e.json +15 -0
  56. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/styles + ic in source block, remove mention_1_06ade1c91064a7b257315d7cfb3dae1c.json +15 -0
  57. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/styles + ic in source block, replace content_1_24881d7683d6ecbd852f58f6580259f4.json +15 -0
  58. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/styles + ic in source block, update mention prop_1_1c9a4f955e0248798e87ab2412de660d.json +15 -0
  59. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/styles + ic in source block, update text_1_9e3a8c2b7c0c40aa89c4b52ccf040007.json +15 -0
  60. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/styles + ic in target block, add mark (paragraph)_1_d4c19bfff5993efff243e799e4055cc9.json +15 -0
  61. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/styles + ic in target block, add mark (word)_1_e31071ae9ad80a23786ec0afc5106c32.json +15 -0
  62. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/translate selection_1_efc8d37a125c48a5d0af15ecaf8e4b20.json +15 -0
  63. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/turn paragraphs into list_1_3ba9845d9c519b43ddbadaddb122d431.json +15 -0
  64. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/update block prop and content_1_4f6fdb800f1928aed2629f707b95b0da.json +15 -0
  65. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/update block prop_1_b25dd6e47055e54d58f1fd1f18feb14d.json +15 -0
  66. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/update block type and content_1_de3f09510d3c3eee14653fe5799dbae7.json +15 -0
  67. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (streaming)/update block type_1_d805af33ab12e1bf8f2cb1a055a91fbd.json +15 -0
  68. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/clear block formatting_1_3b802465d0bbbdbbcb387b14492eefcc.json +15 -0
  69. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/drop mark and link and change text within mark_1_1138449389739970ddab00e2ca2b4bca.json +15 -0
  70. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/drop mark and link_1_2f40ee8072a0c34e771a2bd001d04b3a.json +15 -0
  71. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/modify nested content_1_3d19c192afee48b2656b6bdf3ac80415.json +15 -0
  72. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/modify parent content_1_88d6bccbefaf007c2c02e7e007c0f70b.json +15 -0
  73. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/plain source block, add mention_1_89cf6c28cb2ec992330f7c1bdc342068.json +15 -0
  74. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/standard update_1_b300195a352d5bddf97a0136eeb314e6.json +15 -0
  75. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/styles + ic in source block, remove mark_1_008db1a44c8ee4e4d98c2e62c05f1906.json +15 -0
  76. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/styles + ic in source block, remove mention_1_9a1800c42b72be41038a25622ff00709.json +15 -0
  77. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/styles + ic in source block, replace content_1_0463e82390d623aec168d4e483a8e7c1.json +15 -0
  78. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/styles + ic in source block, update mention prop_1_cf6b0ebb12aa86b848af40e9fa5aa4c6.json +15 -0
  79. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/styles + ic in source block, update text_1_2b8a7aa1c2a0945eb657e1784120dabc.json +15 -0
  80. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/styles + ic in target block, add mark (paragraph)_1_7f14399291525650d7f05c5015dd3b59.json +15 -0
  81. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/styles + ic in target block, add mark (word)_1_710f89bc66a6352e1c21328e600f2536.json +15 -0
  82. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/translate selection_1_d2ee0ac3b245b97f7a730d85a4575ac3.json +15 -0
  83. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/turn paragraphs into list_1_d2eeb79d3f7120d2c9d698e3b82c7362.json +15 -0
  84. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/update block prop and content_1_e22ef915ccf69ed6d2eb9f1a04b86c20.json +15 -0
  85. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/update block prop_1_6d4c550d09a7bfdb440308f277b85a11.json +15 -0
  86. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/update block type and content_1_2448cba67be91338d1977d4a980761a6.json +15 -0
  87. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/update block type_1_88fade9a250bf912d8d65f9db17e6de7.json +15 -0
  88. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/clear block formatting_1_67c4abf409c5217946a8fd26353f3d5c.json +15 -0
  89. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/drop mark and link and change text within mark_1_4d1645603f58ac95cefa5802e9d0b576.json +15 -0
  90. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/drop mark and link_1_8235f32b241ce454e355284db306f2b5.json +15 -0
  91. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/modify nested content_1_1e7e3f801e8b2fcad2e947f25b842d59.json +15 -0
  92. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/modify parent content_1_06951fbd3511111eb460efd853b4c6ee.json +15 -0
  93. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/plain source block, add mention_1_d27b598add3108097cd76a3113395221.json +15 -0
  94. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/standard update_1_3e742ef6a27c2a70d6a34483f81b80cd.json +15 -0
  95. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/styles + ic in source block, remove mark_1_3157ee5ddce8f578c94b14a1d8ee0694.json +15 -0
  96. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/styles + ic in source block, remove mention_1_53046bb3c98a3ecc79d2ccc9f9ee1f88.json +15 -0
  97. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/styles + ic in source block, replace content_1_d2aedab8bc5dae6b29a5dd2da56165d7.json +15 -0
  98. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/styles + ic in source block, update mention prop_1_fddbbf8781b8c27f9e51a3f0183f370c.json +15 -0
  99. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/styles + ic in source block, update text_1_350896c5ea1c2ae3930e8300d37eb670.json +15 -0
  100. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/styles + ic in target block, add mark (paragraph)_1_da57da0afcca08a77da5df430ef1db17.json +15 -0
  101. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/styles + ic in target block, add mark (word)_1_717f43f6e3302767b191ed31d11b1dd6.json +15 -0
  102. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/translate selection_1_0e4c67cc4858f5dfe2f2004e598cdfbd.json +15 -0
  103. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/turn paragraphs into list_1_03c3d437686de6faba00429649340a81.json +15 -0
  104. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/update block prop and content_1_dd58f52c343818059aa71a9676a172d2.json +15 -0
  105. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/update block prop_1_a4f7c3617705406313b619c566afef36.json +15 -0
  106. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/update block type and content_1_9b630368d36a8a4420b20bd1e82e455d.json +15 -0
  107. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming + generateObject)/update block type_1_5da70d5932f66c0ba6f5b15bbb05f68e.json +15 -0
  108. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/clear block formatting_1_ec9d93709e473574521d55108aa27f8f.json +15 -0
  109. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/drop mark and link and change text within mark_1_6b7b58db82605ee0f2fe5146738274dd.json +15 -0
  110. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/drop mark and link_1_4fa98468d00af0302fb35faba6aa2823.json +15 -0
  111. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/modify nested content_1_e761f6071dd9550f02555f17668007d5.json +15 -0
  112. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/modify parent content_1_57bc2951494344f4cd0062fefce14e5f.json +15 -0
  113. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/plain source block, add mention_1_88263a5a62758f9c809abbab15d1c4c7.json +15 -0
  114. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/standard update_1_a68854dc4dee1520292cf8b8816d3bf1.json +15 -0
  115. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/styles + ic in source block, remove mark_1_44bcd73901e9f2eef1a454db1dd3a05d.json +15 -0
  116. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/styles + ic in source block, remove mention_1_89aa084ced0d3526355fa9ec0a7a0f38.json +15 -0
  117. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/styles + ic in source block, replace content_1_3f251996dcb01d2a4adcb6b548554cc5.json +15 -0
  118. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/styles + ic in source block, update mention prop_1_61b231ae85994a3eec1c2eaabb2b3e80.json +15 -0
  119. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/styles + ic in source block, update text_1_3fd6871badc2f924056864cd76a571c0.json +15 -0
  120. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/styles + ic in target block, add mark (paragraph)_1_728e83ee8b26541816af7dcf417e127b.json +15 -0
  121. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/styles + ic in target block, add mark (word)_1_abd0a85b8c45cfa0b4449a382dc81602.json +15 -0
  122. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/translate selection_1_c0b30a449a94314760b815a202ee6f64.json +15 -0
  123. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/turn paragraphs into list_1_cfbaa99fe0298f4754b6bdd81c0a9601.json +15 -0
  124. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/update block prop and content_1_a560a1761f87da8f3bdb7b42357ba4ec.json +15 -0
  125. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/update block prop_1_d959d9e97f6cf99760b26b7d17c11244.json +15 -0
  126. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/update block type and content_1_649d6a7338cc6b674c4b4c38184c1037.json +15 -0
  127. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.responses/gpt-4o-2024-08-06 (streaming)/update block type_1_9cbb96117eed2b41fee6c0802fe00bb2.json +15 -0
  128. package/src/api/formats/html-blocks/defaultHTMLPromptBuilder.ts +158 -141
  129. package/src/api/formats/html-blocks/htmlBlocks.test.ts +71 -16
  130. package/src/api/formats/html-blocks/htmlBlocks.ts +62 -22
  131. package/src/api/formats/html-blocks/htmlPromptData.ts +36 -0
  132. package/src/api/formats/index.ts +72 -0
  133. package/src/api/formats/json/defaultJSONPromptBuilder.ts +145 -118
  134. package/src/api/formats/json/errorHandling.test.ts +75 -63
  135. package/src/api/formats/json/json.test.ts +19 -10
  136. package/src/api/formats/json/json.ts +70 -27
  137. package/src/api/formats/json/jsonPromptData.ts +34 -0
  138. package/src/api/formats/json/tools/jsontools.test.ts +7 -16
  139. package/src/api/formats/markdown-blocks/defaultMarkdownPromptBuilder.ts +150 -89
  140. package/src/api/formats/markdown-blocks/markdownBlocks.test.ts +20 -15
  141. package/src/api/formats/markdown-blocks/markdownBlocks.ts +70 -27
  142. package/src/api/formats/markdown-blocks/markdownPromptData.ts +38 -1
  143. package/src/api/formats/tests/sharedTestCases.ts +33 -8
  144. package/src/api/formats/tests/validateTestEnvironment.test.ts +8 -2
  145. package/src/api/index.ts +2 -44
  146. package/src/api/schema/schemaToJSONSchema.ts +1 -0
  147. package/src/blocknoteAIClient/client.ts +14 -70
  148. package/src/components/AIMenu/AIMenu.tsx +1 -1
  149. package/src/components/AIMenu/getDefaultAIMenuItems.tsx +49 -36
  150. package/src/index.ts +2 -3
  151. package/src/streamTool/StreamToolExecutor.ts +261 -0
  152. package/src/streamTool/filterNewOrUpdatedOperations.test.ts +17 -4
  153. package/src/streamTool/filterNewOrUpdatedOperations.ts +5 -1
  154. package/src/streamTool/filterValidOperations.test.ts +5 -0
  155. package/src/streamTool/filterValidOperations.ts +4 -0
  156. package/src/streamTool/index.ts +6 -0
  157. package/src/streamTool/jsonSchema.ts +3 -1
  158. package/src/streamTool/preprocess.test.ts +8 -0
  159. package/src/streamTool/preprocess.ts +7 -0
  160. package/src/streamTool/streamTool.ts +11 -14
  161. package/src/streamTool/toValidatedOperations.test.ts +1 -0
  162. package/src/streamTool/toValidatedOperations.ts +4 -0
  163. package/src/streamTool/toolDefinitionsToToolSet.ts +24 -0
  164. package/src/streamTool/vercelAiSdk/clientside/ClientSideTransport.ts +219 -0
  165. package/src/streamTool/vercelAiSdk/util/UIMessageStreamToOperationsResult.ts +51 -0
  166. package/src/streamTool/vercelAiSdk/util/chatHandlers.ts +314 -0
  167. package/src/streamTool/vercelAiSdk/util/partialObjectStreamUtil.ts +120 -0
  168. package/src/testUtil/cases/editors/blockFormatting.ts +1 -5
  169. package/src/testUtil/cases/editors/emptyEditor.ts +1 -5
  170. package/src/testUtil/cases/editors/formattingAndMentions.ts +1 -5
  171. package/src/testUtil/cases/editors/simpleEditor.ts +2 -10
  172. package/src/testUtil/cases/editors/tables.ts +1 -5
  173. package/src/testUtil/cases/updateOperationTestCases.ts +3 -15
  174. package/src/testUtil/testAIModels.ts +11 -14
  175. package/src/types.ts +63 -0
  176. package/src/util/stream.ts +4 -4
  177. package/types/src/AIExtension.d.ts +12 -42
  178. package/types/src/api/aiRequest/defaultAIRequestSender.d.ts +4 -0
  179. package/types/src/api/aiRequest/execute.d.ts +31 -0
  180. package/types/src/api/aiRequest/index.d.ts +3 -0
  181. package/types/src/api/aiRequest/types.d.ts +42 -0
  182. package/types/src/api/formats/PromptBuilder.d.ts +13 -27
  183. package/types/src/api/formats/base-tools/createUpdateBlockTool.d.ts +2 -2
  184. package/types/src/api/formats/html-blocks/defaultHTMLPromptBuilder.d.ts +2 -1
  185. package/types/src/api/formats/html-blocks/htmlBlocks.d.ts +36 -15
  186. package/types/src/api/formats/html-blocks/htmlPromptData.d.ts +9 -0
  187. package/types/src/api/formats/index.d.ts +166 -0
  188. package/types/src/api/formats/json/defaultJSONPromptBuilder.d.ts +3 -2
  189. package/types/src/api/formats/json/json.d.ts +39 -17
  190. package/types/src/api/formats/json/jsonPromptData.d.ts +42 -0
  191. package/types/src/api/formats/markdown-blocks/defaultMarkdownPromptBuilder.d.ts +3 -2
  192. package/types/src/api/formats/markdown-blocks/markdownBlocks.d.ts +39 -16
  193. package/types/src/api/formats/markdown-blocks/markdownPromptData.d.ts +30 -0
  194. package/types/src/api/formats/tests/sharedTestCases.d.ts +2 -6
  195. package/types/src/api/index.d.ts +2 -74
  196. package/types/src/blocknoteAIClient/client.d.ts +1 -38
  197. package/types/src/index.d.ts +2 -1
  198. package/types/src/streamTool/StreamToolExecutor.d.ts +80 -0
  199. package/types/src/streamTool/filterNewOrUpdatedOperations.d.ts +2 -1
  200. package/types/src/streamTool/filterValidOperations.d.ts +3 -0
  201. package/types/src/streamTool/index.d.ts +6 -0
  202. package/types/src/streamTool/preprocess.d.ts +7 -0
  203. package/types/src/streamTool/streamTool.d.ts +14 -15
  204. package/types/src/streamTool/toValidatedOperations.d.ts +2 -0
  205. package/types/src/streamTool/toolDefinitionsToToolSet.d.ts +9 -0
  206. package/types/src/streamTool/vercelAiSdk/clientside/ClientSideTransport.d.ts +109 -0
  207. package/types/src/streamTool/vercelAiSdk/util/UIMessageStreamToOperationsResult.d.ts +29 -0
  208. package/types/src/streamTool/vercelAiSdk/util/chatHandlers.d.ts +23 -0
  209. package/types/src/streamTool/vercelAiSdk/util/partialObjectStreamUtil.d.ts +30 -0
  210. package/types/src/testUtil/testAIModels.d.ts +2 -6
  211. package/types/src/types.d.ts +56 -0
  212. package/src/api/LLMRequest.ts +0 -252
  213. package/src/api/LLMResponse.ts +0 -64
  214. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/Add heading (h1) and code block_1_8bae9cb9166097523db851068d6504ba.json +0 -15
  215. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/add a list (end)_1_bec242b33b36b7c791d5079283365125.json +0 -15
  216. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/add a new paragraph (empty doc)_1_8d2756d2f902e1a1c5aac5be1490fb37.json +0 -15
  217. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/add a new paragraph (end)_1_6065d512019d0bdadfbee0a55778b67e.json +0 -15
  218. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/add a new paragraph (start)_1_93f7ef1fdcca3d62f9696e7365cd5065.json +0 -15
  219. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/Add heading (h1) and code block_1_306ab5e8c98c3d3fdac6887befcd68fd.json +0 -15
  220. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/add a list (end)_1_273d3fdf2847715db07f6462f96e1028.json +0 -15
  221. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/add a new paragraph (empty doc)_1_ac8c75b2c0398b6ef7ad81d742349eca.json +0 -15
  222. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/add a new paragraph (end)_1_afed58570a68bee9f3eaaeb74bd21481.json +0 -15
  223. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/add a new paragraph (start)_1_de9dcee4f9fd594c076066ca9b57ff54.json +0 -15
  224. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/Add heading (h1) and code block_1_300c17e9dfe4cc39a90237be3727f6c5.json +0 -15
  225. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/add a list (end)_1_6b4064d98eeaa07a10831d3a5830dbad.json +0 -15
  226. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/add a new paragraph (empty doc)_1_fe59ff1267687115e7e961232d04f24b.json +0 -15
  227. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/add a new paragraph (end)_1_1979d1c04b36b4f2eca4cf56d08fa9ff.json +0 -15
  228. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/add a new paragraph (start)_1_33324c5fa9ff0b55906bc80f2cf29a01.json +0 -15
  229. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/Add heading (h1) and code block_1_43fe8c4fb5a1c4ab65bba37dbacdc34d.json +0 -15
  230. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/add a list (end)_1_d8165fc89a6e7197e2d91a383efd4b02.json +0 -15
  231. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/add a new paragraph (empty doc)_1_f995fb9d1a58b0de101fa3438590e799.json +0 -15
  232. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/add a new paragraph (end)_1_dd2333070a2d51e4e3578ac10c3a8939.json +0 -15
  233. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/add a new paragraph (start)_1_8f937c4bf5f38d40b8adf2bf35830c82.json +0 -15
  234. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/Add heading (h1) and code block_1_00c42d9142f46a774249f0ea4c83087e.json +0 -15
  235. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/add a list (end)_1_893055235ef87ad63966a8c0356f9ed2.json +0 -15
  236. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/add a new paragraph (empty doc)_1_7af724b09a7de255b40b070289b6dd5c.json +0 -15
  237. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/add a new paragraph (end)_1_101445be13e5db1922d2422ca47b6666.json +0 -15
  238. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Add/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/add a new paragraph (start)_1_f162fc6430cd63574f46ab6d4fcc9276.json +0 -15
  239. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/add and update paragraph_1_0e188d2a921d6dac6d6e40274fb58e46.json +0 -15
  240. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/add paragraph and update selection_1_5f7ae491c3449ea3417bff42c10f4c5f.json +0 -15
  241. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/add and update paragraph_1_2d61c5a123cae75fe48d74bf26f033a3.json +0 -15
  242. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/add paragraph and update selection_1_e1aca3374c81381183ce604542843900.json +0 -15
  243. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/add and update paragraph_1_607d4d9f46629e45f3851adc6d41d4c2.json +0 -15
  244. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/add paragraph and update selection_1_8d3b49c53bee6f8c6b3ec838d43e9443.json +0 -15
  245. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/add and update paragraph_1_01e68b70cd8cdf6436f9b06f75ac269d.json +0 -15
  246. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/add paragraph and update selection_1_96437051f6bbcb1c7a6e75501a1c3693.json +0 -15
  247. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/add and update paragraph_1_4b4bc6bf80353f21d3b81a63e9f3ef54.json +0 -15
  248. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Combined/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/add paragraph and update selection_1_40c00fd5cd485b1554b63a856d0ca2b3.json +0 -15
  249. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Delete/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/delete first block_1_be4abe78f0900318e7f02b64cd567b48.json +0 -15
  250. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Delete/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/delete first block_1_12e70268f615c2e6a251a0c822f5c852.json +0 -15
  251. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Delete/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/delete first block_1_af6efe0bca3582e6c8ff21ffc13eba7b.json +0 -15
  252. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Delete/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/delete first block_1_732c937802aaa089d01c37b91dcac697.json +0 -15
  253. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Delete/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/delete first block_1_30efafef9e27f70713ac6d216c71f723.json +0 -15
  254. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/clear block formatting_1_301b672f7c4cbdd034fe74e9c3166861.json +0 -15
  255. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/drop mark and link and change text within mark_1_d428f1cf0fef38221f6d7b182d72628d.json +0 -15
  256. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/drop mark and link_1_db4f1c714b34a8689f89cf2ea74dd9b1.json +0 -15
  257. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/modify nested content_1_48b77b898cf959d0320e944dbf863c00.json +0 -15
  258. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/modify parent content_1_7cf017978ca14c4655c187b808add49e.json +0 -15
  259. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/plain source block, add mention_1_5ff3afb37a8323d9237d5b95694febb8.json +0 -15
  260. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/standard update_1_1b5ea158fc3d646a0ce222198ec31837.json +0 -15
  261. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/styles + ic in source block, remove mark_1_ec0dc498f9751250aea1a983b178f851.json +0 -15
  262. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/styles + ic in source block, remove mention_1_a3b05a1abb86f585d47c391999382e50.json +0 -15
  263. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/styles + ic in source block, replace content_1_b2084dd7f9c0ddf8d8069245f9724d2e.json +0 -15
  264. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/styles + ic in source block, update mention prop_1_d36fe6fd5c56cbb5720b8b5f0f1af4de.json +0 -15
  265. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/styles + ic in source block, update text_1_29398a2d44edd12095a50d62bd1bf720.json +0 -15
  266. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/styles + ic in target block, add mark (paragraph)_1_664975f8855764c9de57ed1aef74e740.json +0 -15
  267. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/styles + ic in target block, add mark (word)_1_6f48d6dae797621870e22e8e0f572003.json +0 -15
  268. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/translate selection_1_093561699e181778eacfcf52c5b5bce5.json +0 -15
  269. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/turn paragraphs into list_1_905c360a779f6015e47aa4f76bb82b6e.json +0 -15
  270. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/update block prop and content_1_67f8ed4835e5bf0e13830ee0fa1cf8c8.json +0 -15
  271. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/update block prop_1_b37458e2a024cdda800f9b97dfbb7d95.json +0 -15
  272. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/update block type and content_1_1eecd846715894269bcff0f0c8809dab.json +0 -15
  273. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/anthropic.messages/claude-3-7-sonnet-latest (non-streaming)/update block type_1_8196a2ed33ecf8a9e47b5faf61fcc937.json +0 -15
  274. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/clear block formatting_1_350ecafb238090fa055692a72ae42198.json +0 -15
  275. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/drop mark and link and change text within mark_1_4c51960ed572671e7cf73db4566e3d99.json +0 -15
  276. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/drop mark and link_1_7a6d23fe91e74cf9675ae6e6124fd126.json +0 -15
  277. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/modify nested content_1_2535147f7b24a35891e156c4b19d8ffe.json +0 -15
  278. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/modify parent content_1_70beec3279ca4894a71d425293fc3ead.json +0 -15
  279. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/plain source block, add mention_1_01fbf08ac456e3dbbd64103c41f21a4d.json +0 -15
  280. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/standard update_1_51020afd3498ab35dc016c36e1e0c6b8.json +0 -15
  281. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/styles + ic in source block, remove mark_1_ad61d6ba098240616fe2106324f993e4.json +0 -15
  282. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/styles + ic in source block, remove mention_1_75f14cc4df749a9a1a0a838d62ae2678.json +0 -15
  283. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/styles + ic in source block, replace content_1_35f272b43423355f2a5dbbd1e49b4366.json +0 -15
  284. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/styles + ic in source block, update mention prop_1_f60fdbb256106a235e820360bc2195ca.json +0 -15
  285. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/styles + ic in source block, update text_1_5853e0d779926ddd5b628ed248c652f0.json +0 -15
  286. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/styles + ic in target block, add mark (paragraph)_1_865f7c1246731fba1044fe8d23bfab53.json +0 -15
  287. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/styles + ic in target block, add mark (word)_1_c9082ff81f975fcc97a7b4564ed31cf6.json +0 -15
  288. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/translate selection_1_e40023b9b9cf64ea508c42520ce54a92.json +0 -15
  289. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/turn paragraphs into list_1_739c4ae60051cce107204609e30188d6.json +0 -15
  290. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/update block prop and content_1_5a277f291beced18ef6642e6452c04f8.json +0 -15
  291. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/update block prop_1_8194a0fd672e45b8537bb497f8ad3bb0.json +0 -15
  292. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/update block type and content_1_808d14b549ccb577b7baa1c33e8433d1.json +0 -15
  293. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (non-streaming)/update block type_1_16f9143c5a28bfa65954cba662a9e644.json +0 -15
  294. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/clear block formatting_1_2f6f4db35e78d9a8094fa7f0cc5a6fef.json +0 -15
  295. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/drop mark and link and change text within mark_1_f67f3cef3589a8792080e7fb090b1226.json +0 -15
  296. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/drop mark and link_1_9056181b23b2cd23325d52c3eeb6ee16.json +0 -15
  297. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/modify nested content_1_85a23c1da349e0f8dac714957ed75c79.json +0 -15
  298. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/modify parent content_1_5ef368a4d58c5d3af10ffe058545324d.json +0 -15
  299. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/plain source block, add mention_1_5ac53cae2b0994f5de466affabaad58e.json +0 -15
  300. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/standard update_1_a534dfa8d9008a473a02fcb64bd645c7.json +0 -15
  301. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/styles + ic in source block, remove mark_1_db0b2afe5c635db1fbd2fd9e5c66c2a6.json +0 -15
  302. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/styles + ic in source block, remove mention_1_698e87bd13c88c31da2b4d97ed62aa8a.json +0 -15
  303. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/styles + ic in source block, replace content_1_54e5c87345fd2adc7bc1aa015fb7ed49.json +0 -15
  304. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/styles + ic in source block, update mention prop_1_fc03fd7d02657b4546b13e3e8a3a2bee.json +0 -15
  305. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/styles + ic in source block, update text_1_ae27bd5c696279c7555747ebab7f882e.json +0 -15
  306. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/styles + ic in target block, add mark (paragraph)_1_ad1bbdc50acb8c57cbcb55e00134b956.json +0 -15
  307. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/styles + ic in target block, add mark (word)_1_f65378b4068dbaa6e4b2f12247582a3d.json +0 -15
  308. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/translate selection_1_a4057cb73ed9ba6b58bfc3440182ab52.json +0 -15
  309. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/turn paragraphs into list_1_d193ecd4799fc5ca01c16b383bbfae8e.json +0 -15
  310. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/update block prop and content_1_cd366ecb6835f6ad416e56246d772258.json +0 -15
  311. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/update block prop_1_dcd828e95a6f35a02dc80f83ce865246.json +0 -15
  312. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/update block type and content_1_b409676f3c38fab14dbfcf469c084b61.json +0 -15
  313. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/groq.chat/llama-3.3-70b-versatile (streaming)/update block type_1_8035279de2d825570eb857243ac085d3.json +0 -15
  314. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/clear block formatting_1_4220ed611dd1396b8eaefaef1a93aa3d.json +0 -15
  315. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/drop mark and link and change text within mark_1_5752bbf6a6ab425496886ae0c16fa252.json +0 -15
  316. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/drop mark and link_1_fc4c8d212e083aeb086ecc97f89172cc.json +0 -15
  317. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/modify nested content_1_07027383a583a8622324d5fb3c6b47ef.json +0 -15
  318. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/modify parent content_1_432effc8a8203853eed4a05822cfb1c0.json +0 -15
  319. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/plain source block, add mention_1_a5a6fbbb73ac75d5318976205c211175.json +0 -15
  320. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/standard update_1_55ce5796bcf58df91ac364bf5da3c062.json +0 -15
  321. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/styles + ic in source block, remove mark_1_fd35ea1690888e3b9fdd6cd7e3cdf21d.json +0 -15
  322. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/styles + ic in source block, remove mention_1_f08ba8bc1f3562acc7d724c17d5f78c5.json +0 -15
  323. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/styles + ic in source block, replace content_1_90cbcfafa2e6f6897e82793db3d31620.json +0 -15
  324. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/styles + ic in source block, update mention prop_1_1f44d9313ad815027c9c904006e12c1f.json +0 -15
  325. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/styles + ic in source block, update text_1_412767e25cd81b316089d06262ab5f8f.json +0 -15
  326. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/styles + ic in target block, add mark (paragraph)_1_357e3e9924f91ecb50a561b8373474f2.json +0 -15
  327. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/styles + ic in target block, add mark (word)_1_0912f446c3f834669ba44c0666b7ad8a.json +0 -15
  328. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/translate selection_1_169e840a93c457a3980841bce584f8b4.json +0 -15
  329. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/turn paragraphs into list_1_46c8a46a056cc6f89953c4402d583718.json +0 -15
  330. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/update block prop and content_1_3121104fb353eb2bca2395575f057107.json +0 -15
  331. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/update block prop_1_fe9102e572088ab37c69a84ef83a452c.json +0 -15
  332. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/update block type and content_1_62527380200c30745a8e04e2aa459e3d.json +0 -15
  333. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (non-streaming)/update block type_1_3236a5c1b691839e51b0cd3787a7947f.json +0 -15
  334. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/clear block formatting_1_43253dee16b03b1f16101ced5bddfc93.json +0 -15
  335. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/drop mark and link and change text within mark_1_92fde43139365369266b63a2b6e2d0b2.json +0 -15
  336. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/drop mark and link_1_8336a355b6037db27d810a3f3a2fdb9c.json +0 -15
  337. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/modify nested content_1_0e25723621acc3c5e0fa98bbbc1b8426.json +0 -15
  338. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/modify parent content_1_329ea2aac9bc7887fb77b9165483286c.json +0 -15
  339. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/plain source block, add mention_1_fb00f31bc9fd64a65ead6c56df2a6f46.json +0 -15
  340. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/standard update_1_aed8c5658597a148c7fe740ef98aa03d.json +0 -15
  341. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/styles + ic in source block, remove mark_1_bd46c569d016618aeacaa2514b6f4906.json +0 -15
  342. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/styles + ic in source block, remove mention_1_e25641c56a8cc1fdca49a1d3ff5db2b4.json +0 -15
  343. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/styles + ic in source block, replace content_1_1ba1a4b5441db5f015f9ef75218f87a3.json +0 -15
  344. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/styles + ic in source block, update mention prop_1_4ae245b2bc01d569f87f98827e4ca6b1.json +0 -15
  345. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/styles + ic in source block, update text_1_97807fd69b67c1c3e79e678fba3ecfcd.json +0 -15
  346. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/styles + ic in target block, add mark (paragraph)_1_d6c7f981af0a2837c6cd85da3d297974.json +0 -15
  347. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/styles + ic in target block, add mark (word)_1_8ead2588e1bc1366b02cfded465fc8d4.json +0 -15
  348. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/translate selection_1_c2c3a06cd8eb6901e2007575eca77530.json +0 -15
  349. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/turn paragraphs into list_1_8ae508a1ba8354be0703f5bc89561691.json +0 -15
  350. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/update block prop and content_1_e0330a1df29640d9ff657ad9037bc203.json +0 -15
  351. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/update block prop_1_673b8e9ca4d59db999abd61ed34ec305.json +0 -15
  352. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/update block type and content_1_605daff442fc8684c6d126269f2aba3b.json +0 -15
  353. package/src/api/formats/html-blocks/__snapshots__/htmlBlocks.test.ts/Update/__msw_snapshots__/openai.chat/gpt-4o-2024-08-06 (streaming)/update block type_1_78e5c1f637c725aef379fd2b7f7551bf.json +0 -15
  354. package/src/streamTool/asTool.ts +0 -44
  355. package/src/streamTool/callLLMWithStreamTools.ts +0 -362
  356. package/types/src/api/LLMRequest.d.ts +0 -116
  357. package/types/src/api/LLMResponse.d.ts +0 -51
  358. package/types/src/streamTool/asTool.d.ts +0 -15
  359. package/types/src/streamTool/callLLMWithStreamTools.d.ts +0 -74
@@ -1,20 +1,10 @@
1
- "use strict";var Ye=Object.defineProperty;var Ge=(e,t,o)=>t in e?Ye(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var U=(e,t,o)=>Ge(e,typeof t!="symbol"?t+"":t,o);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const T=require("@blocknote/core"),D=require("@blocknote/prosemirror-suggest-changes"),j=require("ai"),q=require("prosemirror-state"),Ke=require("prosemirror-tables"),Xe=require("lodash.isequal"),R=require("prosemirror-model"),C=require("prosemirror-transform"),K=require("prosemirror-changeset"),z=require("prosemirror-view"),Qe=require("y-prosemirror"),y=require("react/jsx-runtime"),B=require("@blocknote/react"),v=require("react"),Ce=require("zustand"),X=require("@floating-ui/react"),Pe=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},et=Pe(Xe),L=Pe(v),ue=e=>{let t;const o=new Set,r=(u,m)=>{const l=typeof u=="function"?u(t):u;if(!Object.is(l,t)){const f=t;t=m??(typeof l!="object"||l===null)?l:Object.assign({},t,l),o.forEach(p=>p(t,f))}},n=()=>t,i={setState:r,getState:n,getInitialState:()=>c,subscribe:u=>(o.add(u),()=>o.delete(u))},c=t=e(r,n,i);return i},de=e=>e?ue(e):ue;function tt(e){const{properties:t,required:o,$defs:r,...n}=e.parameters;return{schema:{type:"object",description:e.description,properties:{type:{type:"string",enum:[e.name]},...t},required:["type",...o??[]],additionalProperties:!1,...n},$defs:r}}function Oe(e){const t=e.map(r=>tt(r)),o={};for(const r of t)for(const n in r.$defs){if(o[n]&&!et.default(o[n],r.$defs[n]))throw new Error(`Duplicate, but different definition for ${n}`);o[n]=r.$defs[n]}return{type:"object",properties:{operations:{type:"array",items:{anyOf:t.map(r=>r.schema)}}},additionalProperties:!1,required:["operations"],$defs:Object.keys(o).length>0?o:void 0}}function ot(e){return new ReadableStream({async start(t){try{for await(const o of e)t.enqueue(o);t.close()}catch(o){t.error(o)}}})}function $(e){if(e.locked)throw new Error("Stream (source) is already locked and cannot be iterated.");const t=e.pipeThrough(new TransformStream);return t[Symbol.asyncIterator]=()=>{if(t.locked)throw new Error("Stream is already locked and cannot be iterated again.");const o=t.getReader();return{async next(){const{done:r,value:n}=await o.read();return r?{done:!0,value:void 0}:{done:!1,value:n}}}},t}function xe(e){return $(ot(e))}async function*rt(e){var n;let t=0,o=!0,r;for await(const s of e)if((n=s.operations)!=null&&n.length){for(let a=t;a<s.operations.length;a++){const i=s.operations[a];r=i,yield{partialOperation:i,isUpdateToPreviousOperation:a===t&&!o,isPossiblyPartial:a===s.operations.length-1},o=!1}t=s.operations.length-1}if(!r)throw new Error("No operations seen");yield{partialOperation:r,isUpdateToPreviousOperation:!0,isPossiblyPartial:!1}}async function*Me(e,t){let o=!1;for await(const r of e){const n=r.operation;n.ok?(yield{operation:n.value,isUpdateToPreviousOperation:o?!1:r.isUpdateToPreviousOperation,isPossiblyPartial:r.isPossiblyPartial},o=!1):(o=o||!r.isUpdateToPreviousOperation,t==null||t({...r,operation:n}))}}async function*Be(e,t){for await(const o of e){const r=t.find(s=>s.name===o.partialOperation.type);if(!r){yield{operation:{ok:!1,error:`No matching function for ${o.partialOperation.type}`},isUpdateToPreviousOperation:o.isUpdateToPreviousOperation,isPossiblyPartial:o.isPossiblyPartial};continue}yield{operation:r.validate(o.partialOperation),isUpdateToPreviousOperation:o.isUpdateToPreviousOperation,isPossiblyPartial:o.isPossiblyPartial}}}async function*nt(e,t){const o=Be(e,t);yield*Me(o,n=>{if(!n.isPossiblyPartial)throw new Error("invalid operation: "+n.operation.error)})}async function*st(e,t){const o=Be(e,t);yield*Me(o,n=>{throw new Error("invalid operation: "+n.operation.error)})}async function it(e,t){const{_generateObjectOptions:o,...r}=t;if(o&&("output"in o||"schema"in o))throw new Error("Cannot provide output or schema in _generateObjectOptions");const s={output:"object",schema:j.jsonSchema(Oe(e)),mode:r.model.provider==="mistral.chat"||r.model.provider==="google.generative-ai"?"auto":"tool",...r,...o??{}},a=await j.generateObject(s),i=at(a.object);if(!i.ok)throw new Error(i.error);let c;return{streamObjectResult:void 0,generateObjectResult:a,get operationsSource(){return c||(c=xe(st(i.value,e))),c},async getGeneratedOperations(){return a.object}}}function at(e){if(!e||typeof e!="object"||!("operations"in e)||!Array.isArray(e.operations))return{ok:!1,error:"No operations returned"};const t=e.operations;async function*o(){for(const r of t)yield{partialOperation:r,isUpdateToPreviousOperation:!1,isPossiblyPartial:!1}}return{ok:!0,value:o()}}async function ct(e,t,o=()=>{}){const{_streamObjectOptions:r,...n}=t;if(r&&("output"in r||"schema"in r))throw new Error("Cannot provide output or schema in _streamObjectOptions");const a={output:"object",schema:j.jsonSchema(Oe(e)),mode:n.model.provider==="mistral.chat"||n.model.provider==="google.generative-ai"?"auto":"tool",...n,...t._streamObjectOptions??{}},i=j.streamObject(a);let c;const[u,m]=i.fullStream.tee(),l=(async()=>{let f={operations:[]};const p=$(dt(m));for await(const h of p)h&&typeof h=="object"&&"operations"in h&&(f=h);return f})();return{streamObjectResult:i,generateObjectResult:void 0,get operationsSource(){return c||(c=xe(nt(rt(lt(ut($(u)),o)),e))),c},async getGeneratedOperations(){return l}}}async function*lt(e,t){let o=!0;for await(const r of e)o&&(t(),o=!1),yield r}function ut(e){return $(e.pipeThrough(new TransformStream({transform(t,o){switch(t.type){case"object":o.enqueue(t.object);break;case"text-delta":case"finish":break;case"error":o.error(t.error);break;default:{const r=t;throw new Error(`Unsupported chunk type: ${r}`)}}}})))}function dt(e){return $(e.pipeThrough(new TransformStream({transform(t,o){switch(t.type){case"object":o.enqueue(t.object);break;case"text-delta":case"finish":break;case"error":break;default:{const r=t;throw new Error(`Unsupported chunk type: ${r}`)}}}})))}function oe(e){return(e.type==="paragraph"||!e.type)&&!e.content||Array.isArray(e.content)&&e.content.length===0}class pt{constructor(t,o,r){this.messages=t,this.llmResult=o,this.streamTools=r}async*applyToolCalls(){let t=this.llmResult.operationsSource;for(const o of this.streamTools)t=o.execute(t);yield*t}async execute(){for await(const t of this.applyToolCalls());}async _logToolCalls(){for await(const t of this.llmResult.operationsSource)console.log(JSON.stringify(t,null,2))}}function mt(e,t,o=!0,r=!0){let n=0,s=e.length;if(o)for(;n<s&&t(e[n]);)n++;if(r)for(;s>n&&t(e[s-1]);)s--;return e.slice(n,s)}function E(e,t){return mt(e,r=>oe(r)&&(t==null?void 0:t.cursorBlockId)!==r.id,(t==null?void 0:t.trimStart)??!1,(t==null?void 0:t.trimEnd)??!0)}function Y(e,t){const o=e.getTextCursorPosition(),r=[];for(const n of t){const s=n.id===o.block.id;r.push({id:n.id,block:n.block}),s&&r.push({cursor:!0})}return r}async function x(e,t){return await Promise.all(e.map(async o=>({id:o.id,block:await t(o)})))}function P(e){return e.flatMap(t=>[{...t,children:[]},...P(t.children)])}function A(e){return e.map(t=>typeof t=="object"&&t&&"id"in t?{...t,id:`${t.id}$`}:t)}async function Ie(e,t){const o=e.getTextCursorPosition().block.id,r=E(e.document,{cursorBlockId:o}),n=await x(P(r),async c=>e.blocksToHTMLLossy([c])),a=Y(e,n).filter(c=>"cursor"in c||!(t.excludeBlockIds||[]).includes(c.id));return{htmlBlocks:A(a)}}async function _e(e,t){const o=await x(P(t.selectedBlocks),async n=>e.blocksToHTMLLossy([n]));return{htmlSelectedBlocks:A(o),htmlDocument:(await x(P(e.document),async n=>e.blocksToHTMLLossy([n]))).map(({block:n})=>({block:n}))}}function ft(e){return[{role:"system",content:"You're manipulating a selected part of a text document using HTML blocks. \n Make sure to follow the json schema provided and always include the trailing $ in ids. \n List items are 1 block with 1 list item each, so block content `<ul><li>item1</li></ul>` is valid, but `<ul><li>item1</li><li>item2</li></ul>` is invalid. We'll merge them automatically.\n This is the selection as an array of html blocks:"},{role:"system",content:JSON.stringify(e.htmlSelectedBlocks)},{role:"system",content:"This is the entire document (INCLUDING the selected text), find the selected text in there to understand the context:"},{role:"system",content:JSON.stringify(e.htmlDocument)},{role:"system",content:"The user asks you to do the following:"},{role:"user",content:e.userPrompt}]}function ht(e){return[{role:"system",content:"You're manipulating a text document using HTML blocks. \n Make sure to follow the json schema provided. When referencing ids they MUST be EXACTLY the same (including the trailing $). \n List items are 1 block with 1 list item each, so block content `<ul><li>item1</li></ul>` is valid, but `<ul><li>item1</li><li>item2</li></ul>` is invalid. We'll merge them automatically.\n For code blocks, you can use the `data-language` attribute on a code block to specify the language.\n This is the document as an array of html blocks (the cursor is BETWEEN two blocks as indicated by cursor: true):"},{role:"system",content:JSON.stringify(e.htmlBlocks)},{role:"system",content:'First, determine what part of the document the user is talking about. You SHOULD probably take cursor info into account if needed.\n EXAMPLE: if user says "below" (without pointing to a specific part of the document) he / she probably indicates the block(s) after the cursor. \n EXAMPLE: If you want to insert content AT the cursor position (UNLESS indicated otherwise by the user), \n then you need `referenceId` to point to the block before the cursor with position `after` (or block below and `before`).\n \n '+(e.isEmptyDocument?"Because the document is empty, first update the empty block before adding new blocks.":"Prefer updating existing blocks over removing and adding (but this also depends on the user's question).")},{role:"system",content:"The user asks you to do the following:"},{role:"user",content:e.userPrompt}]}const yt=async(e,t)=>{const o=E(e.document).length===0;if(t.selectedBlocks){const r=await _e(e,{selectedBlocks:t.selectedBlocks});return t.previousMessages?[...t.previousMessages,{role:"system",content:`After processing the previous response, this is the updated selection.
2
- Ignore previous documents, you MUST issue operations against this latest version of the document:`},{role:"system",content:JSON.stringify(r.htmlSelectedBlocks)},{role:"system",content:"This is the updated entire document:"},{role:"system",content:JSON.stringify(r.htmlDocument)},{role:"system",content:`You SHOULD use "update" operations to update blocks you added / edited previously
3
- (unless the user explicitly asks you otherwise to add or delete other blocks).
4
-
5
- The user now asks you to do the following:`},{role:"user",content:t.userPrompt}]:ft({...r,userPrompt:t.userPrompt})}else{const r=await Ie(e,t);return t.previousMessages?[...t.previousMessages,{role:"system",content:`After processing the previous response, this is the updated document.
6
- Ignore previous documents, you MUST issue operations against this latest version of the document:`},{role:"system",content:JSON.stringify(r.htmlBlocks)},{role:"system",content:`You SHOULD use "update" operations to update blocks you added / edited previously
7
- (unless the user explicitly asks you otherwise to add or delete other blocks).
8
-
9
- The user now asks you to do the following:`},{role:"user",content:t.userPrompt}]:ht({...r,userPrompt:t.userPrompt,isEmptyDocument:o})}};function gt(e){let t,o=!1;return e.descendants((r,n)=>o?!1:(r.isText&&(o=!0,t=n),!0)),t}function F(e){var s;const t=T.getPmSchema(e),{modification:o}=t.marks,r=[],n=new C.Transform(e.before);for(let a=0;a<e.steps.length;a++){const i=e.steps[a],c=new C.Mapping(e.mapping.maps.slice(0,a)).invert();if(i.structure){if(i instanceof C.ReplaceStep){if(i.to!==i.from+1||i.slice.openStart!==0||i.slice.openEnd!==1||i.slice.content.size!==2)throw new Error("Structure change is not in expected format (ReplaceStep)")}else if(i instanceof C.ReplaceAroundStep){if(i.insert!==1||i.slice.size!==2||i.gapTo!==i.to-1||i.gapFrom!==i.from+1)throw new Error("Structure change is not in expected format (ReplaceAroundStep)")}else throw new Error("Step is not a ReplaceStep or ReplaceAroundStep");const b=c.map(i.from),g=i.slice.content.firstChild,k=n.doc.resolve(n.mapping.map(b)).nodeAfter;let w=g.marks||[];g.type!==k.type&&(w=o.create({type:"nodeType",previousValue:k.type.name,newValue:g.type.name}).addToSet(w));const H=new Set([...Object.keys(g.attrs),...Object.keys(k.attrs)]);for(const M of H)g.attrs[M]!==k.attrs[M]&&(w=o.create({type:"attr",attrName:M,previousValue:k.attrs[M],newValue:g.attrs[M]}).addToSet(w));const _=n.steps.length;n.setNodeMarkup(n.mapping.map(b),g.type,g.attrs,w),r.push({prosemirrorSteps:n.steps.slice(_),selection:void 0,type:"replace"});continue}if(!(i instanceof C.ReplaceStep))throw new Error("Step is not a ReplaceStep");const u=c.map(i.from),m=c.map(i.to);if(i.slice.openStart>0||i.slice.openEnd>0)throw new Error("Slice has openStart or openEnd > 0, but structure=false");r.push({prosemirrorSteps:[],selection:{anchor:n.mapping.map(u),head:n.mapping.map(m)},type:"select"});const l=i.slice.content.textBetween(0,i.slice.size),f=l===n.doc.textBetween(n.mapping.map(u),n.mapping.map(m));let p;if(f)p=i.slice.content.size;else if(l.length===0)p=i.slice.content.size;else{const b=gt(i.slice.content);if(b===void 0)throw new Error("unexpected: no first character found");p=b+1}let h=n.mapping.map(m);const d=n.mapping.map(m);let S=!0;for(let b=p;b<=i.slice.content.size;b++){const g=S&&u!==m,k=n.steps.length;if(g){const _=n.doc.resolve(n.mapping.map(u));(s=_.nodeAfter)!=null&&s.isBlock&&n.addNodeMark(_.pos,t.mark("deletion",{})),n.addMark(_.pos,h,t.mark("deletion",{})),h=n.mapping.map(m)}const w=new R.Slice(i.slice.content.cut(0,b),0,0);n.replace(d,h,w).addMark(d,d+w.content.size,t.mark("insertion",{})),n.doc.nodesBetween(d,d+w.content.size,(_,M)=>M<d||M>d+w.content.size?!0:(_.isBlock&&n.addNodeMark(M,t.mark("insertion",{})),!1)),h=n.mapping.slice(k).map(h);const H=q.TextSelection.near(n.doc.resolve(d+w.content.size),-1);r.push({prosemirrorSteps:n.steps.slice(k),selection:{anchor:H.from,head:H.from},type:g?"replace":"insert"}),S=!1}}return r}async function re(e){const t=Math.random()*.3+.85;if(e.type==="select")await new Promise(o=>setTimeout(o,100*t));else if(e.type==="insert")await new Promise(o=>setTimeout(o,10*t));else if(e.type==="replace")await new Promise(o=>setTimeout(o,200*t));else throw new T.UnreachableCaseError(e.type)}function ne(e,t){e.setMeta("addToHistory",!1),t.selection&&e.setMeta("aiAgent",{selection:{anchor:t.selection.anchor,head:t.selection.head}});for(const o of t.prosemirrorSteps)if(e.maybeStep(o).failed)throw new Error("failed to apply step");return e}function kt(e,t,o){const r=new C.Transform(t);for(const a of e){const i=new C.ReplaceStep(r.mapping.map(a.fromA),r.mapping.map(a.toA),o.slice(a.fromB,a.toB));r.step(i)}const n=r.mapping.invert();let s=r.doc.content.findDiffStart(o.content);for(;s!==null;){const a=o.resolve(s).nodeAfter,i=r.doc.resolve(s).nodeAfter;if(!a||!i)throw new Error("diffNode not found");const c=!a.isLeaf&&a.content.eq(i.content),u=c?1:Math.min(a.nodeSize,i.nodeSize),m=s+u,l=n.map(s),f=n.map(m);let p=e.length;for(let d=0;d<e.length;d++)if(e[d].fromA>=f){p=d;break}e.splice(p,0,{fromA:l,toA:f,fromB:s,toB:m,deleted:[],inserted:[],type:c?"node-type-or-attr-update":"mark-update"}),r.step(new C.ReplaceStep(s,m,o.slice(s,m),c));const h=r.doc.content.findDiffStart(o.content);if(h===s)throw new Error("diffStart not moving");s=h}return e}const pe=(e,t)=>{const o=new Set,r=new Set;e.descendants(a=>{a.type.name==="tableCell"&&o.add(JSON.stringify(a.toJSON()))}),t.descendants(a=>{a.type.name==="tableCell"&&r.add(JSON.stringify(a.toJSON()))});const n=new Set([...o].filter(a=>r.has(a)));return{encodeCharacter:a=>a,encodeNodeStart:a=>{if(a.type.name==="tableCell"){const i=JSON.stringify(a.toJSON());return n.has(i)?i:a.type.name}return a.type.name},encodeNodeEnd:a=>{if(a.type.name==="tableCell"){const i=JSON.stringify(a.toJSON());return n.has(i)?i:-1}return-1},compareTokens:(a,i)=>a===i}};function G(e,t,o=!1,r,n){const s=T.getNodeById(e.id,t),a=new C.Transform(t);T.updateBlockTr(a,s.posBeforeNode,e.block,r,n);let i=a.doc,c=K.ChangeSet.create(t,void 0,pe(t,i));if(c=c.addSteps(i,a.mapping.maps,0),o&&c.changes.length>0){const l=c.changes[c.changes.length-1],f=l.toA-l.fromA,p=l.toB-l.fromB;if(f>p){const h=t.slice(l.fromA+p,l.toA);a.step(new C.ReplaceStep(l.toB,l.toB,h)),i=a.doc,c=K.ChangeSet.create(c.startDoc,void 0,pe(c.startDoc,i)),c=c.addSteps(i,a.mapping.maps,0)}}const u=[],m=K.simplifyChanges(c.changes,i);for(let l=0;l<m.length;l++){const f=m[l],p=i.slice(f.fromB,f.toB);if(p.openEnd===1&&p.openStart===0&&(f.type="node-type-or-attr-update",p.size>2)){const h={fromA:f.fromA,toA:f.fromA+1,fromB:f.fromB,toB:f.fromB+1,deleted:[],inserted:[],type:"node-type-or-attr-update"},d={fromA:f.fromA+1,toA:f.toA,fromB:f.fromB+1,toB:f.toB,deleted:[],inserted:[]};m.splice(l,1,h,d),l++}}kt(m,t,i);for(let l=0;l<m.length;l++){const f=m[l],p=i.slice(f.fromB,f.toB);if(p.openEnd>0&&p.size>1)throw new Error("unexpected, openEnd > 0 and size > 1, this should have been split into two steps");l===m.length-1&&o&&f.type==="mark-update"||u.push(new C.ReplaceStep(f.fromA,f.toA,p,f.type==="node-type-or-attr-update"))}return u}function bt(e,t){if(!e||!Array.isArray(e)||e.length===0)return{ok:!1,error:"blocks is required"};const o=[];for(const r of e){const n=t(r);if(!n.ok)return{ok:!1,error:`Invalid block: ${n.error}`};o.push(n.value)}return{ok:!0,value:o}}function se(e){return(t,o)=>{const r=typeof e.schema=="function"?e.schema(t):e.schema;return{name:"add",description:e.description,parameters:{type:"object",properties:{referenceId:{type:"string",description:"MUST be an id of a block in the document"},position:{type:"string",enum:["before","after"],description:"`after` to add blocks AFTER (below) the block with `referenceId`, `before` to add the block BEFORE (above)"},blocks:{items:r.block,type:"array"}},required:["referenceId","position","blocks"],$defs:r.$defs},validate:n=>{if(n.type!=="add")return{ok:!1,error:"invalid operation type"};if(n.position!=="before"&&n.position!=="after")return{ok:!1,error:"invalid position"};if(!n.referenceId||!n.blocks)return{ok:!1,error:"referenceId and blocks are required"};let s=n.referenceId;if(o.idsSuffixed){if(!(s!=null&&s.endsWith("$")))return{ok:!1,error:"referenceId must end with $"};s=s.slice(0,-1)}if(!t.getBlock(s))return{ok:!1,error:"referenceId not found"};const i=bt(n.blocks,c=>e.validateBlock(c,t));return i.ok?{ok:!0,value:{type:n.type,referenceId:s,position:n.position,blocks:i.value}}:i},execute:async function*(n){var i;let s=[];const a={};for await(const c of n){if(c.isUpdateToPreviousOperation||(s=[]),c.operation.type!=="add"){yield c;continue}const u=c.operation,m=await e.toJSONToolCall(t,{...c,operation:u});if(m&&!(c.isPossiblyPartial&&oe(m.blocks[m.blocks.length-1]))){for(let l=0;l<m.blocks.length;l++){const f=m.blocks[l],p=t.prosemirrorState.tr;let h=[];if(l<s.length){const d=await e.rebaseTool(s[l],t),b=G({id:s[l],block:f},d.doc,!1).map(g=>g.map(d.invertMap));for(const g of b)p.step(g.map(p.mapping));h=F(p),h=h.filter(g=>g.type!=="select")}else{const d=u.position==="after"?a[u.referenceId]:void 0,S=T.insertBlocks(p,[f],l>0?s[l-1]:d||u.referenceId,l>0?"after":u.position);s.push(...S.map(b=>b.id)),h=F(p)}h.find(d=>d.type==="replace");for(const d of h)o.withDelays&&await re(d),t.transact(S=>{ne(S,d)}),(i=o.onBlockUpdate)==null||i.call(o,s[l])}c.isPossiblyPartial||u.position==="after"&&(a[u.referenceId]=s[s.length-1])}}}}}}function ie(e){return(t,o)=>{const r=typeof e.schema=="function"?e.schema(t):e.schema;return{name:"update",description:e.description,parameters:{type:"object",properties:{id:{type:"string",description:"id of block to update"},block:r.block},required:["id","block"],$defs:r.$defs},validate:n=>{if(n.type!=="update")return{ok:!1,error:"invalid operation type"};if(!n.id)return{ok:!1,error:"id is required"};let s=n.id;if(o.idsSuffixed){if(!(s!=null&&s.endsWith("$")))return{ok:!1,error:"id must end with $"};s=s.slice(0,-1)}if(!n.block)return{ok:!1,error:"block is required"};const a=t.getBlock(s);if(!a)return console.error("BLOCK NOT FOUND",s),{ok:!1,error:"block not found"};const i=e.validateBlock(n.block,t,a.type);return i.ok?{ok:!0,value:{type:n.type,id:s,block:i.value}}:i},execute:async function*(n){var c;let a=50;const i=o.updateSelection?{from:T.trackPosition(t,o.updateSelection.from),to:T.trackPosition(t,o.updateSelection.to)}:void 0;for await(const u of n){if(u.operation.type!=="update"){yield u;continue}const m=u.operation;if(u.isPossiblyPartial){const k=JSON.stringify(m.block).length;if(k<a)continue;a=k+50}else a=50;const l=await e.rebaseTool(m.id,t),f=i?l.invertMap.invert().map(i.from()):void 0,p=i?l.invertMap.invert().map(i.to()):void 0,h=await e.toJSONToolCall(t,u);if(!h)continue;const d=G(h,l.doc,u.isPossiblyPartial,f,p);if(d.length===1&&u.isPossiblyPartial)continue;const S=d.map(k=>k.map(l.invertMap)),b=new C.Transform(t.prosemirrorState.doc);for(const k of S)b.step(k.map(b.mapping));const g=F(b);for(const k of g)o.withDelays&&await re(k),t.transact(w=>{ne(w,k)}),(c=o.onBlockUpdate)==null||c.call(o,m.id)}}}}}const ae=(e,t)=>({name:"delete",description:"Delete a block",parameters:{type:"object",properties:{id:{type:"string",description:"id of block to delete"}},required:["id"]},validate:o=>{if(o.type!=="delete")return{ok:!1,error:"invalid operation type"};if(!o.id)return{ok:!1,error:"id is required"};let r=o.id;if(t.idsSuffixed){if(!(r!=null&&r.endsWith("$")))return{ok:!1,error:"id must end with $"};r=r.slice(0,-1)}return e.getBlock(r)?{ok:!0,value:{type:"delete",id:r}}:{ok:!1,error:"block not found"}},execute:async function*(o){var r;for await(const n of o){if(n.operation.type!=="delete"){yield n;continue}const s=n.operation,a=e.prosemirrorState.tr;T.removeAndInsertBlocks(a,[s.id],[]);const i=F(a);for(const c of i)t.withDelays&&await re(c),e.transact(u=>{ne(u,c)}),(r=t.onBlockUpdate)==null||r.call(t,s.id)}}});function me(e){const t=e.lastIndexOf("<"),o=e.lastIndexOf(">");let r=e;if(t>o&&(r=e.substring(0,t),!r.trim()))return;const n=r.match(/&[a-zA-Z0-9]*$/);n&&(r=r.substring(0,r.length-n[0].length));const i=new DOMParser().parseFromString(`<div>${r}</div>`,"text/html").body.firstChild;return i?i.innerHTML:""}function J(e){let t;if(D.applySuggestions(e.prosemirrorState,o=>{t=o}),!t)throw new Error("applySuggestionsTr is not set");return t}function V(e,t){const o=t.mapping.invert();return{doc:t.doc,tr:()=>new C.Transform(t.doc),invertMap:o,rebaseTr:r=>{if(r.steps.length===0)throw new Error("No steps to apply");let n=e.prosemirrorState.tr;for(const s of r.steps){const a=s.map(o);if(!a)throw new Error("Step is not mapped");n=n.step(a)}return n}}}async function fe(e,t){var u;const o=J(t),r=T.getBlock(o.doc,e);if(!r)throw new Error("block not found");const n=await t.blocksToHTMLLossy([{...r,children:[]}]),s=(u=window.__TEST_OPTIONS)==null?void 0:u.mockID,a=await t.tryParseHTMLToBlocks(n);if(window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=s),a.length!==1)throw new Error("html diff invalid block count");const i=a[0];if(i.id=e,G({id:e,block:i},o.doc).length)throw new Error("html diff");return V(t,o)}function he(e){return typeof e!="string"?{ok:!1,error:"block must be a string"}:{ok:!0,value:e}}const Q={add:se({description:"Insert new blocks",schema:{block:{type:"string",description:"html of block (MUST be a single, VALID HTML element)"}},validateBlock:he,rebaseTool:fe,toJSONToolCall:async(e,t)=>{var n;const o=(n=window.__TEST_OPTIONS)==null?void 0:n.mockID,r=(await Promise.all(t.operation.blocks.map(async s=>{const a=t.isPossiblyPartial?me(s):s;return a?(await e.tryParseHTMLToBlocks(a)).map(i=>(delete i.id,i)):[]}))).flat();if(window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=o),r.length!==0)return{...t.operation,blocks:r}}}),update:ie({description:"Update a block",schema:{block:{type:"string",description:"html of block (MUST be a single HTML element)"}},validateBlock:he,rebaseTool:fe,toJSONToolCall:async(e,t)=>{const o=t.isPossiblyPartial?me(t.operation.block):t.operation.block;if(!o)return;const r=(await e.tryParseHTMLToBlocks(o))[0];return window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=void 0),delete r.id,{...t.operation,block:r}}}),delete:ae};function St(e,t,o,r,n){const s={add:!0,update:!0,delete:!0,...o};return[...s.update?[Q.update(e,{idsSuffixed:!0,withDelays:t,updateSelection:r,onBlockUpdate:n})]:[],...s.add?[Q.add(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[],...s.delete?[Q.delete(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[]]}const Le={getStreamTools:St,defaultPromptBuilder:yt,promptHelpers:{getDataForPromptNoSelection:Ie,getDataForPromptWithSelection:_e}};async function Ee(e,t){const{userPrompt:o,useSelection:r,deleteEmptyCursorBlock:n,stream:s,onStart:a,withDelays:i,dataFormat:c,previousResponse:u,...m}={maxRetries:2,deleteEmptyCursorBlock:!0,stream:!0,withDelays:!0,dataFormat:Le,...t},l=t.promptBuilder??c.defaultPromptBuilder,f=c.getStreamTools,p=r?void 0:e.getTextCursorPosition().block,h=p&&n&&oe(p)&&E(e.document).length>0?p.id:void 0,d=r?e.getSelectionCutBlocks():void 0;let S;u&&(S=u.messages.map(w=>w.role==="user"&&typeof w.content=="string"?{role:"system",content:`USER_MESSAGE: ${w.content}`}:w),S.push({role:"system",content:`ASSISTANT_MESSAGE: These are the operations returned by a previous LLM call:
10
- `+JSON.stringify(await u.llmResult.getGeneratedOperations())}));const b=await l(e,{selectedBlocks:d==null?void 0:d.blocks,userPrompt:o,excludeBlockIds:h?[h]:void 0,previousMessages:S}),g=f(e,i,t.defaultStreamTools,d?{from:d._meta.startPos,to:d._meta.endPos}:void 0,t.onBlockUpdate);let k;return s?k=await ct(g,{messages:b,...m},()=>{h&&e.getBlock(h)&&e.removeBlocks([h]),a==null||a()}):(k=await it(g,{messages:b,...m}),h&&e.getBlock(h)&&e.removeBlocks([h]),a==null||a()),new pt(b,k,g)}async function Ae(e,t){const o=e.getTextCursorPosition().block.id,r=E(e.document,{cursorBlockId:o}),n=await x(P(r),async c=>({...c,children:void 0})),a=Y(e,n).filter(c=>"cursor"in c||!(t.excludeBlockIds||[]).includes(c.id));return{jsonBlocks:A(a)}}async function Ne(e,t){const o=await x(P(t.selectedBlocks),async n=>n);return{jsonSelectedBlocks:A(o),jsonDocument:(await x(P(e.document),async n=>({...n,id:void 0,children:void 0}))).map(({block:n})=>({block:n}))}}function wt(e){return[{role:"system",content:`You're manipulating a selected part of a text document using JSON blocks.
11
- Make sure to follow the json schema provided and always include the trailing $ in ids.
12
- This is the selection as an array of JSON blocks:`},{role:"system",content:JSON.stringify(e.jsonSelectedBlocks)},{role:"system",content:"This is the entire document (INCLUDING the selected text), find the selected text in there to understand the context:"},{role:"system",content:JSON.stringify(e.jsonDocument)},{role:"system",content:"The user asks you to do the following:"},{role:"user",content:e.userPrompt}]}function Tt(e){return[{role:"system",content:`You're manipulating a text document using JSON blocks.
1
+ "use strict";var ot=Object.defineProperty;var rt=(e,t,o)=>t in e?ot(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var q=(e,t,o)=>rt(e,typeof t!="symbol"?t+"":t,o);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const nt=require("@ai-sdk/react"),k=require("@blocknote/core"),$=require("@blocknote/prosemirror-suggest-changes"),H=require("prosemirror-model"),U=require("prosemirror-state"),st=require("prosemirror-tables"),J=require("prosemirror-view"),it=require("y-prosemirror"),at=require("lodash.isequal"),re=require("@ai-sdk/provider-utils"),T=require("ai"),x=require("prosemirror-transform"),ee=require("prosemirror-changeset"),y=require("react/jsx-runtime"),_=require("@blocknote/react"),w=require("react"),Ie=require("zustand"),te=require("@floating-ui/react"),Oe=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},lt=Oe(at),L=Oe(w),me=e=>{let t;const o=new Set,r=(c,d)=>{const f=typeof c=="function"?c(t):c;if(!Object.is(f,t)){const m=t;t=d??(typeof f!="object"||f===null)?f:Object.assign({},t,f),o.forEach(u=>u(t,m))}},n=()=>t,i={setState:r,getState:n,getInitialState:()=>l,subscribe:c=>(o.add(c),()=>o.delete(c))},l=t=e(r,n,i);return i},fe=e=>e?me(e):me;function ct(e){const{properties:t,required:o,$defs:r,...n}=e.inputSchema;return{schema:{type:"object",description:e.description,properties:{type:{type:"string",enum:[e.name]},...t},required:["type",...o??[]],additionalProperties:!1,...n},$defs:r}}function Me(e){const t=e.map(r=>ct(r)),o={};for(const r of t)for(const n in r.$defs){if(o[n]&&!lt.default(o[n],r.$defs[n]))throw new Error(`Duplicate, but different definition for ${n}`);o[n]=r.$defs[n]}return{type:"object",properties:{operations:{type:"array",items:{anyOf:t.map(r=>r.schema)}}},additionalProperties:!1,required:["operations"],$defs:Object.keys(o).length>0?o:void 0}}function Be(e,t){return{async sendAIRequest(o,r){const n=await t(o);return await e(o.chat.messages,n),o.chat.sendMessage(void 0,{...r,body:{...(r==null?void 0:r.body)??{},toolDefinitions:{applyDocumentOperations:{name:"applyDocumentOperations",inputSchema:Me(o.streamTools),outputSchema:{type:"object"}}}},metadata:{promptData:n}})}}}class ne extends Error{constructor(t,o,r){super(t,r),this.chunk=o,this.name="ChunkExecutionError"}}class Ee{constructor(t){q(this,"stream");this.streamTools=t,this.stream=this.createStream()}createStream(){let t;const o=new TransformStream({transform:async(i,l)=>{const c=typeof i=="string"?await ut(i,(t==null?void 0:t.isPossiblyPartial)??!1,this.streamTools):i;c&&(t=c,l.enqueue(c))},flush:i=>{t!=null&&t.isPossiblyPartial&&i.error(new Error("stream ended with a partial operation"))}}),r=o.readable.pipeThrough(this.createExecutor()),[n,s]=r.tee(),a=n.pipeTo(new WritableStream);return{writable:o.writable,readable:s,finishPromise:a}}createExecutor(){const t=this.streamTools.map(o=>o.executor());return new TransformStream({transform:async(o,r)=>{var s;let n=!1;for(const a of t)try{if(await a.execute(o)){r.enqueue({status:"ok",chunk:o}),n=!0;break}}catch(i){throw new ne(`Tool execution failed: ${re.getErrorMessage(i)}`,o,{cause:i})}if(!n){const a=((s=o.operation)==null?void 0:s.type)||"unknown";throw new Error(`No tool could handle operation of type: ${a}`)}}})}get writable(){return this.stream.writable}get readable(){return this.stream.readable}async finish(){await this.stream.finishPromise}async executeOperationsArray(t){const o=this.writable.getWriter();for await(const r of t){const n=await T.parsePartialJson(r);if(n.state==="undefined-input"||n.state==="failed-parse"||!n)return;await o.write(r)}await o.close(),await this.finish()}async execute(t){const o=this.writable.getWriter();for await(const r of t)await o.write(r);await o.close(),await this.finish()}async executeOne(t){await this.execute(async function*(){yield{operation:t,isUpdateToPreviousOperation:!1,isPossiblyPartial:!1,metadata:{}}}())}}async function ut(e,t,o){const r=await T.parsePartialJson(e);if(r.state==="undefined-input"||r.state==="failed-parse"||!r)return;const n=o.find(a=>{var i;return a.name===((i=r.value)==null?void 0:i.type)}),s=n&&n.validate(r.value);if(s!=null&&s.ok)return{operation:s.value,isPossiblyPartial:r.state==="repaired-parse",isUpdateToPreviousOperation:t,metadata:void 0}}function dt(e){return new ReadableStream({async start(t){try{for await(const o of e)t.enqueue(o);t.close()}catch(o){t.error(o)}}})}function _e(e){if(e.locked)throw new Error("Stream (source) is already locked and cannot be iterated.");const t=e.pipeThrough(new TransformStream);return t[Symbol.asyncIterator]=()=>{if(t.locked)throw new Error("Stream is already locked and cannot be iterated again.");const o=t.getReader();return{async next(){const{done:r,value:n}=await o.read();return r?{done:!0,value:void 0}:{done:!1,value:n}}}},t}function pt(e){return _e(dt(e))}async function*mt(e,t){var s;let o=0,r=!0,n;for await(const a of e)if((s=a.operations)!=null&&s.length){for(let i=o;i<a.operations.length;i++){const l=a.operations[i];n=l,yield{partialOperation:l,isUpdateToPreviousOperation:i===o&&!r,isPossiblyPartial:i===a.operations.length-1,metadata:t},r=!1}o=a.operations.length-1}if(!n)throw new Error("No operations seen");yield{partialOperation:n,isUpdateToPreviousOperation:!0,isPossiblyPartial:!1,metadata:t}}async function*ft(e,t){let o=!1;for await(const r of e){const n=r.operation;n.ok?(yield{operation:n.value,isUpdateToPreviousOperation:o?!1:r.isUpdateToPreviousOperation,isPossiblyPartial:r.isPossiblyPartial,metadata:r.metadata},o=!1):(o=o||!r.isUpdateToPreviousOperation,t==null||t({...r,operation:n}))}}async function*ht(e,t){for await(const o of e){const r=t.find(s=>s.name===o.partialOperation.type);if(!r){yield{operation:{ok:!1,error:`No matching function for ${o.partialOperation.type}`},isUpdateToPreviousOperation:o.isUpdateToPreviousOperation,isPossiblyPartial:o.isPossiblyPartial,metadata:o.metadata};continue}yield{operation:r.validate(o.partialOperation),isUpdateToPreviousOperation:o.isUpdateToPreviousOperation,isPossiblyPartial:o.isPossiblyPartial,metadata:o.metadata}}}async function*yt(e,t){const o=ht(e,t);yield*ft(o,n=>{if(!n.isPossiblyPartial)throw new Error("invalid operation: "+n.operation.error)})}function Ae(e,t,o){return pt(yt(mt(_e(e),o),t))}async function gt(e,t,o){const r=new Ee(e),n=bt();n.output.pipeTo(r.writable);const s=new Map;let a=!0;const i=t["~registerMessagesCallback"](()=>{kt(t,u=>{if(!s.has(u.toolCallId)){const h=St(e,u.toolName,u.toolCallId);n.append(h.operationsStream),s.set(u.toolCallId,h),a&&(a=!1,o==null||o())}return s.get(u.toolCallId)})});await new Promise(u=>{const h=t["~registerStatusCallback"](()=>{(t.status==="ready"||t.status==="error")&&(i(),h(),t.status!=="error"&&p(),u())}),p=t["~registerErrorCallback"](()=>{if(t.error){p();for(const S of s.values())S.complete||S.writer.abort(t.error)}})}),await n.finalize();const c=(await Promise.allSettled([r.finish()]))[0];let d;if(c.status==="rejected"){if(c.reason instanceof ne)d=c.reason;else if(!t.error)throw new Error("Unexpected: no ChunkExecutionError but also no chat.error (network error?)")}let f=!1;const m=Array.from(s.values().filter(u=>u.complete));if(m.forEach((u,h)=>{const p=u.toolCallId===(d==null?void 0:d.chunk.metadata.toolCallId);p&&(f=!0),t.addToolResult({tool:m[h].toolName,toolCallId:m[h].toolCallId,output:f===!1?{status:"ok"}:p?{status:"error",error:re.getErrorMessage(d)}:{status:"not-executed-previous-tool-errored"}})}),d)throw d;if(t.error)throw t.error}function bt(){let e,t=Promise.resolve(),o=!1;const r=new ReadableStream({start(a){e=a},cancel(a){o=!0,e.error(a)}});async function n(a){if(o)throw new Error("Appendable stream canceled, can't append");const i=a.getReader();return t=t.then(async()=>{for(;;)try{const{done:l,value:c}=await i.read();if(l||o)break;e.enqueue(c)}catch(l){o=!0,e.error(l);break}}),t}async function s(){await t,o||e.close()}return{output:r,append:n,finalize:s}}function kt(e,t){var o;for(const r of((o=e.lastMessage)==null?void 0:o.parts)??[]){if(!T.isToolUIPart(r)||r.type.replace("tool-","")!=="applyDocumentOperations")continue;const s=r.toolCallId,a=t({toolName:r.type.replace("tool-",""),toolCallId:s});wt(r,a)}}function St(e,t,o){const r=new TransformStream,n=Ae(r.readable,e,{toolCallId:o});return{writer:r.writable.getWriter(),complete:!1,operationsStream:n,toolName:t,toolCallId:o}}function wt(e,t){if(e.state==="input-streaming"){const o=e.input;o!==void 0&&t.writer.write(o)}else if(e.state==="input-available"){const o=e.input;if(o===void 0)throw new Error("input is undefined");t.complete||(t.complete=!0,t.writer.write(o),t.writer.close())}}function se(e){return(e.type==="paragraph"||!e.type)&&!e.content||Array.isArray(e.content)&&e.content.length===0}function xt(e,t,o=!0,r=!0){let n=0,s=e.length;if(o)for(;n<s&&t(e[n]);)n++;if(r)for(;s>n&&t(e[s-1]);)s--;return e.slice(n,s)}function P(e,t){return xt(e,r=>se(r)&&(t==null?void 0:t.cursorBlockId)!==r.id,(t==null?void 0:t.trimStart)??!1,(t==null?void 0:t.trimEnd)??!0)}function Ne(e){const{useSelection:t,deleteEmptyCursorBlock:o,streamToolsProvider:r}={useSelection:e.useSelection??!1,deleteEmptyCursorBlock:e.deleteEmptyCursorBlock??!0,streamToolsProvider:e.streamToolsProvider??M.html.getStreamToolsProvider()},n=t?void 0:e.editor.getTextCursorPosition().block,s=n&&o&&se(n)&&P(e.editor.document).length>0?n.id:void 0,a=t?e.editor.getSelectionCutBlocks():void 0,i=r.getStreamTools(e.editor,a?{from:a._meta.startPos,to:a._meta.endPos}:void 0,e.onBlockUpdated);return{editor:e.editor,chat:e.chat,userPrompt:e.userPrompt,selectedBlocks:a==null?void 0:a.blocks,streamTools:i,emptyCursorBlockToDelete:s}}async function Le(e){const{aiRequest:t,sender:o,chatRequestOptions:r,onStart:n}=e,s=gt(t.streamTools,t.chat,()=>{n==null||n(),t.emptyCursorBlockToDelete&&t.editor.getBlock(t.emptyCursorBlockToDelete)&&t.editor.removeBlocks([t.emptyCursorBlockToDelete])});await o.sendAIRequest(t,r),await s}function Tt(e,t){e.length>0&&e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the selection (ignore previous selections, you MUST issue operations against this latest version of the selection):"},{type:"text",text:JSON.stringify(t.htmlSelectedBlocks)},{type:"text",text:"This is the latest state of the document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.htmlDocument)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:"The user asks you to do the following:"},{type:"text",text:t.userPrompt}]}),e.push({role:"system",id:"document-state-intro",parts:[{type:"text",text:"You're manipulating a selected part of a text document using HTML blocks. \n Make sure to follow the json schema provided and always include the trailing $ in ids.\n List items are 1 block with 1 list item each, so block content `<ul><li>item1</li></ul>` is valid, but `<ul><li>item1</li><li>item2</li></ul>` is invalid. We'll merge them automatically.\n This is the selection as an array of html blocks:"}]},{role:"system",id:"document-state-selection",parts:[{type:"text",text:JSON.stringify(t.htmlSelectedBlocks)}]},{role:"system",id:"document-state-context",parts:[{type:"text",text:"This is the entire document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.htmlDocument)}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}function vt(e,t){if(e.length>0){e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the document (ignore previous documents, you MUST issue operations against this latest version of the document):"},{type:"text",text:JSON.stringify(t.htmlBlocks)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:t.userPrompt}]});return}e.push({role:"system",id:"document-state-intro",parts:[{type:"text",text:"You're manipulating a text document using HTML blocks. \n Make sure to follow the json schema provided. When referencing ids they MUST be EXACTLY the same (including the trailing $). \n List items are 1 block with 1 list item each, so block content `<ul><li>item1</li></ul>` is valid, but `<ul><li>item1</li><li>item2</li></ul>` is invalid. We'll merge them automatically.\n For code blocks, you can use the `data-language` attribute on a <code> block (wrapped with <pre>) to specify the language.\n This is the initial document as an array of html blocks (the cursor is BETWEEN two blocks as indicated by cursor: true):"}]},{role:"system",id:"document-state-data",parts:[{type:"text",text:JSON.stringify(t.htmlBlocks)}]},{role:"system",id:"extended-instructions",parts:[{type:"text",text:'First, determine what part of the document the user is talking about. You SHOULD probably take cursor info into account if needed.\n EXAMPLE: if user says "below" (without pointing to a specific part of the document) he / she probably indicates the block(s) after the cursor. \n EXAMPLE: If you want to insert content AT the cursor position (UNLESS indicated otherwise by the user), \n then you need `referenceId` to point to the block before the cursor with position `after` (or block below and `before`).\n \n '+(t.isEmptyDocument?"Because the document is empty, first update the empty block before adding new blocks.":"Prefer updating existing blocks over removing and adding (but this also depends on the user's question).")}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}const Pt=async(e,t)=>{t.selection?Tt(e,t):vt(e,t)};function X(e,t){const o=e.getTextCursorPosition(),r=[];for(const n of t){const s=n.id===o.block.id;r.push({id:n.id,block:n.block}),s&&r.push({cursor:!0})}return r}async function B(e,t){return await Promise.all(e.map(async o=>({id:o.id,block:await t(o)})))}function C(e){return e.flatMap(t=>[{...t,children:[]},...C(t.children)])}function j(e){return e.map(t=>typeof t=="object"&&t&&"id"in t?{...t,id:`${t.id}$`}:t)}async function Ct(e){return e.selectedBlocks?{...await De(e.editor,{selectedBlocks:e.selectedBlocks}),userPrompt:e.userPrompt}:{...await je(e.editor,{excludeBlockIds:e.emptyCursorBlockToDelete?[e.emptyCursorBlockToDelete]:void 0}),userPrompt:e.userPrompt}}async function je(e,t){const o=P(e.document).length===0,r=e.getTextCursorPosition().block.id,n=P(e.document,{cursorBlockId:r}),s=await B(C(n),async c=>e.blocksToHTMLLossy([c])),i=X(e,s).filter(c=>"cursor"in c||!(t.excludeBlockIds||[]).includes(c.id));return{selection:!1,htmlBlocks:j(i),isEmptyDocument:o}}async function De(e,t){const o=P(e.document).length===0,r=await B(C(t.selectedBlocks),async s=>e.blocksToHTMLLossy([s])),n=j(r);return{isEmptyDocument:o,selection:!0,htmlSelectedBlocks:n,htmlDocument:(await B(C(e.document),async s=>e.blocksToHTMLLossy([s]))).map(({block:s})=>({block:s}))}}function It(e){let t,o=!1;return e.descendants((r,n)=>o?!1:(r.isText&&(o=!0,t=n),!0)),t}function Z(e){var s;const t=k.getPmSchema(e),{modification:o}=t.marks,r=[],n=new x.Transform(e.before);for(let a=0;a<e.steps.length;a++){const i=e.steps[a],l=new x.Mapping(e.mapping.maps.slice(0,a)).invert();if(i.structure){if(i instanceof x.ReplaceStep){if(i.to!==i.from+1||i.slice.openStart!==0||i.slice.openEnd!==1||i.slice.content.size!==2)throw new Error("Structure change is not in expected format (ReplaceStep)")}else if(i instanceof x.ReplaceAroundStep){if(i.insert!==1||i.slice.size!==2||i.gapTo!==i.to-1||i.gapFrom!==i.from+1)throw new Error("Structure change is not in expected format (ReplaceAroundStep)")}else throw new Error("Step is not a ReplaceStep or ReplaceAroundStep");const b=l.map(i.from),g=i.slice.content.firstChild,O=n.doc.resolve(n.mapping.map(b)).nodeAfter;let v=g.marks||[];g.type!==O.type&&(v=o.create({type:"nodeType",previousValue:O.type.name,newValue:g.type.name}).addToSet(v));const z=new Set([...Object.keys(g.attrs),...Object.keys(O.attrs)]);for(const E of z)g.attrs[E]!==O.attrs[E]&&(v=o.create({type:"attr",attrName:E,previousValue:O.attrs[E],newValue:g.attrs[E]}).addToSet(v));const N=n.steps.length;n.setNodeMarkup(n.mapping.map(b),g.type,g.attrs,v),r.push({prosemirrorSteps:n.steps.slice(N),selection:void 0,type:"replace"});continue}if(!(i instanceof x.ReplaceStep))throw new Error("Step is not a ReplaceStep");const c=l.map(i.from),d=l.map(i.to);if(i.slice.openStart>0||i.slice.openEnd>0)throw new Error("Slice has openStart or openEnd > 0, but structure=false");r.push({prosemirrorSteps:[],selection:{anchor:n.mapping.map(c),head:n.mapping.map(d)},type:"select"});const f=i.slice.content.textBetween(0,i.slice.size),m=f===n.doc.textBetween(n.mapping.map(c),n.mapping.map(d));let u;if(m)u=i.slice.content.size;else if(f.length===0)u=i.slice.content.size;else{const b=It(i.slice.content);if(b===void 0)throw new Error("unexpected: no first character found");u=b+1}let h=n.mapping.map(d);const p=n.mapping.map(d);let S=!0;for(let b=u;b<=i.slice.content.size;b++){const g=S&&c!==d,O=n.steps.length;if(g){const N=n.doc.resolve(n.mapping.map(c));(s=N.nodeAfter)!=null&&s.isBlock&&n.addNodeMark(N.pos,t.mark("deletion",{})),n.addMark(N.pos,h,t.mark("deletion",{})),h=n.mapping.map(d)}const v=new H.Slice(i.slice.content.cut(0,b),0,0);n.replace(p,h,v).addMark(p,p+v.content.size,t.mark("insertion",{})),n.doc.nodesBetween(p,p+v.content.size,(N,E)=>E<p||E>p+v.content.size?!0:(N.isBlock&&n.addNodeMark(E,t.mark("insertion",{})),!1)),h=n.mapping.slice(O).map(h);const z=U.TextSelection.near(n.doc.resolve(p+v.content.size),-1);r.push({prosemirrorSteps:n.steps.slice(O),selection:{anchor:z.from,head:z.from},type:g?"replace":"insert"}),S=!1}}return r}async function ie(e){const t=Math.random()*.3+.85;if(e.type==="select")await new Promise(o=>setTimeout(o,100*t));else if(e.type==="insert")await new Promise(o=>setTimeout(o,10*t));else if(e.type==="replace")await new Promise(o=>setTimeout(o,200*t));else throw new k.UnreachableCaseError(e.type)}function ae(e,t){e.setMeta("addToHistory",!1),t.selection&&e.setMeta("aiAgent",{selection:{anchor:t.selection.anchor,head:t.selection.head}});for(const o of t.prosemirrorSteps)if(e.maybeStep(o).failed)throw new Error("failed to apply step");return e}function Ot(e,t,o){const r=new x.Transform(t);for(const a of e){const i=new x.ReplaceStep(r.mapping.map(a.fromA),r.mapping.map(a.toA),o.slice(a.fromB,a.toB));r.step(i)}const n=r.mapping.invert();let s=r.doc.content.findDiffStart(o.content);for(;s!==null;){const a=o.resolve(s).nodeAfter,i=r.doc.resolve(s).nodeAfter;if(!a||!i)throw new Error("diffNode not found");const l=!a.isLeaf&&a.content.eq(i.content),c=l?1:Math.min(a.nodeSize,i.nodeSize),d=s+c,f=n.map(s),m=n.map(d);let u=e.length;for(let p=0;p<e.length;p++)if(e[p].fromA>=m){u=p;break}e.splice(u,0,{fromA:f,toA:m,fromB:s,toB:d,deleted:[],inserted:[],type:l?"node-type-or-attr-update":"mark-update"}),r.step(new x.ReplaceStep(s,d,o.slice(s,d),l));const h=r.doc.content.findDiffStart(o.content);if(h===s)throw new Error("diffStart not moving");s=h}return e}const he=(e,t)=>{const o=new Set,r=new Set;e.descendants(a=>{a.type.name==="tableCell"&&o.add(JSON.stringify(a.toJSON()))}),t.descendants(a=>{a.type.name==="tableCell"&&r.add(JSON.stringify(a.toJSON()))});const n=new Set([...o].filter(a=>r.has(a)));return{encodeCharacter:a=>a,encodeNodeStart:a=>{if(a.type.name==="tableCell"){const i=JSON.stringify(a.toJSON());return n.has(i)?i:a.type.name}return a.type.name},encodeNodeEnd:a=>{if(a.type.name==="tableCell"){const i=JSON.stringify(a.toJSON());return n.has(i)?i:-1}return-1},compareTokens:(a,i)=>a===i}};function Q(e,t,o=!1,r,n){const s=k.getNodeById(e.id,t),a=new x.Transform(t);k.updateBlockTr(a,s.posBeforeNode,e.block,r,n);let i=a.doc,l=ee.ChangeSet.create(t,void 0,he(t,i));if(l=l.addSteps(i,a.mapping.maps,0),o&&l.changes.length>0){const f=l.changes[l.changes.length-1],m=f.toA-f.fromA,u=f.toB-f.fromB;if(m>u){const h=t.slice(f.fromA+u,f.toA);a.step(new x.ReplaceStep(f.toB,f.toB,h)),i=a.doc,l=ee.ChangeSet.create(l.startDoc,void 0,he(l.startDoc,i)),l=l.addSteps(i,a.mapping.maps,0)}}const c=[],d=ee.simplifyChanges(l.changes,i);for(let f=0;f<d.length;f++){const m=d[f],u=i.slice(m.fromB,m.toB);if(u.openEnd===1&&u.openStart===0&&(m.type="node-type-or-attr-update",u.size>2)){const h={fromA:m.fromA,toA:m.fromA+1,fromB:m.fromB,toB:m.fromB+1,deleted:[],inserted:[],type:"node-type-or-attr-update"},p={fromA:m.fromA+1,toA:m.toA,fromB:m.fromB+1,toB:m.toB,deleted:[],inserted:[]};d.splice(f,1,h,p),f++}}Ot(d,t,i);for(let f=0;f<d.length;f++){const m=d[f],u=i.slice(m.fromB,m.toB);if(u.openEnd>0&&u.size>1)throw new Error("unexpected, openEnd > 0 and size > 1, this should have been split into two steps");f===d.length-1&&o&&m.type==="mark-update"||c.push(new x.ReplaceStep(m.fromA,m.toA,u,m.type==="node-type-or-attr-update"))}return c}function Mt(e,t){if(!e||!Array.isArray(e)||e.length===0)return{ok:!1,error:"blocks is required"};const o=[];for(const r of e){const n=t(r);if(!n.ok)return{ok:!1,error:`Invalid block: ${n.error}`};o.push(n.value)}return{ok:!0,value:o}}function le(e){return(t,o)=>{const r=typeof e.schema=="function"?e.schema(t):e.schema;return{name:"add",description:e.description,inputSchema:{type:"object",properties:{referenceId:{type:"string",description:"MUST be an id of a block in the document"},position:{type:"string",enum:["before","after"],description:"`after` to add blocks AFTER (below) the block with `referenceId`, `before` to add the block BEFORE (above)"},blocks:{items:r.block,type:"array"}},required:["referenceId","position","blocks"],$defs:r.$defs},validate:n=>{if(n.type!=="add")return{ok:!1,error:"invalid operation type"};if(n.position!=="before"&&n.position!=="after")return{ok:!1,error:"invalid position"};if(!n.referenceId||!n.blocks)return{ok:!1,error:"referenceId and blocks are required"};let s=n.referenceId;if(o.idsSuffixed){if(!(s!=null&&s.endsWith("$")))return{ok:!1,error:"referenceId must end with $"};s=s.slice(0,-1)}if(!t.getBlock(s))return{ok:!1,error:"referenceId not found"};const i=Mt(n.blocks,l=>e.validateBlock(l,t));return i.ok?{ok:!0,value:{type:n.type,referenceId:s,position:n.position,blocks:i.value}}:i},executor:()=>{let n=[];const s={};return{execute:async a=>{var c;if(a.isUpdateToPreviousOperation||(n=[]),a.operation.type!=="add")return!1;const i=a.operation,l=await e.toJSONToolCall(t,{...a,operation:i});if(!l||a.isPossiblyPartial&&se(l.blocks[l.blocks.length-1]))return!0;for(let d=0;d<l.blocks.length;d++){const f=l.blocks[d],m=t.prosemirrorState.tr;let u=[];if(d<n.length){const h=await e.rebaseTool(n[d],t),S=Q({id:n[d],block:f},h.doc,!1).map(b=>b.map(h.invertMap));for(const b of S)m.step(b.map(m.mapping));u=Z(m),u=u.filter(b=>b.type!=="select")}else{const h=i.position==="after"?s[i.referenceId]:void 0,p=k.insertBlocks(m,[f],d>0?n[d-1]:h||i.referenceId,d>0?"after":i.position);n.push(...p.map(S=>S.id)),u=Z(m)}for(const h of u)o.withDelays&&await ie(h),t.transact(p=>{ae(p,h)}),(c=o.onBlockUpdate)==null||c.call(o,n[d])}return a.isPossiblyPartial||i.position==="after"&&(s[i.referenceId]=n[n.length-1]),!0}}}}}}function ce(e){return(t,o)=>{const r=typeof e.schema=="function"?e.schema(t):e.schema;return{name:"update",description:e.description,inputSchema:{type:"object",properties:{id:{type:"string",description:"id of block to update"},block:r.block},required:["id","block"],$defs:r.$defs},validate:n=>{if(n.type!=="update")return{ok:!1,error:"invalid operation type"};if(!n.id)return{ok:!1,error:"id is required"};let s=n.id;if(o.idsSuffixed){if(!(s!=null&&s.endsWith("$")))return{ok:!1,error:"id must end with $"};s=s.slice(0,-1)}if(!n.block)return{ok:!1,error:"block is required"};const a=t.getBlock(s);if(!a)return console.error("BLOCK NOT FOUND",s),{ok:!1,error:"block not found"};const i=e.validateBlock(n.block,t,a.type);return i.ok?{ok:!0,value:{type:n.type,id:s,block:i.value}}:i},executor:()=>{let s=50;const a=o.updateSelection?{from:k.trackPosition(t,o.updateSelection.from),to:k.trackPosition(t,o.updateSelection.to)}:void 0;return{execute:async i=>{var b;if(i.operation.type!=="update")return!1;const l=i.operation;if(i.isPossiblyPartial){const g=JSON.stringify(l.block).length;if(g<s)return!0;s=g+50}else s=50;const c=await e.rebaseTool(l.id,t),d=a?c.invertMap.invert().map(a.from()):void 0,f=a?c.invertMap.invert().map(a.to()):void 0,m=await e.toJSONToolCall(t,{...i,operation:l});if(!m)return!0;const u=Q(m,c.doc,i.isPossiblyPartial,d,f);if(u.length===1&&i.isPossiblyPartial)return!0;const h=u.map(g=>g.map(c.invertMap)),p=new x.Transform(t.prosemirrorState.doc);for(const g of h)p.step(g.map(p.mapping));const S=Z(p);for(const g of S)o.withDelays&&await ie(g),t.transact(O=>{ae(O,g)}),(b=o.onBlockUpdate)==null||b.call(o,l.id);return!0}}}}}}const ue=(e,t)=>({name:"delete",description:"Delete a block",inputSchema:{type:"object",properties:{id:{type:"string",description:"id of block to delete"}},required:["id"]},validate:o=>{if(o.type!=="delete")return{ok:!1,error:"invalid operation type"};if(!o.id)return{ok:!1,error:"id is required"};let r=o.id;if(t.idsSuffixed){if(!(r!=null&&r.endsWith("$")))return{ok:!1,error:"id must end with $"};r=r.slice(0,-1)}return e.getBlock(r)?{ok:!0,value:{type:"delete",id:r}}:{ok:!1,error:"block not found"}},executor:()=>({execute:async o=>{var a;if(o.operation.type!=="delete")return!1;const r=o.operation,n=e.prosemirrorState.tr;k.removeAndInsertBlocks(n,[r.id],[]);const s=Z(n);for(const i of s)t.withDelays&&await ie(i),e.transact(l=>{ae(l,i)}),(a=t.onBlockUpdate)==null||a.call(t,r.id);return!0}})});function ye(e){const t=e.lastIndexOf("<"),o=e.lastIndexOf(">");let r=e;if(t>o&&(r=e.substring(0,t),!r.trim()))return;const n=r.match(/&[a-zA-Z0-9]*$/);n&&(r=r.substring(0,r.length-n[0].length));const i=new DOMParser().parseFromString(`<div>${r}</div>`,"text/html").body.firstChild;return i?i.innerHTML:""}function W(e){let t;if($.applySuggestions(e.prosemirrorState,o=>{t=o}),!t)throw new Error("applySuggestionsTr is not set");return t}function Y(e,t){const o=t.mapping.invert();return{doc:t.doc,tr:()=>new x.Transform(t.doc),invertMap:o,rebaseTr:r=>{if(r.steps.length===0)throw new Error("No steps to apply");let n=e.prosemirrorState.tr;for(const s of r.steps){const a=s.map(o);if(!a)throw new Error("Step is not mapped");n=n.step(a)}return n}}}async function ge(e,t){var c;const o=W(t),r=k.getBlock(o.doc,e);if(!r)throw new Error("block not found");const n=await t.blocksToHTMLLossy([{...r,children:[]}]),s=(c=window.__TEST_OPTIONS)==null?void 0:c.mockID,a=await t.tryParseHTMLToBlocks(n);if(window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=s),a.length!==1)throw new Error("html diff invalid block count");const i=a[0];if(i.id=e,Q({id:e,block:i},o.doc).length)throw new Error("html diff");return Y(t,o)}function be(e){return typeof e!="string"?{ok:!1,error:"block must be a string"}:{ok:!0,value:e}}const R={add:le({description:"Insert new blocks",schema:{block:{type:"string",description:"html of block (MUST be a single, VALID HTML element)"}},validateBlock:be,rebaseTool:ge,toJSONToolCall:async(e,t)=>{var n;const o=(n=window.__TEST_OPTIONS)==null?void 0:n.mockID,r=(await Promise.all(t.operation.blocks.map(async s=>{const a=t.isPossiblyPartial?ye(s):s;return a?(await e.tryParseHTMLToBlocks(a)).map(i=>(delete i.id,i)):[]}))).flat();if(window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=o),r.length!==0)return{...t.operation,blocks:r}}}),update:ce({description:"Update a block",schema:{block:{type:"string",description:"html of block (MUST be a single HTML element)"}},validateBlock:be,rebaseTool:ge,toJSONToolCall:async(e,t)=>{const o=t.isPossiblyPartial?ye(t.operation.block):t.operation.block;if(!o)return;const r=(await e.tryParseHTMLToBlocks(o))[0];return window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=void 0),delete r.id,{...t.operation,block:r}}}),delete:ue};function Bt(e,t,o,r,n){if(typeof r=="boolean"){const i=r?e.getSelectionCutBlocks():void 0;r=i?{from:i._meta.startPos,to:i._meta.endPos}:void 0}const s=o??{add:!0,update:!0,delete:!0};return[...s.update?[R.update(e,{idsSuffixed:!0,withDelays:t,updateSelection:r,onBlockUpdate:n})]:[],...s.add?[R.add(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[],...s.delete?[R.delete(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[]]}const Et={getStreamToolsProvider:(e={})=>({getStreamTools:(t,o,r)=>Bt(t,e.withDelays??!0,e.defaultStreamTools,o,r)}),tools:R,defaultPromptBuilder:Pt,defaultPromptInputDataBuilder:Ct,promptHelpers:{getDataForPromptNoSelection:je,getDataForPromptWithSelection:De}};async function _t(e){return e.selectedBlocks?{...await $e(e.editor,{selectedBlocks:e.selectedBlocks}),userPrompt:e.userPrompt}:{...await qe(e.editor,{excludeBlockIds:e.emptyCursorBlockToDelete?[e.emptyCursorBlockToDelete]:void 0}),userPrompt:e.userPrompt}}async function qe(e,t){const o=P(e.document).length===0,r=e.getTextCursorPosition().block.id,n=P(e.document,{cursorBlockId:r}),s=await B(C(n),async c=>({...c,children:void 0})),i=X(e,s).filter(c=>"cursor"in c||!(t.excludeBlockIds||[]).includes(c.id));return{selection:!1,jsonBlocks:j(i),isEmptyDocument:o}}async function $e(e,t){const o=P(e.document).length===0,r=await B(C(t.selectedBlocks),async s=>s),n=j(r);return{isEmptyDocument:o,selection:!0,jsonSelectedBlocks:n,jsonDocument:(await B(C(e.document),async s=>({...s,id:void 0,children:void 0}))).map(({block:s})=>({block:s}))}}function At(e){const t={},o={};return e.forEach(n=>{const{type:s,...a}=n.properties,i=JSON.stringify(a);t[i]?t[i].push(s.enum[0]):(t[i]=[s.enum[0]],o[i]=n)}),Object.keys(t).map(n=>{const s=o[n];return{...s,properties:{...s.properties,type:{type:"string",enum:t[n]}}}})}function Nt(e){return{type:"object",properties:Object.fromEntries(Object.entries(e).map(([t,o])=>[t,{type:o.propSchema}])),additionalProperties:!1}}function Lt(){return{type:"object",properties:{type:{type:"string",enum:["text"]},text:{type:"string"},styles:{$ref:"#/$defs/styles"}},additionalProperties:!1,required:["type","text"]}}function He(e){return{type:"object",properties:Object.fromEntries(Object.entries(e).filter(([t,o])=>o.default!==void 0).map(([t,o])=>[t,{type:typeof o.default,enum:o.values}])),additionalProperties:!1}}function jt(e){return{type:"array",items:{anyOf:Object.entries(e).map(([t,o])=>o==="text"?{$ref:"#/$defs/styledtext"}:o==="link"?{type:"object",properties:{type:{type:"string",enum:["link"]},content:{type:"array",items:{$ref:"#/$defs/styledtext"}},href:{type:"string"}},additionalProperties:!1,required:["type","href","content"]}:{type:"object",properties:{type:{type:"string",enum:[o.type]},content:o.content==="styled"?{type:"array",items:{$ref:"#/$defs/styledtext"}}:void 0,props:He(o.propSchema)},additionalProperties:!1,required:["type",...o.content==="styled"?["content"]:[]]})}}}function Dt(e){return{anyOf:At(Object.entries(e).map(([t,o])=>({type:"object",properties:{type:{type:"string",enum:[o.type]},content:o.content==="inline"?{$ref:"#/$defs/inlinecontent"}:o.content==="table"?{type:"object",properties:{}}:void 0,props:He(o.propSchema)},additionalProperties:!1,required:["type"]})))}}function qt(e){const t=JSON.parse(JSON.stringify({blockSchema:e.blockSchema,inlineContentSchema:e.inlineContentSchema,styleSchema:e.styleSchema}));return{removeFileBlocks(){return t.blockSchema=Object.fromEntries(Object.entries(t.blockSchema).filter(([o,r])=>{var n;return!((n=e.blockSpecs[r.type].implementation.meta)!=null&&n.fileBlockAccept)})),this},removeDefaultProps(){return t.blockSchema=Object.fromEntries(Object.entries(t.blockSchema).map(([o,r])=>[o,{...r,propSchema:Object.fromEntries(Object.entries(r.propSchema).filter(n=>typeof k.defaultProps[n[0]]>"u"))}])),this},get(){return t}}}function ke(e){return e=qt(e).removeFileBlocks().removeDefaultProps().get(),{$defs:{styles:Nt(e.styleSchema),styledtext:Lt(),inlinecontent:jt(e.inlineContentSchema),block:Dt(e.blockSchema)}}}function Ue(e,t){return!t.schema.inlineContentSchema[e.type]||k.isStyledTextInlineContent(e)&&!("text"in e)?!1:k.isLinkInlineContent(e)?!("content"in e)||!("href"in e)?!1:Ue(e.content,t):!0}function Se(e,t,o){const r=e.type||o,n=t.schema.blockSchema[r];if(!n)return{ok:!1,error:"block type not found in editor"};if(e.children,n.content==="none"){if(e.content)return{ok:!1,error:"block content not expected for this block type"}}else{if(!e.content)return{ok:!0,value:e};if(!Array.isArray(e.content))return{ok:!1,error:"block content must be an array"};if(n.content==="table")return{ok:!0,value:e};if(!e.content.every(s=>Ue(s,t)))return{ok:!1,error:"block content must be an array of inline content"}}return{ok:!0,value:e}}const V={add:le({description:"Insert new blocks",schema:e=>({block:{$ref:"#/$defs/block"},...ke(e.schema)}),validateBlock:Se,rebaseTool:async(e,t)=>Y(t,W(t)),toJSONToolCall:async(e,t)=>t.operation}),update:ce({description:"Update a block, the new block will replace the existing block.",schema:e=>({block:{$ref:"#/$defs/block"},...ke(e.schema)}),validateBlock:Se,rebaseTool:async(e,t)=>Y(t,W(t)),toJSONToolCall:async(e,t)=>{const o=Object.fromEntries(Object.entries(k.defaultProps).map(([r,n])=>[r,n.default]));return{...t.operation,block:{...t.operation.block,props:{...o,...t.operation.block.props}}}}}),delete:ue};function $t(e,t){e.length>0&&e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the selection (ignore previous selections, you MUST issue operations against this latest version of the selection):"},{type:"text",text:JSON.stringify(t.jsonSelectedBlocks)},{type:"text",text:"This is the latest state of the document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.jsonDocument)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:"The user asks you to do the following:"},{type:"text",text:t.userPrompt}]}),e.push({role:"system",id:"document-state-intro",parts:[{type:"text",text:`You're manipulating a selected part of a text document using JSON blocks.
2
+ Make sure to follow the json schema provided and always include the trailing $ in ids.
3
+ This is the selection as an array of JSON blocks:`},{type:"text",text:JSON.stringify(t.jsonSelectedBlocks)},{type:"text",text:"This is the entire document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.jsonDocument)}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}function Ht(e,t){if(e.length>0){e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the document (ignore previous documents, you MUST issue operations against this latest version of the document):"},{type:"text",text:JSON.stringify(t.jsonBlocks)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:t.userPrompt}]});return}e.push({role:"system",id:"document-state",parts:[{type:"text",text:`You're manipulating a text document using JSON blocks.
13
4
  Make sure to follow the json schema provided. When referencing ids they MUST be EXACTLY the same (including the trailing $).
14
- This is the document as an array of JSON blocks (the cursor is BETWEEN two blocks as indicated by cursor: true):`},{role:"system",content:JSON.stringify(e.jsonBlocks)},...e.isEmptyDocument?[{role:"system",content:"Because the actual document is empty, this is an example document to understand the schema:"},{role:"system",content:JSON.stringify({id:"ref3",type:"paragraph",content:[{type:"text",text:"Hello, world! ",styles:{}},{type:"text",text:"Bold text. ",styles:{bold:!0}},{type:"link",href:"https://www.w3.org",content:"Link."}]})}]:[],{role:"system",content:"The user asks you to do the following:"},{role:"system",content:'First, determine what part of the document the user is talking about. You SHOULD probably take cursor info into account if needed.\n EXAMPLE: if user says "below" (without pointing to a specific part of the document) he / she probably indicates the block(s) after the cursor. \n EXAMPLE: If you want to insert content AT the cursor position (UNLESS indicated otherwise by the user), then you need `referenceId` to point to the block before the cursor with position `after` (or block below and `before`).\n \n '+(e.isEmptyDocument?"Because the document is empty, first update the empty block before adding new blocks.":"Prefer updating existing blocks over removing and adding (but this also depends on the user's question).")},{role:"user",content:e.userPrompt}]}const vt=async(e,t)=>{const o=E(e.document).length===0;if(t.selectedBlocks){const r=await Ne(e,{selectedBlocks:t.selectedBlocks});return wt({...r,userPrompt:t.userPrompt})}else{const r=await Ae(e,t);return Tt({...r,userPrompt:t.userPrompt,isEmptyDocument:o})}};function Ct(e){const t={},o={};return e.forEach(n=>{const{type:s,...a}=n.properties,i=JSON.stringify(a);t[i]?t[i].push(s.enum[0]):(t[i]=[s.enum[0]],o[i]=n)}),Object.keys(t).map(n=>{const s=o[n];return{...s,properties:{...s.properties,type:{type:"string",enum:t[n]}}}})}function Pt(e){return{type:"object",properties:Object.fromEntries(Object.entries(e).map(([t,o])=>[t,{type:o.propSchema}])),additionalProperties:!1}}function Ot(){return{type:"object",properties:{type:{type:"string",enum:["text"]},text:{type:"string"},styles:{$ref:"#/$defs/styles"}},additionalProperties:!1,required:["type","text"]}}function je(e){return{type:"object",properties:Object.fromEntries(Object.entries(e).filter(([t,o])=>o.default!==void 0).map(([t,o])=>[t,{type:typeof o.default,enum:o.values}])),additionalProperties:!1}}function xt(e){return{type:"array",items:{anyOf:Object.entries(e).map(([t,o])=>o==="text"?{$ref:"#/$defs/styledtext"}:o==="link"?{type:"object",properties:{type:{type:"string",enum:["link"]},content:{type:"array",items:{$ref:"#/$defs/styledtext"}},href:{type:"string"}},additionalProperties:!1,required:["type","href","content"]}:{type:"object",properties:{type:{type:"string",enum:[o.type]},content:o.content==="styled"?{type:"array",items:{$ref:"#/$defs/styledtext"}}:void 0,props:je(o.propSchema)},additionalProperties:!1,required:["type",...o.content==="styled"?["content"]:[]]})}}}function Mt(e){return{anyOf:Ct(Object.entries(e).map(([t,o])=>({type:"object",properties:{type:{type:"string",enum:[o.type]},content:o.content==="inline"?{$ref:"#/$defs/inlinecontent"}:o.content==="table"?{type:"object",properties:{}}:void 0,props:je(o.propSchema)},additionalProperties:!1,required:["type"]})))}}function Bt(e){const t=JSON.parse(JSON.stringify({blockSchema:e.blockSchema,inlineContentSchema:e.inlineContentSchema,styleSchema:e.styleSchema}));return{removeFileBlocks(){return t.blockSchema=Object.fromEntries(Object.entries(t.blockSchema).filter(([o,r])=>{var n;return!((n=e.blockSpecs[r.type].implementation.meta)!=null&&n.fileBlockAccept)})),this},removeDefaultProps(){return t.blockSchema=Object.fromEntries(Object.entries(t.blockSchema).map(([o,r])=>[o,{...r,propSchema:Object.fromEntries(Object.entries(r.propSchema).filter(n=>typeof T.defaultProps[n[0]]>"u"))}])),this},get(){return t}}}function ye(e){return e=Bt(e).removeFileBlocks().removeDefaultProps().get(),{$defs:{styles:Pt(e.styleSchema),styledtext:Ot(),inlinecontent:xt(e.inlineContentSchema),block:Mt(e.blockSchema)}}}function De(e,t){return!t.schema.inlineContentSchema[e.type]||T.isStyledTextInlineContent(e)&&!("text"in e)?!1:T.isLinkInlineContent(e)?!("content"in e)||!("href"in e)?!1:De(e.content,t):!0}function ge(e,t,o){const r=e.type||o,n=t.schema.blockSchema[r];if(!n)return{ok:!1,error:"block type not found in editor"};if(e.children,n.content==="none"){if(e.content)return{ok:!1,error:"block content not expected for this block type"}}else{if(!e.content)return{ok:!0,value:e};if(!Array.isArray(e.content))return{ok:!1,error:"block content must be an array"};if(n.content==="table")return{ok:!0,value:e};if(!e.content.every(s=>De(s,t)))return{ok:!1,error:"block content must be an array of inline content"}}return{ok:!0,value:e}}const ee={add:se({description:"Insert new blocks",schema:e=>({block:{$ref:"#/$defs/block"},...ye(e.schema)}),validateBlock:ge,rebaseTool:async(e,t)=>V(t,J(t)),toJSONToolCall:async(e,t)=>t.operation}),update:ie({description:"Update a block, the new block will replace the existing block.",schema:e=>({block:{$ref:"#/$defs/block"},...ye(e.schema)}),validateBlock:ge,rebaseTool:async(e,t)=>V(t,J(t)),toJSONToolCall:async(e,t)=>{const o=Object.fromEntries(Object.entries(T.defaultProps).map(([r,n])=>[r,n.default]));return{...t.operation,block:{...t.operation.block,props:{...o,...t.operation.block.props}}}}}),delete:ae};function It(e,t,o,r){const n={add:!0,update:!0,delete:!0,...o};return[...n.update?[ee.update(e,{idsSuffixed:!0,withDelays:t,updateSelection:r})]:[],...n.add?[ee.add(e,{idsSuffixed:!0,withDelays:t})]:[],...n.delete?[ee.delete(e,{idsSuffixed:!0,withDelays:t})]:[]]}const _t={getStreamTools:It,defaultPromptBuilder:vt,promptHelpers:{getDataForPromptNoSelection:Ae,getDataForPromptWithSelection:Ne}};async function Re(e,t){const o=e.getTextCursorPosition().block.id,r=E(e.document,{cursorBlockId:o}),n=await x(P(r),async c=>e.blocksToMarkdownLossy([c])),a=Y(e,n).filter(c=>"cursor"in c||!(t.excludeBlockIds||[]).includes(c.id));return{markdownBlocks:A(a)}}async function $e(e,t){const o=await x(P(t.selectedBlocks),async n=>e.blocksToMarkdownLossy([n]));return{markdownSelectedBlocks:A(o),markdownDocument:(await x(P(e.document),async n=>e.blocksToMarkdownLossy([n]))).map(({block:n})=>({block:n}))}}function Lt(e){return[{role:"system",content:`You're manipulating a selected part of a text document using markdown blocks.
15
- Make sure to follow the json schema provided and always include the trailing $ in ids.
16
- This is the selection as an array of markdown blocks:`},{role:"system",content:JSON.stringify(e.markdownSelectedBlocks)},{role:"system",content:"This is the entire document (INCLUDING the selected text), find the selected text in there to understand the context:"},{role:"system",content:JSON.stringify(e.markdownDocument)},{role:"system",content:"The user asks you to do the following:"},{role:"user",content:e.userPrompt}]}function Et(e){return[{role:"system",content:`You're manipulating a text document using markdown blocks.
5
+ This is the initial document as an array of JSON blocks (the cursor is BETWEEN two blocks as indicated by cursor: true):`},{type:"text",text:JSON.stringify(t.jsonBlocks)},{type:"text",text:'First, determine what part of the document the user is talking about. You SHOULD probably take cursor info into account if needed.\n EXAMPLE: if user says "below" (without pointing to a specific part of the document) he / she probably indicates the block(s) after the cursor. \n EXAMPLE: If you want to insert content AT the cursor position (UNLESS indicated otherwise by the user), \n then you need `referenceId` to point to the block before the cursor with position `after` (or block below and `before`).\n \n '+(t.isEmptyDocument?"Because the document is empty, first update the empty block before adding new blocks.":"Prefer updating existing blocks over removing and adding (but this also depends on the user's question).")}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}const Ut=async(e,t)=>{t.selection?$t(e,t):Ht(e,t)};function zt(e,t,o,r,n){if(typeof r=="boolean"){const i=r?e.getSelectionCutBlocks():void 0;r=i?{from:i._meta.startPos,to:i._meta.endPos}:void 0}const s=o??{add:!0,update:!0,delete:!0};return[...s.update?[V.update(e,{idsSuffixed:!0,withDelays:t,updateSelection:r,onBlockUpdate:n})]:[],...s.add?[V.add(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[],...s.delete?[V.delete(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[]]}const Jt={getStreamToolsProvider:(e={})=>({getStreamTools:(t,o,r)=>zt(t,e.withDelays??!0,e.defaultStreamTools,o,r)}),tools:V,defaultPromptBuilder:Ut,defaultPromptInputDataBuilder:_t,promptHelpers:{getDataForPromptNoSelection:qe,getDataForPromptWithSelection:$e}};async function Rt(e){return e.selectedBlocks?{...await Je(e.editor,{selectedBlocks:e.selectedBlocks}),userPrompt:e.userPrompt}:{...await ze(e.editor,{excludeBlockIds:e.emptyCursorBlockToDelete?[e.emptyCursorBlockToDelete]:void 0}),userPrompt:e.userPrompt}}async function ze(e,t){const o=P(e.document).length===0,r=e.getTextCursorPosition().block.id,n=P(e.document,{cursorBlockId:r}),s=await B(C(n),async c=>e.blocksToMarkdownLossy([c])),i=X(e,s).filter(c=>"cursor"in c||!(t.excludeBlockIds||[]).includes(c.id));return{selection:!1,markdownBlocks:j(i),isEmptyDocument:o}}async function Je(e,t){const o=P(e.document).length===0,r=await B(C(t.selectedBlocks),async s=>e.blocksToMarkdownLossy([s])),n=j(r);return{isEmptyDocument:o,selection:!0,markdownSelectedBlocks:n,markdownDocument:(await B(C(e.document),async s=>e.blocksToMarkdownLossy([s]))).map(({block:s})=>({block:s}))}}async function we(e,t){const o=W(t),r=await t.blocksToMarkdownLossy([k.getBlock(o.doc,e)]),n=await t.tryParseMarkdownToBlocks(r),s=Q({id:e,block:n[0]},o.doc),a=new x.Mapping;for(const i of s){const l=i.map(a);if(!l)throw new Error("Failed to map step");o.step(l),a.appendMap(l.getMap())}return Y(t,o)}function xe(e){return typeof e!="string"?{ok:!1,error:"block must be a string"}:{ok:!0,value:e}}const F={add:le({description:"Insert new blocks",schema:{block:{$ref:"#/$defs/block"},$defs:{block:{type:"string",description:"markdown of block"}}},validateBlock:xe,rebaseTool:we,toJSONToolCall:async(e,t)=>{const o=await Promise.all(t.operation.blocks.map(async r=>{const n=(await e.tryParseMarkdownToBlocks(r.trim()))[0];return delete n.id,n}));return window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=void 0),{...t.operation,blocks:o}}}),update:ce({description:"Update a block, the new block will replace the existing block.",schema:{block:{$ref:"#/$defs/block"},$defs:{block:{type:"string",description:"markdown of block"}}},validateBlock:xe,rebaseTool:we,toJSONToolCall:async(e,t)=>{const o=(await e.tryParseMarkdownToBlocks(t.operation.block.trim()))[0];return delete o.id,window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=void 0),{...t.operation,block:o}}}),delete:ue};function Vt(e,t){e.length>0&&e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the selection (ignore previous selections, you MUST issue operations against this latest version of the selection):"},{type:"text",text:JSON.stringify(t.markdownSelectedBlocks)},{type:"text",text:"This is the latest state of the document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.markdownDocument)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:"The user asks you to do the following:"},{type:"text",text:t.userPrompt}]}),e.push({role:"system",id:"document-state-intro",parts:[{type:"text",text:`You're manipulating a selected part of a text document using Markdown blocks.
6
+ Make sure to follow the json schema provided and always include the trailing $ in ids.
7
+ This is the selection as an array of Markdown blocks:`},{type:"text",text:JSON.stringify(t.markdownSelectedBlocks)},{type:"text",text:"This is the entire document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.markdownDocument)}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}function Ft(e,t){if(e.length>0){e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the document (ignore previous documents, you MUST issue operations against this latest version of the document):"},{type:"text",text:JSON.stringify(t.markdownBlocks)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:t.userPrompt}]});return}e.push({role:"system",id:"document-state",parts:[{type:"text",text:`You're manipulating a text document using Markdown blocks.
17
8
  Make sure to follow the json schema provided. When referencing ids they MUST be EXACTLY the same (including the trailing $).
18
- This is the document as an array of markdown blocks (the cursor is BETWEEN two blocks as indicated by cursor: true):`},{role:"system",content:JSON.stringify(e.markdownBlocks)},{role:"system",content:"The user asks you to do the following:"},{role:"user",content:e.userPrompt},{role:"system",content:'First, determine what part of the document the user is talking about. You SHOULD probably take cursor info into account if needed.\n EXAMPLE: if user says "below" (without pointing to a specific part of the document) he / she probably indicates the block(s) after the cursor. \n EXAMPLE: If you want to insert content AT the cursor position (UNLESS indicated otherwise by the user), then you need `referenceId` to point to the block before the cursor with position `after` (or block below and `before`).\n \n Prefer updating blocks over adding or removing (but this also depends on the user\'s question).'}]}const At=async(e,t)=>{if(t.selectedBlocks){const o=await $e(e,{selectedBlocks:t.selectedBlocks});return Lt({...o,userPrompt:t.userPrompt})}else{const o=await Re(e,t);return Et({...o,userPrompt:t.userPrompt})}};async function ke(e,t){const o=J(t),r=await t.blocksToMarkdownLossy([T.getBlock(o.doc,e)]),n=await t.tryParseMarkdownToBlocks(r),s=G({id:e,block:n[0]},o.doc),a=new C.Mapping;for(const i of s){const c=i.map(a);if(!c)throw new Error("Failed to map step");o.step(c),a.appendMap(c.getMap())}return V(t,o)}function be(e){return typeof e!="string"?{ok:!1,error:"block must be a string"}:{ok:!0,value:e}}const te={add:se({description:"Insert new blocks",schema:{block:{$ref:"#/$defs/block"},$defs:{block:{type:"string",description:"markdown of block"}}},validateBlock:be,rebaseTool:ke,toJSONToolCall:async(e,t)=>{const o=await Promise.all(t.operation.blocks.map(async r=>{const n=(await e.tryParseMarkdownToBlocks(r.trim()))[0];return delete n.id,n}));return window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=void 0),{...t.operation,blocks:o}}}),update:ie({description:"Update a block, the new block will replace the existing block.",schema:{block:{$ref:"#/$defs/block"},$defs:{block:{type:"string",description:"markdown of block"}}},validateBlock:be,rebaseTool:ke,toJSONToolCall:async(e,t)=>{const o=(await e.tryParseMarkdownToBlocks(t.operation.block.trim()))[0];return delete o.id,window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=void 0),{...t.operation,block:o}}}),delete:ae};function Nt(e,t,o,r){const n={add:!0,update:!0,delete:!0,...o};return[...n.update?[te.update(e,{idsSuffixed:!0,withDelays:t,updateSelection:r})]:[],...n.add?[te.add(e,{idsSuffixed:!0,withDelays:t})]:[],...n.delete?[te.delete(e,{idsSuffixed:!0,withDelays:t})]:[]]}const jt={getStreamTools:Nt,defaultPromptBuilder:At,promptHelpers:{getDataForPromptNoSelection:Re,getDataForPromptWithSelection:$e}},Dt={addCursorPosition:Y,flattenBlocks:P,suffixIDs:A,trimEmptyBlocks:E,convertBlocks:x},qe={_experimental_json:_t,_experimental_markdown:jt,html:Le},Se=new q.PluginKey("blocknote-agent-cursor");function Rt(e){return new q.Plugin({key:Se,view:t=>({}),state:{init:()=>({selection:void 0}),apply:(t,o)=>{const r=t.getMeta("aiAgent");return r?{selection:r.selection}:{selection:void 0}}},props:{decorations:t=>{const{doc:o}=t,{selection:r}=Se.getState(t),n=[];if(!r)return z.DecorationSet.create(o,[]);n.push(z.Decoration.widget(r.head,()=>$t(e),{key:"agent-cursor",side:10}));const s=Math.min(r.anchor,r.head),a=Math.max(r.anchor,r.head);return n.push(z.Decoration.inline(s,a,Qe.defaultSelectionBuilder(e),{inclusiveEnd:!0,inclusiveStart:!1})),z.DecorationSet.create(o,n)}}})}const $t=e=>{const t=document.createElement("span");t.classList.add("bn-collaboration-cursor__base"),t.setAttribute("data-active","true");const o=document.createElement("span");o.setAttribute("contentedEditable","false"),o.classList.add("bn-collaboration-cursor__caret"),o.setAttribute("style",`background-color: ${e.color}`);const r=document.createElement("span");return r.classList.add("bn-collaboration-cursor__label"),r.setAttribute("style",`background-color: ${e.color}`),r.insertBefore(document.createTextNode(e.name),null),o.insertBefore(r,null),t.insertBefore(document.createTextNode("⁠"),null),t.insertBefore(o,null),t.insertBefore(document.createTextNode("⁠"),null),t},qt=new q.PluginKey("blocknote-ai-plugin");class ce extends T.BlockNoteExtension{constructor(o,r){super();U(this,"previousRequestOptions");U(this,"_store",de()(o=>({aiMenuState:"closed"})));U(this,"options");this.editor=o,this.options=de()(n=>({dataFormat:qe.html,stream:!0,...r})),this.addProsemirrorPlugin(new q.Plugin({key:qt,filterTransaction:n=>{var a;const s=this.store.getState().aiMenuState;return!(s!=="closed"&&s.status==="ai-writing"&&(a=n.getMeta(Ke.fixTablesKey))!=null&&a.fixTables)}})),this.addProsemirrorPlugin(D.suggestChanges()),this.addProsemirrorPlugin(Rt(r.agentCursor||{name:"AI",color:"#8bc6ff"}))}static key(){return"ai"}get store(){return this._store}openAIMenuAtBlock(o){this.editor.setForceSelectionVisible(!0),this.editor.isEditable=!1,this._store.setState({aiMenuState:{blockId:o,status:"user-input"}})}closeAIMenu(){this.previousRequestOptions=void 0,this._store.setState({aiMenuState:"closed",llmResponse:void 0}),this.editor.setForceSelectionVisible(!1),this.editor.isEditable=!0,this.editor.focus()}acceptChanges(){var r;const o=this.editor.prosemirrorState.doc;this.editor.exec((n,s)=>D.revertSuggestions(n,a=>{s==null||s(a.setMeta("addToHistory",!1))})),this.editor.exec((n,s)=>{const a=n.tr;a.replace(0,a.doc.content.size,new R.Slice(R.Fragment.from(o),0,0));const i=n.apply(a);return D.applySuggestions(i,c=>{s==null||s(a.replace(0,a.doc.content.size,new R.Slice(R.Fragment.from(c.doc),0,0)))})}),(r=this.editor.forkYDocPlugin)==null||r.merge({keepChanges:!0}),this.closeAIMenu()}rejectChanges(){var o;this.editor.exec((r,n)=>D.revertSuggestions(r,s=>{n==null||n(s.setMeta("addToHistory",!1))})),(o=this.editor.forkYDocPlugin)==null||o.merge({keepChanges:!1}),this.closeAIMenu()}async retry(){const o=this.store.getState().aiMenuState;if(o==="closed"||o.status!=="error"||!this.previousRequestOptions)throw new Error("retry() is only valid when a previous response failed");if(o.error instanceof j.APICallError||o.error instanceof j.RetryError)return this.callLLM(this.previousRequestOptions);{const r=o.error instanceof Error?o.error.message:String(o.error);return this.callLLM({userPrompt:`An error occured: ${r}
19
- Please retry the previous user request.`})}}setAIResponseStatus(o){const r=this.store.getState().aiMenuState;if(r!=="closed")if(o==="ai-writing"&&this.editor.setForceSelectionVisible(!1),typeof o=="object"){if(o.status!=="error")throw new T.UnreachableCaseError(o.status);this._store.setState({aiMenuState:{status:o.status,error:o.error,blockId:r.blockId}})}else this._store.setState({aiMenuState:{status:o,blockId:r.blockId}})}async callLLM(o){var n;this.setAIResponseStatus("thinking"),(n=this.editor.forkYDocPlugin)==null||n.fork();let r;try{const s={...this.options.getState(),...o,previousResponse:this.store.getState().llmResponse};this.previousRequestOptions=s,r=await Ee(this.editor,{...s,onStart:()=>{var a;this.setAIResponseStatus("ai-writing"),(a=o.onStart)==null||a.call(o)},onBlockUpdate:a=>{var i;this._store.setState({aiMenuState:{blockId:a,status:"ai-writing"}}),(i=o.onBlockUpdate)==null||i.call(o,a)}}),this._store.setState({llmResponse:r}),await r.execute(),this.setAIResponseStatus("user-reviewing")}catch(s){this.setAIResponseStatus({status:"error",error:s}),console.warn("Error calling LLM",s)}return r}}function Ht(e){return t=>new ce(t,e)}function I(e){return e.extension(ce)}const Ut=(e,t)=>async(o,r)=>{const n=new Request(o,r),s=new Request(`${e}?provider=${encodeURIComponent(t)}&url=${encodeURIComponent(n.url)}`,{headers:n.headers,body:(r==null?void 0:r.body)||n.body,method:n.method,duplex:"half"});try{return await fetch(s)}catch(a){throw new TypeError("fetch failed",{cause:a})}};function zt(e){return{getProviderSettings:t=>({apiKey:e.apiKey,fetch:Ut(e.baseURL,t)})}}var He={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},we=L.default.createContext&&L.default.createContext(He),Ft=["attr","size","title"];function Jt(e,t){if(e==null)return{};var o=Vt(e,t),r,n;if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Vt(e,t){if(e==null)return{};var o={};for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)){if(t.indexOf(r)>=0)continue;o[r]=e[r]}return o}function Z(){return Z=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var r in o)Object.prototype.hasOwnProperty.call(o,r)&&(e[r]=o[r])}return e},Z.apply(this,arguments)}function Te(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),o.push.apply(o,r)}return o}function W(e){for(var t=1;t<arguments.length;t++){var o=arguments[t]!=null?arguments[t]:{};t%2?Te(Object(o),!0).forEach(function(r){Zt(e,r,o[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):Te(Object(o)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(o,r))})}return e}function Zt(e,t,o){return t=Wt(t),t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function Wt(e){var t=Yt(e,"string");return typeof t=="symbol"?t:t+""}function Yt(e,t){if(typeof e!="object"||!e)return e;var o=e[Symbol.toPrimitive];if(o!==void 0){var r=o.call(e,t);if(typeof r!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function Ue(e){return e&&e.map((t,o)=>L.default.createElement(t.tag,W({key:o},t.attr),Ue(t.child)))}function O(e){return t=>L.default.createElement(Gt,Z({attr:W({},e.attr)},t),Ue(e.child))}function Gt(e){var t=o=>{var{attr:r,size:n,title:s}=e,a=Jt(e,Ft),i=n||o.size||"1em",c;return o.className&&(c=o.className),e.className&&(c=(c?c+" ":"")+e.className),L.default.createElement("svg",Z({stroke:"currentColor",fill:"currentColor",strokeWidth:"0"},o.attr,r,a,{className:c,style:W(W({color:e.color||o.color},o.style),e.style),height:i,width:i,xmlns:"http://www.w3.org/2000/svg"}),s&&L.default.createElement("title",null,s),e.children)};return we!==void 0?L.default.createElement(we.Consumer,null,o=>t(o)):t(He)}function ze(e){return O({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M8 7V11L2 6L8 1V5H13C17.4183 5 21 8.58172 21 13C21 17.4183 17.4183 21 13 21H4V19H13C16.3137 19 19 16.3137 19 13C19 9.68629 16.3137 7 13 7H8Z"},child:[]}]})(e)}function ve(e){return O({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M17.8492 11.6983L17.1421 10.9912L7.24264 20.8907H3V16.648L14.3137 5.33432L19.9706 10.9912C20.3611 11.3817 20.3611 12.0149 19.9706 12.4054L12.8995 19.4765L11.4853 18.0622L17.8492 11.6983ZM15.7279 9.57696L14.3137 8.16274L5 17.4765V18.8907H6.41421L15.7279 9.57696ZM18.5563 2.50589L21.3848 5.33432C21.7753 5.72484 21.7753 6.35801 21.3848 6.74853L19.9706 8.16274L15.7279 3.9201L17.1421 2.50589C17.5327 2.11537 18.1658 2.11537 18.5563 2.50589Z"},child:[]}]})(e)}function Kt(e){return O({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M15.1986 9.94447C14.7649 9.5337 14.4859 8.98613 14.4085 8.39384L14.0056 5.31138L11.275 6.79724C10.7503 7.08274 10.1433 7.17888 9.55608 7.06948L6.49998 6.50015L7.06931 9.55625C7.17871 10.1435 7.08257 10.7505 6.79707 11.2751L5.31121 14.0057L8.39367 14.4086C8.98596 14.4861 9.53353 14.7651 9.94431 15.1987L12.0821 17.4557L13.4178 14.6486C13.6745 14.1092 14.109 13.6747 14.6484 13.418L17.4555 12.0823L15.1986 9.94447ZM15.2238 15.5079L13.0111 20.1581C12.8687 20.4573 12.5107 20.5844 12.2115 20.442C12.1448 20.4103 12.0845 20.3665 12.0337 20.3129L8.49229 16.5741C8.39749 16.474 8.27113 16.4096 8.13445 16.3918L3.02816 15.7243C2.69958 15.6814 2.46804 15.3802 2.51099 15.0516C2.52056 14.9784 2.54359 14.9075 2.5789 14.8426L5.04031 10.3192C5.1062 10.1981 5.12839 10.058 5.10314 9.92253L4.16 4.85991C4.09931 4.53414 4.3142 4.22086 4.63997 4.16017C4.7126 4.14664 4.78711 4.14664 4.85974 4.16017L9.92237 5.10331C10.0579 5.12855 10.198 5.10637 10.319 5.04048L14.8424 2.57907C15.1335 2.42068 15.4979 2.52825 15.6562 2.81931C15.6916 2.88421 15.7146 2.95507 15.7241 3.02833L16.3916 8.13462C16.4095 8.2713 16.4739 8.39766 16.5739 8.49245L20.3127 12.0338C20.5533 12.2617 20.5636 12.6415 20.3357 12.8821C20.2849 12.9357 20.2246 12.9795 20.1579 13.0112L15.5078 15.224C15.3833 15.2832 15.283 15.3835 15.2238 15.5079ZM16.0206 17.435L17.4348 16.0208L21.6775 20.2634L20.2633 21.6776L16.0206 17.435Z"},child:[]}]})(e)}function Xt(e){return O({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M8.00008 6V9H5.00008V6H8.00008ZM3.00008 4V11H10.0001V4H3.00008ZM13.0001 4H21.0001V6H13.0001V4ZM13.0001 11H21.0001V13H13.0001V11ZM13.0001 18H21.0001V20H13.0001V18ZM10.7072 16.2071L9.29297 14.7929L6.00008 18.0858L4.20718 16.2929L2.79297 17.7071L6.00008 20.9142L10.7072 16.2071Z"},child:[]}]})(e)}function Qt(e){return O({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M15 18H16.5C17.8807 18 19 16.8807 19 15.5C19 14.1193 17.8807 13 16.5 13H3V11H16.5C18.9853 11 21 13.0147 21 15.5C21 17.9853 18.9853 20 16.5 20H15V22L11 19L15 16V18ZM3 4H21V6H3V4ZM9 18V20H3V18H9Z"},child:[]}]})(e)}function eo(e){return O({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M13 6V21H11V6H5V4H19V6H13Z"},child:[]}]})(e)}function to(e){return O({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M6.23509 6.45329C4.85101 7.89148 4 9.84636 4 12C4 16.4183 7.58172 20 12 20C13.0808 20 14.1116 19.7857 15.0521 19.3972C15.1671 18.6467 14.9148 17.9266 14.8116 17.6746C14.582 17.115 13.8241 16.1582 12.5589 14.8308C12.2212 14.4758 12.2429 14.2035 12.3636 13.3943L12.3775 13.3029C12.4595 12.7486 12.5971 12.4209 14.4622 12.1248C15.4097 11.9746 15.6589 12.3533 16.0043 12.8777C16.0425 12.9358 16.0807 12.9928 16.1198 13.0499C16.4479 13.5297 16.691 13.6394 17.0582 13.8064C17.2227 13.881 17.428 13.9751 17.7031 14.1314C18.3551 14.504 18.3551 14.9247 18.3551 15.8472V15.9518C18.3551 16.3434 18.3168 16.6872 18.2566 16.9859C19.3478 15.6185 20 13.8854 20 12C20 8.70089 18.003 5.8682 15.1519 4.64482C14.5987 5.01813 13.8398 5.54726 13.575 5.91C13.4396 6.09538 13.2482 7.04166 12.6257 7.11976C12.4626 7.14023 12.2438 7.12589 12.012 7.11097C11.3905 7.07058 10.5402 7.01606 10.268 7.75495C10.0952 8.2232 10.0648 9.49445 10.6239 10.1543C10.7134 10.2597 10.7307 10.4547 10.6699 10.6735C10.59 10.9608 10.4286 11.1356 10.3783 11.1717C10.2819 11.1163 10.0896 10.8931 9.95938 10.7412C9.64554 10.3765 9.25405 9.92233 8.74797 9.78176C8.56395 9.73083 8.36166 9.68867 8.16548 9.64736C7.6164 9.53227 6.99443 9.40134 6.84992 9.09302C6.74442 8.8672 6.74488 8.55621 6.74529 8.22764C6.74529 7.8112 6.74529 7.34029 6.54129 6.88256C6.46246 6.70541 6.35689 6.56446 6.23509 6.45329ZM12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22Z"},child:[]}]})(e)}function oo(e){return O({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M9.9997 15.1709L19.1921 5.97852L20.6063 7.39273L9.9997 17.9993L3.63574 11.6354L5.04996 10.2212L9.9997 15.1709Z"},child:[]}]})(e)}function ro(e){return O({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M9.9997 15.1709L19.1921 5.97852L20.6063 7.39273L9.9997 17.9993L3.63574 11.6354L5.04996 10.2212L9.9997 15.1709Z"},child:[]}]})(e)}function no(e){return O({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M12 4C9.4095 4 7.10606 5.23053 5.64274 7.14274L8 9.5H2V3.5L4.21863 5.71863C6.05061 3.452 8.85558 2 12 2 17.5228 2 22 6.47715 22 12H20C20 7.58172 16.4183 4 12 4ZM4 12C4 16.4183 7.58172 20 12 20 14.5905 20 16.894 18.7695 18.3573 16.8573L16 14.5 22 14.5V20.5L19.7814 18.2814C17.9494 20.548 15.1444 22 12 22 6.47715 22 2 17.5228 2 12H4Z"},child:[]}]})(e)}function le(e){return O({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M17.0007 1.20825 18.3195 3.68108 20.7923 4.99992 18.3195 6.31876 17.0007 8.79159 15.6818 6.31876 13.209 4.99992 15.6818 3.68108 17.0007 1.20825ZM8.00065 4.33325 10.6673 9.33325 15.6673 11.9999 10.6673 14.6666 8.00065 19.6666 5.33398 14.6666.333984 11.9999 5.33398 9.33325 8.00065 4.33325ZM19.6673 16.3333 18.0007 13.2083 16.334 16.3333 13.209 17.9999 16.334 19.6666 18.0007 22.7916 19.6673 19.6666 22.7923 17.9999 19.6673 16.3333Z"},child:[]}]})(e)}function N(e){if(!e.dictionary.ai)throw new Error("AI dictionary not found");return e.dictionary.ai}function Fe(){const e=B.useBlockNoteContext();return N(e.editor)}const Je=e=>{const t=B.useComponentsContext(),{onManualPromptSubmit:o,promptText:r,onPromptTextChange:n}=e,[s,a]=v.useState(""),i=r||s,c=v.useCallback(async d=>{d.key==="Enter"&&o(i)},[i,o]),u=v.useCallback(d=>{const S=d.currentTarget.value;n&&n(S),r===void 0&&a(S)},[n,a,r]),m=v.useMemo(()=>T.filterSuggestionItems(e.items,i),[i,e.items]),{selectedIndex:l,setSelectedIndex:f,handler:p}=B.useSuggestionMenuKeyboardHandler(m,d=>d.onItemClick()),h=v.useCallback(d=>{d.key==="Enter"?m.length>0?p(d):c(d):p(d)},[c,p,m.length]);return v.useEffect(()=>{f(0)},[i,f]),y.jsxs("div",{className:"bn-combobox",children:[y.jsx(t.Generic.Form.Root,{children:y.jsx(t.Generic.Form.TextInput,{className:"bn-combobox-input",name:"ai-prompt",variant:"large",icon:e.icon,value:i||"",autoFocus:!0,placeholder:e.placeholder,disabled:e.disabled,onKeyDown:h,onChange:u,autoComplete:"off",rightSection:e.rightSection},"input-"+e.disabled)}),y.jsx(t.SuggestionMenu.Root,{className:"bn-combobox-items",id:"ai-suggestion-menu",children:m.map((d,S)=>y.jsx(t.SuggestionMenu.Item,{className:T.mergeCSSClasses("bn-suggestion-menu-item",d.size==="small"?"bn-suggestion-menu-item-small":""),id:`bn-suggestion-menu-item-${S}`,isSelected:S===l,onClick:d.onItemClick,item:d},d.title))})]})};function so(e){const t=N(e),o=I(e);return[{key:"continue_writing",title:t.ai_default_commands.continue_writing.title,aliases:t.ai_default_commands.continue_writing.aliases,icon:y.jsx(ve,{size:18}),onItemClick:async()=>{await o.callLLM({userPrompt:"Continue writing at the current cursor position related to the previous text. Add multiple blocks if needed. If the document looks like a template / draft, follow the template. Be extensive if needed.",defaultStreamTools:{add:!0,delete:!1,update:!1}})},size:"small"},{key:"summarize",title:t.ai_default_commands.summarize.title,aliases:t.ai_default_commands.summarize.aliases,icon:y.jsx(Qt,{size:18}),onItemClick:async()=>{await o.callLLM({userPrompt:"Summarize",defaultStreamTools:{add:!0,delete:!1,update:!1}})},size:"small"},{key:"action_items",title:t.ai_default_commands.add_action_items.title,aliases:t.ai_default_commands.add_action_items.aliases,icon:y.jsx(Xt,{size:18}),onItemClick:async()=>{await o.callLLM({userPrompt:"Add action items",defaultStreamTools:{add:!0,delete:!1,update:!1}})},size:"small"},{key:"write_anything",title:t.ai_default_commands.write_anything.title,aliases:t.ai_default_commands.write_anything.aliases,icon:y.jsx(ve,{size:18}),onItemClick:r=>{r(t.ai_default_commands.write_anything.prompt_placeholder)},size:"small"}]}function io(e){const t=N(e),o=I(e);return[{key:"improve_writing",title:t.ai_default_commands.improve_writing.title,aliases:t.ai_default_commands.improve_writing.aliases,icon:y.jsx(eo,{size:18}),onItemClick:async()=>{await o.callLLM({useSelection:!0,userPrompt:"Improve writing",defaultStreamTools:{add:!1,delete:!1,update:!0}})},size:"small"},{key:"fix_spelling",title:t.ai_default_commands.fix_spelling.title,aliases:t.ai_default_commands.fix_spelling.aliases,icon:y.jsx(ro,{size:18}),onItemClick:async()=>{await o.callLLM({useSelection:!0,userPrompt:"Fix spelling",defaultStreamTools:{add:!1,delete:!1,update:!0}})},size:"small"},{key:"translate",title:t.ai_default_commands.translate.title,aliases:t.ai_default_commands.translate.aliases,icon:y.jsx(to,{size:18}),onItemClick:r=>{r(t.ai_default_commands.translate.prompt_placeholder)},size:"small"},{key:"simplify",title:t.ai_default_commands.simplify.title,aliases:t.ai_default_commands.simplify.aliases,icon:y.jsx(Kt,{size:18}),onItemClick:async()=>{await o.callLLM({useSelection:!0,userPrompt:"Simplify",defaultStreamTools:{add:!1,delete:!1,update:!0}})},size:"small"}]}function ao(e){const t=N(e),o=I(e);return[{key:"accept",title:t.ai_menu.actions.accept.title,aliases:t.ai_menu.actions.accept.aliases,icon:y.jsx(oo,{size:18}),onItemClick:()=>{o.acceptChanges()},size:"small"},{key:"revert",title:t.ai_menu.actions.revert.title,aliases:t.ai_menu.actions.revert.aliases,icon:y.jsx(ze,{size:18}),onItemClick:()=>{o.rejectChanges()},size:"small"}]}function co(e){const t=N(e),o=I(e);return[{key:"retry",title:t.ai_menu.actions.retry.title,aliases:t.ai_menu.actions.retry.aliases,icon:y.jsx(no,{size:18}),onItemClick:async()=>{await o.retry()},size:"small"},{key:"cancel",title:t.ai_menu.actions.cancel.title,aliases:t.ai_menu.actions.cancel.aliases,icon:y.jsx(ze,{size:18}),onItemClick:()=>{o.rejectChanges()},size:"small"}]}function Ve(e,t){return t==="user-input"?e.getSelection()?io(e):so(e):t==="user-reviewing"?ao(e):t==="error"?co(e):[]}const Ze=e=>{const t=B.useBlockNoteEditor(),[o,r]=v.useState(""),n=Fe(),s=B.useComponentsContext(),a=I(t),i=Ce.useStore(a.store,p=>p.aiMenuState!=="closed"?p.aiMenuState.status:"closed"),{items:c}=e,u=v.useMemo(()=>{let p=[];return c?p=c(t,i):p=Ve(t,i),p.map(h=>({...h,onItemClick:()=>{h.onItemClick(r)}}))},[c,i,t]),m=v.useCallback(async p=>{await a.callLLM({userPrompt:p,useSelection:t.getSelection()!==void 0})},[a,t]);v.useEffect(()=>{(i==="user-reviewing"||i==="error")&&r("")},[i]);const l=v.useMemo(()=>i==="thinking"?n.ai_menu.status.thinking:i==="ai-writing"?n.ai_menu.status.editing:i==="error"?n.ai_menu.status.error:n.ai_menu.input_placeholder,[i,n]),f=v.useMemo(()=>{if(i==="thinking"||i==="ai-writing")return y.jsx(s.SuggestionMenu.Loader,{className:"bn-suggestion-menu-loader bn-combobox-right-section"});if(i==="error")return y.jsx("div",{className:"bn-combobox-right-section bn-combobox-error",children:y.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",height:"1em",viewBox:"0 -960 960 960",width:"1em",fill:"currentColor",children:y.jsx("path",{d:"M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm0-160q17 0 28.5-11.5T520-480v-160q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640v160q0 17 11.5 28.5T480-440Zm0 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"})})})},[s,i]);return y.jsx(Je,{onManualPromptSubmit:e.onManualPromptSubmit||m,items:u,promptText:o,onPromptTextChange:r,placeholder:l,disabled:i==="thinking"||i==="ai-writing",icon:y.jsx("div",{className:"bn-combobox-icon",children:y.jsx(le,{})}),rightSection:f})},We=e=>{const t=e.blockID?document.querySelector(`[data-id="${e.blockID}"]`):void 0,o=v.useMemo(()=>t?{getBoundingClientRect:()=>t.getBoundingClientRect(),contextElement:t}:null,[t]),{isMounted:r,ref:n,style:s,getFloatingProps:a,isPositioned:i}=B.useUIElementPositioning(!!t,o,3e3,{canDismiss:{enabled:!0,escapeKey:!0,outsidePress:e.canDismissViaOutsidePress},placement:"bottom",middleware:[X.offset(10),X.size({apply({rects:c,elements:u}){Object.assign(u.floating.style,{width:`${c.reference.width}px`})}})],onOpenChange:e.onOpenChange,whileElementsMounted:(c,u,m)=>X.autoUpdate(c,u,m,{animationFrame:!0}),...e.floatingOptions});return r?y.jsx("div",{ref:n,style:{...s},...a(),children:i&&e.children}):null},lo=e=>{const t=B.useBlockNoteEditor(),o=I(t),r=Ce.useStore(o.store,a=>a.aiMenuState),n=r==="closed"?void 0:r.blockId,s=e.aiMenu||Ze;return y.jsx(We,{canDismissViaOutsidePress:r==="closed"||r.status==="user-input",blockID:n,onOpenChange:a=>{a||r==="closed"||(r.status==="user-input"?o.closeAIMenu():(r.status==="user-reviewing"||r.status==="error")&&o.rejectChanges())},children:y.jsx(s,{})})},uo=()=>{const e=Fe(),t=B.useComponentsContext(),o=B.useBlockNoteEditor(),r=I(o),n=()=>{o.formattingToolbar.closeMenu();const s=o.getSelection();if(!s)throw new Error("No selection");const a=s.blocks[s.blocks.length-1].id;r.openAIMenuAtBlock(a)};return o.isEditable?y.jsx(t.Generic.Toolbar.Button,{className:"bn-button",label:e.formatting_toolbar.ai.tooltip,mainTooltip:e.formatting_toolbar.ai.tooltip,icon:y.jsx(le,{}),onClick:n}):null},po={AI:le};function mo(e){const t=I(e);return[{key:"ai",onItemClick:()=>{const r=e.getTextCursorPosition();r.block.content&&Array.isArray(r.block.content)&&r.block.content.length===0&&r.prevBlock?t.openAIMenuAtBlock(r.prevBlock.id):t.openAIMenuAtBlock(r.block.id)},...N(e).slash_menu.ai,icon:y.jsx(po.AI,{})}]}exports.AIExtension=ce;exports.AIMenu=Ze;exports.AIMenuController=lo;exports.AIToolbarButton=uo;exports.BlockPositioner=We;exports.PromptSuggestionMenu=Je;exports.callLLM=Ee;exports.createAIExtension=Ht;exports.createBlockNoteAIClient=zt;exports.getAIDictionary=N;exports.getAIExtension=I;exports.getAISlashMenuItems=mo;exports.getDefaultAIMenuItems=Ve;exports.llmFormats=qe;exports.promptHelpers=Dt;
9
+ This is the initial document as an array of Markdown blocks (the cursor is BETWEEN two blocks as indicated by cursor: true):`},{type:"text",text:JSON.stringify(t.markdownBlocks)},{type:"text",text:'First, determine what part of the document the user is talking about. You SHOULD probably take cursor info into account if needed.\n EXAMPLE: if user says "below" (without pointing to a specific part of the document) he / she probably indicates the block(s) after the cursor. \n EXAMPLE: If you want to insert content AT the cursor position (UNLESS indicated otherwise by the user), \n then you need `referenceId` to point to the block before the cursor with position `after` (or block below and `before`).\n \n '+(t.isEmptyDocument?"Because the document is empty, first update the empty block before adding new blocks.":"Prefer updating existing blocks over removing and adding (but this also depends on the user's question).")}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}const Zt=async(e,t)=>{t.selection?Vt(e,t):Ft(e,t)};function Wt(e,t,o,r,n){if(typeof r=="boolean"){const i=r?e.getSelectionCutBlocks():void 0;r=i?{from:i._meta.startPos,to:i._meta.endPos}:void 0}const s=o??{add:!0,update:!0,delete:!0};return[...s.update?[F.update(e,{idsSuffixed:!0,withDelays:t,updateSelection:r,onBlockUpdate:n})]:[],...s.add?[F.add(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[],...s.delete?[F.delete(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[]]}const Yt={getStreamToolsProvider:(e={})=>({getStreamTools:(t,o,r)=>Wt(t,e.withDelays??!0,e.defaultStreamTools,o,r)}),tools:F,defaultPromptBuilder:Zt,defaultPromptInputDataBuilder:Rt,promptHelpers:{getDataForPromptNoSelection:ze,getDataForPromptWithSelection:Je}},M={_experimental_json:Jt,_experimental_markdown:Yt,html:Et},Gt={addCursorPosition:X,flattenBlocks:C,suffixIDs:j,trimEmptyBlocks:P,convertBlocks:B},Te=new U.PluginKey("blocknote-agent-cursor");function Kt(e){return new U.Plugin({key:Te,view:t=>({}),state:{init:()=>({selection:void 0}),apply:(t,o)=>{const r=t.getMeta("aiAgent");return r?{selection:r.selection}:{selection:void 0}}},props:{decorations:t=>{const{doc:o}=t,{selection:r}=Te.getState(t),n=[];if(!r)return J.DecorationSet.create(o,[]);n.push(J.Decoration.widget(r.head,()=>Xt(e),{key:"agent-cursor",side:10}));const s=Math.min(r.anchor,r.head),a=Math.max(r.anchor,r.head);return n.push(J.Decoration.inline(s,a,it.defaultSelectionBuilder(e),{inclusiveEnd:!0,inclusiveStart:!1})),J.DecorationSet.create(o,n)}}})}const Xt=e=>{const t=document.createElement("span");t.classList.add("bn-collaboration-cursor__base"),t.setAttribute("data-active","true");const o=document.createElement("span");o.setAttribute("contentedEditable","false"),o.classList.add("bn-collaboration-cursor__caret"),o.setAttribute("style",`background-color: ${e.color}`);const r=document.createElement("span");return r.classList.add("bn-collaboration-cursor__label"),r.setAttribute("style",`background-color: ${e.color}`),r.insertBefore(document.createTextNode(e.name),null),o.insertBefore(r,null),t.insertBefore(document.createTextNode("⁠"),null),t.insertBefore(o,null),t.insertBefore(document.createTextNode("⁠"),null),t},Qt=new U.PluginKey("blocknote-ai-plugin");class de extends k.BlockNoteExtension{constructor(o,r){super();q(this,"chatSession");q(this,"_store",fe()(o=>({aiMenuState:"closed"})));q(this,"options");this.editor=o,this.options=fe()(n=>({...r})),this.addProsemirrorPlugin(new U.Plugin({key:Qt,filterTransaction:n=>{var a;const s=this.store.getState().aiMenuState;return!(s!=="closed"&&s.status==="ai-writing"&&(a=n.getMeta(st.fixTablesKey))!=null&&a.fixTables)}})),this.addProsemirrorPlugin($.suggestChanges()),this.addProsemirrorPlugin(Kt(r.agentCursor||{name:"AI",color:"#8bc6ff"}))}static key(){return"ai"}get store(){return this._store}openAIMenuAtBlock(o){this.editor.setForceSelectionVisible(!0),this.editor.isEditable=!1,this._store.setState({aiMenuState:{blockId:o,status:"user-input"}})}closeAIMenu(){this._store.setState({aiMenuState:"closed"}),this.chatSession=void 0,this.editor.setForceSelectionVisible(!1),this.editor.isEditable=!0,this.editor.focus()}acceptChanges(){var r;const o=this.editor.prosemirrorState.doc;this.editor.exec((n,s)=>$.revertSuggestions(n,a=>{s==null||s(a.setMeta("addToHistory",!1))})),this.editor.exec((n,s)=>{const a=n.tr;a.replace(0,a.doc.content.size,new H.Slice(H.Fragment.from(o),0,0));const i=n.apply(a);return $.applySuggestions(i,l=>{s==null||s(a.replace(0,a.doc.content.size,new H.Slice(H.Fragment.from(l.doc),0,0)))})}),(r=this.editor.forkYDocPlugin)==null||r.merge({keepChanges:!0}),this.closeAIMenu()}rejectChanges(){var o;this.editor.exec((r,n)=>$.revertSuggestions(r,s=>{n==null||n(s.setMeta("addToHistory",!1))})),(o=this.editor.forkYDocPlugin)==null||o.merge({keepChanges:!1}),this.closeAIMenu()}async retry(){var r;const{aiMenuState:o}=this.store.getState();if(o==="closed"||o.status!=="error"||!this.chatSession)throw new Error("retry() is only valid when a previous response failed");return((r=this.chatSession)==null?void 0:r.chat.status)==="error"?this.invokeAI({...this.chatSession.previousRequestOptions,userPrompt:"An error occured in the previous request. Please retry to accomplish the last user prompt."}):this.invokeAI({...this.chatSession.previousRequestOptions,userPrompt:"An error occured while executing the previous tool call. Please retry to accomplish the last user prompt."})}setAIResponseStatus(o){const r=this.store.getState().aiMenuState;if(r!=="closed")if(o==="ai-writing"&&this.editor.setForceSelectionVisible(!1),typeof o=="object"){if(o.status!=="error")throw new k.UnreachableCaseError(o.status);this._store.setState({aiMenuState:{status:o.status,error:o.error,blockId:r.blockId}})}else this._store.setState({aiMenuState:{status:o,blockId:r.blockId}})}async callLLM(o){return this.invokeAI(o)}async invokeAI(o){var r,n;this.setAIResponseStatus("thinking"),(r=this.editor.forkYDocPlugin)==null||r.fork();try{this.chatSession?this.chatSession.previousRequestOptions=o:this.chatSession={previousRequestOptions:o,chat:new nt.Chat({sendAutomaticallyWhen:()=>!1,transport:o.transport||this.options.getState().transport})};const s=this.chatSession.chat;o={...this.options.getState(),...o};const i=o.aiRequestSender??Be(M.html.defaultPromptBuilder,M.html.defaultPromptInputDataBuilder),l=Ne({editor:this.editor,chat:s,userPrompt:o.userPrompt,useSelection:o.useSelection,deleteEmptyCursorBlock:o.deleteEmptyCursorBlock,streamToolsProvider:o.streamToolsProvider,onBlockUpdated:c=>{this._store.setState({aiMenuState:{blockId:c,status:"ai-writing"}})}});await Le({aiRequest:l,sender:i,chatRequestOptions:o.chatRequestOptions,onStart:()=>{this.setAIResponseStatus("ai-writing")}}),this.setAIResponseStatus("user-reviewing")}catch(s){this.setAIResponseStatus({status:"error",error:s}),console.warn("Error calling LLM",s,(n=this.chatSession)==null?void 0:n.chat.messages)}}}function eo(e){return t=>new de(t,e)}function A(e){return e.extension(de)}const to=e=>async(t,o)=>{const r=new Request(t,o),n=e(r.url),s=new Request(n,{headers:r.headers,body:(o==null?void 0:o.body)||r.body,method:r.method,duplex:"half"});return await fetch(s)};var Re={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},ve=L.default.createContext&&L.default.createContext(Re),oo=["attr","size","title"];function ro(e,t){if(e==null)return{};var o=no(e,t),r,n;if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function no(e,t){if(e==null)return{};var o={};for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)){if(t.indexOf(r)>=0)continue;o[r]=e[r]}return o}function G(){return G=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var r in o)Object.prototype.hasOwnProperty.call(o,r)&&(e[r]=o[r])}return e},G.apply(this,arguments)}function Pe(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),o.push.apply(o,r)}return o}function K(e){for(var t=1;t<arguments.length;t++){var o=arguments[t]!=null?arguments[t]:{};t%2?Pe(Object(o),!0).forEach(function(r){so(e,r,o[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):Pe(Object(o)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(o,r))})}return e}function so(e,t,o){return t=io(t),t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function io(e){var t=ao(e,"string");return typeof t=="symbol"?t:t+""}function ao(e,t){if(typeof e!="object"||!e)return e;var o=e[Symbol.toPrimitive];if(o!==void 0){var r=o.call(e,t);if(typeof r!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function Ve(e){return e&&e.map((t,o)=>L.default.createElement(t.tag,K({key:o},t.attr),Ve(t.child)))}function I(e){return t=>L.default.createElement(lo,G({attr:K({},e.attr)},t),Ve(e.child))}function lo(e){var t=o=>{var{attr:r,size:n,title:s}=e,a=ro(e,oo),i=n||o.size||"1em",l;return o.className&&(l=o.className),e.className&&(l=(l?l+" ":"")+e.className),L.default.createElement("svg",G({stroke:"currentColor",fill:"currentColor",strokeWidth:"0"},o.attr,r,a,{className:l,style:K(K({color:e.color||o.color},o.style),e.style),height:i,width:i,xmlns:"http://www.w3.org/2000/svg"}),s&&L.default.createElement("title",null,s),e.children)};return ve!==void 0?L.default.createElement(ve.Consumer,null,o=>t(o)):t(Re)}function Fe(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M8 7V11L2 6L8 1V5H13C17.4183 5 21 8.58172 21 13C21 17.4183 17.4183 21 13 21H4V19H13C16.3137 19 19 16.3137 19 13C19 9.68629 16.3137 7 13 7H8Z"},child:[]}]})(e)}function Ce(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M17.8492 11.6983L17.1421 10.9912L7.24264 20.8907H3V16.648L14.3137 5.33432L19.9706 10.9912C20.3611 11.3817 20.3611 12.0149 19.9706 12.4054L12.8995 19.4765L11.4853 18.0622L17.8492 11.6983ZM15.7279 9.57696L14.3137 8.16274L5 17.4765V18.8907H6.41421L15.7279 9.57696ZM18.5563 2.50589L21.3848 5.33432C21.7753 5.72484 21.7753 6.35801 21.3848 6.74853L19.9706 8.16274L15.7279 3.9201L17.1421 2.50589C17.5327 2.11537 18.1658 2.11537 18.5563 2.50589Z"},child:[]}]})(e)}function co(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M15.1986 9.94447C14.7649 9.5337 14.4859 8.98613 14.4085 8.39384L14.0056 5.31138L11.275 6.79724C10.7503 7.08274 10.1433 7.17888 9.55608 7.06948L6.49998 6.50015L7.06931 9.55625C7.17871 10.1435 7.08257 10.7505 6.79707 11.2751L5.31121 14.0057L8.39367 14.4086C8.98596 14.4861 9.53353 14.7651 9.94431 15.1987L12.0821 17.4557L13.4178 14.6486C13.6745 14.1092 14.109 13.6747 14.6484 13.418L17.4555 12.0823L15.1986 9.94447ZM15.2238 15.5079L13.0111 20.1581C12.8687 20.4573 12.5107 20.5844 12.2115 20.442C12.1448 20.4103 12.0845 20.3665 12.0337 20.3129L8.49229 16.5741C8.39749 16.474 8.27113 16.4096 8.13445 16.3918L3.02816 15.7243C2.69958 15.6814 2.46804 15.3802 2.51099 15.0516C2.52056 14.9784 2.54359 14.9075 2.5789 14.8426L5.04031 10.3192C5.1062 10.1981 5.12839 10.058 5.10314 9.92253L4.16 4.85991C4.09931 4.53414 4.3142 4.22086 4.63997 4.16017C4.7126 4.14664 4.78711 4.14664 4.85974 4.16017L9.92237 5.10331C10.0579 5.12855 10.198 5.10637 10.319 5.04048L14.8424 2.57907C15.1335 2.42068 15.4979 2.52825 15.6562 2.81931C15.6916 2.88421 15.7146 2.95507 15.7241 3.02833L16.3916 8.13462C16.4095 8.2713 16.4739 8.39766 16.5739 8.49245L20.3127 12.0338C20.5533 12.2617 20.5636 12.6415 20.3357 12.8821C20.2849 12.9357 20.2246 12.9795 20.1579 13.0112L15.5078 15.224C15.3833 15.2832 15.283 15.3835 15.2238 15.5079ZM16.0206 17.435L17.4348 16.0208L21.6775 20.2634L20.2633 21.6776L16.0206 17.435Z"},child:[]}]})(e)}function uo(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M8.00008 6V9H5.00008V6H8.00008ZM3.00008 4V11H10.0001V4H3.00008ZM13.0001 4H21.0001V6H13.0001V4ZM13.0001 11H21.0001V13H13.0001V11ZM13.0001 18H21.0001V20H13.0001V18ZM10.7072 16.2071L9.29297 14.7929L6.00008 18.0858L4.20718 16.2929L2.79297 17.7071L6.00008 20.9142L10.7072 16.2071Z"},child:[]}]})(e)}function po(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M15 18H16.5C17.8807 18 19 16.8807 19 15.5C19 14.1193 17.8807 13 16.5 13H3V11H16.5C18.9853 11 21 13.0147 21 15.5C21 17.9853 18.9853 20 16.5 20H15V22L11 19L15 16V18ZM3 4H21V6H3V4ZM9 18V20H3V18H9Z"},child:[]}]})(e)}function mo(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M13 6V21H11V6H5V4H19V6H13Z"},child:[]}]})(e)}function fo(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M6.23509 6.45329C4.85101 7.89148 4 9.84636 4 12C4 16.4183 7.58172 20 12 20C13.0808 20 14.1116 19.7857 15.0521 19.3972C15.1671 18.6467 14.9148 17.9266 14.8116 17.6746C14.582 17.115 13.8241 16.1582 12.5589 14.8308C12.2212 14.4758 12.2429 14.2035 12.3636 13.3943L12.3775 13.3029C12.4595 12.7486 12.5971 12.4209 14.4622 12.1248C15.4097 11.9746 15.6589 12.3533 16.0043 12.8777C16.0425 12.9358 16.0807 12.9928 16.1198 13.0499C16.4479 13.5297 16.691 13.6394 17.0582 13.8064C17.2227 13.881 17.428 13.9751 17.7031 14.1314C18.3551 14.504 18.3551 14.9247 18.3551 15.8472V15.9518C18.3551 16.3434 18.3168 16.6872 18.2566 16.9859C19.3478 15.6185 20 13.8854 20 12C20 8.70089 18.003 5.8682 15.1519 4.64482C14.5987 5.01813 13.8398 5.54726 13.575 5.91C13.4396 6.09538 13.2482 7.04166 12.6257 7.11976C12.4626 7.14023 12.2438 7.12589 12.012 7.11097C11.3905 7.07058 10.5402 7.01606 10.268 7.75495C10.0952 8.2232 10.0648 9.49445 10.6239 10.1543C10.7134 10.2597 10.7307 10.4547 10.6699 10.6735C10.59 10.9608 10.4286 11.1356 10.3783 11.1717C10.2819 11.1163 10.0896 10.8931 9.95938 10.7412C9.64554 10.3765 9.25405 9.92233 8.74797 9.78176C8.56395 9.73083 8.36166 9.68867 8.16548 9.64736C7.6164 9.53227 6.99443 9.40134 6.84992 9.09302C6.74442 8.8672 6.74488 8.55621 6.74529 8.22764C6.74529 7.8112 6.74529 7.34029 6.54129 6.88256C6.46246 6.70541 6.35689 6.56446 6.23509 6.45329ZM12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22Z"},child:[]}]})(e)}function ho(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M9.9997 15.1709L19.1921 5.97852L20.6063 7.39273L9.9997 17.9993L3.63574 11.6354L5.04996 10.2212L9.9997 15.1709Z"},child:[]}]})(e)}function yo(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M9.9997 15.1709L19.1921 5.97852L20.6063 7.39273L9.9997 17.9993L3.63574 11.6354L5.04996 10.2212L9.9997 15.1709Z"},child:[]}]})(e)}function go(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M12 4C9.4095 4 7.10606 5.23053 5.64274 7.14274L8 9.5H2V3.5L4.21863 5.71863C6.05061 3.452 8.85558 2 12 2 17.5228 2 22 6.47715 22 12H20C20 7.58172 16.4183 4 12 4ZM4 12C4 16.4183 7.58172 20 12 20 14.5905 20 16.894 18.7695 18.3573 16.8573L16 14.5 22 14.5V20.5L19.7814 18.2814C17.9494 20.548 15.1444 22 12 22 6.47715 22 2 17.5228 2 12H4Z"},child:[]}]})(e)}function pe(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M17.0007 1.20825 18.3195 3.68108 20.7923 4.99992 18.3195 6.31876 17.0007 8.79159 15.6818 6.31876 13.209 4.99992 15.6818 3.68108 17.0007 1.20825ZM8.00065 4.33325 10.6673 9.33325 15.6673 11.9999 10.6673 14.6666 8.00065 19.6666 5.33398 14.6666.333984 11.9999 5.33398 9.33325 8.00065 4.33325ZM19.6673 16.3333 18.0007 13.2083 16.334 16.3333 13.209 17.9999 16.334 19.6666 18.0007 22.7916 19.6673 19.6666 22.7923 17.9999 19.6673 16.3333Z"},child:[]}]})(e)}function D(e){if(!e.dictionary.ai)throw new Error("AI dictionary not found");return e.dictionary.ai}function Ze(){const e=_.useBlockNoteContext();return D(e.editor)}const We=e=>{const t=_.useComponentsContext(),{onManualPromptSubmit:o,promptText:r,onPromptTextChange:n}=e,[s,a]=w.useState(""),i=r||s,l=w.useCallback(async p=>{p.key==="Enter"&&o(i)},[i,o]),c=w.useCallback(p=>{const S=p.currentTarget.value;n&&n(S),r===void 0&&a(S)},[n,a,r]),d=w.useMemo(()=>k.filterSuggestionItems(e.items,i),[i,e.items]),{selectedIndex:f,setSelectedIndex:m,handler:u}=_.useSuggestionMenuKeyboardHandler(d,p=>p.onItemClick()),h=w.useCallback(p=>{p.key==="Enter"?d.length>0?u(p):l(p):u(p)},[l,u,d.length]);return w.useEffect(()=>{m(0)},[i,m]),y.jsxs("div",{className:"bn-combobox",children:[y.jsx(t.Generic.Form.Root,{children:y.jsx(t.Generic.Form.TextInput,{className:"bn-combobox-input",name:"ai-prompt",variant:"large",icon:e.icon,value:i||"",autoFocus:!0,placeholder:e.placeholder,disabled:e.disabled,onKeyDown:h,onChange:c,autoComplete:"off",rightSection:e.rightSection},"input-"+e.disabled)}),y.jsx(t.SuggestionMenu.Root,{className:"bn-combobox-items",id:"ai-suggestion-menu",children:d.map((p,S)=>y.jsx(t.SuggestionMenu.Item,{className:k.mergeCSSClasses("bn-suggestion-menu-item",p.size==="small"?"bn-suggestion-menu-item-small":""),id:`bn-suggestion-menu-item-${S}`,isSelected:S===f,onClick:p.onItemClick,item:p},p.title))})]})};function bo(e){const t=D(e),o=A(e);return[{key:"continue_writing",title:t.ai_default_commands.continue_writing.title,aliases:t.ai_default_commands.continue_writing.aliases,icon:y.jsx(Ce,{size:18}),onItemClick:async()=>{await o.invokeAI({userPrompt:"Continue writing at the current cursor position related to the previous text. Add multiple blocks if needed. If the document looks like a template / draft, follow the template. Be extensive if needed.",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!0,delete:!1,update:!1}})})},size:"small"},{key:"summarize",title:t.ai_default_commands.summarize.title,aliases:t.ai_default_commands.summarize.aliases,icon:y.jsx(po,{size:18}),onItemClick:async()=>{await o.invokeAI({userPrompt:"Summarize",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!0,delete:!1,update:!1}})})},size:"small"},{key:"action_items",title:t.ai_default_commands.add_action_items.title,aliases:t.ai_default_commands.add_action_items.aliases,icon:y.jsx(uo,{size:18}),onItemClick:async()=>{await o.invokeAI({userPrompt:"Add action items",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!0,delete:!1,update:!1}})})},size:"small"},{key:"write_anything",title:t.ai_default_commands.write_anything.title,aliases:t.ai_default_commands.write_anything.aliases,icon:y.jsx(Ce,{size:18}),onItemClick:r=>{r(t.ai_default_commands.write_anything.prompt_placeholder)},size:"small"}]}function ko(e){const t=D(e),o=A(e);return[{key:"improve_writing",title:t.ai_default_commands.improve_writing.title,aliases:t.ai_default_commands.improve_writing.aliases,icon:y.jsx(mo,{size:18}),onItemClick:async()=>{await o.invokeAI({useSelection:!0,userPrompt:"Improve writing",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!1,delete:!1,update:!0}})})},size:"small"},{key:"fix_spelling",title:t.ai_default_commands.fix_spelling.title,aliases:t.ai_default_commands.fix_spelling.aliases,icon:y.jsx(yo,{size:18}),onItemClick:async()=>{await o.invokeAI({useSelection:!0,userPrompt:"Fix spelling",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!1,delete:!1,update:!0}})})},size:"small"},{key:"translate",title:t.ai_default_commands.translate.title,aliases:t.ai_default_commands.translate.aliases,icon:y.jsx(fo,{size:18}),onItemClick:r=>{r(t.ai_default_commands.translate.prompt_placeholder)},size:"small"},{key:"simplify",title:t.ai_default_commands.simplify.title,aliases:t.ai_default_commands.simplify.aliases,icon:y.jsx(co,{size:18}),onItemClick:async()=>{await o.invokeAI({useSelection:!0,userPrompt:"Simplify",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!1,delete:!1,update:!0}})})},size:"small"}]}function So(e){const t=D(e),o=A(e);return[{key:"accept",title:t.ai_menu.actions.accept.title,aliases:t.ai_menu.actions.accept.aliases,icon:y.jsx(ho,{size:18}),onItemClick:()=>{o.acceptChanges()},size:"small"},{key:"revert",title:t.ai_menu.actions.revert.title,aliases:t.ai_menu.actions.revert.aliases,icon:y.jsx(Fe,{size:18}),onItemClick:()=>{o.rejectChanges()},size:"small"}]}function wo(e){const t=D(e),o=A(e);return[{key:"retry",title:t.ai_menu.actions.retry.title,aliases:t.ai_menu.actions.retry.aliases,icon:y.jsx(go,{size:18}),onItemClick:async()=>{await o.retry()},size:"small"},{key:"cancel",title:t.ai_menu.actions.cancel.title,aliases:t.ai_menu.actions.cancel.aliases,icon:y.jsx(Fe,{size:18}),onItemClick:()=>{o.rejectChanges()},size:"small"}]}function Ye(e,t){return t==="user-input"?e.getSelection()?ko(e):bo(e):t==="user-reviewing"?So(e):t==="error"?wo(e):[]}const Ge=e=>{const t=_.useBlockNoteEditor(),[o,r]=w.useState(""),n=Ze(),s=_.useComponentsContext(),a=A(t),i=Ie.useStore(a.store,u=>u.aiMenuState!=="closed"?u.aiMenuState.status:"closed"),{items:l}=e,c=w.useMemo(()=>{let u=[];return l?u=l(t,i):u=Ye(t,i),u.map(h=>({...h,onItemClick:()=>{h.onItemClick(r)}}))},[l,i,t]),d=w.useCallback(async u=>{await a.invokeAI({userPrompt:u,useSelection:t.getSelection()!==void 0})},[a,t]);w.useEffect(()=>{(i==="user-reviewing"||i==="error")&&r("")},[i]);const f=w.useMemo(()=>i==="thinking"?n.ai_menu.status.thinking:i==="ai-writing"?n.ai_menu.status.editing:i==="error"?n.ai_menu.status.error:n.ai_menu.input_placeholder,[i,n]),m=w.useMemo(()=>{if(i==="thinking"||i==="ai-writing")return y.jsx(s.SuggestionMenu.Loader,{className:"bn-suggestion-menu-loader bn-combobox-right-section"});if(i==="error")return y.jsx("div",{className:"bn-combobox-right-section bn-combobox-error",children:y.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",height:"1em",viewBox:"0 -960 960 960",width:"1em",fill:"currentColor",children:y.jsx("path",{d:"M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm0-160q17 0 28.5-11.5T520-480v-160q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640v160q0 17 11.5 28.5T480-440Zm0 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"})})})},[s,i]);return y.jsx(We,{onManualPromptSubmit:e.onManualPromptSubmit||d,items:c,promptText:o,onPromptTextChange:r,placeholder:f,disabled:i==="thinking"||i==="ai-writing",icon:y.jsx("div",{className:"bn-combobox-icon",children:y.jsx(pe,{})}),rightSection:m})},Ke=e=>{const t=e.blockID?document.querySelector(`[data-id="${e.blockID}"]`):void 0,o=w.useMemo(()=>t?{getBoundingClientRect:()=>t.getBoundingClientRect(),contextElement:t}:null,[t]),{isMounted:r,ref:n,style:s,getFloatingProps:a,isPositioned:i}=_.useUIElementPositioning(!!t,o,3e3,{canDismiss:{enabled:!0,escapeKey:!0,outsidePress:e.canDismissViaOutsidePress},placement:"bottom",middleware:[te.offset(10),te.size({apply({rects:l,elements:c}){Object.assign(c.floating.style,{width:`${l.reference.width}px`})}})],onOpenChange:e.onOpenChange,whileElementsMounted:(l,c,d)=>te.autoUpdate(l,c,d,{animationFrame:!0}),...e.floatingOptions});return r?y.jsx("div",{ref:n,style:{...s},...a(),children:i&&e.children}):null},xo=e=>{const t=_.useBlockNoteEditor(),o=A(t),r=Ie.useStore(o.store,a=>a.aiMenuState),n=r==="closed"?void 0:r.blockId,s=e.aiMenu||Ge;return y.jsx(Ke,{canDismissViaOutsidePress:r==="closed"||r.status==="user-input",blockID:n,onOpenChange:a=>{a||r==="closed"||(r.status==="user-input"?o.closeAIMenu():(r.status==="user-reviewing"||r.status==="error")&&o.rejectChanges())},children:y.jsx(s,{})})},To=()=>{const e=Ze(),t=_.useComponentsContext(),o=_.useBlockNoteEditor(),r=A(o),n=()=>{o.formattingToolbar.closeMenu();const s=o.getSelection();if(!s)throw new Error("No selection");const a=s.blocks[s.blocks.length-1].id;r.openAIMenuAtBlock(a)};return o.isEditable?y.jsx(t.Generic.Toolbar.Button,{className:"bn-button",label:e.formatting_toolbar.ai.tooltip,mainTooltip:e.formatting_toolbar.ai.tooltip,icon:y.jsx(pe,{}),onClick:n}):null},vo={AI:pe};function Po(e){const t=A(e);return[{key:"ai",onItemClick:()=>{const r=e.getTextCursorPosition();r.block.content&&Array.isArray(r.block.content)&&r.block.content.length===0&&r.prevBlock?t.openAIMenuAtBlock(r.prevBlock.id):t.openAIMenuAtBlock(r.block.id)},...D(e).slash_menu.ai,icon:y.jsx(vo.AI,{})}]}function Xe(e){return Object.fromEntries(Object.entries(e).map(([t,o])=>[t,T.tool({...o,inputSchema:T.jsonSchema(o.inputSchema),outputSchema:T.jsonSchema(o.outputSchema)})]))}function Qe(e,t){let o="";return e.pipeThrough(new TransformStream({start(r){r.enqueue({type:"start"}),r.enqueue({type:"start-step"}),r.enqueue({type:"tool-input-start",toolCallId:"call_object_1",toolName:t})},transform(r,n){switch(r.type){case"text-delta":o+=r.textDelta,n.enqueue({type:"tool-input-delta",toolCallId:"call_object_1",inputTextDelta:r.textDelta});break;case"object":case"finish":break;case"error":n.enqueue({type:"error",errorText:re.getErrorMessage(r.error)});break;default:{const s=r;throw new Error(`Unsupported chunk type: ${s}`)}}},async flush(r){r.enqueue({type:"tool-input-available",toolCallId:"call_object_1",toolName:t,input:JSON.parse(o)}),r.enqueue({type:"finish-step"}),r.enqueue({type:"finish"})}}))}function et(e,t){return new ReadableStream({start(r){r.enqueue({type:"start"}),r.enqueue({type:"start-step"}),r.enqueue({type:"tool-input-start",toolCallId:"call_object_1",toolName:t}),r.enqueue({type:"tool-input-delta",toolCallId:"call_object_1",inputTextDelta:JSON.stringify(e)}),r.enqueue({type:"tool-input-available",toolCallId:"call_object_1",toolName:t,input:e}),r.enqueue({type:"finish-step"}),r.enqueue({type:"finish"}),r.close()}})}const tt={"mistral.chat":{mode:"auto"},"google.generative-ai":{mode:"auto"},"groq.chat":{providerOptions:{groq:{structuredOutputs:!1}}}};function oe(e){return tt[e.provider]||{}}class Co{constructor(t){this.opts=t}async generateObject(t,o){const{model:r,_additionalOptions:n}=this.opts;if(typeof r=="string")throw new Error("model must be a LanguageModelV2");const s=Object.keys(o)[0],a=o[s].inputSchema,i=await T.generateObject({output:"object",schema:a,model:r,mode:"tool",messages:T.convertToModelMessages(t),...oe(r),...n??{}});return et(i.object,s)}async streamObject(t,o){const{model:r,_additionalOptions:n}=this.opts;if(typeof r=="string")throw new Error("model must be a LanguageModelV2");const s=Object.keys(o)[0],a=o[s].inputSchema,i=T.streamObject({output:"object",schema:a,model:r,mode:"tool",messages:T.convertToModelMessages(t),...oe(r),...n??{}});return Qe(i.fullStream,s)}async streamText(t,o){const{model:r,_additionalOptions:n}=this.opts;return T.streamText({model:r,messages:T.convertToModelMessages(t),tools:o,toolChoice:"required",...n??{}}).toUIMessageStream()}async sendMessages({messages:t,body:o}){const r=this.opts.stream??!0,n=o.toolDefinitions,s=Xe(n);if(this.opts.objectGeneration)return r?this.streamObject(t,s):this.generateObject(t,s);if(r)return await this.streamText(t,s);throw new Error("Not implemented (generateText)")}reconnectToStream(){throw new Error("Not implemented")}}exports.AIExtension=de;exports.AIMenu=Ge;exports.AIMenuController=xo;exports.AIToolbarButton=To;exports.BlockPositioner=Ke;exports.ChunkExecutionError=ne;exports.ClientSideTransport=Co;exports.PROVIDER_OVERRIDES=tt;exports.PromptSuggestionMenu=We;exports.StreamToolExecutor=Ee;exports.aiDocumentFormats=M;exports.buildAIRequest=Ne;exports.createAIExtension=eo;exports.createStreamToolsArraySchema=Me;exports.defaultAIRequestSender=Be;exports.executeAIRequest=Le;exports.fetchViaProxy=to;exports.getAIDictionary=D;exports.getAIExtension=A;exports.getAISlashMenuItems=Po;exports.getDefaultAIMenuItems=Ye;exports.getProviderOverrides=oe;exports.objectAsToolCallInUIMessageStream=et;exports.objectStreamToOperationsResult=Ae;exports.partialObjectStreamAsToolCallInUIMessageStream=Qe;exports.promptHelpers=Gt;exports.toolDefinitionsToToolSet=Xe;
20
10
  //# sourceMappingURL=blocknote-xl-ai.cjs.map