Skip to content

feat(dynamic): bare-key naming + rename connection tools#146

Open
ctgowrie wants to merge 8 commits into
mainfrom
feat/dynamic-no-prefix-option
Open

feat(dynamic): bare-key naming + rename connection tools#146
ctgowrie wants to merge 8 commits into
mainfrom
feat/dynamic-no-prefix-option

Conversation

@ctgowrie

@ctgowrie ctgowrie commented Jun 20, 2026

Copy link
Copy Markdown
Collaborator

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/defineSkill is still named after the file slug.

// agent/skills/custom.ts
export default defineDynamic({
  events: { "turn.started": () => ({ "talk-like-a-dog": defineSkill({ ... }) }) },
});
// loadable as: talk-like-a-dog   (no automatic custom__ prefix)

Namespace keys yourself (e.g. team__playbook) when a bare name might collide.

Conflicts

  • A dynamic tool/skill overrides a same-named authored one — a per-caller resolver can replace a built-in by name.
  • Two dynamic resolvers emitting the same name throw, recommending manual namespacing. (Tools previously last-wins'd silently; this surfaces the collision like skills already did.)

Connection tools renamed

The redundant outer connection__ prefix is gone:

  • search tool: connection__searchconnection_search
  • discovered tools: connection__<connection>__<tool><connection>__<tool> (e.g. linear__list_issues)

How

namespace plumbing (added in an earlier revision of this PR) is removed end-to-end: defineDynamic/sentinel, compiled types + Zod schemas, normalizers, resolved resolver types, and the qualifyDynamic*Names functions (map branch → bare key). The connection-search resolver names its search entry connection_search and reports discovered tools as <connection>__<tool>.

Tests / docs

  • Unit: bare-key naming for tools + skills (real dispatch), dynamic-over-authored override, dynamic×dynamic collision errors, sentinel→compiled flow. Updated connection-search, code-mode, tool-loop, schema-backed, and the lifecycle tests.
  • E2E (agent-skills, agent-tools, agent-openapi-swagger): bare-key + override fixtures; dynamic-single-map repurposed as the manual-namespacing example; connection evals call connection_search / <connection>__<tool>.
  • Docs: dynamic-capabilities, connections, subagents, connect-a-warehouse, default-harness, OpenAPI JSDoc. patch changeset.

Verification

  • pnpm test:unit (3716 + 6 passing), typecheck (clean for changed files), lint, fmt, guard:invariants, docs:check all pass.
  • build:js/test:integration/test:scenario/e2e could not run locally — blocked by a pre-existing, unrelated @types/node 24 error in src/public/channels/slack/api.ts:382 (gates build:types). CI runs the full matrix.

🤖 Generated with Claude Code

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>
@vercel

vercel Bot commented Jun 20, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
eve-docs Ready Ready Preview, Comment, Open in v0 Jun 21, 2026 3:07am

@github-actions

github-actions Bot commented Jun 20, 2026

Copy link
Copy Markdown
Contributor

Bundle + Package Summary: apps/fixtures/weather-agent

Key takeaways

  • No notable deltas vs main (c6d04a9).

Delta vs main (c6d04a9)

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>
@ctgowrie ctgowrie changed the title feat(dynamic): namespace:false opt-out + dynamic-wins conflicts feat(dynamic): bare-key naming + rename connection tools Jun 21, 2026
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>

@vercel vercel Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Additional Suggestion:

TUI smoke test prompt instructs the model to call the nonexistent tool name connection__stub-mcp-user__echo_marker after the tool-naming scheme was renamed to drop the connection__ prefix.

Fix on Vercel

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
AndrewBarba previously approved these changes Jun 21, 2026
Comment thread .changeset/dynamic-namespace-option.md
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants