Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

@tawnymanticore
Copy link
Collaborator

@tawnymanticore tawnymanticore commented Jun 18, 2025

…espace

What does this PR do?

  1. When using the Raw JSON Mode (used it for specifying multi-turn), I spent a fair bit of time debugging why the Run methods weren't working. it would throw nebulous errors saying the JSON schema was wrong, when in actuality it was because I was pasting pretty printed JSON and it expected real JSON. Makes sense in retrospect, but easily solved by whitespace trimming.
  2. Adding a comment in the error logs that the Title key is not the key of the JSON but just for something pretty as that was confusing. eg. If your schema has {"chat": {"title": "multi_turn_conversation"}}, then "chat" is the key, and multi_turn_conversation isn't used for anything.

Checklists

  • Tests have been run locally and passed
  • New tests have been added to any work in /lib

Summary by CodeRabbit

  • Improvements

    • Clearer, more helpful JSON parsing error messages (includes trimmed input previews and parser error details).
    • Better handling of whitespace around JSON strings for arrays/objects to accept pretty-printed and compact formats.
  • Tests

    • Added tests verifying JSON array-string parsing for both multi-line (pretty) and single-line formats.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jun 18, 2025

Walkthrough

Massive multi-area update: desktop app refactor (instance-based DesktopApp, tray, server wiring, installers, scripts), new and expanded studio_server APIs (tools, providers, import, data-gen, evals, tests), extensive web UI additions (stores, components, types, icons, styling), CI/workflow additions, docs/branding updates, and targeted utility/test improvements for JSON schema parsing.

Changes

