Skip to content

fix(smartypants): sanitize history to avoid provider errors on reasoning and empty content#2835

Closed
paulbettner wants to merge 91 commits into
anomalyco:devfrom
Smarty-Pants-Inc:dev
Closed

fix(smartypants): sanitize history to avoid provider errors on reasoning and empty content#2835
paulbettner wants to merge 91 commits into
anomalyco:devfrom
Smarty-Pants-Inc:dev

Conversation

@paulbettner
Copy link
Copy Markdown

Summary

  • Drop prior assistant reasoning parts from history passed to providers (display-only), preventing OpenAI Responses API error: item of type 'reasoning' provided without required following item.
  • Filter aborted assistant messages with no contentful parts (text or completed/error tool results) so history never serializes to empty content, avoiding messages.N must have non-empty content.

Rationale

Interruptions (Ctrl-C) could leave an assistant turn with only step markers or partial tool scaffolding; combined with replaying reasoning chunks, subsequent calls errored and wedged the session. This patch makes history safe while preserving visible reasoning and contentful context.

Scope

  • smartypants: provider transform + message-v2 + prompt filter only.

Notes

  • Typecheck OK via turborepo; no API or configuration changes.

paulbettner and others added 30 commits September 26, 2025 21:10
…llback)

Adds minimal Langfuse integration to observe sessions/events via Bus. Node uses @langfuse/otel span processor; Bun falls back to langfuse v3 client. No effect unless LANGFUSE_* env vars are set.
…vents to Langfuse with per-session observations
…art.sessionID); mark assistant as GENERATION
- type: set GENERATION/TOOL/EVENT/SPAN appropriately
- sanitize text (2k) and data: URLs
- include messageID in metadata
- ensure sessionId from sessionID|info.sessionID|part.sessionID
- collect user input text per session
- accumulate assistant text parts by messageID
- finalize generation output on step-finish with tokens/cost metadata
#1)

* Rebrand opencode to smartypants

- Replace all logo SVGs with custom 'smartypants' lettering
- Update React Logo component with new SVG paths and dimensions
- Rename packages/opencode to packages/smartypants
- Update package.json names and binary references
- Update TUI Go main.go with new binary name and env vars
- Update install script to use smartypants naming
- Replace logo references in README.md

Generated 8 logo variants:
- logo-light.svg / logo-dark.svg (main horizontal logos)
- logo-ornate-light.svg / logo-ornate-dark.svg (with transparency effects)
- logomark-light.svg / logomark-dark.svg (SP initials only)
- logo-square-light.svg / logo-square-dark.svg (compact versions)

* Replace with beautiful rainbow ASCII art logos

🌈 Major visual upgrade:
- Replace blocky logos with stunning rainbow gradient ASCII art
- Generated using https://patorjk.com/software/taag/
- Beautiful glowing effect with multiple color themes
- DRY refactored Logo component with reusable ASCII art definitions
- Added logo-generator.js tool to packages/smartypants/tools/

🎨 Features:
- Rainbow gradient with 7-color spectrum
- Mono theme for dark backgrounds
- Scalable ASCII art that looks crisp at any size
- Configurable glow intensity (subtle for 'full', strong for 'ornate')
- Support for mark/full/ornate variants
- Blue, purple, green, red color scheme options

🛠 Technical improvements:
- DRY code with shared ASCII_ART constants
- Reusable gradient and filter definitions
- Consistent scaling and typography
- Proper aspect ratios maintained

* Fix module system and add comprehensive tests

🔧 Module fixes:
- Convert logo-generator.js to logo-generator.cjs for CommonJS compatibility
- Update workspace dependency references
- Clean package naming structure

🧪 Testing suite:
- logo-test.html - Visual gallery of all logo variants
- logo-component-test.tsx - DRY component verification
- Verified logo generator tool produces all variants

✨ Production ready:
- Beautiful rainbow ASCII logos with perfect scaling
- DRY React component architecture
- Multiple themes (rainbow, mono, blue, purple, green, red)
- All variants (mark, full, ornate) working
- Tools for generating additional color schemes

* tui,cli,branding: adopt Smarty logo everywhere; static rainbow + help spacing; fix caret alignment

Switch to consistent user-facing Smarty branding in TUI/CLI and identity assets. Keep static rainbow ASCII (no animation) for stability, preserve help banner spacing, align caret with input, and ensure TUI fallback/env work reliably.

* gitignore: ignore bun.lock

Ignore local Bun lockfile to avoid untracked noise. Removed untracked 'smarty/' directory locally as requested.

