1782 Commits

Author SHA1 Message Date
alex wiesner
7a53cc2cc7 reduce production image size without runtime drift
Some checks are pending
Upload latest backend image to GHCR / upload (push) Waiting to run
Test Backend / Build and Test Backend (push) Waiting to run
Upload latest frontend image to GHCR / upload (push) Waiting to run
Test Frontend / Build and Test Frontend (push) Waiting to run
Trivy Security Scans / Trivy Filesystem Scan (Source Code) (push) Waiting to run
Trivy Security Scans / Trivy Docker Image Scan (Backend & Frontend) (push) Waiting to run
2026-03-16 15:07:36 +00:00
alex wiesner
f24aa53575 format assistant suggestion markup 2026-03-15 21:40:27 +00:00
alex wiesner
c35676a3ff isolate dev compose frontend runtime 2026-03-15 16:49:18 +00:00
alex wiesner
33cf6de6ac upgrade frontend toolchain to a coherent Svelte 5 stack 2026-03-15 16:12:44 +00:00
alex wiesner
7f03da23dd align dependency runtime baselines across Docker and CI 2026-03-15 15:40:40 +00:00
alex wiesner
566077533b fix proxy csrf handling for suggestion requests 2026-03-14 12:59:35 +00:00
alex wiesner
4b3f432640 add outbound links to place suggestions 2026-03-14 12:05:55 +00:00
alex wiesner
1b004b9e65 add place link metadata for suggestions 2026-03-14 11:57:14 +00:00
alex wiesner
8f12aee5e1 remove debugging artifacts 2026-03-14 11:42:35 +00:00
alex wiesner
549d0b27cd changes 2026-03-14 11:42:00 +00:00
alex wiesner
d1704af827 fix: persist assistant tool errors and markdown 2026-03-14 11:22:14 +00:00
alex wiesner
c4d39f2812 changes 2026-03-13 20:15:22 +00:00
alex wiesner
e68c95b2dd fix: suppress duplicate assistant itinerary adds 2026-03-13 20:14:27 +00:00
84cf9d96ee Clean up Voyage branding metadata
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-10 22:25:05 +00:00
a0bf8df221 fix: repair chat panel layout in panelMode
The conversations sidebar was force-shown via 'lg:flex' at large
breakpoints even when sidebarOpen was false, causing a broken split-
layout in the w-96 drawer panel (~144px left for actual chat).

Fixes:
- Sidebar no longer force-applies lg:flex in panelMode
- In panelMode the sidebar goes full-width and hides the chat area
  entirely (stacked panel pattern instead of split-column)
- Hamburger toggle is always visible in panelMode (was lg:hidden)
- Selecting a conversation or creating a new one auto-closes the
  sidebar in panelMode, returning to chat view
- Welcome screen and header title use compact sizing in panelMode
2026-03-10 21:51:05 +00:00
25c1dc8b5d docs: update AGENTS.md for travel assistant workflow redesign 2026-03-10 20:28:45 +00:00
c9cea80875 chore: remove unused lucide-svelte dependency and format worldtravel page 2026-03-10 20:26:12 +00:00
a58acdde00 Merge branch 'feat/remove-discover-and-recommendations'
# Conflicts:
#	frontend/src/routes/collections/[id]/+page.svelte
2026-03-10 20:24:39 +00:00
6e66f7aabb Merge branch 'feat/itinerary-collab-chat' 2026-03-10 20:20:36 +00:00
38e6eb77ba Merge branch 'feat/admin-editable-assistant-prompt' 2026-03-10 20:20:30 +00:00
9d3006ad8e feat: remove recommendations surface and backend 2026-03-10 20:20:00 +00:00
4caa1d717e feat: remove Globe Spin discover feature 2026-03-10 20:12:12 +00:00
7b4541a075 fix(collections): tighten itinerary chat panel access and state scoping 2026-03-10 20:04:15 +00:00
e6a7c83a3a feat(collections): dock travel assistant chat as persistent panel 2026-03-10 19:57:12 +00:00
208a4626ca feat(chat): add admin-editable assistant system prompt 2026-03-10 19:46:53 +00:00
992ba401f9 fix(chat): prevent duplicate itinerary entries on repeat add_to_itinerary calls 2026-03-10 19:42:23 +00:00
635e0df0ab fix(chat): stop 429 retry spiral and add get_weather coord fallback
- search_places: detect HTTP 429 and mark retryable=False to stop the
  retry loop immediately instead of spiraling until MAX_ITERATIONS
