@circuitwall/jarela 1.4.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/v1/builtin-tools/route.js +10 -1
- package/.next/standalone/.next/server/app/api/v1/builtin-tools/route.js.map +1 -1
- package/.next/standalone/.next/server/app/api/v1/dashboard/currency/route.js +10 -5
- package/.next/standalone/.next/server/app/api/v1/dashboard/currency/route.js.map +1 -1
- package/.next/standalone/.next/server/app/api/v1/providers/[provider]/probe/route.js +9 -1
- package/.next/standalone/.next/server/app/api/v1/providers/[provider]/probe/route.js.map +1 -1
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/run/route.js +33 -8
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/run/route.js.map +1 -1
- package/.next/standalone/.next/server/app/page.js +63 -202
- package/.next/standalone/.next/server/app/page.js.map +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/setup/page.js +1 -1
- package/.next/standalone/.next/server/app/setup/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/1718.js +159 -0
- package/.next/standalone/.next/server/chunks/1718.js.map +1 -0
- package/.next/standalone/.next/server/chunks/2082.js +6 -3
- package/.next/standalone/.next/server/chunks/2082.js.map +1 -1
- package/.next/standalone/.next/server/chunks/210.js +28 -0
- package/.next/standalone/.next/server/chunks/210.js.map +1 -1
- package/.next/standalone/.next/server/chunks/423.js +6 -3
- package/.next/standalone/.next/server/chunks/423.js.map +1 -1
- package/.next/standalone/.next/server/chunks/4631.js +37 -5
- package/.next/standalone/.next/server/chunks/4631.js.map +1 -1
- package/.next/standalone/.next/server/chunks/8167.js +255 -204
- package/.next/standalone/.next/server/chunks/8167.js.map +1 -1
- package/.next/standalone/.next/server/chunks/8866.js +38 -5
- package/.next/standalone/.next/server/chunks/8866.js.map +1 -1
- package/.next/standalone/.next/server/chunks/9032.js +8 -0
- package/.next/standalone/.next/server/chunks/9032.js.map +1 -1
- package/.next/standalone/.next/server/chunks/{7883.js → 9557.js} +15 -3
- package/.next/standalone/.next/server/chunks/9557.js.map +1 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/middleware.js +6 -3
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/proxy.js.map +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/{2351-68d8987bbe17ba2d.js → 2351-1ab119fb3b48f4c9.js} +258 -205
- package/.next/standalone/.next/static/chunks/2351-1ab119fb3b48f4c9.js.map +1 -0
- package/.next/standalone/.next/static/chunks/{9209-0d46118e502f8bf5.js → 4097-64691f9110cf167c.js} +14 -2
- package/.next/standalone/.next/static/chunks/4097-64691f9110cf167c.js.map +1 -0
- package/.next/standalone/.next/static/chunks/app/{page-74846c864241b96d.js → page-145150e0468544e7.js} +64 -203
- package/.next/standalone/.next/static/chunks/app/page-145150e0468544e7.js.map +1 -0
- package/.next/standalone/.next/static/chunks/app/setup/{page-9a465b5fa755b3c3.js → page-a1463a9ace439ff7.js} +2 -2
- package/.next/standalone/.next/static/chunks/app/setup/{page-9a465b5fa755b3c3.js.map → page-a1463a9ace439ff7.js.map} +1 -1
- package/.next/standalone/.next/static/chunks/{webpack-ff5627013a5e3842.js → webpack-f4ac5c5f92cfd1c1.js} +13 -1
- package/.next/standalone/.next/static/chunks/webpack-f4ac5c5f92cfd1c1.js.map +1 -0
- package/.next/standalone/package.json +1 -1
- package/CHANGELOG.md +60 -0
- package/README.md +1 -1
- package/api/client.ts +10 -9
- package/app/api/v1/dashboard/currency/route.ts +7 -2
- package/app/api/v1/providers/[provider]/probe/route.ts +12 -1
- package/app/api/v1/threads/[thread_id]/run/route.ts +22 -8
- package/components/layout/AppShell.tsx +53 -17
- package/components/setup/PinKeypad.tsx +238 -0
- package/components/setup/ScreenLock.tsx +8 -173
- package/components/setup/UnlockScreen.tsx +25 -192
- package/lib/documents/remote/github.ts +16 -2
- package/lib/documents/remote/mail.ts +11 -2
- package/lib/lifecycle/shutdown.ts +9 -0
- package/lib/providers/github-copilot-auth.ts +2 -0
- package/lib/providers/github-copilot.ts +1 -0
- package/lib/tools/async-results.ts +11 -0
- package/package.json +1 -1
- package/scripts/install-to-system.ps1 +2 -2
- package/scripts/installed-launcher.ps1 +81 -17
- package/.next/standalone/.next/server/chunks/7883.js.map +0 -1
- package/.next/standalone/.next/static/chunks/2351-68d8987bbe17ba2d.js.map +0 -1
- package/.next/standalone/.next/static/chunks/9209-0d46118e502f8bf5.js.map +0 -1
- package/.next/standalone/.next/static/chunks/app/page-74846c864241b96d.js.map +0 -1
- package/.next/standalone/.next/static/chunks/webpack-ff5627013a5e3842.js.map +0 -1
- /package/.next/standalone/.next/static/{AV5AO0yTRABo-NgwxhDe7 → WQdcnm9NyqpeNc0Z8_woo}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{AV5AO0yTRABo-NgwxhDe7 → WQdcnm9NyqpeNc0Z8_woo}/_ssgManifest.js +0 -0
|
@@ -23096,195 +23096,26 @@ function BootScreen({ agents, agentsLoaded, activeAgentId, onPickAgent, suppress
|
|
|
23096
23096
|
});
|
|
23097
23097
|
}
|
|
23098
23098
|
|
|
23099
|
+
// EXTERNAL MODULE: ./components/setup/PinKeypad.tsx
|
|
23100
|
+
var PinKeypad = __webpack_require__(772);
|
|
23099
23101
|
;// ./components/setup/ScreenLock.tsx
|
|
23100
23102
|
/* __next_internal_client_entry_do_not_use__ ScreenLock auto */
|
|
23101
23103
|
|
|
23102
|
-
|
|
23103
|
-
//
|
|
23104
|
-
//
|
|
23105
|
-
//
|
|
23106
|
-
//
|
|
23107
|
-
//
|
|
23108
|
-
const PIN_LENGTH = 6;
|
|
23104
|
+
// Screen-lock overlay (presence check). Mounted by AppShell when the
|
|
23105
|
+
// idle timer fires or the server returns 423 `screen-locked`. Does
|
|
23106
|
+
// NOT touch the in-memory master key — background work (agents,
|
|
23107
|
+
// scheduler, bridges) keeps running underneath. The /verify-pin
|
|
23108
|
+
// endpoint just confirms the human at the keyboard and clears the
|
|
23109
|
+
// idle flag.
|
|
23109
23110
|
function ScreenLock({ onUnlock }) {
|
|
23110
|
-
|
|
23111
|
-
|
|
23112
|
-
|
|
23113
|
-
const [retryAfterSec, setRetryAfterSec] = (0,react.useState)(0);
|
|
23114
|
-
const submittingRef = (0,react.useRef)(false);
|
|
23115
|
-
const submit = (0,react.useCallback)(async (pin)=>{
|
|
23116
|
-
if (submittingRef.current) return;
|
|
23117
|
-
submittingRef.current = true;
|
|
23118
|
-
setSubmitting(true);
|
|
23119
|
-
setError(null);
|
|
23120
|
-
try {
|
|
23121
|
-
const res = await fetch("/api/v1/security/verify-pin", {
|
|
23122
|
-
method: "POST",
|
|
23123
|
-
headers: {
|
|
23124
|
-
"content-type": "application/json"
|
|
23125
|
-
},
|
|
23126
|
-
body: JSON.stringify({
|
|
23127
|
-
pin
|
|
23128
|
-
})
|
|
23129
|
-
});
|
|
23130
|
-
if (res.ok) {
|
|
23131
|
-
onUnlock();
|
|
23132
|
-
return;
|
|
23133
|
-
}
|
|
23134
|
-
const body = await res.json().catch(()=>({}));
|
|
23135
|
-
if (res.status === 429 && typeof body.retry_after_ms === "number") {
|
|
23136
|
-
setRetryAfterSec(Math.ceil(body.retry_after_ms / 1000));
|
|
23137
|
-
setError("Too many attempts. Try again later.");
|
|
23138
|
-
} else if (res.status === 401) {
|
|
23139
|
-
setError("Wrong PIN. Try again.");
|
|
23140
|
-
} else if (res.status === 400) {
|
|
23141
|
-
setError("Invalid PIN format.");
|
|
23142
|
-
} else {
|
|
23143
|
-
setError(body.error ?? `Error (${res.status})`);
|
|
23144
|
-
}
|
|
23145
|
-
setDigits("");
|
|
23146
|
-
} catch (err) {
|
|
23147
|
-
setError(err instanceof Error ? err.message : String(err));
|
|
23148
|
-
setDigits("");
|
|
23149
|
-
} finally{
|
|
23150
|
-
submittingRef.current = false;
|
|
23151
|
-
setSubmitting(false);
|
|
23152
|
-
}
|
|
23153
|
-
}, [
|
|
23154
|
-
onUnlock
|
|
23155
|
-
]);
|
|
23156
|
-
const append = (0,react.useCallback)((d)=>{
|
|
23157
|
-
if (submitting || retryAfterSec > 0) return;
|
|
23158
|
-
setError(null);
|
|
23159
|
-
setDigits((cur)=>cur.length >= PIN_LENGTH ? cur : cur + d);
|
|
23160
|
-
}, [
|
|
23161
|
-
submitting,
|
|
23162
|
-
retryAfterSec
|
|
23163
|
-
]);
|
|
23164
|
-
(0,react.useEffect)(()=>{
|
|
23165
|
-
if (digits.length === PIN_LENGTH && !submittingRef.current) {
|
|
23166
|
-
void submit(digits);
|
|
23167
|
-
}
|
|
23168
|
-
}, [
|
|
23169
|
-
digits,
|
|
23170
|
-
submit
|
|
23171
|
-
]);
|
|
23172
|
-
const backspace = (0,react.useCallback)(()=>{
|
|
23173
|
-
if (submitting) return;
|
|
23174
|
-
setError(null);
|
|
23175
|
-
setDigits((cur)=>cur.slice(0, -1));
|
|
23176
|
-
}, [
|
|
23177
|
-
submitting
|
|
23178
|
-
]);
|
|
23179
|
-
(0,react.useEffect)(()=>{
|
|
23180
|
-
function onKey(e) {
|
|
23181
|
-
if (/^[0-9]$/.test(e.key)) {
|
|
23182
|
-
e.preventDefault();
|
|
23183
|
-
append(e.key);
|
|
23184
|
-
} else if (e.key === "Backspace") {
|
|
23185
|
-
e.preventDefault();
|
|
23186
|
-
backspace();
|
|
23187
|
-
}
|
|
23188
|
-
}
|
|
23189
|
-
window.addEventListener("keydown", onKey);
|
|
23190
|
-
return ()=>window.removeEventListener("keydown", onKey);
|
|
23191
|
-
}, [
|
|
23192
|
-
append,
|
|
23193
|
-
backspace
|
|
23194
|
-
]);
|
|
23195
|
-
(0,react.useEffect)(()=>{
|
|
23196
|
-
if (retryAfterSec <= 0) return;
|
|
23197
|
-
const t = setInterval(()=>{
|
|
23198
|
-
setRetryAfterSec((s)=>s > 0 ? s - 1 : 0);
|
|
23199
|
-
}, 1000);
|
|
23200
|
-
return ()=>clearInterval(t);
|
|
23201
|
-
}, [
|
|
23202
|
-
retryAfterSec
|
|
23203
|
-
]);
|
|
23204
|
-
return /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", {
|
|
23205
|
-
className: "fixed inset-0 z-[1000] flex flex-col items-center justify-center gap-6 bg-surface text-fg",
|
|
23206
|
-
style: {
|
|
23207
|
-
paddingTop: "env(safe-area-inset-top)",
|
|
23208
|
-
paddingBottom: "env(safe-area-inset-bottom)"
|
|
23209
|
-
},
|
|
23210
|
-
children: [
|
|
23211
|
-
/*#__PURE__*/ (0,jsx_runtime.jsx)(Logo/* Logo */.g, {
|
|
23212
|
-
className: "h-16 w-auto"
|
|
23213
|
-
}),
|
|
23214
|
-
/*#__PURE__*/ (0,jsx_runtime.jsxs)("div", {
|
|
23215
|
-
className: "w-full max-w-xs p-6",
|
|
23216
|
-
children: [
|
|
23217
|
-
/*#__PURE__*/ (0,jsx_runtime.jsx)("h1", {
|
|
23218
|
-
className: "mb-1 text-center text-lg font-semibold text-fg",
|
|
23219
|
-
children: "Locked"
|
|
23220
|
-
}),
|
|
23221
|
-
/*#__PURE__*/ (0,jsx_runtime.jsx)("p", {
|
|
23222
|
-
className: "mb-6 text-center text-xs text-fg-faint",
|
|
23223
|
-
children: "Enter your 6-digit PIN to resume."
|
|
23224
|
-
}),
|
|
23225
|
-
/*#__PURE__*/ (0,jsx_runtime.jsx)("div", {
|
|
23226
|
-
className: "mb-6 flex justify-center gap-3",
|
|
23227
|
-
"aria-label": "PIN entry progress",
|
|
23228
|
-
children: Array.from({
|
|
23229
|
-
length: PIN_LENGTH
|
|
23230
|
-
}).map((_, i)=>/*#__PURE__*/ (0,jsx_runtime.jsx)("span", {
|
|
23231
|
-
className: `h-3 w-3 rounded-full transition-colors ${i < digits.length ? error ? "bg-red-500" : "bg-fg" : "bg-surface-3"}`
|
|
23232
|
-
}, i))
|
|
23233
|
-
}),
|
|
23234
|
-
/*#__PURE__*/ (0,jsx_runtime.jsxs)("div", {
|
|
23235
|
-
className: "grid grid-cols-3 gap-2",
|
|
23236
|
-
children: [
|
|
23237
|
-
[
|
|
23238
|
-
"1",
|
|
23239
|
-
"2",
|
|
23240
|
-
"3",
|
|
23241
|
-
"4",
|
|
23242
|
-
"5",
|
|
23243
|
-
"6",
|
|
23244
|
-
"7",
|
|
23245
|
-
"8",
|
|
23246
|
-
"9"
|
|
23247
|
-
].map((d)=>/*#__PURE__*/ (0,jsx_runtime.jsx)(PinKey, {
|
|
23248
|
-
digit: d,
|
|
23249
|
-
onPress: ()=>append(d),
|
|
23250
|
-
disabled: submitting || retryAfterSec > 0
|
|
23251
|
-
}, d)),
|
|
23252
|
-
/*#__PURE__*/ (0,jsx_runtime.jsx)("div", {}),
|
|
23253
|
-
/*#__PURE__*/ (0,jsx_runtime.jsx)(PinKey, {
|
|
23254
|
-
digit: "0",
|
|
23255
|
-
onPress: ()=>append("0"),
|
|
23256
|
-
disabled: submitting || retryAfterSec > 0
|
|
23257
|
-
}),
|
|
23258
|
-
/*#__PURE__*/ (0,jsx_runtime.jsx)(PinKey, {
|
|
23259
|
-
digit: "←",
|
|
23260
|
-
onPress: backspace,
|
|
23261
|
-
disabled: submitting || digits.length === 0,
|
|
23262
|
-
ariaLabel: "Backspace"
|
|
23263
|
-
})
|
|
23264
|
-
]
|
|
23265
|
-
}),
|
|
23266
|
-
/*#__PURE__*/ (0,jsx_runtime.jsx)("p", {
|
|
23267
|
-
className: `mt-4 min-h-[1.5rem] text-center text-xs ${error ? "text-red-400" : "text-fg-faint"}`,
|
|
23268
|
-
role: "status",
|
|
23269
|
-
"aria-live": "polite",
|
|
23270
|
-
children: retryAfterSec > 0 ? `Try again in ${retryAfterSec}s` : error ?? (submitting ? "Verifying…" : "\u00A0")
|
|
23271
|
-
})
|
|
23272
|
-
]
|
|
23273
|
-
})
|
|
23274
|
-
]
|
|
23275
|
-
});
|
|
23276
|
-
}
|
|
23277
|
-
function PinKey({ digit, onPress, disabled, ariaLabel }) {
|
|
23278
|
-
return /*#__PURE__*/ (0,jsx_runtime.jsx)("button", {
|
|
23279
|
-
type: "button",
|
|
23280
|
-
onClick: onPress,
|
|
23281
|
-
disabled: disabled,
|
|
23282
|
-
"aria-label": ariaLabel ?? digit,
|
|
23283
|
-
className: "h-14 rounded-xl bg-surface-3 text-xl font-medium text-fg transition-colors hover:bg-surface-3/70 active:bg-surface-3/50 disabled:cursor-not-allowed disabled:opacity-50",
|
|
23284
|
-
children: digit
|
|
23111
|
+
return /*#__PURE__*/ (0,jsx_runtime.jsx)(PinKeypad/* PinKeypad */.y, {
|
|
23112
|
+
mode: "unlock",
|
|
23113
|
+
onSuccess: onUnlock
|
|
23285
23114
|
});
|
|
23286
23115
|
}
|
|
23287
23116
|
|
|
23117
|
+
// EXTERNAL MODULE: ./components/setup/UnlockScreen.tsx
|
|
23118
|
+
var UnlockScreen = __webpack_require__(2283);
|
|
23288
23119
|
// EXTERNAL MODULE: ./node_modules/lucide-react/dist/esm/icons/message-square.mjs
|
|
23289
23120
|
var message_square = __webpack_require__(5494);
|
|
23290
23121
|
// EXTERNAL MODULE: ./node_modules/lucide-react/dist/esm/icons/chart-column.mjs
|
|
@@ -25723,6 +25554,7 @@ function InteractiveCostChart({ series, currencyInfo, selectedDay, onSelectDay }
|
|
|
25723
25554
|
|
|
25724
25555
|
|
|
25725
25556
|
|
|
25557
|
+
|
|
25726
25558
|
|
|
25727
25559
|
|
|
25728
25560
|
const AppShell_ADVANCED_TABS = new Set([
|
|
@@ -25893,24 +25725,30 @@ function AppShell() {
|
|
|
25893
25725
|
showAgentPicker
|
|
25894
25726
|
]);
|
|
25895
25727
|
const activeAgent = state.activeAgentId ? agents.find((a)=>a.id === state.activeAgentId) ?? null : null;
|
|
25896
|
-
// Screen-lock overlay
|
|
25897
|
-
// (
|
|
25898
|
-
//
|
|
25899
|
-
//
|
|
25900
|
-
//
|
|
25901
|
-
//
|
|
25728
|
+
// Screen-lock overlay (presence check) AND master-key-locked overlay
|
|
25729
|
+
// (decrypt). Distinct from the boot-time gate in `app/page.tsx`:
|
|
25730
|
+
// those mounts are triggered mid-session — either by an idle timer
|
|
25731
|
+
// (screen-lock) or by the master key being re-locked by an external
|
|
25732
|
+
// process (decrypt). Both are signalled by the API client when it
|
|
25733
|
+
// sees the matching 423 response.
|
|
25902
25734
|
const [screenLocked, setScreenLocked] = (0,react.useState)(false);
|
|
25735
|
+
const [masterKeyLocked, setMasterKeyLocked] = (0,react.useState)(false);
|
|
25903
25736
|
// Bumped after each unlock so BootScreen remounts with fresh state
|
|
25904
25737
|
// (its `done` / `pickedId` / `prefetchStartedRef` would otherwise
|
|
25905
|
-
// suppress the picker on the second appearance).
|
|
25738
|
+
// suppress the picker on the second appearance). Both unlock paths
|
|
25739
|
+
// bump this — the agent selector is always the post-unlock landing.
|
|
25906
25740
|
const [bootSeq, setBootSeq] = (0,react.useState)(0);
|
|
25907
25741
|
(0,react.useEffect)(()=>{
|
|
25908
25742
|
let cancelled = false;
|
|
25909
25743
|
let timer = null;
|
|
25910
|
-
function
|
|
25744
|
+
function onScreenLocked() {
|
|
25911
25745
|
if (!cancelled) setScreenLocked(true);
|
|
25912
25746
|
}
|
|
25913
|
-
|
|
25747
|
+
function onMasterKeyLocked() {
|
|
25748
|
+
if (!cancelled) setMasterKeyLocked(true);
|
|
25749
|
+
}
|
|
25750
|
+
window.addEventListener("jarela:screen-locked", onScreenLocked);
|
|
25751
|
+
window.addEventListener("jarela:master-key-locked", onMasterKeyLocked);
|
|
25914
25752
|
// Soft poll every 30s so the overlay still appears if no user
|
|
25915
25753
|
// action triggered a request after the idle timer elapsed.
|
|
25916
25754
|
async function probe() {
|
|
@@ -25918,11 +25756,13 @@ function AppShell() {
|
|
|
25918
25756
|
const res = await fetch("/api/v1/security/state");
|
|
25919
25757
|
if (!res.ok) return;
|
|
25920
25758
|
const body = await res.json();
|
|
25921
|
-
if (
|
|
25922
|
-
|
|
25923
|
-
|
|
25924
|
-
} catch
|
|
25925
|
-
|
|
25759
|
+
if (cancelled) return;
|
|
25760
|
+
if (body.state === "locked") setMasterKeyLocked(true);
|
|
25761
|
+
if (body.screen_locked === true) setScreenLocked(true);
|
|
25762
|
+
} catch (err) {
|
|
25763
|
+
// Network blip; try again next tick. Logged at debug-level so
|
|
25764
|
+
// a sustained outage is at least findable in devtools.
|
|
25765
|
+
if (false) {}
|
|
25926
25766
|
}
|
|
25927
25767
|
}
|
|
25928
25768
|
void probe();
|
|
@@ -25930,9 +25770,22 @@ function AppShell() {
|
|
|
25930
25770
|
return ()=>{
|
|
25931
25771
|
cancelled = true;
|
|
25932
25772
|
if (timer) clearInterval(timer);
|
|
25933
|
-
window.removeEventListener("jarela:screen-locked",
|
|
25773
|
+
window.removeEventListener("jarela:screen-locked", onScreenLocked);
|
|
25774
|
+
window.removeEventListener("jarela:master-key-locked", onMasterKeyLocked);
|
|
25934
25775
|
};
|
|
25935
25776
|
}, []);
|
|
25777
|
+
// Shared post-unlock landing: clear the current chat and force the
|
|
25778
|
+
// BootScreen to remount so the user lands on the agent picker. Used
|
|
25779
|
+
// by BOTH the screen-unlock and the master-key decrypt paths so the
|
|
25780
|
+
// two transitions feel identical from the user's side.
|
|
25781
|
+
const landOnAgentPicker = (0,react.useCallback)(()=>{
|
|
25782
|
+
dispatch({
|
|
25783
|
+
type: "NEW_CHAT"
|
|
25784
|
+
});
|
|
25785
|
+
setBootSeq((n)=>n + 1);
|
|
25786
|
+
}, [
|
|
25787
|
+
dispatch
|
|
25788
|
+
]);
|
|
25936
25789
|
return(// `dvh` natively tracks the visible viewport on iOS 16.4+ / modern
|
|
25937
25790
|
// Chromium, including the on-screen keyboard. The `--actual-vh`
|
|
25938
25791
|
// override (set by the iOS-standalone-PWA shim in layout.tsx) covers
|
|
@@ -25966,13 +25819,21 @@ function AppShell() {
|
|
|
25966
25819
|
onUnlock: ()=>{
|
|
25967
25820
|
// Drop the user back on the picker so they consciously
|
|
25968
25821
|
// re-enter their workspace rather than landing mid-chat.
|
|
25969
|
-
|
|
25970
|
-
type: "NEW_CHAT"
|
|
25971
|
-
});
|
|
25972
|
-
setBootSeq((n)=>n + 1);
|
|
25822
|
+
landOnAgentPicker();
|
|
25973
25823
|
setScreenLocked(false);
|
|
25974
25824
|
}
|
|
25975
25825
|
}),
|
|
25826
|
+
masterKeyLocked && !screenLocked && // Master key got re-locked mid-session (e.g. external lock
|
|
25827
|
+
// command). Mount the decrypt splash — same shared keypad as
|
|
25828
|
+
// boot — and on success drop back to the agent picker. The
|
|
25829
|
+
// existing components below stay mounted underneath; once
|
|
25830
|
+
// unlocked they resume against the now-unlocked DB.
|
|
25831
|
+
/*#__PURE__*/ (0,jsx_runtime.jsx)(UnlockScreen.UnlockScreen, {
|
|
25832
|
+
onUnlock: ()=>{
|
|
25833
|
+
landOnAgentPicker();
|
|
25834
|
+
setMasterKeyLocked(false);
|
|
25835
|
+
}
|
|
25836
|
+
}),
|
|
25976
25837
|
/*#__PURE__*/ (0,jsx_runtime.jsx)(NotificationStatus, {}),
|
|
25977
25838
|
/*#__PURE__*/ (0,jsx_runtime.jsx)(Toaster, {}),
|
|
25978
25839
|
/*#__PURE__*/ (0,jsx_runtime.jsx)(ServerStatus, {}),
|
|
@@ -26220,9 +26081,9 @@ Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_re
|
|
|
26220
26081
|
},
|
|
26221
26082
|
/******/ __webpack_require__ => { // webpackRuntimeModules
|
|
26222
26083
|
/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
|
|
26223
|
-
/******/ __webpack_require__.O(0, [1973,
|
|
26084
|
+
/******/ __webpack_require__.O(0, [1973,4097,7537,2351,8441,3457,7358], () => (__webpack_exec__(9852)));
|
|
26224
26085
|
/******/ var __webpack_exports__ = __webpack_require__.O();
|
|
26225
26086
|
/******/ _N_E = __webpack_exports__;
|
|
26226
26087
|
/******/ }
|
|
26227
26088
|
]);
|
|
26228
|
-
//# sourceMappingURL=page-
|
|
26089
|
+
//# sourceMappingURL=page-145150e0468544e7.js.map
|