Skip to content

Commit 111b0df

Browse files
authored
Release v0.17.0 - Provider management, custom workspaces, faster sessions, safer settings, more languages and smoother desktop performance (#534)
## Thanks for contributions - [@pascalandr](https://github.com/pascalandr): [#242](#242), [#340](#340), [#357](#357), [#406](#406), [#407](#407), [#458](#458), [#472](#472), [#501](#501), [#513](#513), [#528](#528), [#531](#531) - [@OfflinePing](https://github.com/OfflinePing): [#413](#413), [#497](#497), [#498](#498), [#499](#499) - [@omercnet](https://github.com/omercnet): [#459](#459), [#466](#466), [#512](#512) - [@VooDisss](https://github.com/VooDisss): [#493](#493), [#511](#511) - [@JDis03](https://github.com/JDis03): [#481](#481), [#519](#519) - [@bluelovers](https://github.com/bluelovers): [#278](#278), [#284](#284) - [@aayurt](https://github.com/aayurt): [#523](#523) - [@MusiCode1](https://github.com/MusiCode1): [#388](#388) - [@jollyxenon](https://github.com/jollyxenon): [#439](#439) ## Highlights - **Provider setup is easier from the model selector**: Manage provider authentication directly from the place where you choose models, with provider settings scoped to the current CodeNomad instance. - **Settings are more useful and transparent**: A new Info section shows version, runtime, and diagnostic details, and a new global config editor makes it easier to inspect and update CodeNomad/OpenCode configuration without leaving the app. - **Sessions load faster and are easier to find**: Session history now supports progressive loading, server-side search, and stronger workspace scoping, making large workspaces feel much more responsive. - **Workspace names are customizable**: Give workspaces friendlier names so multi-project and multi-instance setups are easier to recognize. - **Desktop event handling is faster and more reliable**: Tauri desktop builds now use a Rust-native event transport for better performance and fewer moving parts during live session updates. - **More languages are available**: German and Nepali localization support was added, and Hebrew translation coverage was improved. ## What’s Improved - **Better chat readability**: Pasted text can collapse in chat history, session titles now appear in the header bar, and message timing metrics make it easier to understand how long responses take. - **More flexible composer experience**: The session composer can now be resized, making long prompts and detailed instructions easier to work with. - **Safer environment variable editing**: Environment variable values are hidden and password-style inputs are masked, reducing the chance of exposing sensitive values on screen. - **Better permission feedback**: Permission requests now show clearer rejection feedback, and YOLO mode behavior is shared more consistently across related session flows. - **More helpful notifications and logs**: Toast notification history and server log access were improved so important events are easier to revisit after they disappear. - **Cleaner status panels**: Status panel sections can now collapse, making dense side-panel information easier to scan. - **Smaller desktop packages**: Electron package size was reduced, making downloads and installs lighter. ## Fixes - **More reliable live updates**: SSE pong retry logic and message-load retry handling were tightened to avoid connection issues and runaway retry loops. - **Smoother scrolling while sessions stream**: Virtual follow/autoscroll behavior is more stable, so active conversations should jump around less while new content arrives. - **Better OpenCode SDK compatibility**: CodeNomad now supports OpenCode SDK 1.16 runtime APIs. - **More reliable worktree behavior**: Worktree mappings now live in session metadata, and OpenCode calls are routed through workspaces more consistently. - **Better draft prompt handling**: Draft prompt command sessions are supported more reliably, and switching focus between tabs no longer accidentally clears prompts. - **Improved mobile usability**: Instance and project tabs remain tappable while the session drawer is open, and the folder home screen behaves better on small mobile viewports. - **Improved Linux browser launching**: Linux browser launch detection now checks more common browser candidates. - **Better plugin handling**: Plugin base URLs work better with host binding, and tuple-style plugin metadata is supported. - **Markdown rendering polish**: Horizontal rules now render correctly in markdown content. - **Simpler session diff UI**: The session diff right-drawer flow was removed to reduce UI complexity and avoid confusing side-panel behavior. ## Docs - **Contributor architecture guide added**: A CodeNomad architecture guide skill was added to help contributors understand the project structure and key integration patterns. - **Quick-start guidance improved**: Authentication requirements and self-signed certificate warnings were added to the quick-start docs. - **Release automation documented**: Winget release automation docs and workflow support were added. ### Contributors - [@shantur](https://github.com/shantur) - [@pascalandr](https://github.com/pascalandr) - [@OfflinePing](https://github.com/OfflinePing) - [@omercnet](https://github.com/omercnet) - [@JDis03](https://github.com/JDis03) - [@VooDisss](https://github.com/VooDisss) - [@bluelovers](https://github.com/bluelovers) - [@aayurt](https://github.com/aayurt) - [@MusiCode1](https://github.com/MusiCode1) - [@jollyxenon](https://github.com/jollyxenon) **Full Changelog**: [v0.16.0...v0.17.0](v0.16.0...v0.17.0) ## Merged Pull Requests ### [@shantur](https://github.com/shantur) - PR [#446](#446) “fix(ui): support draft prompt command sessions” - PR [#452](#452) “fix(ui): keep home actions visible on short viewports” - PR [#453](#453) “Reduce Electron package size” - PR [#476](#476) “feat(ui): add instance-scoped provider manager from model selector” - PR [#477](#477) “Add global config file editor” - PR [#514](#514) “Migrate worktree mappings to session metadata” - PR [#521](#521) “fix(worktrees): route OpenCode calls through workspaces” - PR [#522](#522) “feat(ui): support custom workspace names” - PR [#526](#526) “Support OpenCode SDK 1.16 runtime APIs” - PR [#529](#529) “fix(ui): stop message load retry loop” - PR [#532](#532) “fix(ui): remove session diff right drawer flow” ### [@pascalandr](https://github.com/pascalandr) - PR [#242](#242) “perf(tauri): Rust-native desktop event transport” - PR [#340](#340) “feat(ui): show the session title in the header bar” - PR [#357](#357) “feat(ui): add message timing metrics” - PR [#406](#406) “fix(ui): stabilize virtual follow autoscroll” - PR [#407](#407) “feat(ui): collapse pasted text in chat history” - PR [#458](#458) “fix(ui): allow status panel sections to collapse” - PR [#472](#472) “revert: remove tracked NomadWorks repo state” - PR [#501](#501) “fix(ui): support tuple plugin metadata” - PR [#513](#513) “chore: TASK-075 automate Winget updates on release” - PR [#528](#528) “fix(ui): scope primary agent selector to selectable agents” - PR [#531](#531) “revert: remove tracked NomadWorks task artifacts” ### [@OfflinePing](https://github.com/OfflinePing) - PR [#413](#413) “feat(settings): add Info section with version, runtime, and diagnostics” - PR [#497](#497) “Share YOLO mode across session families” - PR [#498](#498) “fix(ui): render markdown horizontal rules” - PR [#499](#499) “Add reject feedback to permission UI” ### [@omercnet](https://github.com/omercnet) - PR [#459](#459) “fix(mobile): tappable instance/project tab bar while session drawer is open” - PR [#466](#466) “ci: increase comment-pr-artifacts polling timeout” - PR [#512](#512) “fix: handle plugin base URL for host binding” ### [@VooDisss](https://github.com/VooDisss) - PR [#493](#493) “feat: add CodeNomad architecture guide skill for contributors” - PR [#511](#511) “feat(sessions): progressive loading, server-side search, and workspace scoping” ### [@JDis03](https://github.com/JDis03) - PR [#481](#481) “docs: add auth requirement and self-signed cert warning to quick-start” - PR [#519](#519) “fix(ui): add retry logic to SSE pong to improve connection resilience” ### [@bluelovers](https://github.com/bluelovers) - PR [#278](#278) “feat(ui): Toast Notification History & Server Logs Enhancements” - PR [#284](#284) “fix(ui): hide environment variable values and mask inputs as password” ### [@aayurt](https://github.com/aayurt) - PR [#523](#523) “Add German and Nepali Localizations” ### [@MusiCode1](https://github.com/MusiCode1) - PR [#388](#388) “Update Hebrew translation coverage” ### [@jollyxenon](https://github.com/jollyxenon) - PR [#439](#439) “feat(ui): add resizable session composer”
2 parents 3f93309 + d29dbf7 commit 111b0df

325 files changed

Lines changed: 18247 additions & 16243 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/comment-pr-artifacts.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,9 @@ jobs:
5959
6060
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
6161
62+
const maxAttempts = 90;
6263
let matchedRun = null;
63-
for (let attempt = 1; attempt <= 30; attempt += 1) {
64+
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
6465
const runs = await github.paginate(github.rest.actions.listWorkflowRuns, {
6566
owner,
6667
repo,
@@ -78,8 +79,8 @@ jobs:
7879
break;
7980
}
8081
81-
core.info(`Waiting for PR Build Validation run for ${headSha} (attempt ${attempt}/30)`);
82-
await sleep(10000);
82+
core.info(`Waiting for PR Build Validation run for ${headSha} (attempt ${attempt}/${maxAttempts})`);
83+
await sleep(20000);
8384
}
8485
8586
if (!matchedRun) {
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
name: Update Winget
2+
3+
on:
4+
release:
5+
types:
6+
- published
7+
8+
permissions:
9+
contents: read
10+
11+
jobs:
12+
update-winget:
13+
name: Submit Winget manifest update
14+
if: ${{ !github.event.release.draft && !github.event.release.prerelease }}
15+
runs-on: ubuntu-latest
16+
env:
17+
WINGET_PACKAGE_IDENTIFIER: ${{ vars.WINGET_PACKAGE_IDENTIFIER || 'NeuralNomadsAI.CodeNomad' }}
18+
WINGET_FORK_OWNER: ${{ vars.WINGET_FORK_OWNER || 'pascalandr' }}
19+
WINGET_WINDOWS_ASSET_NAME_TEMPLATE: ${{ vars.WINGET_WINDOWS_ASSET_NAME_TEMPLATE || 'CodeNomad-Tauri-windows-x64-{version}.zip' }}
20+
WINGET_ASSET_WAIT_TIMEOUT_SECONDS: ${{ vars.WINGET_ASSET_WAIT_TIMEOUT_SECONDS || '900' }}
21+
WINGET_ASSET_POLL_INTERVAL_SECONDS: ${{ vars.WINGET_ASSET_POLL_INTERVAL_SECONDS || '15' }}
22+
steps:
23+
- name: Checkout repository
24+
uses: actions/checkout@v4
25+
26+
- name: Setup Node
27+
uses: actions/setup-node@v4
28+
with:
29+
node-version: 20
30+
31+
- name: Wait for Windows Tauri release asset
32+
id: release_asset
33+
env:
34+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
35+
run: |
36+
args=(
37+
--repo "${{ github.repository }}"
38+
--release-id "${{ github.event.release.id }}"
39+
--tag "${{ github.event.release.tag_name }}"
40+
--asset-name-template "$WINGET_WINDOWS_ASSET_NAME_TEMPLATE"
41+
--timeout-seconds "$WINGET_ASSET_WAIT_TIMEOUT_SECONDS"
42+
--poll-interval-seconds "$WINGET_ASSET_POLL_INTERVAL_SECONDS"
43+
--github-output "$GITHUB_OUTPUT"
44+
)
45+
46+
node scripts/winget/resolve-release-asset.cjs "${args[@]}"
47+
48+
- name: Log resolved Winget asset metadata
49+
run: |
50+
echo "Resolved asset: ${{ steps.release_asset.outputs.asset_name }}"
51+
echo "Resolved version: ${{ steps.release_asset.outputs.version }}"
52+
echo "Resolved SHA-256: ${{ steps.release_asset.outputs.asset_sha256 }}"
53+
54+
- name: Validate fork configuration
55+
env:
56+
GH_TOKEN: ${{ secrets.WINGET_GITHUB_TOKEN }}
57+
EXPECTED_OWNER: ${{ env.WINGET_FORK_OWNER }}
58+
run: |
59+
set -euo pipefail
60+
token_owner="$(gh api user --jq '.login')"
61+
fork_name="$(gh api "repos/$EXPECTED_OWNER/winget-pkgs" --jq '.full_name')"
62+
parent_name="$(gh api "repos/$EXPECTED_OWNER/winget-pkgs" --jq '.parent.full_name')"
63+
is_fork="$(gh api "repos/$EXPECTED_OWNER/winget-pkgs" --jq '.fork')"
64+
65+
if [ "$token_owner" != "$EXPECTED_OWNER" ]; then
66+
echo "WINGET_GITHUB_TOKEN belongs to '$token_owner' but WINGET_FORK_OWNER is '$EXPECTED_OWNER'" >&2
67+
exit 1
68+
fi
69+
70+
if [ "$is_fork" != "true" ] || [ "$parent_name" != "microsoft/winget-pkgs" ]; then
71+
echo "Configured fork must be $EXPECTED_OWNER/winget-pkgs forked from microsoft/winget-pkgs" >&2
72+
exit 1
73+
fi
74+
75+
echo "Validated fork: $fork_name"
76+
77+
- name: Submit update to Winget
78+
uses: vedantmgoyal9/winget-releaser@v2
79+
with:
80+
identifier: ${{ env.WINGET_PACKAGE_IDENTIFIER }}
81+
version: ${{ steps.release_asset.outputs.version }}
82+
release-tag: ${{ github.event.release.tag_name }}
83+
installers-regex: ${{ steps.release_asset.outputs.asset_regex }}
84+
fork-user: ${{ env.WINGET_FORK_OWNER }}
85+
token: ${{ secrets.WINGET_GITHUB_TOKEN }}

.nomadworks/agent-additions/README.md

Lines changed: 0 additions & 34 deletions
This file was deleted.

.nomadworks/agents/README.md

Lines changed: 0 additions & 39 deletions
This file was deleted.

.nomadworks/generated/agents/README.md

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)