- get_weather: extract collection coordinates (lat/lng from first
  location with coords) and retry when LLM omits required params;
  uses sync_to_async for the DB query in the async view
- AITravelChat: deduplicate context-only tools (get_trip_details,
  get_weather) in the render pipeline to prevent duplicate place cards
  from appearing when the retry loop causes multiple get_trip_details calls
- Tests: 5 new tests covering 429 non-retryable path and weather
  coord fallback; all 39 chat tests pass
2026-03-10 19:18:55 +00:00
de8625c17f chore: ignore memory dirs and worktrees at repo root 2026-03-10 18:41:17 +00:00
78d2b3774e chore: remove accidental memory files from repo root
These were stashed basic-memory files that got staged. Memory files
belong in .memory/ (managed by basic-memory MCP), not the repo root.
2026-03-10 18:40:45 +00:00
c4b8f291f2 docs: update docs and AGENTS.md with chat tool loop fix patterns 2026-03-10 18:40:34 +00:00
0ca73a417d fix(chat): resolve clarification loop and duplicate place cards 2026-03-10 18:39:30 +00:00
89b42126ec fix(chat): fix location clarification loop and test isolation bugs
- Add _COMMAND_VERBS guard to _is_likely_location_reply() so messages
  starting with imperative verbs (find, search, show, get, ...) are not
  mistakenly treated as user location replies. This prevented 'Find
  good places' from being used as a retry location, which was causing
  the clarification path to never fire and the tool loop to exhaust
  MAX_ALL_FAILURE_ROUNDS instead.
- Extract city from comma-delimited fallback address strings when
  city/country FKs are absent, e.g. 'Little Turnstile 6, London'
  → 'London', so context-based location retry works for manually-
  entered itinerary stops without geocoded FK data.
- Add attempted_location_retry flag: if retry was attempted but all
  retry attempts failed, convert result to an execution failure rather
  than emitting a clarification prompt (user already provided context
  via their itinerary).
- Fix test assertion ordering in test_collection_context_retry_extracts_
  city_from_fallback_address: streaming_content must be consumed before
  checking mock call counts since StreamingHttpResponse is lazy.
2026-03-10 18:37:30 +00:00
dbabbdf9f0 fix(chat): stop retry spirals on tool failures 2026-03-10 18:05:34 +00:00
212ce33e36 fix(chat): normalize itinerary search locations 2026-03-10 17:29:37 +00:00
46d7704e4f fix(chat): use itinerary context for restaurant searches 2026-03-10 17:12:29 +00:00
a023a9548c fix(chat): retry search_places using user location reply 2026-03-10 16:48:39 +00:00
403f47b57c test(chat): use transaction case for async stream assertion 2026-03-10 16:34:56 +00:00
84384df236 fix(chat): clarify missing-location search requests 2026-03-10 16:26:02 +00:00
1ad9d20037 fix(chat): stabilize assistant add flow and location routing 2026-03-10 15:59:07 +00:00
49abfad192 chore: update dependencies
Backend:
- gunicorn 23.0.0 → 25.1.0
- setuptools 79.0.1 → 82.0.1
- litellm >=1.72.3 → >=1.82.1

Frontend:
- Migrate Tailwind CSS 3 → 4, daisyUI 4 → 5
  - Add @tailwindcss/vite plugin, remove autoprefixer
  - Replace tailwind.config.js with src/app.css (CSS-based config)
  - Convert custom themes (aestheticDark, catppuccinMocha, aestheticLight,
    northernLights) to daisyUI 5 CSS variable format
  - Remove daisyUI v4-only '-bordered' classes from 45 component files
    (input-bordered, select-bordered, textarea-bordered, file-input-bordered
    are removed in v5; borders are default)
- @types/node 22 → 25
- @lukulent/svelte-umami 0.0.3 → 0.0.4
- packageManager: bun@1.2.22 → bun@1.3.10

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-10 13:34:49 +00:00
61ea33dc24 fix(frontend): use oven/bun base image to fix arm64 build failure
Replaced `node:22-alpine` + `npm install -g bun@1.2.22` with
`oven/bun:1.2.22-alpine` as the builder stage base image.

The npm-based bun install was failing on linux/arm64 with:
  "Failed to find package @oven/bun-linux-aarch64"