* branding: centralize user-facing name and apply across CLI/TUI

Introduce UI.BRAND (env-configurable, default "smarty") and replace user-facing "opencode" strings in help/command descriptions, status bar, and TUI toasts. Do not change internal identifiers or protocol strings; keep server-ready log text unchanged for SDK compatibility.

* cli: add missing UI import for branding strings in serve/attach\n\nEnsure UI.BRAND usage doesn’t throw ReferenceError by importing UI in these modules; no behavioral changes beyond fixing branding display.

* tools: add HTML helpers for multi-color ASCII/SVG logo experiments\n\nCheck in small static pages used to preview and iterate on rainbow logo rendering; no runtime impact.

* app: fix SVG JSX attribute xml:space -> xmlSpace in Logo to satisfy TS types (Solid JSX)

* app: preserve ASCII spacing in SVG text via style='white-space: pre' (drop xmlSpace attr for TSX types)

* app: use camelCase SVG text attributes (fontFamily/fontSize/fontWeight) to satisfy TS types

* app: use hyphenated SVG attributes with string values for Solid types (font-size/font-family/font-weight)
…ecar autostart to smartypants path and env gate; resolve bun.lock
…y capture generation input/output and tools, and log canonical trace URLs; gate in-app tracing behind OPENCODE_OBSERVE=langfuse-app and fix workspace refs.
…acket-index env; keep sidecar-only as default
…rchitecture, known issues, and development workflow
- Apply consistent formatting to sidecar.mjs
- Improve README formatting and clarity
- Minor formatting fix in server.ts
…ility

feat: add Langfuse v4 observability via sidecar architecture
…traces under a session root to simplify debugging; update README to mark issues fixed
…e-structure

