Skip to content

SaaS banking demo: customer-ready on CopilotKit v2 (FOR-138)#5180

Merged
AlemTuzlak merged 23 commits into
mainfrom
maxim/for-138-close-non-memory-gaps-to-reach-saas-customer-ready
Jun 5, 2026
Merged

SaaS banking demo: customer-ready on CopilotKit v2 (FOR-138)#5180
AlemTuzlak merged 23 commits into
mainfrom
maxim/for-138-close-non-memory-gaps-to-reach-saas-customer-ready

Conversation

@mxmzb

@mxmzb mxmzb commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Summary

Makes the examples/showcases/banking/ SaaS demo customer-ready by migrating it to CopilotKit v2 and polishing it into a credible, reliable reference. Closes the non-memory gaps from FOR-133's assessment (FOR-138).

  • v2 migration: v2 Hono runtime route (BuiltInAgent + createCopilotHonoHandler + InMemoryAgentRunner), CopilotKit provider + CopilotPopup, hooks moved to @copilotkit/react-core/v2 (useAgentContext, useHumanInTheLoop, useComponent, Zod params), on workspace:* packages.
  • File-backed data store: domain data in src/data/seed.json behind a typed src/lib/store.ts (in-memory, resets to seed on restart). Clean seam left for the memory track (FOR-137).
  • Credible identity + data: Northwind Finance / Alex Morgan / @northwind.example, refreshed transaction dates + future card expiries, Intl currency formatting.
  • Dropped the SQL page + fake-MSA RAG feature (and committed ServiceNow secret) — focused fintech story.
  • Framework/build: Next 16 async route params, Tailwind v4 (so the v2 stylesheet imports normally), correct next/react versions, single lockfile, accurate v2 README.
  • Tests: LLM-free Playwright smoke test (also fails on hydration/uncaught errors).

Verified live (real OpenAI key)

Full golden path works end-to-end: chat renders → "show transactions for card 4242" renders the generative-UI list → "add a card" → HITL approval card → Approve → new card appears in the grid. 0 console errors. Build + typecheck + smoke test green; no committed secrets.

Three v2 chat-rendering bugs were found and fixed by running it live: use the full CopilotKit provider (not the low-level CopilotKitProvider, which omits ThreadsProvider); set useSingleEndpoint={false} to match the multi-endpoint route; and use useComponent with a deps array for display-only generative UI (avoids a stale-closure empty render).

Non-goals (deliberately out of scope)

  • Real auth.
  • Conversation threads + long-term/self-learning memory → FOR-137.
  • Deleting the duplicate enterprise-brex demo + repointing its deploy.

Test plan

  • pnpm --filter demo-saas-copilot build succeeds
  • pnpm --filter demo-saas-copilot exec tsc --noEmit clean
  • pnpm --filter demo-saas-copilot test:e2e passes
  • With OPENAI_API_KEY set: run the golden path (transactions gen-UI, add-card HITL → approve → grid update)

Known minor follow-ups

  • Removing deprecated showDevConsole surfaces the v2 Web Inspector / announcement banner.
  • Newly-added cards get a near-term generated expiry.

🤖 Generated with Claude Code

mxmzb and others added 23 commits June 2, 2026 21:17
- Switch imports from @copilotkit/react-core to /v2
- Replace useCopilotReadable with useAgentContext (stringify object value)
- Convert navigateToPageAndPerform parameters array to a Zod object schema
- Switch imports from @copilotkit/react-core to /v2
- Replace useCopilotReadable with useAgentContext
- Convert all useHumanInTheLoop and useFrontendTool parameters to Zod schemas
  (addNewCard, assignPolicyToCard, addNoteToTransaction, showTransactions,
  setCardPin, showAndApproveTransactions)
- Convert v1 available: "enabled"/"disabled" to v2 boolean
- Fix React 19 useReducer typing by extracting changePinReducer and dropping
  explicit generics
- Switch imports from @copilotkit/react-core to /v2
- Replace useCopilotReadable with useAgentContext (stringify team)
- Convert removeMember, changeMemberRole, changeMemberTeam parameters
  to Zod schemas