Cohort / File(s) Change Summary
JSON schema utils & tests
app/web_ui/src/lib/utils/json_schema_editor/json_schema_templates.ts, app/web_ui/src/lib/utils/json_schema_editor/json_schema_templates.test.ts
Trim whitespace before parsing JSON for array/object properties; enrich parse/type-mismatch error messages; add tests for pretty-printed and compact JSON-array string inputs.
Desktop app refactor & tooling
app/desktop/desktop.py, app/desktop/desktop_server.py, app/desktop/dev_server.py, app/desktop/custom_tray.py, app/desktop/build_desktop_app.sh, app/desktop/WinInnoSetup.iss, app/desktop/pyproject.toml, app/desktop/linux_installer.sh, app/desktop/custom_tray.py
Replace global/threaded pattern with instance-based DesktopApp and lifecycle methods; propagate tk_root through server config; dynamic pystray base types; packaging/build script and metadata updates; added Linux installer and cert setup adjustments.
Studio server APIs & tests
app/desktop/studio_server/*.py, app/desktop/studio_server/test_*.py (many files: tool_api.py, provider_api.py, data_gen_api.py, eval_api.py, finetune_api.py, import_api.py, repair_api.py, settings_api.py, setup_certs.py, correlation_calculator.py, tests: test_provider_api.py, test_data_gen_api.py, test_eval_api.py, test_import_api.py, ... )
New/expanded APIs: external tool servers (tool_api), provider/embedding model integrations, data-generation endpoints and input model changes, eval score summaries and usage metrics, import API (Tk file picker), SSL cert handling, correlation edge-case guards; many accompanying tests and test updates.
Web UI stores, components & types
app/web_ui/src/lib/stores/**, app/web_ui/src/lib/ui/**, app/web_ui/src/lib/types.ts, app/web_ui/src/lib/ui/icons/*, app/web_ui/src/lib/ui/run_config_component/**, app/web_ui/src/lib/ui/*
Large additions/refactors: many new Svelte UI components (buttons, dialogs, selects, carousels, icons), numerous stores (runs, prompts, tags, rag progress, extractors, recent models, tools, index DB changes), updated types and utilities, UI wiring for tool selectors, run-config flows, embedding/model helpers, and style tweaks.
Web UI build, lint, and scripts
app/web_ui/package.json, app/web_ui/.eslintrc.cjs, app/web_ui/src/lib/check_schema.sh, app/web_ui/src/config.ts, app/web_ui/src/app.css
Added build_quiet script, bumped deps, added @floating-ui/dom dependency; disallow console.log rule; OpenAPI schema check script; updated site base URL constant; CSS to hide number spinners.
CI / GitHub Workflows
.github/workflows/* (new/updated: coverage.yml, check_api_bindings.yml, debug_detector.yml, build_docs.yml, format_and_lint.yml, build_desktop.yml, windows_release_build.yml, publish_remote_config.yml, test_count.yml)
New coverage and debug-detector workflows; API bindings and schema checks; guards and conditional job controls; tooling and step tweaks (misspell download, Python 3.13/uvx changes), Inno Setup action version updates.
Docs, repo config, and metadata
README.md, AGENTS.md, CONTRIBUTING.md, .cursor/rules/project.mdc, .cursorrules, .gitignore, .vscode/settings.json, .github/ISSUE_TEMPLATE/*
Rebrand and domain updates to kiln.tech, new project overview file, many documentation edits and additions, pre-commit hook instructions, .gitignore update, VS Code TypeScript settings, and issue-template URL fixes.
Tests & test scaffolding (UI/desktop/web)
app/desktop/test_desktop.py, app/desktop/studio_server/test_*, app/web_ui/src/lib/stores/*test.ts, app/web_ui/src/lib/stores/index_db_store.test.ts, app/web_ui/src/lib/stores/recent_model_store.test.ts
New and expanded unit/integration tests for desktop lifecycle, provider APIs, data-gen/eval features, store behaviors (indexedDB API change), recent model MRU logic, and import API tests.

Sequence Diagram(s)

sequenceDiagram
    %% DesktopApp lifecycle (high-level)
    participant User
    participant DesktopApp
    participant DesktopServer
    participant Tray
    participant Browser

    User->>DesktopApp: start()
    DesktopApp->>Tray: run_tray()
    DesktopApp->>DesktopServer: start server (tk_root, port)
    DesktopServer->>DesktopApp: server ready
    DesktopApp->>Browser: show_studio() (after delay)
    Note right of DesktopApp: Mainloop (Tk) runs
    alt user quits
        User->>DesktopApp: quit_app()
        DesktopApp->>Tray: shutdown
        DesktopApp->>DesktopServer: stop server
        DesktopApp->>DesktopApp: on_quit()
    end
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Rationale: Very large, heterogeneous changes touching desktop lifecycle, server APIs, CI, many web UI stores/components, types, and extensive new tests. Review requires cross-area reasoning and careful verification of new public APIs and lifecycle interactions.

Possibly related PRs

  • Improve fancy select #399 — related UI work on fancy_select (Floating UI integration and positioning), directly overlaps web UI component changes and dependency bump.
  • Add "Add Tools" Screen #522 — related tool-management backend/UI changes; overlaps tool_api and tools selector wiring.
  • Data gen: store state, better UI #426 — indexedDBStore API change to return { store, initialized } and corresponding test updates; directly related to web UI store refactors.

Suggested labels

codex

Poem

"I hopped through code at break of dawn,
Rearranged the trays and fawned upon
New stores, new APIs, and tests that skate—
I trimmed your JSON, fixed the crate.
A tiny rabbit cheers the merge: hooray! 🐇💻"

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Description Check ⚠️ Warning The description provides a clear “What does this PR do?” section and confirms tests, but it omits the “Related Issues” and “Contributor License Agreement” sections required by the repository’s template. Please add a “## Related Issues” section linking any relevant issue numbers and include the Contributor License Agreement statement exactly as specified in the template to confirm agreement with the CLA.
Docstring Coverage ⚠️ Warning Docstring coverage is 31.11% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (1 passed)
Check name Status Explanation
Title Check ✅ Passed The title accurately describes the primary change by highlighting the issue with pretty-printed JSON in Raw JSON Mode and the solution to trim whitespace, making it clear and directly related to the core update without extraneous detail.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch 06172025-rawJSONMode-qol

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

commit 015e4a419ef8f1c20aca309d8ec98f9828adc2b8
Merge: d9d92929 f0cd24c1
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Oct 16 00:42:15 2025 +0800

    Merge pull request #709 from Kiln-AI/leonard/kil-128-the-add-document-screen-should-let-me-add-tags

    feat: allow picking tags when uploading documents

commit f0cd24c16f78bd4924759762a0001b502691df2a
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Oct 16 00:22:02 2025 +0800

    cr: tooltip

commit e40b7143da0c00baace2b0a53383fdd6cdab81a3
Merge: 89c798c6 d9d92929
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 15 18:43:31 2025 +0800

    Merge branch 'main' of github.com:Kiln-AI/Kiln into leonard/kil-128-the-add-document-screen-should-let-me-add-tags

commit d9d929291a3bc32fcc643072e90cabfa64d96e49
Merge: 3efc0cf2 d3ac25aa
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 15 18:42:09 2025 +0800

    Merge pull request #654 from Kiln-AI/leonard/kil-35-clone-option-for-search-tools

    feat: clone rag config

commit d3ac25aa49ca7ea42de58a35213b7ec685728fd8
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 15 18:31:41 2025 +0800

    fix: formatter on rag config table overview

commit 3efc0cf2664d1ab54cecaa8371b198b9a0118b41
Merge: 02b0cca5 553ba4fc
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 15 02:27:38 2025 -0700

    Merge pull request #726 from Kiln-AI/sfierro/generate_samples_fix

    Fix run config not found error in generate sample

commit 02b0cca5ff6ce76ac7fd088985f4162476543a15
Merge: 7772b79d a4a8cd9f
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 15 02:22:55 2025 -0700

    Merge pull request #723 from Kiln-AI/sfierro/tools_property_list

    [KIL-110] Add Tools to Dataset Run Properties

commit 553ba4fc27a39fd995a32419ed5d39cafb8973d4
Merge: c1803186 7772b79d
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 15 02:18:19 2025 -0700

    merged main

commit 89c798c642dec0cdfcc7d1751025faa4318918f7
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 15 14:15:28 2025 +0800

    refactor: remove unnecessary project_id check

commit cb20be674f168dafbbef769852e42c901167cc7f
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 15 14:01:31 2025 +0800

    cr: use headeronly formelement, move spacing around

commit 7772b79df3d46b9975aa27d400d2caf4fd779a85
Merge: ddb13437 2ee6826e
Author: Steve Cosman <[email protected]>
Date:   Tue Oct 14 17:26:47 2025 -0400

    Merge pull request #690 from Kiln-AI/scosman/cleanup_height

    fix ugly multi type parameter

commit ddb13437fdca24a661e402d219248112d87b23ab
Merge: 8bcb0ac9 f4325a52
Author: Steve Cosman <[email protected]>
Date:   Tue Oct 14 17:20:00 2025 -0400

    Merge pull request #727 from Kiln-AI/scosman-patch-1

    Update README.md

commit f4325a52d5aa7c9d5955ec902f953c4e4ae889c0
Author: Steve Cosman <[email protected]>
Date:   Tue Oct 14 16:36:35 2025 -0400

    Update README.md

commit 1bbe0719d0050a37005b90c15fd3ff6ea4e86eaf
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Oct 14 16:56:09 2025 +0800

    fix: chunker options formatting got broken during conflict resolution

commit ad3325cfe17bb468d927bd95224570641780ebf6
Merge: 7164d339 8bcb0ac9
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Oct 14 16:37:59 2025 +0800

    Merge branch 'main' of github.com:Kiln-AI/Kiln into leonard/kil-35-clone-option-for-search-tools

commit df689ac8e27c40b257941c26d7d75a7f5be49262
Merge: 613adcf0 8bcb0ac9
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Oct 14 16:34:20 2025 +0800

    Merge branch 'main' of github.com:Kiln-AI/Kiln into leonard/kil-128-the-add-document-screen-should-let-me-add-tags

commit 8bcb0ac90c01083c00cc3ca7ac12477b400bc62a
Merge: 6a80d3c0 cca7a0c2
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Oct 14 13:07:48 2025 +0800

    Merge pull request #725 from Kiln-AI/leonard/kil-153-refactor-structure-of-synth-data

    refactor: synth data page become routing entry point to different modes

commit cca7a0c2fd26cb0be008eed687bbe24feaa0dcaa
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Oct 14 12:51:05 2025 +0800

    refactor: better backward compatibility with resume feat

commit 808c611d49567caba24be8626fbe6e21d8df2647
Merge: c8995878 6a80d3c0
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Oct 14 11:58:00 2025 +0800

    Merge branch 'main' of github.com:Kiln-AI/Kiln into leonard/kil-153-refactor-structure-of-synth-data

commit 6a80d3c0136e270f1911caf059a5efc15437833c
Merge: ef3d0ec7 9a907780
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Oct 14 11:35:02 2025 +0800

    Merge pull request #724 from Kiln-AI/leonard/kil-152-refactor-consolidate-synth-icon-components

    refactor: extract some icons into components

commit c1803186bc0b82f173fe3e46108fcf21e828c7bf
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 13 13:42:18 2025 -0700

    moved error up higher

commit 7d52400acebaad04f9773ddd49d4f7d18d777888
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 13 13:39:49 2025 -0700

    potential fix

commit 7164d3391ece442d8f6b82e7c8a173f819fc9af7
Merge: 74d55257 ef3d0ec7
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Oct 13 20:27:06 2025 +0800

    Merge branch 'main' of github.com:Kiln-AI/Kiln into leonard/kil-35-clone-option-for-search-tools

commit 613adcf065db35a7f2f91a52671f5a461ab8da69
Merge: 5d348fd8 ef3d0ec7
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Oct 13 20:20:27 2025 +0800

    Merge branch 'main' of github.com:Kiln-AI/Kiln into leonard/kil-128-the-add-document-screen-should-let-me-add-tags

commit c8995878ff2e3b88ee8f42482e65c7153279235c
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Oct 13 20:16:11 2025 +0800

    fix: coderabbit feedback

commit 631e83c8d70b76656f15856e0c571020fa292c7a
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Oct 13 19:56:13 2025 +0800

    refactor: main synth data page becomes routing layer to synth mode subpage

commit 8bf11e0334b5a595506239ed4f515f93d1174cdc
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Oct 13 19:45:56 2025 +0800

    refactor: move current synth data main page into synth path

commit 9a907780c866da12bfb099aae8232a507aaef533
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Oct 13 18:55:08 2025 +0800

    refactor: clean up icon components for consistency

commit 084f7beaae3eef2425720602423a93204f82825a
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Oct 13 18:53:39 2025 +0800

    refactor: move icons

commit b177a38b0004af68c227e3f65fbef016e0c8ab7b
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Oct 13 18:45:42 2025 +0800

    refactor: extract file, eval, finetune icons into own component

commit 9350f2f0ee92972fba9bd4e53c46faf7ea295aee
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Oct 13 18:22:24 2025 +0800

    refactor: use fileicon component instead of inline svg in existing components

commit a4a8cd9f1574a66138b7e6ed96563bc0f4e5da0c
Author: Sam Fierro <[email protected]>
Date:   Sun Oct 12 18:05:59 2025 -0500

    feedback

commit bda69e1c64cd9ae0ed3413c1f8c1a27d0e81c676
Author: Sam Fierro <[email protected]>
Date:   Sun Oct 12 17:30:43 2025 -0500

    tools are listed in relevant property lists as badges with corresponding links

commit ef3d0ec7f403046258dfcaf231290e40d7b8ea0a
Merge: 130b43fc 3835d8fb
Author: Sam Fierro <[email protected]>
Date:   Sun Oct 12 12:24:15 2025 -0700

    Merge pull request #722 from Kiln-AI/sfierro/avail_models_infinite_loop_fetch

    [KIL-75] Set state to error_loading to avoid re-fetching in a loop

commit 130b43fc2dbd972f63c8f3387e8a5fd013241c11
Merge: eda17fa5 8e403016
Author: Leonard Q. Marcq <[email protected]>
Date:   Sat Oct 11 12:27:17 2025 +0800

    Merge pull request #707 from Kiln-AI/leonard/kil-81-add-dynamic-tags-list-to-docs

    feat: add dynamic doc tags

commit 3835d8fb493a402dd3a58fbb862b85c910cd1d93
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 10 17:02:54 2025 -0700

    set state to error loaded to avoid re-fetching in a loop

commit eda17fa56b3ac2b1550e2ee6526ab1f6c980da9d
Merge: a5d3e556 a15dbeda
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 10 14:13:06 2025 -0700

    Merge pull request #719 from Kiln-AI/sfierro/sdg_run_configs

    [KIL-145] Refactor SDG generate outputs dialog to use new RunConfigComponent

commit a15dbeda80abae01988d9d889024d3bc380cb45a
Merge: ea2785fb a5d3e556
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 10 13:46:17 2025 -0700

    Merge branch 'main' into sfierro/sdg_run_configs

commit a5d3e556bcc6e1b2ed85b1a68db9d598472b2580
Merge: 710d2aa2 8ca44627
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 10 13:45:36 2025 -0700

    Merge pull request #718 from Kiln-AI/sfierro/refactor_models_dropdown

    Refactor AvailableModelsDropdown to take in a settings object

commit 710d2aa2e479f63fab5a2e042f2530b1beeaa1c8
Merge: 0bf61a5f 3036061f
Author: chiang-daniel <[email protected]>
Date:   Fri Oct 10 11:44:36 2025 -0700

    Merge pull request #706 from Kiln-AI/dchiang/KIL-85/clean-tool-api-test

    Clean up tool api test.

commit 0bf61a5f3fab0710ad54e3e840c73ddc299da68e
Merge: 5afc5d53 5f5734ce
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 10 13:48:46 2025 +0800

    Merge pull request #704 from Kiln-AI/leonard/kil-67-semantic-chunking

    feat: semantic chunking

commit 5f5734ce88436be38500c0287b4173482556e831
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 10 12:52:56 2025 +0800

    chore: remove outdated comment

commit ea2785fb0a6b1d8c9ed592d15b0d280876437fdd
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 9 15:29:25 2025 -0700

    analytics fixes and UT fixes

commit 5afc5d5359569779627218c03a825ebcecf6a0e3
Merge: bc69f4d8 5bd49691
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 9 14:58:55 2025 -0700

    Merge pull request #703 from Kiln-AI/sfierro/remove_eval_run_config_default

    Fixes [KIL-125] Remove eval run config default

commit 2040399ce373aeb580d64f1c9c2a06a93135a1f7
Merge: 27fa037f 8ca44627
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 9 14:46:56 2025 -0700

    Merge branch 'sfierro/refactor_models_dropdown' into sfierro/sdg_run_configs

commit 8ca446276963cf7d05963169eff9e0008f88d352
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 9 14:46:37 2025 -0700

    check requires structured output in run config component not caller

commit 27fa037fac77d3291c0b3829f3f891e97ff4defe
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 9 14:42:44 2025 -0700

    use run config component in output dialog for sdg

commit 5bd49691d3ff0030eff2851d35526ea06276b966
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 9 14:34:30 2025 -0700

    feedback

commit a2f886826d50592bbdc08fb077f23ac1e468a68c
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 9 14:33:56 2025 -0700

    feedback

commit 7cc0e945b265558263f35ce174929c95f9fc1ba9
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 9 14:23:43 2025 -0700

    bug fix

commit 9a11c9673b4a7f64d3dc4080368cd11c149e72fa
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 9 14:21:06 2025 -0700

    fixes

commit e424491d5039afebb88df67b690f61eeb1aa1925
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 9 14:06:04 2025 -0700

    model dropdown setings

commit bc69f4d89bd9aa844aa5955f7275a0d1eebb8bdb
Merge: f57e0180 99b4b6d9
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 10 03:52:06 2025 +0800

    Merge pull request #715 from Kiln-AI/leonard/kil-126-add-vision-as-a-feature-to-the-model-library

    feat: filter models by vision in model catalog

commit f57e0180c144e61c738336b794223418b546d334
Merge: f8cb760f d0577d04
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 10 03:51:07 2025 +0800

    Merge pull request #656 from Kiln-AI/leonard/clear-fs-cache-on-extraction-delete

    fix: clear fs cache on user-initiated extraction deletion

commit f8cb760f486acadd16a3c824811b38f0ac1ae63b
Merge: fe8ce4f7 4029ffda
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 10 03:50:08 2025 +0800

    Merge pull request #716 from Kiln-AI/leonard/kil-129-processing-documents-sidebar-tip-should-not-have-progress

    fix: update sidebar progress ui during processing

commit fe8ce4f7894b8ac5cc3e848dbaeee82123a045bb
Merge: adb3dd94 0ec6f4e2
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 10 03:49:44 2025 +0800

    Merge pull request #711 from Kiln-AI/leonard/kil-138-feat-filtering-docs-by-tag-in-loaders

    refactor: filter docs by tags when traversing in rag loader

commit 8e4030163ebe3276aab37a259c14ca33b92b0df4
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 10 03:39:52 2025 +0800

    refactor: store errors happening in store inside a writable

commit 5d348fd860f9ffcf3cec72f485536f9d40a01926
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 8 16:59:55 2025 +0800

    fix: coderabbit feedback

commit f61765363c3716bb72bad0f32a54600a81ec944f
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 8 18:04:37 2025 +0800

    fix: specify invalidation when reloading tags after file upload

commit 44568eff22160f53e69ca13d684886c633e50d3b
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 8 14:53:13 2025 +0800

    feat: allow tag picking in upload dialog

commit 9af3d5e3fe5b33cc8e68a10304b69f19b504f9c5
Merge: 36733842 adb3dd94
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 10 03:20:06 2025 +0800

    Merge branch 'main' of github.com:Kiln-AI/Kiln into leonard/kil-81-add-dynamic-tags-list-to-docs

commit adb3dd9434bdde68813ecf06e51e31d66f708fc7
Merge: 7f0abc3c 8454216f
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 10 03:15:17 2025 +0800

    Merge pull request #714 from Kiln-AI/leonard/kil-144-fix-warnings-in-rag-tests-due-to-async-generator-returning

    fix: warnings in rag tests

commit bf01b2abc63f417760b889df23afe4fac0ab5ed5
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 9 12:04:05 2025 -0700

    config

commit 2b1cb3bf6143458d2d4d04a193488e46602f3b6b
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 9 11:13:06 2025 -0700

    config

commit ca2174bc68e10f5fea2ab5d45b6c715986316917
Merge: 02f41857 7f0abc3c
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 9 11:12:19 2025 -0700

    Merge branch 'main' into sfierro/remove_eval_run_config_default

commit 7f0abc3c5fdc31e6b1fe7dabc86d26a52b574f9f
Merge: a2dd3c5e d06626fb
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 9 11:11:34 2025 -0700

    Merge pull request #698 from Kiln-AI/sfierro/rename_run_method

    Fixes [KIL-119] Rename run method to run configuration and migrate old run config UI to new components for Evals

commit a2dd3c5edbb55df87363ac91fa96b38d224bbd41
Merge: 21ab7c97 88f6d611
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 10 01:16:41 2025 +0800

    Merge pull request #701 from Kiln-AI/leonard/kil-124-fix-typing-should-catch-invalid-interface-overrides

    fix: typing should catch invalid overrides

commit 88f6d611fb42830ad81cf944289ae7e4cfa462cc
Merge: 72598da3 21ab7c97
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 10 01:04:57 2025 +0800

    Merge branch 'main' of github.com:Kiln-AI/Kiln into leonard/kil-124-fix-typing-should-catch-invalid-interface-overrides

commit 21ab7c9748e5ac26fe7f2171218031da53aedd38
Merge: 6f6af02d 86d15121
Author: Steve Cosman <[email protected]>
Date:   Thu Oct 9 12:54:24 2025 -0400

    Merge pull request #713 from Kiln-AI/scosman/mcp_server_tat_fix

    MCP server fix, and better typing for tools

commit 4029ffdacdf89e1f7982d5720c2bb94ae5262767
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Oct 9 17:06:37 2025 +0800

    fix: safer handling of division by zero risk

commit 99b4b6d95ce883c5a0559a5b2df4b1b815212777
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Oct 9 17:02:38 2025 +0800

    fix: coderabbit feedback

commit 2bad7d07b018eca1fc2bc2b842da419f89dff4d8
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Oct 9 16:56:44 2025 +0800

    fix: update sidebar progress ui during processing

commit 5dd82f5cee68c4f5ec28ec2d8bb664a045dc2343
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Oct 9 16:25:31 2025 +0800

    feat: models catalog filtering by vision

commit 8c25c435036166898edad4eac7f91b71a8bf889d
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Oct 9 16:11:51 2025 +0800

    feat: add explicit vision flag and tag all relevant models

commit 8454216f37b0ed80081015c386e45f1ee674a74b
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Oct 9 12:40:53 2025 +0800

    fix: warnings in rag tests

commit 74d552571faa96774634b341bbcee6367281d6dd
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Oct 9 11:58:12 2025 +0800

    fix: coderabbit feedback

commit 0cd1c65d3eba04943dc75ac2df7905a5c196a55d
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Sep 25 16:45:15 2025 +0800

    refactor: initial name should be Copy Of XXX and not the original name

commit 7516f7f6e97f245788ec02c913776ab0a86c6745
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Sep 25 14:33:10 2025 +0800

    cr feedback

commit 8d61f219a17f36d69f357f64a2e32f99c2c2a7b3
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Sep 25 13:44:48 2025 +0800

    refactor: better loading and error management in embedding form

commit 980291dc42d40393f5bfde021c4e01f9ef218451
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Sep 25 13:40:13 2025 +0800

    feat: add rag config cloning

commit 3d48e56034caf0b603fb77dda061e75d1ab94f44
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Sep 25 13:39:49 2025 +0800

    refactor: break down create rag config page into smaller components

commit 90dccc6f920a68927fe0973ae564dcc9c75c6909
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Sep 25 12:05:27 2025 +0800

    fix: error handling and validation in embedding form

commit d0577d044258853cd5b2b042a52d0ff87243282b
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Sep 25 16:13:28 2025 +0800

    refactor: explicit return type

commit 5e119f623c78a6c71c2d4fecd6f127ba87160a95
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Sep 25 15:53:09 2025 +0800

    test: add more tests

commit d8df8d588a27820e23f4905c0fec71ee8d1b47fd
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Sep 24 15:58:37 2025 +0800

    fix: clear fs cache on user-initiated extraction deletion

commit 72598da3525bcd6d07d42520df2e905b53d03c2e
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Oct 6 19:38:38 2025 +0800

    fix: typing should catch invalid overrides

commit 975f1affca48cb113c25a8ab7bd0d73f48fc2ec6
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Oct 7 20:03:45 2025 +0800

    fix: coderabbit feedback, more val coverage

commit aac72060026cb6f1e8eed623b21f3a836b94c6c8
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Oct 7 19:46:56 2025 +0800

    fix: address coderabbit feedback and reorg tests

commit 01141975a40594bb356b8ef45ba89e43ea291372
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Oct 7 19:06:12 2025 +0800

    test: add more tests

commit ec25709366a9d00114daf11a40aee81eb7837e0e
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 3 14:12:37 2025 +0800

    feat: semantic chunking

commit 36733842ace6b2bfa0f063bfbe179d087e6e1c49
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Oct 9 11:42:26 2025 +0800

    fix: coderabbit feedback

commit 0ec6f4e215bb561e135c7051f1ae5648e61be59b
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 8 17:23:49 2025 +0800

    refactor: filter docs by tags when traversing in rag loader

commit 0055d982743b90a003a9311d2f0aa3a7bd1e4107
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 8 12:30:14 2025 +0800

    feat: add dynamic doc tags

commit 86d151212dc0514c300ae08081645dd52974b4c3
Author: scosman <[email protected]>
Date:   Wed Oct 8 16:57:33 2025 -0400

    remove weird negative

commit 76461dd99d406b2927486768fec0a23a35066fcb
Author: scosman <[email protected]>
Date:   Wed Oct 8 16:52:45 2025 -0400

    Big change:

     - make our tool interface typed. We should never have allowed "Any". It caused downstream bugs where Python objects were serialized into strings in the MCP server.
     - Update lots of code/tests to used new type
     - Fix the MCP server to work as Kiln Task as Tools
     - Remove ugly factory style in favour of Mocks

commit 02f418577f09aa42d24c147c9e8c4ff689002c87
Merge: 861e6e58 d06626fb
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 8 12:51:20 2025 -0700

    Merge branch 'sfierro/rename_run_method' into sfierro/remove_eval_run_config_default

commit d06626fb9a70883ad31983225fac29d6c6d6470c
Merge: 21a6a24a 6f6af02d
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 8 12:21:22 2025 -0700

    merged main

commit 6f6af02d08aaa5b96073ee08c6249c2be3895f1e
Merge: 9c1303c5 b85f2974
Author: Steve Cosman <[email protected]>
Date:   Wed Oct 8 10:49:01 2025 -0400

    Merge pull request #708 from Kiln-AI/leonard/kil-140-fix-ci-fail-due-to-shapely-dependency-via-googlecloud

    fix: pin python to 3.13 in CI

commit 9c1303c5f060861e2dfeaadfe0b32adade415392
Author: scosman <[email protected]>
Date:   Wed Oct 8 10:47:23 2025 -0400

    fix uv.lock and small doc change

commit b85f2974797d7bd0058edae5642eea20ebde5031
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 8 12:51:11 2025 +0800

    fix: pin python to 3.13 in ci

commit 3036061f4117c7ed970c51b9d9e9fd34a5225c49
Author: aiyakitori <[email protected]>
Date:   Tue Oct 7 15:04:43 2025 -0700

    code rabbit

commit a4560db77ca1b0c0fc35e3499c7dd5b125569ea5
Author: aiyakitori <[email protected]>
Date:   Tue Oct 7 11:25:57 2025 -0700

    parameterized connect tests

commit 51c1d0290acc24612fb6556eab5f8c6d49e4e8d5
Author: aiyakitori <[email protected]>
Date:   Tue Oct 7 11:07:13 2025 -0700

    more clean up

commit 8b075fe89b45bf226855bef33ae65f1cf4046324
Author: aiyakitori <[email protected]>
Date:   Tue Oct 7 10:31:35 2025 -0700

    test clean up

commit 997bbc61c2c4d446952a8cb4162f2b408f91213f
Author: aiyakitori <[email protected]>
Date:   Tue Oct 7 10:02:00 2025 -0700

    move imports

commit 377a4746ae0c2f1e56e760565f4d50b7c32d0381
Author: scosman <[email protected]>
Date:   Tue Oct 7 10:44:52 2025 -0400

    Bump version for library release

commit 312f92a6a6a1485d3cb33d067f9366f3208e6b33
Author: scosman <[email protected]>
Date:   Tue Oct 7 10:44:33 2025 -0400

    New docs

commit 70c2f1d3b696f62ca0bcf2e0750ec9644e424d28
Merge: 19e096ba 274656af
Author: Steve Cosman <[email protected]>
Date:   Tue Oct 7 10:31:10 2025 -0400

    Merge pull request #648 from Kiln-AI/codex/add-mcp-server-to-kiln-project

    MCP Server for Kiln Tasks (RAG, Task as Tools)

commit 274656afa378e3a5997ff36f942887254ca3dec0
Author: scosman <[email protected]>
Date:   Tue Oct 7 10:19:19 2025 -0400

    CR feedback

commit 9bc9dfa86ddf35f50320e656bee36d4217273b7a
Author: scosman <[email protected]>
Date:   Tue Oct 7 05:30:20 2025 -0400

    update cursor link

commit 056d84d908391aed37675da4c01f682473d1e715
Author: scosman <[email protected]>
Date:   Tue Oct 7 05:21:46 2025 -0400

    improve list feature

commit 2c3d58d0c17756d07fa0d3c9284414d21bd84877
Author: scosman <[email protected]>
Date:   Tue Oct 7 05:07:26 2025 -0400

    Use our new an improved type everywhere

commit f7e1a10b22c7be365980cbabb2b426a59dee910f
Merge: efbdf8f2 56f03767
Author: scosman <[email protected]>
Date:   Tue Oct 7 05:03:48 2025 -0400

    Merge branch 'main' into codex/add-mcp-server-to-kiln-project

commit efbdf8f2f867b06688ef44fc503269b7b13861ab
Author: scosman <[email protected]>
Date:   Tue Oct 7 04:54:15 2025 -0400

    CR feedback

commit 19e096ba87e0462b87df0980834005e52872265f
Merge: 53b3bf20 f2cfba91
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Oct 7 16:05:54 2025 +0800

    Merge pull request #669 from Kiln-AI/leonard/kil-36-rag-documented-in-python-library

    feat: loader with lancedb cloud support

commit f2cfba91c48afe356c97ac6c15ddf318e1d2450d
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Oct 7 15:00:40 2025 +0800

    refactor: drop base class, improve docs

commit 7dd0d8da396d97bf1de82b99740b88e3136c10b5
Author: aiyakitori <[email protected]>
Date:   Mon Oct 6 19:59:34 2025 -0700

    remove redundant test

commit 4320b875205a55649b5a69ba6316df762d95e128
Author: aiyakitori <[email protected]>
Date:   Mon Oct 6 19:44:18 2025 -0700

    add more tests to validator

commit 4118789155b438dae4c8c90c71a67452c4f34142
Author: aiyakitori <[email protected]>
Date:   Mon Oct 6 19:28:06 2025 -0700

    Remove validator related tests

commit 53b3bf20ce7d2ee6490ff17e6342ccaa0032c99b
Merge: 56f03767 1dce82d4
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 19:17:28 2025 -0700

    Merge pull request #695 from Kiln-AI/sfierro/warn_before_unload_prompts

    Added warn before unload on Create Prompt form

commit 861e6e587bb2ce5f3218644ef20e1e1bff87a733
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 19:09:34 2025 -0700

    max width

commit 90fe505ea8d810c94e032363b1b3e3e9bfba9173
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 18:29:15 2025 -0700

    oops

commit a0ace5c0b810a0f1b0986d835891505a31a06898
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 18:25:23 2025 -0700

    default badge

commit ac6123d6a8d7daccd1cf7952a914d50f38a8e4ac
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 18:17:19 2025 -0700

    fixes

commit 56ad7c3d45a3ca39c5b95b5f3c993c3c01043d0a
Merge: 5a8ce277 21a6a24a
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 18:04:57 2025 -0700

    Merge branch 'sfierro/rename_run_method' into sfierro/remove_eval_run_config_default

commit 21a6a24a8f72996c943ec9844bc7c20e82dae7f9
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 17:57:09 2025 -0700

    throw not set

commit bfe1f2459c763b4598cbc4b29e012db138c90d48
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 17:54:34 2025 -0700

    coderabbit feedback

commit 5a8ce277651bcc49fe34ccc21e9e245bf00e738d
Merge: 0b82f20e a64eda36
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 17:38:05 2025 -0700

    merged parent

commit a64eda3679d549eba63954a51698707aa207731d
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 17:23:20 2025 -0700

    revert winner

commit 37842ad955948d0bc1df6be8501381741fa3f3bb
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 17:21:12 2025 -0700

    fix

commit e562629dad5ba6bed340a3dfc7edc37f8806ba12
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 17:17:32 2025 -0700

    fixes

commit 9845271f294f6b8d78f0d2c8d34dc26a387f88dd
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 16:03:43 2025 -0700

    oops

commit 0b82f20ecddcbf89f8feb9eda8f12c97bb191b9c
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 15:43:38 2025 -0700

    wip

commit cc01683c3a8b361a3af03a29100111a0b8e7f512
Author: Sam Fierro <[email protected]>
Date:   Mon Oct 6 15:43:09 2025 -0700

    reverted winner back to default for judges, fixed bug in compare dropdown where it would set them all to default

commit 56f03767ffc2a6377fb1c4aa2f6476552a749bb2
Author: scosman <[email protected]>
Date:   Mon Oct 6 09:06:42 2025 -0400

    version bump for v0.22.0

commit 9f2ee67b8c8f985f8847ffd39b8835eb754816d6
Author: scosman <[email protected]>
Date:   Mon Oct 6 09:04:24 2025 -0400

    Add analytics to subtasks

commit c5bd63465c694e6321aba275cc14b0d27984eab0
Merge: c67e75d5 226b2ddc
Author: Steve Cosman <[email protected]>
Date:   Mon Oct 6 08:47:43 2025 -0400

    Merge pull request #699 from Kiln-AI/leonard/kil-122-feat-add-glm-46-and-glm-45v

    feat: add GLM 4.5V extractor

commit 226b2ddc8ede2ca32fe9e79fa60c5951867051ca
Author: scosman <[email protected]>
Date:   Mon Oct 6 08:45:07 2025 -0400

    name change

commit c67e75d5ae7449054a0fc851f03104f2030ec206
Merge: 938d4da1 eba94223
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Oct 6 20:17:25 2025 +0800

    Merge pull request #700 from Kiln-AI/leonard/kil-123-fix-tool-interface-changed-broke-ragtool

    fix: kiln tool interface run method change

commit eba94223855b0a3db90b086c156b41f6edfac47b
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Oct 6 18:53:04 2025 +0800

    fix: kiln tool interface run method change

commit 7aae09efccb7890a0616668ccff4f42d81b75dea
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Oct 6 16:34:46 2025 +0800

    feat: add glm4.6 and glm5v

commit 8b015fc67ecaec28fc48c50a746082c8bf37797c
Author: Sam Fierro <[email protected]>
Date:   Sun Oct 5 21:41:03 2025 -0700

    revert tool server change

commit b5d86b7e5a4d19504e9d494db284eec9277ef9c3
Author: Sam Fierro <[email protected]>
Date:   Sun Oct 5 21:35:18 2025 -0700

    coderabbit feedback

commit d8b3d89853259d73cda0771ec351938935b7cf83
Author: Sam Fierro <[email protected]>
Date:   Sun Oct 5 21:15:44 2025 -0700

    coderabbit feedback among other fixes

commit 7861c8116c8c22c61cc33d5335f90897c5a60436
Author: Sam Fierro <[email protected]>
Date:   Sun Oct 5 19:24:52 2025 -0700

    lots of fixes

commit 938d4da1895cc526f9db85286a5d20a5579fb659
Merge: 3795c3d9 92bcbb73
Author: Steve Cosman <[email protected]>
Date:   Sun Oct 5 21:29:14 2025 -0400

    Merge pull request #697 from Kiln-AI/scosman/agents_readme

    Add agents to readme

commit 92bcbb73f44eaa9af5ee041ea414775efa265877
Author: Steve Cosman <[email protected]>
Date:   Sun Oct 5 21:14:03 2025 -0400

    Add agents to readme

commit 3795c3d944bbae63f6f7ed9b5ac4217b68da0308
Merge: a3e1b77f 7f99a143
Author: Steve Cosman <[email protected]>
Date:   Sun Oct 5 20:54:31 2025 -0400

    Merge pull request #696 from Kiln-AI/scosman/glm_4.6

    Add GLM 4.6

commit 7f99a143afea629521c8ab489fa963c5ceff3d25
Author: scosman <[email protected]>
Date:   Sun Oct 5 20:51:26 2025 -0400

    Add GLM 4.6

commit fee4b791c6b33e208032baa7c39b833b49d648eb
Author: scosman <[email protected]>
Date:   Sun Oct 5 20:50:08 2025 -0400

    fix test: reasoning optional doesn't mean it can't be included, it's optional

commit 1dce82d4d56eb60ad2038aa0260a710aa7b5cda8
Author: Sam Fierro <[email protected]>
Date:   Sun Oct 5 15:44:51 2025 -0700

    fix

commit 7e09c18f7a832aeff4896e83ad66f4fd730a8e55
Merge: 04d5a38b a3e1b77f
Author: Sam Fierro <[email protected]>
Date:   Sun Oct 5 15:29:25 2025 -0700

    Merge branch 'main' into sfierro/rename_run_method

commit 04d5a38b2cfef1faf480ba3bfa95ca9389a43900
Merge: 5e72533f d8b0d804
Author: Sam Fierro <[email protected]>
Date:   Sun Oct 5 15:18:36 2025 -0700

    merged main

commit a3e1b77fe087bd6c1c5615625e88ab39cb123d31
Merge: 835e9425 0d4a0ae8
Author: Steve Cosman <[email protected]>
Date:   Sun Oct 5 14:55:54 2025 -0400

    Merge pull request #694 from Kiln-AI/scosman/onboard_v2.1

    Update our intro.

commit 0d4a0ae8f3746e477838d519f6b0f0b48e273735
Author: scosman <[email protected]>
Date:   Sun Oct 5 14:39:02 2025 -0400

    Update our intro.

commit 835e9425c97de68a8fc5536242a63cb2413b8544
Merge: d8b0d804 cefe26d1
Author: Leonard Q. Marcq <[email protected]>
Date:   Sat Oct 4 13:24:30 2025 +0800

    Merge pull request #659 from Kiln-AI/leonard/kil-57-bug-rag-store-stays-there-on-project-switch

    fix: rag store does not clear on project switch

commit d8b0d8042bbf6884062c7b4127c6ae1822d61b09
Merge: 90725ed6 e5283305
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 18:04:42 2025 -0700

    Merge pull request #692 from Kiln-AI/sfierro/tools_selector_fix

    Tools selector properly multiple tool sets of same type

commit 90725ed651078f28dc05939848407b29e14c5d19
Merge: ddd61c0c 436773ab
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 18:03:49 2025 -0700

    Merge pull request #686 from Kiln-AI/sfierro/run_button_fix

    Run page ux improvement

commit ddd61c0cac76c6b698eb7ef51f2e489ad2898148
Merge: 52b701b1 5eac730d
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 18:03:27 2025 -0700

    Merge pull request #691 from Kiln-AI/sfierro/breadcrumbs

    Added missing breadcrumbs

commit 52b701b176c42ee6890e52f078122fac1c359e06
Merge: 961d92b7 687d4b43
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 18:03:08 2025 -0700

    Merge pull request #687 from Kiln-AI/sfierro/tat_links

    Tasks as tools link updates

commit e52833054b9d65006bd611a0317ee98faa1d0dc5
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 17:47:28 2025 -0700

    updated code

commit d3db9eee882d70b9318a46141a28d01debc22bb5
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 17:35:17 2025 -0700

    fixed bug

commit 5eac730d2e090d2bd8d78f513f026fb68d612716
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 17:12:09 2025 -0700

    more breadcrumbs

commit 961d92b78b936f8346da6548aaa3de91d1bf572f
Merge: 585306ff c9a32053
Author: Steve Cosman <[email protected]>
Date:   Fri Oct 3 19:51:28 2025 -0400

    Merge pull request #688 from Kiln-AI/scosman/strip_mcp

    Strip whitespace from descriptions of tools

commit c9a3205345f686af0137bbacd0dbd1d259c30b4c
Author: scosman <[email protected]>
Date:   Fri Oct 3 19:50:11 2025 -0400

    move presentation code to front end

commit 97b972400d3aab5ce033c1638c145a327772561a
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 16:45:04 2025 -0700

    fixed breadcrumbs

commit 2ee6826e5447d8a75950bd7cc90d3902c11b9326
Author: scosman <[email protected]>
Date:   Fri Oct 3 19:41:54 2025 -0400

    better way to prevent classes from being compiled out

commit 6faff580475185c7de9cce1d34be1cf027cdad19
Author: scosman <[email protected]>
Date:   Fri Oct 3 19:38:40 2025 -0400

    fix ugly multi type parameter

commit 585306ff99e7e7a1e281af4c7184d57422c22220
Merge: 723e2883 3cb8cc7a
Author: Steve Cosman <[email protected]>
Date:   Fri Oct 3 19:35:45 2025 -0400

    Merge pull request #689 from Kiln-AI/scosman/tall_plaintext_input

    taller input for plaintext

commit 3cb8cc7ae56fff0f224408075a9efd24278510f0
Author: scosman <[email protected]>
Date:   Fri Oct 3 19:22:00 2025 -0400

    taller input for plaintext

commit e2b55158ba51a07a9ed9428d15d097b43b334b2d
Author: scosman <[email protected]>
Date:   Fri Oct 3 19:18:00 2025 -0400

    Strip whitespace from descriptions of tools

commit 436773ab916f0e1fa7cbff2d74f18e77967278c2
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 16:15:47 2025 -0700

    coderabbit feedback

commit 687d4b4368267e66ec5a88369fe8d6b66720031e
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 16:10:26 2025 -0700

    link update

commit 5e2f32d958332c4502b3d3b2c0018044963817f6
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 15:53:13 2025 -0700

    coderabbit feedback

commit f23adc73252c3c097d0c026977300e606b56bab2
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 15:43:17 2025 -0700

    output cleared and run button back in focus when input changed

commit 723e2883883551f83bccbf01e071e9ac06de1cf9
Merge: 94b9951c f3b2cc36
Author: Steve Cosman <[email protected]>
Date:   Fri Oct 3 16:22:33 2025 -0400

    Merge pull request #684 from Kiln-AI/scosman/fancy_button

    Fancy button for "Create New"

commit 94b9951ccd2d569310b9c0d5a4e29dbfe3b70323
Merge: 04a4b527 f8a1a602
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 13:18:26 2025 -0700

    Merge pull request #685 from Kiln-AI/sfierro/link-weight

    Fixed "Messages" link weight

commit 04a4b527bfc30fde117508fa7872572c01380d70
Merge: 050e10ce 9bf14160
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 13:18:14 2025 -0700

    Merge pull request #683 from Kiln-AI/sfierro/tat-link-update

    Tasks as tools links to Multi-Actor Interaction (aka sub-tasks) instead of general Agents page

commit f3b2cc3645cac10304c482e48159b6f695baa3ca
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 13:17:07 2025 -0700

    fixed empty state

commit f8a1a602bcf8e815d4b27c70aa79d71f73514c6e
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 13:02:20 2025 -0700

    fixed link weight

commit ef946392675696da074514bcecbe3e6ef2fa70f5
Author: scosman <[email protected]>
Date:   Fri Oct 3 15:33:47 2025 -0400

    Fancy button

commit 9bf14160dfaa83290f4566c64a71c8bcf8e33dc9
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 12:22:59 2025 -0700

    link fix

commit be90cdbe75fc48df1794fb3f4524e58ef6a1c100
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 12:07:30 2025 -0700

    fix

commit 050e10cea5c3a211bd437efa292a92a486937c5e
Merge: f22b4fcb 87fda658
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 11:54:51 2025 -0700

    Merge pull request #674 from Kiln-AI/sfierro/tasks_as_tools

    Tasks as Tools

commit cefe26d1be96205706b866073719554bf142af3d
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 3 18:38:56 2025 +0800

    refactor: use update project state helper

commit 81209223daf15882dfb116d903d7f0d48ccc2f74
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 3 18:25:42 2025 +0800

    refactor: remove redundant nesting in store shape

commit 87fda658a00696b2c374510f1a33b61272a8b011
Author: Sam Fierro <[email protected]>
Date:   Fri Oct 3 01:35:08 2025 -0700

    UI bug fixes

commit 9db532a286e04b4446e2787ddc76ea30752e5c90
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 2 23:13:58 2025 -0700

    nit

commit ddf5fc8c717c03457b3c3257ed3751cced8d46c8
Merge: b1ded1dd f22b4fcb
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 2 22:30:47 2025 -0700

    Merge branch 'main' into sfierro/tasks_as_tools

commit b1ded1dd3aebf3a9d721d47ff5d1ff9c8b089898
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 2 22:29:53 2025 -0700

    ut fix

commit ac1b36643f2d41a5dc9f49bbef0f9481861fe9b9
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 2 22:18:58 2025 -0700

    last feedback

commit f22b4fcb9ef04440c656128c69c98e3003bfc1cc
Author: scosman <[email protected]>
Date:   Fri Oct 3 00:58:17 2025 -0400

    make titles more clear on VL models

commit a54cb58901f2ada5cebcf308f142f38e2751df80
Merge: ea0fc467 3e0e3e59
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 3 12:46:39 2025 +0800

    Merge pull request #680 from Kiln-AI/leonard/kil-92-feat-add-local-extractor-model

    feat: more doc extractors and pdf to image pipeline

commit ea0fc467d33562dd5f83adb19c9b4bc81e40afc8
Merge: 2ff12041 c2449132
Author: Steve Cosman <[email protected]>
Date:   Thu Oct 2 23:49:37 2025 -0400

    Merge pull request #671 from Kiln-AI/scosman/rag_headers

    Add titles to Create Rag screen

commit 3e0e3e59f76cff13e3194a733cbdbb1f0125ce7a
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 3 11:38:38 2025 +0800

    refactor: sleep(0) between each page to release event loop

commit 0ba238b7f1b7934587054993c49cc1f733641cce
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Oct 3 11:22:20 2025 +0800

    chore: move models around to have bigger ranked higher

    - rename non-thinking into instruct for Qwen 3 VL
    - move larger model higher
    - move Qwen 2.5 VL above Qwen 2.5
    - move Qwen 3 VL above the equivalent non-VL

commit c3e3d21dabf2da104808ea38fdd0f4d6a6d79beb
Author: scosman <[email protected]>
Date:   Thu Oct 2 23:15:28 2025 -0400

    visual polish

commit 912d963e3a073f3ebae2d0127deffda57e6699a4
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 2 18:43:09 2025 -0700

    read the docs on individual tool page too

commit eac215f1d1cf6d5e930630a8ae64ab489ef46eee
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 2 18:40:27 2025 -0700

    Unit Tests

commit ab457152248a7b4ae305e5964e14b3face2da592
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 2 17:08:07 2025 -0700

    feedback

commit cda291d17bf64d6497f67cee6a15371843043832
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 2 16:27:51 2025 -0700

    feedback

commit 2ff12041f0d4091cddfc5b4c6fe3f06e07b22d83
Merge: e0e593e5 9a89d293
Author: aiyakitori <[email protected]>
Date:   Thu Oct 2 13:58:35 2025 -0700

    Merge pull request #677 from Kiln-AI/aiya/KIL-87/mcp-log

    Capture MCP server stderr

commit 9a89d293b03159e2354b48bfaccec1a36a3b8125
Author: aiyakitori <[email protected]>
Date:   Thu Oct 2 13:47:14 2025 -0700

    use "with" for file lifecycle

commit 9782ee48120333adf3bfd068afcb2b342260ee38
Author: aiyakitori <[email protected]>
Date:   Thu Oct 2 13:38:33 2025 -0700

    CodeRabbit

commit e3a9e71211c94e37b30d624fcfe3154f8aebe491
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 2 13:30:41 2025 -0700

    feedback

commit 99f5c048161b7ee5229db7a0465bb8a936f8742e
Author: scosman <[email protected]>
Date:   Thu Oct 2 12:28:23 2025 -0400

    visual polish

commit e0e593e5a063e1b1e0e935fedae1239dc745c457
Merge: 3644688b ade696f4
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Oct 2 23:59:00 2025 +0800

    Merge pull request #679 from Kiln-AI/leonard/centralize-warning-suppression

commit c4be3383d7e80924906df3473a5efa8325c12f53
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Oct 2 19:45:42 2025 +0800

    fix: allow content to be empty string as pages may be legitimately empty

commit b58eef3297a773415a122108479df1c316e0cb5b
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 1 17:12:14 2025 +0800

    feat: add siliconflow, fireworks, openrouter, together support for qwen2.5 vl

commit 5be9f33d0f4d6ca0caf840579d7c35e328d8b56c
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Sep 30 20:17:00 2025 +0800

    feat: warning modal for ollama template

commit 99a329254ae7b801d0f649fae346c6c993c1ddb3
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Sep 30 16:37:42 2025 +0800

    feat: add qwen2.5 vl via ollama with rag template for local

commit ade696f4f42b0923e7ca4b6e18fb4e071c822f9b
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Oct 2 19:56:54 2025 +0800

    chore: centralize warning suppression in pytest.ini

commit 5ebc2d2208a0743d5a620e029135bb8d40758135
Author: Sam Fierro <[email protected]>
Date:   Thu Oct 2 01:29:42 2025 -0700

    feedback

commit 3644688b96cc2f44e6a048e7de5f90978c52eece
Merge: a88b5035 165ad987
Author: Leonard Q. Marcq <[email protected]>
Date:   Thu Oct 2 12:25:24 2025 +0800

    Merge pull request #675 from Kiln-AI/leonard/kil-6-add-more-embeddings-options-hosted-together-fireworks

    feat: add new embedding models

commit a88b50359e4450927f527de0f4b89caa58e0504f
Merge: cf46e094 db0d5422
Author: Steve Cosman <[email protected]>
Date:   Wed Oct 1 23:01:50 2025 -0400

    Merge pull request #678 from Kiln-AI/scosman/eval_by_id_perf

    Use faster non-iteration method for eval by id

commit fa9390ff169239680bf3f1471c52d6d5a9337f44
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 1 19:27:55 2025 -0700

    feedback

commit 923369b4a5475d498971469256e8702fb5f4049d
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 1 19:13:21 2025 -0700

    revert base adapter

commit fa8a017e25052c472ef7c56fd52f24b341dee270
Merge: dda8c6cb 49d93167
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 1 19:11:14 2025 -0700

    Merge branch 'sfierro/tasks_as_tools' of https://github.com/Kiln-AI/Kiln into sfierro/tasks_as_tools

commit db0d5422a95ea88d36268dc8f4efd10214535b09
Author: scosman <[email protected]>
Date:   Wed Oct 1 19:29:36 2025 -0400

    Use faster non-iteration method for eval by id

commit dda8c6cb59a6954d608ec830b1c4874c76a19bf5
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 1 16:25:08 2025 -0700

    feedback

commit 49d9316764f8d84b64290e26d86830d5dd45a478
Author: scosman <[email protected]>
Date:   Wed Oct 1 17:57:22 2025 -0400

    Fix plus symbol centering (more places)

commit 77d1c9622c785edcf374033f8c7efac23eb7ff26
Author: scosman <[email protected]>
Date:   Wed Oct 1 17:48:46 2025 -0400

    Fix plus symbol centering

commit 148165d0db81c8707404db4fc1deca1bb0457515
Author: aiyakitori <[email protected]>
Date:   Wed Oct 1 14:44:43 2025 -0700

    Add link to view logs

commit f33d363481683d3a8fae50d8184bf020f2327b94
Author: aiyakitori <[email protected]>
Date:   Wed Oct 1 14:30:57 2025 -0700

    Update error rendering

commit bedd4e5c180dfbf9fefc93f91e0ab0b08c667e72
Author: aiyakitori <[email protected]>
Date:   Wed Oct 1 12:50:53 2025 -0700

    use TemporaryFile

commit 57ecfd70eeb6f8e0955e45ab89c3563261ab45cf
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 1 12:00:24 2025 -0700

    ut

commit cf3699d4d12a0375a00765398034294a11cf1ebf
Author: aiyakitori <[email protected]>
Date:   Wed Oct 1 10:49:23 2025 -0700

    Add temp file for local mcp

commit 78bae004cb85d3fdb1c57de6bb1e9b827409b8d8
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 1 01:41:38 2025 -0700

    coderabbit feedback

commit 165ad987a4d4c1fec85ba6597b51833107a0c9eb
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 1 16:29:05 2025 +0800

    chore: shuffle models around to have larger at the top within family

commit a495965e18a4634034d40781d8998abf9691e0c7
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 1 16:26:07 2025 +0800

    chore: gen api bindings

commit fc8ddf0920603503ee21a95238f08be7163155d8
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 1 01:25:18 2025 -0700

    desc

commit 72fa9c974dc006554507a91fe62d21a71f1bed88
Author: Leonard Q. Marcq <[email protected]>
Date:   Wed Oct 1 16:23:34 2025 +0800

    feat: add new embedding models

commit 595e5773c022c696ac2885f57e9da73e581c65a4
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 1 01:20:21 2025 -0700

    ut

commit 262bfdbfc180d635ca77f84ef5977b85cc1dcc6e
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 1 01:19:19 2025 -0700

    fixes

commit bf5d44b012e024c68a0ba02c53b134b32d6c1083
Merge: 68a3a51d 04da02a2
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 1 00:48:09 2025 -0700

    Merge branch 'run_configs' into sfierro/tasks_as_tools

commit 04da02a2e2f3ce1bf4e648a1787fbbcd87f4caaf
Merge: a1ff243f cf46e094
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 1 00:47:55 2025 -0700

    Merge branch 'main' into run_configs

commit 68a3a51da02a7f9e0ddab7dd3f8975508324b7d1
Author: Sam Fierro <[email protected]>
Date:   Wed Oct 1 00:46:27 2025 -0700

    wip

commit dac939d456c4ea506429705d2ef43d79497b875b
Author: Sam Fierro <[email protected]>
Date:   Tue Sep 30 22:52:38 2025 -0700

    buttons in trace

commit 01f7786031b9f86afe22183012960c0469b9a1e6
Author: Sam Fierro <[email protected]>
Date:   Tue Sep 30 19:28:37 2025 -0700

    removed todo comments

commit 2ac9ca195675e93326e351f0d176214adf388ec0
Author: Sam Fierro <[email protected]>
Date:   Tue Sep 30 17:16:52 2025 -0700

    wip

commit ac51557cf7e3828d8e88efbdf1c971afb72c3971
Author: Sam Fierro <[email protected]>
Date:   Tue Sep 30 15:54:05 2025 -0700

    fixed infinite cycle

commit 17fe48cb3e9e7966fc70435356ee086115da05fb
Author: Sam Fierro <[email protected]>
Date:   Tue Sep 30 15:44:37 2025 -0700

    wip

commit ce93efee40d1b7e0bbfd62c156047e84669a951d
Author: Sam Fierro <[email protected]>
Date:   Tue Sep 30 15:37:13 2025 -0700

    feedback

commit 3f8e09db2cf86f4fa52851d6a34ec04ed1b656fb
Author: Sam Fierro <[email protected]>
Date:   Tue Sep 30 01:29:05 2025 -0700

    wip

commit cf46e094698cb25b94e4f29e06cd61bc43bba5bd
Merge: fd311be5 3ea0bca9
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Sep 30 12:21:32 2025 +0800

    Merge pull request #650 from Kiln-AI/leonard/rag-adjustments

    refactor: rag improvements

commit 812ad9824de469bd5f3d90186cba901d6c7e53a2
Author: Sam Fierro <[email protected]>
Date:   Mon Sep 29 21:19:27 2025 -0700

    wip

commit 3ea0bca9f371a529d219f03cdc8c88fc65e6e8eb
Merge: 463efcd7 fd311be5
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Sep 30 12:02:43 2025 +0800

    Merge branch 'main' of github.com:Kiln-AI/Kiln into leonard/rag-adjustments

commit fd311be5a16c95453b5c61f67ad81db7b63d0f53
Merge: 3c6fa88a a5762dee
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Sep 30 11:55:03 2025 +0800

    Merge pull request #657 from Kiln-AI/leonard/kil-39-clean-up-search-tools-rag-table-ui

    refactor: rag config table tool name column

commit 3c6fa88afe98a239a6ac710ea3fd03680e06ffcd
Merge: 7ac44ccc 09339745
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Sep 30 11:54:31 2025 +0800

    Merge pull request #655 from Kiln-AI/leonard/edit-doc-names-description

    feat: allow rename docs and description

commit f2ab4d57d01834f5d2c405d2e87e1225273b52e2
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Sep 30 11:54:04 2025 +0800

    refactor: not rely on deprecated ui state store

commit 463efcd7a591fd86e4ee8da122e1d1ca8b0e8598
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Sep 30 11:50:53 2025 +0800

    fix: wrong condition check

commit fa756ccae00f2671a2f1cc58a7a9fcbb71374220
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Sep 30 10:54:06 2025 +0800

    refactor: not register resize observer if toggle is hidden

commit a5762deea5e7c87c2ea77b557b5784c0370f41e2
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Sep 30 10:33:45 2025 +0800

    refactor: add validation of properties on the frontend

commit 7ac44ccc7c6a2c883b35b0ad285c9e999fcb84a7
Merge: 5c6fb295 0538f04d
Author: Leonard Q. Marcq <[email protected]>
Date:   Tue Sep 30 10:11:05 2025 +0800

    Merge pull request #646 from Kiln-AI/leonard/add-some-models

    chore: add inference and embedding models

commit 78429cdd1ada3effaeee4ee3223096f27bac24f9
Author: Sam Fierro <[email protected]>
Date:   Mon Sep 29 17:40:09 2025 -0700

    wip

commit 5c6fb295f2a5bf01c74aa6619982c7bd9e70e8e6
Merge: 46118ef1 77762f73
Author: Steve Cosman <[email protected]>
Date:   Mon Sep 29 20:30:24 2025 -0400

    Merge pull request #663 from Kiln-AI/scosman/open_project_folder

    Clean up "Manage Project" page: design and open folder buttons

commit c24491325922e30a2fcb4cb2256b7d8e9b0bbcd4
Author: scosman <[email protected]>
Date:   Mon Sep 29 20:22:46 2025 -0400

    Add titles. Fix for https://linear.app/kiln-ai/issue/KIL-42/section-titles-on-create-rag-screen

commit 46118ef1aa4b499d3df89f14ec0bfb1fa05b6130
Merge: 3ed1c07d cbf1925f
Author: Steve Cosman <[email protected]>
Date:   Mon Sep 29 16:58:45 2025 -0400

    Merge pull request #662 from Kiln-AI/scosman/prompt_loading_state

    Use new style loading for dropdown

commit 3ed1c07d5af281db7ebe7ef7176e778d69fad0e1
Merge: 3602beab a2005522
Author: Steve Cosman <[email protected]>
Date:   Mon Sep 29 16:57:55 2025 -0400

    Merge pull request #661 from Kiln-AI/scosman/cleaner_onboarding

    Simplify the onboarding user expereince:

commit a9fad4c7ab6cf86086d358abd69d576d385e1786
Merge: 10d36950 a1ff243f
Author: Sam Fierro <[email protected]>
Date:   Mon Sep 29 13:38:22 2025 -0700

    merged parent

commit 3602beab87b0f2c6a38339164b1ae9da2eb37fcf
Merge: 8334b1e0 0f8b2b93
Author: aiyakitori <[email protected]>
Date:   Mon Sep 29 13:33:38 2025 -0700

    Merge pull request #665 from Kiln-AI/aiya/mcp-session-in-cwd

    Launch stdio server in cache path

commit a1ff243f2e7a963c1558c144f9dd356c1a547b91
Merge: 14ad9fb3 4e785d15
Author: Sam Fierro <[email protected]>
Date:   Mon Sep 29 13:32:40 2025 -0700

    Merge pull request #604 from Kiln-AI/sfierro/default_run_config_ui

    Run Options dropdown to select from saved / default

commit 4e785d1566d763e5c069e7c5284a2a87d5aa1b4d
Merge: f6362b89 14ad9fb3
Author: Sam Fierro <[email protected]>
Date:   Mon Sep 29 13:30:19 2025 -0700

    Merge branch 'run_configs' into sfierro/default_run_config_ui

commit 14ad9fb37b6cef175db01f17e707bd271a258cbc
Merge: 8334b1e0 4510a5ea
Author: Sam Fierro <[email protected]>
Date:   Mon Sep 29 13:29:14 2025 -0700

    Merge pull request #583 from Kiln-AI/sfierro/default_run_config_backend

     Add ability to set a default run config ID to a Task

commit 4510a5eab45dbfdb46e04c2b0527a894f7b21b83
Merge: a4bb962d 8334b1e0
Author: Sam Fierro <[email protected]>
Date:   Mon Sep 29 13:28:20 2025 -0700

    Merge branch 'run_configs' into sfierro/default_run_config_backend

commit 10d36950baf69aa1f249805906d25906b29164c6
Merge: 419e4596 f6362b89
Author: Sam Fierro <[email protected]>
Date:   Mon Sep 29 13:24:29 2025 -0700

    merged parent

commit 0f8b2b93e90329ceab8c8ebeba38bfcc70af6e80
Author: aiyakitori <[email protected]>
Date:   Mon Sep 29 13:11:21 2025 -0700

    clean up

commit b2e802073b58418e8b641f82b5a1427746afd941
Author: aiyakitori <[email protected]>
Date:   Mon Sep 29 13:08:21 2025 -0700

    Revert "only use cached path for windows"

    This reverts commit 0c95502a2b89af60353bfd81e591e736163ccee0.

commit 8334b1e010dc41aac09d19b2107525c458983b1a
Merge: 4d31ccd7 7279d48a
Author: aiyakitori <[email protected]>
Date:   Mon Sep 29 13:05:51 2025 -0700

    Merge pull request #611 from Kiln-AI/aiya/mcp-no-any

    Update ExternalToolServer properties to be a typed dictionary

commit 7279d48ade3530575730c6d4b8699f75c6e47063
Merge: 6684f3e4 650e11c3
Author: aiyakitori <[email protected]>
Date:   Mon Sep 29 12:26:50 2025 -0700

    Merge pull request #666 from Kiln-AI/scosman/types_assert

    New idea for type discriminators

commit 4d31ccd79110a308385c1e5bf468830164122765
Merge: 531e8bf6 34dc5788
Author: aiyakitori <[email protected]>
Date:   Mon Sep 29 11:50:17 2025 -0700

    Merge pull request #664 from Kiln-AI/aiya/increase-timeout-mcp

    Increase MCP timeout to 30s.

commit 531e8bf63c4abd0772a67f92a5bc0e161255cef9
Merge: 9d949c9e 6690cc50
Author: Steve Cosman <[email protected]>
Date:   Mon Sep 29 14:27:58 2025 -0400

    Merge pull request #670 from Kiln-AI/scosman/models_29_09_25

    Sonnet 4.5 and Mistral Medium 3.1

commit 6690cc509448a9d12248ed63d4af6e756a44f62c
Author: scosman <[email protected]>
Date:   Mon Sep 29 14:24:14 2025 -0400

    Add Mistral Medium 3.1 and unsuggest Sonnet 4.5 until a bit more stable

commit 713dca5ebcf32c7317b35c58065d6704d5debffe
Author: scosman <[email protected]>
Date:   Mon Sep 29 13:50:59 2025 -0400

    Add Sonnet 4.5 and Opus 4.1

    Note: weird limitation I had to work around. Top p and temp are mutually exclusive.

commit 5f50a7d7d73e3d3d53c004ec2c5f3ddda088a3c0
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Sep 29 18:05:03 2025 +0800

    docs: add basic lancedb loader example

commit b79e7e0544388220ea512552f981551b10fcca8f
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Sep 29 17:25:42 2025 +0800

    feat: higher level loader with lancedb local and cloud support

commit 9ff6958e091caabc7665cc8c2083e807f7ac1a37
Author: Leonard Q. Marcq <[email protected]>
Date:   Mon Sep 29 17:00:54 2025 +0800

    refactor: extract logic out of lancedb adapter for reuse in ad-hoc use cases

commit 9d949c9e2c30142563f064e530b7c1eb4f113858
Merge: d38a64b5 699fa610
Author: Steve Cosman <[email protected]>
Date:   Sun Sep 28 13:33:20 2025 -0400

    Merge pull request #668 from Kiln-AI/scosman/fix_fine_tuning_template_id

    Fix broken link: the add fine-tuning link

commit 699fa610645a2d08413eb2a5a0adb59640526fc8
Author: scosman <[email protected]>
Date:   Sun Sep 28 13:21:59 2025 -0400

    Fix broken link: the add fine-tuning link was't setting the fine-tuning data gen template

commit 650e11c33191d50f97b506953775d818d5bc214d
Author: scosman <[email protected]>
Date:   Sat Sep 27 08:38:57 2025 -0400

    New idea for types - discriminators in types.ts, which check the type the field is, and trusts the server is doing the right thing.

     - Saves us writing custom discriminators and running at runtime
     - Raises an exception instead of just not running if thei type assertion is wrong
     - Two forms: one that just asserts type, the other that can be used in if blocks (nice for svelte)

    Had to try a few things to find one that worked. This is all new to me.

commit 0c95502a2b89af60353bfd81e591e736163ccee0
Author: aiyakitori <[email protected]>
Date:   Fri Sep 26 23:27:04 2025 -0700

    only use cached path for windows

commit b3f83b8c21fbf0ba61b7118fb1a4400e833266a5
Author: aiyakitori <[email protected]>
Date:   Fri Sep 26 19:54:55 2025 -0700

    launch stdio server in cache path

commit 34dc5788b6616adc57aaa3740671cf0ae1fc6187
Author: aiyakitori <[email protected]>
Date:   Fri Sep 26 15:29:11 2025 -0700

    increase MCP timeout to 30s

commit f6362b89bef35bb4429eca7f89ea4bd08b805b98
Author: Sam Fierro <[email protected]>
Date:   Fri Sep 26 14:17:14 2025 -0700

    last feedback

commit 21d949875bc0db64d41b75fc33898d4d39f15b51
Merge: fa31e780 d38a64b5
Author: Sam Fierro <[email protected]>
Date:   Fri Sep 26 14:09:21 2025 -0700

    merged main

commit 77762f73558b15c7650bfa6f87b793b0bca79165
Author: scosman <[email protected]>
Date:   Fri Sep 26 16:10:41 2025 -0400

    string change

commit fa31e780c068a93a24f127dab7915fd78cbc4d9f
Author: Sam Fierro <[email protected]>
Date:   Fri Sep 26 13:05:26 2025 -0700

    errors

commit 5be1294a6d99bb012d955c1d8c6f995275c3d630
Author: scosman <[email protected]>
Date:   Fri Sep 26 15:33:11 2025 -0400

    string change

commit ecc8eb90371ef960fa0aa18c60de7063175a58ca
Author: scosman <[email protected]>
Date:   Fri Sep 26 15:30:40 2025 -0400

    de-ugly our manage project page

commit 459dd9c4c44cddf54cc5ef927da501a24db39d25
Author: scosman <[email protected]>
Date:   Fri Sep 26 15:19:51 2025 -0400

    Button to open the project folder, from settings

commit 900926b15251ebc2a883c6493b2a86453f1f91bd
Author: Sam Fierro <[email protected]>
Date:   Fri Sep 26 11:58:47 2025 -0700

    fixed last bug

commit cbf1925f1635e4b21a74b91a347aab0762986b26
Author: scosman <[email protected]>
Date:   Fri Sep 26 13:37:39 2025 -0400

    Use new style loading for dropdown

commit d38a64b598bf21939263bed5af8089524c805246
Merge: 80366f11 f5417fa3
Author: Steve Cosman <[email protected]>
Date:   Fri Sep 26 12:49:28 2025 -0400

    Merge pull request #602 from Kiln-AI/scosman/tag_list

    Update the tag selection UI to load real tags, sorted by frequency

commit f5417fa307b90eb64f0f602d24e0cc02313875fc
Merge: 8475d66d 80366f11
Author: scosman <[email protected]>
Date:   Fri Sep 26 12:46:08 2025 -0400

    Merge branch 'main' into scosman/tag_list

commit 8475d66d50dd40fda1cbdfd9003f32c6c7172457
Author: scosman <[email protected]>
Date:   Fri Sep 26 12:43:32 2025 -0400

    CR feedback

commit fbe3d20f56c48c746864c518f461b1a092b36731
Author: scosman <[email protected]>
Date:   Fri Sep 26 12:10:20 2025 -0400

    Add a button for adding tag, daniel feedback

commit 9bb68398ea25076622d5f380ff91a759c938c2c5
Merge: 2907c1b6 9b04d65e
Author: scosman <[email protected]>
Date:   Fri Sep 26 12:01:29 2025 -0400

    Merge branch 'main' into scosman/tag_list

commit 80366f112b1722b83803c667fcb4cb9db0eec46f
Merge: 9b04d65e 769d8454
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Sep 26 23:30:25 2025 +0800

    Merge pull request #660 from Kiln-AI/leonard/kil-58-slow-tagging-issue-from-discord

    perf: much faster tagging on large datasets

commit 769d8454c2c87ee975a2b032bb62881d621268b2
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Sep 26 23:19:58 2025 +0800

    fix: add empty sleep to release event loop after every batch

commit a20055225d01cbd4ce25af1d5ae47e98b80c472d
Author: scosman <[email protected]>
Date:   Fri Sep 26 10:35:46 2025 -0400

    Simplify the onboarding user expereince: the team description and thinking fields are confusing folks. Leave them in edit, but not something we should make people think about on first run

commit c7d64c10ccb354cd7b38c922308df01c5e5beedf
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Sep 26 20:05:45 2025 +0800

    fix: coderabbit feedback on reactive var

commit 108f15aaacceefdbf9201ce8dfa3e604e4086c3a
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Sep 26 20:01:06 2025 +0800

    perf: add benchmark for TaskRun tagging

commit 68037cb36034027017d91f784c523ae0f352ad94
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Sep 26 19:25:20 2025 +0800

    perf: bring changes to document tagging and improve doc tagging tests

commit 579c78fb97d6f01e8057c357f51e2a31e915ac2a
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Sep 26 19:24:48 2025 +0800

    perf: add benchmark to compare single lookups and bulk lookups

commit d080ca168d26a5a6b426a92683a8c52f952356c6
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Sep 26 19:23:33 2025 +0800

    perf: much faster tagging on large datasets

commit af26c1cdbd650658a27f04b4f65c50e7b6876ea2
Author: Leonard Q. Marcq <[email protected]>
Date:   Fri Sep 26 16:25:07 2025 +0800

    refactor: condition rag store state on current project_id

commit 202034842588a0c48899d1801e1ad42dea804b5f
…
@github-actions
Copy link

📊 Coverage Report

Overall Coverage: 92%

Diff: origin/main...HEAD

No lines with coverage information in this diff.


Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 26

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
app/web_ui/src/lib/stores/index_db_store.ts (1)

4-4: Add explicit return type annotation to indexedDBStore

Add the following return type to preserve type safety per coding guidelines:

-export function indexedDBStore<T>(key: string, initialValue: T) {
+export function indexedDBStore<T>(key: string, initialValue: T): {
+  store: import('svelte/store').Writable<T>;
+  initialized: Promise<void>;
+} {
app/desktop/studio_server/provider_api.py (1)

556-585: Add timeouts to all outbound HTTP requests to prevent request-thread hangs

Several requests.get/post calls lack a timeout. On network stalls, these can block FastAPI workers indefinitely and degrade availability. Some functions already include timeouts (e.g., Ollama tags, W&B). Make it consistent.

Suggested pattern:

+REQUEST_TIMEOUT = 5  # seconds

Apply timeout=REQUEST_TIMEOUT to all external calls, e.g.:

- response = requests.post(
+ response = requests.post(
     "https://openrouter.ai/api/v1/chat/completions",
     headers=headers,
-    json={},
+    json={},
+    timeout=REQUEST_TIMEOUT,
   )
...
- response = requests.get("https://api.openai.com/v1/models", headers=headers)
+ response = requests.get("https://api.openai.com/v1/models", headers=headers, timeout=REQUEST_TIMEOUT)
...
- response = requests.get("https://api.groq.com/openai/v1/models", headers=headers)
+ response = requests.get("https://api.groq.com/openai/v1/models", headers=headers, timeout=REQUEST_TIMEOUT)
...
- response = requests.get(
+ response = requests.get(
     f"https://generativelanguage.googleapis.com/v1beta/models?key={key}",
-)
+, timeout=REQUEST_TIMEOUT)
...
- response = requests.get("https://huggingface.co/api/.../resource-groups", headers=headers)
+ response = requests.get("https://huggingface.co/api/.../resource-groups", headers=headers, timeout=REQUEST_TIMEOUT)
...
- response = requests.get("https://api.anthropic.com/v1/models", headers=headers)
+ response = requests.get("https://api.anthropic.com/v1/models", headers=headers, timeout=REQUEST_TIMEOUT)
...
- response = requests.get(f"{endpoint}/openai/files?api-version=2024-08-01-preview", headers=headers)
+ response = requests.get(f"{endpoint}/openai/files?api-version=2024-08-01-preview", headers=headers, timeout=REQUEST_TIMEOUT)
...
- response = requests.get("https://api.cerebras.ai/v1/models", headers=headers)
+ response = requests.get("https://api.cerebras.ai/v1/models", headers=headers, timeout=REQUEST_TIMEOUT)

Optionally centralize in a small helper or a shared requests.Session() for connection pooling.

Also applies to: 627-679, 682-705, 715-747, 749-777, 803-833, 835-865, 867-899, 967-1003

🧹 Nitpick comments (68)
CONTRIBUTING.md (2)

77-77: Clarify pyright guidance wording.

Suggest tightening this bullet to read more naturally, e.g. “Type checking via pyright: use Cursor Python (Cursor) or Pylance (VS Code).”


87-88: Use “set up” as verb.

Here “setup” is used as a verb; switch to “set up HooksMCP” for correct grammar.

app/web_ui/src/app.css (1)

20-30: Scope the spinner override to the JSON editor inputs.

This selector strips the increment/decrement controls from every number input in the app. That’s a UX regression for pages that rely on stepper arrows. Please confine the rule to the Raw JSON mode (e.g., prefix with a container class) so other numeric fields keep their native affordances.

app/web_ui/src/lib/tools.ts (2)

5-5: Consider using camelCase for consistency.

The is_secret field uses snake_case while placeholder uses camelCase. TypeScript convention favors camelCase for all property names.

Apply this diff to align with TypeScript naming conventions:

-  is_secret: boolean
+  isSecret: boolean

Note: This change will require updates in any code that references this field.


1-6: Consider adding JSDoc documentation.

Adding JSDoc comments would improve maintainability by clarifying what "MCP" stands for, the purpose of this type, and how each field is used.

Example documentation:

+/**
+ * Configuration entry for MCP (Model Context Protocol) server parameters.
+ * Represents a key-value pair with additional metadata for UI rendering.
+ */
 export type McpServerKeyValuePair = {
+  /** The parameter key/name */
   key: string
+  /** The parameter value */
   value: string
+  /** Optional placeholder text for UI input fields */
   placeholder: string | null
+  /** Whether this parameter contains sensitive data (e.g., API keys) */
   is_secret: boolean
 }
