feat(eve): memory - add portable file memory - #1703
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Bundle + Package Summary:
|
| Area | Metric | Baseline | Current | Delta |
|---|---|---|---|---|
| Package | Packed tarball | 7.96 MB | 8.11 MB | +143.9 kB |
| Package | Unpacked publish size | 29.76 MB | 30.23 MB | +469.8 kB |
| Package | Installed footprint | 73.27 MB | 73.74 MB | +469.8 kB |
| Package | Published files | 3182 | 3201 | +19 |
| Package | Installed files | 6892 | 6911 | +19 |
| Runtime | Unique function payloads | 2 | 2 | 0 |
| Runtime | Total function bytes | 17.20 MB | 17.20 MB | -40 B ✅ |
| Runtime | Public routes | 14 | 14 | 0 |
Changed function payloads vs barba/first-class-memory (cd18a36) (2)
| Function | Status | Baseline | Current | Delta | Route changes |
|---|---|---|---|---|---|
functions/__server.func |
changed | 8.60 MB | 8.60 MB | -20 B ✅ | none |
functions/.well-known/workflow/v1/flow.func |
changed | 8.60 MB | 8.60 MB | -20 B ✅ | none |
eve init install
| Metric | Baseline | Current | Delta |
|---|---|---|---|
| Installed footprint | 111.68 MB | 112.15 MB | +469.8 kB |
| Installed packages | 121 | 121 | 0 |
| dependencies | 4 | 4 | 0 |
| devDependencies | 2 | 2 | 0 |
| Dependency package bytes | 44.25 MB | 44.72 MB | +469.8 kB |
| devDependency package bytes | 5.04 MB | 5.04 MB | 0 B ➖ |
Build Metadata
- Preset:
vercel - Nitro:
nitro@3.0.260610-beta - Output directory:
apps/fixtures/weather-agent/.vercel/output - Build metadata timestamp: 2026-08-12T21:33:14.917Z
- Route aliases: 14 public, 1 internal (15 total aliases)
- Vercel routes in config: 17
- Severity legend: 🔴 dominant/large, 🟠 notable, 🟡 watch, ⚪ small
Package Drill-Down
Package Details
- Package:
eve@0.33.3 - Package directory:
packages/eve - Tarball: 8.11 MB (
eve-0.33.3.tgz) - Unpacked payload: 30.23 MB across 3201 published files
- Installed footprint: 73.74 MB across 6911 installed files
- Installed root package: 28.87 MB
- Installed dependencies: 44.87 MB
- Runtime dependencies: 2
- Peer dependencies: 5 (4 optional)
Installed footprint is measured from an isolated temporary npm install of the packed tarball.
Heavy installed dependencies
eve: 28.87 MB (39.2%)@rolldown/binding-linux-x64-gnu: 19.41 MB (26.3%)ai: 6.68 MB (9.1%)zod: 5.07 MB (6.9%)undici: 3.50 MB (4.8%)
Publish payload breakdown
Published file size
🔴 dist/src/compiled/shadcn-registry/index.js [################........] 10.19 MB 33.7%
🟠 dist/src/compiled/@photon-ai/chat-adapter-ime... [####....................] 2.42 MB 8.0%
🟠 dist/src/compiled/experimental-ai-sdk-code-mo... [##......................] 1.51 MB 5.0%
🟡 dist/src/compiled/_chunks/workflow/undici-BNc... [#.......................] 508.8 kB 1.7%
🟡 dist/src/compiled/_chunks/node/undici-CUIybhQ... [#.......................] 508.8 kB 1.7%
🔴 Other published files [########################] 15.09 MB 49.9%
Installed footprint breakdown
Installed package size
🔴 eve [########################] 28.87 MB 39.2%
🔴 @rolldown/binding-linux-x64-gnu [################........] 19.41 MB 26.3%
🔴 ai [######..................] 6.68 MB 9.1%
🔴 zod [####....................] 5.07 MB 6.9%
🟠 undici [###.....................] 3.50 MB 4.8%
🟠 nitro [##......................] 2.41 MB 3.3%
🔴 Other installed packages [######..................] 7.80 MB 10.6%
Runtime dependencies (2)
| Package | Range | Notes |
|---|---|---|
nitro |
3.0.260610-beta |
|
undici |
8.9.0 |
Peer dependencies (5)
| Package | Range | Notes |
|---|---|---|
@opentelemetry/api |
^1.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 |
eve init install drill-down
eve init install details
- Command:
eve init my-agent - Package manager:
npm - Installed footprint: 112.15 MB across 8787 installed files
- Installed packages: 121 total (115 transitive-only)
- dependencies: 4 direct packages totaling 44.72 MB
- devDependencies: 2 direct packages totaling 5.04 MB
- Other transitive package files: 62.39 MB
Installed footprint is measured from an isolated temporary eve init my-agent using the current packed eve tarball.
Heavy installed dependencies
eve: 28.87 MB (25.7%)@typescript/typescript-linux-x64: 27.95 MB (24.9%)@rolldown/binding-linux-x64-gnu: 19.41 MB (17.3%)zod: 9.02 MB (8.0%)ai: 6.68 MB (6.0%)
Installed footprint breakdown
Installed package size
🔴 eve [########################] 28.87 MB 25.7%
🔴 @typescript/typescript-linux-x64 [#######################.] 27.95 MB 24.9%
🔴 @rolldown/binding-linux-x64-gnu [################........] 19.41 MB 17.3%
🔴 zod [########................] 9.02 MB 8.0%
🔴 ai [######..................] 6.68 MB 6.0%
🟠 undici [###.....................] 3.50 MB 3.1%
🔴 Other installed packages [##############..........] 16.71 MB 14.9%
dependencies (4)
| Package | Range | Installed size | Share |
|---|---|---|---|
@vercel/connect |
0.4.3 |
141.0 kB | 0.1% |
ai |
^7.0.58 |
6.68 MB | 6.0% |
eve |
file:eve-0.33.3.tgz |
28.87 MB | 25.7% |
zod |
4.4.3 |
9.02 MB | 8.0% |
devDependencies (2)
| Package | Range | Installed size | Share |
|---|---|---|---|
@types/node |
24.x |
2.54 MB | 2.3% |
typescript |
7.0.2 |
2.50 MB | 2.2% |
Function Drill-Down
Payload Size Graph
Unique function payload size and share of total
🔴 functions/.well-known/workflow/v1/flow.func [########################] 8.60 MB 50.0%
🔴 functions/__server.func [########################] 8.60 MB 50.0%
Top Function Payloads
🟠 functions/.well-known/workflow/v1/flow.func • 1 public route • 8.60 MB
| Metric | Value |
|---|---|
| Public routes | /.well-known/workflow/v1/flow |
| Runtime | nodejs24.x |
| Handler | index.mjs |
| Payload | 8.60 MB |
| Function files | 8.60 MB across 46 files |
| Traced dependencies | 0 B |
| Signal | 🟠 Bundled file index.mjs is 2.45 MB (28.5%) |
🟠 🔎 Dependency Analysis
📦 Bundled files:
Bundled file size
🟠 index.mjs [########################] 2.45 MB 28.5%
🟠 _chunks/runtime-artifacts.mjs [################........] 1.65 MB 19.2%
🟡 _libs/undici.mjs [##########..............] 980.5 kB 11.4%
🟡 _chunks/sandbox.mjs [########................] 777.7 kB 9.0%
🟡 _chunks/token-util-DNwIAn_u.mjs [####....................] 381.0 kB 4.4%
🟠 Other bundled files [#######################.] 2.36 MB 27.4%
🧾 Vercel Config
{
"handler": "index.mjs",
"launcherType": "Nodejs",
"shouldAddHelpers": false,
"supportsResponseStreaming": true,
"runtime": "nodejs24.x",
"maxDuration": "max",
"experimentalTriggers": [
{
"type": "queue/v2beta",
"topic": "__eve776561746865722d6167656e74_wkf_workflow_*",
"consumer": "default",
"retryAfterSeconds": 5,
"initialDelaySeconds": 0
}
],
"environment": {
"WORKFLOW_PRECONDITION_GUARD": "1"
}
}🟠 functions/__server.func • 13 public routes, 1 internal alias • 8.60 MB
| Metric | Value |
|---|---|
| Public routes | //eve/v1/callback/[token]/eve/v1/connections/[name]/callback/[attemptId]/[token]/eve/v1/connections/[name]/callback/[token]/eve/v1/health/eve/v1/info/eve/v1/session/eve/v1/session/[sessionId]/eve/v1/session/[sessionId]/cancel/eve/v1/session/[sessionId]/clear/eve/v1/session/[sessionId]/compact/eve/v1/session/[sessionId]/reset/eve/v1/session/[sessionId]/stream |
| Internal aliases | /__server |
| Runtime | nodejs24.x |
| Handler | index.mjs |
| Payload | 8.60 MB |
| Function files | 8.60 MB across 46 files |
| Traced dependencies | 0 B |
| Signal | 🟠 Bundled file index.mjs is 2.45 MB (28.5%) |
🟠 🔎 Dependency Analysis
📦 Bundled files:
Bundled file size
🟠 index.mjs [########################] 2.45 MB 28.5%
🟠 _chunks/runtime-artifacts.mjs [################........] 1.65 MB 19.2%
🟡 _libs/undici.mjs [##########..............] 980.5 kB 11.4%
🟡 _chunks/sandbox.mjs [########................] 777.7 kB 9.0%
🟡 _chunks/token-util-DNwIAn_u.mjs [####....................] 381.0 kB 4.4%
🟠 Other bundled files [#######################.] 2.36 MB 27.4%
🧾 Vercel Config
{
"handler": "index.mjs",
"launcherType": "Nodejs",
"shouldAddHelpers": false,
"supportsResponseStreaming": true,
"runtime": "nodejs24.x"
}Build Timing: e2e/fixtures/agent-tools-sandbox
This is an informational timing measurement inside eve build, from preflight through publication. Output-size measurement and profile writing are excluded.
Build mode: deployable Vercel build with sandbox template prewarm included.
- Build pipeline: 2.21 s -> 2.21 s (+1.5 ms) vs
barba/first-class-memory (cd18a36). - Timing is informational: shared GitHub runners are too variable for a hard timing budget.
Detailed phase timings vs `barba/first-class-memory (cd18a36)`
| Phase | Baseline | Current | Delta |
|---|---|---|---|
extension.check |
1.2 ms | 1.2 ms | 0.0 ms |
project.resolve |
0.7 ms | 0.7 ms | 0.0 ms |
workspace.create |
0.7 ms | 0.7 ms | 0.0 ms |
host.prepare |
331.7 ms | 273.5 ms | -58.2 ms |
vercel.service-prefix.resolve |
2.1 ms | 2.0 ms | -0.1 ms |
nitro.create |
223.3 ms | 225.5 ms | +2.2 ms |
sandbox.prewarm |
282.6 ms | 318.7 ms | +36.1 ms |
nitro.cache.prepare |
0.2 ms | 0.3 ms | +0.1 ms |
nitro.prepare |
0.7 ms | 0.7 ms | 0.0 ms |
nitro.public-assets |
0.7 ms | 0.8 ms | +0.1 ms |
nitro.prerender |
0.5 ms | 0.5 ms | 0.0 ms |
nitro.bundle |
1.34 s | 1.36 s | +21.4 ms |
nitro.cache.write |
0.3 ms | 0.3 ms | 0.0 ms |
vercel.workflow-function.materialize |
21.1 ms | 21.5 ms | +0.4 ms |
agent-summary.emit |
0.5 ms | 0.5 ms | 0.0 ms |
nitro.close |
0.1 ms | 0.1 ms | 0.0 ms |
output.publish |
3.3 ms | 3.0 ms | -0.3 ms |
workspace.remove |
1.9 ms | 1.8 ms | -0.1 ms |
eb1de31 to
83c4328
Compare
83c4328 to
c7df437
Compare
c7df437 to
4dc952b
Compare
4dc952b to
36a476b
Compare
| provider: userMemory({ | ||
| backend: vercelBlob({ | ||
| prefix: "my-agent/memory/user", | ||
| token: process.env.BLOB_READ_WRITE_TOKEN, |
There was a problem hiding this comment.
Why do we need this token? Let's recommend OIDC
| const entries = parseMemoryDocument(document?.content ?? ""); | ||
| const existing = entries.find((entry) => entry.text === text); | ||
| if (existing !== undefined) return { index: existing.index }; | ||
| if (entries.length >= input.memoryLimit) { |
There was a problem hiding this comment.
Why number of entries vs length? The latter enforces concise entries as well
There was a problem hiding this comment.
number of entries felt easier to reason about as opposed to characters. I think in general all memories will be roughly same length but you dont necessarily know what that length is so to go configure a character limit seems nearly impossible to get right
There was a problem hiding this comment.
character limit constrains verbosity, which is useful
|
|
||
| return defineMemoryProvider({ | ||
| events: { | ||
| async "turn.prepared"(_event, context) { |
There was a problem hiding this comment.
why not use hook event names? i don't think turn.prepared exists
There was a problem hiding this comment.
this was added in earlier pr in stack but agree its a bit of a weird name let me see if we can just slot this into turn.started I forget exactly how materially different started vs prepared is
There was a problem hiding this comment.
I'd prefer we just have one.
Also are these hooks? Should we call it such?
|
e2e? |
36a476b to
3027fc1
Compare
3027fc1 to
7c45922
Compare
916f77e to
cf6c3e9
Compare
cf6c3e9 to
dd36c11
Compare
dd36c11 to
da19f04
Compare
da19f04 to
104239d
Compare
104239d to
c706070
Compare
c706070 to
e98502b
Compare
e98502b to
5df9279
Compare
Signed-off-by: Andrew Barba <barba@hey.com>
Signed-off-by: Andrew Barba <barba@hey.com>
Signed-off-by: Andrew Barba <barba@hey.com>
Signed-off-by: Andrew Barba <barba@hey.com>
|
Superseded by the revised memory contract in #1581 and the replacement core implementation. The portable document backend, storage implementations, and optimistic concurrency work remain useful and will be transplanted into a clean file-memory provider PR using recall and tools directly. |
Summary
Related to #1510. Stacked on #1700.
Adds the built-in
fileMemory()provider behind a portable conditional-document backend. It recalls an indexed file atsession.started, refreshes it atcompaction.completed, and exposes scopedsave_memory(text)andremove_memory(index)tools with stable indexes and conflict retries. Recalled content uses the structuredMemoryMessageresult contract introduced by #1700.The portable surface lives on
eve/memory/file; the Vercel-specificvercelBlob()backend is isolated toeve/memory/file/vercel. Vercel deployments select private Blob storage only whenBLOB_STORE_IDor the legacyBLOB_READ_WRITE_TOKENsignals an attached store. Vercel deployments without a store and non-Vercel production deployments must configure a backend explicitly instead of silently losing memory on restart; development still defaults to process-local storage.Validation
pnpm fmtpnpm lintpnpm typecheckpnpm guard:invariantspnpm docs:check(83 documents compile)pnpm test:unitpnpm test:integration../../node_modules/.bin/vitest run --config vitest.unit.config.ts src/public/memory/filefrompackages/eve(22 passed)../../node_modules/.bin/vitest run --config vitest.integration.config.ts src/execution/file-memory.integration.test.tsfrompackages/eve(1 passed)./node_modules/.bin/tsc -p packages/eve/tsconfig.json --noEmitpnpm --filter eve buildpnpm --filter eve exec vitest run --config vitest.scenario.config.ts test/scenarios/file-memory-provider.scenario.test.ts(1 passed)Vercel Blob behavior is covered through its mocked SDK contract; no live Blob credentials were used locally.
Checklist
CONTRIBUTING.mdevepackagegit commit --signoff)