feat(dynamic): bare-key naming + rename connection tools#146
Open
ctgowrie wants to merge 8 commits into
Open
Conversation
Add `defineDynamic({ namespace: false })` so a map resolver exposes each entry
under its bare key (e.g. `talk-like-a-dog`) instead of the slug-qualified
`custom__talk-like-a-dog`. Threaded from the sentinel through compile (manifest +
normalizers) to the resolved resolver, and honored in qualifyDynamicTool/SkillNames
for tools and skills. Instructions carry no model-visible name, so the flag is a
no-op there.
Dynamic tools and skills now also override a same-named authored one: skills no
longer throw on an authored conflict (the dynamic write overwrites the same sandbox
path), and tools flip from authored-wins to dynamic-wins in the tool-loop merge. Two
dynamic resolvers emitting the same name still throws.
Adds unit coverage (namespace false naming for tools+skills, authored override,
sentinel→compiled flow), an e2e bare-key eval, docs, and a minor changeset.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
Bundle + Package Summary:
|
| Area | Metric | Baseline | Current | Delta |
|---|---|---|---|---|
| Package | Packed tarball | 3.24 MB | 3.24 MB | +415 B |
| Package | Unpacked publish size | 11.61 MB | 11.61 MB | +468 B |
| Package | Installed footprint | 51.82 MB | 51.82 MB | +468 B |
| Package | Published files | 2173 | 2173 | 0 |
| Package | Installed files | 5378 | 5378 | 0 |
| Runtime | Unique function payloads | 2 | 2 | 0 |
| Runtime | Total function bytes | 9.34 MB | 9.34 MB | -133 B ✅ |
| Runtime | Public routes | 9 | 9 | 0 |
Changed function payloads vs main (c6d04a9) (2)
| Function | Status | Baseline | Current | Delta | Route changes |
|---|---|---|---|---|---|
functions/__server.func |
changed | 3.86 MB | 3.86 MB | -176 B ✅ | none |
functions/.well-known/workflow/v1/flow.func |
changed | 5.48 MB | 5.48 MB | +43 B |
none |
Build Metadata
- Preset:
vercel - Nitro:
nitro@3.0.260610-beta - Output directory:
apps/fixtures/weather-agent/.vercel/output - Build metadata timestamp: 2026-06-21T03:07:23.783Z
- Route aliases: 9 public, 1 internal (10 total aliases)
- Vercel routes in config: 10
- Severity legend: 🔴 dominant/large, 🟠 notable, 🟡 watch, ⚪ small
Package Drill-Down
Package Details
- Package:
eve@0.11.10 - Package directory:
packages/eve - Tarball: 3.24 MB (
eve-0.11.10.tgz) - Unpacked payload: 11.61 MB across 2173 published files
- Installed footprint: 51.82 MB across 5378 installed files
- Installed root package: 10.50 MB
- Installed dependencies: 41.32 MB
- Runtime dependencies: 1
- Peer dependencies: 12 (11 optional)
Installed footprint is measured from an isolated temporary npm install of the packed tarball.
Heavy installed dependencies
@rolldown/binding-linux-x64-gnu: 20.61 MB (39.8%)eve: 10.50 MB (20.3%)ai: 6.20 MB (12.0%)zod: 4.97 MB (9.6%)nitro: 2.41 MB (4.6%)
Publish payload breakdown
Published file size
🟠 dist/src/compiled/experimental-ai-sdk-code-mo... [#####...................] 1.51 MB 13.0%
🟡 dist/src/compiled/@workflow/core/runtime.js [##......................] 775.4 kB 6.7%
🟡 dist/src/compiled/@vercel/sandbox/index.js [##......................] 632.0 kB 5.4%
🟡 dist/src/compiled/@chat-adapter/slack/index.js [#.......................] 436.9 kB 3.8%
🟡 dist/src/compiled/_chunks/workflow/attribute-... [#.......................] 370.9 kB 3.2%
🔴 Other published files [########################] 7.89 MB 68.0%
Installed footprint breakdown
Installed package size
🔴 @rolldown/binding-linux-x64-gnu [########################] 20.61 MB 39.8%
🔴 eve [############............] 10.50 MB 20.3%
🔴 ai [#######.................] 6.20 MB 12.0%
🟠 zod [######..................] 4.97 MB 9.6%
🟠 nitro [###.....................] 2.41 MB 4.6%
🟡 rolldown [#.......................] 771.0 kB 1.5%
🔴 Other installed packages [#######.................] 6.37 MB 12.3%
Runtime dependencies (1)
| Package | Range | Notes |
|---|---|---|
nitro |
3.0.260610-beta |
Peer dependencies (12)
| Package | Range | Notes |
|---|---|---|
@opentelemetry/api |
^1.0.0 |
optional peer |
@sveltejs/kit |
^2.0.0 |
optional peer |
ai |
catalog: |
|
braintrust |
^3.0.0 |
optional peer |
just-bash |
^3.0.0 |
optional peer |
microsandbox |
^0.5.0 |
optional peer |
next |
^16.0.0 |
optional peer |
nuxt |
^4.0.0 |
optional peer |
react |
^19.0.0 |
optional peer |
svelte |
^5.0.0 |
optional peer |
vite |
^8.0.0 |
optional peer |
vue |
^3.5.0 |
optional peer |
Function Drill-Down
Payload Size Graph
Unique function payload size and share of total
🔴 functions/.well-known/workflow/v1/flow.func [########################] 5.48 MB 58.6%
🔴 functions/__server.func [#################.......] 3.86 MB 41.4%
Top Function Payloads
🟠 functions/.well-known/workflow/v1/flow.func • 1 public route • 5.48 MB
| Metric | Value |
|---|---|
| Public routes | /.well-known/workflow/v1/flow |
| Runtime | nodejs24.x |
| Handler | index.mjs |
| Payload | 5.48 MB |
| Function files | 5.48 MB across 27 files |
| Traced dependencies | 0 B |
| Signal | 🟠 Bundled file __eve_nitro_handler__.mjs is 1.51 MB (27.5%) |
🟠 🔎 Dependency Analysis
📦 Bundled files:
Bundled file size
🟠 __eve_nitro_handler__.mjs [########################] 1.51 MB 27.5%
🟠 _chunks/runtime.mjs [###############.........] 958.4 kB 17.5%
🟡 _chunks/sandbox.mjs [############............] 766.0 kB 14.0%
🟡 _chunks/attribute-changes-Bi5DLT8S.mjs [########................] 472.2 kB 8.6%
🟡 _chunks/dist-DTchiX0N.mjs [#######.................] 460.6 kB 8.4%
🟠 Other bundled files [#####################...] 1.31 MB 24.0%
🧾 Vercel Config
{
"handler": "index.mjs",
"launcherType": "Nodejs",
"shouldAddHelpers": false,
"supportsResponseStreaming": true,
"runtime": "nodejs24.x",
"environment": {
"NODE_OPTIONS": "--experimental-require-module",
"WORKFLOW_QUEUE_NAMESPACE": "eve"
},
"maxDuration": "max",
"experimentalTriggers": [
{
"type": "queue/v2beta",
"topic": "__eve_wkf_workflow_*",
"consumer": "default",
"retryAfterSeconds": 5,
"initialDelaySeconds": 0
}
]
}🟠 functions/__server.func • 8 public routes, 1 internal alias • 3.86 MB
| Metric | Value |
|---|---|
| Public routes | //eve/v1/callback/[token]/eve/v1/connections/[name]/callback/[token]/eve/v1/health/eve/v1/info/eve/v1/session/eve/v1/session/[sessionId]/eve/v1/session/[sessionId]/stream |
| Internal aliases | /__server |
| Runtime | nodejs24.x |
| Handler | index.mjs |
| Payload | 3.86 MB |
| Function files | 3.86 MB across 21 files |
| Traced dependencies | 0 B |
| Signal | 🟠 Bundled file index.mjs is 1.40 MB (36.3%) |
🟠 🔎 Dependency Analysis
📦 Bundled files:
Bundled file size
🟠 index.mjs [########################] 1.40 MB 36.3%
🟠 _chunks/runtime.mjs [###############.........] 875.8 kB 22.7%
🟠 _chunks/sandbox.mjs [#############...........] 766.0 kB 19.8%
🟡 _chunks/attribute-changes-Bi5DLT8S.mjs [########................] 448.5 kB 11.6%
⚪ _libs/zod.mjs [##......................] 114.2 kB 3.0%
🟡 Other bundled files [####....................] 258.8 kB 6.7%
🧾 Vercel Config
{
"handler": "index.mjs",
"launcherType": "Nodejs",
"shouldAddHelpers": false,
"supportsResponseStreaming": true,
"runtime": "nodejs24.x"
}Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Add an authored `override-target` tool plus a `namespace: false` dynamic resolver that emits a tool of the same name, and an eval asserting the call returns the dynamic result (`source: "dynamic"`), never the authored one. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
The namespace field on the compiled/resolved/sentinel internal types restated the type; the public docs live on defineDynamic. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Remove the namespace param from defineDynamic. Dynamic map resolvers now name each entry by its bare key (a single defineTool/defineSkill is still named after the file slug); authors namespace keys themselves (e.g. team__playbook) to avoid collisions. A dynamic tool/skill overrides a same-named authored one; two dynamic resolvers emitting the same name throw, recommending manual namespacing. Connection tools are renamed accordingly: the search tool is `connection_search` and discovered tools are `<connection>__<tool>` (e.g. linear__list_issues), dropping the redundant outer `connection__` prefix. Updates runtime, tests, e2e fixtures, and docs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
It changes public naming behavior (no auto-namespacing) and renames connection tools — a breaking change. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
The pre-existing dynamic-tools and dynamic-skill-map evals asserted the old `slug__key` names. With bare-key naming the map entries are named by their bare key, so update the eval prompts and assertions to match (echo_dynamic, alpha, shared, check_stability, etc.). dynamic-single-map keeps its manually-namespaced `dynamic-single-map__solo` key on purpose. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
AndrewBarba
previously approved these changes
Jun 21, 2026
The namespace distinction is no longer a feature (bare keys are the default), so the namespacing-vs-bare-key skill evals (flat-store, dynamic-single-map) are redundant with dynamic-skill-map (map → bare key) and dynamic-skill (single → slug). Remove them. Add a skill-conflict eval: a dynamic resolver emits a skill named `house-rules`, the same name as an authored `house-rules.md`, and the dynamic body must win on load. This covers the skill override path (sandbox overwrite), complementing the existing tool conflict eval (authored-override). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Dynamic map resolvers no longer auto-prefix entries with the file slug. The map key is the tool/skill name verbatim; a single
defineTool/defineSkillis still named after the file slug.Namespace keys yourself (e.g.
team__playbook) when a bare name might collide.Conflicts
Connection tools renamed
The redundant outer
connection__prefix is gone:connection__search→connection_searchconnection__<connection>__<tool>→<connection>__<tool>(e.g.linear__list_issues)How
namespaceplumbing (added in an earlier revision of this PR) is removed end-to-end:defineDynamic/sentinel, compiled types + Zod schemas, normalizers, resolved resolver types, and thequalifyDynamic*Namesfunctions (map branch → bare key). The connection-search resolver names its search entryconnection_searchand reports discovered tools as<connection>__<tool>.Tests / docs
connection-search,code-mode,tool-loop,schema-backed, and the lifecycle tests.agent-skills,agent-tools,agent-openapi-swagger): bare-key + override fixtures;dynamic-single-maprepurposed as the manual-namespacing example; connection evals callconnection_search/<connection>__<tool>.dynamic-capabilities,connections,subagents,connect-a-warehouse,default-harness, OpenAPI JSDoc.patchchangeset.Verification
pnpm test:unit(3716 + 6 passing),typecheck(clean for changed files),lint,fmt,guard:invariants,docs:checkall pass.build:js/test:integration/test:scenario/e2e could not run locally — blocked by a pre-existing, unrelated@types/node24 error insrc/public/channels/slack/api.ts:382(gatesbuild:types). CI runs the full matrix.🤖 Generated with Claude Code