af360 0.1.13 → 0.1.15
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/bin/af360.mjs +38 -5
- package/dist/.next/BUILD_ID +1 -1
- package/dist/.next/app-build-manifest.json +136 -138
- package/dist/.next/app-path-routes-manifest.json +20 -20
- package/dist/.next/build-manifest.json +5 -5
- package/dist/.next/prerender-manifest.json +46 -46
- package/dist/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/_not-found.html +1 -1
- package/dist/.next/server/app/_not-found.rsc +3 -3
- package/dist/.next/server/app/ahead/page.js +1 -1
- package/dist/.next/server/app/ahead/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/ahead.html +1 -1
- package/dist/.next/server/app/ahead.rsc +4 -4
- package/dist/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/card/route.js +1 -1
- package/dist/.next/server/app/api/card/route.js.nft.json +1 -1
- package/dist/.next/server/app/api/card/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/check/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/config/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/connections/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/connectors/github/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/consent/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/context/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/discover/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/expiry/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/first-light/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/handoff/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/health/route.js +1 -1
- package/dist/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/incidents/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/insights/route.js +1 -1
- package/dist/.next/server/app/api/insights/route.js.nft.json +1 -1
- package/dist/.next/server/app/api/insights/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/log/route.js +1 -1
- package/dist/.next/server/app/api/log/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/pulse/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/radar/route.js +1 -1
- package/dist/.next/server/app/api/radar/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/report/route.js +1 -1
- package/dist/.next/server/app/api/report/route.js.nft.json +1 -1
- package/dist/.next/server/app/api/report/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/services/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/status/route.js +1 -1
- package/dist/.next/server/app/api/status/route.js.nft.json +1 -1
- package/dist/.next/server/app/api/status/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/connections/page.js +2 -2
- package/dist/.next/server/app/connections/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/connections.html +1 -1
- package/dist/.next/server/app/connections.rsc +4 -4
- package/dist/.next/server/app/dashboard/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/dashboard.html +1 -1
- package/dist/.next/server/app/dashboard.rsc +3 -3
- package/dist/.next/server/app/discoveries/page.js +1 -1
- package/dist/.next/server/app/discoveries/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/discoveries.html +1 -1
- package/dist/.next/server/app/discoveries.rsc +4 -4
- package/dist/.next/server/app/expiry/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/expiry.html +1 -1
- package/dist/.next/server/app/expiry.rsc +3 -3
- package/dist/.next/server/app/fleet/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/fleet.html +1 -1
- package/dist/.next/server/app/fleet.rsc +3 -3
- package/dist/.next/server/app/home/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/home.html +1 -1
- package/dist/.next/server/app/home.rsc +3 -3
- package/dist/.next/server/app/legal/privacy/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/legal/terms/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/log/page.js +1 -1
- package/dist/.next/server/app/log/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/log.html +1 -1
- package/dist/.next/server/app/log.rsc +4 -4
- package/dist/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/projects/page.js +1 -1
- package/dist/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/projects.html +1 -1
- package/dist/.next/server/app/projects.rsc +4 -4
- package/dist/.next/server/app/radar/page.js +1 -64
- package/dist/.next/server/app/radar/page.js.nft.json +1 -1
- package/dist/.next/server/app/radar/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/radar.html +1 -1
- package/dist/.next/server/app/radar.rsc +4 -4
- package/dist/.next/server/app/report/page.js +2 -2
- package/dist/.next/server/app/report/page.js.nft.json +1 -1
- package/dist/.next/server/app/report/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/report.html +1 -1
- package/dist/.next/server/app/report.rsc +4 -4
- package/dist/.next/server/app/settings/page.js +1 -1
- package/dist/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/settings.html +1 -1
- package/dist/.next/server/app/settings.rsc +4 -4
- package/dist/.next/server/app/sites/page.js +1 -1
- package/dist/.next/server/app/sites/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/sites.html +1 -1
- package/dist/.next/server/app/sites.rsc +4 -4
- package/dist/.next/server/app/welcome/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/welcome.html +1 -1
- package/dist/.next/server/app/welcome.rsc +4 -4
- package/dist/.next/server/app-paths-manifest.json +20 -20
- package/dist/.next/server/chunks/2346.js +1 -1
- package/dist/.next/server/chunks/2465.js +64 -1
- package/dist/.next/server/chunks/2817.js +1 -1
- package/dist/.next/server/chunks/4825.js +1 -0
- package/dist/.next/server/chunks/572.js +1 -1
- package/dist/.next/server/chunks/6992.js +1 -1
- package/dist/.next/server/chunks/7511.js +1 -1
- package/dist/.next/server/chunks/7719.js +1 -1
- package/dist/.next/server/chunks/8134.js +1 -1
- package/dist/.next/server/chunks/8150.js +1 -1
- package/dist/.next/server/chunks/876.js +1 -1
- package/dist/.next/server/chunks/9170.js +1 -1
- package/dist/.next/server/middleware-build-manifest.js +1 -1
- package/dist/.next/server/middleware-manifest.json +5 -5
- package/dist/.next/server/pages/404.html +1 -1
- package/dist/.next/server/pages/500.html +1 -1
- package/dist/.next/server/server-reference-manifest.json +1 -1
- package/dist/.next/static/chunks/{1255-612df69cb02f2021.js → 1255-fc6c00ab2f765339.js} +1 -1
- package/dist/.next/static/chunks/3192-40ade9877c89ec45.js +1 -0
- package/dist/.next/static/chunks/5623-53fb7cea5de0afef.js +1 -0
- package/dist/.next/static/chunks/7897-b9c15e8805df61ef.js +1 -0
- package/dist/.next/static/chunks/8050-a75457e83cd8be0f.js +1 -0
- package/dist/.next/static/chunks/app/ahead/page-75602559f92be6c4.js +1 -0
- package/dist/.next/static/chunks/app/connections/page-ff9d0b4e4fcf5ebe.js +1 -0
- package/dist/.next/static/chunks/app/discoveries/{page-52696e6ee0c8d3d5.js → page-6b06c0c2a94f3b94.js} +1 -1
- package/dist/.next/static/chunks/app/{error-37987420de14c10c.js → error-c67c297ef2dd70de.js} +1 -1
- package/dist/.next/static/chunks/app/log/page-842048c36f071dd6.js +1 -0
- package/dist/.next/static/chunks/app/projects/{page-75a41d4a90675d93.js → page-1d6b330842a2ff80.js} +1 -1
- package/dist/.next/static/chunks/app/radar/page-584b42327baac21b.js +1 -0
- package/dist/.next/static/chunks/app/report/page-9dc52d7f76569e42.js +1 -0
- package/dist/.next/static/chunks/app/settings/{page-a38c457b7c57567b.js → page-582279bf3fe509d4.js} +1 -1
- package/dist/.next/static/chunks/app/sites/page-3dcc5a0990fae677.js +1 -0
- package/dist/.next/static/chunks/{main-6828c74376f2b965.js → main-574ae5bf2f2165c4.js} +1 -1
- package/dist/.next/static/css/fbb4cf81dde34731.css +1 -0
- package/dist/build-id.json +145 -147
- package/dist/node_modules/@next/env/package.json +1 -1
- package/dist/node_modules/next/dist/build/swc/index.js +1 -1
- package/dist/node_modules/next/dist/build/webpack-config.js +2 -2
- package/dist/node_modules/next/dist/compiled/next-server/app-page-experimental.runtime.prod.js +2 -2
- package/dist/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +2 -2
- package/dist/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +2 -2
- package/dist/node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js +2 -2
- package/dist/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js +1 -1
- package/dist/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +7 -7
- package/dist/node_modules/next/dist/compiled/next-server/pages.runtime.prod.js +2 -2
- package/dist/node_modules/next/dist/lib/has-necessary-dependencies.js +2 -0
- package/dist/node_modules/next/dist/lib/verify-typescript-setup.js +19 -0
- package/dist/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +1 -1
- package/dist/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/dist/node_modules/next/dist/server/image-optimizer.js +22 -2
- package/dist/node_modules/next/dist/server/lib/app-info-log.js +1 -1
- package/dist/node_modules/next/dist/server/lib/incremental-cache/file-system-cache.js +17 -4
- package/dist/node_modules/next/dist/server/lib/start-server.js +1 -1
- package/dist/node_modules/next/dist/shared/lib/canary-only.js +1 -1
- package/dist/node_modules/next/dist/shared/lib/router/utils/escape-path-delimiters.js +1 -1
- package/dist/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
- package/dist/node_modules/next/dist/telemetry/events/version.js +2 -2
- package/dist/node_modules/next/package.json +11 -11
- package/dist/package.json +2 -2
- package/dist/shell/bin/af360-bridge.exe +0 -0
- package/lib/mcpActivity.mjs +1 -0
- package/package.json +2 -2
- package/scripts/mcp-server.mjs +174 -2
- package/shell/bin/af360-bridge.exe +0 -0
- package/dist/.next/server/chunks/1155.js +0 -1
- package/dist/.next/server/chunks/6584.js +0 -1
- package/dist/.next/static/chunks/1681-b233404f9ec2fc2e.js +0 -1
- package/dist/.next/static/chunks/2036-e29441d605c493a4.js +0 -1
- package/dist/.next/static/chunks/3192-6b341d547a49fa85.js +0 -1
- package/dist/.next/static/chunks/5623-ec4f1a6f7695d8d1.js +0 -1
- package/dist/.next/static/chunks/7897-6e6c509aea495560.js +0 -1
- package/dist/.next/static/chunks/app/ahead/page-e72bed448dd40bd5.js +0 -1
- package/dist/.next/static/chunks/app/connections/page-5d6cae02e6f2b49a.js +0 -1
- package/dist/.next/static/chunks/app/log/page-45b4cfd8f1a29d09.js +0 -1
- package/dist/.next/static/chunks/app/radar/page-4b4aad549dffcd3a.js +0 -1
- package/dist/.next/static/chunks/app/report/page-145496e8f0d5bc86.js +0 -1
- package/dist/.next/static/chunks/app/sites/page-96a7dcf3c1e9aa19.js +0 -1
- package/dist/.next/static/css/94d302c686de7e23.css +0 -1
- /package/dist/.next/static/{da1c2e66999c334d135d9 → 4602553707d90d0fadeba}/_buildManifest.js +0 -0
- /package/dist/.next/static/{da1c2e66999c334d135d9 → 4602553707d90d0fadeba}/_ssgManifest.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1681],{23:(e,t,n)=>{function a(e,t){let n=null,a=-1/0;for(let t of e){if(!t.lastActivity)continue;let e=new Date(t.lastActivity).getTime();Number.isFinite(e)&&e>a&&(a=e,n=t)}return n?{project:n,lastTs:a,stale:t-a>6048e5}:null}function s(e){return e?l(e).filter(e=>!e.handled&&e.losable):[]}function i(e){return"unsaved"===e.losable?0:e.losable?1:"expiry"===e.kind?e.entrusted&&!e.cost?1:2:"site"===e.kind?2:3}function r(e){let t=i(e);return t<=1?"losable":2===t?"money":"hygiene"}function l(e){return e?e.items.map((e,t)=>({it:e,i:t})).sort((e,t)=>{var n,a;return Number(!!e.it.handled)-Number(!!t.it.handled)||i(e.it)-i(t.it)||Number("red"===t.it.tone)-Number("red"===e.it.tone)||(null!=(n=e.it.since)?n:1/0)-(null!=(a=t.it.since)?a:1/0)||e.i-t.i}).map(e=>e.it):[]}n.d(t,{HU:()=>s,bI:()=>l,pd:()=>r,sp:()=>a}),n(5163)},639:(e,t,n)=>{n.d(t,{x:()=>o});var a=n(2115),s=n(5163);let i=e=>e.toLowerCase().replace(/[\\/]+$/,"");var r=n(7899);let l=e=>t=>t&&"object"==typeof t&&Array.isArray(t[e])?t:null;function o(){var e,t,n,o,c,d,u,h,p,m,f,g,y,v;let[w,x]=(0,a.useState)(null),[j,b]=(0,a.useState)(null),[k,N]=(0,a.useState)(null),[I,S]=(0,a.useState)(null),[U,T]=(0,a.useState)(null),[C,A]=(0,a.useState)(null),[L,E]=(0,a.useState)([]),[F,R]=(0,a.useState)(null),[D,M]=(0,a.useState)(null),[P,H]=(0,a.useState)([]),[B,O]=(0,a.useState)([]),[W,q]=(0,a.useState)(null),[z,G]=(0,a.useState)(!0),[V,J]=(0,a.useState)(null),[Y,K]=(0,a.useState)([]),[_,X]=(0,a.useState)(0),[Z,Q]=(0,a.useState)(0),[$,ee]=(0,a.useState)([]),[et,en]=(0,a.useState)([]),[ea,es]=(0,a.useState)(null),[ei,er]=(0,a.useState)(null),[el,eo]=(0,a.useState)(null),[ec,ed]=(0,a.useState)(""),[eu,eh]=(0,a.useState)(null),[ep,em]=(0,a.useState)(null),[ef,eg]=(0,a.useState)(null),[ey,ev]=(0,a.useState)(!1),ew=(0,a.useRef)(!1),[ex,ej]=(0,a.useState)([]),[eb,ek]=(0,a.useState)([]),[eN,eI]=(0,a.useState)([]),[eS,eU]=(0,a.useState)({}),[eT,eC]=(0,a.useState)({}),[eA,eL]=(0,a.useState)([]),[eE,eF]=(0,a.useState)({}),[eR,eD]=(0,a.useState)([]),[eM,eP]=(0,a.useState)([]),eH=(0,a.useCallback)(e=>{let t=e.toLowerCase();eP(e=>e.includes(t)?e:[...e,t])},[]),eB=(0,a.useCallback)(e=>{let t=e.toLowerCase();eP(e=>e.filter(e=>e!==t))},[]),eO=(0,r.c)(),eW=(0,a.useCallback)((e,t)=>{let n=[t,eO?"demo=".concat(eO):""].filter(Boolean).join("&");return n?"".concat(e,"?").concat(n):e},[eO]),eq=(0,a.useRef)(0),ez=(0,a.useRef)(0),eG=(0,a.useCallback)(()=>{let e=++eq.current;return fetch(eW("/api/config"),{cache:"no-store"}).then(e=>e.json()).then(t=>{var n,a,s;e<ez.current||(ez.current=e,er((null==t?void 0:t.config)&&Array.isArray(t.config.roots)?t.config:null),ed("string"==typeof(null==t?void 0:t.path)?t.path:""),eh(null!=(n=null==t?void 0:t.configFault)?n:null),em(null!=(a=null==t?void 0:t.configRecovered)?a:null),eg("boolean"==typeof(null==t?void 0:t.packaged)?t.packaged:null),eo(null!=(s=null==t?void 0:t.startup)?s:null))}).catch(()=>{})},[eW]),eV=(0,a.useCallback)(function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return fetch(eW("/api/insights",e?"fresh=1":""),{cache:"no-store"}).then(e=>e.json()).then(e=>{J(Array.isArray(null==e?void 0:e.insights)?e.insights:null),K(Array.isArray(null==e?void 0:e.muted)?e.muted:[]),X("number"==typeof(null==e?void 0:e.pending)?e.pending:0),Q("number"==typeof(null==e?void 0:e.deepTotal)?e.deepTotal:0),ee(Array.isArray(null==e?void 0:e.failed)?e.failed:[]),en(Array.isArray(null==e?void 0:e.unscanned)?e.unscanned:[]),(null==e?void 0:e.configChanged)&&eG()}).catch(()=>{})},[eW,eG]),eJ=(0,a.useCallback)(()=>fetch(eW("/api/health"),{cache:"no-store"}).then(e=>e.json()).then(e=>{let t=l("urls")(e);t&&b(t)}).catch(()=>{}),[eW]),eY=(0,a.useCallback)(()=>fetch(eW("/api/services"),{cache:"no-store"}).then(e=>e.json()).then(e=>{Array.isArray(null==e?void 0:e.services)&&R(e.services)}).catch(()=>{}),[eW]),eK=(0,a.useCallback)(()=>fetch(eW("/api/expiry"),{cache:"no-store"}).then(e=>e.json()).then(e=>{let t=l("items")(e);t&&N(t)}).catch(()=>{}),[eW]),e_=(0,a.useCallback)(()=>fetch(eW("/api/connections"),{cache:"no-store"}).then(e=>e.json()).then(e=>{e&&Array.isArray(e.clients)&&(M(e.clients),H(Array.isArray(e.supported)?e.supported:[]),O(Array.isArray(e.remembered)?e.remembered:[]))}).catch(()=>{}),[eW]),eX=(0,a.useCallback)(()=>fetch(eW("/api/connectors/github"),{cache:"no-store"}).then(e=>e.json()).then(e=>{e&&e.state&&"boolean"==typeof e.state.connected&&(q([e.state]),G(!1!==e.appReady))}).catch(()=>{}),[eW]),eZ=(0,a.useCallback)(()=>fetch(eW("/api/log"),{cache:"no-store"}).then(e=>e.json()).then(e=>{var t;S(Array.isArray(null==e?void 0:e.events)?e.events:null),T((t=null==e?void 0:e.coverage)&&"object"==typeof t&&("empty"===t.state||"partial"===t.state||"full"===t.state||"truncated"===t.state)&&"number"==typeof t.days&&"boolean"==typeof t.truncated?e.coverage:null),A(Date.now())}).catch(()=>{}),[eW]),eQ=(0,a.useCallback)(function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e&&ev(!0),fetch(eW("/api/radar",e?"fresh=1":""),{cache:"no-store"}).then(e=>e.json()).then(e=>{var t;let n=l("projects")(e);if(!n)return void x(null);x(n),eh(null!=(t=n.configFault)?t:null),n.demo&&!ew.current&&(ew.current=!0,ek((0,r.k)())),n.configChanged&&eG(),eZ()}).catch(()=>{}).finally(()=>ev(!1)),fetch(eW("/api/health"),{cache:"no-store"}).then(e=>e.json()).then(e=>b(l("urls")(e))).catch(()=>{}),fetch(eW("/api/expiry"),{cache:"no-store"}).then(e=>e.json()).then(e=>N(l("items")(e))).catch(()=>{}),eZ(),fetch(eW("/api/incidents"),{cache:"no-store"}).then(e=>e.json()).then(e=>E(Array.isArray(null==e?void 0:e.incidents)?e.incidents:[])).catch(()=>{}),eY(),e_(),eX(),eG(),eV(e),fetch(eW("/api/pulse"),{cache:"no-store"}).then(e=>e.json()).then(e=>es(e&&"object"==typeof e&&"boolean"==typeof e.visible?e:null)).catch(()=>{}),eO||fetch("/api/status",{cache:"no-store"}).catch(()=>{})},[eW,eO,eG,eV,eZ,eY,e_,eX]);(0,a.useEffect)(()=>{if(_<=0)return;let e=setInterval(()=>{("undefined"==typeof document||"visible"===document.visibilityState)&&eV()},1500);return()=>clearInterval(e)},[_,eV]),(0,a.useEffect)(()=>{eQ(!1);let e=setInterval(()=>{("undefined"==typeof document||"visible"===document.visibilityState)&&fetch(eW("/api/health"),{cache:"no-store"}).then(e=>e.json()).then(e=>{let t=l("urls")(e);t&&b(t)}).catch(()=>{})},6e4),t={current:null},n=()=>{null===t.current&&(t.current=Date.now())},a=()=>{if("undefined"!=typeof document&&"visible"!==document.visibilityState)return;let e=t.current;t.current=null,null!==e&&(Date.now()-e<3e4||eQ(!1))},s=()=>"visible"===document.visibilityState?a():n();return window.addEventListener("blur",n),window.addEventListener("focus",a),document.addEventListener("visibilitychange",s),()=>{clearInterval(e),window.removeEventListener("blur",n),window.removeEventListener("focus",a),document.removeEventListener("visibilitychange",s)}},[eQ,eW]);let e$=null!=(e=null==w?void 0:w.demo)&&e,e0=e$?ex:null!=(t=null==ei?void 0:ei.pins)?t:[],e1=e$?eb:null!=(n=null==ei?void 0:ei.ignored)?n:[],e6=e$?eN:null!=(o=null==ei?void 0:ei.dismissed)?o:[],e3=e$?eS:null!=(c=null==ei?void 0:ei.views)?c:{},e2=e$?eT:null!=(d=null==ei?void 0:ei.collapsed)?d:{},e8=e$?eE:null!=(u=null==ei?void 0:ei.snoozes)?u:{},e4=e=>e1.some(t=>t.id===e),e5=e=>e0.includes(e),e7=(0,a.useCallback)(async e=>{if(eO)return{ok:!0};let t=await fetch("/api/config",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)}).then(e=>e.json()).catch(()=>({ok:!1,message:"Something went wrong - try again."}));return(null==t?void 0:t.ok)&&t.config&&(ez.current=++eq.current,er(t.config)),(null==t?void 0:t.startup)&&eo(t.startup),null!=t?t:{ok:!1,message:"Something went wrong - try again."}},[eO]),e9=async(e,t,n,a)=>e$?(ek(s=>[...s,{id:e,kind:t,label:n,snapshot:a}]),{ok:!0}):e7({action:"ignore",id:e,kind:t,label:n,snapshot:a}),te=async(e,t)=>e$?(eI(n=>[...n,{id:e,sentence:t,ts:Date.now()}]),{ok:!0}):e7({action:"dismiss",id:e,sentence:t}),tt=e=>!!(e$&&eA.includes(e))||L.some(t=>t.subjectId===e&&!t.endedTs&&t.acknowledged),tn={};for(let[e,t]of Object.entries(null!=(h=null==w?void 0:w.changes)?h:{}))e$&&eR.includes(e)||(tn[e]=t);let ta=e=>eM.includes(e.toLowerCase()),ts=e=>{let t=e.toLowerCase();return eM.some(e=>t===e||t.startsWith(e.endsWith("\\")||e.endsWith("/")?e:e+"\\")||t.startsWith(e+"/"))},ti=(null!=(p=null==w?void 0:w.projects)?p:[]).filter(e=>!e4(e.path.toLowerCase())&&!ts(e.path)).sort((e,t)=>Number(e5(t.path.toLowerCase()))-Number(e5(e.path.toLowerCase()))),tr=(null!=(m=null==j?void 0:j.urls)?m:[]).filter(e=>!e4(e.entry.id)&&!ta(e.entry.id)).sort((e,t)=>Number(e5(t.entry.id))-Number(e5(e.entry.id))),tl=new Set((null!=e6?e6:[]).filter(e=>e&&!e.resurface).map(e=>e.id)),to=null===V?null:V.filter(e=>!ta(e.id)&&!tl.has(e.id)),tc=(null!=to?to:[]).map(e=>({id:e.id,cat:e.cat})),td=null===k?null:{...k,items:k.items.filter(e=>!ta(e.id))},tu=(null!=(f=null==w?void 0:w.missingRoots)?f:[]).filter(e=>!ts(e)),th=function(e,t){let n=e.map(e=>({path:e,projects:0})),a=0;for(let e of t){let t=-1,s=-1;if(n.forEach((n,a)=>{if(!function(e,t){let n=i(e),a=i(t);return a===n||a.startsWith(n+"\\")||a.startsWith(n+"/")}(n.path,e.path))return;let r=i(n.path).length;r>s&&(s=r,t=a)}),t<0){a++;continue}n[t].projects++}return{folders:n,total:t.length-a,rendered:t.length,unclaimed:a}}((null!=(g=null==ei?void 0:ei.roots)?g:[]).filter(e=>!ts(e)),ti),tp=new Map;for(let e of ti)tp.set(e.name,(null!=(y=tp.get(e.name))?y:0)+1);let tm=e=>{var t;return(null!=(t=tp.get(e))?t:0)>1},tf=w&&j&&td&&Array.isArray(w.projects)&&Array.isArray(w.missingRoots)&&Array.isArray(j.urls)&&Array.isArray(td.items)?(0,s.W8)({projects:ti,urls:tr,expiryItems:td.items,github:null!=(v=w.github)?v:null,incidents:L,missingRoots:tu,ignored:e1,snoozes:e8,isAcked:tt,isDupe:tm,offline:!0===j.offline,unreachedChecks:$,unscannedSubjects:et,findings:tc}):null;return{radar:w,health:j,expiry:td,events:I,logCoverage:U,logReadAt:C,incidents:L,services:F,insights:to,insightsMuted:Y,insightsPending:_,insightsDeepTotal:Z,insightsFailed:$,pulse:ea,cfg:ei,startup:el,configPath:ec,configFault:eu,configRecovered:ep,packaged:ef,demo:e$,scanning:ey,projects:ti,urls:tr,pins:e0,ignored:e1,dismissed:e6,views:e3,collapsed:e2,snoozes:e8,changes:tn,attention:tf,missingRoots:tu,watching:th,clients:D,clientsSupported:P,clientsRemembered:B,connectors:W,connectorsAppReady:z,refresh:eQ,readHealth:eJ,readServices:eY,readExpiry:eK,readConnections:e_,readConnectors:eX,resolveRow:eH,unresolveRow:eB,post:e7,togglePin:e=>{e$?ej(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e]):e7({action:"pin",id:e})},doIgnore:e9,unignore:e=>{e$?ek(t=>t.filter(t=>t.id!==e)):e7({action:"unignore",id:e})},stillIgnore:e=>{e$?ek(t=>t.map(t=>{var n;return t.id===e?{...t,snapshot:{...t.snapshot,...null==(n=t.resurface)?void 0:n.current},resurface:void 0}:t})):e7({action:"stillIgnore",id:e})},doDismiss:te,undismiss:e=>{e$?eI(t=>t.filter(t=>t.id!==e)):e7({action:"undismiss",id:e})},stillDismiss:e=>{e$?eI(t=>t.map(t=>{var n,a;return t.id===e?{...t,sentence:null!=(a=null==(n=t.resurface)?void 0:n.current)?a:t.sentence,resurface:void 0}:t})):e7({action:"stillDismiss",id:e})},later:e=>{e$?eF(t=>({...t,[e]:new Date(Date.now()+864e5).toISOString()})):e7({action:"later",id:e})},setView:(e,t)=>{e$?eU(n=>({...n,[e]:null!=t?t:void 0})):e7({action:"setView",section:e,view:t})},setCollapsed:(e,t)=>{e$?eC(n=>({...n,[e]:t})):e7({action:"setCollapsed",section:e,collapsed:t})},ack:e=>{if(e$)return void eL(t=>[...t,e]);fetch("/api/incidents",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({action:"ack",subjectId:e})}).then(()=>fetch(eW("/api/incidents"),{cache:"no-store"})).then(e=>e.json()).then(e=>{Array.isArray(null==e?void 0:e.incidents)&&E(e.incidents)}).catch(()=>{})},isAcked:tt,markSeen:e=>{if(0!==e.length){if(e$)return void eD(t=>[...t,...e.map(e=>e.toLowerCase())]);fetch("/api/radar",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({action:"markSeen",paths:e})}).catch(()=>{})}},isIgnored:e4,isPinned:e5,isDupe:tm,isRowResolved:ta}}},797:(e,t,n)=>{n.d(t,{H_:()=>d,uN:()=>c});var a=n(5155),s=n(2115),i=n(7650);let r="af360-tip",l=null,o=null;function c(e){return e?{"data-tip":e,onPointerEnter:t=>{"mouse"===t.pointerType&&(null==l||l(e,t.currentTarget))},onPointerLeave:()=>null==o?void 0:o(),onFocus:t=>{try{t.currentTarget.matches(":focus-visible")&&(null==l||l(e,t.currentTarget))}catch(e){}},onBlur:()=>null==o?void 0:o()}:{}}function d(){let[e,t]=(0,s.useState)(null),[n,c]=(0,s.useState)(null),d=(0,s.useRef)(null),u=(0,s.useRef)(null),h=(0,s.useRef)(null),p=(0,s.useCallback)(()=>{u.current&&(clearTimeout(u.current),u.current=null),h.current&&(h.current.removeAttribute("aria-describedby"),h.current=null),t(null),c(null)},[]),m=(0,s.useCallback)((e,n)=>{u.current&&clearTimeout(u.current),u.current=setTimeout(()=>{u.current=null,h.current=n,n.setAttribute("aria-describedby",r),c(null),t({text:e,anchor:n.getBoundingClientRect()})},300)},[]);return((0,s.useEffect)(()=>(l=m,o=p,()=>{l=null,o=null}),[m,p]),(0,s.useEffect)(()=>{if(!e)return;let t=e=>{"Escape"===e.key&&p()},n=()=>p();return window.addEventListener("keydown",t),window.addEventListener("scroll",n,!0),window.addEventListener("resize",n),window.addEventListener("pointerdown",n,!0),()=>{window.removeEventListener("keydown",t),window.removeEventListener("scroll",n,!0),window.removeEventListener("resize",n),window.removeEventListener("pointerdown",n,!0)}},[e,p]),(0,s.useLayoutEffect)(()=>{let t;if(!e||!d.current)return;let n=d.current.getBoundingClientRect(),a=e.anchor,s=window.innerWidth,i=window.innerHeight,r=a.top-8,l=i-a.bottom-8;t=n.height+8<=r?a.top-n.height-8:n.height+8<=l?a.bottom+8:r>=l?8:a.bottom+8;let o=a.left+a.width/2-n.width/2;c({top:t,left:o=Math.min(Math.max(8,o),Math.max(8,s-n.width-8))})},[e]),e&&"undefined"!=typeof document)?(0,i.createPortal)((0,a.jsx)("div",{ref:d,id:r,role:"tooltip",className:"tip",dir:"auto",style:n?{insetBlockStart:"".concat(n.top,"px"),left:"".concat(n.left,"px")}:{insetBlockStart:"0px",left:"0px",visibility:"hidden"},children:e.text}),document.body):null}},1551:(e,t,n)=>{n.d(t,{$c:()=>i,AR:()=>a,DX:()=>s,rl:()=>r,tr:()=>l});let a={"head.emptyLine":"لا شيء مراقَب بعد","head.downOne":"{0} لا يستجيب","head.downMany":"عدد ما لا يستجيب: {0}","head.incidentUnder":"كل ما عداه يمكن أن ينتظر - هذا هو ما ينبغي النظر إليه","head.needsLine":"{0} أشياء تحتاجك","head.needsUnder":"لا شيء خطير - لكل واحدة سبب","head.quietLine":"كل شيء هادئ","head.quietUnder":"لا شيء يحتاجك - اذهب وابنِ شيئًا","head.quietHandled":"لا شيء جديد يحتاجك - وهناك {0} قيد المعالجة","head.quietMissed":"لا شيء يحتاجك - ولم يتمكن af360 من فحص {0} من الأشياء هذه المرة","head.quietHandledMissed":"لا شيء جديد يحتاجك - هناك {0} قيد المعالجة، ولم يتمكن af360 من فحص {1} من الأشياء هذه المرة","head.needsUnderSafety":"لا شيء خطير - لكل واحدة سبب، و{0} من نتائج الأمان في انتظارك في الاكتشافات","head.safetyLine":"{0} من نتائج الأمان","head.safetyUnder":"في انتظارك في الاكتشافات","head.safetyMissed":"في انتظارك في الاكتشافات - ولم يتمكن af360 من فحص {0} من الأشياء هذه المرة","attn.project.what":"{0} فيه: {1}.","join.and":" و","join.comma":"، ","attn.reason.unsaved":"{0} تغييرات غير محفوظة","attn.reason.unpushed":"{0} إيداعات غير مرفوعة","attn.reason.noBackup":"لا نسخة احتياطية في أي مكان","attn.reason.dupe":"نسخة مكررة خاملة","attn.why.noBackup":"عطل واحد في القرص وتضيع - ونسخة بعيدة تُنهي ذلك في دقيقة.","attn.why.unpushed":"الرفع يكلّف دقيقة؛ وخسارتها تكلّف العمل نفسه.","attn.why.dupe":"نسختان من مشروع واحد تتباعدان بهدوء.","attn.why.unsaved":"العمل غير المحفوظ لا ينجو في أي مكان - ويوم سيئ واحد يكفي لضياعه.","attn.step.commit":"أودِع العمل - فالإيداع يجعله تاريخًا دائمًا.","attn.step.push":"ارفعه مرة واحدة - فتصل نسخة كاملة إلى المستودع البعيد ويزول الخطر.","attn.step.createRepo":"أنشئ مستودعًا فارغًا لدى مستضيف شيفرتك، واربطه، ثم ارفع.","attn.step.keepOne":"أبقِ نسخة واحدة - وأرشِف الأخرى أو احذفها حتى لا يحتار أنت في المستقبل.","attn.ev.changed":"تغيّرت: {0} و{1} غيرها","attn.ev.onlyHere":"{0} إيداعات موجودة على هذا الجهاز فقط","attn.ev.noRemote":"لا يوجد مستودع بعيد مضبوط - وهذا القرص يحمل النسخة الوحيدة","attn.ev.livingCopy":"النسخة الحيّة: {0}","attn.ev.sameRemote":"كلاهما يشير إلى المستودع نفسه: {0}","attn.ev.untouched":"هذه النسخة لم تُمسّ {0}","attn.ev.path":"{0}","unread.what":"لم يستطع af360 إكمال قراءة {0}.","unread.reason":"فحص لم يكتمل","unread.evidence":"لم يستجب git لهذا المجلد، فلا شيء مما يلي حُكمٌ نهائي","unread.why":"لن يخمّن af360 - يفضّل أن يقول إنه لم يستطع النظر على أن يخبرك بشيء غير صحيح.","unread.step":"لا شيء لتفعله: سيحاول الفحص التالي من جديد. وإن استمر في قول ذلك، فالمجلد أو git نفسه هو ما ينبغي فحصه.","attn.down.what":"{0} لا يستجيب.","attn.down.whatStatus":"{0} لا يستجيب (HTTP {1}).","attn.down.whatError":"{0} لا يستجيب - {1}.","attn.down.evUrl":"{0}","attn.down.evAnswer":"آخر استجابة: HTTP {0}","attn.down.evAnswerText":"آخر استجابة: {0}","attn.down.evNoAnswer":"لا استجابة","attn.down.evSince":"متوقف منذ {0}","attn.down.evJust":"توقّف للتوّ","attn.down.step1":"افتح لوحة تحكّم مستضيفك - فأغلب الأعطال خدمة توقّفت أو نشر أخفق.","attn.down.step2":'اضغط "عُلِم" حين تتولّى الأمر؛ فيهدأ الصف ويزول من تلقاء نفسه حين يستجيب الموقع مرة أخرى.',"attn.offline.what":"يبدو أن هذا الجهاز غير متصل بالإنترنت.","attn.offline.why":"قد تكون مواقعك بخير تمامًا - لكن af360 لا يستطيع الوصول إلى أي شيء الآن، فلن يخمّن.","attn.offline.ev1":"لم يستجب أي من المواقع المراقَبة، وعددها {0}","attn.offline.ev2":"ولم ينجح البحث عن النطاق أيضًا","attn.offline.step1":"تحقّق من اتصال هذا الجهاز بالإنترنت - الواي فاي، أو الكابل، أو شبكة خاصة انقطعت.","attn.expiry.certLate":"كان ينبغي أن تتجدّد شهادة {0} تلقائيًا حتى الآن - ولم تتجدّد.","attn.expiry.expires":"تنتهي صلاحية {0} {1}.","attn.expiry.expired":"انتهت صلاحية {0} {1}.","attn.expiry.whySsl":"حين تنقضي، تعرض المتصفحات تحذيرًا مُفزعًا بدل موقعك.","attn.expiry.whyDomain":"بعد ذلك التاريخ يتوقّف عن العمل - والتجديد المبكر لا يكلّف شيئًا.","attn.expiry.userNote":"{0}","attn.expiry.evDate":"التاريخ: {0}","attn.expiry.evJudgment":"{0}","attn.expiry.evNote":'ملاحظتك: "{0}"',"attn.expiry.evIssuer":"المُصدِر: {0}","attn.expiry.stepSsl":"اسأل مستضيفك لماذا لم يصل التجديد - فالشهادات المُدارة تتجدّد وحدها، وتأخّر واحدة يعني أن شيئًا قد تعطّل.","attn.expiry.stepDomain":'جدّده (أو دعه ينقضي عمدًا)، ثم احذف الإدخال من "القادم" أو حدّثه.',"attn.resurface.what":"{0}","attn.resurface.why":"أسكتّ هذا سابقًا - وقد تغيّر الوضع، فيستحق نظرة أخرى.","attn.resurface.evThen":"تُجوهل عند: {0}","attn.resurface.evNow":"والآن: {0}","attn.resurface.step":'اضغط "راقِب من جديد" لإعادته، أو "أبقِه متجاهَلًا" لإسكاته من جديد بأرقام اليوم.',"attn.missing.what":"تعذّر العثور على المجلد {0}","attn.missing.why":"انتقل أو أُعيدت تسميته - وجّهني إلى موضعه الجديد، أو أوقِف مراقبته.","attn.missing.evPath":"المسار المراقَب: {0}","attn.missing.evScan":"توقّف المجلد عن الاستجابة في آخر فحص","attn.missing.step1":'اضغط "ابحث عنه" وتنقّل إلى حيث يوجد المجلد الآن - وسيحلّ محلّ الإدخال القديم.',"attn.missing.step2":'وإن كان قد زال عمدًا، فزرّ "أوقِف المراقبة" يزيله.',"attn.handled.acked":"قيد المعالجة ✓","attn.handled.snoozed":"هادئ حتى الغد","act.save":"احفظ {0}","act.push":"ارفع {0}","act.backUp":"انسخ {0} احتياطيًا","act.duplicate":"احسم أمر نسخة {0} المكرّرة","act.siteDown":"{0} لا يستجيب","act.renew":"جدّد {0}","act.certLate":"تابِع شهادة {0}","act.find":"ابحث عن {0}","act.decide":"احسم أمر {0}","act.offline":"تحقّق من اتصال هذا الجهاز","wk.todoFact":'أقدم ملاحظة كتبتها لنفسك ما زالت مفتوحة، من {0}: "{1}"',"wk.todoWhy":"أقدم ملاحظة كتبتها لنفسك، وما زالت تنتظر","wk.spaceFact":"{0} من مكتبات الشيفرة المُنزَّلة تقبع في مشاريع لم تمسّها منذ أشهر","wk.spaceWhy":"حذفها مجاني، وأمر واحد يعيدها","wk.busiestFact":"{0} هو أكثر مشاريعك نشاطًا، وفيه {1} إيداعًا","wk.busiestWhy":"أكثر ما عملتَ عليه مما تملك","wk.birthdayFact":"يتمّ {0} عامه {1} في {2}","wk.birthdayWhy":"محسوبة من أول إيداع له","disc.unpushed":"{0} إيداعات موجودة على هذا الجهاز وحده، في {1} مشاريع.","disc.noRemote":"{0} مشاريع ليس لها موطن سوى هذا الجهاز.","disc.readmeStubSince":'ما زال ملف README في {0} يقول "{1}" منذ نحو {2}.',"disc.readmeStubWhile":'ما زال ملف README في {0} يقول "{1}" منذ فترة.',"disc.anniversary":"يتمّ {0} عامه {1} {2}.","disc.anniversaryCommits":"يتمّ {0} عامه {1} {2} - و{3} إيداعًا منذ أول إيداع.","disc.whenToday":"اليوم","disc.whenTomorrow":"غدًا","disc.whenOn":"في {0}","disc.abandonedBranches":"{0} فروع متروكة في {1} مشاريع - وأقدمها لم يُمسّ منذ {2} شهرًا.","disc.cloudConfigStale":"{0} مشاريع خاملة ما زالت تحمل إعدادات نشر - وأي شيء ما زال يعمل من أجلها قد يظلّ يُحاسَب.","disc.ageYears":"{0} سنوات","disc.ageDays":"{0} يومًا","disc.identity":"{0} مشاريع تُودِع باسم {1} - وهويتك العامة هي {2}.","disc.syncFolder":"{0} يقع داخل مجلد مزامنة - وتاريخ git وخدمات المزامنة يُفسد بعضها بعضًا.","disc.gitignoreGaps":"{0} مستودعات تتعقّب أشياء يُبقيها .gitignore عادةً خارجها.","disc.historySecretsOne":"يحمل تاريخ git في {0} نصوصًا تشبه مفاتيح الوصول - وللمستودع نسخة بعيدة، والتاريخ ينتقل مع كل استنساخ.","disc.historySecretsMany":"يحمل تاريخ git في {0} مستودعات نصوصًا تشبه مفاتيح الوصول - ولها نسخ بعيدة، والتاريخ ينتقل مع كل استنساخ.","disc.installScripts":"{0} اعتماديات تشغّل شيفرتها الخاصة وقت التثبيت، في {1} مشاريع.","disc.runtimeEolPast":"بلغت نسخة Node.js لديك ({0}) نهاية عمرها في {1} - ما زالت تعمل، لكنها لم تعد تتلقّى إصلاحات أمنية.","disc.runtimeEolSoon":"تبلغ نسخة Node.js لديك ({0}) نهاية عمرها بعد {1} يومًا.","disc.nodeModules":"تزن مجلدات node_modules لديك {0} في {1} مشاريع.","disc.estateStats":"ممتلكاتك {0} سطرًا في {1} مشاريع - أغلبها {2}.","disc.diskWeight":"يشغل {0} في ذواكر الأدوات المؤقتة عبر {1} من المشاريع.","disc.diskWeightPartial":"يشغل {0} في ذواكر الأدوات المؤقتة عبر {1} من المشاريع - ولم يتمكن af360 من قياس {2} مجلدًا آخر.","disc.runtimeCensus":"{0} من المشاريع تطلب إصدار Node لا يعمل على هذا الجهاز.","disc.runtimeCensusUnread":"لم يتمكن af360 من قراءة إصدار Node الذي تطلبه {0} من المشاريع.","disc.frontDoorUnread":"لم يتمكن af360 من قراءة المستودع البعيد لـ {0} من المشاريع، فلم يحكم عليها.","disc.historySecretsCapped":"قرأ af360 تاريخ {0} من أصل {1} مشروعًا في هذا الفحص - ولم يُنظر في البقية","disc.staleRemoteOne":"يشير المستودع البعيد لـ {0} إلى اسم نقله GitHub.","disc.staleRemoteMany":"{0} مشاريع لديها مستودع بعيد يشير إلى اسم نقله GitHub.","disc.ogSharp":"يبدو {0} أنيقًا عند مشاركته - وهذه هي البطاقة التي يراها الناس.","disc.ogSharedBare":"يظهر {0} عاريًا عند مشاركته - بلا {1}.","disc.ogSharedThin":"يظهر {0} ناقصًا عند مشاركته - بلا {1}.","disc.securityHeaders":"يُرسل {0} {1} من {2} من الترويسات الواقية.","disc.mixedContent":"{0} مؤمَّن، لكن {1} من أجزائه تُحمَّل عبر http عادي.","disc.redirectChain":"تمرّ زيارة {0} بـ{1} قفزات قبل أن تستقرّ.","disc.robotsBlocking":"يصرف ملف robots.txt في {0} كل محركات البحث.","disc.dnsWatch":"تغيّرت سجلات DNS الخاصة بـ{0} منذ آخر نظرة.","tip.unsaved":"تغييرات أجريتَها ولم تُحفظ بعد في تاريخ المشروع.","tip.unpushed":"محفوظة على هذا الجهاز، لكنها لم تُرسل بعد إلى النسخة على الإنترنت.","tip.onlyHere":"لا توجد نسخة على الإنترنت. لو تعطّل هذا القرص لضاع العمل.","tip.noHistory":"لا يملك هذا المجلد تاريخ إصدارات، فليس هناك ما تعود إليه.","tip.dormant":"لم يتغيّر شيء في هذا المشروع منذ وقت طويل.","tip.duplicate":"يوجد مجلد آخر على هذا الجهاز يحمل المستودع نفسه - قرأ af360 المستودعين البعيدين ووجدهما متطابقين.","tip.sharesName":"يوجد مجلد آخر على هذا الجهاز يحمل الاسم نفسه، وقد قرأ af360 المستودعين البعيدين: إنه مستودع مختلف، لا نسخة.","tip.clean":"كل شيء محفوظ وله نسخة احتياطية. لا شيء لتفعله هنا.","tip.downloadedCopy":"يبدو هذا شيئًا نزّلتَه لا شيئًا كتبتَه.","tip.remote":"ما إذا كان تاريخ هذا المشروع موجودًا أيضًا على مستودع بعيد ترفع إليه - النسخة التي تبقى بعد هذا الجهاز.","tip.ignore":"توقّف عن ذكر هذا. يبقى مفحوصًا، ولا يعود إلا إذا تغيّر.","tip.later":"أسكِت هذا حتى الغد. يبقى الصف مكانه باهتًا، ويتوقّف عن العدّ.","tip.watch":"أضِف هذا المجلد ليطّلع عليه af360 في كل فحص.","tip.unwatch":"توقّف عن النظر إلى هذا. يُزال من af360 فقط، لا من قرصك أبدًا.","tip.check":"سجّل أنك رأيت هذا وأنك تتولّاه.","tip.pin":"أبقِ هذا في أعلى القائمة.","tip.copyPath":"انسخ موضع هذا المجلد لتلصقه في مكان آخر.","tip.scanNow":"انظر الآن من جديد في كل مجلد وموقع وتاريخ مراقَب.","tip.details":"أظهِر ما رُئي، وما يستحق فعله حياله.","tip.fix":"انظر ما الذي يحدث هنا وما الذي عليك فعله حياله.","tip.copyCommands":"ضع هذه الأوامر بالضبط في حافظتك، جاهزة للّصق في طرفية.","tip.looked":"آخر نظرة كاملة في مجلداتك - أما المواقع فتُفحص كل دقيقة على حدة","tip.copyContext":"ضع في حافظتك ملخصًا قصيرًا عن هذا المشروع، جاهزًا للّصق في مساعد ذكاء اصطناعي. والأسرار تُترك خارجه.","tip.copyEstateReport":"ضع في حافظتك تقرير ممتلكاتك كاملًا، جاهزًا للّصق في مساعد ذكاء اصطناعي. وتُختصر مسارات المجلدات وتُترك الأسرار خارجه.","tip.verdict":"يَعُدّ العمل الموجود على هذا الجهاز وحده، لا غير.","tip.moreActions":"الإجراءات التي نادرًا ما تحتاجها لهذا الصف.","tip.tagLosable":"هذا العمل غير موجود إلا على هذا الجهاز.","tip.tagMoney":"مكلّف أو مكشوف للعامة إن انقضى، لكنه لا يضيع.","tip.tagHygiene":"يستحق الترتيب. ولا شيء في خطر اليوم.","tip.age":"منذ متى وهذا صحيح.","tip.keyboard":"أظهِر كل اختصارات لوحة المفاتيح.","tip.ssl":"الشهادة التي تضع القفل في شريط العنوان.","tip.domain":"التجديد السنوي الذي يُبقي عنوان الويب لك.","tip.detectors":"فحص يجريه af360 أثناء نظره. أوقِف واحدًا فيتوقّف عن العمل.","tip.muteSwitch":"مفعّل: يعمل هذا الفحص. متوقف: يتوقّف عن العمل، وتقول صفحة الاكتشافات ذلك.","tip.updateSwitch":"مفعّل: مرة كل يوم يسأل af360 سجلّ npm - قناة المختبِرين - عمّا إذا كان هناك إصدار أحدث. ولا يُرسل شيء عنك. أما نسخ المتجر فيحدّثها ويندوز بدلًا من ذلك.","tip.chooseExclude":"اختر مجلدًا يتخطّاه كل فحص، حتى لو كان داخل مجلد تراقبه.","tip.markdown":"ملف نصي بسيط تقرؤه أغلب المحرّرات وتطبيقات الملاحظات ومساعدو الذكاء الاصطناعي.","tip.estate":"كل ما بنيتَه: المجلدات والمشاريع والمواقع التي يراقبها af360.","tip.simpleMode":"لغة بسيطة فقط","tip.devMode":"يضيف الرموز والتوقيتات وتفاصيل git","tip.theme":"بدّل بين مظهر النهار والليل","tip.todosTip":"ملاحظات تركتَها في شيفرتك تشير إلى شيء ما زال مطلوبًا. يقرؤها af360 في مكانها ولا يغيّر شيئًا.","tip.reclaimableTip":"مساحة تشغلها مكتبات الشيفرة المُنزَّلة (node_modules) لمشاريع لم تمسّها منذ أشهر. حذفها يحرّر المساحة، وأمر واحد يعيدها.","tip.busiestTip":"محسوب من الإيداعات في تاريخ كل مشروع مراقَب. يقيس كم مرة حفظتَ عملك، لا كم من الوقت أمضيت.","tip.birthdayTip":"محسوب من أول إيداع في تاريخ المشروع، وهو أقدم تاريخ يستطيع المشروع إثباته عن نفسه.","appbar.shortcutsTip":"أظهِر كل اختصارات لوحة المفاتيح.","radar.shareReportTip":"ملف مرتّب بما يحتاج إلى انتباه، لمشاركته أو لصقه في مساعد ذكاء اصطناعي","export.title":"فحص الممتلكات","export.worth":"ما يستحق فعله","export.why":"لماذا يهم","export.fix":"الإصلاح المقترح","export.noNeeds":"لا شيء يحتاج إلى انتباهك الآن.","export.noWorth":"لا اكتشافات مفتوحة الآن.","export.foot":"صُنع بـ af360 من Afeleos - يعمل على جهازك، ولم يغادره شيء مما هنا حتى اخترتَ أنت مشاركة هذا الملف.","room.radar":"الرادار","room.projects":"المشاريع","room.sites":"المواقع","room.discoveries":"الاكتشافات","room.report":"تقرير الممتلكات","room.ahead":"القادم","room.connections":"الاتصالات","room.settings":"الإعدادات","room.log":"السجل","nav.aria":"التنقّل الرئيسي","appbar.scanning":"جارٍ الفحص…","appbar.shortcuts":"الاختصارات","appbar.looked":"آخر نظرة","appbar.aria":"الممتلكات","appbar.roomAria":"الغرفة الحالية","greet.morning":"صباح الخير","greet.afternoon":"مساء الخير","greet.evening":"مساء الخير","pill.hint":"اضغط لتراها","pill.jumpAria":"أظهِر العمل الذي قد يضيع","session.wereIn":"كنت تعمل في","session.subline":"آخر نشاط في المجلدات التي تراقبها","session.uncommittedTail":"ملفات غير مُودَعة","session.clean":"لا شيء معلّق","session.lastCommit":"آخر إيداع","session.touched":"آخر تعديل","session.noRecent":"لا يوجد نشاط حديث - ممتلكاتك بالأسفل","btn.fix":"إصلاح","btn.copyContext":"انسخ ملخص المشروع","btn.details":"التفاصيل","btn.hide":"إخفاء","btn.show":"إظهار","btn.collapse":"طيّ","btn.more":"المزيد","btn.close":"إغلاق","btn.save":"حفظ","btn.cancel":"إلغاء","btn.remove":"إزالة","btn.back":"رجوع","btn.backToRadar":"العودة إلى الرادار","btn.done":"تم","btn.grid":"شبكة","btn.rows":"صفوف","btn.retry":"أعِد المحاولة","btn.goRadar":"اذهب إلى الرادار","btn.watchAgain":"راقِب من جديد","btn.shareReport":"شارك تقريرًا","btn.copyPath":"انسخ المسار","btn.copyAddress":"انسخ العنوان","btn.copyCommands":"انسخ الأوامر","btn.commandsCopied":"تم نسخ الأوامر ✓","btn.watchMore":"راقب مجلدات أخرى","btn.copying":"جارٍ التجميع…","btn.copied":"تم النسخ ✓","btn.copyFailed":"تعذّر النسخ","sec.needsYou":"يحتاج إليك","sec.projects":"المشاريع","sec.sites":"المواقع","sec.discoveries":"الاكتشافات","sec.downloaded":"نسخ مُنزَّلة","sec.next90":"الأيام التسعون القادمة","sec.further":"أبعد من ذلك","sec.anniversaries":"ذكريات سنوية","sec.undetermined":"تعذّر التحديد","sec.addYourOwn":"أضف تاريخًا بنفسك","sec.reportHeading":"ممتلكاتك في لمحة","sec.worthKnowing":"يستحق أن تعرفه","sec.worthWatching":"يستحق المتابعة","sec.worthTracking":"يستحق التتبّع","sec.rightNow":"الآن","sec.inNumbers":"ممتلكاتك بالأرقام","radar.purpose":"كل ما تحتاجه، الآن، في مكان واحد","radar.needsYouAlways":"كلها معروضة دائمًا \xb7 مرتّبة حسب الأهمية","radar.projectsMeta":"نتحقق من النسخ الاحتياطية والعمل غير المحفوظ والنشاط - في كل فحص","radar.sitesMeta":"تُفحص كل دقيقة","radar.discoveriesMeta":"ما تخبرك به ممتلكاتك بهدوء","radar.discoveriesTop3":"نعرض أهم ثلاثة","radar.ignoredStill":"ما زالت تُفحص \xb7 تعود إذا تغيّرت","radar.ignoredLabel":"المتجاهَل","radar.viewAria":"طريقة عرض هذا القسم","radar.whatISaw":"ما الذي رأيته","radar.folder":"المجلد","radar.movedTail":"انتقل - اختر موضعه الجديد. وسيحلّ محلّ الإدخال القديم.","toast.ignored":'تم تجاهل {0} - لم يختفِ، بل انتقل إلى سطر "المتجاهَل" تحت "يحتاج إليك"، وما زال يُفحص.',"tag.losable":"قابل للضياع","tag.money":"تكاليف","tag.hygiene":"ترتيب","act.ignore":"تجاهل","act.ignoreIt":"تجاهله","act.later":"لاحقًا","act.check":"عُلِم","act.handled":"تمّت المعالجة ✓","act.pin":"تثبيت","act.unpin":"إلغاء التثبيت","act.stillIgnore":"أبقِه متجاهَلًا","act.stopWatching":"أوقِف المراقبة","act.stopWatchingFolder":"أوقِف مراقبة هذا المجلد","act.stopWatchingSite":"أوقِف مراقبة هذا الموقع","act.keepWatching":"استمر في المراقبة","act.findIt":"ابحث عنه","act.moreAria":"إجراءات أخرى لهذا الاكتشاف","eff.ignore":"يُخفى حتى يتغيّر","eff.later":"يعود غدًا","eff.stillIgnore":"يبقى مخفيًا","eff.stopWatching":"يُزال من af360 فقط، لا من جهازك","eff.pin":"يبقى في الأعلى","eff.unpin":"يعود إلى ترتيبه الطبيعي","fix.what":"ما الذي يحدث","fix.steps":"ما الذي عليك فعله","fix.commands":"الأوامر","empty.invite":"لا شيء لمراقبته بعد - وهذه بالضبط نقطة البداية المثالية.","empty.line":"يبقي af360 عينه على المجلدات التي تعمل فيها والمواقع التي تملكها، ويخبرك حين يحتاج أحدها إليك - عمل ليس له نسخة في أي مكان، أو موقع توقّف عن الاستجابة، أو تجديد يقترب موعده.","empty.pickFolder":"اختر مجلدًا لمراقبته","empty.pickSite":"راقِب موقعًا إلكترونيًا","empty.someday":"تفكّر في بناء شيء يومًا ما؟ af360 سيكون جاهزًا - وبقاؤه معك لا يكلّفك شيئًا.","site.namePlaceholder":"اسم له (اختياري)","site.addrAria":"عنوان الموقع","site.nameAria":"اسم هذا الموقع","site.add":"راقِبه","site.adding":"جارٍ الإضافة…","site.added":"يراقبه الآن. يفحصه af360 كل دقيقة ما دام يعمل.","site.firstCheck":"الفحص الأول جارٍ…","site.historyBuilds":"السجل يتكوّن","site.sparkAria":"زمن الاستجابة، آخر 24 ساعة","confirm.project":"هذا المشروع ليس له نسخة احتياطية كاملة. أتتجاهله على أي حال؟ لن أذكره بعد الآن.","confirm.projectShort":"هذا المشروع بلا نسخة احتياطية. أتتجاهله على أي حال؟ لن أذكره بعد الآن.","confirm.site":"هذا الموقع لا يستجيب الآن. أتتجاهله على أي حال؟ لن أذكره بعد الآن.","cat.time-capsule":"كبسولة الزمن","cat.safety":"الأمان","cat.money":"المال","cat.identity":"الهوية","cat.health":"الصيانة والترتيب","cat.site":"مواقعك","disc.purpose":"كل ما تخبرك به ممتلكاتك بهدوء، في مكان واحد","disc.emptyInvite":"لا اكتشافات بعد.","disc.emptyLine":"راقِب بعض المجلدات من الرادار، وستبدأ ممتلكاتك بإخبارك بأشياء - عمل لم يُرفَع بعد، وتكاليف منسيّة، ومواقع تستحق نظرة.","disc.mutedTitle":"مكتوم في الإعدادات، فلا يعمل","disc.failedTitle":"لم يكتمل هذه المرة","disc.failedTail":"ما كانت هذه الفحوص لتجده غير موجود في هذه الصفحة. وسيحاول الفحص التالي من جديد.","disc.unmute":"ألغِ الكتم من الإعدادات →","disc.worth":"يستحق أن تفعل:","disc.showMe":"أرِني","disc.seeCard":"انظر البطاقة التي يرسلها","disc.fixSteps":"خطوات الإصلاح","disc.ogBare":"لا عنوان ولا وصف ولا صورة - يظهر الرابط عاريًا.","disc.ogNoTitle":"(بلا عنوان)","projects.purpose":"كل مجلد يراقبه af360، في صفحة واحدة","projects.needingTail":"يحتاج إليك، والباقي نظيف","projects.allClean":"كلها نظيفة","projects.emptyInvite":"لا مشاريع مراقَبة بعد.","projects.emptyLine":"وجِّه af360 إلى مجلد من الرادار، وسيظهر هنا كل ما بداخله.","sites.purpose":"كل موقع يراقبه af360، في صفحة واحدة","sites.checking":"جارٍ فحص مواقعك…","sites.answeringMid":"من","sites.answeringTail":"يستجيب","sites.emptyInvite":"لا مواقع مراقَبة بعد.","sites.emptyLine":"أضِف موقعًا من الرادار، وسيفحصه af360 كل دقيقة ما دام يعمل.","more.seeAllDiscoveries":"اعرض كل الاكتشافات","more.seeAllProjects":"اعرض كل المشاريع","more.seeAllSites":"اعرض كل المواقع","more.cleanBacked":"غيرها، كلها نظيفة ولها نسخ احتياطية","more.clean":"غيرها، كلها نظيفة","more.projects":"غيرها في صفحة المشاريع","more.sitesUp":"غيرها، كلها تستجيب","more.sites":"غيرها في صفحة المواقع","report.purpose":"الصورة كاملة في نظرة واحدة، محفوظة على جهازك","report.sub":'الصورة كاملة في نظرة واحدة. تبقى هذه على جهازك؛ إنها عرضك الشخصي - و"شارك تقريرًا" هو ما يصنع الملف المُعدّ للآخرين.',"report.asOf":"بتاريخ","report.download":"احفظ كصورة","report.downloadText":"حفظ بتنسيق نصي","report.vNeeding":"يحتاج إلى انتباهك","report.vClean":"نظيف وله نسخة احتياطية","report.vSites":"مواقع تستجيب","report.rUnsaved":"عمل غير محفوظ في خطر","report.rNone":"لا شيء ✓","report.rUnpushed":"إيداعات موجودة على هذا الجهاز فقط","report.rEverythingElse":"كل ما عدا ذلك","report.rBackedUp":"له نسخة احتياطية ✓","report.rNoBackup":"لا نسخة في أي مكان سوى هنا","report.rSites":"المواقع","report.rSitesAllUp":"كلها تعمل، بلا أعطال","report.rSitesUpNow":"كلها تعمل الآن","report.rSitesDownTail":"لا يستجيب","report.rNext":"أقرب تاريخ يعنيك","report.langAria":"توزيع شيفرتك حسب اللغة","report.langRest":"كل ما عدا ذلك","report.linesWord":"أسطر","report.fLines":"أسطر برمجية","report.fProjects":"مشاريع","report.fCommits":"إيداعات مُتتبَّعة","report.fLanguagesTail":"لغات، أغلبها","report.worthKnowingSub":"صحيحة ومفيدة، ولا تتطلب أي إجراء - الحقائق التي خلف ممتلكاتك","report.detailsLabel":"التفاصيل","report.catTimeCapsule":"كبسولة الزمن","report.catHousekeeping":"الصيانة والترتيب","report.catHistory":"تاريخ","report.catMilestone":"محطة","report.counting":"جارٍ إحصاء ممتلكاتك… المرة الأولى تستغرق دقيقة.","report.failed":"لم يُحمَّل التقرير - أعِد تحميل الصفحة للمحاولة من جديد.","report.emptyInvite":"لا شيء لإعداد تقرير عنه بعد.","report.emptyLine":"راقِب مجلدًا من الرادار، وسيكتب التقرير نفسه - الأسطر واللغات وتواريخ الميلاد، كل ذلك.","ahead.purpose":"كل ما له تاريخ، قبل أن يفاجئك","ahead.anniversariesMeta":"أعياد ميلاد ممتلكاتك","ahead.add":"أضِف","ahead.adding":"جارٍ الإضافة…","ahead.reading":"جارٍ قراءة الشهادات والسجلات…","ahead.emptyInvite":"لا شيء في الأفق.","ahead.emptyLine":"أضِف التجارب أو التجديدات بالأسفل، أو راقِب موقعًا من الرادار لتتبّع شهادته ونطاقه.","ahead.added":"أُضيف إلى الجدول الزمني.","ahead.namePlaceholder":"تجربة استضافة، تجديد ترخيص…","ahead.notePlaceholder":"ماذا يحدث حينها؟","ahead.nameAria":"الاسم","ahead.dateAria":"التاريخ","ahead.noteAria":"ملاحظة","ahead.weekJudg":"أسبوعك، محسوبًا على هذا الجهاز - ويبدأ أسبوع جديد يوم الاثنين","ahead.nothingWatched":"لا شيء مراقَب بعد","ahead.nothingToDo":"لا شيء لتفعله","ahead.kindSsl":"شهادة SSL","ahead.kindDomain":"تجديد النطاق","ahead.kindManual":"إدخالك أنت","settings.title":"الإعدادات","settings.purpose":"تفضيلاتك - وكلها تعيش في مجلد واحد على جهازك","settings.secScan":"وتيرة الفحص","settings.secLook":"المظهر","settings.secData":"بياناتك","settings.secHow":"كيف يعمل af360","settings.secRules":"القواعد","settings.secDetectors":"كتم نوع من الاكتشافات","settings.secWatching":"قيد المتابعة","settings.cadenceLabel":"كل كم ينبغي أن ألقي نظرة؟","settings.cadenceHelp":"يبدأ فحص القرص عند الفتح، ثم على هذه الوتيرة","settings.cadenceAria":"وتيرة الفحص","settings.cadenceHourly":"كل ساعة","settings.cadence6h":"كل 6 ساعات","settings.cadenceDaily":"مرة كل يوم","settings.cadenceCustom":"مخصّص…","settings.customLabel":"وتيرة مخصّصة","settings.customHelp":"كل كم ساعة؟ من 1 إلى 24 - ولن يمضي على أي شيء أكثر من يوم","settings.hoursAria":"ساعات","settings.customBad":"اختر عددًا صحيحًا من الساعات بين 1 و24.","settings.viewLabel":"العرض الافتراضي","settings.viewHelp":"شبكة أو صفوف - وكل قسم يتذكّر اختيارك الخاص به","settings.viewAria":"العرض الافتراضي","settings.lang":"لغة الواجهة","settings.langAria":"لغة الواجهة","settings.langHelp":"أسماء الغرف والأزرار وعناوين الأقسام والنصوص التوضيحية بالعربية. أما مسارات مجلداتك والنتائج والأوامر والجُمل التي يكتبها af360 عن ممتلكاتك فتبقى بالإنجليزية.","settings.langEn":"English","settings.langAr":"العربية","settings.dataHelp":"مجلداتك المراقَبة ومواقعك وإدخالاتك وتفضيلاتك تعيش في مجلد ~/.af360 على جهازك، ولا مكان غيره. لا يغيّر af360 شيئًا داخل مشاريعك أبدًا: يقرؤها ويخبرك. بلا حسابات، وبلا تتبّع، وبلا خوادم.","settings.updateLabel":"أخبِرني عن الإصدارات الجديدة","settings.on":"مفعّل","settings.off":"متوقف","settings.how1":"يقرأ المجلدات التي تختارها، هنا على هذا الجهاز، ولا يغيّر شيئًا بداخلها أبدًا.","settings.how2":"ينظر إليها عند فتحك af360، ثم مرة أخرى على الوتيرة التي ضبطتها بالأعلى.","settings.how3":"وما دام af360 يعمل، يفحص كل موقع تراقبه مرة في الدقيقة.","settings.how4":"ويقرأ تواريخ الشهادات والنطاقات لتلك المواقع، والتواريخ التي تضيفها بنفسك، ويقول أيها يحتاج إليك فعلًا.","settings.how5":"ويشير إلى حقائق هادئة لاحظها أثناء نظره. تلك اقتراحات، لا إنذارات.","settings.how6":"والملف الوحيد الذي يكتبه هو ملفه الخاص، في مجلد ~/.af360.","settings.rulesMeta":"كلاهما يغذّي المحرّك مباشرة","settings.excludeLabel":"لا تراقب هنا","settings.excludeHelp":"مجلدات يتخطّاها كل فحص - حتى داخل المجلدات المراقَبة","settings.excludePick":"لا تراقب هذا المجلد","settings.alreadyExcluded":"مُتخطّى بالفعل ✓","settings.chooseFolder":"اختر مجلدًا…","settings.muteHelp":"الفواحص المكتومة تتوقف عن العمل، وصفحة الاكتشافات تبيّن أيها متوقف.","settings.muted":"مكتوم","settings.running":"يعمل","diag.title":"شارك تقريرًا تشخيصيًا","diag.intro":"كل ما ينبّه إليه af360 الآن - ما يحتاج إلى انتباه، ولماذا يهم، والإصلاح المقترح - في ملف واحد مرتّب تسلّمه لشخص أو تلصقه في مساعد ذكاء اصطناعي.","diag.safe":"ما تراه هنا هو بالضبط ما سيُحفَظ. تُختصر مسارات المجلدات، ويُخفى كل ما له شكل كلمة مرور أو مفتاح، ولا يُدرَج اسم جهازك أبدًا.","diag.hintText":"يضعه في الحافظة الآن","diag.hintFile":"يحفظ ملفًا نصيًا بسيطًا (.md) تقرؤه المحرّرات ومساعدو الذكاء الاصطناعي","diag.hintPage":"يحفظ صفحة مقروءة يمكنك طباعتها أو حفظها بصيغة PDF","diag.downloadText":"نزِّله كنص","diag.downloadPage":"نزِّله كصفحة","diag.copyForAi":"انسخ تقرير الممتلكات","diag.dialogAria":"تقرير تشخيصي","keys.title":"اختصارات لوحة المفاتيح","keys.rooms":"اذهب إلى غرفة","keys.actions":"افعل شيئًا","keys.doCopy":"انسخ ملخص المشروع الذي كنت تعمل فيه","keys.doHelp":"أظهِر هذه القائمة","keys.doEsc":"أغلِق هذه القائمة","connections.title":"الاتصالات","connections.secIn":"الوكلاء يصلون إلى af360","connections.secOut":"af360 يصل إلى الخارج","connections.secActivity":"النشاط","conn.githubRefused":"رفض GitHub هذا الاتصال","connections.githubReconnect":"أعد ربط GitHub…","connections.refusedLine":"رُفض وصول af360 إلى {0} - أعد الربط لاستعادته. وحتى ذلك الحين لا يجيب GitHub بشيء.","rail.live":"مباشر","rail.log":"السجل \xb7 7 أيام","rail.next":"التالي","rail.configFault":"لا أستطيع قراءة إعداداتك","rail.configFaultSub":"فلا أعرف ما الذي أراقبه","rail.quietSub":"تصل الأحداث والفحوصات هنا","rail.logEmpty":"السجل \xb7 لا شيء بعد","rail.noRecord":"لم يُسجَّل شيء بعد","rail.noRecordSub":"لم يُكمل af360 أي فحص بعد","rail.swept":"تم مسح حالة git","rail.missing":"ما زال مفقودًا","rail.nextSiteCheck":"فحص موقع","rail.nextScan":"فحص مجلدات","rail.nextSsl":"تقييم شهادة SSL","seg.simple":"بسيط","seg.dev":"مطوّر","seg.day":"نهار","seg.night":"ليل","seg.modeAria":"الوضع","seg.themeAria":"المظهر","foot.by":"من","common.scanning":"جارٍ الفحص…","common.loading":"جارٍ إلقاء نظرة…","common.somethingWrong":"حدث خطأ ما - أعِد المحاولة.","fault.invite":"لا أستطيع قراءة إعداداتك","fault.line":"ملف إعداداتك في مكانه الصحيح، لكنني لا أستطيع قراءته، فلا أعرف ما الذي طلبتَ مني مراقبته. ولم أغيّره ولم أكتب فوقه.","fault.whereLabel":"الملف هنا:","fault.fixLead":"ما يُصلح ذلك عادة:","fault.fixOpen":"افتح الملف وتأكّد من اكتماله - فالملف الناقص أو المُحرَّر يدويًا هو السبب المعتاد.","fault.fixRestore":"إن كنت تحتفظ بنسخ احتياطية، فأعِد آخر نسخة سليمة مكانه.","fault.fixRename":"أو غيّر اسم الملف. سيبدأ af360 من جديد، ويبقى ملفك القديم على القرص لتطّلع عليه.","roomError.invite":"لم تُفتح هذه الغرفة","roomError.fixLead":"ما الذي عليك فعله:","stream.starting":"ما زلت أنظر - الفحوصات الأعمق تبدأ الآن، وتصل النتائج هنا كلما انتهت","stream.countingLead":"ما زلت أنظر - انتهى","stream.countingMid":"من","stream.countingTail":"فحصًا أعمق، وتصل النتائج هنا كلما انتهت","setup.look":"ابحث عن مشاريعي","setup.pickMyself":"سأختار المجلد بنفسي","setup.browse":"تصفّح المجلدات","setup.looking":"أبحث في أماكنك المعتادة…","setup.lookAgain":"ابحث من جديد","setup.addAnother":"أضِف مكانًا آخر","setup.whereLooked":"أين بحثت:","setup.nothingNew":"لا جديد","setup.pickWhere":"اختر أين أبحث:","setup.up":"للأعلى","setup.noFolders":"لا مجلدات داخل هذا المجلد.","setup.watchThis":"راقِب هذا المجلد","setup.alreadyWatching":"يراقب هذا المجلد بالفعل ✓","setup.watch":"راقِب","setup.watchAll":"راقِب الكل","setup.watching":"يراقبه ✓","setup.foundCountLead":"وجدت","setup.foundCountTail":"مشروعًا. راقِب ما يهمّك منها:","setup.adding":"جارٍ الإضافة…","setup.noneFound":"لم أجد أي مشاريع جديدة في الأماكن أدناه.","setup.previewOff":"وضع المعاينة - تغييرات الإعدادات متوقفة.","setup.searchFailed":"حدث خطأ أثناء البحث - أعِد المحاولة.","setup.downloadedNote":"داخل مجلد التنزيلات، أو بأسماء تبدو كأرشيف - غالبًا ليست من ممتلكاتك. راقِب ما هو لك منها فعلًا:","setup.downloadedTag":"تبدو نسخة مُنزَّلة","setup.elsewhere":"ليس ما توقّعته؟ قد تكون مشاريعك في مكان آخر - قرص ثانٍ، أو قرص خارجي.","setup.elsewhereBtn":"وجّهني إلى مكان آخر","banner.radarLead":"هذه","banner.radarStrong":"ممتلكات نموذجية","banner.radarRest":'لترى كل شيء وهو يعمل - جرّب "عُلِم" و"تجاهل" و"لاحقًا".',"banner.radarLink":"وجّه af360 إلى مشاريعك الحقيقية","banner.radarTail":"فتصير لك.","banner.discLead":"اكتشافات نموذجية -","banner.discTail":"فتصير هذه لك.","banner.reportLead":"تقرير نموذجي -","banner.reportTail":"فتصير هذه أرقامك.","banner.aheadLead":"جدول زمني نموذجي -","banner.aheadLink":"راقِب مواقعك الحقيقية","banner.aheadTail":"فتظهر هنا تواريخ شهاداتها ونطاقاتها، مع الحكم عليها.","brief.failed":"تعذّر تجميع الملخص - أعِد المحاولة.","brief.redacted":"حُذفت الأسرار","brief.copiedLead":"تم النسخ:"};function s(e){return"room.".concat(e.replace(/^\//,""))}function i(e){return"ar"===e?"ar":"en"}function r(e){return!e||e.startsWith("")?e:""+e+""}function l(e,t,n){if("ar"!==e)return n;let s=a[t];return void 0!==s?s:r(n)}},2696:(e,t,n)=>{n.d(t,{CQ:()=>v,Fb:()=>x,HE:()=>p,J6:()=>f,M0:()=>j,hR:()=>g,r8:()=>y,zU:()=>m});var a=n(5155),s=n(2115),i=n(7064),r=n(23),l=n(8261),o=n(436),c=n(5310),d=n(3034),u=n(797);function h(){let[e,t]=(0,s.useState)("idle"),n=(0,s.useRef)(null);(0,s.useEffect)(()=>()=>{n.current&&clearTimeout(n.current)},[]);let a=e=>{t(e),n.current&&clearTimeout(n.current),n.current=setTimeout(()=>t("idle"),2200)};return{state:e,run:async e=>{n.current&&clearTimeout(n.current),t("working");let s=null;try{s=await e()}catch(e){s=null}if(null===s)return void a("failed");try{await navigator.clipboard.writeText(s),a("done")}catch(e){a("failed")}}}}function p(e){var t,n;let{cockpit:s}=e,i=(0,c.kj)(),d=(0,c.cO)();if(s.configFault)return null;let h=(0,l.X2)(s.attention,null!=(n=null==(t=s.radar)?void 0:t.projects)?n:[]);if(!h)return null;let p=(0,l.sx)(h),m=(0,l.Bx)(h),g=(0,r.HU)(s.attention),y=(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"radius-head",children:(0,a.jsx)(c.P,{p:p.headline})}),(0,a.jsx)("div",{className:"radius-under",children:(0,a.jsx)(c.P,{p:p.under})}),m&&(0,a.jsx)("div",{className:"radius-excluded",children:(0,a.jsx)(c.P,{p:m})})]}),v="clean"===p.tone?"ok":"risk";return 0===g.length?(0,a.jsx)("div",{className:"radius ".concat(v),role:"status",children:y}):(0,a.jsxs)("button",{type:"button",className:"radius ".concat(v," jump"),"aria-label":i("pill.jumpAria",o.UI.session.verdictJumpAria),...(0,u.uN)(g.map(e=>e.what).join(" \xb7 ")||d.verdict),onClick:()=>(function(e){let t=e.map(e=>document.querySelector("[".concat(f,"=").concat(JSON.stringify(e),"]"))).filter(e=>null!==e);if(0!==t.length)for(let e of(t[0].scrollIntoView({behavior:"smooth",block:"center"}),t))e.classList.remove("jumped"),e.offsetWidth,e.classList.add("jumped"),setTimeout(()=>e.classList.remove("jumped"),1400)})(g.map(e=>e.id)),children:[y,(0,a.jsx)("span",{className:"radius-hint",children:i("pill.hint",o.UI.session.verdictHint)})]})}function m(e){let{cockpit:t,onToast:n}=e,s=(0,i.cB)(),l=(0,c.kj)(),h=(0,c.cO)(),p=(0,c.uU)(),m=(0,r.sp)(t.projects,s);if(!m)return null;if(m.stale)return(0,a.jsx)("div",{className:"session",children:(0,a.jsx)("span",{className:"fact",children:l("session.noRecent",o.UI.session.noRecent)})});let f=m.project;return(0,a.jsxs)("div",{className:"session",children:[(0,a.jsx)("span",{className:"k",children:l("session.wereIn",o.UI.session.wereIn)}),(0,a.jsx)("b",{children:(0,a.jsx)(d.B,{children:f.name})}),f.branch&&(0,a.jsx)("span",{className:"branch",children:(0,a.jsx)(d.B,{mono:!0,children:f.branch})}),(0,a.jsxs)("span",{className:"fact",children:[f.uncommitted>0?"ar"===p?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("em",{...(0,u.uN)(h.unsaved),children:(0,a.jsx)(d.V,{n:f.uncommitted})})," ",l("session.uncommittedTail",o.UI.session.uncommittedTail)]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("em",{...(0,u.uN)(h.unsaved),children:o.UI.session.uncommitted(f.uncommitted)})," ",o.UI.session.uncommittedTail]}):(0,a.jsx)(a.Fragment,{children:l("session.clean",o.UI.session.clean)})," \xb7 ",f.lastCommit?l("session.lastCommit",o.UI.session.lastCommit):l("session.touched",o.UI.session.touched)," ",(0,a.jsx)(i.fV,{ts:m.lastTs})]}),(0,a.jsxs)("div",{className:"acts",children:[(0,a.jsx)(y,{path:f.path}),!t.demo&&(0,a.jsx)(x,{cockpit:t,project:f,onToast:n}),!t.demo&&(0,a.jsx)(w,{onToast:n})]}),(0,a.jsx)("span",{className:"subk",children:l("session.subline",o.UI.session.subline)})]})}let f="data-need";function g(e){let{text:t,label:n,labelKey:s,title:i}=e,{state:r,run:l}=h(),d=(0,c.kj)();return(0,a.jsx)("button",{className:"b2 q",...(0,u.uN)(i),onClick:()=>l(async()=>t),children:"done"===r?d("btn.copied",o.UI.session.copied):"failed"===r?d("btn.copyFailed",o.UI.session.copyFailed):d(s,n)})}function y(e){let{path:t,label:n,labelKey:s}=e,{state:i,run:r}=h(),l=(0,c.kj)(),d=(0,c.cO)(),p=n?l(null!=s?s:"btn.copyPath",n):l("btn.copyPath",o.UI.session.copyPath);return(0,a.jsx)("button",{className:"b2 q",...(0,u.uN)(d.copyPath),onClick:()=>r(async()=>t),children:"done"===i?l("btn.copied",o.UI.session.copied):"failed"===i?l("btn.copyFailed",o.UI.session.copyFailed):p})}async function v(e,t,n){var a,s,i;let r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],l=arguments.length>4&&void 0!==arguments[4]?arguments[4]:(e,t)=>t,c=(null!=(s=null==(a=e.attention)?void 0:a.items)?s:[]).filter(e=>"project"===e.kind&&e.id===t.path.toLowerCase()).map(e=>({what:e.what,why:e.why,steps:e.steps})),d=await fetch("/api/context",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({path:t.path,findings:c,dev:r})}).then(e=>e.json()).catch(()=>null);if(!(null==d?void 0:d.ok)||"string"!=typeof d.text)return null==n||n(l("brief.failed",o.UI.session.briefFailed)),null;let u=[...null!=(i=d.included)?i:[],l("brief.redacted",o.UI.session.briefRedacted)];return null==n||n("".concat(l("brief.copiedLead","Copied:")," ").concat(u.join(", "),".")),d.text}function w(e){let{onToast:t}=e,{state:n,run:s}=h(),i=(0,c.kj)(),r=async()=>{let e=await fetch("/api/handoff",{cache:"no-store"}).then(e=>e.json()).catch(()=>null);if(!(null==e?void 0:e.ok)||"string"!=typeof e.text){var n;return null==t||t(null!=(n=null==e?void 0:e.message)?n:i("brief.failed",o.UI.session.briefFailed)),null}return null==t||t(i("handoff.copied",o.UI.session.handoffCopied)),e.text},l="working"===n?i("btn.copying",o.UI.session.copying):"done"===n?i("btn.copied",o.UI.session.copied):"failed"===n?i("btn.copyFailed",o.UI.session.copyFailed):i("btn.copyHandoff",o.UI.session.copyHandoff);return(0,a.jsx)("button",{className:"b2",disabled:"working"===n,onClick:()=>s(r),children:l})}function x(e){let{cockpit:t,project:n,onToast:r,link:l}=e,{state:d,run:p}=h(),m=(0,c.kj)(),f=(0,c.cO)(),g=(0,s.useContext)(i.vC),y=()=>v(t,n,r,g,m),w="working"===d?m("btn.copying",o.UI.session.copying):"done"===d?m("btn.copied",o.UI.session.copied):"failed"===d?m("btn.copyFailed",o.UI.session.copyFailed):l?m("btn.copyContext",o.UI.session.copyContextShort):m("btn.copyContext",o.UI.session.copyContext);return(0,a.jsx)("button",{className:l?"b2 q":"b2",...(0,u.uN)(f.copyContext),disabled:"working"===d,onClick:()=>p(y),children:w})}function j(e){let{it:t}=e,{state:n,run:s}=h(),i=(0,c.kj)(),r=(0,c.cO)();return t.devSteps&&0!==t.devSteps.length?(0,a.jsx)("button",{className:"b2 q",...(0,u.uN)(r.copyCommands),onClick:()=>s(async()=>{var e;return(null!=(e=t.devSteps)?e:[]).join("\n")}),children:"done"===n?i("btn.commandsCopied",o.UI.session.commandsCopied):"failed"===n?i("btn.copyFailed",o.UI.session.copyFailed):i("btn.copyCommands",o.UI.session.copyCommands)}):null}},3034:(e,t,n)=>{n.d(t,{B:()=>s,En:()=>i,V:()=>r});var a=n(5155);function s(e){let{children:t,mono:n,className:s}=e,i=["data",n?"mono":"",null!=s?s:""].filter(Boolean).join(" ");return(0,a.jsx)("bdi",{dir:"ltr",className:i,children:t})}function i(e){let{children:t,className:n}=e;return(0,a.jsx)("bdi",{dir:"ltr",className:["en",null!=n?n:""].filter(Boolean).join(" "),children:t})}function r(e){let{n:t}=e;return(0,a.jsx)("bdi",{dir:"ltr",className:"data num",children:t})}},4881:(e,t,n)=>{n.d(t,{F:()=>r});var a=n(5155);let s={width:16,height:16,viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,focusable:!1,className:"nicon"},i={fill:"currentColor",stroke:"none"};function r(e){let{name:t}=e;switch(t){case"radar":return(0,a.jsxs)("svg",{...s,children:[(0,a.jsx)("circle",{cx:"4.2",cy:"8",r:"1.5",...i}),(0,a.jsx)("path",{d:"M7.4 4.9a4 4 0 0 1 0 6.2"}),(0,a.jsx)("path",{d:"M10.4 3.1a6.4 6.4 0 0 1 0 9.8"})]});case"projects":return(0,a.jsxs)("svg",{...s,children:[(0,a.jsx)("circle",{cx:"3.1",cy:"4",r:"1.4",...i}),(0,a.jsx)("path",{d:"M5.8 4h7.3"}),(0,a.jsx)("circle",{cx:"3.1",cy:"8",r:"1.4",...i}),(0,a.jsx)("path",{d:"M5.8 8h7.3"}),(0,a.jsx)("circle",{cx:"3.1",cy:"12",r:"1.4",...i}),(0,a.jsx)("path",{d:"M5.8 12h4.1"})]});case"sites":return(0,a.jsxs)("svg",{...s,children:[(0,a.jsx)("circle",{cx:"8",cy:"8",r:"5.6"}),(0,a.jsx)("path",{d:"M2.63 9.6h10.74"}),(0,a.jsx)("circle",{cx:"11.96",cy:"4.04",r:"1.4",...i})]});case"discoveries":return(0,a.jsxs)("svg",{...s,children:[(0,a.jsx)("path",{d:"M2.4 11.6 5.6 7.4 8.6 10 11 4.6l2.6 3.6"}),(0,a.jsx)("circle",{cx:"11",cy:"4.6",r:"1.4",...i})]});case"ahead":return(0,a.jsxs)("svg",{...s,children:[(0,a.jsx)("path",{d:"M2.2 8h2.9",opacity:".4"}),(0,a.jsx)("circle",{cx:"7",cy:"8",r:"1.5",...i}),(0,a.jsx)("path",{d:"M8.9 8h4.9"})]});case"connections":return(0,a.jsxs)("svg",{...s,children:[(0,a.jsx)("circle",{cx:"3.6",cy:"8",r:"1.5",...i}),(0,a.jsx)("path",{d:"M5.5 8h1.9"}),(0,a.jsx)("path",{d:"M8.6 8h1.9"}),(0,a.jsx)("circle",{cx:"12.4",cy:"8",r:"1.5",...i})]});case"settings":return(0,a.jsxs)("svg",{...s,children:[(0,a.jsx)("circle",{cx:"8",cy:"8",r:"1.6",...i}),(0,a.jsx)("path",{d:"M8 1.8V4M8 12v2.2M14.2 8H12M4 8H1.8"}),(0,a.jsx)("path",{d:"M10.83 5.17 12.38 3.62M3.62 12.38 5.17 10.83M10.83 10.83l1.55 1.55M3.62 3.62 5.17 5.17"})]});case"report":return(0,a.jsxs)("svg",{...s,children:[(0,a.jsx)("path",{d:"M3.8 2.2h8.4a.6.6 0 0 1 .6.6v10.4a.6.6 0 0 1-.6.6H3.8a.6.6 0 0 1-.6-.6V2.8a.6.6 0 0 1 .6-.6Z"}),(0,a.jsx)("path",{d:"M5.6 5.4h4.8M5.6 8h4.8M5.6 10.6h3"})]});case"log":return(0,a.jsx)("svg",{...s,children:(0,a.jsx)("path",{d:"M2.2 10.4h3.2l1.8-5.6 1.8 5.6h4.8"})})}}},5163:(e,t,n)=>{n.d(t,{Pl:()=>f,W8:()=>u,YV:()=>l,ih:()=>p,yy:()=>m,ze:()=>h});var a=n(436),s=n(8706),i=n(7e3),r=n(7470);function l(e,t){var n;return e?null!=(n=e.tones[t])?n:"clean":null}function o(e){return{what:e.what.en,whatP:e.what,why:e.why.en,whyP:e.why,evidence:e.evidence.map(e=>e.en),evidenceP:e.evidence,steps:e.steps.map(e=>e.en),stepsP:e.steps}}function c(e){return{action:e.en,actionP:e}}function d(e){return e?{handledNote:e.en,handledNoteP:e}:{}}function u(e){let t=e=>Array.isArray(e)?e:[],n=t(e.projects),l=t(e.urls),u=t(e.expiryItems),m=t(e.incidents),f=t(e.missingRoots),w=t(e.ignored),{snoozes:x,isAcked:j,isDupe:b,offline:k}=e,N=Date.now(),I=e=>{let t=null==x?void 0:x[e];return!!t&&new Date(t).getTime()>N},S=[],U={};for(let e of n){let t=e.path.toLowerCase(),l=function(e,t,n){var l,o,c,d,u,m,f;let g=[],y=[],v=[],w=[];e.changedTotal>0&&(g.push((0,s.ph)("attn.reason.unsaved","{0} unsaved change".concat(1===e.changedTotal?"":"s"),e.changedTotal)),y.push((0,s.ph)("attn.ev.changed","changed: {0}".concat(e.changedTotal>e.dirtyFiles.length?" and {1} more":""),e.dirtyFiles.join(", "),e.changedTotal-e.dirtyFiles.length))),e.deleted>0&&(g.push((0,s.ph)("attn.reason.deleted","{0} file".concat(1===e.deleted?"":"s"," deleted"),e.deleted)),y.push((0,s.ph)("attn.ev.deleted","deleted: {0}".concat(e.deleted>e.deletedFiles.length?" and {1} more":""),e.deletedFiles.join(", "),e.deleted-e.deletedFiles.length))),e.uncommitted>0&&(v.push((0,s.pl)("attn.step.commit","Commit the work - a commit makes it permanent history.")),w.push('git add -A && git commit -m "wip"')),e.deleted>0&&(v.push((0,s.pl)("attn.step.deleted","If a deletion was not meant, git still holds the file - restore it before committing.")),w.push("git restore --")),(null!=(l=e.ahead)?l:0)>0&&(g.push((0,s.ph)("attn.reason.unpushed","{0} commit".concat(1===e.ahead?"":"s"," not pushed"),null!=(o=e.ahead)?o:0)),y.push((0,s.ph)("attn.ev.onlyHere","{0} commit".concat(1===e.ahead?"":"s"," exist only on this machine"),null!=(c=e.ahead)?c:0)),v.push((0,s.pl)("attn.step.push","Push once - the remote gets a full copy and the risk is gone.")),w.push("git push")),h(e)&&(g.push((0,s.pl)("attn.reason.noBackup","no backup anywhere")),y.push((0,s.pl)("attn.ev.noRemote","no remote is configured - this disk holds the only copy")),v.push((0,s.pl)("attn.step.createRepo","Create an empty repository on your code host, connect it, and push.")),w.push("git remote add origin <url>","git push -u origin main"));let x=e.isGit&&!e.statusKnown;x&&(g.push((0,s.pl)("unread.reason",a.UI.unread.reason)),y.push((0,s.pl)("unread.evidence",a.UI.unread.evidence)),v.push((0,s.pl)("unread.step",a.UI.unread.step)));let j=t?p(e,n):null,b=(null==j?void 0:j.kind)==="duplicate"?j:null,k=!!b&&("dormant"===e.staleness||"forgotten"===e.staleness);if(0===g.length&&k&&b){for(let e of(g.push((0,s.pl)("attn.reason.dupe","a dormant duplicate")),b.others))y.push((0,s.ph)("attn.ev.livingCopy","the living copy: {0}",e.path));let t=(0,i.p8)(e.remoteUrl);t&&y.push((0,s.ph)("attn.ev.sameRemote","both point at the same repository: {0}",t)),e.lastActivity&&(0,r.nW)(e.lastActivity)?y.push((0,s.pl)("attn.ev.untouchedSkew","this copy untouched ".concat(r.lt.since))):y.push((0,s.ph)("attn.ev.untouched","this copy untouched {0}",e.lastActivity?(m=e.lastActivity,(0,r.I)(m)):"for a long time")),v.push((0,s.pl)("attn.step.keepOne","Keep one copy - archive or delete the other so future-you isn't guessing."))}if(0===g.length)return{tone:"clean",what:"",why:"",evidence:[],steps:[]};let N=h(e),I=e.uncommitted>0?"unsaved":(null!=(d=e.ahead)?d:0)>0?"unpushed":N?"unbacked":void 0,S=x&&1===g.length,U="unsaved"===I?(0,s.ph)("act.save","Save {0}",e.name):"unpushed"===I?(0,s.ph)("act.push","Push {0}",e.name):"unbacked"===I?(0,s.ph)("act.backUp","Back up {0}",e.name):S?(0,s.ph)("unread.what","af360 could not finish reading {0}.",e.name):(0,s.ph)("act.duplicate","Decide on {0}'s duplicate",e.name),T=(f=g.map(e=>e.en),(0,s.nn)(f,s.v1.and,s.v1.comma)),C=S?(0,s.ph)("unread.what","af360 could not finish reading {0}.",e.name):{...(0,s.ph)("attn.project.what","{0} has {1}.",e.name,T),list:{slot:1,items:g}},A=S?(0,s.pl)("unread.why",a.UI.unread.why):N?(0,s.pl)("attn.why.noBackup","One disk failure and it's gone - a remote copy fixes that in a minute."):(null!=(u=e.ahead)?u:0)>0&&0===e.uncommitted?(0,s.pl)("attn.why.unpushed","A push costs a minute; losing them costs the work."):k&&0===e.uncommitted?(0,s.pl)("attn.why.dupe","Two copies of one project drift apart quietly."):(0,s.pl)("attn.why.unsaved","Unsaved work survives nowhere - one bad day and it's gone.");return y.push((0,s.ph)("attn.ev.path","{0}","path: ".concat(e.path))),{tone:"amber",what:C.en,why:A.en,whatP:C,whyP:A,since:e.lastActivity?new Date(e.lastActivity).getTime():void 0,evidence:y.map(e=>e.en),evidenceP:y,steps:v.map(e=>e.en),stepsP:v,devSteps:w.length>0?w:void 0,losable:I,action:U.en,actionP:U}}(e,b(e.name),n);U[t]=l.tone,"clean"!==l.tone&&S.push({...l,id:t,kind:"project",label:e.name,handled:I(t)||void 0,handledNote:I(t)?"quiet until tomorrow":void 0,openPath:e.path,laterId:t,ignore:{id:t,kind:"project",label:e.name,atRisk:h(e)}})}let T=e.github;if(T)for(let e of n){let t=T.byPath[e.path.toLowerCase()];if(!(null==t?void 0:t.ok))continue;let n=t.value;if(n.ci.ok&&n.ci.value&&"failing"===n.ci.value.state){var C;let t=n.ci.value,a="ci:".concat(e.path.toLowerCase());S.push({id:a,kind:"project",tone:"amber",label:e.name,since:t.at,...o({what:(0,s.ph)("attn.gh.ci.what","{0}'s build failed on {1}.",e.name,t.branch),why:(0,s.pl)("attn.gh.ci.why","GitHub Actions went red - the last push didn't survive CI."),evidence:[(0,s.ph)("attn.gh.ci.ev1","the {0} workflow reported {1}",t.workflow,null!=(C=t.conclusion)?C:"a failure"),(0,s.ph)("attn.gh.ci.ev2","on branch {0}",t.branch),(0,s.ph)("attn.gh.ci.ev3","GitHub last moved this run at {0}",new Date(t.at).toISOString())],steps:[(0,s.pl)("attn.gh.ci.step1","Open the run on GitHub and read the first failing step - the rest usually follow from it."),(0,s.pl)("attn.gh.ci.step2","Nothing here is lost: the commits are pushed. This is about the checks, not the work.")]}),handled:I(a)||void 0,...d(I(a)?(0,s.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),openPath:e.path,laterId:a,...c((0,s.ph)("act.gh.ci","Read {0}'s failing run on GitHub",e.name))})}if("refuted"===n.backup.verdict){let t=n.backup,a="backup:".concat(e.path.toLowerCase());S.push({id:a,kind:"project",tone:"amber",label:e.name,losable:"unpushed",...o({what:(0,s.ph)("attn.gh.backup.what","{0} says everything is pushed, and GitHub doesn't have it.",e.name),why:(0,s.pl)("attn.gh.backup.why","Local git reports nothing to push and nothing to pull, so this machine and GitHub should be on the same commit. They aren't."),evidence:[(0,s.ph)("attn.gh.backup.ev1","this machine is on {0} at branch {1}",t.localSha.slice(0,12),t.branch),(0,s.ph)("attn.gh.backup.ev2","GitHub's {0} is at {1}",t.branch,t.remoteSha.slice(0,12)),(0,s.pl)("attn.gh.backup.ev3","af360 asked both ends this scan - this is not read from local git's own record of the remote")],steps:[(0,s.pl)("attn.gh.backup.step1","Fetch from the remote and look again - the usual cause is that this machine's record of the remote is out of date."),(0,s.pl)("attn.gh.backup.step2","If the commits really are only here, push them. Until then treat this project as not backed up.")]}),devSteps:["git fetch --all","git status -sb","git log --oneline -1 HEAD"],handled:I(a)||void 0,...d(I(a)?(0,s.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),openPath:e.path,laterId:a,...c((0,s.ph)("act.gh.backup","Check where {0}'s commits actually are",e.name))})}}if(k&&l.length>0){for(let e of l)U[e.entry.id]="clean";S.push({id:"offline",kind:"site",tone:"amber",label:"Internet connection",...o({what:(0,s.pl)("attn.offline.what","This computer seems to be offline."),why:(0,s.pl)("attn.offline.why","Your sites may be perfectly fine - af360 can't reach anything right now, so it won't guess."),evidence:[(0,s.ph)("attn.offline.ev1","none of the {0} watched sites answered",l.length),(0,s.pl)("attn.offline.ev2","the domain lookup didn't get through either"),(0,s.pl)("attn.offline.ev3","checks keep running while af360 is open; this clears itself the moment something answers")],steps:[(0,s.pl)("attn.offline.step1","Check this machine's internet connection - wifi, cable, or a VPN that dropped."),(0,s.pl)("attn.offline.step2","Nothing to do here once it's back: af360 rechecks every minute while it is open, and clears this on its own.")]}),devSteps:["ping 1.1.1.1","nslookup example.com"],...c((0,s.pl)("act.offline","Check this machine's connection"))})}for(let e of k?[]:l){let t=e.entry.id,n=e.current,a=e.entry.label||function(e){try{return new URL(e).hostname}catch(t){return e}}(e.entry.url);if(!n||n.ok){U[t]="clean";continue}U[t]="red";let i=m.find(e=>e.subjectId===t&&!e.endedTs),r=j(t),l=I(t);S.push({id:t,kind:"site",tone:"red",label:a,...o({what:n.status?(0,s.ph)("attn.down.whatStatus","{0} is down (HTTP {1}).",a,n.status):n.error?(0,s.ph)("attn.down.whatError","{0} is down - {1}.",a,n.error):(0,s.ph)("attn.down.what","{0} is down.",a),why:(0,s.pl)("attn.down.why","af360 asked for your site from this machine and got an error back instead of the page."),evidence:[(0,s.ph)("attn.down.evUrl","{0}",e.entry.url),n.status?(0,s.ph)("attn.down.evAnswer","last answer: HTTP {0}",n.status):n.error?(0,s.ph)("attn.down.evAnswerText","last answer: {0}",n.error):(0,s.pl)("attn.down.evNoAnswer","no answer"),i?(0,s.ph)("attn.down.evSince","down since {0}",new Date(i.startedTs).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})):(0,s.pl)("attn.down.evJust","just went quiet"),(0,s.pl)("attn.down.evCadence","checked every minute while af360 is open; recovery is logged automatically")],steps:[(0,s.pl)("attn.down.step1","Open your host's dashboard - most outages are a crashed service or a failed deploy."),(0,s.pl)("attn.down.step2","Press Check once you're on it; the row calms down and clears itself when the site answers again.")]}),since:null==i?void 0:i.startedTs,handled:r||l||void 0,...d(r?(0,s.pl)("attn.handled.acked","being handled ✓"):l?(0,s.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),devSteps:["curl -sI ".concat(e.entry.url)],...c((0,s.ph)("act.siteDown","{0} is down",a)),checkId:t,laterId:t,ignore:{id:t,kind:"url",label:a,atRisk:!0}})}for(let e of w){if(!e.resurface)continue;let t="resurface:".concat(e.id);U[t]="amber",S.push({id:t,kind:"resurface",tone:"amber",label:e.label,...o({what:(0,s.ph)("attn.resurface.what","{0}",e.resurface.text),why:(0,s.pl)("attn.resurface.why","You silenced this earlier - the situation moved, so it gets one more look."),evidence:[(0,s.ph)("attn.resurface.evThen","ignored at: {0}",g(e.snapshot)),(0,s.ph)("attn.resurface.evNow","now: {0}",g(e.resurface.current))],steps:[(0,s.pl)("attn.resurface.step","Watch again to bring it back, or Still ignore to re-silence it at today's numbers.")]}),...c((0,s.ph)("act.decide","Decide on {0}",e.label)),resurfaceId:e.id,ignore:{id:e.id,kind:e.kind,label:e.label,atRisk:!1}})}for(let e of u){if(e.manual){if(e.done||null===e.rung||void 0===e.rung){U[e.id]="clean";continue}U[e.id]="amber";let t=I(e.id);S.push({id:e.id,kind:"expiry",tone:"amber",label:e.name,entrusted:!0,cost:e.cost,passed:e.passed,entrustedId:e.id,...o({what:e.passed?(0,s.ph)("attn.entrusted.passed","{0} was due {1}.",e.name,v(e.daysLeft)):(0,s.ph)("attn.entrusted.what","{0} is due {1}.",e.name,v(e.daysLeft)),why:e.note?(0,s.ph)("attn.entrusted.userNote","{0}",e.note):(0,s.pl)("attn.entrusted.why","You asked af360 to tell you about this one."),evidence:[(0,s.pl)("attn.entrusted.evAdded","you added this date"),(0,s.ph)("attn.expiry.evDate","date: {0}",new Date(e.date).toLocaleDateString()),e.note?(0,s.ph)("attn.entrusted.evNote",'what you wrote: "{0}"',e.note):null].filter(e=>null!==e),steps:[(0,s.pl)("attn.entrusted.step","Deal with it, or open Ahead to change the date, mark it done or remove it.")]}),handled:t||void 0,...d(t?(0,s.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),...c((0,s.ph)("act.entrusted","Deal with {0}",e.name)),laterId:e.id});continue}let t="red"===e.chip||"amber"===e.chip&&"ssl"===e.kind&&e.managed;if(U[e.id]=t?"amber":"clean",!t)continue;let n=I(e.id);S.push({id:e.id,kind:"expiry",tone:"amber",label:e.name,...o({what:"ssl"===e.kind&&e.managed&&"red"!==e.chip?(0,s.ph)("attn.expiry.certLate","{0}'s certificate should have auto-renewed by now - it hasn't.",e.name):e.daysLeft<0?(0,s.ph)("attn.expiry.expired","{0} expired {1}.",e.name,v(e.daysLeft)):(0,s.ph)("attn.expiry.expires","{0} expires {1}.",e.name,v(e.daysLeft)),why:e.note?(0,s.ph)("attn.expiry.userNote","{0}",e.note):"ssl"===e.kind?(0,s.pl)("attn.expiry.whySsl","When it lapses, browsers show a scary warning instead of your site."):(0,s.pl)("attn.expiry.whyDomain","After the date it stops working - renewing early is painless."),evidence:[(0,s.ph)("attn.expiry.evDate","date: {0}",new Date(e.date).toLocaleDateString()),e.judgment?(0,s.ph)("attn.expiry.evJudgment","{0}",e.judgment):e.note?(0,s.ph)("attn.expiry.evNote",'your note: "{0}"',e.note):null,e.issuer?(0,s.ph)("attn.expiry.evIssuer","issuer: {0}",e.issuer):null].filter(e=>null!==e),steps:"ssl"===e.kind?[(0,s.pl)("attn.expiry.stepSsl","Ask your host why the renewal hasn't landed - managed certificates renew on their own, so a late one means something is stuck.")]:[(0,s.pl)("attn.expiry.stepDomain","Renew it (or let it lapse on purpose), then remove or update the entry on Ahead.")]}),handled:n||void 0,...d(n?(0,s.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),...c("ssl"===e.kind&&e.managed&&"red"!==e.chip?(0,s.ph)("act.certLate","Chase {0}'s certificate",e.name):(0,s.ph)("act.renew","Renew {0}",e.name)),laterId:e.id})}for(let e of f){let t="missing:".concat(e);U[t]="amber",S.push({id:t,kind:"missing",tone:"amber",label:y(e),...o({what:(0,s.ph)("attn.missing.what","The folder {0} can't be found",e),why:(0,s.pl)("attn.missing.why","It moved or was renamed - point me at its new home, or stop watching it."),evidence:[(0,s.ph)("attn.missing.evPath","watched path: {0}",e),(0,s.pl)("attn.missing.evScan","the folder stopped answering on the last scan")],steps:[(0,s.pl)("attn.missing.step1","Press Find it and click through to where the folder lives now - the old entry is replaced."),(0,s.pl)("attn.missing.step2","If it's gone on purpose, Stop watching removes it.")]}),...c((0,s.ph)("act.find","Find {0}",y(e))),findPath:e})}S.sort((e,t)=>{var n,a;return Number(null!=(n=e.handled)&&n)-Number(null!=(a=t.handled)&&a)||Number("red"===t.tone)-Number("red"===e.tone)});let A=S.filter(e=>!e.handled).length,L=S.some(e=>"red"===e.tone&&!e.handled),E=t(e.findings).filter(e=>(null==e?void 0:e.cat)==="safety").length,F=0;if(T){for(let e of n){let t=T.byPath[e.path.toLowerCase()];t&&!t.ok&&F++}T.outage&&F++}return F+=t(e.unreachedChecks).length,{state:L?"INCIDENT":A>0?"NEEDS_YOU":E>0?"SAFETY":"QUIET",open:A,items:S,tones:U,unreached:F+=new Set(t(e.unscannedSubjects)).size,safety:E}}function h(e){return e.isGit&&e.remoteKnown&&!e.hasRemote&&!e.looksDownloaded}function p(e,t){let n=t.filter(t=>t.name===e.name&&t.path!==e.path);if(0===n.length)return null;let a=e.remoteKnown?(0,i.p8)(e.remoteUrl):null,s=e=>e.remoteKnown?(0,i.p8)(e.remoteUrl):null;if(a){let e=n.filter(e=>s(e)===a);if(e.length>0)return{kind:"duplicate",others:e}}return!a||n.some(e=>null===s(e))?{kind:"unproven",others:n}:{kind:"sharesName",others:n}}function m(e){return 0===e.items.length&&0===Object.keys(e.tones).length}function f(e){var t;let n=(e,t)=>({line:e.en,under:t.en,lineP:e,underP:t});if(m(e))return n((0,s.pl)("head.emptyLine","Nothing watched yet"),(0,s.pl)("head.emptyUnder","Point me at a folder and I'll show you the projects inside it."));if("INCIDENT"===e.state){let t=e.items.filter(e=>"red"===e.tone&&!e.handled);return n(1===t.length?(0,s.ph)("head.downOne","{0} is down",t[0].label):(0,s.ph)("head.downMany","{0} down",t.length),1===t.length?(0,s.pl)("head.incidentUnder","everything else can wait - this is the one to look at"):(0,s.pl)("head.incidentUnderMany","everything else can wait - these are the ones to look at"))}if("NEEDS_YOU"===e.state)return e.safety>0?n((0,s.ph)("head.needsLine","{0} need".concat(1===e.open?"s":""," you"),e.open),(0,s.ph)("head.needsUnderSafety","none of it is on fire - each has a reason, and {0} safety finding".concat(1===e.safety?" is":"s are"," waiting in Discoveries"),e.safety)):n((0,s.ph)("head.needsLine","{0} need".concat(1===e.open?"s":""," you"),e.open),(0,s.pl)("head.needsUnder","none of it is on fire - each has a reason"));let a=e.items.filter(e=>e.handled).length,i=null!=(t=e.unreached)?t:0,r=e=>"thing".concat(1===e?"":"s");if("SAFETY"===e.state){let t=e.safety;return n((0,s.ph)("head.safetyLine","{0} safety finding".concat(1===t?"":"s"),t),i>0?(0,s.ph)("head.safetyMissed","".concat(1===t?"it is":"they are"," waiting in Discoveries - and af360 couldn't check {0} ").concat(r(i)," this time"),i):(0,s.pl)("head.safetyUnder","".concat(1===t?"it is":"they are"," waiting in Discoveries")))}return n((0,s.pl)("head.quietLine","All quiet"),a>0?i>0?(0,s.ph)("head.quietHandledMissed","nothing new needs you - {0} item".concat(1===a?" is":"s are"," being handled, and af360 couldn't check {1} ").concat(r(i)," this time"),a,i):(0,s.ph)("head.quietHandled","nothing new needs you - {0} item".concat(1===a?" is":"s are"," being handled"),a):i>0?(0,s.ph)("head.quietMissed","nothing needs you - and af360 couldn't check {0} ".concat(r(i)," this time"),i):(0,s.pl)("head.quietUnder","nothing needs you - go build something"))}function g(e){if(!e)return"nothing recorded";let t=[];return"number"==typeof e.uncommitted&&t.push("".concat(e.uncommitted," unsaved")),!1===e.hasRemote&&t.push("no backup"),e.down&&t.push("down"),t.length>0?t.join(", "):"all fine"}function y(e){var t;let n=e.split(/[\\/]/).filter(Boolean);return null!=(t=n[n.length-1])?t:e}function v(e){return e<0?"".concat(-e," day").concat(-1===e?"":"s"," ago"):0===e?"today":1===e?"tomorrow":"in ".concat(e," days")}},5310:(e,t,n)=>{n.d(t,{Je:()=>y,P:()=>f,T:()=>m,XE:()=>g,cO:()=>h,kj:()=>p,qN:()=>u,sJ:()=>c,uU:()=>d});var a=n(5155),s=n(2115),i=n(1551),r=n(436),l=n(8706),o=n(3034);let c=(0,s.createContext)("en");function d(){return(0,s.useContext)(c)}function u(e){return"ar"!==e?r.eV:new Proxy(r.eV,{get:(e,t)=>{let n=i.AR["tip.".concat(t)];if(void 0!==n)return n;let a=e[t];return"string"==typeof a?(0,i.rl)(a):a}})}function h(){return u((0,s.useContext)(c))}function p(){let e=(0,s.useContext)(c);return(t,n)=>(0,i.tr)(e,t,n)}function m(e){let{k:t,en:n,className:r}=e,l=(0,s.useContext)(c),o=(0,i.tr)(l,t,n);return(0,a.jsx)("span",{className:r,dir:"ar"===l?"auto":void 0,children:o})}function f(e){let{p:t,className:n,lower:r}=e;if("ar"!==(0,s.useContext)(c)){var d;return(0,a.jsx)(a.Fragment,{children:r?(d=t.en).charAt(0).toLowerCase()+d.slice(1):t.en})}let u=i.AR[t.k];return void 0===u?(0,a.jsx)(a.Fragment,{children:(0,i.rl)(t.en)}):(0,a.jsx)("span",{className:n,dir:"auto",children:function e(t,n){return n.split(/\{(\d+)\}/).map((n,s)=>{var r,c;if(s%2==0)return(0,a.jsx)("span",{children:n},s);let d=Number(n);return t.list&&t.list.slot===d?(0,a.jsx)("span",{children:function(t){var n,s;let r=null!=(n=i.AR[l.wo.and])?n:l.v1.and,o=null!=(s=i.AR[l.wo.comma])?s:l.v1.comma,c=[];return t.forEach((n,s)=>{s>0&&c.push((0,a.jsx)("span",{children:s===t.length-1?r:o},"j".concat(s)));let l=i.AR[n.k];c.push(void 0===l?(0,a.jsx)("span",{children:(0,i.rl)(n.en)},"p".concat(s)):(0,a.jsx)("span",{children:e(n,l)},"p".concat(s)))}),c}(t.list.items)},s):(0,a.jsx)(o.B,{children:String(null!=(c=null==(r=t.slots)?void 0:r[d])?c:"")},s)})}(t,u)})}function g(){let e=(0,s.useContext)(c);return t=>"ar"===e?(0,i.rl)(t):t}function y(){let e=(0,s.useContext)(c);return t=>"ar"!==e?t.en:(0,l.DJ)(t,e=>i.AR[e])}},5834:(e,t,n)=>{n.d(t,{g:()=>s,h:()=>i});var a=n(5155);function s(){return(0,a.jsxs)("span",{className:"ell","aria-hidden":"true",children:[(0,a.jsx)("i",{}),(0,a.jsx)("i",{}),(0,a.jsx)("i",{})]})}function i(e){let{children:t}=e,n=String(null!=t?t:""),i=/…|\.\.\./.exec(n);if(!i)return(0,a.jsx)(a.Fragment,{children:n});let r=n.slice(0,i.index),l=n.slice(i.index+i[0].length);return(0,a.jsxs)(a.Fragment,{children:[r,(0,a.jsx)(s,{}),l]})}},6400:(e,t,n)=>{n.d(t,{LZ:()=>p,ZT:()=>d,k4:()=>m,yr:()=>u});var a=n(5155),s=n(2115),i=n(436),r=n(5310),l=n(3034),o=n(4881),c=n(797);function d(e){return(null!=e?e:[]).filter(e=>!!e.proposal)}function u(e){return(null!=e?e:[]).filter(e=>!e.proposal&&!e.dateProposal)}function h(e){let{template:t,slots:n}=e,s=t.split(/(\{\d\})/g);return(0,a.jsx)(a.Fragment,{children:s.map((e,t)=>{let s=/^\{(\d)\}$/.exec(e);if(!s)return(0,a.jsx)("span",{children:e},t);let i=n[Number(s[1])];return void 0===i?(0,a.jsx)("span",{children:e},t):(0,a.jsx)(l.B,{children:i},t)})})}function p(e){let{cockpit:t,heading:n=!0}=e,s=d(t.insights);return 0===s.length?null:(0,a.jsxs)(a.Fragment,{children:[n&&(0,a.jsxs)("div",{className:"sec",children:[(0,a.jsx)("h2",{children:(0,a.jsx)(r.T,{k:"sec.worthWatching",en:i.UI.radar.proposals})}),(0,a.jsxs)("span",{className:"meta",children:[(0,a.jsx)(l.V,{n:s.length})," ",(0,a.jsx)(r.T,{k:"radar.proposalsMeta",en:i.UI.radar.proposalsMeta})]})]}),s.map(e=>(0,a.jsx)(g,{id:e.id,p:e.proposal,cockpit:t},e.id))]})}function m(e){let{cockpit:t,offers:n,onTrack:s}=e,o=n.filter(e=>!t.isRowResolved("dateoffer:".concat(e.host)));return 0===o.length?null:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"sec",children:[(0,a.jsx)("h2",{children:(0,a.jsx)(r.T,{k:"sec.worthTracking",en:i.UI.ahead.secSuggested})}),(0,a.jsxs)("span",{className:"meta",children:[(0,a.jsx)(l.V,{n:o.length})," ",(0,a.jsx)(r.T,{k:"ahead.suggestedMeta",en:i.UI.ahead.suggestedMeta})]})]}),o.map(e=>(0,a.jsx)(f,{p:e,cockpit:t,onTrack:s},e.host))]})}function f(e){let{p:t,cockpit:n,onTrack:d}=e,[u,p]=(0,s.useState)(!1),[m,f]=(0,s.useState)(null),[g,y]=(0,s.useState)(null),v=(0,r.kj)(),w=(0,r.cO)(),x=(0,s.useRef)(null);(0,s.useEffect)(()=>()=>{x.current&&clearTimeout(x.current)},[]);let j=()=>{x.current=setTimeout(()=>n.resolveRow("dateoffer:".concat(t.host)),1400)},b=async()=>{var e;p(!0),y(null);let a=await n.post({action:"declineDate",host:t.host,citation:t.citation});p(!1),a.ok?(f(v("ahead.suggestSetAside",i.UI.ahead.suggestSetAside)),j()):y(null!=(e=a.message)?e:v("common.somethingWrong",i.UI.common.somethingWrong))};return(0,a.jsxs)("div",{className:"need propose",children:[(0,a.jsx)("span",{className:"glyph","aria-hidden":!0,children:(0,a.jsx)(o.F,{name:"ahead"})}),(0,a.jsxs)("div",{className:"txt",children:[(0,a.jsx)("b",{children:(0,a.jsx)(l.B,{children:t.name})}),(0,a.jsx)("span",{children:"certificate"===t.file?(0,a.jsx)(h,{template:v("ahead.suggestFromCert",i.UI.ahead.suggestFromCert),slots:[t.host]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(h,{template:v("radar.proposalNamedIn",i.UI.radar.proposalNamedIn),slots:[t.file,String(t.line)]})," ",(0,a.jsx)(h,{template:v("radar.proposalIn",i.UI.radar.proposalIn),slots:[t.project]})]})}),t.changed&&(0,a.jsx)("span",{className:"changed",children:(0,a.jsx)(h,{template:v("radar.proposalChanged",i.UI.radar.proposalChanged),slots:[t.changed.before,t.changed.after]})})]}),(0,a.jsx)("div",{className:"acts",children:m?(0,a.jsx)("span",{className:"ok-line",children:m}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("button",{className:"b2",disabled:u,onClick:()=>{d(t),f(v("ahead.suggestFilled",i.UI.ahead.suggestFilled)),j()},children:(0,a.jsx)(r.T,{k:"ahead.suggestAdd",en:i.UI.ahead.suggestAdd})}),(0,a.jsx)("button",{className:"b2 q",...(0,c.uN)(w.ignore),disabled:u,onClick:b,children:(0,a.jsx)(r.T,{k:"ahead.suggestNo",en:i.UI.ahead.suggestNo})})]})}),g&&(0,a.jsx)("span",{className:"error-line",style:{flexBasis:"100%"},children:g})]})}function g(e){let{id:t,p:n,cockpit:d}=e,[u,p]=(0,s.useState)(null),[m,f]=(0,s.useState)(null),[g,y]=(0,s.useState)(null),v=(0,r.kj)(),w=(0,r.cO)(),x=(0,s.useRef)(null);(0,s.useEffect)(()=>()=>{x.current&&clearTimeout(x.current)},[]);let j=()=>{x.current=setTimeout(()=>d.resolveRow(t),1400)},b=async()=>{var e;p("watch"),y(null);let t=await d.post({action:"addUrl",url:n.url});p(null),t.ok?(f(v("site.added",i.UI.radar.siteAdded)),d.readHealth(),j()):y(null!=(e=t.message)?e:v("common.somethingWrong",i.UI.common.somethingWrong))},k=async()=>{var e;p("decline"),y(null);let t=await d.post({action:"declineSite",host:n.host,citation:n.citation});p(null),t.ok?(f(v("site.setAside",i.UI.radar.proposalSetAside)),j()):y(null!=(e=t.message)?e:v("common.somethingWrong",i.UI.common.somethingWrong))};return(0,a.jsxs)("div",{className:"need propose",children:[(0,a.jsx)("span",{className:"glyph","aria-hidden":!0,children:(0,a.jsx)(o.F,{name:"sites"})}),(0,a.jsxs)("div",{className:"txt",children:[(0,a.jsx)("b",{children:(0,a.jsx)(l.B,{children:n.host})}),(0,a.jsxs)("span",{children:[(0,a.jsx)(h,{template:v("radar.proposalNamedIn",i.UI.radar.proposalNamedIn),slots:[n.file,String(n.line)]})," ",(0,a.jsx)(h,{template:v("radar.proposalIn",i.UI.radar.proposalIn),slots:[n.project]})]}),n.changed&&(0,a.jsx)("span",{className:"changed",children:(0,a.jsx)(h,{template:v("radar.proposalChanged",i.UI.radar.proposalChanged),slots:[n.changed.before,n.changed.after]})})]}),(0,a.jsx)("div",{className:"acts",children:m?(0,a.jsx)("span",{className:"ok-line",children:m}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("button",{className:"b2",...(0,c.uN)(w.watch),disabled:null!==u,onClick:b,children:"watch"===u?v("site.adding",i.UI.radar.siteAdding):v("site.add",i.UI.radar.siteAdd)}),(0,a.jsx)("button",{className:"b2 q",...(0,c.uN)(w.ignore),disabled:null!==u,onClick:k,children:(0,a.jsx)(r.T,{k:"site.notThisOne",en:i.UI.radar.proposalNotThis})})]})}),g&&(0,a.jsx)("span",{className:"error-line",style:{flexBasis:"100%"},children:g})]})}},7e3:(e,t,n)=>{function a(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:46;if(e.length<=t)return e;let n=Math.floor((t-1)*.6);return"".concat(e.slice(0,t-1-n),"…").concat(e.slice(e.length-n))}function s(e){try{return new URL(e).hostname.toLowerCase()}catch(e){return null}}function i(e){if(!e)return null;let t=e.trim();if(!t)return null;let n=null,a=null,s=/^(?:[^@/]+@)?([A-Za-z0-9._-]+):(?!\/\/)(.+)$/.exec(t);if(s&&!/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(t))n=s[1],a=s[2];else try{let e=new URL(t);n=e.hostname,a=e.pathname}catch(e){return null}let i=(null!=a?a:"").replace(/^\/+/,"").replace(/\/+$/,"").replace(/\.git$/i,"");return n&&i?"".concat(n.toLowerCase(),"/").concat(i.toLowerCase()):null}n.d(t,{Pm:()=>s,oV:()=>a,p8:()=>i})},7064:(e,t,n)=>{n.d(t,{vC:()=>U,fV:()=>A,Ay:()=>F,cB:()=>C});var a=n(5155),s=n(2115),i=n(2696),r=n(23),l=n(436),o=n(5310),c=n(1551);let d=[{keys:["g","r"],label:l.UI.keys.goRadar,href:"/radar"},{keys:["g","d"],label:l.UI.keys.goDiscoveries,href:"/discoveries"},{keys:["g","e"],label:l.UI.keys.goReport,href:"/report"},{keys:["g","a"],label:l.UI.keys.goAhead,href:"/ahead"},{keys:["g","s"],label:l.UI.keys.goSettings,href:"/settings"}],u=[{keys:["s"],label:l.UI.keys.doScan,labelKey:"appbar.scan"},{keys:["c"],label:l.UI.keys.doCopy,labelKey:"keys.doCopy"},{keys:["?"],label:l.UI.keys.doHelp,labelKey:"keys.doHelp"},{keys:["Esc"],label:l.UI.keys.doEsc,labelKey:"keys.doEsc"}],h="af360-shortcuts";function p(e){let{cockpit:t}=e,[n,p]=(0,s.useState)(!1),[m,f]=(0,s.useState)(null),g=(0,s.useRef)(null),y=(0,o.kj)(),v=(0,s.useContext)(U);return(0,s.useEffect)(()=>{let e=e=>{f(e),setTimeout(()=>f(t=>t===e?null:t),4500)},a=async()=>{let n=(0,r.sp)(t.projects,Date.now());if(!n||n.stale||t.demo){null==e||e(y("keys.noProject",l.UI.keys.noProject));return}let a=await (0,i.CQ)(t,n.project,e,v,y);if(null!==a)try{await navigator.clipboard.writeText(a)}catch(t){null==e||e(l.UI.session.copyFailed)}},s=e=>{if(e.ctrlKey||e.metaKey||e.altKey)return;if("Escape"===e.key){n&&(p(!1),e.preventDefault());return}if(function(e){if(!e||"string"!=typeof e.tagName)return!1;let t=e.tagName.toLowerCase();return"input"===t||"textarea"===t||"select"===t||!0===e.isContentEditable}(e.target))return;let s=Date.now(),i=g.current&&s-g.current.ts<1400?g.current.key:null;if(g.current=null,"g"===i){let t=d.find(t=>t.keys[1]===e.key.toLowerCase());if(t){var r;e.preventDefault(),r=t.href,window.location.href=r}return}let l=e.key;if("?"===l){e.preventDefault(),p(e=>!e);return}if("g"===l.toLowerCase()){g.current={key:"g",ts:s};return}if("s"===l.toLowerCase()){e.preventDefault(),t.refresh(!0);return}if("c"===l.toLowerCase()){e.preventDefault(),a();return}},o=()=>p(!0);return window.addEventListener("keydown",s),window.addEventListener(h,o),()=>{window.removeEventListener("keydown",s),window.removeEventListener(h,o)}},[t,n]),(0,a.jsxs)(a.Fragment,{children:[m&&(0,a.jsx)("div",{className:"toast",role:"status",children:m}),n&&(0,a.jsx)("div",{className:"confirm-overlay",role:"dialog","aria-modal":"true","aria-label":y("keys.title",l.UI.keys.aria),onClick:e=>{e.target===e.currentTarget&&p(!1)},children:(0,a.jsxs)("div",{className:"confirm keysheet",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{children:y("keys.title",l.UI.keys.title)}),(0,a.jsx)("p",{className:"keysub",children:y("keys.sub",l.UI.keys.sub)})]}),(0,a.jsxs)("div",{className:"keygroup",children:[(0,a.jsx)("div",{className:"k",children:y("keys.rooms",l.UI.keys.rooms)}),d.map(e=>(0,a.jsxs)("div",{className:"keyrow",children:[(0,a.jsxs)("span",{className:"keys",children:[(0,a.jsx)("span",{className:"kbd",children:e.keys[0]}),"+",(0,a.jsx)("span",{className:"kbd",children:e.keys[1]})]}),(0,a.jsx)("span",{children:(0,a.jsx)(o.T,{k:(0,c.DX)(e.href),en:e.label})})]},e.href))]}),(0,a.jsxs)("div",{className:"keygroup",children:[(0,a.jsx)("div",{className:"k",children:y("keys.actions",l.UI.keys.actions)}),u.map(e=>(0,a.jsxs)("div",{className:"keyrow",children:[(0,a.jsx)("span",{className:"keys",children:(0,a.jsx)("span",{className:"kbd",children:e.keys[0]})}),(0,a.jsx)("span",{children:y(e.labelKey,e.label)})]},e.label))]}),(0,a.jsx)("div",{className:"setup-actions",children:(0,a.jsx)("button",{className:"b accent",onClick:()=>p(!1),children:y("btn.close",l.UI.keys.close)})})]})})]})}var m=n(7861),f=n(8938);let g="af360-favicon";function y(e){let{cockpit:t}=e,n=t.configFault||!t.attention?"unknown":"QUIET"===t.attention.state?"quiet":"needs";return(0,s.useEffect)(()=>{let e=document.getElementById(g);e||((e=document.createElement("link")).id=g,e.rel="icon",e.type="image/svg+xml",document.head.appendChild(e));let t=(0,f.CV)(n);e.href!==t&&(e.href=t),document.documentElement.dataset.favicon=n},[n]),null}var v=n(5163),w=n(7470),x=n(4576),j=n(4881),b=n(3034),k=n(5834),N=n(797),I=n(6400),S=n(8713);let U=(0,s.createContext)(!1),T=(0,s.createContext)(0);function C(){return(0,s.useContext)(T),Date.now()}function A(e){let{ts:t,skewForm:n="at"}=e,i=C(),r=(0,s.useContext)(U),c=(0,o.kj)(),d="core"===n?c("shell.clockSkewCore",l.UI.shell.clockSkewCore):c("shell.clockSkew",l.UI.shell.clockSkew),u=(0,w.nW)(t,i)?d:(0,w.fF)(t,i);return(0,a.jsx)("span",{...(0,N.uN)(r?(0,w.Rq)(t):void 0),children:u})}function L(e){e?document.documentElement.removeAttribute("data-theme"):document.documentElement.setAttribute("data-theme","light")}function E(){try{return"day"!==localStorage.getItem("af360-theme")}catch(e){return!0}}function F(e){var t,n,i;let{active:r,cockpit:d,children:u}=e,[f,g]=(0,s.useState)(!1),[w,x]=(0,s.useState)(!0),[k,C]=(0,s.useState)(()=>Date.now()),A=d.attention;(0,s.useEffect)(()=>{if(new URLSearchParams(window.location.search).has("demo"))return;let e=!0;return fetch("/api/consent",{cache:"no-store"}).then(e=>e.json()).then(t=>{e&&t&&"boolean"==typeof t.accepted&&(t.accepted||"unreadable"===t.reason||window.location.replace("/welcome"))}).catch(()=>{}),()=>{e=!1}},[]),(0,s.useEffect)(()=>{let e=setInterval(()=>C(Date.now()),1e4);return()=>clearInterval(e)},[]),(0,s.useEffect)(()=>{try{let e=E();g("dev"===localStorage.getItem("af360-mode")),x(e),L(e)}catch(e){}let e=()=>{try{g("dev"===localStorage.getItem("af360-mode"))}catch(e){}},t=()=>{let e=E();x(e),L(e)};return window.addEventListener("af360-mode",e),window.addEventListener("af360-theme",t),()=>{window.removeEventListener("af360-mode",e),window.removeEventListener("af360-theme",t)}},[]);let F=(0,c.$c)(null==(t=d.cfg)?void 0:t.lang),H=(0,o.qN)(F);(0,s.useEffect)(()=>{let e=document.documentElement;e.setAttribute("lang",F),"ar"===F?e.setAttribute("data-lang","ar"):e.removeAttribute("data-lang")},[F]),(0,s.useEffect)(()=>{var e;let t=null==(e=window.chrome)?void 0:e.webview;if((null==t?void 0:t.postMessage)&&A)try{t.postMessage(JSON.stringify({state:A.state,theme:w?"night":"day"}))}catch(e){}},[null==A?void 0:A.state,w]);let O=e=>{g(e);try{localStorage.setItem("af360-mode",e?"dev":"simple")}catch(e){}window.dispatchEvent(new Event("af360-mode"))},W=()=>{let e=!w;x(e);try{localStorage.setItem("af360-theme",e?"night":"day")}catch(e){}L(e),window.dispatchEvent(new Event("af360-theme"))},q=!A||(0,v.yy)(A)?"idle":"INCIDENT"===A.state?"incident":"NEEDS_YOU"===A.state||"SAFETY"===A.state?"needs":"quiet",z=(null==A?void 0:A.state)==="SAFETY"?A.safety:null!=(i=null==A?void 0:A.open)?i:0,G=A&&z>0?(0,a.jsx)("span",{className:"n".concat("INCIDENT"===A.state?" bad":""),children:z}):null,V=e=>d.configFault?null:e,J={projects:d.radar?V(d.projects.length):null,sites:d.health?V(d.urls.length):null,discoveries:d.insights?V((0,I.yr)(d.insights).length):null,ahead:V((0,S.LZ)(null==(n=d.expiry)?void 0:n.items)),connections:V((0,S.RI)(d.clients,d.connectors))},Y=e=>{let t=e.count?J[e.count]:null;return(0,a.jsxs)("a",{href:e.href,className:r===e.href?"on":"",children:[(0,a.jsx)(j.F,{name:e.icon})," ",(0,a.jsx)(o.T,{k:(0,c.DX)(e.href),en:e.label}),"/radar"===e.href&&(0,a.jsxs)(a.Fragment,{children:[" ",G]}),null!==t&&(0,a.jsx)("span",{className:"cnt",children:(0,a.jsx)(b.V,{n:t})})]},e.href)};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"horizon ".concat(q),"aria-hidden":!0}),(0,a.jsxs)(o.sJ.Provider,{value:F,children:[(0,a.jsxs)("div",{className:"shell",children:[(0,a.jsxs)("aside",{className:"side",children:[(0,a.jsx)(y,{cockpit:d}),(0,a.jsx)(m.o,{scanning:d.scanning}),(0,a.jsx)("nav",{className:"nav","aria-label":(0,c.tr)(F,"nav.aria",l.UI.shell.navAria),children:l.Ac.map(Y)}),(0,a.jsxs)("div",{className:"siderow",children:[(0,a.jsxs)("div",{className:"modeseg",role:"group","aria-label":(0,c.tr)(F,"seg.modeAria",l.UI.shell.modeAria),children:[(0,a.jsx)("button",{className:f?"":"on","aria-pressed":!f,onClick:()=>O(!1),...(0,N.uN)(H.simpleMode),children:(0,a.jsx)(o.T,{k:"seg.simple",en:l.UI.shell.modeSimple})}),(0,a.jsx)("button",{className:f?"on":"","aria-pressed":f,onClick:()=>O(!0),...(0,N.uN)(H.devMode),children:(0,a.jsx)(o.T,{k:"seg.dev",en:l.UI.shell.modeDev})})]}),(0,a.jsxs)("div",{className:"modeseg",role:"group","aria-label":(0,c.tr)(F,"seg.themeAria",l.UI.shell.themeAria),children:[(0,a.jsx)("button",{className:w?"":"on","aria-pressed":!w,onClick:()=>{w&&W()},...(0,N.uN)(H.theme),children:(0,a.jsx)(o.T,{k:"seg.day",en:l.UI.shell.themeDay})}),(0,a.jsx)("button",{className:w?"on":"","aria-pressed":w,onClick:()=>{w||W()},...(0,N.uN)(H.theme),children:(0,a.jsx)(o.T,{k:"seg.night",en:l.UI.shell.themeNight})})]}),(0,a.jsx)("button",{className:"kbtn",type:"button",...(0,N.uN)((0,c.tr)(F,"appbar.shortcutsTip",l.UI.appbar.shortcutsTip)),onClick:()=>window.dispatchEvent(new Event(h)),children:(0,a.jsx)(o.T,{k:"appbar.shortcuts",en:l.UI.appbar.shortcuts})})]}),(0,a.jsx)("div",{className:"nav nav-pinned",children:l.Lf.map(Y)}),(0,a.jsx)("div",{className:"side-foot",children:(0,a.jsxs)("div",{className:"foot",children:[(0,a.jsx)(m.Brand,{})," ",(0,a.jsx)(o.T,{k:"foot.by",en:l.UI.shell.footBy})," ",(0,a.jsx)(P,{}),(0,a.jsx)("br",{}),(0,a.jsx)(o.T,{k:"foot.line",en:l.UI.shell.footLine})]})})]}),(0,a.jsx)(T.Provider,{value:k,children:(0,a.jsxs)(U.Provider,{value:f,children:[(0,a.jsxs)("main",{children:[(0,a.jsx)(R,{active:r,cockpit:d}),(0,a.jsx)(D,{cockpit:d}),d.configFault?(0,a.jsx)(M,{fault:d.configFault,onRetry:()=>d.refresh(!1)}):u,(0,a.jsx)(p,{cockpit:d})]}),(0,a.jsx)(B,{cockpit:d})]})})]}),(0,a.jsx)(N.H_,{})]})]})}function R(e){let{active:t,cockpit:n}=e,s=(0,l.TX)(t),{radar:i,scanning:r}=n,d=(0,o.kj)(),u=(0,o.cO)();return(0,a.jsxs)("div",{className:"appbar","aria-label":d("appbar.aria",l.UI.appbar.aria),children:[(0,a.jsx)(m.o,{scanning:r,className:"sm"}),s&&(0,a.jsx)("span",{className:"room","aria-label":d("appbar.roomAria",l.UI.appbar.roomAria),children:(0,a.jsx)(o.T,{k:(0,c.DX)(t),en:s})}),(0,a.jsxs)("div",{className:"right",children:[i&&(0,a.jsxs)("span",{className:"looked",...(0,N.uN)(u.looked),children:[(0,a.jsx)(o.T,{k:"appbar.looked",en:l.UI.radar.looked})," ",(0,a.jsx)(A,{ts:i.scannedAt})]}),(0,a.jsx)("button",{className:"scan",onClick:()=>n.refresh(!0),disabled:r,...(0,N.uN)(u.scanNow),children:r?(0,a.jsx)(k.h,{children:d("appbar.scanning",l.UI.common.scanning)}):d("appbar.scan",l.UI.radar.scanNow)})]})]})}function D(e){let{cockpit:t}=e,n=(0,o.kj)(),i=t.configRecovered,r=(0,s.useRef)(null),[c,d]=(0,s.useState)(!1);return((0,s.useEffect)(()=>{if(!i)return;let e="".concat(i.path,"|").concat(i.reason);r.current!==e&&(r.current=e,d(!0))},[i]),c&&i)?(0,a.jsx)("p",{className:"banner",role:"status",children:n("fault.recovered",l.UI.configFault.recovered)}):null}function M(e){let{fault:t,onRetry:n}=e,s=(0,o.kj)();return(0,o.cO)(),(0,a.jsxs)("div",{className:"empty",children:[(0,a.jsx)("p",{className:"invite",children:(0,a.jsx)(o.T,{k:"fault.invite",en:l.UI.configFault.invite})}),(0,a.jsx)("p",{children:(0,a.jsx)(o.T,{k:"fault.line",en:l.UI.configFault.line})}),(0,a.jsx)("p",{className:"meta",children:(0,a.jsx)(o.T,{k:"fault.whereLabel",en:l.UI.configFault.whereLabel})}),(0,a.jsx)("p",{className:"path",children:(0,a.jsx)(b.B,{mono:!0,children:t.path})}),(0,a.jsx)("p",{className:"error-line",children:(0,a.jsx)(b.B,{children:t.reason})}),(0,a.jsx)("p",{className:"meta",children:(0,a.jsx)(o.T,{k:"fault.fixLead",en:l.UI.configFault.fixLead})}),(0,a.jsx)("p",{children:(0,a.jsx)(o.T,{k:"fault.fixOpen",en:l.UI.configFault.fixOpen})}),(0,a.jsx)("p",{children:(0,a.jsx)(o.T,{k:"fault.fixRestore",en:l.UI.configFault.fixRestore})}),(0,a.jsx)("p",{children:(0,a.jsx)(o.T,{k:"fault.fixRename",en:l.UI.configFault.fixRename})}),(0,a.jsx)("button",{className:"btn primary",onClick:n,children:s("btn.retry",l.UI.configFault.retry)})]})}function P(){let e=(0,o.kj)(),[t,n]=(0,s.useState)("idle");(0,s.useEffect)(()=>{if("idle"===t)return;let e=setTimeout(()=>n("idle"),2200);return()=>clearTimeout(e)},[t]);let i=async()=>{try{await navigator.clipboard.writeText(x.pA),n("done")}catch(e){n("failed")}};return(0,a.jsx)("button",{className:"link",type:"button",...(0,N.uN)(x.pA),onClick:()=>void i(),children:"done"===t?e("btn.copied",l.UI.session.copied):"failed"===t?e("btn.copyFailed",l.UI.session.copyFailed):l.UI.shell.footBrand})}function H(e){var t;let{coverage:n}=e,s=null!=(t=null==n?void 0:n.unreadable)?t:0,i=s>0?(0,a.jsx)(b.En,{children:" \xb7 ".concat(l.UI.shell.railLogUnreadable(s))}):null;if(!n)return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.T,{k:"rail.logUnknown",en:l.UI.shell.railLogUnknown}),i]});if("full"===n.state)return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.T,{k:"rail.log",en:l.UI.shell.railLog}),i]});if("empty"===n.state)return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.T,{k:"rail.logEmpty",en:l.UI.shell.railLogEmpty}),i]});let r=n.oldestTs;if(null===r)return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.T,{k:"rail.logUnknown",en:l.UI.shell.railLogUnknown}),i]});let c=Date.now()-r<864e5,d=c?new Date(r).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"}):new Date(r).toLocaleDateString("en-US",{weekday:"long"}),u="truncated"===n.state?l.UI.shell.railLogTruncated(d):c?l.UI.shell.railLogSinceTime(d):l.UI.shell.railLogSince(d);return(0,a.jsx)(b.En,{children:u+(s>0?" \xb7 ".concat(l.UI.shell.railLogUnreadable(s)):"")})}function B(e){var t,n,i,r,c;let{cockpit:d}=e,{radar:u,urls:h,insights:p,events:m,cfg:f,attention:g,scanning:y}=d,v=(0,I.yr)(p),x=(0,o.kj)(),j=(0,o.cO)(),[S,U]=(0,s.useState)(()=>Date.now());(0,s.useEffect)(()=>{let e=setInterval(()=>U(Date.now()),1e3);return()=>clearInterval(e)},[]);let T=h.reduce((e,t)=>t.current&&(!(null==e?void 0:e.current)||t.current.ts>e.current.ts)?t:e,null),C=T?T.entry.label||function(e){try{return new URL(e).hostname}catch(t){return e}}(T.entry.url):null,L=d.configFault,E=d.watching.folders.length,F=d.missingRoots,R=g?"QUIET"===g.state?"\xb7 quiet":"INCIDENT"===g.state?"\xb7 incident":"SAFETY"===g.state?"\xb7 ".concat(g.safety," safety finding").concat(1===g.safety?"":"s"):"\xb7 ".concat(g.open," need you"):"",D=(null==T?void 0:T.current)&&!(0,w.nW)(T.current.ts,S)?Math.max(0,Math.ceil((T.current.ts+6e4-S)/1e3)):null,M=(null!=(r=null==f?void 0:f.scanIntervalHours)?r:24)*36e5,P=u&&!(0,w.nW)(u.scannedAt,S)?Math.max(0,Math.ceil((u.scannedAt+M-S)/6e4)):null,B=null==(t=d.expiry)?void 0:t.items.find(e=>"ssl"===e.kind),O=(null!=m?m:[]).filter(e=>S-e.ts<864e5),W=null!=(c=O.find(e=>"mcp"===e.kind))?c:null;return(0,a.jsxs)("aside",{className:"rail","aria-label":x("rail.live",l.UI.shell.railAria),children:[(0,a.jsxs)("h3",{children:[(0,a.jsx)("i",{})," ",(0,a.jsx)(o.T,{k:"rail.live",en:l.UI.shell.railLive})]}),(0,a.jsxs)("div",{className:"pulse",children:[L&&(0,a.jsxs)("div",{className:"pl",children:[(0,a.jsx)(o.T,{k:"rail.configFault",en:l.UI.shell.railConfigFault})," ",(0,a.jsxs)("span",{className:"dim-t",children:["\xb7 ",(0,a.jsx)(o.T,{k:"rail.configFaultSub",en:l.UI.shell.railConfigFaultSub})]})]}),!L&&y&&(0,a.jsx)("div",{className:"pl now",children:(0,a.jsx)(b.En,{children:l.UI.stream.railScan(E,h.length)})}),!L&&!y&&(null==T?void 0:T.current)&&(0,a.jsx)("div",{className:"pl now",children:(0,a.jsxs)(b.En,{children:["checking ",(0,a.jsx)(b.B,{children:C}),(0,a.jsx)(k.g,{})," ",T.current.ok?(0,a.jsxs)("span",{className:"ok-t",children:[(0,a.jsxs)(b.B,{mono:!0,children:[T.current.ms," ms"]})," ✓"]}):(null==(n=d.health)?void 0:n.offline)?(0,a.jsx)("span",{className:"dim",children:"no answer - this machine is offline"}):(0,a.jsx)("span",{className:"bad-t",children:"down ✗"})]})}),!L&&W&&S-W.ts<12e4&&(0,a.jsx)("div",{className:"pl now",children:(0,a.jsx)(b.En,{children:W.text})}),!L&&u&&(0,a.jsx)("div",{className:"pl",children:(0,a.jsxs)(b.En,{children:["watching ",(0,a.jsx)(b.V,{n:E})," folder",1===E?"":"s"," ",(0,a.jsx)("span",{className:"dim-t",children:R})]})}),!L&&u&&(0,a.jsxs)("div",{className:"pl",children:[(0,a.jsx)(o.T,{k:"rail.swept",en:l.UI.shell.railSwept})," ",(0,a.jsxs)("span",{className:"dim-t",children:["\xb7 ",(0,a.jsx)(b.En,{children:(0,a.jsx)(A,{ts:u.scannedAt})})]})]}),!L&&p&&v.length>0&&(0,a.jsx)("div",{className:"pl",children:(0,a.jsxs)(b.En,{children:[v.length," discover",1===v.length?"y":"ies"," held"]})}),!L&&(null==(i=d.pulse)?void 0:i.visible)&&d.pulse.text&&(0,a.jsx)("div",{className:"pl",children:(0,a.jsx)(b.En,{children:d.pulse.text})}),F.map(e=>(0,a.jsxs)("div",{className:"pl",children:[(0,a.jsxs)(b.En,{children:[(0,a.jsx)(b.B,{children:function(e){var t;let n=e.split(/[\\/]/).filter(Boolean);return null!=(t=n[n.length-1])?t:e}(e)})," folder"]})," ",(0,a.jsx)("span",{className:"dim-t",children:(0,a.jsx)(o.T,{k:"rail.missing",en:l.UI.shell.railMissing})})]},e))]}),(0,a.jsxs)("div",{className:"raillog",children:[(0,a.jsxs)("h3",{children:[(0,a.jsx)(H,{coverage:d.logCoverage}),d.logReadAt?(0,a.jsx)("span",{className:"dim-t railread",children:(0,a.jsxs)(b.En,{children:["read ",(0,a.jsx)(A,{ts:d.logReadAt})]})}):null]}),(0,a.jsx)("div",{className:"raillist",children:L?null:0===O.length?(null==u?void 0:u.scannedAt)?(0,a.jsxs)("div",{className:"pl",children:[(0,a.jsx)(b.En,{children:l.UI.stream.railWatchedNothing(new Date(u.scannedAt).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"}))}),(null==g?void 0:g.state)==="QUIET"?(0,a.jsxs)("span",{className:"dim-t",children:[" \xb7 ",(0,a.jsx)(o.T,{k:"rail.quietSub",en:l.UI.shell.railQuietSub})]}):null]}):(0,a.jsxs)("div",{className:"pl",children:[(0,a.jsx)(o.T,{k:"rail.noRecord",en:l.UI.shell.railNoRecord})," ",(0,a.jsxs)("span",{className:"dim-t",children:["\xb7 ",(0,a.jsx)(o.T,{k:"rail.noRecordSub",en:l.UI.shell.railNoRecordSub})]})]}):O.map(e=>(0,a.jsx)("div",{className:"pl",children:(0,a.jsxs)(b.En,{children:[(0,a.jsx)("span",{className:"dim-t",children:(0,a.jsx)(A,{ts:e.ts})})," \xb7 ",e.text]})},e.ts+e.text))}),(0,a.jsx)("div",{className:"pl",children:(0,a.jsx)("a",{className:"dim-t raillink",href:"/log",children:(0,a.jsx)(o.T,{k:"rail.older",en:l.UI.shell.railOlder})})})]}),(0,a.jsxs)("div",{className:"next",children:[(0,a.jsx)("b",{children:(0,a.jsx)(o.T,{k:"rail.next",en:l.UI.shell.railNext})}),(0,a.jsx)("br",{}),null!==D&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.T,{k:"rail.nextSiteCheck",en:l.UI.shell.railNextSiteCheck})," \xb7 ",(0,a.jsxs)(b.B,{mono:!0,children:[D,"s"]}),(0,a.jsx)("br",{})]}),null!==P&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.T,{k:"rail.nextScan",en:l.UI.shell.railNextScan})," \xb7 ",(0,a.jsx)(b.B,{mono:!0,children:P<60?"".concat(P," min"):"".concat(Math.round(P/60),"h")}),(0,a.jsx)("br",{})]}),B&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{...(0,N.uN)(j.ssl),children:(0,a.jsx)(o.T,{k:"rail.nextSsl",en:l.UI.shell.railNextSsl})})," \xb7 ",(0,a.jsxs)(b.En,{children:["calm"===B.chip?"calm":"late",", ",(0,a.jsxs)(b.B,{mono:!0,children:[B.daysLeft,"d"]})]})]})]})]})}},7470:(e,t,n)=>{n.d(t,{I:()=>a.I,OL:()=>l,Rq:()=>s,fF:()=>a.fF,l:()=>r,lt:()=>a.lt,nW:()=>a.nW,rq:()=>i});var a=n(9178);function s(e){return new Date("number"==typeof e?e:new Date(e).getTime()).toLocaleString()}function i(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Date.now(),t=new Date("number"==typeof e?e:new Date(e).getTime()),n=e=>String(e).padStart(2,"0");return"".concat(t.getFullYear(),"-").concat(n(t.getMonth()+1),"-").concat(n(t.getDate()))}function r(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Date.now();return i(e)}function l(e){return new Date("number"==typeof e?e:new Date(e).getTime()).toLocaleDateString([],{month:"long",day:"numeric",year:"numeric"})}},7899:(e,t,n)=>{function a(){let e=new URLSearchParams(window.location.search).get("demo");return"empty"===e||"light"===e||"busy"===e?e:null}function s(){return[{id:"c:\\builds\\crypto-experiment",kind:"project",label:"crypto-experiment",snapshot:{uncommitted:16,hasRemote:!1},resurface:{text:"You ignored crypto-experiment at 16 unsaved changes - it's now 40. Still ignore?",current:{uncommitted:40,hasRemote:!1}}}]}n.d(t,{c:()=>a,k:()=>s})},8261:(e,t,n)=>{n.d(t,{Bx:()=>c,X2:()=>r,sx:()=>o});var a=n(5163),s=n(23),i=n(8706);function r(e,t){if(!e)return null;let n=(0,a.yy)(e);if(n)return{commits:0,files:0,projects:0,components:{unpushed:{commits:0,projects:0},unsaved:{files:0,projects:0},unbacked:{projects:0,commits:0}},unmeasured:[],empty:n,zero:!n};let r=new Map(t.map(e=>[e.path.toLowerCase(),e])),l=0,o=0,c=0,d=0,u=0,h=0,p=0,m=0,f=0,g=[];for(let t of(0,s.HU)(e)){let e="project"===t.kind?r.get(t.id):void 0;if(!e)continue;let n=!1;e.statusKnown?e.uncommitted>0&&(h+=e.uncommitted,p++,o+=e.uncommitted,n=!0):g.push({name:e.name,why:"af360 could not read ".concat(e.name,"'s working tree, so its unsaved changes are not in this number"),whyP:(0,i.ph)("radius.unmeasured.status","af360 could not read {0}'s working tree, so its unsaved changes are not in this number",e.name)}),(0,a.ze)(e)?(m++,null!==e.commitCount?(f+=e.commitCount,l+=e.commitCount,n=!0):g.push({name:e.name,why:"af360 could not count ".concat(e.name,"'s commits, so its history is not in this number"),whyP:(0,i.ph)("radius.unmeasured.commits","af360 could not count {0}'s commits, so its history is not in this number",e.name)})):null!==e.ahead?e.ahead>0&&(d+=e.ahead,u++,l+=e.ahead,n=!0):e.isGit&&e.hasRemote&&g.push({name:e.name,why:"".concat(e.name," has no upstream branch set, so af360 cannot tell which of its commits are only here"),whyP:(0,i.ph)("radius.unmeasured.upstream","{0} has no upstream branch set, so af360 cannot tell which of its commits are only here",e.name)}),n&&c++}for(let e of t)e.isGit||e.looksDownloaded||g.some(t=>t.name===e.name)||g.push({name:e.name,why:"".concat(e.name," is not in git, so af360 has no way to tell whether a copy of it exists anywhere else"),whyP:(0,i.ph)("radius.unmeasured.noGit","{0} is not in git, so af360 has no way to tell whether a copy of it exists anywhere else",e.name)});return{commits:l,files:o,projects:c,components:{unpushed:{commits:d,projects:u},unsaved:{files:h,projects:p},unbacked:{projects:m,commits:f}},unmeasured:g,empty:!1,zero:0===l&&0===o}}function l(e){return"".concat(e," project").concat(1===e?"":"s")}function o(e){var t,n;if(e.empty)return{tone:"clean",headline:(0,i.pl)("radius.empty.head","Nothing to lose yet"),under:(0,i.pl)("radius.empty.under","Point af360 at a folder and it will tell you what only exists here.")};if(e.zero){let t=e.unmeasured.length;return{tone:"clean",headline:0===t?(0,i.pl)("radius.zero.head","If this laptop died right now: nothing would be lost."):(0,i.pl)("radius.zero.headPartial","Everything af360 could check has a copy elsewhere"),under:0===t?(0,i.pl)("radius.zero.under","Every project af360 watches also exists somewhere off this machine."):(0,i.ph)("radius.zero.underPartial","Nothing af360 could measure is only on this machine - and it could not measure {0}, so this does not speak for that work.",l(t))}}let a=[];e.commits>0&&a.push((t=e.commits,"".concat(t," commit").concat(1===t?"":"s"))),e.files>0&&a.push((n=e.files,"".concat(n," file").concat(1===n?"":"s")));let s=a.join(", ");return{tone:"amber",headline:(0,i.ph)("radius.head","If this laptop died right now: {0} across {1} - gone forever.",s,l(e.projects)),under:(0,i.pl)("radius.under","That work exists nowhere but this machine.")}}function c(e){if(0===e.unmeasured.length)return null;let t=e.unmeasured.length;return(0,i.ph)("radius.excluded","{0} not included: af360 could not measure {1}.",l(t),1===t?e.unmeasured[0].name:"them this time")}},8706:(e,t,n)=>{n.d(t,{DJ:()=>function e(t,n){var l,o,c;let d=n(t.k);if(void 0===d)return t.en;let u=(null!=(l=t.slots)?l:[]).slice();return t.list&&(u[t.list.slot]=i(t.list.items.map(t=>e(t,n)),null!=(o=n(a.and))?o:s.and,null!=(c=n(a.comma))?c:s.comma)),r(d,u)},DR:()=>c,GS:()=>r,nn:()=>i,ph:()=>l,pl:()=>o,v1:()=>s,wo:()=>a});let a={and:"join.and",comma:"join.comma"},s={and:" and ",comma:", "};function i(e,t,n){return 0===e.length?"":1===e.length?e[0]:e.slice(0,-1).join(n)+t+e[e.length-1]}function r(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return e.replace(/\{(\d+)\}/g,(e,n)=>{let a=t[Number(n)];return void 0===a?e:String(a)})}function l(e,t){for(var n=arguments.length,a=Array(n>2?n-2:0),s=2;s<n;s++)a[s-2]=arguments[s];return{k:e,en:r(t,a),slots:a}}function o(e,t){return{k:e,en:t}}function c(e,t){let n=e=>e.indexOf("/")>0?e.slice(0,e.indexOf("/")):"",a=e=>e.indexOf("/")>0?e.slice(e.indexOf("/")+1):e;return new Set(e.map(n).filter(Boolean)).size<=1?e.map(a):e.map(e=>n(e)?r(t,[a(e),n(e)]):e)}},8713:(e,t,n)=>{n.d(t,{DT:()=>r,LZ:()=>s,RI:()=>l,iw:()=>i,x3:()=>a});let a=e=>e.daysLeft<=90;function s(e){return Array.isArray(e)?e.filter(a).length:null}function i(e){return Array.isArray(e)?e.filter(e=>e.installed):[]}function r(e){return Array.isArray(e)?i(e).length:null}function l(e,t){let n=r(e),a=Array.isArray(t)?(Array.isArray(t)?t.filter(e=>e.connected):[]).length:null;return null===n||null===a?null:n+a}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2036],{5964:(e,a,t)=>{t.d(a,{dK:()=>c});let n="[secret masked]";function c(e){let a=e;return(a=(a=(a=(a=(a=(a=(a=(a=(a=a.replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g,n)).replace(/\b([A-Za-z0-9_.-]*(?:SECRET|TOKEN|PASSWORD|PASSWD|API[_-]?KEY|APIKEY|ACCESS[_-]?KEY|PRIVATE[_-]?KEY|CLIENT[_-]?SECRET|AUTH|CREDENTIAL|[A-Z0-9]_KEY|^KEY)[A-Za-z0-9_.-]*)(\s*[:=]\s*)(["'`]?)([^\s"'`,;]{4,})\3/gi,(e,a,t)=>"".concat(a).concat(t).concat(n))).replace(/\b([A-Za-z0-9_.-]*(?:URL|URI|DSN|CONN)[A-Za-z0-9_.-]*)(\s*[:=]\s*)(["'`]?)([^\s"'`,;]{4,})\3/gi,(e,a,t)=>/[A-Za-z]/.test(a)&&(a.includes("_")||a===a.toUpperCase())?"".concat(a).concat(t).concat(n):e)).replace(/\b([A-Za-z][A-Za-z0-9+.-]*):\/\/([^\s/:@]{1,128}):([^\s/@]{1,256})@/g,(e,a,t)=>"".concat(a,"://").concat(t,":").concat(n,"@")).replace(/(^|[\s(<'"`=,])([A-Za-z0-9._%+-]{1,64}):([^\s:@/\\]{4,128})@((?:[A-Za-z0-9-]+\.)+[A-Za-z]{2,}|\d{1,3}(?:\.\d{1,3}){3}|localhost)(?=[:/?\s'"`)>,]|$)/g,(e,a,t,c,s)=>"".concat(a).concat(t,":").concat(n,"@").concat(s))).replace(/gh[pousr]_[A-Za-z0-9]{16,}|github_pat_[A-Za-z0-9_]{20,}/g,n)).replace(RegExp("(?<![A-Za-z0-9])(AKIA[0-9A-Z]{12,}|ASIA[0-9A-Z]{12,}|sk_(?:live|test)_[0-9A-Za-z]{10,}|rk_(?:live|test)_[0-9A-Za-z]{10,}|pk_live_[0-9A-Za-z]{10,}|glpat-[A-Za-z0-9_-]{16,}|AIza[0-9A-Za-z_-]{30,}|ya29\\.[0-9A-Za-z_-]{20,}|xox[baprs]-[0-9A-Za-z-]{8,}|npm_[A-Za-z0-9]{30,}|dop_v1_[a-f0-9]{40,}|SG\\.[A-Za-z0-9_-]{20,}\\.[A-Za-z0-9_-]{20,}|hf_[A-Za-z0-9]{30,}|sk-ant-[A-Za-z0-9_-]{20,}|sk-[A-Za-z0-9]{32,})(?![A-Za-z0-9])","g"),n)).replace(/\b(bearer|basic)\s+[A-Za-z0-9._~+/=-]{12,}/gi,(e,a)=>"".concat(a," ").concat(n))).replace(RegExp("(?<![A-Za-z0-9])eyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}(?![A-Za-z0-9])","g"),n)).replace(RegExp("(?<![A-Za-z0-9])[0-9a-f]{32,}(?![A-Za-z0-9])","gi"),n)).replace(RegExp("(?<![A-Za-z0-9])[A-Za-z0-9+/]{40,}={0,2}(?![A-Za-z0-9+/=])","g"),n)}},9129:(e,a,t)=>{t.d(a,{K:()=>r});var n=t(2115),c=t(9378),s=t(7899);function r(e){var a,t;let[r,i]=(0,n.useState)(null),[o,l]=(0,n.useState)(null),u=(0,s.c)(),p=!!e.attention&&!!e.radar&&!!e.expiry,h=(null!=(t=null==(a=e.attention)?void 0:a.items)?t:[]).map(e=>e.id).join("|");return(0,n.useEffect)(()=>{var a,t;if(!p)return;let n=(0,c.eY)(e.attention.items,(0,c.fL)({projects:e.projects,urls:e.urls,expiryIds:(null!=(t=null==(a=e.expiry)?void 0:a.items)?t:[]).map(e=>e.id),missingRoots:e.missingRoots}),Date.now());l(n);let s=!0;return fetch(u?"/api/check?demo=".concat(u):"/api/check",{cache:"no-store"}).then(e=>e.json()).then(e=>{if(!s)return;let a=(null==e?void 0:e.snapshot)&&"number"==typeof e.snapshot.ts?e.snapshot:null;i((0,c.Xq)(a,n))}).catch(()=>{s&&i((0,c.Xq)(null,n))}),()=>{s=!1}},[p,h,u]),{delta:r,remember:()=>{u||e.demo||!o||fetch("/api/check",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({snapshot:o})}).catch(()=>{})}}}},9378:(e,a,t)=>{t.d(a,{Xq:()=>i,eY:()=>r,fL:()=>s,lz:()=>o});var n=t(436),c=t(8706);function s(e){let a=[];for(let t of e.projects)t.remoteKnown&&t.statusKnown&&a.push(t.path.toLowerCase());for(let t of e.urls)t.current&&a.push(t.entry.id);for(let t of(a.push(...e.expiryIds),e.missingRoots))a.push("missing:".concat(t.toLowerCase()));return a}function r(e,a,t){let n={};for(let a of e)a.handled||(n[a.id]=a.label);return{ts:t,items:n,measured:a}}function i(e,a){let t=Object.keys(a.items).length;if(!e)return{first:!0,since:null,cleared:[],appeared:[],remaining:t,unmeasured:0};let n=new Set(e.measured),c=new Set(a.measured),s=e=>{let a=e.startsWith("resurface:")?e.slice(10):e;return n.has(a)&&c.has(a)},r=[],i=[],o=0;for(let[t,n]of Object.entries(e.items))if(!(t in a.items)){if(!s(t)){o++;continue}r.push(n)}for(let[t,n]of Object.entries(a.items))if(!(t in e.items)){if(!s(t)){o++;continue}i.push(n)}return{first:!1,since:e.ts,cleared:r,appeared:i,remaining:t,unmeasured:o}}function o(e,a,t){if(e.first)return a("check.first",n.UI.check.first);let s=a(c.wo.and,c.v1.and),r=a(c.wo.comma,c.v1.comma),i=[(0,c.GS)(a("check.since",n.UI.check.since),[t])];return e.cleared.length>0&&i.push((0,c.GS)(a("check.cleared",n.UI.check.cleared),[(0,c.nn)(e.cleared,s,r)])),e.appeared.length>0&&i.push((0,c.GS)(a("check.appeared",n.UI.check.appeared),[(0,c.nn)(e.appeared,s,r)])),0===e.cleared.length&&0===e.appeared.length&&0===e.unmeasured&&i.push(a("check.unchanged",n.UI.check.unchanged)),i.push((0,c.GS)(a("check.remaining",n.UI.check.remaining),[e.remaining])),e.unmeasured>0&&i.push((0,c.GS)(a("check.unmeasured",n.UI.check.unmeasured),[e.unmeasured])),i.join(" ")}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3192],{436:(e,t,o)=>{o.d(t,{Ac:()=>a,Lf:()=>i,TX:()=>r,UI:()=>d,eV:()=>c});var n=o(9178);let a=[{href:"/radar",icon:"radar",label:"Radar"},{href:"/projects",icon:"projects",label:"Projects",count:"projects"},{href:"/sites",icon:"sites",label:"Sites",count:"sites"},{href:"/discoveries",icon:"discoveries",label:"Discoveries",count:"discoveries"},{href:"/connections",icon:"connections",label:"Connections",count:"connections"},{href:"/report",icon:"report",label:"Estate Report"},{href:"/ahead",icon:"ahead",label:"Ahead",count:"ahead"},{href:"/log",icon:"log",label:"Log"}],i=[{href:"/settings",icon:"settings",label:"Settings"}],s=[];function r(e){var t,o;return null!=(o=null==(t=[...a,...i,...s].find(t=>t.href===e))?void 0:t.label)?o:""}let c={unsaved:"Changes you have made but not saved into the project's history yet.",deleted:"Files that were in this project and are not on the disk any more. If they were committed, git still holds them.",unpushed:"Saved on this machine, but not sent to the online copy yet.",onlyHere:"There is no online copy. If this disk failed, the work would be gone.",noHistory:"This folder has no version history, so there is nothing to go back to.",dormant:"Nothing has changed in this project for a long time.",duplicate:"Another folder on this machine holds the same repository - af360 read both remotes and they match.",sharesName:"A folder elsewhere on this machine has the same name, and af360 read both remotes: it is a different repository, not a copy.",clean:"Nothing af360 watches is waiting to be saved or pushed.",downloadedCopy:"This looks like something you downloaded rather than something you wrote.",remote:"Whether this project's history also lives on a remote you push to - the copy that survives this machine.",ignore:"Stop mentioning this. It stays scanned, and comes back only if it changes.",later:"Quiet this until tomorrow. The row stays here, dimmed, and stops counting.",watch:"Add this folder so af360 looks at it on every scan.",unwatch:"Stop looking at this. It is only removed from af360, never from your disk.",check:"Mark that you have seen this and are dealing with it.",pin:"Keep this at the top of the list.",copyPath:"Copy this folder's location so you can paste it elsewhere.",scanNow:"Look at every watched folder, site and date again right now.",details:"Show what was seen, and what is worth doing about it.",fix:"See what is happening here and what to do about it.",copyCommands:"Put these exact commands on your clipboard, ready to paste into a terminal.",looked:"the last full look at your folders - sites are checked every minute while af360 is running",copyContext:"Put a short brief about this project on your clipboard, ready to paste into an AI assistant. Secrets are left out.",copyEstateReport:"Put the whole estate report on your clipboard, ready to paste into an AI assistant. Folder paths are shortened and secrets are left out.",verdict:"Counts only the work that exists nowhere but this machine.",moreActions:"The actions you rarely need for this row.",tagLosable:"This work exists nowhere but this machine.",tagMoney:"Costly or public if it lapses, but not lost.",tagHygiene:"Worth tidying. Nothing is at risk today.",age:"How long this has been true.",keyboard:"Show the keyboard shortcuts.",ssl:"The certificate that puts the padlock in the address bar.",domain:"The yearly renewal that keeps the web address yours.",detectors:"A check af360 runs while it looks around. Turn one off and it stops running.",muteSwitch:"On: this check runs. Off: it stops running, and the Discoveries page says so.",updateSwitch:"On: once a day af360 asks the npm registry - the tester channel - whether a newer af360 exists. Nothing about you is sent. Store installs are updated by Windows instead.",chooseExclude:"Pick a folder every scan should skip, even inside a folder you watch.",markdown:"A plain text file that most editors, note apps and AI assistants read.",estate:"Everything you have built: the folders, projects and sites af360 watches.",simpleMode:"Plain English only",devMode:"Adds codes, timings, git detail",theme:"Switch between the day and night look",editEntry:"Change the name, the date, your note or the money tag"},d={common:{scanning:"Scanning…",loading:"Looking around…",checking:"checking…",undo:"Undo",save:"Save",done:"Done",remove:"Remove",close:"Close",cancel:"Cancel",back:"Back",show:"Show ▾",hide:"Hide ▴",collapse:"Collapse ▴",details:"Details ▾",less:"less ▴",more:"more ▾",somethingWrong:"Something went wrong - try again."},appbar:{aria:"Estate",shortcuts:"Shortcuts",shortcutsTip:"Show the keyboard shortcuts.",roomAria:"Current room"},log:{title:"Log",purpose:"Everything af360 has recorded on this machine, newest first.",filterAll:"All",filterAgents:"Agents",filterConnections:"Connections",filterClosed:"Resolved",untaggedNote:"af360 tags three kinds of entry: an agent asked something, a connection changed, a risk ended. Everything else is an untagged line. All shows everything.",dayToday:"Today",dayYesterday:"Yesterday",floor:"Seven days is as far back as this record goes.",empty:"af360 has not written anything down yet - scans, site checks and agent questions all land here."},shell:{clockSkew:n.lt.at,clockSkewCore:n.lt.core,navAria:"Main",modeAria:"Mode",themeAria:"Look",moreGroup:"More",railAria:"Live",modeSimple:"Simple",modeDev:"Dev",themeDay:"Day",themeNight:"Night",guardianSoon:"soon",footBy:"by",footBrand:"Afeleos",footLine:"Your files stay on your machine.",railLive:"Live",railLog:"Log \xb7 7 days",railLogUnknown:"Log",railLogSince:e=>"Log \xb7 since ".concat(e),railLogSinceTime:e=>"Log \xb7 since ".concat(e),railLogTruncated:e=>"Log \xb7 since ".concat(e," \xb7 limit reached"),railLogUnreadable:e=>"".concat(e," ").concat(1===e?"entry":"entries"," could not be read"),railLogEmpty:"Log \xb7 nothing yet",railNext:"Next",railConfigFault:"I can't read your settings",railConfigFaultSub:"so I don't know what to watch",railQuiet:"quiet so far",railQuietSub:"incidents and scans land here",railNoEvents:"no incidents yet",railNoEventsSub:"scans land here",railNoRecord:"nothing recorded yet",railNoRecordSub:"af360 hasn't finished a scan",railOlder:"everything older is in the Log",railSwept:"git status swept",railMissing:"still missing",railNextSiteCheck:"site check",railNextScan:"folder scan",railNextSsl:"SSL judgment"},roomError:{invite:"This room didn't open",line:"Something in this room went wrong, so af360 stopped drawing it rather than show you something half-built. af360 has not judged the other rooms from here.",fixLead:"What to do:",fixRetry:"Try the room again. If it keeps failing, the other rooms will tell you whether they are working.",retry:"Try again"},configFault:{invite:"I can't read your settings",line:"Your settings file is where it should be, but I can't read it, so I don't know what you asked me to watch. I have not changed or written over it.",whereLabel:"The file is here:",fixLead:"What usually fixes it:",fixOpen:"Open the file and check it is complete - a half-written or hand-edited file is the usual cause.",fixRestore:"If you keep backups, restore your last good copy over it.",fixRename:"Or rename the file. af360 will start fresh, and your old one stays on disk for you to look at.",retry:"Try again",recovered:"Your settings file could not be read. af360 restored the previous copy."},radar:{title:"Radar",purpose:"what needs you right now, in one place",scanNow:"Scan now",shareReport:"Share a report",shareReportTip:"A tidy file of what needs attention, to share or paste into an AI",looked:"looked",needsYou:"Needs you",projects:"Projects",projectsMeta:"checking backups, unsaved work, activity",watchMore:"Watch more folders",sites:"Sites",sitesMeta:"checked every minute while af360 is running",discoveries:"Discoveries",discoveriesMeta:"what the estate is quietly telling you",discoveriesTop3:"showing the top 3",ignored:"Ignored",ignoredLabel:"Ignored",ignoredStrip:e=>"Ignored: ".concat(e),ignoredMeta:"still scanned - they resurface only if things change",watchAgain:"Watch again",stillIgnore:"Still ignore",findIt:"Find it",stopWatching:"Stop watching",stopWatchingFolder:"Stop watching this folder",stopWatchingSite:"Stop watching this site",ignore:"Ignore",ignoreIt:"Ignore it",keepWatching:"Keep watching",later:"Later",check:"Check",handled:"handled ✓",folder:"Folder",copyPath:"Copy path",copyAddress:"Copy address",copied:"Copied ✓",copyFailed:"Couldn't copy",whatISaw:"What I saw",worthDoing:"Worth doing",viewGrid:"Grid",viewRows:"Rows",viewAria:"How to show this section",pin:"Pin to top",pinLabel:"Pin",ignoreLabel:"Ignore",unpin:"Unpin",emptyInvite:"Nothing to watch yet - which makes this the perfect starting line.",emptyLine:"af360 keeps an eye on the folders you work in and the websites you own, and tells you when one of them needs you - work that has no copy anywhere, a site that stops answering, a renewal creeping up.",emptyPickFolder:"Choose a folder to watch",emptyPickSite:"Watch a website",emptySomeday:"Building something someday? af360 will be ready - it costs nothing to keep around.",emptyBack:"Back",sitePlaceholder:"yoursite.com",siteNamePlaceholder:"a name for it (optional)",siteAddrAria:"Website address",siteNameAria:"Name for this website",siteAdd:"Watch it",siteAdding:"Adding…",siteAdded:"Watching it. af360 checks it every minute while it is running.",firstCheck:"first check under way…",historyBuilds:"history builds",sparkAria:"Response time, last 24 hours",proposals:"Worth watching",proposalsMeta:"found in your own project files",proposalNamedIn:"named in {0} - line {1}",proposalIn:"in {0}",proposalChanged:"you set this aside when it was named in {0}; it is named in {1} now",proposalNotThis:"Not this one",proposalSetAside:"Set aside. af360 won't ask again unless the evidence changes.",seeAll:e=>"See all ".concat(e," discoveries →"),needsYouAlways:"all shown, always \xb7 ordered by consequence",tagLosable:"losable",tagMoney:"money",tagHygiene:"hygiene",moreActions:"More",moreActionsAria:"More actions for this finding",effIgnore:"hide until it changes",effLater:"resurfaces tomorrow",effStillIgnore:"keep it hidden",effStopWatching:"removed from af360 only",effPin:"keep on top",effUnpin:"back in normal order",fix:"Fix",ignoredStill:"still scanned \xb7 resurfaces on change",ignoredShow:"Show",ignoredHide:"Hide",seeAllProjects:e=>"See all ".concat(e," projects →"),seeAllSites:e=>"See all ".concat(e," sites →"),moreCleanBacked:e=>"and ".concat(e," more with nothing needing you"),moreClean:e=>"and ".concat(e," more, all clean"),moreProjects:e=>"and ".concat(e," more on the Projects page"),moreSitesUp:e=>"and ".concat(e," more with nothing needing you"),moreSites:e=>"and ".concat(e," more on the Sites page"),bannerLead:"This is a",bannerStrong:"sample estate",bannerRest:"so you can see everything working - try Check, Ignore, and Later.",bannerLink:"Point af360 at your real projects",bannerTail:"and it becomes yours.",ignoredToast:"Ignored {0} - it's not gone, it moved to the Ignored line under Needs you (still scanned).",confirmProject:"This project isn't fully backed up. Ignore anyway? I'll stop mentioning it.",confirmProjectShort:"This project isn't backed up. Ignore anyway? I'll stop mentioning it.",confirmSite:"This site is down right now. Ignore anyway? I'll stop mentioning it.",movedTail:"moved - pick its new home. The old entry is replaced."},unread:{reason:"a scan that did not finish",what:e=>"af360 could not finish reading ".concat(e,"."),evidence:"git did not answer for this folder, so nothing below is a verdict",why:"af360 will not guess - it would rather say it could not look than tell you something untrue.",step:"Nothing to do: the next scan tries again. If it keeps saying this, the folder or git itself is the thing to check."},session:{verdictHint:"click to see them",verdictJumpAria:"Show the work that would be lost",wereIn:"You were in",uncommitted:e=>"".concat(e," file").concat(1===e?"":"s"),uncommittedTail:"uncommitted",clean:"clean",lastCommit:"last commit",touched:"touched",noRecent:"Nothing recent - your estate is below",subline:"most recent activity across your watched folders",copyPath:"Copy path",copyContext:"Copy project brief",copyContextShort:"Copy project brief",copying:"Assembling…",copied:"Copied ✓",copyFailed:"Couldn't copy",copyHandoff:"Copy for your agent",handoffCopied:"Copied: what needs doing, the commands for each, and what a dead disk would cost. Secrets masked.",fix:"Fix",fixHeadingWhat:"What is happening",fixHeadingSteps:"What to do",fixHeadingCommands:"Commands",copyCommands:"Copy commands",commandsCopied:"Commands copied ✓",briefToast:e=>"Copied: ".concat(e.join(", "),"."),briefFailed:"Couldn't assemble the brief - try again.",briefRedacted:"secrets left out",actSave:e=>"Save ".concat(e),actPush:e=>"Push ".concat(e),actBackUp:e=>"Back up ".concat(e),actDuplicate:e=>"Decide on ".concat(e,"'s duplicate"),actSiteDown:e=>"".concat(e," is down"),actRenew:e=>"Renew ".concat(e),actCertLate:e=>"Chase ".concat(e,"'s certificate"),actFind:e=>"Find ".concat(e),actDecide:e=>"Decide on ".concat(e),actOffline:"Check this machine's connection"},stream:{starting:"still looking - the deeper checks are starting, results land here as they finish",counting:(e,t)=>"still looking - ".concat(e," of ").concat(t," deeper check").concat(1===t?"":"s"," done, results land here as they finish"),railWatchedNothing:e=>"watched since ".concat(e," - nothing has changed"),railScan:(e,t)=>"scanning ".concat(e," folder").concat(1===e?"":"s").concat(t>0?" \xb7 ".concat(t," site").concat(1===t?"":"s"):""," \xb7 deeper checks next")},keys:{title:"Keyboard shortcuts",sub:"They do not fire while you are typing in a box - except Escape, which always closes what is open.",close:"Close",aria:"Keyboard shortcuts",rooms:"Go to a room",actions:"Do something",goRadar:"Radar",goDiscoveries:"Discoveries",goReport:"Estate Report",goAhead:"Ahead",goSettings:"Settings",doScan:"Scan now",doCopy:"Copy the project brief for the project you were in",doHelp:"Show this list",doEsc:"Close this list",copiedToast:"Project brief copied - paste it into an assistant.",noProject:"af360 has no current project to copy context for."},discoveries:{title:"Discoveries",purpose:"what af360 noticed about the estate, in one place",backToRadar:"Back to Radar",loading:"Looking for discoveries…",emptyInvite:"No discoveries yet.",emptyLine:"Watch some folders on Radar and the estate starts telling you things - unpushed work, forgotten costs, sites worth a look.",goRadar:"Go to Radar",bannerLead:"Sample discoveries -",bannerLink:"point af360 at your real projects",bannerTail:"and these become yours.",mutedTitle:"Muted in Settings, so not running",failedTitle:"Didn't finish this time",failedTail:"Anything these would have found is missing from this page. The next scan tries again.",unmute:"Unmute in Settings →",worth:"Worth doing:",showMe:"Show me ▾",seeCard:"See the card it sends ▾",fixSteps:"Fix steps",whatISaw:"What I saw",dismiss:"Not this one",effDismiss:"af360 keeps checking, and says so only if this changes",changedSince:"You set this aside - af360 would now say something different.",dismissedThen:"You set aside:",dismissedNow:"Now:",stillDismiss:"Still not this one",undismiss:"Show it again",copyDetails:"Copy details",ogBare:"No title, no description, no image - the link shows up naked.",ogNoTitle:"(no title)",stillLooking:e=>"still looking - ".concat(e," deeper check").concat(1===e?"":"s"," running, results land here"),cat:{"time-capsule":"Time capsule",safety:"Safety",money:"Money",identity:"Identity",health:"Health and housekeeping",site:"Your sites"}},projects:{title:"Projects",purpose:"every folder af360 watches, all on one page",backToRadar:"Back to Radar",needing:e=>"".concat(e," need").concat(1===e?"s":""," you, the rest are clean"),allClean:"all clean",emptyInvite:"No projects watched yet.",emptyLine:"Point af360 at a folder on Radar and everything inside it appears here.",goRadar:"Go to Radar"},sites:{title:"Sites",purpose:"every site af360 watches, all on one page",backToRadar:"Back to Radar",checking:"Checking your sites…",answering:(e,t)=>"".concat(e," of ").concat(t," answering"),emptyInvite:"No sites watched yet.",emptyLine:"Add a site on Radar and af360 checks it every minute while it runs.",goRadar:"Go to Radar",groupYours:"Your sites",unitSite:"site",unitSites:"sites",newGroup:"New group",groupNameAria:"Group name",groupNamePlaceholder:"Client work",createGroup:"Create",removeGroup:"Delete group",removeGroupNote:"The sites in it move back to Your sites. None of them are removed.",fileIn:"Group",groupServices:"Services you depend on",servicesPurpose:"af360 asks each of these one question: did it answer? None of af360's site checks run here.",svcAnswered:"af360 asked, and it answered.",svcErrorReply:"af360 asked, and the reply was an error.",svcNoAnswer:"af360 asked, and got no answer.",svcAsking:"af360 is asking…",svcNotTheWorld:"This is what happened when af360 asked, from this machine. It is not a report on the service.",svcViaStatus:"af360 asks its published status page.",svcViaHome:"It publishes no status page, so af360 asks its home page.",removeService:"Remove",servicesNoPresets:"af360 has no service presets yet.",addService:"Add a service",servicesNoneAdded:"af360 contacts nothing here until you add it."},card:{heroLabel:"lines of code across {0} projects",heroSub:"Counted on this machine, not from an API.",gridHead:"Twelve weeks of commits",statLanguages:"Languages",statAge:"Estate age",statCommits:"Commits, twelve weeks to today",statClean:"Clean",statReadProjects:"Repositories read",statBusiestDay:"Busiest day",statBusiestProject:"Busiest project, {0}",emptyEstate:"Nothing measured yet.",statBranches:"Local branches",capped:"Measured across the {0} projects af360 read.",seal:"Measured on this machine \xb7 build {0}",sealNoBuild:"Measured on this machine \xb7 no build fingerprint",foot:"af360 by Afeleos",button:"Save the card"},report:{title:"Estate Report",purpose:"the whole picture in one look, kept on this machine",heading:"Your estate, at a glance",asOf:"as of",sub:"The whole picture in one look. This stays on your machine; your personal view - Share a report makes the file meant for others.",download:"Save as image",downloadText:"Save as text",vNeeding:e=>"need".concat(1===e?"s":""," your attention"),vClean:"clean and backed up",vSites:"sites answering",rightNow:"Right now",rUnsaved:"Unsaved work at risk",rUnsavedVal:(e,t)=>"".concat(e," project").concat(1===e?"":"s",", ").concat(t," change").concat(1===t?"":"s"),rNone:"none ✓",rUnpushed:"Commits only on this machine",rUnpushedVal:(e,t)=>"".concat(e,", in ").concat(t," project").concat(1===t?"":"s"),rEverythingElse:"Everything else",rBackedUp:"backed up ✓",rNoBackup:"No copy anywhere but here",rNoBackupVal:e=>"".concat(e," project").concat(1===e?"":"s"),rSites:"Sites",rSitesAllUp:"all up, no incidents",rSitesUpNow:"all up right now",rSitesDown:e=>"".concat(e," not answering"),rNext:"Next date to know",dateIn:(e,t)=>"".concat(e," in ").concat(t,"d"),inNumbers:"Your estate in numbers",langAria:"Share of your code by language",langRest:"everything else",linesWord:"lines",fLines:"lines of code",fProjects:"projects",fProjectsExcluded:e=>"".concat(e," downloaded ").concat(1===e?"copy":"copies"," excluded"),fLanguages:e=>"languages, mostly ".concat(e),fCommits:"commits tracked",worthKnowing:"Worth knowing",worthKnowingSub:"true and useful, no action needed - the facts behind your estate",detailsLabel:"Details",catTimeCapsule:"time-capsule",catHousekeeping:"housekeeping",catHistory:"history",catMilestone:"milestone",wTodoFact:(e,t)=>"Your oldest note to yourself is still open, from ".concat(e,': "').concat(t,'"'),wTodoWhy:"the estate's eldest note to yourself, still waiting",wTodoFrom:e=>"the estate's eldest note to yourself, from ".concat(e),wSpaceFact:e=>"".concat(e," of downloaded code libraries sit in projects you have not touched in months"),wSpaceWhy:"free to delete, one command brings it back",wBusiestFact:(e,t)=>"".concat(e," is your busiest project, ").concat(t.toLocaleString()," commits"),wBusiestWhy:"the most-worked-on thing you own",wBirthdayFact:(e,t,o)=>"".concat(e," turns ").concat(t," on ").concat(o),wBirthdayWhy:"counted from its first commit",imageFoot:"runs on your machine \xb7 your files stay on it",bannerLead:"Sample report -",bannerLink:"point af360 at your real projects",bannerTail:"and these become your numbers.",counting:"Counting the estate… first time takes a minute.",failed:"The report didn't load - reload the page to try again.",emptyInvite:"Nothing to report yet.",emptyLine:"Watch a folder on Radar and the report writes itself - lines, languages, birthdays, all of it.",goRadar:"Go to Radar",todosTip:"Notes you left in your own code marking something still to do. af360 reads them where they sit and changes nothing.",reclaimableTip:"Space held by the downloaded code libraries (node_modules) of projects you have not touched in months. Deleting them frees the space; one command puts them back.",busiestTip:"Counted from the commits in each watched project's own history. It measures how often you saved work, not how long you spent.",birthdayTip:"Counted from the first commit in the project's history, which is the earliest date the project can prove about itself."},ahead:{title:"Ahead",purpose:"everything af360 knows a date for, before it surprises you",next90:"Next 90 days",further:"Further out",anniversaries:"Anniversaries",anniversariesMeta:"your estate's birthdays",undetermined:"No renewal date",addYourOwn:"Add your own",add:"Add",adding:"Adding…",reading:"Reading certificates…",emptyInvite:"Nothing on the horizon.",emptyLine:"Add trials or renewals below, or watch a site on Radar to track its certificate.",added:"On the timeline.",namePlaceholder:"hosting trial, license renewal…",notePlaceholder:"what happens then?",nameAria:"Name",dateAria:"Date",noteAria:"Note",bannerLead:"Sample timeline -",bannerLink:"watch your real sites",bannerTail:"and their certificate dates appear here, judged - with domain dates too if you turn that on.",weekJudg:"your week, counted on this machine - a fresh one starts Monday",nothingWatched:"nothing watched yet",nothingToDo:"nothing to do",kind:{ssl:"SSL certificate",domain:"domain renewal",manual:"your entry"},yours:"you added this",costTag:"costs money",costLabel:"it costs money when it comes",costAria:"Costs money",edit:"Edit",editAria:"Edit this entry",save:"Save",cancel:"Cancel",saved:"Changed.",removedNamed:"{0} removed.",done:"Done",undone:"Not done",doneMeta:"dealt with",passed:"passed",passedLine:"This date has passed.",reDate:"Give it a new date",secSuggested:"Worth tracking",suggestedMeta:"found on this machine - af360 adds nothing on its own",suggestAdd:"Track it",suggestNo:"Not this one",suggestSetAside:"Set aside.",suggestFilled:"Filled in below - check it and press Add.",suggestFromCert:"{0}'s certificate expires on this date, and af360 has no sign it renews itself"},settings:{title:"Settings",purpose:"preferences - everything lives in one folder on your machine",secWatching:"Watching",watchingHelp:"The folders af360 watches. It scans these on a rhythm; it also looks in the usual places when you ask it to find projects, and it shows you exactly where it looked.",watchingEmpty:"No folders yet - af360 is not looking anywhere.",watchingAdd:"Add a folder…",watchingPick:"Watch this folder",watchingAlready:"Already watching this folder.",watchingProject:"project",watchingProjects:"projects",watchingUnclaimed:"outside every folder above",stopWatching:"Stop watching",watchStopped:"{0} is no longer watched.",connHelp:"Let an AI agent ask af360 about this estate. af360 answers with what it last saw, and it answers read-only: nothing an agent asks can change anything.",connLooking:"Looking for AI tools on this machine…",connNone:"af360 could not find any of the AI tools it knows how to connect to on this machine.",connConnect:"Connect to",connDisconnect:"Disconnect",connConnected:"Connected",connNotConnected:"Not connected",connElsewhere:"Points at another af360",connUnverified:"af360 can't tell which af360 this points at",connOldShape:"Points at this af360 the old way - press Reconnect",connGitHubRefused:"GitHub refused this connection",connGitHubStale:"af360 cannot renew this connection",connUnreadable:"af360 can't read this one's settings file",connAlsoWorks:"Also works with {0} when installed.",connWillWrite:"af360 will add this to {0}'s settings file:",connWillRemove:"af360 will take this out of {0}'s settings file:",connWillRepoint:"af360 will point {0} at this af360 instead - it is set to a different one:",connLineCount:"{0} line(s) added, {1} removed, from line {2}.",connWillBackup:"A copy of the file as it is now will be saved first, at {0}",connConfirmWrite:"Write this change",connConfirmRemove:"Remove this",connRefused:"af360 stopped, and wrote nothing.",connWrote:"af360 is connected to {0}.",connRemoved:"af360 is no longer in {0}'s settings.",connBackupAt:"The file as it was is at {0}",connRestart:"Restart {0} to finish - it reads this when it starts.",connDropped:"{0} rewrote its own settings when it closed and af360's entry went with it. This happens, and it is not something you did.",connReconnect:"Reconnect",connRunning:"{0} is running - it may drop this when it closes. Reconnecting later is one click.",secLooking:"Looking around",cadenceLabel:"How often should I look around?",cadenceHelp:"Disk scan runs on open, then on this rhythm",cadenceAria:"Scan cadence",watchLabel:"Keep checking after I close the window",watchHelp:"af360 keeps checking your estate after you close the window. It stops when you shut down, restart or sign out, and you can quit it any time from its icon near the clock.",watchAria:"Keep checking after the window closes",startupLabel:"Start af360 when I sign in",startupHelp:"af360 opens with Windows and starts watching straight away. It does not run before you sign in, and you can turn it off here or in Task Manager.",startupAria:"Start af360 when I sign in to Windows",startupBlocked:"Turned off in Task Manager. Switch it back on there, under Startup, and af360 starts with Windows again.",startupPolicyOff:"af360 does not start with Windows on this machine, and that is set by policy rather than by you. Whoever manages this machine decides it, and af360 does not override them.",startupPolicyOn:"af360 starts with Windows on this machine, and that is set by policy rather than by you. Whoever manages this machine decides it, and af360 does not override them.",cadenceHourly:"Every hour",cadence6h:"Every 6 hours",cadenceDaily:"Once a day",cadenceCustom:"Custom…",customLabel:"Custom rhythm",customHelp:"Every how many hours? 1 to 24 - that is how often af360 looks while it is running",hoursAria:"Hours",secAppearance:"Appearance",viewLabel:"Default view",viewHelp:"Grid or rows - each section remembers your own override",viewAria:"Default view",viewCards:"Grid",viewRows:"Rows",langLabel:"Interface language",langHelp:"Room names, buttons and section titles. Your folder paths, findings and the sentences af360 writes about your estate stay in English.",langAria:"Interface language",langEn:"English",langAr:"العربية",secData:"Your data",dataLabel:"~/.af360/config.json",dataHelp:"Your watched folders, sites, entries and preferences live in the ~/.af360 folder on your machine, nowhere else. af360 never changes anything inside your projects: it reads them and reports. No accounts, no telemetry. af360 runs a small server on this machine so the window has something to talk to, and it is not reachable from anywhere else.",domainLabel:"Check when my domains renew",domainHelp:"Off by default. Turning it on lets af360 ask a public registry (rdap.org) when the domains behind your sites are due to renew, so those dates join the Ahead timeline with everything else. It sends the site's full address - including the part in front of the domain, which is usually your project's name - and nothing else: no file names, no contents, nothing about you or this machine. The request also carries af360's own name and version, and the answer format it can read. Left off, af360 still watches your sites and still reads their certificates; it just will not know their renewal dates.",updateLabel:"Tell me about new versions",updatePackaged:"Updates arrive through the Microsoft Store. af360 makes no check of its own.",updateHelp:"Once a day, af360 asks the public npm registry whether a newer af360 exists and prints one line if there is. That registry is the tester channel: it is where af360 installed with npm gets its updates. An af360 installed from the Microsoft Store is updated by Windows itself, automatically, and this check has nothing to tell it. It sends nothing about you or this machine. Everything else af360 does online happens because you asked for it, and each one has its own switch.",on:"On",off:"Off",secHow:"How af360 works",how:["It reads the folders you choose, here on this machine, and never changes anything inside them.","It looks at them when you open af360, then again on the rhythm you set above.","While af360 is running, it checks each site you watch once a minute.","It reads certificate dates for those sites, and the dates you add yourself, and says which ones actually need you. Domain renewal dates too, if you turn that on.","It points out quiet facts it noticed while looking. Those are suggestions, not alarms.","It writes its own file in the ~/.af360 folder. The one other thing it can write is an AI tool's config file, and only when you press Connect - it shows you the exact change first."],documentsHelp:"The two documents you accepted when af360 started. They are stored in af360 and open here; nothing opens a browser.",documentsOpen:"Read",secRules:"Rules",rulesMeta:"both feed the engine directly",excludeLabel:"Don't watch here",excludeHelp:"Folders every scan skips - even inside watched folders",excludePick:"Don't watch this folder",alreadyExcluded:"Already skipped ✓",chooseFolder:"Choose a folder…",customBad:"Pick a whole number of hours between 1 and 24.",muteLabel:"Mute a discovery type",muteHelp:"Muted detectors stop running; the Discoveries page says which are off.",muted:"Muted",running:"Running",cat:{money:"Money",identity:"Identity","time-capsule":"Time-capsule",safety:"Safety",health:"Health",site:"Site"}},connections:{title:"Connections",purpose:"Who may ask af360 about this estate, and what af360 may look at on your behalf.",secIn:"Agents reach in",inHelp:"A connected assistant can ask af360 about this estate on its own, without you doing anything. af360's answers quote text found on this machine - folder and branch names, commit messages, the notes files a project keeps for assistants - marked as content af360 read, never as instructions to follow. Connecting is yours to choose.",secOut:"af360 reaches out",outHelp:"af360 can also look outward - read-only - at services your estate already lives on, and fold what they know into the picture.",githubName:"GitHub",githubOffer:"CI results, pull requests, issues - read-only, from this machine only",githubBlind:"Until this is connected, af360 cannot check your remotes - if one has been renamed or moved, nothing here will say so.",githubConnect:"Connect GitHub…",githubReconnect:"Reconnect GitHub…",githubAuthorizeOnly:"Already installed af360 on GitHub? Authorize only",githubAuthorizeOnlyHelp:"Reconnects af360 without changing which repositories you granted.",secActivity:"Activity",activitySub:"which tool asked the witness, when, and what af360 could see asking",activityNone:"No agent has asked af360 anything in the last seven days - that is as far back as this record goes. When one does, it appears here and in the Log.",activityUnnamed:"Not identified",setupTitle:"Connect GitHub",setupLede:"af360 wants permission to look, never touch. It asks GitHub for read-only access to the repositories you choose - and GitHub, not af360, is where you choose them.",setupTouches:"af360 gives you a one-time code. You enter it on GitHub, choose which repositories af360 may read, and af360 picks it up from there.",deviceCodeLabel:"Your one-time code",deviceCopy:"Copy code",deviceCopied:"Copied",deviceGoLabel:"Enter it at",deviceExpires:"This code stops working in {0}.",deviceExpired:"This code has expired, and nothing was stored. Press Connect GitHub for a fresh one.",setupOpen:"Choose repositories on GitHub",setupStarting:"Asking GitHub for a code…",setupWaiting:"af360 is checking with GitHub every few seconds. This updates itself when you are done.",setupCancel:"Cancel",setupNoApp:"This build of af360 has no GitHub App registration, so it cannot connect yet.",receiptHead:"BEFORE ANYTHING IS STORED - the receipt:",receiptStored:"stored in ~/.af360/config.json, on this machine only, masked in every brief and answer",receiptCalls:"used from this machine to github.com and api.github.com only - the sign-in comes back to this computer, and no server of ours is involved, ever",receiptRefuse:"af360 asks GitHub for read-only permissions and nothing else - and it refuses the connection outright if GitHub ever reports otherwise",receiptLeak:"If this token ever leaked, it could read the repos you selected - nothing more, and it can never write. Revoking it is one click on GitHub (Settings - Applications - Authorized GitHub Apps - af360-app - Revoke access).",receiptBehalf:"GitHub's own screen will say af360 can \"act on your behalf\" - that is GitHub's wording for calling its API as you, and af360's calls are read-only, only on the repositories it has been granted, and it asks for nothing else",refusedLine:"af360's access for {0} was refused - reconnect to restore it. Until then GitHub answers nothing.",staleNoAppLine:"af360 holds a credential for {0} that is no longer working, and this build has no GitHub App registration to renew it with.",verifiedAs:"Connected as {0}",verifiedMeta:"read-only \xb7 {0} repositories \xb7 checked just now",verifiedSees:"af360 can see: {0}. For the ones that are folders af360 watches, it folds their CI results, pull requests and issues into the rooms when it scans.",repoOnAccount:"{0} on {1}",connectedMeta:"read-only \xb7 {0} \xb7 connected",repoCountOne:"1 repository",repoCountMany:"{0} repositories",grantedShow:"show the list",grantedHide:"hide the list",grantedAccount:"on {0}",grantedFloor:"af360 could not finish reading this list, so it may be short.",ghCardChecked:"GitHub checked",ghCardNever:"GitHub not checked yet",repoCountFloor:"at least {0}",verifiedNone:"af360 is connected, read-only, and cannot see any repositories yet. On GitHub, open Settings - Applications and find af360-app under your installed GitHub Apps, then choose the repositories af360 may read. If you asked to install it on an organisation, an owner there may still need to approve it.",verifiedNoInstall:"af360 is authorized, read-only, and is not installed on any account yet - so there is nothing for it to read. Installing it is the step that grants repositories: open af360-app on GitHub and install it on the account whose repositories you want af360 to watch. If you install it on an organisation, an owner there may need to approve it before af360 can see anything.",verifiedEmptyAccount:"af360 is connected to {0}, read-only, and everything you granted is in place - that account just has no repositories yet. Nothing to fix. When you make one and keep a copy in a folder af360 watches, af360 will pick it up on its next scan.",verifiedPartial:"af360 could not read the repository list for {0} of the installations it has been granted, so this list is what it can confirm and may be short. It will ask again the next time you connect.",refusedWrite:"Not connected - this token can write.",refusedWriteBody:"af360 only connects where it has been granted read access and nothing more. Its GitHub App asks for read-only permissions and nothing else, so a grant that can write should not be possible - nothing was stored. You can review what the installation grants on GitHub, under Settings - Applications - af360-app.",disconnect:"Disconnect",disconnected:"GitHub disconnected. The token was removed from config.json.",githubUnreadable:"af360 has a GitHub connection stored here that it cannot read. It was encrypted for a different Windows account or a different machine - a copied profile or a restored backup does this. Press Connect to sign in again."},diag:{title:"Share a diagnostic report",intro:"Everything af360 flags right now - what needs attention, why it matters, and the suggested fix - as one tidy file to hand to someone or paste into an AI assistant.",safe:"What you see here is exactly what gets saved. Folder paths are shortened, anything shaped like a password or key is hidden, and your machine name is never included.",hintText:"puts it on your clipboard now",hintFile:"saves a plain text file (.md) that editors and AI assistants read",hintPage:"saves a readable page you can print or save as PDF",downloadText:"Download as text",downloadPage:"Download as page",copyForAi:"Copy estate report",copied:"Copied ✓",dialogAria:"Diagnostic report"},check:{first:"First check - af360 will compare the next one against this.",since:"Since your last check on {0}:",cleared:"cleared {0}.",appeared:"new {0}.",unchanged:"nothing changed.",remaining:"{0} still open.",unmeasured:"{0} didn't run this time - not compared."},landing:{tag:"Everything you've built, watched from one place.",sub:"Runs on your machine. Your files stay on it.",open:"Open af360 →"},firstLight:{moment:"One moment.",gateTitle:"Welcome to af360",gateLead:"Let's get you set up. It takes about a minute.",gateBody:"af360 keeps an eye on the projects on this machine and tells you what is going on in them. It only reads - it never changes your files, and your files stay on your machine. The one thing it sends on its own is a once-a-day check for a newer af360, and you can switch that off. Everything else it does online happens because you asked for it, one switch at a time.",gateBodyPackaged:"af360 keeps an eye on the projects on this machine and tells you what is going on in them. It only reads - it never changes your files, and your files stay on your machine. af360 sends nothing on its own. Everything it does online happens because you asked for it, one switch at a time.",docsLead:"Continuing accepts the",docsAnd:"and the",docsTail:"Both are always in Settings.",termsName:"Terms of Use",privacyName:"Privacy Policy",docVersion:"Version",docsUnreadable:"af360 could not read its own Terms of Use and Privacy Policy from the files it ships. This is a fault in this copy of af360, and it cannot ask you to accept documents it cannot show you.",accept:"Accept and continue",accepting:"One moment…",notNow:"Not now",declinedTitle:"No problem",declinedBody:"af360 has not looked at your projects. Nothing on this machine was scanned. The only thing it has read is its own settings file, to see whether you had answered this before, and the only thing it saves is the size of this window. You can close it whenever you like.",declinedBack:"If you change your mind, just open af360 again and it will ask once more.",takeMeBack:"Take me back",sweepTitle:"Let's find your projects",sweepSearched:e=>"Searched ".concat(e),sweepFoundSoFar:e=>1===e?"1 found so far":"".concat(e," found so far"),sweepNoneYet:"Nothing found yet.",sweepFailed:"af360 could not finish looking. You can point it at a folder yourself once you are in.",pickTitle:e=>1===e?"Here's what af360 found: 1 project":"Here's what af360 found: ".concat(e," projects"),pickHelp:"Pick the ones you'd like af360 to keep an eye on. You can add or remove folders any time.",startWatching:e=>1===e?"Start watching 1 folder":"Start watching ".concat(e," folders"),continueWithout:"Continue without watching",watching:"Saving…",emptyTitle:"af360 did not find any projects",emptyBody:"af360 looked in the usual places on this machine and did not find any projects. If your work lives somewhere else, you can point af360 at the right folder once you are in.",emptyCapped:e=>"af360 stopped after finding ".concat(1===e?"1 folder that looks like a download":"".concat(e," folders that look like downloads")," rather than your own projects, so it did not open the places listed below. Point af360 at the folder your work lives in and it will look there."),goInEmpty:"Take me in"},setup:{look:"Look for my projects",pickMyself:"I'll pick the folder myself",browse:"Browse folders",looking:"Looking in your usual places…",lookAgain:"Look again",addAnother:"Add another place",whereLooked:"Where I looked:",nothingNew:"nothing new",lookedCapped:(e,t)=>"af360 stopped after ".concat(e," projects to keep this quick, so it did not open ").concat(t," of the places below. Add a folder yourself if something of yours is missing."),notLooked:"not opened - af360 had already found enough",pickWhere:"Pick where to look:",up:"↑ Up",noFolders:"Nothing here to watch - af360 does not list hidden folders or node_modules.",watchThis:"Watch this folder",alreadyWatching:"Already watching this folder ✓",watch:"Watch",watchAll:"Watch all",watching:"Watching ✓",foundCount:e=>"Found ".concat(e," project").concat(1===e?"":"s",". Watch the ones you care about:"),adding:"Adding…",noneFound:"I didn't find any new projects in the places below.",previewOff:"Preview mode - config changes are off.",searchFailed:"Something went wrong while searching - try again.",downloadedHeader:"Downloads sharing a name",downloadedNote:"Inside Downloads, or archive-style names - probably not your estate. Watch any that really are yours:",downloadedTag:"Looks like a download",elsewhere:"Not what you expected? Your projects might live somewhere else - a second drive, an external disk.",elsewhereBtn:"Point me somewhere else"}}},4576:(e,t,o)=>{o.d(t,{PF:()=>n,dv:()=>d,pA:()=>r,pl:()=>c,qt:()=>i,rM:()=>s,tO:()=>a});let n="af",a="360",i=n+a,s="Afeleos",r="https://afeleos.com";function c(e){return'<span class="brand">'.concat(n,'<em style="font-style:normal;color:').concat(e,'">').concat(a,"</em></span>")}function d(e,t,o,i,s){let r=e.textAlign;e.textAlign="left",e.fillStyle=i,e.fillText(n,t,o);let c=e.measureText(n).width;e.fillStyle=s,e.fillText(a,t+c,o);let d=t+c+e.measureText(a).width;return e.textAlign=r,d}},7861:(e,t,o)=>{o.d(t,{Brand:()=>s,SweepMark:()=>r,o:()=>c});var n=o(5155),a=o(4576),i=o(8938);function s(e){let{className:t}=e;return(0,n.jsxs)("span",{className:t?"word ".concat(t):"word",children:[a.PF,(0,n.jsx)("em",{children:a.tO})]})}function r(e){let{scanning:t}=e;return(0,n.jsxs)("svg",{className:"mark".concat(t?" scanning":""),viewBox:i.$r,"aria-hidden":!0,children:[(0,n.jsx)("circle",{cx:"13",cy:"13",r:"10",fill:"none",stroke:"rgba(148,163,214,.25)",strokeWidth:"2.5"}),(0,n.jsx)("path",{d:i.JX,fill:"none",stroke:"var(--accent)",strokeWidth:"2.5",strokeLinecap:"round"}),(0,n.jsx)("circle",{cx:"13",cy:"13",r:"2.6",fill:"var(--accent)"})]})}function c(e){let{scanning:t=!1,href:o="/radar",className:a}=e;return(0,n.jsxs)("a",{className:a?"brand ".concat(a):"brand",href:o,children:[(0,n.jsx)(r,{scanning:t}),(0,n.jsx)(s,{})]})}},8938:(e,t,o)=>{o.d(t,{$r:()=>i,CV:()=>r,JX:()=>a});let n="#2B6FE3",a="M13 3 A10 10 0 1 1 4.34 8",i="0 0 26 26",s="rgba(148,163,214,.75)";function r(e){return"data:image/svg+xml,".concat(encodeURIComponent(function(e){let t="unknown"===e?s:n;return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="'.concat(i,'">')+'<circle cx="13" cy="13" r="10" fill="none" stroke="'.concat("rgba(148,163,214,.45)",'" stroke-width="2.5"/>')+'<path d="'.concat(a,'" fill="none" stroke="').concat("unknown"===e?s:n,'" stroke-width="2.5" stroke-linecap="round"/>')+'<circle cx="13" cy="13" r="2.6" fill="'.concat(t,'"/>')+("needs"===e?'<circle cx="21" cy="5" r="5.6" fill="#0B1020"/><circle cx="21" cy="5" r="4" fill="#E9A23B"/>':"")+"</svg>"}(e)))}},9178:(e,t,o)=>{o.d(t,{I:()=>r,LS:()=>c,fF:()=>s,lt:()=>i,nW:()=>n});function n(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),o="number"==typeof e?e:new Date(e).getTime();return Number.isFinite(o)&&t-o<0}let a="a time this machine's clock has not reached yet",i={core:a,at:"at ".concat(a),recorded:"recorded at ".concat(a),since:"since ".concat(a)};function s(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),o="number"==typeof e?e:new Date(e).getTime(),n=t-o;if(n<0)return i.recorded;if(n<6e4)return"just now";if(n<36e5)return"".concat(Math.floor(n/6e4)," min ago");if(n<864e5)return c(Math.floor(n/36e5),"hour")+" ago";if(n<12096e5)return c(Math.floor(n/864e5),"day")+" ago";if(n<48384e5)return c(Math.floor(n/6048e5),"week")+" ago";let a=new Date(o);return a.toLocaleDateString([],{month:"short",day:"numeric",...a.getFullYear()!==new Date(t).getFullYear()?{year:"numeric"}:{}})}function r(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),o=t-("number"==typeof e?e:new Date(e).getTime());return o<0?i.since:"for ".concat(c(Math.floor(o/864e5),"day"))}function c(e,t){return"".concat(e," ").concat(t).concat(1===e?"":"s")}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5623],{993:(s,e,i)=>{i.d(e,{XF:()=>c});function c(s,e){return e&&e.text?s?"".concat(s,' "').concat(e.text,'"'):'"'.concat(e.text,'"'):s}},5623:(s,e,i)=>{i.d(e,{JF:()=>u,rO:()=>f});var c=i(5155),d=i(2115),t=i(7064),l=i(993),a=i(436),n=i(5310),r=i(3034),o=i(2696),h=i(2613);function x(s){let{open:e,onClick:i,seeCard:d}=s,t=(0,n.kj)();return(0,c.jsx)("button",{className:"b2 q wk-details",onClick:i,"aria-expanded":e,children:e?t("btn.hide",a.UI.common.hide):d?t("disc.seeCard",a.UI.discoveries.seeCard):t("disc.showMe",a.UI.discoveries.showMe)})}function j(s){var e,i,h;let{d:x}=s,j=(0,d.useContext)(t.vC),m=(0,n.kj)(),p=(0,n.XE)();return(0,c.jsxs)(c.Fragment,{children:[x.detail&&x.detail.length>0&&(0,c.jsx)("div",{className:"k",children:m("radar.whatISaw",a.UI.discoveries.whatISaw)}),null==(e=x.detail)?void 0:e.map(s=>(0,c.jsx)(r.B,{mono:!0,children:s},s)),x.steps&&x.steps.length>0&&(0,c.jsx)("div",{className:"k",children:m("disc.fixSteps",a.UI.discoveries.fixSteps)}),null==(i=x.steps)?void 0:i.map(s=>(0,c.jsx)("div",{className:"step",children:p(s)},s)),x.copy&&(0,c.jsx)(o.r8,{path:x.copy.text,label:a.UI.session.copyCommands,labelKey:"btn.copyCommands"}),(0,c.jsx)(o.hR,{text:function(s,e,i){if(!s)return"";let c=[];if(s.verdict&&c.push(s.verdict),s.why){let d="function"==typeof i?i(s.why,s.quoted):s.why;c.push("".concat(e.worth," ").concat(d))}if(Array.isArray(s.detail)&&s.detail.length>0)for(let i of(c.push("",e.whatISaw),s.detail))c.push(" ".concat(i));if(Array.isArray(s.steps)&&s.steps.length>0)for(let i of(c.push("",e.fixSteps),s.steps))c.push(" ".concat(i));return s.copy&&"string"==typeof s.copy.text&&s.copy.text&&c.push("",s.copy.text),c.join("\n")}(x,{worth:m("disc.worth",a.UI.discoveries.worth),whatISaw:m("radar.whatISaw",a.UI.discoveries.whatISaw),fixSteps:m("disc.fixSteps",a.UI.discoveries.fixSteps)},l.XF),label:a.UI.discoveries.copyDetails,labelKey:"btn.copyDetails"}),j&&(null==(h=x.devDetail)?void 0:h.map(s=>(0,c.jsx)(r.B,{mono:!0,children:s},s)))]})}function m(s){let{d:e,cockpit:i}=s,d=(0,n.kj)(),t=i.dismissed.find(s=>s.id===e.id);return(null==t?void 0:t.resurface)?(0,c.jsxs)("div",{className:"disc-resurface",children:[(0,c.jsx)("p",{className:"k",children:d("disc.changedSince",a.UI.discoveries.changedSince)}),(0,c.jsxs)("p",{children:[(0,c.jsx)("span",{className:"m",children:d("disc.dismissedThen",a.UI.discoveries.dismissedThen)})," ",(0,c.jsx)(r.B,{children:t.sentence})]}),(0,c.jsxs)("p",{children:[(0,c.jsx)("span",{className:"m",children:d("disc.dismissedNow",a.UI.discoveries.dismissedNow)})," ",(0,c.jsx)(r.B,{children:t.resurface.current})]}),(0,c.jsxs)("div",{className:"disc-foot",children:[(0,c.jsx)("button",{className:"b2 q",onClick:()=>i.stillDismiss(e.id),children:d("disc.stillDismiss",a.UI.discoveries.stillDismiss)}),(0,c.jsx)("button",{className:"b2 q",onClick:()=>i.undismiss(e.id),children:d("disc.undismiss",a.UI.discoveries.undismiss)})]})]}):null}function p(s){let{d:e,cockpit:i}=s,d=(0,n.kj)();return(0,c.jsx)(h.ob,{actions:[{label:d("disc.dismiss",a.UI.discoveries.dismiss),effect:d("eff.dismiss",a.UI.discoveries.effDismiss),onClick:()=>{i.doDismiss(e.id,e.verdict)}}]})}function v(s){var e,i;let{d:r,row:o,cockpit:h}=s,v=(0,d.useContext)(t.vC),[u,f]=(0,d.useState)(!1),N=(0,n.kj)(),g=(0,n.XE)(),k=(0,c.jsx)(n.T,{k:"cat.".concat(r.cat),en:null!=(e=a.UI.discoveries.cat[r.cat])?e:r.cat}),I=r.verdictP?(0,c.jsx)(n.P,{p:r.verdictP}):r.verdict,b=r.why?(0,c.jsxs)(c.Fragment,{children:[N("disc.worth",a.UI.discoveries.worth)," ",g((i=(0,l.XF)(r.why,r.quoted)).charAt(0).toLowerCase()+i.slice(1))]}):null,y=r.detail&&r.detail.length>0||r.steps&&r.steps.length>0||o&&!!r.og,U=h?(0,c.jsx)(p,{d:r,cockpit:h}):null,C=h?(0,c.jsx)(m,{d:r,cockpit:h}):null;return o?(0,c.jsxs)("div",{className:"wkrow".concat(u?" open":""),children:[(0,c.jsx)("span",{className:"fcat",children:k}),(0,c.jsxs)("span",{className:"fact",children:[I,b&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)("br",{}),(0,c.jsx)("span",{className:"why",children:b})]}),r.delta&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)("br",{}),(0,c.jsx)("span",{className:"why",children:r.delta})]}),C]}),y&&(0,c.jsx)(x,{open:u,onClick:()=>f(!u),seeCard:!!r.og}),U,u&&(0,c.jsxs)("div",{className:"wkdepth",children:[r.og&&(0,c.jsx)(w,{og:r.og}),(0,c.jsx)(j,{d:r}),r.link&&(0,c.jsx)("a",{className:"b2 q",href:r.link.href,children:r.link.label}),v&&r.dev&&(0,c.jsx)("div",{className:"devline",children:r.dev})]})]}):(0,c.jsxs)("div",{className:"disc",children:[(0,c.jsx)("div",{className:"fcat",children:k}),(0,c.jsx)("b",{children:I}),b&&(0,c.jsx)("p",{children:b}),r.delta&&(0,c.jsx)("p",{children:r.delta}),C,r.og&&(0,c.jsx)(w,{og:r.og}),(y||r.link||U)&&(0,c.jsxs)("div",{className:"disc-foot",children:[y&&(0,c.jsx)(x,{open:u,onClick:()=>f(!u),seeCard:!!r.og}),r.link&&(0,c.jsx)("a",{className:"b2 q",href:r.link.href,children:r.link.label}),U]}),y&&u&&(0,c.jsx)("div",{className:"evd",children:(0,c.jsx)(j,{d:r})}),v&&r.dev&&(0,c.jsx)("div",{className:"devline",children:r.dev})]})}function u(s){let{d:e,cockpit:i}=s;return(0,c.jsx)(v,{d:e,cockpit:i})}function f(s){let{d:e,cockpit:i}=s;return(0,c.jsx)(v,{d:e,row:!0,cockpit:i})}function w(s){var e;let{og:i}=s,d=(0,n.kj)();return i.title||i.description||i.image?(0,c.jsxs)("div",{className:"ogcard",children:[i.image&&(0,c.jsx)("img",{src:i.image,alt:""}),(0,c.jsxs)("div",{className:"ogcard-body",children:[(0,c.jsx)("div",{className:"ogcard-title",children:(0,c.jsx)(r.B,{children:null!=(e=i.title)?e:d("disc.ogNoTitle",a.UI.discoveries.ogNoTitle)})}),i.description&&(0,c.jsx)("div",{className:"ogcard-desc",children:(0,c.jsx)(r.B,{children:i.description})}),(0,c.jsx)("div",{className:"ogcard-host",children:(0,c.jsx)(r.B,{mono:!0,children:i.host})})]})]}):(0,c.jsx)("div",{className:"ogcard bare",children:d("disc.ogBare",a.UI.discoveries.ogBare)})}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7897],{2613:(e,n,t)=>{t.d(n,{fn:()=>h,hf:()=>u,ob:()=>d,tU:()=>m});var s=t(5155),a=t(2115),i=t(7650),l=t(436),r=t(5310),c=t(3034),o=t(797);function d(e){let{actions:n,label:t}=e,[c,d]=(0,a.useState)(!1),[u,h]=(0,a.useState)(null),m=(0,a.useRef)(null),p=(0,a.useRef)(null),j=(0,a.useId)(),x=(0,r.kj)(),g=(0,r.cO)(),f=(0,a.useCallback)(()=>{var e,n,t;let s=null==(e=m.current)?void 0:e.firstElementChild;if(!s)return;let a=s.getBoundingClientRect(),i=null!=(t=null==(n=p.current)?void 0:n.offsetHeight)?t:0,l=window.innerHeight-a.bottom,r=i>0&&l<i+8&&a.top>l;h({top:r?a.top-i-4:a.bottom+4,end:Math.max(4,window.innerWidth-a.right),flip:r})},[]);return((0,a.useLayoutEffect)(()=>{c&&f()},[c,f]),(0,a.useEffect)(()=>{if(!c)return;let e=e=>{var n,t;let s=e.target;(null==(n=m.current)?void 0:n.contains(s))||(null==(t=p.current)?void 0:t.contains(s))||d(!1)},n=e=>{"Escape"===e.key&&d(!1)},t=()=>f();return document.addEventListener("mousedown",e),document.addEventListener("keydown",n),window.addEventListener("scroll",t,!0),window.addEventListener("resize",t),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",n),window.removeEventListener("scroll",t,!0),window.removeEventListener("resize",t)}},[c,f]),0===n.length)?null:(0,s.jsxs)("div",{className:"ovf",ref:m,children:[(0,s.jsxs)("button",{className:"ovf-btn",type:"button","aria-haspopup":"menu","aria-expanded":c,"aria-controls":j,...(0,o.uN)(g.moreActions),onClick:()=>d(e=>!e),children:[(0,s.jsx)(r.T,{k:"btn.more",en:null!=t?t:l.UI.radar.moreActions})," ",(0,s.jsx)("span",{"aria-hidden":!0,children:"▾"})]}),c&&"undefined"!=typeof document&&(0,i.createPortal)((0,s.jsx)("div",{className:"ovf-menu",id:j,role:"menu",ref:p,"aria-label":x("act.moreAria",l.UI.radar.moreActionsAria),style:u?{insetBlockStart:u.top,insetInlineEnd:u.end}:{visibility:"hidden"},children:n.map(e=>(0,s.jsxs)("button",{role:"menuitem",type:"button",...(0,o.uN)(e.title),className:e.danger?"danger":void 0,onClick:()=>{d(!1),e.onClick()},children:[e.label,e.effect&&(0,s.jsx)("span",{children:e.effect})]},e.label))}),document.body)]})}function u(e){let{done:n,total:t,working:a}=e,i=(0,r.kj)();(0,r.cO)();let o="ar"===(0,r.uU)();return t>0&&n<t?(0,s.jsxs)("div",{className:"streamline",role:"status","aria-live":"polite",children:[(0,s.jsx)("i",{"aria-hidden":!0}),o?(0,s.jsxs)(s.Fragment,{children:[i("stream.countingLead","")," ",(0,s.jsx)(c.V,{n:n})," ",i("stream.countingMid","")," ",(0,s.jsx)(c.V,{n:t})," ",i("stream.countingTail","")]}):l.UI.stream.counting(n,t)]}):a?(0,s.jsxs)("div",{className:"streamline",role:"status","aria-live":"polite",children:[(0,s.jsx)("i",{"aria-hidden":!0}),i("stream.starting",l.UI.stream.starting)]}):null}function h(e){let{view:n,onChange:t}=e,a=(0,r.kj)();return(0,r.cO)(),(0,s.jsxs)("div",{className:"viewseg",role:"group","aria-label":a("radar.viewAria",l.UI.radar.viewAria),children:[(0,s.jsx)("button",{type:"button",className:"cards"===n?"on":"","aria-pressed":"cards"===n,onClick:()=>t("cards"),children:(0,s.jsx)(r.T,{k:"btn.grid",en:l.UI.radar.viewGrid})}),(0,s.jsx)("button",{type:"button",className:"rows"===n?"on":"","aria-pressed":"rows"===n,onClick:()=>t("rows"),children:(0,s.jsx)(r.T,{k:"btn.rows",en:l.UI.radar.viewRows})})]})}function m(e){let{tabs:n,active:t,onChange:a,label:i,vertical:l}=e;return(0,s.jsx)("div",{className:"tabs".concat(l?" tabs-v":""),role:"tablist","aria-orientation":l?"vertical":void 0,"aria-label":i,children:n.map(e=>(0,s.jsxs)("button",{type:"button",role:"tab",id:"tab-".concat(e.id),className:e.id===t?"on":"","aria-selected":e.id===t,"aria-controls":"panel-".concat(e.id),onClick:()=>a(e.id),children:[e.label,void 0!==e.count&&(0,s.jsx)("span",{className:"tabn",children:e.count})]},e.id))})}},7897:(e,n,t)=>{t.d(n,{cc:()=>k,Uj:()=>U,ou:()=>F,ct:()=>M,kc:()=>R,aA:()=>v,G2:()=>E,yn:()=>b,j4:()=>V,Wj:()=>f});var s=t(5155),a=t(2115),i=t(7064),l=t(5163),r=t(7e3),c=t(2696),o=t(2613),d=t(436),u=t(5310),h=t(5834),m=t(8706),p=t(3034);let j={unreachable:"no connection",down:"GitHub down",expired:"token expired",unauthorized:"token refused",forbidden:"not granted",ratelimited:"rate limit",timeout:"no answer",moved:"remote moved","past-ceiling":"past the scan limit"},x=Object.fromEntries(Object.keys(j).map(e=>[e,"GitHub not checked (".concat(j[e],")")]));var g=t(797);function f(e){let n=(0,u.kj)();(0,u.cO)();let[t,i]=(0,a.useState)(null),[l,r]=(0,a.useState)(null),c=(0,u.Je)(),o=e=>{r(e),setTimeout(()=>r(n=>n===e?null:n),4500)},h=async(t,s,a,i)=>{var l;let r=await e.doIgnore(t,s,a,i);o(r.ok?c((0,m.ph)("toast.ignored",d.UI.radar.ignoredToast,a)):null!=(l=r.message)?l:n("common.somethingWrong",d.UI.common.somethingWrong))},p=(0,s.jsxs)(s.Fragment,{children:[l&&(0,s.jsx)("div",{className:"toast",role:"status",children:l}),t&&(0,s.jsx)("div",{className:"confirm-overlay",role:"dialog","aria-modal":"true",children:(0,s.jsxs)("div",{className:"confirm",children:[(0,s.jsx)("p",{children:t.message}),(0,s.jsxs)("div",{className:"setup-actions",children:[(0,s.jsx)("button",{className:"b",onClick:()=>{h(t.id,t.kind,t.label,t.snapshot),i(null)},children:n("act.ignoreIt",d.UI.radar.ignoreIt)}),(0,s.jsx)("button",{className:"b accent",onClick:()=>i(null),children:n("act.keepWatching",d.UI.radar.keepWatching)})]})]})})]});return{requestIgnore:(e,n,t,s,a,l)=>{s?i({id:e,kind:n,label:t,message:a,snapshot:l}):h(e,n,t,l)},ignoreThen:h,showToast:o,overlays:p}}function v(e){let{view:n,onChange:t}=e;return(0,s.jsx)(o.fn,{view:n,onChange:t})}function k(e){let{value:n,onChange:t,showLabel:a=d.UI.common.show,hideLabel:i=d.UI.common.collapse,showKey:l="btn.show",hideKey:r="btn.collapse"}=e;return(0,s.jsx)("button",{className:"collapse","aria-expanded":!n,onClick:()=>t(!n),children:n?(0,s.jsx)(u.T,{k:l,en:a}):(0,s.jsx)(u.T,{k:r,en:i})})}function N(e){let{pinned:n,onPin:t,onIgnore:a}=e,i=(0,u.kj)(),l=(0,u.cO)();return(0,s.jsx)(o.ob,{actions:[{label:n?i("act.unpin",d.UI.radar.unpin):i("act.pin",d.UI.radar.pinLabel),title:l.pin,onClick:t,effect:n?i("eff.unpin",d.UI.radar.effUnpin):i("eff.pin",d.UI.radar.effPin)},{label:i("act.ignore",d.UI.radar.ignoreLabel),title:l.ignore,onClick:a,effect:i("eff.ignore",d.UI.radar.effIgnore)}]})}let b=e=>e.path.toLowerCase();function w(e){if(!e)return null;let n=new Date(e).getTime();if(!Number.isFinite(n))return null;let t=Date.now()-n;return t<0?null:Math.floor(t/864e5)}function y(e){var n;let{p:t,tone:a,cockpit:c}=e,o=(0,u.kj)(),m=null!==a&&"clean"!==a,p=(0,u.cO)(),j=w(t.lastActivity),x=c.isDupe(t.name)&&("dormant"===t.staleness||"forgotten"===t.staleness)?(0,l.ih)(t,c.projects):null,f=x&&"unproven"!==x.kind?x.others:[],v=f.length>0?f.map(e=>(0,r.oV)(e.path,26)).join(", "):null,k=null!==v,N=[];return t.changedTotal>0&&N.push((0,s.jsxs)("b",{...(0,g.uN)(p.unsaved),children:[t.changedTotal," unsaved"]},"u")),t.deleted>0&&N.push((0,s.jsxs)("b",{...(0,g.uN)(p.deleted),children:[t.deleted," deleted"]},"del")),(null!=(n=t.ahead)?n:0)>0&&N.push(t.uncommitted>0?(0,s.jsxs)("span",{...(0,g.uN)(p.unpushed),children:[t.ahead," unpushed"]},"a"):(0,s.jsxs)("b",{...(0,g.uN)(p.unpushed),children:[t.ahead," unpushed"]},"a")),(0,l.ze)(t)&&N.push((0,s.jsx)("b",{...(0,g.uN)(p.onlyHere),children:"only on this machine"},"nr")),t.isGit||t.looksDownloaded||N.push((0,s.jsx)("span",{...(0,g.uN)(p.noHistory),children:"no git history"},"ng")),k&&0===t.uncommitted&&null!==j&&N.push((0,s.jsxs)("span",{...(0,g.uN)(p.dormant),children:["dormant ",j,"d"]},"d")),v&&(null==x?void 0:x.kind)==="duplicate"?N.push((0,s.jsxs)("span",{...(0,g.uN)(p.duplicate),children:["duplicate of ",v]},"dup")):v&&(null==x?void 0:x.kind)==="sharesName"&&N.push((0,s.jsxs)("span",{...(0,g.uN)(p.sharesName),children:["shares a name with ",v]},"dup")),null===a?N.push((0,s.jsx)("span",{className:"dim-t",children:(0,s.jsx)(h.h,{children:o("common.checking",d.UI.common.checking)})},"chk")):m||N.push((0,s.jsx)("span",{className:"okw",...(0,g.uN)(p.clean),children:"clean ✓"},"ok")),t.looksDownloaded?N.push((0,s.jsx)("span",{...(0,g.uN)(p.downloadedCopy),children:"looks downloaded"},"dl")):t.lastActivity&&!(k&&0===t.uncommitted)&&N.push((0,s.jsxs)("span",{children:[t.lastCommit?m?"last commit ":"committed ":"touched ",(0,s.jsx)(i.fV,{ts:t.lastActivity})]},"t")),(0,s.jsx)("div",{className:"c-fact",children:N.map((e,n)=>(0,s.jsxs)("span",{children:[n>0&&" \xb7 ",e]},n))})}function C(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(e,n)=>n;return[b(e),"project",e.name,(0,l.ze)(e),n("confirm.projectShort",d.UI.radar.confirmProjectShort),{uncommitted:e.uncommitted,hasRemote:e.hasRemote}]}function I(e){var n,t,r,c,o,h;let{p:m,cockpit:p}=e,j=(0,a.useContext)(i.vC),x=(0,u.kj)(),f=(0,u.cO)(),v=(null!=(t=null==(n=p.cfg)?void 0:n.roots)?t:[]).find(e=>e.toLowerCase()===b(m));return(0,s.jsxs)(s.Fragment,{children:[m.looksDownloaded?(0,s.jsx)("span",{children:"Looks like something downloaded rather than something you wrote."}):(0,l.ze)(m)?(0,s.jsx)("span",{children:"No remote copy exists - one disk failure and it's gone."}):m.hasRemote?(0,s.jsxs)("span",{...(0,g.uN)(f.remote),children:["Backed up to a remote ✓",(null!=(r=m.ahead)?r:0)>0&&(0,s.jsxs)(s.Fragment,{children:[" - ",m.ahead," commit",1===m.ahead?"":"s"," not pushed yet"]})]}):null,j&&m.isGit&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("span",{className:"mono",children:["branch ",null!=(c=m.branch)?c:"-"," \xb7 remote ",null!=(h=null!=(o=m.remoteUrl)?o:m.remoteName)?h:"-",null!=m.ahead&&null!=m.behind&&(0,s.jsxs)(s.Fragment,{children:[" \xb7 ",m.ahead," ahead / ",m.behind," behind"]}),null!=m.commitCount&&(0,s.jsxs)(s.Fragment,{children:[" \xb7 ",m.commitCount," commits"]})]}),m.dirtyFiles.length>0&&(0,s.jsxs)("span",{className:"mono",children:["changed: ",m.dirtyFiles.join(", "),m.changedTotal>m.dirtyFiles.length?" … +".concat(m.changedTotal-m.dirtyFiles.length," more"):""]}),m.deletedFiles.length>0&&(0,s.jsxs)("span",{className:"mono",children:["deleted: ",m.deletedFiles.join(", "),m.deleted>m.deletedFiles.length?" … +".concat(m.deleted-m.deletedFiles.length," more"):""]})]}),j&&(0,s.jsx)("span",{className:"mono",children:m.path}),v&&(0,s.jsx)("button",{className:"b danger",style:{justifySelf:"start"},...(0,g.uN)(f.unwatch),onClick:()=>p.post({action:"removeRoot",path:v}).then(e=>{e.ok&&p.resolveRow(v)}),children:x("act.stopWatchingFolder",d.UI.radar.stopWatchingFolder)})]})}function U(e){let{p:n,tone:t,cockpit:a,change:i,open:l,onToggle:o,onIgnoreRequest:h,onToast:m}=e,p=null!==t&&"clean"!==t,j=a.isPinned(b(n)),x=(0,u.kj)();return(0,u.cO)(),(0,s.jsxs)("div",{[c.J6]:b(n),className:"card".concat(p?" warn":"").concat(j?" pinned":""),children:[(0,s.jsxs)("div",{className:"c-top",children:[(0,s.jsx)("span",{className:"dot ".concat(null===t?"u":p?"a":"g"),"aria-hidden":!0}),(0,s.jsx)("b",{children:n.name}),i&&(0,s.jsx)("span",{className:"chg",children:i})]}),(0,s.jsx)(y,{p:n,tone:t,cockpit:a}),(0,s.jsx)(T,{p:n,cockpit:a}),(0,s.jsx)("div",{className:"c-path",children:(0,r.oV)(n.path,40)}),(0,s.jsxs)("div",{className:"c-foot",children:[(0,s.jsx)("button",{className:"b2 q",onClick:o,"aria-expanded":l,children:l?(0,s.jsx)(u.T,{k:"btn.hide",en:d.UI.common.hide}):(0,s.jsx)(u.T,{k:"btn.details",en:d.UI.common.details})}),!a.demo&&(0,s.jsx)(c.Fb,{cockpit:a,project:n,onToast:m,link:!0}),!a.demo&&(0,s.jsx)(c.r8,{path:n.path}),(0,s.jsx)(N,{pinned:j,onPin:()=>a.togglePin(b(n)),onIgnore:()=>h(...C(n,x))})]}),l&&(0,s.jsx)("div",{className:"c-detail",children:(0,s.jsx)(I,{p:n,cockpit:a})})]})}function F(e){let{p:n,tone:t,cockpit:a,change:i,open:l,onToggle:o,onIgnoreRequest:d}=e,h=null!==t&&"clean"!==t,m=a.isPinned(b(n)),p=a.isDupe(n.name),j=(0,u.kj)();return(0,u.cO)(),(0,s.jsxs)("div",{[c.J6]:b(n),className:"irow".concat(h?" warn":""),children:[(0,s.jsxs)("div",{className:"irow-line",children:[(0,s.jsxs)("button",{className:"irow-main",onClick:o,"aria-expanded":l,children:[(0,s.jsx)("span",{className:"dot ".concat(null===t?"u":h?"a":"g"),"aria-hidden":!0}),(0,s.jsxs)("span",{className:"irow-name",children:[n.name,p&&(0,s.jsxs)("span",{className:"irow-parent",children:[" (",function(e){let n=e.split(/[\\/]/).filter(Boolean);return n.length>1?n[n.length-2]:e}(n.path),")"]})]}),i&&(0,s.jsx)("span",{className:"chg",children:i}),(0,s.jsx)("span",{className:"irow-truth".concat(h?" warn":""),children:(0,s.jsx)(A,{p:n,tone:t,cockpit:a})}),(0,s.jsx)("span",{className:"irow-path",children:(0,r.oV)(n.path,40)})]}),(0,s.jsx)(T,{p:n,cockpit:a}),(0,s.jsxs)("span",{className:"qk",children:[!a.demo&&(0,s.jsx)(c.r8,{path:n.path}),(0,s.jsx)(N,{pinned:m,onPin:()=>a.togglePin(b(n)),onIgnore:()=>d(...C(n,j))})]})]}),l&&(0,s.jsx)("div",{className:"irow-detail",children:(0,s.jsx)(I,{p:n,cockpit:a})})]})}function T(e){var n,t,a,l;let{p:r,cockpit:c}=e,o=(0,u.kj)(),h=null!=(t=null==(n=c.radar)?void 0:n.github)?t:null;if(!h)return null;let m=(a=r.path,h&&null!=(l=h.byPath[a.toLowerCase()])?l:null),f=function(e){if(!e)return null;let n=/[/@]github\.com[:/]+([^/]+)\/([^/]+?)(?:\.git)?\/?$/.exec(e);return n?"".concat(n[1],"/").concat(n[2]):null}(r.remoteUrl),v=f?(0,s.jsxs)("span",{className:"gh-prov",children:[(0,s.jsx)(p.En,{children:f}),(null==m?void 0:m.ok)?(0,s.jsxs)(s.Fragment,{children:[" \xb7 ",o("connections.ghCardChecked",d.UI.connections.ghCardChecked)," ",(0,s.jsx)(i.fV,{ts:h.at})]}):m?null:(0,s.jsxs)(s.Fragment,{children:[" \xb7 ",o("connections.ghCardNever",d.UI.connections.ghCardNever)]})]}):null;if(!m)return h.outage?(0,s.jsxs)("span",{className:"gh-chips",children:[v,(0,s.jsx)(p.En,{children:(0,s.jsx)("span",{className:"chip plain",children:"GitHub not checked yet"})})]}):null;if(!m.ok)return(0,s.jsxs)("span",{className:"gh-chips",children:[v,(0,s.jsx)(p.En,{children:(0,s.jsx)("span",{className:"chip plain",children:x[m.kind]})})]});let k=m.value,N=[];if(k.ci.ok&&k.ci.value){let e=k.ci.value,n="passing"===e.state?"calm":"failing"===e.state?"bad":"plain",t="passing"===e.state?"✓":"failing"===e.state?"✗":"\xb7";N.push((0,s.jsxs)("span",{className:"chip ".concat(n),children:["CI ",t," ",e.branch]},"ci"))}else{let e;k.ci.ok||N.push((0,s.jsx)("span",{className:"chip plain",children:(e=k.ci.kind,"".concat("CI"," not checked (").concat(j[e],")"))},"ci"))}if(k.prCount.ok&&k.prCount.value>0){let e=k.prCount.value;N.push((0,s.jsxs)("span",{className:"chip plain",children:[e,k.prCapped?"+":""," PR",1!==e||k.prCapped?"s":""]},"pr"))}if(k.issueCount.ok&&k.issueCount.value>0){let e=k.issueCount.value;N.push((0,s.jsxs)("span",{className:"chip plain",children:[e," issue",1===e?"":"s"]},"is"))}return("confirmed"===k.backup.verdict&&N.push((0,s.jsx)("span",{className:"chip calm",...(0,g.uN)("af360 asked GitHub, and GitHub has this exact commit"),children:"GitHub confirms"},"bk")),0===N.length)?v?(0,s.jsx)("span",{className:"gh-chips",children:v}):null:(0,s.jsxs)("span",{className:"gh-chips",children:[v,(0,s.jsx)(p.En,{children:N})]})}function A(e){var n;let{p:t,tone:a,cockpit:r}=e,c=(0,u.cO)(),o=r.isDupe(t.name)&&("dormant"===t.staleness||"forgotten"===t.staleness)?(0,l.ih)(t,r.projects):null,d=(null==o?void 0:o.kind)==="duplicate",h=w(t.lastActivity);return t.looksDownloaded?(0,s.jsx)("span",{...(0,g.uN)(c.downloadedCopy),children:"looks downloaded"}):t.uncommitted>0?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("span",{...(0,g.uN)(c.unsaved),children:[t.uncommitted," unsaved"]})," \xb7 last commit ",t.lastActivity?(0,s.jsx)(i.fV,{ts:t.lastActivity}):"never"]}):(0,l.ze)(t)?(0,s.jsx)("span",{...(0,g.uN)(c.onlyHere),children:"only on this machine"}):(null!=(n=t.ahead)?n:0)>0?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("span",{...(0,g.uN)(c.unpushed),children:[t.ahead," unpushed"]})," \xb7 committed ",t.lastActivity?(0,s.jsx)(i.fV,{ts:t.lastActivity}):"-"]}):"clean"!==a&&d&&null!==h?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("span",{...(0,g.uN)(c.dormant),children:["dormant ",h,"d"]})," \xb7 ",(0,s.jsx)("span",{...(0,g.uN)(c.duplicate),children:"duplicate"})]}):t.lastActivity?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("span",{...(0,g.uN)(c.clean),children:"clean ✓"})," \xb7 committed ",(0,s.jsx)(i.fV,{ts:t.lastActivity})]}):(0,s.jsx)("span",{...(0,g.uN)(c.noHistory),children:"no history"})}function E(e,n){var t;return null!=(t=e.find(e=>e.subjectId===n))?t:null}function L(e){let n=e.entry.label||B(e.entry.url),t=!!e.current&&!e.current.ok;return[e.entry.id,"url",n,t,d.UI.radar.confirmSite,{down:t}]}function P(e){let{u:n,incident:t}=e,l=(0,a.useContext)(i.vC),r=(0,u.kj)();(0,u.cO)();let c=n.current;if(!c)return(0,s.jsx)("span",{children:(0,s.jsx)(h.h,{children:r("site.firstCheck",d.UI.radar.firstCheck)})});if(!c.ok)return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("b",{children:D(n.sinceText)}),l&&c.status?" \xb7 HTTP ".concat(c.status):"",(null==t?void 0:t.acknowledged)?" \xb7 being handled ✓":""]});let o=D(n.sinceText).replace(/^up for /,"up "),m=(null==t?void 0:t.endedTs)?(0,s.jsxs)(s.Fragment,{children:["last incident ",(0,s.jsx)(i.fV,{ts:t.endedTs})]}):(0,s.jsx)(s.Fragment,{children:"no incidents while watching"});return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("span",{className:"okw",children:o})," \xb7 ","number"==typeof c.ms?"".concat(c.ms," ms"):"-",l&&c.status?" \xb7 HTTP ".concat(c.status):""," \xb7 ",m]})}function O(e){var n,t,a,i;let{u:l,cockpit:r}=e,c=l.current,o=B(l.entry.url),d=null==(n=r.expiry)?void 0:n.items.find(e=>"ssl"===e.kind&&e.name===o),u=Object.entries(null!=(t=null==c?void 0:c.headers)?t:{}),h=["strict-transport-security","content-security-policy"].filter(e=>{var n;return!(null!=(n=null==c?void 0:c.headers)?n:{})[e]});return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("span",{className:"mono",children:["HTTP ",null!=(a=null==c?void 0:c.status)?a:"-"," \xb7 total ","number"==typeof(null==c?void 0:c.ms)?"".concat(c.ms," ms"):"-"," \xb7 checked ",c?new Date(c.ts).toLocaleTimeString():"-"]}),d&&(0,s.jsxs)("span",{className:"mono",children:["cert: ",null!=(i=d.issuer)?i:"unknown issuer",d.serial?" \xb7 serial ".concat(d.serial):""]}),u.length>0&&(0,s.jsxs)("span",{className:"mono",children:["headers: ",u.map(e=>{let[n,t]=e;return"".concat(n,": ").concat(t)}).join(" \xb7 ")]}),h.length>0&&(0,s.jsxs)("span",{className:"mono",children:["missing: ",h.join(", ")]})]})}function H(e){let{u:n,cockpit:t,incident:l}=e,r=(0,u.kj)(),c=(0,u.cO)(),o=(0,a.useContext)(i.vC);return(0,s.jsxs)(s.Fragment,{children:[l&&!l.endedTs&&(0,s.jsxs)("span",{children:["Ongoing: down since ",(0,s.jsx)(i.fV,{ts:l.startedTs,skewForm:"core"}),l.acknowledged?" \xb7 being handled ✓":""]}),o&&(0,s.jsx)(O,{u:n,cockpit:t}),(0,s.jsx)("a",{href:n.entry.url,target:"_blank",rel:"noreferrer",children:n.entry.url}),(0,s.jsx)("button",{className:"b danger",style:{justifySelf:"start"},...(0,g.uN)(c.unwatch),onClick:()=>t.post({action:"removeUrl",id:n.entry.id}).then(e=>{e.ok&&t.resolveRow(n.entry.id)}),children:r("act.stopWatchingSite",d.UI.radar.stopWatchingSite)})]})}function M(e){let{u:n,tone:t,cockpit:a,incident:i,open:l,onToggle:o,onIgnoreRequest:h,extra:m}=e,p=n.current,j="red"===t;(0,u.kj)(),(0,u.cO)();let x=a.isPinned(n.entry.id),g=n.entry.label||B(n.entry.url);return(0,s.jsxs)("div",{className:"card site".concat(j?" bad":"").concat(x?" pinned":""),children:[(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{className:"c-top",children:[(0,s.jsx)("span",{className:"dot ".concat(null!==t&&p?j?"r":"g":"u"),"aria-hidden":!0}),(0,s.jsx)("b",{children:g})]}),(0,s.jsx)("div",{className:"c-fact",children:(0,s.jsx)(P,{u:n,incident:i})}),(0,s.jsx)("div",{className:"c-path",children:(0,r.oV)(n.entry.url,44)}),(0,s.jsxs)("div",{className:"c-foot",children:[(0,s.jsx)("button",{className:"b2 q",onClick:o,"aria-expanded":l,children:l?(0,s.jsx)(u.T,{k:"btn.hide",en:d.UI.common.hide}):(0,s.jsx)(u.T,{k:"btn.details",en:d.UI.common.details})}),(0,s.jsx)(c.r8,{path:n.entry.url,label:d.UI.radar.copyAddress,labelKey:"btn.copyAddress"}),(0,s.jsx)(N,{pinned:x,onPin:()=>a.togglePin(n.entry.id),onIgnore:()=>h(...L(n))}),m]})]}),(0,s.jsx)(S,{history:n.history}),l&&(0,s.jsx)("div",{className:"c-detail",style:{gridColumn:"1 / -1"},children:(0,s.jsx)(H,{u:n,cockpit:a,incident:i})})]})}function R(e){let{u:n,tone:t,cockpit:a,incident:i,open:l,onToggle:o,onIgnoreRequest:m,extra:p}=e,j=n.current,x="red"===t,g=(0,u.kj)();(0,u.cO)();let f=a.isPinned(n.entry.id),v=n.entry.label||B(n.entry.url);return(0,s.jsxs)("div",{className:"irow".concat(x?" bad":""),children:[(0,s.jsxs)("div",{className:"irow-line",children:[(0,s.jsxs)("button",{className:"irow-main",onClick:o,"aria-expanded":l,children:[(0,s.jsx)("span",{className:"dot ".concat(null!==t&&j?x?"r":"g":"u"),"aria-hidden":!0}),(0,s.jsx)("span",{className:"irow-name",children:v}),(0,s.jsx)("span",{className:"irow-truth".concat(x?" bad":""),children:j?x?D(n.sinceText):"".concat(D(n.sinceText).replace(/^up for /,"up ")," \xb7 ").concat(j.ms," ms"):(0,s.jsx)(h.h,{children:g("site.firstCheck",d.UI.radar.firstCheck)})}),(0,s.jsx)("span",{className:"irow-path",children:(0,r.oV)(n.entry.url,36)})]}),(0,s.jsxs)("span",{className:"qk",children:[(0,s.jsx)(c.r8,{path:n.entry.url,label:d.UI.radar.copyAddress,labelKey:"btn.copyAddress"}),(0,s.jsx)(N,{pinned:f,onPin:()=>a.togglePin(n.entry.id),onIgnore:()=>m(...L(n))}),p]})]}),l&&(0,s.jsxs)("div",{className:"irow-detail",children:[(0,s.jsx)("div",{style:{maxInlineSize:260},children:(0,s.jsx)(S,{history:n.history})}),(0,s.jsx)(H,{u:n,cockpit:a,incident:i})]})]})}function S(e){let{history:n}=e,t=(0,u.kj)();if((0,u.cO)(),n.length<10){let e=n.length>0?Math.round((Date.now()-n[0].ts)/6e4):0,a=e>0?e:0;return(0,s.jsx)("div",{className:"spark",children:(0,s.jsxs)("span",{className:"spark-wait",children:[t("site.historyBuilds",d.UI.radar.historyBuilds),a>0?" \xb7 ".concat(a,"m watched"):(0,s.jsx)(h.g,{})]})})}let a=n.length>40?function(e,n){let t=[];for(let s=0;s<40;s++)t.push(e[Math.round(s*(e.length-1)/(n-1))]);return t}(n,40):n,i=a.filter(e=>e.ok&&"number"==typeof e.ms).map(e=>e.ms),l=Math.max(...i,1),r=Math.min(...i),c=e=>130*e/(a.length-1),o=a.map((e,n)=>e.ok&&"number"==typeof e.ms?"".concat(c(n).toFixed(1),",").concat((30-(e.ms-r)/Math.max(1,l-r)*20).toFixed(1)):null).filter(Boolean);return(0,s.jsxs)("div",{className:"spark",children:[(0,s.jsxs)("svg",{viewBox:"0 0 ".concat(130," ").concat(34),preserveAspectRatio:"none",role:"img","aria-label":t("site.sparkAria",d.UI.radar.sparkAria),children:[(0,s.jsx)("polygon",{points:"0,".concat(34," ").concat(o.join(" ")," ").concat(130,",").concat(34),fill:"color-mix(in srgb, var(--ok) 12%, transparent)"}),(0,s.jsx)("polyline",{points:o.join(" "),fill:"none",stroke:"var(--ok)",strokeWidth:"1.5"}),a.map((e,n)=>!e.ok&&(0,s.jsx)("rect",{x:c(n)-1.2,y:29,width:2.4,height:4,fill:"var(--bad)"},n))]}),(0,s.jsxs)("span",{className:"cap",children:["24h \xb7 ",r,"-",l," ms"]})]})}function V(e,n,t){let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],[i,l]=(0,a.useState)(null);return G(()=>{let s=()=>{let s=e.current;if(!s||0===n)return;let a=s.firstElementChild;if(!a)return;let i=getComputedStyle(s),r=i.gridTemplateColumns.split(" ").filter(e=>"none"!==e&&""!==e).length||1,c=parseFloat(i.rowGap)||0,o=parseFloat(i.columnGap)||0,d=a.getBoundingClientRect(),u=d.height+c;if(u<=0)return;let h=(s.getBoundingClientRect().width-(r-1)*o)/r,m=Math.max(1,Math.floor(r/Math.max(1,Math.round((d.width+o)/(h+o))))),p=s.getBoundingClientRect().top,j=Math.min(n,Math.max(1,Math.floor((window.innerHeight-p-t+c)/u))*m);l(e=>e===j?e:j)};s();let a=setTimeout(s,120);return window.addEventListener("resize",s),()=>{clearTimeout(a),window.removeEventListener("resize",s)}},[n,t,...s]),null==i?n:Math.min(i,n)}let G=a.useLayoutEffect;function B(e){try{return new URL(e).hostname}catch(n){return e}}function D(e){return e.charAt(0).toLowerCase()+e.slice(1)}}}]);
|