diff --git a/.changeset/aimock-deterministic-e2e.md b/.changeset/aimock-deterministic-e2e.md deleted file mode 100644 index e82f4074..00000000 --- a/.changeset/aimock-deterministic-e2e.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@dawn-ai/langchain": patch ---- - -Offloaded tool-output filenames are now deterministic — keyed on the originating `tool_call_id` (with a content-hash fallback when absent) instead of `timestamp+random`. This makes offloaded paths stable and traceable and enables deterministic agent e2e tests. The openai chat model now also honors `OPENAI_BASE_URL`, allowing a local mock provider (used by the new CI-safe aimock-based agent e2e regression tests for the discriminated-union tool-input and tool-output-offload-retrieval paths). diff --git a/.changeset/fix-offload-exempt-retrieval.md b/.changeset/fix-offload-exempt-retrieval.md deleted file mode 100644 index 655033c9..00000000 --- a/.changeset/fix-offload-exempt-retrieval.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@dawn-ai/core": patch -"@dawn-ai/cli": patch ---- - -Fix tool-output offloading so retrieval tools are exempt. Previously the workspace `readFile` tool — the very tool the agent uses to read back an offloaded output — had its own (large) result offloaded again, replacing it with a second pointer stub. The agent could never see the retrieved content. Retrieval/inspection tools (`readFile`, `listDir`) are now never offloaded; the new `dawn.config.ts` `toolOutput.noOffloadTools` option adds further exemptions (merged with the always-exempt built-ins). Found by a live-API smoke test. diff --git a/.changeset/fix-sp5-literal-tool-inputs.md b/.changeset/fix-sp5-literal-tool-inputs.md deleted file mode 100644 index d0472228..00000000 --- a/.changeset/fix-sp5-literal-tool-inputs.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@dawn-ai/core": patch ---- - -Fix tool-input schema extraction for standalone literal types. A single string-literal type (e.g. a discriminated-union discriminant like `by: "date"`) was not recognized as an enum (only multi-member literal unions were), so it fell through to object extraction and was misread as an object carrying `String.prototype` methods (`charAt`, `toString`, …). This produced a bogus schema that rejected the correct argument, breaking every discriminated/object-union tool parameter end-to-end. Standalone string/number/boolean literals now extract correctly, and object extraction is guarded to genuine object types. Found by a live-API smoke test. diff --git a/.changeset/phase3-conversation-summarization.md b/.changeset/phase3-conversation-summarization.md deleted file mode 100644 index ea3f8f7c..00000000 --- a/.changeset/phase3-conversation-summarization.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -"@dawn-ai/core": minor -"@dawn-ai/langchain": minor -"@dawn-ai/cli": minor ---- - -Add opt-in conversation summarization (Phase 3 sub-project 6b). When a thread's history exceeds a token threshold, the agent is fed a condensed view — a running summary of older turns plus the most recent turns verbatim — while the **full history stays intact in the checkpoint**. This is non-destructive: summarization runs as a LangGraph `preModelHook` that returns `llmInputMessages` for the turn only and never rewrites saved `messages`, so `GET /threads/:id/state`, resume, and restart always see the complete history (and there is no tool-call/result pairing hazard). - -Enable it in `dawn.config.ts`: - -```ts -export default { - summarization: { - enabled: true, // default false - maxTokens: 12_000, // threshold over which older turns are summarized - keepRecentTurns: 6, // most-recent turns kept verbatim - // model defaults to the route's model - // tokenCounter defaults to a lazy gpt-tokenizer (o200k_base) counter - // summarize defaults to a built-in single-LLM-call running-summary fold - }, -} -``` - -Both the token counter and the summarizer are pluggable (`tokenCounter`, `summarize`). The running summary is cached in agent state and refreshed incrementally — each turn folds only the newly-aged messages, so cost stays bounded. The turn-boundary split is pairing-safe (a tool-call message is never separated from its results). When summarization is disabled (the default), behavior is unchanged and `gpt-tokenizer` is never loaded. If the summarizer call fails on a given turn, the agent falls back to the full history for that turn rather than failing the run. diff --git a/.changeset/phase3-tool-output-offloading.md b/.changeset/phase3-tool-output-offloading.md deleted file mode 100644 index de6dd58a..00000000 --- a/.changeset/phase3-tool-output-offloading.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@dawn-ai/core": minor -"@dawn-ai/workspace": minor -"@dawn-ai/langchain": minor -"@dawn-ai/cli": minor ---- - -Add tool-output offloading. When a tool returns output larger than `toolOutput.offloadThresholdChars` (default 40,000), the full payload is written to `workspace/tool-outputs/` and the in-context ToolMessage is replaced with a preview+pointer stub; the agent retrieves the full content with the existing `readFile` tool (which bypasses the size cap for `tool-outputs/` paths). Active automatically when a workspace exists. The directory is bounded by a size + TTL cap (defaults 256MB / 3h) with throttled evict-on-write and LRU-by-access eviction (readFile bumps mtime for tool-outputs/ files). Large content never enters message state, so there is no tool-call/result pairing hazard. Configurable via `dawn.config.ts` `toolOutput`. The `FilesystemBackend` interface gains optional `statFile`/`removeFile`/`touchFile`/`mkdir` methods and an optional per-call `maxBytes` override on `readFile`. diff --git a/examples/chat/server/CHANGELOG.md b/examples/chat/server/CHANGELOG.md index 22698ea3..3eaed810 100644 --- a/examples/chat/server/CHANGELOG.md +++ b/examples/chat/server/CHANGELOG.md @@ -1,5 +1,19 @@ # @dawn-example/chat-server +## 0.0.2 + +### Patch Changes + +- Updated dependencies [30db6ed] +- Updated dependencies [55b69f0] +- Updated dependencies [2e3bc8d] +- Updated dependencies [8133553] +- Updated dependencies [027b1cc] + - @dawn-ai/langchain@0.3.0 + - @dawn-ai/core@0.3.0 + - @dawn-ai/cli@0.3.0 + - @dawn-ai/sdk@0.3.0 + ## 0.0.1 ### Patch Changes diff --git a/examples/chat/server/package.json b/examples/chat/server/package.json index f24229cb..5ff07e12 100644 --- a/examples/chat/server/package.json +++ b/examples/chat/server/package.json @@ -1,7 +1,7 @@ { "name": "@dawn-example/chat-server", "private": true, - "version": "0.0.1", + "version": "0.0.2", "type": "module", "scripts": { "dev": "node node_modules/@dawn-ai/cli/dist/index.js dev --port 3001", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 4f0bf82c..56552c93 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,44 @@ # @dawn-ai/cli +## 0.3.0 + +### Minor Changes + +- 8133553: Add opt-in conversation summarization (Phase 3 sub-project 6b). When a thread's history exceeds a token threshold, the agent is fed a condensed view — a running summary of older turns plus the most recent turns verbatim — while the **full history stays intact in the checkpoint**. This is non-destructive: summarization runs as a LangGraph `preModelHook` that returns `llmInputMessages` for the turn only and never rewrites saved `messages`, so `GET /threads/:id/state`, resume, and restart always see the complete history (and there is no tool-call/result pairing hazard). + + Enable it in `dawn.config.ts`: + + ```ts + export default { + summarization: { + enabled: true, // default false + maxTokens: 12_000, // threshold over which older turns are summarized + keepRecentTurns: 6, // most-recent turns kept verbatim + // model defaults to the route's model + // tokenCounter defaults to a lazy gpt-tokenizer (o200k_base) counter + // summarize defaults to a built-in single-LLM-call running-summary fold + }, + }; + ``` + + Both the token counter and the summarizer are pluggable (`tokenCounter`, `summarize`). The running summary is cached in agent state and refreshed incrementally — each turn folds only the newly-aged messages, so cost stays bounded. The turn-boundary split is pairing-safe (a tool-call message is never separated from its results). When summarization is disabled (the default), behavior is unchanged and `gpt-tokenizer` is never loaded. If the summarizer call fails on a given turn, the agent falls back to the full history for that turn rather than failing the run. + +- 027b1cc: Add tool-output offloading. When a tool returns output larger than `toolOutput.offloadThresholdChars` (default 40,000), the full payload is written to `workspace/tool-outputs/` and the in-context ToolMessage is replaced with a preview+pointer stub; the agent retrieves the full content with the existing `readFile` tool (which bypasses the size cap for `tool-outputs/` paths). Active automatically when a workspace exists. The directory is bounded by a size + TTL cap (defaults 256MB / 3h) with throttled evict-on-write and LRU-by-access eviction (readFile bumps mtime for tool-outputs/ files). Large content never enters message state, so there is no tool-call/result pairing hazard. Configurable via `dawn.config.ts` `toolOutput`. The `FilesystemBackend` interface gains optional `statFile`/`removeFile`/`touchFile`/`mkdir` methods and an optional per-call `maxBytes` override on `readFile`. + +### Patch Changes + +- 55b69f0: Fix tool-output offloading so retrieval tools are exempt. Previously the workspace `readFile` tool — the very tool the agent uses to read back an offloaded output — had its own (large) result offloaded again, replacing it with a second pointer stub. The agent could never see the retrieved content. Retrieval/inspection tools (`readFile`, `listDir`) are now never offloaded; the new `dawn.config.ts` `toolOutput.noOffloadTools` option adds further exemptions (merged with the always-exempt built-ins). Found by a live-API smoke test. +- Updated dependencies [30db6ed] +- Updated dependencies [55b69f0] +- Updated dependencies [2e3bc8d] +- Updated dependencies [8133553] +- Updated dependencies [027b1cc] + - @dawn-ai/langchain@0.3.0 + - @dawn-ai/core@0.3.0 + - @dawn-ai/langgraph@0.3.0 + - @dawn-ai/permissions@0.1.8 + - @dawn-ai/sqlite-storage@0.2.0 + ## 0.2.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 24aaa694..912ee6c3 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@dawn-ai/cli", - "version": "0.2.0", + "version": "0.3.0", "private": false, "type": "module", "license": "MIT", diff --git a/packages/config-biome/CHANGELOG.md b/packages/config-biome/CHANGELOG.md index 4144b771..a97045ed 100644 --- a/packages/config-biome/CHANGELOG.md +++ b/packages/config-biome/CHANGELOG.md @@ -1,5 +1,7 @@ # @dawn-ai/config-biome +## 0.3.0 + ## 0.2.0 ### Patch Changes diff --git a/packages/config-biome/package.json b/packages/config-biome/package.json index c5c17a8a..7e9c0f9c 100644 --- a/packages/config-biome/package.json +++ b/packages/config-biome/package.json @@ -1,6 +1,6 @@ { "name": "@dawn-ai/config-biome", - "version": "0.2.0", + "version": "0.3.0", "private": false, "type": "module", "license": "MIT", diff --git a/packages/config-typescript/CHANGELOG.md b/packages/config-typescript/CHANGELOG.md index dd4ab792..ce8c4bd9 100644 --- a/packages/config-typescript/CHANGELOG.md +++ b/packages/config-typescript/CHANGELOG.md @@ -1,5 +1,7 @@ # @dawn-ai/config-typescript +## 0.3.0 + ## 0.2.0 ### Patch Changes diff --git a/packages/config-typescript/package.json b/packages/config-typescript/package.json index 2a4be5fa..ef9b9556 100644 --- a/packages/config-typescript/package.json +++ b/packages/config-typescript/package.json @@ -1,6 +1,6 @@ { "name": "@dawn-ai/config-typescript", - "version": "0.2.0", + "version": "0.3.0", "private": false, "type": "module", "license": "MIT", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index c603df60..3e2752ac 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,40 @@ # @dawn-ai/core +## 0.3.0 + +### Minor Changes + +- 8133553: Add opt-in conversation summarization (Phase 3 sub-project 6b). When a thread's history exceeds a token threshold, the agent is fed a condensed view — a running summary of older turns plus the most recent turns verbatim — while the **full history stays intact in the checkpoint**. This is non-destructive: summarization runs as a LangGraph `preModelHook` that returns `llmInputMessages` for the turn only and never rewrites saved `messages`, so `GET /threads/:id/state`, resume, and restart always see the complete history (and there is no tool-call/result pairing hazard). + + Enable it in `dawn.config.ts`: + + ```ts + export default { + summarization: { + enabled: true, // default false + maxTokens: 12_000, // threshold over which older turns are summarized + keepRecentTurns: 6, // most-recent turns kept verbatim + // model defaults to the route's model + // tokenCounter defaults to a lazy gpt-tokenizer (o200k_base) counter + // summarize defaults to a built-in single-LLM-call running-summary fold + }, + }; + ``` + + Both the token counter and the summarizer are pluggable (`tokenCounter`, `summarize`). The running summary is cached in agent state and refreshed incrementally — each turn folds only the newly-aged messages, so cost stays bounded. The turn-boundary split is pairing-safe (a tool-call message is never separated from its results). When summarization is disabled (the default), behavior is unchanged and `gpt-tokenizer` is never loaded. If the summarizer call fails on a given turn, the agent falls back to the full history for that turn rather than failing the run. + +- 027b1cc: Add tool-output offloading. When a tool returns output larger than `toolOutput.offloadThresholdChars` (default 40,000), the full payload is written to `workspace/tool-outputs/` and the in-context ToolMessage is replaced with a preview+pointer stub; the agent retrieves the full content with the existing `readFile` tool (which bypasses the size cap for `tool-outputs/` paths). Active automatically when a workspace exists. The directory is bounded by a size + TTL cap (defaults 256MB / 3h) with throttled evict-on-write and LRU-by-access eviction (readFile bumps mtime for tool-outputs/ files). Large content never enters message state, so there is no tool-call/result pairing hazard. Configurable via `dawn.config.ts` `toolOutput`. The `FilesystemBackend` interface gains optional `statFile`/`removeFile`/`touchFile`/`mkdir` methods and an optional per-call `maxBytes` override on `readFile`. + +### Patch Changes + +- 55b69f0: Fix tool-output offloading so retrieval tools are exempt. Previously the workspace `readFile` tool — the very tool the agent uses to read back an offloaded output — had its own (large) result offloaded again, replacing it with a second pointer stub. The agent could never see the retrieved content. Retrieval/inspection tools (`readFile`, `listDir`) are now never offloaded; the new `dawn.config.ts` `toolOutput.noOffloadTools` option adds further exemptions (merged with the always-exempt built-ins). Found by a live-API smoke test. +- 2e3bc8d: Fix tool-input schema extraction for standalone literal types. A single string-literal type (e.g. a discriminated-union discriminant like `by: "date"`) was not recognized as an enum (only multi-member literal unions were), so it fell through to object extraction and was misread as an object carrying `String.prototype` methods (`charAt`, `toString`, …). This produced a bogus schema that rejected the correct argument, breaking every discriminated/object-union tool parameter end-to-end. Standalone string/number/boolean literals now extract correctly, and object extraction is guarded to genuine object types. Found by a live-API smoke test. +- Updated dependencies [027b1cc] + - @dawn-ai/workspace@0.2.0 + - @dawn-ai/sdk@0.3.0 + - @dawn-ai/permissions@0.1.8 + - @dawn-ai/sqlite-storage@0.2.0 + ## 0.2.0 ### Minor Changes diff --git a/packages/core/package.json b/packages/core/package.json index 9e0f6791..1afb29e9 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@dawn-ai/core", - "version": "0.2.0", + "version": "0.3.0", "private": false, "type": "module", "license": "MIT", diff --git a/packages/create-dawn-app/CHANGELOG.md b/packages/create-dawn-app/CHANGELOG.md index b2732d3e..c354b131 100644 --- a/packages/create-dawn-app/CHANGELOG.md +++ b/packages/create-dawn-app/CHANGELOG.md @@ -1,5 +1,11 @@ # create-dawn-app +## 0.3.0 + +### Patch Changes + +- @dawn-ai/devkit@0.3.0 + ## 0.2.0 ### Patch Changes diff --git a/packages/create-dawn-app/package.json b/packages/create-dawn-app/package.json index a43330d1..c732c2c5 100644 --- a/packages/create-dawn-app/package.json +++ b/packages/create-dawn-app/package.json @@ -1,6 +1,6 @@ { "name": "create-dawn-ai-app", - "version": "0.2.0", + "version": "0.3.0", "private": false, "type": "module", "license": "MIT", diff --git a/packages/devkit/CHANGELOG.md b/packages/devkit/CHANGELOG.md index b3d3644d..06b7cd58 100644 --- a/packages/devkit/CHANGELOG.md +++ b/packages/devkit/CHANGELOG.md @@ -1,5 +1,7 @@ # @dawn-ai/devkit +## 0.3.0 + ## 0.2.0 ### Patch Changes diff --git a/packages/devkit/package.json b/packages/devkit/package.json index 59100701..aea4307e 100644 --- a/packages/devkit/package.json +++ b/packages/devkit/package.json @@ -1,6 +1,6 @@ { "name": "@dawn-ai/devkit", - "version": "0.2.0", + "version": "0.3.0", "private": false, "type": "module", "license": "MIT", diff --git a/packages/langchain/CHANGELOG.md b/packages/langchain/CHANGELOG.md index d523f322..edbd8ae7 100644 --- a/packages/langchain/CHANGELOG.md +++ b/packages/langchain/CHANGELOG.md @@ -1,5 +1,41 @@ # @dawn-ai/langchain +## 0.3.0 + +### Minor Changes + +- 8133553: Add opt-in conversation summarization (Phase 3 sub-project 6b). When a thread's history exceeds a token threshold, the agent is fed a condensed view — a running summary of older turns plus the most recent turns verbatim — while the **full history stays intact in the checkpoint**. This is non-destructive: summarization runs as a LangGraph `preModelHook` that returns `llmInputMessages` for the turn only and never rewrites saved `messages`, so `GET /threads/:id/state`, resume, and restart always see the complete history (and there is no tool-call/result pairing hazard). + + Enable it in `dawn.config.ts`: + + ```ts + export default { + summarization: { + enabled: true, // default false + maxTokens: 12_000, // threshold over which older turns are summarized + keepRecentTurns: 6, // most-recent turns kept verbatim + // model defaults to the route's model + // tokenCounter defaults to a lazy gpt-tokenizer (o200k_base) counter + // summarize defaults to a built-in single-LLM-call running-summary fold + }, + }; + ``` + + Both the token counter and the summarizer are pluggable (`tokenCounter`, `summarize`). The running summary is cached in agent state and refreshed incrementally — each turn folds only the newly-aged messages, so cost stays bounded. The turn-boundary split is pairing-safe (a tool-call message is never separated from its results). When summarization is disabled (the default), behavior is unchanged and `gpt-tokenizer` is never loaded. If the summarizer call fails on a given turn, the agent falls back to the full history for that turn rather than failing the run. + +- 027b1cc: Add tool-output offloading. When a tool returns output larger than `toolOutput.offloadThresholdChars` (default 40,000), the full payload is written to `workspace/tool-outputs/` and the in-context ToolMessage is replaced with a preview+pointer stub; the agent retrieves the full content with the existing `readFile` tool (which bypasses the size cap for `tool-outputs/` paths). Active automatically when a workspace exists. The directory is bounded by a size + TTL cap (defaults 256MB / 3h) with throttled evict-on-write and LRU-by-access eviction (readFile bumps mtime for tool-outputs/ files). Large content never enters message state, so there is no tool-call/result pairing hazard. Configurable via `dawn.config.ts` `toolOutput`. The `FilesystemBackend` interface gains optional `statFile`/`removeFile`/`touchFile`/`mkdir` methods and an optional per-call `maxBytes` override on `readFile`. + +### Patch Changes + +- 30db6ed: Offloaded tool-output filenames are now deterministic — keyed on the originating `tool_call_id` (with a content-hash fallback when absent) instead of `timestamp+random`. This makes offloaded paths stable and traceable and enables deterministic agent e2e tests. The openai chat model now also honors `OPENAI_BASE_URL`, allowing a local mock provider (used by the new CI-safe aimock-based agent e2e regression tests for the discriminated-union tool-input and tool-output-offload-retrieval paths). +- Updated dependencies [55b69f0] +- Updated dependencies [2e3bc8d] +- Updated dependencies [8133553] +- Updated dependencies [027b1cc] + - @dawn-ai/core@0.3.0 + - @dawn-ai/workspace@0.2.0 + - @dawn-ai/sdk@0.3.0 + ## 0.2.0 ### Minor Changes diff --git a/packages/langchain/package.json b/packages/langchain/package.json index 5682a245..7a2e5f54 100644 --- a/packages/langchain/package.json +++ b/packages/langchain/package.json @@ -1,6 +1,6 @@ { "name": "@dawn-ai/langchain", - "version": "0.2.0", + "version": "0.3.0", "private": false, "type": "module", "license": "MIT", diff --git a/packages/langgraph/CHANGELOG.md b/packages/langgraph/CHANGELOG.md index ee452700..5fd9a614 100644 --- a/packages/langgraph/CHANGELOG.md +++ b/packages/langgraph/CHANGELOG.md @@ -1,5 +1,11 @@ # @dawn-ai/langgraph +## 0.3.0 + +### Patch Changes + +- @dawn-ai/sdk@0.3.0 + ## 0.2.0 ### Patch Changes diff --git a/packages/langgraph/package.json b/packages/langgraph/package.json index 615209be..95e3cc8a 100644 --- a/packages/langgraph/package.json +++ b/packages/langgraph/package.json @@ -1,6 +1,6 @@ { "name": "@dawn-ai/langgraph", - "version": "0.2.0", + "version": "0.3.0", "private": false, "type": "module", "license": "MIT", diff --git a/packages/sdk/CHANGELOG.md b/packages/sdk/CHANGELOG.md index 927326f4..63ce9c18 100644 --- a/packages/sdk/CHANGELOG.md +++ b/packages/sdk/CHANGELOG.md @@ -1,5 +1,7 @@ # @dawn-ai/sdk +## 0.3.0 + ## 0.2.0 ### Minor Changes diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 8e323051..65339d7a 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@dawn-ai/sdk", - "version": "0.2.0", + "version": "0.3.0", "private": false, "type": "module", "license": "MIT", diff --git a/packages/vite-plugin/CHANGELOG.md b/packages/vite-plugin/CHANGELOG.md index 56230e72..fb2d30f4 100644 --- a/packages/vite-plugin/CHANGELOG.md +++ b/packages/vite-plugin/CHANGELOG.md @@ -1,5 +1,15 @@ # @dawn-ai/vite-plugin +## 0.3.0 + +### Patch Changes + +- Updated dependencies [55b69f0] +- Updated dependencies [2e3bc8d] +- Updated dependencies [8133553] +- Updated dependencies [027b1cc] + - @dawn-ai/core@0.3.0 + ## 0.2.0 ### Minor Changes diff --git a/packages/vite-plugin/package.json b/packages/vite-plugin/package.json index 2912a720..d3c8db88 100644 --- a/packages/vite-plugin/package.json +++ b/packages/vite-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@dawn-ai/vite-plugin", - "version": "0.2.0", + "version": "0.3.0", "private": false, "type": "module", "license": "MIT", diff --git a/packages/workspace/CHANGELOG.md b/packages/workspace/CHANGELOG.md new file mode 100644 index 00000000..fe9c0bfd --- /dev/null +++ b/packages/workspace/CHANGELOG.md @@ -0,0 +1,7 @@ +# @dawn-ai/workspace + +## 0.2.0 + +### Minor Changes + +- 027b1cc: Add tool-output offloading. When a tool returns output larger than `toolOutput.offloadThresholdChars` (default 40,000), the full payload is written to `workspace/tool-outputs/` and the in-context ToolMessage is replaced with a preview+pointer stub; the agent retrieves the full content with the existing `readFile` tool (which bypasses the size cap for `tool-outputs/` paths). Active automatically when a workspace exists. The directory is bounded by a size + TTL cap (defaults 256MB / 3h) with throttled evict-on-write and LRU-by-access eviction (readFile bumps mtime for tool-outputs/ files). Large content never enters message state, so there is no tool-call/result pairing hazard. Configurable via `dawn.config.ts` `toolOutput`. The `FilesystemBackend` interface gains optional `statFile`/`removeFile`/`touchFile`/`mkdir` methods and an optional per-call `maxBytes` override on `readFile`. diff --git a/packages/workspace/package.json b/packages/workspace/package.json index 50a9aad8..8aba28b9 100644 --- a/packages/workspace/package.json +++ b/packages/workspace/package.json @@ -1,6 +1,6 @@ { "name": "@dawn-ai/workspace", - "version": "0.1.8", + "version": "0.2.0", "private": false, "type": "module", "license": "MIT",