Repository navigation
Releases: dylan-sutton-chavez/edge-lang
Release list
v0.9.6
Actor servers take thousands of clients on one thread and replay only unfinished messages, and module functions keep their locals apart once they run hot
- A function from an imported module no longer mixes two of its locals from its second call on, a phi in the lowered code read its sources at the wrong instruction since 0.9.0.
- A consistency suite holds 500 generated programs to one answer per call, cold, warm, from a module and as a method, and a std suite runs the edge-python-std tests on every push.
- An eval waiting on a sleep or a host call parks instead of holding the scheduler, a busy actor yields every preempt back-edges and sits in the ready queue once, and limits.timeout sets the deadline of an eval group up to 300 seconds.
- One mio thread serves the TCP ingress and the HTTP control port, a message holds at most 16 MiB, a request has 30 seconds to arrive, and a full inbox stops reading and answers 503.
- The durable log marks each message done, compacts past 64 MiB and syncs before a /pub answers 202, so a restart replays only what was left, and SIGTERM gives the actors 25 seconds to finish.
- Dead code and the limits.heap and limits.calls notices are gone, the Lucide fetch falls back to a second CDN, and the crates say 0.9.6.
v0.9.5
Lazy generators and iterators, live dict views and exception chaining, so the Python delta drops to three design choices
- Generator expressions are lazy, and
map,filter,zip,enumerateandreversedcompute each item as it is asked for. keys,valuesanditemsreturn views that read the dict live, and thekeysanditemsviews take the set operators andisdisjoint.raise X from Ysets__cause__, an exception raised while another is handled keeps it as__context__, and an uncaught chain prints each exception in turn.- A local read or deleted before its first assignment raises
UnboundLocalError, which sits underNameError. - Every comprehension runs in a scope of its own, a walrus in it binds in the enclosing scope, and its first iterable fails where the comprehension stands.
istakes onlyNone,True,False,...andNotImplemented, and named escapes, complex literals and what the engine only faked fail at compile time.- Every frame moves to one register stack, which ends the undefined behaviour in the collector, and snapshots move to format 9.
- The docs link under
/docs/edge-python, the fuzzer runs, watches, triages and replays a campaign from make, and the crates say0.9.5.
v0.9.4
A Makefile runs every build, and the docs regroup with boxes and cards
- A Makefile at the root runs every build, lint and test on Linux, macOS and Windows, and CI calls the same targets. The cargo aliases are gone, so cargo wasm is now make wasm.
- Docs draw boxes from markdown markers and nest two folders deep, and edge build holds package docs to the same rules with raw HTML still refused.
- The boxes are NOTE, TIP, IMPORTANT, WARNING, CAUTION, QUESTION, CARDS, BANNER and COPY, and a card takes any Lucide icon from the list make lucide fetches at build time.
- The docs regroup into Get started, Language, Platforms, Reference and Internals, with a first app tutorial and new JavaScript, Rust and Registry pages.
- Pages under getting-started and implementation, and the CLI, actors, embedding and HTTP API pages, move to new paths.
- Miri drops the lang suite, which failed every day since the crate left the repo.
- The engine and the JS host behave the same as
0.9.3, and the crates say0.9.4.
v0.9.3
A plugin calls str.format and list.sort through the frame a script call gets
v0.9.2
edge publish signs with the token instead of sending it
edge publishsigns the sha256 of the artifact, its token id and the second with an Ed25519 key derived from the token, so the registry keeps only a public key and the token never leaves the machine.- A signature holds for its own bytes and five minutes either side, and the registry refuses the old
Bearerheader. - Tokens made before the registry takes this change stop working. Make a new one at https://edgepython.com/settings#tokens and publis
- The room script lives in
js/src/room.ts, so a site can hash it for its CSP. The engine and the JS host behave the same as 0.9.1. - The crates say 0.9.2.
v0.9.1
The docs send questions to chat.edgepython.com, and search names services
- Questions go to POST https://chat.edgepython.com, in the HTTP API page and in the skill an agent reads.
- Search answers with docs, people, services and packages, and a service reads at /api/service/.
- The crates say 0.9.1, and the engine, the CLI and the JS host are the same as 0.9.0.
v0.9.0
Lowered code runs on typed registers, and the repo builds and tests with no secret
- Lowered code runs on typed registers, and a loop that turns hot moves up a tier in the middle of its run.
- A call to an impure function takes the fast path, and only names, constants and single characters are interned.
- The bench covers 5,496 cases instead of 5,463 and runs the shared ones 2.0% faster, its best case 4.6 times.
- Snapshots carry format 7, so a state saved by 0.8 no longer restores.
- The repo holds the engine, the CLI, the JS host and the docs, and CI tests them with no secret, so a pull request from a fork runs whole.
- Build jobs hand their outputs on as artifacts, tests serve them on loopback through cdn/, and a release attaches the tested tree as cdn.tar.gz.
v0.8.2
The bot reads the pages it finds, and works its numbers out in Edge Python
- The bot searches up to three terms per question and reads each page it finds, the section a hit points at or a package's record, rather than a short snippet.
- It reads SKILL.md from edgepython.com, so a release reaches it without a redeploy.
- When an answer needs a number or an output, the model runs Edge Python on the published engine, with nothing granted and a small budget.
- A citation links the exact section as (1), a list like [1, 3] links each page, and a claim drawn from the reference links its closest page.
- A mention whose text Discord withholds is left alone instead of answered blind.
- A draft program no longer shows on the home page, as a card or as an untitled row under Artifacts.
- CI runs every test again, and the memory tests take turns so they no longer fail at random.
v0.8.1
The engine closes its gaps with Python, and programs read the files and secrets they are granted
- Full
matchpatterns, generic aliases, unions, in-place dunders and subclasses of builtin exceptions work as in Python. map,filter,zipandenumeratereturn iterators, and dicts and sets compare user objects by__hash__and__eq__.- A
nonlocalwritten in a loop keeps its value, floats round from their exact value, and an error keeps the line it was raised at. - The new
fsandsecretmodules read project files and host secrets under whatedge.jsongrants, and a package passes on only what its importer gave it. - A run is capped at 256 MB instead of 100,000 objects,
--memoryand--opsset the limits, and actor groups uselimits.memoryin place ofheap. - The playground draws each system call of a run as a tree and never shows a secret whole.
- Docs, packages and people answer as data under
/api, and edgepython.com/SKILL.md gives an agent the whole reference. - The registry resolves at a new address, so a CLI older than 0.8.1 must be updated to add or lock packages.
- Questions in any language are answered at ask.edgepython.com and in the Discord server, now linked from the nav.
- The bench covers 5,463 cases instead of 4,213 and runs the shared ones 4.2% faster.
v0.8.0
A program pays only for the builtins it names, and memoization reaches every pure function
- A VM registers only the builtins its program names, so
print()costs 23 µs instead of 139 and the geometric mean of vm.json falls 62%. - Memoization reaches every pure function whose inputs cannot change, so
fib(15)runs 32 times faster. - A memoized call drops results that a rebound builtin or a mutable argument made stale, and a free name reads the live global, never a caller local.
str.find,count,index,startswithandendswithread the string in place instead of copying it, and generators share the items they iterate.- A set that would hold itself raises
TypeErrorinstead of aborting, and dict and set lookups andhash()reject unhashable values. - A finished generator stays finished, builtins take a range or a generator, and
importwithout a module name is a syntax error. - A constant fold stops at the join of
or,andor a ternary, and naming the type of an instance no longer leaks memory. - The Bench job prints its mean on every run, and CI reports the brotli-11 size of compiler.wasm.
- The site banner points to GitHub, and the Team plan offers a commercial license for lang.