Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1466 commits
Select commit Hold shift + click to select a range
a10eb51
fix(coalescing): a crash-window record ends its subject's first view …
Oct 19, 2026
7f8921b
fix(workspace): the include guarantees content, and the code that ser…
Oct 19, 2026
1f44f0b
perf(workspace): a watcher's batch of changes outside the include tak…
Oct 19, 2026
c69c6ee
docs(changelog): the one-spelling change's operator part goes under B…
Oct 19, 2026
b31ff21
fix(workspace): ls without a path lists each mount's include
Oct 19, 2026
8f5ef4b
refactor(workspace): isContainedPath is main's again, since every cal…
Oct 19, 2026
637ca55
fix(workspace): the include is judged where a followed path lands, as…
Oct 19, 2026
51c2a54
Merge main 2d3d5c2b into feat/workspace-mount-include
Oct 19, 2026
c811cc7
fix(workspace): a path that meets no link is judged where it's named,…
Oct 19, 2026
7f4d275
fix(workspace): an unlink, history, a link's target and a path's way …
Oct 19, 2026
af6d3f2
fix: once costs in two currencies meet in a usage tally, its cost sta…
Oct 19, 2026
da45fa7
fix(workspace): every mount's path parse stays as it was; the direct …
Oct 19, 2026
c7f5d45
fix(coalescing): an unread render stays when a later render or notice…
Oct 19, 2026
a25a425
fix(workspace): the direct mount's second review round
Oct 19, 2026
4ac837f
fix(mcpl): mask the url and credentials in a WebSocket client's dial …
The-Glassy Oct 19, 2026
b0671e4
fix(mcpl): mask a client's error after open too, and the dialed url b…
The-Glassy Oct 19, 2026
bc6ac28
fix(mcpl): withhold a client's error text when the configuration can'…
The-Glassy Oct 19, 2026
54b4d93
test(mcpl): build the stand-in WebSocket transport with its configura…
The-Glassy Oct 19, 2026
5c691cb
fix(code-execution): an exception that escapes the script's promises …
Oct 19, 2026
c492521
fix(engine): vendor.sh refuses a listed file the patches change in ki…
Oct 19, 2026
76376c2
docs(changelog): the breaking note names only the spellings history c…
Oct 19, 2026
08d7633
fix(mcpl): header mode sends only a credential a header carries as co…
Oct 19, 2026
dac5bf4
fix(workspace): the direct mount's third review round
Oct 19, 2026
0579bc2
test(workspace): the real watcher's test counts each batch's own turn…
Oct 19, 2026
1502181
fix(mcp): a request JSON can't write reads not-sent, an HTTP failure …
Oct 19, 2026
4fd2bfb
Merge pull request #562 from nissa-seru/fix/coalescer-render-runs
nissa-seru Oct 19, 2026
608357b
fix(routing): after a re-pin, the token traces and typing follow the …
Oct 19, 2026
593a766
test(mcpl): cover each place the transport masks a client's text
Oct 19, 2026
37e72b0
test(workspace): the real watcher's control checks a batch's own count
Oct 19, 2026
6c6cef4
test(workspace): the 16-at-a-time test holds the files' calls until s…
Oct 19, 2026
bf29f26
Merge main (4fd2bfb9) into fix/157-nonconversational-tags
Oct 19, 2026
c4b472c
Merge main into #250: #544's policy-exchange marker, with no awarenes…
Oct 19, 2026
55d88df
fix(workspace): a refused path names its link as the parse reads the …
Oct 19, 2026
224f14d
fix(workspace): a link to a directory isn't called outside the include
Oct 19, 2026
fed0e12
fix(mcpl): an open by speech or a reply that fails puts back the deci…
Oct 19, 2026
1e3e806
fix(code-execution): a settle whose resolve call was stopped on its w…
Oct 19, 2026
efc9c49
fix(engine): vendor.sh cleans up whenever it exits, puts the copy bac…
Oct 19, 2026
15aadc9
Merge pull request #350 from nissa-seru/fix/inbound-only-channels
nissa-seru Oct 19, 2026
126f0db
Merge main into fix/repin-trace-locus
Oct 19, 2026
203a6a9
Merge main (15aadc96) into hold-round-speech
Oct 19, 2026
9d4f12f
fix(workspace): a mount that doesn't follow links resolves none to li…
Oct 19, 2026
d30c8fc
test(streaming): the speech-routed check leaves out the open a first …
Oct 19, 2026
915ad4b
docs(mcpl): comments that don't name the branch they were written on
Oct 19, 2026
8fe9a1d
docs(changelog): leave the allowlist fragment as 0.23.0 published it
Oct 19, 2026
13d2bba
fix(mcpl): a run's first view needs nothing of the subject read, and …
Oct 19, 2026
06ad329
Merge pull request #563 from The-Glassy/ws-dial-error-redact
nissa-seru Oct 19, 2026
d7e6ea3
Merge pull request #463 from nissa-seru/feat/workspace-edit-planner
nissa-seru Oct 19, 2026
26653d3
Merge pull request #566 from nissa-seru/fix/556-mcp-send-accounting
nissa-seru Oct 19, 2026
996d11f
Merge main into the direct mount, with #463
Oct 19, 2026
248d6db
Merge remote-tracking branch 'upstream/main' into ws-auth-merge
The-Glassy Oct 19, 2026
9897a26
Merge pull request #567 from nissa-seru/release/0.23.0
nissa-seru Oct 19, 2026
f455971
Merge pull request #565 from nissa-seru/fix/repin-trace-locus
nissa-seru Oct 19, 2026
2a8fcd6
fix(mcpl): publish() publishes only into a registration confirmed ope…
Oct 19, 2026
e638903
fix(workspace): answers name a path in its one spelling, and three ch…
Oct 19, 2026
e0f40cd
Merge pull request #250 from nissa-seru/feat/surgery-marks-opt-in
nissa-seru Oct 19, 2026
7f4730f
Merge pull request #168 from ajaniramon/fix/157-nonconversational-tags
nissa-seru Oct 19, 2026
8ef9d28
Merge main into the mount include
Oct 19, 2026
079f198
fix(mcpl): a reply whose put-back can't be recorded says the channel …
Oct 19, 2026
297b8e7
fix(code-execution): a stop stays a stop, a throw as the run starts i…
Oct 19, 2026
bd62c6f
fix(engine): vendor.sh's restore command puts back what's committed, …
Oct 19, 2026
a6c4e0f
Merge pull request #360 from nissa-seru/humphrey/hold-round-speech
nissa-seru Oct 19, 2026
10917f7
Merge pull request #569 from nissa-seru/fix/publish-waits-for-new-reg…
nissa-seru Oct 19, 2026
2c3b734
test(batched-wake-locus): hold the gate's batch until both sends are …
Oct 19, 2026
d1df7b7
test(mcpl): a put-back that can't be recorded sends no close
Oct 19, 2026
794bf97
Merge pull request #558 from nissa-seru/fix/usage-state-per-agent
nissa-seru Oct 19, 2026
e653f3a
fix(workspace): judge a path as named only where it reaches its landi…
Oct 19, 2026
c1af160
fix(stamp): no request carries the framework's tokenEstimate stamp
Oct 19, 2026
8225e4b
Merge pull request #570 from nissa-seru/fix/batched-wake-hold
nissa-seru Oct 19, 2026
727093f
fix(mcp): a connect whose stdio pipe has failed fails, in both engine…
Oct 19, 2026
e01a233
Merge pull request #571 from nissa-seru/fix/strip-token-estimate
nissa-seru Oct 19, 2026
f85bee1
fix(mcpl): no error a host's call gets carries a configured credential
Oct 19, 2026
3253dab
fix(deferral): a write the coalescing assembly makes lands after what…
Oct 19, 2026
5990c54
fix(workspace): write a deletion's tombstone before removing its entry
Oct 19, 2026
b6e7562
fix(workspace): refuse a landing realpath can't resolve, spell a draf…
Oct 19, 2026
309e9c4
fix(stamp): no request carries the framework's tokenEstimate stamp
Oct 19, 2026
ea151f4
Merge remote-tracking branch 'upstream/main' into ws-auth-merge
The-Glassy Oct 19, 2026
fee537d
test(coalescing): R17 checks how each recovery wake's timer was armed
Oct 19, 2026
f91ca75
0.23.1
Oct 19, 2026
4a4a57a
changelog: header mode leaves the dial's query alone
The-Glassy Oct 19, 2026
babd0bf
fix(deferral): a provider hold tells a merge of several batches from …
Oct 19, 2026
6c52d76
fix(workspace): a direct mount whose root has moved nests what lies b…
Oct 19, 2026
02e339c
fix(modules): mark a message a tune-out holds from the residents in a…
Oct 19, 2026
0e21743
fix(tune-out): keep a held message out of a live turn
Oct 19, 2026
f899896
fix(tune-out): carry a held message in the cancel's backlog, or in it…
Oct 19, 2026
0ec0935
docs(mcpl): say what a launch failure's cause keeps, and pin it
Oct 19, 2026
eac1b62
Merge pull request #572 from nissa-seru/fix/assembly-writes-in-arriva…
nissa-seru Oct 19, 2026
12b478c
Merge pull request #575 from nissa-seru/fix/r17-armed-delay
nissa-seru Oct 19, 2026
e8768a0
test(mcp): the deaf fixtures reopen /dev/null on fd 0 once they've cl…
Oct 19, 2026
6f9c7bf
fix(code-execution): once a stop has come, a failure with no message …
Oct 19, 2026
0fd437a
fix(engine): vendor.sh's restore drops what the commit doesn't hold, …
Oct 19, 2026
2551ed6
Merge release/0.23.x (0.23.1) into main
Oct 19, 2026
30aca6a
chore(changelog): drop #571's fragment, which 0.23.1 folded
Oct 19, 2026
9dc00cf
fix(mcpl): number keys that redact alike in one pass
Oct 19, 2026
815bfe3
Merge pull request #576 from nissa-seru/fix/553-deletion-tombstone
nissa-seru Oct 19, 2026
395e1fd
Merge main into the direct mount, with #576
Oct 19, 2026
e77a135
fix(projection): a mid-turn message's media count toward the physical…
Oct 19, 2026
4df23cd
fix(workspace): spell a draft by the history the mount's include cove…
Oct 19, 2026
82cd021
test(mcp): the one-callback legacy test ends its launch once it's over
Oct 19, 2026
a7bfc58
fix(tune-out): hand the report a held message whose media the dump drops
Oct 19, 2026
4be0dac
fix(tune-out): report a note-less self-cancel's cut, and pin the noti…
Oct 19, 2026
22e5c79
test(mcp): the deaf-ping fixtures set their SIGUSR2 handler before th…
Oct 19, 2026
26d8e8f
fix(mcpl): stub a uri-form image or audio block that gives any dispos…
Oct 19, 2026
a0b06cf
Merge pull request #579 from nissa-seru/release/0.23.1-merge-back
nissa-seru Oct 19, 2026
7947014
fix(streaming): a stream goes where each publish went, and ends there
Oct 19, 2026
b13bcfa
chore(greptile): turn off Greptile's status comments
Oct 19, 2026
2f05c28
Merge pull request #578 from nissa-seru/rupert/f278-host-errors
nissa-seru Oct 19, 2026
a9ee107
Merge main (with #578) into ws-auth-header
Oct 19, 2026
6062d65
fix(code-execution): a stop ends a failure's read, and nothing after …
Oct 19, 2026
34f6bed
fix(engine): vendor.sh's leftover refusal says what the entries are a…
Oct 19, 2026
d989850
Merge main into the mount include
Oct 19, 2026
45f80a8
Merge main (2f05c28e) into fix/mcp-pipe-failed-while-connecting
Oct 19, 2026
5c57580
fix(mcpl): find a failed connect's stderr tail under its wrappers
Oct 19, 2026
62856c5
fix(tune-out): hand the report each held message as a row of its own
Oct 19, 2026
06f1680
test(streaming): the stream doubles check the destination's server
Oct 19, 2026
a4ba3f4
fix(mcpl): the channel tools and speech say what happened and what wo…
Oct 19, 2026
a1ecd26
Merge pull request #581 from nissa-seru/fix/projection-mid-turn-images
nissa-seru Oct 19, 2026
6c708a7
Merge pull request #584 from nissa-seru/chore/greptile-status-comment…
nissa-seru Oct 19, 2026
593f5e7
Merge pull request #561 from The-Glassy/ws-auth-header
nissa-seru Oct 19, 2026
f681a7c
Merge pull request #586 from nissa-seru/fix/f324-defined-disposition-…
nissa-seru Oct 19, 2026
c55b32d
fix(mcpl): a failed open's put-back of a default follows the server's…
Oct 19, 2026
42ee167
fix(mcpl): the put-back's queued work counts only work that will run,…
Oct 19, 2026
dc9a234
docs(mcpl): the queued-work check and the put-back's comment say what…
Oct 19, 2026
6d88f04
Merge pull request #574 from nissa-seru/fix/mcp-pipe-failed-while-con…
nissa-seru Oct 19, 2026
88a726d
Merge pull request #583 from nissa-seru/fix/module-rows-held-from-res…
nissa-seru Oct 19, 2026
d4adf51
fix(code-execution): the script's code QuickJS runs after a stop can'…
Oct 19, 2026
037aa79
Merge pull request #585 from nissa-seru/humphrey/f294-complete-where-…
nissa-seru Oct 19, 2026
e89c873
Merge main into fix/failed-open-puts-back
Oct 19, 2026
5728bc9
Merge pull request #588 from nissa-seru/rupert/f301-stderr-under-wrap…
nissa-seru Oct 19, 2026
63e1338
fix(tune-out): fit the cancel's backlog in one of the resident's mess…
Oct 19, 2026
3a14245
test(workspace): pin realBeneath's 40-link limit, and refuse a delete…
Oct 19, 2026
6383562
Merge pull request #568 from nissa-seru/fix/failed-open-puts-back
nissa-seru Oct 19, 2026
7e02eb9
test: watchdogs fire when the test says, not on a loaded host
Oct 19, 2026
3293e90
test(stop): hold the startup watchdog until the loop has taken the wake
Oct 19, 2026
90535c6
fix(mcpl): a retarget opens its new target past work a removal cancels
Oct 19, 2026
90de000
Merge main (63835621, with #568) into fix/channel-agent-words
Oct 19, 2026
0617d86
docs(mcpl): #568's fragment and a comment no longer cite channel_open…
Oct 19, 2026
6522518
test(surgery-marks): the retract's removals get the file's usual dead…
Oct 19, 2026
4ce694e
Merge pull request #536 from nissa-seru/feat/workspace-mount-include
nissa-seru Oct 19, 2026
f63bbfa
Merge pull request #590 from nissa-seru/fix/f337-test-watchdogs
nissa-seru Oct 19, 2026
678066b
Merge main into the direct mount, with #536
Oct 19, 2026
d6923fb
fix(tune-out): fit the dump exactly, to every resident that reads it
Oct 19, 2026
298b3f9
fix(tune-out): cut the newest only when some of it shows
Oct 19, 2026
7309de3
test(tune-out): the capped sweeps hold the dump to the cap
Oct 19, 2026
71c3953
Merge main (4ce694e4) into fix/code-execution-output-to-host
Oct 19, 2026
ef4ea12
fix(mcpl): an overtaken open says what stands, and a server's stop en…
Oct 19, 2026
b0a483f
Merge pull request #591 from nissa-seru/rupert/f338-startup-watchdog-…
nissa-seru Oct 19, 2026
26fd0f2
Merge pull request #592 from nissa-seru/kestrel/f336-removal-deadline
nissa-seru Oct 19, 2026
2a56c44
Merge pull request #594 from nissa-seru/fix/f332-retarget-after-removal
nissa-seru Oct 19, 2026
50e8fb7
fix(workspace): a direct mount's checks read disk beneath the root th…
Oct 19, 2026
09ccb5e
test(workspace): a moved direct root nests a mount its real root alon…
Oct 19, 2026
51a66ec
Merge pull request #593 from nissa-seru/fix/tune-out-dump-fits-one-me…
nissa-seru Oct 19, 2026
f119296
Merge pull request #495 from nissa-seru/fix/code-execution-output-to-…
nissa-seru Oct 19, 2026
d8cc690
Merge pull request #589 from nissa-seru/fix/channel-agent-words
nissa-seru Oct 19, 2026
821cac7
fix(code-execution): the advice after a signal fits the signal: a cra…
Oct 18, 2026
03294a3
fix(code-execution): the crash advice points at the traceback only wh…
Oct 18, 2026
518960a
test(code-execution): a crash after a line the script didn't end stil…
Oct 18, 2026
791d37f
feat(code-execution)!: the model reads a script's ending first, as te…
Oct 18, 2026
fe5ca57
fix(code-execution): answer an internal review: the cut is decided be…
Oct 18, 2026
d4551e0
fix(code-execution): answer the round's review: the whole output's fi…
Oct 18, 2026
375e23d
docs(types): ToolResult.structured is any tool's machine-readable res…
Oct 18, 2026
be32e62
test(code-execution): the helper for an exit after a script's result …
Oct 19, 2026
03c23a6
fix(discord): a deleted message loses every copy stored in shards
Oct 19, 2026
47a1497
fix(code-execution): the text fits the bound the call carries, or els…
Oct 19, 2026
05f8df2
feat(mcpl): publishForAgent's refusal says why the destination refuse…
Oct 19, 2026
269c8bc
docs(changelog): #495's sentence on a long result holds with this cha…
Oct 19, 2026
d78e175
fix(code-execution): answer an internal review of the rebased head: t…
Oct 19, 2026
e07eb6b
fix(workspace): a moved direct root nests a configured mount beneath …
Oct 19, 2026
27f75bf
docs(watermark): a tool boundary moves the consumed watermark only wh…
Oct 19, 2026
14f0fe4
test(workspace): three watcher tests wait until changes flow before t…
Oct 19, 2026
49c52cc
docs(watermark): the texts beside it say what unread means when a str…
Oct 19, 2026
1b4a428
Merge pull request #596 from nissa-seru/fix/code-execution-signal-advice
nissa-seru Oct 19, 2026
c9b6c05
test(code-execution): a long result through a model's own call keeps …
Oct 19, 2026
c73bf2a
test(workspace): a root replaced as it was opened is found by a poll …
Oct 19, 2026
150b6c3
fix(mcpl): a channel known only from a push starts with its transport…
Oct 19, 2026
b077da9
fix(mcpl): a push-made channel's traffic shows it open, as on main
Oct 19, 2026
87751b6
fix(mcpl): key the push exception on host state, ended by a retarget
Oct 19, 2026
ac256af
docs(mcpl): say what the placeholder key and push traffic mean; pin a…
Oct 19, 2026
1ff5b35
fix(deferral): a drained write whose landing can't be read back isn't…
Oct 19, 2026
33e05c0
docs(watermark): the shown watermark's doc doesn't list every excepti…
Oct 19, 2026
c5eb97e
refactor(workspace): a start and a moved direct root place a mount wi…
Oct 19, 2026
1e90fcb
Merge pull request #600 from nissa-seru/nell/f348-watcher-handshake
nissa-seru Oct 19, 2026
4d182eb
docs(workspace): say what a moved direct root resolves, and the race …
Oct 19, 2026
62337c5
Merge pull request #599 from nissa-seru/cedric/f55-code-execution-text
nissa-seru Oct 19, 2026
1741955
fix(deferral): look a marked write up wherever a held write is stored…
Oct 19, 2026
780d0ab
fix(history/semantic): a summary hit's snippet comes from the local s…
theaspirational Oct 19, 2026
9d1c65a
Merge pull request #601 from nissa-seru/fix/push-channel-unconfirmed
nissa-seru Oct 19, 2026
314f751
Merge pull request #602 from nissa-seru/fix/f347-delete-every-copy
nissa-seru Oct 19, 2026
69cdc44
Merge pull request #603 from nissa-seru/test/watcher-ready-after-reat…
nissa-seru Oct 19, 2026
bb1f0e3
fix(deferral): settle a marked write wherever held writes are read or…
Oct 19, 2026
f8c23e1
Merge pull request #604 from nissa-seru/docs/consumed-watermark-decla…
nissa-seru Oct 20, 2026
5216b34
fix(deferral): keep a settled write durable until its ack, and settle…
Oct 20, 2026
c4f7eb6
fix(history/semantic): drop a summary hit whose summary is empty here…
Oct 19, 2026
10089c1
test(workspace): the gone-file test finds the listing's look at its f…
Oct 20, 2026
413b429
docs(deferral): say what a settled write's notes, ack and release mea…
Oct 20, 2026
4e78a43
Merge main into the engine's branch
Oct 20, 2026
d8e8971
feat(tools): ToolResult.refused says the dispatcher refused a call be…
Oct 19, 2026
f80c0e1
docs(changelog): name the refusal a module's edit or removal can now …
Oct 20, 2026
987f63b
feat(code-execution): the isolate, a script's own process on the engi…
Oct 19, 2026
9a385b4
feat(code-execution)!: code_execution runs JavaScript in the isolate,…
Oct 19, 2026
26794a8
fix(release): run npm and the pack check's loads with --single-threaded
Oct 20, 2026
b0b13d3
Merge pull request #564 from nissa-seru/feat/workspace-direct-mount
nissa-seru Oct 20, 2026
ea4297a
Merge pull request #607 from nissa-seru/fix/deferred-write-landing-un…
nissa-seru Oct 20, 2026
1bf16d8
test(code-execution): allow macOS's own variable in the child's envir…
Oct 20, 2026
0a38600
test(release): note each Node once, on its main thread
Oct 20, 2026
073f8be
Merge pull request #609 from nissa-seru/fix/pack-installs-alone-singl…
nissa-seru Oct 20, 2026
115c031
fix(code-execution): a return keeps its output's ends within the agen…
Oct 20, 2026
ebdbc5c
fix(code-execution): a stop of an ended script marks its ending befor…
Oct 20, 2026
8ae537a
fix(mcpl): channel_decline's status says what the decline found
Oct 19, 2026
0f7de7e
Merge branch 'main' into fix/publish-refusal-reason
Oct 20, 2026
f1ceaf7
fix(history/semantic): say what a reused summary id keeps from the in…
Oct 20, 2026
6dab0f2
ci(greptile): label a pull request two minutes after its last update
Oct 20, 2026
f7fa559
fix(gate): wake a sleeping agent for the host's heartbeat server, not…
Oct 20, 2026
9ae9cdb
Merge pull request #613 from nissa-seru/chore/greptile-label-skip-young
nissa-seru Oct 20, 2026
ce1ba12
Merge pull request #597 from nissa-seru/fix/publish-refusal-reason
nissa-seru Oct 20, 2026
59af4de
Merge pull request #595 from nissa-seru/fix/decline-status
nissa-seru Oct 20, 2026
7e09923
Merge pull request #605 from theaspirational/fix/semantic-summary-loc…
nissa-seru Oct 20, 2026
ad5f8fd
fix(mcpl): store a server's metadata without the keys only the host w…
Oct 20, 2026
0bcb04b
fix(mcpl): strip three more host keys, and hand membrane injections bare
Oct 20, 2026
17840ed
test(mcpl): pin the push lane's first drop, and say where the marks a…
Oct 20, 2026
f996d26
docs(gate): say the sleep check shares the marker's server id only
Oct 20, 2026
c0d0e2c
fix(release): limit the CommonJS bin's --check and the bun probe
Oct 20, 2026
2bacd67
fix(stop): end each live conversation fork as its release would
Oct 20, 2026
4705096
Merge pull request #617 from nissa-seru/fix/sleep-heartbeat-is-the-hosts
nissa-seru Oct 20, 2026
8315247
fix(mcpl): store a server's metadata without the keys only the host w…
Oct 20, 2026
28dbcb7
Merge pull request #628 from nissa-seru/fix/pack-check-limits
nissa-seru Oct 20, 2026
0644506
Merge pull request #616 from nissa-seru/rupert/f350-stop-ends-live-forks
nissa-seru Oct 20, 2026
5045c0c
Merge main into petra/ingress-strip
Oct 20, 2026
1ed704c
build(code-execution): build the engine from quickjs-ng's pinned rele…
Oct 20, 2026
294e26d
fix(code-execution): an orphan whose script keeps a stop from landing…
Oct 20, 2026
64a5f60
fix(code-execution): a failure's part that a stop's code gives late i…
Oct 20, 2026
53e5000
fix(code-execution): the engine's refusals no longer say the script h…
Oct 20, 2026
52b611d
docs(code-execution): give the measured depths where a script's neste…
Oct 20, 2026
e88afe4
docs(code-execution): the changelog says where a return's output ends…
Oct 20, 2026
6555fb5
test(code-execution): take a yielded run's completion and its script'…
Oct 20, 2026
a0fe88a
fix(code-execution): the puppet stores a call's result under the cap …
Oct 20, 2026
7122cb7
0.23.2
Oct 20, 2026
c602d86
Merge pull request #622 from nissa-seru/petra/ingress-strip
nissa-seru Oct 20, 2026
758bb9f
Merge release/0.23.x (0.23.2) into main
Oct 20, 2026
a8a68d7
Remove #622's fragment, released in 0.23.2
Oct 20, 2026
ee89fea
Merge pull request #637 from nissa-seru/release/0.23.2-merge-back
nissa-seru Oct 20, 2026
8aac0ef
fix(history/semantic): index what the resident sent through a send tool
theaspirational Oct 20, 2026
18b5936
docs(history/semantic): say what the send-tool index holds
Oct 20, 2026
c4ba80b
Merge pull request #638 from theaspirational/fix/semantic-index-sent-…
nissa-seru Oct 20, 2026
c500f22
Merge main into feat/ingestion-stamps
antra-tess Oct 20, 2026
84d01b2
Review pull requests with RevEngine
nissa-seru Oct 20, 2026
b1cdcc5
Merge pull request #639 from anima-research/rev-engine-review
nissa-seru Oct 20, 2026
2099c40
Merge pull request #252 from nissa-seru/feat/ingestion-stamps
antra-tess Oct 21, 2026
97ca7eb
Merge pull request #608 from nissa-seru/imogen/code-execution-isolate
nissa-seru Oct 21, 2026
dfa6c0a
Merge main (97ca7eba) into fix/glob-mount-prefixed-patterns
Oct 21, 2026
6d320fe
fix(workspace): a `**/` after a brace group of directories matches ze…
Oct 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 3 additions & 2 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@

---

- [ ] Changelog fragment added — `changelog.d/<slug>.<breaking|added|changed|fixed>.md`
(see `changelog.d/README.md`) — or this change is internal-only /
- [ ] Changelog fragment added or a pending one edited —
`changelog.d/<slug>.<breaking|added|changed|fixed>.md` (see
`changelog.d/README.md`) — or this change is internal-only /
test-only / docs-only (apply the `no-changelog` label).

<!-- AI-assisted contributions are welcome and normal here — see
Expand Down
9 changes: 5 additions & 4 deletions .github/workflows/changelog.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,16 @@ jobs:
base="${{ github.event.pull_request.base.sha }}"
head="${{ github.event.pull_request.head.sha }}"
changed=$(git diff --name-only "$base...$head")
# Fragments must be *added* — a deleted or renamed fragment also
# Fragments must be added or edited: a change may land its entry by
# editing a pending fragment. A deleted or renamed fragment also
# appears in --name-only and must not satisfy the check.
added=$(git diff --name-only --diff-filter=A "$base...$head")
added_or_edited=$(git diff --name-only --diff-filter=AM "$base...$head")
echo "Changed files:"
echo "$changed"
if echo "$changed" | grep -q '^src/' \
&& ! echo "$added" | grep -Eq '^changelog\.d/[^/]+\.(breaking|added|changed|fixed)\.md$' \
&& ! echo "$added_or_edited" | grep -Eq '^changelog\.d/[^/]+\.(breaking|added|changed|fixed)\.md$' \
&& ! echo "$changed" | grep -qx 'CHANGELOG.md'; then
echo "::error::This PR touches src/ but carries no changelog entry. Add a fragment changelog.d/<slug>.<breaking|added|changed|fixed>.md (see CONTRIBUTING.md), or apply the 'no-changelog' label if the change is internal-only."
echo "::error::This PR touches src/ but carries no changelog entry. Add a fragment changelog.d/<slug>.<breaking|added|changed|fixed>.md or edit a pending one (see CONTRIBUTING.md), or apply the 'no-changelog' label if the change is internal-only."
exit 1
fi
echo "OK"
76 changes: 72 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ jobs:
build-and-test:
name: Build & Test (${{ matrix.os }}, node ${{ matrix.node }})
runs-on: ${{ matrix.os }}
# Without a limit, a step that hangs leaves the check pending until
# GitHub's six-hour limit. Passing runs take under seven minutes. A
# test file stuck under Node 20, or a test stuck under Node 24, fails
# sooner and by name, through npm test's --test-timeout.
timeout-minutes: 20
strategy:
fail-fast: false
# Both platforms: a package-lock.json regenerated over an existing
Expand All @@ -36,7 +41,8 @@ jobs:
node-version: ${{ matrix.node }}

# Root lockfiles are deliberately gitignored in this repo, so plain
# npm install (matching publish.yml). No lock to guard here.
# npm install, as publish.yml's build-and-test job does. No lock to
# guard here.
- name: Install dependencies
run: npm install

Expand All @@ -54,9 +60,11 @@ jobs:
# npm test runs with --test-force-exit, which hides async work a test
# leaves running, such as a late arrival after stop() ("Queue is
# closed"). These files run unforced so that class fails here, not in a
# later PR's qualification.
# later PR's qualification. They get npm test's --test-timeout too:
# under Node 20 it fails a file whose leftover work keeps it alive, by
# name, and under Node 24 the job's limit ends such a file.
- name: Test unforced (work in flight at stop)
run: node --test dist/test/stop-with-work-in-flight.test.js dist/test/stop-with-host-operations.test.js dist/test/conversation-routing.test.js
run: node --test --test-timeout=600000 dist/test/stop-with-work-in-flight.test.js dist/test/stop-with-host-operations.test.js dist/test/conversation-routing.test.js

# The release as npm would pack it, installed on its own and loaded, as
# the publish workflow checks before it publishes (see
Expand All @@ -66,10 +74,13 @@ jobs:
# install resolves dependencies from the registry as it stands, so a new
# upstream release can turn it red on a change that touched nothing it
# installs: when it fails, rerunning it on main tells a change's own break
# from the registry's drift.
# from the registry's drift. The job stops at 40 minutes, not at GitHub's 6
# hours: above the check's own limits (10 minutes each for npm pack and npm
# install, a minute for each load), so the check names what hung.
pack-check:
name: Packed release installs on its own
runs-on: ubuntu-latest
timeout-minutes: 40

steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
Expand All @@ -96,5 +107,62 @@ jobs:
with:
bun-version: 1.3.14

# Bun's WebSocket client quotes the url as dialed in a failed dial's
# message, which Node's never does, so the test that the dial's error
# masks it runs its probe under bun. The build-and-test job has no bun
# and skips it; here AF_TEST_REQUIRE_BUN makes a missing bun a failure.
- name: WebSocket dial errors under Bun
env:
AF_TEST_REQUIRE_BUN: '1'
run: node --import ./dist/test/helpers/force-exit-blocking-stdout.js --test --test-force-exit --test-timeout=600000 dist/test/mcpl-ws-transport.test.js

- name: Packed release installs on its own
run: node scripts/pack-installs-alone.mjs

# create() refuses codeExecution on a Bun older than 1.4.0, reading the
# Bun it runs under: the settings file checks that here, under the Bun
# connectome-host's CI runs, which create() refuses.
- name: code_execution's settings under Bun 1.3.14, which create() refuses
run: bun test --timeout 60000 ./test/code-execution-isolate-settings.test.ts

# A Bun host runs a script's process on Bun too, from the package's source,
# so code_execution's files run there as well as under Node, each file in a
# process of its own, on both platforms, since the child's stdio and fd 3
# are where runtimes and platforms differ. code_execution needs Bun 1.4.0 or
# later (create() refuses it on an older one), so they run under 1.4.0, the
# oldest release it admits, and under 1.4.3.
code-execution-bun:
name: code_execution under Bun (${{ matrix.os }}, bun ${{ matrix.bun }})
runs-on: ${{ matrix.os }}
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
bun: [1.4.0, 1.4.3]

steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
persist-credentials: false

- name: Setup Node.js
uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0
with:
node-version: 24

- name: Install dependencies
run: npm install --ignore-scripts

- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version: ${{ matrix.bun }}

- name: code_execution's tests under Bun, from source
run: |
for f in test/code-execution-isolate-*.test.ts test/code-execution-engine.test.ts test/code-execution.test.ts; do
echo "::group::$f"
bun test --timeout 60000 "./$f" || exit 1
echo "::endgroup::"
done
52 changes: 52 additions & 0 deletions .github/workflows/engine.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Engine

# code_execution's engine module, src/code-execution/quickjs.wasm, is committed beside what it's
# built from: engine/build.sh, which fetches the pinned quickjs-ng release and applies the patches
# in engine/patches, and engine/interface.c, built with a pinned toolchain. This rebuilds the
# module and fails unless the bytes are the committed ones, so the module can't drift from its
# sources in either direction. It runs only when one of them changes, since the toolchain is a
# 143 MB download.
on:
push:
branches:
- main
paths:
- 'engine/**'
- 'src/code-execution/quickjs.wasm'
- '.github/workflows/engine.yml'
pull_request:
paths:
- 'engine/**'
- 'src/code-execution/quickjs.wasm'
- '.github/workflows/engine.yml'

permissions:
contents: read

jobs:
rebuild:
name: The committed engine module is what its sources build
runs-on: ubuntu-latest
timeout-minutes: 15

steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
persist-credentials: false

# binaryen's wasm-opt comes from npm and runs under Node.
- name: Setup Node.js
uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0
with:
node-version: 24

- name: Rebuild the module
run: engine/build.sh "$RUNNER_TEMP/quickjs.wasm"

- name: Compare it with the committed module
run: |
sha256sum "$RUNNER_TEMP/quickjs.wasm" src/code-execution/quickjs.wasm
if ! cmp -s "$RUNNER_TEMP/quickjs.wasm" src/code-execution/quickjs.wasm; then
echo "::error::src/code-execution/quickjs.wasm isn't what engine/build.sh builds from these sources. Rebuild it with engine/build.sh and commit it with them."
exit 1
fi
85 changes: 63 additions & 22 deletions .github/workflows/greptile-label.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,48 @@ name: Greptile label
# Greptile reviews only pull requests labelled `greptile` (.greptile/config.json).
# Every 30 minutes this job adds the label to each open, non-draft pull
# request with more than 400 additions plus deletions that carries neither
# `greptile` nor `no-greptile`, so a smaller one gets a Greptile review only
# if someone adds the label by hand. Greptile's reference lists a pull
# request being given a trigger label among the openings it reviews, and a
# label added after a pull request opened starts its review then: within
# about half an hour of a pull request opening, passing 400 lines or being
# marked ready, and later when GitHub's scheduler is busy.
# `greptile` nor `no-greptile` and hasn't been updated in the last two
# minutes, so a smaller one gets a Greptile review only if someone adds the
# label by hand. Greptile's reference lists a pull request being given a
# trigger label among the openings it reviews, so its review starts when this
# job's label lands: within about half an hour of a pull request opening,
# passing 400 lines or being marked ready, and later when GitHub's scheduler
# is busy.
#
# Each run lists every open pull request, up to the list call's 500, so the
# next run catches up on one that was missed or delayed. A draft past the
# line is labelled once it's marked ready. The label is only ever added: a
# A run labels a pull request only once two minutes have passed since its
# last update, so one updated less than two minutes before a run waits for a
# later run, usually the next, about half an hour later. On Oct 19, a label
# added seven seconds after opening started no review on either of the two
# pull requests it happened to, while on Oct 18 labels added 35 to 105 seconds
# after opening started a review on each of seven. The two minutes are a
# margin over those cases, since the boundary between seven and 35 seconds
# hasn't been measured. The wait counts from any update, not only from the
# openings Greptile's reference names (opened, reopened, ready for review),
# because a label Greptile drops stays on the pull request, so no later run
# adds it again, while waiting delays the label by a run each time the pull
# request is updated in the two minutes before one. A pull request's update
# time is when it opened or later, and comments, reviews, labels and marking
# it ready move it. Reopening it and pushing to it are expected to move it as
# well, though that hasn't been checked. A pull request whose update time
# doesn't parse gets no wait, and a warning in the run's log names it if it's
# past 400 lines or has no line counts.
#
# Each run lists every open pull request, up to the list call's 500, so a
# later run catches up on one that was missed or delayed. A draft past the
# line is labelled after it's marked ready. The label is only ever added: a
# pull request that later shrinks keeps it, and removing it from one past the
# line doesn't skip the review, since the next run adds it back.
# `no-greptile` is the way to skip a review.
# line doesn't skip the review, since a later run adds it back. `no-greptile`
# is the way to skip a review.
#
# A schedule rather than pull_request_target, which GitHub's default event
# policy for public repositories blocks once it's enforced, from November 2,
# 2026. A scheduled run uses this file as the default branch has it, reads
# pull request numbers, line counts, draft flags and labels through the API,
# and checks nothing out. GitHub disables a public repository's scheduled
# workflows after 60 days without activity (enable this one again from the
# Actions tab), and sends a scheduled workflow's notifications to whoever last
# changed its cron line. workflow_dispatch runs it on demand.
# pull request numbers, line counts, draft flags, labels and update times
# through the API, and checks nothing out. GitHub disables a public
# repository's scheduled workflows after 60 days without activity (enable this
# one again from the Actions tab), and sends a scheduled workflow's
# notifications to whoever last changed its cron line. workflow_dispatch runs
# it on demand.
on:
schedule:
# Away from the start of the hour, which GitHub names as a time of high
Expand All @@ -49,21 +69,36 @@ jobs:
# names compare case-insensitively, as Greptile's own filters do. jq
# reads a missing count as null, and null plus a number as that
# number, so a candidate whose counts aren't both numbers is named and
# fails the step rather than passing unlabelled. A label that fails for
# one pull request doesn't stop the others.
# fails the step rather than passing unlabelled, once two minutes have
# passed since its last update (at once if that time doesn't parse). A
# label that fails for one pull request doesn't stop the others.
run: |
prs=$(gh pr list --repo "$REPO" --state open --limit 500 \
--json number,additions,deletions,isDraft,labels)
--json number,additions,deletions,isDraft,labels,updatedAt)
open=$(jq length <<< "$prs")
echo "Open pull requests: $open."
candidates=$(jq '[.[] | select(.isDraft | not)
| select(any(.labels[]; (.name | ascii_downcase) == "greptile" or (.name | ascii_downcase) == "no-greptile") | not)]' <<< "$prs")
uncounted=$(jq -r '[.[] | select((.additions | type) != "number" or (.deletions | type) != "number")
# A pull request updated in the last two minutes waits for a later
# run, whether or not it has line counts yet. One whose updatedAt
# doesn't parse gets no wait, as before this rule, and the warning
# names it if it's past 400 lines or has no line counts.
now=$(date -u +%s)
untimed=$(jq -r '[.[] | select(((.updatedAt | fromdateiso8601?) // null) == null)
| select((.additions | type) != "number" or (.deletions | type) != "number" or .additions + .deletions > 400)
| "#\(.number)"] | join(" ")' <<< "$candidates")
settled=$(jq --argjson now "$now" '[.[]
| select(((.updatedAt | fromdateiso8601?) // 0) <= $now - 120)]' <<< "$candidates")
young=$(jq -r --argjson now "$now" '[.[]
| select(((.updatedAt | fromdateiso8601?) // 0) > $now - 120)
| select((.additions | type) != "number" or (.deletions | type) != "number" or .additions + .deletions > 400)
| "#\(.number)"] | join(" ")' <<< "$candidates")
uncounted=$(jq -r '[.[] | select((.additions | type) != "number" or (.deletions | type) != "number")
| "#\(.number)"] | join(" ")' <<< "$settled")
todo=$(jq -r '.[]
| select((.additions | type) == "number" and (.deletions | type) == "number")
| select(.additions + .deletions > 400)
| "\(.number) \(.additions + .deletions)"' <<< "$candidates")
| "\(.number) \(.additions + .deletions)"' <<< "$settled")
labelled=0
failed=""
while read -r number changed; do
Expand All @@ -77,11 +112,17 @@ jobs:
fi
done <<< "$todo"
echo "Labelled $labelled."
if [ -n "$young" ]; then
echo "Left for a later run, updated less than two minutes ago: $young."
fi
if [ -n "$untimed" ]; then
echo "::warning::GitHub gave no readable update time for these, so they got no two-minute wait: $untimed."
fi
if [ -n "$uncounted" ]; then
echo "::error::GitHub gave no line counts for these, so they weren't labelled: $uncounted. To have Greptile review one, add the greptile label to it by hand, or add no-greptile to skip its review; either ends this failure for it."
fi
if [ -n "$failed" ]; then
echo "::error::Labelling failed for these:$failed. GitHub's answer for each is above its 'Labelling #N failed' line, and every later run tries again. To have Greptile review one now, add the greptile label to it by hand, creating the label from the repository's Labels page if it isn't there, or add no-greptile to skip its review; either ends this failure for it."
echo "::error::Labelling failed for these:$failed. GitHub's answer for each is above its 'Labelling #N failed' line, and later runs try again. To have Greptile review one now, add the greptile label to it by hand, creating the label from the repository's Labels page if it isn't there, or add no-greptile to skip its review; either ends this failure for it."
fi
if [ -n "$uncounted$failed" ]; then
exit 1
Expand Down
Loading