- Fix React 19 useReducer typing by extracting dialogStateReducer and
  dropping explicit generics
- Switch imports from @copilotkit/react-core to /v2 in layout.tsx and actions.ts
- Replace useCopilotReadable with useAgentContext
- Stringify the credit cards/policies/transactions context value to satisfy
  the JsonSerializable type
Replace the in-memory `data` literal in `api/v1/data.ts` with a
file-seeded, module-singleton store:

- `src/data/seed.json` holds the seed (cards, team, policies,
  transactions) with refreshed dates (within ~60 days of 2026-06-02)
  and valid future card expiries.
- `src/lib/store.ts` deep-clones the seed at module init and exposes
  typed read accessors (cards/team/policies/transactions, findCard,
  findPolicy, findTransaction) plus the exact mutator set the routes
  use (addCard, updateCardPin, assignPolicyToCard, addPolicy,
  updateTransaction, addMember, updateMember, removeMember).
- All `src/app/api/v1/**/route.ts` files now read/write through the
  store. `data.ts` retains the shared interfaces/enums/CARD_COLORS/
  generateUniqueId and drops the literal `data` constant.
- Mutations persist for the running server process and reset to seed
  on restart (intentional demo behavior; no disk write-back).
- Domain-data only — conversation threads/memory live in a separate
  ticket (FOR-137).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Replace toy team names and @example.com emails with credible
  professional names and @northwind.example addresses (preserve ids,
  roles, team assignments). Default Admin is Alex Morgan.
- Set <title> metadata to IDENTITY.brand (Northwind Finance).
- Add formatCurrency helper in lib/utils.ts and route all money
  rendering (transactions list, credit-card details, dashboard +
  cards summary tiles) through it so amounts always render as
  $10,000.00 / -$1,000.00.
- Instruct the Northwind Copilot prompt to treat the rendered
  showTransactions list as the single source of truth so prose no
  longer restates counts/totals and contradicts the rendered list.
- Remove stray console.log and tighten == to === in components/layout.tsx.
The banking showcase was migrated to CopilotKit v2 but `src/app/layout.tsx`
still imported the removed `@copilotkit/react-ui/styles.css`, causing every
route to 500 with "Module not found". Drop the dead import.

Banking is still on Tailwind v3, while the v2 stylesheet
(`@copilotkit/react-core/v2/styles.css`) is pre-compiled Tailwind v4 output
containing bare `@layer base { ... }` rules. Tailwind v3's PostCSS plugin
rejects `@layer base` without a matching `@tailwind base` directive, so any
CSS import routed through the JS/TSX pipeline fails the build. Move the v2
stylesheet load to a server-side `fs.readFileSync` + inline `<style>` tag in
the root layout so the CSS reaches the browser without passing through
PostCSS / Tailwind v3. This avoids a full Tailwind v4 migration of the app.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ally

Banking was on Tailwind v3, which made the pre-compiled v2 stylesheet
(`@copilotkit/react-core/v2/styles.css`, built as Tailwind v4 output)
incompatible with the PostCSS pipeline. A temporary inline-CSS hack in
`layout.tsx` worked around this. Migrate to Tailwind v4 to match the
canonical v2 demos and remove the hack.

- package.json: tailwindcss ^4, add @tailwindcss/postcss ^4, replace
  tailwindcss-animate with tw-animate-css (v4 drop-in)
- postcss.config.mjs: switch plugin to @tailwindcss/postcss
- globals.css: use @import "tailwindcss" + @import "tw-animate-css";
  add @custom-variant dark for the existing .dark/.light class toggle;
  move shadcn color/radius mapping into @theme inline (preserves
  bg-background/text-foreground/rounded-{lg,md,sm} semantics)
- tailwind.config.ts: deleted; theme now lives in CSS
- components.json: clear stale tailwind.config reference
- layout.tsx: drop the readFileSync/dangerouslySetInnerHTML inline-CSS
  workaround; import "@copilotkit/react-core/v2/styles.css" the normal
  way alongside ./globals.css

