Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
239 commits
Select commit Hold shift + click to select a range
9f6eb76
Sessions plugin: contributes whatever a process imports first — the c…
echarles Oct 29, 2026
7f32b08
Teams: the scene's backdrops — studio, hero and plain (SCENES S1-01, …
echarles Oct 29, 2026
1d32873
Specs: the four demo scenes on the hero backdrop (agentspecs 673254b)…
echarles Oct 29, 2026
46fa577
test_sessions_plugin_import_order: build agent-teams' app with create…
echarles Oct 29, 2026
71321eb
Backdrops: the catalogue, pure, and a backdrop's figure and theme for…
echarles Oct 29, 2026
60da607
Scene transcript: the message views and the drill-down (SCENES S2-01,…
echarles Oct 29, 2026
7ec0ff4
Graph: the selected exchange on the stage, on every backdrop (SCENES …
echarles Oct 29, 2026
1612a8a
1.5.91: stages that rehearse, record and play their recording; a codi…
echarles Oct 29, 2026
0950562
CI: the import-order test skips when the installed agent-teams has no…
echarles Oct 29, 2026
7733d37
test_apps_command: the catalogue's applications include code-explaine…
echarles Oct 29, 2026
7ea175e
agentspecs>=0.0.137 (code-explainer and the coding-agent scene, recor…
echarles Oct 29, 2026
bc42488
Spreadsheets in the Loop, on Datalayer Cells — a spreadsheet editor b…
echarles Oct 29, 2026
83aa479
Specs: code-explainer's not-yet-verified line in a Maker's words (age…
echarles Oct 29, 2026
0f97f10
1.5.92: a task grant's token is verified at IAM's task-grant route (w…
echarles Oct 29, 2026
efc6a78
ruff format: the task-grant verification and its tests
echarles Oct 29, 2026
ef47034
Specs: the four demo scenes' rehearsals and recordings (agentspecs d9…
echarles Oct 29, 2026
cb60da3
Stages: the nightly rehearsal runs on Datalayer's platform with keys …
echarles Oct 29, 2026
4441507
Harness: the repository an application is lent (permissions.computer.…
echarles Oct 29, 2026
344269e
Harness: OpenCode on Datalayer calls ai-inference's own chat completi…
echarles Oct 29, 2026
92442c2
Scenes: a fourth backdrop, space (agentspecs e3d14e9) — the site's he…
echarles Oct 29, 2026
8e5ede7
Scenes: the space backdrop tuned beside the hero drawings — a member'…
echarles Oct 29, 2026
85179d0
1.5.93: OpenCode through ai-inference's own chat completions, a repos…
echarles Oct 29, 2026
93f3feb
Scenes: space draws compact nodes — a member is its mark (its emoji o…
echarles Oct 29, 2026
c38f1fd
Appspec (TypeScript): permissions.computer.repository read and writte…
echarles Oct 29, 2026
4a47be3
Tests: @jupyter/web-components' mock answers every export with a stub…
echarles Oct 29, 2026
54aaa34
Tests: the web-components stub is never a thenable — awaiting the moc…
echarles Oct 29, 2026
f0e6fe7
Scenes rehearse: a harness's steps over A2A are named by their kind a…
echarles Oct 30, 2026
1a9c291
Harness: OpenCode asks the Shield for every step — its configuration …
echarles Oct 30, 2026
3704306
1.5.94: OpenCode asks the Shield for every step; a harness's steps in…
echarles Oct 30, 2026
cecf24d
Specs regenerated (agentspecs 7e29f6b): the catalogue's verified and …
echarles Oct 30, 2026
2d3aa89
harness_inference: docstring summaries in the imperative (numpydoc SS05)
echarles Oct 30, 2026
069ba36
Stages draw a member in its colour, by name: A2ATeamGraphMember.color…
echarles Oct 30, 2026
eadb681
A2ATeamGraph: minHeight, a board the graph fills — the room beyond it…
echarles Oct 30, 2026
aefefa0
Stages: a member's colour resolved by a thin local resolver (backdrop…
echarles Oct 30, 2026
79cd595
Colours by palette name, from primer-addons 1.0.46 and agentspecs 0.0…
echarles Oct 30, 2026
62da406
Scenes: a fifth backdrop, minimal (agentspecs cd8b8b8) — each member …
echarles Oct 30, 2026
107cc25
Scenes: a sixth backdrop, orb (agentspecs 6339e8e) — each member Data…
echarles Oct 30, 2026
c126c2a
1.5.95: colours by palette name, the minimal and orb backdrops, detai…
echarles Oct 30, 2026
1fcc3c7
A2A spans: a harness's steps named by kind and title (Edit README.md)…
echarles Oct 30, 2026
a065b8c
Computer: GET /api/v1/apps/agents/{agent}/computer/repository — the r…
echarles Oct 30, 2026
4fc0208
1.5.96: a lent repository's state for its owner; a harness's steps ov…
echarles Oct 30, 2026
f431a9f
A harness's tool kind in the Inspector; the computer's repository rou…
echarles Oct 30, 2026
f2bcc31
Tool approvals: View details in primer-addons' Card, its ground the t…
echarles Oct 30, 2026
51ac57b
Tool approvals: a parameter that is an object shown as JSON, not [obj…
echarles Oct 30, 2026
0d1c114
PAP: a scope's name is no longer said to stay away from poppy:, which…
echarles Oct 30, 2026
4631bae
Evals adapters: the sandbox framework code runs in: new namespaces, n…
echarles Oct 30, 2026
c31c394
Evals adapters: the contract (inspect, validate, import_definition, p…
echarles Oct 30, 2026
8446081
Evals adapters: whatever a source does to its reader is a refusal of …
echarles Oct 30, 2026
9f3cf5f
Evals adapters: Inspect AI, pinned at 0.3.286: tasks discovered in th…
echarles Oct 30, 2026
6d2d4de
Evals adapters: formatted and typed; a sandbox is a protocol with its…
echarles Oct 30, 2026
99dfab1
Evals adapters: the tar branch of unpacking reads the entry it is on
echarles Oct 30, 2026
74d6ac1
A local personal agent and company at PAP draft 0.3 as rewritten: a S…
echarles Oct 30, 2026
e03d792
Every company operation is the person's: the Rule decides only whethe…
echarles Oct 30, 2026
af8f1d0
Specs regenerated from agentspecs cde11cd: Operations version 2 in th…
echarles Oct 30, 2026
9f74bcc
PAP examples at draft 0.3 as rewritten: session-jwt, session-transpor…
echarles Oct 30, 2026
1e880da
PAP traces rerun at the SDK of draft 0.3 as rewritten: Session JWTs, …
echarles Oct 30, 2026
64f4c0b
TypeScript at Operations version 2: the Appspec reads no allows or us…
echarles Oct 30, 2026
c168558
PAP example views at draft 0.3 as rewritten: a Session JWT view in pl…
echarles Oct 30, 2026
59fe2ad
Docs: the integration pages say PAP draft 0.3 as of its 2026-10-28 re…
echarles Oct 30, 2026
9e732c5
Comments: sentences left broken when their references were taken out …
echarles Oct 30, 2026
86feea0
The operation's old field name leaves the generator, PAP_OUTCOME_TYPE…
echarles Oct 30, 2026
b5f3e7a
Evals adapters: every model call goes through ai-inference: a third n…
echarles Oct 30, 2026
fa354db
Evals adapters: typed through; the fake adapter keeps the network it …
echarles Oct 30, 2026
fbe3e5c
UCP and PACT cases as decks: lib/protocols/decks, YAML from TypeScrip…
echarles Oct 30, 2026
dae8521
Evals adapters: `evals adapters` lists, inspects, imports, launches a…
echarles Oct 30, 2026
d0fbaee
On a Datalayer runtime every harness's model calls go through ai-infe…
echarles Oct 30, 2026
bab5b77
Docs: a harness on Datalayer calls through ai-inference on no key of …
echarles Oct 30, 2026
507e2c7
Headers: a JSON Lines fixture carries none
echarles Oct 30, 2026
0a719f1
Evals adapters: bandit, mypy, ruff, numpydoc and interrogate clear: e…
echarles Oct 30, 2026
7dec397
Evals adapters: Harbor, pinned at 0.25.0: task packages read and lint…
echarles Oct 30, 2026
29f3bc0
Automatic application of license header
github-actions[bot] Oct 30, 2026
c729ec2
Stages: a member's details say what its application does, its harness…
echarles Oct 30, 2026
aae92dd
Merge branch 'feat/scenes' of https://github.com/datalayer/agent-runt…
echarles Oct 30, 2026
a70178f
Studio's Toolbox says Codex is not offered on Datalayer and never set…
echarles Oct 30, 2026
4a06988
Evals adapters: one task-environment provider for Inspect and Harbor;…
echarles Oct 30, 2026
cbad22a
An agent is told today's date on each run: a model has no clock, and …
echarles Oct 30, 2026
bb0eb95
Evals adapters CLI: a launch takes a budget and names its application…
echarles Oct 30, 2026
b24693a
Shield: IAM's policy read with the account's key before a token that …
echarles Oct 30, 2026
604fb7d
Codex is offered on Datalayer again, through ai-inference's Responses…
echarles Oct 30, 2026
f00bc22
package.json: two spaces
echarles Oct 30, 2026
5656d17
Evals adapters: a task's Dockerfile builds on its own base through th…
echarles Oct 30, 2026
26eb33c
PAP 0.28.0 and agentspecs 0.0.141 pinned
echarles Oct 30, 2026
10f83d7
1.5.97: agentspecs 0.0.141 in the specs, the traces at PAP 0.28.0, th…
echarles Oct 30, 2026
5e25c7f
Evals adapters: a root of its own keeps the links to its interpreter,…
echarles Oct 30, 2026
6cf7e09
Evals client mixin: formatted
echarles Oct 30, 2026
d5bb0c0
1.5.97: tests read the date among an agent's instructions, code-sandb…
echarles Oct 30, 2026
4a5fdc6
Type: the instructions indexed where they are there
echarles Oct 30, 2026
892592f
Model budget tests: the delegation's names read from context.delegati…
echarles Oct 30, 2026
d2277e0
Scenes record: the YAML file given is the one updated, whatever its name
echarles Oct 30, 2026
c6570e5
Scenes record: the rehearsal's own indent and a comment on its line k…
echarles Oct 30, 2026
acc37ac
Scenes transcript, Python: a finished call or ask says when it ended,…
echarles Oct 30, 2026
d963dec
Environments' generated types: code-sandboxes 1.11.0's foreignDockerf…
echarles Oct 30, 2026
95de37a
Scene transcript: a harness's steps kept apart by their call, here an…
echarles Oct 30, 2026
dc69ea7
Scene transcript: each line's time a native button that selects it fr…
echarles Oct 30, 2026
372c88a
Transcript table: each row's time a native button that selects it fro…
echarles Oct 30, 2026
bbc6336
Transcript table: Failed first holds, the rows keeping the order the …
echarles Oct 30, 2026
576323d
Scene recording: played once, the last answer and result are played o…
echarles Oct 30, 2026
69f7414
Scenes example: the line selected held by the page and handed to the …
echarles Oct 30, 2026
ab8d5e8
Evals adapters: the golden plan is what the adapter plans today
echarles Oct 30, 2026
26a4430
The Shield decides each step of Codex and pi: a Codex session is held…
echarles Oct 30, 2026
a0e89df
1.5.98: the Shield decides each step of Codex and pi
echarles Oct 30, 2026
776694d
Evals adapters: Harbor's dataset.toml read and proved by digest; Git …
echarles Oct 30, 2026
bff52cd
Evals adapters: a result carries what the relay counted, so a budget …
echarles Oct 30, 2026
14798f9
Evals adapters: the Harbor fixture's check finds the examples
echarles Oct 30, 2026
324acb4
Evals adapters: a task's build context read in the sandbox and carrie…
echarles Oct 30, 2026
b362aa4
Typed and formatted, for the style checks
echarles Oct 30, 2026
236b97e
Apps: a context its organization disabled is left out and said: the a…
echarles Oct 31, 2026
08fcf91
A model with no provider named follows the process's setting, so a me…
echarles Oct 31, 2026
11dae0e
1.5.99: personal-agent-protocol 0.29.0: DPoP proofs at Device Sign-In…
echarles Oct 31, 2026
eb104ef
Automatic application of license header
github-actions[bot] Oct 31, 2026
8e09c87
Tests: the import block as the hook writes it
echarles Oct 31, 2026
674355a
Docs: every protocol has its page under Protocols in the sidebar: AG-…
echarles Oct 31, 2026
c1a7dd0
Docs: TAP's page says which signatures, on a page of its own
echarles Oct 31, 2026
0b10538
Docs: the page reads MCP and A2A
echarles Oct 31, 2026
2b1f1ad
1.5.100: the process's inference provider wins over an agentspec's
echarles Oct 31, 2026
90fde4c
1.5.101: a deployment's principal goes to its runtime: the proof the …
echarles Oct 31, 2026
4f3ac3d
Shield: a kept harness reads its policy with what is renewed
echarles Oct 31, 2026
3161e2e
A runtime launched for a deployment runs what ai-agents says, not wha…
echarles Oct 31, 2026
1196dc6
On a runtime launched for a deployment, a pod-local secret replaces l…
echarles Oct 31, 2026
380d33e
Tests: the sandbox is no local caller of the application routes, and …
echarles Oct 31, 2026
2c3846a
Tests: a deployment's code is read through what answers only its code
echarles Oct 31, 2026
b8383fc
1.5.102: a deployment's runtime runs its pinned spec, and a pod-local…
echarles Oct 31, 2026
0b1ca4f
On a deployment's runtime, what the sandbox sends the MCP proxy is a …
echarles Oct 31, 2026
3a3a271
Scenes: a read-only catalogue keeps no rehearsal, and that is no warning
echarles Oct 31, 2026
badf818
A secret no longer sets what the runtime reads of its own
echarles Oct 31, 2026
7f03deb
What woke a deployment's session is its owner's to say, not its caller's
echarles Oct 31, 2026
93417e3
A harness is lent no credential: the runtime holds it and adds it on …
echarles Nov 1, 2026
5fd4c18
Tests: a delegated credential reaches the gateway through the runtime…
echarles Nov 1, 2026
88645f7
Tests: a deployment's user secret is the platform's, though named as …
echarles Nov 1, 2026
a7fe92c
Reserved secret names hold deployments: a person's own runtime keeps …
echarles Nov 1, 2026
7f0577f
A harness holds no inference token: the runtime adds it on the pod's …
echarles Nov 1, 2026
88d8e57
A runtime launched for a deployment reads its owner's secrets, over i…
echarles Nov 1, 2026
53e0b2a
An owner's secrets stay out of a kernel they did not launch
echarles Nov 1, 2026
86bdc92
Speech balloon: an overlay's background, solid over what it floats on
echarles Nov 1, 2026
ac73ab1
CLI: benchmarks import, publish, unpublish and download
echarles Nov 1, 2026
f8c1eb7
Depend on @primer/octicons-react 19.42.0
echarles Nov 2, 2026
46b64cf
Code sandbox environment picker: long names ellipsed on one line, lab…
echarles Nov 2, 2026
46c0576
Code Sandboxes: a platform environment its definition disables is off…
echarles Nov 2, 2026
3a39ed1
Guards extend a Policy: the Guardrails catalogue removed, an agent's …
echarles Nov 5, 2026
0e98a81
Checks of a session's start read the Guard's Policy (R-06)
echarles Nov 5, 2026
a496e3f
1.5.103 with agentspecs 0.0.143: a Guard extends a Policy, the Guardr…
echarles Nov 5, 2026
82939cf
Tracks: drafting and regulated in the generated catalogue (agentspecs…
echarles Nov 6, 2026
39af840
1.5.104: agentspecs 0.0.144 (the drafting and regulated Tracks); the …
echarles Nov 6, 2026
aa95fb0
1.5.105: a catalogue MCP server asking for ${DATALAYER_API_KEY} on a …
echarles Nov 6, 2026
eed0b83
Battles: the kind generated from agentspecs 0.0.145 (generate_ops --k…
echarles Nov 6, 2026
de9931b
1.5.106: the releases green again — the Sensitive Data Guard knows an…
echarles Nov 6, 2026
3911a70
Streaming frontend tools (AGENT_BATTLE B1-00, the user, 6 November 20…
echarles Nov 6, 2026
9b93ff7
Streaming tools' events as turns (AGENT_BATTLE B1-00): the chat takes…
echarles Nov 6, 2026
5a31065
The team hook takes the page's frontend tools (AGENT_BATTLE B1-01): a…
echarles Nov 6, 2026
97f9ab9
BattleSpec.arena: a deck or a sheet beside the games' arenas (agentsp…
echarles Nov 6, 2026
93abb6e
SpeechBalloon: a small copy icon under the words — the words whole to…
echarles Nov 6, 2026
54c56f9
Tools: the machinery from @datalayer/reactor/tools — the adapters' To…
echarles Nov 6, 2026
e4b3790
QuestionView: Box from @datalayer/primer-addons, following the theme …
echarles Nov 6, 2026
94e6d22
Specs regenerated for agentspecs 0.0.148: the Player application and …
echarles Nov 6, 2026
3091b26
Specs regenerated: the Deck Maker wears the paper clip
echarles Nov 6, 2026
d6822c9
Specs regenerated: the Player moves to the height the arena says the …
echarles Nov 6, 2026
391a38a
Specs regenerated: the Sheet Maker inserts its chart before answering
echarles Nov 6, 2026
370b997
Stages: the kind generated from agentspecs 0.0.149 (generate_ops --ki…
echarles Nov 7, 2026
6a816c8
Overriding an application on stage: AppOverridesSpec on a Battle's co…
echarles Nov 7, 2026
1aa77a4
MCP servers: the catalogue carries what each spec says of itself — wh…
echarles Nov 7, 2026
6698471
MCP: the package init as the generator rewrites it
echarles Nov 7, 2026
3f00e11
Runtime image: Node.js 22 and uv, with the catalogue's local MCP serv…
echarles Nov 7, 2026
34ca154
Types: overrides optional on a cast member and a contestant — the gen…
echarles Nov 7, 2026
d00fb97
Catalogues regenerated from agentspecs: the Marketer (its application…
echarles Nov 7, 2026
563e057
Catalogues regenerated from agentspecs: the Discord MCP server with i…
echarles Nov 7, 2026
a191405
MCP servers regenerated: the setup sentences in Markdown (the user, 7…
echarles Nov 7, 2026
ad8bb41
MCP servers regenerated: Bluesky, LinkedIn and Discord enabled (the u…
echarles Nov 7, 2026
6c68b6e
Applications regenerated: the Order Tracker's sentence
echarles Nov 7, 2026
f11463c
Applications regenerated: clones, not copies
echarles Nov 7, 2026
1c74660
Catalogues regenerated: the Space Invaders arena, the invaders Battle…
echarles Nov 7, 2026
e1bae07
Battles: a Battle's evals (BattleEvalSpec: eval, config, says) in bot…
echarles Nov 7, 2026
b06603e
Image and Video Skills, every skill enabled (the user, 7 November 202…
echarles Nov 7, 2026
a884976
1.5.107: Image and Video Skills, every skill of the catalogue enabled…
echarles Nov 7, 2026
c4a26b6
Tests: the disabled-skill refusal puts its own disabled skill in the …
echarles Nov 7, 2026
dd7f007
1.5.108: reactor 1.3.5 the floor, which publishes @datalayer/reactor/…
echarles Nov 7, 2026
f488f46
1.5.109: the catalogue test names the deck and sheet makers, the play…
echarles Nov 7, 2026
1467cb5
1.5.110: jokes loads from its module (agentspecs 0.0.151, agent-skill…
echarles Nov 7, 2026
56a99fe
1.5.111: a kept runtime learns who launched it before refusing a sand…
echarles Nov 7, 2026
c7a82f9
Battles: the race runs to the end (the user, 7 November 2026) — first…
echarles Nov 7, 2026
2f93e15
Specs regenerated from agentspecs 0.0.152 (the user, 7 November 2026)…
echarles Nov 7, 2026
1be8c11
Models: a direct provider's model is called by the agent itself (the …
echarles Nov 7, 2026
bf1ad4a
Local models: an httpx client, not httpx2 (the user, 7 November 2026)…
echarles Nov 7, 2026
b582637
PAP 0.3 as published: pins (D4-01) — personal-agent-protocol 0.31.0 (…
echarles Nov 7, 2026
7b725f1
Specs regenerated from agentspecs 0.0.154: the Social Marketer carrie…
echarles Nov 7, 2026
d050cc3
PAP 0.3 as published: the company role's sign_in_disabled (D4-08) — A…
echarles Nov 7, 2026
730c30c
PAP 0.3 as published: extension content (D4-03) — the PAP capability …
echarles Nov 7, 2026
6545042
PAP 0.3 as published: the company role's sign_in_disabled (D4-08) — t…
echarles Nov 7, 2026
75a4f12
PAP 0.3 as published: the examples (D4-10) — the PAP views and traces…
echarles Nov 7, 2026
bac0bac
1.5.112: a Battle runs to the end; a direct provider's model (OpenRou…
echarles Nov 7, 2026
06f4836
PAP 0.3 as published: a company publishes its public skills (D4-06) —…
echarles Nov 7, 2026
1d1caca
1.5.113: agentspecs 0.0.156 is the floor (a company's publish_skills)…
echarles Nov 7, 2026
bef7e15
1.5.114: the PAP examples send an approval as extensions.operations (…
echarles Nov 7, 2026
3733605
Battles: a Battle's token (B4-01) — fetchBattleToken mints the token …
echarles Nov 7, 2026
3e42888
Battles: the demo books for a catalogue Battle (B4-01) — the visitors…
echarles Nov 7, 2026
8f41ee7
Battles: a runtime given no books key keeps its own rule (B4-01) — a …
echarles Nov 7, 2026
3979361
1.5.115: a Battle's own token (a per-play budget) and the demo books …
echarles Nov 7, 2026
bff6f29
PAP draft 0.4: pins (D5-01) — personal-agent-protocol 0.32.0 (draft 0…
echarles Nov 7, 2026
67ad1fa
specs: battle rubrics from agentspecs 0.0.157 — the judge's evidence …
echarles Nov 8, 2026
7f8f4ee
Memory: an agent's mem0 memories outlive its runtime — kept in Postgr…
echarles Nov 8, 2026
42b48af
configure-from-spec: without_mcp_servers — an agent configured with n…
echarles Nov 8, 2026
6854a1d
A company's website at PAP draft 0.4 (D5-09) — the company role's web…
echarles Nov 8, 2026
b63de24
Memory: a runtime keeps its agent's memories under the person it is a…
echarles Nov 8, 2026
65a3eb9
PAP draft 0.4 in the PAP capabilities (D5-03, D5-06) — PapPersonalAge…
echarles Nov 8, 2026
654f161
PAP examples at draft 0.4 (D5-12) — every example on the SDK 0.32.0: …
echarles Nov 8, 2026
ee39aa4
MCP: a server that lost the session gets a new one, and the call is a…
echarles Nov 8, 2026
2edee94
CLI: agent-runtimes mcp — a plain MCP client for the Datalayer gatewa…
echarles Nov 8, 2026
ebeab93
A Direct Conversation's answer at PAP draft 0.4 (D5-10) — portable/di…
echarles Nov 8, 2026
af238dc
mcp client: a result with no content answers its structured content —…
echarles Nov 8, 2026
495fb3c
configure-from-spec: without_skills — the skills named left out, by i…
echarles Nov 8, 2026
f1d1b53
loop --cloud --prompt: --without-mcp-servers and --without-skill conf…
echarles Nov 8, 2026
9b1f45e
Resume answers the runtime it launched (runtime_uid): a light pause i…
echarles Nov 8, 2026
d691be4
1.5.116: PAP draft 0.4 (SDK 0.32.0), memory kept in PostgreSQL across…
echarles Nov 8, 2026
69bf470
1.5.117: the memory tests run in CI (the test extra installs memory),…
echarles Nov 8, 2026
5ac7bbe
1.5.118: the memory backend names the package mem0 lacks, never 'requ…
echarles Nov 8, 2026
e4176d5
Specs regenerated from agentspecs 0.0.162: the odoo MCP server is the…
echarles Nov 8, 2026
dbacb65
loop: --without-mcp-servers and --without-skill declared on the loop …
echarles Nov 8, 2026
9093ab1
1.5.119: loop takes --without-mcp-servers and --without-skill (drille…
echarles Nov 8, 2026
b6275af
Specs from agentspecs 0.0.163: the Titan embedding models, priced — a…
echarles Nov 8, 2026
1de1cc9
mcp client, round two from a day on Odoo: -a values typed by the tool…
echarles Nov 8, 2026
d72a005
Tests: odoo-accounting is enabled since agentspecs 0.0.162, so it is …
echarles Nov 8, 2026
a657cc8
1.5.120: the four odoo-accounting tests follow agentspecs 0.0.162; 1.…
echarles Nov 8, 2026
73ee0aa
Tests on GitHub's runner: a span ends after its children in the milli…
echarles Nov 8, 2026
211c97f
1.5.121: a rehearsal's answer stays after the turn's words in the sam…
echarles Nov 8, 2026
4aae8a5
evals: the llm_judge gives way to Qwen-Max when its model is at its p…
echarles Nov 8, 2026
9267fa4
Specs from agentspecs 0.0.164: Customer Interviewer, Document Q&A and…
echarles Nov 8, 2026
cbadae2
Specs: an agent's policy — its own ask of the Shield, policy.shield (…
echarles Nov 8, 2026
5468e25
1.5.122: an agent answers while its MCP servers start — configure-fro…
echarles Nov 8, 2026
58d7733
Tests: Inbox triage's setup names its worker since agentspecs 0.0.164…
echarles Nov 8, 2026
ecbeebb
1.5.123: what 1.5.122 carries; the apps command's test expects Inbox …
echarles Nov 8, 2026
751083d
specs: agentspecs 0.0.166 — the Crawler Agent (and the Crawler Cog th…
echarles Nov 8, 2026
d733f1f
Memory routes: an agent's memory kept (POST /agents/{id}/memory), one…
echarles Nov 8, 2026
7ca3bd8
1.5.124: what 1.5.122 carries; the ready-without-MCP test leaves the …
echarles Nov 8, 2026
bf9283a
CHANGELOG: 1.5.124 — what 1.5.122 carries, and an agent's memory kept…
echarles Nov 8, 2026
3a5bc3a
1.5.125: loop tool-approvals (list, approve, reject the tool calls wa…
echarles Nov 8, 2026
5be8d4b
1.5.126: loop says the approval a run waits on and waits for its deci…
echarles Nov 8, 2026
9ed1569
Memory: the Crawler's memories outlive its pause as the Marketer's do…
echarles Nov 9, 2026
a655782
specs: agentspecs 0.0.167 — the Marketer gains the datalayer-memory s…
echarles Nov 9, 2026
56c5d4f
1.5.127: the Marketer lists and forgets what it remembers — worker-ma…
echarles Nov 9, 2026
f044ae2
1.5.128: what 1.5.127 carries — the evals-adapters gate's inspect env…
echarles Nov 9, 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
  •  
  •  
  •  
56 changes: 56 additions & 0 deletions .github/workflows/py-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,59 @@ jobs:

- name: Validate Personal Agent Protocol examples
run: python scripts/validate_pap_examples.py

# The external adapters, against the real framework, in the real sandbox: what
# the job above skips, since it holds no framework and its kernel no namespaces.
evals-adapters:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7
with:
token: ${{ secrets.GITHUB_TOKEN }}

- name: Install system deps
run: |
sudo apt-get update
sudo apt-get install -y libdbus-1-3 libdbus-1-dev libglib2.0-dev

# Ubuntu's AppArmor refuses unprivileged user namespaces by default; the
# sandbox refuses to run without them, so these tests would only skip.
- name: Allow user namespaces
run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0

- uses: astral-sh/setup-uv@v7
with:
version: "latest"
python-version: "3.13"
activate-environment: true

- name: Install the package
run: uv pip install -e .[test]

# In an environment of its own, as in the adapter's image: the pin is the
# adapter's, read from it. tiktoken's encoding is seeded because a sandbox
# has no network to fetch it with.
- name: Install the pinned Inspect
run: |
version=$(sed -n 's/^INSPECT_VERSION = "\(.*\)"$/\1/p' agent_runtimes/evals/adapters/inspect_ai.py)
uv venv "$RUNNER_TEMP/inspect"
uv pip install --python "$RUNNER_TEMP/inspect/bin/python" "inspect-ai==$version" "agent-client-protocol<1" openai packaging
TIKTOKEN_CACHE_DIR="$RUNNER_TEMP/tiktoken" "$RUNNER_TEMP/inspect/bin/python" -c "import tiktoken; tiktoken.get_encoding('o200k_base')"

- name: Install the pinned Harbor
run: |
version=$(sed -n 's/^HARBOR_VERSION = "\(.*\)"$/\1/p' agent_runtimes/evals/adapters/harbor.py)
uv venv "$RUNNER_TEMP/harbor"
uv pip install --python "$RUNNER_TEMP/harbor/bin/python" "harbor==$version"

# What a task's own Dockerfile starts from, so those tests run rather than skip.
- name: Pull the task image
run: docker pull python:3.12-slim

- name: Run the adapter tests
env:
DATALAYER_INSPECT_AI_PYTHON: ${{ runner.temp }}/inspect/bin/python
DATALAYER_INSPECT_AI_TIKTOKEN_CACHE: ${{ runner.temp }}/tiktoken
DATALAYER_HARBOR_PYTHON: ${{ runner.temp }}/harbor/bin/python
run: pytest agent_runtimes/tests/test_evals_adapters.py agent_runtimes/tests/test_evals_adapters_environments.py agent_runtimes/tests/test_evals_adapters_relay.py agent_runtimes/tests/test_evals_adapters_harbor_docker.py agent_runtimes/tests/test_evals_adapters_harbor_sources.py agent_runtimes/tests/test_evals_adapters_sandbox.py agent_runtimes/tests/test_evals_adapters_inspect.py agent_runtimes/tests/test_evals_adapters_harbor.py agent_runtimes/tests/test_evals_adapters_command.py
2 changes: 2 additions & 0 deletions .licenserc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ header:

paths-ignore:
- '**/*.toml'
- '**/*.mmd'
- '**/*.apt'
- '**/*.cedar'
- '**/*.csv'
Expand All @@ -17,6 +18,7 @@ header:
- '**/*.ipynb'
- '**/*.j2'
- '**/*.json'
- '**/*.jsonl'
- '**/*.mamba'
- '**/*.md'
- '**/*.mdx'
Expand Down
149 changes: 149 additions & 0 deletions CHANGELOG.md

Large diffs are not rendered by default.

26 changes: 19 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,6 @@ RUFF_TARGETS = \
agent_runtimes/specs/model_providers.py \
agent_runtimes/specs/memory.py \
agent_runtimes/specs/strategies.py \
agent_runtimes/specs/guardrails.py \
agent_runtimes/specs/benchmarks.py \
agent_runtimes/specs/evals.py \
agent_runtimes/specs/triggers.py \
Expand Down Expand Up @@ -435,7 +434,7 @@ loop-demo-nocodemode: # loop-demo-nocodemode
list-specs: # list specs
agent-runtimes list-specs

specs: specs-clone specs-sandbox-variants specs-generate specs-format ## generate Python and TypeScript code from YAML specifications (agents, teams, scenes, frames, cogs, ops, guards, gates, tracks, applications, MCP servers, skills, envvars)
specs: specs-clone specs-sandbox-variants specs-generate specs-format ## generate Python and TypeScript code from YAML specifications (agents, teams, scenes, frames, cogs, ops, guards, gates, tracks, battles, stages, applications, MCP servers, skills, envvars)

specs-sandbox-variants: ## scaffold sandbox example agent specs for all supported sandbox variants
$(call step,Generating sandbox variant example agents)
Expand Down Expand Up @@ -583,6 +582,24 @@ specs-generate: ## generate all Python and TypeScript specs from YAML
else \
echo "Skipping Track specifications: $(AGENTSPECS_DIR)/agentspecs/tracks not found (agentspecs < 0.0.14)"; \
fi
$(call step,Generating Battle specifications)
@if [ -d "$(AGENTSPECS_DIR)/agentspecs/battles" ]; then \
python scripts/codegen/generate_ops.py --kind battles \
--specs-dir $(AGENTSPECS_DIR)/agentspecs/battles \
--python-output agent_runtimes/specs/battles.py \
--typescript-output src/specs/battles.ts; \
else \
echo "Skipping Battle specifications: $(AGENTSPECS_DIR)/agentspecs/battles not found (agentspecs < 0.0.145)"; \
fi
$(call step,Generating Stage specifications)
@if [ -d "$(AGENTSPECS_DIR)/agentspecs/stages" ]; then \
python scripts/codegen/generate_ops.py --kind stages \
--specs-dir $(AGENTSPECS_DIR)/agentspecs/stages \
--python-output agent_runtimes/specs/stages.py \
--typescript-output src/specs/stages.ts; \
else \
echo "Skipping Stage specifications: $(AGENTSPECS_DIR)/agentspecs/stages not found (agentspecs < 0.0.149)"; \
fi
$(call step,Generating Op specifications)
@if [ -d "$(AGENTSPECS_DIR)/agentspecs/ops" ]; then \
python scripts/codegen/generate_ops.py --kind ops \
Expand Down Expand Up @@ -622,11 +639,6 @@ specs-generate: ## generate all Python and TypeScript specs from YAML
--specs-dir $(AGENTSPECS_DIR)/agentspecs/strategies \
--python-output agent_runtimes/specs/strategies.py \
--typescript-output src/specs/strategies.ts
$(call step,Generating guardrail specifications)
python scripts/codegen/generate_guardrails.py \
--specs-dir $(AGENTSPECS_DIR)/agentspecs/guardrails \
--python-output agent_runtimes/specs/guardrails.py \
--typescript-output src/specs/guardrails.ts
$(call step,Generating eval specifications)
python scripts/codegen/generate_evals.py \
--specs-dir $(AGENTSPECS_DIR)/agentspecs/evals \
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ loop --local -a example-simple

- **The meta-harness.** Coding agents run as harnesses, driven over the Agent Client Protocol (ACP): **Claude Code, Codex, OpenCode and pi** today. The runtime launches the harness, lends it tools through the MCP gateway and writes the skills into its workspace. It serves the harness over every protocol it serves its own agents on. The **Shield** surrounds it: the pod's egress boundary, the policies and the session's rules, the audit record and the trace. See [Harnesses](https://agent-runtimes.datalayer.tech/harnesses/) and [the Shield](https://agent-runtimes.datalayer.tech/shield/).
- **Protocol integrations.**
- *Transports to a UI or another agent*: AG-UI, the Vercel AI SDK, ACP and A2A (served, and called as a client), with A2UI, MCP-UI and MCP Apps for generative UI.
- *Transports to a UI or another agent*: AG-UI, the Vercel AI SDK, ACP and A2A (served, and called as a client), with A2UI and MCP-UI for generative UI.
- *Tools*: MCP, local servers over stdio and remote servers over Streamable HTTP.
- *Identity, consent and commerce*, each a Reactor plugin: Web Bot Auth (with a draft TAP profile), PAP (Personal Agent Protocol), PACT, UCP and the Agentic Commerce Protocol.

Expand Down
37 changes: 36 additions & 1 deletion agent_runtimes/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import asyncio
import logging
import os
import sys
from typing import Annotated, Optional

import typer
Expand Down Expand Up @@ -67,6 +68,7 @@
from agent_runtimes.commands.list_specs import (
list_agentspecs,
)
from agent_runtimes.commands.mcp import app as mcp_app
from agent_runtimes.commands.mcp_servers_catalog import (
OutputFormat as CatalogOutputFormat,
)
Expand Down Expand Up @@ -94,9 +96,24 @@
serve_server,
)
from agent_runtimes.commands.sessions import app as sessions_app
from agent_runtimes.commands.tool_approvals import app as tool_approvals_app


def _log_level(argv: list[str]) -> int:
"""INFO, but WARNING for `agent-runtimes mcp …` without `-v`.

`mcp` prints a result meant for `| jq`; the libraries imported below
(botocore at the chat import) log at INFO before any command runs.
"""
words = [word for word in argv[1:] if not word.startswith("-")]
if words[:1] == ["mcp"] and not {"-v", "--verbose"} & set(argv[1:]):
return logging.WARNING
return logging.INFO


logging.basicConfig(
level=logging.INFO,
level=_log_level(sys.argv),
stream=sys.stderr,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)
logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -363,6 +380,16 @@ def main_callback(
"--keep",
help="Leave the cloud runtime running when the session ends.",
),
without_mcp_servers: bool = typer.Option(
False,
"--without-mcp-servers",
help="Configure the cloud runtime's agent with none of its MCP servers (with --cloud and --prompt).",
),
without_skills: list[str] | None = typer.Option(
None,
"--without-skill",
help="Leave this skill of the agent out, by id; repeat for each (with --cloud and --prompt).",
),
prompts: list[str] | None = typer.Option(
None,
"--prompt",
Expand Down Expand Up @@ -510,6 +537,12 @@ def main_callback(
chat_args.extend(["--minutes", str(minutes)])
if keep:
chat_args.append("--keep")
# Declared here and handed on: an option the group does not know is
# read as the name of a command.
if without_mcp_servers:
chat_args.append("--without-mcp-servers")
for skill in without_skills or []:
chat_args.extend(["--without-skill", skill])
for prompt in prompts or []:
chat_args.extend(["--prompt", prompt])
if harness:
Expand Down Expand Up @@ -563,6 +596,8 @@ def harnesses_command() -> None:
app.add_typer(sandboxes_app)
app.add_typer(console_app)
app.add_typer(memory_app)
app.add_typer(tool_approvals_app)
app.add_typer(mcp_app)
app.add_typer(envs_app)
app.add_typer(evals_app)
app.add_typer(pools_app)
Expand Down
65 changes: 65 additions & 0 deletions agent_runtimes/access_log.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Copyright (c) 2025-2026 Datalayer, Inc.
# Distributed under the terms of the Modified BSD License.

"""
No token in the server's log.

A browser cannot set a header on a websocket, so the page sends its token in
the query string — ``/api/v1/configure/sandbox/ws?agent_id=…&token=eyJ…`` —
and uvicorn logged that path whole, the user's JWT with it (r1, 8 November
2026): in its access log for a request, in ``uvicorn.error`` for a websocket
it accepted or refused. A filter on both loggers withholds the value of every
credential in a query string before the line is written.
"""

from __future__ import annotations

import logging
import re
from typing import Any

#: A query parameter whose value is a credential.
_QUERY_CREDENTIAL = re.compile(
r"([?&](?:token|access_token|id_token|api_key|apikey|key|jwt|auth|"
r"authorization|password|secret)=)[^&\s\"']+",
re.IGNORECASE,
)

WITHHELD = "[withheld]"

#: The loggers uvicorn writes a request's path to.
LOGGERS = ("uvicorn.access", "uvicorn.error", "uvicorn")


def redact_query(text: str) -> str:
"""``text`` with the value of each credential in a query string withheld."""
return _QUERY_CREDENTIAL.sub(lambda m: m.group(1) + WITHHELD, text)


def _redacted(value: Any) -> Any:
if isinstance(value, str):
return redact_query(value)
if isinstance(value, tuple):
return tuple(_redacted(v) for v in value)
if isinstance(value, dict):
return {k: _redacted(v) for k, v in value.items()}
return value


class QueryTokenFilter(logging.Filter):
"""Withhold the credentials of a query string in a log record."""

def filter(self, record: logging.LogRecord) -> bool:
if isinstance(record.msg, str):
record.msg = redact_query(record.msg)
if record.args:
record.args = _redacted(record.args)
return True


def install_access_log_redaction() -> None:
"""Put the filter on uvicorn's loggers, once."""
for name in LOGGERS:
logger = logging.getLogger(name)
if not any(isinstance(f, QueryTokenFilter) for f in logger.filters):
logger.addFilter(QueryTokenFilter())
Loading
Loading