Skip to content

Flexion - Custom Implementations Tracker#2

Draft
lgarceau768 wants to merge 27 commits intodevfrom
flex
Draft

Flexion - Custom Implementations Tracker#2
lgarceau768 wants to merge 27 commits intodevfrom
flex

Conversation

@lgarceau768
Copy link
Copy Markdown
Collaborator

@lgarceau768 lgarceau768 commented Apr 15, 2026

DO NOT MERGE

This is a permanent tracking PR that shows all Flexion-specific customizations on top of upstream anomalyco/opencode.

It mirrors the pattern used in flexion/open-webui#14.


Branching Strategy

Branch Purpose
dev Tracks upstream anomalyco/opencode:dev exactly — synced via force-push when upstream releases
flex All Flexion customizations, rebased onto latest dev after each upstream sync

Keeping in sync with upstream

# 1. Fetch upstream
git fetch upstream  # upstream = https://github.com/anomalyco/opencode.git

# 2. Update dev to match upstream
git checkout dev
git reset --hard upstream/dev
git push origin dev --force

# 3. Rebase flex onto the new dev
git checkout flex
git rebase dev
# Resolve any conflicts, then:
git push origin flex --force

# 4. This PR will automatically update to reflect the new diff

Flexion Customizations (rebased onto v1.4.0)

1. fix: hide skill prompt text from chat UI

File: packages/opencode/src/session/prompt.ts

Mark the skill template TextPart as synthetic: true so the full prompt is sent to the model but hidden from the user. Adds a short ignored: true summary part (Running skill: <command>) so the user still sees confirmation the skill was loaded.

Originally merged as flexion/opencode#1.


2. fix: respect tool_call: false capability flag at runtime

Files: packages/opencode/src/session/llm.ts, packages/opencode/test/session/llm.test.ts

Gates tool resolution, LiteLLM noop injection, activeTools, tools, and toolChoice behind input.model.capabilities.toolcall. Without this fix, tool_call: false in opencode.json is parsed and stored but never checked — causing Bedrock models that don't support streaming + tool use to fail.

Includes a regression test verifying body.tools is not sent when toolcall: false.

Originally from lgarceau768/opencode#1.


3. docs: add local build and AWS Bedrock setup instructions

File: LOCAL_AWS_SETUP.md

Covers cloning, building with bun, AWS SSO profile config, opencode.json Bedrock provider setup, and the opencode-work shell alias.

Originally from lgarceau768/opencode#1.


4. fix: re-sign macOS binaries after Bun compile to fix Darwin 25+ SIGKILL

File: LOCAL_AWS_SETUP.md

Bun's embedded code signature is rejected by Darwin 25+ (macOS 16) at runtime, killing the binary with SIGKILL (exit 137) before it starts
Adds a post-compile step in script/build.ts to strip Bun's signature and apply a fresh ad-hoc one via codesign for all darwin targets
Documents the fix in LOCAL_AWS_SETUP.md

Originally from fix/bun-build-issue-on-macos-darwin25.


5. fix: Bedrock model config update

Files: packages/opencode/src/provider/provider.ts, packages/opencode/src/provider/transform.ts, packages/opencode/test/provider/transform.test.ts
Fixes compatibility with the following AWS Bedrock models:

  • Writer Palmyra X4 / Palmyra X5
  • DeepSeek R1 (A)
  • Mistral Pixtral Large
  • Meta Llama 4 Maverick 17B / Scout 17B
  • Amazon Nova 2 Lite
    Changes:
  • Added "palmyra" and "pixtral" to the Bedrock us region cross-region inference prefix list in provider.ts, so these models receive the required us. prefix at runtime
  • Added id.includes("palmyra") to the variants early-return list in transform.ts — Palmyra does not support reasoning effort variants
  • Added Palmyra-specific type: "reasoning" part stripping in normalizeMessages — Bedrock rejects messages containing reasoning parts for models that don't support reasoning; scoped to model.id.toLowerCase().includes("palmyra") to avoid affecting OpenAI/Anthropic models
  • Added a regression test: Palmyra models strip reasoning content (Bedrock rejects reasoning parts)

