This commit is contained in:
alex wiesner
2026-03-13 20:15:22 +00:00
parent e68c95b2dd
commit c4d39f2812
33 changed files with 2383 additions and 162 deletions

View File

@@ -1,3 +1,9 @@
---
title: decisions
type: note
permalink: voyage/decisions
---
# Voyage — Decisions Log
## Fork from AdventureLog
@@ -391,4 +397,4 @@
- **Regression tests verified**: `test_get_trip_details_owner_also_in_shared_with_avoids_duplicates` (tests.py:53-59) and `test_add_to_itinerary_owner_also_in_shared_with_avoids_duplicates` (tests.py:81-96) both add owner to `shared_with` and exercise the exact codepath that would raise `MultipleObjectsReturned` without `.distinct()`.
- **No new issues introduced**: `.distinct()` placement in ORM chain is correct, no logic changes to error handling or return shapes, no mutations to other code paths.
- **Reference**: See [Plan: Chat provider fixes](plans/chat-provider-fixes.md#shared-trip-tool-access)
- **Date**: 2026-03-09
- **Date**: 2026-03-09

View File

@@ -1,3 +1,9 @@
---
title: knowledge
type: note
permalink: voyage/knowledge
---
# DEPRECATED — Migrated to nested structure (2026-03-09)
This file has been superseded. Content has been migrated to:
@@ -10,4 +16,4 @@ This file has been superseded. Content has been migrated to:
- **[knowledge/domain/collections-and-sharing.md](knowledge/domain/collections-and-sharing.md)** — Collection sharing, itinerary, user preferences
- **[knowledge/domain/ai-configuration.md](knowledge/domain/ai-configuration.md)** — WS1 config infrastructure, frontend gaps
See [manifest.yaml](manifest.yaml) for the full index.
See [manifest.yaml](manifest.yaml) for the full index.

View File

@@ -1,3 +1,9 @@
---
title: conventions
type: note
permalink: voyage/knowledge/conventions
---
# Coding Conventions & Patterns
## Frontend Patterns
@@ -18,4 +24,4 @@
- Do **not** attempt to fix known test/configuration issues as part of feature work
- Use `bun` for frontend commands, `uv` for local Python tooling where applicable
- Commit and merge completed feature branches promptly once validation passes (avoid leaving finished work unmerged)
- See [decisions.md](../decisions.md#workflow-preference-commit--merge-when-done) for rationale
- See [decisions.md](../decisions.md#workflow-preference-commit--merge-when-done) for rationale

View File

@@ -1,3 +1,9 @@
---
title: ai-configuration
type: note
permalink: voyage/knowledge/domain/ai-configuration
---
# AI Configuration Domain
## WS1 Configuration Infrastructure
@@ -41,4 +47,4 @@ Three compounding issues (all resolved):
| Fallback key | `backend/server/chat/llm_client.py` | `get_llm_api_key()` |
| UserAISettings model | `backend/server/integrations/models.py` | after UserAPIKey |
| Catalog user flags | `backend/server/chat/llm_client.py` | `get_provider_catalog()` |
| Provider view | `backend/server/chat/views/__init__.py` | `ChatProviderCatalogViewSet` |
| Provider view | `backend/server/chat/views/__init__.py` | `ChatProviderCatalogViewSet` |

View File

@@ -1,3 +1,9 @@
---
title: collections-and-sharing
type: note
permalink: voyage/knowledge/domain/collections-and-sharing
---
# Collections & Sharing Domain
## Collection Sharing Architecture
@@ -65,4 +71,4 @@ Backend-only feature: model, API, and system-prompt integration exist, but **no
### Frontend Gap
- No settings tab for manual preference editing
- TypeScript type available as `UserRecommendationPreferenceProfile` in `src/lib/types.ts`
- See [Plan: AI travel agent redesign](../../plans/ai-travel-agent-redesign.md#ws2-user-preference-learning)
- See [Plan: AI travel agent redesign](../../plans/ai-travel-agent-redesign.md#ws2-user-preference-learning)

View File

@@ -1,3 +1,9 @@
---
title: overview
type: note
permalink: voyage/knowledge/overview
---
# Architecture Overview
## API Proxy Pattern
@@ -40,4 +46,4 @@ Session-based via `django-allauth`. CSRF tokens from `/auth/csrf/`, passed as `X
- i18n: `frontend/src/locales/`
- Docker config: `docker-compose.yml`, `docker-compose.dev.yml`
- CI/CD: `.github/workflows/`
- Public docs: `documentation/` (VitePress)
- Public docs: `documentation/` (VitePress)

View File

@@ -1,3 +1,9 @@
---
title: chat-and-llm
type: note
permalink: voyage/knowledge/patterns/chat-and-llm
---
# Chat & LLM Patterns
## Default AI Settings & Model Override
@@ -164,4 +170,4 @@ All tool functions: `def tool_name(user, **kwargs) -> dict`. Return `{"error": "
## WS4-F3 Add-to-itinerary from Chat
- `search_places` card results can be added directly to itinerary when collection context exists
- Flow: date selector modal -> `POST /api/locations/` -> `POST /api/itineraries/` -> `itemAdded` event
- Coordinate guard (`hasPlaceCoordinates`) required
- Coordinate guard (`hasPlaceCoordinates`) required

View File

@@ -1,3 +1,9 @@
---
title: tech-stack
type: note
permalink: voyage/knowledge/tech-stack
---
# Tech Stack & Development
## Stack
@@ -62,4 +68,4 @@ LLM provider keys stored per-user in DB (`UserAPIKey` model, `integrations/model
- Docker dev setup has frontend-backend communication issues (500 errors beyond homepage)
- Frontend check: 0 errors, 6 warnings expected (pre-existing in `CollectionRecommendationView.svelte` + `RegionCard.svelte`)
- Backend tests: 6/30 pre-existing failures (2 user email key errors + 4 geocoding API mocks)
- Local Python pip install fails (network timeouts) — use Docker
- Local Python pip install fails (network timeouts) — use Docker

View File

@@ -1,3 +1,9 @@
---
title: ai-travel-agent-collections-integration
type: note
permalink: voyage/plans/ai-travel-agent-collections-integration
---
# Plan: AI travel agent in Collections Recommendations
## Clarified requirements
@@ -105,4 +111,4 @@
- [x] WS2-F2 OpenCode Zen provider support (Tier 2)
- [x] WS1-F1 Embed AI chat into Collections Recommendations (Tier 2)
- [x] WS1-F2 Remove standalone `/chat` route (Tier 2)
- [x] Documentation coverage + knowledge sync (Librarian)
- [x] Documentation coverage + knowledge sync (Librarian)

View File

@@ -1,3 +1,9 @@
---
title: ai-travel-agent-redesign
type: note
permalink: voyage/plans/ai-travel-agent-redesign
---
# AI Travel Agent Redesign Plan
## Vision Summary
@@ -335,4 +341,4 @@ See [Project Knowledge — WS4-F4 Chat UI Rendering](../knowledge.md#ws4-f4-chat
- WSGI→ASGI migration (keep current async-in-sync pattern)
- Role-based permissions (all shared users have same access)
- Real-time collaboration (WebSocket sync)
- Mobile-specific optimizations
- Mobile-specific optimizations

View File

@@ -1,3 +1,9 @@
---
title: chat-provider-fixes
type: note
permalink: voyage/plans/chat-provider-fixes
---
# Chat Provider Fixes
## Problem Statement
@@ -580,4 +586,4 @@ See [decisions.md](../decisions.md#correctness-review-chat-regression-tests).
- Prior tester finding (chat-tool-grounding-and-confirmation adversarial item 5): shared-member `get_trip_details` returns DoesNotExist — **CONTRADICTED / RESOLVED** by `shared-trip-tool-access` fix. Confirmed by `test_get_trip_details_allows_shared_user_access` passing in this run.
- Prior tester finding (chat-loop-hardening): `get_weather` "dates must be a non-empty list" did not short-circuit — **RESOLVED** by `chat-tool-grounding-and-confirmation`. Confirmed by `test_dates_is_required_matches_required_param_short_circuit` passing.
**Reviewer optional suggestions** (not blocking, not addressed): (1) split `test_non_member_access_remains_denied` into two test methods; (2) add explicit multi-param positive regex case. Neither represents a coverage gap for the fixed behavior.
**Reviewer optional suggestions** (not blocking, not addressed): (1) split `test_non_member_access_remains_denied` into two test methods; (2) add explicit multi-param positive regex case. Neither represents a coverage gap for the fixed behavior.

View File

@@ -1,3 +1,9 @@
---
title: opencode-zen-connection-error
type: note
permalink: voyage/plans/opencode-zen-connection-error
---
# Plan: Fix OpenCode Zen connection errors in AI travel chat
## Clarified requirements
@@ -398,4 +404,4 @@ The plan is well-scoped, targets a verified root cause with clear code reference
- `docs/docs/configuration/advanced_configuration.md` — Chat uses per-user API keys (no server-side env vars); no config changes to document.
### Task tracker
- [x] Documentation and knowledge sync for provider troubleshooting notes (Agent: librarian)
- [x] Documentation and knowledge sync for provider troubleshooting notes (Agent: librarian)

View File

@@ -1,3 +1,9 @@
---
title: pre-release-and-memory-migration
type: note
permalink: voyage/plans/pre-release-and-memory-migration
---
# Plan: Pre-release policy + .memory migration
## Scope
@@ -33,4 +39,4 @@
| `knowledge.md` §WS1 Config, §Frontend Gaps | `knowledge/domain/ai-configuration.md` | AI configuration domain |
| (new) | `sessions/continuity.md` | Session continuity notes |
| (new) | `gates/.gitkeep` | Quality gates directory placeholder |
| `knowledge.md` | `knowledge.md` (DEPRECATED) | Deprecation notice with pointers to new locations |
| `knowledge.md` | `knowledge.md` (DEPRECATED) | Deprecation notice with pointers to new locations |

View File

@@ -1,3 +1,9 @@
---
title: travel-agent-context-and-models
type: note
permalink: voyage/plans/travel-agent-context-and-models
---
# Plan: Travel Agent Context + Models Follow-up
## Scope
@@ -672,4 +678,4 @@ Replacing LiteLLM is not warranted. Every Voyage issue is in the integration lay
- **No production project does universal runtime model discovery** — all use curated/admin-managed lists
- **Every production LiteLLM user has retry logic** — Voyage is the outlier with zero retries
- **Tool-call capability guards** are standard (`litellm.supports_function_calling()` used by PraisonAI, open-interpreter, mem0, ragbits, dspy)
- **Rate-limit resilience** ranges from simple `num_retries` to full `litellm.Router` with `RetryPolicy` and cross-model fallbacks
- **Rate-limit resilience** ranges from simple `num_retries` to full `litellm.Router` with `RetryPolicy` and cross-model fallbacks

View File

@@ -1,3 +1,9 @@
---
title: auto-learn-preference-signals
type: note
permalink: voyage/research/auto-learn-preference-signals
---
# Research: Auto-Learn User Preference Signals
## Purpose
@@ -127,4 +133,4 @@ def build_auto_preference_profile(user) -> dict:
flow directly into AI context with zero additional changes needed there.
See: [knowledge.md — User Recommendation Preference Profile](../knowledge.md#user-recommendation-preference-profile)
See: [plans/ai-travel-agent-redesign.md — WS2](../plans/ai-travel-agent-redesign.md#ws2-user-preference-learning)
See: [plans/ai-travel-agent-redesign.md — WS2](../plans/ai-travel-agent-redesign.md#ws2-user-preference-learning)

View File

@@ -1,3 +1,9 @@
---
title: litellm-zen-provider-catalog
type: note
permalink: voyage/research/litellm-zen-provider-catalog
---
# Research: LiteLLM provider catalog and OpenCode Zen support
Date: 2026-03-08
@@ -32,4 +38,4 @@ Related plan: [AI travel agent in Collections Recommendations](../plans/ai-trave
## Risks
- Zen model names may evolve; keep default model configurable in backend mapping.
- Full provider list is large; UI should communicate unavailable-for-chat providers clearly.
- Full provider list is large; UI should communicate unavailable-for-chat providers clearly.

View File

@@ -1,3 +1,9 @@
---
title: opencode-zen-connection-debug
type: note
permalink: voyage/research/opencode-zen-connection-debug
---
# OpenCode Zen Connection Debug — Research Findings
**Date**: 2026-03-08
@@ -300,4 +306,4 @@ Exception: `opencode_zen` and `openrouter` accept any prefix (they're routing ga
- See [Plan: OpenCode Zen connection error](../plans/opencode-zen-connection-error.md)
- See [Research: LiteLLM provider catalog](litellm-zen-provider-catalog.md)
- See [Knowledge: AI Chat](../knowledge.md#ai-chat-collections--recommendations)
- See [Knowledge: AI Chat](../knowledge.md#ai-chat-collections--recommendations)

View File

@@ -1,3 +1,9 @@
---
title: provider-strategy
type: note
permalink: voyage/research/provider-strategy
---
# Research: Multi-Provider Strategy for Voyage AI Chat
**Date**: 2026-03-09
@@ -195,4 +201,4 @@ Should use provider_config default or user-selected model.
- See [Research: LiteLLM provider catalog](litellm-zen-provider-catalog.md)
- See [Research: OpenCode Zen connection debug](opencode-zen-connection-debug.md)
- See [Plan: Travel agent context + models](../plans/travel-agent-context-and-models.md)
- See [Decisions: Critic Gate](../decisions.md#critic-gate-travel-agent-context--models-follow-up)
- See [Decisions: Critic Gate](../decisions.md#critic-gate-travel-agent-context--models-follow-up)

View File

@@ -1,3 +1,9 @@
---
title: continuity
type: note
permalink: voyage/sessions/continuity
---
# Session Continuity
## Last Session (2026-03-09)
@@ -21,4 +27,4 @@
- LLM-generated name/location fields not truncated to `max_length=200` before `LocationSerializer` (low risk)
- Non-English locale `chat_a11y` values are English placeholders — requires human translation (separate concern)
- `outsideEvents` array includes both `pointerdown` and `mousedown` — double-fires but idempotent; could simplify to `['pointerdown', 'touchstart']`
- Escape handler in settings dropdown lacks `settingsOpen` guard — idempotent no-op, no functional consequence
- Escape handler in settings dropdown lacks `settingsOpen` guard — idempotent no-op, no functional consequence

View File

@@ -1 +1,7 @@
Voyage is a self-hosted travel companion web app (fork of AdventureLog) built with SvelteKit 2 (TypeScript) frontend, Django REST Framework (Python) backend, PostgreSQL/PostGIS, Memcached, and Docker. It provides trip planning with collections/itineraries, AI-powered travel chat with multi-provider LLM support (via LiteLLM), location/lodging/transportation management, user preference learning, and collaborative trip sharing. The project is pre-release — architecture-level changes are allowed. See [knowledge/overview.md](knowledge/overview.md) for architecture and [decisions.md](decisions.md) for ADRs.
---
title: system
type: note
permalink: voyage/system
---
Voyage is a self-hosted travel companion web app (fork of AdventureLog) built with SvelteKit 2 (TypeScript) frontend, Django REST Framework (Python) backend, PostgreSQL/PostGIS, Memcached, and Docker. It provides trip planning with collections/itineraries, AI-powered travel chat with multi-provider LLM support (via LiteLLM), location/lodging/transportation management, user preference learning, and collaborative trip sharing. The project is pre-release — architecture-level changes are allowed. See [knowledge/overview.md](knowledge/overview.md) for architecture and [decisions.md](decisions.md) for ADRs.