writer 0.8.3rc4__py3-none-any.whl → 1.25.1rc1__py3-none-any.whl

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 (378) hide show
  1. writer/__init__.py +1 -1
  2. writer/abstract.py +1 -1
  3. writer/{ai.py → ai/__init__.py} +867 -163
  4. writer/app_runner.py +596 -241
  5. writer/app_templates/default/.wf/components-blueprints_blueprint-0-0decp3w5erhvl0nw.jsonl +11 -0
  6. writer/app_templates/default/.wf/components-blueprints_root.jsonl +1 -0
  7. writer/app_templates/default/.wf/components-page-0-c0f99a9e-5004-4e75-a6c6-36f17490b134.jsonl +27 -0
  8. writer/app_templates/default/.wf/components-root.jsonl +1 -0
  9. writer/app_templates/default/.wf/components-workflows_root.jsonl +1 -0
  10. writer/app_templates/default/.wf/components-workflows_workflow-0-lfltcky7l1fsm6j2.jsonl +1 -0
  11. writer/app_templates/default/.wf/metadata.json +3 -0
  12. writer/app_templates/default/README.md +3 -0
  13. writer/app_templates/default/main.py +16 -0
  14. writer/app_templates/default/requirements.txt +1 -0
  15. writer/app_templates/default/static/README.md +8 -0
  16. writer/app_templates/default/static/agent_builder_demo.png +0 -0
  17. writer/app_templates/default/static/favicon.png +0 -0
  18. writer/app_templates/hello/.wf/components-blueprints_blueprint-0-t84xyhxau9ej3823.jsonl +18 -0
  19. writer/app_templates/hello/.wf/components-blueprints_root.jsonl +1 -0
  20. writer/app_templates/hello/.wf/components-page-0-c0f99a9e-5004-4e75-a6c6-36f17490b134.jsonl +15 -0
  21. writer/app_templates/hello/.wf/components-root.jsonl +1 -0
  22. writer/app_templates/hello/.wf/metadata.json +3 -0
  23. writer/app_templates/hello/main.py +16 -0
  24. writer/app_templates/hello/static/README.md +8 -0
  25. writer/app_templates/hello/static/favicon.png +0 -0
  26. writer/app_templates/hello/static/welcome.svg +40 -0
  27. writer/auth.py +7 -2
  28. writer/autogen.py +352 -0
  29. writer/blocks/__init__.py +51 -17
  30. writer/blocks/addtostatelist.py +10 -9
  31. writer/blocks/apitrigger.py +45 -0
  32. writer/blocks/base_block.py +332 -21
  33. writer/blocks/base_trigger.py +14 -0
  34. writer/blocks/calleventhandler.py +39 -35
  35. writer/blocks/changepage.py +48 -0
  36. writer/blocks/code.py +102 -0
  37. writer/blocks/crontrigger.py +49 -0
  38. writer/blocks/foreach.py +70 -53
  39. writer/blocks/httprequest.py +112 -99
  40. writer/blocks/ifelse.py +71 -0
  41. writer/blocks/logmessage.py +34 -39
  42. writer/blocks/parsejson.py +30 -29
  43. writer/blocks/returnvalue.py +7 -7
  44. writer/blocks/runblueprint.py +63 -0
  45. writer/blocks/setstate.py +43 -33
  46. writer/blocks/sharedblueprint.py +86 -0
  47. writer/blocks/uieventtrigger.py +49 -0
  48. writer/blocks/writeraddchatmessage.py +50 -12
  49. writer/blocks/writeraddtokg.py +38 -11
  50. writer/blocks/writeraskkg.py +123 -0
  51. writer/blocks/writerchat.py +80 -61
  52. writer/blocks/writerchatreply.py +279 -0
  53. writer/blocks/writerchatreplywithtoolconfig.py +393 -0
  54. writer/blocks/writerclassification.py +78 -39
  55. writer/blocks/writercompletion.py +49 -44
  56. writer/blocks/writerfileapi.py +85 -0
  57. writer/blocks/writerinitchat.py +24 -12
  58. writer/blocks/writerkeyvaluestorage.py +106 -0
  59. writer/blocks/writernocodeapp.py +35 -37
  60. writer/blocks/writerparsepdf.py +73 -0
  61. writer/blocks/writerstructuredoutput.py +105 -0
  62. writer/blocks/writertoolcalling.py +251 -0
  63. writer/blocks/writervision.py +141 -0
  64. writer/blocks/writerwebsearch.py +175 -0
  65. writer/blueprints.py +839 -0
  66. writer/command_line.py +52 -16
  67. writer/core.py +562 -290
  68. writer/core_ui.py +6 -2
  69. writer/evaluator.py +98 -46
  70. writer/journal.py +227 -0
  71. writer/keyvalue_storage.py +93 -0
  72. writer/logs.py +277 -0
  73. writer/serve.py +625 -327
  74. writer/ss_types.py +101 -12
  75. writer/static/assets/Arrow.dom-GBJpMYQS.js +1 -0
  76. writer/static/assets/BaseMarkdown-Wrvby5J8.js +1 -0
  77. writer/static/assets/BlueprintToolbar-BuXNRxWT.js +1 -0
  78. writer/static/assets/BlueprintToolbar-wpfX0jo_.css +1 -0
  79. writer/static/assets/BuilderApp-PTOI76jZ.js +8 -0
  80. writer/static/assets/BuilderApp-WimUfNZr.css +1 -0
  81. writer/static/assets/BuilderApplicationSelect-DXzy4e_h.js +7 -0
  82. writer/static/assets/BuilderApplicationSelect-XaM1D5fv.css +1 -0
  83. writer/static/assets/BuilderBlueprintLibraryPanel-Ckrhknlh.css +1 -0
  84. writer/static/assets/BuilderBlueprintLibraryPanel-DBDzhTlc.js +1 -0
  85. writer/static/assets/BuilderEmbeddedCodeEditor-B0bcjlhk.css +1 -0
  86. writer/static/assets/BuilderEmbeddedCodeEditor-Dn7eDICN.js +726 -0
  87. writer/static/assets/BuilderGraphSelect-C-LRsO8W.js +7 -0
  88. writer/static/assets/BuilderGraphSelect-D7B61d5s.css +1 -0
  89. writer/static/assets/BuilderInsertionLabel-BhyL9wgn.js +1 -0
  90. writer/static/assets/BuilderInsertionLabel-_YS5WPfq.css +1 -0
  91. writer/static/assets/BuilderInsertionOverlay-D2XS0ij9.css +1 -0
  92. writer/static/assets/BuilderInsertionOverlay-MkAIVruY.js +1 -0
  93. writer/static/assets/BuilderJournal-A0LcEwGI.js +7 -0
  94. writer/static/assets/BuilderJournal-DHv3Pvvm.css +1 -0
  95. writer/static/assets/BuilderModelSelect-CdSo_sih.js +7 -0
  96. writer/static/assets/BuilderModelSelect-Dc4IPLp2.css +1 -0
  97. writer/static/assets/BuilderSettings-BDwZBveu.js +16 -0
  98. writer/static/assets/BuilderSettings-lZkOXEYw.css +1 -0
  99. writer/static/assets/BuilderSettingsArtifactAPITriggerDetails-3O6jKBXD.js +4 -0
  100. writer/static/assets/BuilderSettingsArtifactAPITriggerDetails-DnX66iRg.css +1 -0
  101. writer/static/assets/BuilderSettingsDeploySharedBlueprint-BR_3ptsd.js +1 -0
  102. writer/static/assets/BuilderSettingsDeploySharedBlueprint-KJTl8gxP.css +1 -0
  103. writer/static/assets/BuilderSettingsHandlers-CBtEQFSo.js +1 -0
  104. writer/static/assets/BuilderSettingsHandlers-DJPeASfz.css +1 -0
  105. writer/static/assets/BuilderSidebarComponentTree-DLltgas5.js +1 -0
  106. writer/static/assets/BuilderSidebarComponentTree-DYu1F793.css +1 -0
  107. writer/static/assets/BuilderSidebarToolkit-CApZNTAq.js +7 -0
  108. writer/static/assets/BuilderSidebarToolkit-CwqbjRv8.css +1 -0
  109. writer/static/assets/BuilderTemplateEditor-CYSDeWgV.css +1 -0
  110. writer/static/assets/BuilderTemplateEditor-DnRDRcA0.js +87 -0
  111. writer/static/assets/BuilderVault-2vGoV0sx.js +1 -0
  112. writer/static/assets/BuilderVault-Cx6oQSES.css +1 -0
  113. writer/static/assets/ComponentRenderer-72hqvEvI.css +1 -0
  114. writer/static/assets/ComponentRenderer-D4Pj1i3s.js +1 -0
  115. writer/static/assets/SharedCopyClipboardButton-BipJKGtz.css +1 -0
  116. writer/static/assets/SharedCopyClipboardButton-DNI9kLe6.js +1 -0
  117. writer/static/assets/WdsCheckbox-DKvpPA4D.css +1 -0
  118. writer/static/assets/WdsCheckbox-edQcn1cf.js +1 -0
  119. writer/static/assets/WdsDropdownMenu-CzzPN9Wg.css +1 -0
  120. writer/static/assets/WdsDropdownMenu-DQnrRBNV.js +1 -0
  121. writer/static/assets/WdsFieldWrapper-Cmufx5Nj.js +1 -0
  122. writer/static/assets/WdsFieldWrapper-CsemOh8D.css +1 -0
  123. writer/static/assets/WdsTabs-DKj7BqI0.css +1 -0
  124. writer/static/assets/WdsTabs-DcfY_zn5.js +1 -0
  125. writer/static/assets/abap-D8nrxEjS.js +6 -0
  126. writer/static/assets/apex-BrXDlLUW.js +6 -0
  127. writer/static/assets/art-paper-D70v1WMA.svg +180 -0
  128. writer/static/assets/azcli-CElzELwZ.js +6 -0
  129. writer/static/assets/bat-CUsyEhik.js +6 -0
  130. writer/static/assets/bicep-BtxyJn6H.js +7 -0
  131. writer/static/assets/cameligo-ClBCoF8h.js +6 -0
  132. writer/static/assets/clojure-B9TqLHAk.js +6 -0
  133. writer/static/assets/codicon-BA2IlpFX.ttf +0 -0
  134. writer/static/assets/coffee-DYsfeylR.js +6 -0
  135. writer/static/assets/cpp-VVGvvgir.js +6 -0
  136. writer/static/assets/csharp-Z6z2stHy.js +6 -0
  137. writer/static/assets/csp-DgZoLDI1.js +6 -0
  138. writer/static/assets/css-KqQ96-gC.js +8 -0
  139. writer/static/assets/css.worker-DvNUQFd1.js +84 -0
  140. writer/static/assets/cssMode-BYq4oZGq.js +9 -0
  141. writer/static/assets/cypher-CYoSlgTu.js +6 -0
  142. writer/static/assets/dart-BGDl7St1.js +6 -0
  143. writer/static/assets/dockerfile-CuCtxA7T.js +6 -0
  144. writer/static/assets/ecl-BCTFAUpS.js +6 -0
  145. writer/static/assets/editor.worker-BVwmgLrR.js +11 -0
  146. writer/static/assets/elixir-C7hRTYZ9.js +6 -0
  147. writer/static/assets/flow9-Bi_qi707.js +6 -0
  148. writer/static/assets/freemarker2-CnNourkO.js +8 -0
  149. writer/static/assets/fsharp-CxaaEKKi.js +6 -0
  150. writer/static/assets/go-DUImKuGY.js +6 -0
  151. writer/static/assets/graphql-D5sGVkLV.js +6 -0
  152. writer/static/assets/handlebars-Bm22yapJ.js +6 -0
  153. writer/static/assets/hcl-zD_CCkZ1.js +6 -0
  154. writer/static/assets/html-CAKAfoZF.js +6 -0
  155. writer/static/assets/html.worker-BJMlcbMU.js +458 -0
  156. writer/static/assets/htmlMode-BGZ97n-V.js +9 -0
  157. writer/static/assets/index-5u5REPT4.js +16 -0
  158. writer/static/assets/index-BKNuk68o.css +1 -0
  159. writer/static/assets/index-BQNXU3IR.js +17 -0
  160. writer/static/assets/index-BQr1pfrb.js +1 -0
  161. writer/static/assets/index-DHXAd5Yn.js +4 -0
  162. writer/static/assets/index-Zki-pfO-.js +8525 -0
  163. writer/static/assets/index.esm-B1ZQtduY.js +17 -0
  164. writer/static/assets/ini-8kKHd4ZL.js +6 -0
  165. writer/static/assets/java-De1axCfe.js +6 -0
  166. writer/static/assets/javascript-X1f02eyK.js +6 -0
  167. writer/static/assets/json.worker-BwvX8PuZ.js +42 -0
  168. writer/static/assets/jsonMode-hT0bNgT8.js +11 -0
  169. writer/static/assets/julia-D3ApGBxz.js +6 -0
  170. writer/static/assets/kotlin-GbSrCElU.js +6 -0
  171. writer/static/assets/less-DNUaDNdz.js +7 -0
  172. writer/static/assets/lexon-Bg9QKxBu.js +6 -0
  173. writer/static/assets/liquid-KmCCiJw2.js +6 -0
  174. writer/static/assets/lua-Crkvc3mc.js +6 -0
  175. writer/static/assets/m3-DsrzVyM1.js +6 -0
  176. writer/static/assets/mapbox-gl-C0cyFYYW.js +2329 -0
  177. writer/static/assets/markdown-CY5IOZuu.js +6 -0
  178. writer/static/assets/marked.esm-273vDTCT.js +45 -0
  179. writer/static/assets/mdx-DtRFauUw.js +6 -0
  180. writer/static/assets/mips-BE8RsGBA.js +6 -0
  181. writer/static/assets/msdax-N5ajIiFQ.js +6 -0
  182. writer/static/assets/mysql-DRxbB97D.js +6 -0
  183. writer/static/assets/objective-c-BHUZy23s.js +6 -0
  184. writer/static/assets/pascal-BemVzBTY.js +6 -0
  185. writer/static/assets/pascaligo-BACCcnx_.js +6 -0
  186. writer/static/assets/pdf-B6-yWJ-Y.js +12 -0
  187. writer/static/assets/pdf.worker.min-CyUfim15.mjs +21 -0
  188. writer/static/assets/perl-CuU66Ptk.js +6 -0
  189. writer/static/assets/pgsql-CQ6TMH2r.js +6 -0
  190. writer/static/assets/php-BvyzZa65.js +6 -0
  191. writer/static/assets/pla-DrIuu9u1.js +6 -0
  192. writer/static/assets/plotly.min-DutuuatZ.js +4030 -0
  193. writer/static/assets/poppins-latin-300-italic-4WBEAciR.woff +0 -0
  194. writer/static/assets/poppins-latin-300-italic-EWCPeN2Y.woff2 +0 -0
  195. writer/static/assets/poppins-latin-300-normal-DCNuMXUj.woff +0 -0
  196. writer/static/assets/poppins-latin-300-normal-Dku2WoCh.woff2 +0 -0
  197. writer/static/assets/poppins-latin-400-italic-B4GYq972.woff2 +0 -0
  198. writer/static/assets/poppins-latin-400-italic-BPejoDS-.woff +0 -0
  199. writer/static/assets/poppins-latin-400-normal-BOb3E3N0.woff +0 -0
  200. writer/static/assets/poppins-latin-400-normal-cpxAROuN.woff2 +0 -0
  201. writer/static/assets/poppins-latin-500-italic-Ce_qjtl5.woff +0 -0
  202. writer/static/assets/poppins-latin-500-italic-o28Otv0U.woff2 +0 -0
  203. writer/static/assets/poppins-latin-500-normal-C8OXljZJ.woff2 +0 -0
  204. writer/static/assets/poppins-latin-500-normal-DGXqpDMm.woff +0 -0
  205. writer/static/assets/poppins-latin-600-italic-BhOZippK.woff +0 -0
  206. writer/static/assets/poppins-latin-600-italic-CZ4wqKBi.woff2 +0 -0
  207. writer/static/assets/poppins-latin-600-normal-BJdTmd5m.woff +0 -0
  208. writer/static/assets/poppins-latin-600-normal-zEkxB9Mr.woff2 +0 -0
  209. writer/static/assets/poppins-latin-700-italic-CW91C-LJ.woff +0 -0
  210. writer/static/assets/poppins-latin-700-italic-RKf6esGj.woff2 +0 -0
  211. writer/static/assets/poppins-latin-700-normal-BVuQR_eA.woff +0 -0
  212. writer/static/assets/poppins-latin-700-normal-Qrb0O0WB.woff2 +0 -0
  213. writer/static/assets/poppins-latin-ext-300-italic-CBzyU4Pf.woff +0 -0
  214. writer/static/assets/poppins-latin-ext-300-italic-DdDvTq5-.woff2 +0 -0
  215. writer/static/assets/poppins-latin-ext-300-normal-7Zg2msWE.woff2 +0 -0
  216. writer/static/assets/poppins-latin-ext-300-normal-C9p7gvmA.woff +0 -0
  217. writer/static/assets/poppins-latin-ext-400-italic-BiCGV3eO.woff2 +0 -0
  218. writer/static/assets/poppins-latin-ext-400-italic-gsPYOGqV.woff +0 -0
  219. writer/static/assets/poppins-latin-ext-400-normal-CIpeJEZw.woff2 +0 -0
  220. writer/static/assets/poppins-latin-ext-400-normal-Ce_uWq1Z.woff +0 -0
  221. writer/static/assets/poppins-latin-ext-500-italic-CwrTHwbn.woff2 +0 -0
  222. writer/static/assets/poppins-latin-ext-500-italic-jdc8Bv4M.woff +0 -0
  223. writer/static/assets/poppins-latin-ext-500-normal-Bl1-S02S.woff +0 -0
  224. writer/static/assets/poppins-latin-ext-500-normal-H4Q0z8D2.woff2 +0 -0
  225. writer/static/assets/poppins-latin-ext-600-italic-BqeDa496.woff2 +0 -0
  226. writer/static/assets/poppins-latin-ext-600-italic-C7MQPb_A.woff +0 -0
  227. writer/static/assets/poppins-latin-ext-600-normal-Cn4C8475.woff2 +0 -0
  228. writer/static/assets/poppins-latin-ext-600-normal-DB6FJURc.woff +0 -0
  229. writer/static/assets/poppins-latin-ext-700-italic-BAdhB_WS.woff2 +0 -0
  230. writer/static/assets/poppins-latin-ext-700-italic-WKTwQMp8.woff +0 -0
  231. writer/static/assets/poppins-latin-ext-700-normal-CE2WFKmF.woff +0 -0
  232. writer/static/assets/poppins-latin-ext-700-normal-DDaViAzG.woff2 +0 -0
  233. writer/static/assets/postiats-BR_hrfni.js +6 -0
  234. writer/static/assets/powerquery-CKDUeRmd.js +6 -0
  235. writer/static/assets/powershell-Dsa4rhA_.js +6 -0
  236. writer/static/assets/protobuf-CGsvhooB.js +7 -0
  237. writer/static/assets/pug-D2p3uOX2.js +6 -0
  238. writer/static/assets/python-DVhxg746.js +6 -0
  239. writer/static/assets/qsharp-B7F3HtPF.js +6 -0
  240. writer/static/assets/r-3aLoi2fs.js +6 -0
  241. writer/static/assets/razor-DR5Ns_BC.js +6 -0
  242. writer/static/assets/redis-jqFeRM5s.js +6 -0
  243. writer/static/assets/redshift-BriwQgXR.js +6 -0
  244. writer/static/assets/restructuredtext-hbBFZ0w9.js +6 -0
  245. writer/static/assets/ruby-ByThyB2Q.js +6 -0
  246. writer/static/assets/rust-DIEZMp5R.js +6 -0
  247. writer/static/assets/sb-C6Gjjw_x.js +6 -0
  248. writer/static/assets/scala-DZNw3jJB.js +6 -0
  249. writer/static/assets/scheme-55eqh71t.js +6 -0
  250. writer/static/assets/scss-D-OVkc4F.js +8 -0
  251. writer/static/assets/serialization-DJC7NP0N.js +20 -0
  252. writer/static/assets/shell-DSpi8_qN.js +6 -0
  253. writer/static/assets/solidity-BHddiNFS.js +6 -0
  254. writer/static/assets/sophia-D6taVZFb.js +6 -0
  255. writer/static/assets/sparql-LA0C7mUc.js +6 -0
  256. writer/static/assets/sql-C3-3IcFM.js +6 -0
  257. writer/static/assets/st-C4g7059C.js +6 -0
  258. writer/static/assets/swift-DNI1vH3h.js +8 -0
  259. writer/static/assets/systemverilog-DL_FVbcQ.js +6 -0
  260. writer/static/assets/tcl-DVJXmIwd.js +6 -0
  261. writer/static/assets/ts.worker-CwG1rUES.js +37021 -0
  262. writer/static/assets/tsMode-BNUEZzir.js +16 -0
  263. writer/static/assets/twig-BVWDLtw5.js +6 -0
  264. writer/static/assets/typescript-CRVt7Hx0.js +6 -0
  265. writer/static/assets/useBlueprintRun-C00bCxh-.js +1 -0
  266. writer/static/assets/useKeyValueEditor-nDmI7cTJ.js +1 -0
  267. writer/static/assets/useListResources-DLkZhRSJ.js +1 -0
  268. writer/static/assets/vb-Btz91-7U.js +6 -0
  269. writer/static/assets/vega-embed.module-SNP5iNdJ.js +201 -0
  270. writer/static/assets/wgsl-D8V_buCG.js +303 -0
  271. writer/static/assets/xml-C_6-t1tb.js +6 -0
  272. writer/static/assets/yaml-DIw8G7jk.js +6 -0
  273. writer/static/components/annotatedtext.svg +4 -0
  274. writer/static/components/avatar.svg +4 -0
  275. writer/static/components/blueprints_addtostatelist.svg +4 -0
  276. writer/static/components/blueprints_apitrigger.svg +4 -0
  277. writer/static/components/blueprints_calleventhandler.svg +9 -0
  278. writer/static/components/blueprints_category_Logic.svg +4 -0
  279. writer/static/components/blueprints_category_Other.svg +4 -0
  280. writer/static/components/blueprints_category_Triggers.svg +4 -0
  281. writer/static/components/blueprints_category_Writer.svg +25 -0
  282. writer/static/components/blueprints_code.svg +9 -0
  283. writer/static/components/blueprints_crontrigger.svg +6 -0
  284. writer/static/components/blueprints_foreach.svg +4 -0
  285. writer/static/components/blueprints_httprequest.svg +11 -0
  286. writer/static/components/blueprints_logmessage.svg +11 -0
  287. writer/static/components/blueprints_parsejson.svg +4 -0
  288. writer/static/components/blueprints_returnvalue.svg +4 -0
  289. writer/static/components/blueprints_runblueprint.svg +4 -0
  290. writer/static/components/blueprints_setstate.svg +4 -0
  291. writer/static/components/blueprints_uieventtrigger.svg +4 -0
  292. writer/static/components/blueprints_writeraddchatmessage.svg +19 -0
  293. writer/static/components/blueprints_writeraddtokg.svg +19 -0
  294. writer/static/components/blueprints_writerchat.svg +11 -0
  295. writer/static/components/blueprints_writerchatreply.svg +19 -0
  296. writer/static/components/blueprints_writerclassification.svg +24 -0
  297. writer/static/components/blueprints_writercompletion.svg +14 -0
  298. writer/static/components/blueprints_writerinitchat.svg +11 -0
  299. writer/static/components/blueprints_writernocodeapp.svg +14 -0
  300. writer/static/components/button.svg +4 -0
  301. writer/static/components/category_Content.svg +4 -0
  302. writer/static/components/category_Embed.svg +4 -0
  303. writer/static/components/category_Input.svg +5 -0
  304. writer/static/components/category_Layout.svg +9 -0
  305. writer/static/components/category_Other.svg +4 -0
  306. writer/static/components/chatbot.svg +4 -0
  307. writer/static/components/checkboxinput.svg +4 -0
  308. writer/static/components/colorinput.svg +11 -0
  309. writer/static/components/column.svg +4 -0
  310. writer/static/components/columns.svg +4 -0
  311. writer/static/components/dataframe.svg +4 -0
  312. writer/static/components/dateinput.svg +4 -0
  313. writer/static/components/dropdowninput.svg +5 -0
  314. writer/static/components/fileinput.svg +4 -0
  315. writer/static/components/googlemaps.svg +4 -0
  316. writer/static/components/header.svg +4 -0
  317. writer/static/components/heading.svg +9 -0
  318. writer/static/components/horizontalstack.svg +4 -0
  319. writer/static/components/html.svg +9 -0
  320. writer/static/components/icon.svg +4 -0
  321. writer/static/components/iframe.svg +4 -0
  322. writer/static/components/image.svg +11 -0
  323. writer/static/components/jsonviewer.svg +4 -0
  324. writer/static/components/link.svg +12 -0
  325. writer/static/components/mapbox.svg +4 -0
  326. writer/static/components/message.svg +4 -0
  327. writer/static/components/metric.svg +4 -0
  328. writer/static/components/multiselectinput.svg +4 -0
  329. writer/static/components/numberinput.svg +4 -0
  330. writer/static/components/page.svg +50 -0
  331. writer/static/components/pagination.svg +4 -0
  332. writer/static/components/pdf.svg +4 -0
  333. writer/static/components/plotlygraph.svg +7 -0
  334. writer/static/components/progressbar.svg +5 -0
  335. writer/static/components/radioinput.svg +4 -0
  336. writer/static/components/rangeinput.svg +4 -0
  337. writer/static/components/ratinginput.svg +4 -0
  338. writer/static/components/repeater.svg +4 -0
  339. writer/static/components/reuse.svg +4 -0
  340. writer/static/components/section.svg +4 -0
  341. writer/static/components/selectinput.svg +5 -0
  342. writer/static/components/separator.svg +4 -0
  343. writer/static/components/sidebar.svg +4 -0
  344. writer/static/components/sliderinput.svg +4 -0
  345. writer/static/components/step.svg +4 -0
  346. writer/static/components/steps.svg +4 -0
  347. writer/static/components/switchinput.svg +4 -0
  348. writer/static/components/tab.svg +4 -0
  349. writer/static/components/tabs.svg +4 -0
  350. writer/static/components/tags.svg +11 -0
  351. writer/static/components/text.svg +4 -0
  352. writer/static/components/textareainput.svg +11 -0
  353. writer/static/components/textinput.svg +4 -0
  354. writer/static/components/timeinput.svg +4 -0
  355. writer/static/components/timer.svg +4 -0
  356. writer/static/components/vegalitechart.svg +7 -0
  357. writer/static/components/videoplayer.svg +11 -0
  358. writer/static/components/webcamcapture.svg +4 -0
  359. writer/static/favicon.png +0 -0
  360. writer/static/index.html +84 -0
  361. writer/static/status/cancelled.svg +5 -0
  362. writer/static/status/error.svg +5 -0
  363. writer/static/status/skipped.svg +4 -0
  364. writer/static/status/stopped.svg +4 -0
  365. writer/static/status/success.svg +4 -0
  366. writer/sync.py +431 -0
  367. writer/ui.py +2268 -0
  368. writer/vault.py +48 -0
  369. writer/wf_project.py +90 -66
  370. writer-1.25.1rc1.dist-info/METADATA +92 -0
  371. writer-1.25.1rc1.dist-info/RECORD +382 -0
  372. {writer-0.8.3rc4.dist-info → writer-1.25.1rc1.dist-info}/WHEEL +1 -1
  373. writer/blocks/runworkflow.py +0 -59
  374. writer/workflows.py +0 -183
  375. writer-0.8.3rc4.dist-info/METADATA +0 -117
  376. writer-0.8.3rc4.dist-info/RECORD +0 -44
  377. {writer-0.8.3rc4.dist-info → writer-1.25.1rc1.dist-info}/entry_points.txt +0 -0
  378. {writer-0.8.3rc4.dist-info → writer-1.25.1rc1.dist-info/licenses}/LICENSE.txt +0 -0
