Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
547b659
Add web runtime bridge for browser chat (#695)
Dhirenderchoudhary Jul 21, 2026
5690d18
feat: add browser approvals, questions, and tool status for web mode …
Dhirenderchoudhary Jul 29, 2026
9310399
fix: address web mode review feedback (security, reliability, a11y)
Dhirenderchoudhary Aug 5, 2026
fa80dd2
Merge pull request #799 from Dhirenderchoudhary/fix/628-web-mode-revi…
will-lamerton Aug 9, 2026
5f5845c
feat: add theme switcher, collapsible sidebar, markdown/highlighting,…
Dhirenderchoudhary Aug 21, 2026
059f0a0
feat(web): implement local Web/GUI mode with organisation theme
akramcodez Aug 27, 2026
2476016
Merge main into web-mode, keeping web UI feature
akramcodez Aug 27, 2026
2994d7a
Merge pull request #988 from akramcodez/web-mode
akramcodez Aug 27, 2026
bcd7369
feat: add web interface and dev server support
akramcodez Aug 28, 2026
a9a8c15
feat: add web interface and dev server support (#1018)
akramcodez Aug 30, 2026
65fad66
Merge remote-tracking branch 'origin' into web-mode
akramcodez Aug 31, 2026
8499a52
Merge branch 'main' into web-mode
akramcodez Sep 1, 2026
b51ffc1
Merge branch 'feat/web-mode' of https://github.com/Nano-Collective/na…
akramcodez Sep 1, 2026
a196637
feat: add session deletion support with UI improvements and composer …
akramcodez Sep 1, 2026
2ac3833
fixed hover problem
akramcodez Sep 1, 2026
f468861
Merge pull request #1121 from akramcodez/web-mode
akramcodez Sep 1, 2026
1ff19bf
Merge upstream/main into feat/web-mode-updated
akramcodez Oct 7, 2026
5214569
fix(web): improve runtime reliability and browser UI
akramcodez Oct 7, 2026
ae55f0f
feat(web): polish chat flow and sync sessions with fullscreen TUI
akramcodez Oct 8, 2026
8397b4f
fix: web mode message footers, session autosave, and tool ID scoping
akramcodez Oct 9, 2026
9568567
feat(web): add tasks and source control panels
akramcodez Oct 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/calm-web-world.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@nanocollective/nanocoder": minor
---

Add browser approvals, questions, and live tool status to local web mode so coding-agent turns can finish safely in the browser UI.
5 changes: 5 additions & 0 deletions .changeset/web-mode-runtime-reliability.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@nanocollective/nanocoder": patch
---

Fix web-mode reply delivery, offline startup, interaction queues and cancellation, reconnect and multi-tab state, session-operation races, image handling, and tool error status.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,9 @@
},
"scripts": {
"build": "pnpm --filter @nanocollective/nanocoder-voice build && tsc && tsc-alias && mkdir -p dist/voice && cp plugins/voice/dist/*.js plugins/voice/dist/*.d.ts dist/voice/ && cp source/commands/contributors.json dist/commands/contributors.json && chmod +x dist/cli.js",
"web": "node dist/cli.js --web",
"build:credits": "./scripts/generate-credits.sh",
"dev": "tsc --watch",
"dev": "tsc --watch & tsc-alias --watch",
"start": "node dist/cli.js",
"test:all": "./scripts/test.sh",
"test:ava": "ava",
Expand Down
2 changes: 2 additions & 0 deletions source/acp/acp-types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type {CustomCommandExecutor} from '@/custom-commands/executor';
import type {CustomCommandLoader} from '@/custom-commands/loader';
import type {ToolManager} from '@/tools/tool-manager';
import type {LLMClient} from '@/types/index';
Expand All @@ -6,6 +7,7 @@ export interface AcpInitContext {
client: LLMClient;
toolManager: ToolManager;
customCommandLoader: CustomCommandLoader;
customCommandExecutor: CustomCommandExecutor;
provider: string;
model: string;
}
6 changes: 6 additions & 0 deletions source/ai-sdk-client/converters/message-converter.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,12 @@ test('convertToModelMessages keeps image-only user messages without a text part'
t.is(content[0].type, 'image');
});

test('saved browser data URLs are not prefixed twice', t => {
const result = convertToModelMessages([{role: 'user', content: 'describe', images: [{data: 'data:image/png;base64,AA==', mediaType: 'image/png'}]}]);
const content = result[0].content as Array<Record<string, unknown>>;
t.is(content[1].image, 'data:image/png;base64,AA==');
});

test('convertToModelMessages leaves text-only user messages as plain strings', t => {
const messages: Message[] = [{role: 'user', content: 'plain text'}];
const result = convertToModelMessages(messages);
Expand Down
4 changes: 3 additions & 1 deletion source/ai-sdk-client/converters/message-converter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,9 @@ export function convertToModelMessages(messages: Message[]): ModelMessage[] {
for (const image of msg.images) {
content.push({
type: 'image',
image: `data:${image.mediaType};base64,${image.data}`,
image: image.data.startsWith('data:')
? image.data
: `data:${image.mediaType};base64,${image.data}`,
mediaType: image.mediaType,
} as ImagePart);
}
Expand Down
Loading
Loading