Agentic AI chat inside the Vicinae launcher, powered by Ollama.
What ships
chat — search bar as composer (Return sends), cmd+return opens a multi-line composer, streaming markdown answers, newest turn first, conversation switcher in the search bar accessory reached with Tab
sessions — browse, reopen, copy, and delete past conversations
setup — verifies the Ollama connection and lists the models the key can actually reach
tools — get_datetime, get_location, web_search, web_fetch; all read-only, tool loop capped at 5 rounds
Two constraints that shaped the design
The launcher's search bar is single-line and there is no API to change it, so "Return sends" and "cmd+return inserts a newline" cannot both live in one field. They are split across the search bar and a pushed Form instead.
An extension can read preferences but not write them (no setPreferenceValues), so setup hands over the exact model name to paste rather than saving it.
Verification
tsc --noEmit — clean
eslint . — clean
vitest run — 77 tests passing across 7 files
vici build — extension builds, 3 entrypoints resolved
The test suite covers NDJSON chunk-boundary parsing (including multi-byte characters split across chunks), the tool-calling loop, session caps, and timezone handling. The logic layer holds no Vicinae imports and there is a test enforcing that boundary.
Not in this PR
Anything with a side effect — opening links, clipboard, launching apps. That needs an approval step first, and an assistant that can silently act on the machine is a different risk profile from one that answers questions.
Agentic AI chat inside the Vicinae launcher, powered by Ollama.
## What ships
- **chat** — search bar as composer (Return sends), cmd+return opens a multi-line composer, streaming markdown answers, newest turn first, conversation switcher in the search bar accessory reached with Tab
- **sessions** — browse, reopen, copy, and delete past conversations
- **setup** — verifies the Ollama connection and lists the models the key can actually reach
- **tools** — `get_datetime`, `get_location`, `web_search`, `web_fetch`; all read-only, tool loop capped at 5 rounds
## Two constraints that shaped the design
1. The launcher's search bar is single-line and there is no API to change it, so "Return sends" and "cmd+return inserts a newline" cannot both live in one field. They are split across the search bar and a pushed Form instead.
2. An extension can read preferences but not write them (no `setPreferenceValues`), so setup hands over the exact model name to paste rather than saving it.
## Verification
- `tsc --noEmit` — clean
- `eslint .` — clean
- `vitest run` — 77 tests passing across 7 files
- `vici build` — extension builds, 3 entrypoints resolved
The test suite covers NDJSON chunk-boundary parsing (including multi-byte characters split across chunks), the tool-calling loop, session caps, and timezone handling. The logic layer holds no Vicinae imports and there is a test enforcing that boundary.
## Not in this PR
Anything with a side effect — opening links, clipboard, launching apps. That needs an approval step first, and an assistant that can silently act on the machine is a different risk profile from one that answers questions.
Agentic AI chat inside the Vicinae launcher, powered by Ollama.
- chat: the search bar is the composer (Return sends), cmd+return opens a
multi-line composer, answers stream into a markdown detail panel, the
newest turn renders first, and Tab reaches a conversation switcher in
the search bar accessory
- sessions: browse, reopen, copy, and delete past conversations
- setup: verifies the Ollama connection and lists the models the key can
actually reach, rather than trusting a hand-typed model name
- tools: get_datetime, get_location, web_search, web_fetch. All read-only,
and the tool-calling loop is capped at 5 rounds
Notes on two constraints that shaped the design:
The search bar is single-line and there is no API to change it, so
"Return sends" and "cmd+return inserts a newline" cannot both live in one
field. They are split across the search bar and a pushed Form instead.
An extension can read preferences but cannot write them, so setup hands
over the exact model name to paste rather than saving it.
The logic layer (ollama, agent, tools, location, history, markdown) holds
no Vicinae imports and is unit tested without a runtime; a test enforces
that boundary. 77 tests cover NDJSON chunk-boundary parsing, the tool
loop, session caps, and timezone handling.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Agentic AI chat inside the Vicinae launcher, powered by Ollama.
What ships
get_datetime,get_location,web_search,web_fetch; all read-only, tool loop capped at 5 roundsTwo constraints that shaped the design
setPreferenceValues), so setup hands over the exact model name to paste rather than saving it.Verification
tsc --noEmit— cleaneslint .— cleanvitest run— 77 tests passing across 7 filesvici build— extension builds, 3 entrypoints resolvedThe test suite covers NDJSON chunk-boundary parsing (including multi-byte characters split across chunks), the tool-calling loop, session caps, and timezone handling. The logic layer holds no Vicinae imports and there is a test enforcing that boundary.
Not in this PR
Anything with a side effect — opening links, clipboard, launching apps. That needs an approval step first, and an assistant that can silently act on the machine is a different risk profile from one that answers questions.