@@ -0,0 +1,49 @@
1
+ from writer.abstract import register_abstract_template
2
+ from writer.blocks.base_trigger import BlueprintTrigger
3
+ from writer.ss_types import AbstractTemplate
4
+
5
+
6
+ class CronTrigger(BlueprintTrigger):
7
+ @classmethod
8
+ def register(cls, type: str):
9
+ super(CronTrigger, cls).register(type)
10
+ register_abstract_template(
11
+ type,
12
+ AbstractTemplate(
13
+ baseType="blueprints_node",
14
+ writer={
15
+ "name": "Cron Trigger",
16
+ "description": "Triggers an event on a schedule based on a cron expression.",
17
+ "category": "Triggers",
18
+ "featureFlags": ["cron_trigger"],
19
+ "fields": {
20
+ "cronExpression": {
21
+ "name": "Cron Expression",
22
+ "type": "Text",
23
+ "desc": "The cron expression that defines the schedule (e.g., '0 * * * *' for every hour).",
24
+ },
25
+ "timezone": {
26
+ "name": "Timezone",
27
+ "type": "Text",
28
+ "desc": "The timezone for the cron schedule (e.g., 'UTC', 'America/New_York'). Defaults to UTC.",
29
+ "default": "UTC",
30
+ },
31
+ "defaultResult": {
32
+ "name": "Default result",
33
+ "type": "Code",
34
+ "desc": 'The result that is used when the blueprint is triggered from the "Run blueprint" button',
35
+ },
36
+ },
37
+ "outs": {
38
+ "trigger": {
39
+ "name": "Trigger",
40
+ "style": "success",
41
+ },
42
+ },
43
+ },
44
+ ),
45
+ )
46
+
47
+ def run(self):
48
+ super().run()
49
+ self.outcome = "trigger"
writer/blocks/foreach.py CHANGED
@@ -1,75 +1,92 @@
1
1
  from writer.abstract import register_abstract_template