Verified: tsc clean, next build clean, Playwright-rendered all four
pages (/, /dashboard, /cards, /team) with computed-style checks
(sidebar bg-gray-900 dark, rounded-lg=8px, .border=1px) and opened
the copilot popup which renders fully styled with the v2 stylesheet.
Adds a CI-safe Playwright smoke test that verifies the banking showcase
boots and the CopilotKit v2 popup opens with its configured suggestion
pills, without invoking the agent (so it runs in CI without secrets).

Covers:
  - Document title shows the Northwind Finance brand
  - Credit-cards dashboard renders ("Credit Cards" heading)
  - CopilotPopup launcher opens the dialog (Northwind Copilot)
  - Three suggestion pills render: View transactions, Add a card,
    Assign a policy

The dev server gets a dummy OPENAI_API_KEY so the runtime route boots,
but the test never sends a chat message or clicks a suggestion.

.gitignore: ignore test-results/, playwright-report/, and
tsconfig.tsbuildinfo so they don't become clutter.
Remove the /Hydration/i pattern from the ignored-console-errors filter so
Next.js hydration mismatches surface as real failures, and add a
page.on("pageerror", ...) listener that records uncaught exceptions and
asserts none occurred. pageerrors are not filtered — any uncaught
exception fails the smoke test.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace v1-era hooks/data references with the actual v2 surface:
useAgentContext / useFrontendTool / useHumanInTheLoop from
@copilotkit/react-core/v2, the Hono runtime route, the seed.json + store
data layer, and the Northwind identity. Drop mentions of removed
SQL/MSA/ServiceNow/RAG features.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…p stale lockfile

package.json was pinning next@14 / react@18, but the root pnpm.overrides
were already forcing next@16 / react@19 at install time and the code uses
Next 16 async params. Bump the declared ranges to ^16.0.10 / ^19 (and
@types/react{,-dom} to ^19) so the manifest matches reality and matches
the v2 reference demos (mcp-apps, generative-ui-playground).

Also drop examples/showcases/banking/pnpm-lock.yaml: the demo is a
workspace package (listed in root pnpm-workspace.yaml and resolved in the
root pnpm-lock.yaml), so the per-demo lockfile was vestigial v1 cruft
that contradicted the v2 migration.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- cards PUT handler: stop console.info'ing the request body, which
  included the plaintext PIN on every PIN-change request.
- wrapper.tsx: drop the duplicate ./globals.css import (already
  imported in app/layout.tsx, which is the canonical place).
- copilot-context.tsx: replace window.location.pathname read during
  render with usePathname() from next/navigation, matching how
  components/layout.tsx already derives the current route.
- next.config.mjs: remove the eslint.ignoreDuringBuilds block — Next 16
  no longer runs ESLint at build, and the key now produces an
  "Unrecognized key(s): 'eslint'" warning. Confirmed warning is gone.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The migration mounted the low-level CopilotKitProvider, which omits the
ThreadsProvider that holds the rendered message thread, so the agent ran but
the transcript stayed empty. Use the full CopilotKit provider, and set
useSingleEndpoint={false} to match the multi-endpoint Hono route (the default
single-endpoint transport 404s against it).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…deps

Display-only generative UI must use useComponent (not useFrontendTool): its
render is unconditional so the card persists after the tool call completes.
Also pass [transactions, cards] as deps so the renderer re-registers when the
data loads -- otherwise the closure captures the initial empty transactions
and the list renders empty.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@linear

linear Bot commented Jun 3, 2026

Copy link
Copy Markdown

FOR-138

@vercel

vercel Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
chat-with-your-data Ready Ready Preview, Comment Jun 3, 2026 1:58pm
docs Ready Ready Preview, Comment Jun 3, 2026 1:58pm
form-filling Ready Ready Preview, Comment Jun 3, 2026 1:58pm
research-canvas Ready Ready Preview, Comment Jun 3, 2026 1:58pm
travel Ready Ready Preview, Comment Jun 3, 2026 1:58pm