app/desktop/studio_server/correlation_calculator.py (1)

80-83: LGTM! Consider extracting the duplicate check.

The constant array checks correctly prevent undefined correlation calculations when either variable has no variation. The logic is sound and the use of set() to detect constant arrays is appropriate.

To reduce code duplication, consider extracting the check to a helper method:

def _has_variation(self, x: List[float], y: List[float]) -> bool:
    """Check if both arrays have variation (more than one unique value)."""
    return len(set(x)) > 1 and len(set(y)) > 1

Then in each correlation method, replace the check with:

 x = [score.measured_score for score in self.scores]
 y = [score.human_score for score in self.scores]

-# Check for constant arrays (no variation)
-if len(set(x)) <= 1 or len(set(y)) <= 1:
+if not self._has_variation(x, y):
     return None

Also applies to: 99-102, 116-119

app/web_ui/src/lib/ui/collapse.svelte (1)

25-25: Consider using Tailwind class instead of inline style.

The inline style="min-width: 0" could be replaced with the Tailwind utility class min-w-0 for better consistency with the rest of the component's styling approach.

Apply this diff to use Tailwind class:

-  <div class="collapse-content flex flex-col gap-4" style="min-width: 0">
+  <div class="collapse-content flex flex-col gap-4 min-w-0">
app/web_ui/src/lib/ui/icons/checkmark_icon.svelte (1)

