Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
256 commits
Select commit Hold shift + click to select a range
368768a
docs(chat): implementation plan for chat panel org selector
thelg4 Jul 27, 2026
c70ee3a
feat(chat): optional org field on the agent chat request
thelg4 Jul 27, 2026
723e41e
feat(chat): org selection state scoped to the chat panel
thelg4 Jul 27, 2026
c692c24
feat(chat): org selector dropdown in the chat panel
thelg4 Jul 27, 2026
63dccb7
fix(chat): final review — membership name fallback, no orgId persistence
thelg4 Jul 27, 2026
5f77b2a
style(chat): taller org selector and themed scrollbars
thelg4 Jul 27, 2026
0326821
chore(chat): bind agent sign-in to the beta MCP audience
thelg4 Jul 27, 2026
5167a16
docs(chat): design spec for chat popout window
thelg4 Jul 28, 2026
1d44888
docs(chat): implementation plan for chat popout window
thelg4 Jul 28, 2026
99d2ae0
refactor(chat): extract ChatBody shared by panel and popout
thelg4 Jul 28, 2026
8a93e02
feat(chat): standalone chat window behind ?chatPopout boot flag
thelg4 Jul 28, 2026
62027bc
feat(chat): pop the chat out to its own window with transcript hand-off
thelg4 Jul 28, 2026
7909fcc
feat(electron): open the chat popout as a native window
thelg4 Jul 28, 2026
202506a
fix(chat): final review — popout stream, sign-in, and lifecycle harde…
thelg4 Jul 28, 2026
51eb339
feat(chat): name the chat Mycal and heighten the org selector
thelg4 Jul 28, 2026
60f5827
feat(chat): builds resolve the agent via VITE_AGENT_URL, dev stays on…
thelg4 Jul 31, 2026
bc39422
feat(chat): zero-state sign-in prompt matching app empty-state pattern
thelg4 Aug 1, 2026
62793bc
style(chat): match the org dropdown to the app's filled select pattern
thelg4 Aug 4, 2026
4bf2cbf
feat(chat): configurable agent proxy target for internal testing
thelg4 Aug 4, 2026
617275d
feat(chat): user-friendly unavailable state
thelg4 Aug 4, 2026
94c2583
feat(chat): follow the app's active org instead of a chat-local selector
thelg4 Aug 4, 2026
c84253e
feat(chat): agent service override in test settings
thelg4 Aug 5, 2026
2814ff4
feat(chat): soft-launch Mycal behind the Test UI in deployed builds
thelg4 Aug 5, 2026
3fd2d8b
fix(chat): call the Hydra issuer directly in non-dev builds
thelg4 Aug 5, 2026
33dd524
fix(chat): route agent OAuth calls through the same-origin /hydra path
thelg4 Aug 6, 2026
186148c
Permitteer sign-in: backend-owned OIDC replaces the Cognito stack
evanrbowers Aug 19, 2026
1deb246
Dev-loop fixes from the first live sign-in
evanrbowers Aug 19, 2026
b3ee8cd
Merge branch 'main' into feature/agent-chat-interface
JamieRuderman Aug 19, 2026
806b613
feat(common): add chat popout window contract constants
JamieRuderman Aug 19, 2026
9817e42
fix(electron): guard chat popout child windows and share the popout c…
JamieRuderman Aug 19, 2026
74151da
fix(chat): harden agent auth, popout protocol, persistence, and org s…
JamieRuderman Aug 19, 2026
dca6c29
refactor(chat): display-only components, docked layout, safe areas, a…
JamieRuderman Aug 19, 2026
77d1215
fix(chat): encrypt agent tokens at rest with a non-extractable key
JamieRuderman Aug 19, 2026
633aab6
fix(deps): sync package-lock with the frontend react-markdown deps
JamieRuderman Aug 19, 2026
e761c12
fix(chat): encrypt the PKCE flow secrets at rest
JamieRuderman Aug 19, 2026
b3e2956
D8: sign-in moves to the renderer — identical on web and desktop
evanrbowers Aug 20, 2026
57a3938
Failure paths never end the session; sign-out is local-only
evanrbowers Aug 20, 2026
0931031
Native security settings over the Passport self-API (Phase 2b)
evanrbowers Aug 20, 2026
428842a
Security page: honest empty-state for federated-only accounts
evanrbowers Aug 20, 2026
639c520
Explicit sign-out ends the AS session; web goes straight to login
evanrbowers Aug 20, 2026
31a8d83
Boot restore validates the session is ALIVE before trusting it
evanrbowers Aug 20, 2026
dc621ad
Sign-out journey wins the navigation; post-signout forces the login page
evanrbowers Aug 20, 2026
d41ae76
Sign-out goes silent: fetch the AS logout, one hop to the login page
evanrbowers Aug 20, 2026
e3a7fbb
Two-factor panel speaks the methods model (Phase 2c)
evanrbowers Aug 20, 2026
e89d64d
Passkeys section on the Security page (Phase 2d)
evanrbowers Aug 20, 2026
c406360
Fix the creation-options cast (tsc was masked by the pipe)
evanrbowers Aug 20, 2026
db76a63
Packaged shell: origin-keyed browser bounce + human launcher copy
evanrbowers Aug 20, 2026
cdfa340
Launcher copy: name the mechanism — Remote.It Single Sign-On
evanrbowers Aug 20, 2026
201d301
Switch account: select_account lane + AS-owned chooser
evanrbowers Aug 20, 2026
f87d2e1
Auth journey opens a NEW browser window
evanrbowers Aug 20, 2026
170b39b
Auth window: open in background, front once painted
evanrbowers Aug 20, 2026
3aa4696
Connected Apps rides the AS's account API (plan D6, direct-to-AS)
evanrbowers Aug 20, 2026
e7160af
Connected Apps: name what permissions apply to; revoke is a labeled a…
evanrbowers Aug 20, 2026
a93eb18
Connected Apps renders the scope lane
evanrbowers Aug 21, 2026
baaca7e
Detail groups name the owning API's address
evanrbowers Aug 21, 2026
5416070
Connected Apps detail reads like the consent screen
evanrbowers Aug 21, 2026
c2819c6
Desktop sign-in offers the account chooser
evanrbowers Aug 21, 2026
5eb60c4
Detail header shows the app's verifiable origin
evanrbowers Aug 21, 2026
ba6aca7
Connected Apps detail becomes the grant editor
evanrbowers Aug 21, 2026
d6a4b3f
Connected Apps honors the grant's revoked state
evanrbowers Aug 21, 2026
f01dee6
Connected Apps: the ACCOUNTS reach is editable within consent
evanrbowers Aug 21, 2026
b9e39a7
Deselecting 'all accounts' keeps today's accounts selected
evanrbowers Aug 21, 2026
2df010e
DPoP module (plan D9): non-extractable key, proofs on every token call
evanrbowers Aug 21, 2026
0d90981
AS-served stage switcher; events stream minted as its own audience
evanrbowers Aug 21, 2026
cf684b4
Test Settings: new i18n keys so the renamed switcher labels take effect
evanrbowers Aug 22, 2026
8d773cb
Stage targets are radios — they are mutually exclusive
evanrbowers Aug 22, 2026
e48670f
Drop the override switch — the radio choice already carries it
evanrbowers Aug 22, 2026
abaeb1d
Give the stage picker its own 'API Target' section
evanrbowers Aug 22, 2026
fccb701
Windows gets the new-window auth browser too
evanrbowers Aug 22, 2026
2524250
Connected Apps: the same two extensions, in step with the console
evanrbowers Aug 22, 2026
fe230b2
Heal a grant that predates a deployed slice, without a sign-in
evanrbowers Aug 22, 2026
2b4c46e
Detect a stale grant by fingerprint, not by minting tokens
evanrbowers Aug 22, 2026
a984d02
Connected Apps: offer all-accounts when the AS says it is on offer
evanrbowers Aug 22, 2026
9e9a250
Name the account when stepping up
evanrbowers Aug 22, 2026
03d106c
Drop the sign-in warning from the extend confirmation
evanrbowers Aug 22, 2026
8cc2503
View-as deep-links to the operator console (Phase 4d)
evanrbowers Aug 24, 2026
0d1f732
View-as deep-links by EMAIL — the key both worlds share
evanrbowers Aug 24, 2026
d9723df
The portal drops its tokens on a support-session launch (4d)
evanrbowers Aug 24, 2026
4b094cf
The support-session hook must not reach below itself (TDZ crash on dev)
evanrbowers Aug 24, 2026
9524e7d
The support banner is back — fed by the token, not app state
evanrbowers Aug 25, 2026
544298b
A support session is tab-scoped: sessionStorage, never the shared store
evanrbowers Aug 25, 2026
f69dfc9
View-as is one click: the deep link directs the portal launch
evanrbowers Aug 25, 2026
2b7209b
Merge feat/permitteer-login: the chat branch joins the permitteer world
evanrbowers Aug 25, 2026
151a067
The chat rides the session: one sign-in, agent-audience tokens, the D…
evanrbowers Aug 25, 2026
a61b03e
The chat sends only its words: the desktop lands the D11 resource con…
evanrbowers Aug 25, 2026
da88a2b
Background work gets its switch: enroll, watch the verdict, revoke
evanrbowers Aug 25, 2026
54fe78a
Rename Mycal to Remote.It AI; the AI portal shows the chat unconditio…
evanrbowers Aug 25, 2026
2038726
A history picker for the chat: past conversations, backed by the serv…
evanrbowers Aug 25, 2026
3198691
The chat panel reads as a chat: intro empty-state, session name, slim…
evanrbowers Aug 25, 2026
4c8ddb5
A working indicator: pulsing dots while the agent has the floor
evanrbowers Aug 25, 2026
754f3b2
feat(chat): drag-to-resize the chat column
JamieRuderman Aug 25, 2026
65b4440
Usage limits Phase 4: the visible meter, quiet until it matters
evanrbowers Aug 25, 2026
a2b8721
The chat resets when the signed-in identity changes — never inherit a…
evanrbowers Aug 25, 2026
ee15f57
feat(chat): use the Remote.It AI mark for the agent icon
JamieRuderman Aug 26, 2026
be4f4f0
docs(env): document the permitteer OIDC and AI chat variables for loc…
JamieRuderman Aug 26, 2026
e09a8fa
docs(env): stage and agent URLs move to Test Settings; document local…
JamieRuderman Aug 26, 2026
f63ddc7
fix(env): default the graphql and websocket URLs to the OIDC resource…
JamieRuderman Aug 26, 2026
3861e06
style(chat): enlarge the agent icon in the header
JamieRuderman Aug 26, 2026
4bc75d6
refactor(test-settings): one Custom toggle for the graphql, websocket…
JamieRuderman Aug 26, 2026
1063e35
refactor(test-settings): drop the stage picker and query header; rest…
JamieRuderman Aug 26, 2026
1d5f640
refactor(test-settings): move AI background work into test options wi…
JamieRuderman Aug 26, 2026
cda9b74
fix(test-settings): show the resolved default in the agent service UR…
JamieRuderman Aug 26, 2026
10985f6
fix(oidc): serialize token mints per audience and surface mint refusals
JamieRuderman Aug 26, 2026
48a25d5
feat(test-settings): restore the AS-served stage picker
JamieRuderman Aug 26, 2026
f34e5b5
fix(test-settings): light a stage radio only when both its URLs still…
JamieRuderman Aug 26, 2026
4637764
fix(test-settings): revert the agent service URL to its default when …
JamieRuderman Aug 26, 2026
d6c4b1a
fix(test-settings): don't emit preferences before the backend has sen…
JamieRuderman Aug 26, 2026
b47d660
style(header): fixed-width AI agent icon button
JamieRuderman Aug 26, 2026
70f8e1d
feat(chat): maximize toggle, effective-width layout breakpoints, open…
JamieRuderman Aug 26, 2026
6dca30c
fix(chat): track the drag live so the content panels shrink instead o…
JamieRuderman Aug 26, 2026
faf21ed
fix(chat): keep the chat docked until the column and content minimums…
JamieRuderman Aug 27, 2026
b29dc74
fix(chat): lead the header with the expand toggle and align it to the…
JamieRuderman Aug 27, 2026
75724e6
feat(chat): pale blue panel ground and a usage ring under the composer
JamieRuderman Aug 27, 2026
ce1b199
refactor(chat): drop the header title and org line; the history menu …
JamieRuderman Aug 27, 2026
4a1622a
fix(test-settings): lead the API target radios with the environment name
JamieRuderman Aug 27, 2026
f1d7c67
fix(chat): inline the usage ring in the composer, tint the input, dro…
JamieRuderman Aug 27, 2026
048fc5f
feat(chat): white composer card with the usage ring alongside it
JamieRuderman Aug 27, 2026
6863915
copy(chat): composer placeholder reads Chat with Remote.It
JamieRuderman Aug 27, 2026
e89f858
feat(chat): quieter empty state with prompt chips against the composer
JamieRuderman Aug 27, 2026
572df2a
style(chat): soften the prompt chip text
JamieRuderman Aug 27, 2026
51fe16b
copy(chat): empty state says the agent can make changes, not just answer
JamieRuderman Aug 27, 2026
f236351
copy(chat): empty state leads with manage
JamieRuderman Aug 27, 2026
cea7668
feat(chat): white cards for agent replies and roomier panel padding
JamieRuderman Aug 27, 2026
6d6268c
style(chat): theme text tokens, roomier bubbles, edge shadow, standar…
JamieRuderman Aug 27, 2026
049a2a2
fix(chat): add a top overflow fade and lift the edge shadow above it
JamieRuderman Aug 27, 2026
88b6b34
refactor(chat): move radii, sizes and weights onto theme tokens; use …
JamieRuderman Aug 27, 2026
bc04eb0
refactor(styling): one scrollbar implementation with an optional narr…
JamieRuderman Aug 27, 2026
9a90add
feat(chat): the conversation name is the history picker, beside the e…
JamieRuderman Aug 27, 2026
399f8de
feat(chat): standard hit box for the history control, History subhead…
JamieRuderman Aug 27, 2026
767702d
style(chat): line chevron that flips when open, menu rows aligned to …
JamieRuderman Aug 27, 2026
75fcc58
style(chat): match the avatar menu's elevation and transparent list
JamieRuderman Aug 27, 2026
5d0c113
i18n(catalogs): extract missing keys, drop dead ones, translate ja/de/es
JamieRuderman Aug 27, 2026
0851abe
ci: run i18n:check alongside typecheck
JamieRuderman Aug 27, 2026
3e18906
style(chat): light grey panel ground, with the overflow fade and popo…
JamieRuderman Aug 27, 2026
e9c0140
fix(chat): show the history delete only on hover, not on the focused row
JamieRuderman Aug 27, 2026
5862d52
feat(chat): three-step onboarding tour for the AI agent
JamieRuderman Aug 27, 2026
fc78c48
fix(guides): date the dismiss-all so later guides still appear
JamieRuderman Aug 27, 2026
e160705
feat(chat): confirm before deleting a conversation; name stages by en…
JamieRuderman Aug 27, 2026
4c0b1cb
feat(chat): getting-started prompts when the scoped org has no devices
JamieRuderman Aug 27, 2026
e7738bf
fix(devices): stuck spinner on an empty list after switching accounts
JamieRuderman Aug 27, 2026
d9bcb9a
style(chat): clone icons for pop out and pop in
JamieRuderman Aug 27, 2026
41293eb
style(chat): use object-subtract flipped for pop in
JamieRuderman Aug 27, 2026
edb387f
style(chat): invert table fill and grid
JamieRuderman Aug 27, 2026
8cea876
style(chat): message spacing, width caps and tinted code blocks
JamieRuderman Aug 27, 2026
bb780af
fix(chat): match code block scrollbar to its background
JamieRuderman Aug 27, 2026
9f9ff7c
feat(chat): sign finished answers with the AI mark and pulse its sign…
JamieRuderman Aug 27, 2026
0b8fd4c
fix(chat): defer connectivity to the global network detector
JamieRuderman Aug 28, 2026
e4e6ded
feat(chat): single AI mark at the foot, grey idle and blue while working
JamieRuderman Aug 28, 2026
d03660b
style(chat): tighten composer padding and space the mark
JamieRuderman Aug 28, 2026
ae6ef07
Merge remote-tracking branch 'origin/main' into feature/agent-chat-ui
JamieRuderman Aug 28, 2026
76dfff7
style(chat): inset the docked panel from the theme spacing scale
JamieRuderman Aug 28, 2026
7bc793c
feat(chat): tooltip the usage ring, refine its meter and popout icons
JamieRuderman Aug 28, 2026
3caa5da
fix(layout): keep the bottom menu on the app side of the chat column
JamieRuderman Aug 28, 2026
5aca91c
fix(body): mask the overflow fades instead of overlaying gradients
JamieRuderman Aug 28, 2026
5b6663d
fix(body): measure the scrollbar gutter so the fade reaches the edge
JamieRuderman Aug 28, 2026
3ad9f2a
feat(chat): centre the transcript column and widen the app frame for it
JamieRuderman Aug 28, 2026
ae49296
fix(layout): stop double-counting the chat width, drop chat expand, s…
JamieRuderman Aug 28, 2026
cf944a3
perf(chat): publish the drag width on breakpoint crossings, not every…
JamieRuderman Aug 28, 2026
f8f3f8e
feat(chat): cap the column at the width its transcript can use
JamieRuderman Aug 28, 2026
1d4d028
fix(chat): keep the history delete visible where there is no hover
JamieRuderman Aug 28, 2026
2375180
fix(layout): measure MobileUI against the app's breakpoint, not the r…
JamieRuderman Aug 28, 2026
5572603
fix(layout): measure the mobile breakpoint against the app, not the w…
JamieRuderman Aug 28, 2026
d1c061c
fix(lists): size the device and service lists from their panel, not t…
JamieRuderman Aug 28, 2026
62eef01
copy(chat): swap the restart prompt for adding a device
JamieRuderman Aug 28, 2026
dc50f89
feat(chat): gate the AI chat on an 'ai-agent' license feature
JamieRuderman Aug 28, 2026
4fe987d
docs(env): describe the chat's license gate in .env.example
JamieRuderman Aug 28, 2026
ae75d12
fix(chat): make CHAT_ALWAYS_ON a flag default so Test Settings can sw…
JamieRuderman Aug 28, 2026
7b324f4
fix(layout): give the app frame side gutters and hold it until they fit
JamieRuderman Aug 31, 2026
570e825
fix(auth): explain sign-in failures in the user's language instead of…
JamieRuderman Aug 31, 2026
a0386f4
fix(auth): stop the silent authorize loop that rate-limited the login…
JamieRuderman Aug 31, 2026
89ad2f7
fix(auth): clear sign-in failure on sign out, clamp retry hints, subs…
JamieRuderman Aug 31, 2026
0a7a210
copy(test): say feature overrides are personal-account only
JamieRuderman Aug 31, 2026
787ee4a
fix(auth): announce halted auto sign-in and keep server detail to dev…
JamieRuderman Aug 31, 2026
66a0e47
docs(chat): brief the server-side ai-agent license limit and its clie…
JamieRuderman Aug 31, 2026
d646b22
chat: discover the MCP detail type from the resource's PRM — never pi…
evanrbowers Sep 1, 2026
0cf3287
chat/portal: the avatar menu lists every signed-in account — switchin…
evanrbowers Sep 1, 2026
50d2a22
chat/portal: account rows wear the AS's avatar
evanrbowers Sep 2, 2026
e50f12c
chat/portal: a stale saved account recovers silently through the AS
evanrbowers Sep 2, 2026
5908e75
chat/portal: a refresh that lands after sign-out (or activation) may …
evanrbowers Sep 2, 2026
b034236
chat/portal: a support session arrives by ticket and ends with its token
evanrbowers Sep 2, 2026
288527c
chat/portal: the avatar menu learns the accounts signed in on this br…
evanrbowers Sep 2, 2026
aeb9eea
style(chat): drop the card behind agent messages
JamieRuderman Sep 2, 2026
ff55c23
docs(chat): record the MCP detail retirement fix and drop the retired…
JamieRuderman Sep 2, 2026
21fa307
chat/portal: view-as lands on THIS portal's origin
evanrbowers Sep 3, 2026
4e3c234
chat/portal: the support banner's close falls back to the console whe…
evanrbowers Sep 3, 2026
b81a808
Merge branch 'main' into feature/agent-chat-interface
JamieRuderman Sep 3, 2026
5cc8b7c
chat/portal: view-as is a navigation into the AS — the confirm page, …
evanrbowers Sep 3, 2026
18b1918
Merge feat/support-ticket — support sessions by ticket, the browser's…
evanrbowers Sep 4, 2026
21b5709
Merge branch 'main' into feat/permitteer-login
evanrbowers Sep 4, 2026
9a6c568
graphql calls present bound tokens with the DPoP scheme + a per-reque…
evanrbowers Sep 4, 2026
bc6a8d3
Merge feat/permitteer-login into feature/agent-chat-interface
evanrbowers Sep 4, 2026
17a3176
the account menu follows the AS's answer, and says so when it cannot
evanrbowers Sep 4, 2026
5dc7725
Merge branch 'feat/permitteer-login' into feature/agent-chat-interface
evanrbowers Sep 4, 2026
e47324a
the account menu drops a saved account only when the AS answered from…
evanrbowers Sep 4, 2026
93ce835
Merge branch 'feat/permitteer-login' into feature/agent-chat-interface
evanrbowers Sep 4, 2026
7aa0f05
user model: a login payload without an account writes nothing — and G…
evanrbowers Sep 4, 2026
4289753
refresh under a cross-tab lock — two tabs were double-spending one re…
evanrbowers Sep 5, 2026
46cb510
Merge branch 'feat/permitteer-login' into feature/agent-chat-interface
evanrbowers Sep 5, 2026
fd75750
oidc: a sign-in that completes in another tab finishes — the flow rec…
evanrbowers Sep 5, 2026
be5fe88
note why the unified front also skips minting a socket audience
evanrbowers Sep 6, 2026
7c038d0
the dev fallback resource is the unified front, not the host that was…
evanrbowers Sep 7, 2026
8d23363
Merge branch 'feat/permitteer-login' into feature/agent-chat-interface
evanrbowers Sep 7, 2026
ad18d10
the grant heal stops latching a refusal it can no longer justify
evanrbowers Sep 7, 2026
5a25925
Merge branch 'feat/permitteer-login' into feature/agent-chat-interface
evanrbowers Sep 7, 2026
a7d8967
the chat's own failure is what unlatches the grant heal
evanrbowers Sep 7, 2026
908e088
the API target picker understands a front whose identifier is not a URL
evanrbowers Sep 7, 2026
0731d4d
Merge branch 'feat/permitteer-login' — the API target picker, ported …
evanrbowers Sep 7, 2026
db913e4
oidc: a stale copy recovers the session instead of ending it; a switc…
evanrbowers Sep 7, 2026
dd3d7cc
Merge remote-tracking branch 'origin/main' into feature/agent-chat-in…
JamieRuderman Sep 9, 2026
c22c09a
fix(devices): drop the accountId left orphaned by merging main
JamieRuderman Sep 9, 2026
2bcab90
i18n(test): translate the API target picker strings for de, es and ja
JamieRuderman Sep 9, 2026
39bb1dd
ci: app.next.remote.it — the `next` branch mirrors this one
evanrbowers Sep 11, 2026
dec3099
Sign-out is local to the app; default API endpoint moves to the unifi…
evanrbowers Sep 13, 2026
53746ec
Merge feat/permitteer-login: sign-out + unified-front prod defaults; …
evanrbowers Sep 14, 2026
4e1a807
Test Settings: plain "Agent service URL (advanced)" field (no toggle)
evanrbowers Sep 14, 2026
25b1c05
Codex review fixes (merge/reconciliation scope)
evanrbowers Sep 14, 2026
98f8777
test(agent): pin agentURL() override resolution
evanrbowers Sep 14, 2026
8c1b609
Codex review fixes — AI-agent subsystem (holistic)
evanrbowers Sep 14, 2026
58cf220
Codex review fixes (round 2)
evanrbowers Sep 14, 2026
418639c
Codex review fixes (round 3) — popout entitlement, sign-in failures, …
evanrbowers Sep 14, 2026
aa724b8
Codex review fixes (round 4) — popout account scope, entitlement-loss…
evanrbowers Sep 14, 2026
843b9b5
Codex review fixes (round 5) — Pop back in gate, send invalidates pic…
evanrbowers Sep 14, 2026
f574f2c
Codex review fixes (round 6) — chat identity, background-work control…
evanrbowers Sep 14, 2026
5fd120b
Codex review fixes (round 7) — one generation guard for every chat lo…
evanrbowers Sep 14, 2026
4b656b0
Merge feature/agent-chat-interface — Remote.It AI chat, Connected App…
evanrbowers Sep 14, 2026
9c6388e
feat(platforms): platform catalogue from the API — desktop keeps only…
JamieRuderman Sep 14, 2026
cac9c27
Icon buttons get their accessible name; the chat's close is "Close ch…
evanrbowers Sep 14, 2026
512060d
Admin → Add-ons: grant the ai-agent licence per account; the licence …
evanrbowers Sep 15, 2026
e4b0023
"Sign out everywhere" is one AS call, then the local teardown (#1222)
evanrbowers Sep 15, 2026
138bcb5
chore(platforms): sync the catalogue snapshot with production — andro…
JamieRuderman Sep 15, 2026
83b91bc
chore(merge): main into feat/permitteer-login — 3.48.10, partial pref…
JamieRuderman Sep 16, 2026
a2d0636
feat(auth): the authorize request carries the app's language as ui_lo…
JamieRuderman Sep 21, 2026
3c9e38e
refactor: drop the retired Cognito MFA lane and other dead code left …
JamieRuderman Sep 21, 2026
2e5923b
refactor: share the helpers the permitteer login re-implemented — sle…
JamieRuderman Sep 21, 2026
c82f6fd
refactor: one panel divider, one add-on page loader, one live-turn ru…
JamieRuderman Sep 21, 2026
5ce3820
perf: layout hooks subscribe to their answer, not the viewport width …
JamieRuderman Sep 21, 2026
d482a19
fix(auth): the agent's refusal invalidates the grant stamp; one ledge…
JamieRuderman Sep 21, 2026
5067b39
refactor(chat): the audience follows the URL on every lane; the gener…
JamieRuderman Sep 22, 2026
29d686e
fix(auth): native mobile signs in through the system browser and its …
JamieRuderman Sep 22, 2026
9952e22
fix(auth): the stamp records declaration drift only — a refusal is th…
JamieRuderman Sep 22, 2026
ecb0650
refactor(chat): the org is a selector over the active account; the po…
JamieRuderman Sep 22, 2026
8385d2b
refactor: one REST header prologue, one https guard, one route consta…
JamieRuderman Sep 22, 2026
5497f5e
refactor(mfa): the credential-change steps are four shared components
JamieRuderman Sep 22, 2026
96d0c98
refactor: one resize-measure hook, the platform registry merge in one…
JamieRuderman Sep 22, 2026
44bc409
refactor(admin): one refresh both selects and loads the add-on — the …
JamieRuderman Sep 22, 2026
0ff248a
perf(chat): the reply in flight lives outside the persisted slice — t…
JamieRuderman Sep 22, 2026
f867937
fix(auth,chat): a support tab keeps the shared DPoP key and its token…
JamieRuderman Sep 22, 2026
10ae178
style(chat): the assistant's text carries the same small inset on eve…
JamieRuderman Sep 22, 2026
660da62
style(chat): the assistant's text is inset from the column edge
JamieRuderman Sep 22, 2026
7f22776
Merge remote-tracking branch 'origin/main' into feat/permitteer-login
JamieRuderman Sep 23, 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
81 changes: 70 additions & 11 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,15 +1,74 @@
# Copy to .env in the REPO ROOT. `npm run copy-env` propagates it to frontend/ and
# electron/ for builds; the vite dev server reads frontend/.env, so copy it there too
# (or run copy-env) after changing anything.
#
# Values below are the DEV stage — the one local development is registered for.

# --- Permitteer sign-in (D8: renderer-owned, identical web/desktop) ------------------
# VITE_* reach the renderer (the whole OIDC client).
#
# VITE_OAUTH_ISSUER is the ONLY var with no built-in fallback — without it the app logs
# "VITE_OAUTH_ISSUER is not configured" and sign-in never starts.
#
# Keep VITE_OAUTH_CLIENT_ID as remoteit_desktop for local work. Redirect URIs are
# registered PER CLIENT, and the deployed AI portal's client (remoteit_portal_ai, set on
# the Amplify branch) has only https://app.ai.remote.it/authCallback registered — using it
# locally fails authorize with a 400. remoteit_desktop carries both
# http://localhost:3003/authCallback and remoteit://authCallback, and both clients are
# granted the same agent/MCP authorization details, so the chat lane works either way.
VITE_OAUTH_ISSUER="https://login.dev.remote.it"
VITE_OAUTH_CLIENT_ID="remoteit_desktop"
VITE_OAUTH_GRAPHQL_RESOURCE="https://cloud.dev.remote.it/api"
VITE_OAUTH_PASSPORT_RESOURCE="https://passport.dev.remote.it/account/api"
VITE_OAUTH_AGENT_RESOURCE="https://agent.dev.remote.it"
VITE_OAUTH_MCP_RESOURCE="https://cloud.dev.remote.it/mcp"
VITE_OAUTH_MCP_DETAIL="remoteit_mcp"

# The GraphQL and WebSocket URLs are NOT set here. They default to the stage named by
# VITE_OAUTH_GRAPHQL_RESOURCE above — on the unified front the resource is the TREE, so
# cloud.dev…/api -> cloud.dev…/api/graphql and wss://cloud.dev…/api/ws — so a fresh
# checkout works out of the box; switch stages in the running app under
# Settings → Test Settings → API Target, which sets both together and mints the matching
# audience. Setting VITE_GRAPHQL_API/VITE_WEBSOCKET_URL by hand still works, but a value
# that disagrees with the OIDC resource 401s with nothing in the UI explaining why.

# --- Remote.It AI chat ---------------------------------------------------------------
# The chat is a license feature ("ai-agent") and nothing else switches it on: the account
# you sign in with — locally too — needs the ai-agent add-on licence, granted from
# Admin → Add-ons by a system admin. Settings → Test Settings → Features can switch it
# back off on an account that holds it. (VITE_CHAT_ALWAYS_ON, which used to default the
# flag on for the AI portal and dev builds, is retired and ignored.)
# In dev, agentURL() returns the same-origin "/agent" vite proxy unless Test Settings
# overrides it, so AGENT_PROXY_TARGET is the knob here: the deployed dev agent, or
# http://localhost:3001 to run the ai-agent service locally. DPoP proofs are signed over
# the canonical resource URL, so proxying does not break them.
AGENT_PROXY_TARGET="https://agent.dev.remote.it"
VITE_AGENT_URL="https://agent.dev.remote.it"

# --- App ------------------------------------------------------------------------------
BRAND=remoteit
AIRBRAKE_PROJECT_KEY="..."
VITE_PORTAL="..."
VITE_API_URL="..."
VITE_CLIENT_ID="..."
VITE_GRAPHQL_API="..."
VITE_GRAPHQL_BETA_API="..."
VITE_PORTAL=false
VITE_API_URL="https://api.remote.it/apv/v27"
VITE_DEVELOPER_KEY="..."
VITE_DEV_CALLBACK_URL="..."
VITE_PROD_CALLBACK_URL="..."
VITE_WEBSOCKET_URL="..."
VITE_WEBSOCKET_BETA_URL="..."

# --- Third party ----------------------------------------------------------------------
AIRBRAKE_PROJECT_KEY="..."
VITE_AIRBRAKE_ID="..."
VITE_AIRBRAKE_KEY="..."
VITE_ZENDESK_URL="..."
VITE_ZENDESK_KEY="..."
VITE_SEGMENT_PROJECT_PORTAL_KEY="..."
VITE_SEGMENT_PROJECT_KEY="..."
VITE_SEGMENT_PROJECT_KEY="..."
VITE_GOOGLE_TAG_MANAGER_DESKTOP_KEY="..."
VITE_GOOGLE_TAG_MANAGER_PORTAL_KEY="..."
VITE_GOOGLE_TAG_MANAGER_ANDROID_KEY="..."
VITE_GOOGLE_TAG_MANAGER_IOS_KEY="..."

# --- Desktop build signing (release builds only) --------------------------------------
SKIP_SIGNING=true
APPLE_ID_PASSWORD="..."
APPLE_TEAM_ID="..."
WINDOWS_SIGN_USER_NAME="..."
WINDOWS_SIGN_USER_PASSWORD="..."
WINDOWS_SIGN_CREDENTIAL_ID="..."
WINDOWS_SIGN_USER_TOTP="..."
6 changes: 6 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Vendored snapshot of the API's platform catalogue, written by scripts/platforms-generate.mjs.
# It is committed on purpose — the app reads it at module load, so generating it at build time
# would need API credentials in every build and would make builds non-reproducible. Marking it
# generated collapses it in review, where the meaningful diff is the migration it came from.
# JSON takes no comments, so this is the only place the marker can live.
frontend/src/platforms/catalogue.generated.json linguist-generated=true
25 changes: 25 additions & 0 deletions .github/workflows/mirror-next.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# app.next.remote.it — the NEXT portal — is this branch built for PRODUCTION's AS and container
# (Amplify branch `next`, env VITE_OAUTH_ISSUER=https://login.remote.it and cloud.remote.it for
# the API). Amplify deploys a branch once, so `next` is a git branch that MIRRORS this one: every
# push here is pushed through, and Amplify's webhook builds it. Nobody commits to `next`.
#
# Why a mirror rather than a second Amplify app: one app, one GitHub connection, one build spec
# and one set of app-level env — `next` differs from app.dev by six branch-level variables.
name: Mirror to next

on:
push:
branches: [feat/permitteer-login]

permissions:
contents: write

jobs:
mirror:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Push this commit to next
run: git push --force origin HEAD:refs/heads/next
12 changes: 12 additions & 0 deletions .github/workflows/typecheck.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,15 @@ jobs:

- name: Run typecheck
run: npm run typecheck

# Catalog COVERAGE + parity. i18n:check alone only compares the catalogs to each other, so a
# t() key missing from ALL of them (a new UI string shipped on its inline default) passes
# unnoticed and renders untranslated for ja/de/es. So first re-extract from source: any
# missing key changes a catalog and the clean-diff check fails until it is committed. Then
# i18n:check verifies parity, no dead keys, and non-empty English. After typecheck so a
# broken build reports first.
- name: Check translation catalogs
run: |
npm run i18n:extract -w=frontend
git diff --exit-code -- frontend/src/i18n/locales || (echo "::error::Untracked i18n keys — run 'npm run i18n:extract -w frontend' and commit." && exit 1)
npm run i18n:check -w=frontend
23 changes: 23 additions & 0 deletions RELEASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,29 @@ A release marked **Pre-release** is only offered to users who have opted in
That is the whole difference between a beta and a public release — a
pre-release that is never promoted is invisible to everyone else.

## Before you bump: refresh the platform catalogue

`frontend/src/platforms/catalogue.generated.json` is a committed snapshot of the API's platform
catalogue — the names, install commands and `/add` page copy that used to be hard-coded here. It
does not refresh itself, so a release can ship stale platform copy if the catalogue changed in the
database and nobody propagated it.

```bash
npm run platforms:generate
```

No diff is the normal case and means the snapshot is current. A diff means the database moved
since the last regeneration: review it as a content change, and note that English copy changes
also need the translations in `frontend/src/i18n/locales/*/platforms.json` updated. Land it as its
own pull request rather than folding it into the version bump.

The primary control is upstream of this — whoever edits the catalogue should regenerate and open
that pull request at the time — so this step is a backstop for when that did not happen.

Until the platform catalogue is deployed to the stage the CLI points at, this reports that the
schema has no catalogue fields. That is expected, not a failure: skip the step and leave the
committed snapshot as it is.

## 1. Bump the version

From `main`, with everything merged and CI green:
Expand Down
6 changes: 6 additions & 0 deletions common/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,9 @@ export const DEFAULT_SERVICE: IService = {
license: 'UNKNOWN',
attributes: {},
}

// Chat popout window — the boot flag and dimensions are a contract between
// the frontend (opens the window with ?chatPopout=<id>) and electron (allows
// the window.open and sizes the child window)
export const CHAT_POPOUT_PARAM = 'chatPopout'
export const CHAT_POPOUT_SIZE = { width: 520, height: 780, minWidth: 360, minHeight: 500 }
Loading
Loading