observe(sidecar): dedupe streaming text, surface reasoning, nest under session root
- Map ESC/abort and OpenAI interrupted streaming error to MessageAbortedError ("Request was aborted")
- Preserve tool input/start time when marking aborted tools
…ge\n\n- Gate editor spinner ticks to busy/permission states to avoid perpetual idle re-renders\n- Restrict shimmer to the newest in-progress assistant/tool; stop on MessageAbortedError\n- Keeps 90ms cadence while eliminating runaway shimmer after interrupts\n\nMotivation: reduce CPU/heat and TUI slowdowns from idle render churn and aborted sessions. (#4)
…or assistant reasoning parts and filtering aborted assistant messages with no content\n\nPrevents OpenAI Responses API errors (reasoning items in input) and 'messages.N must have non-empty content' when a turn is interrupted. Keeps reasoning for display only; retains contentful aborted messages (text or completed/error tool results).
…oning-and-empty-assistant

fix(smartypants): sanitize history to avoid provider errors on reasoning and empty content
…liability upgrades (#6)

- Add README section for fork enhancements (Langfuse sidecar, TUI link + /trace, run/exit fixes)
- Batch assistant output; emit reasoning only when present; clean sidecar shutdown
- Right‑align Langfuse link with padding; add /trace; fix CLI/TUI explicit exits
- Server: pass actual bound port to sidecar; keep SSE and event logging
…ession redraws and spinner churn\n\n- Gate permission.updated/replied to active session or parent only\n- Only re-render chat on in-scope permission events\n- Animate editor spinner only for in-scope permissions\n- De-duplicate permission queue by ID\n- Clean permission queue on session switch\n- Stream events scoped by project worktree with fallback\n\nMotivation: eliminate background CPU and animation stutter from unrelated sessions without altering UX. (#7)
paulbettner and others added 28 commits September 29, 2025 02:04
…5-09-29

integration: sync downstream/fixes + downstream/smarty into dev
…gMarkdown

- Update fileRegex test to use ConfigMarkdown.FILE_REGEX
- Relax glob basic assertion (count > 0, truncated boolean)
- Point list fixture to packages/smartypants/test/fixtures and update snapshot
- Mark ambiguous replace (multiple matches) as expected failure
- Resolve stray merge artifact in TUI (payload var)
test: update smartypants tests for new glob/list + file regex move
- Add  script to packages/smartypants
- Add  task to turbo.json so • Packages in scope: @opencode/app, @opencode/console-app, @opencode/console-core, @opencode/console-function, @opencode/console-resource, @opencode/console-scripts, @opencode/function, @opencode/web, @smartypants-ai/plugin, @smartypants-ai/sdk, opencode-langfuse-sidecar, smartypants
• Running test in 12 packages
• Remote caching disabled
smartypants:test: cache miss, executing ed989ced4798610d
smartypants:test: $ bun test
smartypants:test: bun test v1.2.22 (6bafe260)
smartypants:test:
smartypants:test: test/bun.test.ts:
smartypants:test: (pass) BunProc registry configuration > should not contain hardcoded registry parameters [0.15ms]
smartypants:test: (pass) BunProc registry configuration > should use Bun's default registry resolution [0.09ms]
smartypants:test: (pass) BunProc registry configuration > should have correct command structure without registry [0.10ms]
smartypants:test:
smartypants:test: test/snapshot/snapshot.test.ts:
smartypants:test: (pass) tracks deleted files correctly [207.90ms]
smartypants:test: (pass) revert should remove new files [223.43ms]
smartypants:test: (pass) revert in subdirectory [248.70ms]
smartypants:test: (pass) multiple file operations [307.14ms]
smartypants:test: (pass) empty directory handling [223.87ms]
smartypants:test: (pass) binary file handling [246.09ms]
smartypants:test: (pass) symlink handling [228.33ms]
smartypants:test: (pass) large file handling [236.77ms]
smartypants:test: (pass) nested directory revert [257.52ms]
smartypants:test: (pass) special characters in filenames [203.09ms]
smartypants:test: (pass) revert with empty patches [111.16ms]
smartypants:test: (pass) patch with invalid hash [204.79ms]
smartypants:test: (pass) revert non-existent file [181.31ms]
smartypants:test: (pass) unicode filenames [210.90ms]
smartypants:test: (pass) very long filenames [223.00ms]
smartypants:test: (pass) hidden files [224.85ms]
smartypants:test: (pass) nested symlinks [214.53ms]
smartypants:test: (pass) file permissions and ownership changes [217.78ms]
smartypants:test: (pass) circular symlinks [232.55ms]
smartypants:test: (pass) gitignore changes [226.30ms]
smartypants:test: (pass) concurrent file operations during patch [220.58ms]
smartypants:test: (pass) snapshot state isolation between projects [437.90ms]
smartypants:test: (pass) track with no changes returns same hash [250.23ms]
smartypants:test: (pass) diff function with various changes [184.44ms]
smartypants:test: (pass) restore function [200.45ms]
smartypants:test:
smartypants:test: test/config/markdown.test.ts:
smartypants:test: (pass) should extract exactly 12 file references
smartypants:test: (pass) should extract valid/path/to/a/file
smartypants:test: (pass) should extract another-valid/path/to/a/file
smartypants:test: (pass) should extract paths ignoring comma after
smartypants:test: (pass) should extract a path with a file extension and comma after
smartypants:test: (pass) should extract a path with multiple dots and comma after
smartypants:test: (pass) should extract hidden directory
smartypants:test: (pass) should extract hidden file
smartypants:test: (pass) should extract a file ignoring period at end of sentence
smartypants:test: (pass) should extract an absolute path with an extension
smartypants:test: (pass) should extract an absolute path without an extension
smartypants:test: (pass) should extract an absolute path in home directory
smartypants:test: (pass) should extract an absolute path under home directory
smartypants:test: (pass) should not match when preceded by backtick
smartypants:test: (pass) should not match email addresses
smartypants:test:
smartypants:test: test/config/config.test.ts:
smartypants:test: (pass) loads config with defaults when no files exist [0.91ms]
smartypants:test: (pass) loads JSON config file [2.64ms]
smartypants:test: (pass) loads JSONC config file [0.93ms]
smartypants:test: (pass) merges multiple config files with correct precedence [0.99ms]
smartypants:test: (pass) handles environment variable substitution [0.81ms]
smartypants:test: (pass) handles file inclusion substitution [0.96ms]
smartypants:test: (pass) validates config schema and throws on invalid fields [1.11ms]
smartypants:test: (pass) throws error for invalid JSON [0.80ms]
smartypants:test: (pass) handles agent configuration [1.28ms]
smartypants:test: (pass) handles command configuration [1.02ms]
smartypants:test: (pass) migrates autoshare to share field [0.82ms]
smartypants:test: (pass) migrates mode field to agent field [0.88ms]
smartypants:test: (pass) loads config from .opencode directory [2.40ms]
smartypants:test: (pass) updates config and writes to file [0.70ms]
smartypants:test: (pass) gets config directories [1.42ms]
smartypants:test:
smartypants:test: test/tool/tool.test.ts:
smartypants:test: (pass) tool.glob > truncate [885.74ms]
smartypants:test: (pass) tool.glob > basic [621.82ms]
smartypants:test: 61 |       },
smartypants:test: 62 |     })
smartypants:test: 63 |
smartypants:test: 64 |     // Normalize absolute path to relative for consistent snapshots
smartypants:test: 65 |     const normalizedOutput = result.output.replace(fixturePath, "packages/smartypants/test/fixtures")
smartypants:test: 66 |     expect(normalizedOutput).toMatchSnapshot()
smartypants:test:                                   ^
smartypants:test: error: expect(received).toMatchSnapshot(expected)
smartypants:test:
smartypants:test:
smartypants:test:   "packages/smartypants/test/fixtures/
smartypants:test: -   .devcontainer/
smartypants:test: -     Dockerfile
smartypants:test: -     devcontainer.json
smartypants:test: -     postCreate.sh
smartypants:test: -     postStart.sh
smartypants:test: -   .smarty/
smartypants:test: -     bin/
smartypants:test: -       pants
smartypants:test: -       pants.pyz
smartypants:test: -     tmp/
smartypants:test: -       2025-08-15-mwm-counsel.md
smartypants:test: -       2025-09-05-smartypants-x-sizzle-reel.md
smartypants:test: -       2025-09-23-smarty-pants-onboarding.md
smartypants:test: -       2025-09-23-smarty-pants-onboarding.raw.txt
smartypants:test: -       prompt-composer-README.md
smartypants:test: -   artifacts/
smartypants:test: -     dot-smarty-0.1.0a1.tgz
smartypants:test: -   docker/
smartypants:test: -     smarty-cli.Dockerfile
smartypants:test: -   external/
smartypants:test: -     opencode/
smartypants:test: -       .github/
smartypants:test: -         workflows/
smartypants:test: -           deploy.yml
smartypants:test: -           duplicate-issues.yml
smartypants:test: -           format.yml
smartypants:test: -           guidelines-check.yml
smartypants:test: -           notify-discord.yml
smartypants:test: -           opencode.yml
smartypants:test: -           publish-github-action.yml
smartypants:test: -           publish-vscode.yml
smartypants:test: -           publish.yml
smartypants:test: -           snapshot.yml
smartypants:test: -           stats.yml
smartypants:test: -           test.yml
smartypants:test: -           typecheck.yml
smartypants:test: -       .opencode/
smartypants:test: -         agent/
smartypants:test: -           docs.md
smartypants:test: -           git-committer.md
smartypants:test: -         command/
smartypants:test: -           commit.md
smartypants:test: -           hello.md
smartypants:test: -       packages/
smartypants:test: -         console/
smartypants:test: -           app/
smartypants:test: -             src/
smartypants:test: -               routes/
smartypants:test: -                 debug/
smartypants:test: -                   index.ts
smartypants:test: -                 stripe/
smartypants:test: -                   webhook.ts
smartypants:test: -                 zen/
smartypants:test: -                   v1/
smartypants:test: -                     messages.ts
smartypants:test: -                     responses.ts
smartypants:test: -                   handler.ts
smartypants:test: -                 [...404].css
smartypants:test: -                 [...404].tsx
smartypants:test: -                 discord.ts
smartypants:test: -                 workspace.css
smartypants:test: -                 workspace.tsx
smartypants:test: -           function/
smartypants:test: -             src/
smartypants:test: -               auth.ts
smartypants:test: -               log-processor.ts
smartypants:test: -             package.json
smartypants:test: -             sst-env.d.ts
smartypants:test: -             tsconfig.json
smartypants:test: -           resource/
smartypants:test: -             bun.lock
smartypants:test: -             package.json
smartypants:test: -             resource.cloudflare.ts
smartypants:test: -             resource.node.ts
smartypants:test: -             sst-env.d.ts
smartypants:test: -             tsconfig.json
smartypants:test: -           scripts/
smartypants:test: -             src/
smartypants:test: -               backfill-usage-provider.ts
smartypants:test: -               reset.ts
smartypants:test: -             .gitignore
smartypants:test: -             package.json
smartypants:test: -             sst-env.d.ts
smartypants:test: -             tsconfig.json
smartypants:test: -         function/
smartypants:test: -           src/
smartypants:test: -             api.ts
smartypants:test: -           package.json
smartypants:test: -           sst-env.d.ts
smartypants:test: -           tsconfig.json
smartypants:test: -         identity/
smartypants:test: -           avatar-dark.png
smartypants:test: -           avatar-light.png
smartypants:test: -           logo-dark.svg
smartypants:test: -           logo-light.svg
smartypants:test: -           logo-ornate-dark.svg
smartypants:test: -           logo-ornate-light.svg
smartypants:test: -           logo-square-dark.svg
smartypants:test: -           logo-square-light.svg
smartypants:test: -           logomark-dark.svg
smartypants:test: -           logomark-light.svg
smartypants:test: -         plugin/
smartypants:test: -           src/
smartypants:test: -             example.ts
smartypants:test: -             index.ts
smartypants:test: -             shell.ts
smartypants:test: -             tool.ts
smartypants:test: -           tsconfig.json
smartypants:test: -         sdk/
smartypants:test: -           stainless/
smartypants:test: -             generate.ts
smartypants:test: -             stainless-workspace.json
smartypants:test: -             stainless.yml
smartypants:test: -           .gitignore
smartypants:test: -       patches/
smartypants:test: -         @solidjs%2Fstart@1.1.7.patch
smartypants:test: -       specs/
smartypants:test: -         project.md
smartypants:test: -       AGENTS.md
smartypants:test: -       bun.lock
smartypants:test: -       bunfig.toml
smartypants:test: -       opencode.json
smartypants:test: -       sst-env.d.ts
smartypants:test: -       sst.config.ts
smartypants:test: -       tsconfig.json
smartypants:test: -       turbo.json
smartypants:test: -   .envrc
smartypants:test: -   .gitmodules
smartypants:test: -   .sops.yaml
smartypants:test: -   AGENTS.md
smartypants:test: -   CLAUDE.md
smartypants:test: -   PLAN_OPENCODE.md
smartypants:test: -   README.md
smartypants:test: -   SCRATCH.md
smartypants:test: -   SMARTY_PANTS_MVP.md
smartypants:test: -   logos.txt
smartypants:test: +   example/
smartypants:test: +     broken.ts
smartypants:test: +     cli.ts
smartypants:test: +     ink.tsx
smartypants:test:   "
smartypants:test:
smartypants:test:
smartypants:test: - Expected  - 136
smartypants:test: + Received  + 4
smartypants:test:
smartypants:test:       at <anonymous> (/Users/paulbettner/Projects/smarty-dev/.worktrees/opencode-fixes/packages/smartypants/test/tool/tool.test.ts:66:30)
smartypants:test: (fail) tool.ls > basic [591.46ms]
smartypants:test:
smartypants:test: test/tool/edit.test.ts:
smartypants:test: (pass) EditTool Replacers > case 0 [0.05ms]
smartypants:test: (pass) EditTool Replacers > case 1 [0.12ms]
smartypants:test: (pass) EditTool Replacers > case 2
smartypants:test: (pass) EditTool Replacers > case 3
smartypants:test: (pass) EditTool Replacers > case 4 [0.03ms]
smartypants:test: (pass) EditTool Replacers > case 5 [0.34ms]
smartypants:test: (pass) EditTool Replacers > case 6 [0.05ms]
smartypants:test: (pass) EditTool Replacers > case 7 [0.01ms]
smartypants:test: (pass) EditTool Replacers > case 8 [0.08ms]
smartypants:test: (pass) EditTool Replacers > case 9 [0.03ms]
smartypants:test: (pass) EditTool Replacers > case 10
smartypants:test: (pass) EditTool Replacers > case 11
smartypants:test: (pass) EditTool Replacers > case 12 [0.02ms]
smartypants:test: (pass) EditTool Replacers > case 13 [0.30ms]
smartypants:test: (pass) EditTool Replacers > case 14 [0.02ms]
smartypants:test: (pass) EditTool Replacers > case 15 [0.02ms]
smartypants:test: (pass) EditTool Replacers > case 16 [0.02ms]
smartypants:test: (pass) EditTool Replacers > case 17
smartypants:test: (pass) EditTool Replacers > case 18
smartypants:test: (pass) EditTool Replacers > case 19
smartypants:test: (pass) EditTool Replacers > case 20 [0.03ms]
smartypants:test: (pass) EditTool Replacers > case 21
smartypants:test: (pass) EditTool Replacers > case 22
smartypants:test: (pass) EditTool Replacers > case 23
smartypants:test: (pass) EditTool Replacers > case 24
smartypants:test: (pass) EditTool Replacers > case 25
smartypants:test: (pass) EditTool Replacers > case 26
smartypants:test: (pass) EditTool Replacers > case 27
smartypants:test: (pass) EditTool Replacers > case 28 [0.03ms]
smartypants:test: (pass) EditTool Replacers > case 29 [0.02ms]
smartypants:test: (pass) EditTool Replacers > case 30
smartypants:test: (pass) EditTool Replacers > case 31
smartypants:test: (pass) EditTool Replacers > case 32
smartypants:test: (pass) EditTool Replacers > case 33
smartypants:test: (pass) EditTool Replacers > case 34
smartypants:test: (pass) EditTool Replacers > case 35
smartypants:test: (pass) EditTool Replacers > case 36
smartypants:test: (pass) EditTool Replacers > case 37
smartypants:test: (pass) EditTool Replacers > case 38 [0.02ms]
smartypants:test: (pass) EditTool Replacers > case 39 [0.02ms]
smartypants:test: (pass) EditTool Replacers > case 40 [0.02ms]
smartypants:test: (pass) EditTool Replacers > case 41 [0.13ms]
smartypants:test: (pass) EditTool Replacers > case 42
smartypants:test: (pass) EditTool Replacers > case 43
smartypants:test: (pass) EditTool Replacers > case 44 [0.10ms]
smartypants:test: (pass) EditTool Replacers > case 45
smartypants:test: (pass) EditTool Replacers > case 46
smartypants:test: (pass) EditTool Replacers > case 47 [0.03ms]
smartypants:test:
smartypants:test: test/tool/bash.test.ts:
smartypants:test: (pass) tool.bash > basic [12.42ms]
smartypants:test: (pass) tool.bash > cd ../ should fail outside of project root [1.67ms]
smartypants:test:
smartypants:test: test/session/fileRegex.test.ts:
smartypants:test: (pass) fileRegex > should extract exactly 12 file references
smartypants:test: (pass) fileRegex > should extract valid/path/to/a/file [0.24ms]
smartypants:test: (pass) fileRegex > should extract another-valid/path/to/a/file [0.01ms]
smartypants:test: (pass) fileRegex > should extract paths ignoring comma after
smartypants:test: (pass) fileRegex > should extract a path with a file extension and comma after
smartypants:test: (pass) fileRegex > should extract a path with multiple dots and comma after
smartypants:test: (pass) fileRegex > should extract hidden directory
smartypants:test: (pass) fileRegex > should extract hidden file
smartypants:test: (pass) fileRegex > should extract a file ignoring period at end of sentence
smartypants:test: (pass) fileRegex > should extract an absolute path with an extension
smartypants:test: (pass) fileRegex > should extract an absolute path without an extension
smartypants:test: (pass) fileRegex > should extract an absolute path in home directory
smartypants:test: (pass) fileRegex > should extract an absolute path under home directory
smartypants:test: (pass) fileRegex > should not match when preceded by backtick
smartypants:test: (pass) fileRegex > should not match email addresses [0.02ms]
smartypants:test:
smartypants:test: 1 tests failed:
smartypants:test: (fail) tool.ls > basic [591.46ms]
smartypants:test:
smartypants:test:  125 pass
smartypants:test:  1 fail
smartypants:test:  snapshots: 1 failed
smartypants:test:  187 expect() calls
smartypants:test: Ran 126 tests across 8 files. [8.05s]
smartypants:test: error: script "test" exited with code 1

 Tasks:    0 successful, 1 total