1-10: Consider adding accessibility attributes.

The SVG icon lacks accessibility attributes such as aria-label or role="img" which would help screen readers identify the icon's purpose. While this may be acceptable if parent components always provide context, adding these attributes improves standalone accessibility.

Example enhancement:

-<svg
+<svg
+  role="img"
+  aria-label="Checkmark"
   class="w-full h-full"
   fill="currentColor"
   viewBox="0 0 56 56"
   xmlns="http://www.w3.org/2000/svg"
app/web_ui/src/lib/ui/icons/qna_icon.svelte (1)

1-20: Consider adding accessibility attributes.

Similar to other icon components, this SVG lacks accessibility attributes. Consider adding role="img" and aria-label="Question and Answer" for better screen reader support.

app/web_ui/src/lib/ui/icons/trash_icon.svelte (2)

2-2: Add sizing classes for consistency.

Unlike other icon components in this PR (e.g., checkmark_icon.svelte, qna_icon.svelte), this SVG lacks class="w-full h-full". Adding these classes ensures consistent sizing behavior across all icon components.

Apply this diff:

-<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<svg class="w-full h-full" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">

1-9: Consider adding accessibility attributes.

This icon lacks accessibility attributes such as role="img" and aria-label="Delete" or aria-label="Trash" for screen reader support.