Request Review

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

📣 Social Copy Generator

Generate social media copies (Twitter/X, LinkedIn, Blog Post) for this PR using Claude.

  • Generate social media copies

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 979 kB

ℹ️ View Unchanged
Filename Size
packages/a2ui-renderer/dist/_virtual/_rolldown/runtime.cjs 516 B
packages/a2ui-renderer/dist/a2ui-types.cjs 172 B
packages/a2ui-renderer/dist/a2ui-types.mjs 171 B
packages/a2ui-renderer/dist/index.cjs 842 B
packages/a2ui-renderer/dist/index.mjs 563 B
packages/a2ui-renderer/dist/index.umd.js 12.2 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/A2uiSurface.cjs 1.49 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/A2uiSurface.mjs 1.43 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/adapter.cjs 1.07 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/adapter.mjs 1.01 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/AudioPlayer.cjs 904 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/AudioPlayer.mjs 492 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Button.cjs 1 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Button.mjs 596 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Card.cjs 829 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Card.mjs 419 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/CheckBox.cjs 1.1 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/CheckBox.mjs 1.02 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/ChildList.cjs 799 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/ChildList.mjs 737 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/ChoicePicker.cjs 1.63 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/ChoicePicker.mjs 1.57 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Column.cjs 856 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Column.mjs 802 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/DateTimeInput.cjs 1.12 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/DateTimeInput.mjs 1.05 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Divider.cjs 842 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Divider.mjs 432 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Icon.cjs 877 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Icon.mjs 469 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Image.cjs 995 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Image.mjs 587 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/List.cjs 920 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/List.mjs 508 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Modal.cjs 1.19 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Modal.mjs 1.13 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Row.cjs 855 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Row.mjs 801 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Slider.cjs 1.06 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Slider.mjs 984 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Tabs.cjs 1.1 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Tabs.mjs 1.04 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Text.cjs 903 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Text.mjs 489 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/TextField.cjs 1.21 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/TextField.mjs 1.14 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Video.cjs 788 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/components/Video.mjs 378 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/index.cjs 928 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/index.mjs 855 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/utils.cjs 579 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/basic/utils.mjs 556 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/minimal/components/Button.cjs 982 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/minimal/components/Button.mjs 580 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/minimal/components/ChildList.cjs 800 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/minimal/components/ChildList.mjs 735 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/minimal/components/Column.cjs 1.08 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/minimal/components/Column.mjs 1.02 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/minimal/components/Row.cjs 1.07 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/minimal/components/Row.mjs 1.01 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/minimal/components/Text.cjs 894 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/minimal/components/Text.mjs 839 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/minimal/components/TextField.cjs 1.21 kB
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/minimal/components/TextField.mjs 802 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/minimal/index.cjs 849 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/catalog/minimal/index.mjs 804 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/index.cjs 310 B
packages/a2ui-renderer/dist/react-renderer/a2ui-react/index.mjs 325 B
packages/a2ui-renderer/dist/react-renderer/catalog-utils.cjs 1.59 kB
packages/a2ui-renderer/dist/react-renderer/catalog-utils.mjs 1.52 kB
packages/a2ui-renderer/dist/react-renderer/core/A2UIProvider.cjs 1.5 kB
packages/a2ui-renderer/dist/react-renderer/core/A2UIProvider.mjs 1.42 kB
packages/a2ui-renderer/dist/react-renderer/core/A2UIRenderer.cjs 728 B
packages/a2ui-renderer/dist/react-renderer/core/A2UIRenderer.mjs 671 B
packages/a2ui-renderer/dist/react-renderer/create-catalog.cjs 1.35 kB
packages/a2ui-renderer/dist/react-renderer/create-catalog.mjs 1.28 kB
packages/a2ui-renderer/dist/react-renderer/hooks/useA2UI.cjs 316 B
packages/a2ui-renderer/dist/react-renderer/hooks/useA2UI.mjs 309 B
packages/a2ui-renderer/dist/react-renderer/index.cjs 399 B
packages/a2ui-renderer/dist/react-renderer/index.mjs 515 B
packages/a2ui-renderer/dist/react-renderer/lib/utils.cjs 236 B
packages/a2ui-renderer/dist/react-renderer/lib/utils.mjs 188 B
packages/a2ui-renderer/dist/react-renderer/styles/index.cjs 239 B
packages/a2ui-renderer/dist/react-renderer/styles/index.mjs 231 B
packages/a2ui-renderer/dist/react-renderer/theme/ThemeContext.cjs 436 B
packages/a2ui-renderer/dist/react-renderer/theme/ThemeContext.mjs 381 B
packages/core/dist/index.cjs 31.6 kB
packages/core/dist/index.mjs 31.4 kB
packages/core/dist/index.umd.js 34.5 kB
packages/react-core/dist/copilotkit-B5RsC6la.mjs 88.4 kB
packages/react-core/dist/copilotkit-IQO0VDZb.cjs 89.6 kB
packages/react-core/dist/index.cjs 16.9 kB
packages/react-core/dist/index.mjs 16.9 kB
packages/react-core/dist/index.umd.js 61.9 kB
packages/react-core/dist/v2/context.cjs 1.53 kB
packages/react-core/dist/v2/context.mjs 1.46 kB
packages/react-core/dist/v2/headless.cjs 10.3 kB
packages/react-core/dist/v2/headless.mjs 9.73 kB
packages/react-core/dist/v2/index.cjs 1.06 kB
packages/react-core/dist/v2/index.mjs 887 B
packages/react-core/dist/v2/index.umd.js 89.3 kB
packages/react-textarea/dist/index.cjs 18.1 kB
packages/react-textarea/dist/index.mjs 17.4 kB
packages/react-textarea/dist/index.umd.js 18.8 kB
packages/react-ui/dist/index.cjs 24.8 kB
packages/react-ui/dist/index.mjs 24.1 kB
packages/react-ui/dist/index.umd.js 26 kB
packages/runtime-client-gql/dist/_virtual/_rolldown/runtime.cjs 516 B
packages/runtime-client-gql/dist/client/conversion.cjs 1.52 kB
packages/runtime-client-gql/dist/client/conversion.mjs 1.45 kB
packages/runtime-client-gql/dist/client/CopilotRuntimeClient.cjs 1.48 kB
packages/runtime-client-gql/dist/client/CopilotRuntimeClient.mjs 1.44 kB
packages/runtime-client-gql/dist/client/types.cjs 701 B
packages/runtime-client-gql/dist/client/types.mjs 642 B
packages/runtime-client-gql/dist/graphql/@generated/gql.cjs 850 B
packages/runtime-client-gql/dist/graphql/@generated/gql.mjs 850 B
packages/runtime-client-gql/dist/graphql/@generated/graphql.cjs 2.4 kB
packages/runtime-client-gql/dist/graphql/@generated/graphql.mjs 2.36 kB
packages/runtime-client-gql/dist/graphql/definitions/mutations.cjs 740 B
packages/runtime-client-gql/dist/graphql/definitions/mutations.mjs 732 B
packages/runtime-client-gql/dist/graphql/definitions/queries.cjs 316 B
packages/runtime-client-gql/dist/graphql/definitions/queries.mjs 304 B
packages/runtime-client-gql/dist/index.cjs 679 B
packages/runtime-client-gql/dist/index.mjs 495 B
packages/runtime-client-gql/dist/index.umd.js 9.46 kB
packages/runtime-client-gql/dist/message-conversion/agui-to-gql.cjs 1.7 kB
packages/runtime-client-gql/dist/message-conversion/agui-to-gql.mjs 1.67 kB
packages/runtime-client-gql/dist/message-conversion/gql-to-agui.cjs 1.56 kB
packages/runtime-client-gql/dist/message-conversion/gql-to-agui.mjs 1.53 kB
packages/runtime-client-gql/dist/package.cjs 181 B
packages/runtime-client-gql/dist/package.mjs 116 B
packages/shared/dist/_virtual/_rolldown/runtime.cjs 516 B
packages/shared/dist/a2ui-prompts.cjs 2.85 kB
packages/shared/dist/a2ui-prompts.mjs 2.85 kB
packages/shared/dist/attachments/utils.cjs 1.74 kB
packages/shared/dist/attachments/utils.mjs 1.7 kB
packages/shared/dist/constants/index.cjs 362 B
packages/shared/dist/constants/index.mjs 345 B
packages/shared/dist/debug.cjs 454 B
packages/shared/dist/debug.mjs 452 B
packages/shared/dist/finalize-events.cjs 1.09 kB
packages/shared/dist/finalize-events.mjs 1.05 kB
packages/shared/dist/index.cjs 1.76 kB
packages/shared/dist/index.mjs 1.46 kB
packages/shared/dist/index.umd.js 20.2 kB
packages/shared/dist/logger.cjs 112 B
packages/shared/dist/logger.mjs 112 B
packages/shared/dist/package.cjs 181 B
packages/shared/dist/package.mjs 116 B
packages/shared/dist/standard-schema.cjs 740 B
packages/shared/dist/standard-schema.mjs 737 B
packages/shared/dist/telemetry/lambda-client.cjs 1.15 kB
packages/shared/dist/telemetry/lambda-client.mjs 1.14 kB
packages/shared/dist/telemetry/telemetry-client.cjs 1.33 kB
packages/shared/dist/telemetry/telemetry-client.mjs 1.28 kB
packages/shared/dist/telemetry/utils.cjs 321 B
packages/shared/dist/telemetry/utils.mjs 277 B
packages/shared/dist/transcription-errors.cjs 951 B
packages/shared/dist/transcription-errors.mjs 944 B
packages/shared/dist/utils/clipboard.cjs 407 B
packages/shared/dist/utils/clipboard.mjs 405 B
packages/shared/dist/utils/conditions.cjs 540 B
packages/shared/dist/utils/conditions.mjs 536 B
packages/shared/dist/utils/console-styling.cjs 1.24 kB
packages/shared/dist/utils/console-styling.mjs 1.22 kB
packages/shared/dist/utils/errors.cjs 4.51 kB
packages/shared/dist/utils/errors.mjs 4.41 kB
packages/shared/dist/utils/index.cjs 1.39 kB
packages/shared/dist/utils/index.mjs 1.65 kB
packages/shared/dist/utils/json-schema.cjs 1.97 kB
packages/shared/dist/utils/json-schema.mjs 1.91 kB
packages/shared/dist/utils/random-id.cjs 618 B
packages/shared/dist/utils/random-id.mjs 559 B
packages/shared/dist/utils/requests.cjs 706 B
packages/shared/dist/utils/requests.mjs 704 B
packages/shared/dist/utils/types.cjs 161 B
packages/shared/dist/utils/types.mjs 160 B
packages/voice/dist/_virtual/_rolldown/runtime.cjs 516 B
packages/voice/dist/index.cjs 175 B
packages/voice/dist/index.mjs 95 B
packages/voice/dist/index.umd.js 1.5 kB
packages/voice/dist/transcription/transcription-service-openai.cjs 495 B
packages/voice/dist/transcription/transcription-service-openai.mjs 434 B
packages/web-inspector/dist/assets/inspector-logo-icon.cjs 499 B
packages/web-inspector/dist/assets/inspector-logo-icon.mjs 434 B
packages/web-inspector/dist/assets/inspector-logo.cjs 4.32 kB
packages/web-inspector/dist/assets/inspector-logo.mjs 4.23 kB
packages/web-inspector/dist/index.cjs 43.3 kB
packages/web-inspector/dist/index.mjs 43.2 kB
packages/web-inspector/dist/index.umd.js 59.6 kB
packages/web-inspector/dist/lib/context-helpers.cjs 862 B
packages/web-inspector/dist/lib/context-helpers.mjs 830 B
packages/web-inspector/dist/lib/persistence.cjs 1.2 kB
packages/web-inspector/dist/lib/persistence.mjs 1.16 kB
packages/web-inspector/dist/lib/telemetry.cjs 1.67 kB
packages/web-inspector/dist/lib/telemetry.mjs 1.63 kB
packages/web-inspector/dist/styles/generated.cjs 6.41 kB
packages/web-inspector/dist/styles/generated.mjs 6.35 kB

