Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
172 commits
Select commit Hold shift + click to select a range
e61ac02
feat: add tracked Core workbench client for OpenHuman
Jun 10, 2026
b35f486
feat: route YouPet Core workbench calls through the in-process Rust core
Jun 11, 2026
76fed16
feat: add YouPet Workbench alert thin slice (M3.1)
Jun 18, 2026
8a09ff1
test: fix M3.1 PR coverage guards
Jun 19, 2026
ecb6c65
test: stabilize PR coverage and E2E runtime checks
Jun 19, 2026
fe390fd
test: serialize voice inference env coverage tests
Jun 19, 2026
7055c91
test: align memory source toolkit coverage expectation
Jun 19, 2026
ca0e0dc
test: keep GitHub reader coverage fixture hermetic
Jun 19, 2026
ca54b9e
test: keep memory sync GitHub fixture hermetic
Jun 19, 2026
04ed23c
test: serialize memory threads raw coverage harness
Jun 19, 2026
27a6dc0
test: align memory tree sync toolkit expectation
Jun 19, 2026
8fcc8d4
test: keep near90 GitHub fixture hermetic
Jun 19, 2026
35de435
test: align owned provider responses payload expectation
Jun 19, 2026
7647e21
test: align approval gate raw coverage session ids
Jun 19, 2026
8cc5ed2
test: stabilize PR raw coverage and settings E2E checks
Jun 19, 2026
7232b9f
test: tolerate occupied connectivity fallback ports
Jun 19, 2026
4e95389
test: keep cron raw coverage schedule in future
Jun 19, 2026
1d4183b
test: align worker b approval gate session id
Jun 19, 2026
0a32eae
test: reserve connectivity fallback ports deterministically
Jun 19, 2026
eab3fdc
feat: render YouPet workbench context (M3.2)
Jun 20, 2026
223efa7
feat: add YouPet workbench trace drawer (M3.3b)
Jun 21, 2026
d5f61bf
feat(workbench): narrate YouPet workflow traces
Aug 5, 2026
5fa6608
test(workbench): cover workflow trace edge states
Aug 5, 2026
dd5eb61
feat(youpet): add ActionRequest approval inbox bridge (M1.2.3)
Aug 9, 2026
7cf51c5
fix(youpet): harden ActionRequest inbox acceptance gaps (M1.2.3)
Aug 9, 2026
d9d2179
fix(youpet): fail-closed ActionRequest idempotency and mutation refre…
Aug 9, 2026
9c32411
fix(youpet): scope ActionRequest intents via verified user storage (M…
Aug 9, 2026
cd743ce
fix(youpet): fail closed on ActionRequest intent storage read errors …
Aug 9, 2026
4537cb6
fix(youpet): set ActionRequest E2E timeout at suite scope (M1.2.3)
Aug 9, 2026
80eca85
test(workbench): add live workflow trace browser acceptance
Aug 14, 2026
1b5a891
test(workbench): pin workflow trace failure order
Aug 14, 2026
3cb6e87
test(workbench): assert workflow trace metadata pairs
Aug 14, 2026
81e6d09
test(e2e): isolate cargo-tauri authority and parse trace fields
Aug 15, 2026
a1e37b2
test(e2e): dispatch authority probe and assert recovery actor
Aug 15, 2026
7e47352
test(e2e): bind cargo install and recovery metadata
Aug 15, 2026
d24f77b
test(e2e): record dest_sha256 on cargo-tauri stamp
Aug 15, 2026
871081f
feat(workbench): render ActionRequest trace lane
Aug 16, 2026
1cf19fa
fix(workbench): complete ActionRequest trace rendering
Aug 19, 2026
8723e5a
style: satisfy OpenHuman publication checks
Aug 21, 2026
d402412
docs: identify A-core certifying browser spec
Aug 21, 2026
a608354
Merge pull request #4 from SiriusYou/codex/a-core-m133-publication
SiriusYou Aug 21, 2026
1057238
test(m2.2.4): freeze typed registry bridge contracts
Sep 2, 2026
34a9e99
test(m2.2.4): correct registry cursor request fixture
Sep 2, 2026
5628ac6
feat(m2.2.4): add typed read-only registry bridge
Sep 2, 2026
a891c11
test(m2.2.4): prove registry decoder contract gaps
Sep 2, 2026
d738387
fix(m2.2.4): align registry decoders with Core contracts
Sep 2, 2026
b566e67
test(m2.2.4): freeze registry renderer client
Sep 2, 2026
899c9f7
test(m2.2.4): correct registry renderer test typing
Sep 2, 2026
5202896
feat(m2.2.4): add typed registry renderer client
Sep 2, 2026
3482088
test(m2.2.4): prove active-only registry summaries
Sep 2, 2026
f08e30d
fix(m2.2.4): align active-only registry summaries
Sep 2, 2026
1af09b9
test(m2.2.4): freeze registry observation state
Sep 2, 2026
0f4c017
test(m2.2.4): correct registry hook async fixture
Sep 2, 2026
344314c
feat(m2.2.4): add registry observation state
Sep 2, 2026
bf704e7
test(m2.2.4): prove registry observation state gaps
Sep 2, 2026
26a7f12
fix(m2.2.4): close registry observation state gaps
Sep 2, 2026
cf96efe
test(m2.2.4): prove registry blocking reset gaps
Sep 2, 2026
6c380b6
fix(m2.2.4): synchronize registry blocking reset state
Sep 2, 2026
8ce3503
test(m2.2.4): prove blocked detail resurrection
Sep 2, 2026
1bea01f
test(m2.2.4): tighten blocked detail resurrection fixture
Sep 2, 2026
8ca793b
test(m2.2.4): correct blocked detail fixture shape
Sep 2, 2026
a36b32f
fix(m2.2.4): stop blocked registry detail continuations
Sep 2, 2026
528413f
test(m2.2.4): freeze registry inspection experience
Sep 2, 2026
b4c8d00
test(m2.2.4): format registry inspection fixtures
Sep 2, 2026
3acbd01
test(m2.2.4): correct registry inspection UI fixtures
Sep 2, 2026
8c45c96
test(m2.2.4): disambiguate registry status badges
Sep 2, 2026
f3b4acd
feat(m2.2.4): add registry inspection experience
Sep 2, 2026
f5d22ad
test(m2.2.4): prove registry inspection contract gaps
Sep 2, 2026
7f4982e
test(m2.2.4): tighten registry accessibility fixtures
Sep 2, 2026
a502240
test(m2.2.4): correct registry drawer focus fixture
Sep 2, 2026
7ba877a
fix(m2.2.4): close registry inspection contract gaps
Sep 2, 2026
ef7257f
test(m2.2.4): freeze registry catalog and locale parity
Sep 2, 2026
7781d67
feat(m2.2.4): localize registry inspection capability
Sep 2, 2026
58b33af
test(m2.2.4): prove registry translation placeholders
Sep 2, 2026
6cd94bb
fix(m2.2.4): translate remaining registry labels
Sep 2, 2026
045fc0f
test(m2.2.4): freeze live registry read-only proof
Sep 2, 2026
939a839
test(m2.2.4): add live registry read-only acceptance
Sep 2, 2026
2122cc3
test(m2.2.4): prove live registry harness gaps
Sep 2, 2026
1d42306
fix(m2.2.4): harden live registry acceptance harness
Sep 2, 2026
d97d57e
test(m2.2.4): prove registry proxy origin escape
Sep 2, 2026
f02654c
fix(m2.2.4): pin registry proxy origin
Sep 2, 2026
f61c3cc
test(m2.2.4): prove macOS disposable path alias
Sep 2, 2026
e7b2d27
fix(m2.2.4): accept macOS disposable temp alias
Sep 2, 2026
9c981a3
test(m2.2.4): prove disposable database role bootstrap
Sep 2, 2026
48b638e
fix(m2.2.4): create disposable postgres role
Sep 2, 2026
8edef6b
test(m2.2.4): prove portable migration enumeration
Sep 2, 2026
769cdbe
fix(m2.2.4): enumerate Core migrations portably
Sep 2, 2026
b3ea4cf
test(m2.2.4): prove unique registry fixture identities
Sep 2, 2026
56af171
fix(m2.2.4): separate registry fixture identities
Sep 2, 2026
96e9a2e
test(m2.2.4): prove isolated Rust toolchain provenance
Sep 2, 2026
cbccd4b
test(m2.2.4): require isolated cargo path forwarding
Sep 2, 2026
f1b3173
fix(m2.2.4): preserve Rust toolchain in isolated E2E
Sep 2, 2026
6c6571c
test(m2.2.4): prove fixed CEF debugging port
Sep 2, 2026
c7186ba
fix(m2.2.4): bind E2E to committed CEF port
Sep 2, 2026
6a631cb
test(m2.2.4): prove logged registry response envelope
Sep 2, 2026
7845844
fix(m2.2.4): unwrap logged registry responses
Sep 2, 2026
2c19f42
test(m2.2.4): align live freshness vocabulary
Sep 2, 2026
f9821e6
test(m2.2.4): prove published registry cursor shapes
Sep 2, 2026
34389bb
fix(m2.2.4): validate published Registry cursors
Sep 2, 2026
fa70545
test(m2.2.4): prove lazy exact Registry cross-links
Sep 2, 2026
4e70f00
fix(m2.2.4): keep lazy exact Registry links actionable
Sep 2, 2026
b3b65f5
test(m2.2.4): prove cursor-free registry evidence
Sep 2, 2026
b2f0528
fix(m2.2.4): omit cursors from retained evidence
Sep 2, 2026
8026f03
test(m2.2.4): prove exact Binding row selection
Sep 2, 2026
dd48e1c
fix(m2.2.4): expose exact Binding row versions
Sep 2, 2026
cc4d194
test(m2.2.4): prove Connector delivery summaries
Sep 2, 2026
4fcf2c9
fix(m2.2.4): summarize Connector delivery semantics
Sep 2, 2026
d7a9cae
test(m2.2.4): prove complete live process cleanup
Sep 2, 2026
ad8d256
fix(m2.2.4): reap live acceptance process trees
Sep 2, 2026
680ac65
test(m2.2.4): satisfy registry verification hygiene
Sep 2, 2026
ec93eb6
test(m2.2.4): freeze RPC catalog source parity
Sep 2, 2026
92f5fe3
fix(m2.2.4): preserve RPC catalog source parity
Sep 2, 2026
5d325a3
test(m2.2.4): require OpenHuman live evidence identity
Sep 2, 2026
fdb413b
fix(m2.2.4): bind live evidence to OpenHuman identity
Sep 2, 2026
c0b8719
test(m2.2.4): wait for live registry data
Sep 2, 2026
b6f117b
test(m2.2.4): prove registry response-shape classification
Sep 2, 2026
97f7704
fix(m2.2.4): classify registry response-shape failures
Sep 2, 2026
142d557
test(m2.2.4): prove Retry-After enforcement
Sep 2, 2026
9c336e5
fix(m2.2.4): enforce Registry Retry-After
Sep 2, 2026
024adee
test(m2.2.4): prove paged live registry evidence
Sep 2, 2026
e06e72a
fix(m2.2.4): distinguish paged registry requests
Sep 2, 2026
fdb4da6
test(m2.2.4): prove Retry-After timer bounds
Sep 2, 2026
f5b0a7f
fix(m2.2.4): bound Registry retry timer
Sep 2, 2026
4e51846
test(m2.2.4): lock registry Retry-After cooldown gaps
Sep 2, 2026
7179248
fix(m2.2.4): enforce registry Retry-After cooldown guards
Sep 2, 2026
ef56fea
test(m2.2.4): format retry cooldown checkpoint
Sep 2, 2026
87d9e76
test(m2.2.4): prove mutable enablement detail refresh
Sep 2, 2026
9f632e5
fix(m2.2.4): reobserve mutable enablement details
Sep 2, 2026
d03a165
Merge OpenHuman main into codex/m224-core-registries
Sep 3, 2026
9f484e5
style(m2.2.4): align restored views with UI tokens
Sep 3, 2026
750925b
refactor(m2.2.4): satisfy Rust layout gates
Sep 3, 2026
ee7a698
fix(m2.2.4): validate cursors without uuid serde
Sep 3, 2026
7c8977c
test(m2.2.4): prove upstream integration review defects
Sep 3, 2026
18c034e
fix(m2.2.4): harden upstream Workbench contracts
Sep 3, 2026
ce541ee
test(m2.2.4): cover internal YouPet JSON-RPC routing
Sep 3, 2026
5dbdb3b
fix(m2.2.4): include internal RPCs in drift guard
Sep 3, 2026
d0c538e
test(m2.2.4): align alert list fixture with contract
Sep 3, 2026
51b1b81
Merge latest OpenHuman main into codex/m224-core-registries
Sep 3, 2026
ea4a444
test(m2.2.4): prove Workbench loses context and freshness
Sep 3, 2026
9f53c3b
fix(m2.2.4): preserve Workbench context and list freshness
Sep 3, 2026
326ad88
test(m2.2.4): prove registry detail and retry races
Sep 3, 2026
c062cab
test(m2.2.4): stabilize registry race proofs
Sep 3, 2026
04ad8dc
test(m2.2.4): expose registry scheduling races
Sep 3, 2026
79eb6f5
test(m2.2.4): format registry race proofs
Sep 3, 2026
b380575
test(m2.2.4): widen Workbench race fixture identity
Sep 3, 2026
44d5bc0
fix(m2.2.4): serialize registry detail and retry scheduling
Sep 3, 2026
bfdcfa5
Merge latest OpenHuman main after M2.2.4 review recovery
Sep 3, 2026
2834536
style(m2.2.4): format Workbench recovery
Sep 3, 2026
aed749e
Merge latest OpenHuman main for PR 5992 convergence
Sep 4, 2026
39c144e
Merge SiriusYou/main into codex/m224-core-registries
Sep 4, 2026
1544464
merge: resolve registry configuration conflicts
senamakel Sep 12, 2026
7d724a7
fix(registry): handle null schema and hash-based routing in registry …
senamakel Sep 12, 2026
69925f9
fix(coreRegistries): correct generation tracking for collection loading
senamakel Sep 12, 2026
12a02ad
fix(coreRegistries): guard collection state against stale generation …
senamakel Sep 12, 2026
7144a78
test(coreRegistries): add missing tab_request_started dispatch in sta…
senamakel Sep 12, 2026
1457fc3
fix: address registry review findings
senamakel Sep 12, 2026
bc040c5
style: format registry fixes
senamakel Sep 12, 2026
2742f78
fix: complete registry state review fixes
senamakel Sep 12, 2026
e69c575
fix(config): remove tavily api key from secret management
senamakel Sep 12, 2026
227084e
fix(coreRegistries): correct pagination and URL parsing, remove unuse…
senamakel Sep 12, 2026
9b86408
chore: reformat long function signatures and string literals
senamakel Sep 12, 2026
46e8d76
feat(deps): add zod schema validation library
senamakel Sep 12, 2026
41c9159
fix(workbench): include intent in idempotency storage key
senamakel Sep 12, 2026
5899126
feat(coreRegistries): add detail loading on initial tab load and fix …
senamakel Sep 12, 2026
0aca47e
fix(coreRegistries): dispatch request started before collection retry
senamakel Sep 12, 2026
262f746
fix(useRegistryInspection): simplify boolean expression in shouldRestart
senamakel Sep 12, 2026
3195716
feat(coreRegistries): add restartAttemptedGeneration to registry state
senamakel Sep 12, 2026
ae45fc0
fix(coreRegistries): handle empty registry state on inspection
senamakel Sep 12, 2026
0fc99fb
fix(useRegistryInspection): handle missing registry gracefully
senamakel Sep 12, 2026
24faa28
fix(coreRegistries): handle empty registry state on initial load
senamakel Sep 12, 2026
212e443
fix(test): update test to match new registry validation behavior
senamakel Sep 12, 2026
a9f89f2
fix(workbench): correct test assertion for empty state
senamakel Sep 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,16 @@ OPENHUMAN_TEMPERATURE=0.7
# [optional] Allow bearer-authenticated RPC callers to invoke update.apply/update.run
# Disable on exposed server deployments unless you explicitly want remote self-upgrade.
# OPENHUMAN_AUTO_UPDATE_RPC_MUTATIONS_ENABLED=true
# [optional] YouPet Core REST API base URL for the workbench bridge (default: http://127.0.0.1:8000).
# YOUPET_CORE_API_URL=http://127.0.0.1:8000
# [optional] YouPet Core service token. Prefer config.toml/keyring-backed config for local use.
# YOUPET_SERVICE_TOKEN=
# [optional] Actor label sent in X-Actor-Id for YouPet workbench requests (default: openhuman-workbench).
# YOUPET_WORKBENCH_ACTOR_ID=openhuman-workbench
# [required for YouPet Workbench alert actions] Core users.id UUID for the operator.
# YOUPET_OPERATOR_USER_ID=
# [required for ActionRequest list/inbox] Core tenant UUID (or pass tenantId RPC override).
# YOUPET_TENANT_ID=

# ---------------------------------------------------------------------------
# Runtime flags
Expand Down
1 change: 1 addition & 0 deletions app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@
"three": "^0.183.2",
"tw-animate-css": "^1.4.0",
"util": "^0.12.5",
"zod": "4.3.6",
"zustand": "^5.0.15"
},
"devDependencies": {
Expand Down
1 change: 1 addition & 0 deletions app/scripts/e2e-run-all-flows.sh
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ if should_run_suite "navigation"; then
run "test/e2e/specs/navigation-settings-panels.spec.ts" "navigation-settings" "navigation"
run "test/e2e/specs/command-palette.spec.ts" "command-palette" "navigation"
run "test/e2e/specs/channels-smoke.spec.ts" "channels-smoke" "navigation"
run "test/e2e/specs/action-request-inbox.spec.ts" "action-request-inbox" "navigation"
run "test/e2e/specs/insights-dashboard.spec.ts" "insights-dashboard" "navigation"
run "test/e2e/specs/guided-tour-gates.spec.ts" "guided-tour-gates" "navigation"
_mini_summary "navigation"
Expand Down
5 changes: 4 additions & 1 deletion app/src/AppRoutes.guards.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,8 @@ describe('AppRoutes — the whole route table stays classified', () => {
'/callback/:kind': 'none',
'/callback/:kind/:status': 'none',
'/onboarding/*': 'protected',
'/home': 'redirect',
'/home': 'protected',
'/registries': 'protected',
'/human': 'protected',
'/brain': 'protected',
'/flows': 'protected',
Expand All @@ -198,6 +199,8 @@ describe('AppRoutes — the whole route table stays classified', () => {
'/routines': 'redirect',
'/rewards': 'protected',
'/workflows': 'protected',
'/workbench': 'protected',
'/action-requests': 'protected',
'/webhooks': 'redirect',
'/settings/*': 'protected',
'/ptt-overlay': 'none',
Expand Down
1 change: 0 additions & 1 deletion app/src/AppRoutes.redirects.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ function landingFor(entry: string) {
// is added there and not here, `every redirect in the route table is covered`
// below fails — the list cannot silently fall behind the code.
const REDIRECTS: Array<{ from: string; pathname: string; search: string }> = [
{ from: '/home', pathname: '/chat', search: '' },
{ from: '/activity', pathname: '/settings/notifications', search: '' },
{ from: '/intelligence', pathname: '/settings/notifications', search: '' },
{ from: '/skills', pathname: '/connections', search: '' },
Expand Down
135 changes: 135 additions & 0 deletions app/src/AppRoutes.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
import { render, screen } from '@testing-library/react';
import type { ReactNode } from 'react';
import { MemoryRouter } from 'react-router-dom';
import { describe, expect, it, vi } from 'vitest';

vi.mock('./lib/platform', () => ({ getIsMobile: () => false }));
vi.mock('./AppRoutesIOS', () => ({ default: () => <div data-testid="ios-routes">ios</div> }));
vi.mock('./components/DefaultRedirect', () => ({
default: () => <div data-testid="default-redirect">redirect</div>,
}));
vi.mock('./components/ProtectedRoute', () => ({
default: ({ children, requireAuth }: { children: ReactNode; requireAuth?: boolean }) => (
<div data-testid="protected-route" data-require-auth={String(requireAuth)}>
{children}
</div>
),
}));
vi.mock('./components/PublicRoute', () => ({
default: ({ children }: { children: ReactNode }) => (
<div data-testid="public-route">{children}</div>
),
}));
vi.mock('./features/human/HumanPage', () => ({
default: () => <div data-testid="page-human">human</div>,
}));
vi.mock('./features/coreRegistries/CoreRegistriesPage', () => ({
default: () => <div data-testid="page-core-registries">core-registries</div>,
}));
vi.mock('./pages/Accounts', () => ({
default: () => <div data-testid="page-accounts">accounts</div>,
}));
vi.mock('./components/routing/ForwardSearch', () => ({
default: ({ to }: { to: string }) => <div data-testid={`forward:${to}`}>{to}</div>,
}));
vi.mock('./pages/Activity', () => ({
default: () => <div data-testid="page-activity">activity</div>,
}));
vi.mock('./pages/Brain', () => ({ default: () => <div data-testid="page-brain">brain</div> }));
vi.mock('./pages/dev/AgentInsightsPreview', () => ({
default: () => <div data-testid="page-agent-insights">agent-insights</div>,
}));
vi.mock('./pages/dev/assistant-ui-demo', () => ({
default: () => <div data-testid="page-assistant-ui-demo">assistant-ui-demo</div>,
}));
vi.mock('./pages/dev/UiGallery', () => ({
default: () => <div data-testid="page-ui-gallery">ui-gallery</div>,
}));
vi.mock('./pages/FlowCanvasPage', () => ({
default: () => <div data-testid="page-flow-canvas">flow-canvas</div>,
FlowCanvasDraftPage: () => <div data-testid="page-flow-canvas-draft">flow-canvas-draft</div>,
}));
vi.mock('./pages/FlowsPage', () => ({ default: () => <div data-testid="page-flows">flows</div> }));
vi.mock('./pages/Home', () => ({ default: () => <div data-testid="page-home">home</div> }));
vi.mock('./pages/Invites', () => ({
default: () => <div data-testid="page-invites">invites</div>,
}));
vi.mock('./pages/Notifications', () => ({
default: () => <div data-testid="page-notifications">notifications</div>,
}));
vi.mock('./pages/onboarding/Onboarding', () => ({
default: () => <div data-testid="page-onboarding">onboarding</div>,
}));
vi.mock('./pages/PttOverlayPage', () => ({
PttOverlayPage: () => <div data-testid="page-ptt-overlay">ptt-overlay</div>,
}));
vi.mock('./pages/Rewards', () => ({
default: () => <div data-testid="page-rewards">rewards</div>,
}));
vi.mock('./pages/Settings', () => ({
default: () => <div data-testid="page-settings">settings</div>,
}));
vi.mock('./pages/Skills', () => ({ default: () => <div data-testid="page-skills">skills</div> }));
vi.mock('./pages/WebCallbackPage', () => ({
default: () => <div data-testid="page-web-callback">callback</div>,
}));
vi.mock('./pages/Welcome', () => ({
default: () => <div data-testid="page-welcome">welcome</div>,
}));
vi.mock('./pages/Workbench', () => ({
default: () => <div data-testid="page-workbench">workbench</div>,
}));
vi.mock('./pages/ActionRequestInbox', () => ({
default: () => <div data-testid="page-action-request-inbox">action-requests</div>,
}));
vi.mock('./pages/WorkflowsRun', () => ({
default: () => <div data-testid="page-workflows-run">workflows-run</div>,
}));

const AppRoutes = (await import('./AppRoutes')).default;

describe('AppRoutes', () => {
it('registers the Home route behind the protected desktop shell', () => {
render(
<MemoryRouter initialEntries={['/home']}>
<AppRoutes />
</MemoryRouter>
);

expect(screen.getByTestId('page-home')).toBeInTheDocument();
expect(screen.getByTestId('protected-route')).toHaveAttribute('data-require-auth', 'true');
});

it('registers the Core Registries route behind the protected desktop shell', () => {
render(
<MemoryRouter initialEntries={['/registries']}>
<AppRoutes />
</MemoryRouter>
);

expect(screen.getByTestId('page-core-registries')).toBeInTheDocument();
expect(screen.getByTestId('protected-route')).toHaveAttribute('data-require-auth', 'true');
});

it('preserves the Workbench route behind the protected desktop shell', () => {
render(
<MemoryRouter initialEntries={['/workbench']}>
<AppRoutes />
</MemoryRouter>
);

expect(screen.getByTestId('page-workbench')).toBeInTheDocument();
expect(screen.getByTestId('protected-route')).toHaveAttribute('data-require-auth', 'true');
});

it('preserves the ActionRequest inbox behind the protected desktop shell', () => {
render(
<MemoryRouter initialEntries={['/action-requests']}>
<AppRoutes />
</MemoryRouter>
);

expect(screen.getByTestId('page-action-request-inbox')).toBeInTheDocument();
expect(screen.getByTestId('protected-route')).toHaveAttribute('data-require-auth', 'true');
});
});
42 changes: 39 additions & 3 deletions app/src/AppRoutes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,19 @@ import DefaultRedirect from './components/DefaultRedirect';
import ProtectedRoute from './components/ProtectedRoute';
import PublicRoute from './components/PublicRoute';
import ForwardSearch from './components/routing/ForwardSearch';
import CoreRegistriesPage from './features/coreRegistries/CoreRegistriesPage';
import HumanPage from './features/human/HumanPage';
import { getIsMobile } from './lib/platform';
import Accounts from './pages/Accounts';
import ActionRequestInbox from './pages/ActionRequestInbox';
import Activity from './pages/Activity';
import Brain from './pages/Brain';
import AgentInsightsPreview from './pages/dev/AgentInsightsPreview';
import AssistantUiDemoPage from './pages/dev/assistant-ui-demo';
import UiGallery from './pages/dev/UiGallery';
import FlowCanvasPage, { FlowCanvasDraftPage } from './pages/FlowCanvasPage';
import FlowsPage from './pages/FlowsPage';
import Home from './pages/Home';
import Invites from './pages/Invites';
import Notifications from './pages/Notifications';
import Onboarding from './pages/onboarding/Onboarding';
Expand All @@ -24,6 +27,7 @@ import Settings from './pages/Settings';
import Skills from './pages/Skills';
import WebCallbackPage from './pages/WebCallbackPage';
import Welcome from './pages/Welcome';
import Workbench from './pages/Workbench';
import WorkflowsRun from './pages/WorkflowsRun';

interface AppRoutesProps {
Expand Down Expand Up @@ -71,9 +75,23 @@ const AppRoutes = ({ location }: AppRoutesProps = {}) => {
/>

{/* Protected routes */}
{/* Home is merged into the unified chat surface — /home redirects to /chat
(the chat's empty "new window" state is the former Home greeting). */}
<Route path="/home" element={<Navigate to="/chat" replace />} />
<Route
path="/home"
element={
<ProtectedRoute requireAuth={true}>
<Home />
</ProtectedRoute>
}
/>

<Route
path="/registries"
element={
<ProtectedRoute requireAuth={true}>
<CoreRegistriesPage />
</ProtectedRoute>
}
/>

{/* Human — the dedicated full-bleed mascot stage. The chat surface carries
the same mascot docked on its composer; both read one set of mascot
Expand Down Expand Up @@ -211,6 +229,24 @@ const AppRoutes = ({ location }: AppRoutesProps = {}) => {
}
/>

<Route
path="/workbench"
element={
<ProtectedRoute requireAuth={true}>
<Workbench />
</ProtectedRoute>
}
/>

<Route
path="/action-requests"
element={
<ProtectedRoute requireAuth={true}>
<ActionRequestInbox />
Comment thread
senamakel marked this conversation as resolved.
</ProtectedRoute>
}
/>

{/* Back-compat: /routines was an orphaned dead page. Workflows is now a
first-level module — redirect surviving deep links to /flows. */}
<Route path="/routines" element={<Navigate to="/flows" replace />} />
Expand Down
Loading
Loading