Cached:    0 cached, 1 total
  Time:    8.197s
Failed:    smartypants#test succeeds in CI
- Update tool.ls snapshot for new fixture path
ci: enable turbo test + snapshot update
…ment conditions for workspace imports

- Run tests with --conditions=development so @smartypants-ai/sdk resolves to TS sources
- Point list test to fixtures/example for consistent tree; update snapshot
ci(test): fix workspace resolution + stable fixtures snapshot
ci(test): stabilize ListTool test (no snapshot)
…omConditions=['development'] to plugin tsconfig
ci(typecheck): resolve workspace SDK in plugin via customConditions
…ion to app tsconfig for SDK workspace exports
ci(typecheck): enable development condition in app for SDK exports
ci(typecheck): resolve smartypants workspace imports via bundler resolution
ci: skip snapshot/deploy workflows on forks
ci: disable guidelines-check on forks and make workflow valid
- STATS.md: take upstream
- packages/smartypants/package.json: keep downstream
…25-09-29

integration: merge downstream/fixes + downstream/smarty into dev (conflicts resolved)
docs: local wrapper commands (smarty-dev integration) v2
@paulbettner
Copy link
Copy Markdown
Author

Closing to recreate as a clean PR without fork-specific changes (smartypants branding, langfuse integration, etc). Will reopen with only the history sanitization fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants