feat: initial Lam Agent extension #1

Merged
adrianbonpin merged 1 commits from feat/initial-scaffold into prod 2026-10-03 20:32:41 +00:00
Owner

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. ## 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.
adrianbonpin added 1 commit 2026-10-03 20:32:37 +00:00
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.
adrianbonpin merged commit 8b507e7953 into prod 2026-10-03 20:32:41 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: adrianbonpin/lam-agent-vicinae#1