Commit Graph
32 Commits
Author SHA1 Message Date
adrianbonpin bd6a71a9d0 feat: tell the model what its file tools reach, and wire them up
The runtime paragraph gains the tools, the roots and the approval rule when file
access is on, and keeps the old claim that Lam cannot read files when it is off,
because a model told the wrong thing about itself states it confidently.

The hook builds the policy and the ledger per turn, which is what makes the
approval last one answer rather than one session.
2026-10-07 17:01:28 +08:00
adrianbonpin 36d7d2fdea feat: file access preferences
Three settings: the switch, and the two root fields. Off by default, because the
read half of this feature cannot ask before it happens, and `ipGeolocation` in this
repository is already off for the weaker version of the same reason.

The manifest keeps the file's own formatting rather than prettier's, since the
repository's format script has never covered package.json.
2026-10-07 17:00:52 +08:00
adrianbonpin f42a828360 feat: seven file tools behind the policy and an approval
The file tools are absent from the list unless file access is on, which is the
difference between a model that cannot call them and one that is told not to. Each
handler is thin: argument checks here, and the operation itself in files.ts.

move_path reads `from`, not the shared path helper, which is the bug the tests
caught: an empty source path would have been refused by the policy on every move.
2026-10-07 17:00:08 +08:00
adrianbonpin f8acfce792 feat: the approval dialog and its per-answer ledger
The wording lives beside the dialog rather than beside the paths, which is what
keeps files.ts free of UI and lets every refusal path be tested without a
launcher. Vicinae's rememberUserChoice is declared in the API but not implemented
in the server, so the ledger is the only memory and it lasts one answer.

A dialog that cannot be shown is a refusal, not consent.
2026-10-07 16:59:06 +08:00
adrianbonpin 674327ec20 feat: the file path policy and its operations
One module with no Vicinae import, so the whole boundary tests headlessly: the
roots, the credential denylist, resolution that follows symlinks before judging
containment, and the seven operations, each returning a result rather than
throwing, so a refusal and an I/O failure reach the model in the same shape.

The mutating operations take an approval callback rather than importing a dialog,
which is what keeps this file free of UI and lets every refusal path be tested.

52 tests, including a symlink out of a root, a sibling whose name merely starts
like a root, and a temporary home with its own symlinks resolved first, because
mkdtemp on macOS hands back a path under /var.
2026-10-07 16:58:43 +08:00
adrianbonpin c9036389e3 docs: implementation plan for file system access
Ten tasks: the path policy and its operations, the approval dialog and its ledger,
seven tools, three preferences, what the model is told, the hook and setup screen
wiring, the README, and a verification task that mutation checks the policy rather
than trusting the suite.
2026-10-07 16:57:22 +08:00
adrianbonpin 2b09cc84e9 docs: spec file system access for Lam
Seven file tools behind a path policy and an approval step, with the platform
findings that shaped it: extensions are unsandboxed Node, confirmAlert exists,
rememberUserChoice does not, and environment.supportPath is the one directory an
extension is invited to write to.

Records the decisions taken with the user (read, write, edit and destructive
tools; one approval per path per answer; home minus a credential denylist; extra
roots in preferences) and the assumptions that follow from them, including the
two that go beyond the questions asked: delete and move asking every time, and
file access being off until switched on.
2026-10-07 16:51:41 +08:00
adrianbonpin 34c4383428 fix: order a citation run ascending, and name each page once (#24) 2026-10-07 08:29:33 +00:00
adrianbonpin ade6145425 fix: separate raised citation markers with a space, not a comma (#23) 2026-10-07 08:24:07 +00:00
adrianbonpin 0705d5ec2f fix: raise citation markers and stop adjacent ones merging (#22) 2026-10-07 08:19:58 +00:00
adrianbonpin fcc6d26c9d feat: source citations with footnotes in the transcript (#21) 2026-10-07 08:12:48 +00:00
adrianbonpin 72a63e69e6 fix: bracket a fraction only where the slash would split it (#20) 2026-10-07 07:36:38 +00:00
adrianbonpin a804afd56a feat: render LaTeX, custom HTML and diagrams in the transcript (#19) 2026-10-07 07:26:40 +00:00
adrianbonpin 550a2bbefe fix: name each tool once, and stream the reasoning live (#18) 2026-10-06 14:18:50 +00:00
adrianbonpin ff99778e5d fix: print the running tool once, not twice (#17) 2026-10-05 09:49:39 +00:00
adrianbonpin 26e05dea5b feat: Ollama models command, with load/pull/delete and unload (#16) 2026-10-05 09:43:00 +00:00
adrianbonpin 05fd9ff13b feat: auto-delete old conversations, and stop a tool call that repeats (#15) 2026-10-05 09:05:15 +00:00
adrianbonpin 576c5946f7 feat: snip a region into chat, and make links clickable (#14) 2026-10-05 08:38:50 +00:00
adrianbonpin f5d1ced4d6 chore: sweep em dashes from our own source and README (#13) 2026-10-03 22:03:00 +00:00
adrianbonpin 95edbcd20b fix: fence lone commands and give the prompt some warmth (#12) 2026-10-03 22:00:38 +00:00
adrianbonpin 75fc914eca feat: cmd+shift+delete deletes the highlighted conversation (#11) 2026-10-03 21:45:09 +00:00
adrianbonpin ac2da73669 feat: label code fences so Vicinae can colour them (#10) 2026-10-03 21:37:11 +00:00
adrianbonpin c49ffeb274 feat: strip speaker labels from the transcript, add a plain-prose prompt (#9) 2026-10-03 21:28:38 +00:00
adrianbonpin ee96f1ee61 feat: display toggles, smart session resume, fix stale transcript pane (#8) 2026-10-03 21:22:04 +00:00
adrianbonpin ffe2c6b7ed feat: newest message first, Raycast-style conversation sidebar (#7) 2026-10-03 21:15:44 +00:00
adrianbonpin 9b35fcef11 feat: conversations on the left, the transcript on the right (#6) 2026-10-03 21:09:36 +00:00
adrianbonpin d448a4377b feat: mark each speaker with a role icon in the transcript (#5) 2026-10-03 21:03:26 +00:00
adrianbonpin 31eb688455 feat: message-per-row transcript, session resume, drop the composer (#4) 2026-10-03 20:59:01 +00:00
adrianbonpin af0c75a65d style: strip the multi-line composer down to a bare editor (#3) 2026-10-03 20:45:29 +00:00
adrianbonpin 7afafdaf32 test: cover the Ollama web tools, mark trimmed snippets, new icon (#2) 2026-10-03 20:36:38 +00:00
adrianbonpin 8b507e7953 feat: initial Lam Agent extension (#1) 2026-10-03 20:32:40 +00:00
adrianbonpin 1d39aabb50 Initial commit 2026-10-03 20:11:02 +00:00