2
- from writer.blocks.base_block import WorkflowBlock
2
+ from writer.blocks.base_block import BlueprintBlock
3
3
  from writer.ss_types import AbstractTemplate
4
4
 
5
5
 
6
- class ForEach(WorkflowBlock):
7
-
6
+ class ForEach(BlueprintBlock):
8
7
  @classmethod
9
8
  def register(cls, type: str):
10
9
  super(ForEach, cls).register(type)
11
- register_abstract_template(type, AbstractTemplate(
12
- baseType="workflows_node",
13
- writer={
14
- "name": "For-each loop",
15
- "description": "Executes a workflow repeatedly, based on the items provided.",
16
- "category": "Logic",
17
- "fields": {
18
- "workflowKey": {
19
- "name": "Workflow key",
20
- "desc": "The workflow which will be executed for each item.",
21
- "type": "Text",
22
- },
23
- "items": {
24
- "name": "Items",
25
- "desc": "The item value will be passed in the execution environment and will be available at @{payload.item}, its id at @{payload.itemId}.",
26
- "default": "{}",
27
- "init": '{ "fr": "France", "pl": "Poland" }',
28
- "type": "Object",
29
- "control": "Textarea"
30
- }
31
- },
32
- "outs": {
33
- "success": {
34
- "name": "Success",
35
- "description": "The workflow executed successfully.",
36
- "style": "success",
10
+ register_abstract_template(
11
+ type,
12
+ AbstractTemplate(
13
+ baseType="blueprints_node",
14
+ writer={
15
+ "name": "For-each loop",
16
+ "description": "Loops through each item in a list to run the same logic.",
17
+ "category": "Logic",
18
+ "fields": {
19
+ "items": {
20
+ "name": "Items",
21
+ "desc": "The item value will be passed in the execution environment. It will be available at @{item}, and its ID at @{itemId}. You can use either a list or a dictionary.",
22
+ "default": "[]",
23
+ "init": '["France", "Poland"]',
24
+ "type": "Object",
25
+ "control": "Textarea",
26
+ },
27
+ "prefix": {
28
+ "name": "Prefix",
29
+ "type": "Text",
30
+ "desc": "If set, the item will be available at @{prefix_item} and the item id at @{prefix_itemId}.",
31
+ },
37
32
  },
38
- "error": {
39
- "name": "Error",
40
- "description": "The workflow wasn't executed successfully.",
41
- "style": "error",
33
+ "outs": {
34
+ "loop": {
35
+ "name": "Loop",
36
+ "description": "Connect the branch that you'd like to loop on. The branch plugged in here will be executed once per item.",
37
+ "style": "dynamic",
38
+ },
39
+ "success": {
40
+ "name": "Success",
41
+ "description": "The branch referenced executed successfully for each item.",
42
+ "style": "success",
43
+ },
44
+ "error": {
45
+ "name": "Error",
46
+ "description": "The branch referenced has failed for at least one of the items.",
47
+ "style": "error",
48
+ },
42
49
  },
43
50
  },
44
- }
45
- ))
46
-
47
- def _run_workflow_for_item(self, workflow_key, base_execution_environment, item_id, item):
48
- expanded_execution_environment = base_execution_environment | {
49
- "payload": {
50
- "itemId": item_id,
51
- "item": item
52
- }
53
- }
54
- return self.runner.run_workflow_by_key(workflow_key, expanded_execution_environment)
51
+ ),
52
+ )
55
53
 
56
54
  def run(self):
57
55
  try:
58
- workflow_key = self._get_field("workflowKey")
59
56
  items = self._get_field("items", as_json=True)
57
+ prefix = str(self._get_field("prefix", as_json=False, default_field_value="")).strip()
58
+ if prefix:
59
+ prefix += "_"
60
60
  base_execution_environment = self.execution_environment
61
61
 
62
- std_items = items
63
- result = None
62
+ if not isinstance(items, (list, dict)):
63
+ raise ValueError("Items must be a list or dictionary.")
64
+
64
65
  if isinstance(items, list):
65
- std_items = enumerate(std_items, 0)
66
- result = [self._run_workflow_for_item(workflow_key, base_execution_environment, item_id, item) for item_id, item in std_items]
66
+ blueprint_environments = [
67
+ base_execution_environment | {f"{prefix}itemId": i, f"{prefix}item": item}
68
+ for i, item in enumerate(items)
69
+ ]
70
+
71
+ results = self.runner.run_branch_batch(
72
+ self.component.id, "loop", blueprint_environments
73
+ )
74
+ self.result = results # Return as a list
75
+
67
76
  elif isinstance(items, dict):
68
- std_items = items.items()
69
- result = {item_id:self._run_workflow_for_item(workflow_key, base_execution_environment, item_id, item) for item_id, item in std_items}
77
+ blueprint_environments = {
78
+ str(item_id): base_execution_environment
79
+ | {f"{prefix}itemId": str(item_id), f"{prefix}item": item}
80
+ for item_id, item in items.items()
81
+ }
82
+ results = self.runner.run_branch_batch(
83
+ self.component.id, "loop", list(blueprint_environments.values())
84
+ )
85
+ self.result = {
86
+ item_id: results[i] for i, item_id in enumerate(blueprint_environments.keys())
87
+ }
70
88
 
71
- self.result = result
72
89
  self.outcome = "success"
73
90
  except BaseException as e:
74
91
  self.outcome = "error"
75
- raise e
92
+ raise e
@@ -1,123 +1,136 @@
1
- import re
2
-
3
- import requests
1
+ import json
4
2
 
5
3
  from writer.abstract import register_abstract_template
6
- from writer.blocks.base_block import WorkflowBlock
4
+ from writer.blocks.base_block import BlueprintBlock
7
5
  from writer.ss_types import AbstractTemplate
8
6
 
9
7
 
10
- class HTTPRequest(WorkflowBlock):
11
-
12
- CONTROL_CHARS = re.compile(r"[\x00-\x1f\x7f]")
13
-
8
+ class HTTPRequest(BlueprintBlock):
14
9
  @classmethod
15
10
  def register(cls, type: str):
16
11
  super(HTTPRequest, cls).register(type)
17
- register_abstract_template(type, AbstractTemplate(
18
- baseType="workflows_node",
19
- writer={
20
- "name": "HTTP Request",
21
- "description": "Executes an HTTP request.",
22
- "category": "Other",
23
- "fields": {
24
- "method": {
25
- "name": "Method",
26
- "type": "Text",
27
- "options": {
28
- "GET": "GET",
29
- "POST": "POST",
30
- "PUT": "PUT",
31
- "PATCH": "PATCH",
32
- "DELETE": "DELETE"
12
+ register_abstract_template(
13
+ type,
14
+ AbstractTemplate(
15
+ baseType="blueprints_node",
16
+ writer={
17
+ "name": "HTTP request",
18
+ "description": "Sends an HTTP request to an API endpoint. Used to fetch or send data.",
19
+ "category": "Other",
20
+ "fields": {
21
+ "method": {
22
+ "name": "Method",
23
+ "type": "Text",
24
+ "options": {
25
+ "GET": "GET",
26
+ "POST": "POST",
27
+ "PUT": "PUT",
28
+ "PATCH": "PATCH",
29
+ "DELETE": "DELETE",
30
+ },
31
+ "validator": {
32
+ "type": "string",
33
+ "enum": ["GET", "POST", "PUT", "PATCH", "DELETE", ""],
34
+ },
33
35
  },
34
- "default": "GET",
35
- "validator": {
36
- "type": "string",
37
- "enum": ["GET", "POST", "PUT", "PATCH", "DELETE"],
38
- }
39
- },
40
- "url": {
41
- "name": "URL",
42
- "type": "Text",
43
- "validator": {
44
- "type": "string",
45
- "format": "uri",
46
- }
47
- },
48
- "headers": {
49
- "name": "Headers",
50
- "type": "Key-Value",
51
- "default": "{}",
52
- "validator": {
53
- "type": "object",
54
- "patternProperties": {
55
- "^.*$": {
56
- "type": ["string", "number", "boolean"],
36
+ "url": {
37
+ "name": "URL",
38
+ "type": "Text",
39
+ "control": "Textarea",
40
+ },
41
+ "headers": {
42
+ "name": "Headers",
43
+ "type": "Key-Value",
44
+ "default": "{}",
45
+ "validator": {
46
+ "type": "object",
47
+ "patternProperties": {
48
+ "^.*$": {
49
+ "type": ["string", "number", "boolean"],
50
+ },
57
51
  },
52
+ "additionalProperties": True,
58
53
  },
59
- "additionalProperties": True,
60
- }
61
- },
62
- "body": {
63
- "name": "Body",
64
- "type": "Text",
65
- "control": "Textarea"
66
- },
67
- },
68
- "outs": {
69
- "success": {
70
- "name": "Success",
71
- "description": "The request was successful.",
72
- "style": "success",
73
- },
74
- "responseError": {
75
- "name": "Response error",
76
- "description": "The connection was established successfully but an error response code was received or the response was invalid.",
77
- "style": "error",
54
+ },
55
+ "bodyType": {
56
+ "name": "Body type",
57
+ "type": "Text",
58
+ "description": "Specify whether to interpret the body as plain text or JSON.",
59
+ "options": {
60
+ "text": "Plain text",
61
+ "JSON": "JSON",
62
+ },
63
+ "default": "text",
64
+ },
65
+ "body": {"name": "Body", "type": "Text", "control": "Textarea"},
78
66
  },
79
- "connectionError": {
80
- "name": "Connection error",
81
- "description": "The connection couldn't be established.",
82
- "style": "error",
67
+ "outs": {
68
+ "success": {
69
+ "name": "Success",
70
+ "description": "The request was successful.",
71
+ "style": "success",
72
+ },
73
+ "responseError": {
74
+ "name": "Response error",
75
+ "description": "The connection was established successfully but an error response code was received or the response was invalid.",
76
+ "style": "error",
77
+ },
78
+ "connectionError": {
79
+ "name": "Connection error",
80
+ "description": "The connection couldn't be established.",
81
+ "style": "error",
82
+ },
83
83
  },
84
84
  },
85
- }
86
- ))
87
-
88
- def _clean_json_string(self, s: str) -> str:
89
-
90
- """ Remove control characters, which aren't tolerated by JSON loads() strict mode, from string."""
91
-
92
- return HTTPRequest.CONTROL_CHARS.sub("", s)
85
+ ),
86
+ )
93
87
 
94
88
  def run(self):
95
- import json
96
-
97
89
  try:
98
90
  method = self._get_field("method", False, "GET")
99
91
  url = self._get_field("url")
100
- headers = self._get_field("headers", True)
101
- body = self._clean_json_string(self._get_field("body"))
102
- req = requests.request(method, url, headers=headers, data=body)
103
-
104
- content_type = req.headers.get("Content-Type")
105
- is_json = content_type and "application/json" in content_type
106
-
107
- self.result = {
108
- "headers": dict(req.headers),
109
- "status_code": req.status_code,
110
- "body": req.json() if is_json else req.text
111
- }
112
- if req.ok:
113
- self.outcome = "success"
92
+ headers = self._get_field("headers", True, default_field_value="{}")
93
+ body_type = self._get_field("bodyType")
94
+ body = None
95
+ raw_body = None
96
+
97
+ if body_type == "JSON":
98
+ body = self._get_field("body", as_json=True)
99
+ raw_body = json.dumps(body)
100
+ headers.setdefault("Content-Type", "application/json")
114
101
  else:
115
- self.outcome = "responseError"
116
- raise RuntimeError("HTTP response with code " + str(req.status_code))
102
+ body = self._get_field("body", as_json=False)
103
+ raw_body = body
104
+
105
+ with self.acquire_httpx_client() as client:
106
+ res = client.request(method, url, headers=headers, content=raw_body, timeout=180)
107
+
108
+ content_type = res.headers.get("Content-Type", "")
109
+ is_response_json = "application/json" in content_type
110
+
111
+ self.result = {
112
+ "request": {
113
+ "url": str(res.request.url),
114
+ "headers": dict(res.request.headers),
115
+ "body": res.request.content.decode("utf-8", errors="replace"),
116
+ },
117
+ "headers": dict(res.headers),
118
+ "status_code": res.status_code,
119
+ "body": res.json() if is_response_json else res.text,
120
+ }
121
+
122
+ if res.is_success:
123
+ self.outcome = "success"
124
+ else:
125
+ self.outcome = "responseError"
126
+ raise RuntimeError(
127
+ f"HTTP response with code {res.status_code} and message {res.text}"
128
+ )
129
+
117
130
  except json.JSONDecodeError as e:
118
131
  self.outcome = "responseError"
119
132
  raise e
120
- except BaseException as e:
121
- if not self.outcome:
133
+ except Exception as e:
134
+ if self.outcome is None or self.outcome not in ("responseError",):
122
135
  self.outcome = "connectionError"
123
- raise e
136
+ raise e
@@ -0,0 +1,71 @@
1
+ import sys
2
+ import traceback
3
+
4
+ from writer.abstract import register_abstract_template
5
+ from writer.blocks.base_block import BlueprintBlock
6
+ from writer.ss_types import AbstractTemplate
7
+
8
+
9
+ class IfElseBlock(BlueprintBlock):
10
+ @classmethod
11
+ def register(cls, type: str):
12
+ super(IfElseBlock, cls).register(type)
13
+ register_abstract_template(
14
+ type,
15
+ AbstractTemplate(
16
+ baseType="blueprints_node",
17
+ writer={
18
+ "name": "If-Else",
19
+ "description": "Evaluate custom Python code and redirect to 'true' or 'false' branch. Useful for conditional logic.",
20
+ "category": "Logic",
21
+ "fields": {
22
+ "expression": {
23
+ "name": "Expression",
24
+ "type": "Eval",
25
+ "desc": "The expression to be evaluated. Must be a single expression (no statements).",
26
+ "init": 'state["counter"] > 10',
27
+ },
28
+ },
29
+ "outs": {
30
+ "true": {
31
+ "name": "True",
32
+ "description": "The event handler execution for True.",
33
+ "style": "success",
34
+ },
35
+ "false": {
36
+ "name": "False",
37
+ "description": "The event handler execution for False.",
38
+ "style": "success",
39
+ },
40
+ "error": {
41
+ "name": "Error",
42
+ "description": "The expression evaluation failed.",
43
+ "style": "error",
44
+ },
45
+ },
46
+ },
47
+ ),
48
+ )
49
+
50
+ def run(self):
51
+ expression = self._get_field("expression")
52
+
53
+ try:
54
+ writeruserapp = sys.modules.get("writeruserapp")
55
+ block_globals = {
56
+ **self.execution_environment,
57
+ **(writeruserapp.__dict__ if writeruserapp else {}),
58
+ "state": self.runner.session.session_state,
59
+ }
60
+ # Evaluate the expression and set the result
61
+ compiled_expr = compile(expression, "<expression>", mode="eval")
62
+ self.result = eval(compiled_expr, block_globals)
63
+
64
+ if self.result:
65
+ self.outcome = "true"
66
+ else:
67
+ self.outcome = "false"
68
+ except BaseException:
69
+ self.outcome = "error"
70
+ self.message = f"<pre>{traceback.format_exc()}</pre>"
71
+ raise
@@ -1,58 +1,53 @@
1
1
  from writer.abstract import register_abstract_template
2
- from writer.blocks.base_block import WorkflowBlock
2
+ from writer.blocks.base_block import BlueprintBlock
3
3
  from writer.ss_types import AbstractTemplate
4
4
 
5
5
 
6
- class LogMessage(WorkflowBlock):
7
-
6
+ class LogMessage(BlueprintBlock):
8
7
  @classmethod
9
8
  def register(cls, type: str):
10
9
  super(LogMessage, cls).register(type)
11
- register_abstract_template(type, AbstractTemplate(
12
- baseType="workflows_node",
13
- writer={
14
- "name": "Log message",
15
- "description": "Appends a message to the log.",
16
- "category": "Other",
17
- "fields": {
18
- "type": {
19
- "name": "Type",
20
- "type": "Text",
21
- "options": {
22
- "info": "Info",
23
- "error": "Error"
10
+ register_abstract_template(
11
+ type,
12
+ AbstractTemplate(
13
+ baseType="blueprints_node",
14
+ writer={
15
+ "name": "Log message",
16
+ "description": "Prints a message to the console for debugging or monitoring app flow.",
17
+ "category": "Other",
18
+ "fields": {
19
+ "type": {
20
+ "name": "Type",
21
+ "type": "Text",
22
+ "options": {"info": "Info", "error": "Error"},
23
+ "default": "info",
24
24
  },
25
- "default": "info"
26
- },
27
- "message": {
28
- "name": "Message",
29
- "type": "Text",
30
- "control": "Textarea"
31
- },
32
- },
33
- "outs": {
34
- "success": {
35
- "name": "Success",
36
- "description": "The request was successful.",
37
- "style": "success",
25
+ "message": {"name": "Message", "type": "Text", "control": "Textarea"},
38
26
  },
39
- "error": {
40
- "name": "Error",
41
- "description": "The workflow was executed successfully.",
42
- "style": "error",
27
+ "outs": {
28
+ "success": {
29
+ "name": "Success",
30
+ "description": "The message was logged successfully.",
31
+ "style": "success",
32
+ },
33
+ "error": {
34
+ "name": "Error",
35
+ "description": "There was an error logging the message.",
36
+ "style": "error",
37
+ },
43
38
  },
44
39
  },
45
- }
46
- ))
40
+ ),
41
+ )
47
42
 
48
43
  def run(self):
49
44
  try:
50
45
  type = self._get_field("type", False, "info")
51
- message = self._get_field("message", required=True)
46
+ message = str(self._get_field("message", required=True))
52
47
 
53
- self.runner.session.session_state.add_log_entry(type, "Workflows message", message)
54
- self.result = None
48
+ self.runner.session.session_state.add_log_entry(type, "Blueprints message", message)
49
+ self.result = message
55
50
  self.outcome = "success"
56
51
  except BaseException as e:
57
52
  self.outcome = "error"
58
- raise e
53
+ raise e