==> Synchronizing chroot copy [/home/alhp/workspace/chroot/root] -> [build_e9355a5d-8e4d-4932-a5d4-4b529bf43913]...done ==> Making package: opencode 1.1.51-1.1 (Wed Feb 4 15:05:55 2026) ==> Retrieving sources... -> Cloning opencode git repo... Cloning into bare repository '/home/alhp/workspace/build/x86-64-v2/opencode-1.1.51-1/opencode'... ==> Validating source files with b2sums... opencode ... Passed ==> Making package: opencode 1.1.51-1.1 (Wed Feb 4 14:07:50 2026) ==> Checking runtime dependencies... ==> Installing missing dependencies... resolving dependencies... looking for conflicting packages... Package (1) New Version Net Change extra/ripgrep 15.1.0-1 5.14 MiB Total Installed Size: 5.14 MiB :: Proceed with installation? [Y/n] checking keyring... checking package integrity... loading package files... checking for file conflicts... :: Processing package changes... installing ripgrep... :: Running post-transaction hooks... (1/1) Arming ConditionNeedsUpdate... ==> Checking buildtime dependencies... ==> Installing missing dependencies... resolving dependencies... looking for conflicting packages... Package (6) New Version Net Change Download Size extra/perl-error 0.17030-3 0.04 MiB extra/perl-mailtools 2.22-3 0.10 MiB extra/perl-timedate 2.33-9 0.08 MiB extra/zlib-ng 2.3.2-1 0.28 MiB extra/bun 1.3.8-2 60.05 MiB 16.35 MiB extra/git 2.53.0-1 29.72 MiB Total Download Size: 16.35 MiB Total Installed Size: 90.27 MiB :: Proceed with installation? [Y/n] :: Retrieving packages... bun-1.3.8-2-x86_64 downloading... checking keyring... checking package integrity... loading package files... checking for file conflicts... :: Processing package changes... installing bun... installing perl-error... installing perl-timedate... installing perl-mailtools... installing zlib-ng... installing git... Optional dependencies for git git-zsh-completion: upstream zsh completion tk: gitk and git gui openssh: ssh transport and crypto man: show help with `git command --help` perl-libwww: git svn perl-term-readkey: git svn and interactive.singlekey setting perl-io-socket-ssl: git send-email TLS support perl-authen-sasl: git send-email TLS support perl-cgi: gitweb (web interface) support python: git svn & git p4 subversion: git svn org.freedesktop.secrets: keyring credential helper libsecret: libsecret credential helper [installed] less: the default pager for git :: Running post-transaction hooks... (1/3) Creating system user accounts... Creating group 'git' with GID 969. Creating user 'git' (git daemon user) with UID 969 and GID 969. (2/3) Reloading system manager configuration... Skipped: Current root is not booted. (3/3) Arming ConditionNeedsUpdate... ==> Retrieving sources... ==> WARNING: Skipping all source file integrity checks. ==> Extracting sources... -> Creating working copy of opencode git repo... Cloning into 'opencode'... done. Switched to a new branch 'makepkg' ==> Starting prepare()... bun install v1.3.8-canary.1 (b64edcb4) Resolving dependencies Resolved, downloaded and extracted [355] $ husky + @actions/artifact@5.0.1 (v6.1.0 available) + @tsconfig/bun@1.0.9 (v1.0.10 available) + husky@9.1.7 + prettier@3.6.2 + semver@7.7.3 + sst@3.17.23 + turbo@2.5.6 + @aws-sdk/client-s3@3.933.0 + typescript@5.8.2 (v5.9.3 available) 3586 packages installed [73.61s] ==> Starting build()... opencode script { "channel": "latest", "version": "1.1.51", "preview": false, "release": false, "team": [ "actions-user", "opencode", "rekram1-node", "thdxr", "kommander", "jayair", "fwang", "adamdotdevin", "iamdavidhill", "opencode-agent[bot]", "R44VC0RP" ] } Generated models-snapshot.ts bun add v1.3.8-canary.1 (b64edcb4) Resolving dependencies Resolved, downloaded and extracted [1] Saved lockfile $ husky + @parcel/watcher-darwin-arm64@2.5.1 (v2.5.6 available) + @parcel/watcher-darwin-x64@2.5.1 (v2.5.6 available) + @parcel/watcher-linux-arm64-glibc@2.5.1 (v2.5.6 available) + @parcel/watcher-linux-arm64-musl@2.5.1 (v2.5.6 available) + @parcel/watcher-win32-x64@2.5.1 (v2.5.6 available) installed @opentui/core@0.1.77 396 packages installed [137.80s] bun add v1.3.8-canary.1 (b64edcb4) Resolving dependencies Resolved, downloaded and extracted [1] Saved lockfile $ husky installed @parcel/watcher@2.5.1 [497.00ms] done building opencode-linux-x64 ==> Starting check()... bun test v1.3.8-canary.1 (b64edcb4) test/bun.test.ts: (pass) BunProc registry configuration > should not contain hardcoded registry parameters [0.30ms] (pass) BunProc registry configuration > should use Bun's default registry resolution [0.17ms] (pass) BunProc registry configuration > should have correct command structure without registry [0.30ms] test/keybind.test.ts: (pass) Keybind.toString > should convert simple key to string [0.06ms] (pass) Keybind.toString > should convert ctrl modifier to string [0.02ms] (pass) Keybind.toString > should convert leader key to string [0.02ms] (pass) Keybind.toString > should convert multiple modifiers to string (pass) Keybind.toString > should convert all modifiers to string [0.01ms] (pass) Keybind.toString > should convert shift modifier to string (pass) Keybind.toString > should convert function key to string [0.01ms] (pass) Keybind.toString > should convert special key to string (pass) Keybind.toString > should handle empty name [0.01ms] (pass) Keybind.toString > should handle only modifiers (pass) Keybind.toString > should handle only leader with no other parts [0.01ms] (pass) Keybind.toString > should convert super modifier to string [0.01ms] (pass) Keybind.toString > should convert super+shift modifier to string (pass) Keybind.toString > should handle super with ctrl modifier (pass) Keybind.toString > should handle super with all modifiers [0.01ms] (pass) Keybind.toString > should handle undefined super field (omitted) (pass) Keybind.match > should match identical keybinds [0.13ms] (pass) Keybind.match > should not match different key names [0.02ms] (pass) Keybind.match > should not match different modifiers [0.02ms] (pass) Keybind.match > should match leader keybinds [0.01ms] (pass) Keybind.match > should not match leader vs non-leader [0.01ms] (pass) Keybind.match > should match complex keybinds [0.02ms] (pass) Keybind.match > should not match with one modifier different [0.03ms] (pass) Keybind.match > should match simple key without modifiers [0.03ms] (pass) Keybind.match > should match super modifier keybinds [0.03ms] (pass) Keybind.match > should not match super vs non-super [0.03ms] (pass) Keybind.match > should match undefined super with false super [0.03ms] (pass) Keybind.match > should match super+shift combination [0.05ms] (pass) Keybind.match > should not match when only super differs [0.04ms] (pass) Keybind.parse > should parse simple key [0.10ms] (pass) Keybind.parse > should parse leader key syntax [0.02ms] (pass) Keybind.parse > should parse ctrl modifier [0.01ms] (pass) Keybind.parse > should parse multiple modifiers [0.02ms] (pass) Keybind.parse > should parse shift modifier [0.01ms] (pass) Keybind.parse > should parse meta/alt modifier (pass) Keybind.parse > should parse leader with modifier [0.01ms] (pass) Keybind.parse > should parse multiple keybinds separated by comma [0.01ms] (pass) Keybind.parse > should parse shift+return combination [0.01ms] (pass) Keybind.parse > should parse ctrl+j combination (pass) Keybind.parse > should handle 'none' value (pass) Keybind.parse > should handle special keys (pass) Keybind.parse > should handle function keys [0.01ms] (pass) Keybind.parse > should handle complex multi-modifier combination (pass) Keybind.parse > should be case insensitive (pass) Keybind.parse > should parse super modifier [0.01ms] (pass) Keybind.parse > should parse super with shift modifier [0.02ms] (pass) Keybind.parse > should parse multiple keybinds with super [0.04ms] test/permission-task.test.ts: (pass) PermissionNext.evaluate for permission.task > returns ask when no match (default) [0.38ms] (pass) PermissionNext.evaluate for permission.task > returns deny for explicit deny [1.01ms] (pass) PermissionNext.evaluate for permission.task > returns allow for explicit allow [0.04ms] (pass) PermissionNext.evaluate for permission.task > returns ask for explicit ask [0.03ms] (pass) PermissionNext.evaluate for permission.task > matches wildcard patterns with deny [0.06ms] (pass) PermissionNext.evaluate for permission.task > matches wildcard patterns with allow [0.05ms] (pass) PermissionNext.evaluate for permission.task > matches wildcard patterns with ask [0.07ms] (pass) PermissionNext.evaluate for permission.task > later rules take precedence (last match wins) [0.05ms] (pass) PermissionNext.evaluate for permission.task > matches global wildcard [0.05ms] (pass) PermissionNext.disabled for task tool > task tool is disabled when global deny pattern exists (even with specific allows) [0.11ms] (pass) PermissionNext.disabled for task tool > task tool is disabled when global deny pattern exists (even with ask overrides) [0.03ms] (pass) PermissionNext.disabled for task tool > task tool is disabled when global deny pattern exists [0.03ms] (pass) PermissionNext.disabled for task tool > task tool is NOT disabled when only specific patterns are denied (no wildcard) [0.02ms] (pass) PermissionNext.disabled for task tool > task tool is enabled when no task rules exist (default ask) (pass) PermissionNext.disabled for task tool > task tool is NOT disabled when last wildcard pattern is allow [0.02ms] (pass) permission.task with real config files > loads task permissions from opencode.json config [889.77ms] (pass) permission.task with real config files > loads task permissions with wildcard patterns from config [775.30ms] (pass) permission.task with real config files > evaluate respects task permission from config [432.23ms] (pass) permission.task with real config files > mixed permission config with task and other tools [415.81ms] (pass) permission.task with real config files > task tool disabled when global deny comes last in config [418.48ms] (pass) permission.task with real config files > task tool NOT disabled when specific allow comes last in config [432.18ms] test/scheduler.test.ts: (pass) Scheduler.register > defaults to instance scope per directory [17.69ms] (pass) Scheduler.register > global scope runs once across instances [15.69ms] test/acp/agent-interface.test.ts: (pass) acp.agent interface compliance > Agent implements all SDK-checked methods [0.09ms] test/acp/event-subscription.test.ts: (pass) acp.agent event subscription > routes message.part.updated by the event sessionID (no cross-session pollution) [447.38ms] (pass) acp.agent event subscription > keeps concurrent sessions isolated when message.part.updated events are interleaved [693.17ms] (pass) acp.agent event subscription > does not create additional event subscriptions on repeated loadSession() [461.67ms] (pass) acp.agent event subscription > permission.asked events are handled and replied [427.12ms] (pass) acp.agent event subscription > permission prompt on session A does not block message updates for session B [454.78ms] test/agent/agent.test.ts: (pass) returns default native agents when no config [417.53ms] (pass) build agent has correct default properties [403.44ms] (pass) plan agent denies edits except .opencode/plans/* [467.71ms] (pass) explore agent denies edit and write [626.34ms] (pass) general agent denies todo tools [1637.02ms] (pass) compaction agent denies all permissions [427.83ms] (pass) custom agent from config creates new agent [421.17ms] (pass) custom agent config overrides native agent properties [430.67ms] (pass) agent disable removes agent from list [436.08ms] (pass) agent permission config merges with defaults [440.31ms] (pass) global permission config applies to all agents [435.88ms] (pass) agent steps/maxSteps config sets steps property [1644.61ms] (pass) agent mode can be overridden [420.07ms] (pass) agent name can be overridden [416.50ms] (pass) agent prompt can be set from config [426.72ms] (pass) unknown agent properties are placed into options [399.65ms] (pass) agent options merge correctly [392.01ms] (pass) multiple custom agents can be defined [421.47ms] (pass) Agent.get returns undefined for non-existent agent [420.24ms] (pass) default permission includes doom_loop and external_directory as ask [409.19ms] (pass) webfetch is allowed by default [404.68ms] (pass) legacy tools config converts to permissions [424.15ms] (pass) legacy tools config maps write/edit/patch/multiedit to edit permission [484.67ms] (pass) Truncate.GLOB is allowed even when user denies external_directory globally [425.57ms] (pass) Truncate.GLOB is allowed even when user denies external_directory per-agent [430.34ms] (pass) explicit Truncate.GLOB deny is respected [483.88ms] (pass) skill directories are allowed for external_directory [452.39ms] (pass) defaultAgent returns build when no default_agent config [396.15ms] (pass) defaultAgent respects default_agent config set to plan [413.66ms] (pass) defaultAgent respects default_agent config set to custom agent with mode all [421.44ms] (pass) defaultAgent throws when default_agent points to subagent [514.71ms] (pass) defaultAgent throws when default_agent points to hidden agent [446.57ms] (pass) defaultAgent throws when default_agent points to non-existent agent [449.37ms] (pass) defaultAgent returns plan when build is disabled and default_agent not set [424.98ms] (pass) defaultAgent throws when all primary agents are disabled [416.30ms] test/cli/github-action.test.ts: (pass) extractResponseText > returns text from text part [1.64ms] (pass) extractResponseText > returns last text part when multiple exist [0.02ms] (pass) extractResponseText > returns text even when tool parts follow [0.04ms] (pass) extractResponseText > returns null for reasoning-only response (signals summary needed) [0.03ms] (pass) extractResponseText > returns null for tool-only response (signals summary needed) [0.04ms] (pass) extractResponseText > returns null for multiple completed tools [0.02ms] (pass) extractResponseText > ignores running tool parts (throws since no completed tools) [0.06ms] (pass) extractResponseText > throws with part types on empty array [0.03ms] (pass) extractResponseText > throws with part types on unhandled parts [0.05ms] (pass) extractResponseText > prefers text over reasoning when both present [0.03ms] (pass) extractResponseText > prefers text over tools when both present [0.02ms] test/cli/github-remote.test.ts: (pass) parses https URL with .git suffix [0.08ms] (pass) parses https URL without .git suffix [0.03ms] (pass) parses git@ URL with .git suffix [0.02ms] (pass) parses git@ URL without .git suffix [0.02ms] (pass) parses ssh:// URL with .git suffix [0.02ms] (pass) parses ssh:// URL without .git suffix [0.02ms] (pass) parses http URL (pass) parses URL with hyphenated owner and repo names (pass) parses URL with underscores in names [0.01ms] (pass) parses URL with numbers in names [0.02ms] (pass) parses repos with dots in the name [0.03ms] (pass) returns null for non-github URLs [0.01ms] (pass) returns null for invalid URLs [0.01ms] (pass) returns null for URLs with extra path segments [0.01ms] test/config/agent-color.test.ts: (pass) agent color parsed from project config [470.56ms] (pass) Agent.get includes color from config [443.21ms] (pass) Color.hexToAnsiBold converts valid hex to ANSI [0.24ms] (pass) Color.hexToAnsiBold returns undefined for invalid hex [0.07ms] test/config/config.test.ts: (pass) loads config with defaults when no files exist [434.53ms] (pass) loads JSON config file [417.43ms] (pass) loads JSONC config file [454.11ms] (pass) merges multiple config files with correct precedence [410.81ms] (pass) handles environment variable substitution [423.55ms] (pass) preserves env variables when adding $schema to config [382.82ms] (pass) handles file inclusion substitution [412.53ms] (pass) validates config schema and throws on invalid fields [2.08ms] (pass) throws error for invalid JSON [1.52ms] (pass) handles agent configuration [420.84ms] (pass) treats agent variant as model-scoped setting (not provider option) [456.88ms] (pass) handles command configuration [412.56ms] (pass) migrates autoshare to share field [427.50ms] (pass) migrates mode field to agent field [408.78ms] (pass) loads config from .opencode directory [440.78ms] (pass) loads agents from .opencode/agents (plural) [412.24ms] (pass) loads commands from .opencode/command (singular) [419.70ms] (pass) loads commands from .opencode/commands (plural) [435.40ms] (pass) updates config and writes to file [1.20ms] (pass) gets config directories [423.65ms] (pass) resolves scoped npm plugins in config [458.10ms] (pass) merges plugin arrays from global and local configs [441.55ms] (pass) does not error when only custom agent is a subagent [428.41ms] (pass) merges instructions arrays from global and local configs [458.57ms] (pass) deduplicates duplicate instructions from global and local configs [457.69ms] (pass) deduplicates duplicate plugins from global and local configs [464.11ms] (pass) migrates legacy tools config to permissions - allow [422.73ms] (pass) migrates legacy tools config to permissions - deny [434.98ms] (pass) migrates legacy write tool to edit permission [438.01ms] (pass) managed settings override user settings [481.73ms] (pass) managed settings override project settings [397.60ms] (pass) missing managed settings file is not an error [425.17ms] (pass) migrates legacy edit tool to edit permission [500.10ms] (pass) migrates legacy patch tool to edit permission [449.26ms] (pass) migrates legacy multiedit tool to edit permission [514.80ms] (pass) migrates mixed legacy tools config [474.91ms] (pass) merges legacy tools with existing permission config [488.13ms] (pass) permission config preserves key order [697.12ms] (pass) project config can override MCP server enabled status [418.61ms] (pass) MCP config deep merges preserving base config properties [426.44ms] (pass) local .opencode config can override MCP from project config [463.87ms] (pass) project config overrides remote well-known config [453.95ms] (pass) getPluginName > extracts name from file:// URL [0.23ms] (pass) getPluginName > extracts name from npm package with version [0.17ms] (pass) getPluginName > extracts name from scoped npm package [0.07ms] (pass) getPluginName > returns full string for package without version [0.06ms] (pass) deduplicatePlugins > removes duplicates keeping higher priority (later entries) [0.14ms] (pass) deduplicatePlugins > prefers local file over npm package with same name [0.07ms] (pass) deduplicatePlugins > preserves order of remaining plugins [0.07ms] (pass) deduplicatePlugins > local plugin directory overrides global opencode.json plugin [417.19ms] (pass) OPENCODE_DISABLE_PROJECT_CONFIG > skips project config files when flag is set [456.21ms] (pass) OPENCODE_DISABLE_PROJECT_CONFIG > skips project .opencode/ directories when flag is set [432.59ms] (pass) OPENCODE_DISABLE_PROJECT_CONFIG > still loads global config when flag is set [447.58ms] (pass) OPENCODE_DISABLE_PROJECT_CONFIG > skips relative instructions with warning when flag is set but no config dir [436.83ms] (pass) OPENCODE_DISABLE_PROJECT_CONFIG > OPENCODE_CONFIG_DIR still works when flag is set [550.65ms] test/config/markdown.test.ts: (pass) ConfigMarkdown: normal template > should extract exactly 12 file references [0.02ms] (pass) ConfigMarkdown: normal template > should extract valid/path/to/a/file (pass) ConfigMarkdown: normal template > should extract another-valid/path/to/a/file (pass) ConfigMarkdown: normal template > should extract paths ignoring comma after (pass) ConfigMarkdown: normal template > should extract a path with a file extension and comma after [0.02ms] (pass) ConfigMarkdown: normal template > should extract a path with multiple dots and comma after (pass) ConfigMarkdown: normal template > should extract hidden directory (pass) ConfigMarkdown: normal template > should extract hidden file (pass) ConfigMarkdown: normal template > should extract a file ignoring period at end of sentence (pass) ConfigMarkdown: normal template > should extract an absolute path with an extension (pass) ConfigMarkdown: normal template > should extract an absolute path without an extension (pass) ConfigMarkdown: normal template > should extract an absolute path in home directory [0.01ms] (pass) ConfigMarkdown: normal template > should extract an absolute path under home directory (pass) ConfigMarkdown: normal template > should not match when preceded by backtick [0.03ms] (pass) ConfigMarkdown: normal template > should not match email addresses [0.01ms] (pass) ConfigMarkdown: frontmatter parsing > should parse without throwing [0.01ms] (pass) ConfigMarkdown: frontmatter parsing > should extract description field (pass) ConfigMarkdown: frontmatter parsing > should extract occupation field with colon in value (pass) ConfigMarkdown: frontmatter parsing > should extract title field with single quotes (pass) ConfigMarkdown: frontmatter parsing > should extract name field with embedded quotes (pass) ConfigMarkdown: frontmatter parsing > should extract family field with embedded single quotes (pass) ConfigMarkdown: frontmatter parsing > should extract multiline summary field (pass) ConfigMarkdown: frontmatter parsing > should not include commented fields in data (pass) ConfigMarkdown: frontmatter parsing > should extract URL with port (pass) ConfigMarkdown: frontmatter parsing > should extract time with colons (pass) ConfigMarkdown: frontmatter parsing > should extract value with multiple colons (pass) ConfigMarkdown: frontmatter parsing > should preserve already double-quoted values with colons (pass) ConfigMarkdown: frontmatter parsing > should preserve already single-quoted values with colons (pass) ConfigMarkdown: frontmatter parsing > should extract value with quotes and colons mixed (pass) ConfigMarkdown: frontmatter parsing > should handle empty values (pass) ConfigMarkdown: frontmatter parsing > should handle dollar sign replacement patterns literally (pass) ConfigMarkdown: frontmatter parsing > should not parse fake yaml from content (pass) ConfigMarkdown: frontmatter parsing > should extract content after frontmatter without modification [0.01ms] (pass) ConfigMarkdown: frontmatter parsing w/ empty frontmatter > should parse without throwing [0.01ms] (pass) ConfigMarkdown: frontmatter parsing w/ no frontmatter > should parse without throwing (pass) ConfigMarkdown: frontmatter parsing w/ Markdown header > should parse and match [0.01ms] (pass) ConfigMarkdown: frontmatter has weird model id > should parse and match [0.02ms] test/file/ignore.test.ts: (pass) match nested and non-nested [0.16ms] test/file/path-traversal.test.ts: (pass) Filesystem.contains > allows paths within project [0.04ms] (pass) Filesystem.contains > blocks ../ traversal [0.02ms] (pass) Filesystem.contains > blocks absolute paths outside project [0.01ms] (pass) Filesystem.contains > handles prefix collision edge cases [0.01ms] (pass) File.read path traversal protection > rejects ../ traversal attempting to read /etc/passwd [2.15ms] (pass) File.read path traversal protection > rejects deeply nested traversal [0.51ms] (pass) File.read path traversal protection > allows valid paths within project [0.72ms] (pass) File.list path traversal protection > rejects ../ traversal attempting to list /etc [0.72ms] (pass) File.list path traversal protection > allows valid subdirectory listing [0.55ms] (pass) Instance.containsPath > returns true for path inside directory [9.43ms] (pass) Instance.containsPath > returns true for path inside worktree but outside directory (monorepo subdirectory scenario) [8.83ms] (pass) Instance.containsPath > returns false for path outside both directory and worktree [9.11ms] (pass) Instance.containsPath > returns false for path with .. escaping worktree [10.39ms] (pass) Instance.containsPath > handles directory === worktree (running from repo root) [10.37ms] (pass) Instance.containsPath > non-git project does not allow arbitrary paths via worktree='/' [0.58ms] test/file/ripgrep.test.ts: (pass) file.ripgrep > defaults to include hidden [14.79ms] (pass) file.ripgrep > hidden false excludes hidden [5.77ms] test/ide/ide.test.ts: (pass) ide > should detect Visual Studio Code [0.12ms] (pass) ide > should detect Visual Studio Code Insiders [0.04ms] (pass) ide > should detect Cursor [0.04ms] (pass) ide > should detect VSCodium [0.02ms] (pass) ide > should detect Windsurf [0.02ms] (pass) ide > should return unknown when TERM_PROGRAM is not vscode [0.02ms] (pass) ide > should return unknown when GIT_ASKPASS does not contain IDE name [0.02ms] (pass) ide > should recognize vscode-insiders OPENCODE_CALLER [0.02ms] (pass) ide > should recognize vscode OPENCODE_CALLER [0.01ms] (pass) ide > should return false for unknown OPENCODE_CALLER [0.02ms] test/lsp/client.test.ts: (pass) LSPClient interop > handles workspace/workspaceFolders request [420.62ms] (pass) LSPClient interop > handles client/registerCapability request [252.21ms] (pass) LSPClient interop > handles client/unregisterCapability request [251.52ms] test/mcp/headers.test.ts: (pass) headers are passed to transports when oauth is enabled (default) [760.88ms] (pass) headers are passed to transports when oauth is explicitly disabled [432.74ms] (pass) no requestInit when headers are not provided [422.08ms] test/mcp/oauth-browser.test.ts: (pass) BrowserOpenFailed event is published when open() throws [2002.96ms] (pass) BrowserOpenFailed event is NOT published when open() succeeds [2006.46ms] (pass) open() is called with the authorization URL [2003.32ms] test/memory/abort-leak.test.ts: Baseline: 48.36 MB After 50 fetches: 43.80 MB Growth: -4.57 MB (pass) memory: abort controller leak > webfetch does not leak memory over many invocations [1950.17ms] OLD pattern (closure): 0.00 MB growth (500 closures) NEW pattern (bind): 0.00 MB growth Improvement: 0.00 MB saved (pass) memory: abort controller leak > compare closure vs bind pattern directly [643.20ms] test/patch/patch.test.ts: (pass) Patch namespace > parsePatch > should parse simple add file patch [0.69ms] (pass) Patch namespace > parsePatch > should parse delete file patch [0.18ms] (pass) Patch namespace > parsePatch > should parse patch with multiple hunks [0.31ms] (pass) Patch namespace > parsePatch > should parse file move operation [0.17ms] (pass) Patch namespace > parsePatch > should throw error for invalid patch format [1.27ms] (pass) Patch namespace > maybeParseApplyPatch > should parse direct apply_patch command [0.26ms] (pass) Patch namespace > maybeParseApplyPatch > should parse applypatch command [0.13ms] (pass) Patch namespace > maybeParseApplyPatch > should handle bash heredoc format [0.20ms] (pass) Patch namespace > maybeParseApplyPatch > should return NotApplyPatch for non-patch commands [0.11ms] (pass) Patch namespace > applyPatch > should add a new file [4.97ms] (pass) Patch namespace > applyPatch > should delete an existing file [0.49ms] (pass) Patch namespace > applyPatch > should update an existing file [1.86ms] (pass) Patch namespace > applyPatch > should move and update a file [0.53ms] (pass) Patch namespace > applyPatch > should handle multiple operations in one patch [0.41ms] (pass) Patch namespace > applyPatch > should create parent directories when adding files [0.31ms] (pass) Patch namespace > error handling > should throw error when updating non-existent file [0.24ms] (pass) Patch namespace > error handling > should throw error when deleting non-existent file [0.15ms] (pass) Patch namespace > edge cases > should handle empty files [2.54ms] (pass) Patch namespace > edge cases > should handle files with no trailing newline [1.60ms] (pass) Patch namespace > edge cases > should handle multiple update chunks in single file [0.37ms] test/permission/arity.test.ts: (pass) arity 1 - unknown commands default to first token [0.13ms] (pass) arity 2 - two token commands [0.03ms] (pass) arity 3 - three token commands [0.06ms] (pass) longest match wins - nested prefixes [0.05ms] (pass) exact length matches [0.02ms] (pass) edge cases [0.02ms] test/permission/next.test.ts: (pass) fromConfig - string value becomes wildcard rule [0.05ms] (pass) fromConfig - object value converts to rules array [0.06ms] (pass) fromConfig - mixed string and object values [0.02ms] (pass) fromConfig - empty object (pass) fromConfig - expands tilde to home directory [0.03ms] (pass) fromConfig - expands $HOME to home directory [0.02ms] (pass) fromConfig - expands $HOME without trailing slash [0.01ms] (pass) fromConfig - does not expand tilde in middle of path [0.01ms] (pass) fromConfig - expands exact tilde to home directory [0.01ms] (pass) evaluate - matches expanded tilde pattern [0.12ms] (pass) evaluate - matches expanded $HOME pattern [0.04ms] (pass) merge - simple concatenation [0.02ms] (pass) merge - adds new permission [0.01ms] (pass) merge - concatenates rules for same permission [0.01ms] (pass) merge - multiple rulesets [0.02ms] (pass) merge - empty ruleset does nothing [0.01ms] (pass) merge - preserves rule order [0.02ms] (pass) merge - config permission overrides default ask [0.04ms] (pass) merge - config ask overrides default allow [0.02ms] (pass) evaluate - exact pattern match [0.02ms] (pass) evaluate - wildcard pattern match [0.02ms] (pass) evaluate - last matching rule wins [0.02ms] (pass) evaluate - last matching rule wins (wildcard after specific) [0.03ms] (pass) evaluate - glob pattern match [0.02ms] (pass) evaluate - last matching glob wins [0.02ms] (pass) evaluate - order matters for specificity [0.02ms] (pass) evaluate - unknown permission returns ask [0.02ms] (pass) evaluate - empty ruleset returns ask [1.52ms] (pass) evaluate - no matching pattern returns ask [0.05ms] (pass) evaluate - empty rules array returns ask [0.03ms] (pass) evaluate - multiple matching patterns, last wins [0.05ms] (pass) evaluate - non-matching patterns are skipped [0.03ms] (pass) evaluate - exact match at end wins over earlier wildcard [0.03ms] (pass) evaluate - wildcard at end overrides earlier exact match [0.03ms] (pass) evaluate - wildcard permission matches any permission [0.02ms] (pass) evaluate - wildcard permission with specific pattern [0.03ms] (pass) evaluate - glob permission pattern [0.06ms] (pass) evaluate - specific permission and wildcard permission combined [0.03ms] (pass) evaluate - wildcard permission does not match when specific exists [0.03ms] (pass) evaluate - multiple matching permission patterns combine rules [0.04ms] (pass) evaluate - wildcard permission fallback for unknown tool [0.03ms] (pass) evaluate - permission patterns sorted by length regardless of object order [0.02ms] (pass) evaluate - merges multiple rulesets [0.04ms] (pass) disabled - returns empty set when all tools allowed [0.10ms] (pass) disabled - disables tool when denied [0.04ms] (pass) disabled - disables edit/write/patch/multiedit when edit denied [0.04ms] (pass) disabled - does not disable when partially denied [0.02ms] (pass) disabled - does not disable when action is ask [0.02ms] (pass) disabled - does not disable when specific allow after wildcard deny [0.02ms] (pass) disabled - does not disable when wildcard allow after deny [0.02ms] (pass) disabled - disables multiple tools [0.03ms] (pass) disabled - wildcard permission denies all tools [0.02ms] (pass) disabled - specific allow overrides wildcard deny [0.03ms] (pass) ask - resolves immediately when action is allow [48.82ms] (pass) ask - throws RejectedError when action is deny [25.52ms] (pass) ask - returns pending promise when action is ask [22.20ms] (pass) reply - once resolves the pending ask [54.22ms] (pass) reply - reject throws RejectedError [25.24ms] (pass) reply - always persists approval and resolves [22.31ms] (pass) reply - reject cancels all pending for same session [23.10ms] (pass) ask - checks all patterns and stops on first deny [30.43ms] (pass) ask - allows all patterns when all match allow rules [54.83ms] test/plugin/auth-override.test.ts: (pass) plugin.auth-override > user plugin overrides built-in github-copilot auth [5211.76ms] test/plugin/codex.test.ts: (pass) plugin.codex > parseJwtClaims > parses valid JWT with claims [1.38ms] (pass) plugin.codex > parseJwtClaims > returns undefined for JWT with less than 3 parts [0.03ms] (pass) plugin.codex > parseJwtClaims > returns undefined for invalid base64 [0.03ms] (pass) plugin.codex > parseJwtClaims > returns undefined for invalid JSON payload [0.03ms] (pass) plugin.codex > extractAccountIdFromClaims > extracts chatgpt_account_id from root [0.03ms] (pass) plugin.codex > extractAccountIdFromClaims > extracts chatgpt_account_id from nested https://api.openai.com/auth [0.03ms] (pass) plugin.codex > extractAccountIdFromClaims > prefers root over nested [0.01ms] (pass) plugin.codex > extractAccountIdFromClaims > extracts from organizations array as fallback [0.03ms] (pass) plugin.codex > extractAccountIdFromClaims > returns undefined when no accountId found [0.01ms] (pass) plugin.codex > extractAccountId > extracts from id_token first [0.05ms] (pass) plugin.codex > extractAccountId > falls back to access_token when id_token has no accountId [0.03ms] (pass) plugin.codex > extractAccountId > returns undefined when no tokens have accountId [0.02ms] (pass) plugin.codex > extractAccountId > handles missing id_token [0.01ms] test/project/project.test.ts: (pass) Project.fromDirectory > should handle git repository with no commits [12.36ms] (pass) Project.fromDirectory > should handle git repository with commits [26.09ms] (pass) Project.fromDirectory with worktrees > should set worktree to root when called from root [14.01ms] (pass) Project.fromDirectory with worktrees > should set worktree to root when called from a worktree [29.10ms] (pass) Project.fromDirectory with worktrees > should accumulate multiple worktrees in sandboxes [49.37ms] (pass) Project.discover > should discover favicon.png in root [20.65ms] (pass) Project.discover > should not discover non-image files [18.78ms] test/provider/amazon-bedrock.test.ts: (pass) Bedrock: config region takes precedence over AWS_REGION env var [711.62ms] (pass) Bedrock: falls back to AWS_REGION env var when no config region [633.23ms] (pass) Bedrock: loads when bearer token from auth.json is present [797.85ms] (pass) Bedrock: config profile takes precedence over AWS_PROFILE env var [457.67ms] (pass) Bedrock: includes custom endpoint in options when specified [704.19ms] (pass) Bedrock: autoloads when AWS_WEB_IDENTITY_TOKEN_FILE is present [882.39ms] (pass) Bedrock: model with us. prefix should not be double-prefixed [975.02ms] (pass) Bedrock: model with global. prefix should not be prefixed [1047.60ms] (pass) Bedrock: model with eu. prefix should not be double-prefixed [1056.97ms] killed 1 dangling process (fail) Bedrock: model without prefix in US region should get us. prefix added [5002.71ms] ^ this test timed out after 5000ms. (pass) Bedrock cross-region prefix detection > should detect global. prefix [171.88ms] (pass) Bedrock cross-region prefix detection > should detect us. prefix [0.14ms] (pass) Bedrock cross-region prefix detection > should detect eu. prefix [0.03ms] (pass) Bedrock cross-region prefix detection > should detect jp. prefix [0.02ms] (pass) Bedrock cross-region prefix detection > should detect apac. prefix [0.02ms] (pass) Bedrock cross-region prefix detection > should detect au. prefix [0.01ms] (pass) Bedrock cross-region prefix detection > should NOT detect prefix for non-prefixed model [0.02ms] (pass) Bedrock cross-region prefix detection > should NOT detect prefix for amazon nova models [0.01ms] (pass) Bedrock cross-region prefix detection > should NOT detect prefix for cohere models [0.08ms] test/provider/gitlab-duo.test.ts: (pass) GitLab Duo: loads provider with API key from environment [1486.74ms] (pass) GitLab Duo: config instanceUrl option sets baseURL [1325.19ms] (pass) GitLab Duo: loads with OAuth token from auth.json [2316.99ms] (pass) GitLab Duo: loads with Personal Access Token from auth.json [1222.06ms] (pass) GitLab Duo: supports self-hosted instance configuration [448.15ms] (pass) GitLab Duo: config apiKey takes precedence over environment variable [461.23ms] (pass) GitLab Duo: supports feature flags configuration [414.76ms] (pass) GitLab Duo: has multiple agentic chat models available [425.75ms] test/provider/provider.test.ts: (pass) provider loaded from env variable [460.56ms] (pass) provider loaded from config with apiKey option [406.77ms] (pass) disabled_providers excludes provider [631.33ms] (pass) enabled_providers restricts to only listed providers [649.92ms] (pass) model whitelist filters models for provider [448.28ms] (pass) model blacklist excludes specific models [403.81ms] (pass) custom model alias via config [936.87ms] (pass) custom provider with npm package [806.40ms] (pass) env variable takes precedence, config merges options [1937.51ms] (pass) getModel returns model for valid provider/model [1319.53ms] (pass) getModel throws ModelNotFoundError for invalid model [835.35ms] (pass) getModel throws ModelNotFoundError for invalid provider [427.91ms] (pass) parseModel correctly parses provider/model string [0.13ms] (pass) parseModel handles model IDs with slashes [0.02ms] (pass) defaultModel returns first available model when no config set [415.51ms] (pass) defaultModel respects config model setting [403.27ms] (pass) provider with baseURL from config [419.51ms] (pass) model cost defaults to zero when not specified [421.02ms] (pass) model options are merged from existing model [484.86ms] (pass) provider removed when all models filtered out [434.53ms] (pass) closest finds model by partial match [482.31ms] (pass) closest returns undefined for nonexistent provider [407.61ms] (pass) getModel uses realIdByKey for aliased models [417.56ms] (pass) provider api field sets model api.url [417.56ms] (pass) explicit baseURL overrides api field [417.18ms] (pass) model inherits properties from existing database model [432.31ms] (pass) disabled_providers prevents loading even with env var [398.43ms] (pass) enabled_providers with empty array allows no providers [438.55ms] (pass) whitelist and blacklist can be combined [447.34ms] (pass) model modalities default correctly [411.62ms] (pass) model with custom cost values [397.06ms] (pass) getSmallModel returns appropriate small model [416.97ms] (pass) getSmallModel respects config small_model override [427.61ms] (pass) provider.sort prioritizes preferred models [0.23ms] (pass) multiple providers can be configured simultaneously [441.77ms] (pass) provider with custom npm package [414.22ms] (pass) model alias name defaults to alias key when id differs [431.14ms] (pass) provider with multiple env var options only includes apiKey when single env [415.28ms] (pass) provider with single env var includes apiKey automatically [426.70ms] (pass) model cost overrides existing cost values [422.41ms] (pass) completely new provider not in database can be configured [404.29ms] (pass) disabled_providers and enabled_providers interaction [422.61ms] (pass) model with tool_call false [416.22ms] (pass) model defaults tool_call to true when not specified [1934.16ms] (pass) model headers are preserved [670.32ms] (pass) provider env fallback - second env var used if first missing [1135.87ms] (pass) getModel returns consistent results [434.66ms] (pass) provider name defaults to id when not in database [418.01ms] (pass) ModelNotFoundError includes suggestions for typos [423.40ms] (pass) ModelNotFoundError for provider includes suggestions [710.90ms] (pass) getProvider returns undefined for nonexistent provider [1827.57ms] (pass) getProvider returns provider info [736.26ms] (pass) closest returns undefined when no partial match found [786.63ms] (pass) closest checks multiple query terms in order [438.82ms] (pass) model limit defaults to zero when not specified [413.72ms] (pass) provider options are deeply merged [451.14ms] (pass) custom model inherits npm package from models.dev provider config [722.86ms] (pass) custom model inherits api.url from models.dev provider [447.90ms] (pass) model variants are generated for reasoning models [652.42ms] (pass) model variants can be disabled via config [426.42ms] (pass) model variants can be customized via config [416.63ms] (pass) disabled key is stripped from variant config [418.17ms] (pass) all variants can be disabled via config [413.73ms] (pass) variant config merges with generated variants [428.65ms] (pass) variants filtered in second pass for database models [472.76ms] (pass) custom model with variants enabled and disabled [1627.89ms] test/provider/transform.test.ts: (pass) ProviderTransform.options - setCacheKey > should set promptCacheKey when providerOptions.setCacheKey is true [0.18ms] (pass) ProviderTransform.options - setCacheKey > should not set promptCacheKey when providerOptions.setCacheKey is false [0.04ms] (pass) ProviderTransform.options - setCacheKey > should not set promptCacheKey when providerOptions is undefined [0.01ms] (pass) ProviderTransform.options - setCacheKey > should not set promptCacheKey when providerOptions does not have setCacheKey [0.04ms] (pass) ProviderTransform.options - setCacheKey > should set promptCacheKey for openai provider regardless of setCacheKey [0.04ms] (pass) ProviderTransform.options - setCacheKey > should set store=false for openai provider [0.05ms] (pass) ProviderTransform.options - gpt-5 textVerbosity > gpt-5.2 should have textVerbosity set to low [0.06ms] (pass) ProviderTransform.options - gpt-5 textVerbosity > gpt-5.1 should have textVerbosity set to low [0.02ms] (pass) ProviderTransform.options - gpt-5 textVerbosity > gpt-5.2-chat-latest should NOT have textVerbosity set (only supports medium) [0.03ms] (pass) ProviderTransform.options - gpt-5 textVerbosity > gpt-5.1-chat-latest should NOT have textVerbosity set (only supports medium) [0.02ms] (pass) ProviderTransform.options - gpt-5 textVerbosity > gpt-5.2-chat should NOT have textVerbosity set [0.01ms] (pass) ProviderTransform.options - gpt-5 textVerbosity > gpt-5-chat should NOT have textVerbosity set [0.01ms] (pass) ProviderTransform.options - gpt-5 textVerbosity > gpt-5.2-codex should NOT have textVerbosity set (codex models excluded) [0.01ms] (pass) ProviderTransform.maxOutputTokens > returns 32k when modelLimit > 32k [0.04ms] (pass) ProviderTransform.maxOutputTokens > returns modelLimit when modelLimit < 32k [0.02ms] (pass) ProviderTransform.maxOutputTokens > azure > returns 32k when modelLimit > 32k (pass) ProviderTransform.maxOutputTokens > azure > returns modelLimit when modelLimit < 32k (pass) ProviderTransform.maxOutputTokens > bedrock > returns 32k when modelLimit > 32k (pass) ProviderTransform.maxOutputTokens > bedrock > returns modelLimit when modelLimit < 32k [0.03ms] (pass) ProviderTransform.maxOutputTokens > anthropic without thinking options > returns 32k when modelLimit > 32k (pass) ProviderTransform.maxOutputTokens > anthropic without thinking options > returns modelLimit when modelLimit < 32k (pass) ProviderTransform.maxOutputTokens > anthropic with thinking options > returns 32k when budgetTokens + 32k <= modelLimit [0.01ms] (pass) ProviderTransform.maxOutputTokens > anthropic with thinking options > returns modelLimit - budgetTokens when budgetTokens + 32k > modelLimit (pass) ProviderTransform.maxOutputTokens > anthropic with thinking options > returns 32k when thinking type is not enabled (pass) ProviderTransform.schema - gemini array items > adds missing items for array properties [0.19ms] (pass) ProviderTransform.schema - gemini nested array items > adds type to 2D array with empty inner items [0.07ms] (pass) ProviderTransform.schema - gemini nested array items > adds items and type to 2D array with missing inner items [0.06ms] (pass) ProviderTransform.schema - gemini nested array items > handles deeply nested arrays (3D) [0.02ms] (pass) ProviderTransform.schema - gemini nested array items > preserves existing item types in nested arrays [0.02ms] (pass) ProviderTransform.schema - gemini nested array items > handles mixed nested structures with objects and arrays [0.06ms] (pass) ProviderTransform.schema - gemini non-object properties removal > removes properties from non-object types [0.04ms] (pass) ProviderTransform.schema - gemini non-object properties removal > removes required from non-object types [0.04ms] (pass) ProviderTransform.schema - gemini non-object properties removal > removes properties and required from nested non-object types [0.11ms] (pass) ProviderTransform.schema - gemini non-object properties removal > keeps properties and required on object types [0.06ms] (pass) ProviderTransform.schema - gemini non-object properties removal > does not affect non-gemini providers [0.02ms] (pass) ProviderTransform.message - DeepSeek reasoning content > DeepSeek with tool calls includes reasoning_content in providerOptions [1.53ms] (pass) ProviderTransform.message - DeepSeek reasoning content > Non-DeepSeek providers leave reasoning content unchanged [0.20ms] (pass) ProviderTransform.message - empty image handling > should replace empty base64 image with error text [0.51ms] (pass) ProviderTransform.message - empty image handling > should keep valid base64 images unchanged [0.19ms] (pass) ProviderTransform.message - empty image handling > should handle mixed valid and empty images [0.06ms] (pass) ProviderTransform.message - anthropic empty content filtering > filters out messages with empty string content [0.03ms] (pass) ProviderTransform.message - anthropic empty content filtering > filters out empty text parts from array content [0.05ms] (pass) ProviderTransform.message - anthropic empty content filtering > filters out empty reasoning parts from array content [0.06ms] (pass) ProviderTransform.message - anthropic empty content filtering > removes entire message when all parts are empty [0.03ms] (pass) ProviderTransform.message - anthropic empty content filtering > keeps non-text/reasoning parts even if text parts are empty [0.27ms] (pass) ProviderTransform.message - anthropic empty content filtering > keeps messages with valid text alongside empty parts [0.09ms] (pass) ProviderTransform.message - anthropic empty content filtering > does not filter for non-anthropic providers [0.06ms] (pass) ProviderTransform.message - strip openai metadata when store=false > preserves itemId and reasoningEncryptedContent when store=false [0.05ms] (pass) ProviderTransform.message - strip openai metadata when store=false > preserves itemId and reasoningEncryptedContent when store=false even when not openai [0.07ms] (pass) ProviderTransform.message - strip openai metadata when store=false > preserves other openai options including itemId [0.04ms] (pass) ProviderTransform.message - strip openai metadata when store=false > preserves metadata for openai package when store is true [0.03ms] (pass) ProviderTransform.message - strip openai metadata when store=false > preserves metadata for non-openai packages when store is false [0.03ms] (pass) ProviderTransform.message - strip openai metadata when store=false > preserves metadata using providerID key when store is false [0.03ms] (pass) ProviderTransform.message - strip openai metadata when store=false > preserves itemId across all providerOptions keys [0.09ms] (pass) ProviderTransform.message - strip openai metadata when store=false > does not strip metadata for non-openai packages when store is not false [0.03ms] (pass) ProviderTransform.message - providerOptions key remapping > azure keeps 'azure' key and does not remap to 'openai' [0.06ms] (pass) ProviderTransform.message - providerOptions key remapping > copilot remaps providerID to 'copilot' key [0.03ms] (pass) ProviderTransform.message - providerOptions key remapping > bedrock remaps providerID to 'bedrock' key [0.02ms] (pass) ProviderTransform.message - claude w/bedrock custom inference profile > adds cachePoint [0.09ms] (pass) ProviderTransform.variants > returns empty object when model has no reasoning capabilities [0.06ms] (pass) ProviderTransform.variants > deepseek returns empty object [0.02ms] (pass) ProviderTransform.variants > minimax returns empty object [0.02ms] (pass) ProviderTransform.variants > glm returns empty object [0.01ms] (pass) ProviderTransform.variants > mistral returns empty object [0.01ms] (pass) ProviderTransform.variants > @openrouter/ai-sdk-provider > returns empty object for non-qualifying models [0.02ms] (pass) ProviderTransform.variants > @openrouter/ai-sdk-provider > gpt models return OPENAI_EFFORTS with reasoning [0.03ms] (pass) ProviderTransform.variants > @openrouter/ai-sdk-provider > gemini-3 returns OPENAI_EFFORTS with reasoning [0.02ms] (pass) ProviderTransform.variants > @openrouter/ai-sdk-provider > grok-4 returns empty object [0.01ms] (pass) ProviderTransform.variants > @openrouter/ai-sdk-provider > grok-3-mini returns low and high with reasoning [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/gateway > returns OPENAI_EFFORTS with reasoningEffort [0.04ms] (pass) ProviderTransform.variants > @ai-sdk/github-copilot > standard models return low, medium, high [0.07ms] (pass) ProviderTransform.variants > @ai-sdk/github-copilot > gpt-5.1-codex-max includes xhigh [0.03ms] (pass) ProviderTransform.variants > @ai-sdk/github-copilot > gpt-5.1-codex-mini does not include xhigh [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/github-copilot > gpt-5.1-codex does not include xhigh [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/github-copilot > gpt-5.2 includes xhigh [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/github-copilot > gpt-5.2-codex includes xhigh [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/cerebras > returns WIDELY_SUPPORTED_EFFORTS with reasoningEffort [0.03ms] (pass) ProviderTransform.variants > @ai-sdk/togetherai > returns WIDELY_SUPPORTED_EFFORTS with reasoningEffort [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/xai > grok-3 returns empty object [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/xai > grok-3-mini returns low and high with reasoningEffort [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/deepinfra > returns WIDELY_SUPPORTED_EFFORTS with reasoningEffort [0.03ms] (pass) ProviderTransform.variants > @ai-sdk/openai-compatible > returns WIDELY_SUPPORTED_EFFORTS with reasoningEffort [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/azure > o1-mini returns empty object [0.03ms] (pass) ProviderTransform.variants > @ai-sdk/azure > standard azure models return custom efforts with reasoningSummary [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/azure > gpt-5 adds minimal effort [0.03ms] (pass) ProviderTransform.variants > @ai-sdk/openai > gpt-5-pro returns empty object [0.01ms] (pass) ProviderTransform.variants > @ai-sdk/openai > standard openai models return custom efforts with reasoningSummary [0.03ms] (pass) ProviderTransform.variants > @ai-sdk/openai > models after 2025-11-13 include 'none' effort [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/openai > models after 2025-12-04 include 'xhigh' effort [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/anthropic > returns high and max with thinking config [0.03ms] (pass) ProviderTransform.variants > @ai-sdk/amazon-bedrock > returns WIDELY_SUPPORTED_EFFORTS with reasoningConfig [0.03ms] (pass) ProviderTransform.variants > @ai-sdk/google > gemini-2.5 returns high and max with thinkingConfig and thinkingBudget [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/google > other gemini models return low and high with thinkingLevel [0.05ms] (pass) ProviderTransform.variants > @ai-sdk/google-vertex > gemini-2.5 returns high and max with thinkingConfig and thinkingBudget [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/google-vertex > other vertex models return low and high with thinkingLevel [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/cohere > returns empty object [0.03ms] (pass) ProviderTransform.variants > @ai-sdk/groq > returns none and WIDELY_SUPPORTED_EFFORTS with thinkingLevel [0.02ms] (pass) ProviderTransform.variants > @ai-sdk/perplexity > returns empty object [0.01ms] test/question/question.test.ts: (pass) ask - returns pending promise [33.31ms] (pass) ask - adds to pending list [11.34ms] (pass) reply - resolves the pending ask with answers [13.23ms] (pass) reply - removes from pending list [11.03ms] (pass) reply - does nothing for unknown requestID [9.31ms] (pass) reject - throws RejectedError [10.17ms] (pass) reject - removes from pending list [16.14ms] (pass) reject - does nothing for unknown requestID [10.70ms] (pass) ask - handles multiple questions [9.21ms] (pass) list - returns all pending requests [13.45ms] (pass) list - returns empty when no pending [9.25ms] test/server/session-list.test.ts: (pass) session.list > filters by directory [941.93ms] test/server/session-select.test.ts: (pass) tui.selectSession endpoint > should return 200 when called with valid session [2.83ms] (pass) tui.selectSession endpoint > should return 404 when session does not exist [0.50ms] (pass) tui.selectSession endpoint > should return 400 when session ID format is invalid [0.65ms] test/session/compaction.test.ts: (pass) session.compaction.isOverflow > returns true when token count exceeds usable context [412.95ms] (pass) session.compaction.isOverflow > returns false when token count within usable context [438.79ms] (pass) session.compaction.isOverflow > includes cache.read in token count [421.99ms] (pass) session.compaction.isOverflow > respects input limit for input caps [426.23ms] (pass) session.compaction.isOverflow > returns false when input/output are within input caps [391.86ms] (pass) session.compaction.isOverflow > returns false when output within limit with input caps [411.01ms] (pass) session.compaction.isOverflow > returns false when model context limit is 0 [433.90ms] (pass) session.compaction.isOverflow > returns false when compaction.auto is disabled [370.88ms] (pass) util.token.estimate > estimates tokens from text (4 chars per token) [0.13ms] (pass) util.token.estimate > estimates tokens from larger text [0.03ms] (pass) util.token.estimate > returns 0 for empty string [0.01ms] (pass) session.getUsage > normalizes standard usage to token format [1.37ms] (pass) session.getUsage > extracts cached tokens to cache.read [0.09ms] (pass) session.getUsage > handles anthropic cache write metadata [0.05ms] (pass) session.getUsage > does not subtract cached tokens for anthropic provider [0.04ms] (pass) session.getUsage > handles reasoning tokens [0.03ms] (pass) session.getUsage > handles undefined optional values gracefully [0.04ms] (pass) session.getUsage > calculates cost correctly [0.24ms] test/session/instruction.test.ts: (pass) InstructionPrompt.resolve > returns empty when AGENTS.md is at project root (already in systemPaths) [407.49ms] (pass) InstructionPrompt.resolve > returns AGENTS.md from subdirectory (not in systemPaths) [373.27ms] (pass) InstructionPrompt.resolve > doesn't reload AGENTS.md when reading it directly [395.13ms] (pass) InstructionPrompt.systemPaths OPENCODE_CONFIG_DIR > prefers OPENCODE_CONFIG_DIR AGENTS.md over global when both exist [2.34ms] (pass) InstructionPrompt.systemPaths OPENCODE_CONFIG_DIR > falls back to global AGENTS.md when OPENCODE_CONFIG_DIR has no AGENTS.md [1.87ms] (pass) InstructionPrompt.systemPaths OPENCODE_CONFIG_DIR > uses global AGENTS.md when OPENCODE_CONFIG_DIR is not set [1.68ms] test/session/llm.test.ts: (pass) session.llm.hasToolCalls > returns false for empty messages array [0.17ms] (pass) session.llm.hasToolCalls > returns false for messages with only text content [0.06ms] (pass) session.llm.hasToolCalls > returns true when messages contain tool-call [0.04ms] (pass) session.llm.hasToolCalls > returns true when messages contain tool-result [0.03ms] (pass) session.llm.hasToolCalls > returns false for messages with string content [0.02ms] (pass) session.llm.hasToolCalls > returns true when tool-call is mixed with text content [0.02ms] (pass) session.llm.stream > sends temperature, tokens, and reasoning options for openai-compatible models [787.35ms] (pass) session.llm.stream > sends responses API payload for OpenAI models [548.30ms] (pass) session.llm.stream > sends messages API payload for Anthropic models [638.37ms] (pass) session.llm.stream > sends Google API payload for Gemini models [673.91ms] test/session/message-v2.test.ts: (pass) session.message-v2.toModelMessage > filters out messages with no parts [2.74ms] (pass) session.message-v2.toModelMessage > filters out messages with only ignored parts [0.04ms] (pass) session.message-v2.toModelMessage > includes synthetic text parts [0.20ms] (pass) session.message-v2.toModelMessage > converts user text/file parts and injects compaction/subtask prompts [0.06ms] (pass) session.message-v2.toModelMessage > converts assistant tool completion into tool-call + tool-result messages with attachments [0.24ms] (pass) session.message-v2.toModelMessage > omits provider metadata when assistant model differs [0.07ms] (pass) session.message-v2.toModelMessage > replaces compacted tool output with placeholder [0.06ms] (pass) session.message-v2.toModelMessage > converts assistant tool error into error-text tool result [0.10ms] (pass) session.message-v2.toModelMessage > filters assistant messages with non-abort errors [0.13ms] (pass) session.message-v2.toModelMessage > includes aborted assistant messages only when they have non-step-start/reasoning content [0.07ms] (pass) session.message-v2.toModelMessage > splits assistant messages on step-start boundaries [0.04ms] (pass) session.message-v2.toModelMessage > drops messages that only contain step-start parts [0.02ms] (pass) session.message-v2.toModelMessage > converts pending/running tool calls to error results to prevent dangling tool_use [0.14ms] test/session/prompt-variant.test.ts: (pass) session.prompt agent variant > applies agent variant only when using agent model [657.85ms] test/session/retry.test.ts: (pass) session.retry.delay > caps delay at 30 seconds when headers missing [0.20ms] (pass) session.retry.delay > prefers retry-after-ms when shorter than exponential [0.02ms] (pass) session.retry.delay > uses retry-after seconds when reasonable [0.01ms] (pass) session.retry.delay > accepts http-date retry-after values [0.10ms] (pass) session.retry.delay > ignores invalid retry hints [0.02ms] (pass) session.retry.delay > ignores malformed date retry hints [0.03ms] (pass) session.retry.delay > ignores past date retry hints [0.02ms] (pass) session.retry.delay > uses retry-after values even when exceeding 10 minutes with headers [0.02ms] (pass) session.retry.delay > sleep caps delay to max 32-bit signed integer to avoid TimeoutOverflowWarning [0.25ms] (pass) session.retry.retryable > maps too_many_requests json messages [0.09ms] (pass) session.retry.retryable > maps overloaded provider codes [0.02ms] (pass) session.retry.retryable > handles json messages without code [0.02ms] (pass) session.retry.retryable > does not throw on numeric error codes [0.04ms] (pass) session.retry.retryable > returns undefined for non-json message [0.02ms] (pass) session.message-v2.fromError > converts ECONNRESET socket errors to retryable APIError [5465.30ms] (pass) session.message-v2.fromError > ECONNRESET socket error is retryable [0.08ms] (pass) session.message-v2.fromError > marks OpenAI 404 status codes as retryable [0.28ms] test/session/revert-compact.test.ts: (pass) revert + compact workflow > should properly handle compact command after revert [715.55ms] (pass) revert + compact workflow > should properly clean up revert state before creating compaction message [687.97ms] test/session/session.test.ts: (pass) session.started event > should emit session.started event when session is created [103.40ms] (pass) session.started event > session.started event should be emitted before session.updated [103.77ms] test/skill/skill.test.ts: (pass) discovers skills from .opencode/skill/ directory [751.49ms] (pass) returns skill directories from Skill.dirs [4084.73ms] (pass) discovers multiple skills from .opencode/skill/ directory [1887.31ms] (pass) skips skills with missing frontmatter [616.42ms] (pass) discovers skills from .claude/skills/ directory [811.28ms] (pass) discovers global skills from ~/.claude/skills/ directory [673.39ms] (pass) returns empty array when no skills exist [838.36ms] (pass) discovers skills from .agents/skills/ directory [617.65ms] (pass) discovers global skills from ~/.agents/skills/ directory [560.72ms] (pass) discovers skills from both .claude/skills/ and .agents/skills/ [643.92ms] (pass) properly resolves directories that skills live in [832.09ms] test/snapshot/snapshot.test.ts: (pass) tracks deleted files correctly [594.79ms] (pass) revert should remove new files [703.89ms] (pass) revert in subdirectory [881.23ms] (pass) multiple file operations [963.15ms] (pass) empty directory handling [532.07ms] (pass) binary file handling [666.07ms] (pass) symlink handling [737.55ms] (pass) large file handling [769.97ms] (pass) nested directory revert [765.35ms] (pass) special characters in filenames [533.09ms] (pass) revert with empty patches [14.42ms] (pass) patch with invalid hash [586.19ms] (pass) revert non-existent file [588.55ms] (pass) unicode filenames [465.08ms] (skip) unicode filenames modification and restore (pass) unicode filenames in subdirectories [535.94ms] (pass) very long filenames [679.52ms] (pass) hidden files [1142.01ms] (pass) nested symlinks [652.16ms] (pass) file permissions and ownership changes [492.25ms] (pass) circular symlinks [623.33ms] (pass) gitignore changes [583.57ms] (pass) concurrent file operations during patch [477.26ms] (pass) snapshot state isolation between projects [1140.48ms] (pass) patch detects changes in secondary worktree [1131.60ms] (pass) revert only removes files in invoking worktree [1308.58ms] (pass) diff reports worktree-only/shared edits and ignores primary-only [1065.12ms] (pass) track with no changes returns same hash [470.15ms] (pass) diff function with various changes [617.70ms] (pass) restore function [645.79ms] (pass) revert should not delete files that existed but were deleted in snapshot [526.77ms] (pass) revert preserves file that existed in snapshot when deleted then recreated [668.04ms] (pass) diffFull sets status based on git change type [496.16ms] (pass) diffFull with new file additions [653.48ms] (pass) diffFull with file modifications [523.90ms] (pass) diffFull with file deletions [486.96ms] (pass) diffFull with multiple line additions [421.01ms] (pass) diffFull with addition and deletion [517.88ms] (pass) diffFull with multiple additions and deletions [482.55ms] (pass) diffFull with no changes [632.67ms] (pass) diffFull with binary file changes [719.12ms] (pass) diffFull with whitespace changes [507.50ms] test/tool/apply_patch.test.ts: (pass) tool.apply_patch freeform > requires patchText [1.90ms] (pass) tool.apply_patch freeform > rejects invalid patch format [0.67ms] (pass) tool.apply_patch freeform > rejects empty patch [0.16ms] (pass) tool.apply_patch freeform > applies add/update/delete in one patch [719.10ms] (pass) tool.apply_patch freeform > permission metadata includes move file info [524.11ms] (pass) tool.apply_patch freeform > applies multiple hunks to one file [464.99ms] (pass) tool.apply_patch freeform > inserts lines with insert-only hunk [942.99ms] (pass) tool.apply_patch freeform > appends trailing newline on update [508.54ms] (pass) tool.apply_patch freeform > moves file to a new directory [496.21ms] (pass) tool.apply_patch freeform > moves file overwriting existing destination [421.40ms] (pass) tool.apply_patch freeform > adds file overwriting existing file [436.97ms] (pass) tool.apply_patch freeform > rejects update when target file is missing [0.92ms] (pass) tool.apply_patch freeform > rejects delete when file is missing [0.51ms] (pass) tool.apply_patch freeform > rejects delete when target is a directory [2.18ms] (pass) tool.apply_patch freeform > rejects invalid hunk header [0.45ms] (pass) tool.apply_patch freeform > rejects update with missing context [1.44ms] (pass) tool.apply_patch freeform > verification failure leaves no side effects [0.90ms] (pass) tool.apply_patch freeform > supports end of file anchor [428.96ms] (pass) tool.apply_patch freeform > rejects missing second chunk context [6.04ms] (pass) tool.apply_patch freeform > disambiguates change context with @@ header [403.92ms] (pass) tool.apply_patch freeform > EOF anchor matches from end of file first [393.38ms] (pass) tool.apply_patch freeform > parses heredoc-wrapped patch [457.73ms] (pass) tool.apply_patch freeform > parses heredoc-wrapped patch without cat [529.10ms] (pass) tool.apply_patch freeform > matches with trailing whitespace differences [428.32ms] (pass) tool.apply_patch freeform > matches with leading whitespace differences [413.48ms] (pass) tool.apply_patch freeform > matches with Unicode punctuation differences [409.89ms] test/tool/bash.test.ts: (pass) tool.bash > basic [51.08ms] (pass) tool.bash permissions > asks for bash permission with correct pattern [821.96ms] (pass) tool.bash permissions > asks for bash permission with multiple commands [1982.84ms] (pass) tool.bash permissions > asks for external_directory permission when cd to parent [426.66ms] (pass) tool.bash permissions > asks for external_directory permission when workdir is outside project [407.97ms] (pass) tool.bash permissions > asks for external_directory permission when file arg is outside project [436.25ms] (pass) tool.bash permissions > does not ask for external_directory permission when rm inside project [405.05ms] (pass) tool.bash permissions > includes always patterns for auto-approval [428.64ms] (pass) tool.bash permissions > does not ask for bash permission when command is cd only [450.16ms] (pass) tool.bash permissions > matches redirects in permission pattern [446.90ms] (pass) tool.bash permissions > always pattern has space before wildcard to not include different commands [433.26ms] (pass) tool.bash truncation > truncates output exceeding line limit [4.61ms] (pass) tool.bash truncation > truncates output exceeding byte limit [4.44ms] (pass) tool.bash truncation > does not truncate small output [2.31ms] (pass) tool.bash truncation > full output is saved to file when truncated [4.97ms] test/tool/external-directory.test.ts: (pass) tool.assertExternalDirectory > no-ops for empty target [0.63ms] (pass) tool.assertExternalDirectory > no-ops for paths inside Instance.directory [0.40ms] (pass) tool.assertExternalDirectory > asks with a single canonical glob [0.16ms] (pass) tool.assertExternalDirectory > uses target directory when kind=directory [0.12ms] (pass) tool.assertExternalDirectory > skips prompting when bypass=true [0.08ms] test/tool/grep.test.ts: (pass) tool.grep > basic search [23.16ms] (pass) tool.grep > no matches returns correct output [4.79ms] (pass) tool.grep > handles CRLF line endings in output [4.18ms] (pass) CRLF regex handling > regex correctly splits Unix line endings [0.05ms] (pass) CRLF regex handling > regex correctly splits Windows CRLF line endings [0.02ms] (pass) CRLF regex handling > regex handles mixed line endings [0.02ms] test/tool/question.test.ts: (pass) tool.question > should successfully execute with valid question parameters [1.01ms] (pass) tool.question > should now pass with a header longer than 12 but less than 30 chars [0.15ms] test/tool/read.test.ts: (pass) tool.read external_directory permission > allows reading absolute path inside project directory [432.84ms] (pass) tool.read external_directory permission > allows reading file in subdirectory inside project directory [458.56ms] (pass) tool.read external_directory permission > asks for external_directory permission when reading absolute path outside project [457.11ms] (pass) tool.read external_directory permission > asks for external_directory permission when reading relative path outside project [11.43ms] (pass) tool.read external_directory permission > does not ask for external_directory permission when reading inside project [671.37ms] (pass) tool.read env file permissions > agent=build > .env asks=%s [454.31ms] (pass) tool.read env file permissions > agent=build > .env.local asks=%s [393.40ms] (pass) tool.read env file permissions > agent=build > .env.production asks=%s [405.29ms] (pass) tool.read env file permissions > agent=build > .env.development.local asks=%s [457.28ms] (pass) tool.read env file permissions > agent=build > .env.example asks=%s [398.38ms] (pass) tool.read env file permissions > agent=build > .envrc asks=%s [491.48ms] (pass) tool.read env file permissions > agent=build > environment.ts asks=%s [405.58ms] (pass) tool.read env file permissions > agent=plan > .env asks=%s [441.27ms] (pass) tool.read env file permissions > agent=plan > .env.local asks=%s [399.92ms] (pass) tool.read env file permissions > agent=plan > .env.production asks=%s [443.84ms] (pass) tool.read env file permissions > agent=plan > .env.development.local asks=%s [409.60ms] (pass) tool.read env file permissions > agent=plan > .env.example asks=%s [423.89ms] (pass) tool.read env file permissions > agent=plan > .envrc asks=%s [405.64ms] (pass) tool.read env file permissions > agent=plan > environment.ts asks=%s [436.30ms] (pass) tool.read truncation > truncates large file by bytes and sets truncated metadata [400.91ms] (pass) tool.read truncation > truncates by line count when limit is specified [426.31ms] (pass) tool.read truncation > does not truncate small file [402.66ms] (pass) tool.read truncation > respects offset parameter [431.85ms] (pass) tool.read truncation > truncates long lines [420.68ms] (pass) tool.read truncation > image files set truncated to false [481.03ms] (pass) tool.read truncation > large image files are properly attached without error [469.56ms] (pass) tool.read truncation > .fbs files (FlatBuffers schema) are read as text, not images [458.36ms] (pass) tool.read loaded instructions > loads AGENTS.md from parent directory and includes in metadata [541.28ms] test/tool/registry.test.ts: (pass) tool.registry > loads tools from .opencode/tool (singular) [507.51ms] (pass) tool.registry > loads tools from .opencode/tools (plural) [474.06ms] test/tool/skill.test.ts: (pass) tool.skill > description lists skill location URL [454.80ms] (pass) tool.skill > execute returns skill content block with files [415.50ms] test/tool/truncation.test.ts: (pass) Truncate > output > truncates large json file by bytes [3.10ms] (pass) Truncate > output > returns content unchanged when under limits [0.06ms] (pass) Truncate > output > truncates by line count [0.17ms] (pass) Truncate > output > truncates by byte count [0.11ms] (pass) Truncate > output > truncates from head by default [0.11ms] (pass) Truncate > output > truncates from tail when direction is tail [0.11ms] (pass) Truncate > output > uses default MAX_LINES and MAX_BYTES [0.02ms] (pass) Truncate > output > large single-line file truncates with byte message [2.73ms] (pass) Truncate > output > writes full output to file when truncated [0.25ms] (pass) Truncate > output > suggests Task tool when agent has task permission [0.25ms] (pass) Truncate > output > omits Task tool hint when agent lacks task permission [0.16ms] (pass) Truncate > output > does not write file when not truncated [0.06ms] (pass) Truncate > cleanup > deletes files older than 7 days and preserves recent files [0.59ms] test/util/filesystem.test.ts: (pass) util.filesystem > exists() is true for files and directories [0.42ms] (pass) util.filesystem > isDir() is true only for directories [0.31ms] test/util/format.test.ts: (pass) util.format > formatDuration > returns empty string for zero or negative values [0.06ms] (pass) util.format > formatDuration > formats seconds under a minute [0.02ms] (pass) util.format > formatDuration > formats minutes under an hour [0.03ms] (pass) util.format > formatDuration > formats hours under a day [0.02ms] (pass) util.format > formatDuration > formats days under a week [0.01ms] (pass) util.format > formatDuration > formats weeks [0.01ms] (pass) util.format > formatDuration > handles boundary values correctly [0.03ms] test/util/iife.test.ts: (pass) util.iife > should execute function immediately and return result [0.03ms] (pass) util.iife > should work with async functions [0.05ms] (pass) util.iife > should handle functions with no return value [0.02ms] test/util/lazy.test.ts: (pass) util.lazy > should call function only once [0.07ms] (pass) util.lazy > should preserve the same reference [0.03ms] (pass) util.lazy > should work with different return types [0.04ms] test/util/lock.test.ts: (pass) util.lock > writer exclusivity: blocks reads and other writes while held [0.39ms] test/util/timeout.test.ts: (pass) util.timeout > should resolve when promise completes before timeout [10.76ms] (pass) util.timeout > should reject when promise exceeds timeout [51.00ms] test/util/wildcard.test.ts: (pass) match handles glob tokens [0.07ms] (pass) match with trailing space+wildcard matches command with or without args [0.07ms] (pass) all picks the most specific pattern [0.29ms] (pass) allStructured matches command sequences [0.20ms] (pass) allStructured prioritizes flag-specific patterns [0.10ms] (pass) allStructured handles sed flags [0.08ms] test/cli/tui/transcript.test.ts: (pass) transcript > formatAssistantHeader > includes metadata when enabled [0.12ms] (pass) transcript > formatAssistantHeader > excludes metadata when disabled [0.01ms] (pass) transcript > formatAssistantHeader > handles missing completed time [0.02ms] (pass) transcript > formatAssistantHeader > titlecases agent name [0.02ms] (pass) transcript > formatPart > formats text part [0.06ms] (pass) transcript > formatPart > skips synthetic text parts [0.02ms] (pass) transcript > formatPart > formats reasoning when thinking enabled [0.02ms] (pass) transcript > formatPart > skips reasoning when thinking disabled [0.02ms] (pass) transcript > formatPart > formats tool part with details [0.07ms] (pass) transcript > formatPart > formats tool output containing triple backticks without breaking markdown [0.11ms] (pass) transcript > formatPart > formats tool part without details when disabled [0.06ms] (pass) transcript > formatPart > formats tool error [0.04ms] (pass) transcript > formatMessage > formats user message [0.06ms] (pass) transcript > formatMessage > formats assistant message with metadata [0.04ms] (pass) transcript > formatTranscript > formats complete transcript [23.49ms] (pass) transcript > formatTranscript > formats transcript without assistant metadata [0.33ms] test/provider/copilot/convert-to-copilot-messages.test.ts: (pass) system messages > should convert system message content to string [0.24ms] (pass) user messages > should convert messages with only a text part to a string content [0.03ms] (pass) user messages > should convert messages with image parts [0.11ms] (pass) user messages > should convert messages with image parts from Uint8Array [0.06ms] (pass) user messages > should handle URL-based images [0.03ms] (pass) user messages > should handle multiple text parts without flattening [0.02ms] (pass) assistant messages > should convert assistant text messages [0.02ms] (pass) assistant messages > should handle assistant message with null content when only tool calls [0.03ms] (pass) assistant messages > should concatenate multiple text parts [0.02ms] (pass) tool calls > should stringify arguments to tool calls [0.04ms] (pass) tool calls > should handle text output type in tool results [0.02ms] (pass) tool calls > should handle multiple tool results as separate messages [0.02ms] (pass) tool calls > should handle text plus multiple tool calls [0.04ms] (pass) reasoning (copilot-specific) > should omit reasoning_text without reasoning_opaque [0.02ms] (pass) reasoning (copilot-specific) > should include reasoning_opaque from providerOptions [0.04ms] (pass) reasoning (copilot-specific) > should include reasoning_opaque from text part providerOptions [0.02ms] (pass) reasoning (copilot-specific) > should handle reasoning-only assistant message [0.02ms] (pass) full conversation > should convert a multi-turn conversation with reasoning [0.03ms] test/provider/copilot/copilot-chat-model.test.ts: (pass) doStream > should stream text deltas [2.79ms] (pass) doStream > should stream reasoning with tool calls and capture reasoning_opaque [1.59ms] (pass) doStream > should handle reasoning_opaque that comes at end with text in between [0.97ms] (pass) doStream > should handle reasoning_opaque and content in the same chunk [0.91ms] (pass) doStream > should handle reasoning_opaque and content followed by tool calls [1.04ms] (pass) doStream > should emit reasoning-end before tool-input-start when reasoning goes directly to tool calls [0.97ms] (pass) doStream > should attach reasoning_opaque to tool calls without reasoning_text [0.78ms] (pass) doStream > should include response metadata from first chunk [0.68ms] (pass) doStream > should emit stream-start with warnings [0.71ms] (pass) doStream > should include raw chunks when requested [0.71ms] (pass) request body > should send tools in OpenAI format [0.58ms] 1 tests skipped: (skip) unicode filenames modification and restore 1 tests failed: (fail) Bedrock: model without prefix in US region should get us. prefix added [5002.71ms] ^ this test timed out after 5000ms. 877 pass 1 skip 1 fail 1879 expect() calls Ran 879 tests across 62 files. [204.22s] ==> ERROR: A failure occurred in check(). Aborting... ==> ERROR: Build failed, check /home/alhp/workspace/chroot/build_e9355a5d-8e4d-4932-a5d4-4b529bf43913/build