Originally from (flexion/opencode#4)


6. fix: bump @opentui/core and @opentui/solid catalog to 0.1.101

Files: bun.lock, packages.json

Resolves duplicate module instances (0.1.99 vs 0.1.101) that caused opentui-spinner to register the spinner component in a different componentCatalogue than the one the reconciler uses, resulting in "[Reconciler] Unknown component type: spinner" at runtime.

Originally from flexion/opencode#9


7. feature: update opencode-work shell function

File: LOCAL_AWS_SETUP.md

Updates opencode-work shell function with credential check and session resume.

If your AWS session already exists it won't re-authenticate
Add an existing opencode session id to resume a session: opencode-work ses-234556677abcde

Originally from flexion/opencode#10


Local Development Setup

See LOCAL_AWS_SETUP.md for full setup instructions including AWS Bedrock configuration.

@github-actions
Copy link
Copy Markdown

Hey! Your PR title Flexion - Custom Implementations Tracker doesn't follow conventional commit format.

Please update it to start with one of:

  • feat: or feat(scope): new feature
  • fix: or fix(scope): bug fix
  • docs: or docs(scope): documentation changes
  • chore: or chore(scope): maintenance tasks
  • refactor: or refactor(scope): code refactoring
  • test: or test(scope): adding or updating tests

Where scope is the package name (e.g., app, desktop, opencode).

See CONTRIBUTING.md for details.

@github-actions
Copy link
Copy Markdown

This PR doesn't fully meet our contributing guidelines and PR template.

What needs to be fixed:

  • PR description is missing required template sections. Please use the PR template.

Please edit this PR description to address the above within 2 hours, or it will be automatically closed.

If you believe this was flagged incorrectly, please let a maintainer know.

Mark the skill template TextPart as synthetic so the full prompt is
sent to the model but hidden from the user. Add a short ignored
summary part ('Running skill: <command>') so the user still sees
confirmation that the skill was loaded.

Rebased from flexion/hide-skill-prompt-in-chat onto v1.4.0.
Gate tool resolution, LiteLLM noop injection, activeTools, tools, and
toolChoice behind input.model.capabilities.toolcall. Without this fix,
tool_call: false in opencode.json is parsed and stored but never checked,
causing Bedrock models that don't support streaming + tool use to fail.

Adds regression test verifying body.tools is not sent when toolcall: false.

Cherry-picked from lgarceau768#1 and rebased onto v1.4.0.
Covers cloning, building with bun, AWS SSO profile config,
opencode.json Bedrock provider setup, and the opencode-work
shell alias. Notes the tool_call fix included in this branch.
rgoshen and others added 21 commits April 16, 2026 08:53
Bun's embedded code signature is rejected by Darwin 25+ at runtime,
killing the binary with SIGKILL (exit 137) before it starts. Strip the
signature and apply a fresh ad-hoc one via codesign after each darwin
build. Also documents the fix in LOCAL_AWS_SETUP.md.
fix: re-sign macOS binaries after Bun compile to fix Darwin 25+ SIGKILL
…ditional models

- Add palmyra and pixtral to US cross-region inference profile prefix list
- Strip reasoning content from message history for non-reasoning models
- Exclude palmyra from reasoning variant generation to prevent unsupported params
chore - merge dev into flex, resolve conflicts in session/llm.ts and session/prompt.ts
…o flex

# Conflicts:
#	packages/opencode/src/provider/provider.ts
#	packages/opencode/src/provider/transform.ts
Resolves duplicate module instances (0.1.99 vs 0.1.101) that caused
opentui-spinner to register the spinner component in a different
componentCatalogue than the one the reconciler uses, resulting in
"[Reconciler] Unknown component type: spinner" at runtime.
- add install-flex: single curl | bash installer that clones the flex
  branch, builds the binary, writes the AWS SSO profile, writes
  ~/.config/opencode/opencode.json, and appends opencode-work() to
  the user's shell rc file; all steps are idempotent
- hardcode SSO start URL and us-east-2 SSO region; prompt only for
  account ID and preferred AWS region
- correct sso_role_name from AdministratorAccess to ClaudeCodeAccess
- fix opencode-work(): replace undeclared \${opencode_args[@]} with
  "\$@", replace hardcoded path and arch with runtime uname detection
- add Quick Install section to LOCAL_AWS_SETUP.md
…B fragmentation

Without this, every build bakes the current git branch name as the installation
channel, causing OpenCode to open a new empty SQLite database each time you
rebuild from a different branch (opencode-chore-bolster-install.db,
opencode-feat-mcp-awareness.db, etc). Setting OPENCODE_CHANNEL=flex means all
Flexion fork builds share opencode-flex.db regardless of which branch was built.
…unners

Blacksmith's ubuntu-2404 runners run on ARM64 hardware (RUNNER_ARCH=ARM64).
The previous action only built an explicit bun download URL for X64, so ARM64
fell through to oven-sh/setup-bun@v2's default path which downloads
bun-linux-aarch64.zip and extracts it via the system unzip command. Blacksmith's
ARM64 Ubuntu image doesn't pre-install unzip, causing all e2e and unit CI jobs
to fail at the Setup Bun step.

Two changes:
- Add a Linux step that installs unzip if not already present (direct fix)
- Rewrite the URL construction with case/esac covering both X64 and ARM64 for
  all OS variants, replacing the x64-only if block (architecture fix)
…ion on ARM64

tree-sitter-powershell builds a native addon via node-gyp during bun install.
Blacksmith ARM64 runners don't pre-install make or g++, so the build fails with:

  gyp ERR! not found: make

Extend the prerequisite step to also check for make and install build-essential
(which provides make + g++) when missing, alongside the existing unzip check.
…in test timeouts

Plugin integration tests (auth-override, plugin config providers) each create a
fresh temp dir and trigger @npmcli/arborist to install @opencode-ai/plugin from
the npm registry. On Blacksmith ARM64, this network fetch takes 10-30 s per
test, consistently hitting the 30 s bun test timeout.

Two changes to the unit job in test.yml:
- Cache ~/.npm across runs so arborist finds tarballs locally on repeat runs
- Pre-warm step: npm install @opencode-ai/plugin once before tests run, which
  populates ~/.npm so arborist's per-test installs resolve from cache (~0.5 s)
  rather than the network (~10-30 s)
…t timeout

Root cause of all 7 test timeouts:

  config.ts fires a background @npmcli/arborist.reify() for @opencode-ai/plugin
  in every .opencode/ directory it discovers. plugin/index.ts and tool/registry.ts
  then call waitForDependencies() which joins that fiber before loading plugins
  or custom tools. On Blacksmith ARM64, a cold arborist fetch takes 10-30 s per
  test. Running in parallel across a 4-vCPU runner saturates CPU/IO and starves
  even unrelated tests (session.processor, snapshot.revert) past their 30 s limit.

Fixes:
  - flag.ts: add OPENCODE_DISABLE_PLUGIN_DEPS_INSTALL flag
  - config.ts: guard the npmSvc.install() + deps.push() block with the new flag
  - preload.ts: set OPENCODE_DISABLE_PLUGIN_DEPS_INSTALL=true for all tests
    (safe: bun resolves @opencode-ai/plugin from the workspace node_modules;
    tests do not author plugins that import the SDK at runtime)
  - snapshot.test.ts: raise timeout on the 280-file revert test to 60 s
    (git operations across 280 files can push past 30 s on ARM64)
Blacksmith ARM64 runner subprocess startup overhead can consume 2-3 s,
pushing the 'loop waits while shell runs' test past its 3 s failsafe.
The test validates ordering (loop waits while shell is running), not wall
time, so a larger timeout doesn't change what is being tested.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants