runcell 0.1.17a3__py3-none-any.whl → 0.1.18a0__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.
- d5m_ai/_version.py +1 -1
- d5m_ai/agent/proxy_handler.py +85 -5
- d5m_ai/agent_v2/__init__.py +11 -0
- d5m_ai/agent_v2/proxy_handler.py +263 -0
- d5m_ai/chat/chat_proxy_handler.py +127 -11
- d5m_ai/chat/history.py +89 -7
- d5m_ai/extension.py +4 -0
- d5m_ai/image_generation/image_generation_handler.py +1 -1
- d5m_ai/labextension/package.json +2 -2
- d5m_ai/labextension/schemas/runcell/package.json.orig +1 -1
- d5m_ai/labextension/static/1038.3d4a95889322af3486c9.js +1 -0
- d5m_ai/labextension/static/1103.125b012d0cc21fcd4c17.js +1 -0
- d5m_ai/labextension/static/1462.95e60c119ee44dd5ce4d.js +1 -0
- d5m_ai/labextension/static/{5009.375c39a105e8068ec0c0.js → 1599.a81345569a22a67e586b.js} +1 -1
- d5m_ai/labextension/static/1668.ad21890aa4a84d053fd1.js +1 -0
- d5m_ai/labextension/static/1806.a135a1bece20818d019a.js +1 -0
- d5m_ai/labextension/static/2082.5f28bb724b308c004a03.js +1 -0
- d5m_ai/labextension/static/2287.62675b5f54fb3cdf9dad.js +1 -0
- d5m_ai/labextension/static/2331.b764c648e7b3ce99b9bd.js +48 -0
- d5m_ai/labextension/static/2439.691a80f552c192dcdd36.js +1 -0
- d5m_ai/labextension/static/2543.74f05520feb54f093874.js +1 -0
- d5m_ai/labextension/static/2963.24ce4624e5f00aba812e.js +1 -0
- d5m_ai/labextension/static/2989.415c278633d30c768280.js +1 -0
- d5m_ai/labextension/static/{315.8ca29a2467a66de73060.js → 315.6269dcfbb2b4c1e62103.js} +1 -1
- d5m_ai/labextension/static/3272.c14c7efa176ba27377ea.js +1 -0
- d5m_ai/labextension/static/3330.5e63016fbb98dce0cac6.js +1 -0
- d5m_ai/labextension/static/3939.87077bb549e80bc5709e.js +2 -0
- d5m_ai/labextension/static/4301.7b9d249c7d587cf0c423.js +1 -0
- d5m_ai/labextension/static/4637.94d9d3415a216176c874.js +1 -0
- d5m_ai/labextension/static/4789.5454fd8f02c1a04d9425.js +1 -0
- d5m_ai/labextension/static/5271.f866100834b03d222299.js +1 -0
- d5m_ai/labextension/static/5787.28fd320820307ce1cbe2.js +1 -0
- d5m_ai/labextension/static/5844.944056182693e52fc0ce.js +1 -0
- d5m_ai/labextension/static/5959.4c1c904a5c89f4c602a6.js +1 -0
- d5m_ai/labextension/static/6161.3968d5733678faff10bd.js +1 -0
- d5m_ai/labextension/static/6526.35de595b995332066e34.js +1 -0
- d5m_ai/labextension/static/735.77abd67c42730b4d946a.js +1 -0
- d5m_ai/labextension/static/7618.31ae485d97c185b7b482.js +1 -0
- d5m_ai/labextension/static/7933.5994a870ebd9b0333a75.js +1 -0
- d5m_ai/labextension/static/8263.794bec1a8fc1c8cdbccf.js +1 -0
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/4255.657770d29f05e3da360c.js → d5m_ai/labextension/static/8340.d7cd127e8e25a8ccccc7.js +1 -1
- d5m_ai/labextension/static/8420.2fc62e3dd5b4a52ac598.js +1 -0
- d5m_ai/labextension/static/8502.36e560c4ba2789e89fa2.js +1 -0
- d5m_ai/labextension/static/8565.df233b0467ad219c7e27.js +1 -0
- d5m_ai/labextension/static/{6619.04732600d85fbbc50931.js → 8613.5ccca913a70dc0f33de5.js} +1 -1
- d5m_ai/labextension/static/8936.1d6c52d6f461b01371c4.js +1 -0
- d5m_ai/labextension/static/9030.133f0e459e9f802be5ad.js +1 -0
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/7023.f00c7a4596b9e4730708.js → d5m_ai/labextension/static/9404.f6ff67c04b5dfb52e3d9.js +1 -1
- d5m_ai/labextension/static/9407.72a128229179d870002b.js +1 -0
- d5m_ai/labextension/static/9471.33f5a763bc078ea0e425.js +1 -0
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/2774.6c28665d8d562e2eafab.js → d5m_ai/labextension/static/9571.6b68c12d3afaa5cc9b22.js +1 -1
- d5m_ai/labextension/static/9673.efe1b35a74fdf47bb401.js +1 -0
- d5m_ai/labextension/static/9817.7ccf0d44d8222c7cc19e.js +1 -0
- d5m_ai/labextension/static/remoteEntry.691071d577b6013b3be4.js +1 -0
- d5m_ai/tools/__init__.py +6 -0
- d5m_ai/tools/cell_execute.py +54 -0
- d5m_ai/tools/create_notebook.py +53 -0
- d5m_ai/tools/frontend_ws.py +170 -0
- d5m_ai/tools/registry.py +32 -3
- d5m_ai/tools/shell_execute.py +261 -0
- d5m_ai/tools/write_file.py +51 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/package.json +2 -2
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/schemas/runcell/package.json.orig +1 -1
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/1038.3d4a95889322af3486c9.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/1103.125b012d0cc21fcd4c17.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/1462.95e60c119ee44dd5ce4d.js +1 -0
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/5009.375c39a105e8068ec0c0.js → runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/1599.a81345569a22a67e586b.js +1 -1
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/1668.ad21890aa4a84d053fd1.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/1806.a135a1bece20818d019a.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2082.5f28bb724b308c004a03.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2287.62675b5f54fb3cdf9dad.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2331.b764c648e7b3ce99b9bd.js +48 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2439.691a80f552c192dcdd36.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2543.74f05520feb54f093874.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2963.24ce4624e5f00aba812e.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2989.415c278633d30c768280.js +1 -0
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/315.8ca29a2467a66de73060.js → runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/315.6269dcfbb2b4c1e62103.js +1 -1
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/3272.c14c7efa176ba27377ea.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/3330.5e63016fbb98dce0cac6.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/3939.87077bb549e80bc5709e.js +2 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/4301.7b9d249c7d587cf0c423.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/4637.94d9d3415a216176c874.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/4789.5454fd8f02c1a04d9425.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/5271.f866100834b03d222299.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/5787.28fd320820307ce1cbe2.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/5844.944056182693e52fc0ce.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/5959.4c1c904a5c89f4c602a6.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/6161.3968d5733678faff10bd.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/6526.35de595b995332066e34.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/735.77abd67c42730b4d946a.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/7618.31ae485d97c185b7b482.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/7933.5994a870ebd9b0333a75.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/8263.794bec1a8fc1c8cdbccf.js +1 -0
- d5m_ai/labextension/static/4255.657770d29f05e3da360c.js → runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/8340.d7cd127e8e25a8ccccc7.js +1 -1
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/8420.2fc62e3dd5b4a52ac598.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/8502.36e560c4ba2789e89fa2.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/8565.df233b0467ad219c7e27.js +1 -0
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/6619.04732600d85fbbc50931.js → runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/8613.5ccca913a70dc0f33de5.js +1 -1
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/8936.1d6c52d6f461b01371c4.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/9030.133f0e459e9f802be5ad.js +1 -0
- d5m_ai/labextension/static/7023.f00c7a4596b9e4730708.js → runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/9404.f6ff67c04b5dfb52e3d9.js +1 -1
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/9407.72a128229179d870002b.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/9471.33f5a763bc078ea0e425.js +1 -0
- d5m_ai/labextension/static/2774.6c28665d8d562e2eafab.js → runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/9571.6b68c12d3afaa5cc9b22.js +1 -1
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/9673.efe1b35a74fdf47bb401.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/9817.7ccf0d44d8222c7cc19e.js +1 -0
- runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/remoteEntry.691071d577b6013b3be4.js +1 -0
- {runcell-0.1.17a3.dist-info → runcell-0.1.18a0.dist-info}/METADATA +1 -1
- {runcell-0.1.17a3.dist-info → runcell-0.1.18a0.dist-info}/RECORD +451 -444
- d5m_ai/labextension/static/1866.ab8af952d5f6e2abf015.js +0 -1
- d5m_ai/labextension/static/2331.cf0ae406b1f17e5c8518.js +0 -1
- d5m_ai/labextension/static/2732.afa510c6b53e86d62ca1.js +0 -1
- d5m_ai/labextension/static/3111.ebf975f4bcee6f078398.js +0 -1
- d5m_ai/labextension/static/3314.bba33288b1bf072a1159.js +0 -1
- d5m_ai/labextension/static/345.b6c86a74cbb739491375.js +0 -1
- d5m_ai/labextension/static/3475.4bb63668582c9ee1aa75.js +0 -1
- d5m_ai/labextension/static/3550.0f796cddf846567f6eda.js +0 -1
- d5m_ai/labextension/static/4163.c5b167ad4c431223b14a.js +0 -1
- d5m_ai/labextension/static/4398.20687aa11fadd8caab55.js +0 -1
- d5m_ai/labextension/static/4444.8776afd3310ade08de78.js +0 -1
- d5m_ai/labextension/static/4573.313f73d47b3e9e7e539a.js +0 -1
- d5m_ai/labextension/static/4640.c1c98b7c207045b8429e.js +0 -1
- d5m_ai/labextension/static/4712.867600779a30c292ecd7.js +0 -48
- d5m_ai/labextension/static/4797.6c1f52ca8940a1daa9ed.js +0 -1
- d5m_ai/labextension/static/5225.77ee82ef77687f707c86.js +0 -1
- d5m_ai/labextension/static/5307.0cf41cdf5b6c0c01dbe3.js +0 -1
- d5m_ai/labextension/static/5388.8b14c718c4703b72635f.js +0 -1
- d5m_ai/labextension/static/5481.20ece9f96e241e634f15.js +0 -1
- d5m_ai/labextension/static/553.bd198ad217a7dbfcef42.js +0 -1
- d5m_ai/labextension/static/5785.c6fc662855351bdde523.js +0 -1
- d5m_ai/labextension/static/5953.fb531c692611683ab5f7.js +0 -1
- d5m_ai/labextension/static/6047.ed21945649e91106bee2.js +0 -1
- d5m_ai/labextension/static/6145.8bfe956b3c3b5a40e58d.js +0 -1
- d5m_ai/labextension/static/6286.db1168ea85a057c6f189.js +0 -1
- d5m_ai/labextension/static/6734.e5919666c842cdf1276d.js +0 -1
- d5m_ai/labextension/static/6789.346356d4f19b92e62321.js +0 -1
- d5m_ai/labextension/static/6841.3906e65455bb5575b44b.js +0 -1
- d5m_ai/labextension/static/783.63f9d3340979bfb89716.js +0 -1
- d5m_ai/labextension/static/790.1c740b9b76f7fd2dc0d6.js +0 -1
- d5m_ai/labextension/static/877.e8b79ec87c1325c45f62.js +0 -2
- d5m_ai/labextension/static/8823.2fc995c832aa529c3519.js +0 -1
- d5m_ai/labextension/static/9064.5349664a3752925acab3.js +0 -1
- d5m_ai/labextension/static/9195.d0277553edf7593d967d.js +0 -1
- d5m_ai/labextension/static/9338.58debf8972aa5f8b68d7.js +0 -1
- d5m_ai/labextension/static/9404.f841eb045fbb87713d5e.js +0 -1
- d5m_ai/labextension/static/9575.8848adfb0c89daa1ca6b.js +0 -1
- d5m_ai/labextension/static/remoteEntry.efee755649ccf0e6ec23.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/1866.ab8af952d5f6e2abf015.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/2331.cf0ae406b1f17e5c8518.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/2732.afa510c6b53e86d62ca1.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/3111.ebf975f4bcee6f078398.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/3314.bba33288b1bf072a1159.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/345.b6c86a74cbb739491375.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/3475.4bb63668582c9ee1aa75.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/3550.0f796cddf846567f6eda.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/4163.c5b167ad4c431223b14a.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/4398.20687aa11fadd8caab55.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/4444.8776afd3310ade08de78.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/4573.313f73d47b3e9e7e539a.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/4640.c1c98b7c207045b8429e.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/4712.867600779a30c292ecd7.js +0 -48
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/4797.6c1f52ca8940a1daa9ed.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/5225.77ee82ef77687f707c86.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/5307.0cf41cdf5b6c0c01dbe3.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/5388.8b14c718c4703b72635f.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/5481.20ece9f96e241e634f15.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/553.bd198ad217a7dbfcef42.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/5785.c6fc662855351bdde523.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/5953.fb531c692611683ab5f7.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/6047.ed21945649e91106bee2.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/6145.8bfe956b3c3b5a40e58d.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/6286.db1168ea85a057c6f189.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/6734.e5919666c842cdf1276d.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/6789.346356d4f19b92e62321.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/6841.3906e65455bb5575b44b.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/783.63f9d3340979bfb89716.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/790.1c740b9b76f7fd2dc0d6.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/877.e8b79ec87c1325c45f62.js +0 -2
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/8823.2fc995c832aa529c3519.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/9064.5349664a3752925acab3.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/9195.d0277553edf7593d967d.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/9338.58debf8972aa5f8b68d7.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/9404.f841eb045fbb87713d5e.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/9575.8848adfb0c89daa1ca6b.js +0 -1
- runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/remoteEntry.efee755649ccf0e6ec23.js +0 -1
- /d5m_ai/labextension/static/{4712.867600779a30c292ecd7.js.LICENSE.txt → 2331.b764c648e7b3ce99b9bd.js.LICENSE.txt} +0 -0
- /d5m_ai/labextension/static/{877.e8b79ec87c1325c45f62.js.LICENSE.txt → 3939.87077bb549e80bc5709e.js.LICENSE.txt} +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/etc/jupyter/jupyter_server_config.d/d5m_ai.json +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/etc/jupyter/jupyter_server_config.d/runcell.json +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/install.json +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/schemas/runcell/file-browser-toggle.json +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/schemas/runcell/plugin.json +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1045.a76db59a7c20953976f0.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1055.87aafb19805530488a2c.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/108.d7dbe40ec7e0ae1a68f8.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1104.a2b939bacec5e69efd99.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1171.130d3cc54764cac92856.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1178.3e25fad4a45450e227c9.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1203.5deaeee9e57ffc718f19.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1226.ff48aa5741f77eb739fe.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1273.4c5992b03f129c9e3025.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1285.cf3bab9529c47ac9288d.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1307.d98ceb66a2401e5f4ddd.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1328.38964f7daa84901e866f.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1377.edf5c2163aedef75c6a1.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1391.ab61eb03aed289d9d44c.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1431.a691b4fa7cf229072fc0.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1521.9f3807c4a4dd19a6ab8c.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1524.188ff9d525210d499ff3.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1534.39ba9b2bf5712b697b63.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1540.9eba7e882fd8e00a782a.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1552.5203480dcdda6574ef51.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1555.686745d50bd19fd9d271.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1618.9abd2093263741894755.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1635.84bd383b17e41c9fe103.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1678.57b141401f73a26257c8.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1685.842997eb9757846fe690.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1745.e6bb2c6882da5bf9883a.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1752.8c4ecff560428215fe75.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1797.f8ca14c3ec1c0f51f403.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1897.7cca7a664a9ca9b486ac.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1902.364fa5e977055fe14150.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1915.b55b7d52608421a7fc41.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1970.dff4fcccbb6cadb04d0c.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/200.f1d30c245c18bbb03312.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2031.155ab0916a863c8787a7.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2031.155ab0916a863c8787a7.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/207.f5bd6d1b383a6b01ca69.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2072.a4d04cc98bb118e689a1.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2075.5d6a026d7308b71b70a1.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2111.a3c1f620c0a31e54cb9f.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2152.4db0fcf1f4dccf54b600.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2173.9fddf72b827a6d629bad.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2198.e195afcaabb2e4063da9.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2224.c86b12cf9e2165904033.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2225.8d31eec53891ca7775b7.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2271.69d9ea25d4ddd02710f6.js +0 -0
- /runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/4712.867600779a30c292ecd7.js.LICENSE.txt → /runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2331.b764c648e7b3ce99b9bd.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2349.e7c5b5e507c7a81d1427.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2353.7b6b36b3164a86427209.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2382.9e67478cc4b31aede22c.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2385.cd85a7dd4acb5be739da.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/248.693fd98760ec6ce42219.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2555.7168a2616a6071addb97.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2576.56496d8cba50d3d69eb5.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2639.eb2553a7be688366d9f3.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2654.2453f6b5846a4719dba4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/267.829ce2ca38940b778c91.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/270.9409a2f5631a31c79cd9.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2768.9e5b7c6ed84b2486f835.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2789.12830cdb21c09111668d.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2824.d02df014c07b7288e78c.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2824.d02df014c07b7288e78c.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2838.2e689afee276e5e21c57.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2843.65aeb8be3744d20229b8.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2897.7bc91ca284ea12b863e8.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2905.0d34ef7a481f9a968f05.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2922.8cdf00bb7d09c5419d78.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2922.8cdf00bb7d09c5419d78.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2971.60c60668c130ed05d493.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/299.8600f54b39a11eeff427.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3027.2226147340da305061f3.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3028.953cd3b9865063969086.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3041.4059f9ba4f9eba56672a.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3045.a457aa1d023ba5f799c2.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3092.fad665f8cdb1da61b55b.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3142.7df01050c977ede2b13b.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3157.bcb9f8ff06fa4af27b6a.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3214.a986c1896fa590b2da27.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3239.4562297487744a7cc1d4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/325.bd1e5cab3b6e068b25bc.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3254.9e1aa1fee12644fea2d9.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3267.ff884bf47b52ac634854.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3291.156ad2d1520857115575.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3311.dc97fd544e85acac8477.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3319.687f07bb2f993c1dc44b.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3325.c100f45711f539a7f262.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3386.4c8eebdb8d318c2913ce.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3386.4c8eebdb8d318c2913ce.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3407.cbbf99a2ff4805726f3e.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3424.92b1a820ff2aa6156c36.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3426.27afd4c41cfad8e1a63d.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3436.ea677bb3e7f3ce87d7fd.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3449.5d8818fac081c207ce79.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3514.c8a1863df3cfd5390617.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/355.45290b03d6d4be49a58e.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3551.87e6eb270a212d08b1b5.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/359.1463d2cf955623ecceae.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3619.3dfa7c4eaa067a407275.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3645.5ea37d9f483120f69f4e.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3659.056fa5e4e39b72bc358b.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3688.7bd1ba5006b22ed5616e.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3722.688cdfd335ffeac13492.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3724.06a5a1b542ff978df3b4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/376.f9c52e5bbd650da7b67f.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3794.c0236d400b2129ac42a9.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3930.b142768bad429b3ebb04.js +0 -0
- /runcell-0.1.17a3.data/data/share/jupyter/labextensions/runcell/static/877.e8b79ec87c1325c45f62.js.LICENSE.txt → /runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/3939.87077bb549e80bc5709e.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4003.95678dd199222938923b.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4017.d35a7557e5338be92770.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4050.00a6bfc9f23c6ef07199.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4087.ea430b62171512019400.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/410.fd643a255d72a83c1be6.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4127.0e783d9a497298e9fe18.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/415.0a1fdc1d9f76c0431d42.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4175.d23c246efa6921b45150.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4238.bd4642c4f9256441aea5.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4246.d8aedd2b15d1a95f1288.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4272.c92c9a0d98749863c853.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4296.7f1db6691a4ac120a383.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4317.1ba9f3c33b7a1484c5df.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/434.bfe4f51db2eb9644fbe7.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/434.bfe4f51db2eb9644fbe7.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4353.6a83dae11a48e9d1b345.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4358.53a6106c5c93c3fda026.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4364.e87c307df69aa50a5b2a.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4365.b2b4496cc260301256b9.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4371.647bc44642d1ad0e99e4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4390.1cafd3d4635b09e0c945.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4412.23a8cb5fb7377d3c81ab.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4412.23a8cb5fb7377d3c81ab.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4425.a34c4f44daa5996eeec4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4447.3ad32bafee045d2c0bab.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4477.d9e871faf650e6ad238a.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/45.560ee8b955f55e6a7471.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4503.794c4dd58c6bf2e6a66d.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4584.c610d4a425b036b86759.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4613.05840d3fc617590fff51.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4630.a78300f70b9af36897eb.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4682.1b69aa450cedd96227c9.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4713.4e4e598399fd6de85f5d.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4725.5447994a36dfeda58b9f.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4755.74d46f71eb4d23e4bca2.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4838.688e36ea43737e72dbdc.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/485.d27de91b0124447cf435.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4872.1404f5d25464532c27c2.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4886.443bcf6af7b83f72b4b5.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4913.d226f3c41ebb36489ce3.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/492.a7f5e972b35c8c877bf1.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4928.5c8ad7f80ba081dfdbba.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5146.45d9b015343e5a7cace1.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5183.8c5527ebc7a807107471.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/524.927c6a42244b04ee834f.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5253.2cea0b927b50c952fe98.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5331.c971f98ac4fd9e9751a4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5391.375b4314cb4b851f0915.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5391.375b4314cb4b851f0915.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5408.07fc40e33d3fd1a3f7b6.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5431.528d309549815d363599.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5447.1267bc4aa4938bd0f08d.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5466.e1da4e862af22e314f82.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5473.7ac9ad0a3e047bfeceb0.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5509.c8c8ddebaabc3579daba.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5590.fd188e01caa78afb3ec4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5620.cd3cd230d09209b34fb5.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5636.ca803ffcf0d43c2402c9.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5672.156ad2d1520857115575.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5695.0da6228c48571d9386f3.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5715.66ad4e7324b22a5e27fb.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5741.edd8fd814866705aad98.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5748.53eb48f5623074a948ba.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5765.e957d823cdfe2746a356.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5788.b9c62804c0698b91ca8a.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5882.b40b5d690d3f6f67f09a.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5885.8cd4d3e3008fdb31ce2a.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5900.6dca06924caef83a5b52.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5906.870c0d7bb4e022aaca9d.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5908.e81f83f7a9906d9d7542.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5973.4e08bf1ee13205326051.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5973.4e08bf1ee13205326051.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5977.d264e9baaebc417e35c0.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6007.987a9850d5891b1908ae.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6030.dd5fd07844168dbaa6f6.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6030.dd5fd07844168dbaa6f6.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6079.5c80b9de6aabb0be08d2.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6084.bf8d6b1da6c4cad209bb.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6094.f96654ca0070f8f391b1.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/611.5ae7fb260af8629f1528.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6176.bd441d4d6fe942889bf3.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6221.457e64a4f06be421eaa4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6266.4f2bcc95c2d61cdaacbc.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/627.84c4aa26f69662abb72d.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6293.823b9bfe50fdfd62dd42.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6299.b14c1d46ba4ad9799f63.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6306.8d22227d6aa1dfc32da5.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6320.b844d6686eebcb036643.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6322.997db39a5d4b63e72b21.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6336.92de365c5fb0f261f799.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6354.0025efd7872b7d32b46b.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6354.0025efd7872b7d32b46b.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6366.5049626e7d5bb38a8574.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/640.ebfad36f1dde45e9cd05.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/642.817a48a77e1c16e6e65d.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6520.ff2a9ec2e50dd45868ac.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6573.7899a873adb98c3c0190.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6648.b7ed5e9a732275dc85ac.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6676.1a71900a6131dbe02aad.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6678.fe58c12ce33b0f5706f5.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6772.01fcccfcabd525210aee.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6774.1e0a751d7079179f8f73.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6795.1c49fa950817836e3f1e.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6803.eccda2da06d869b0acda.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6822.5bf91484ea172f864747.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6853.48004207e7c689ec55b4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6880.c3cfce260b3d25d9ef5e.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6906.1f65b08daf64af8d1f27.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6982.d9f1a29fe7834b53c855.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7005.9f8920f4e58652fe3ef9.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/711.5c259d7417620cf8eef8.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7131.cab088ddb371234f1fd6.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7161.f03be5c4590ae6db98c1.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7166.6e64d20ff3d06bb0726a.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7181.1d3f5611193e734beaf4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/72.081fe34e2c76320135d0.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7232.5969981a73dac6835b93.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7273.9e6765278092fd30a14f.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7280.5862e5cf2b594fd45f82.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7336.b8136533f61cd1b71adc.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7359.7bc0ef939742600dba39.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7399.6fa42c5d34d3659f9f68.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7400.ea48afe8766bd82b3741.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7441.bce20fb0ea3d8638bc30.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7488.f63b5ad13eb23dbc3915.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/751.48ddf412afdd781e868f.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7572.937d1e5ce68a384389e9.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7652.cf086dfcd950ff2c4554.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7672.61e8e5299259407f1ee1.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7705.962a56002e394e3755aa.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7719.9dbadc40622a97c6fa90.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7771.efa5c4cf41907b4c8cfc.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7772.094d82c7ec81259764f4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7772.094d82c7ec81259764f4.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/779.c50f60eeca2b40bf96db.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7792.e67368a87fa703a97f25.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7812.1b53bb1f6cce555d0b70.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7890.c8c8ddebaabc3579daba.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7954.b02433d4bd38b648ec0e.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7959.75734676fe5e861ad899.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7967.ccc236f921abba961fcb.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7981.c14b5974541e98a1b340.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8053.ebcecafa176e4cb5c439.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8053.ebcecafa176e4cb5c439.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8056.06f4e4d87d7ccc1e4662.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8066.ad6692e614937d4dc480.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8122.f671cfb05d97b5e220fa.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8146.fc69595fa9fb4dc989ec.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8151.e18e503723ffa9d576f7.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8177.d8e81718e82279286385.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8179.33453f3165561d33347d.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8181.0f15741bcd037cfaf528.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8249.01410b92489460697717.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8295.39003c08c2539bf22593.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8304.075c39345f3b817edfb1.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8321.3ba6a40e5ed74b977afc.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8343.31e93467f566af5fb10e.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8354.3044135d1229985d61c6.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8354.3044135d1229985d61c6.js.LICENSE.txt +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8366.55b8257f92b23e6f49ec.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8369.80293e64ec102044c767.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/84.3575d43472885d2b7714.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8400.7d8ed1bca69c56f67486.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8404.1c1c675dc23d7d9d80de.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8437.795ac38d87895b50d98e.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8480.6698a41d2cf895aafe0f.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8482.85d03122dfec6d4f9307.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/851.9faa523fb28cedcd6b88.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8522.dd261948e958bcf4ae64.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8524.4c79a5ea5e22a1389a1f.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8649.b722755e4bccf4a39cd5.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8675.ffadeba0edbfd8d2285d.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8748.bb9c4496cf4ab7577e74.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8751.e80b9f51b9cdb544d16b.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8768.4aba875e6cfb350edfa7.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/880.0bcd5ab06196cb9533c4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8824.4b08a890046be218bb35.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8829.c51ecb2bf77a1ca2a962.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8856.6e271445d6d3837302ec.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8860.c824d17d8869a6dd6207.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8887.6480b4ee0c5fa187c2d7.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8929.3329d360058c1764e201.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8957.4f33250ba35099dbe048.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9014.0e67032c3d7119ce3370.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/904.60333ec0aebf2d092197.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9040.9376593b8e7caa5ed6a0.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9055.7b9ab3136d6a82b298a4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9071.d8aea526bf53118639a9.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9113.f9e25015d31ee397e490.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9115.c30adf6f374eb1bd3b93.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9125.26a8a929493c19af9f50.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9165.8b0907227f85ba27306b.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9180.7d6cded0c9f36ac75093.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9184.33de87e8d509010a9bdf.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9193.3666b71cf376fdec58b4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9205.a2f5f2a2c0b69582717e.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9251.822a5aa9397713d54ea2.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9255.ad693b359f0d12767fe1.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9262.bebc0ed75d7f86d722f2.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9277.f3623a34b457ca052d80.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9285.2d3c4984387ebca606d4.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9289.9fb56f7beb83d721e654.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/934.3ce5b696b827323e706e.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9402.b8868b6860051723bf48.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9412.fe8cf617636a0df90247.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9456.2f96fda82d4be6b0448e.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9494.b4ae8d6a63ec84cc4ec3.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9513.0db046603be52099c3ec.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9514.458d7630c50b4b658200.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9559.07e6563cb0b401ff88a6.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9576.b2d6c2e9831fda63f41f.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9607.a4f836281d0337527f6e.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9621.55ea68ee13d702908a10.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9640.c489050f3a1342328779.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9650.b4d4a115ac2fca1dfbe8.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9704.f4c6d15183531d37b825.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9734.63cf17414a5103d290bb.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9754.2f617d267f5167be63ed.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9885.f84ed1b0565de3b61e99.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9912.b6643895a628f9ea506c.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9926.6e52dbb62a19476aae87.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9939.eab64dfd409dd1df1844.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9986.e953beace913bfa7ba74.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9997.1716894eb29a02d76575.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/style.js +0 -0
- {runcell-0.1.17a3.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/third-party-licenses.json +0 -0
- {runcell-0.1.17a3.dist-info → runcell-0.1.18a0.dist-info}/WHEEL +0 -0
- {runcell-0.1.17a3.dist-info → runcell-0.1.18a0.dist-info}/entry_points.txt +0 -0
- {runcell-0.1.17a3.dist-info → runcell-0.1.18a0.dist-info}/licenses/LICENSE +0 -0
d5m_ai/_version.py
CHANGED
d5m_ai/agent/proxy_handler.py
CHANGED
|
@@ -47,6 +47,7 @@ class AIJLAgentProxyHandler(WebSocketHandler):
|
|
|
47
47
|
def initialize(self, **kwargs):
|
|
48
48
|
self.connection_id: str = str(uuid.uuid4())
|
|
49
49
|
self.current_request_id: str | None = None
|
|
50
|
+
self.local_only = False
|
|
50
51
|
|
|
51
52
|
# Frontend WebSocket connection state
|
|
52
53
|
self._is_closed = False
|
|
@@ -127,6 +128,12 @@ class AIJLAgentProxyHandler(WebSocketHandler):
|
|
|
127
128
|
"""Handle WebSocket connection opening from frontend."""
|
|
128
129
|
# Get user token from local file
|
|
129
130
|
user_token = self._get_user_token()
|
|
131
|
+
try:
|
|
132
|
+
local_only_param = self.get_query_argument("local_only", default="0")
|
|
133
|
+
except Exception:
|
|
134
|
+
local_only_param = "0"
|
|
135
|
+
# local_only keeps the frontend<->proxy WS for tools but avoids proxy<->remote WS.
|
|
136
|
+
self.local_only = str(local_only_param).lower() in {"1", "true", "yes"}
|
|
130
137
|
|
|
131
138
|
if not user_token:
|
|
132
139
|
print("[PROXY] ❌ No authentication token available")
|
|
@@ -147,11 +154,16 @@ class AIJLAgentProxyHandler(WebSocketHandler):
|
|
|
147
154
|
"connection_id": self.connection_id
|
|
148
155
|
})
|
|
149
156
|
|
|
150
|
-
# Establish connection to remote backend
|
|
151
|
-
|
|
157
|
+
# Establish connection to remote backend unless running local-only tools.
|
|
158
|
+
if not self.local_only:
|
|
159
|
+
await self._connect_to_remote_backend()
|
|
160
|
+
else:
|
|
161
|
+
print("[PROXY] Local-only WebSocket enabled; skipping remote backend connection")
|
|
152
162
|
|
|
153
163
|
async def _connect_to_remote_backend(self):
|
|
154
164
|
"""Establish WebSocket connection to remote backend server."""
|
|
165
|
+
if self.local_only:
|
|
166
|
+
return
|
|
155
167
|
try:
|
|
156
168
|
async with self._remote_connection_lock:
|
|
157
169
|
if self.remote_websocket is None or self._is_remote_connection_closed():
|
|
@@ -635,6 +647,9 @@ class AIJLAgentProxyHandler(WebSocketHandler):
|
|
|
635
647
|
|
|
636
648
|
async def _forward_to_remote_backend(self, msg):
|
|
637
649
|
"""Forward message to remote backend."""
|
|
650
|
+
if self.local_only:
|
|
651
|
+
print("[PROXY] Local-only mode: skipping forward to remote backend")
|
|
652
|
+
return
|
|
638
653
|
# Add connection ID for routing
|
|
639
654
|
msg["connection_id"] = self.connection_id
|
|
640
655
|
|
|
@@ -658,19 +673,24 @@ class AIJLAgentProxyHandler(WebSocketHandler):
|
|
|
658
673
|
request_id = msg.get("request_id")
|
|
659
674
|
|
|
660
675
|
if request_id:
|
|
676
|
+
if handler.local_only:
|
|
677
|
+
# In local-only mode there is no remote backend to reply to; resolve the waiter directly.
|
|
678
|
+
await self._process_cell_result(handler, result)
|
|
679
|
+
return
|
|
680
|
+
|
|
661
681
|
# This is from a remote backend tool call, forward it back
|
|
662
682
|
print(f"[PROXY] Forwarding cell_result to remote backend with request_id: {request_id}")
|
|
663
|
-
|
|
683
|
+
|
|
664
684
|
# Clean up pending request tracking
|
|
665
685
|
if hasattr(self, '_pending_frontend_requests'):
|
|
666
686
|
self._pending_frontend_requests.discard(request_id)
|
|
667
|
-
|
|
687
|
+
|
|
668
688
|
# Process the result to check for image data
|
|
669
689
|
if '"image/png"' in result:
|
|
670
690
|
print(f"[PROXY] Detected image/png data in cell_result")
|
|
671
691
|
modified_result = await handler.image_processor.replace_base64_with_urls(result)
|
|
672
692
|
result = modified_result
|
|
673
|
-
|
|
693
|
+
|
|
674
694
|
await self._send_to_remote_backend({
|
|
675
695
|
"type": "tool_call_result",
|
|
676
696
|
"request_id": request_id,
|
|
@@ -689,6 +709,11 @@ class AIJLAgentProxyHandler(WebSocketHandler):
|
|
|
689
709
|
if '"image/png"' in result:
|
|
690
710
|
modified_result = await handler.image_processor.replace_base64_with_urls(result)
|
|
691
711
|
result = modified_result
|
|
712
|
+
|
|
713
|
+
if handler.local_only:
|
|
714
|
+
# Local-only mode resolves the waiter directly instead of forwarding to remote.
|
|
715
|
+
await self._process_cell_result(handler, result)
|
|
716
|
+
return
|
|
692
717
|
|
|
693
718
|
# Always forward the result back to remote backend with request_id
|
|
694
719
|
if request_id:
|
|
@@ -711,6 +736,13 @@ class AIJLAgentProxyHandler(WebSocketHandler):
|
|
|
711
736
|
modified_result = await handler.image_processor.replace_base64_with_urls(result)
|
|
712
737
|
result = modified_result
|
|
713
738
|
|
|
739
|
+
if handler.local_only:
|
|
740
|
+
if handler.waiter and not handler.waiter.done():
|
|
741
|
+
handler.waiter.set_result(result)
|
|
742
|
+
else:
|
|
743
|
+
print(f"[PROXY] Handler waiter not available for edit_markdown_cell result")
|
|
744
|
+
return
|
|
745
|
+
|
|
714
746
|
if request_id:
|
|
715
747
|
await self._send_to_remote_backend({
|
|
716
748
|
"type": "tool_call_result",
|
|
@@ -738,6 +770,13 @@ class AIJLAgentProxyHandler(WebSocketHandler):
|
|
|
738
770
|
elif msg_type == "rerun_all_cells_result":
|
|
739
771
|
result = msg.get("result", "No result provided")
|
|
740
772
|
request_id = msg.get("request_id")
|
|
773
|
+
|
|
774
|
+
if handler.local_only:
|
|
775
|
+
if handler.waiter and not handler.waiter.done():
|
|
776
|
+
handler.waiter.set_result(result)
|
|
777
|
+
else:
|
|
778
|
+
print(f"[PROXY] Handler waiter not available for rerun_all_cells result")
|
|
779
|
+
return
|
|
741
780
|
|
|
742
781
|
# If this result is from a remote backend tool call, forward it back
|
|
743
782
|
if request_id:
|
|
@@ -764,6 +803,13 @@ class AIJLAgentProxyHandler(WebSocketHandler):
|
|
|
764
803
|
else:
|
|
765
804
|
error = msg.get("error", "Unknown error occurred")
|
|
766
805
|
result = f"Error inserting markdown cell: {error}"
|
|
806
|
+
|
|
807
|
+
if handler.local_only:
|
|
808
|
+
if handler.waiter and not handler.waiter.done():
|
|
809
|
+
handler.waiter.set_result(result)
|
|
810
|
+
else:
|
|
811
|
+
print(f"[PROXY] Handler waiter not available for insert markdown cell result")
|
|
812
|
+
return
|
|
767
813
|
|
|
768
814
|
# If this result is from a remote backend tool call, forward it back
|
|
769
815
|
if request_id:
|
|
@@ -799,6 +845,14 @@ class AIJLAgentProxyHandler(WebSocketHandler):
|
|
|
799
845
|
result = msg.get("result", "file is opened in tab")
|
|
800
846
|
else:
|
|
801
847
|
result = msg.get("error", "Unknown error occurred")
|
|
848
|
+
|
|
849
|
+
if handler.local_only:
|
|
850
|
+
if handler.waiter and not handler.waiter.done():
|
|
851
|
+
handler.waiter.set_result(result)
|
|
852
|
+
else:
|
|
853
|
+
print(f"[PROXY] Handler waiter not available for open tab result")
|
|
854
|
+
return
|
|
855
|
+
|
|
802
856
|
if request_id:
|
|
803
857
|
print(f"[PROXY] Forwarding open_tab to remote backend")
|
|
804
858
|
await self._send_to_remote_backend({
|
|
@@ -815,6 +869,13 @@ class AIJLAgentProxyHandler(WebSocketHandler):
|
|
|
815
869
|
elif msg_type == "insert_cell_result":
|
|
816
870
|
result = msg.get("result", "No result provided")
|
|
817
871
|
request_id = msg.get("request_id")
|
|
872
|
+
|
|
873
|
+
if handler.local_only:
|
|
874
|
+
if handler.waiter and not handler.waiter.done():
|
|
875
|
+
handler.waiter.set_result(result)
|
|
876
|
+
else:
|
|
877
|
+
print(f"[PROXY] Handler waiter not available for insert_cell result")
|
|
878
|
+
return
|
|
818
879
|
|
|
819
880
|
if request_id:
|
|
820
881
|
print(f"[PROXY] Forwarding insert_cell_result to remote backend")
|
|
@@ -839,6 +900,10 @@ class AIJLAgentProxyHandler(WebSocketHandler):
|
|
|
839
900
|
print(f"[PROXY] Detected image/png data in run_cell_result")
|
|
840
901
|
modified_result = await handler.image_processor.replace_base64_with_urls(result)
|
|
841
902
|
result = modified_result
|
|
903
|
+
|
|
904
|
+
if handler.local_only:
|
|
905
|
+
await self._process_cell_result(handler, result)
|
|
906
|
+
return
|
|
842
907
|
|
|
843
908
|
if request_id:
|
|
844
909
|
print(f"[PROXY] Forwarding run_cell_result to remote backend")
|
|
@@ -857,6 +922,13 @@ class AIJLAgentProxyHandler(WebSocketHandler):
|
|
|
857
922
|
elif msg_type == "delete_cell_result":
|
|
858
923
|
result = msg.get("result", "No result provided")
|
|
859
924
|
request_id = msg.get("request_id")
|
|
925
|
+
|
|
926
|
+
if handler.local_only:
|
|
927
|
+
if handler.waiter and not handler.waiter.done():
|
|
928
|
+
handler.waiter.set_result(result)
|
|
929
|
+
else:
|
|
930
|
+
print(f"[PROXY] Handler waiter not available for delete_cell result")
|
|
931
|
+
return
|
|
860
932
|
|
|
861
933
|
if request_id:
|
|
862
934
|
print(f"[PROXY] Forwarding delete_cell_result to remote backend")
|
|
@@ -879,6 +951,14 @@ class AIJLAgentProxyHandler(WebSocketHandler):
|
|
|
879
951
|
result = msg.get("result", "Terminal created")
|
|
880
952
|
else:
|
|
881
953
|
result = msg.get("error", "Unknown error occurred")
|
|
954
|
+
|
|
955
|
+
if handler.local_only:
|
|
956
|
+
if handler.waiter and not handler.waiter.done():
|
|
957
|
+
handler.waiter.set_result(result)
|
|
958
|
+
else:
|
|
959
|
+
print(f"[PROXY] Handler waiter not available for run_long_terminal result")
|
|
960
|
+
return
|
|
961
|
+
|
|
882
962
|
if request_id:
|
|
883
963
|
print(f"[PROXY] Forwarding run_long_terminal_result to remote backend")
|
|
884
964
|
await self._send_to_remote_backend({
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Agent V2 proxy handlers.
|
|
3
|
+
|
|
4
|
+
This module introduces a versioned HTTP/SSE agent endpoint that reuses the
|
|
5
|
+
ask-mode tool loop pattern while keeping the existing WebSocket agent intact.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .proxy_handler import AIAgentV2ProxyHandler
|
|
9
|
+
|
|
10
|
+
__all__ = ["AIAgentV2ProxyHandler"]
|
|
11
|
+
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Agent V2 HTTP/SSE proxy handler.
|
|
3
|
+
|
|
4
|
+
MVP design:
|
|
5
|
+
- Frontend <-> proxy may still use a local-only WebSocket for notebook tools.
|
|
6
|
+
- Proxy <-> remote backend is strictly HTTP/SSE.
|
|
7
|
+
- Tool execution reuses the ask-mode registry for now.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import aiohttp
|
|
13
|
+
import json
|
|
14
|
+
import logging
|
|
15
|
+
import ssl
|
|
16
|
+
from typing import Any, Dict
|
|
17
|
+
|
|
18
|
+
import certifi
|
|
19
|
+
|
|
20
|
+
from .._version import __version__ as client_version
|
|
21
|
+
from ..chat.chat_proxy_handler import AIChatProxyHandler
|
|
22
|
+
from tornado import web
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class AIAgentV2ProxyHandler(AIChatProxyHandler):
|
|
26
|
+
"""
|
|
27
|
+
Versioned agent proxy that routes to `/v2/agent/chat` on the remote backend.
|
|
28
|
+
|
|
29
|
+
This intentionally subclasses the ask-mode proxy so we can validate the
|
|
30
|
+
HTTP tool loop end-to-end before migrating agent-specific tools/prompts.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, *args, **kwargs):
|
|
34
|
+
super().__init__(*args, **kwargs)
|
|
35
|
+
logging.info(
|
|
36
|
+
f"[AGENT-V2-PROXY] Initialized with remote backend: {self.remote_backend_url}"
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
async def _forward_to_remote_backend(
|
|
40
|
+
self, body_data: Dict[str, Any], stream: bool, user_token: str
|
|
41
|
+
):
|
|
42
|
+
"""Forward request to the versioned remote backend and handle response."""
|
|
43
|
+
try:
|
|
44
|
+
remote_url = f"{self.remote_backend_url}/v2/agent/chat"
|
|
45
|
+
|
|
46
|
+
if not hasattr(self, "_unified_content_index"):
|
|
47
|
+
starting_index = body_data.get("starting_content_index")
|
|
48
|
+
if starting_index is None:
|
|
49
|
+
starting_index = body_data.get("last_content_index")
|
|
50
|
+
if starting_index is not None:
|
|
51
|
+
try:
|
|
52
|
+
self._unified_content_index = max(0, int(starting_index))
|
|
53
|
+
except (TypeError, ValueError):
|
|
54
|
+
self._unified_content_index = 0
|
|
55
|
+
|
|
56
|
+
if hasattr(self, "_unified_content_index") and self._unified_content_index > 0:
|
|
57
|
+
body_data["starting_content_index"] = self._unified_content_index
|
|
58
|
+
logging.info(
|
|
59
|
+
"[AGENT-V2-PROXY] Continuing conversation with starting_content_index: "
|
|
60
|
+
f"{self._unified_content_index}"
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
body_data["client_version"] = client_version
|
|
64
|
+
|
|
65
|
+
headers = {
|
|
66
|
+
"Content-Type": "application/json",
|
|
67
|
+
"Authorization": f"Bearer {user_token}",
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
try:
|
|
71
|
+
ssl_context = ssl.create_default_context(cafile=certifi.where())
|
|
72
|
+
except Exception as exc:
|
|
73
|
+
logging.warning(
|
|
74
|
+
f"[AGENT-V2-PROXY] Failed to create SSL context with certifi: {exc}"
|
|
75
|
+
)
|
|
76
|
+
ssl_context = ssl.create_default_context()
|
|
77
|
+
|
|
78
|
+
connector = aiohttp.TCPConnector(ssl=ssl_context)
|
|
79
|
+
|
|
80
|
+
async with aiohttp.ClientSession(connector=connector) as session:
|
|
81
|
+
async with session.post(remote_url, json=body_data, headers=headers) as response:
|
|
82
|
+
if response.status != 200:
|
|
83
|
+
error_text = await response.text()
|
|
84
|
+
logging.error(
|
|
85
|
+
f"[AGENT-V2-PROXY] Remote backend error {response.status}: {error_text}"
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
error_data = json.loads(error_text)
|
|
90
|
+
error_status = error_data.get("status", "error")
|
|
91
|
+
error_message = error_data.get("error", error_text)
|
|
92
|
+
|
|
93
|
+
if response.status == 401:
|
|
94
|
+
self.set_status(401)
|
|
95
|
+
self.finish(
|
|
96
|
+
json.dumps(
|
|
97
|
+
{
|
|
98
|
+
"error": "Authentication failed. Please log in again.",
|
|
99
|
+
"status": "auth_error",
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
)
|
|
103
|
+
elif response.status == 402:
|
|
104
|
+
self.set_status(402)
|
|
105
|
+
self.finish(
|
|
106
|
+
json.dumps(
|
|
107
|
+
{
|
|
108
|
+
"error": error_message,
|
|
109
|
+
"status": "insufficient_credits",
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
)
|
|
113
|
+
else:
|
|
114
|
+
self.set_status(response.status)
|
|
115
|
+
self.finish(
|
|
116
|
+
json.dumps(
|
|
117
|
+
{"error": error_message, "status": error_status}
|
|
118
|
+
)
|
|
119
|
+
)
|
|
120
|
+
except json.JSONDecodeError:
|
|
121
|
+
self.set_status(response.status)
|
|
122
|
+
self.finish(
|
|
123
|
+
json.dumps(
|
|
124
|
+
{
|
|
125
|
+
"error": f"Remote backend error: {error_text}",
|
|
126
|
+
"status": "error",
|
|
127
|
+
}
|
|
128
|
+
)
|
|
129
|
+
)
|
|
130
|
+
return
|
|
131
|
+
|
|
132
|
+
if stream:
|
|
133
|
+
if not hasattr(self, "_unified_content_index"):
|
|
134
|
+
self._unified_content_index = 0
|
|
135
|
+
|
|
136
|
+
pending_tool_data = await self._handle_streaming_response(
|
|
137
|
+
response, self._unified_content_index
|
|
138
|
+
)
|
|
139
|
+
if pending_tool_data:
|
|
140
|
+
self._unified_content_index = pending_tool_data.get(
|
|
141
|
+
"max_content_index", self._unified_content_index
|
|
142
|
+
)
|
|
143
|
+
await self._handle_pending_tool_call(
|
|
144
|
+
pending_tool_data, body_data, user_token
|
|
145
|
+
)
|
|
146
|
+
else:
|
|
147
|
+
response_data = await response.json()
|
|
148
|
+
self.finish(json.dumps(response_data))
|
|
149
|
+
|
|
150
|
+
except aiohttp.ClientConnectorError as exc:
|
|
151
|
+
logging.error(
|
|
152
|
+
"[AGENT-V2-PROXY] Cannot connect to remote backend at "
|
|
153
|
+
f"{self.remote_backend_url}: {exc}"
|
|
154
|
+
)
|
|
155
|
+
self.set_status(503)
|
|
156
|
+
self.finish(
|
|
157
|
+
json.dumps(
|
|
158
|
+
{
|
|
159
|
+
"error": (
|
|
160
|
+
"Cannot connect to agent v2 remote backend. "
|
|
161
|
+
f"Please ensure the remote backend server is running at {self.remote_backend_url}"
|
|
162
|
+
),
|
|
163
|
+
"status": "error",
|
|
164
|
+
}
|
|
165
|
+
)
|
|
166
|
+
)
|
|
167
|
+
except Exception as exc:
|
|
168
|
+
logging.error(f"[AGENT-V2-PROXY] Error forwarding to remote backend: {exc}")
|
|
169
|
+
self.set_status(500)
|
|
170
|
+
self.finish(json.dumps({"error": str(exc), "status": "error"}))
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class AIAgentV2SessionProxyHandler(AIChatProxyHandler):
|
|
174
|
+
"""Proxy handler for agent v2 session endpoints."""
|
|
175
|
+
|
|
176
|
+
@web.authenticated
|
|
177
|
+
async def get(self):
|
|
178
|
+
user_token = await self.get_user_token() or self.get_test_token_from_env()
|
|
179
|
+
if not user_token:
|
|
180
|
+
self.set_status(401)
|
|
181
|
+
self.finish(
|
|
182
|
+
json.dumps(
|
|
183
|
+
{
|
|
184
|
+
"error": "Authentication required. Please log in again.",
|
|
185
|
+
"status": "auth_required",
|
|
186
|
+
}
|
|
187
|
+
)
|
|
188
|
+
)
|
|
189
|
+
return
|
|
190
|
+
|
|
191
|
+
remote_url = f"{self.remote_backend_url}/v2/agent/session"
|
|
192
|
+
headers = {
|
|
193
|
+
"Content-Type": "application/json",
|
|
194
|
+
"Authorization": f"Bearer {user_token}",
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
try:
|
|
198
|
+
ssl_context = ssl.create_default_context(cafile=certifi.where())
|
|
199
|
+
except Exception as exc:
|
|
200
|
+
logging.warning(
|
|
201
|
+
f"[AGENT-V2-PROXY] Failed to create SSL context with certifi: {exc}"
|
|
202
|
+
)
|
|
203
|
+
ssl_context = ssl.create_default_context()
|
|
204
|
+
|
|
205
|
+
connector = aiohttp.TCPConnector(ssl=ssl_context)
|
|
206
|
+
async with aiohttp.ClientSession(connector=connector) as session:
|
|
207
|
+
async with session.get(remote_url, params=self.request.query, headers=headers) as response:
|
|
208
|
+
payload_text = await response.text()
|
|
209
|
+
if response.status != 200:
|
|
210
|
+
self.set_status(response.status)
|
|
211
|
+
self.finish(payload_text)
|
|
212
|
+
return
|
|
213
|
+
self.finish(payload_text)
|
|
214
|
+
|
|
215
|
+
@web.authenticated
|
|
216
|
+
async def post(self):
|
|
217
|
+
user_token = await self.get_user_token() or self.get_test_token_from_env()
|
|
218
|
+
if not user_token:
|
|
219
|
+
self.set_status(401)
|
|
220
|
+
self.finish(
|
|
221
|
+
json.dumps(
|
|
222
|
+
{
|
|
223
|
+
"error": "Authentication required. Please log in again.",
|
|
224
|
+
"status": "auth_required",
|
|
225
|
+
}
|
|
226
|
+
)
|
|
227
|
+
)
|
|
228
|
+
return
|
|
229
|
+
|
|
230
|
+
try:
|
|
231
|
+
body_data = json.loads(self.request.body.decode("utf-8")) if self.request.body else {}
|
|
232
|
+
except Exception:
|
|
233
|
+
body_data = {}
|
|
234
|
+
|
|
235
|
+
remote_url = f"{self.remote_backend_url}/v2/agent/session"
|
|
236
|
+
headers = {
|
|
237
|
+
"Content-Type": "application/json",
|
|
238
|
+
"Authorization": f"Bearer {user_token}",
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
try:
|
|
242
|
+
ssl_context = ssl.create_default_context(cafile=certifi.where())
|
|
243
|
+
except Exception as exc:
|
|
244
|
+
logging.warning(
|
|
245
|
+
f"[AGENT-V2-PROXY] Failed to create SSL context with certifi: {exc}"
|
|
246
|
+
)
|
|
247
|
+
ssl_context = ssl.create_default_context()
|
|
248
|
+
|
|
249
|
+
connector = aiohttp.TCPConnector(ssl=ssl_context)
|
|
250
|
+
async with aiohttp.ClientSession(connector=connector) as session:
|
|
251
|
+
async with session.post(remote_url, json=body_data, headers=headers) as response:
|
|
252
|
+
payload_text = await response.text()
|
|
253
|
+
if response.status != 200:
|
|
254
|
+
self.set_status(response.status)
|
|
255
|
+
self.finish(payload_text)
|
|
256
|
+
return
|
|
257
|
+
self.finish(payload_text)
|
|
258
|
+
|
|
259
|
+
async def options(self):
|
|
260
|
+
self.set_header("Access-Control-Allow-Origin", "*")
|
|
261
|
+
self.set_header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
|
|
262
|
+
self.set_header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-User-Token")
|
|
263
|
+
self.set_status(200)
|
|
@@ -25,13 +25,26 @@ from typing import Dict, Any, Optional
|
|
|
25
25
|
from jupyter_server.base.handlers import APIHandler
|
|
26
26
|
from tornado import web
|
|
27
27
|
|
|
28
|
-
from ..utils import build_remote_backend_url
|
|
28
|
+
from ..utils import build_remote_backend_url, get_server_url_from_handler
|
|
29
29
|
from ..auth.token_handler import get_current_user_token_string
|
|
30
30
|
from ..tools.registry import run_ask_tool
|
|
31
31
|
from .._version import __version__ as client_version
|
|
32
|
+
from ..agent.image_processor import ImageProcessor
|
|
32
33
|
|
|
33
34
|
logging.basicConfig(level=logging.INFO)
|
|
34
35
|
|
|
36
|
+
FRONTEND_NOTEBOOK_TOOLS = {
|
|
37
|
+
"cell_execute",
|
|
38
|
+
"edit_cell",
|
|
39
|
+
"edit_markdown_cell",
|
|
40
|
+
"insert_markdown_cell",
|
|
41
|
+
"insert_cell",
|
|
42
|
+
"run_cell",
|
|
43
|
+
"delete_cell",
|
|
44
|
+
"open_tab",
|
|
45
|
+
"rerun_all_cells",
|
|
46
|
+
}
|
|
47
|
+
|
|
35
48
|
|
|
36
49
|
class AIChatProxyHandler(APIHandler):
|
|
37
50
|
"""Proxy handler for AI chat requests that forwards to remote backend."""
|
|
@@ -43,6 +56,10 @@ class AIChatProxyHandler(APIHandler):
|
|
|
43
56
|
|
|
44
57
|
logging.info(f"[CHAT-PROXY] Initialized with remote backend: {self.remote_backend_url}")
|
|
45
58
|
logging.info("[CHAT-PROXY] Token authentication enabled - will forward tokens to remote backend")
|
|
59
|
+
|
|
60
|
+
# Lazily initialized when we first need to process cell images.
|
|
61
|
+
self._image_processor: ImageProcessor | None = None
|
|
62
|
+
self._image_processor_connection_id: str | None = None
|
|
46
63
|
|
|
47
64
|
async def get_user_token(self) -> Optional[str]:
|
|
48
65
|
"""
|
|
@@ -429,10 +446,79 @@ class AIChatProxyHandler(APIHandler):
|
|
|
429
446
|
self.write(f"data: {event_text}\n\n")
|
|
430
447
|
await self.flush()
|
|
431
448
|
|
|
449
|
+
def _normalize_frontend_tool_args(
|
|
450
|
+
self, tool_name: str, tool_args: Dict[str, Any]
|
|
451
|
+
) -> tuple[Dict[str, Any], str | None]:
|
|
452
|
+
"""Normalize frontend tool args so Jupyter contents paths are used."""
|
|
453
|
+
if not tool_args or tool_name not in FRONTEND_NOTEBOOK_TOOLS:
|
|
454
|
+
return tool_args, None
|
|
455
|
+
|
|
456
|
+
normalized = dict(tool_args)
|
|
457
|
+
file_path = normalized.get("file_path")
|
|
458
|
+
if file_path:
|
|
459
|
+
resolved_path, error_message = self._resolve_contents_path(file_path)
|
|
460
|
+
if error_message:
|
|
461
|
+
return {}, error_message
|
|
462
|
+
normalized["file_path"] = resolved_path
|
|
463
|
+
return normalized, None
|
|
464
|
+
|
|
465
|
+
def _resolve_contents_path(self, file_path: str) -> tuple[str, str | None]:
|
|
466
|
+
"""Convert absolute filesystem paths to Jupyter contents paths when possible."""
|
|
467
|
+
from ..agent.path_utils import resolve_contents_path
|
|
468
|
+
|
|
469
|
+
root_dir = getattr(getattr(self, "contents_manager", None), "root_dir", None)
|
|
470
|
+
if not root_dir:
|
|
471
|
+
contents_manager = self.settings.get("contents_manager")
|
|
472
|
+
root_dir = getattr(contents_manager, "root_dir", None) if contents_manager else None
|
|
473
|
+
if not root_dir:
|
|
474
|
+
root_dir = (
|
|
475
|
+
self.settings.get("server_root_dir")
|
|
476
|
+
or self.settings.get("root_dir")
|
|
477
|
+
or os.getcwd()
|
|
478
|
+
)
|
|
479
|
+
return resolve_contents_path(file_path, root_dir)
|
|
480
|
+
|
|
481
|
+
def _get_image_processor(self, connection_id: str | None) -> ImageProcessor:
|
|
482
|
+
"""Create/reuse an ImageProcessor for replacing base64 image outputs."""
|
|
483
|
+
if not self._image_processor or self._image_processor_connection_id != connection_id:
|
|
484
|
+
server_url = get_server_url_from_handler(
|
|
485
|
+
self,
|
|
486
|
+
fallback=os.environ.get("SERVER_URL", "http://localhost:8888"),
|
|
487
|
+
)
|
|
488
|
+
self._image_processor = ImageProcessor(connection_id or "unknown", server_url)
|
|
489
|
+
self._image_processor_connection_id = connection_id
|
|
490
|
+
return self._image_processor
|
|
491
|
+
|
|
492
|
+
async def _replace_base64_images(
|
|
493
|
+
self,
|
|
494
|
+
tool_name: str,
|
|
495
|
+
tool_result: Any,
|
|
496
|
+
sse_output: Any,
|
|
497
|
+
connection_id: str | None,
|
|
498
|
+
) -> tuple[Any, Any]:
|
|
499
|
+
"""Replace base64 image payloads with URLs for notebook tool outputs."""
|
|
500
|
+
if tool_name not in FRONTEND_NOTEBOOK_TOOLS:
|
|
501
|
+
return tool_result, sse_output
|
|
502
|
+
|
|
503
|
+
processor = None
|
|
504
|
+
|
|
505
|
+
if isinstance(tool_result, str) and '"image/png"' in tool_result:
|
|
506
|
+
processor = self._get_image_processor(connection_id)
|
|
507
|
+
tool_result = await processor.replace_base64_with_urls(tool_result)
|
|
508
|
+
|
|
509
|
+
if isinstance(sse_output, str) and '"image/png"' in sse_output:
|
|
510
|
+
if processor is None:
|
|
511
|
+
processor = self._get_image_processor(connection_id)
|
|
512
|
+
sse_output = await processor.replace_base64_with_urls(sse_output)
|
|
513
|
+
|
|
514
|
+
return tool_result, sse_output
|
|
515
|
+
|
|
432
516
|
async def _handle_pending_tool_call(self, pending_data: Dict[str, Any], body_data: Dict[str, Any], user_token: str):
|
|
433
517
|
"""Execute local tools and continue the conversation with the remote backend."""
|
|
434
|
-
|
|
435
|
-
|
|
518
|
+
client_tool_calls = pending_data.get('tool_calls', []) or []
|
|
519
|
+
server_tool_calls = pending_data.get('server_tool_calls', []) or []
|
|
520
|
+
server_tool_results = pending_data.get('server_tool_results', []) or []
|
|
521
|
+
if not client_tool_calls and not server_tool_calls:
|
|
436
522
|
logging.warning("[CHAT-PROXY] Pending tool payload without tool_calls")
|
|
437
523
|
return
|
|
438
524
|
|
|
@@ -448,7 +534,7 @@ class AIChatProxyHandler(APIHandler):
|
|
|
448
534
|
thinking_blocks = deepcopy(thinking_blocks)
|
|
449
535
|
|
|
450
536
|
assistant_tool_calls = []
|
|
451
|
-
for tool_call in
|
|
537
|
+
for tool_call in server_tool_calls + client_tool_calls:
|
|
452
538
|
function_info = tool_call.get('function', {}) or {}
|
|
453
539
|
assistant_tool_calls.append({
|
|
454
540
|
'id': tool_call.get('id', ''),
|
|
@@ -477,7 +563,16 @@ class AIChatProxyHandler(APIHandler):
|
|
|
477
563
|
|
|
478
564
|
messages.append(assistant_message)
|
|
479
565
|
|
|
480
|
-
|
|
566
|
+
if server_tool_results:
|
|
567
|
+
for idx, tool_result in enumerate(server_tool_results):
|
|
568
|
+
call_id = tool_result.get('tool_call_id') or tool_result.get('call_id') or f'server_tool_call_{idx}'
|
|
569
|
+
messages.append({
|
|
570
|
+
'role': 'tool',
|
|
571
|
+
'tool_call_id': call_id,
|
|
572
|
+
'content': tool_result.get('content', '')
|
|
573
|
+
})
|
|
574
|
+
|
|
575
|
+
for idx, tool_call in enumerate(client_tool_calls):
|
|
481
576
|
function_info = tool_call.get('function', {}) or {}
|
|
482
577
|
tool_name = function_info.get('name', '')
|
|
483
578
|
raw_arguments = function_info.get('arguments', '') or ''
|
|
@@ -487,14 +582,35 @@ class AIChatProxyHandler(APIHandler):
|
|
|
487
582
|
except json.JSONDecodeError:
|
|
488
583
|
logging.warning(f"[CHAT-PROXY] Failed to parse tool arguments for {tool_name}: {raw_arguments}")
|
|
489
584
|
parsed_args = {}
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
585
|
+
# Inject connection_id for tools that require frontend WebSocket (e.g., cell_execute).
|
|
586
|
+
if 'connection_id' not in parsed_args:
|
|
587
|
+
# This comes from the ask-mode local-only WS established by the frontend.
|
|
588
|
+
parsed_args['connection_id'] = body_data.get('connection_id')
|
|
589
|
+
|
|
590
|
+
normalized_args, error_message = self._normalize_frontend_tool_args(
|
|
591
|
+
tool_name, parsed_args
|
|
592
|
+
)
|
|
593
|
+
if error_message:
|
|
594
|
+
logging.warning(
|
|
595
|
+
f"[CHAT-PROXY] Path resolution error for {tool_name}: {error_message}"
|
|
596
|
+
)
|
|
597
|
+
tool_result = error_message
|
|
494
598
|
sse_output = tool_result
|
|
495
599
|
else:
|
|
496
|
-
|
|
497
|
-
|
|
600
|
+
tool_run = await run_ask_tool(tool_name, normalized_args)
|
|
601
|
+
if tool_run is None:
|
|
602
|
+
tool_result = f"Error: Unsupported tool '{tool_name}' in ask mode"
|
|
603
|
+
sse_output = tool_result
|
|
604
|
+
else:
|
|
605
|
+
tool_result = tool_run["llm_output"]
|
|
606
|
+
sse_output = tool_run["sse_output"]
|
|
607
|
+
|
|
608
|
+
tool_result, sse_output = await self._replace_base64_images(
|
|
609
|
+
tool_name,
|
|
610
|
+
tool_result,
|
|
611
|
+
sse_output,
|
|
612
|
+
body_data.get("connection_id"),
|
|
613
|
+
)
|
|
498
614
|
|
|
499
615
|
call_id = tool_call.get('id', f'tool_call_{idx}')
|
|
500
616
|
|