app/web_ui/src/lib/ui/icons/file_icon.svelte (4)

2-2: Use a union type for better type safety.

The kind prop accepts any string, but only "document", "image", "video", and "audio" are valid. Using a union type prevents runtime errors from invalid values and provides better IDE autocomplete.

Apply this diff:

-  export let kind: string
+  export let kind: "document" | "image" | "video" | "audio"

7-136: Add a fallback case for unknown icon kinds.

The conditional chain lacks a final {:else} block. If an invalid kind value is passed, the component renders nothing, which could cause confusion during debugging.

Add a fallback after line 135:

{:else}
  <!-- Fallback for unknown kind -->
  <svg class="h-full w-full" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
    <path d="M3 10C3 6.22876 3 4.34315 4.17157 3.17157C5.34315 2 7.22876 2 11 2H13C16.7712 2 18.6569 2 19.8284 3.17157C21 4.34315 21 6.22876 21 10V14C21 17.7712 21 19.6569 19.8284 20.8284C18.6569 22 16.7712 22 13 22H11C7.22876 22 5.34315 22 4.17157 20.8284C3 19.6569 3 17.7712 3 14V10Z" stroke="currentColor" stroke-width="1.5"/>
  </svg>
{/if}

10-10: Standardize class attribute ordering.

The component inconsistently orders Tailwind classes: some SVGs use class="h-full w-full" while others use the reverse. Standardize to one ordering for consistency (preferably w-full h-full to match other icon components in this PR).

Lines with h-full w-full: 10, 42, 63, 113

Also applies to: 42-42, 63-63, 113-113


7-136: Consider adding accessibility attributes.

