sage-agent-internal 0.1.63__py3-none-any.whl → 0.1.64__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. sage_agent_internal/_version.py +1 -1
  2. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/package.json +2 -2
  3. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/schemas/sage-agent-internal/package.json.orig +1 -1
  4. sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/remoteEntry.b1557564c45d0cbda0ba.js → sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/remoteEntry.0478493c2818d7503d7f.js +1 -1
  5. sage_agent_internal-0.1.64.dist-info/METADATA +209 -0
  6. {sage_agent_internal-0.1.63.dist-info → sage_agent_internal-0.1.64.dist-info}/RECORD +32 -32
  7. sage_agent_internal-0.1.63.dist-info/METADATA +0 -154
  8. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/install.json +0 -0
  9. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/schemas/sage-agent-internal/plugin.json +0 -0
  10. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/122.3c2c200586e65203b674.js +0 -0
  11. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/220.d384edfd5bbcfda33a2a.js +0 -0
  12. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/262.3fc4ad88e6f8c273d4ad.js +0 -0
  13. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/353.2c285601a208c3735929.js +0 -0
  14. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/363.d6c25400a011b62fbae6.js +0 -0
  15. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/364.c2fb82c6f484097228c6.js +0 -0
  16. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/439.3cb9ac7022c8a6074647.js +0 -0
  17. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/481.96b91d018df31d54d173.js +0 -0
  18. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/553.b7906877d98a62265533.js +0 -0
  19. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/553.b7906877d98a62265533.js.LICENSE.txt +0 -0
  20. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/635.8c395c854aa2b140b668.js +0 -0
  21. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/713.103cb5ae248be385b08a.js +0 -0
  22. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/742.b204789055ded4e07883.js +0 -0
  23. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/747.b8e9485ebcbb3066eb4b.js +0 -0
  24. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/821.b58f29814f5900f1f6f8.js +0 -0
  25. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/833.1509794f6b586558f96c.js +0 -0
  26. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/845.cc2bc80fbfea6d20a396.js +0 -0
  27. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/888.09382cc93a2ad3932b31.js +0 -0
  28. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/973.38ee5148a3908e41c2dd.js +0 -0
  29. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/973.38ee5148a3908e41c2dd.js.LICENSE.txt +0 -0
  30. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/style.js +0 -0
  31. {sage_agent_internal-0.1.63.data → sage_agent_internal-0.1.64.data}/data/share/jupyter/labextensions/sage-agent-internal/static/third-party-licenses.json +0 -0
  32. {sage_agent_internal-0.1.63.dist-info → sage_agent_internal-0.1.64.dist-info}/WHEEL +0 -0
  33. {sage_agent_internal-0.1.63.dist-info → sage_agent_internal-0.1.64.dist-info}/licenses/LICENSE +0 -0
@@ -1,4 +1,4 @@
1
1
  # This file is auto-generated by Hatchling. As such, do not:
2
2
  # - modify
3
3
  # - track in version control e.g. be sure to add to .gitignore
4
- __version__ = VERSION = '0.1.63'
4
+ __version__ = VERSION = '0.1.64'
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sage-agent-internal",
3
- "version": "0.1.63",
3
+ "version": "0.1.64",
4
4
  "description": "Sage Agent - Your Jupyter Notebook Assistant",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -126,7 +126,7 @@
126
126
  "outputDir": "sage_agent_internal/labextension",
127
127
  "schemaDir": "schema",
