Commit Graph

301 Commits

Author SHA1 Message Date
chihlasm
0568fc1454 feat: update CSS variables and glass-card utilities for Slate & Ice theme
- Replace all color variables with Slate & Ice palette
- Add glass system vars (--glass-bg, --glass-blur, --shadow-float)
- Replace legacy glass-card with new variable-driven glass classes
- Add breatheGlow, bellWobble, slideDown, fadeInRight keyframes
- Update font references to IBM Plex Sans and Bricolage Grotesque

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 08:00:44 -05:00
chihlasm
c66b2bb88e chore: update Tailwind config to Slate & Ice theme colors and fonts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 07:55:56 -05:00
chihlasm
767d2ac164 chore: update Google Fonts to Bricolage Grotesque, IBM Plex Sans, JetBrains Mono
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 07:48:55 -05:00
chihlasm
554ad84d9e chore: add Docker dev files and ignore .sql database dumps
Added Dockerfile.dev for backend and frontend, docker-compose.dev.yml
for local development. Added *.sql to .gitignore to prevent accidental
commit of database dumps.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 19:00:46 -05:00
chihlasm
e25f041332 docs: add Alembic sequential migration numbering rule to CLAUDE.md (#38)
Migrations must use sequential numbered prefixes (e.g., 040_desc.py) with
--rev-id flag. Never use auto-generated revision IDs. Updated both the
lessons learned section and the development commands.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 14:53:05 -05:00
chihlasm
9811c56280 docs: consolidate LESSONS-LEARNED.md into CLAUDE.md, single source of truth
Merged 8 unique lessons (#30-#37) from LESSONS-LEARNED.md into CLAUDE.md:
Alembic env.py imports, JSONB datetime serialization, export pipeline order,
Railway deployment gotchas, bcrypt pinning, email validator TLD, first admin
promotion. Deleted LESSONS-LEARNED.md and updated all references.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 14:51:43 -05:00
chihlasm
a1c9675be7 docs: add CI/CD gotchas and Linux venv path to CLAUDE.md
Added lessons learned: AI tests need ai_enabled mock in CI (#28),
ESLint no-unused-vars lacks argsIgnorePattern (#29). Added Linux venv
activation path and gh CLI commands for CI debugging.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 14:38:28 -05:00
chihlasm
f31058fc3f fix: resolve CI failures — ESLint unused vars and AI chat tests in CI
Frontend: suppress unused-vars ESLint errors for callback params in
MaintenanceFlowDetailPage and StepLibraryPage.

Backend: add autouse fixture to mock settings.ai_enabled=True in
test_ai_chat.py so tests pass in CI where no ANTHROPIC_API_KEY is set.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 14:21:48 -05:00
chihlasm
5b150e29e5 fix: correct entity name to ResolutionFlow LLC in license
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 01:05:07 -05:00
chihlasm
787456d9d4 chore: add proprietary license file
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 01:04:44 -05:00
chihlasm
9bef7e5814 docs: rewrite README to reflect current product state
Updated from planning-phase placeholder to accurate representation of
ResolutionFlow as a production SaaS product. Reflects all shipped features
(AI Flow Assist, procedural/maintenance flows, cross-references, session
sharing, export improvements), current tech stack, project structure, and
development setup instructions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 00:36:23 -05:00
chihlasm
459792019a docs: rewrite roadmap to reflect current state, add post-work checklist to CLAUDE.md
Rewrote 03-DEVELOPMENT-ROADMAP.md — replaced outdated week-by-week format with
phase-based structure reflecting actual project state. Integrated all 13 open
GitHub issues into appropriate phases. Added "After Completing Work" checklist
to CLAUDE.md coding standards and roadmap/issues to quick reference table.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 00:30:13 -05:00
chihlasm
dfa05a9b25 feat: AI Chat Builder (Flow Assist) + cross-reference loop-back support
- AI conversational flow builder with interview phases (scoping, discovery, enrichment)
- Flow Assist sidebar nav, toolbar, chat panel, tree preview
- Cross-reference / loop-back support: nodes can reference any node in the tree
- Dashed purple arrows on canvas for cross-references
- Node picker dropdowns for action and decision forms
- Backend validator relaxed for cross-references
- AI system prompt updated for loop-back patterns

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 20:43:48 -05:00
chihlasm
208807cf94 docs: add cross-reference / loop-back implementation plan
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 20:43:34 -05:00
chihlasm
01e7ad7578 feat: update AI system prompt to allow cross-reference loop-back patterns
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 19:55:05 -05:00
chihlasm
fc9e1e5f63 feat: add cross-reference node picker to decision option rows
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 19:50:28 -05:00
chihlasm
663919d928 feat: add node picker dropdown to action node form for cross-references
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 19:47:10 -05:00
chihlasm
b0347bacd4 feat: render cross-reference edges as dashed purple arrows on canvas
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 19:25:16 -05:00
chihlasm
ddf75df976 feat: change circular reference detection from error to warning — loops are intentional
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 19:21:11 -05:00
chihlasm
ce3ad44b7d feat: relax decision option validation — allow cross-references to any node in tree
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 19:18:02 -05:00
chihlasm
bd72f64030 docs: add cross-reference / loop-back design document
Design for allowing tree nodes to reference any node in the tree
(not just direct children), enabling loop-back patterns. Ghost
reference approach — no schema changes, SVG overlay arrows on
canvas, node picker + drag-to-link in editor.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 19:09:11 -05:00
chihlasm
b819236aa5 fix: replace Import button with "Save to Flow Library" and remove duplicate check
- After generation, toolbar shows "Save to Flow Library" button
  (replaces "Import to Editor")
- Button shows "Saving..." spinner state during API call
- Generate button shows animated spinner during generation
- Backend /import endpoint always creates a new Tree record
  (removed generated_tree_id idempotency check)
- Navigates to tree editor after successful save

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 15:08:58 -05:00
chihlasm
2196886cd2 feat: rename AI builder to "Flow Assist" and add sidebar nav item
- Rename all "Build with AI" labels to "Flow Assist"
- Update CreateFlowDropdown description to "AI-powered flow builder"
- Add Flow Assist nav item with Sparkles icon to sidebar (both
  expanded and collapsed states)
- Update AIFlowBuilderModal titles for consistency

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:55:51 -05:00
chihlasm
1f404a20ca fix: handle truncated AI responses and relax progressive tree validation
- Strip unclosed [TREE_UPDATE] and [METADATA] blocks from display when
  response is truncated by max_tokens
- Increase send_message max_tokens from 2000 to 8000 to prevent
  truncation of large tree JSON
- Use lightweight validation for progressive tree updates (valid root
  node only) instead of strict 5-node minimum — strict validation
  still applies at final /generate step

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:38:22 -05:00
chihlasm
e79ffff1dc fix: address code review findings for AI chat builder
- C1: Fix race condition in handleReset — await abandonSession before
  starting new session to prevent store state corruption
- I1: Extract error messages from Axios response.data.detail instead of
  generic error.message — users now see helpful backend messages (quota
  limits, message caps, etc.)
- I2: Add isGenerating guard in generateTree store action to prevent
  concurrent generation requests on double-click
- I3: Add isResponding guard in sendMessage to prevent concurrent sends
- M5: Remove redundant type casts on flowType
- M6: Add rate limiter to DELETE /sessions/{id} for consistency

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 08:53:54 -05:00
chihlasm
596153085a feat: add AI chat builder frontend — types, API client, store, components, page, routing
- TypeScript types for chat session, messages, and responses
- API client module with all 6 endpoints
- Zustand store with session management, message sending, tree generation, import, resume
- 7 chat components: ChatMessage, ChatInput, ChatPanel, PhaseIndicator, ChatToolbar, EmptyPreview, StaticTreePreview
- AIChatBuilderPage with split-panel layout (60% chat / 40% preview)
- Route at /ai/chat with lazy loading
- "Build with AI" button on TreeLibraryPage
- Session resume via URL search params

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 07:20:04 -05:00
chihlasm
0da67586da feat: add backend tests for AI chat builder + fix conversation_id FK issue
Tests cover session create, send message with tree update, get session,
abandon, 404 on missing session, and 503 when AI disabled.

Fixed: ai_usage.conversation_id has FK to ai_conversations, not
ai_chat_sessions. Chat builder now passes conversation_id=None and
tracks session reference in extra_data.chat_session_id.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 04:06:47 -05:00
chihlasm
ef96b1a12f feat: add AI chat builder endpoints and update quota service
6 endpoints: create session, send message, get session, generate tree,
import to editor, abandon. Quota service daily limit updated to include
chat builder generation types.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 03:54:08 -05:00
chihlasm
babfd0c6d9 feat: add generate_text method to AIProvider for non-JSON responses
The AI Chat Builder needs conversational text responses, not JSON-only.
Gemini's generate_json forces response_mime_type='application/json'
which is incompatible. The new generate_text method omits this constraint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 03:49:35 -05:00
chihlasm
b7e48fae0e feat: add AI chat builder service with system prompt and conversation loop
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 03:47:56 -05:00
chihlasm
5c67455190 feat: add Pydantic schemas for AI chat builder
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 03:44:01 -05:00
chihlasm
ccd178b02e feat: add ai_chat_sessions database model and migration
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 03:42:10 -05:00
chihlasm
09c5d60067 docs: add AI Chat Builder implementation plan
14 tasks across 4 phases: backend foundation (model, schemas, service,
endpoints, tests), frontend chat UI (types, API client, store,
components, page), tree preview integration, and polish (session
resume, responsive layout).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 03:25:17 -05:00
chihlasm
6e19b99814 docs: add AI Chat Builder design document
Design for conversational AI flow builder that interviews users as a
senior MSP engineer to collaboratively build troubleshooting/procedural
flows. Coexists with existing wizard-based builder as a separate entry
point.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 03:17:21 -05:00
chihlasm
6fc76187c0 fix: add diagnostic logging and increase scaffold max_tokens to 2048
The "Unterminated string" JSON parse error is likely caused by Gemini
output truncation at 1024 tokens. Increases scaffold max_tokens to 2048
and adds logging for: raw response text, finish_reason (truncation
detection), and JSON parse failures.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 00:15:01 -05:00
chihlasm
957f13b993 fix: use correct google-genai async API and remove debug endpoint
The google-genai SDK uses `client.aio.models.generate_content()` for
async calls, not `client.models.generate_content_async()` which doesn't
exist. Also removes the temporary /ai/provider-debug endpoint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 00:08:20 -05:00
chihlasm
dc68d992a4 debug: add temporary /ai/provider-debug endpoint
Shows which provider is selected and whether keys are loaded.
Remove after debugging the 502 on PR env.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 00:02:47 -05:00
chihlasm
0fb3126fd2 fix: add error logging and error type to AI builder 502 responses
The generic "AI provider error" message made debugging impossible.
Now logs the full exception traceback and includes the error class
name in the 502 response detail.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 23:49:07 -05:00
chihlasm
29dc95e920 feat: add AI auto-fix UI — types, API client, ValidationSummary button, review modal, and TreeEditorPage wiring
- New ai-fix.ts types for request/response
- fixTree() method on treesApi
- "Fix with AI" button in ValidationSummary (shows for fixable errors)
- AIFixReviewModal with per-fix apply/skip and apply-all
- TreeEditorPage orchestrates the fix flow

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:29:53 -05:00
chihlasm
b3925150d7 feat: add POST /ai/fix-tree endpoint for AI-powered validation fixes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:25:38 -05:00
chihlasm
373736c594 feat: add AI fix service with prompt building and validation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:25:34 -05:00
chihlasm
5f8653e481 feat: add Pydantic schemas for AI fix-tree endpoint
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:21:36 -05:00
chihlasm
eb7ea7ddd9 refactor: migrate AI tree generator to provider abstraction
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:20:48 -05:00
chihlasm
55be033ecb feat: add AI provider abstraction with Gemini and Anthropic support
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:16:45 -05:00
chihlasm
be041d0d29 feat: add Gemini Flash config vars to Settings
Adds AI_PROVIDER, GOOGLE_AI_API_KEY, AI_MODEL_GEMINI, and
AI_MODEL_ANTHROPIC config vars. Updates ai_enabled to check
either provider key.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:08:53 -05:00
chihlasm
bbf6e2a33b chore: add google-genai SDK dependency
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:08:10 -05:00
chihlasm
5df32aa9da docs: add implementation plan for AI auto-fix and Gemini provider
12-task plan covering: SDK install, config, provider abstraction,
service migration, fix service, endpoint, frontend types/API,
ValidationSummary button, review modal, and TreeEditorPage wiring.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 16:33:34 -05:00
chihlasm
6527b33d05 docs: add AI auto-fix and Gemini Flash provider design
Design for two combined features: Gemini 2.5 Flash as primary AI
provider with Claude fallback, and AI-powered auto-fix for validation
errors in the tree editor.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 16:28:33 -05:00
chihlasm
1002f0c177 fix: validate decision nodes have at least 2 children in frontend and AI builder
The frontend validate button was not checking that decision nodes with
children have at least 2 branches, so it would pass validation but the
backend publish check would reject with a 422. The AI tree validator also
only checked options count, not children count — so AI-generated trees
with 2 options pointing to the same single child would pass generation
validation but fail at publish time.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 14:06:08 -05:00
chihlasm
2241b37d25 fix: display specific validation errors when publish fails with 422
The handlePublish catch block was showing a generic "Failed to publish"
message instead of parsing the 422 response body for validation details.
Now matches the handleSaveDraft error handling pattern.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 13:53:55 -05:00