Each SVG icon should include role="img" and an appropriate aria-label (e.g., "Document icon", "Image icon") for screen reader support.

app/web_ui/src/lib/ui/icons/eval_icon.svelte (1)

1-39: LGTM! Consider adding accessibility attributes.

The implementation is correct. As with other icon components, consider adding role="img" and aria-label="Evaluation" for improved accessibility.

app/web_ui/src/lib/ui/icons/finetune_icon.svelte (1)

1-68: LGTM! Consider adding accessibility attributes.

The implementation is correct. As with other icon components, consider adding role="img" and aria-label="Fine-tune" for improved accessibility.

app/web_ui/src/lib/ui/icons/upload_icon.svelte (2)

2-2: Add sizing classes for consistency.

This SVG lacks class="w-full h-full", making it inconsistent with most other icon components in this PR. Adding these classes ensures predictable sizing behavior.

Apply this diff:

-<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<svg class="w-full h-full" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">

1-17: Consider adding accessibility attributes.

This icon lacks accessibility attributes such as role="img" and aria-label="Upload" for screen reader support.

.github/workflows/check_api_bindings.yml (1)

41-69: Use a trap to always stop the dev server.

If any command between starting the dev server and the final kill exits non‑zero (schema mismatch, curl timeout, etc.), the shell aborts immediately and the cleanup block is skipped. Add a trap 'kill ...' EXIT (and ideally wait) right after capturing DEV_SERVER_PID so the background server is torn down on success or failure.

.github/workflows/coverage.yml (1)

214-218: Quote $GITHUB_STEP_SUMMARY and batch redirects

Shellcheck flagged this block (SC2129/SC2086). Combine the writes and quote the target so we avoid accidental word splitting and redundant redirections.

-        run: |
-          echo "## Coverage Summary" >> $GITHUB_STEP_SUMMARY
-          echo "```" >> $GITHUB_STEP_SUMMARY
-          uv run coverage report >> $GITHUB_STEP_SUMMARY
-          echo "```" >> $GITHUB_STEP_SUMMARY
+        run: |
+          {
+            echo "## Coverage Summary"
+            echo "```"
+            uv run coverage report
+            echo "```"
+          } >> "$GITHUB_STEP_SUMMARY"
app/web_ui/src/lib/ui/property_list.ts (1)

1-10: Consider using discriminated unions to enforce mutual exclusivity.

The current type allows invalid combinations such as:

  • Both link and links defined simultaneously
  • link set when value is string[]
  • links set when value is not string[]

These constraints are documented in comments but not enforced by TypeScript.

Consider refactoring to discriminated union types:

-export type UiProperty = {
-  name: string
-  value: string | number | string[]
-  tooltip?: string
-  link?: string // Not supported for value type string[]
-  links?: (string | null)[] // Only supported for type string[]
-  error?: boolean
-  warn_icon?: boolean
-  badge?: boolean
-}
+type BaseProperty = {
+  name: string
+  tooltip?: string
+  error?: boolean
+  warn_icon?: boolean
+  badge?: boolean
+}
+
+type SingleValueProperty = BaseProperty & {
+  value: string | number
+  link?: string
+}
+
+type ArrayValueProperty = BaseProperty & {
+  value: string[]
+  links?: (string | null)[]
+}
+
+export type UiProperty = SingleValueProperty | ArrayValueProperty

This enforces that link and links are mutually exclusive at compile time.

app/web_ui/src/lib/ui/property_list.svelte (1)

40-44: Reduce code duplication in link extraction logic.

The link extraction logic is duplicated between the badge (lines 40-44) and non-badge (lines 60-64) array rendering branches. Consider extracting this into a reusable reactive declaration or helper function.

For example, you could move the link extraction outside the conditional blocks:

