Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .fallowrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
"**/*.{test,spec}.{ts,tsx}",
"**/*.eval.ts"
],
"ignorePatterns": [
".claude/**"
],
"dynamicallyLoaded": [
"src/deploy/runtime.ts",
"src/deploy/runtime.worker.ts",
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,6 @@ docs/api/

# fallow cache/snapshots
.fallow/

# Local agent worktrees and session state
.claude/
7 changes: 5 additions & 2 deletions src/execution/AgentExecutor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -494,11 +494,14 @@ export class AgentExecutor {

// A failed tool carries its message as `{error}` (the same shape
// resume.ts uses) - `result` is null then, so the model would
// otherwise see a bare "null" and never learn the call failed.
// otherwise see a bare "null" and never learn the call failed. A
// failure that already has a structured result (argument validation)
// keeps it, so the model gets the per-issue detail.
const failed = toolResult.error !== undefined;
const failurePayload = toolResult.result ?? { error: toolResult.error };
state.messages.push({
role: 'tool',
content: JSON.stringify(failed ? { error: toolResult.error } : toolResult.result),
content: JSON.stringify(failed ? failurePayload : toolResult.result),
name: toolCall.function.name,
toolCallId: toolCall.id,
toolName: toolCall.function.name,
Expand Down
5 changes: 4 additions & 1 deletion vitest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ export default defineConfig({
// DOM globals (File, Blob, HTMLAnchorElement, ...) those tests need.
// Each app is tested via its own `npm run test --workspace=apps/*`.
'apps/**',
// Agent worktrees (.claude/worktrees/*) are full checkouts of this repo;
// without this the main checkout would run every copy's tests too.
'.claude/**',
],
coverage: {
provider: 'v8',
Expand All @@ -49,7 +52,7 @@ export default defineConfig({
// LOU-P's growth (new server/chat + ChatPanel/ApprovalCard code, all
// covered by apps/agent-forge's own 49/49 + 74/74 suites) tipped the
// denominator enough to trip the global threshold below.
exclude: ['**/*.test.ts', '**/*.spec.ts', 'dist/**', 'node_modules/**', 'apps/**'],
exclude: ['**/*.test.ts', '**/*.spec.ts', 'dist/**', 'node_modules/**', 'apps/**', '.claude/**'],
// Floor set 1-2 points below the measured baseline (LOU-B4). Measured with
// `npm run test:coverage`, excluding the 3 provider test suites that fail
// to even load in this repo because @ai-sdk/openai and ollama-ai-provider
Expand Down
Loading