Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
56c9b77
fix: reset activatedViaWakeWord flag on voice mode activation failure…
alex-nork Feb 24, 2026
2ada379
fix: use effective base URL for polling and cancel task on dismiss (#…
ashleeradka Feb 24, 2026
7a8b719
fix: derive segment count from manifest in media diagnostics (#8187)
alex-nork Feb 24, 2026
f2c44e5
fix: enforce payload size limit on pairing proxy endpoints (#8188)
ashleeradka Feb 24, 2026
c2cd8af
fix: restore approvalConversationGenerator in RuntimeHttpServer (#8189)
ashleeradka Feb 24, 2026
6f177c5
fix: approved devices race condition and optimistic clear (#8190)
ashleeradka Feb 24, 2026
4b2dded
fix: move zero-frame check before atomic rename in preprocess (#8191)
alex-nork Feb 24, 2026
897dfda
fix: include context field in map cache config hash (#8192)
alex-nork Feb 24, 2026
2e06a32
fix: align lastPairedAt type to Int matching generated IPC types (#8193)
ashleeradka Feb 24, 2026
37e710c
improve Gmail OAuth setup UX with auto-detection and clearer messagin…
asharma53 Feb 24, 2026
fc0b5e1
fix: reset activatedViaWakeWord flag outside wakeWordEnabled guard (#…
alex-nork Feb 24, 2026
5f84e1c
fix: send deny on PairingApprovalWindow close and supersede (#8196)
ashleeradka Feb 24, 2026
54e14f0
fix: clear stale pairing overrides during v4 migration (#8197)
ashleeradka Feb 24, 2026
25190e2
fix: re-register QR pairing before TTL and handle missing daemon (#8199)
ashleeradka Feb 24, 2026
b37b7e0
fix: honor task cancellation in QRPairingSheet pairing flow (#8210)
ashleeradka Feb 24, 2026
9f0de84
fix: enforce Content-Length pre-check in pairing proxy (#8212)
ashleeradka Feb 24, 2026
e987ec2
fix: roll back optimistic removal in removeApprovedDevice on IPC fail…
ashleeradka Feb 24, 2026
e844801
feat: reduce maxTokens default from 64000 to 16000 (#8217)
alex-nork Feb 24, 2026
4e11e3b
feat: add streamThinking config flag and filter thinking deltas (#8219)
alex-nork Feb 24, 2026
f4bdc28
fix: skip deny on same-ID retry in PairingApprovalWindow (#8223)
ashleeradka Feb 24, 2026
35a7e2c
fix: update maxTokens schema default and tests to 16000 (#8224)
alex-nork Feb 24, 2026
1285794
fix: separate iOS override migration and guard macOS cleanup (#8225)
ashleeradka Feb 24, 2026
a0c1421
fix: avoid QR flicker during refresh and register on daemon connect (…
ashleeradka Feb 24, 2026
734e605
fix: handle floating promise and add timeout in title generation (#8228)
siddseethepalli Feb 24, 2026
50d6d73
refactor: deduplicate isPlainObject into shared utility (#8229)
siddseethepalli Feb 24, 2026
17a3546
perf: add database indexes on memorySegments table (#8230)
siddseethepalli Feb 24, 2026
9b66c3f
feat: add backpressure and metrics to session message queue (#8231)
siddseethepalli Feb 24, 2026
88be750
perf: cache shell-parsing and risk classification results (#8232)
siddseethepalli Feb 24, 2026
a4fcae5
security: add pino log serializer to scrub sensitive data (#8233)
siddseethepalli Feb 24, 2026
b8af96d
refactor: replace unsafe type assertions with proper type guards (#8234)
siddseethepalli Feb 24, 2026
04eced2
feat: add circuit breaker to gateway runtime client (#8236)
siddseethepalli Feb 24, 2026
b4f0187
refactor: create centralized environment variable registry (#8235)
siddseethepalli Feb 24, 2026
a8c3cdb
feat: add status indication to macOS menu bar icon (#8237)
siddseethepalli Feb 24, 2026
4b4d646
refactor: replace any types with proper interfaces in test files (#8241)
siddseethepalli Feb 24, 2026
a3f4741
fix: remove iosPairingUseOverride deletion from v4 migration (#8239)
ashleeradka Feb 24, 2026
5553988
fix: remove Porcupine iOS-only SPM dep that breaks Xcode 26.2 build (…
alex-nork Feb 24, 2026
4a0777d
perf: add database indexes on memoryItems table (#8244)
siddseethepalli Feb 24, 2026
147d341
fix: add per-surface serialization to prevent race conditions (#8245)
siddseethepalli Feb 24, 2026
15f9702
feat: source filter for Available Skills + platform catalog API (#8097)
dvargasfuertes Feb 24, 2026
8021f70
fix: add AbortSignal support to tool implementations (#8246)
siddseethepalli Feb 24, 2026
c85ac5b
refactor: split http-server.ts into focused middleware and route modu…
siddseethepalli Feb 24, 2026
5e06bcb
fix: handle QR refresh failure and remove dead onChange (#8248)
ashleeradka Feb 24, 2026
9672bc4
feat: add response style section, trim verbose system prompt sections…
alex-nork Feb 24, 2026
8b7fa08
security: enforce 0o600 permissions on log files (#8252)
siddseethepalli Feb 24, 2026
1fbdae8
fix: propagate AbortSignal through permission checking (#8253)
siddseethepalli Feb 24, 2026
bbada1a
feat: complete ingress config schema with validation (#8254)
siddseethepalli Feb 24, 2026
6572d67
perf: add database indexes on remaining tables (#8255)
siddseethepalli Feb 24, 2026
76cf18d
feat(macos): add secret dev mode toggle (#8226)
dvargasfuertes Feb 24, 2026
614a819
fix: reset refresh timer and failure counter on QR retry (#8257)
ashleeradka Feb 24, 2026
84d16a0
refactor: split lifecycle.ts into focused modules (#8259)
siddseethepalli Feb 24, 2026
933bc2c
feat: make global hotkey configurable in macOS client (#8258)
siddseethepalli Feb 24, 2026
dc8f213
feat: add structured error serialization to pino logger (#8260)
siddseethepalli Feb 24, 2026
94c7991
fix: add numeric bounds validation for memory item confidence/importa…
siddseethepalli Feb 24, 2026
f3ca3fa
feat: make hardcoded daemon timeout values configurable (#8265)
siddseethepalli Feb 24, 2026
4716191
feat: add Zod schema for message metadata validation (#8268)
siddseethepalli Feb 24, 2026
7607422
refactor: separate migration code from platform utilities (#8272)
siddseethepalli Feb 24, 2026
096bfda
refactor: use consistent pino logging throughout migration and startu…
siddseethepalli Feb 24, 2026
774570a
fix: resolve all CI type-check and lint errors (#8276)
siddseethepalli Feb 24, 2026
9b3a468
feat(macos): add health check indicator to Platform URL row (#8271)
dvargasfuertes Feb 24, 2026
45fada4
fix: move response style directives to SOUL.md, remove buildResponseS…
alex-nork Feb 24, 2026
60813ba
Guardian Cross-Channel Approval UX Polish (#8208)
noanflaherty Feb 24, 2026
1a09025
refactor: remove assistant inbox feature flag gating from desktop UI …
NgoHarrison Feb 24, 2026
d912d55
docs: add provider abstraction and approval resilience rules to AGENT…
awlevin Feb 24, 2026
c54b8c9
refactor: remove assistantInbox config schema and defaults (#8282)
NgoHarrison Feb 24, 2026
bce77d1
refactor: make ingress ACL enforcement always-on (remove feature flag…
NgoHarrison Feb 24, 2026
4247f97
docs: add rule for agents to keep AGENTS.md up to date (#8284)
awlevin Feb 24, 2026
e5defe0
refactor: remove assistantInbox feature-flag check from ingress ACL e…
NgoHarrison Feb 24, 2026
66d7e07
docs: update inbox docs to reflect always-on behavior (#8293)
NgoHarrison Feb 24, 2026
6e141f3
fix: change private to internal for properties accessed from AppDeleg…
vincent0426 Feb 24, 2026
3e32633
feat: increase maxInputTokens from 180k to 200k (#8295)
vincent0426 Feb 24, 2026
61e6087
fix: resolve CI type-check and lint errors in ingress config and impo…
siddseethepalli Feb 24, 2026
965c2ff
fix: use Chrome debugger API for CSP-bypass eval, fix Swift Result<Vo…
marinatrajk Feb 24, 2026
ef5afb6
refactor: remove QuickChat feature (#8300)
vincent0426 Feb 24, 2026
02ddcc4
fix: remove stale relayPort from storage when port field is cleared (…
marinatrajk Feb 24, 2026
b66b6f2
fix(macos): use consistent paragraph style for placeholder height mea…
noanflaherty Feb 24, 2026
b0a317f
fix(macos): resolve CI build errors in settings views (#8306)
siddseethepalli Feb 24, 2026
07035d4
fix: make error message bubbles span full chat width (#8312)
asharma53 Feb 24, 2026
c1d1861
feat: add Quick Input bar (Cmd+/) (#8309)
vincent0426 Feb 24, 2026
40d26a6
fix(lint): resolve lint errors in influencer client (#8316)
siddseethepalli Feb 24, 2026
05d6bb0
feat: request 16kHz mono format in AlwaysOnAudioMonitor audio tap (#8…
alex-nork Feb 24, 2026
3e4c4ad
feat: add PorcupineBinding.swift — dlopen wrapper for Porcupine C API…
alex-nork Feb 24, 2026
357b9ee
feat: bundle Porcupine dylib, model, and keywords in build.sh (#8321)
alex-nork Feb 24, 2026
838e44a
fix: always start daemon HTTP server for iOS pairing (#8322)
ashleeradka Feb 24, 2026
1862284
feat: replace PorcupineWakeWordEngine stub with real Porcupine C SDK …
alex-nork Feb 24, 2026
dfa254a
feat: add wake word keyword selection and fix APIKeyManager usage (#8…
alex-nork Feb 24, 2026
8957faf
fix(swift): fix IPC Unix socket protocol and reconnect on cancel (#8325)
ashleeradka Feb 24, 2026
549f15e
fix: use AVAudioConverter for 16kHz resampling instead of custom tap …
alex-nork Feb 24, 2026
aafaa0d
fix: move FRAMEWORKS_DIR definition before Porcupine staleness check …
alex-nork Feb 24, 2026
ea504cd
fix: add input validation and handle cleanup in PorcupineBinding (#8327)
alex-nork Feb 24, 2026
eb95f68
fix: prevent double dismiss of Quick Input panel on submit (#8315)
vincent0426 Feb 24, 2026
d63fcfd
Release v0.3.6 (#8329)
vellum-automation[bot] Feb 24, 2026
d427947
fix: move wake word callback outside lock and use dynamic frame lengt…
alex-nork Feb 24, 2026
829a582
fix: prevent duplicate audio in AVAudioConverter and use ceil for buf…
alex-nork Feb 24, 2026
3a810c0
perf: disable LLM reranking for memory recall (#8067)
vincent0426 Feb 24, 2026
7cbf1a7
fix(swift): restore NWProtocolTCP on Unix socket, keep cancelled reco…
ashleeradka Feb 24, 2026
83bc75c
fix: add explicit self. for property captures in PorcupineWakeWordEng…
vincent0426 Feb 24, 2026
c5c1622
fix: add explicit self for keyword reference in os.Logger closure (#8…
alex-nork Feb 24, 2026
29bec9f
fix: resolve CI failures blocking v0.3.7 release (#8344)
ashleeradka Feb 24, 2026
549bd3b
M1: Add Voice -> Run/Session Bridge (#8222)
noanflaherty Feb 24, 2026
2a2b54d
M2: Replace CallOrchestrator with Session-Backed Voice Controller (#8…
noanflaherty Feb 24, 2026
4de1538
M3: Guardian Context and Side-Effect Policy Parity (#8299)
noanflaherty Feb 24, 2026
ad381ee
M4: Clean Up Legacy Orchestrator Artifacts + Docs (#8304)
noanflaherty Feb 24, 2026
88709c9
fix: address final PR review feedback — move bridge injection, fix op…
noanflaherty Feb 24, 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
34 changes: 34 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ Comments should explain **why** something is done and provide non-obvious contex

Whenever you introduce, remove, or significantly modify a service, module, or data flow, you MUST update `ARCHITECTURE.md` to reflect the change. The Mermaid diagrams should always accurately represent the current system architecture, including new services, IPC message types, storage locations, and data flows.

## Keep AGENTS.md up to date

When your PR establishes a new mandatory pattern, convention, or architectural constraint that other agents must follow, update `AGENTS.md` in the same PR. Examples: introducing a new abstraction layer that all callsites must use, adding a guard test that enforces an import rule, or changing how a subsystem handles failure modes. If the pattern is only relevant within a single file or module, a code comment is sufficient — only add to `AGENTS.md` when the rule applies project-wide.

## Slash Commands — TLDR

These are the most commonly used slash commands defined in `.claude/commands/`:
Expand Down Expand Up @@ -135,6 +139,36 @@ Concretely:

Why: the gateway is the single point of ingress, handling TLS termination, auth, rate limiting, and routing. Exposing the daemon directly bypasses these protections and breaks the deployment model.

## LLM Provider Abstraction

All LLM calls in production code **MUST** go through the provider abstraction layer — never import `@anthropic-ai/sdk` (or any other provider SDK) directly.

- Use `getConfiguredProvider()` from `providers/provider-send-message.ts` to obtain a provider instance, then call `provider.sendMessage(...)`.
- Use the helper utilities (`extractText`, `extractToolUse`, `userMessage`, `createTimeout`, etc.) from the same module.
- A guard test (`no-direct-anthropic-sdk-imports.test.ts`) enforces this — any new direct SDK import in production code will fail CI.
- The only file allowed to import `@anthropic-ai/sdk` directly is `providers/anthropic/client.ts`.

### Model intents over hardcoded model IDs

Do not hardcode provider-specific model names (e.g., `claude-haiku-4-5-20251001`, `gpt-4o-mini`). Instead, use `modelIntent` in the config to express **what you need** from the model:

- `'latency-optimized'` — fastest response (e.g., classifiers, triage, icon generation)
- `'quality-optimized'` — best reasoning (e.g., summaries, complex analysis)
- `'vision-optimized'` — best vision/multimodal capabilities

The `RetryProvider` resolves intents to provider-specific models automatically. An explicit `model` in config takes precedence over `modelIntent`.

### Provider-agnostic language

Use generic terms in comments, logs, and variable names — write "LLM" instead of "Haiku"/"Sonnet"/"Claude". The system is multi-provider; naming should reflect that.

## Approval Flow Resilience

- **Rich delivery failures must degrade gracefully.** If delivering a rich approval prompt (e.g., Telegram inline buttons) fails, fall back to plain text with parser-compatible instructions (e.g., `Reply "yes" to approve`) — never auto-deny.
- **Non-rich channels** (SMS, http-api) receive plain-text approval prompts without approval metadata payloads.
- **Race conditions:** Always check whether a decision has already been resolved before delivering the engine's optimistic reply. If `handleChannelDecision` returns `applied: false`, deliver an "already resolved" notice and return `stale_ignored`.
- **Requester self-cancel:** A requester with a pending guardian approval must be able to cancel their own request (but not self-approve).

## Tooling Direction

Do not add new tool registrations using the `class ____Tool implements Tool {` pattern.
Expand Down
118 changes: 73 additions & 45 deletions ARCHITECTURE.md

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions assistant/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -292,13 +292,13 @@ The assistant inbox provides secure cross-user messaging, allowing external user

### Ingress Membership

External users join through **invite tokens** — the owner creates an invite via the desktop UI or IPC, and the external user redeems the token by sending it as a channel message. Redemption auto-creates a **member** record with a configurable access policy:
External users join through **invite tokens** — the owner creates an invite via the desktop UI or IPC, and the external user redeems the token by sending it as a channel message. Redemption auto-creates a **member** record with an access policy:

- **`allow`** — Messages are processed normally through the agent pipeline.
- **`deny`** — Messages are rejected with a refusal notice.
- **`escalate`** — Messages are held for guardian (owner) approval before processing.

The default policy for new members is controlled by the `inbox_default_policy` config. Members can be listed, updated, revoked, or blocked via the `ingress_member` IPC contract.
Non-members (senders with no invite redemption) are denied by default. Members can be listed, updated, revoked, or blocked via the `ingress_member` IPC contract.

### Escalation Flow (Dual-Surface)

Expand Down
2 changes: 1 addition & 1 deletion assistant/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@vellumai/assistant",
"version": "0.3.5",
"version": "0.3.6",
"type": "module",
"bin": {
"vellum": "./src/index.ts"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2614,6 +2614,7 @@ exports[`IPC message snapshots ServerMessage types guardian_request_thread_creat
{
"callSessionId": "call-001",
"conversationId": "conv-guardian-001",
"questionText": "What is the gate code?",
"requestId": "req-guardian-001",
"title": "Guardian action request",
"type": "guardian_request_thread_created",
Expand Down
Loading