{#each property.value as value, i}
  {@const link = property.links && property.links.length === property.value.length
    ? property.links[i]
    : null}
  
  {#if property.badge}
    <button class="badge badge-outline" on:click={() => { if (link) goto(link) }}>
      {value}
    </button>
  {:else if link}
    <a href={link} class="link">{value}</a>
  {:else}
    <span>{value}</span>
  {/if}
{/each}

Also applies to: 60-64

app/desktop/studio_server/test_generate_docs.py (1)

81-85: Consider using print() for simplicity.

The change from print() to sys.stdout.write() is correct and maintains equivalent behavior. However, unless there's a specific reason for explicit newline control, using print() would be simpler and more idiomatic for this test's documentation output.

If you prefer to keep print(), apply this diff:

-    # Write the table to stdout (useful for documentation)
-    sys.stdout.write("\nModel Capability Matrix:\n")
-    sys.stdout.write("\n".join(table))
-    sys.stdout.write("\n\nFireworks models remaining:\n")
-    sys.stdout.write("- " + "\n- ".join(f"{m.name}" for m in fireworks_models) + "\n\n")
+    # Print the table to stdout (useful for documentation)
+    print("\nModel Capability Matrix:")
+    print("\n".join(table))
+    print("\n\nFireworks models remaining:")
+    print("- " + "\n- ".join(f"{m.name}" for m in fireworks_models) + "\n")
app/web_ui/src/lib/ui/settings_section.svelte (1)

29-29: Remove redundant default value assignment.

The expression item.is_external || false is redundant because SettingsItem already defines is_external: boolean = false as a default. You can simplify this to just is_external={item.is_external}.

Apply this diff to simplify the code:

-        is_external={item.is_external || false}
+        is_external={item.is_external}
app/web_ui/src/lib/ui/settings_item.svelte (1)

47-52: Use Tailwind class instead of inline style.

The inline style style="min-width: 12rem;" can be replaced with the Tailwind utility class min-w-48 (since 48 × 0.25rem = 12rem), which is more consistent with the rest of the codebase's styling approach.

Apply this diff:

     <div
       class="btn btn-mid group-hover:btn-primary transition-colors duration-200"
-      style="min-width: 12rem;"
+      class="btn btn-mid group-hover:btn-primary transition-colors duration-200 min-w-48"
     >

Note: Verify that btn-mid is a valid DaisyUI or custom class in your project. If it's not defined, this could cause styling issues.

app/web_ui/src/lib/ui/trace/tool_call.svelte (1)

3-3: Reconsider the import path for better architecture.

Importing from ../../../routes/(app)/run/output.svelte creates tight coupling between a library component and a route-specific component. This violates separation of concerns and reduces reusability.

Consider moving the Output component to a shared location under $lib/ui/ or $lib/components/ so both the trace components and route components can import it without cross-boundary dependencies.

app/web_ui/src/lib/ui/fancy_select.svelte (1)

436-502: Consider adding ARIA attributes for better accessibility.

The main select element has basic role and tabindex attributes, but could be enhanced with:

  • aria-expanded="${listVisible}" to indicate dropdown state
  • aria-haspopup="listbox" to indicate dropdown presence
  • aria-disabled="${disabled}" for better assistive tech support

Example enhancement:

  <div
    tabindex={disabled ? -1 : 0}
    role="listbox"
+   aria-expanded={listVisible}
+   aria-haspopup="listbox"
+   aria-disabled={disabled}
    class="select select-bordered w-full flex items-center..."
app/web_ui/src/lib/ui/button_list.svelte (1)

7-7: Remove unnecessary empty class attribute.

The empty class="" adds no value and clutters the markup.

-<div class="">
+<div>
app/web_ui/src/lib/ui/multi_intro.svelte (3)

19-22: Replace hidden span workaround with Tailwind safelist configuration.

The hidden span forces Tailwind JIT to include dynamic grid-cols classes, but this is fragile and non-idiomatic. Use the safelist option in tailwind.config.js instead.

Remove the hidden span:

-    <!-- Hidden div to force the compiler to find these classes -->
-    <span
-      class="hidden grid-cols-2 grid-cols-1 grid-cols-3 grid-cols-4 grid-cols-5 grid-cols-6 grid-cols-7 grid-cols-8 grid-cols-9 grid-cols-10"
-    ></span>

In tailwind.config.js, add:

module.exports = {
  safelist: [
    {
      pattern: /grid-cols-(1|2|3|4|5|6|7|8|9|10)/,
    }
  ],
  // ... rest of config
}

28-60: Hardcoded slot indices limit scalability.

The if-else chain restricts the component to a maximum of 10 items and is difficult to maintain. Svelte doesn't support dynamic slot names, but you can use a different pattern.

Consider using a single default slot and passing image components via the intros array:

 type MultiIntro = {
   title: string
   description: string
   action_buttons: ActionButton[]
+  icon?: any // Svelte component
 }

Then render:

-{#if index === 0}
-  <slot name="image-0" />
-{:else if index === 1}
-  <slot name="image-1" />
-<!-- ... etc ... -->
-{:else}
-  <div class="w-12 h-12 bg-gray-200 rounded-full flex items-center justify-center"></div>
-{/if}
+{#if intro.icon}
+  <svelte:component this={intro.icon} />
+{:else}
+  <div class="w-12 h-12 bg-gray-200 rounded-full flex items-center justify-center"></div>
+{/if}

Alternatively, pass icon URLs and render <img> tags directly.


23-26: Inline styles bypass Tailwind's utility-first approach.

The dynamic grid-template-columns uses inline styles, which prevents consistent design system usage and makes responsive adjustments harder.

If the 270px width is a standard size, consider creating a custom Tailwind utility class in tailwind.config.js:

theme: {
  extend: {
    gridTemplateColumns: {
      'intro': 'repeat(auto-fit, minmax(270px, 1fr))'
    }
  }
}

Then use:

-<div
-  class="grid gap-x-32 gap-y-4 items-start font-light text-sm"
-  style="grid-template-columns: {intros.map(() => '270px').join(' ')};"
->
+<div class="grid grid-cols-intro gap-x-32 gap-y-4 items-start font-light text-sm">

If dynamic column count is truly required, the inline style is acceptable, but consider documenting why.

app/web_ui/src/lib/ui/intro.svelte (1)

29-48: Code duplication: action button rendering logic.

The action button rendering logic here duplicates similar logic in button_list.svelte. After unifying the ActionButton type, consider using ButtonList here instead of reimplementing the rendering.

+  import ButtonList from "./button_list.svelte"
+
   export let title: string
   export let description_paragraphs: string[]
   export let action_buttons: ActionButton[] = []
 </script>
 
 <div class="max-w-[300px] font-light text-sm flex flex-col gap-4">
   <!-- ... icon, title, paragraphs ... -->
   <slot name="description" />
-  <div class="flex flex-col gap-4 mt-2">
-    {#each action_buttons as button}
-      {#if button.href}
-        <a
-          href={button.href}
-          class="btn {button.is_primary ? 'btn-primary' : ''}"
-          target={button.new_tab ? "_blank" : null}
-        >
-          {button.label}
-        </a>
-      {:else if button.onClick}
-        <button
-          class="btn {button.is_primary ? 'btn-primary' : ''}"
-          on:click={button.onClick}
-        >
-          {button.label}
-        </button>
-      {/if}
-    {/each}
-  </div>
+  <ButtonList buttons={action_buttons} />
 </div>

Note: ButtonList currently uses w-full mt-4 styling, while this component uses gap-4 mt-2. You may need to adjust ButtonList to accept optional styling props or create a wrapper with appropriate classes.

app/web_ui/src/lib/stores/recent_model_store.ts (2)

19-25: Defensive normalization: trim inputs before processing

Avoid accidental whitespace-induced dupes by trimming before validation and use.

-export function addRecentModel(
-  model_id: string | null,
-  model_provider: string | null,
-): void {
-  if (!model_id || !model_provider) {
-    return
-  }
+export function addRecentModel(
+  model_id: string | null,
+  model_provider: string | null,
+): void {
+  const id = model_id?.trim()
+  const provider = model_provider?.trim()
+  if (!id || !provider) return

And use id/provider in the update below.


39-40: Extract “5” into a named constant

Improves readability and keeps tests aligned if the cap changes.

+export const RECENT_MODELS_MAX = 5
 ...
-    return updated_models.slice(0, 5)
+    return updated_models.slice(0, RECENT_MODELS_MAX)
app/web_ui/src/lib/stores/recent_model_store.test.ts (1)

18-21: Stub before importing module to validate persistence behavior

Since the store is created at module load, stub window/localStorage before importing to assert setItem/getItem calls. Use module reset + dynamic import.

Example pattern:

let recent_model_store: typeof import("./recent_model_store")["recent_model_store"]
let addRecentModel: typeof import("./recent_model_store")["addRecentModel"]

beforeEach(async () => {
  vi.resetModules()
  vi.clearAllMocks()
  vi.stubGlobal("window", { localStorage: localStorageMock })
  const mod = await import("./recent_model_store")
  recent_model_store = mod.recent_model_store
  addRecentModel = mod.addRecentModel
})

Then you can assert localStorageMock.setItem was called when updating the store.

agents/tables_style.md (1)

5-22: Add language identifier to code fence.

The code block contains HTML but lacks a language identifier, which would improve syntax highlighting and readability.

Apply this diff:

-```
+```html
 <div class="rounded-lg border">
agents/card_style.md (1)

12-18: Add language identifier to code fence.

The code block contains HTML but lacks a language identifier, which would improve syntax highlighting and readability.

Apply this diff:

-```
+```html
 <div
app/desktop/linux_installer.sh (1)

254-256: Add error handling for binary installation.

The script copies the binary and sets permissions without verifying the copy succeeded. If the copy fails (e.g., due to disk space or permissions), the chmod will fail silently and the script will continue to the success message.

Apply this diff to add error checking:

     # Install the binary
-    cp "Kiln" "$KILN_PATH"
+    if ! cp "Kiln" "$KILN_PATH"; then
+        print_error "Failed to copy Kiln executable to $KILN_PATH"
+        cleanup_and_exit 1
+    fi
     chmod +x "$KILN_PATH"
app/web_ui/src/lib/stores/tools_store.ts (2)

15-33: Return shape and loading/empty UX consistency

The union return type is fine, but consumers often prefer consistent shapes for rendering. Consider returning arrays for links in all cases (e.g., [] instead of undefined) and using a dedicated status or loading flag rather than "Loading..."/"None" literals. Keeps render code simpler and i18n-friendly.


35-47: Micro-optimization: avoid rebuilding the ID→name map repeatedly

project_tools.flatMap(...); new Map(...) runs on every call. If this is in a reactive path, memoize per project_id or accept an already-built map to reduce work.

app/web_ui/src/lib/stores/tag_store.ts (2)

18-57: Prefer store.update; return cached data while loading; clear stale errors on success

  • Use store.update instead of set({...get(), ...}) to avoid races and extra allocations.
  • Check for existing cached counts before short-circuiting on loading so callers get data even during a background refresh.
  • Clear any prior error for the task after a successful fetch.

Apply this diff:

@@
 export async function load_tags(
   project_id: string,
   task_id: string,
 ): Promise<TagCounts> {
   try {
-    // Return early if already loading
-    if (get(loading_tags)[task_id]) {
-      return {}
-    }
-    loading_tags.set({ ...get(loading_tags), [task_id]: true })
-
-    // Check if tags are already loaded
-    const existing_tag_counts = get(tag_store_by_task_id)[task_id]
-    if (existing_tag_counts) {
-      return existing_tag_counts
-    }
+    // Serve cached data first if available
+    const existing_tag_counts = get(tag_store_by_task_id)[task_id]
+    if (existing_tag_counts) return existing_tag_counts
+
+    // If already loading, return empty structure (or consider returning cached if available)
+    if (get(loading_tags)[task_id]) return {}
+    loading_tags.update((s) => ({ ...s, [task_id]: true }))
@@
-    if (error) {
+    if (error) {
       console.error("Error loading tags", error)
-      tags_errors_by_task_id.set({
-        ...get(tags_errors_by_task_id),
-        [task_id]: createKilnError(error),
-      })
+      tags_errors_by_task_id.update((s) => ({
+        ...s,
+        [task_id]: createKilnError(error),
+      }))
       return {}
     }
-    tag_store_by_task_id.set({ ...get(tag_store_by_task_id), [task_id]: data })
+    tag_store_by_task_id.update((s) => ({ ...s, [task_id]: data }))
+    // Clear any previous error for this task
+    tags_errors_by_task_id.update((s) => {
+      const { [task_id]: _removed, ...rest } = s
+      return rest
+    })
     return data
   } catch (error: unknown) {
     console.error("Error loading tags", error)
-    tags_errors_by_task_id.set({
-      ...get(tags_errors_by_task_id),
-      [task_id]: createKilnError(error),
-    })
+    tags_errors_by_task_id.update((s) => ({
+      ...s,
+      [task_id]: createKilnError(error),
+    }))
     return {}
   } finally {
-    loading_tags.set({ ...get(loading_tags), [task_id]: false })
+    loading_tags.update((s) => ({ ...s, [task_id]: false }))
   }
 }

60-79: Use update() when mutating nested store state

Switch to update to avoid read-modify-write races and repeated get():

 export function increment_tag(task_id: string, tag: string): TagCounts {
   const tag_counts = get(tag_store_by_task_id)[task_id]
   if (!tag_counts) {
@@
   const updated_counts = {
     ...tag_counts,
     [tag]: (tag_counts[tag] || 0) + 1,
   }
-  tag_store_by_task_id.set({
-    ...get(tag_store_by_task_id),
-    [task_id]: updated_counts,
-  })
+  tag_store_by_task_id.update((s) => ({ ...s, [task_id]: updated_counts }))
   return updated_counts
 }
app/web_ui/src/lib/ui/tag_dropdown.svelte (1)

149-165: Minor: avoid shadowing sorted_tag_counts inside sorting helper

Rename the local variable to reduce confusion with the reactive $: sorted_tag_counts.

-  function sort_tags_by_frequency(
+  function sort_tags_by_frequency(
     tag_counts: Record<string, number>,
     default_tags: string[],
   ): string[] {
-    let sorted_tag_counts: string[] = Object.entries(tag_counts)
+    let sorted: string[] = Object.entries(tag_counts)
       .sort((a, b) => b[1] - a[1])
       .map(([tag, _]) => tag)
 
     // Add default tags to the bottom of the list, unless they are naturally already in the list
     for (const tag of default_tags) {
-      if (!sorted_tag_counts.includes(tag)) {
-        sorted_tag_counts.push(tag)
+      if (!sorted.includes(tag)) {
+        sorted.push(tag)
       }
     }
 
-    return sorted_tag_counts
+    return sorted
   }
app/web_ui/src/lib/stores/document_tag_store.ts (2)

22-73: Return cached data while loading; prefer update(); clear stale errors on success

  • Serve cached counts first; if a background fetch is in-flight, return cached instead of {}.
  • Use update for store mutations.
  • Remove prior error for the project after a successful fetch.
 export async function load_document_tags(
   project_id: string,
   options?: { invalidate_cache: boolean },
 ): Promise<DocumentTagCounts> {
   try {
-    // Return early if already loading
-    if (get(loading_document_tags)[project_id]) {
-      return {}
-    }
-    loading_document_tags.set({
-      ...get(loading_document_tags),
-      [project_id]: true,
-    })
-
-    // Check if tags are already loaded
-    const existing_tag_counts = get(document_tag_store_by_project_id)[
-      project_id
-    ]
-    if (existing_tag_counts && !options?.invalidate_cache) {
-      return existing_tag_counts
-    }
+    // Serve cached first
+    const existing_tag_counts =
+      get(document_tag_store_by_project_id)[project_id]
+    if (existing_tag_counts && !options?.invalidate_cache) {
+      return existing_tag_counts
+    }
+    // If already loading, return cached if present, else empty
+    if (get(loading_document_tags)[project_id]) {
+      return existing_tag_counts ?? {}
+    }
+    loading_document_tags.update((s) => ({ ...s, [project_id]: true }))
@@
-    if (error) {
+    if (error) {
       console.error("Error loading document tags", error)
-      document_tags_errors_by_project_id.set({
-        ...get(document_tags_errors_by_project_id),
-        [project_id]: createKilnError(error),
-      })
+      document_tags_errors_by_project_id.update((s) => ({
+        ...s,
+        [project_id]: createKilnError(error),
+      }))
       return {}
     }
     const tag_counts: DocumentTagCounts = data
-    document_tag_store_by_project_id.set({
-      ...get(document_tag_store_by_project_id),
-      [project_id]: tag_counts,
-    })
+    document_tag_store_by_project_id.update((s) => ({
+      ...s,
+      [project_id]: tag_counts,
+    }))
+    // Clear any previous error for this project
+    document_tags_errors_by_project_id.update((s) => {
+      const { [project_id]: _removed, ...rest } = s
+      return rest
+    })
     return tag_counts
   } catch (error: unknown) {
     console.error("Error loading document tags", error)
-    document_tags_errors_by_project_id.set({
-      ...get(document_tags_errors_by_project_id),
-      [project_id]: createKilnError(error),
-    })
+    document_tags_errors_by_project_id.update((s) => ({
+      ...s,
+      [project_id]: createKilnError(error),
+    }))
     return {}
   } finally {
-    loading_document_tags.set({
-      ...get(loading_document_tags),
-      [project_id]: false,
-    })
+    loading_document_tags.update((s) => ({ ...s, [project_id]: false }))
   }
 }

76-97: Use update() for increment to avoid read-modify-write races

 export function increment_document_tag(
   project_id: string,
   tag: string,
 ): DocumentTagCounts {
   const tag_counts = get(document_tag_store_by_project_id)[project_id]
@@
   const updated_counts = {
     ...tag_counts,
     [tag]: (tag_counts[tag] || 0) + 1,
   }
-  document_tag_store_by_project_id.set({
-    ...get(document_tag_store_by_project_id),
-    [project_id]: updated_counts,
-  })
+  document_tag_store_by_project_id.update((s) => ({
+    ...s,
+    [project_id]: updated_counts,
+  }))
   return updated_counts
 }
app/web_ui/src/lib/ui/dialog.svelte (1)

75-76: Optional a11y: add role/aria-modal and wire title for assistive tech

HTMLDialog has mixed support. Consider adding role="dialog" and aria-modal="true", and set aria-labelledby to the title’s id.

Example (requires adding id={${id}-title} to the

):

-<dialog {id} class="modal" on:close={() => dispatch("close")}>
+<dialog
+  {id}
+  class="modal"
+  on:close={() => dispatch("close")}
+  role="dialog"
+  aria-modal="true"
+  aria-labelledby="{id}-title"
+>

And:

-<h3 class="text-lg font-medium">
+<h3 id="{id}-title" class="text-lg font-medium">

app/web_ui/src/lib/ui/edit_dialog.svelte (1)

99-101: Prefer forwarding subtitle to Dialog (keep header UX consistent)

If Dialog supports a subtitle prop, pass it there instead of rendering a separate header div in the body. Prevents duplicated header styling/layout and keeps action buttons aligned.

Apply this change:

 <Dialog
   title={"Edit " + name}
   bind:this={dialog}
+  subtitle={subtitle}
   header_buttons={delete_url
     ? [
         {
           image_path: "/images/delete.svg",
           alt_text: "Delete",
           action: () => showDeleteDialog(),
         },
       ]
     : []}
 >
-  {#if subtitle}
-    <div class="text-sm font-light text-gray-500">{subtitle}</div>
-  {/if}

As per coding guidelines

app/web_ui/src/lib/stores.ts (4)

22-30: State wiring and loader changes look good; consider guarding against stale updates

Overall LGTM: branded TaskCompositeId helper, cache invalidation on task changes, and project-aware load are solid.

Small improvement: if multiple load_current_task(...) calls interleave (e.g., quick project/task switches), a slower earlier request can overwrite a newer one. Consider a simple request token or (project_id, task_id) guard before current_task.set(...) so only the latest resolves.

Also applies to: 75-80, 84-89, 184-213


215-274: Tools loader: prefer a Set for in-flight tracking

loading_project_tools: string[] works, but a Set<string> simplifies membership checks and avoids accidental duplicates.

Example:

-let loading_project_tools: string[] = []
+let loading_project_tools = new Set<string>()
...
-  if (loading_project_tools.includes(project_id)) {
+  if (loading_project_tools.has(project_id)) {
     return
   }
...
-  loading_project_tools.push(project_id)
+  loading_project_tools.add(project_id)
...
-  loading_project_tools = loading_project_tools.filter((id) => id !== project_id)
+  loading_project_tools.delete(project_id)

307-336: Add clear/reset for embedding models to mirror models cache

Symmetry helps: provide clear_available_embedding_models_cache() that resets available_embedding_models_loaded and clears the store, like you did for models.

Add:

export function clear_available_embedding_models_cache() {
  available_embedding_models_loaded = "not_loaded"
  available_embedding_models.set([])
}

416-435: Warm-load embedding models in lookup helper (parity with available_model_details)

available_model_details() triggers load_available_models(); do the same for embeddings so lookups don’t race empty caches.

Apply:

 export function get_embedding_model_info(
   model_id: string | number | undefined,
   provider_id: string | null,
 ): EmbeddingModelDetails | null {
+  // No-op if already loaded
+  load_available_embedding_models()
   if (!model_id) {
     return null
   }
app/desktop/studio_server/test_eval_api.py (1)

755-765: Minor: fix dataclass name typo

Rename EvalCondigSummaryTestData to EvalConfigSummaryTestData for clarity.

app/web_ui/src/lib/stores/extractor_progress_store.ts (1)

88-103: Avoid self-referencing the store inside its own factory; use local update() to prevent TDZ hazards

Calling extractorProgressStore.updateStatus/updateProgress from within createExtractorProgressStore creates a temporal-dead-zone risk and tight self-coupling. Use the local update() to mutate state directly.

Apply this minimal change:

-          const newStatus =
-            error_count > 0 ? "completed_with_errors" : "complete"
-          extractorProgressStore.updateStatus(extractor_config_id, newStatus)
+          const newStatus =
+            error_count > 0 ? "completed_with_errors" : "complete"
+          update((state) => ({
+            ...state,
+            status: { ...state.status, [extractor_config_id]: newStatus },
+          }))
-          extractorProgressStore.updateProgress(extractor_config_id, {
-            is_running: true,
-            success: extracted_count,
-            total: total_count,
-            error: error_count,
-          })
-          extractorProgressStore.updateStatus(extractor_config_id, "running")
+          update((state) => ({
+            ...state,
+            progress: {
+              ...state.progress,
+              [extractor_config_id]: {
+                is_running: true,
+                success: extracted_count,
+                total: total_count,
+                error: error_count,
+              },
+            },
+            status: { ...state.status, [extractor_config_id]: "running" },
+          }))

Optionally, expose a cancel/close handle to allow callers to stop the SSE stream when leaving the page.

Also applies to: 96-103, 105-116

app/web_ui/src/lib/ui/run_config_component/available_models_dropdown.svelte (3)

70-70: Guard against nulls when recording recent models

Avoid pushing null entries to recent models.

-  $: addRecentModel(model_name, provider_name)
+  $: if (model_name && provider_name) addRecentModel(model_name, provider_name)

83-87: Use normalized settings for logprobs check

Be consistent: use model_dropdown_settings (merged defaults) instead of raw settings.

-        (m) => m.value === selected && settings.requires_logprobs,
+        (m) => m.value === selected && model_dropdown_settings.requires_logprobs,

195-202: Badge logic should use normalized settings

Use model_dropdown_settings.suggested_mode for accuracy with defaults.

-          (settings.suggested_mode === "data_gen" &&
+          (model_dropdown_settings.suggested_mode === "data_gen" &&
             model.suggested_for_data_gen) ||
-          (settings.suggested_mode === "evals" && model.suggested_for_evals) ||
-          (settings.suggested_mode === "uncensored_data_gen" &&
+          (model_dropdown_settings.suggested_mode === "evals" && model.suggested_for_evals) ||
+          (model_dropdown_settings.suggested_mode === "uncensored_data_gen" &&
             model.suggested_for_uncensored_data_gen) ||
-          (settings.suggested_mode === "doc_extraction" &&
+          (model_dropdown_settings.suggested_mode === "doc_extraction" &&
             model.suggested_for_doc_extraction)
app/desktop/studio_server/data_gen_api.py (1)

205-209: Include run_config in DataSource for provenance

Populate DataSource.run_config so downstream consumers have full lineage.

-        run = await adapter.invoke(
-            input=sample.input,
-            input_source=DataSource(
-                type=DataSourceType.synthetic,
-                properties=properties,
-            ),
-        )
+        run = await adapter.invoke(
+            input=sample.input,
+            input_source=DataSource(
+                type=DataSourceType.synthetic,
+                properties=properties,
+                run_config=sample.output_run_config_properties,
+            ),
+        )
app/web_ui/src/lib/ui/run_config_component/run_config_component.svelte (3)

162-176: Avoid ts-expect-error; type model_provider_name correctly.

Keep strong typing instead of suppressing errors.

As per coding guidelines

Apply:

   return {
     model_name: model_name,
-    // @ts-expect-error server will catch if enum is not valid
-    model_provider_name: provider,
+    model_provider_name: provider as ModelProviderName,
     prompt_id: prompt_method,
     temperature: temperature,
     top_p: top_p,
     structured_output_mode: structured_output_mode,
     tools_config: {
       tools: tools,
     },
   }

And add the missing import:

-  import type {
+  import type {
     RunConfigProperties,
     StructuredOutputMode,
     AvailableModels,
     Task,
     TaskRunConfig,
+    ModelProviderName,
   } from "$lib/types"

158-160: Make tools comparison order-insensitive.

Tool selection equality likely shouldn’t depend on order.

-function arrays_equal(a: string[], b: string[]): boolean {
-  return a.length === b.length && a.every((val, index) => val === b[index])
-}
+function arrays_equal(a: string[], b: string[]): boolean {
+  if (a.length !== b.length) return false
+  const as = [...a].sort()
+  const bs = [...b].sort()
+  return as.every((val, i) => val === bs[i])
+}

53-64: Add explicit type for updated_model_dropdown_settings.

Avoid implicit any; improves IntelliSense and safety.

+ let updated_model_dropdown_settings: Partial<ModelDropdownSettings>
 $: updated_model_dropdown_settings = {
   ...model_dropdown_settings,
   requires_tool_support: requires_tool_support,
   requires_structured_output: requires_structured_output,
 }
app/desktop/studio_server/tool_api.py (2)

387-391: Comment typos.

“secretes” → “secrets”, “exisiting” → “existing”.


531-545: Consider state consistency when editing local MCP.

You deep-copy to tool_server, validate, save, and return the copy, leaving existing_tool_server untouched in memory (unlike remote_mcp edit which mutates in place). This can cause divergence until reloaded.

  • Option A: After successful validation/save, also update fields on existing_tool_server.
  • Option B: Replace in-memory reference in the project server list post-save (if such cache exists).
app/desktop/studio_server/test_provider_api.py (3)

300-301: Patch environment safely.

Use patch.dict for os.environ rather than replacing the attribute.

- with patch("os.environ", {}) as mock_env:
+ with patch.dict("os.environ", {}, clear=True) as mock_env:

401-403: Remove redundant import.

httpx is already imported at file top; drop the inner import.


119-129: Unify message casing for SiliconFlow in tests.

Keep “SiliconFlow” casing consistent across tests to avoid brittle expectations.

app/web_ui/src/lib/types.ts (2)

104-107: Include kiln_task in ToolPropsByType.

Support all ToolServerType variants.

 type ToolPropsByType = {
   remote_mcp: RemoteServerProperties
   local_mcp: LocalServerProperties
+  kiln_task: KilnTaskServerProperties
 }

121-131: Make isToolType a true type guard (no throw).

Current implementation throws via toolIsType; instead, return boolean.

 export function isToolType<T extends keyof ToolPropsByType>(
   x: ExternalToolServerApiDescription,
   t: T,
 ): x is ExternalToolServerApiDescription & {
   type: T
   properties: ToolPropsByType[T]
 } {
-  // Throw an error if the tool is not of the given type
-  toolIsType(x, t)
-  return true
+  return x.type === t
 }

Comment on lines +3 to +5
on:
push:

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add pull_request trigger so checks run before merge.

With only the push event, this guardrail never runs on incoming PRs; schema drift slips past review and only fails after merge. Include pull_request (or pull_request_target if needed) alongside push so contributors see the failure before landing changes.

🤖 Prompt for AI Agents
In .github/workflows/check_api_bindings.yml around lines 3-5 the workflow is
only triggered on push, so CI won't run for incoming pull requests; update the
top-level "on" triggers to include pull_request (or pull_request_target if the
workflow needs access to base repo secrets) in addition to push so checks run on
PRs before merge.

Comment on lines +19 to +24
echo "Checking for python print statements"
prints=$(grep -nR --include='*.py' --exclude-dir=node_modules --exclude-dir=.venv --exclude-dir=.git --exclude-dir=.github --exclude-dir=build --exclude-dir=dist --exclude-dir=.svelte-kit -e 'print(' . || true)
if [ -n "$prints" ]; then
echo "$prints"
found=1
fi
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Expand the print detector to catch spaced calls.

The grep -e 'print(' pattern misses common cases like print (...) or print (...), so developer prints slip through undetected. Please switch to a regex that tolerates optional whitespace—e.g. use grep -nR -E '\bprint\s*\(' ... (remember to add -E)—so all Python print invocations are caught.

🤖 Prompt for AI Agents
In .github/workflows/debug_detector.yml around lines 19 to 24, the grep pattern
uses simple 'print(' and misses spaced calls like "print (...)" or "print   
(...)" — update the grep to use extended regex with a word boundary and optional
whitespace (e.g. use grep -nR -E '\bprint\s*\(' ...) so it matches print
followed by any amount of spaces before the opening parenthesis; ensure the grep
invocation includes -E (or use egrep) and preserves the same include/exclude
flags and the || true fallback.

Comment on lines +23 to +25
wget https://github.com/client9/misspell/releases/download/v0.3.4/misspell_0.3.4_linux_64bit.tar.gz
tar -xzf misspell_0.3.4_linux_64bit.tar.gz
chmod +x misspell
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Do not untar into the repo root (it overwrites our LICENSE).

The misspell tarball ships its own LICENSE/README. Extracting it straight into the checkout replaces our repository’s LICENSE, mutating the workspace and potentially tripping later steps. Extract only the binary (or unpack into a temp dir) before running it.

         run: |
           wget https://github.com/client9/misspell/releases/download/v0.3.4/misspell_0.3.4_linux_64bit.tar.gz
-          tar -xzf misspell_0.3.4_linux_64bit.tar.gz
-          chmod +x misspell
+          tar -xzf misspell_0.3.4_linux_64bit.tar.gz misspell
+          chmod +x misspell
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
wget https://github.com/client9/misspell/releases/download/v0.3.4/misspell_0.3.4_linux_64bit.tar.gz
tar -xzf misspell_0.3.4_linux_64bit.tar.gz
chmod +x misspell
run: |
wget https://github.com/client9/misspell/releases/download/v0.3.4/misspell_0.3.4_linux_64bit.tar.gz
tar -xzf misspell_0.3.4_linux_64bit.tar.gz misspell
chmod +x misspell
🤖 Prompt for AI Agents
.github/workflows/format_and_lint.yml around lines 23 to 25: the workflow
currently extracts the misspell tarball into the repo root which overwrites
repository files like LICENSE; change the steps to avoid mutating the checkout
by either extracting only the binary from the archive or unpacking into a
temporary directory and then moving the binary into the runner PATH, e.g.,
download and tar-extract into /tmp or use tar options to extract a single file,
make that binary executable, and run it from that temp location so the repo root
remains unchanged.

Comment on lines 161 to +168
with uni_server.run_in_thread():
if not uni_server.running():
# Can't start. Likely a port is already in use. Show the web app instead and exit
show_studio()
on_quit()
# TK without a window, to get dock events on MacOS
root = tk.Tk()
root.title("Kiln")
root.withdraw() # remove the window
# Register callback for the dock icon to reopen the web app
root.createcommand("tk::mac::ReopenApplication", show_studio)
tray = run_taskbar()
# Show the web app after a short delay, to avoid race with the server starting
root.after(200, show_studio)
root.after(200, close_splash)
root.mainloop()
# Can't start. Likely the port is already in use (app already running). Show the existing web app and exit.
app.show_studio()
app.on_quit()

# start the desktop app once the server is running. It will keep running until the tk mainloop exits (quit menu item usually)
app.start()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Don’t start the Tk mainloop if the server failed to start

If uni_server.running() is false, you still call app.start(), which opens the UI twice and enters the mainloop briefly before quitting. Guard the start call.

 with uni_server.run_in_thread():
-        if not uni_server.running():
-            # Can't start. Likely the port is already in use (app already running). Show the existing web app and exit.
-            app.show_studio()
-            app.on_quit()
-
-        # start the desktop app once the server is running. It will keep running until the tk mainloop exits (quit menu item usually)
-        app.start()
+        if uni_server.running():
+            # Start the desktop app once the server is running.
+            app.start()
+        else:
+            # Can't start. Likely the port is already in use (app already running). Show the existing web app and exit.
+            app.show_studio()
+            app.on_quit()

Optional: broaden Windows detection

-        make_open_studio_default = sys.platform in ("win32", "Windows")
+        make_open_studio_default = sys.platform.startswith("win")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
with uni_server.run_in_thread():
if not uni_server.running():
# Can't start. Likely a port is already in use. Show the web app instead and exit
show_studio()
on_quit()
# TK without a window, to get dock events on MacOS
root = tk.Tk()
root.title("Kiln")
root.withdraw() # remove the window
# Register callback for the dock icon to reopen the web app
root.createcommand("tk::mac::ReopenApplication", show_studio)
tray = run_taskbar()
# Show the web app after a short delay, to avoid race with the server starting
root.after(200, show_studio)
root.after(200, close_splash)
root.mainloop()
# Can't start. Likely the port is already in use (app already running). Show the existing web app and exit.
app.show_studio()
app.on_quit()
# start the desktop app once the server is running. It will keep running until the tk mainloop exits (quit menu item usually)
app.start()
with uni_server.run_in_thread():
if uni_server.running():
# Start the desktop app once the server is running.
app.start()
else:
# Can't start. Likely the port is already in use (app already running). Show the existing web app and exit.
app.show_studio()
app.on_quit()
🤖 Prompt for AI Agents
In app/desktop/desktop.py around lines 161 to 168, the code calls app.start()
even when uni_server.running() is false which opens the UI twice and briefly
enters the Tk mainloop; change the control flow so app.start() is only invoked
when uni_server.running() returns True (e.g., put app.start() in the else branch
or return/exit immediately after app.on_quit()), ensuring the Tk mainloop is not
started if the server failed to start.

Comment on lines +41 to +52
@app.post("/api/open_project_folder/{project_id}")
def open_project_folder(project_id: str):
try:
project = project_from_id(project_id)
path = project.path
if not path:
raise HTTPException(status_code=500, detail="Project path not found")

open_folder(path)
return {"message": "opened"}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

Simplify exception handling to avoid redundant wrapping.

The HTTPException raised at line 47 will be caught by the outer try/except at line 51 and re-wrapped in another HTTPException with the same status code. This is redundant since FastAPI already handles HTTPException properly.

Apply this diff to remove the redundant error handling:

     @app.post("/api/open_project_folder/{project_id}")
     def open_project_folder(project_id: str):
-        try:
-            project = project_from_id(project_id)
-            path = project.path
-            if not path:
-                raise HTTPException(status_code=500, detail="Project path not found")
-
-            open_folder(path)
-            return {"message": "opened"}
-        except Exception as e:
-            raise HTTPException(status_code=500, detail=str(e))
+        project = project_from_id(project_id)
+        path = project.path
+        if not path:
+            raise HTTPException(status_code=500, detail="Project path not found")
+        
+        try:
+            open_folder(path)
+            return {"message": "opened"}
+        except Exception as e:
+            raise HTTPException(status_code=500, detail=str(e))

This allows project_from_id to raise its own 404 exception naturally while only catching exceptions from open_folder.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@app.post("/api/open_project_folder/{project_id}")
def open_project_folder(project_id: str):
try:
project = project_from_id(project_id)
path = project.path
if not path:
raise HTTPException(status_code=500, detail="Project path not found")
open_folder(path)
return {"message": "opened"}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.post("/api/open_project_folder/{project_id}")
def open_project_folder(project_id: str):
project = project_from_id(project_id)
path = project.path
if not path:
raise HTTPException(status_code=500, detail="Project path not found")
try:
open_folder(path)
return {"message": "opened"}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))

Comment on lines +12 to +22
function clicked() {
if (on_click) {
on_click()
} else if (href) {
if (is_external) {
window.open(href, "_blank")
} else {
goto(href)
}
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Security: Add security attributes when opening external links.

Opening external links with window.open(href, "_blank") without setting window.opener = null exposes the original page to potential tabnabbing attacks, where the opened page can access and manipulate the opener window.

Apply this diff to mitigate the security risk:

     } else if (href) {
       if (is_external) {
-        window.open(href, "_blank")
+        const newWindow = window.open(href, "_blank")
+        if (newWindow) newWindow.opener = null
       } else {
         goto(href)
       }

Alternatively, consider using an anchor tag (<a>) with rel="noopener noreferrer" for external links instead of window.open, which provides better security and accessibility by default.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
function clicked() {
if (on_click) {
on_click()
} else if (href) {
if (is_external) {
window.open(href, "_blank")
} else {
goto(href)
}
}
}
function clicked() {
if (on_click) {
on_click()
} else if (href) {
if (is_external) {
const newWindow = window.open(href, "_blank")
if (newWindow) newWindow.opener = null
} else {
goto(href)
}
}
}
🤖 Prompt for AI Agents
In app/web_ui/src/lib/ui/settings_item.svelte around lines 12 to 22, the click
handler opens external links with window.open(href, "_blank") which allows
tabnabbing; change the behavior to open external links with window.open(href,
"_blank", "noopener,noreferrer") and immediately set the openedWindow.opener =
null if a window object is returned, or better replace the window.open path with
navigation via an anchor element that uses target="_blank" and rel="noopener
noreferrer" to ensure both security and accessibility.

Comment on lines +34 to +44
function add_tag() {
if (tag === null || tag.length === 0) {
error = "Tags cannot be empty"
} else if (tag.includes(" ")) {
error = "Tags cannot contain spaces. Use underscores."
} else {
increment_tag_set(tag)
on_select(tag)
error = null
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Trim whitespace and clear input after add; block whitespace of any kind

Currently checks only space ' ' and leaves input populated. Trim, validate all whitespace, and clear on success.

-  function add_tag() {
-    if (tag === null || tag.length === 0) {
+  function add_tag() {
+    const value = (tag ?? "").trim()
+    if (value.length === 0) {
       error = "Tags cannot be empty"
-    } else if (tag.includes(" ")) {
+    } else if (/\s/.test(value)) {
       error = "Tags cannot contain spaces. Use underscores."
     } else {
-      increment_tag_set(tag)
-      on_select(tag)
+      increment_tag_set(value)
+      on_select(value)
       error = null
+      tag = "" // clear input after successful add
     }
   }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
function add_tag() {
if (tag === null || tag.length === 0) {
error = "Tags cannot be empty"
} else if (tag.includes(" ")) {
error = "Tags cannot contain spaces. Use underscores."
} else {
increment_tag_set(tag)
on_select(tag)
error = null
}
}
function add_tag() {
const value = (tag ?? "").trim()
if (value.length === 0) {
error = "Tags cannot be empty"
} else if (/\s/.test(value)) {
error = "Tags cannot contain spaces. Use underscores."
} else {
increment_tag_set(value)
on_select(value)
error = null
tag = "" // clear input after successful add
}
}
🤖 Prompt for AI Agents
In app/web_ui/src/lib/ui/tag_dropdown.svelte around lines 34 to 44, the add_tag
function currently only checks for literal space characters and leaves the input
populated; update it to first trim the tag (const t = tag?.trim() ?? ''),
validate that t is non-empty and contains no whitespace by testing /\s/ (block
tabs/newlines/etc.), set appropriate error messages, and on success call
increment_tag_set(t) and on_select(t), set error = null, and clear the input by
setting tag = ''.

Comment on lines +182 to +187
<button
class="btn btn-sm {tag && tag.length > 0
? 'btn-primary'
: 'btn-disabled'} btn-circle text-xl font-medium"
on:click={() => add_tag()}>+</button
>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

Visually disabled ≠ functionally disabled; add disabled attribute

The button looks disabled via class but still clickable. Add disabled binding.

-    <button
-      class="btn btn-sm {tag && tag.length > 0
+    <button
+      disabled={!tag || tag.length === 0}
+      class="btn btn-sm {tag && tag.length > 0
         ? 'btn-primary'
         : 'btn-disabled'} btn-circle text-xl font-medium"
       on:click={() => add_tag()}>+</button
     >
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<button
class="btn btn-sm {tag && tag.length > 0
? 'btn-primary'
: 'btn-disabled'} btn-circle text-xl font-medium"
on:click={() => add_tag()}>+</button
>
<button
disabled={!tag || tag.length === 0}
class="btn btn-sm {tag && tag.length > 0
? 'btn-primary'
: 'btn-disabled'} btn-circle text-xl font-medium"
on:click={() => add_tag()}>+</button
>
🤖 Prompt for AI Agents
In app/web_ui/src/lib/ui/tag_dropdown.svelte around lines 182–187, the "+"
button is only visually disabled via classes but remains clickable; bind the
disabled attribute to the same condition that controls the visual state (i.e.,
disabled when tag is falsy or empty) so the button is functionally inert when
"disabled", and ensure any click handler is not invoked when disabled (use the
disabled binding rather than relying solely on CSS); update the button element
to include the disabled binding reflecting the existing tag length check.

Comment on lines +18 to +21
const tool_server_id = persistent_tool_id.substring(
"kiln_task::".length,
)
return `/settings/manage_tools/${project_id}/kiln_task/${tool_server_id}`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Validate extracted tool_server_id to prevent malformed URLs.

If persistent_tool_id equals exactly "kiln_task::", the extracted tool_server_id will be an empty string, resulting in a malformed URL path like /settings/manage_tools/${project_id}/kiln_task/.

Apply this diff to add validation:

       if (persistent_tool_id.startsWith("kiln_task::")) {
         const tool_server_id = persistent_tool_id.substring(
           "kiln_task::".length,
         )
+        if (!tool_server_id) return null
         return `/settings/manage_tools/${project_id}/kiln_task/${tool_server_id}`
       }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const tool_server_id = persistent_tool_id.substring(
"kiln_task::".length,
)
return `/settings/manage_tools/${project_id}/kiln_task/${tool_server_id}`
if (persistent_tool_id.startsWith("kiln_task::")) {
const tool_server_id = persistent_tool_id.substring(
"kiln_task::".length,
)
if (!tool_server_id) return null
return `/settings/manage_tools/${project_id}/kiln_task/${tool_server_id}`
}
🤖 Prompt for AI Agents
In app/web_ui/src/lib/ui/trace/tool_call.svelte around lines 18-21, validate the
extracted tool_server_id before building the URL: after computing tool_server_id
from persistent_tool_id, check if it is a non-empty string; if it is empty,
avoid producing a URL with a trailing slash (either return a fallback URL
`/settings/manage_tools/${project_id}/kiln_task` or return null/undefined) and
optionally log or handle the error; otherwise use the validated tool_server_id
to build `/settings/manage_tools/${project_id}/kiln_task/${tool_server_id}`.

Comment on lines +32 to +35
{#if get_tool_link()}
<a href={get_tool_link()} class="text-primary link" target="_blank">
{tool_call.function.name}
</a>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add rel="noopener noreferrer" for security and compute link once for performance.

Two issues:

  1. Security: Using target="_blank" without rel="noopener noreferrer" creates a security vulnerability where the opened page can access window.opener and potentially redirect the parent page.

  2. Performance: get_tool_link() is called twice (line 32 and line 33). Use a reactive declaration to compute it once.

Apply this diff to fix both issues:

+  $: toolLink = get_tool_link()
+
 </script>

 <div class="grid grid-cols-[auto,1fr] gap-x-3 gap-y-0 text-xs">
   <div class="font-medium text-gray-500">{nameTag}:</div>
   <div class="font-mono">
-    {#if get_tool_link()}
-      <a href={get_tool_link()} class="text-primary link" target="_blank">
+    {#if toolLink}
+      <a href={toolLink} class="text-primary link" target="_blank" rel="noopener noreferrer">
         {tool_call.function.name}
       </a>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{#if get_tool_link()}
<a href={get_tool_link()} class="text-primary link" target="_blank">
{tool_call.function.name}
</a>
<script lang="ts">
// … other imports and declarations …
$: toolLink = get_tool_link()
</script>
<div class="grid grid-cols-[auto,1fr] gap-x-3 gap-y-0 text-xs">
<div class="font-medium text-gray-500">{nameTag}:</div>
<div class="font-mono">
{#if toolLink}
<a
href={toolLink}
class="text-primary link"
target="_blank"
rel="noopener noreferrer"
>
{tool_call.function.name}
</a>
{/if}
</div>
</div>
🤖 Prompt for AI Agents
In app/web_ui/src/lib/ui/trace/tool_call.svelte around lines 32 to 35, compute
the tool link once and add the security rel attributes: create a reactive/local
variable (e.g., toolLink) set to the result of get_tool_link() and use that
variable in the {#if ...} and href, and update the <a> element to include
rel="noopener noreferrer" alongside target="_blank".

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