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.
- writer/__init__.py +1 -1
- writer/abstract.py +1 -1
- writer/{ai.py → ai/__init__.py} +867 -163
- writer/app_runner.py +596 -241
- writer/app_templates/default/.wf/components-blueprints_blueprint-0-0decp3w5erhvl0nw.jsonl +11 -0
- writer/app_templates/default/.wf/components-blueprints_root.jsonl +1 -0
- writer/app_templates/default/.wf/components-page-0-c0f99a9e-5004-4e75-a6c6-36f17490b134.jsonl +27 -0
- writer/app_templates/default/.wf/components-root.jsonl +1 -0
- writer/app_templates/default/.wf/components-workflows_root.jsonl +1 -0
- writer/app_templates/default/.wf/components-workflows_workflow-0-lfltcky7l1fsm6j2.jsonl +1 -0
- writer/app_templates/default/.wf/metadata.json +3 -0
- writer/app_templates/default/README.md +3 -0
- writer/app_templates/default/main.py +16 -0
- writer/app_templates/default/requirements.txt +1 -0
- writer/app_templates/default/static/README.md +8 -0
- writer/app_templates/default/static/agent_builder_demo.png +0 -0
- writer/app_templates/default/static/favicon.png +0 -0
- writer/app_templates/hello/.wf/components-blueprints_blueprint-0-t84xyhxau9ej3823.jsonl +18 -0
- writer/app_templates/hello/.wf/components-blueprints_root.jsonl +1 -0
- writer/app_templates/hello/.wf/components-page-0-c0f99a9e-5004-4e75-a6c6-36f17490b134.jsonl +15 -0
- writer/app_templates/hello/.wf/components-root.jsonl +1 -0
- writer/app_templates/hello/.wf/metadata.json +3 -0
- writer/app_templates/hello/main.py +16 -0
- writer/app_templates/hello/static/README.md +8 -0
- writer/app_templates/hello/static/favicon.png +0 -0
- writer/app_templates/hello/static/welcome.svg +40 -0
- writer/auth.py +7 -2
- writer/autogen.py +352 -0
- writer/blocks/__init__.py +51 -17
- writer/blocks/addtostatelist.py +10 -9
- writer/blocks/apitrigger.py +45 -0
- writer/blocks/base_block.py +332 -21
- writer/blocks/base_trigger.py +14 -0
- writer/blocks/calleventhandler.py +39 -35
- writer/blocks/changepage.py +48 -0
- writer/blocks/code.py +102 -0
- writer/blocks/crontrigger.py +49 -0
- writer/blocks/foreach.py +70 -53
- writer/blocks/httprequest.py +112 -99
- writer/blocks/ifelse.py +71 -0
- writer/blocks/logmessage.py +34 -39
- writer/blocks/parsejson.py +30 -29
- writer/blocks/returnvalue.py +7 -7
- writer/blocks/runblueprint.py +63 -0
- writer/blocks/setstate.py +43 -33
- writer/blocks/sharedblueprint.py +86 -0
- writer/blocks/uieventtrigger.py +49 -0
- writer/blocks/writeraddchatmessage.py +50 -12
- writer/blocks/writeraddtokg.py +38 -11
- writer/blocks/writeraskkg.py +123 -0
- writer/blocks/writerchat.py +80 -61
- writer/blocks/writerchatreply.py +279 -0
- writer/blocks/writerchatreplywithtoolconfig.py +393 -0
- writer/blocks/writerclassification.py +78 -39
- writer/blocks/writercompletion.py +49 -44
- writer/blocks/writerfileapi.py +85 -0
- writer/blocks/writerinitchat.py +24 -12
- writer/blocks/writerkeyvaluestorage.py +106 -0
- writer/blocks/writernocodeapp.py +35 -37
- writer/blocks/writerparsepdf.py +73 -0
- writer/blocks/writerstructuredoutput.py +105 -0
- writer/blocks/writertoolcalling.py +251 -0
- writer/blocks/writervision.py +141 -0
- writer/blocks/writerwebsearch.py +175 -0
- writer/blueprints.py +839 -0
- writer/command_line.py +52 -16
- writer/core.py +562 -290
- writer/core_ui.py +6 -2
- writer/evaluator.py +98 -46
- writer/journal.py +227 -0
- writer/keyvalue_storage.py +93 -0
- writer/logs.py +277 -0
- writer/serve.py +625 -327
- writer/ss_types.py +101 -12
- writer/static/assets/Arrow.dom-GBJpMYQS.js +1 -0
- writer/static/assets/BaseMarkdown-Wrvby5J8.js +1 -0
- writer/static/assets/BlueprintToolbar-BuXNRxWT.js +1 -0
- writer/static/assets/BlueprintToolbar-wpfX0jo_.css +1 -0
- writer/static/assets/BuilderApp-PTOI76jZ.js +8 -0
- writer/static/assets/BuilderApp-WimUfNZr.css +1 -0
- writer/static/assets/BuilderApplicationSelect-DXzy4e_h.js +7 -0
- writer/static/assets/BuilderApplicationSelect-XaM1D5fv.css +1 -0
- writer/static/assets/BuilderBlueprintLibraryPanel-Ckrhknlh.css +1 -0
- writer/static/assets/BuilderBlueprintLibraryPanel-DBDzhTlc.js +1 -0
- writer/static/assets/BuilderEmbeddedCodeEditor-B0bcjlhk.css +1 -0
- writer/static/assets/BuilderEmbeddedCodeEditor-Dn7eDICN.js +726 -0
- writer/static/assets/BuilderGraphSelect-C-LRsO8W.js +7 -0
- writer/static/assets/BuilderGraphSelect-D7B61d5s.css +1 -0
- writer/static/assets/BuilderInsertionLabel-BhyL9wgn.js +1 -0
- writer/static/assets/BuilderInsertionLabel-_YS5WPfq.css +1 -0
- writer/static/assets/BuilderInsertionOverlay-D2XS0ij9.css +1 -0
- writer/static/assets/BuilderInsertionOverlay-MkAIVruY.js +1 -0
- writer/static/assets/BuilderJournal-A0LcEwGI.js +7 -0
- writer/static/assets/BuilderJournal-DHv3Pvvm.css +1 -0
- writer/static/assets/BuilderModelSelect-CdSo_sih.js +7 -0
- writer/static/assets/BuilderModelSelect-Dc4IPLp2.css +1 -0
- writer/static/assets/BuilderSettings-BDwZBveu.js +16 -0
- writer/static/assets/BuilderSettings-lZkOXEYw.css +1 -0
- writer/static/assets/BuilderSettingsArtifactAPITriggerDetails-3O6jKBXD.js +4 -0
- writer/static/assets/BuilderSettingsArtifactAPITriggerDetails-DnX66iRg.css +1 -0
- writer/static/assets/BuilderSettingsDeploySharedBlueprint-BR_3ptsd.js +1 -0
- writer/static/assets/BuilderSettingsDeploySharedBlueprint-KJTl8gxP.css +1 -0
- writer/static/assets/BuilderSettingsHandlers-CBtEQFSo.js +1 -0
- writer/static/assets/BuilderSettingsHandlers-DJPeASfz.css +1 -0
- writer/static/assets/BuilderSidebarComponentTree-DLltgas5.js +1 -0
- writer/static/assets/BuilderSidebarComponentTree-DYu1F793.css +1 -0
- writer/static/assets/BuilderSidebarToolkit-CApZNTAq.js +7 -0
- writer/static/assets/BuilderSidebarToolkit-CwqbjRv8.css +1 -0
- writer/static/assets/BuilderTemplateEditor-CYSDeWgV.css +1 -0
- writer/static/assets/BuilderTemplateEditor-DnRDRcA0.js +87 -0
- writer/static/assets/BuilderVault-2vGoV0sx.js +1 -0
- writer/static/assets/BuilderVault-Cx6oQSES.css +1 -0
- writer/static/assets/ComponentRenderer-72hqvEvI.css +1 -0
- writer/static/assets/ComponentRenderer-D4Pj1i3s.js +1 -0
- writer/static/assets/SharedCopyClipboardButton-BipJKGtz.css +1 -0
- writer/static/assets/SharedCopyClipboardButton-DNI9kLe6.js +1 -0
- writer/static/assets/WdsCheckbox-DKvpPA4D.css +1 -0
- writer/static/assets/WdsCheckbox-edQcn1cf.js +1 -0
- writer/static/assets/WdsDropdownMenu-CzzPN9Wg.css +1 -0
- writer/static/assets/WdsDropdownMenu-DQnrRBNV.js +1 -0
- writer/static/assets/WdsFieldWrapper-Cmufx5Nj.js +1 -0
- writer/static/assets/WdsFieldWrapper-CsemOh8D.css +1 -0
- writer/static/assets/WdsTabs-DKj7BqI0.css +1 -0
- writer/static/assets/WdsTabs-DcfY_zn5.js +1 -0
- writer/static/assets/abap-D8nrxEjS.js +6 -0
- writer/static/assets/apex-BrXDlLUW.js +6 -0
- writer/static/assets/art-paper-D70v1WMA.svg +180 -0
- writer/static/assets/azcli-CElzELwZ.js +6 -0
- writer/static/assets/bat-CUsyEhik.js +6 -0
- writer/static/assets/bicep-BtxyJn6H.js +7 -0
- writer/static/assets/cameligo-ClBCoF8h.js +6 -0
- writer/static/assets/clojure-B9TqLHAk.js +6 -0
- writer/static/assets/codicon-BA2IlpFX.ttf +0 -0
- writer/static/assets/coffee-DYsfeylR.js +6 -0
- writer/static/assets/cpp-VVGvvgir.js +6 -0
- writer/static/assets/csharp-Z6z2stHy.js +6 -0
- writer/static/assets/csp-DgZoLDI1.js +6 -0
- writer/static/assets/css-KqQ96-gC.js +8 -0
- writer/static/assets/css.worker-DvNUQFd1.js +84 -0
- writer/static/assets/cssMode-BYq4oZGq.js +9 -0
- writer/static/assets/cypher-CYoSlgTu.js +6 -0
- writer/static/assets/dart-BGDl7St1.js +6 -0
- writer/static/assets/dockerfile-CuCtxA7T.js +6 -0
- writer/static/assets/ecl-BCTFAUpS.js +6 -0
- writer/static/assets/editor.worker-BVwmgLrR.js +11 -0
- writer/static/assets/elixir-C7hRTYZ9.js +6 -0
- writer/static/assets/flow9-Bi_qi707.js +6 -0
- writer/static/assets/freemarker2-CnNourkO.js +8 -0
- writer/static/assets/fsharp-CxaaEKKi.js +6 -0
- writer/static/assets/go-DUImKuGY.js +6 -0
- writer/static/assets/graphql-D5sGVkLV.js +6 -0
- writer/static/assets/handlebars-Bm22yapJ.js +6 -0
- writer/static/assets/hcl-zD_CCkZ1.js +6 -0
- writer/static/assets/html-CAKAfoZF.js +6 -0
- writer/static/assets/html.worker-BJMlcbMU.js +458 -0
- writer/static/assets/htmlMode-BGZ97n-V.js +9 -0
- writer/static/assets/index-5u5REPT4.js +16 -0
- writer/static/assets/index-BKNuk68o.css +1 -0
- writer/static/assets/index-BQNXU3IR.js +17 -0
- writer/static/assets/index-BQr1pfrb.js +1 -0
- writer/static/assets/index-DHXAd5Yn.js +4 -0
- writer/static/assets/index-Zki-pfO-.js +8525 -0
- writer/static/assets/index.esm-B1ZQtduY.js +17 -0
- writer/static/assets/ini-8kKHd4ZL.js +6 -0
- writer/static/assets/java-De1axCfe.js +6 -0
- writer/static/assets/javascript-X1f02eyK.js +6 -0
- writer/static/assets/json.worker-BwvX8PuZ.js +42 -0
- writer/static/assets/jsonMode-hT0bNgT8.js +11 -0
- writer/static/assets/julia-D3ApGBxz.js +6 -0
- writer/static/assets/kotlin-GbSrCElU.js +6 -0
- writer/static/assets/less-DNUaDNdz.js +7 -0
- writer/static/assets/lexon-Bg9QKxBu.js +6 -0
- writer/static/assets/liquid-KmCCiJw2.js +6 -0
- writer/static/assets/lua-Crkvc3mc.js +6 -0
- writer/static/assets/m3-DsrzVyM1.js +6 -0
- writer/static/assets/mapbox-gl-C0cyFYYW.js +2329 -0
- writer/static/assets/markdown-CY5IOZuu.js +6 -0
- writer/static/assets/marked.esm-273vDTCT.js +45 -0
- writer/static/assets/mdx-DtRFauUw.js +6 -0
- writer/static/assets/mips-BE8RsGBA.js +6 -0
- writer/static/assets/msdax-N5ajIiFQ.js +6 -0
- writer/static/assets/mysql-DRxbB97D.js +6 -0
- writer/static/assets/objective-c-BHUZy23s.js +6 -0
- writer/static/assets/pascal-BemVzBTY.js +6 -0
- writer/static/assets/pascaligo-BACCcnx_.js +6 -0
- writer/static/assets/pdf-B6-yWJ-Y.js +12 -0
- writer/static/assets/pdf.worker.min-CyUfim15.mjs +21 -0
- writer/static/assets/perl-CuU66Ptk.js +6 -0
- writer/static/assets/pgsql-CQ6TMH2r.js +6 -0
- writer/static/assets/php-BvyzZa65.js +6 -0
- writer/static/assets/pla-DrIuu9u1.js +6 -0
- writer/static/assets/plotly.min-DutuuatZ.js +4030 -0
- writer/static/assets/poppins-latin-300-italic-4WBEAciR.woff +0 -0
- writer/static/assets/poppins-latin-300-italic-EWCPeN2Y.woff2 +0 -0
- writer/static/assets/poppins-latin-300-normal-DCNuMXUj.woff +0 -0
- writer/static/assets/poppins-latin-300-normal-Dku2WoCh.woff2 +0 -0
- writer/static/assets/poppins-latin-400-italic-B4GYq972.woff2 +0 -0
- writer/static/assets/poppins-latin-400-italic-BPejoDS-.woff +0 -0
- writer/static/assets/poppins-latin-400-normal-BOb3E3N0.woff +0 -0
- writer/static/assets/poppins-latin-400-normal-cpxAROuN.woff2 +0 -0
- writer/static/assets/poppins-latin-500-italic-Ce_qjtl5.woff +0 -0
- writer/static/assets/poppins-latin-500-italic-o28Otv0U.woff2 +0 -0
- writer/static/assets/poppins-latin-500-normal-C8OXljZJ.woff2 +0 -0
- writer/static/assets/poppins-latin-500-normal-DGXqpDMm.woff +0 -0
- writer/static/assets/poppins-latin-600-italic-BhOZippK.woff +0 -0
- writer/static/assets/poppins-latin-600-italic-CZ4wqKBi.woff2 +0 -0
- writer/static/assets/poppins-latin-600-normal-BJdTmd5m.woff +0 -0
- writer/static/assets/poppins-latin-600-normal-zEkxB9Mr.woff2 +0 -0
- writer/static/assets/poppins-latin-700-italic-CW91C-LJ.woff +0 -0
- writer/static/assets/poppins-latin-700-italic-RKf6esGj.woff2 +0 -0
- writer/static/assets/poppins-latin-700-normal-BVuQR_eA.woff +0 -0
- writer/static/assets/poppins-latin-700-normal-Qrb0O0WB.woff2 +0 -0
- writer/static/assets/poppins-latin-ext-300-italic-CBzyU4Pf.woff +0 -0
- writer/static/assets/poppins-latin-ext-300-italic-DdDvTq5-.woff2 +0 -0
- writer/static/assets/poppins-latin-ext-300-normal-7Zg2msWE.woff2 +0 -0
- writer/static/assets/poppins-latin-ext-300-normal-C9p7gvmA.woff +0 -0
- writer/static/assets/poppins-latin-ext-400-italic-BiCGV3eO.woff2 +0 -0
- writer/static/assets/poppins-latin-ext-400-italic-gsPYOGqV.woff +0 -0
- writer/static/assets/poppins-latin-ext-400-normal-CIpeJEZw.woff2 +0 -0
- writer/static/assets/poppins-latin-ext-400-normal-Ce_uWq1Z.woff +0 -0
- writer/static/assets/poppins-latin-ext-500-italic-CwrTHwbn.woff2 +0 -0
- writer/static/assets/poppins-latin-ext-500-italic-jdc8Bv4M.woff +0 -0
- writer/static/assets/poppins-latin-ext-500-normal-Bl1-S02S.woff +0 -0
- writer/static/assets/poppins-latin-ext-500-normal-H4Q0z8D2.woff2 +0 -0
- writer/static/assets/poppins-latin-ext-600-italic-BqeDa496.woff2 +0 -0
- writer/static/assets/poppins-latin-ext-600-italic-C7MQPb_A.woff +0 -0
- writer/static/assets/poppins-latin-ext-600-normal-Cn4C8475.woff2 +0 -0
- writer/static/assets/poppins-latin-ext-600-normal-DB6FJURc.woff +0 -0
- writer/static/assets/poppins-latin-ext-700-italic-BAdhB_WS.woff2 +0 -0
- writer/static/assets/poppins-latin-ext-700-italic-WKTwQMp8.woff +0 -0
- writer/static/assets/poppins-latin-ext-700-normal-CE2WFKmF.woff +0 -0
- writer/static/assets/poppins-latin-ext-700-normal-DDaViAzG.woff2 +0 -0
- writer/static/assets/postiats-BR_hrfni.js +6 -0
- writer/static/assets/powerquery-CKDUeRmd.js +6 -0
- writer/static/assets/powershell-Dsa4rhA_.js +6 -0
- writer/static/assets/protobuf-CGsvhooB.js +7 -0
- writer/static/assets/pug-D2p3uOX2.js +6 -0
- writer/static/assets/python-DVhxg746.js +6 -0
- writer/static/assets/qsharp-B7F3HtPF.js +6 -0
- writer/static/assets/r-3aLoi2fs.js +6 -0
- writer/static/assets/razor-DR5Ns_BC.js +6 -0
- writer/static/assets/redis-jqFeRM5s.js +6 -0
- writer/static/assets/redshift-BriwQgXR.js +6 -0
- writer/static/assets/restructuredtext-hbBFZ0w9.js +6 -0
- writer/static/assets/ruby-ByThyB2Q.js +6 -0
- writer/static/assets/rust-DIEZMp5R.js +6 -0
- writer/static/assets/sb-C6Gjjw_x.js +6 -0
- writer/static/assets/scala-DZNw3jJB.js +6 -0
- writer/static/assets/scheme-55eqh71t.js +6 -0
- writer/static/assets/scss-D-OVkc4F.js +8 -0
- writer/static/assets/serialization-DJC7NP0N.js +20 -0
- writer/static/assets/shell-DSpi8_qN.js +6 -0
- writer/static/assets/solidity-BHddiNFS.js +6 -0
- writer/static/assets/sophia-D6taVZFb.js +6 -0
- writer/static/assets/sparql-LA0C7mUc.js +6 -0
- writer/static/assets/sql-C3-3IcFM.js +6 -0
- writer/static/assets/st-C4g7059C.js +6 -0
- writer/static/assets/swift-DNI1vH3h.js +8 -0
- writer/static/assets/systemverilog-DL_FVbcQ.js +6 -0
- writer/static/assets/tcl-DVJXmIwd.js +6 -0
- writer/static/assets/ts.worker-CwG1rUES.js +37021 -0
- writer/static/assets/tsMode-BNUEZzir.js +16 -0
- writer/static/assets/twig-BVWDLtw5.js +6 -0
- writer/static/assets/typescript-CRVt7Hx0.js +6 -0
- writer/static/assets/useBlueprintRun-C00bCxh-.js +1 -0
- writer/static/assets/useKeyValueEditor-nDmI7cTJ.js +1 -0
- writer/static/assets/useListResources-DLkZhRSJ.js +1 -0
- writer/static/assets/vb-Btz91-7U.js +6 -0
- writer/static/assets/vega-embed.module-SNP5iNdJ.js +201 -0
- writer/static/assets/wgsl-D8V_buCG.js +303 -0
- writer/static/assets/xml-C_6-t1tb.js +6 -0
- writer/static/assets/yaml-DIw8G7jk.js +6 -0
- writer/static/components/annotatedtext.svg +4 -0
- writer/static/components/avatar.svg +4 -0
- writer/static/components/blueprints_addtostatelist.svg +4 -0
- writer/static/components/blueprints_apitrigger.svg +4 -0
- writer/static/components/blueprints_calleventhandler.svg +9 -0
- writer/static/components/blueprints_category_Logic.svg +4 -0
- writer/static/components/blueprints_category_Other.svg +4 -0
- writer/static/components/blueprints_category_Triggers.svg +4 -0
- writer/static/components/blueprints_category_Writer.svg +25 -0
- writer/static/components/blueprints_code.svg +9 -0
- writer/static/components/blueprints_crontrigger.svg +6 -0
- writer/static/components/blueprints_foreach.svg +4 -0
- writer/static/components/blueprints_httprequest.svg +11 -0
- writer/static/components/blueprints_logmessage.svg +11 -0
- writer/static/components/blueprints_parsejson.svg +4 -0
- writer/static/components/blueprints_returnvalue.svg +4 -0
- writer/static/components/blueprints_runblueprint.svg +4 -0
- writer/static/components/blueprints_setstate.svg +4 -0
- writer/static/components/blueprints_uieventtrigger.svg +4 -0
- writer/static/components/blueprints_writeraddchatmessage.svg +19 -0
- writer/static/components/blueprints_writeraddtokg.svg +19 -0
- writer/static/components/blueprints_writerchat.svg +11 -0
- writer/static/components/blueprints_writerchatreply.svg +19 -0
- writer/static/components/blueprints_writerclassification.svg +24 -0
- writer/static/components/blueprints_writercompletion.svg +14 -0
- writer/static/components/blueprints_writerinitchat.svg +11 -0
- writer/static/components/blueprints_writernocodeapp.svg +14 -0
- writer/static/components/button.svg +4 -0
- writer/static/components/category_Content.svg +4 -0
- writer/static/components/category_Embed.svg +4 -0
- writer/static/components/category_Input.svg +5 -0
- writer/static/components/category_Layout.svg +9 -0
- writer/static/components/category_Other.svg +4 -0
- writer/static/components/chatbot.svg +4 -0
- writer/static/components/checkboxinput.svg +4 -0
- writer/static/components/colorinput.svg +11 -0
- writer/static/components/column.svg +4 -0
- writer/static/components/columns.svg +4 -0
- writer/static/components/dataframe.svg +4 -0
- writer/static/components/dateinput.svg +4 -0
- writer/static/components/dropdowninput.svg +5 -0
- writer/static/components/fileinput.svg +4 -0
- writer/static/components/googlemaps.svg +4 -0
- writer/static/components/header.svg +4 -0
- writer/static/components/heading.svg +9 -0
- writer/static/components/horizontalstack.svg +4 -0
- writer/static/components/html.svg +9 -0
- writer/static/components/icon.svg +4 -0
- writer/static/components/iframe.svg +4 -0
- writer/static/components/image.svg +11 -0
- writer/static/components/jsonviewer.svg +4 -0
- writer/static/components/link.svg +12 -0
- writer/static/components/mapbox.svg +4 -0
- writer/static/components/message.svg +4 -0
- writer/static/components/metric.svg +4 -0
- writer/static/components/multiselectinput.svg +4 -0
- writer/static/components/numberinput.svg +4 -0
- writer/static/components/page.svg +50 -0
- writer/static/components/pagination.svg +4 -0
- writer/static/components/pdf.svg +4 -0
- writer/static/components/plotlygraph.svg +7 -0
- writer/static/components/progressbar.svg +5 -0
- writer/static/components/radioinput.svg +4 -0
- writer/static/components/rangeinput.svg +4 -0
- writer/static/components/ratinginput.svg +4 -0
- writer/static/components/repeater.svg +4 -0
- writer/static/components/reuse.svg +4 -0
- writer/static/components/section.svg +4 -0
- writer/static/components/selectinput.svg +5 -0
- writer/static/components/separator.svg +4 -0
- writer/static/components/sidebar.svg +4 -0
- writer/static/components/sliderinput.svg +4 -0
- writer/static/components/step.svg +4 -0
- writer/static/components/steps.svg +4 -0
- writer/static/components/switchinput.svg +4 -0
- writer/static/components/tab.svg +4 -0
- writer/static/components/tabs.svg +4 -0
- writer/static/components/tags.svg +11 -0
- writer/static/components/text.svg +4 -0
- writer/static/components/textareainput.svg +11 -0
- writer/static/components/textinput.svg +4 -0
- writer/static/components/timeinput.svg +4 -0
- writer/static/components/timer.svg +4 -0
- writer/static/components/vegalitechart.svg +7 -0
- writer/static/components/videoplayer.svg +11 -0
- writer/static/components/webcamcapture.svg +4 -0
- writer/static/favicon.png +0 -0
- writer/static/index.html +84 -0
- writer/static/status/cancelled.svg +5 -0
- writer/static/status/error.svg +5 -0
- writer/static/status/skipped.svg +4 -0
- writer/static/status/stopped.svg +4 -0
- writer/static/status/success.svg +4 -0
- writer/sync.py +431 -0
- writer/ui.py +2268 -0
- writer/vault.py +48 -0
- writer/wf_project.py +90 -66
- writer-1.25.1rc1.dist-info/METADATA +92 -0
- writer-1.25.1rc1.dist-info/RECORD +382 -0
- {writer-0.8.3rc4.dist-info → writer-1.25.1rc1.dist-info}/WHEEL +1 -1
- writer/blocks/runworkflow.py +0 -59
- writer/workflows.py +0 -183
- writer-0.8.3rc4.dist-info/METADATA +0 -117
- writer-0.8.3rc4.dist-info/RECORD +0 -44
- {writer-0.8.3rc4.dist-info → writer-1.25.1rc1.dist-info}/entry_points.txt +0 -0
- {writer-0.8.3rc4.dist-info → writer-1.25.1rc1.dist-info/licenses}/LICENSE.txt +0 -0
writer/logs.py
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import io
|
|
2
|
+
import json
|
|
3
|
+
import logging
|
|
4
|
+
import logging.config
|
|
5
|
+
import os
|
|
6
|
+
from contextlib import contextmanager, redirect_stdout
|
|
7
|
+
from time import time
|
|
8
|
+
from typing import Any, Callable, Dict, List, Optional, Union
|
|
9
|
+
|
|
10
|
+
WRITER_LOG_LEVEL = os.getenv("WRITER_LOG_LEVEL", "INFO")
|
|
11
|
+
WRITER_LOG_FORMAT = os.getenv("WRITER_LOG_FORMAT", "text") # 'text' or 'json'
|
|
12
|
+
|
|
13
|
+
FAILOVER_ROUTING_KEY = "unset"
|
|
14
|
+
FAILOVER_BUFFER = "failover"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def get_routing_key(prefix: Optional[str] = None) -> str:
|
|
18
|
+
try:
|
|
19
|
+
from writer.blueprints import get_current_block
|
|
20
|
+
current_block = get_current_block()
|
|
21
|
+
except RuntimeError:
|
|
22
|
+
current_block = None
|
|
23
|
+
|
|
24
|
+
key = FAILOVER_ROUTING_KEY
|
|
25
|
+
if current_block is not None:
|
|
26
|
+
key = current_block.component.id
|
|
27
|
+
return f"{prefix}-{key}"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class RoutingMap():
|
|
31
|
+
"""
|
|
32
|
+
Maintains a map of routing keys to in-memory output buffers (io.StringIO).
|
|
33
|
+
Used for capturing logs or stdout output in different contexts.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(self) -> None:
|
|
37
|
+
# It's not expected that this will be used without context.
|
|
38
|
+
# But just in case a fail-over buffer is provided
|
|
39
|
+
self._buffer_map: Dict[str, io.StringIO] = {
|
|
40
|
+
FAILOVER_BUFFER: io.StringIO(),
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
def get_buffer(self, key: str) -> io.StringIO:
|
|
44
|
+
"""
|
|
45
|
+
Retrieve the buffer associated with a routing key.
|
|
46
|
+
|
|
47
|
+
If buffer for the key is not present uses a fail-over buffer
|
|
48
|
+
"""
|
|
49
|
+
return self._buffer_map.get(key, self._buffer_map[FAILOVER_BUFFER])
|
|
50
|
+
|
|
51
|
+
def add_buffer(self, key: str) -> io.StringIO:
|
|
52
|
+
"""
|
|
53
|
+
Add a new buffer with the given key.
|
|
54
|
+
"""
|
|
55
|
+
buffer = io.StringIO()
|
|
56
|
+
self._buffer_map[key] = buffer
|
|
57
|
+
return buffer
|
|
58
|
+
|
|
59
|
+
def remove_buffer(self, key: str) -> None:
|
|
60
|
+
"""
|
|
61
|
+
Remove the buffer associated with the specified key.
|
|
62
|
+
"""
|
|
63
|
+
self._buffer_map.pop(key, None)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
routing_map = RoutingMap()
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class RoutingStream(io.StringIO):
|
|
70
|
+
"""
|
|
71
|
+
Custom stream that re-routes stdout to the correct io.StringIO buffer
|
|
72
|
+
based on the current context routing key.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
def write(self, s: str) -> int:
|
|
76
|
+
if s.strip():
|
|
77
|
+
logging.getLogger("stdout").info(s)
|
|
78
|
+
routing_key = get_routing_key(prefix="stdout")
|
|
79
|
+
return routing_map.get_buffer(routing_key).write(s)
|
|
80
|
+
|
|
81
|
+
def getvalue(self) -> str:
|
|
82
|
+
routing_key = get_routing_key(prefix="stdout")
|
|
83
|
+
return routing_map.get_buffer(routing_key).getvalue()
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class RoutingHandler(logging.StreamHandler):
|
|
87
|
+
"""
|
|
88
|
+
Custom logging handler that re-routes logs to different buffers
|
|
89
|
+
based on the current context routing key.
|
|
90
|
+
|
|
91
|
+
Overwritten methods are mirroring original ones from logging.StreamHandler.
|
|
92
|
+
The only difference is how 'stream' object is acquired
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
def emit(self, record):
|
|
96
|
+
try:
|
|
97
|
+
msg = self.format(record)
|
|
98
|
+
routing_key = get_routing_key(prefix="logging")
|
|
99
|
+
stream = routing_map.get_buffer(routing_key)
|
|
100
|
+
stream.write(msg + self.terminator)
|
|
101
|
+
self.flush()
|
|
102
|
+
except RecursionError:
|
|
103
|
+
raise
|
|
104
|
+
except Exception:
|
|
105
|
+
self.handleError(record)
|
|
106
|
+
|
|
107
|
+
def flush(self):
|
|
108
|
+
routing_key = get_routing_key(prefix="logging")
|
|
109
|
+
stream = routing_map.get_buffer(routing_key)
|
|
110
|
+
with self.lock:
|
|
111
|
+
if stream and hasattr(stream, "flush"):
|
|
112
|
+
stream.flush()
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
@contextmanager
|
|
116
|
+
def use_stdout_redirect(add_log_entry_func: Union[Callable[[str], None], List[Callable[[str], None]]]):
|
|
117
|
+
"""
|
|
118
|
+
Context manager that redirects stdout to a context-specific buffer.
|
|
119
|
+
Supports single callback or list of callbacks for multiple output destinations.
|
|
120
|
+
"""
|
|
121
|
+
# Normalize to list of callbacks
|
|
122
|
+
callbacks = [add_log_entry_func] if callable(add_log_entry_func) else add_log_entry_func
|
|
123
|
+
|
|
124
|
+
key = get_routing_key(prefix="stdout")
|
|
125
|
+
buffer = routing_map.add_buffer(key)
|
|
126
|
+
try:
|
|
127
|
+
with redirect_stdout(RoutingStream()):
|
|
128
|
+
yield buffer
|
|
129
|
+
finally:
|
|
130
|
+
routing_map.remove_buffer(key)
|
|
131
|
+
stdout = buffer.getvalue()
|
|
132
|
+
if stdout:
|
|
133
|
+
for callback in callbacks:
|
|
134
|
+
callback(stdout)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
@contextmanager
|
|
138
|
+
def use_logging_redirect(add_log_entry_func: Union[Callable[[str], None], List[Callable[[str], None]]]):
|
|
139
|
+
"""
|
|
140
|
+
Context manager that redirects logging to a context-specific buffer.
|
|
141
|
+
Supports single callback or list of callbacks for multiple output destinations.
|
|
142
|
+
"""
|
|
143
|
+
# Normalize to list of callbacks
|
|
144
|
+
callbacks = [add_log_entry_func] if callable(add_log_entry_func) else add_log_entry_func
|
|
145
|
+
|
|
146
|
+
key = get_routing_key(prefix="logging")
|
|
147
|
+
buffer = routing_map.add_buffer(key)
|
|
148
|
+
try:
|
|
149
|
+
yield buffer
|
|
150
|
+
finally:
|
|
151
|
+
routing_map.remove_buffer(key)
|
|
152
|
+
logs = buffer.getvalue()
|
|
153
|
+
if logs:
|
|
154
|
+
for callback in callbacks:
|
|
155
|
+
callback(logs)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class JSONFormatter(logging.Formatter):
|
|
159
|
+
def format(self, record: logging.LogRecord, **kwargs) -> str:
|
|
160
|
+
try:
|
|
161
|
+
from writer.blueprints import get_current_block
|
|
162
|
+
from writer.core import get_app_process, get_session
|
|
163
|
+
current_block = get_current_block()
|
|
164
|
+
app_process = get_app_process()
|
|
165
|
+
session = get_session()
|
|
166
|
+
except RuntimeError:
|
|
167
|
+
current_block = None
|
|
168
|
+
session = None
|
|
169
|
+
app_process = None
|
|
170
|
+
|
|
171
|
+
data: Dict[str, Any] = {
|
|
172
|
+
"severity": record.levelname.upper(),
|
|
173
|
+
"message": super().format(record),
|
|
174
|
+
"logger_name": record.name,
|
|
175
|
+
"process": {
|
|
176
|
+
"name": record.processName
|
|
177
|
+
},
|
|
178
|
+
"timestamp": time(),
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if current_block is not None:
|
|
182
|
+
data["component"] = {
|
|
183
|
+
"id": current_block.component.id,
|
|
184
|
+
"type": current_block.component.type
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if session is not None:
|
|
188
|
+
data["session"] = {
|
|
189
|
+
"id": session.session_id,
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if app_process is not None:
|
|
193
|
+
data["process"]["mode"] = app_process.mode
|
|
194
|
+
|
|
195
|
+
if isinstance(record.args, dict):
|
|
196
|
+
data.update(record.args)
|
|
197
|
+
|
|
198
|
+
# if record.args[0] is a dict add to the json dict
|
|
199
|
+
if isinstance(record.args, tuple):
|
|
200
|
+
if len(record.args) > 0 and isinstance(record.args[0], dict):
|
|
201
|
+
data.update(record.args[0])
|
|
202
|
+
|
|
203
|
+
try:
|
|
204
|
+
data_as_json = json.dumps(data)
|
|
205
|
+
return data_as_json
|
|
206
|
+
except Exception:
|
|
207
|
+
return '{"unserializable": true}'
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def get_handler(format: str = WRITER_LOG_FORMAT, level: str = WRITER_LOG_LEVEL):
|
|
211
|
+
return {
|
|
212
|
+
"level": level,
|
|
213
|
+
"class": "logging.StreamHandler",
|
|
214
|
+
"formatter": format,
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def get_logger(level: str = WRITER_LOG_LEVEL):
|
|
219
|
+
return {
|
|
220
|
+
"handlers": ["basic"],
|
|
221
|
+
"level": level,
|
|
222
|
+
"propagate": False,
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
LOGGING_CONFIG: Dict[str, Any] = {
|
|
227
|
+
"version": 1,
|
|
228
|
+
"disable_existing_loggers": False,
|
|
229
|
+
"formatters": {
|
|
230
|
+
"text": {
|
|
231
|
+
"format": "%(levelname)s - %(name)s - %(message)s",
|
|
232
|
+
},
|
|
233
|
+
"json": {
|
|
234
|
+
"()": JSONFormatter,
|
|
235
|
+
},
|
|
236
|
+
"user": {
|
|
237
|
+
"format": "%(levelname)s - %(message)s"
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
"handlers": {
|
|
241
|
+
"basic": get_handler(),
|
|
242
|
+
"stdout": {
|
|
243
|
+
"level": "DEBUG",
|
|
244
|
+
"class": "logging.StreamHandler",
|
|
245
|
+
"formatter": "json" if WRITER_LOG_FORMAT == "json" else None
|
|
246
|
+
},
|
|
247
|
+
"routing": {
|
|
248
|
+
"()": RoutingHandler,
|
|
249
|
+
"formatter": "user",
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
"loggers": {
|
|
253
|
+
"root": get_logger(),
|
|
254
|
+
"writer": get_logger(),
|
|
255
|
+
"app": get_logger(),
|
|
256
|
+
"from_app": get_logger(),
|
|
257
|
+
"journal": get_logger(),
|
|
258
|
+
"kv_storage": get_logger(),
|
|
259
|
+
"vault": get_logger(),
|
|
260
|
+
"exec_logger": {
|
|
261
|
+
"handlers": ["basic", "routing"],
|
|
262
|
+
"level": "DEBUG",
|
|
263
|
+
"propagate": False,
|
|
264
|
+
},
|
|
265
|
+
"user_code": {
|
|
266
|
+
"handlers": ["basic", "routing"],
|
|
267
|
+
"level": "DEBUG",
|
|
268
|
+
"propagate": False,
|
|
269
|
+
},
|
|
270
|
+
"stdout": {
|
|
271
|
+
"handlers": ["stdout"],
|
|
272
|
+
"propagate": False,
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
logging.config.dictConfig(LOGGING_CONFIG)
|