The official oven/bun Docker image supports both linux/amd64 and
linux/arm64 natively, eliminating the need to install bun via npm.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-10 13:12:31 +00:00
09c35b3e2c docs(chat): record shared access and control behavior 2026-03-09 22:05:25 +00:00
c918c9ce2f fix(chat): support shared trips and polish controls 2026-03-09 22:04:53 +00:00
d8c8ecf2bd fix(chat): clean up tool output and embedded UX 2026-03-09 21:12:46 +00:00
bb54503235 fix(chat): add saved AI defaults and harden suggestions 2026-03-09 20:32:13 +00:00
21954df3ee fix(chat): improve OpenCode Zen integration and error handling
- Fetch models dynamically from OpenCode Zen API (36 models vs 5 hardcoded)
- Add function calling support check before using tools
- Add retry logic (num_retries=2) for transient failures
- Improve logging for debugging API calls and errors
- Update system prompt for multi-stop itinerary context
- Clean up unused imports in frontend components
- Remove deleted views.py (moved to views/__init__.py)
2026-03-09 16:11:14 +00:00
21ef73f49d docs: add pre-release policy to agent instructions 2026-03-09 15:15:47 +00:00
30fdcb078f fix: resolve three travel agent UI issues
- Connection error: wrap sync get_llm_api_key() in sync_to_async in
  stream_chat_completion() to fix SynchronousOnlyOperation raised when
  the async SSE generator calls a synchronous Django ORM function
- Models not loading: add opencode_zen handler to models endpoint
  returning its default model; fix frontend to show 'Default' instead
  of 'Loading...' indefinitely when no model list is returned
- Location in header: remove destination subtitle from Travel Assistant
  header — collection-wide chat has no single meaningful location
2026-03-09 13:34:35 +00:00
91d907204a fix(ai): critical fixes for agent-redesign - provider selection and auto-learn
Fix 1: Provider/Model Selection (Critical - unblocks LLM)
- Add /api/chat/providers/{id}/models/ endpoint to fetch available models
- Auto-select first configured provider instead of hardcoded 'openai'
- Add model dropdown populated from provider API
- Filter provider list to only show configured providers
- Show helpful error when no providers configured

Fix 2: Auto-Learn Preferences (Replaces manual input)
- Create auto_profile.py utility to infer preferences from user data
- Learn interests from Activity sport types and Location categories
- Learn trip style from Lodging types (hostel=budget, resort=luxury, etc.)
- Learn geographic preferences from VisitedRegion/VisitedCity
- Call auto-learn on every chat start (send_message)
- System prompt now indicates preferences are auto-inferred

Fix 3: Remove Manual Preference UI
- Remove travel_preferences section from Settings
- Remove preference form fields and save logic
- Remove preference fetch from server-side load
- Keep UserRecommendationPreferenceProfile type for backend use

The LLM should now work correctly:
- Users with any configured provider will have it auto-selected
- Model list is fetched dynamically from provider API
- Preferences are learned from actual travel history
2026-03-09 00:20:11 +00:00
9d5681b1ef feat(ai): implement agent-redesign plan with enhanced AI travel features
Phase 1 - Configuration Infrastructure (WS1):
- Add instance-level AI env vars (VOYAGE_AI_PROVIDER, VOYAGE_AI_MODEL, VOYAGE_AI_API_KEY)
- Implement fallback chain: user key → instance key → error
- Add UserAISettings model for per-user provider/model preferences
- Enhance provider catalog with instance_configured and user_configured flags
- Optimize provider catalog to avoid N+1 queries

Phase 1 - User Preference Learning (WS2):
- Add Travel Preferences tab to Settings page
- Improve preference formatting in system prompt with emoji headers
- Add multi-user preference aggregation for shared collections

Phase 2 - Day-Level Suggestions Modal (WS3):
- Create ItinerarySuggestionModal with 3-step flow (category → filters → results)
- Add AI suggestions button to itinerary Add dropdown
- Support restaurant, activity, event, and lodging categories
- Backend endpoint POST /api/chat/suggestions/day/ with context-aware prompts

Phase 3 - Collection-Level Chat Improvements (WS4):
- Inject collection context (destination, dates) into chat system prompt
- Add quick action buttons for common queries
- Add 'Add to itinerary' button on search_places results
- Update chat UI with travel-themed branding and improved tool result cards

Phase 3 - Web Search Capability (WS5):
- Add web_search agent tool using DuckDuckGo
- Support location_context parameter for biased results
- Handle rate limiting gracefully

Phase 4 - Extensibility Architecture (WS6):
- Implement decorator-based @agent_tool registry
- Convert existing tools to use decorators
- Add GET /api/chat/capabilities/ endpoint for tool discovery
- Refactor execute_tool() to use registry pattern
2026-03-08 23:53:14 +00:00