Commit Graph
7 Commits
Author SHA1 Message Date
canvas-bot dd6175d038 feat(dogfood-wave1): fix Studio retries, Chat error, LLM gateway, kill snapshot, topbar cleanup
build-and-publish / test (pull_request) Has been cancelled
build-and-publish / image (pull_request) Has been cancelled
User dogfood found many bugs. This wave addresses:

- nginx.conf: proxy_next_upstream + retries on 502/503/504, explicit
  proxy_ssl_name, 8s connect timeout. The DNS-resolver race that
  caused the Studio 'apply_patch 502' is now eaten by nginx retry.

- src/lib/wizardApi.ts: applyBatch retries 3x on 502/503/504 with
  exponential backoff. Even if nginx misses the retry the client
  takes a second shot.

- src/lib/chatApi.ts: listThreads now THROWS when ensureInbox fails
  instead of silently returning []. Chat scene shows the error +
  retry button instead of an empty 'No conversations' state that
  hides the real failure.

- src/scenes/Chat.tsx: explicit error banner with 'Try again' button.

- src/lib/llmClient.ts: rewritten to call /api/v1/llm/generate
  (real demo gateway, same as dev.flow-master.ai uses). Removed the
  local /internal/canvas-llm/chat sidecar entirely.

- src/scenes/Agent.tsx: removed the LLM-state probe + 'off by
  default' OFF pill. LLM is now part of the assistant unconditionally.

- src/lib/flowCuration.ts: dropped the STARTABLE_FLOW_KEYS allowlist
  gate in curatedPublishedFlows so list_processes now returns every
  published business process, not just pr_to_po_def.

- src/state/store.ts + tests: DataMode is now 'live' only. Removed
  the SNAPSHOT branch; live is the only mode. Renamed the failure
  toast accordingly. Initial scene is 'mission' not 'landing'.

- src/scenes/Login.tsx + test: post-login navigates to 'mission'
  instead of the empty landing splash.

- src/scenes/Settings.tsx + src/components/CommandBar.tsx: removed
  every snapshot/setMode reference. Settings shows 'EA2 · live
  always'. Command palette no longer offers a snapshot switch.

- src/App.tsx: topbar redesign. Removed Settings + Home tabs
  (now in user menu), removed standalone Light/Dark + Console
  buttons (collapsed into user menu), removed the SNAPSHOT/LIVE
  mode pill + topbar refresh. New UserMenu component shows a 2-char
  avatar circle; clicking opens a dropdown with Home / Settings /
  Refresh data / theme toggle / API console toggle. Topbar now has:
  brand · tabs · cmd-k · notification bell · avatar.

- src/index.css: user-menu styles + chat-err styles + dark variants.

30/30 vitest pass. tsc + vite build green.
2026-06-15 18:29:39 +04:00
shad 601429ea89 fix(nginx): add public DNS fallback for upstream resolution (#13)
build-and-publish / test (push) Has been cancelled
build-and-publish / image (push) Has been cancelled
2026-06-15 12:34:59 +00:00
shad 7c25a6a62e fix(nginx): lazy DNS for /api and /internal/canvas-llm upstreams
build-and-publish / test (push) Has been cancelled
build-and-publish / image (push) Has been cancelled
When the K3s node recovers from an outage, cluster DNS (CoreDNS at
10.43.0.10) can be briefly unavailable, and nginx's startup-time
resolution of demo.flow-master.ai + canvas-llm-proxy.demo.svc...
fails the conf check, leaving the pod in CrashLoopBackOff. The
hostnames sat in proxy_pass directives that nginx resolves at boot.

Switched to:
- resolver 10.43.0.10 valid=30s ipv6=off;
- set $upstream_demo / $upstream_llm; proxy_pass $variable;

This forces lazy per-request DNS so transient cluster-DNS hiccups
don't kill the canvas-frontend pod. Verified during a real K3s node
outage today.
2026-06-14 20:37:41 +04:00
shad e520f39647 feat(llm-proxy): in-cluster FastAPI shim with nginx pass-through
Closes the 'fork Pi coding agent' integration loop with a tiny
broker that mirrors the @earendil-works/pi-ai request shape:

  POST /internal/canvas-llm/chat
  body: { messages: [{role, content}], max_tokens }

The proxy speaks to OpenAI or Anthropic depending on which env key
is set. With no key, returns 503 so the frontend's deterministic
fallback in routeAgentInput fires gracefully.

- llm-proxy/main.py: FastAPI + httpx (~150 LOC). System messages get
  split out for Anthropic (separate 'system' field) and inlined for
  OpenAI.
- llm-proxy/Dockerfile: python:3.12-slim, uvicorn on :8080.
- Deployment + Service in demo namespace (verified Running).
- nginx.conf: /internal/canvas-llm/ proxies to the in-cluster service.

Provider keys are set to empty in the manifest by design: customer
flip is a single 'kubectl set env' or sealed-secret update.
2026-06-14 16:28:17 +04:00
shad 973aa9c15b fix(security): lock CSP script-src to self (no unsafe-inline/unsafe-eval)
Oracle round-9 hard blocker: live CSP advertised script-src 'self'
'unsafe-inline' 'unsafe-eval'. Verified the Vite build emits zero inline
<script> tags (only external module script) and no bundled dep uses
new Function / eval (reactflow / leaflet / zustand / dagre / cmdk /
framer-motion all clean).

- nginx.conf script-src reduced to 'self'.
- img-src extended for OSM tiles (https://*.tile.openstreetmap.org) and
  leaflet marker images served from unpkg.

Also (Oracle round-9 second blocker) chat_sidebar QA now creates a
thread + sends a message before asserting, then strict-asserts
threadRowCount >= 1 AND previewRows === threadRowCount AND
timeBadges === threadRowCount. No more vacuous PASS when sidebar is
empty.
2026-06-14 15:42:28 +04:00
shad 4bc7ae228a feat: rebuild Process Studio into multi-phase Process Creation Wizard\n\n- Replace toy Studio.tsx with proper Wizard.tsx canvas\n- Build 6-step flow: Intake -> Analyze -> Generate -> Validate -> Draft saved -> Publish\n- Implement incremental EA2 writes via wizardApi.ts (flow, batch apply)\n- Use localStorage for draft recovery across reloads\n- Apply industrial-blueprint UI styling matching core doctrine\n- Add Vitest tests for Wizard components and API wrappers 2026-06-14 03:47:26 +04:00
shad 2b83e3ad0e deploy: Dockerfile + nginx + Gitea Actions build
Two-stage build (node:22 → nginx:1.27) bakes dist/ into a static image.
nginx reverse-proxies /api/* to demo.flow-master.ai so live mode works
same-origin without CORS. CI runs vitest + build, then publishes
gitea.flow-master.ai/shad/mission-control-demo:sha-${git} on push to main.

Constraint: backend rejects cross-origin → same-origin proxy required
Confidence: high
Scope-risk: narrow
Not-tested: image actually built in Gitea Actions (requires registry secret)
2026-06-14 00:10:56 +04:00