compressed-size-action

@AlemTuzlak AlemTuzlak merged commit e00836c into main Jun 5, 2026
34 checks passed
@AlemTuzlak AlemTuzlak deleted the maxim/for-138-close-non-memory-gaps-to-reach-saas-customer-ready branch June 5, 2026 12:39
mxmzb pushed a commit that referenced this pull request Jun 25, 2026
Continues the closed draft #5183 on top of the merged #5180. Adds: v2 Threads as a docked chat side panel + inbox; the self-learning teachable policy-exception gate (symptom-only over-limit gate, justifying-exception unlock, recipe withheld; OSS default, env-gated CopilotKitIntelligence); the Aurora design system; a reusable teach-mode cookbook (examples/showcases/teach-mode/); and a learning-track plan. 53 files, scoped to examples/showcases/{banking,teach-mode}.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
mxmzb added a commit that referenced this pull request Jun 25, 2026
…g + Aurora UI (#5266)

## What this is
The consolidated, Jerel-owned PR for the **SaaS banking demo**
(FOR-137), built on top of the now-merged **#5180** (Maxim, FOR-138). It
continues the closed draft **#5183**, rebuilt cleanly on current `main`.

Scope: **53 files, entirely within `examples/showcases/banking` +
`examples/showcases/teach-mode`.**

<img width="1358" height="763" alt="image"
src="https://github.com/user-attachments/assets/2ad50912-077e-4a03-821b-047e487a7c8d"
/>

<img width="1600" height="894" alt="image"
src="https://github.com/user-attachments/assets/f80d894f-a24c-4d77-af83-0d1cf1369b18"
/>

<img width="800" height="451" alt="image"
src="https://github.com/user-attachments/assets/c8d6abe5-2e70-4ad1-87af-8aa6529906dc"
/>

## What's added (on top of #5180)
- 🎨 **Aurora design system** — premium light/violet fintech redesign
(lavender canvas, violet→indigo brand, gradient cards, hand-rolled SVG
statistics sparkline, Inter). Restyle-only; all wiring preserved.
- 🪟 **Chat as a docked side panel + Threads inbox** — v2 `useThreads`;
the chat is a right-docked `CopilotSidebar`; Threads live as an **inbox
button in the panel header** (conversation list, new / archive /
select).
- 🧠 **Self-learning teachable gate** — approving an over-limit
transaction is blocked with a **symptom-only** error; a human unlocks it
by filing a **justifying** policy exception; the agent gets tools +
distractors but **never the unlock recipe**. OSS mode is the default;
`CopilotKitIntelligence` is env-gated.
- 📘 **Reusable teach-mode cookbook** — `examples/showcases/teach-mode/`
(the 5-role teachable-loop contract + banking↔e-commerce mapping +
adoption checklist + recording seam + `verify-teachable-gate.sh`).
- 🗺️ **Learning-track plan** — `LEARNING-TRACK-PLAN.md`: how to make the
live learn→distill→retrieve loop work + the teachable-demo UX (suggested
prompt, inline HITL, recording vignette).

## Status / notes
- **Draft.** Runs in **OSS mode** (only `OPENAI_API_KEY`); no
Intelligence backend required.
- The **live** self-learning loop
(record→distill→`/knowledge`→fresh-agent-learns) is gated on the
react-core recording hook (`e103a19`) + an Intelligence backend — see
`LEARNING-TRACK-PLAN.md`. The teachable **mechanics** (gate + unlock)
work today and are REST-verifiable (`verify-teachable-gate.sh`).
- cc @mxmzb — consolidated demo PR per Sam's ask; builds directly on
your merged #5180.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants