If you don't mind me asking, how long was it from switching until this happened?
I'm afraid I wasn't paying close attention so only know it happened around the same day. If you have already switched over to Classic and have had no problems then hopefully the issue has been fixed.
I remember some email from them saying the Copilot was now on my plan, but I don't recall anything saying that this was actually a different, more expansive plan, or that Copilot was just a trial and the plan would switch until I took action, or anything like that.
Here's how to get back to your old plan:
• find the Services & Subscriptions page on your account and select Manage.
• click "Cancel Subscription".
• On the page that brings up there will be an option to switch to a different plan. That should have the "Personal Classic" plan. There's also "Family Classic" for people that want the family plan without Copilot.
Another way that some have reported works is to simply turn off recurring billing. That then sometimes triggers an offer to switch plans that includes the Classic plans.
I appreciate the sentiment; while this is, indeed, a paper, it is not a published or peer-reviewed paper. I wrote it with no intention of actually publishing it anywhere, and putting it on Arxiv is better long-term than putting it into Github or similar (I expect Arxiv to outlive any code forge).
In much the same way that I looked at web components and thought "What a nice idea. Here is how I can make this incrementally better and support client-side includes as well", I am hoping that this 100-lines of code will someday be looked at by someone else, who will (with the benefit of future knowledge and tech), then say "What a nice idea. Here is how I can make this incrementally better AND support <some future feature we cannot see right now>".
In any case, I thank you for your criticism and your time; your criticism can only make this better (for example, after reading your criticism, I think that showing a side-by-side comparison of my counter example with a custom element doing the same thing will make it more obvious why I find zjs-components more pleasant to write and use than Custom Elements).
Cheers :-)
[EDIT: Here is the comparison, in case you are still curious]
Here is the small comparison; I gave ChatGPT the ZjsComponent README.md and got it to write the example in the README as a custom element web component.
Here are the two implementations:
Implementation as a zjs-component:
<div>
Counter Value: <span name=counter-value>0</span>
</div>
<div>
<button onclick='ZjsComponent.send(this, "increment", 1)'> +1 </button>
<button onclick='ZjsComponent.send(this, "increment", 2)'> +2 </button>
<button onclick='ZjsComponent.send(this, "increment", 5)'> +5 </button>
</div>
<script>
function increment(amount) {
const el = this.querySelector("[name='counter-value']");
el.textContent = parseInt(el.textContent) + amount;
}
exports.increment = increment;
</script>
Usage of zjs-component: <zjs-component remote-src=counter.zjsc> </zjs-component>
Implementation as a custom element web component: <!-- counter-component.js -->
<script>
class CounterComponent extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.innerHTML = `
<div>
Counter Value: <span id="counter-value">0</span>
</div>
<div>
<button data-amount="1"> +1 </button>
<button data-amount="2"> +2 </button>
<button data-amount="5"> +5 </button>
</div>
`;
}
connectedCallback() {
this.shadowRoot.querySelectorAll('button').forEach(btn => {
btn.addEventListener('click', () => {
const amount = parseInt(btn.getAttribute('data-amount'), 10);
this.increment(amount);
});
});
}
increment(amount) {
const valueEl = this.shadowRoot.getElementById('counter-value');
valueEl.textContent = parseInt(valueEl.textContent, 10) + amount;
}
}
customElements.define('counter-component', CounterComponent);
</script>
Usage of the custom element web component: <counter-component></counter-component>I know you are trying to avoid boiler plate but I'm wondering how technically difficult it would be to provide an alternative for those of us who really like named components? Something like:
<script>
ZjsComponent.register("counter-component", "counter.zjsc");
</script>
Then I can just use in the named way, like: <counter-component start-at="100"><counter-component>I don't think the video title is great. The interview covers a wide range of topics around AI companies (often quite critically) and makes some interesting points.
[1]: https://microsoft.github.io/TypeChat/blog/introducing-typech...
I haven't tried it myself yet. Has anybody else given it a spin?
[0]: https://canine.sh/
- https://github.com/jingkaihe/matchlock
- https://github.com/mishushakov/libkrun-go
- https://github.com/earendil-works/gondolin
- https://github.com/butter-dot-dev/bvisor
- https://github.com/amlalabs/amla-sandbox
- https://github.com/eryx-org/eryx
- https://github.com/containers/bubblewrap (not new)
- https://github.com/coplane/localsandbox
- https://github.com/sd2k/conch
- https://github.com/Gerharddc/litterbox
- https://github.com/finbarr/yolobox
- https://github.com/coventry/sandbox-codex
- https://github.com/osks/ctenv
- https://github.com/tianon/gosu
- https://github.com/colony-2/shai
- https://github.com/rcarmo/agentbox
- https://github.com/coder/httpjail
- https://github.com/bytecodealliance/componentize-py
- https://github.com/tursodatabase/agentfs
- https://github.com/always-further/nono
- (another list on HN Deno Sandbox: https://news.ycombinator.com/item?id=46876022)
- Did not check if any/all of these are here: https://github.com/arjan/awesome-agent-sandboxes