128
128
  "_build": {
129
- "load": "static/remoteEntry.b1557564c45d0cbda0ba.js",
129
+ "load": "static/remoteEntry.0478493c2818d7503d7f.js",
130
130
  "extension": "./extension",
131
131
  "style": "./style"
132
132
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sage-agent-internal",
3
- "version": "0.1.63",
3
+ "version": "0.1.64",
4
4
  "description": "Sage Agent - Your Jupyter Notebook Assistant",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -1 +1 @@
1
- var _JUPYTERLAB;(()=>{"use strict";var e,r,t,a,n,o,i,f,l,d,u,c,s,p,h,b,m,g,v,y,j,w,P,k,S,O={484:(e,r,t)=>{var a={"./index":()=>Promise.all([t.e(353),t.e(747),t.e(122),t.e(973),t.e(760),t.e(345),t.e(379),t.e(839),t.e(833)]).then(()=>()=>t(4387)),"./extension":()=>Promise.all([t.e(353),t.e(747),t.e(122),t.e(973),t.e(760),t.e(345),t.e(379),t.e(839),t.e(833)]).then(()=>()=>t(4387)),"./style":()=>t.e(363).then(()=>()=>t(8363))},n=(e,r)=>(t.R=r,r=t.o(a,e)?a[e]():Promise.resolve().then(()=>{throw new Error('Module "'+e+'" does not exist in container.')}),t.R=void 0,r),o=(e,r)=>{if(t.S){var a="default",n=t.S[a];if(n&&n!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return t.S[a]=e,t.I(a,r)}};t.d(r,{get:()=>n,init:()=>o})}},x={};function _(e){var r=x[e];if(void 0!==r)return r.exports;var t=x[e]={id:e,exports:{}};return O[e].call(t.exports,t,t.exports,_),t.exports}_.m=O,_.c=x,_.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return _.d(r,{a:r}),r},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,_.t=function(t,a){if(1&a&&(t=this(t)),8&a)return t;if("object"==typeof t&&t){if(4&a&&t.__esModule)return t;if(16&a&&"function"==typeof t.then)return t}var n=Object.create(null);_.r(n);var o={};e=e||[null,r({}),r([]),r(r)];for(var i=2&a&&t;("object"==typeof i||"function"==typeof i)&&!~e.indexOf(i);i=r(i))Object.getOwnPropertyNames(i).forEach(e=>o[e]=()=>t[e]);return o.default=()=>t,_.d(n,o),n},_.d=(e,r)=>{for(var t in r)_.o(r,t)&&!_.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},_.f={},_.e=e=>Promise.all(Object.keys(_.f).reduce((r,t)=>(_.f[t](e,r),r),[])),_.u=e=>e+"."+{122:"3c2c200586e65203b674",220:"d384edfd5bbcfda33a2a",262:"3fc4ad88e6f8c273d4ad",353:"2c285601a208c3735929",363:"d6c25400a011b62fbae6",364:"c2fb82c6f484097228c6",439:"3cb9ac7022c8a6074647",481:"96b91d018df31d54d173",553:"b7906877d98a62265533",635:"8c395c854aa2b140b668",713:"103cb5ae248be385b08a",742:"b204789055ded4e07883",747:"b8e9485ebcbb3066eb4b",821:"b58f29814f5900f1f6f8",833:"1509794f6b586558f96c",845:"cc2bc80fbfea6d20a396",888:"09382cc93a2ad3932b31",973:"38ee5148a3908e41c2dd"}[e]+".js?v="+{122:"3c2c200586e65203b674",220:"d384edfd5bbcfda33a2a",262:"3fc4ad88e6f8c273d4ad",353:"2c285601a208c3735929",363:"d6c25400a011b62fbae6",364:"c2fb82c6f484097228c6",439:"3cb9ac7022c8a6074647",481:"96b91d018df31d54d173",553:"b7906877d98a62265533",635:"8c395c854aa2b140b668",713:"103cb5ae248be385b08a",742:"b204789055ded4e07883",747:"b8e9485ebcbb3066eb4b",821:"b58f29814f5900f1f6f8",833:"1509794f6b586558f96c",845:"cc2bc80fbfea6d20a396",888:"09382cc93a2ad3932b31",973:"38ee5148a3908e41c2dd"}[e],_.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),_.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t={},a="sage-agent-internal:",_.l=(e,r,n,o)=>{if(t[e])t[e].push(r);else{var i,f;if(void 0!==n)for(var l=document.getElementsByTagName("script"),d=0;d<l.length;d++){var u=l[d];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==a+n){i=u;break}}i||(f=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,_.nc&&i.setAttribute("nonce",_.nc),i.setAttribute("data-webpack",a+n),i.src=e),t[e]=[r];var c=(r,a)=>{i.onerror=i.onload=null,clearTimeout(s);var n=t[e];if(delete t[e],i.parentNode&&i.parentNode.removeChild(i),n&&n.forEach(e=>e(a)),r)return r(a)},s=setTimeout(c.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=c.bind(null,i.onerror),i.onload=c.bind(null,i.onload),f&&document.head.appendChild(i)}},_.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{_.S={};var e={},r={};_.I=(t,a)=>{a||(a=[]);var n=r[t];if(n||(n=r[t]={}),!(a.indexOf(n)>=0)){if(a.push(n),e[t])return e[t];_.o(_.S,t)||(_.S[t]={});var o=_.S[t],i="sage-agent-internal",f=(e,r,t,a)=>{var n=o[e]=o[e]||{},f=n[r];(!f||!f.loaded&&(!a!=!f.eager?a:i>f.from))&&(n[r]={get:t,from:i,eager:!!a})},l=[];return"default"===t&&(f("@anthropic-ai/sdk","0.54.0",()=>_.e(742).then(()=>()=>_(2742))),f("best-effort-json-parser","1.2.1",()=>_.e(439).then(()=>()=>_(7820))),f("codemirror-merge-alpinex","6.10.4",()=>Promise.all([_.e(353),_.e(635),_.e(760),_.e(839)]).then(()=>()=>_(7635))),f("codemirror","6.0.2",()=>Promise.all([_.e(353),_.e(821),_.e(747),_.e(760)]).then(()=>()=>_(8821))),f("diff2html","3.4.52",()=>Promise.all([_.e(122),_.e(379)]).then(()=>()=>_(2122))),f("diff","7.0.0",()=>_.e(713).then(()=>()=>_(5713))),f("diff","0",()=>_.e(481).then(()=>()=>_(7481))),f("marked","15.0.12",()=>_.e(364).then(()=>()=>_(4364))),f("partial-json","0.1.7",()=>_.e(220).then(()=>()=>_(9220))),f("react-bootstrap","2.10.10",()=>Promise.all([_.e(553),_.e(345),_.e(628)]).then(()=>()=>_(4553))),f("rxjs","7.8.2",()=>_.e(888).then(()=>()=>_(2888))),f("sage-agent-internal","0.1.63",()=>Promise.all([_.e(353),_.e(747),_.e(122),_.e(973),_.e(760),_.e(345),_.e(379),_.e(839),_.e(833)]).then(()=>()=>_(4387))),f("uuid","11.1.0",()=>_.e(262).then(()=>()=>_(8262)))),e[t]=l.length?Promise.all(l).then(()=>e[t]=1):1}}})(),(()=>{var e;_.g.importScripts&&(e=_.g.location+"");var r=_.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var a=t.length-1;a>-1&&(!e||!/^http(s?):/.test(e));)e=t[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),_.p=e})(),n=e=>{var r=e=>e.split(".").map(e=>+e==e?+e:e),t=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),a=t[1]?r(t[1]):[];return t[2]&&(a.length++,a.push.apply(a,r(t[2]))),t[3]&&(a.push([]),a.push.apply(a,r(t[3]))),a},o=(e,r)=>{e=n(e),r=n(r);for(var t=0;;){if(t>=e.length)return t<r.length&&"u"!=(typeof r[t])[0];var a=e[t],o=(typeof a)[0];if(t>=r.length)return"u"==o;var i=r[t],f=(typeof i)[0];if(o!=f)return"o"==o&&"n"==f||"s"==f||"u"==o;if("o"!=o&&"u"!=o&&a!=i)return a<i;t++}},i=e=>{var r=e[0],t="";if(1===e.length)return"*";if(r+.5){t+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var a=1,n=1;n<e.length;n++)a--,t+="u"==(typeof(f=e[n]))[0]?"-":(a>0?".":"")+(a=2,f);return t}var o=[];for(n=1;n<e.length;n++){var f=e[n];o.push(0===f?"not("+l()+")":1===f?"("+l()+" || "+l()+")":2===f?o.pop()+" "+o.pop():i(f))}return l();function l(){return o.pop().replace(/^\((.+)\)$/,"$1")}},f=(e,r)=>{if(0 in e){r=n(r);var t=e[0],a=t<0;a&&(t=-t-1);for(var o=0,i=1,l=!0;;i++,o++){var d,u,c=i<e.length?(typeof e[i])[0]:"";if(o>=r.length||"o"==(u=(typeof(d=r[o]))[0]))return!l||("u"==c?i>t&&!a:""==c!=a);if("u"==u){if(!l||"u"!=c)return!1}else if(l)if(c==u)if(i<=t){if(d!=e[i])return!1}else{if(a?d>e[i]:d<e[i])return!1;d!=e[i]&&(l=!1)}else if("s"!=c&&"n"!=c){if(a||i<=t)return!1;l=!1,i--}else{if(i<=t||u<c!=a)return!1;l=!1}else"s"!=c&&"n"!=c&&(l=!1,i--)}}var s=[],p=s.pop.bind(s);for(o=1;o<e.length;o++){var h=e[o];s.push(1==h?p()|p():2==h?p()&p():h?f(h,r):!p())}return!!p()},l=(e,r)=>e&&_.o(e,r),d=e=>(e.loaded=1,e.get()),u=e=>Object.keys(e).reduce((r,t)=>(e[t].eager&&(r[t]=e[t]),r),{}),c=(e,r,t,a)=>{var n=a?u(e[r]):e[r];return(r=Object.keys(n).reduce((e,r)=>!f(t,r)||e&&!o(e,r)?e:r,0))&&n[r]},s=(e,r,t)=>{var a=t?u(e[r]):e[r];return Object.keys(a).reduce((e,r)=>!e||!a[e].loaded&&o(e,r)?r:e,0)},p=(e,r,t,a)=>"Unsatisfied version "+t+" from "+(t&&e[r][t].from)+" of shared singleton module "+r+" (required "+i(a)+")",h=(e,r,t,a,n)=>{var o=e[t];return"No satisfying version ("+i(a)+")"+(n?" for eager consumption":"")+" of shared module "+t+" found in shared scope "+r+".\nAvailable versions: "+Object.keys(o).map(e=>e+" from "+o[e].from).join(", ")},b=e=>{throw new Error(e)},m=e=>{"undefined"!=typeof console&&console.warn&&console.warn(e)},v=(e,r,t)=>t?t():((e,r)=>b("Shared module "+r+" doesn't exist in shared scope "+e))(e,r),y=(g=e=>function(r,t,a,n,o){var i=_.I(r);return i&&i.then&&!a?i.then(e.bind(e,r,_.S[r],t,!1,n,o)):e(r,_.S[r],t,a,n,o)})((e,r,t,a,n,o)=>{if(!l(r,t))return v(e,t,o);var i=c(r,t,n,a);return i?d(i):o?o():void b(h(r,e,t,n,a))}),j=g((e,r,t,a,n,o)=>{if(!l(r,t))return v(e,t,o);var i=s(r,t,a);return f(n,i)||m(p(r,t,i,n)),d(r[t][i])}),w={},P={195:()=>j("default","@codemirror/state",!1,[1,6,2,0]),2084:()=>j("default","@codemirror/language",!1,[1,6,0,0]),3708:()=>j("default","@lezer/common",!1,[1,1,0,0]),5024:()=>j("default","@codemirror/view",!1,[1,6,9,6]),3345:()=>j("default","react",!1,[1,18,2,0]),3379:()=>y("default","diff",!1,[1,7,0,0],()=>_.e(713).then(()=>()=>_(5713))),1839:()=>j("default","@lezer/highlight",!1,[1,1,0,0]),113:()=>y("default","diff",!1,[1,8,0,1],()=>_.e(481).then(()=>()=>_(7481))),135:()=>y("default","@anthropic-ai/sdk",!1,[2,0,54,0],()=>_.e(742).then(()=>()=>_(2742))),1017:()=>j("default","@jupyterlab/extensionmanager",!1,[1,4,4,5]),1336:()=>y("default","diff2html",!1,[1,3,4,51],()=>()=>_(2122)),2311:()=>y("default","react-bootstrap",!1,[1,2,10,10],()=>Promise.all([_.e(553),_.e(628)]).then(()=>()=>_(4553))),2912:()=>j("default","@jupyterlab/settingregistry",!1,[1,4,4,5]),3020:()=>j("default","@jupyterlab/statedb",!1,[1,4,4,5]),3139:()=>y("default","codemirror-merge-alpinex",!1,[1,6,10,4],()=>_.e(635).then(()=>()=>_(7635))),3550:()=>y("default","marked",!1,[1,15,0,11],()=>_.e(364).then(()=>()=>_(4364))),4602:()=>j("default","@lumino/signaling",!1,[1,2,0,0]),4744:()=>y("default","uuid",!1,[1,11,1,0],()=>_.e(262).then(()=>()=>_(8262))),5256:()=>j("default","@lumino/widgets",!1,[1,2,3,1,,"alpha",0]),5611:()=>j("default","@jupyterlab/codemirror",!1,[1,4,4,5]),6750:()=>y("default","rxjs",!1,[1,7,8,2],()=>_.e(888).then(()=>()=>_(2888))),7332:()=>y("default","codemirror",!1,[1,6,0,2],()=>_.e(821).then(()=>()=>_(8821))),7570:()=>y("default","partial-json",!1,[2,0,1,7],()=>_.e(220).then(()=>()=>_(9220))),8276:()=>y("default","best-effort-json-parser",!1,[1,1,1,3],()=>_.e(439).then(()=>()=>_(7820))),9246:()=>j("default","@jupyterlab/apputils",!1,[1,4,5,5]),9346:()=>j("default","@jupyterlab/ui-components",!1,[1,4,4,5]),9598:()=>j("default","@jupyterlab/notebook",!1,[1,4,4,5]),7628:()=>j("default","react-dom",!1,[1,18,2,0])},k={345:[3345],379:[3379],628:[7628],760:[195,2084,3708,5024],833:[113,135,1017,1336,2311,2912,3020,3139,3550,4602,4744,5256,5611,6750,7332,7570,8276,9246,9346,9598],839:[1839]},S={},_.f.consumes=(e,r)=>{_.o(k,e)&&k[e].forEach(e=>{if(_.o(w,e))return r.push(w[e]);if(!S[e]){var t=r=>{w[e]=0,_.m[e]=t=>{delete _.c[e],t.exports=r()}};S[e]=!0;var a=r=>{delete w[e],_.m[e]=t=>{throw delete _.c[e],r}};try{var n=P[e]();n.then?r.push(w[e]=n.then(t).catch(a)):t(n)}catch(e){a(e)}}})},(()=>{_.b=document.baseURI||self.location.href;var e={431:0};_.f.j=(r,t)=>{var a=_.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else if(/^(345|379|628|760|839)$/.test(r))e[r]=0;else{var n=new Promise((t,n)=>a=e[r]=[t,n]);t.push(a[2]=n);var o=_.p+_.u(r),i=new Error;_.l(o,t=>{if(_.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+n+": "+o+")",i.name="ChunkLoadError",i.type=n,i.request=o,a[1](i)}},"chunk-"+r,r)}};var r=(r,t)=>{var a,n,[o,i,f]=t,l=0;if(o.some(r=>0!==e[r])){for(a in i)_.o(i,a)&&(_.m[a]=i[a]);f&&f(_)}for(r&&r(t);l<o.length;l++)n=o[l],_.o(e,n)&&e[n]&&e[n][0](),e[n]=0},t=self.webpackChunksage_agent_internal=self.webpackChunksage_agent_internal||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),_.nc=void 0;var E=_(484);(_JUPYTERLAB=void 0===_JUPYTERLAB?{}:_JUPYTERLAB)["sage-agent-internal"]=E})();
1
+ var _JUPYTERLAB;(()=>{"use strict";var e,r,t,a,n,o,i,f,l,d,u,c,s,p,h,b,m,g,v,y,j,w,P,k,S,O={484:(e,r,t)=>{var a={"./index":()=>Promise.all([t.e(353),t.e(747),t.e(122),t.e(973),t.e(760),t.e(345),t.e(379),t.e(839),t.e(833)]).then(()=>()=>t(4387)),"./extension":()=>Promise.all([t.e(353),t.e(747),t.e(122),t.e(973),t.e(760),t.e(345),t.e(379),t.e(839),t.e(833)]).then(()=>()=>t(4387)),"./style":()=>t.e(363).then(()=>()=>t(8363))},n=(e,r)=>(t.R=r,r=t.o(a,e)?a[e]():Promise.resolve().then(()=>{throw new Error('Module "'+e+'" does not exist in container.')}),t.R=void 0,r),o=(e,r)=>{if(t.S){var a="default",n=t.S[a];if(n&&n!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return t.S[a]=e,t.I(a,r)}};t.d(r,{get:()=>n,init:()=>o})}},x={};function _(e){var r=x[e];if(void 0!==r)return r.exports;var t=x[e]={id:e,exports:{}};return O[e].call(t.exports,t,t.exports,_),t.exports}_.m=O,_.c=x,_.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return _.d(r,{a:r}),r},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,_.t=function(t,a){if(1&a&&(t=this(t)),8&a)return t;if("object"==typeof t&&t){if(4&a&&t.__esModule)return t;if(16&a&&"function"==typeof t.then)return t}var n=Object.create(null);_.r(n);var o={};e=e||[null,r({}),r([]),r(r)];for(var i=2&a&&t;("object"==typeof i||"function"==typeof i)&&!~e.indexOf(i);i=r(i))Object.getOwnPropertyNames(i).forEach(e=>o[e]=()=>t[e]);return o.default=()=>t,_.d(n,o),n},_.d=(e,r)=>{for(var t in r)_.o(r,t)&&!_.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},_.f={},_.e=e=>Promise.all(Object.keys(_.f).reduce((r,t)=>(_.f[t](e,r),r),[])),_.u=e=>e+"."+{122:"3c2c200586e65203b674",220:"d384edfd5bbcfda33a2a",262:"3fc4ad88e6f8c273d4ad",353:"2c285601a208c3735929",363:"d6c25400a011b62fbae6",364:"c2fb82c6f484097228c6",439:"3cb9ac7022c8a6074647",481:"96b91d018df31d54d173",553:"b7906877d98a62265533",635:"8c395c854aa2b140b668",713:"103cb5ae248be385b08a",742:"b204789055ded4e07883",747:"b8e9485ebcbb3066eb4b",821:"b58f29814f5900f1f6f8",833:"1509794f6b586558f96c",845:"cc2bc80fbfea6d20a396",888:"09382cc93a2ad3932b31",973:"38ee5148a3908e41c2dd"}[e]+".js?v="+{122:"3c2c200586e65203b674",220:"d384edfd5bbcfda33a2a",262:"3fc4ad88e6f8c273d4ad",353:"2c285601a208c3735929",363:"d6c25400a011b62fbae6",364:"c2fb82c6f484097228c6",439:"3cb9ac7022c8a6074647",481:"96b91d018df31d54d173",553:"b7906877d98a62265533",635:"8c395c854aa2b140b668",713:"103cb5ae248be385b08a",742:"b204789055ded4e07883",747:"b8e9485ebcbb3066eb4b",821:"b58f29814f5900f1f6f8",833:"1509794f6b586558f96c",845:"cc2bc80fbfea6d20a396",888:"09382cc93a2ad3932b31",973:"38ee5148a3908e41c2dd"}[e],_.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),_.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t={},a="sage-agent-internal:",_.l=(e,r,n,o)=>{if(t[e])t[e].push(r);else{var i,f;if(void 0!==n)for(var l=document.getElementsByTagName("script"),d=0;d<l.length;d++){var u=l[d];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==a+n){i=u;break}}i||(f=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,_.nc&&i.setAttribute("nonce",_.nc),i.setAttribute("data-webpack",a+n),i.src=e),t[e]=[r];var c=(r,a)=>{i.onerror=i.onload=null,clearTimeout(s);var n=t[e];if(delete t[e],i.parentNode&&i.parentNode.removeChild(i),n&&n.forEach(e=>e(a)),r)return r(a)},s=setTimeout(c.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=c.bind(null,i.onerror),i.onload=c.bind(null,i.onload),f&&document.head.appendChild(i)}},_.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{_.S={};var e={},r={};_.I=(t,a)=>{a||(a=[]);var n=r[t];if(n||(n=r[t]={}),!(a.indexOf(n)>=0)){if(a.push(n),e[t])return e[t];_.o(_.S,t)||(_.S[t]={});var o=_.S[t],i="sage-agent-internal",f=(e,r,t,a)=>{var n=o[e]=o[e]||{},f=n[r];(!f||!f.loaded&&(!a!=!f.eager?a:i>f.from))&&(n[r]={get:t,from:i,eager:!!a})},l=[];return"default"===t&&(f("@anthropic-ai/sdk","0.54.0",()=>_.e(742).then(()=>()=>_(2742))),f("best-effort-json-parser","1.2.1",()=>_.e(439).then(()=>()=>_(7820))),f("codemirror-merge-alpinex","6.10.4",()=>Promise.all([_.e(353),_.e(635),_.e(760),_.e(839)]).then(()=>()=>_(7635))),f("codemirror","6.0.2",()=>Promise.all([_.e(353),_.e(821),_.e(747),_.e(760)]).then(()=>()=>_(8821))),f("diff2html","3.4.52",()=>Promise.all([_.e(122),_.e(379)]).then(()=>()=>_(2122))),f("diff","7.0.0",()=>_.e(713).then(()=>()=>_(5713))),f("diff","0",()=>_.e(481).then(()=>()=>_(7481))),f("marked","15.0.12",()=>_.e(364).then(()=>()=>_(4364))),f("partial-json","0.1.7",()=>_.e(220).then(()=>()=>_(9220))),f("react-bootstrap","2.10.10",()=>Promise.all([_.e(553),_.e(345),_.e(628)]).then(()=>()=>_(4553))),f("rxjs","7.8.2",()=>_.e(888).then(()=>()=>_(2888))),f("sage-agent-internal","0.1.64",()=>Promise.all([_.e(353),_.e(747),_.e(122),_.e(973),_.e(760),_.e(345),_.e(379),_.e(839),_.e(833)]).then(()=>()=>_(4387))),f("uuid","11.1.0",()=>_.e(262).then(()=>()=>_(8262)))),e[t]=l.length?Promise.all(l).then(()=>e[t]=1):1}}})(),(()=>{var e;_.g.importScripts&&(e=_.g.location+"");var r=_.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var a=t.length-1;a>-1&&(!e||!/^http(s?):/.test(e));)e=t[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),_.p=e})(),n=e=>{var r=e=>e.split(".").map(e=>+e==e?+e:e),t=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),a=t[1]?r(t[1]):[];return t[2]&&(a.length++,a.push.apply(a,r(t[2]))),t[3]&&(a.push([]),a.push.apply(a,r(t[3]))),a},o=(e,r)=>{e=n(e),r=n(r);for(var t=0;;){if(t>=e.length)return t<r.length&&"u"!=(typeof r[t])[0];var a=e[t],o=(typeof a)[0];if(t>=r.length)return"u"==o;var i=r[t],f=(typeof i)[0];if(o!=f)return"o"==o&&"n"==f||"s"==f||"u"==o;if("o"!=o&&"u"!=o&&a!=i)return a<i;t++}},i=e=>{var r=e[0],t="";if(1===e.length)return"*";if(r+.5){t+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var a=1,n=1;n<e.length;n++)a--,t+="u"==(typeof(f=e[n]))[0]?"-":(a>0?".":"")+(a=2,f);return t}var o=[];for(n=1;n<e.length;n++){var f=e[n];o.push(0===f?"not("+l()+")":1===f?"("+l()+" || "+l()+")":2===f?o.pop()+" "+o.pop():i(f))}return l();function l(){return o.pop().replace(/^\((.+)\)$/,"$1")}},f=(e,r)=>{if(0 in e){r=n(r);var t=e[0],a=t<0;a&&(t=-t-1);for(var o=0,i=1,l=!0;;i++,o++){var d,u,c=i<e.length?(typeof e[i])[0]:"";if(o>=r.length||"o"==(u=(typeof(d=r[o]))[0]))return!l||("u"==c?i>t&&!a:""==c!=a);if("u"==u){if(!l||"u"!=c)return!1}else if(l)if(c==u)if(i<=t){if(d!=e[i])return!1}else{if(a?d>e[i]:d<e[i])return!1;d!=e[i]&&(l=!1)}else if("s"!=c&&"n"!=c){if(a||i<=t)return!1;l=!1,i--}else{if(i<=t||u<c!=a)return!1;l=!1}else"s"!=c&&"n"!=c&&(l=!1,i--)}}var s=[],p=s.pop.bind(s);for(o=1;o<e.length;o++){var h=e[o];s.push(1==h?p()|p():2==h?p()&p():h?f(h,r):!p())}return!!p()},l=(e,r)=>e&&_.o(e,r),d=e=>(e.loaded=1,e.get()),u=e=>Object.keys(e).reduce((r,t)=>(e[t].eager&&(r[t]=e[t]),r),{}),c=(e,r,t,a)=>{var n=a?u(e[r]):e[r];return(r=Object.keys(n).reduce((e,r)=>!f(t,r)||e&&!o(e,r)?e:r,0))&&n[r]},s=(e,r,t)=>{var a=t?u(e[r]):e[r];return Object.keys(a).reduce((e,r)=>!e||!a[e].loaded&&o(e,r)?r:e,0)},p=(e,r,t,a)=>"Unsatisfied version "+t+" from "+(t&&e[r][t].from)+" of shared singleton module "+r+" (required "+i(a)+")",h=(e,r,t,a,n)=>{var o=e[t];return"No satisfying version ("+i(a)+")"+(n?" for eager consumption":"")+" of shared module "+t+" found in shared scope "+r+".\nAvailable versions: "+Object.keys(o).map(e=>e+" from "+o[e].from).join(", ")},b=e=>{throw new Error(e)},m=e=>{"undefined"!=typeof console&&console.warn&&console.warn(e)},v=(e,r,t)=>t?t():((e,r)=>b("Shared module "+r+" doesn't exist in shared scope "+e))(e,r),y=(g=e=>function(r,t,a,n,o){var i=_.I(r);return i&&i.then&&!a?i.then(e.bind(e,r,_.S[r],t,!1,n,o)):e(r,_.S[r],t,a,n,o)})((e,r,t,a,n,o)=>{if(!l(r,t))return v(e,t,o);var i=c(r,t,n,a);return i?d(i):o?o():void b(h(r,e,t,n,a))}),j=g((e,r,t,a,n,o)=>{if(!l(r,t))return v(e,t,o);var i=s(r,t,a);return f(n,i)||m(p(r,t,i,n)),d(r[t][i])}),w={},P={195:()=>j("default","@codemirror/state",!1,[1,6,2,0]),2084:()=>j("default","@codemirror/language",!1,[1,6,0,0]),3708:()=>j("default","@lezer/common",!1,[1,1,0,0]),5024:()=>j("default","@codemirror/view",!1,[1,6,9,6]),3345:()=>j("default","react",!1,[1,18,2,0]),3379:()=>y("default","diff",!1,[1,7,0,0],()=>_.e(713).then(()=>()=>_(5713))),1839:()=>j("default","@lezer/highlight",!1,[1,1,0,0]),113:()=>y("default","diff",!1,[1,8,0,1],()=>_.e(481).then(()=>()=>_(7481))),135:()=>y("default","@anthropic-ai/sdk",!1,[2,0,54,0],()=>_.e(742).then(()=>()=>_(2742))),1017:()=>j("default","@jupyterlab/extensionmanager",!1,[1,4,4,5]),1336:()=>y("default","diff2html",!1,[1,3,4,51],()=>()=>_(2122)),2311:()=>y("default","react-bootstrap",!1,[1,2,10,10],()=>Promise.all([_.e(553),_.e(628)]).then(()=>()=>_(4553))),2912:()=>j("default","@jupyterlab/settingregistry",!1,[1,4,4,5]),3020:()=>j("default","@jupyterlab/statedb",!1,[1,4,4,5]),3139:()=>y("default","codemirror-merge-alpinex",!1,[1,6,10,4],()=>_.e(635).then(()=>()=>_(7635))),3550:()=>y("default","marked",!1,[1,15,0,11],()=>_.e(364).then(()=>()=>_(4364))),4602:()=>j("default","@lumino/signaling",!1,[1,2,0,0]),4744:()=>y("default","uuid",!1,[1,11,1,0],()=>_.e(262).then(()=>()=>_(8262))),5256:()=>j("default","@lumino/widgets",!1,[1,2,3,1,,"alpha",0]),5611:()=>j("default","@jupyterlab/codemirror",!1,[1,4,4,5]),6750:()=>y("default","rxjs",!1,[1,7,8,2],()=>_.e(888).then(()=>()=>_(2888))),7332:()=>y("default","codemirror",!1,[1,6,0,2],()=>_.e(821).then(()=>()=>_(8821))),7570:()=>y("default","partial-json",!1,[2,0,1,7],()=>_.e(220).then(()=>()=>_(9220))),8276:()=>y("default","best-effort-json-parser",!1,[1,1,1,3],()=>_.e(439).then(()=>()=>_(7820))),9246:()=>j("default","@jupyterlab/apputils",!1,[1,4,5,5]),9346:()=>j("default","@jupyterlab/ui-components",!1,[1,4,4,5]),9598:()=>j("default","@jupyterlab/notebook",!1,[1,4,4,5]),7628:()=>j("default","react-dom",!1,[1,18,2,0])},k={345:[3345],379:[3379],628:[7628],760:[195,2084,3708,5024],833:[113,135,1017,1336,2311,2912,3020,3139,3550,4602,4744,5256,5611,6750,7332,7570,8276,9246,9346,9598],839:[1839]},S={},_.f.consumes=(e,r)=>{_.o(k,e)&&k[e].forEach(e=>{if(_.o(w,e))return r.push(w[e]);if(!S[e]){var t=r=>{w[e]=0,_.m[e]=t=>{delete _.c[e],t.exports=r()}};S[e]=!0;var a=r=>{delete w[e],_.m[e]=t=>{throw delete _.c[e],r}};try{var n=P[e]();n.then?r.push(w[e]=n.then(t).catch(a)):t(n)}catch(e){a(e)}}})},(()=>{_.b=document.baseURI||self.location.href;var e={431:0};_.f.j=(r,t)=>{var a=_.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else if(/^(345|379|628|760|839)$/.test(r))e[r]=0;else{var n=new Promise((t,n)=>a=e[r]=[t,n]);t.push(a[2]=n);var o=_.p+_.u(r),i=new Error;_.l(o,t=>{if(_.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+n+": "+o+")",i.name="ChunkLoadError",i.type=n,i.request=o,a[1](i)}},"chunk-"+r,r)}};var r=(r,t)=>{var a,n,[o,i,f]=t,l=0;if(o.some(r=>0!==e[r])){for(a in i)_.o(i,a)&&(_.m[a]=i[a]);f&&f(_)}for(r&&r(t);l<o.length;l++)n=o[l],_.o(e,n)&&e[n]&&e[n][0](),e[n]=0},t=self.webpackChunksage_agent_internal=self.webpackChunksage_agent_internal||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),_.nc=void 0;var E=_(484);(_JUPYTERLAB=void 0===_JUPYTERLAB?{}:_JUPYTERLAB)["sage-agent-internal"]=E})();
@@ -0,0 +1,209 @@
1
+ Metadata-Version: 2.4
2
+ Name: sage_agent_internal
3
+ Version: 0.1.64
4
+ Summary: Sage Agent - Your Jupyter Notebook Assistant
5
+ Project-URL: Homepage, https://github.com/AlpineX-Labs/jupyter-sage-agent-internal
6
+ Project-URL: Bug Tracker, https://github.com/AlpineX-Labs/jupyter-sage-agent-internal/issues
7
+ Project-URL: Repository, https://github.com/AlpineX-Labs/jupyter-sage-agent-internal.git
8
+ Author-email: Daniel Schaffield <danielschaffield@gmail.com>
9
+ License: BSD 3-Clause License
10
+
11
+ Copyright (c) 2025, Daniel Schaffield
12
+ All rights reserved.
13
+
14
+ Redistribution and use in source and binary forms, with or without
15
+ modification, are permitted provided that the following conditions are met:
16
+
17
+ 1. Redistributions of source code must retain the above copyright notice, this
18
+ list of conditions and the following disclaimer.
19
+
20
+ 2. Redistributions in binary form must reproduce the above copyright notice,
21
+ this list of conditions and the following disclaimer in the documentation
22
+ and/or other materials provided with the distribution.
23
+
24
+ 3. Neither the name of the copyright holder nor the names of its
25
+ contributors may be used to endorse or promote products derived from
26
+ this software without specific prior written permission.
27
+
28
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
31
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
32
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
34
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
35
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
36
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38
+ License-File: LICENSE
39
+ Keywords: jupyter,jupyterlab,jupyterlab-extension
40
+ Classifier: Framework :: Jupyter
41
+ Classifier: Framework :: Jupyter :: JupyterLab
42
+ Classifier: Framework :: Jupyter :: JupyterLab :: 4
43
+ Classifier: Framework :: Jupyter :: JupyterLab :: Extensions
44
+ Classifier: Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt
45
+ Classifier: License :: OSI Approved :: BSD License
46
+ Classifier: Programming Language :: Python
47
+ Classifier: Programming Language :: Python :: 3
48
+ Classifier: Programming Language :: Python :: 3.6
49
+ Classifier: Programming Language :: Python :: 3.9
50
+ Classifier: Programming Language :: Python :: 3.10
51
+ Classifier: Programming Language :: Python :: 3.11
52
+ Classifier: Programming Language :: Python :: 3.12
53
+ Classifier: Programming Language :: Python :: 3.13
54
+ Requires-Python: >=3.6
55
+ Description-Content-Type: text/markdown
56
+
57
+ # **Sage Agent — The AI-Powered Assistant for Jupyter Notebooks**
58
+
59
+ ![Logo](https://i.imgur.com/JdA8ilQ.png)
60
+
61
+ ---
62
+
63
+ ## **What is Sage Agent?**
64
+
65
+ **Sage is an AI-native notebook assistant that supercharges your existing Jupyter workflows.**
66
+
67
+ Built by leading AI and quant researchers from YC, Harvard, MIT, and Goldman Sachs, Sage brings real-time, context-aware assistance directly into JupyterLab.
68
+
69
+ Use natural language to clean data, write analysis code, debug errors, explore dataframes, and build models—faster and with fewer mistakes.
70
+
71
+ **No hallucinated code. No context switching. Just faster insights.**
72
+
73
+ ---
74
+
75
+ ## **Why Use Sage Agent in Jupyter?**
76
+
77
+ Whether you’re a quant, data scientist, or analyst living in notebooks, Sage helps you:
78
+
79
+ ✅ Clean and transform messy data in seconds
80
+
81
+ ✅ Visualize trends, rollups, and anomalies from a prompt
82
+
83
+ ✅ Connect your custom databases in one click and easily explore from notebooks
84
+
85
+ ✅ Generate *runnable* Python or SQL that fits your current cell + variable context
86
+
87
+ ✅ Auto-detect schema changes and debug downstream errors
88
+
89
+ ✅ Stay private: run entirely *local-first* or in your own secure VPC
90
+
91
+ ✅ Extend JupyterLab without changing how you work
92
+
93
+ ---
94
+
95
+ ## **Perfect For:**
96
+
97
+ - Data scientists cleaning huge CSVs
98
+ - Quant researchers testing ML pipelines
99
+ - Product and analytics teams tired of building dashboards and flaky notebooks
100
+ - Anyone tired of LLM tools that break their code
101
+
102
+ ---
103
+
104
+ ## **Installation**
105
+
106
+ ### **📦 Requirements**
107
+
108
+ - JupyterLab >= 4.0.0
109
+ - NodeJS (for development)
110
+
111
+ ### **🧠 Install Sage Agent:**
112
+
113
+ ```
114
+ pip install jupyterlab sage_agent_internal
115
+ ```
116
+
117
+ ### **❌ Uninstall:**
118
+
119
+ ```
120
+ pip uninstall sage_agent_internal
121
+ ```
122
+
123
+ ---
124
+
125
+ ## **How to Get Started**
126
+
127
+ To unlock full functionality, you’ll need Sage API credentials.
128
+
129
+ 👉 [**Request your API key**](https://sagebook.ai/#contact) or email us at [contact@sagebook.ai](mailto:contact@sagebook.ai)
130
+
131
+ ---
132
+
133
+ ## **Why Sage**
134
+
135
+ - ✅ Context-aware code gen: understands variables, dataframes, imports, and prior cells
136
+ - ✅ AI that *fixes* schema issues and silent join bugs
137
+ - ✅ Inline review + diffs before you run any code
138
+ - ✅ Visualizations via natural language (matplotlib, plotly, seaborn supported)
139
+ - ✅ BYO LLM: Anthropic, OpenAI, vLLM, Ollama, or HF endpoints
140
+ - ✅ Built to run in air-gapped / enterprise environments
141
+
142
+ ---
143
+
144
+ ## **Local Development Instructions**
145
+
146
+ To contribute or develop locally:
147
+
148
+ ```
149
+ # Clone the repo and enter the directory
150
+ git clone https://github.com/sagebook/sage_agent_internal.git
151
+ cd sage_agent_internal
152
+
153
+ # Install in editable mode
154
+ pip install -e "."
155
+
156
+ # Link extension to JupyterLab
157
+ jupyter labextension develop . --overwrite
158
+
159
+ # Rebuild on changes
160
+ jlpm build
161
+ ```
162
+
163
+ For auto-rebuild while editing:
164
+
165
+ ```
166
+ # Watch source
167
+ jlpm watch
168
+
169
+ # Run JupyterLab in parallel
170
+ jupyter lab
171
+ ```
172
+
173
+ ---
174
+
175
+ ## **Uninstall in Dev Mode**
176
+
177
+ ```
178
+ pip uninstall sage_agent_internal
179
+ # Then manually remove labextension symlink from JupyterLab extensions dir.
180
+ ```
181
+
182
+ ---
183
+
184
+ ## **Want to See Sage in Action?**
185
+
186
+ 🎥 Try the demo notebook or explore at [https://sagebook.ai](https://sagebook.ai/)
187
+
188
+ ---
189
+
190
+ **Built for teams working with sensitive data:**
191
+
192
+ - Zero data retention by default
193
+ - Optional BYO keys for Claude, OpenAI, or local models
194
+ - Notebook-specific controls for what the model can “see”
195
+ - Fine-grained telemetry settings
196
+
197
+ ---
198
+
199
+ ## **Contact**
200
+
201
+ Questions? Ideas?
202
+
203
+ Email: [fahim@sagebook.ai](mailto:fahim@sagebook.ai)
204
+
205
+ Website: [https://sagebook.ai](https://sagebook.ai/)
206
+
207
+ ---
208
+
209
+ AI Jupyter Notebook, JupyterLab Extension, Jupyter Assistant, Data Science Assistant, Jupyter LLM, AI code generation, dataframe cleaning, Jupyter AI, Sagebook, Sage Agent, AI for dataframes, Jupyter SQL assistant, notebook extension
@@ -1,33 +1,33 @@
1
1
  sage_agent_internal/__init__.py,sha256=z-Pn063QfYmwK-9kH5_BN9Z2uSk5u3sQXNllD6al8b8,596
2
- sage_agent_internal/_version.py,sha256=iRIaQ_hnXErrGntsFcu75aIu9b_p3lmJlWXZ2XTWsK4,172
3
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/package.json,sha256=HP3Mxm6VmGhMdxFflJAi7mGMGvZ6PRiDGRJO3_9ttWI,7004
4
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/schemas/sage-agent-internal/package.json.orig,sha256=Hiud6-1C4mjW_Sty3MYswOabfH9lF1YYMx-oUg33pgY,6862
5
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/schemas/sage-agent-internal/plugin.json,sha256=7VfTvZ601zqObvsaQ8Zk9y_2VKE1oGLsammktVQIMgw,2817
6
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/122.3c2c200586e65203b674.js,sha256=PCwgBYbmUgO2dFng8LGMNSz0jGMKBQUC-UpqtMw7PN4,38168
7
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/220.d384edfd5bbcfda33a2a.js,sha256=04Tt_Vu8_aM6KqXmXrmFguzAklVgzab_4lxR1FvWdrA,3897
8
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/262.3fc4ad88e6f8c273d4ad.js,sha256=P8StiOb4wnPUrQsuTC7cno93JZUBlbjaaOukMxyuils,10170
9
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/353.2c285601a208c3735929.js,sha256=LChWAaIIw3NZKWZYW2i8X271Zmq1t482JMUUvBkdJmI,23008
10
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/363.d6c25400a011b62fbae6.js,sha256=1sJUAKARti-65uBLwpsthZscX70F82-20Xie4AvyZnI,140688
11
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/364.c2fb82c6f484097228c6.js,sha256=wvuCxvSECXIoxh0upDST76jJQjk-xjTXh0RzHg0STck,39400
12
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/439.3cb9ac7022c8a6074647.js,sha256=PLmscCLIpgdGRynyTjUTpmaTPZjs-3WuXQYkaL956ec,3000
13
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/481.96b91d018df31d54d173.js,sha256=lrkdAY3zHVTRc2lhypYtybDdF-wPCBuYlZiH3qt6n-Q,17250
14
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/553.b7906877d98a62265533.js,sha256=qRzBmMWB0OQT7Mu4hWcdn8JooyRxgxUhikuT2FgEGcs,119497
15
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/553.b7906877d98a62265533.js.LICENSE.txt,sha256=LGdwyBXWbtsopwVyjsXCIwoc-zj70yxAOCOR7b1bAc4,371
16
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/635.8c395c854aa2b140b668.js,sha256=jDlchUqisUC2aMQgfgTjrfHtyC2yR0Za684u1QZvatU,33633
17
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/713.103cb5ae248be385b08a.js,sha256=EDy1riSL44WwiiWrz4BZPXevm5dYFFmI9Xi_ZqH1LrU,23323
18
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/742.b204789055ded4e07883.js,sha256=sgR4kFXe1OB4g3RDa1tEIwNajGuhUvar1IVGaatP0wU,57578
19
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/747.b8e9485ebcbb3066eb4b.js,sha256=uOlIXry7MGbrS_n1SdkE0IDLeuZ2TdTwQIHO0wreEIk,35290
20
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/821.b58f29814f5900f1f6f8.js,sha256=tY8pgU9ZAPH2-PGJ0ZiAPXYUVpqItMlmhnvVAHWnYuc,33541
21
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/833.1509794f6b586558f96c.js,sha256=FQl5T2tYZVj5bOkDUwH11mxrDDLvY4JwUhmSVKDQ7xY,536047
22
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/845.cc2bc80fbfea6d20a396.js,sha256=zCvID7_qbSCjll7h_vZTM3rSZWN2f0IBM2tACfo9DhI,1169960
23
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/888.09382cc93a2ad3932b31.js,sha256=CTgsyToq05MrMWa4zvhJAkUdWJg8Ws3sV3--zUvrX4w,65937
24
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/973.38ee5148a3908e41c2dd.js,sha256=LlcD8xFL25gGhx7e9wTJ7X7ooNfspP0LJv6pgs90rvg,1464213
25
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/973.38ee5148a3908e41c2dd.js.LICENSE.txt,sha256=e5rXKlIVk9PRn8cQPr8kfCfz1Paakt2urafpaM7lFGg,95
26
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/remoteEntry.b1557564c45d0cbda0ba.js,sha256=sVV1ZMRdDL2guk2j3tRO_1akLZZxFFl4hsCzTSDj0rI,11678
27
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/style.js,sha256=mixPzdTcSgfmCSXY72yxDmr75rcb-UVPnByKhOqaECs,162
28
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/static/third-party-licenses.json,sha256=TT9WlH0aFMuVvUXl_-IbI8-2e9IqTmwfk4xabDoU_r8,94352
29
- sage_agent_internal-0.1.63.data/data/share/jupyter/labextensions/sage-agent-internal/install.json,sha256=tOq3PpNHsSu4w3uXumqHHPGh-IwkX1tgcRgq9u6HmCA,199
30
- sage_agent_internal-0.1.63.dist-info/METADATA,sha256=7yyygeR7zYS3HoX6YuL6FQ_SrNvnq7VWrUWBoXRRzgM,6202
31
- sage_agent_internal-0.1.63.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
32
- sage_agent_internal-0.1.63.dist-info/licenses/LICENSE,sha256=zsSUFnbKwCesfRSafkOcXkQGrMFo6zQ8LHlOt-MYHDY,1525
33
- sage_agent_internal-0.1.63.dist-info/RECORD,,
2
+ sage_agent_internal/_version.py,sha256=qOYk-C3JrFmu6CTMpHZOmq6r19V1j-aUVTyHj_r6YCg,172
3
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/package.json,sha256=7itOOSkx-BbUJjLHKIyBVAa1g6iSdaHvjF764o-e1so,7004
4
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/schemas/sage-agent-internal/package.json.orig,sha256=k7XfOabz9oxtAaT6OSrk6PcdhpKtPcQs3DgsXucHEy4,6862
5
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/schemas/sage-agent-internal/plugin.json,sha256=7VfTvZ601zqObvsaQ8Zk9y_2VKE1oGLsammktVQIMgw,2817
6
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/122.3c2c200586e65203b674.js,sha256=PCwgBYbmUgO2dFng8LGMNSz0jGMKBQUC-UpqtMw7PN4,38168
7
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/220.d384edfd5bbcfda33a2a.js,sha256=04Tt_Vu8_aM6KqXmXrmFguzAklVgzab_4lxR1FvWdrA,3897
8
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/262.3fc4ad88e6f8c273d4ad.js,sha256=P8StiOb4wnPUrQsuTC7cno93JZUBlbjaaOukMxyuils,10170
9
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/353.2c285601a208c3735929.js,sha256=LChWAaIIw3NZKWZYW2i8X271Zmq1t482JMUUvBkdJmI,23008
10
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/363.d6c25400a011b62fbae6.js,sha256=1sJUAKARti-65uBLwpsthZscX70F82-20Xie4AvyZnI,140688
11
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/364.c2fb82c6f484097228c6.js,sha256=wvuCxvSECXIoxh0upDST76jJQjk-xjTXh0RzHg0STck,39400
12
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/439.3cb9ac7022c8a6074647.js,sha256=PLmscCLIpgdGRynyTjUTpmaTPZjs-3WuXQYkaL956ec,3000
13
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/481.96b91d018df31d54d173.js,sha256=lrkdAY3zHVTRc2lhypYtybDdF-wPCBuYlZiH3qt6n-Q,17250
14
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/553.b7906877d98a62265533.js,sha256=qRzBmMWB0OQT7Mu4hWcdn8JooyRxgxUhikuT2FgEGcs,119497
15
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/553.b7906877d98a62265533.js.LICENSE.txt,sha256=LGdwyBXWbtsopwVyjsXCIwoc-zj70yxAOCOR7b1bAc4,371
16
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/635.8c395c854aa2b140b668.js,sha256=jDlchUqisUC2aMQgfgTjrfHtyC2yR0Za684u1QZvatU,33633
17
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/713.103cb5ae248be385b08a.js,sha256=EDy1riSL44WwiiWrz4BZPXevm5dYFFmI9Xi_ZqH1LrU,23323
18
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/742.b204789055ded4e07883.js,sha256=sgR4kFXe1OB4g3RDa1tEIwNajGuhUvar1IVGaatP0wU,57578
19
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/747.b8e9485ebcbb3066eb4b.js,sha256=uOlIXry7MGbrS_n1SdkE0IDLeuZ2TdTwQIHO0wreEIk,35290
20
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/821.b58f29814f5900f1f6f8.js,sha256=tY8pgU9ZAPH2-PGJ0ZiAPXYUVpqItMlmhnvVAHWnYuc,33541
21
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/833.1509794f6b586558f96c.js,sha256=FQl5T2tYZVj5bOkDUwH11mxrDDLvY4JwUhmSVKDQ7xY,536047
22
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/845.cc2bc80fbfea6d20a396.js,sha256=zCvID7_qbSCjll7h_vZTM3rSZWN2f0IBM2tACfo9DhI,1169960
23
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/888.09382cc93a2ad3932b31.js,sha256=CTgsyToq05MrMWa4zvhJAkUdWJg8Ws3sV3--zUvrX4w,65937
24
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/973.38ee5148a3908e41c2dd.js,sha256=LlcD8xFL25gGhx7e9wTJ7X7ooNfspP0LJv6pgs90rvg,1464213
25
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/973.38ee5148a3908e41c2dd.js.LICENSE.txt,sha256=e5rXKlIVk9PRn8cQPr8kfCfz1Paakt2urafpaM7lFGg,95
26
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/remoteEntry.0478493c2818d7503d7f.js,sha256=BHhJPCgY11A9f75Q2I6WnGhqhe0O5yw8wQruXe6jGoU,11678
27
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/style.js,sha256=mixPzdTcSgfmCSXY72yxDmr75rcb-UVPnByKhOqaECs,162
28
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/static/third-party-licenses.json,sha256=TT9WlH0aFMuVvUXl_-IbI8-2e9IqTmwfk4xabDoU_r8,94352
29
+ sage_agent_internal-0.1.64.data/data/share/jupyter/labextensions/sage-agent-internal/install.json,sha256=tOq3PpNHsSu4w3uXumqHHPGh-IwkX1tgcRgq9u6HmCA,199
30
+ sage_agent_internal-0.1.64.dist-info/METADATA,sha256=AFAulSzTvqR1_0faBinnExCPvkXu4hua6AEp8em_Pe8,6791
31
+ sage_agent_internal-0.1.64.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
32
+ sage_agent_internal-0.1.64.dist-info/licenses/LICENSE,sha256=zsSUFnbKwCesfRSafkOcXkQGrMFo6zQ8LHlOt-MYHDY,1525
33
+ sage_agent_internal-0.1.64.dist-info/RECORD,,
@@ -1,154 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: sage_agent_internal
3
- Version: 0.1.63
4
- Summary: Sage Agent - Your Jupyter Notebook Assistant
5
- Project-URL: Homepage, https://github.com/AlpineX-Labs/jupyter-sage-agent-internal
6
- Project-URL: Bug Tracker, https://github.com/AlpineX-Labs/jupyter-sage-agent-internal/issues
7
- Project-URL: Repository, https://github.com/AlpineX-Labs/jupyter-sage-agent-internal.git
8
- Author-email: Daniel Schaffield <danielschaffield@gmail.com>
9
- License: BSD 3-Clause License
10
-
11
- Copyright (c) 2025, Daniel Schaffield
12
- All rights reserved.
13
-
14
- Redistribution and use in source and binary forms, with or without
15
- modification, are permitted provided that the following conditions are met:
16
-
17
- 1. Redistributions of source code must retain the above copyright notice, this
18
- list of conditions and the following disclaimer.
19
-
20
- 2. Redistributions in binary form must reproduce the above copyright notice,
21
- this list of conditions and the following disclaimer in the documentation
22
- and/or other materials provided with the distribution.
23
-
24
- 3. Neither the name of the copyright holder nor the names of its
25
- contributors may be used to endorse or promote products derived from
26
- this software without specific prior written permission.
27
-
28
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
31
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
32
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
34
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
35
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
36
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38
- License-File: LICENSE
39
- Keywords: jupyter,jupyterlab,jupyterlab-extension
40
- Classifier: Framework :: Jupyter
41
- Classifier: Framework :: Jupyter :: JupyterLab
42
- Classifier: Framework :: Jupyter :: JupyterLab :: 4
43
- Classifier: Framework :: Jupyter :: JupyterLab :: Extensions
44
- Classifier: Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt
45
- Classifier: License :: OSI Approved :: BSD License
46
- Classifier: Programming Language :: Python
47
- Classifier: Programming Language :: Python :: 3
48
- Classifier: Programming Language :: Python :: 3.6
49
- Classifier: Programming Language :: Python :: 3.9
50
- Classifier: Programming Language :: Python :: 3.10
51
- Classifier: Programming Language :: Python :: 3.11
52
- Classifier: Programming Language :: Python :: 3.12
53
- Classifier: Programming Language :: Python :: 3.13
54
- Requires-Python: >=3.6
55
- Description-Content-Type: text/markdown
56
-
57
- # sage_agent_internal
58
-
59
- [![Github Actions Status](https://github.com/AlpineX-Labs/jupyter-sage-agent-internal/workflows/Build/badge.svg)](https://github.com/AlpineX-Labs/jupyter-sage-agent-internal/actions/workflows/build.yml)
60
- [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/AlpineX-Labs/jupyter-sage-agent-internal/main?urlpath=lab)
61
-
62
- Sage Agent - Your Jupyter Notebook Assistant
63
-
64
- ## Requirements
65
-
66
- - JupyterLab >= 4.0.0
67
-
68
- ## Install
69
-
70
- To install the extension, execute:
71
-
72
- ```bash
73
- pip install sage_agent_internal
74
- ```
75
-
76
- ## Uninstall
77
-
78
- To remove the extension, execute:
79
-
80
- ```bash
81
- pip uninstall sage_agent_internal
82
- ```
83
-
84
- ## Contributing
85
-
86
- ### Development install
87
-
88
- Note: You will need NodeJS to build the extension package.
89
-
90
- The `jlpm` command is JupyterLab's pinned version of
91
- [yarn](https://yarnpkg.com/) that is installed with JupyterLab. You may use
92
- `yarn` or `npm` in lieu of `jlpm` below.
93
-
94
- ```bash
95
- # Clone the repo to your local environment
96
- # Change directory to the sage_agent_internal directory
97
- # Install package in development mode
98
- pip install -e "."
99
- # Link your development version of the extension with JupyterLab
100
- jupyter labextension develop . --overwrite
101
- # Rebuild extension Typescript source after making changes
102
- jlpm build
103
- ```
104
-
105
- You can watch the source directory and run JupyterLab at the same time in different terminals to watch for changes in the extension's source and automatically rebuild the extension.
106
-
107
- ```bash
108
- # Watch the source directory in one terminal, automatically rebuilding when needed
109
- jlpm watch
110
- # Run JupyterLab in another terminal
111
- jupyter lab
112
- ```
113
-
114
- With the watch command running, every saved change will immediately be built locally and available in your running JupyterLab. Refresh JupyterLab to load the change in your browser (you may need to wait several seconds for the extension to be rebuilt).
115
-
116
- By default, the `jlpm build` command generates the source maps for this extension to make it easier to debug using the browser dev tools. To also generate source maps for the JupyterLab core extensions, you can run the following command:
117
-
118
- ```bash
119
- jupyter lab build --minimize=False
120
- ```
121
-
122
- ### Development uninstall
123
-
124
- ```bash
125
- pip uninstall sage_agent_internal
126
- ```
127
-
128
- In development mode, you will also need to remove the symlink created by `jupyter labextension develop`
129
- command. To find its location, you can run `jupyter labextension list` to figure out where the `labextensions`
130
- folder is located. Then you can remove the symlink named `sage-agent-internal` within that folder.
131
-
132
- ### Testing the extension
133
-
134
- #### Frontend tests
135
-
136
- This extension is using [Jest](https://jestjs.io/) for JavaScript code testing.
137
-
138
- To execute them, execute:
139
-
140
- ```sh
141
- jlpm
142
- jlpm test
143
- ```
144
-
145
- #### Integration tests
146
-
147
- This extension uses [Playwright](https://playwright.dev/docs/intro) for the integration tests (aka user level tests).
148
- More precisely, the JupyterLab helper [Galata](https://github.com/jupyterlab/jupyterlab/tree/master/galata) is used to handle testing the extension in JupyterLab.
149
-
150
- More information are provided within the [ui-tests](./ui-tests/README.md) README.
151
-
152
- ### Packaging the extension
153
-
154
- See [RELEASE](RELEASE.md)