==> Synchronizing chroot copy [/home/alhp/workspace/chroot/root] -> [build_c8e41c4b-fb20-46bd-92c4-6682253ed5e5]...done ==> Making package: opencode 1.1.53-1.1 (Sun Feb 8 11:28:21 2026) ==> Retrieving sources... -> Cloning opencode git repo... Cloning into bare repository '/home/alhp/workspace/build/x86-64-v2/opencode-1.1.53-1/opencode'... ==> Validating source files with b2sums... opencode ... Passed ==> Making package: opencode 1.1.53-1.1 (Sun Feb 8 10:30: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 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.3-1 0.28 MiB extra/bun 1.3.8-2 60.05 MiB extra/git 2.53.0-1 29.72 MiB Total Installed Size: 90.27 MiB :: Proceed with installation? [Y/n] 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 [356] $ 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) 3668 packages installed [72.03s] ==> Starting build()... opencode script { "channel": "latest", "version": "1.1.53", "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) 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 [146.36s] bun add v1.3.8-canary.1 (b64edcb4) Saved lockfile $ husky installed @parcel/watcher@2.5.1 [77.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.13ms] (pass) BunProc registry configuration > should use Bun's default registry resolution [0.10ms] (pass) BunProc registry configuration > should have correct command structure without registry [0.20ms] test/keybind.test.ts: (pass) Keybind.toString > should convert simple key to string [0.04ms] (pass) Keybind.toString > should convert ctrl modifier to string [0.01ms] (pass) Keybind.toString > should convert leader key to string [0.01ms] (pass) Keybind.toString > should convert multiple modifiers to string (pass) Keybind.toString > should convert all modifiers to string (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 (pass) Keybind.toString > should handle only modifiers (pass) Keybind.toString > should handle only leader with no other parts (pass) Keybind.toString > should convert super modifier to string (pass) Keybind.toString > should convert super+shift modifier to string (pass) Keybind.toString > should handle super with ctrl modifier [0.01ms] (pass) Keybind.toString > should handle super with all modifiers (pass) Keybind.toString > should handle undefined super field (omitted) (pass) Keybind.match > should match identical keybinds [0.09ms] (pass) Keybind.match > should not match different key names [0.02ms] (pass) Keybind.match > should not match different modifiers [0.01ms] (pass) Keybind.match > should match leader keybinds [0.02ms] (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.01ms] (pass) Keybind.match > should match simple key without modifiers [0.01ms] (pass) Keybind.match > should match super modifier keybinds [0.02ms] (pass) Keybind.match > should not match super vs non-super [0.01ms] (pass) Keybind.match > should match undefined super with false super [0.03ms] (pass) Keybind.match > should match super+shift combination [0.03ms] (pass) Keybind.match > should not match when only super differs [0.01ms] (pass) Keybind.parse > should parse simple key [0.07ms] (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.02ms] (pass) Keybind.parse > should parse ctrl+j combination (pass) Keybind.parse > should handle 'none' value (pass) Keybind.parse > should handle special keys [0.01ms] (pass) Keybind.parse > should handle function keys [0.01ms] (pass) Keybind.parse > should handle complex multi-modifier combination [0.01ms] (pass) Keybind.parse > should be case insensitive [0.01ms] (pass) Keybind.parse > should parse super modifier [0.02ms] (pass) Keybind.parse > should parse super with shift modifier [0.03ms] (pass) Keybind.parse > should parse multiple keybinds with super [0.02ms] test/permission-task.test.ts: (pass) PermissionNext.evaluate for permission.task > returns ask when no match (default) [0.25ms] (pass) PermissionNext.evaluate for permission.task > returns deny for explicit deny [0.13ms] (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.02ms] (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.04ms] (pass) PermissionNext.evaluate for permission.task > matches wildcard patterns with ask [0.05ms] (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.07ms] (pass) PermissionNext.disabled for task tool > task tool is disabled when global deny pattern exists (even with specific allows) [0.09ms] (pass) PermissionNext.disabled for task tool > task tool is disabled when global deny pattern exists (even with ask overrides) [0.02ms] (pass) PermissionNext.disabled for task tool > task tool is disabled when global deny pattern exists [0.02ms] (pass) PermissionNext.disabled for task tool > task tool is NOT disabled when only specific patterns are denied (no wildcard) [0.01ms] (pass) PermissionNext.disabled for task tool > task tool is enabled when no task rules exist (default ask) [0.01ms] (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 [20.90ms] (pass) permission.task with real config files > loads task permissions with wildcard patterns from config [8.73ms] (pass) permission.task with real config files > evaluate respects task permission from config [8.35ms] (pass) permission.task with real config files > mixed permission config with task and other tools [8.99ms] (pass) permission.task with real config files > task tool disabled when global deny comes last in config [8.01ms] (pass) permission.task with real config files > task tool NOT disabled when specific allow comes last in config [7.92ms] test/scheduler.test.ts: (pass) Scheduler.register > defaults to instance scope per directory [15.45ms] (pass) Scheduler.register > global scope runs once across instances [15.49ms] test/acp/agent-interface.test.ts: (pass) acp.agent interface compliance > Agent implements all SDK-checked methods [0.05ms] test/acp/event-subscription.test.ts: (pass) acp.agent event subscription > routes message.part.updated by the event sessionID (no cross-session pollution) [16.77ms] (pass) acp.agent event subscription > keeps concurrent sessions isolated when message.part.updated events are interleaved [23.94ms] (pass) acp.agent event subscription > does not create additional event subscriptions on repeated loadSession() [2.84ms] (pass) acp.agent event subscription > permission.asked events are handled and replied [22.37ms] (pass) acp.agent event subscription > permission prompt on session A does not block message updates for session B [54.50ms] test/agent/agent.test.ts: (pass) returns default native agents when no config [1.94ms] (pass) build agent has correct default properties [1.32ms] (pass) plan agent denies edits except .opencode/plans/* [0.87ms] (pass) explore agent denies edit and write [1.70ms] (pass) general agent denies todo tools [1.65ms] (pass) compaction agent denies all permissions [1.60ms] (pass) custom agent from config creates new agent [2.49ms] (pass) custom agent config overrides native agent properties [1.45ms] (pass) agent disable removes agent from list [2.02ms] (pass) agent permission config merges with defaults [1.73ms] (pass) global permission config applies to all agents [1.66ms] (pass) agent steps/maxSteps config sets steps property [1.84ms] (pass) agent mode can be overridden [2.81ms] (pass) agent name can be overridden [1.77ms] (pass) agent prompt can be set from config [1.61ms] (pass) unknown agent properties are placed into options [1.23ms] (pass) agent options merge correctly [1.42ms] (pass) multiple custom agents can be defined [2.53ms] (pass) Agent.get returns undefined for non-existent agent [1.77ms] (pass) default permission includes doom_loop and external_directory as ask [1.55ms] (pass) webfetch is allowed by default [1.02ms] (pass) legacy tools config converts to permissions [2.05ms] (pass) legacy tools config maps write/edit/patch/multiedit to edit permission [1.45ms] (pass) Truncate.GLOB is allowed even when user denies external_directory globally [1.30ms] (pass) Truncate.GLOB is allowed even when user denies external_directory per-agent [1.54ms] (pass) explicit Truncate.GLOB deny is respected [2.20ms] (pass) skill directories are allowed for external_directory [13.93ms] (pass) defaultAgent returns build when no default_agent config [1.32ms] (pass) defaultAgent respects default_agent config set to plan [0.95ms] (pass) defaultAgent respects default_agent config set to custom agent with mode all [0.98ms] (pass) defaultAgent throws when default_agent points to subagent [1.11ms] (pass) defaultAgent throws when default_agent points to hidden agent [2.29ms] (pass) defaultAgent throws when default_agent points to non-existent agent [1.41ms] (pass) defaultAgent returns plan when build is disabled and default_agent not set [1.52ms] (pass) defaultAgent throws when all primary agents are disabled [1.00ms] test/cli/github-remote.test.ts: (pass) parses https URL with .git suffix [1.26ms] (pass) parses https URL without .git suffix [0.05ms] (pass) parses git@ URL with .git suffix [0.01ms] (pass) parses git@ URL without .git suffix [0.01ms] (pass) parses ssh:// URL with .git suffix (pass) parses ssh:// URL without .git suffix (pass) parses http URL (pass) parses URL with hyphenated owner and repo names (pass) parses URL with underscores in names (pass) parses URL with numbers in names (pass) parses repos with dots in the name [0.02ms] (pass) returns null for non-github URLs [0.01ms] (pass) returns null for invalid URLs [0.02ms] (pass) returns null for URLs with extra path segments test/cli/github-action.test.ts: (pass) extractResponseText > returns text from text part [0.06ms] (pass) extractResponseText > returns last text part when multiple exist [0.01ms] (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.02ms] (pass) extractResponseText > returns null for multiple completed tools [0.01ms] (pass) extractResponseText > ignores running tool parts (throws since no completed tools) [0.07ms] (pass) extractResponseText > throws with part types on empty array [0.02ms] (pass) extractResponseText > throws with part types on unhandled parts [0.03ms] (pass) extractResponseText > prefers text over reasoning when both present [0.02ms] (pass) extractResponseText > prefers text over tools when both present [0.02ms] test/config/agent-color.test.ts: (pass) agent color parsed from project config [2.43ms] (pass) Agent.get includes color from config [1.78ms] (pass) Color.hexToAnsiBold converts valid hex to ANSI [0.06ms] (pass) Color.hexToAnsiBold returns undefined for invalid hex [0.02ms] test/config/markdown.test.ts: (pass) ConfigMarkdown: normal template > should extract exactly 12 file references [0.01ms] (pass) ConfigMarkdown: normal template > should extract valid/path/to/a/file [0.01ms] (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 (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 (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/config/config.test.ts: (pass) loads config with defaults when no files exist [0.87ms] (pass) loads JSON config file [1.19ms] (pass) loads JSONC config file [1.47ms] (pass) merges multiple config files with correct precedence [1.12ms] (pass) handles environment variable substitution [1.89ms] (pass) preserves env variables when adding $schema to config [1.73ms] (pass) handles file inclusion substitution [0.82ms] (pass) validates config schema and throws on invalid fields [1.21ms] (pass) throws error for invalid JSON [0.60ms] (pass) handles agent configuration [2.05ms] (pass) treats agent variant as model-scoped setting (not provider option) [1.21ms] (pass) handles command configuration [1.06ms] (pass) migrates autoshare to share field [1.96ms] (pass) migrates mode field to agent field [1.29ms] (pass) loads config from .opencode directory [1.57ms] (pass) loads agents from .opencode/agents (plural) [4.19ms] (pass) loads commands from .opencode/command (singular) [3.94ms] (pass) loads commands from .opencode/commands (plural) [1.12ms] (pass) updates config and writes to file [0.46ms] (pass) gets config directories [0.62ms] (pass) does not try to install dependencies in read-only OPENCODE_CONFIG_DIR [1.49ms] killed 72 dangling processes (fail) installs dependencies in writable OPENCODE_CONFIG_DIR [5013.80ms] ^ this test timed out after 5000ms. (pass) resolves scoped npm plugins in config [7.04ms] (pass) merges plugin arrays from global and local configs [2.63ms] (pass) does not error when only custom agent is a subagent [2.15ms] (pass) merges instructions arrays from global and local configs [2.09ms] (pass) deduplicates duplicate instructions from global and local configs [1.83ms] (pass) deduplicates duplicate plugins from global and local configs [5.21ms] (pass) migrates legacy tools config to permissions - allow [2.08ms] (pass) migrates legacy tools config to permissions - deny [2.24ms] (pass) migrates legacy write tool to edit permission [2.07ms] (pass) managed settings override user settings [3.37ms] (pass) managed settings override project settings [2.98ms] (pass) missing managed settings file is not an error [3.97ms] (pass) migrates legacy edit tool to edit permission [1.92ms] (pass) migrates legacy patch tool to edit permission [1.29ms] (pass) migrates legacy multiedit tool to edit permission [3.05ms] (pass) migrates mixed legacy tools config [1.03ms] (pass) merges legacy tools with existing permission config [1.14ms] (pass) permission config preserves key order [1.20ms] (pass) project config can override MCP server enabled status [1.81ms] (pass) MCP config deep merges preserving base config properties [3.15ms] (pass) local .opencode config can override MCP from project config [1.73ms] (pass) project config overrides remote well-known config [11.15ms] (pass) getPluginName > extracts name from file:// URL [0.09ms] (pass) getPluginName > extracts name from npm package with version [0.07ms] (pass) getPluginName > extracts name from scoped npm package [0.04ms] (pass) getPluginName > returns full string for package without version [0.05ms] (pass) deduplicatePlugins > removes duplicates keeping higher priority (later entries) [0.09ms] (pass) deduplicatePlugins > prefers local file over npm package with same name [0.08ms] (pass) deduplicatePlugins > preserves order of remaining plugins [0.07ms] (pass) deduplicatePlugins > local plugin directory overrides global opencode.json plugin [3.72ms] (pass) OPENCODE_DISABLE_PROJECT_CONFIG > skips project config files when flag is set [0.89ms] (pass) OPENCODE_DISABLE_PROJECT_CONFIG > skips project .opencode/ directories when flag is set [1.46ms] (pass) OPENCODE_DISABLE_PROJECT_CONFIG > still loads global config when flag is set [3.10ms] (pass) OPENCODE_DISABLE_PROJECT_CONFIG > skips relative instructions with warning when flag is set but no config dir [1.39ms] (pass) OPENCODE_DISABLE_PROJECT_CONFIG > OPENCODE_CONFIG_DIR still works when flag is set [2.83ms] test/file/ignore.test.ts: (pass) match nested and non-nested [0.12ms] test/file/path-traversal.test.ts: (pass) Filesystem.contains > allows paths within project [0.07ms] (pass) Filesystem.contains > blocks ../ traversal [0.02ms] (pass) Filesystem.contains > blocks absolute paths outside project [0.02ms] (pass) Filesystem.contains > handles prefix collision edge cases [0.02ms] (pass) File.read path traversal protection > rejects ../ traversal attempting to read /etc/passwd [1.15ms] (pass) File.read path traversal protection > rejects deeply nested traversal [0.40ms] (pass) File.read path traversal protection > allows valid paths within project [0.84ms] (pass) File.list path traversal protection > rejects ../ traversal attempting to list /etc [1.05ms] (pass) File.list path traversal protection > allows valid subdirectory listing [1.24ms] (pass) Instance.containsPath > returns true for path inside directory [10.34ms] (pass) Instance.containsPath > returns true for path inside worktree but outside directory (monorepo subdirectory scenario) [10.57ms] (pass) Instance.containsPath > returns false for path outside both directory and worktree [8.73ms] (pass) Instance.containsPath > returns false for path with .. escaping worktree [9.08ms] (pass) Instance.containsPath > handles directory === worktree (running from repo root) [9.85ms] (pass) Instance.containsPath > non-git project does not allow arbitrary paths via worktree='/' [0.49ms] test/file/ripgrep.test.ts: (pass) file.ripgrep > defaults to include hidden [4.63ms] (pass) file.ripgrep > hidden false excludes hidden [3.35ms] test/ide/ide.test.ts: (pass) ide > should detect Visual Studio Code [0.17ms] (pass) ide > should detect Visual Studio Code Insiders [0.04ms] (pass) ide > should detect Cursor [0.03ms] (pass) ide > should detect VSCodium [0.03ms] (pass) ide > should detect Windsurf [0.03ms] (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.03ms] (pass) ide > should recognize vscode OPENCODE_CALLER [0.01ms] (pass) ide > should return false for unknown OPENCODE_CALLER [0.01ms] test/lsp/client.test.ts: (pass) LSPClient interop > handles workspace/workspaceFolders request [264.44ms] (pass) LSPClient interop > handles client/registerCapability request [234.69ms] (pass) LSPClient interop > handles client/unregisterCapability request [234.83ms] test/mcp/headers.test.ts: (pass) headers are passed to transports when oauth is enabled (default) [6.40ms] (pass) headers are passed to transports when oauth is explicitly disabled [2.04ms] (pass) no requestInit when headers are not provided [2.09ms] test/mcp/oauth-browser.test.ts: (pass) BrowserOpenFailed event is published when open() throws [2002.81ms] (pass) BrowserOpenFailed event is NOT published when open() succeeds [2002.45ms] (pass) open() is called with the authorization URL [2006.68ms] test/memory/abort-leak.test.ts: Baseline: 60.71 MB After 50 fetches: 48.33 MB Growth: -12.38 MB (pass) memory: abort controller leak > webfetch does not leak memory over many invocations [1808.34ms] 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 [523.41ms] test/patch/patch.test.ts: (pass) Patch namespace > parsePatch > should parse simple add file patch [0.53ms] (pass) Patch namespace > parsePatch > should parse delete file patch [0.12ms] (pass) Patch namespace > parsePatch > should parse patch with multiple hunks [0.46ms] (pass) Patch namespace > parsePatch > should parse file move operation [0.12ms] (pass) Patch namespace > parsePatch > should throw error for invalid patch format [0.12ms] (pass) Patch namespace > maybeParseApplyPatch > should parse direct apply_patch command [0.16ms] (pass) Patch namespace > maybeParseApplyPatch > should parse applypatch command [0.10ms] (pass) Patch namespace > maybeParseApplyPatch > should handle bash heredoc format [0.13ms] (pass) Patch namespace > maybeParseApplyPatch > should return NotApplyPatch for non-patch commands [0.09ms] (pass) Patch namespace > applyPatch > should add a new file [0.84ms] (pass) Patch namespace > applyPatch > should delete an existing file [0.29ms] (pass) Patch namespace > applyPatch > should update an existing file [0.51ms] (pass) Patch namespace > applyPatch > should move and update a file [0.36ms] (pass) Patch namespace > applyPatch > should handle multiple operations in one patch [0.61ms] (pass) Patch namespace > applyPatch > should create parent directories when adding files [0.38ms] (pass) Patch namespace > error handling > should throw error when updating non-existent file [0.26ms] (pass) Patch namespace > error handling > should throw error when deleting non-existent file [0.18ms] (pass) Patch namespace > edge cases > should handle empty files [0.25ms] (pass) Patch namespace > edge cases > should handle files with no trailing newline [0.27ms] (pass) Patch namespace > edge cases > should handle multiple update chunks in single file [0.27ms] test/permission/arity.test.ts: (pass) arity 1 - unknown commands default to first token [0.10ms] (pass) arity 2 - two token commands [0.02ms] (pass) arity 3 - three token commands [0.02ms] (pass) longest match wins - nested prefixes [0.02ms] (pass) exact length matches [0.02ms] (pass) edge cases [0.02ms] test/permission/next.test.ts: (pass) fromConfig - string value becomes wildcard rule [0.03ms] (pass) fromConfig - object value converts to rules array [0.05ms] (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.09ms] (pass) evaluate - matches expanded $HOME pattern [0.03ms] (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.01ms] (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 [0.02ms] (pass) evaluate - no matching pattern returns ask [0.02ms] (pass) evaluate - empty rules array returns ask [0.01ms] (pass) evaluate - multiple matching patterns, last wins [0.02ms] (pass) evaluate - non-matching patterns are skipped [0.02ms] (pass) evaluate - exact match at end wins over earlier wildcard [0.02ms] (pass) evaluate - wildcard at end overrides earlier exact match [0.02ms] (pass) evaluate - wildcard permission matches any permission [0.01ms] (pass) evaluate - wildcard permission with specific pattern [0.02ms] (pass) evaluate - glob permission pattern [0.02ms] (pass) evaluate - specific permission and wildcard permission combined [0.02ms] (pass) evaluate - wildcard permission does not match when specific exists [0.02ms] (pass) evaluate - multiple matching permission patterns combine rules [0.02ms] (pass) evaluate - wildcard permission fallback for unknown tool [0.02ms] (pass) evaluate - permission patterns sorted by length regardless of object order [0.01ms] (pass) evaluate - merges multiple rulesets [0.02ms] (pass) disabled - returns empty set when all tools allowed [0.06ms] (pass) disabled - disables tool when denied [0.03ms] (pass) disabled - disables edit/write/patch/multiedit when edit denied [0.02ms] (pass) disabled - does not disable when partially denied [0.01ms] (pass) disabled - does not disable when action is ask [0.02ms] (pass) disabled - does not disable when specific allow after wildcard deny [0.01ms] (pass) disabled - does not disable when wildcard allow after deny (pass) disabled - disables multiple tools [0.02ms] (pass) disabled - wildcard permission denies all tools [0.02ms] (pass) disabled - specific allow overrides wildcard deny [0.02ms] (pass) ask - resolves immediately when action is allow [13.89ms] (pass) ask - throws RejectedError when action is deny [9.43ms] (pass) ask - returns pending promise when action is ask [8.68ms] (pass) reply - once resolves the pending ask [9.94ms] (pass) reply - reject throws RejectedError [9.22ms] (pass) reply - always persists approval and resolves [9.63ms] (pass) reply - reject cancels all pending for same session [10.47ms] (pass) ask - checks all patterns and stops on first deny [9.52ms] (pass) ask - allows all patterns when all match allow rules [10.87ms] test/plugin/auth-override.test.ts: (pass) plugin.auth-override > user plugin overrides built-in github-copilot auth [4300.03ms] test/plugin/codex.test.ts: (pass) plugin.codex > parseJwtClaims > parses valid JWT with claims [0.15ms] (pass) plugin.codex > parseJwtClaims > returns undefined for JWT with less than 3 parts [0.02ms] (pass) plugin.codex > parseJwtClaims > returns undefined for invalid base64 [0.03ms] (pass) plugin.codex > parseJwtClaims > returns undefined for invalid JSON payload [0.02ms] (pass) plugin.codex > extractAccountIdFromClaims > extracts chatgpt_account_id from root [0.02ms] (pass) plugin.codex > extractAccountIdFromClaims > extracts chatgpt_account_id from nested https://api.openai.com/auth [0.01ms] (pass) plugin.codex > extractAccountIdFromClaims > prefers root over nested (pass) plugin.codex > extractAccountIdFromClaims > extracts from organizations array as fallback [0.01ms] (pass) plugin.codex > extractAccountIdFromClaims > returns undefined when no accountId found (pass) plugin.codex > extractAccountId > extracts from id_token first [0.04ms] (pass) plugin.codex > extractAccountId > falls back to access_token when id_token has no accountId [0.02ms] (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 [4.96ms] (pass) Project.fromDirectory > should handle git repository with commits [9.24ms] (pass) Project.fromDirectory with worktrees > should set worktree to root when called from root [8.58ms] (pass) Project.fromDirectory with worktrees > should set worktree to root when called from a worktree [16.94ms] (pass) Project.fromDirectory with worktrees > should accumulate multiple worktrees in sandboxes [26.96ms] (pass) Project.discover > should discover favicon.png in root [10.14ms] (pass) Project.discover > should not discover non-image files [9.78ms] test/provider/amazon-bedrock.test.ts: (pass) Bedrock: config region takes precedence over AWS_REGION env var [1850.64ms] (pass) Bedrock: falls back to AWS_REGION env var when no config region [445.15ms] (pass) Bedrock: loads when bearer token from auth.json is present [7.98ms] (pass) Bedrock: config profile takes precedence over AWS_PROFILE env var [6.73ms] (pass) Bedrock: includes custom endpoint in options when specified [8.42ms] (pass) Bedrock: autoloads when AWS_WEB_IDENTITY_TOKEN_FILE is present [4.21ms] (pass) Bedrock: model with us. prefix should not be double-prefixed [9.49ms] (pass) Bedrock: model with global. prefix should not be prefixed [5.64ms] (pass) Bedrock: model with eu. prefix should not be double-prefixed [5.10ms] (pass) Bedrock: model without prefix in US region should get us. prefix added [7.03ms] (pass) Bedrock cross-region prefix detection > should detect global. prefix [0.05ms] (pass) Bedrock cross-region prefix detection > should detect us. prefix [0.02ms] (pass) Bedrock cross-region prefix detection > should detect eu. prefix [0.01ms] (pass) Bedrock cross-region prefix detection > should detect jp. prefix [0.01ms] (pass) Bedrock cross-region prefix detection > should detect apac. prefix [0.01ms] (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.01ms] test/provider/gitlab-duo.test.ts: (pass) GitLab Duo: loads provider with API key from environment [5.30ms] (pass) GitLab Duo: config instanceUrl option sets baseURL [4.49ms] (pass) GitLab Duo: loads with OAuth token from auth.json [9.21ms] (pass) GitLab Duo: loads with Personal Access Token from auth.json [4.89ms] (pass) GitLab Duo: supports self-hosted instance configuration [9.38ms] (pass) GitLab Duo: config apiKey takes precedence over environment variable [5.66ms] (pass) GitLab Duo: supports feature flags configuration [6.03ms] (pass) GitLab Duo: has multiple agentic chat models available [7.67ms] test/provider/provider.test.ts: (pass) provider loaded from env variable [7.41ms] (pass) provider loaded from config with apiKey option [6.76ms] (pass) disabled_providers excludes provider [5.77ms] (pass) enabled_providers restricts to only listed providers [7.78ms] (pass) model whitelist filters models for provider [4.99ms] (pass) model blacklist excludes specific models [7.79ms] (pass) custom model alias via config [5.33ms] (pass) custom provider with npm package [6.21ms] (pass) env variable takes precedence, config merges options [7.18ms] (pass) getModel returns model for valid provider/model [5.00ms] (pass) getModel throws ModelNotFoundError for invalid model [5.49ms] (pass) getModel throws ModelNotFoundError for invalid provider [9.90ms] (pass) parseModel correctly parses provider/model string [0.08ms] (pass) parseModel handles model IDs with slashes [0.04ms] (pass) defaultModel returns first available model when no config set [4.43ms] (pass) defaultModel respects config model setting [1.53ms] (pass) provider with baseURL from config [7.46ms] (pass) model cost defaults to zero when not specified [6.42ms] (pass) model options are merged from existing model [8.44ms] (pass) provider removed when all models filtered out [7.67ms] (pass) closest finds model by partial match [4.91ms] (pass) closest returns undefined for nonexistent provider [7.05ms] (pass) getModel uses realIdByKey for aliased models [4.92ms] (pass) provider api field sets model api.url [8.07ms] (pass) explicit baseURL overrides api field [6.85ms] (pass) model inherits properties from existing database model [4.56ms] (pass) disabled_providers prevents loading even with env var [6.80ms] (pass) enabled_providers with empty array allows no providers [5.28ms] (pass) whitelist and blacklist can be combined [4.87ms] (pass) model modalities default correctly [8.25ms] (pass) model with custom cost values [7.15ms] (pass) getSmallModel returns appropriate small model [8.60ms] (pass) getSmallModel respects config small_model override [5.87ms] (pass) provider.sort prioritizes preferred models [0.10ms] (pass) multiple providers can be configured simultaneously [8.26ms] (pass) provider with custom npm package [8.91ms] (pass) model alias name defaults to alias key when id differs [7.24ms] (pass) provider with multiple env var options only includes apiKey when single env [6.15ms] (pass) provider with single env var includes apiKey automatically [5.09ms] (pass) model cost overrides existing cost values [8.94ms] (pass) completely new provider not in database can be configured [4.74ms] (pass) disabled_providers and enabled_providers interaction [8.09ms] (pass) model with tool_call false [5.75ms] (pass) model defaults tool_call to true when not specified [5.49ms] (pass) model headers are preserved [6.46ms] (pass) provider env fallback - second env var used if first missing [6.20ms] (pass) getModel returns consistent results [9.86ms] (pass) provider name defaults to id when not in database [7.54ms] (pass) ModelNotFoundError includes suggestions for typos [9.31ms] (pass) ModelNotFoundError for provider includes suggestions [6.72ms] (pass) getProvider returns undefined for nonexistent provider [4.93ms] (pass) getProvider returns provider info [9.03ms] (pass) closest returns undefined when no partial match found [4.51ms] (pass) closest checks multiple query terms in order [6.92ms] (pass) model limit defaults to zero when not specified [7.57ms] (pass) provider options are deeply merged [8.04ms] (pass) custom model inherits npm package from models.dev provider config [6.49ms] (pass) custom model inherits api.url from models.dev provider [11.33ms] (pass) model variants are generated for reasoning models [6.89ms] (pass) model variants can be disabled via config [7.81ms] (pass) model variants can be customized via config [6.26ms] (pass) disabled key is stripped from variant config [5.70ms] (pass) all variants can be disabled via config [9.30ms] (pass) variant config merges with generated variants [7.49ms] (pass) variants filtered in second pass for database models [8.38ms] (pass) custom model with variants enabled and disabled [8.65ms] test/provider/transform.test.ts: (pass) ProviderTransform.options - setCacheKey > should set promptCacheKey when providerOptions.setCacheKey is true [0.14ms] (pass) ProviderTransform.options - setCacheKey > should not set promptCacheKey when providerOptions.setCacheKey is false [0.02ms] (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.02ms] (pass) ProviderTransform.options - setCacheKey > should set promptCacheKey for openai provider regardless of setCacheKey [0.03ms] (pass) ProviderTransform.options - setCacheKey > should set store=false for openai provider [0.09ms] (pass) ProviderTransform.options - gpt-5 textVerbosity > gpt-5.2 should have textVerbosity set to low [0.05ms] (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.02ms] (pass) ProviderTransform.options - gpt-5 textVerbosity > gpt-5.1-chat-latest should NOT have textVerbosity set (only supports medium) [0.01ms] (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.06ms] (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 (pass) ProviderTransform.maxOutputTokens > anthropic without thinking options > returns 32k when modelLimit > 32k (pass) ProviderTransform.maxOutputTokens > anthropic without thinking options > returns modelLimit when modelLimit < 32k [0.01ms] (pass) ProviderTransform.maxOutputTokens > anthropic with thinking options > returns 32k when budgetTokens + 32k <= modelLimit [0.02ms] (pass) ProviderTransform.maxOutputTokens > anthropic with thinking options > returns modelLimit - budgetTokens when budgetTokens + 32k > modelLimit [0.01ms] (pass) ProviderTransform.maxOutputTokens > anthropic with thinking options > returns 32k when thinking type is not enabled [0.01ms] (pass) ProviderTransform.schema - gemini array items > adds missing items for array properties [0.15ms] (pass) ProviderTransform.schema - gemini nested array items > adds type to 2D array with empty inner items [0.09ms] (pass) ProviderTransform.schema - gemini nested array items > adds items and type to 2D array with missing inner items [0.03ms] (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.04ms] (pass) ProviderTransform.schema - gemini non-object properties removal > removes properties from non-object types [0.03ms] (pass) ProviderTransform.schema - gemini non-object properties removal > removes required from non-object types [0.03ms] (pass) ProviderTransform.schema - gemini non-object properties removal > removes properties and required from nested non-object types [0.06ms] (pass) ProviderTransform.schema - gemini non-object properties removal > keeps properties and required on object types [0.07ms] (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 [0.28ms] (pass) ProviderTransform.message - DeepSeek reasoning content > Non-DeepSeek providers leave reasoning content unchanged [0.05ms] (pass) ProviderTransform.message - empty image handling > should replace empty base64 image with error text [0.45ms] (pass) ProviderTransform.message - empty image handling > should keep valid base64 images unchanged [0.07ms] (pass) ProviderTransform.message - empty image handling > should handle mixed valid and empty images [0.04ms] (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.04ms] (pass) ProviderTransform.message - anthropic empty content filtering > filters out empty reasoning parts from array content [0.03ms] (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.04ms] (pass) ProviderTransform.message - anthropic empty content filtering > keeps messages with valid text alongside empty parts [0.03ms] (pass) ProviderTransform.message - anthropic empty content filtering > does not filter for non-anthropic providers [0.04ms] (pass) ProviderTransform.message - strip openai metadata when store=false > preserves itemId and reasoningEncryptedContent when store=false [0.04ms] (pass) ProviderTransform.message - strip openai metadata when store=false > preserves itemId and reasoningEncryptedContent when store=false even when not openai [0.06ms] (pass) ProviderTransform.message - strip openai metadata when store=false > preserves other openai options including itemId [0.03ms] (pass) ProviderTransform.message - strip openai metadata when store=false > preserves metadata for openai package when store is true [0.02ms] (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.02ms] (pass) ProviderTransform.message - strip openai metadata when store=false > preserves itemId across all providerOptions keys [0.04ms] (pass) ProviderTransform.message - strip openai metadata when store=false > does not strip metadata for non-openai packages when store is not false [0.02ms] (pass) ProviderTransform.message - providerOptions key remapping > azure keeps 'azure' key and does not remap to 'openai' [0.04ms] (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.03ms] (pass) ProviderTransform.message - claude w/bedrock custom inference profile > adds cachePoint [0.04ms] (pass) ProviderTransform.variants > returns empty object when model has no reasoning capabilities [0.05ms] (pass) ProviderTransform.variants > deepseek returns empty object [0.02ms] (pass) ProviderTransform.variants > minimax returns empty object [0.01ms] (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.03ms] (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.02ms] (pass) ProviderTransform.variants > @ai-sdk/github-copilot > standard models return low, medium, high [0.04ms] (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.01ms] (pass) ProviderTransform.variants > @ai-sdk/cerebras > returns WIDELY_SUPPORTED_EFFORTS with reasoningEffort [0.02ms] (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.01ms] (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.02ms] (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.01ms] (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.02ms] (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.02ms] (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.02ms] (pass) ProviderTransform.variants > @ai-sdk/google > gemini-2.5 returns high and max with thinkingConfig and thinkingBudget [0.03ms] (pass) ProviderTransform.variants > @ai-sdk/google > other gemini models return low and high with thinkingLevel [0.03ms] (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 [10.29ms] (pass) ask - adds to pending list [9.45ms] (pass) reply - resolves the pending ask with answers [10.07ms] (pass) reply - removes from pending list [9.02ms] (pass) reply - does nothing for unknown requestID [9.77ms] (pass) reject - throws RejectedError [10.40ms] (pass) reject - removes from pending list [9.30ms] (pass) reject - does nothing for unknown requestID [11.39ms] (pass) ask - handles multiple questions [11.83ms] (pass) list - returns all pending requests [9.97ms] (pass) list - returns empty when no pending [10.20ms] test/server/session-list.test.ts: (pass) session.list > filters by directory [27.97ms] test/server/session-select.test.ts: (pass) tui.selectSession endpoint > should return 200 when called with valid session [1.93ms] (pass) tui.selectSession endpoint > should return 404 when session does not exist [0.37ms] (pass) tui.selectSession endpoint > should return 400 when session ID format is invalid [0.66ms] test/session/compaction.test.ts: (pass) session.compaction.isOverflow > returns true when token count exceeds usable context [2.60ms] (pass) session.compaction.isOverflow > returns false when token count within usable context [2.53ms] (pass) session.compaction.isOverflow > includes cache.read in token count [1.50ms] (pass) session.compaction.isOverflow > respects input limit for input caps [3.26ms] (pass) session.compaction.isOverflow > returns false when input/output are within input caps [0.84ms] (pass) session.compaction.isOverflow > returns false when output within limit with input caps [1.10ms] (pass) session.compaction.isOverflow > returns false when model context limit is 0 [2.89ms] (pass) session.compaction.isOverflow > returns false when compaction.auto is disabled [3.43ms] (pass) util.token.estimate > estimates tokens from text (4 chars per token) [0.04ms] (pass) util.token.estimate > estimates tokens from larger text [0.02ms] (pass) util.token.estimate > returns 0 for empty string (pass) session.getUsage > normalizes standard usage to token format [1.14ms] (pass) session.getUsage > extracts cached tokens to cache.read [0.09ms] (pass) session.getUsage > handles anthropic cache write metadata [0.07ms] (pass) session.getUsage > does not subtract cached tokens for anthropic provider [0.05ms] (pass) session.getUsage > handles reasoning tokens [0.05ms] (pass) session.getUsage > handles undefined optional values gracefully [0.06ms] (pass) session.getUsage > calculates cost correctly [0.28ms] test/session/instruction.test.ts: (pass) InstructionPrompt.resolve > returns empty when AGENTS.md is at project root (already in systemPaths) [3.98ms] (pass) InstructionPrompt.resolve > returns AGENTS.md from subdirectory (not in systemPaths) [3.91ms] (pass) InstructionPrompt.resolve > doesn't reload AGENTS.md when reading it directly [1.54ms] (pass) InstructionPrompt.systemPaths OPENCODE_CONFIG_DIR > prefers OPENCODE_CONFIG_DIR AGENTS.md over global when both exist [1.81ms] (pass) InstructionPrompt.systemPaths OPENCODE_CONFIG_DIR > falls back to global AGENTS.md when OPENCODE_CONFIG_DIR has no AGENTS.md [2.89ms] (pass) InstructionPrompt.systemPaths OPENCODE_CONFIG_DIR > uses global AGENTS.md when OPENCODE_CONFIG_DIR is not set [2.41ms] test/session/llm.test.ts: (pass) session.llm.hasToolCalls > returns false for empty messages array [0.12ms] (pass) session.llm.hasToolCalls > returns false for messages with only text content [0.05ms] (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.02ms] (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.03ms] (pass) session.llm.stream > sends temperature, tokens, and reasoning options for openai-compatible models [26.57ms] (pass) session.llm.stream > sends responses API payload for OpenAI models [19.15ms] (pass) session.llm.stream > sends messages API payload for Anthropic models [19.87ms] (pass) session.llm.stream > sends Google API payload for Gemini models [18.78ms] test/session/message-v2.test.ts: (pass) session.message-v2.toModelMessage > filters out messages with no parts [0.49ms] (pass) session.message-v2.toModelMessage > filters out messages with only ignored parts [0.03ms] (pass) session.message-v2.toModelMessage > includes synthetic text parts [0.18ms] (pass) session.message-v2.toModelMessage > converts user text/file parts and injects compaction/subtask prompts [0.07ms] (pass) session.message-v2.toModelMessage > converts assistant tool completion into tool-call + tool-result messages with attachments [0.27ms] (pass) session.message-v2.toModelMessage > omits provider metadata when assistant model differs [0.08ms] (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.07ms] (pass) session.message-v2.toModelMessage > filters assistant messages with non-abort errors [0.05ms] (pass) session.message-v2.toModelMessage > includes aborted assistant messages only when they have non-step-start/reasoning content [0.06ms] (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.07ms] test/session/prompt-missing-file.test.ts: (pass) session.prompt missing file > does not fail the prompt when a file part is missing [23.47ms] test/session/prompt-variant.test.ts: (pass) session.prompt agent variant > applies agent variant only when using agent model [14.20ms] test/session/retry.test.ts: (pass) session.retry.delay > caps delay at 30 seconds when headers missing [0.14ms] (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.04ms] (pass) session.retry.delay > ignores invalid retry hints [0.01ms] (pass) session.retry.delay > ignores malformed date retry hints [0.01ms] (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.19ms] (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 [7888.35ms] (pass) session.message-v2.fromError > ECONNRESET socket error is retryable [0.05ms] (pass) session.message-v2.fromError > marks OpenAI 404 status codes as retryable [0.18ms] test/session/revert-compact.test.ts: (pass) revert + compact workflow > should properly handle compact command after revert [32.90ms] (pass) revert + compact workflow > should properly clean up revert state before creating compaction message [23.42ms] test/session/session.test.ts: (pass) session.started event > should emit session.started event when session is created [102.21ms] (pass) session.started event > session.started event should be emitted before session.updated [101.66ms] test/skill/skill.test.ts: (pass) discovers skills from .opencode/skill/ directory [15.15ms] (pass) returns skill directories from Skill.dirs [13.51ms] (pass) discovers multiple skills from .opencode/skill/ directory [13.09ms] (pass) skips skills with missing frontmatter [13.59ms] (pass) discovers skills from .claude/skills/ directory [13.54ms] (pass) discovers global skills from ~/.claude/skills/ directory [10.91ms] (pass) returns empty array when no skills exist [11.58ms] (pass) discovers skills from .agents/skills/ directory [11.73ms] (pass) discovers global skills from ~/.agents/skills/ directory [12.05ms] (pass) discovers skills from both .claude/skills/ and .agents/skills/ [11.25ms] (pass) properly resolves directories that skills live in [13.49ms] test/snapshot/snapshot.test.ts: (pass) tracks deleted files correctly [27.17ms] (pass) revert should remove new files [30.43ms] (pass) revert in subdirectory [29.76ms] (pass) multiple file operations [37.67ms] (pass) empty directory handling [26.94ms] (pass) binary file handling [28.43ms] (pass) symlink handling [27.85ms] (pass) large file handling [31.69ms] (pass) nested directory revert [28.32ms] (pass) special characters in filenames [26.54ms] (pass) revert with empty patches [14.19ms] (pass) patch with invalid hash [25.53ms] (pass) revert non-existent file [24.35ms] (pass) unicode filenames [36.04ms] (skip) unicode filenames modification and restore (pass) unicode filenames in subdirectories [28.84ms] (pass) very long filenames [26.34ms] (pass) hidden files [24.30ms] (pass) nested symlinks [29.65ms] (pass) file permissions and ownership changes [28.50ms] (pass) circular symlinks [29.79ms] (pass) gitignore changes [25.15ms] (pass) concurrent file operations during patch [34.72ms] (pass) snapshot state isolation between projects [48.64ms] (pass) patch detects changes in secondary worktree [36.15ms] (pass) revert only removes files in invoking worktree [41.20ms] (pass) diff reports worktree-only/shared edits and ignores primary-only [39.75ms] (pass) track with no changes returns same hash [28.84ms] (pass) diff function with various changes [27.72ms] (pass) restore function [24.28ms] (pass) revert should not delete files that existed but were deleted in snapshot [33.95ms] (pass) revert preserves file that existed in snapshot when deleted then recreated [32.47ms] (pass) diffFull sets status based on git change type [40.05ms] (pass) diffFull with new file additions [31.43ms] (pass) diffFull with file modifications [32.70ms] (pass) diffFull with file deletions [31.33ms] (pass) diffFull with multiple line additions [30.95ms] (pass) diffFull with addition and deletion [34.52ms] (pass) diffFull with multiple additions and deletions [38.10ms] (pass) diffFull with no changes [26.22ms] (pass) diffFull with binary file changes [28.67ms] (pass) diffFull with whitespace changes [30.43ms] test/tool/apply_patch.test.ts: (pass) tool.apply_patch freeform > requires patchText [1.09ms] (pass) tool.apply_patch freeform > rejects invalid patch format [0.42ms] (pass) tool.apply_patch freeform > rejects empty patch [0.08ms] (pass) tool.apply_patch freeform > applies add/update/delete in one patch [14.68ms] (pass) tool.apply_patch freeform > permission metadata includes move file info [9.82ms] (pass) tool.apply_patch freeform > applies multiple hunks to one file [1.75ms] (pass) tool.apply_patch freeform > inserts lines with insert-only hunk [4.88ms] (pass) tool.apply_patch freeform > appends trailing newline on update [2.01ms] (pass) tool.apply_patch freeform > moves file to a new directory [4.15ms] (pass) tool.apply_patch freeform > moves file overwriting existing destination [4.35ms] (pass) tool.apply_patch freeform > adds file overwriting existing file [3.06ms] (pass) tool.apply_patch freeform > rejects update when target file is missing [0.61ms] (pass) tool.apply_patch freeform > rejects delete when file is missing [0.79ms] (pass) tool.apply_patch freeform > rejects delete when target is a directory [0.70ms] (pass) tool.apply_patch freeform > rejects invalid hunk header [0.46ms] (pass) tool.apply_patch freeform > rejects update with missing context [0.91ms] (pass) tool.apply_patch freeform > verification failure leaves no side effects [0.62ms] (pass) tool.apply_patch freeform > supports end of file anchor [3.58ms] (pass) tool.apply_patch freeform > rejects missing second chunk context [1.16ms] (pass) tool.apply_patch freeform > disambiguates change context with @@ header [3.00ms] (pass) tool.apply_patch freeform > EOF anchor matches from end of file first [4.53ms] (pass) tool.apply_patch freeform > parses heredoc-wrapped patch [1.75ms] (pass) tool.apply_patch freeform > parses heredoc-wrapped patch without cat [5.15ms] (pass) tool.apply_patch freeform > matches with trailing whitespace differences [3.25ms] (pass) tool.apply_patch freeform > matches with leading whitespace differences [1.44ms] (pass) tool.apply_patch freeform > matches with Unicode punctuation differences [6.69ms] test/tool/bash.test.ts: (pass) tool.bash > basic [27.67ms] (pass) tool.bash permissions > asks for bash permission with correct pattern [29.25ms] (pass) tool.bash permissions > asks for bash permission with multiple commands [14.55ms] (pass) tool.bash permissions > asks for external_directory permission when cd to parent [16.15ms] (pass) tool.bash permissions > asks for external_directory permission when workdir is outside project [14.88ms] (pass) tool.bash permissions > asks for external_directory permission when file arg is outside project [15.84ms] (pass) tool.bash permissions > does not ask for external_directory permission when rm inside project [15.99ms] (pass) tool.bash permissions > includes always patterns for auto-approval [17.25ms] (pass) tool.bash permissions > does not ask for bash permission when command is cd only [14.86ms] (pass) tool.bash permissions > matches redirects in permission pattern [16.31ms] (pass) tool.bash permissions > always pattern has space before wildcard to not include different commands [14.37ms] (pass) tool.bash truncation > truncates output exceeding line limit [3.00ms] (pass) tool.bash truncation > truncates output exceeding byte limit [3.00ms] (pass) tool.bash truncation > does not truncate small output [2.40ms] (pass) tool.bash truncation > full output is saved to file when truncated [5.24ms] test/tool/external-directory.test.ts: (pass) tool.assertExternalDirectory > no-ops for empty target [0.31ms] (pass) tool.assertExternalDirectory > no-ops for paths inside Instance.directory [0.35ms] (pass) tool.assertExternalDirectory > asks with a single canonical glob [0.16ms] (pass) tool.assertExternalDirectory > uses target directory when kind=directory [0.11ms] (pass) tool.assertExternalDirectory > skips prompting when bypass=true [0.07ms] test/tool/grep.test.ts: (pass) tool.grep > basic search [12.15ms] (pass) tool.grep > no matches returns correct output [4.33ms] (pass) tool.grep > handles CRLF line endings in output [5.60ms] (pass) CRLF regex handling > regex correctly splits Unix line endings [0.10ms] (pass) CRLF regex handling > regex correctly splits Windows CRLF line endings [0.02ms] (pass) CRLF regex handling > regex handles mixed line endings [0.13ms] test/tool/question.test.ts: (pass) tool.question > should successfully execute with valid question parameters [0.76ms] (pass) tool.question > should now pass with a header longer than 12 but less than 30 chars [0.10ms] test/tool/read.test.ts: (pass) tool.read external_directory permission > allows reading absolute path inside project directory [2.45ms] (pass) tool.read external_directory permission > allows reading file in subdirectory inside project directory [1.60ms] (pass) tool.read external_directory permission > asks for external_directory permission when reading absolute path outside project [11.78ms] (pass) tool.read external_directory permission > asks for external_directory permission when reading relative path outside project [10.62ms] (pass) tool.read external_directory permission > does not ask for external_directory permission when reading inside project [13.03ms] (pass) tool.read env file permissions > agent=build > .env asks=%s [3.65ms] (pass) tool.read env file permissions > agent=build > .env.local asks=%s [4.61ms] (pass) tool.read env file permissions > agent=build > .env.production asks=%s [2.56ms] (pass) tool.read env file permissions > agent=build > .env.development.local asks=%s [4.54ms] (pass) tool.read env file permissions > agent=build > .env.example asks=%s [5.26ms] (pass) tool.read env file permissions > agent=build > .envrc asks=%s [2.92ms] (pass) tool.read env file permissions > agent=build > environment.ts asks=%s [5.32ms] (pass) tool.read env file permissions > agent=plan > .env asks=%s [2.90ms] (pass) tool.read env file permissions > agent=plan > .env.local asks=%s [7.35ms] (pass) tool.read env file permissions > agent=plan > .env.production asks=%s [1.87ms] (pass) tool.read env file permissions > agent=plan > .env.development.local asks=%s [1.47ms] (pass) tool.read env file permissions > agent=plan > .env.example asks=%s [1.12ms] (pass) tool.read env file permissions > agent=plan > .envrc asks=%s [3.45ms] (pass) tool.read env file permissions > agent=plan > environment.ts asks=%s [3.29ms] (pass) tool.read truncation > truncates large file by bytes and sets truncated metadata [8.30ms] (pass) tool.read truncation > truncates by line count when limit is specified [1.80ms] (pass) tool.read truncation > does not truncate small file [4.93ms] (pass) tool.read truncation > respects offset parameter [1.68ms] (pass) tool.read truncation > truncates long lines [5.27ms] (pass) tool.read truncation > image files set truncated to false [1.71ms] (pass) tool.read truncation > large image files are properly attached without error [11.19ms] (pass) tool.read truncation > .fbs files (FlatBuffers schema) are read as text, not images [5.23ms] (pass) tool.read loaded instructions > loads AGENTS.md from parent directory and includes in metadata [3.60ms] test/tool/registry.test.ts: killed 1 dangling process (fail) tool.registry > loads tools from .opencode/tool (singular) [5000.28ms] ^ this test timed out after 5000ms. killed 1 dangling process (fail) tool.registry > loads tools from .opencode/tools (plural) [5000.36ms] ^ this test timed out after 5000ms. (pass) tool.registry > loads tools with external dependencies without crashing [4072.56ms] test/tool/skill.test.ts: (pass) tool.skill > description lists skill location URL [12.79ms] (pass) tool.skill > execute returns skill content block with files [16.90ms] test/tool/truncation.test.ts: (pass) Truncate > output > truncates large json file by bytes [3.59ms] (pass) Truncate > output > returns content unchanged when under limits [0.06ms] (pass) Truncate > output > truncates by line count [0.16ms] (pass) Truncate > output > truncates by byte count [0.09ms] (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.03ms] (pass) Truncate > output > large single-line file truncates with byte message [3.34ms] (pass) Truncate > output > writes full output to file when truncated [0.27ms] (pass) Truncate > output > suggests Task tool when agent has task permission [0.21ms] (pass) Truncate > output > omits Task tool hint when agent lacks task permission [0.14ms] (pass) Truncate > output > does not write file when not truncated [0.05ms] (pass) Truncate > cleanup > deletes files older than 7 days and preserves recent files [0.47ms] test/util/filesystem.test.ts: (pass) util.filesystem > exists() is true for files and directories [0.32ms] (pass) util.filesystem > isDir() is true only for directories [0.32ms] test/util/format.test.ts: (pass) util.format > formatDuration > returns empty string for zero or negative values [1.25ms] (pass) util.format > formatDuration > formats seconds under a minute [0.05ms] (pass) util.format > formatDuration > formats minutes under an hour [0.05ms] (pass) util.format > formatDuration > formats hours under a day [0.02ms] (pass) util.format > formatDuration > formats days under a week [0.02ms] (pass) util.format > formatDuration > formats weeks [0.01ms] (pass) util.format > formatDuration > handles boundary values correctly [0.12ms] 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.06ms] (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.06ms] (pass) util.lazy > should preserve the same reference [0.03ms] (pass) util.lazy > should work with different return types [0.05ms] test/util/lock.test.ts: (pass) util.lock > writer exclusivity: blocks reads and other writes while held [0.40ms] test/util/timeout.test.ts: (pass) util.timeout > should resolve when promise completes before timeout [11.43ms] (pass) util.timeout > should reject when promise exceeds timeout [50.82ms] test/util/wildcard.test.ts: (pass) match handles glob tokens [0.06ms] (pass) match with trailing space+wildcard matches command with or without args [0.06ms] (pass) all picks the most specific pattern [0.21ms] (pass) allStructured matches command sequences [0.15ms] (pass) allStructured prioritizes flag-specific patterns [0.09ms] (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.01ms] (pass) transcript > formatPart > formats reasoning when thinking enabled [0.01ms] (pass) transcript > formatPart > skips reasoning when thinking disabled [0.01ms] (pass) transcript > formatPart > formats tool part with details [0.04ms] (pass) transcript > formatPart > formats tool output containing triple backticks without breaking markdown [0.03ms] (pass) transcript > formatPart > formats tool part without details when disabled [0.02ms] (pass) transcript > formatPart > formats tool error [0.02ms] (pass) transcript > formatMessage > formats user message [0.05ms] (pass) transcript > formatMessage > formats assistant message with metadata [0.04ms] (pass) transcript > formatTranscript > formats complete transcript [4.93ms] (pass) transcript > formatTranscript > formats transcript without assistant metadata [0.18ms] test/provider/copilot/convert-to-copilot-messages.test.ts: (pass) system messages > should convert system message content to string [0.17ms] (pass) user messages > should convert messages with only a text part to a string content [0.02ms] (pass) user messages > should convert messages with image parts [0.10ms] (pass) user messages > should convert messages with image parts from Uint8Array [0.13ms] (pass) user messages > should handle URL-based images [0.06ms] (pass) user messages > should handle multiple text parts without flattening [0.04ms] (pass) assistant messages > should convert assistant text messages [0.04ms] (pass) assistant messages > should handle assistant message with null content when only tool calls [0.04ms] (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.03ms] (pass) tool calls > should handle text plus multiple tool calls [0.05ms] (pass) reasoning (copilot-specific) > should omit reasoning_text without reasoning_opaque [0.02ms] (pass) reasoning (copilot-specific) > should include reasoning_opaque from providerOptions [0.03ms] (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.86ms] (pass) doStream > should stream reasoning with tool calls and capture reasoning_opaque [1.50ms] (pass) doStream > should handle reasoning_opaque that comes at end with text in between [0.86ms] (pass) doStream > should handle reasoning_opaque and content in the same chunk [1.16ms] (pass) doStream > should handle reasoning_opaque and content followed by tool calls [0.94ms] (pass) doStream > should emit reasoning-end before tool-input-start when reasoning goes directly to tool calls [0.89ms] (pass) doStream > should attach reasoning_opaque to tool calls without reasoning_text [0.76ms] (pass) doStream > should include response metadata from first chunk [0.68ms] (pass) doStream > should emit stream-start with warnings [0.69ms] (pass) doStream > should include raw chunks when requested [0.64ms] (pass) request body > should send tools in OpenAI format [0.49ms] 1 tests skipped: (skip) unicode filenames modification and restore 3 tests failed: (fail) installs dependencies in writable OPENCODE_CONFIG_DIR [5013.80ms] ^ this test timed out after 5000ms. (fail) tool.registry > loads tools from .opencode/tool (singular) [5000.28ms] ^ this test timed out after 5000ms. (fail) tool.registry > loads tools from .opencode/tools (plural) [5000.36ms] ^ this test timed out after 5000ms. 879 pass 1 skip 3 fail 1883 expect() calls Ran 883 tests across 63 files. [47.27s] ==> ERROR: A failure occurred in check(). Aborting... ==> ERROR: Build failed, check /home/alhp/workspace/chroot/build_c8e41c4b-fb20-46bd-92c4-6682253ed5e5/build