af360 0.1.11 → 0.1.13

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.
Files changed (139) hide show
  1. package/dist/.next/BUILD_ID +1 -1
  2. package/dist/.next/app-build-manifest.json +90 -90
  3. package/dist/.next/app-path-routes-manifest.json +20 -20
  4. package/dist/.next/build-manifest.json +2 -2
  5. package/dist/.next/prerender-manifest.json +36 -36
  6. package/dist/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  7. package/dist/.next/server/app/_not-found.html +1 -1
  8. package/dist/.next/server/app/_not-found.rsc +3 -3
  9. package/dist/.next/server/app/ahead/page.js +1 -1
  10. package/dist/.next/server/app/ahead/page_client-reference-manifest.js +1 -1
  11. package/dist/.next/server/app/ahead.html +1 -1
  12. package/dist/.next/server/app/ahead.rsc +4 -4
  13. package/dist/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
  14. package/dist/.next/server/app/api/card/route_client-reference-manifest.js +1 -1
  15. package/dist/.next/server/app/api/check/route_client-reference-manifest.js +1 -1
  16. package/dist/.next/server/app/api/config/route.js +1 -1
  17. package/dist/.next/server/app/api/config/route_client-reference-manifest.js +1 -1
  18. package/dist/.next/server/app/api/connections/route_client-reference-manifest.js +1 -1
  19. package/dist/.next/server/app/api/connectors/github/route_client-reference-manifest.js +1 -1
  20. package/dist/.next/server/app/api/consent/route_client-reference-manifest.js +1 -1
  21. package/dist/.next/server/app/api/context/route_client-reference-manifest.js +1 -1
  22. package/dist/.next/server/app/api/discover/route_client-reference-manifest.js +1 -1
  23. package/dist/.next/server/app/api/expiry/route_client-reference-manifest.js +1 -1
  24. package/dist/.next/server/app/api/first-light/route_client-reference-manifest.js +1 -1
  25. package/dist/.next/server/app/api/handoff/route.js +1 -1
  26. package/dist/.next/server/app/api/handoff/route_client-reference-manifest.js +1 -1
  27. package/dist/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  28. package/dist/.next/server/app/api/incidents/route_client-reference-manifest.js +1 -1
  29. package/dist/.next/server/app/api/insights/route.js +1 -1
  30. package/dist/.next/server/app/api/insights/route_client-reference-manifest.js +1 -1
  31. package/dist/.next/server/app/api/log/route_client-reference-manifest.js +1 -1
  32. package/dist/.next/server/app/api/pulse/route_client-reference-manifest.js +1 -1
  33. package/dist/.next/server/app/api/radar/route_client-reference-manifest.js +1 -1
  34. package/dist/.next/server/app/api/report/route_client-reference-manifest.js +1 -1
  35. package/dist/.next/server/app/api/services/route_client-reference-manifest.js +1 -1
  36. package/dist/.next/server/app/api/status/route.js +1 -1
  37. package/dist/.next/server/app/api/status/route.js.nft.json +1 -1
  38. package/dist/.next/server/app/api/status/route_client-reference-manifest.js +1 -1
  39. package/dist/.next/server/app/connections/page.js +1 -1
  40. package/dist/.next/server/app/connections/page_client-reference-manifest.js +1 -1
  41. package/dist/.next/server/app/connections.html +1 -1
  42. package/dist/.next/server/app/connections.rsc +4 -4
  43. package/dist/.next/server/app/dashboard/page_client-reference-manifest.js +1 -1
  44. package/dist/.next/server/app/dashboard.html +1 -1
  45. package/dist/.next/server/app/dashboard.rsc +3 -3
  46. package/dist/.next/server/app/discoveries/page.js +2 -2
  47. package/dist/.next/server/app/discoveries/page.js.nft.json +1 -1
  48. package/dist/.next/server/app/discoveries/page_client-reference-manifest.js +1 -1
  49. package/dist/.next/server/app/discoveries.html +1 -1
  50. package/dist/.next/server/app/discoveries.rsc +4 -4
  51. package/dist/.next/server/app/expiry/page_client-reference-manifest.js +1 -1
  52. package/dist/.next/server/app/expiry.html +1 -1
  53. package/dist/.next/server/app/expiry.rsc +3 -3
  54. package/dist/.next/server/app/fleet/page_client-reference-manifest.js +1 -1
  55. package/dist/.next/server/app/fleet.html +1 -1
  56. package/dist/.next/server/app/fleet.rsc +3 -3
  57. package/dist/.next/server/app/home/page_client-reference-manifest.js +1 -1
  58. package/dist/.next/server/app/home.html +1 -1
  59. package/dist/.next/server/app/home.rsc +3 -3
  60. package/dist/.next/server/app/legal/privacy/page_client-reference-manifest.js +1 -1
  61. package/dist/.next/server/app/legal/terms/page_client-reference-manifest.js +1 -1
  62. package/dist/.next/server/app/log/page.js +1 -1
  63. package/dist/.next/server/app/log/page_client-reference-manifest.js +1 -1
  64. package/dist/.next/server/app/log.html +1 -1
  65. package/dist/.next/server/app/log.rsc +4 -4
  66. package/dist/.next/server/app/page_client-reference-manifest.js +1 -1
  67. package/dist/.next/server/app/projects/page.js +1 -1
  68. package/dist/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  69. package/dist/.next/server/app/projects.html +1 -1
  70. package/dist/.next/server/app/projects.rsc +4 -4
  71. package/dist/.next/server/app/radar/page.js +2 -2
  72. package/dist/.next/server/app/radar/page.js.nft.json +1 -1
  73. package/dist/.next/server/app/radar/page_client-reference-manifest.js +1 -1
  74. package/dist/.next/server/app/radar.html +1 -1
  75. package/dist/.next/server/app/radar.rsc +4 -4
  76. package/dist/.next/server/app/report/page.js +1 -1
  77. package/dist/.next/server/app/report/page_client-reference-manifest.js +1 -1
  78. package/dist/.next/server/app/report.html +1 -1
  79. package/dist/.next/server/app/report.rsc +4 -4
  80. package/dist/.next/server/app/settings/page.js +1 -1
  81. package/dist/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  82. package/dist/.next/server/app/settings.html +1 -1
  83. package/dist/.next/server/app/settings.rsc +4 -4
  84. package/dist/.next/server/app/sites/page.js +1 -1
  85. package/dist/.next/server/app/sites/page_client-reference-manifest.js +1 -1
  86. package/dist/.next/server/app/sites.html +1 -1
  87. package/dist/.next/server/app/sites.rsc +4 -4
  88. package/dist/.next/server/app/welcome/page_client-reference-manifest.js +1 -1
  89. package/dist/.next/server/app/welcome.html +1 -1
  90. package/dist/.next/server/app/welcome.rsc +4 -4
  91. package/dist/.next/server/app-paths-manifest.json +20 -20
  92. package/dist/.next/server/chunks/1155.js +1 -1
  93. package/dist/.next/server/chunks/2346.js +1 -1
  94. package/dist/.next/server/chunks/2465.js +1 -1
  95. package/dist/.next/server/chunks/2817.js +1 -1
  96. package/dist/.next/server/chunks/4134.js +1 -1
  97. package/dist/.next/server/chunks/7511.js +1 -1
  98. package/dist/.next/server/chunks/876.js +1 -0
  99. package/dist/.next/server/middleware-manifest.json +1 -1
  100. package/dist/.next/server/pages/404.html +1 -1
  101. package/dist/.next/server/pages/500.html +1 -1
  102. package/dist/.next/static/chunks/1681-b233404f9ec2fc2e.js +1 -0
  103. package/dist/.next/static/chunks/3192-6b341d547a49fa85.js +1 -0
  104. package/dist/.next/static/chunks/5623-ec4f1a6f7695d8d1.js +1 -0
  105. package/dist/.next/static/chunks/7897-6e6c509aea495560.js +1 -0
  106. package/dist/.next/static/chunks/app/ahead/page-e72bed448dd40bd5.js +1 -0
  107. package/dist/.next/static/chunks/app/connections/page-5d6cae02e6f2b49a.js +1 -0
  108. package/dist/.next/static/chunks/app/discoveries/page-52696e6ee0c8d3d5.js +1 -0
  109. package/dist/.next/static/chunks/app/error-37987420de14c10c.js +1 -0
  110. package/dist/.next/static/chunks/app/log/page-45b4cfd8f1a29d09.js +1 -0
  111. package/dist/.next/static/chunks/app/projects/page-75a41d4a90675d93.js +1 -0
  112. package/dist/.next/static/chunks/app/radar/page-4b4aad549dffcd3a.js +1 -0
  113. package/dist/.next/static/chunks/app/report/page-145496e8f0d5bc86.js +1 -0
  114. package/dist/.next/static/chunks/app/settings/page-a38c457b7c57567b.js +1 -0
  115. package/dist/.next/static/chunks/app/sites/page-96a7dcf3c1e9aa19.js +1 -0
  116. package/dist/.next/static/css/94d302c686de7e23.css +1 -0
  117. package/dist/build-id.json +126 -126
  118. package/dist/package.json +1 -1
  119. package/dist/shell/bin/af360-bridge.exe +0 -0
  120. package/package.json +1 -1
  121. package/shell/bin/af360-bridge.exe +0 -0
  122. package/dist/.next/server/chunks/8748.js +0 -1
  123. package/dist/.next/static/chunks/3192-f33976256a7713fd.js +0 -1
  124. package/dist/.next/static/chunks/5449-1f71ab05b6de2699.js +0 -1
  125. package/dist/.next/static/chunks/7482-8061a087c022a160.js +0 -1
  126. package/dist/.next/static/chunks/7897-f8f2f8f462a8bbed.js +0 -1
  127. package/dist/.next/static/chunks/app/ahead/page-ec9c355d92be3655.js +0 -1
  128. package/dist/.next/static/chunks/app/connections/page-78928db455ee443e.js +0 -1
  129. package/dist/.next/static/chunks/app/discoveries/page-09ae376238d3c1da.js +0 -1
  130. package/dist/.next/static/chunks/app/error-1b4c20b17d1105f5.js +0 -1
  131. package/dist/.next/static/chunks/app/log/page-e54cb98e7adc6b08.js +0 -1
  132. package/dist/.next/static/chunks/app/projects/page-bc124fc3f5f66391.js +0 -1
  133. package/dist/.next/static/chunks/app/radar/page-ca0fa3338fe9ddb4.js +0 -1
  134. package/dist/.next/static/chunks/app/report/page-b6eef7480ac39e24.js +0 -1
  135. package/dist/.next/static/chunks/app/settings/page-dd56fc2e097505c7.js +0 -1
  136. package/dist/.next/static/chunks/app/sites/page-7becc8e4436c5016.js +0 -1
  137. package/dist/.next/static/css/9db3c04b1822381e.css +0 -1
  138. /package/dist/.next/static/{24e7279870f90176b29aa → da1c2e66999c334d135d9}/_buildManifest.js +0 -0
  139. /package/dist/.next/static/{24e7279870f90176b29aa → da1c2e66999c334d135d9}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- "use strict";exports.id=2817,exports.ids=[2817],exports.modules={52817:(a,b,c)=>{c.d(b,{GG:()=>o,_d:()=>p,xF:()=>q});var d=c(29021),e=c(33873),f=c.n(e),g=c(71011),h=c(1232),i=c(86587);function j(a){return"unsaved"===a.losable?0:a.losable?1:"expiry"===a.kind?a.entrusted&&!a.cost?1:2:"site"===a.kind?2:3}function k(a){return a?a.items.map((a,b)=>({it:a,i:b})).sort((a,b)=>Number(!!a.it.handled)-Number(!!b.it.handled)||j(a.it)-j(b.it)||Number("red"===b.it.tone)-Number("red"===a.it.tone)||(a.it.since??1/0)-(b.it.since??1/0)||a.i-b.i).map(a=>a.it):[]}var l=c(88804);function m(a){return`${a} project${1===a?"":"s"}`}function n(a=(0,g.yF)()){return f().join(a,"last-look.json")}function o(a){let b=a.now??Date.now(),c=a.attention,d=function(a,b){if(!a)return null;let c=(0,i.yy)(a);if(c)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:c,zero:!c};let d=new Map(b.map(a=>[a.path.toLowerCase(),a])),e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=[];for(let b of a?k(a).filter(a=>!a.handled&&a.losable):[]){let a="project"===b.kind?d.get(b.id):void 0;if(!a)continue;let c=!1;a.statusKnown?a.uncommitted>0&&(m+=a.uncommitted,n++,f+=a.uncommitted,c=!0):q.push({name:a.name,why:`af360 could not read ${a.name}'s working tree, so its unsaved changes are not in this number`,whyP:(0,l.ph)("radius.unmeasured.status","af360 could not read {0}'s working tree, so its unsaved changes are not in this number",a.name)}),(0,i.ze)(a)?(o++,null!==a.commitCount?(p+=a.commitCount,e+=a.commitCount,c=!0):q.push({name:a.name,why:`af360 could not count ${a.name}'s commits, so its history is not in this number`,whyP:(0,l.ph)("radius.unmeasured.commits","af360 could not count {0}'s commits, so its history is not in this number",a.name)})):null!==a.ahead?a.ahead>0&&(h+=a.ahead,j++,e+=a.ahead,c=!0):a.isGit&&a.hasRemote&&q.push({name:a.name,why:`${a.name} has no upstream branch set, so af360 cannot tell which of its commits are only here`,whyP:(0,l.ph)("radius.unmeasured.upstream","{0} has no upstream branch set, so af360 cannot tell which of its commits are only here",a.name)}),c&&g++}for(let a of b)a.isGit||a.looksDownloaded||q.some(b=>b.name===a.name)||q.push({name:a.name,why:`${a.name} is not in git, so af360 has no way to tell whether a copy of it exists anywhere else`,whyP:(0,l.ph)("radius.unmeasured.noGit","{0} is not in git, so af360 has no way to tell whether a copy of it exists anywhere else",a.name)});return{commits:e,files:f,projects:g,components:{unpushed:{commits:h,projects:j},unsaved:{files:m,projects:n},unbacked:{projects:o,commits:p}},unmeasured:q,empty:!1,zero:0===e&&0===f}}(c,a.projects)??{commits:0,files:0,projects:0,components:{unpushed:{commits:0,projects:0},unsaved:{files:0,projects:0},unbacked:{projects:0,commits:0}},unmeasured:[],empty:!0,zero:!1},e=function(a){var b,c;if(a.empty)return{tone:"clean",headline:(0,l.pl)("radius.empty.head","Nothing to lose yet"),under:(0,l.pl)("radius.empty.under","Point af360 at a folder and it will tell you what only exists here.")};if(a.zero){let b=a.unmeasured.length;return{tone:"clean",headline:0===b?(0,l.pl)("radius.zero.head","If this laptop died right now: nothing would be lost."):(0,l.pl)("radius.zero.headPartial","Everything af360 could check has a copy elsewhere"),under:0===b?(0,l.pl)("radius.zero.under","Every project af360 watches also exists somewhere off this machine."):(0,l.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.",m(b))}}let d=[];a.commits>0&&d.push((b=a.commits,`${b} commit${1===b?"":"s"}`)),a.files>0&&d.push((c=a.files,`${c} file${1===c?"":"s"}`));let e=d.join(", ");return{tone:"amber",headline:(0,l.ph)("radius.head","If this laptop died right now: {0} across {1} - gone forever.",e,m(a.projects)),under:(0,l.pl)("radius.under","That work exists nowhere but this machine.")}}(d),f=function(a){if(0===a.unmeasured.length)return null;let b=a.unmeasured.length;return(0,l.ph)("radius.excluded","{0} not included: af360 could not measure {1}.",m(b),1===b?a.unmeasured[0].name:"them this time")}(d),g=c?(0,i.Pl)(c):null,h=k(c).map(a=>({id:a.id,kind:a.kind,tone:a.tone,label:a.label,what:a.what,why:a.why,consequence:function(a){let b=j(a);return b<=1?"losable":2===b?"money":"hygiene"}(a),losable:a.losable,handled:a.handled,since:a.since,steps:a.steps,devSteps:a.devSteps,path:"project"===a.kind?a.id:void 0})),n=c?.tones??{},o=a.projects.map(a=>({name:a.name,path:a.path,isGit:a.isGit,branch:a.branch,hasRemote:a.hasRemote,remoteKnown:a.remoteKnown,statusKnown:a.statusKnown,uncommitted:a.uncommitted,deleted:a.deleted,ahead:a.ahead,behind:a.behind,commitCount:a.commitCount,lastCommit:a.lastCommit,lastActivity:a.lastActivity,tone:n[a.path.toLowerCase()]??null})),p=a.sites.map(a=>({label:a.entry.label??a.entry.url,url:a.entry.url,ok:a.current?a.current.ok:null,status:a.current?.status,checkedAt:a.current?.ts??null,since:a.sinceText,tone:n[a.entry.id]??null})),q=a.expiry.map(a=>({id:a.id,name:a.name,date:a.date,daysLeft:a.daysLeft,source:a.manual?"entrusted":"observed",kind:a.kind,cost:a.cost,done:a.done,note:a.note})),r={scannedAt:a.scannedAt,projects:a.projects.slice(0,250).map(a=>({path:a.path,name:a.name,uncommitted:a.uncommitted,statusKnown:a.statusKnown,ahead:a.ahead,commitCount:a.commitCount,hasRemote:a.hasRemote,lastCommit:a.lastCommit})),capped:a.projects.length>250||void 0,sites:a.sites.map(a=>({url:a.entry.url,ok:a.current?a.current.ok:null})),radius:{commits:d.commits,files:d.files,projects:d.projects}},s=a.previous.filter(b=>b.scannedAt!==a.scannedAt);return s.push(r),s.sort((a,b)=>a.scannedAt-b.scannedAt),{v:2,scannedAt:a.scannedAt,ts:b,configFault:a.configFault,empty:!c||(0,i.yy)(c),estate:{state:c?.state??"QUIET",open:c?.open??0,line:g?.line??"",under:g?.under??"",notChecked:a.notChecked,counts:{projects:a.projects.length,sites:a.sites.length,findings:h.length},findings:h},projects:o,sites:p,ahead:q,radius:{...d,headline:e.headline.en,under:e.under.en,tone:e.tone,excluded:f?f.en:null},looks:s.slice(-40)}}async function p(a=(0,g.yF)()){try{let b=JSON.parse(await d.promises.readFile(n(a),"utf8"));if(!b||"object"!=typeof b||"number"!=typeof b.scannedAt)return null;return b}catch{return null}}async function q(a,b=(0,g.yF)()){try{await d.promises.mkdir(b,{recursive:!0});let c=(0,h.fI)(a),e=f().join(b,`.last-look.${process.pid}.tmp`);await d.promises.writeFile(e,JSON.stringify(c)+"\n","utf8"),await d.promises.rename(e,n(b))}catch{}}},86587:(a,b,c)=>{c.d(b,{Pl:()=>n,W8:()=>k,yy:()=>m,ze:()=>l});var d=c(72346),e=c(88804),f=c(87078),g=c(83720);function h(a){return{what:a.what.en,whatP:a.what,why:a.why.en,whyP:a.why,evidence:a.evidence.map(a=>a.en),evidenceP:a.evidence,steps:a.steps.map(a=>a.en),stepsP:a.steps}}function i(a){return{action:a.en,actionP:a}}function j(a){return a?{handledNote:a.en,handledNoteP:a}:{}}function k(a){let b=a=>Array.isArray(a)?a:[],c=b(a.projects),k=b(a.urls),m=b(a.expiryItems),n=b(a.incidents),r=b(a.missingRoots),s=b(a.ignored),{snoozes:t,isAcked:u,isDupe:v,offline:w}=a,x=Date.now(),y=a=>{let b=t?.[a];return!!b&&new Date(b).getTime()>x},z=[],A={};for(let a of c){let b=a.path.toLowerCase(),h=function(a,b,c){var h,i;let j=[],k=[],m=[],n=[];a.changedTotal>0&&(j.push((0,e.ph)("attn.reason.unsaved",`{0} unsaved change${1===a.changedTotal?"":"s"}`,a.changedTotal)),k.push((0,e.ph)("attn.ev.changed",`changed: {0}${a.changedTotal>a.dirtyFiles.length?" and {1} more":""}`,a.dirtyFiles.join(", "),a.changedTotal-a.dirtyFiles.length))),a.deleted>0&&(j.push((0,e.ph)("attn.reason.deleted",`{0} file${1===a.deleted?"":"s"} deleted`,a.deleted)),k.push((0,e.ph)("attn.ev.deleted",`deleted: {0}${a.deleted>a.deletedFiles.length?" and {1} more":""}`,a.deletedFiles.join(", "),a.deleted-a.deletedFiles.length))),a.uncommitted>0&&(m.push((0,e.pl)("attn.step.commit","Commit the work - a commit makes it permanent history.")),n.push('git add -A && git commit -m "wip"')),a.deleted>0&&(m.push((0,e.pl)("attn.step.deleted","If a deletion was not meant, git still holds the file - restore it before committing.")),n.push("git restore --")),(a.ahead??0)>0&&(j.push((0,e.ph)("attn.reason.unpushed",`{0} commit${1===a.ahead?"":"s"} not pushed`,a.ahead??0)),k.push((0,e.ph)("attn.ev.onlyHere",`{0} commit${1===a.ahead?"":"s"} exist only on this machine`,a.ahead??0)),m.push((0,e.pl)("attn.step.push","Push once - the remote gets a full copy and the risk is gone.")),n.push("git push")),l(a)&&(j.push((0,e.pl)("attn.reason.noBackup","no backup anywhere")),k.push((0,e.pl)("attn.ev.noRemote","no remote is configured - this disk holds the only copy")),m.push((0,e.pl)("attn.step.createRepo","Create an empty repository on your code host, connect it, and push.")),n.push("git remote add origin <url>","git push -u origin main"));let o=a.isGit&&!a.statusKnown;o&&(j.push((0,e.pl)("unread.reason",d.UI.unread.reason)),k.push((0,e.pl)("unread.evidence",d.UI.unread.evidence)),m.push((0,e.pl)("unread.step",d.UI.unread.step)));let p=b?function(a,b){let c=b.filter(b=>b.name===a.name&&b.path!==a.path);if(0===c.length)return null;let d=a.remoteKnown?(0,f.p8)(a.remoteUrl):null,e=a=>a.remoteKnown?(0,f.p8)(a.remoteUrl):null;if(d){let a=c.filter(a=>e(a)===d);if(a.length>0)return{kind:"duplicate",others:a}}return!d||c.some(a=>null===e(a))?{kind:"unproven",others:c}:{kind:"sharesName",others:c}}(a,c):null,q=p?.kind==="duplicate"?p:null,r=!!q&&("dormant"===a.staleness||"forgotten"===a.staleness);if(0===j.length&&r&&q){for(let a of(j.push((0,e.pl)("attn.reason.dupe","a dormant duplicate")),q.others))k.push((0,e.ph)("attn.ev.livingCopy","the living copy: {0}",a.path));let b=(0,f.p8)(a.remoteUrl);b&&k.push((0,e.ph)("attn.ev.sameRemote","both point at the same repository: {0}",b)),a.lastActivity&&(0,g.nW)(a.lastActivity)?k.push((0,e.pl)("attn.ev.untouchedSkew",`this copy untouched ${g.lt.since}`)):k.push((0,e.ph)("attn.ev.untouched","this copy untouched {0}",a.lastActivity?(h=a.lastActivity,(0,g.I)(h)):"for a long time")),m.push((0,e.pl)("attn.step.keepOne","Keep one copy - archive or delete the other so future-you isn't guessing."))}if(0===j.length)return{tone:"clean",what:"",why:"",evidence:[],steps:[]};let s=l(a),t=a.uncommitted>0?"unsaved":(a.ahead??0)>0?"unpushed":s?"unbacked":void 0,u=o&&1===j.length,v="unsaved"===t?(0,e.ph)("act.save","Save {0}",a.name):"unpushed"===t?(0,e.ph)("act.push","Push {0}",a.name):"unbacked"===t?(0,e.ph)("act.backUp","Back up {0}",a.name):u?(0,e.ph)("unread.what","af360 could not finish reading {0}.",a.name):(0,e.ph)("act.duplicate","Decide on {0}'s duplicate",a.name),w=(i=j.map(a=>a.en),(0,e.nn)(i,e.v1.and,e.v1.comma)),x=u?(0,e.ph)("unread.what","af360 could not finish reading {0}.",a.name):{...(0,e.ph)("attn.project.what","{0} has {1}.",a.name,w),list:{slot:1,items:j}},y=u?(0,e.pl)("unread.why",d.UI.unread.why):s?(0,e.pl)("attn.why.noBackup","One disk failure and it's gone - a remote copy fixes that in a minute."):(a.ahead??0)>0&&0===a.uncommitted?(0,e.pl)("attn.why.unpushed","A push costs a minute; losing them costs the work."):r&&0===a.uncommitted?(0,e.pl)("attn.why.dupe","Two copies of one project drift apart quietly."):(0,e.pl)("attn.why.unsaved","Unsaved work survives nowhere - one bad day and it's gone.");return k.push((0,e.ph)("attn.ev.path","{0}",`path: ${a.path}`)),{tone:"amber",what:x.en,why:y.en,whatP:x,whyP:y,since:a.lastActivity?new Date(a.lastActivity).getTime():void 0,evidence:k.map(a=>a.en),evidenceP:k,steps:m.map(a=>a.en),stepsP:m,devSteps:n.length>0?n:void 0,losable:t,action:v.en,actionP:v}}(a,v(a.name),c);A[b]=h.tone,"clean"!==h.tone&&z.push({...h,id:b,kind:"project",label:a.name,handled:y(b)||void 0,handledNote:y(b)?"quiet until tomorrow":void 0,openPath:a.path,laterId:b,ignore:{id:b,kind:"project",label:a.name,atRisk:l(a)}})}let B=a.github;if(B)for(let a of c){let b=B.byPath[a.path.toLowerCase()];if(!b?.ok)continue;let c=b.value;if(c.ci.ok&&c.ci.value&&"failing"===c.ci.value.state){let b=c.ci.value,d=`ci:${a.path.toLowerCase()}`;z.push({id:d,kind:"project",tone:"amber",label:a.name,since:b.at,...h({what:(0,e.ph)("attn.gh.ci.what","{0}'s build failed on {1}.",a.name,b.branch),why:(0,e.pl)("attn.gh.ci.why","GitHub Actions went red - the last push didn't survive CI."),evidence:[(0,e.ph)("attn.gh.ci.ev1","the {0} workflow reported {1}",b.workflow,b.conclusion??"a failure"),(0,e.ph)("attn.gh.ci.ev2","on branch {0}",b.branch),(0,e.ph)("attn.gh.ci.ev3","GitHub last moved this run at {0}",new Date(b.at).toISOString())],steps:[(0,e.pl)("attn.gh.ci.step1","Open the run on GitHub and read the first failing step - the rest usually follow from it."),(0,e.pl)("attn.gh.ci.step2","Nothing here is lost: the commits are pushed. This is about the checks, not the work.")]}),handled:y(d)||void 0,...j(y(d)?(0,e.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),openPath:a.path,laterId:d,...i((0,e.ph)("act.gh.ci","Read {0}'s failing run on GitHub",a.name))})}if("refuted"===c.backup.verdict){let b=c.backup,d=`backup:${a.path.toLowerCase()}`;z.push({id:d,kind:"project",tone:"amber",label:a.name,losable:"unpushed",...h({what:(0,e.ph)("attn.gh.backup.what","{0} says everything is pushed, and GitHub doesn't have it.",a.name),why:(0,e.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,e.ph)("attn.gh.backup.ev1","this machine is on {0} at branch {1}",b.localSha.slice(0,12),b.branch),(0,e.ph)("attn.gh.backup.ev2","GitHub's {0} is at {1}",b.branch,b.remoteSha.slice(0,12)),(0,e.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,e.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,e.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:y(d)||void 0,...j(y(d)?(0,e.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),openPath:a.path,laterId:d,...i((0,e.ph)("act.gh.backup","Check where {0}'s commits actually are",a.name))})}}if(w&&k.length>0){for(let a of k)A[a.entry.id]="clean";z.push({id:"offline",kind:"site",tone:"amber",label:"Internet connection",...h({what:(0,e.pl)("attn.offline.what","This computer seems to be offline."),why:(0,e.pl)("attn.offline.why","Your sites may be perfectly fine - af360 can't reach anything right now, so it won't guess."),evidence:[(0,e.ph)("attn.offline.ev1","none of the {0} watched sites answered",k.length),(0,e.pl)("attn.offline.ev2","the domain lookup didn't get through either"),(0,e.pl)("attn.offline.ev3","checks keep running while af360 is open; this clears itself the moment something answers")],steps:[(0,e.pl)("attn.offline.step1","Check this machine's internet connection - wifi, cable, or a VPN that dropped."),(0,e.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"],...i((0,e.pl)("act.offline","Check this machine's connection"))})}for(let a of w?[]:k){let b=a.entry.id,c=a.current,d=a.entry.label||function(a){try{return new URL(a).hostname}catch{return a}}(a.entry.url);if(!c||c.ok){A[b]="clean";continue}A[b]="red";let f=n.find(a=>a.subjectId===b&&!a.endedTs),g=u(b),k=y(b);z.push({id:b,kind:"site",tone:"red",label:d,...h({what:c.status?(0,e.ph)("attn.down.whatStatus","{0} is down (HTTP {1}).",d,c.status):c.error?(0,e.ph)("attn.down.whatError","{0} is down - {1}.",d,c.error):(0,e.ph)("attn.down.what","{0} is down.",d),why:(0,e.pl)("attn.down.why","af360 asked for your site from this machine and got an error back instead of the page."),evidence:[(0,e.ph)("attn.down.evUrl","{0}",a.entry.url),c.status?(0,e.ph)("attn.down.evAnswer","last answer: HTTP {0}",c.status):c.error?(0,e.ph)("attn.down.evAnswerText","last answer: {0}",c.error):(0,e.pl)("attn.down.evNoAnswer","no answer"),f?(0,e.ph)("attn.down.evSince","down since {0}",new Date(f.startedTs).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})):(0,e.pl)("attn.down.evJust","just went quiet"),(0,e.pl)("attn.down.evCadence","checked every minute while af360 is open; recovery is logged automatically")],steps:[(0,e.pl)("attn.down.step1","Open your host's dashboard - most outages are a crashed service or a failed deploy."),(0,e.pl)("attn.down.step2","Press Check once you're on it; the row calms down and clears itself when the site answers again.")]}),since:f?.startedTs,handled:g||k||void 0,...j(g?(0,e.pl)("attn.handled.acked","being handled ✓"):k?(0,e.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),devSteps:[`curl -sI ${a.entry.url}`],...i((0,e.ph)("act.siteDown","{0} is down",d)),checkId:b,laterId:b,ignore:{id:b,kind:"url",label:d,atRisk:!0}})}for(let a of s){if(!a.resurface)continue;let b=`resurface:${a.id}`;A[b]="amber",z.push({id:b,kind:"resurface",tone:"amber",label:a.label,...h({what:(0,e.ph)("attn.resurface.what","{0}",a.resurface.text),why:(0,e.pl)("attn.resurface.why","You silenced this earlier - the situation moved, so it gets one more look."),evidence:[(0,e.ph)("attn.resurface.evThen","ignored at: {0}",o(a.snapshot)),(0,e.ph)("attn.resurface.evNow","now: {0}",o(a.resurface.current))],steps:[(0,e.pl)("attn.resurface.step","Watch again to bring it back, or Still ignore to re-silence it at today's numbers.")]}),...i((0,e.ph)("act.decide","Decide on {0}",a.label)),resurfaceId:a.id,ignore:{id:a.id,kind:a.kind,label:a.label,atRisk:!1}})}for(let a of m){if(a.manual){if(a.done||null===a.rung||void 0===a.rung){A[a.id]="clean";continue}A[a.id]="amber";let b=y(a.id);z.push({id:a.id,kind:"expiry",tone:"amber",label:a.name,entrusted:!0,cost:a.cost,passed:a.passed,entrustedId:a.id,...h({what:a.passed?(0,e.ph)("attn.entrusted.passed","{0} was due {1}.",a.name,q(a.daysLeft)):(0,e.ph)("attn.entrusted.what","{0} is due {1}.",a.name,q(a.daysLeft)),why:a.note?(0,e.ph)("attn.entrusted.userNote","{0}",a.note):(0,e.pl)("attn.entrusted.why","You asked af360 to tell you about this one."),evidence:[(0,e.pl)("attn.entrusted.evAdded","you added this date"),(0,e.ph)("attn.expiry.evDate","date: {0}",new Date(a.date).toLocaleDateString()),a.note?(0,e.ph)("attn.entrusted.evNote",'what you wrote: "{0}"',a.note):null].filter(a=>null!==a),steps:[(0,e.pl)("attn.entrusted.step","Deal with it, or open Ahead to change the date, mark it done or remove it.")]}),handled:b||void 0,...j(b?(0,e.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),...i((0,e.ph)("act.entrusted","Deal with {0}",a.name)),laterId:a.id});continue}let b="red"===a.chip||"amber"===a.chip&&"ssl"===a.kind&&a.managed;if(A[a.id]=b?"amber":"clean",!b)continue;let c=y(a.id);z.push({id:a.id,kind:"expiry",tone:"amber",label:a.name,...h({what:"ssl"===a.kind&&a.managed&&"red"!==a.chip?(0,e.ph)("attn.expiry.certLate","{0}'s certificate should have auto-renewed by now - it hasn't.",a.name):a.daysLeft<0?(0,e.ph)("attn.expiry.expired","{0} expired {1}.",a.name,q(a.daysLeft)):(0,e.ph)("attn.expiry.expires","{0} expires {1}.",a.name,q(a.daysLeft)),why:a.note?(0,e.ph)("attn.expiry.userNote","{0}",a.note):"ssl"===a.kind?(0,e.pl)("attn.expiry.whySsl","When it lapses, browsers show a scary warning instead of your site."):(0,e.pl)("attn.expiry.whyDomain","After the date it stops working - renewing early is painless."),evidence:[(0,e.ph)("attn.expiry.evDate","date: {0}",new Date(a.date).toLocaleDateString()),a.judgment?(0,e.ph)("attn.expiry.evJudgment","{0}",a.judgment):a.note?(0,e.ph)("attn.expiry.evNote",'your note: "{0}"',a.note):null,a.issuer?(0,e.ph)("attn.expiry.evIssuer","issuer: {0}",a.issuer):null].filter(a=>null!==a),steps:"ssl"===a.kind?[(0,e.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,e.pl)("attn.expiry.stepDomain","Renew it (or let it lapse on purpose), then remove or update the entry on Ahead.")]}),handled:c||void 0,...j(c?(0,e.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),...i("ssl"===a.kind&&a.managed&&"red"!==a.chip?(0,e.ph)("act.certLate","Chase {0}'s certificate",a.name):(0,e.ph)("act.renew","Renew {0}",a.name)),laterId:a.id})}for(let a of r){let b=`missing:${a}`;A[b]="amber",z.push({id:b,kind:"missing",tone:"amber",label:p(a),...h({what:(0,e.ph)("attn.missing.what","The folder {0} can't be found",a),why:(0,e.pl)("attn.missing.why","It moved or was renamed - point me at its new home, or stop watching it."),evidence:[(0,e.ph)("attn.missing.evPath","watched path: {0}",a),(0,e.pl)("attn.missing.evScan","the folder stopped answering on the last scan")],steps:[(0,e.pl)("attn.missing.step1","Press Find it and click through to where the folder lives now - the old entry is replaced."),(0,e.pl)("attn.missing.step2","If it's gone on purpose, Stop watching removes it.")]}),...i((0,e.ph)("act.find","Find {0}",p(a))),findPath:a})}z.sort((a,b)=>Number(a.handled??!1)-Number(b.handled??!1)||Number("red"===b.tone)-Number("red"===a.tone));let C=z.filter(a=>!a.handled).length,D=z.some(a=>"red"===a.tone&&!a.handled),E=b(a.findings).filter(a=>a?.cat==="safety").length,F=0;if(B){for(let a of c){let b=B.byPath[a.path.toLowerCase()];b&&!b.ok&&F++}B.outage&&F++}return F+=b(a.unreachedChecks).length,{state:D?"INCIDENT":C>0?"NEEDS_YOU":E>0?"SAFETY":"QUIET",open:C,items:z,tones:A,unreached:F+=new Set(b(a.unscannedSubjects)).size,safety:E}}function l(a){return a.isGit&&a.remoteKnown&&!a.hasRemote&&!a.looksDownloaded}function m(a){return 0===a.items.length&&0===Object.keys(a.tones).length}function n(a){let b=(a,b)=>({line:a.en,under:b.en,lineP:a,underP:b});if(m(a))return b((0,e.pl)("head.emptyLine","Nothing watched yet"),(0,e.pl)("head.emptyUnder","Point me at a folder and I'll show you the projects inside it."));if("INCIDENT"===a.state){let c=a.items.filter(a=>"red"===a.tone&&!a.handled);return b(1===c.length?(0,e.ph)("head.downOne","{0} is down",c[0].label):(0,e.ph)("head.downMany","{0} down",c.length),1===c.length?(0,e.pl)("head.incidentUnder","everything else can wait - this is the one to look at"):(0,e.pl)("head.incidentUnderMany","everything else can wait - these are the ones to look at"))}if("NEEDS_YOU"===a.state)return a.safety>0?b((0,e.ph)("head.needsLine",`{0} need${1===a.open?"s":""} you`,a.open),(0,e.ph)("head.needsUnderSafety",`none of it is on fire - each has a reason, and {0} safety finding${1===a.safety?" is":"s are"} waiting in Discoveries`,a.safety)):b((0,e.ph)("head.needsLine",`{0} need${1===a.open?"s":""} you`,a.open),(0,e.pl)("head.needsUnder","none of it is on fire - each has a reason"));let c=a.items.filter(a=>a.handled).length,d=a.unreached??0,f=a=>`thing${1===a?"":"s"}`;if("SAFETY"===a.state){let c=a.safety;return b((0,e.ph)("head.safetyLine",`{0} safety finding${1===c?"":"s"}`,c),d>0?(0,e.ph)("head.safetyMissed",`${1===c?"it is":"they are"} waiting in Discoveries - and af360 couldn't check {0} ${f(d)} this time`,d):(0,e.pl)("head.safetyUnder",`${1===c?"it is":"they are"} waiting in Discoveries`))}return b((0,e.pl)("head.quietLine","All quiet"),c>0?d>0?(0,e.ph)("head.quietHandledMissed",`nothing new needs you - {0} item${1===c?" is":"s are"} being handled, and af360 couldn't check {1} ${f(d)} this time`,c,d):(0,e.ph)("head.quietHandled",`nothing new needs you - {0} item${1===c?" is":"s are"} being handled`,c):d>0?(0,e.ph)("head.quietMissed",`nothing needs you - and af360 couldn't check {0} ${f(d)} this time`,d):(0,e.pl)("head.quietUnder","nothing needs you - go build something"))}function o(a){if(!a)return"nothing recorded";let b=[];return"number"==typeof a.uncommitted&&b.push(`${a.uncommitted} unsaved`),!1===a.hasRemote&&b.push("no backup"),a.down&&b.push("down"),b.length>0?b.join(", "):"all fine"}function p(a){let b=a.split(/[\\/]/).filter(Boolean);return b[b.length-1]??a}function q(a){return a<0?`${-a} day${-1===a?"":"s"} ago`:0===a?"today":1===a?"tomorrow":`in ${a} days`}},87078:(a,b,c)=>{function d(a){try{return new URL(a).hostname.toLowerCase()}catch{return null}}function e(a){if(!a)return null;let b=a.trim();if(!b)return null;let c=null,d=null,e=/^(?:[^@/]+@)?([A-Za-z0-9._-]+):(?!\/\/)(.+)$/.exec(b);if(e&&!/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(b))c=e[1],d=e[2];else try{let a=new URL(b);c=a.hostname,d=a.pathname}catch{return null}let f=(d??"").replace(/^\/+/,"").replace(/\/+$/,"").replace(/\.git$/i,"");return c&&f?`${c.toLowerCase()}/${f.toLowerCase()}`:null}c.d(b,{Pm:()=>d,p8:()=>e})},88804:(a,b,c)=>{c.d(b,{nn:()=>e,ph:()=>f,pl:()=>g,v1:()=>d});let d={and:" and ",comma:", "};function e(a,b,c){return 0===a.length?"":1===a.length?a[0]:a.slice(0,-1).join(c)+b+a[a.length-1]}function f(a,b,...c){return{k:a,en:function(a,b=[]){return a.replace(/\{(\d+)\}/g,(a,c)=>{let d=b[Number(c)];return void 0===d?a:String(d)})}(b,c),slots:c}}function g(a,b){return{k:a,en:b}}}};
1
+ "use strict";exports.id=2817,exports.ids=[2817],exports.modules={52817:(a,b,c)=>{c.d(b,{GG:()=>o,_d:()=>p,xF:()=>q});var d=c(29021),e=c(33873),f=c.n(e),g=c(71011),h=c(1232),i=c(86587);function j(a){return"unsaved"===a.losable?0:a.losable?1:"expiry"===a.kind?a.entrusted&&!a.cost?1:2:"site"===a.kind?2:3}function k(a){return a?a.items.map((a,b)=>({it:a,i:b})).sort((a,b)=>Number(!!a.it.handled)-Number(!!b.it.handled)||j(a.it)-j(b.it)||Number("red"===b.it.tone)-Number("red"===a.it.tone)||(a.it.since??1/0)-(b.it.since??1/0)||a.i-b.i).map(a=>a.it):[]}var l=c(88804);function m(a){return`${a} project${1===a?"":"s"}`}function n(a=(0,g.yF)()){return f().join(a,"last-look.json")}function o(a){let b=a.now??Date.now(),c=a.attention,d=function(a,b){if(!a)return null;let c=(0,i.yy)(a);if(c)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:c,zero:!c};let d=new Map(b.map(a=>[a.path.toLowerCase(),a])),e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=[];for(let b of a?k(a).filter(a=>!a.handled&&a.losable):[]){let a="project"===b.kind?d.get(b.id):void 0;if(!a)continue;let c=!1;a.statusKnown?a.uncommitted>0&&(m+=a.uncommitted,n++,f+=a.uncommitted,c=!0):q.push({name:a.name,why:`af360 could not read ${a.name}'s working tree, so its unsaved changes are not in this number`,whyP:(0,l.ph)("radius.unmeasured.status","af360 could not read {0}'s working tree, so its unsaved changes are not in this number",a.name)}),(0,i.ze)(a)?(o++,null!==a.commitCount?(p+=a.commitCount,e+=a.commitCount,c=!0):q.push({name:a.name,why:`af360 could not count ${a.name}'s commits, so its history is not in this number`,whyP:(0,l.ph)("radius.unmeasured.commits","af360 could not count {0}'s commits, so its history is not in this number",a.name)})):null!==a.ahead?a.ahead>0&&(h+=a.ahead,j++,e+=a.ahead,c=!0):a.isGit&&a.hasRemote&&q.push({name:a.name,why:`${a.name} has no upstream branch set, so af360 cannot tell which of its commits are only here`,whyP:(0,l.ph)("radius.unmeasured.upstream","{0} has no upstream branch set, so af360 cannot tell which of its commits are only here",a.name)}),c&&g++}for(let a of b)a.isGit||a.looksDownloaded||q.some(b=>b.name===a.name)||q.push({name:a.name,why:`${a.name} is not in git, so af360 has no way to tell whether a copy of it exists anywhere else`,whyP:(0,l.ph)("radius.unmeasured.noGit","{0} is not in git, so af360 has no way to tell whether a copy of it exists anywhere else",a.name)});return{commits:e,files:f,projects:g,components:{unpushed:{commits:h,projects:j},unsaved:{files:m,projects:n},unbacked:{projects:o,commits:p}},unmeasured:q,empty:!1,zero:0===e&&0===f}}(c,a.projects)??{commits:0,files:0,projects:0,components:{unpushed:{commits:0,projects:0},unsaved:{files:0,projects:0},unbacked:{projects:0,commits:0}},unmeasured:[],empty:!0,zero:!1},e=function(a){var b,c;if(a.empty)return{tone:"clean",headline:(0,l.pl)("radius.empty.head","Nothing to lose yet"),under:(0,l.pl)("radius.empty.under","Point af360 at a folder and it will tell you what only exists here.")};if(a.zero){let b=a.unmeasured.length;return{tone:"clean",headline:0===b?(0,l.pl)("radius.zero.head","If this laptop died right now: nothing would be lost."):(0,l.pl)("radius.zero.headPartial","Everything af360 could check has a copy elsewhere"),under:0===b?(0,l.pl)("radius.zero.under","Every project af360 watches also exists somewhere off this machine."):(0,l.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.",m(b))}}let d=[];a.commits>0&&d.push((b=a.commits,`${b} commit${1===b?"":"s"}`)),a.files>0&&d.push((c=a.files,`${c} file${1===c?"":"s"}`));let e=d.join(", ");return{tone:"amber",headline:(0,l.ph)("radius.head","If this laptop died right now: {0} across {1} - gone forever.",e,m(a.projects)),under:(0,l.pl)("radius.under","That work exists nowhere but this machine.")}}(d),f=function(a){if(0===a.unmeasured.length)return null;let b=a.unmeasured.length;return(0,l.ph)("radius.excluded","{0} not included: af360 could not measure {1}.",m(b),1===b?a.unmeasured[0].name:"them this time")}(d),g=c?(0,i.Pl)(c):null,h=k(c).map(a=>({id:a.id,kind:a.kind,tone:a.tone,label:a.label,what:a.what,why:a.why,consequence:function(a){let b=j(a);return b<=1?"losable":2===b?"money":"hygiene"}(a),losable:a.losable,handled:a.handled,since:a.since,steps:a.steps,devSteps:a.devSteps,path:"project"===a.kind?a.id:void 0})),n=c?.tones??{},o=a.projects.map(a=>({name:a.name,path:a.path,isGit:a.isGit,branch:a.branch,hasRemote:a.hasRemote,remoteKnown:a.remoteKnown,statusKnown:a.statusKnown,uncommitted:a.uncommitted,deleted:a.deleted,ahead:a.ahead,behind:a.behind,commitCount:a.commitCount,lastCommit:a.lastCommit,lastActivity:a.lastActivity,tone:n[a.path.toLowerCase()]??null})),p=a.sites.map(a=>({label:a.entry.label??a.entry.url,url:a.entry.url,ok:a.current?a.current.ok:null,status:a.current?.status,checkedAt:a.current?.ts??null,since:a.sinceText,tone:n[a.entry.id]??null})),q=a.expiry.map(a=>({id:a.id,name:a.name,date:a.date,daysLeft:a.daysLeft,source:a.manual?"entrusted":"observed",kind:a.kind,cost:a.cost,done:a.done,note:a.note})),r={scannedAt:a.scannedAt,projects:a.projects.slice(0,250).map(a=>({path:a.path,name:a.name,uncommitted:a.uncommitted,statusKnown:a.statusKnown,ahead:a.ahead,commitCount:a.commitCount,hasRemote:a.hasRemote,lastCommit:a.lastCommit})),capped:a.projects.length>250||void 0,sites:a.sites.map(a=>({url:a.entry.url,ok:a.current?a.current.ok:null})),radius:{commits:d.commits,files:d.files,projects:d.projects}},s=a.previous.filter(b=>b.scannedAt!==a.scannedAt);return s.push(r),s.sort((a,b)=>a.scannedAt-b.scannedAt),{v:2,scannedAt:a.scannedAt,ts:b,configFault:a.configFault,empty:!c||(0,i.yy)(c),estate:{state:c?.state??"QUIET",open:c?.open??0,line:g?.line??"",under:g?.under??"",notChecked:a.notChecked,counts:{projects:a.projects.length,sites:a.sites.length,findings:h.length},findings:h},projects:o,sites:p,ahead:q,radius:{...d,headline:e.headline.en,under:e.under.en,tone:e.tone,excluded:f?f.en:null},looks:s.slice(-40)}}async function p(a=(0,g.yF)()){try{let b=JSON.parse(await d.promises.readFile(n(a),"utf8"));if(!b||"object"!=typeof b||"number"!=typeof b.scannedAt)return null;return b}catch{return null}}async function q(a,b=(0,g.yF)()){try{await d.promises.mkdir(b,{recursive:!0});let c=(0,h.fI)(a),e=f().join(b,`.last-look.${process.pid}.tmp`);await d.promises.writeFile(e,JSON.stringify(c)+"\n","utf8"),await d.promises.rename(e,n(b))}catch{}}},86587:(a,b,c)=>{c.d(b,{Pl:()=>n,W8:()=>k,yy:()=>m,ze:()=>l});var d=c(72346),e=c(88804),f=c(87078),g=c(83720);function h(a){return{what:a.what.en,whatP:a.what,why:a.why.en,whyP:a.why,evidence:a.evidence.map(a=>a.en),evidenceP:a.evidence,steps:a.steps.map(a=>a.en),stepsP:a.steps}}function i(a){return{action:a.en,actionP:a}}function j(a){return a?{handledNote:a.en,handledNoteP:a}:{}}function k(a){let b=a=>Array.isArray(a)?a:[],c=b(a.projects),k=b(a.urls),m=b(a.expiryItems),n=b(a.incidents),r=b(a.missingRoots),s=b(a.ignored),{snoozes:t,isAcked:u,isDupe:v,offline:w}=a,x=Date.now(),y=a=>{let b=t?.[a];return!!b&&new Date(b).getTime()>x},z=[],A={};for(let a of c){let b=a.path.toLowerCase(),h=function(a,b,c){var h,i;let j=[],k=[],m=[],n=[];a.changedTotal>0&&(j.push((0,e.ph)("attn.reason.unsaved",`{0} unsaved change${1===a.changedTotal?"":"s"}`,a.changedTotal)),k.push((0,e.ph)("attn.ev.changed",`changed: {0}${a.changedTotal>a.dirtyFiles.length?" and {1} more":""}`,a.dirtyFiles.join(", "),a.changedTotal-a.dirtyFiles.length))),a.deleted>0&&(j.push((0,e.ph)("attn.reason.deleted",`{0} file${1===a.deleted?"":"s"} deleted`,a.deleted)),k.push((0,e.ph)("attn.ev.deleted",`deleted: {0}${a.deleted>a.deletedFiles.length?" and {1} more":""}`,a.deletedFiles.join(", "),a.deleted-a.deletedFiles.length))),a.uncommitted>0&&(m.push((0,e.pl)("attn.step.commit","Commit the work - a commit makes it permanent history.")),n.push('git add -A && git commit -m "wip"')),a.deleted>0&&(m.push((0,e.pl)("attn.step.deleted","If a deletion was not meant, git still holds the file - restore it before committing.")),n.push("git restore --")),(a.ahead??0)>0&&(j.push((0,e.ph)("attn.reason.unpushed",`{0} commit${1===a.ahead?"":"s"} not pushed`,a.ahead??0)),k.push((0,e.ph)("attn.ev.onlyHere",`{0} commit${1===a.ahead?"":"s"} exist only on this machine`,a.ahead??0)),m.push((0,e.pl)("attn.step.push","Push once - the remote gets a full copy and the risk is gone.")),n.push("git push")),l(a)&&(j.push((0,e.pl)("attn.reason.noBackup","no backup anywhere")),k.push((0,e.pl)("attn.ev.noRemote","no remote is configured - this disk holds the only copy")),m.push((0,e.pl)("attn.step.createRepo","Create an empty repository on your code host, connect it, and push.")),n.push("git remote add origin <url>","git push -u origin main"));let o=a.isGit&&!a.statusKnown;o&&(j.push((0,e.pl)("unread.reason",d.UI.unread.reason)),k.push((0,e.pl)("unread.evidence",d.UI.unread.evidence)),m.push((0,e.pl)("unread.step",d.UI.unread.step)));let p=b?function(a,b){let c=b.filter(b=>b.name===a.name&&b.path!==a.path);if(0===c.length)return null;let d=a.remoteKnown?(0,f.p8)(a.remoteUrl):null,e=a=>a.remoteKnown?(0,f.p8)(a.remoteUrl):null;if(d){let a=c.filter(a=>e(a)===d);if(a.length>0)return{kind:"duplicate",others:a}}return!d||c.some(a=>null===e(a))?{kind:"unproven",others:c}:{kind:"sharesName",others:c}}(a,c):null,q=p?.kind==="duplicate"?p:null,r=!!q&&("dormant"===a.staleness||"forgotten"===a.staleness);if(0===j.length&&r&&q){for(let a of(j.push((0,e.pl)("attn.reason.dupe","a dormant duplicate")),q.others))k.push((0,e.ph)("attn.ev.livingCopy","the living copy: {0}",a.path));let b=(0,f.p8)(a.remoteUrl);b&&k.push((0,e.ph)("attn.ev.sameRemote","both point at the same repository: {0}",b)),a.lastActivity&&(0,g.nW)(a.lastActivity)?k.push((0,e.pl)("attn.ev.untouchedSkew",`this copy untouched ${g.lt.since}`)):k.push((0,e.ph)("attn.ev.untouched","this copy untouched {0}",a.lastActivity?(h=a.lastActivity,(0,g.I)(h)):"for a long time")),m.push((0,e.pl)("attn.step.keepOne","Keep one copy - archive or delete the other so future-you isn't guessing."))}if(0===j.length)return{tone:"clean",what:"",why:"",evidence:[],steps:[]};let s=l(a),t=a.uncommitted>0?"unsaved":(a.ahead??0)>0?"unpushed":s?"unbacked":void 0,u=o&&1===j.length,v="unsaved"===t?(0,e.ph)("act.save","Save {0}",a.name):"unpushed"===t?(0,e.ph)("act.push","Push {0}",a.name):"unbacked"===t?(0,e.ph)("act.backUp","Back up {0}",a.name):u?(0,e.ph)("unread.what","af360 could not finish reading {0}.",a.name):(0,e.ph)("act.duplicate","Decide on {0}'s duplicate",a.name),w=(i=j.map(a=>a.en),(0,e.nn)(i,e.v1.and,e.v1.comma)),x=u?(0,e.ph)("unread.what","af360 could not finish reading {0}.",a.name):{...(0,e.ph)("attn.project.what","{0} has {1}.",a.name,w),list:{slot:1,items:j}},y=u?(0,e.pl)("unread.why",d.UI.unread.why):s?(0,e.pl)("attn.why.noBackup","One disk failure and it's gone - a remote copy fixes that in a minute."):(a.ahead??0)>0&&0===a.uncommitted?(0,e.pl)("attn.why.unpushed","A push costs a minute; losing them costs the work."):r&&0===a.uncommitted?(0,e.pl)("attn.why.dupe","Two copies of one project drift apart quietly."):(0,e.pl)("attn.why.unsaved","Unsaved work survives nowhere - one bad day and it's gone.");return k.push((0,e.ph)("attn.ev.path","{0}",`path: ${a.path}`)),{tone:"amber",what:x.en,why:y.en,whatP:x,whyP:y,since:a.lastActivity?new Date(a.lastActivity).getTime():void 0,evidence:k.map(a=>a.en),evidenceP:k,steps:m.map(a=>a.en),stepsP:m,devSteps:n.length>0?n:void 0,losable:t,action:v.en,actionP:v}}(a,v(a.name),c);A[b]=h.tone,"clean"!==h.tone&&z.push({...h,id:b,kind:"project",label:a.name,handled:y(b)||void 0,handledNote:y(b)?"quiet until tomorrow":void 0,openPath:a.path,laterId:b,ignore:{id:b,kind:"project",label:a.name,atRisk:l(a)}})}let B=a.github;if(B)for(let a of c){let b=B.byPath[a.path.toLowerCase()];if(!b?.ok)continue;let c=b.value;if(c.ci.ok&&c.ci.value&&"failing"===c.ci.value.state){let b=c.ci.value,d=`ci:${a.path.toLowerCase()}`;z.push({id:d,kind:"project",tone:"amber",label:a.name,since:b.at,...h({what:(0,e.ph)("attn.gh.ci.what","{0}'s build failed on {1}.",a.name,b.branch),why:(0,e.pl)("attn.gh.ci.why","GitHub Actions went red - the last push didn't survive CI."),evidence:[(0,e.ph)("attn.gh.ci.ev1","the {0} workflow reported {1}",b.workflow,b.conclusion??"a failure"),(0,e.ph)("attn.gh.ci.ev2","on branch {0}",b.branch),(0,e.ph)("attn.gh.ci.ev3","GitHub last moved this run at {0}",new Date(b.at).toISOString())],steps:[(0,e.pl)("attn.gh.ci.step1","Open the run on GitHub and read the first failing step - the rest usually follow from it."),(0,e.pl)("attn.gh.ci.step2","Nothing here is lost: the commits are pushed. This is about the checks, not the work.")]}),handled:y(d)||void 0,...j(y(d)?(0,e.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),openPath:a.path,laterId:d,...i((0,e.ph)("act.gh.ci","Read {0}'s failing run on GitHub",a.name))})}if("refuted"===c.backup.verdict){let b=c.backup,d=`backup:${a.path.toLowerCase()}`;z.push({id:d,kind:"project",tone:"amber",label:a.name,losable:"unpushed",...h({what:(0,e.ph)("attn.gh.backup.what","{0} says everything is pushed, and GitHub doesn't have it.",a.name),why:(0,e.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,e.ph)("attn.gh.backup.ev1","this machine is on {0} at branch {1}",b.localSha.slice(0,12),b.branch),(0,e.ph)("attn.gh.backup.ev2","GitHub's {0} is at {1}",b.branch,b.remoteSha.slice(0,12)),(0,e.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,e.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,e.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:y(d)||void 0,...j(y(d)?(0,e.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),openPath:a.path,laterId:d,...i((0,e.ph)("act.gh.backup","Check where {0}'s commits actually are",a.name))})}}if(w&&k.length>0){for(let a of k)A[a.entry.id]="clean";z.push({id:"offline",kind:"site",tone:"amber",label:"Internet connection",...h({what:(0,e.pl)("attn.offline.what","This computer seems to be offline."),why:(0,e.pl)("attn.offline.why","Your sites may be perfectly fine - af360 can't reach anything right now, so it won't guess."),evidence:[(0,e.ph)("attn.offline.ev1","none of the {0} watched sites answered",k.length),(0,e.pl)("attn.offline.ev2","the domain lookup didn't get through either"),(0,e.pl)("attn.offline.ev3","checks keep running while af360 is open; this clears itself the moment something answers")],steps:[(0,e.pl)("attn.offline.step1","Check this machine's internet connection - wifi, cable, or a VPN that dropped."),(0,e.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"],...i((0,e.pl)("act.offline","Check this machine's connection"))})}for(let a of w?[]:k){let b=a.entry.id,c=a.current,d=a.entry.label||function(a){try{return new URL(a).hostname}catch{return a}}(a.entry.url);if(!c||c.ok){A[b]="clean";continue}A[b]="red";let f=n.find(a=>a.subjectId===b&&!a.endedTs),g=u(b),k=y(b);z.push({id:b,kind:"site",tone:"red",label:d,...h({what:c.status?(0,e.ph)("attn.down.whatStatus","{0} is down (HTTP {1}).",d,c.status):c.error?(0,e.ph)("attn.down.whatError","{0} is down - {1}.",d,c.error):(0,e.ph)("attn.down.what","{0} is down.",d),why:(0,e.pl)("attn.down.why","af360 asked for your site from this machine and got an error back instead of the page."),evidence:[(0,e.ph)("attn.down.evUrl","{0}",a.entry.url),c.status?(0,e.ph)("attn.down.evAnswer","last answer: HTTP {0}",c.status):c.error?(0,e.ph)("attn.down.evAnswerText","last answer: {0}",c.error):(0,e.pl)("attn.down.evNoAnswer","no answer"),f?(0,e.ph)("attn.down.evSince","down since {0}",new Date(f.startedTs).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})):(0,e.pl)("attn.down.evJust","just went quiet"),(0,e.pl)("attn.down.evCadence","checked every minute while af360 is open; recovery is logged automatically")],steps:[(0,e.pl)("attn.down.step1","Open your host's dashboard - most outages are a crashed service or a failed deploy."),(0,e.pl)("attn.down.step2","Press Check once you're on it; the row calms down and clears itself when the site answers again.")]}),since:f?.startedTs,handled:g||k||void 0,...j(g?(0,e.pl)("attn.handled.acked","being handled ✓"):k?(0,e.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),devSteps:[`curl -sI ${a.entry.url}`],...i((0,e.ph)("act.siteDown","{0} is down",d)),checkId:b,laterId:b,ignore:{id:b,kind:"url",label:d,atRisk:!0}})}for(let a of s){if(!a.resurface)continue;let b=`resurface:${a.id}`;A[b]="amber",z.push({id:b,kind:"resurface",tone:"amber",label:a.label,...h({what:(0,e.ph)("attn.resurface.what","{0}",a.resurface.text),why:(0,e.pl)("attn.resurface.why","You silenced this earlier - the situation moved, so it gets one more look."),evidence:[(0,e.ph)("attn.resurface.evThen","ignored at: {0}",o(a.snapshot)),(0,e.ph)("attn.resurface.evNow","now: {0}",o(a.resurface.current))],steps:[(0,e.pl)("attn.resurface.step","Watch again to bring it back, or Still ignore to re-silence it at today's numbers.")]}),...i((0,e.ph)("act.decide","Decide on {0}",a.label)),resurfaceId:a.id,ignore:{id:a.id,kind:a.kind,label:a.label,atRisk:!1}})}for(let a of m){if(a.manual){if(a.done||null===a.rung||void 0===a.rung){A[a.id]="clean";continue}A[a.id]="amber";let b=y(a.id);z.push({id:a.id,kind:"expiry",tone:"amber",label:a.name,entrusted:!0,cost:a.cost,passed:a.passed,entrustedId:a.id,...h({what:a.passed?(0,e.ph)("attn.entrusted.passed","{0} was due {1}.",a.name,q(a.daysLeft)):(0,e.ph)("attn.entrusted.what","{0} is due {1}.",a.name,q(a.daysLeft)),why:a.note?(0,e.ph)("attn.entrusted.userNote","{0}",a.note):(0,e.pl)("attn.entrusted.why","You asked af360 to tell you about this one."),evidence:[(0,e.pl)("attn.entrusted.evAdded","you added this date"),(0,e.ph)("attn.expiry.evDate","date: {0}",new Date(a.date).toLocaleDateString()),a.note?(0,e.ph)("attn.entrusted.evNote",'what you wrote: "{0}"',a.note):null].filter(a=>null!==a),steps:[(0,e.pl)("attn.entrusted.step","Deal with it, or open Ahead to change the date, mark it done or remove it.")]}),handled:b||void 0,...j(b?(0,e.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),...i((0,e.ph)("act.entrusted","Deal with {0}",a.name)),laterId:a.id});continue}let b="red"===a.chip||"amber"===a.chip&&"ssl"===a.kind&&a.managed;if(A[a.id]=b?"amber":"clean",!b)continue;let c=y(a.id);z.push({id:a.id,kind:"expiry",tone:"amber",label:a.name,...h({what:"ssl"===a.kind&&a.managed&&"red"!==a.chip?(0,e.ph)("attn.expiry.certLate","{0}'s certificate should have auto-renewed by now - it hasn't.",a.name):a.daysLeft<0?(0,e.ph)("attn.expiry.expired","{0} expired {1}.",a.name,q(a.daysLeft)):(0,e.ph)("attn.expiry.expires","{0} expires {1}.",a.name,q(a.daysLeft)),why:a.note?(0,e.ph)("attn.expiry.userNote","{0}",a.note):"ssl"===a.kind?(0,e.pl)("attn.expiry.whySsl","When it lapses, browsers show a scary warning instead of your site."):(0,e.pl)("attn.expiry.whyDomain","After the date it stops working - renewing early is painless."),evidence:[(0,e.ph)("attn.expiry.evDate","date: {0}",new Date(a.date).toLocaleDateString()),a.judgment?(0,e.ph)("attn.expiry.evJudgment","{0}",a.judgment):a.note?(0,e.ph)("attn.expiry.evNote",'your note: "{0}"',a.note):null,a.issuer?(0,e.ph)("attn.expiry.evIssuer","issuer: {0}",a.issuer):null].filter(a=>null!==a),steps:"ssl"===a.kind?[(0,e.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,e.pl)("attn.expiry.stepDomain","Renew it (or let it lapse on purpose), then remove or update the entry on Ahead.")]}),handled:c||void 0,...j(c?(0,e.pl)("attn.handled.snoozed","quiet until tomorrow"):void 0),...i("ssl"===a.kind&&a.managed&&"red"!==a.chip?(0,e.ph)("act.certLate","Chase {0}'s certificate",a.name):(0,e.ph)("act.renew","Renew {0}",a.name)),laterId:a.id})}for(let a of r){let b=`missing:${a}`;A[b]="amber",z.push({id:b,kind:"missing",tone:"amber",label:p(a),...h({what:(0,e.ph)("attn.missing.what","The folder {0} can't be found",a),why:(0,e.pl)("attn.missing.why","It moved or was renamed - point me at its new home, or stop watching it."),evidence:[(0,e.ph)("attn.missing.evPath","watched path: {0}",a),(0,e.pl)("attn.missing.evScan","the folder stopped answering on the last scan")],steps:[(0,e.pl)("attn.missing.step1","Press Find it and click through to where the folder lives now - the old entry is replaced."),(0,e.pl)("attn.missing.step2","If it's gone on purpose, Stop watching removes it.")]}),...i((0,e.ph)("act.find","Find {0}",p(a))),findPath:a})}z.sort((a,b)=>Number(a.handled??!1)-Number(b.handled??!1)||Number("red"===b.tone)-Number("red"===a.tone));let C=z.filter(a=>!a.handled).length,D=z.some(a=>"red"===a.tone&&!a.handled),E=b(a.findings).filter(a=>a?.cat==="safety").length,F=0;if(B){for(let a of c){let b=B.byPath[a.path.toLowerCase()];b&&!b.ok&&F++}B.outage&&F++}return F+=b(a.unreachedChecks).length,{state:D?"INCIDENT":C>0?"NEEDS_YOU":E>0?"SAFETY":"QUIET",open:C,items:z,tones:A,unreached:F+=new Set(b(a.unscannedSubjects)).size,safety:E}}function l(a){return a.isGit&&a.remoteKnown&&!a.hasRemote&&!a.looksDownloaded}function m(a){return 0===a.items.length&&0===Object.keys(a.tones).length}function n(a){let b=(a,b)=>({line:a.en,under:b.en,lineP:a,underP:b});if(m(a))return b((0,e.pl)("head.emptyLine","Nothing watched yet"),(0,e.pl)("head.emptyUnder","Point me at a folder and I'll show you the projects inside it."));if("INCIDENT"===a.state){let c=a.items.filter(a=>"red"===a.tone&&!a.handled);return b(1===c.length?(0,e.ph)("head.downOne","{0} is down",c[0].label):(0,e.ph)("head.downMany","{0} down",c.length),1===c.length?(0,e.pl)("head.incidentUnder","everything else can wait - this is the one to look at"):(0,e.pl)("head.incidentUnderMany","everything else can wait - these are the ones to look at"))}if("NEEDS_YOU"===a.state)return a.safety>0?b((0,e.ph)("head.needsLine",`{0} need${1===a.open?"s":""} you`,a.open),(0,e.ph)("head.needsUnderSafety",`none of it is on fire - each has a reason, and {0} safety finding${1===a.safety?" is":"s are"} waiting in Discoveries`,a.safety)):b((0,e.ph)("head.needsLine",`{0} need${1===a.open?"s":""} you`,a.open),(0,e.pl)("head.needsUnder","none of it is on fire - each has a reason"));let c=a.items.filter(a=>a.handled).length,d=a.unreached??0,f=a=>`thing${1===a?"":"s"}`;if("SAFETY"===a.state){let c=a.safety;return b((0,e.ph)("head.safetyLine",`{0} safety finding${1===c?"":"s"}`,c),d>0?(0,e.ph)("head.safetyMissed",`${1===c?"it is":"they are"} waiting in Discoveries - and af360 couldn't check {0} ${f(d)} this time`,d):(0,e.pl)("head.safetyUnder",`${1===c?"it is":"they are"} waiting in Discoveries`))}return b((0,e.pl)("head.quietLine","All quiet"),c>0?d>0?(0,e.ph)("head.quietHandledMissed",`nothing new needs you - {0} item${1===c?" is":"s are"} being handled, and af360 couldn't check {1} ${f(d)} this time`,c,d):(0,e.ph)("head.quietHandled",`nothing new needs you - {0} item${1===c?" is":"s are"} being handled`,c):d>0?(0,e.ph)("head.quietMissed",`nothing needs you - and af360 couldn't check {0} ${f(d)} this time`,d):(0,e.pl)("head.quietUnder","nothing needs you - go build something"))}function o(a){if(!a)return"nothing recorded";let b=[];return"number"==typeof a.uncommitted&&b.push(`${a.uncommitted} unsaved`),!1===a.hasRemote&&b.push("no backup"),a.down&&b.push("down"),b.length>0?b.join(", "):"all fine"}function p(a){let b=a.split(/[\\/]/).filter(Boolean);return b[b.length-1]??a}function q(a){return a<0?`${-a} day${-1===a?"":"s"} ago`:0===a?"today":1===a?"tomorrow":`in ${a} days`}}};
@@ -1 +1 @@
1
- "use strict";exports.id=4134,exports.ids=[4134],exports.modules={23787:(a,b,c)=>{c.d(b,{M:()=>f});var d=c(33873),e=c(21820);function f(){let a=process.env.AF360_HOME;return"string"==typeof a&&a.length>0&&d.isAbsolute(a)?a:d.join(e.homedir(),".af360")}},28606:(a,b,c)=>{c.d(b,{fV:()=>i,nI:()=>g,q6:()=>k,NK:()=>j});var d=c(73024),e=c(76760);let f={terms:"TERMS.md",privacy:"PRIVACY.md"},g="af360 could not read this document from its own files. This is a fault in this copy of af360, not something you did. Nothing has been agreed to.";function h(a){let b=f[a];if(!b)return g;try{return(0,d.readFileSync)(e.join(function(){let a=process.env.AF360_LEGAL;return a||e.join(void 0,"..","docs","legal")}(),b),"utf8").replace(/\r\n/g,"\n").trimEnd()}catch{return g}}let i=[{id:"terms",version:1,title:"Terms of Use",body:h("terms")},{id:"privacy",version:1,title:"Privacy Policy",body:h("privacy")}];function j(){return i.every(a=>a.body!==g)}function k(a){return i.find(b=>b.id===a)}},71011:(a,b,c)=>{c.d(b,{G5:()=>u,Si:()=>z,Z9:()=>w,aj:()=>r,cT:()=>y,eQ:()=>k,i4:()=>l,ql:()=>x,rH:()=>i,yF:()=>j});var d=c(29021),e=c(33873),f=c.n(e),g=c(55511),h=c(23787);let i=["projects","urls","discoveries"];function j(){return(0,h.M)()}function k(){return f().join((0,h.M)(),"config.json")}function l(){return{roots:[],urls:[],siteGroups:[],services:[],manualExpiries:[],pins:[],ignored:[],views:{},collapsed:{},scanIntervalHours:24,snoozes:{},rules:{exclude:[],muted:[]},declinedSites:[],declinedDates:[],connectedClients:[]}}let m=[f().join(process.cwd(),"af360.config.json"),f().join(process.cwd(),"rubban.config.json")];async function n(){try{await d.promises.access(k());return}catch{}for(let a of m)try{await d.promises.access(a),await d.promises.mkdir(j(),{recursive:!0}),await d.promises.copyFile(a,k()),await d.promises.unlink(a).catch(()=>{});return}catch{}}async function o(a){let b=!1;for(let c=0;c<a.roots.length;c++){let d=a.roots[c];if(!/(^|[\\/])rubban([\\/]|$)/i.test(d)||await p(d))continue;let e=d.replace(/(^|[\\/])rubban(?=[\\/]|$)/gi,"$1af360");if(!await p(e))continue;let f=d.toLowerCase(),g=e.toLowerCase();for(let b of(a.roots[c]=e,a.pins=a.pins.map(a=>a.startsWith(f)?g+a.slice(f.length):a),a.ignored))b.id.startsWith(f)&&(b.id=g+b.id.slice(f.length));a.snoozes=Object.fromEntries(Object.entries(a.snoozes).map(([a,b])=>[a.startsWith(f)?g+a.slice(f.length):a,b])),b=!0}return b}async function p(a){try{return await d.promises.access(a),!0}catch{return!1}}let q=globalThis;class r extends Error{constructor(a){super(`config unreadable: ${a}`),this.name="ConfigUnreadableError",this.fault={path:k(),reason:a}}}let s=a=>new Promise(b=>setTimeout(b,a));async function t(){for(let a=0;a<4;a++)try{return await d.promises.readFile(k(),"utf8")}catch(b){if(b?.code==="ENOENT")return null;await s(40*(a+1))}throw Error("config temporarily unreadable")}async function u(){let a,b;await n();try{a=await t()}catch{let a=q.__af360LastCfg;if(a)return{status:"ok",config:a,fault:null,recovered:{path:k(),reason:"af360 couldn't open it"}};return v("af360 couldn't open it")}if(null===a)return q.__af360LastCfg=null,{status:"missing",config:null,fault:null};try{b=JSON.parse(a)}catch{let a=q.__af360LastCfg;if(a)return{status:"ok",config:a,fault:null,recovered:{path:k(),reason:"the contents aren't readable as settings"}};return v("the contents aren't readable as settings")}{let a={roots:Array.isArray(b.roots)?b.roots.filter(a=>"string"==typeof a):[],urls:Array.isArray(b.urls)?b.urls.filter(a=>a&&"string"==typeof a.id&&"string"==typeof a.url).map(a=>({id:a.id,url:a.url,label:"string"==typeof a.label?a.label:void 0,group:"string"==typeof a.group&&a.group?a.group:void 0})):[],siteGroups:Array.isArray(b.siteGroups)?b.siteGroups.filter(a=>a&&"string"==typeof a.id&&"string"==typeof a.name&&a.name.trim()).map(a=>({id:a.id,name:a.name})):[],services:Array.isArray(b.services)?b.services.filter(a=>a&&"string"==typeof a.id&&"string"==typeof a.service&&"string"==typeof a.label&&"string"==typeof a.endpoint&&("status"===a.endpointKind||"home"===a.endpointKind)).map(a=>({id:a.id,service:a.service,label:a.label,endpoint:a.endpoint,endpointKind:a.endpointKind})):[],manualExpiries:Array.isArray(b.manualExpiries)?b.manualExpiries.filter(a=>a&&"string"==typeof a.id&&"string"==typeof a.name&&"string"==typeof a.date).map(a=>({id:a.id,name:a.name,date:a.date,note:"string"==typeof a.note?a.note:void 0,cost:!0===a.cost||void 0,done:!0===a.done||void 0})):[],pins:Array.isArray(b.pins)?b.pins.filter(a=>"string"==typeof a):[],ignored:Array.isArray(b.ignored)?b.ignored.filter(a=>a&&"string"==typeof a.id&&("project"===a.kind||"url"===a.kind)&&"string"==typeof a.label):[],snoozes:b.snoozes&&"object"==typeof b.snoozes&&!Array.isArray(b.snoozes)?Object.fromEntries(Object.entries(b.snoozes).filter(([,a])=>"string"==typeof a)):{},updateCheck:"boolean"==typeof b.updateCheck?b.updateCheck:void 0,domainLookup:!0===b.domainLookup||void 0,standingWatch:!0===b.standingWatch||void 0,lang:"ar"===b.lang||"en"===b.lang?b.lang:void 0,views:{projects:b.views?.projects==="cards"||b.views?.projects==="rows"?b.views.projects:void 0,urls:b.views?.urls==="cards"||b.views?.urls==="rows"?b.views.urls:void 0,discoveries:b.views?.discoveries==="cards"||b.views?.discoveries==="rows"?b.views.discoveries:void 0},collapsed:Object.fromEntries(["projects","sites","discoveries","ignored","drawer"].filter(a=>"boolean"==typeof b.collapsed?.[a]).map(a=>[a,b.collapsed[a]])),declinedSites:Array.isArray(b.declinedSites)?b.declinedSites.filter(a=>a&&"string"==typeof a.host&&"string"==typeof a.citation&&"number"==typeof a.ts):[],declinedDates:Array.isArray(b.declinedDates)?b.declinedDates.filter(a=>a&&"string"==typeof a.host&&"string"==typeof a.citation&&"number"==typeof a.ts):[],connectedClients:Array.isArray(b.connectedClients)?b.connectedClients.filter(a=>"string"==typeof a):[],connectors:function(a){if(!a||"object"!=typeof a||Array.isArray(a))return;let b=a.github;if(b&&"object"==typeof b&&"string"==typeof b.token&&b.token)return{github:{token:b.token,login:"string"==typeof b.login?b.login:void 0,repoNames:Array.isArray(b.repoNames)?b.repoNames.filter(a=>"string"==typeof a):void 0,expiresAt:"string"==typeof b.expiresAt&&Number.isFinite(Date.parse(b.expiresAt))?b.expiresAt:void 0,refreshToken:"string"==typeof b.refreshToken&&b.refreshToken?b.refreshToken:void 0,refreshExpiresAt:"string"==typeof b.refreshExpiresAt&&Number.isFinite(Date.parse(b.refreshExpiresAt))?b.refreshExpiresAt:void 0,installationId:"number"==typeof b.installationId?b.installationId:void 0,installationCount:"number"==typeof b.installationCount?b.installationCount:void 0,connectedAt:"number"==typeof b.connectedAt?b.connectedAt:void 0,reposKnown:"boolean"==typeof b.reposKnown?b.reposKnown:void 0}}}(b.connectors),consent:function(a){if(!a||"object"!=typeof a||Array.isArray(a)||"number"!=typeof a.acceptedAt||!Number.isFinite(a.acceptedAt))return;let b=a=>a&&"object"==typeof a&&"number"==typeof a.version&&Number.isFinite(a.version)&&"string"==typeof a.hash&&a.hash?{version:a.version,hash:a.hash}:void 0,c=b(a.terms),d=b(a.privacy);if(c&&d)return{acceptedAt:a.acceptedAt,terms:c,privacy:d}}(b.consent),rules:{exclude:Array.isArray(b.rules?.exclude)?b.rules.exclude.filter(a=>"string"==typeof a):[],muted:Array.isArray(b.rules?.muted)?b.rules.muted.filter(a=>"string"==typeof a):[]},pulse:b.pulse&&"string"==typeof b.pulse.week&&"number"==typeof b.pulse.ts&&"string"==typeof b.pulse.text?{week:b.pulse.week,ts:b.pulse.ts,text:b.pulse.text}:void 0,scanIntervalHours:"number"==typeof b.scanIntervalHours&&b.scanIntervalHours>=1?Math.min(24,b.scanIntervalHours):24};return await o(a)&&await x(a),q.__af360LastCfg=a,{status:"ok",config:a,fault:null}}}function v(a){return{status:"unreadable",config:null,fault:{path:k(),reason:a}}}async function w(){let a=await u();if("unreadable"===a.status)throw new r(a.fault.reason);return a.config}async function x(a){await d.promises.mkdir(j(),{recursive:!0});let b=f().join(j(),`.config.${process.pid}.${(0,g.randomUUID)().slice(0,8)}.tmp`);await d.promises.writeFile(b,JSON.stringify(a,null,2)+"\n","utf8"),await (async()=>{let a=JSON.parse(await d.promises.readFile(k(),"utf8"));delete a.connectors,delete a.guardianEmail,await d.promises.writeFile(f().join((0,h.M)(),"config.1.json"),JSON.stringify(a,null,2)+"\n","utf8")})().catch(()=>{});try{await d.promises.rename(b,k())}catch(a){throw await d.promises.unlink(b).catch(()=>{}),a}q.__af360LastCfg=a}function y(a){if(!a)return null;let{connectors:b,...c}=a,d={...c};return b?.github?.token&&(d.connectors={github:{connected:!0}}),d}function z(){return(0,g.randomUUID)().slice(0,8)}},94134:(a,b,c)=>{c.d(b,{NL:()=>j,$F:()=>i,hb:()=>l,CD:()=>k});var d=c(10641),e=c(28606),f=c(77598);function g(){let a={};for(let c of e.fV){var b;a[c.id]={version:c.version,hash:(b=c.body,(0,f.createHash)("sha256").update(b,"utf8").digest("hex"))}}return a}var h=c(71011);function i(){return g()}async function j(){let a=await (0,h.G5)();if("unreadable"===a.status)return{accepted:!1,reason:"unreadable",stale:[]};if("missing"===a.status)return{accepted:!1,reason:"never",stale:e.fV.map(a=>a.id)};let b=a.config.consent,c=function(a){if(!a)return e.fV.map(a=>a.id);let b={terms:a.terms,privacy:a.privacy};return e.fV.filter(a=>(b[a.id]?.version??-1)!==a.version).map(a=>a.id)}(b);return b?c.length?{accepted:!1,reason:"changed",stale:c}:{accepted:!0,record:b}:{accepted:!1,reason:"never",stale:c}}async function k(){let a=await j();if(a.accepted||"unreadable"===a.reason)return null;let b=!1===a.accepted&&"changed"===a.reason;return d.NextResponse.json({ok:!1,consent:"required",changed:b,message:b?"af360's Terms of Use or Privacy Policy have changed. af360 asks you to read them again before it looks at anything.":"af360 has not been given permission to look at this machine yet."},{status:403})}async function l(){let a=await (0,h.G5)();if("unreadable"===a.status)throw new h.aj(a.fault.reason);let b="ok"===a.status?a.config:(0,h.i4)(),c=function(a=Date.now()){let b=g();return{acceptedAt:a,terms:b.terms,privacy:b.privacy}}();return b.consent=c,await (0,h.ql)(b),c}}};
1
+ "use strict";exports.id=4134,exports.ids=[4134],exports.modules={23787:(a,b,c)=>{c.d(b,{M:()=>f});var d=c(33873),e=c(21820);function f(){let a=process.env.AF360_HOME;return"string"==typeof a&&a.length>0&&d.isAbsolute(a)?a:d.join(e.homedir(),".af360")}},28606:(a,b,c)=>{c.d(b,{fV:()=>i,nI:()=>g,q6:()=>k,NK:()=>j});var d=c(73024),e=c(76760);let f={terms:"TERMS.md",privacy:"PRIVACY.md"},g="af360 could not read this document from its own files. This is a fault in this copy of af360, not something you did. Nothing has been agreed to.";function h(a){let b=f[a];if(!b)return g;try{return(0,d.readFileSync)(e.join(function(){let a=process.env.AF360_LEGAL;return a||e.join(void 0,"..","docs","legal")}(),b),"utf8").replace(/\r\n/g,"\n").trimEnd()}catch{return g}}let i=[{id:"terms",version:1,title:"Terms of Use",body:h("terms")},{id:"privacy",version:1,title:"Privacy Policy",body:h("privacy")}];function j(){return i.every(a=>a.body!==g)}function k(a){return i.find(b=>b.id===a)}},71011:(a,b,c)=>{c.d(b,{G5:()=>u,Si:()=>z,Z9:()=>w,aj:()=>r,cT:()=>y,eQ:()=>k,i4:()=>l,ql:()=>x,rH:()=>i,yF:()=>j});var d=c(29021),e=c(33873),f=c.n(e),g=c(55511),h=c(23787);let i=["projects","urls","discoveries"];function j(){return(0,h.M)()}function k(){return f().join((0,h.M)(),"config.json")}function l(){return{roots:[],urls:[],siteGroups:[],services:[],manualExpiries:[],pins:[],ignored:[],dismissed:[],views:{},collapsed:{},scanIntervalHours:24,snoozes:{},rules:{exclude:[],muted:[]},declinedSites:[],declinedDates:[],connectedClients:[]}}let m=[f().join(process.cwd(),"af360.config.json"),f().join(process.cwd(),"rubban.config.json")];async function n(){try{await d.promises.access(k());return}catch{}for(let a of m)try{await d.promises.access(a),await d.promises.mkdir(j(),{recursive:!0}),await d.promises.copyFile(a,k()),await d.promises.unlink(a).catch(()=>{});return}catch{}}async function o(a){let b=!1;for(let c=0;c<a.roots.length;c++){let d=a.roots[c];if(!/(^|[\\/])rubban([\\/]|$)/i.test(d)||await p(d))continue;let e=d.replace(/(^|[\\/])rubban(?=[\\/]|$)/gi,"$1af360");if(!await p(e))continue;let f=d.toLowerCase(),g=e.toLowerCase();for(let b of(a.roots[c]=e,a.pins=a.pins.map(a=>a.startsWith(f)?g+a.slice(f.length):a),a.ignored))b.id.startsWith(f)&&(b.id=g+b.id.slice(f.length));a.snoozes=Object.fromEntries(Object.entries(a.snoozes).map(([a,b])=>[a.startsWith(f)?g+a.slice(f.length):a,b])),b=!0}return b}async function p(a){try{return await d.promises.access(a),!0}catch{return!1}}let q=globalThis;class r extends Error{constructor(a){super(`config unreadable: ${a}`),this.name="ConfigUnreadableError",this.fault={path:k(),reason:a}}}let s=a=>new Promise(b=>setTimeout(b,a));async function t(){for(let a=0;a<4;a++)try{return await d.promises.readFile(k(),"utf8")}catch(b){if(b?.code==="ENOENT")return null;await s(40*(a+1))}throw Error("config temporarily unreadable")}async function u(){let a,b;await n();try{a=await t()}catch{let a=q.__af360LastCfg;if(a)return{status:"ok",config:a,fault:null,recovered:{path:k(),reason:"af360 couldn't open it"}};return v("af360 couldn't open it")}if(null===a)return q.__af360LastCfg=null,{status:"missing",config:null,fault:null};try{b=JSON.parse(a)}catch{let a=q.__af360LastCfg;if(a)return{status:"ok",config:a,fault:null,recovered:{path:k(),reason:"the contents aren't readable as settings"}};return v("the contents aren't readable as settings")}{let a={roots:Array.isArray(b.roots)?b.roots.filter(a=>"string"==typeof a):[],urls:Array.isArray(b.urls)?b.urls.filter(a=>a&&"string"==typeof a.id&&"string"==typeof a.url).map(a=>({id:a.id,url:a.url,label:"string"==typeof a.label?a.label:void 0,group:"string"==typeof a.group&&a.group?a.group:void 0})):[],siteGroups:Array.isArray(b.siteGroups)?b.siteGroups.filter(a=>a&&"string"==typeof a.id&&"string"==typeof a.name&&a.name.trim()).map(a=>({id:a.id,name:a.name})):[],services:Array.isArray(b.services)?b.services.filter(a=>a&&"string"==typeof a.id&&"string"==typeof a.service&&"string"==typeof a.label&&"string"==typeof a.endpoint&&("status"===a.endpointKind||"home"===a.endpointKind)).map(a=>({id:a.id,service:a.service,label:a.label,endpoint:a.endpoint,endpointKind:a.endpointKind})):[],manualExpiries:Array.isArray(b.manualExpiries)?b.manualExpiries.filter(a=>a&&"string"==typeof a.id&&"string"==typeof a.name&&"string"==typeof a.date).map(a=>({id:a.id,name:a.name,date:a.date,note:"string"==typeof a.note?a.note:void 0,cost:!0===a.cost||void 0,done:!0===a.done||void 0})):[],pins:Array.isArray(b.pins)?b.pins.filter(a=>"string"==typeof a):[],ignored:Array.isArray(b.ignored)?b.ignored.filter(a=>a&&"string"==typeof a.id&&("project"===a.kind||"url"===a.kind)&&"string"==typeof a.label):[],dismissed:Array.isArray(b.dismissed)?b.dismissed.filter(a=>a&&"string"==typeof a.id&&"string"==typeof a.sentence&&""!==a.sentence&&"number"==typeof a.ts).map(a=>({id:a.id,sentence:a.sentence,ts:a.ts,resurface:a.resurface&&"string"==typeof a.resurface.current?{current:a.resurface.current}:void 0})):[],snoozes:b.snoozes&&"object"==typeof b.snoozes&&!Array.isArray(b.snoozes)?Object.fromEntries(Object.entries(b.snoozes).filter(([,a])=>"string"==typeof a)):{},updateCheck:"boolean"==typeof b.updateCheck?b.updateCheck:void 0,domainLookup:!0===b.domainLookup||void 0,standingWatch:!0===b.standingWatch||void 0,lang:"ar"===b.lang||"en"===b.lang?b.lang:void 0,views:{projects:b.views?.projects==="cards"||b.views?.projects==="rows"?b.views.projects:void 0,urls:b.views?.urls==="cards"||b.views?.urls==="rows"?b.views.urls:void 0,discoveries:b.views?.discoveries==="cards"||b.views?.discoveries==="rows"?b.views.discoveries:void 0},collapsed:Object.fromEntries(["projects","sites","discoveries","ignored","drawer"].filter(a=>"boolean"==typeof b.collapsed?.[a]).map(a=>[a,b.collapsed[a]])),declinedSites:Array.isArray(b.declinedSites)?b.declinedSites.filter(a=>a&&"string"==typeof a.host&&"string"==typeof a.citation&&"number"==typeof a.ts):[],declinedDates:Array.isArray(b.declinedDates)?b.declinedDates.filter(a=>a&&"string"==typeof a.host&&"string"==typeof a.citation&&"number"==typeof a.ts):[],connectedClients:Array.isArray(b.connectedClients)?b.connectedClients.filter(a=>"string"==typeof a):[],connectors:function(a){if(!a||"object"!=typeof a||Array.isArray(a))return;let b=a.github;if(b&&"object"==typeof b&&"string"==typeof b.token&&b.token)return{github:{token:b.token,login:"string"==typeof b.login?b.login:void 0,repoNames:Array.isArray(b.repoNames)?b.repoNames.filter(a=>"string"==typeof a):void 0,expiresAt:"string"==typeof b.expiresAt&&Number.isFinite(Date.parse(b.expiresAt))?b.expiresAt:void 0,refreshToken:"string"==typeof b.refreshToken&&b.refreshToken?b.refreshToken:void 0,refreshExpiresAt:"string"==typeof b.refreshExpiresAt&&Number.isFinite(Date.parse(b.refreshExpiresAt))?b.refreshExpiresAt:void 0,installationId:"number"==typeof b.installationId?b.installationId:void 0,installationCount:"number"==typeof b.installationCount?b.installationCount:void 0,connectedAt:"number"==typeof b.connectedAt?b.connectedAt:void 0,reposKnown:"boolean"==typeof b.reposKnown?b.reposKnown:void 0}}}(b.connectors),consent:function(a){if(!a||"object"!=typeof a||Array.isArray(a)||"number"!=typeof a.acceptedAt||!Number.isFinite(a.acceptedAt))return;let b=a=>a&&"object"==typeof a&&"number"==typeof a.version&&Number.isFinite(a.version)&&"string"==typeof a.hash&&a.hash?{version:a.version,hash:a.hash}:void 0,c=b(a.terms),d=b(a.privacy);if(c&&d)return{acceptedAt:a.acceptedAt,terms:c,privacy:d}}(b.consent),rules:{exclude:Array.isArray(b.rules?.exclude)?b.rules.exclude.filter(a=>"string"==typeof a):[],muted:Array.isArray(b.rules?.muted)?b.rules.muted.filter(a=>"string"==typeof a):[]},pulse:b.pulse&&"string"==typeof b.pulse.week&&"number"==typeof b.pulse.ts&&"string"==typeof b.pulse.text?{week:b.pulse.week,ts:b.pulse.ts,text:b.pulse.text}:void 0,scanIntervalHours:"number"==typeof b.scanIntervalHours&&b.scanIntervalHours>=1?Math.min(24,b.scanIntervalHours):24};return await o(a)&&await x(a),q.__af360LastCfg=a,{status:"ok",config:a,fault:null}}}function v(a){return{status:"unreadable",config:null,fault:{path:k(),reason:a}}}async function w(){let a=await u();if("unreadable"===a.status)throw new r(a.fault.reason);return a.config}async function x(a){await d.promises.mkdir(j(),{recursive:!0});let b=f().join(j(),`.config.${process.pid}.${(0,g.randomUUID)().slice(0,8)}.tmp`);await d.promises.writeFile(b,JSON.stringify(a,null,2)+"\n","utf8"),await (async()=>{let a=JSON.parse(await d.promises.readFile(k(),"utf8"));delete a.connectors,delete a.guardianEmail,await d.promises.writeFile(f().join((0,h.M)(),"config.1.json"),JSON.stringify(a,null,2)+"\n","utf8")})().catch(()=>{});try{await d.promises.rename(b,k())}catch(a){throw await d.promises.unlink(b).catch(()=>{}),a}q.__af360LastCfg=a}function y(a){if(!a)return null;let{connectors:b,...c}=a,d={...c};return b?.github?.token&&(d.connectors={github:{connected:!0}}),d}function z(){return(0,g.randomUUID)().slice(0,8)}},94134:(a,b,c)=>{c.d(b,{NL:()=>j,$F:()=>i,hb:()=>l,CD:()=>k});var d=c(10641),e=c(28606),f=c(77598);function g(){let a={};for(let c of e.fV){var b;a[c.id]={version:c.version,hash:(b=c.body,(0,f.createHash)("sha256").update(b,"utf8").digest("hex"))}}return a}var h=c(71011);function i(){return g()}async function j(){let a=await (0,h.G5)();if("unreadable"===a.status)return{accepted:!1,reason:"unreadable",stale:[]};if("missing"===a.status)return{accepted:!1,reason:"never",stale:e.fV.map(a=>a.id)};let b=a.config.consent,c=function(a){if(!a)return e.fV.map(a=>a.id);let b={terms:a.terms,privacy:a.privacy};return e.fV.filter(a=>(b[a.id]?.version??-1)!==a.version).map(a=>a.id)}(b);return b?c.length?{accepted:!1,reason:"changed",stale:c}:{accepted:!0,record:b}:{accepted:!1,reason:"never",stale:c}}async function k(){let a=await j();if(a.accepted||"unreadable"===a.reason)return null;let b=!1===a.accepted&&"changed"===a.reason;return d.NextResponse.json({ok:!1,consent:"required",changed:b,message:b?"af360's Terms of Use or Privacy Policy have changed. af360 asks you to read them again before it looks at anything.":"af360 has not been given permission to look at this machine yet."},{status:403})}async function l(){let a=await (0,h.G5)();if("unreadable"===a.status)throw new h.aj(a.fault.reason);let b="ok"===a.status?a.config:(0,h.i4)(),c=function(a=Date.now()){let b=g();return{acceptedAt:a,terms:b.terms,privacy:b.privacy}}();return b.consent=c,await (0,h.ql)(b),c}}};
@@ -1 +1 @@
1
- "use strict";exports.id=7511,exports.ids=[7511],exports.modules={27511:(a,b,c)=>{c.d(b,{cc:()=>u,Uj:()=>B,ou:()=>C,ct:()=>K,kc:()=>L,aA:()=>t,G2:()=>F,yn:()=>w,j4:()=>N,Wj:()=>s});var d=c(21124),e=c(38301),f=c(73450),g=c(60521),h=c(7240),i=c(71322),j=c(99511),k=c(31296),l=c(78530),m=c(72338),n=c(40850),o=c(95938);let p={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"},q=Object.fromEntries(Object.keys(p).map(a=>[a,`GitHub not checked (${p[a]})`]));var r=c(80891);function s(a){let b=(0,l.kj)();(0,l.cO)();let[c,f]=(0,e.useState)(null),[g,h]=(0,e.useState)(null),i=(0,l.Je)(),j=a=>{h(a),setTimeout(()=>h(b=>b===a?null:b),4500)},m=async(c,d,e,f)=>{let g=await a.doIgnore(c,d,e,f);j(g.ok?i((0,n.ph)("toast.ignored",k.UI.radar.ignoredToast,e)):g.message??b("common.somethingWrong",k.UI.common.somethingWrong))},o=(0,d.jsxs)(d.Fragment,{children:[g&&(0,d.jsx)("div",{className:"toast",role:"status",children:g}),c&&(0,d.jsx)("div",{className:"confirm-overlay",role:"dialog","aria-modal":"true",children:(0,d.jsxs)("div",{className:"confirm",children:[(0,d.jsx)("p",{children:c.message}),(0,d.jsxs)("div",{className:"setup-actions",children:[(0,d.jsx)("button",{className:"b",onClick:()=>{m(c.id,c.kind,c.label,c.snapshot),f(null)},children:b("act.ignoreIt",k.UI.radar.ignoreIt)}),(0,d.jsx)("button",{className:"b accent",onClick:()=>f(null),children:b("act.keepWatching",k.UI.radar.keepWatching)})]})]})})]});return{requestIgnore:(a,b,c,d,e,g)=>{d?f({id:a,kind:b,label:c,message:e,snapshot:g}):m(a,b,c,g)},ignoreThen:m,showToast:j,overlays:o}}function t({view:a,onChange:b}){return(0,d.jsx)(j.fn,{view:a,onChange:b})}function u({value:a,onChange:b,showLabel:c=k.UI.common.show,hideLabel:e=k.UI.common.collapse,showKey:f="btn.show",hideKey:g="btn.collapse"}){return(0,d.jsx)("button",{className:"collapse","aria-expanded":!a,onClick:()=>b(!a),children:a?(0,d.jsx)(l.T,{k:f,en:c}):(0,d.jsx)(l.T,{k:g,en:e})})}function v({pinned:a,onPin:b,onIgnore:c}){let e=(0,l.kj)(),f=(0,l.cO)();return(0,d.jsx)(j.ob,{actions:[{label:a?e("act.unpin",k.UI.radar.unpin):e("act.pin",k.UI.radar.pinLabel),title:f.pin,onClick:b,effect:a?e("eff.unpin",k.UI.radar.effUnpin):e("eff.pin",k.UI.radar.effPin)},{label:e("act.ignore",k.UI.radar.ignoreLabel),title:f.ignore,onClick:c,effect:e("eff.ignore",k.UI.radar.effIgnore)}]})}let w=a=>a.path.toLowerCase();function x(a){if(!a)return null;let b=new Date(a).getTime();if(!Number.isFinite(b))return null;let c=Date.now()-b;return c<0?null:Math.floor(c/864e5)}function y({p:a,tone:b,cockpit:c}){let e=(0,l.kj)(),i=null!==b&&"clean"!==b,j=(0,l.cO)(),n=x(a.lastActivity),o=c.isDupe(a.name)&&("dormant"===a.staleness||"forgotten"===a.staleness)?(0,g.ih)(a,c.projects):null,p=o&&"unproven"!==o.kind?o.others:[],q=p.length>0?p.map(a=>(0,h.oV)(a.path,26)).join(", "):null,s=null!==q,t=[];return a.changedTotal>0&&t.push((0,d.jsxs)("b",{...(0,r.uN)(j.unsaved),children:[a.changedTotal," unsaved"]},"u")),a.deleted>0&&t.push((0,d.jsxs)("b",{...(0,r.uN)(j.deleted),children:[a.deleted," deleted"]},"del")),(a.ahead??0)>0&&t.push(a.uncommitted>0?(0,d.jsxs)("span",{...(0,r.uN)(j.unpushed),children:[a.ahead," unpushed"]},"a"):(0,d.jsxs)("b",{...(0,r.uN)(j.unpushed),children:[a.ahead," unpushed"]},"a")),(0,g.ze)(a)&&t.push((0,d.jsx)("b",{...(0,r.uN)(j.onlyHere),children:"only on this machine"},"nr")),a.isGit||a.looksDownloaded||t.push((0,d.jsx)("span",{...(0,r.uN)(j.noHistory),children:"no git history"},"ng")),s&&0===a.uncommitted&&null!==n&&t.push((0,d.jsxs)("b",{...(0,r.uN)(j.dormant),children:["dormant ",n,"d"]},"d")),q&&o?.kind==="duplicate"?t.push((0,d.jsxs)("span",{...(0,r.uN)(j.duplicate),children:["duplicate of ",q]},"dup")):q&&o?.kind==="sharesName"&&t.push((0,d.jsxs)("span",{...(0,r.uN)(j.sharesName),children:["shares a name with ",q]},"dup")),null===b?t.push((0,d.jsx)("span",{className:"dim-t",children:(0,d.jsx)(m.h,{children:e("common.checking",k.UI.common.checking)})},"chk")):i||t.push((0,d.jsx)("span",{className:"okw",...(0,r.uN)(j.clean),children:"clean ✓"},"ok")),a.looksDownloaded?t.push((0,d.jsx)("span",{...(0,r.uN)(j.downloadedCopy),children:"looks downloaded"},"dl")):a.lastActivity&&!(s&&0===a.uncommitted)&&t.push((0,d.jsxs)("span",{children:[a.lastCommit?i?"last commit ":"committed ":"touched ",(0,d.jsx)(f.fV,{ts:a.lastActivity})]},"t")),(0,d.jsx)("div",{className:"c-fact",children:t.map((a,b)=>(0,d.jsxs)("span",{children:[b>0&&" \xb7 ",a]},b))})}function z(a,b=(a,b)=>b){return[w(a),"project",a.name,(0,g.ze)(a),b("confirm.projectShort",k.UI.radar.confirmProjectShort),{uncommitted:a.uncommitted,hasRemote:a.hasRemote}]}function A({p:a,cockpit:b}){let c=(0,e.useContext)(f.vC),h=(0,l.kj)(),i=(0,l.cO)(),j=(b.cfg?.roots??[]).find(b=>b.toLowerCase()===w(a));return(0,d.jsxs)(d.Fragment,{children:[a.looksDownloaded?(0,d.jsx)("span",{children:"Looks like something downloaded rather than something you wrote."}):(0,g.ze)(a)?(0,d.jsx)("span",{children:"No remote copy exists - one disk failure and it's gone."}):a.hasRemote?(0,d.jsxs)("span",{...(0,r.uN)(i.remote),children:["Backed up to a remote ✓",(a.ahead??0)>0&&(0,d.jsxs)(d.Fragment,{children:[" - ",a.ahead," commit",1===a.ahead?"":"s"," not pushed yet"]})]}):null,c&&a.isGit&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("span",{className:"mono",children:["branch ",a.branch??"-"," \xb7 remote ",a.remoteUrl??a.remoteName??"-",null!=a.ahead&&null!=a.behind&&(0,d.jsxs)(d.Fragment,{children:[" \xb7 ",a.ahead," ahead / ",a.behind," behind"]}),null!=a.commitCount&&(0,d.jsxs)(d.Fragment,{children:[" \xb7 ",a.commitCount," commits"]})]}),a.dirtyFiles.length>0&&(0,d.jsxs)("span",{className:"mono",children:["changed: ",a.dirtyFiles.join(", "),a.changedTotal>a.dirtyFiles.length?` … +${a.changedTotal-a.dirtyFiles.length} more`:""]}),a.deletedFiles.length>0&&(0,d.jsxs)("span",{className:"mono",children:["deleted: ",a.deletedFiles.join(", "),a.deleted>a.deletedFiles.length?` … +${a.deleted-a.deletedFiles.length} more`:""]})]}),c&&(0,d.jsx)("span",{className:"mono",children:a.path}),j&&(0,d.jsx)("button",{className:"b danger",style:{justifySelf:"start"},...(0,r.uN)(i.unwatch),onClick:()=>b.post({action:"removeRoot",path:j}).then(a=>{a.ok&&b.resolveRow(j)}),children:h("act.stopWatchingFolder",k.UI.radar.stopWatchingFolder)})]})}function B({p:a,tone:b,cockpit:c,change:e,open:f,onToggle:g,onIgnoreRequest:j,onToast:m}){let n=null!==b&&"clean"!==b,o=c.isPinned(w(a)),p=(0,l.kj)();return(0,l.cO)(),(0,d.jsxs)("div",{[i.J6]:w(a),className:`card${n?" warn":""}${o?" pinned":""}`,children:[(0,d.jsxs)("div",{className:"c-top",children:[(0,d.jsx)("span",{className:`dot ${null===b?"u":n?"a":"g"}`,"aria-hidden":!0}),(0,d.jsx)("b",{children:a.name}),e&&(0,d.jsx)("span",{className:"chg",children:e})]}),(0,d.jsx)(y,{p:a,tone:b,cockpit:c}),(0,d.jsx)(D,{p:a,cockpit:c}),(0,d.jsx)("div",{className:"c-path",children:(0,h.oV)(a.path,40)}),(0,d.jsxs)("div",{className:"c-foot",children:[(0,d.jsx)("button",{className:"b2 q",onClick:g,"aria-expanded":f,children:f?(0,d.jsx)(l.T,{k:"btn.hide",en:k.UI.common.hide}):(0,d.jsx)(l.T,{k:"btn.details",en:k.UI.common.details})}),!c.demo&&(0,d.jsx)(i.Fb,{cockpit:c,project:a,onToast:m,link:!0}),!c.demo&&(0,d.jsx)(i.r8,{path:a.path}),(0,d.jsx)(v,{pinned:o,onPin:()=>c.togglePin(w(a)),onIgnore:()=>j(...z(a,p))})]}),f&&(0,d.jsx)("div",{className:"c-detail",children:(0,d.jsx)(A,{p:a,cockpit:c})})]})}function C({p:a,tone:b,cockpit:c,change:e,open:f,onToggle:g,onIgnoreRequest:j}){let k=null!==b&&"clean"!==b,m=c.isPinned(w(a)),n=c.isDupe(a.name),o=(0,l.kj)();return(0,l.cO)(),(0,d.jsxs)("div",{[i.J6]:w(a),className:`irow${k?" warn":""}`,children:[(0,d.jsxs)("div",{className:"irow-line",children:[(0,d.jsxs)("button",{className:"irow-main",onClick:g,"aria-expanded":f,children:[(0,d.jsx)("span",{className:`dot ${null===b?"u":k?"a":"g"}`,"aria-hidden":!0}),(0,d.jsxs)("span",{className:"irow-name",children:[a.name,n&&(0,d.jsxs)("span",{className:"irow-parent",children:[" (",function(a){let b=a.split(/[\\/]/).filter(Boolean);return b.length>1?b[b.length-2]:a}(a.path),")"]})]}),e&&(0,d.jsx)("span",{className:"chg",children:e}),(0,d.jsx)("span",{className:`irow-truth${k?" warn":""}`,children:(0,d.jsx)(E,{p:a,tone:b,cockpit:c})}),(0,d.jsx)("span",{className:"irow-path",children:(0,h.oV)(a.path,40)})]}),(0,d.jsx)(D,{p:a,cockpit:c}),(0,d.jsxs)("span",{className:"qk",children:[!c.demo&&(0,d.jsx)(i.r8,{path:a.path}),(0,d.jsx)(v,{pinned:m,onPin:()=>c.togglePin(w(a)),onIgnore:()=>j(...z(a,o))})]})]}),f&&(0,d.jsx)("div",{className:"irow-detail",children:(0,d.jsx)(A,{p:a,cockpit:c})})]})}function D({p:a,cockpit:b}){var c;let e=(0,l.kj)(),g=b.radar?.github??null;if(!g)return null;let h=(c=a.path,g?g.byPath[c.toLowerCase()]??null:null),i=function(a){if(!a)return null;let b=/[/@]github\.com[:/]+([^/]+)\/([^/]+?)(?:\.git)?\/?$/.exec(a);return b?`${b[1]}/${b[2]}`:null}(a.remoteUrl),j=i?(0,d.jsxs)("span",{className:"gh-prov",children:[(0,d.jsx)(o.En,{children:i}),h?.ok?(0,d.jsxs)(d.Fragment,{children:[" \xb7 ",e("connections.ghCardChecked",k.UI.connections.ghCardChecked)," ",(0,d.jsx)(f.fV,{ts:g.at})]}):h?null:(0,d.jsxs)(d.Fragment,{children:[" \xb7 ",e("connections.ghCardNever",k.UI.connections.ghCardNever)]})]}):null;if(!h)return g.outage?(0,d.jsxs)("span",{className:"gh-chips",children:[j,(0,d.jsx)(o.En,{children:(0,d.jsx)("span",{className:"chip plain",children:"GitHub not checked yet"})})]}):null;if(!h.ok)return(0,d.jsxs)("span",{className:"gh-chips",children:[j,(0,d.jsx)(o.En,{children:(0,d.jsx)("span",{className:"chip plain",children:q[h.kind]})})]});let m=h.value,n=[];if(m.ci.ok&&m.ci.value){let a=m.ci.value,b="passing"===a.state?"calm":"failing"===a.state?"bad":"plain",c="passing"===a.state?"✓":"failing"===a.state?"✗":"\xb7";n.push((0,d.jsxs)("span",{className:`chip ${b}`,children:["CI ",c," ",a.branch]},"ci"))}else{let a;m.ci.ok||n.push((0,d.jsx)("span",{className:"chip plain",children:(a=m.ci.kind,`CI not checked (${p[a]})`)},"ci"))}if(m.prCount.ok&&m.prCount.value>0){let a=m.prCount.value;n.push((0,d.jsxs)("span",{className:"chip plain",children:[a,m.prCapped?"+":""," PR",1!==a||m.prCapped?"s":""]},"pr"))}if(m.issueCount.ok&&m.issueCount.value>0){let a=m.issueCount.value;n.push((0,d.jsxs)("span",{className:"chip plain",children:[a," issue",1===a?"":"s"]},"is"))}return("confirmed"===m.backup.verdict&&n.push((0,d.jsx)("span",{className:"chip calm",...(0,r.uN)("af360 asked GitHub, and GitHub has this exact commit"),children:"GitHub confirms"},"bk")),0===n.length)?j?(0,d.jsx)("span",{className:"gh-chips",children:j}):null:(0,d.jsxs)("span",{className:"gh-chips",children:[j,(0,d.jsx)(o.En,{children:n})]})}function E({p:a,tone:b,cockpit:c}){let e=(0,l.cO)(),h=c.isDupe(a.name)&&("dormant"===a.staleness||"forgotten"===a.staleness)?(0,g.ih)(a,c.projects):null,i=h?.kind==="duplicate",j=x(a.lastActivity);return a.looksDownloaded?(0,d.jsx)("span",{...(0,r.uN)(e.downloadedCopy),children:"looks downloaded"}):a.uncommitted>0?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("span",{...(0,r.uN)(e.unsaved),children:[a.uncommitted," unsaved"]})," \xb7 last commit ",a.lastActivity?(0,d.jsx)(f.fV,{ts:a.lastActivity}):"never"]}):(0,g.ze)(a)?(0,d.jsx)("span",{...(0,r.uN)(e.onlyHere),children:"only on this machine"}):(a.ahead??0)>0?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("span",{...(0,r.uN)(e.unpushed),children:[a.ahead," unpushed"]})," \xb7 committed ",a.lastActivity?(0,d.jsx)(f.fV,{ts:a.lastActivity}):"-"]}):"clean"!==b&&i&&null!==j?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("span",{...(0,r.uN)(e.dormant),children:["dormant ",j,"d"]})," \xb7 ",(0,d.jsx)("span",{...(0,r.uN)(e.duplicate),children:"duplicate"})]}):a.lastActivity?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("span",{...(0,r.uN)(e.clean),children:"clean ✓"})," \xb7 committed ",(0,d.jsx)(f.fV,{ts:a.lastActivity})]}):(0,d.jsx)("span",{...(0,r.uN)(e.noHistory),children:"no history"})}function F(a,b){return a.find(a=>a.subjectId===b)??null}function G(a){let b=a.entry.label||P(a.entry.url),c=!!a.current&&!a.current.ok;return[a.entry.id,"url",b,c,k.UI.radar.confirmSite,{down:c}]}function H({u:a,incident:b}){let c=(0,e.useContext)(f.vC),g=(0,l.kj)();(0,l.cO)();let h=a.current;if(!h)return(0,d.jsx)("span",{children:(0,d.jsx)(m.h,{children:g("site.firstCheck",k.UI.radar.firstCheck)})});if(!h.ok)return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("b",{children:Q(a.sinceText)}),c&&h.status?` \xb7 HTTP ${h.status}`:"",b?.acknowledged?" \xb7 being handled ✓":""]});let i=Q(a.sinceText).replace(/^up for /,"up "),j=b?.endedTs?(0,d.jsxs)(d.Fragment,{children:["last incident ",(0,d.jsx)(f.fV,{ts:b.endedTs})]}):(0,d.jsx)(d.Fragment,{children:"no incidents while watching"});return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("span",{className:"okw",children:i})," \xb7 ","number"==typeof h.ms?`${h.ms} ms`:"-",c&&h.status?` \xb7 HTTP ${h.status}`:""," \xb7 ",j]})}function I({u:a,cockpit:b}){let c=a.current,e=P(a.entry.url),f=b.expiry?.items.find(a=>"ssl"===a.kind&&a.name===e),g=Object.entries(c?.headers??{}),h=["strict-transport-security","content-security-policy"].filter(a=>!(c?.headers??{})[a]);return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("span",{className:"mono",children:["HTTP ",c?.status??"-"," \xb7 total ","number"==typeof c?.ms?`${c.ms} ms`:"-"," \xb7 checked ",c?new Date(c.ts).toLocaleTimeString():"-"]}),f&&(0,d.jsxs)("span",{className:"mono",children:["cert: ",f.issuer??"unknown issuer",f.serial?` \xb7 serial ${f.serial}`:""]}),g.length>0&&(0,d.jsxs)("span",{className:"mono",children:["headers: ",g.map(([a,b])=>`${a}: ${b}`).join(" \xb7 ")]}),h.length>0&&(0,d.jsxs)("span",{className:"mono",children:["missing: ",h.join(", ")]})]})}function J({u:a,cockpit:b,incident:c}){let g=(0,l.kj)(),h=(0,l.cO)(),i=(0,e.useContext)(f.vC);return(0,d.jsxs)(d.Fragment,{children:[c&&!c.endedTs&&(0,d.jsxs)("span",{children:["Ongoing: down since ",(0,d.jsx)(f.fV,{ts:c.startedTs,skewForm:"core"}),c.acknowledged?" \xb7 being handled ✓":""]}),i&&(0,d.jsx)(I,{u:a,cockpit:b}),(0,d.jsx)("a",{href:a.entry.url,target:"_blank",rel:"noreferrer",children:a.entry.url}),(0,d.jsx)("button",{className:"b danger",style:{justifySelf:"start"},...(0,r.uN)(h.unwatch),onClick:()=>b.post({action:"removeUrl",id:a.entry.id}).then(c=>{c.ok&&b.resolveRow(a.entry.id)}),children:g("act.stopWatchingSite",k.UI.radar.stopWatchingSite)})]})}function K({u:a,tone:b,cockpit:c,incident:e,open:f,onToggle:g,onIgnoreRequest:j,extra:m}){let n=a.current,o="red"===b;(0,l.kj)(),(0,l.cO)();let p=c.isPinned(a.entry.id),q=a.entry.label||P(a.entry.url);return(0,d.jsxs)("div",{className:`card site${o?" bad":""}${p?" pinned":""}`,children:[(0,d.jsxs)("div",{children:[(0,d.jsxs)("div",{className:"c-top",children:[(0,d.jsx)("span",{className:`dot ${null===b||!n?"u":o?"r":"g"}`,"aria-hidden":!0}),(0,d.jsx)("b",{children:q})]}),(0,d.jsx)("div",{className:"c-fact",children:(0,d.jsx)(H,{u:a,incident:e})}),(0,d.jsx)("div",{className:"c-path",children:(0,h.oV)(a.entry.url,44)}),(0,d.jsxs)("div",{className:"c-foot",children:[(0,d.jsx)("button",{className:"b2 q",onClick:g,"aria-expanded":f,children:f?(0,d.jsx)(l.T,{k:"btn.hide",en:k.UI.common.hide}):(0,d.jsx)(l.T,{k:"btn.details",en:k.UI.common.details})}),(0,d.jsx)(i.r8,{path:a.entry.url,label:k.UI.radar.copyAddress,labelKey:"btn.copyAddress"}),(0,d.jsx)(v,{pinned:p,onPin:()=>c.togglePin(a.entry.id),onIgnore:()=>j(...G(a))}),m]})]}),(0,d.jsx)(M,{history:a.history}),f&&(0,d.jsx)("div",{className:"c-detail",style:{gridColumn:"1 / -1"},children:(0,d.jsx)(J,{u:a,cockpit:c,incident:e})})]})}function L({u:a,tone:b,cockpit:c,incident:e,open:f,onToggle:g,onIgnoreRequest:j,extra:n}){let o=a.current,p="red"===b,q=(0,l.kj)();(0,l.cO)();let r=c.isPinned(a.entry.id),s=a.entry.label||P(a.entry.url);return(0,d.jsxs)("div",{className:`irow${p?" bad":""}`,children:[(0,d.jsxs)("div",{className:"irow-line",children:[(0,d.jsxs)("button",{className:"irow-main",onClick:g,"aria-expanded":f,children:[(0,d.jsx)("span",{className:`dot ${null===b||!o?"u":p?"r":"g"}`,"aria-hidden":!0}),(0,d.jsx)("span",{className:"irow-name",children:s}),(0,d.jsx)("span",{className:`irow-truth${p?" bad":""}`,children:o?p?Q(a.sinceText):`${Q(a.sinceText).replace(/^up for /,"up ")} \xb7 ${o.ms} ms`:(0,d.jsx)(m.h,{children:q("site.firstCheck",k.UI.radar.firstCheck)})}),(0,d.jsx)("span",{className:"irow-path",children:(0,h.oV)(a.entry.url,36)})]}),(0,d.jsxs)("span",{className:"qk",children:[(0,d.jsx)(i.r8,{path:a.entry.url,label:k.UI.radar.copyAddress,labelKey:"btn.copyAddress"}),(0,d.jsx)(v,{pinned:r,onPin:()=>c.togglePin(a.entry.id),onIgnore:()=>j(...G(a))}),n]})]}),f&&(0,d.jsxs)("div",{className:"irow-detail",children:[(0,d.jsx)("div",{style:{maxInlineSize:260},children:(0,d.jsx)(M,{history:a.history})}),(0,d.jsx)(J,{u:a,cockpit:c,incident:e})]})]})}function M({history:a}){let b=(0,l.kj)();if((0,l.cO)(),a.length<10){let c=a.length>0?Math.round((Date.now()-a[0].ts)/6e4):0,e=c>0?c:0;return(0,d.jsx)("div",{className:"spark",children:(0,d.jsxs)("span",{className:"spark-wait",children:[b("site.historyBuilds",k.UI.radar.historyBuilds),e>0?` \xb7 ${e}m watched`:(0,d.jsx)(m.g,{})]})})}let c=a.length>40?function(a,b){let c=[];for(let d=0;d<40;d++)c.push(a[Math.round(d*(a.length-1)/(b-1))]);return c}(a,40):a,e=c.filter(a=>a.ok&&"number"==typeof a.ms).map(a=>a.ms),f=Math.max(...e,1),g=Math.min(...e),h=a=>130*a/(c.length-1),i=c.map((a,b)=>a.ok&&"number"==typeof a.ms?`${h(b).toFixed(1)},${(30-(a.ms-g)/Math.max(1,f-g)*20).toFixed(1)}`:null).filter(Boolean);return(0,d.jsxs)("div",{className:"spark",children:[(0,d.jsxs)("svg",{viewBox:"0 0 130 34",preserveAspectRatio:"none",role:"img","aria-label":b("site.sparkAria",k.UI.radar.sparkAria),children:[(0,d.jsx)("polygon",{points:`0,34 ${i.join(" ")} 130,34`,fill:"color-mix(in srgb, var(--ok) 12%, transparent)"}),(0,d.jsx)("polyline",{points:i.join(" "),fill:"none",stroke:"var(--ok)",strokeWidth:"1.5"}),c.map((a,b)=>!a.ok&&(0,d.jsx)("rect",{x:h(b)-1.2,y:29,width:2.4,height:4,fill:"var(--bad)"},b))]}),(0,d.jsxs)("span",{className:"cap",children:["24h \xb7 ",g,"-",f," ms"]})]})}function N(a,b,c,d=[]){let[f,g]=(0,e.useState)(null);return O(()=>{let d=()=>{let d=a.current;if(!d||0===b)return;let e=d.firstElementChild;if(!e)return;let f=getComputedStyle(d),h=f.gridTemplateColumns.split(" ").filter(a=>"none"!==a&&""!==a).length||1,i=parseFloat(f.rowGap)||0,j=parseFloat(f.columnGap)||0,k=e.getBoundingClientRect(),l=k.height+i;if(l<=0)return;let m=(d.getBoundingClientRect().width-(h-1)*j)/h,n=Math.max(1,Math.floor(h/Math.max(1,Math.round((k.width+j)/(m+j))))),o=d.getBoundingClientRect().top,p=Math.min(b,Math.max(1,Math.floor((window.innerHeight-o-c+i)/l))*n);g(a=>a===p?a:p)};d();let e=setTimeout(d,120);return window.addEventListener("resize",d),()=>{clearTimeout(e),window.removeEventListener("resize",d)}},[b,c,...d]),null==f?b:Math.min(f,b)}let O=e.useEffect;function P(a){try{return new URL(a).hostname}catch{return a}}function Q(a){return a.charAt(0).toLowerCase()+a.slice(1)}},99511:(a,b,c)=>{c.d(b,{fn:()=>m,hf:()=>l,ob:()=>k,tU:()=>n});var d=c(21124),e=c(38301),f=c(23312),g=c(31296),h=c(78530),i=c(95938),j=c(80891);function k({actions:a,label:b}){let[c,i]=(0,e.useState)(!1),[k,l]=(0,e.useState)(null),m=(0,e.useRef)(null),n=(0,e.useRef)(null),o=(0,e.useId)(),p=(0,h.kj)(),q=(0,h.cO)();return((0,e.useCallback)(()=>{let a=m.current?.firstElementChild;if(!a)return;let b=a.getBoundingClientRect(),c=n.current?.offsetHeight??0,d=window.innerHeight-b.bottom,e=c>0&&d<c+8&&b.top>d;l({top:e?b.top-c-4:b.bottom+4,end:Math.max(4,window.innerWidth-b.right),flip:e})},[]),0===a.length)?null:(0,d.jsxs)("div",{className:"ovf",ref:m,children:[(0,d.jsxs)("button",{className:"ovf-btn",type:"button","aria-haspopup":"menu","aria-expanded":c,"aria-controls":o,...(0,j.uN)(q.moreActions),onClick:()=>i(a=>!a),children:[(0,d.jsx)(h.T,{k:"btn.more",en:b??g.UI.radar.moreActions})," ",(0,d.jsx)("span",{"aria-hidden":!0,children:"▾"})]}),c&&"undefined"!=typeof document&&(0,f.createPortal)((0,d.jsx)("div",{className:"ovf-menu",id:o,role:"menu",ref:n,"aria-label":p("act.moreAria",g.UI.radar.moreActionsAria),style:k?{insetBlockStart:k.top,insetInlineEnd:k.end}:{visibility:"hidden"},children:a.map(a=>(0,d.jsxs)("button",{role:"menuitem",type:"button",...(0,j.uN)(a.title),className:a.danger?"danger":void 0,onClick:()=>{i(!1),a.onClick()},children:[a.label,a.effect&&(0,d.jsx)("span",{children:a.effect})]},a.label))}),document.body)]})}function l({done:a,total:b,working:c}){let e=(0,h.kj)();(0,h.cO)();let f="ar"===(0,h.uU)();return b>0&&a<b?(0,d.jsxs)("div",{className:"streamline",role:"status","aria-live":"polite",children:[(0,d.jsx)("i",{"aria-hidden":!0}),f?(0,d.jsxs)(d.Fragment,{children:[e("stream.countingLead","")," ",(0,d.jsx)(i.V,{n:a})," ",e("stream.countingMid","")," ",(0,d.jsx)(i.V,{n:b})," ",e("stream.countingTail","")]}):g.UI.stream.counting(a,b)]}):c?(0,d.jsxs)("div",{className:"streamline",role:"status","aria-live":"polite",children:[(0,d.jsx)("i",{"aria-hidden":!0}),e("stream.starting",g.UI.stream.starting)]}):null}function m({view:a,onChange:b}){let c=(0,h.kj)();return(0,h.cO)(),(0,d.jsxs)("div",{className:"viewseg",role:"group","aria-label":c("radar.viewAria",g.UI.radar.viewAria),children:[(0,d.jsx)("button",{type:"button",className:"cards"===a?"on":"","aria-pressed":"cards"===a,onClick:()=>b("cards"),children:(0,d.jsx)(h.T,{k:"btn.grid",en:g.UI.radar.viewGrid})}),(0,d.jsx)("button",{type:"button",className:"rows"===a?"on":"","aria-pressed":"rows"===a,onClick:()=>b("rows"),children:(0,d.jsx)(h.T,{k:"btn.rows",en:g.UI.radar.viewRows})})]})}function n({tabs:a,active:b,onChange:c,label:e,vertical:f}){return(0,d.jsx)("div",{className:`tabs${f?" tabs-v":""}`,role:"tablist","aria-orientation":f?"vertical":void 0,"aria-label":e,children:a.map(a=>(0,d.jsxs)("button",{type:"button",role:"tab",id:`tab-${a.id}`,className:a.id===b?"on":"","aria-selected":a.id===b,"aria-controls":`panel-${a.id}`,onClick:()=>c(a.id),children:[a.label,void 0!==a.count&&(0,d.jsx)("span",{className:"tabn",children:a.count})]},a.id))})}}};
1
+ "use strict";exports.id=7511,exports.ids=[7511],exports.modules={27511:(a,b,c)=>{c.d(b,{cc:()=>u,Uj:()=>B,ou:()=>C,ct:()=>K,kc:()=>L,aA:()=>t,G2:()=>F,yn:()=>w,j4:()=>N,Wj:()=>s});var d=c(21124),e=c(38301),f=c(73450),g=c(60521),h=c(7240),i=c(71322),j=c(99511),k=c(31296),l=c(78530),m=c(72338),n=c(40850),o=c(95938);let p={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"},q=Object.fromEntries(Object.keys(p).map(a=>[a,`GitHub not checked (${p[a]})`]));var r=c(80891);function s(a){let b=(0,l.kj)();(0,l.cO)();let[c,f]=(0,e.useState)(null),[g,h]=(0,e.useState)(null),i=(0,l.Je)(),j=a=>{h(a),setTimeout(()=>h(b=>b===a?null:b),4500)},m=async(c,d,e,f)=>{let g=await a.doIgnore(c,d,e,f);j(g.ok?i((0,n.ph)("toast.ignored",k.UI.radar.ignoredToast,e)):g.message??b("common.somethingWrong",k.UI.common.somethingWrong))},o=(0,d.jsxs)(d.Fragment,{children:[g&&(0,d.jsx)("div",{className:"toast",role:"status",children:g}),c&&(0,d.jsx)("div",{className:"confirm-overlay",role:"dialog","aria-modal":"true",children:(0,d.jsxs)("div",{className:"confirm",children:[(0,d.jsx)("p",{children:c.message}),(0,d.jsxs)("div",{className:"setup-actions",children:[(0,d.jsx)("button",{className:"b",onClick:()=>{m(c.id,c.kind,c.label,c.snapshot),f(null)},children:b("act.ignoreIt",k.UI.radar.ignoreIt)}),(0,d.jsx)("button",{className:"b accent",onClick:()=>f(null),children:b("act.keepWatching",k.UI.radar.keepWatching)})]})]})})]});return{requestIgnore:(a,b,c,d,e,g)=>{d?f({id:a,kind:b,label:c,message:e,snapshot:g}):m(a,b,c,g)},ignoreThen:m,showToast:j,overlays:o}}function t({view:a,onChange:b}){return(0,d.jsx)(j.fn,{view:a,onChange:b})}function u({value:a,onChange:b,showLabel:c=k.UI.common.show,hideLabel:e=k.UI.common.collapse,showKey:f="btn.show",hideKey:g="btn.collapse"}){return(0,d.jsx)("button",{className:"collapse","aria-expanded":!a,onClick:()=>b(!a),children:a?(0,d.jsx)(l.T,{k:f,en:c}):(0,d.jsx)(l.T,{k:g,en:e})})}function v({pinned:a,onPin:b,onIgnore:c}){let e=(0,l.kj)(),f=(0,l.cO)();return(0,d.jsx)(j.ob,{actions:[{label:a?e("act.unpin",k.UI.radar.unpin):e("act.pin",k.UI.radar.pinLabel),title:f.pin,onClick:b,effect:a?e("eff.unpin",k.UI.radar.effUnpin):e("eff.pin",k.UI.radar.effPin)},{label:e("act.ignore",k.UI.radar.ignoreLabel),title:f.ignore,onClick:c,effect:e("eff.ignore",k.UI.radar.effIgnore)}]})}let w=a=>a.path.toLowerCase();function x(a){if(!a)return null;let b=new Date(a).getTime();if(!Number.isFinite(b))return null;let c=Date.now()-b;return c<0?null:Math.floor(c/864e5)}function y({p:a,tone:b,cockpit:c}){let e=(0,l.kj)(),i=null!==b&&"clean"!==b,j=(0,l.cO)(),n=x(a.lastActivity),o=c.isDupe(a.name)&&("dormant"===a.staleness||"forgotten"===a.staleness)?(0,g.ih)(a,c.projects):null,p=o&&"unproven"!==o.kind?o.others:[],q=p.length>0?p.map(a=>(0,h.oV)(a.path,26)).join(", "):null,s=null!==q,t=[];return a.changedTotal>0&&t.push((0,d.jsxs)("b",{...(0,r.uN)(j.unsaved),children:[a.changedTotal," unsaved"]},"u")),a.deleted>0&&t.push((0,d.jsxs)("b",{...(0,r.uN)(j.deleted),children:[a.deleted," deleted"]},"del")),(a.ahead??0)>0&&t.push(a.uncommitted>0?(0,d.jsxs)("span",{...(0,r.uN)(j.unpushed),children:[a.ahead," unpushed"]},"a"):(0,d.jsxs)("b",{...(0,r.uN)(j.unpushed),children:[a.ahead," unpushed"]},"a")),(0,g.ze)(a)&&t.push((0,d.jsx)("b",{...(0,r.uN)(j.onlyHere),children:"only on this machine"},"nr")),a.isGit||a.looksDownloaded||t.push((0,d.jsx)("span",{...(0,r.uN)(j.noHistory),children:"no git history"},"ng")),s&&0===a.uncommitted&&null!==n&&t.push((0,d.jsxs)("span",{...(0,r.uN)(j.dormant),children:["dormant ",n,"d"]},"d")),q&&o?.kind==="duplicate"?t.push((0,d.jsxs)("span",{...(0,r.uN)(j.duplicate),children:["duplicate of ",q]},"dup")):q&&o?.kind==="sharesName"&&t.push((0,d.jsxs)("span",{...(0,r.uN)(j.sharesName),children:["shares a name with ",q]},"dup")),null===b?t.push((0,d.jsx)("span",{className:"dim-t",children:(0,d.jsx)(m.h,{children:e("common.checking",k.UI.common.checking)})},"chk")):i||t.push((0,d.jsx)("span",{className:"okw",...(0,r.uN)(j.clean),children:"clean ✓"},"ok")),a.looksDownloaded?t.push((0,d.jsx)("span",{...(0,r.uN)(j.downloadedCopy),children:"looks downloaded"},"dl")):a.lastActivity&&!(s&&0===a.uncommitted)&&t.push((0,d.jsxs)("span",{children:[a.lastCommit?i?"last commit ":"committed ":"touched ",(0,d.jsx)(f.fV,{ts:a.lastActivity})]},"t")),(0,d.jsx)("div",{className:"c-fact",children:t.map((a,b)=>(0,d.jsxs)("span",{children:[b>0&&" \xb7 ",a]},b))})}function z(a,b=(a,b)=>b){return[w(a),"project",a.name,(0,g.ze)(a),b("confirm.projectShort",k.UI.radar.confirmProjectShort),{uncommitted:a.uncommitted,hasRemote:a.hasRemote}]}function A({p:a,cockpit:b}){let c=(0,e.useContext)(f.vC),h=(0,l.kj)(),i=(0,l.cO)(),j=(b.cfg?.roots??[]).find(b=>b.toLowerCase()===w(a));return(0,d.jsxs)(d.Fragment,{children:[a.looksDownloaded?(0,d.jsx)("span",{children:"Looks like something downloaded rather than something you wrote."}):(0,g.ze)(a)?(0,d.jsx)("span",{children:"No remote copy exists - one disk failure and it's gone."}):a.hasRemote?(0,d.jsxs)("span",{...(0,r.uN)(i.remote),children:["Backed up to a remote ✓",(a.ahead??0)>0&&(0,d.jsxs)(d.Fragment,{children:[" - ",a.ahead," commit",1===a.ahead?"":"s"," not pushed yet"]})]}):null,c&&a.isGit&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("span",{className:"mono",children:["branch ",a.branch??"-"," \xb7 remote ",a.remoteUrl??a.remoteName??"-",null!=a.ahead&&null!=a.behind&&(0,d.jsxs)(d.Fragment,{children:[" \xb7 ",a.ahead," ahead / ",a.behind," behind"]}),null!=a.commitCount&&(0,d.jsxs)(d.Fragment,{children:[" \xb7 ",a.commitCount," commits"]})]}),a.dirtyFiles.length>0&&(0,d.jsxs)("span",{className:"mono",children:["changed: ",a.dirtyFiles.join(", "),a.changedTotal>a.dirtyFiles.length?` … +${a.changedTotal-a.dirtyFiles.length} more`:""]}),a.deletedFiles.length>0&&(0,d.jsxs)("span",{className:"mono",children:["deleted: ",a.deletedFiles.join(", "),a.deleted>a.deletedFiles.length?` … +${a.deleted-a.deletedFiles.length} more`:""]})]}),c&&(0,d.jsx)("span",{className:"mono",children:a.path}),j&&(0,d.jsx)("button",{className:"b danger",style:{justifySelf:"start"},...(0,r.uN)(i.unwatch),onClick:()=>b.post({action:"removeRoot",path:j}).then(a=>{a.ok&&b.resolveRow(j)}),children:h("act.stopWatchingFolder",k.UI.radar.stopWatchingFolder)})]})}function B({p:a,tone:b,cockpit:c,change:e,open:f,onToggle:g,onIgnoreRequest:j,onToast:m}){let n=null!==b&&"clean"!==b,o=c.isPinned(w(a)),p=(0,l.kj)();return(0,l.cO)(),(0,d.jsxs)("div",{[i.J6]:w(a),className:`card${n?" warn":""}${o?" pinned":""}`,children:[(0,d.jsxs)("div",{className:"c-top",children:[(0,d.jsx)("span",{className:`dot ${null===b?"u":n?"a":"g"}`,"aria-hidden":!0}),(0,d.jsx)("b",{children:a.name}),e&&(0,d.jsx)("span",{className:"chg",children:e})]}),(0,d.jsx)(y,{p:a,tone:b,cockpit:c}),(0,d.jsx)(D,{p:a,cockpit:c}),(0,d.jsx)("div",{className:"c-path",children:(0,h.oV)(a.path,40)}),(0,d.jsxs)("div",{className:"c-foot",children:[(0,d.jsx)("button",{className:"b2 q",onClick:g,"aria-expanded":f,children:f?(0,d.jsx)(l.T,{k:"btn.hide",en:k.UI.common.hide}):(0,d.jsx)(l.T,{k:"btn.details",en:k.UI.common.details})}),!c.demo&&(0,d.jsx)(i.Fb,{cockpit:c,project:a,onToast:m,link:!0}),!c.demo&&(0,d.jsx)(i.r8,{path:a.path}),(0,d.jsx)(v,{pinned:o,onPin:()=>c.togglePin(w(a)),onIgnore:()=>j(...z(a,p))})]}),f&&(0,d.jsx)("div",{className:"c-detail",children:(0,d.jsx)(A,{p:a,cockpit:c})})]})}function C({p:a,tone:b,cockpit:c,change:e,open:f,onToggle:g,onIgnoreRequest:j}){let k=null!==b&&"clean"!==b,m=c.isPinned(w(a)),n=c.isDupe(a.name),o=(0,l.kj)();return(0,l.cO)(),(0,d.jsxs)("div",{[i.J6]:w(a),className:`irow${k?" warn":""}`,children:[(0,d.jsxs)("div",{className:"irow-line",children:[(0,d.jsxs)("button",{className:"irow-main",onClick:g,"aria-expanded":f,children:[(0,d.jsx)("span",{className:`dot ${null===b?"u":k?"a":"g"}`,"aria-hidden":!0}),(0,d.jsxs)("span",{className:"irow-name",children:[a.name,n&&(0,d.jsxs)("span",{className:"irow-parent",children:[" (",function(a){let b=a.split(/[\\/]/).filter(Boolean);return b.length>1?b[b.length-2]:a}(a.path),")"]})]}),e&&(0,d.jsx)("span",{className:"chg",children:e}),(0,d.jsx)("span",{className:`irow-truth${k?" warn":""}`,children:(0,d.jsx)(E,{p:a,tone:b,cockpit:c})}),(0,d.jsx)("span",{className:"irow-path",children:(0,h.oV)(a.path,40)})]}),(0,d.jsx)(D,{p:a,cockpit:c}),(0,d.jsxs)("span",{className:"qk",children:[!c.demo&&(0,d.jsx)(i.r8,{path:a.path}),(0,d.jsx)(v,{pinned:m,onPin:()=>c.togglePin(w(a)),onIgnore:()=>j(...z(a,o))})]})]}),f&&(0,d.jsx)("div",{className:"irow-detail",children:(0,d.jsx)(A,{p:a,cockpit:c})})]})}function D({p:a,cockpit:b}){var c;let e=(0,l.kj)(),g=b.radar?.github??null;if(!g)return null;let h=(c=a.path,g?g.byPath[c.toLowerCase()]??null:null),i=function(a){if(!a)return null;let b=/[/@]github\.com[:/]+([^/]+)\/([^/]+?)(?:\.git)?\/?$/.exec(a);return b?`${b[1]}/${b[2]}`:null}(a.remoteUrl),j=i?(0,d.jsxs)("span",{className:"gh-prov",children:[(0,d.jsx)(o.En,{children:i}),h?.ok?(0,d.jsxs)(d.Fragment,{children:[" \xb7 ",e("connections.ghCardChecked",k.UI.connections.ghCardChecked)," ",(0,d.jsx)(f.fV,{ts:g.at})]}):h?null:(0,d.jsxs)(d.Fragment,{children:[" \xb7 ",e("connections.ghCardNever",k.UI.connections.ghCardNever)]})]}):null;if(!h)return g.outage?(0,d.jsxs)("span",{className:"gh-chips",children:[j,(0,d.jsx)(o.En,{children:(0,d.jsx)("span",{className:"chip plain",children:"GitHub not checked yet"})})]}):null;if(!h.ok)return(0,d.jsxs)("span",{className:"gh-chips",children:[j,(0,d.jsx)(o.En,{children:(0,d.jsx)("span",{className:"chip plain",children:q[h.kind]})})]});let m=h.value,n=[];if(m.ci.ok&&m.ci.value){let a=m.ci.value,b="passing"===a.state?"calm":"failing"===a.state?"bad":"plain",c="passing"===a.state?"✓":"failing"===a.state?"✗":"\xb7";n.push((0,d.jsxs)("span",{className:`chip ${b}`,children:["CI ",c," ",a.branch]},"ci"))}else{let a;m.ci.ok||n.push((0,d.jsx)("span",{className:"chip plain",children:(a=m.ci.kind,`CI not checked (${p[a]})`)},"ci"))}if(m.prCount.ok&&m.prCount.value>0){let a=m.prCount.value;n.push((0,d.jsxs)("span",{className:"chip plain",children:[a,m.prCapped?"+":""," PR",1!==a||m.prCapped?"s":""]},"pr"))}if(m.issueCount.ok&&m.issueCount.value>0){let a=m.issueCount.value;n.push((0,d.jsxs)("span",{className:"chip plain",children:[a," issue",1===a?"":"s"]},"is"))}return("confirmed"===m.backup.verdict&&n.push((0,d.jsx)("span",{className:"chip calm",...(0,r.uN)("af360 asked GitHub, and GitHub has this exact commit"),children:"GitHub confirms"},"bk")),0===n.length)?j?(0,d.jsx)("span",{className:"gh-chips",children:j}):null:(0,d.jsxs)("span",{className:"gh-chips",children:[j,(0,d.jsx)(o.En,{children:n})]})}function E({p:a,tone:b,cockpit:c}){let e=(0,l.cO)(),h=c.isDupe(a.name)&&("dormant"===a.staleness||"forgotten"===a.staleness)?(0,g.ih)(a,c.projects):null,i=h?.kind==="duplicate",j=x(a.lastActivity);return a.looksDownloaded?(0,d.jsx)("span",{...(0,r.uN)(e.downloadedCopy),children:"looks downloaded"}):a.uncommitted>0?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("span",{...(0,r.uN)(e.unsaved),children:[a.uncommitted," unsaved"]})," \xb7 last commit ",a.lastActivity?(0,d.jsx)(f.fV,{ts:a.lastActivity}):"never"]}):(0,g.ze)(a)?(0,d.jsx)("span",{...(0,r.uN)(e.onlyHere),children:"only on this machine"}):(a.ahead??0)>0?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("span",{...(0,r.uN)(e.unpushed),children:[a.ahead," unpushed"]})," \xb7 committed ",a.lastActivity?(0,d.jsx)(f.fV,{ts:a.lastActivity}):"-"]}):"clean"!==b&&i&&null!==j?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("span",{...(0,r.uN)(e.dormant),children:["dormant ",j,"d"]})," \xb7 ",(0,d.jsx)("span",{...(0,r.uN)(e.duplicate),children:"duplicate"})]}):a.lastActivity?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("span",{...(0,r.uN)(e.clean),children:"clean ✓"})," \xb7 committed ",(0,d.jsx)(f.fV,{ts:a.lastActivity})]}):(0,d.jsx)("span",{...(0,r.uN)(e.noHistory),children:"no history"})}function F(a,b){return a.find(a=>a.subjectId===b)??null}function G(a){let b=a.entry.label||P(a.entry.url),c=!!a.current&&!a.current.ok;return[a.entry.id,"url",b,c,k.UI.radar.confirmSite,{down:c}]}function H({u:a,incident:b}){let c=(0,e.useContext)(f.vC),g=(0,l.kj)();(0,l.cO)();let h=a.current;if(!h)return(0,d.jsx)("span",{children:(0,d.jsx)(m.h,{children:g("site.firstCheck",k.UI.radar.firstCheck)})});if(!h.ok)return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("b",{children:Q(a.sinceText)}),c&&h.status?` \xb7 HTTP ${h.status}`:"",b?.acknowledged?" \xb7 being handled ✓":""]});let i=Q(a.sinceText).replace(/^up for /,"up "),j=b?.endedTs?(0,d.jsxs)(d.Fragment,{children:["last incident ",(0,d.jsx)(f.fV,{ts:b.endedTs})]}):(0,d.jsx)(d.Fragment,{children:"no incidents while watching"});return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("span",{className:"okw",children:i})," \xb7 ","number"==typeof h.ms?`${h.ms} ms`:"-",c&&h.status?` \xb7 HTTP ${h.status}`:""," \xb7 ",j]})}function I({u:a,cockpit:b}){let c=a.current,e=P(a.entry.url),f=b.expiry?.items.find(a=>"ssl"===a.kind&&a.name===e),g=Object.entries(c?.headers??{}),h=["strict-transport-security","content-security-policy"].filter(a=>!(c?.headers??{})[a]);return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("span",{className:"mono",children:["HTTP ",c?.status??"-"," \xb7 total ","number"==typeof c?.ms?`${c.ms} ms`:"-"," \xb7 checked ",c?new Date(c.ts).toLocaleTimeString():"-"]}),f&&(0,d.jsxs)("span",{className:"mono",children:["cert: ",f.issuer??"unknown issuer",f.serial?` \xb7 serial ${f.serial}`:""]}),g.length>0&&(0,d.jsxs)("span",{className:"mono",children:["headers: ",g.map(([a,b])=>`${a}: ${b}`).join(" \xb7 ")]}),h.length>0&&(0,d.jsxs)("span",{className:"mono",children:["missing: ",h.join(", ")]})]})}function J({u:a,cockpit:b,incident:c}){let g=(0,l.kj)(),h=(0,l.cO)(),i=(0,e.useContext)(f.vC);return(0,d.jsxs)(d.Fragment,{children:[c&&!c.endedTs&&(0,d.jsxs)("span",{children:["Ongoing: down since ",(0,d.jsx)(f.fV,{ts:c.startedTs,skewForm:"core"}),c.acknowledged?" \xb7 being handled ✓":""]}),i&&(0,d.jsx)(I,{u:a,cockpit:b}),(0,d.jsx)("a",{href:a.entry.url,target:"_blank",rel:"noreferrer",children:a.entry.url}),(0,d.jsx)("button",{className:"b danger",style:{justifySelf:"start"},...(0,r.uN)(h.unwatch),onClick:()=>b.post({action:"removeUrl",id:a.entry.id}).then(c=>{c.ok&&b.resolveRow(a.entry.id)}),children:g("act.stopWatchingSite",k.UI.radar.stopWatchingSite)})]})}function K({u:a,tone:b,cockpit:c,incident:e,open:f,onToggle:g,onIgnoreRequest:j,extra:m}){let n=a.current,o="red"===b;(0,l.kj)(),(0,l.cO)();let p=c.isPinned(a.entry.id),q=a.entry.label||P(a.entry.url);return(0,d.jsxs)("div",{className:`card site${o?" bad":""}${p?" pinned":""}`,children:[(0,d.jsxs)("div",{children:[(0,d.jsxs)("div",{className:"c-top",children:[(0,d.jsx)("span",{className:`dot ${null===b||!n?"u":o?"r":"g"}`,"aria-hidden":!0}),(0,d.jsx)("b",{children:q})]}),(0,d.jsx)("div",{className:"c-fact",children:(0,d.jsx)(H,{u:a,incident:e})}),(0,d.jsx)("div",{className:"c-path",children:(0,h.oV)(a.entry.url,44)}),(0,d.jsxs)("div",{className:"c-foot",children:[(0,d.jsx)("button",{className:"b2 q",onClick:g,"aria-expanded":f,children:f?(0,d.jsx)(l.T,{k:"btn.hide",en:k.UI.common.hide}):(0,d.jsx)(l.T,{k:"btn.details",en:k.UI.common.details})}),(0,d.jsx)(i.r8,{path:a.entry.url,label:k.UI.radar.copyAddress,labelKey:"btn.copyAddress"}),(0,d.jsx)(v,{pinned:p,onPin:()=>c.togglePin(a.entry.id),onIgnore:()=>j(...G(a))}),m]})]}),(0,d.jsx)(M,{history:a.history}),f&&(0,d.jsx)("div",{className:"c-detail",style:{gridColumn:"1 / -1"},children:(0,d.jsx)(J,{u:a,cockpit:c,incident:e})})]})}function L({u:a,tone:b,cockpit:c,incident:e,open:f,onToggle:g,onIgnoreRequest:j,extra:n}){let o=a.current,p="red"===b,q=(0,l.kj)();(0,l.cO)();let r=c.isPinned(a.entry.id),s=a.entry.label||P(a.entry.url);return(0,d.jsxs)("div",{className:`irow${p?" bad":""}`,children:[(0,d.jsxs)("div",{className:"irow-line",children:[(0,d.jsxs)("button",{className:"irow-main",onClick:g,"aria-expanded":f,children:[(0,d.jsx)("span",{className:`dot ${null===b||!o?"u":p?"r":"g"}`,"aria-hidden":!0}),(0,d.jsx)("span",{className:"irow-name",children:s}),(0,d.jsx)("span",{className:`irow-truth${p?" bad":""}`,children:o?p?Q(a.sinceText):`${Q(a.sinceText).replace(/^up for /,"up ")} \xb7 ${o.ms} ms`:(0,d.jsx)(m.h,{children:q("site.firstCheck",k.UI.radar.firstCheck)})}),(0,d.jsx)("span",{className:"irow-path",children:(0,h.oV)(a.entry.url,36)})]}),(0,d.jsxs)("span",{className:"qk",children:[(0,d.jsx)(i.r8,{path:a.entry.url,label:k.UI.radar.copyAddress,labelKey:"btn.copyAddress"}),(0,d.jsx)(v,{pinned:r,onPin:()=>c.togglePin(a.entry.id),onIgnore:()=>j(...G(a))}),n]})]}),f&&(0,d.jsxs)("div",{className:"irow-detail",children:[(0,d.jsx)("div",{style:{maxInlineSize:260},children:(0,d.jsx)(M,{history:a.history})}),(0,d.jsx)(J,{u:a,cockpit:c,incident:e})]})]})}function M({history:a}){let b=(0,l.kj)();if((0,l.cO)(),a.length<10){let c=a.length>0?Math.round((Date.now()-a[0].ts)/6e4):0,e=c>0?c:0;return(0,d.jsx)("div",{className:"spark",children:(0,d.jsxs)("span",{className:"spark-wait",children:[b("site.historyBuilds",k.UI.radar.historyBuilds),e>0?` \xb7 ${e}m watched`:(0,d.jsx)(m.g,{})]})})}let c=a.length>40?function(a,b){let c=[];for(let d=0;d<40;d++)c.push(a[Math.round(d*(a.length-1)/(b-1))]);return c}(a,40):a,e=c.filter(a=>a.ok&&"number"==typeof a.ms).map(a=>a.ms),f=Math.max(...e,1),g=Math.min(...e),h=a=>130*a/(c.length-1),i=c.map((a,b)=>a.ok&&"number"==typeof a.ms?`${h(b).toFixed(1)},${(30-(a.ms-g)/Math.max(1,f-g)*20).toFixed(1)}`:null).filter(Boolean);return(0,d.jsxs)("div",{className:"spark",children:[(0,d.jsxs)("svg",{viewBox:"0 0 130 34",preserveAspectRatio:"none",role:"img","aria-label":b("site.sparkAria",k.UI.radar.sparkAria),children:[(0,d.jsx)("polygon",{points:`0,34 ${i.join(" ")} 130,34`,fill:"color-mix(in srgb, var(--ok) 12%, transparent)"}),(0,d.jsx)("polyline",{points:i.join(" "),fill:"none",stroke:"var(--ok)",strokeWidth:"1.5"}),c.map((a,b)=>!a.ok&&(0,d.jsx)("rect",{x:h(b)-1.2,y:29,width:2.4,height:4,fill:"var(--bad)"},b))]}),(0,d.jsxs)("span",{className:"cap",children:["24h \xb7 ",g,"-",f," ms"]})]})}function N(a,b,c,d=[]){let[f,g]=(0,e.useState)(null);return O(()=>{let d=()=>{let d=a.current;if(!d||0===b)return;let e=d.firstElementChild;if(!e)return;let f=getComputedStyle(d),h=f.gridTemplateColumns.split(" ").filter(a=>"none"!==a&&""!==a).length||1,i=parseFloat(f.rowGap)||0,j=parseFloat(f.columnGap)||0,k=e.getBoundingClientRect(),l=k.height+i;if(l<=0)return;let m=(d.getBoundingClientRect().width-(h-1)*j)/h,n=Math.max(1,Math.floor(h/Math.max(1,Math.round((k.width+j)/(m+j))))),o=d.getBoundingClientRect().top,p=Math.min(b,Math.max(1,Math.floor((window.innerHeight-o-c+i)/l))*n);g(a=>a===p?a:p)};d();let e=setTimeout(d,120);return window.addEventListener("resize",d),()=>{clearTimeout(e),window.removeEventListener("resize",d)}},[b,c,...d]),null==f?b:Math.min(f,b)}let O=e.useEffect;function P(a){try{return new URL(a).hostname}catch{return a}}function Q(a){return a.charAt(0).toLowerCase()+a.slice(1)}},99511:(a,b,c)=>{c.d(b,{fn:()=>m,hf:()=>l,ob:()=>k,tU:()=>n});var d=c(21124),e=c(38301),f=c(23312),g=c(31296),h=c(78530),i=c(95938),j=c(80891);function k({actions:a,label:b}){let[c,i]=(0,e.useState)(!1),[k,l]=(0,e.useState)(null),m=(0,e.useRef)(null),n=(0,e.useRef)(null),o=(0,e.useId)(),p=(0,h.kj)(),q=(0,h.cO)();return((0,e.useCallback)(()=>{let a=m.current?.firstElementChild;if(!a)return;let b=a.getBoundingClientRect(),c=n.current?.offsetHeight??0,d=window.innerHeight-b.bottom,e=c>0&&d<c+8&&b.top>d;l({top:e?b.top-c-4:b.bottom+4,end:Math.max(4,window.innerWidth-b.right),flip:e})},[]),0===a.length)?null:(0,d.jsxs)("div",{className:"ovf",ref:m,children:[(0,d.jsxs)("button",{className:"ovf-btn",type:"button","aria-haspopup":"menu","aria-expanded":c,"aria-controls":o,...(0,j.uN)(q.moreActions),onClick:()=>i(a=>!a),children:[(0,d.jsx)(h.T,{k:"btn.more",en:b??g.UI.radar.moreActions})," ",(0,d.jsx)("span",{"aria-hidden":!0,children:"▾"})]}),c&&"undefined"!=typeof document&&(0,f.createPortal)((0,d.jsx)("div",{className:"ovf-menu",id:o,role:"menu",ref:n,"aria-label":p("act.moreAria",g.UI.radar.moreActionsAria),style:k?{insetBlockStart:k.top,insetInlineEnd:k.end}:{visibility:"hidden"},children:a.map(a=>(0,d.jsxs)("button",{role:"menuitem",type:"button",...(0,j.uN)(a.title),className:a.danger?"danger":void 0,onClick:()=>{i(!1),a.onClick()},children:[a.label,a.effect&&(0,d.jsx)("span",{children:a.effect})]},a.label))}),document.body)]})}function l({done:a,total:b,working:c}){let e=(0,h.kj)();(0,h.cO)();let f="ar"===(0,h.uU)();return b>0&&a<b?(0,d.jsxs)("div",{className:"streamline",role:"status","aria-live":"polite",children:[(0,d.jsx)("i",{"aria-hidden":!0}),f?(0,d.jsxs)(d.Fragment,{children:[e("stream.countingLead","")," ",(0,d.jsx)(i.V,{n:a})," ",e("stream.countingMid","")," ",(0,d.jsx)(i.V,{n:b})," ",e("stream.countingTail","")]}):g.UI.stream.counting(a,b)]}):c?(0,d.jsxs)("div",{className:"streamline",role:"status","aria-live":"polite",children:[(0,d.jsx)("i",{"aria-hidden":!0}),e("stream.starting",g.UI.stream.starting)]}):null}function m({view:a,onChange:b}){let c=(0,h.kj)();return(0,h.cO)(),(0,d.jsxs)("div",{className:"viewseg",role:"group","aria-label":c("radar.viewAria",g.UI.radar.viewAria),children:[(0,d.jsx)("button",{type:"button",className:"cards"===a?"on":"","aria-pressed":"cards"===a,onClick:()=>b("cards"),children:(0,d.jsx)(h.T,{k:"btn.grid",en:g.UI.radar.viewGrid})}),(0,d.jsx)("button",{type:"button",className:"rows"===a?"on":"","aria-pressed":"rows"===a,onClick:()=>b("rows"),children:(0,d.jsx)(h.T,{k:"btn.rows",en:g.UI.radar.viewRows})})]})}function n({tabs:a,active:b,onChange:c,label:e,vertical:f}){return(0,d.jsx)("div",{className:`tabs${f?" tabs-v":""}`,role:"tablist","aria-orientation":f?"vertical":void 0,"aria-label":e,children:a.map(a=>(0,d.jsxs)("button",{type:"button",role:"tab",id:`tab-${a.id}`,className:a.id===b?"on":"","aria-selected":a.id===b,"aria-controls":`panel-${a.id}`,onClick:()=>c(a.id),children:[a.label,void 0!==a.count&&(0,d.jsx)("span",{className:"tabn",children:a.count})]},a.id))})}}};
@@ -0,0 +1 @@
1
+ "use strict";exports.id=876,exports.ids=[876],exports.modules={7769:(a,b,c)=>{c.d(b,{XF:()=>d});function d(a,b){return b&&b.text?a?`${a} "${b.text}"`:`"${b.text}"`:a}},10876:(a,b,c)=>{c.d(b,{JF:()=>r,rO:()=>s});var d=c(21124),e=c(38301),f=c(73450),g=c(7769),h=c(31296),i=c(78530),j=c(95938),k=c(71322),l=c(99511);function m({open:a,onClick:b,seeCard:c}){let e=(0,i.kj)();return(0,d.jsx)("button",{className:"b2 q wk-details",onClick:b,"aria-expanded":a,children:a?e("btn.hide",h.UI.common.hide):c?e("disc.seeCard",h.UI.discoveries.seeCard):e("disc.showMe",h.UI.discoveries.showMe)})}function n({d:a}){let b=(0,e.useContext)(f.vC),c=(0,i.kj)(),l=(0,i.XE)();return(0,d.jsxs)(d.Fragment,{children:[a.detail&&a.detail.length>0&&(0,d.jsx)("div",{className:"k",children:c("radar.whatISaw",h.UI.discoveries.whatISaw)}),a.detail?.map(a=>(0,d.jsx)(j.B,{mono:!0,children:a},a)),a.steps&&a.steps.length>0&&(0,d.jsx)("div",{className:"k",children:c("disc.fixSteps",h.UI.discoveries.fixSteps)}),a.steps?.map(a=>(0,d.jsx)("div",{className:"step",children:l(a)},a)),a.copy&&(0,d.jsx)(k.r8,{path:a.copy.text,label:h.UI.session.copyCommands,labelKey:"btn.copyCommands"}),(0,d.jsx)(k.hR,{text:function(a,b,c){if(!a)return"";let d=[];if(a.verdict&&d.push(a.verdict),a.why){let e="function"==typeof c?c(a.why,a.quoted):a.why;d.push(`${b.worth} ${e}`)}if(Array.isArray(a.detail)&&a.detail.length>0)for(let c of(d.push("",b.whatISaw),a.detail))d.push(` ${c}`);if(Array.isArray(a.steps)&&a.steps.length>0)for(let c of(d.push("",b.fixSteps),a.steps))d.push(` ${c}`);return a.copy&&"string"==typeof a.copy.text&&a.copy.text&&d.push("",a.copy.text),d.join("\n")}(a,{worth:c("disc.worth",h.UI.discoveries.worth),whatISaw:c("radar.whatISaw",h.UI.discoveries.whatISaw),fixSteps:c("disc.fixSteps",h.UI.discoveries.fixSteps)},g.XF),label:h.UI.discoveries.copyDetails,labelKey:"btn.copyDetails"}),b&&a.devDetail?.map(a=>(0,d.jsx)(j.B,{mono:!0,children:a},a))]})}function o({d:a,cockpit:b}){let c=(0,i.kj)(),e=b.dismissed.find(b=>b.id===a.id);return e?.resurface?(0,d.jsxs)("div",{className:"disc-resurface",children:[(0,d.jsx)("p",{className:"k",children:c("disc.changedSince",h.UI.discoveries.changedSince)}),(0,d.jsxs)("p",{children:[(0,d.jsx)("span",{className:"m",children:c("disc.dismissedThen",h.UI.discoveries.dismissedThen)})," ",(0,d.jsx)(j.B,{children:e.sentence})]}),(0,d.jsxs)("p",{children:[(0,d.jsx)("span",{className:"m",children:c("disc.dismissedNow",h.UI.discoveries.dismissedNow)})," ",(0,d.jsx)(j.B,{children:e.resurface.current})]}),(0,d.jsxs)("div",{className:"disc-foot",children:[(0,d.jsx)("button",{className:"b2 q",onClick:()=>b.stillDismiss(a.id),children:c("disc.stillDismiss",h.UI.discoveries.stillDismiss)}),(0,d.jsx)("button",{className:"b2 q",onClick:()=>b.undismiss(a.id),children:c("disc.undismiss",h.UI.discoveries.undismiss)})]})]}):null}function p({d:a,cockpit:b}){let c=(0,i.kj)();return(0,d.jsx)(l.ob,{actions:[{label:c("disc.dismiss",h.UI.discoveries.dismiss),effect:c("eff.dismiss",h.UI.discoveries.effDismiss),onClick:()=>{b.doDismiss(a.id,a.verdict)}}]})}function q({d:a,row:b,cockpit:c}){var j;let k=(0,e.useContext)(f.vC),[l,q]=(0,e.useState)(!1),r=(0,i.kj)(),s=(0,i.XE)(),u=(0,d.jsx)(i.T,{k:`cat.${a.cat}`,en:h.UI.discoveries.cat[a.cat]??a.cat}),v=a.verdictP?(0,d.jsx)(i.P,{p:a.verdictP}):a.verdict,w=a.why?(0,d.jsxs)(d.Fragment,{children:[r("disc.worth",h.UI.discoveries.worth)," ",s((j=(0,g.XF)(a.why,a.quoted)).charAt(0).toLowerCase()+j.slice(1))]}):null,x=a.detail&&a.detail.length>0||a.steps&&a.steps.length>0||b&&!!a.og,y=c?(0,d.jsx)(p,{d:a,cockpit:c}):null,z=c?(0,d.jsx)(o,{d:a,cockpit:c}):null;return b?(0,d.jsxs)("div",{className:`wkrow${l?" open":""}`,children:[(0,d.jsx)("span",{className:"fcat",children:u}),(0,d.jsxs)("span",{className:"fact",children:[v,w&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("br",{}),(0,d.jsx)("span",{className:"why",children:w})]}),a.delta&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("br",{}),(0,d.jsx)("span",{className:"why",children:a.delta})]}),z]}),x&&(0,d.jsx)(m,{open:l,onClick:()=>q(!l),seeCard:!!a.og}),y,l&&(0,d.jsxs)("div",{className:"wkdepth",children:[a.og&&(0,d.jsx)(t,{og:a.og}),(0,d.jsx)(n,{d:a}),a.link&&(0,d.jsx)("a",{className:"b2 q",href:a.link.href,children:a.link.label}),k&&a.dev&&(0,d.jsx)("div",{className:"devline",children:a.dev})]})]}):(0,d.jsxs)("div",{className:"disc",children:[(0,d.jsx)("div",{className:"fcat",children:u}),(0,d.jsx)("b",{children:v}),w&&(0,d.jsx)("p",{children:w}),a.delta&&(0,d.jsx)("p",{children:a.delta}),z,a.og&&(0,d.jsx)(t,{og:a.og}),(x||a.link||y)&&(0,d.jsxs)("div",{className:"disc-foot",children:[x&&(0,d.jsx)(m,{open:l,onClick:()=>q(!l),seeCard:!!a.og}),a.link&&(0,d.jsx)("a",{className:"b2 q",href:a.link.href,children:a.link.label}),y]}),x&&l&&(0,d.jsx)("div",{className:"evd",children:(0,d.jsx)(n,{d:a})}),k&&a.dev&&(0,d.jsx)("div",{className:"devline",children:a.dev})]})}function r({d:a,cockpit:b}){return(0,d.jsx)(q,{d:a,cockpit:b})}function s({d:a,cockpit:b}){return(0,d.jsx)(q,{d:a,row:!0,cockpit:b})}function t({og:a}){let b=(0,i.kj)();return a.title||a.description||a.image?(0,d.jsxs)("div",{className:"ogcard",children:[a.image&&(0,d.jsx)("img",{src:a.image,alt:""}),(0,d.jsxs)("div",{className:"ogcard-body",children:[(0,d.jsx)("div",{className:"ogcard-title",children:(0,d.jsx)(j.B,{children:a.title??b("disc.ogNoTitle",h.UI.discoveries.ogNoTitle)})}),a.description&&(0,d.jsx)("div",{className:"ogcard-desc",children:(0,d.jsx)(j.B,{children:a.description})}),(0,d.jsx)("div",{className:"ogcard-host",children:(0,d.jsx)(j.B,{mono:!0,children:a.host})})]})]}):(0,d.jsx)("div",{className:"ogcard bare",children:b("disc.ogBare",h.UI.discoveries.ogBare)})}}};
@@ -17,7 +17,7 @@
17
17
  "wasm": [],
18
18
  "assets": [],
19
19
  "env": {
20
- "__NEXT_BUILD_ID": "24e7279870f90176b29aa",
20
+ "__NEXT_BUILD_ID": "da1c2e66999c334d135d9",
21
21
  "NEXT_SERVER_ACTIONS_ENCRYPTION_KEY": "4JMwGuCVqDQZYR34ct16W3e5tKgq2cynppiCEo01+6A=",
22
22
  "__NEXT_PREVIEW_MODE_ID": "3009809d6bb6110233a604a935877299",
23
23
  "__NEXT_PREVIEW_MODE_SIGNING_KEY": "fff034baeac7de052ab613235eb882ea3b1089d7e8f2de2c64b32dc3511ff741",
@@ -1 +1 @@
1
- <!DOCTYPE html><!--24e7279870f90176b29aa--><html lang="en" dir="ltr" class="__variable_01ae00 __variable_f367f3 __variable_46fe82 __variable_c5564f"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/9db3c04b1822381e.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/9b639a814d15c5ff.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-c271465961823a3e.js"/><script src="/_next/static/chunks/4bd1b696-f785427dddbba9fb.js" async=""></script><script src="/_next/static/chunks/1255-612df69cb02f2021.js" async=""></script><script src="/_next/static/chunks/main-app-6dcbd7e901d0070a.js" async=""></script><script src="/_next/static/chunks/3192-f33976256a7713fd.js" async=""></script><script src="/_next/static/chunks/5449-1f71ab05b6de2699.js" async=""></script><script src="/_next/static/chunks/app/error-1b4c20b17d1105f5.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>af360 - everything you&#x27;ve built, watched from one place</title><script src="/boot.js"></script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-c271465961823a3e.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[9567,[\"3192\",\"static/chunks/3192-f33976256a7713fd.js\",\"5449\",\"static/chunks/5449-1f71ab05b6de2699.js\",\"8039\",\"static/chunks/app/error-1b4c20b17d1105f5.js\"],\"default\"]\n4:I[8924,[],\"\"]\n5:I[4431,[],\"OutletBoundary\"]\n7:I[5278,[],\"AsyncMetadataOutlet\"]\n9:I[4431,[],\"ViewportBoundary\"]\nb:I[4431,[],\"MetadataBoundary\"]\nc:\"$Sreact.suspense\"\ne:I[7150,[],\"\"]\n:HL[\"/_next/static/css/9db3c04b1822381e.css\",\"style\"]\n:HL[\"/_next/static/css/9b639a814d15c5ff.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"24e7279870f90176b29aa\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/9db3c04b1822381e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/9b639a814d15c5ff.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"dir\":\"ltr\",\"suppressHydrationWarning\":true,\"className\":\"__variable_01ae00 __variable_f367f3 __variable_46fe82 __variable_c5564f\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"src\":\"/boot.js\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$3\",\"errorStyles\":[],\"errorScripts\":[],\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$L6\",[\"$\",\"$L7\",null,{\"promise\":\"$@8\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L9\",null,{\"children\":\"$La\"}],null],[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$c\",null,{\"fallback\":null,\"children\":\"$Ld\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$e\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\n"])</script><script>self.__next_f.push([1,"8:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"af360 - everything you've built, watched from one place\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"d:\"$8:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--da1c2e66999c334d135d9--><html lang="en" dir="ltr" class="__variable_01ae00 __variable_f367f3 __variable_46fe82 __variable_c5564f"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/94d302c686de7e23.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/9b639a814d15c5ff.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-c271465961823a3e.js"/><script src="/_next/static/chunks/4bd1b696-f785427dddbba9fb.js" async=""></script><script src="/_next/static/chunks/1255-612df69cb02f2021.js" async=""></script><script src="/_next/static/chunks/main-app-6dcbd7e901d0070a.js" async=""></script><script src="/_next/static/chunks/3192-6b341d547a49fa85.js" async=""></script><script src="/_next/static/chunks/1681-b233404f9ec2fc2e.js" async=""></script><script src="/_next/static/chunks/app/error-37987420de14c10c.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>af360 - everything you&#x27;ve built, watched from one place</title><script src="/boot.js"></script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-c271465961823a3e.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[9567,[\"3192\",\"static/chunks/3192-6b341d547a49fa85.js\",\"1681\",\"static/chunks/1681-b233404f9ec2fc2e.js\",\"8039\",\"static/chunks/app/error-37987420de14c10c.js\"],\"default\"]\n4:I[8924,[],\"\"]\n5:I[4431,[],\"OutletBoundary\"]\n7:I[5278,[],\"AsyncMetadataOutlet\"]\n9:I[4431,[],\"ViewportBoundary\"]\nb:I[4431,[],\"MetadataBoundary\"]\nc:\"$Sreact.suspense\"\ne:I[7150,[],\"\"]\n:HL[\"/_next/static/css/94d302c686de7e23.css\",\"style\"]\n:HL[\"/_next/static/css/9b639a814d15c5ff.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"da1c2e66999c334d135d9\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/94d302c686de7e23.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/9b639a814d15c5ff.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"dir\":\"ltr\",\"suppressHydrationWarning\":true,\"className\":\"__variable_01ae00 __variable_f367f3 __variable_46fe82 __variable_c5564f\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"src\":\"/boot.js\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$3\",\"errorStyles\":[],\"errorScripts\":[],\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$L6\",[\"$\",\"$L7\",null,{\"promise\":\"$@8\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L9\",null,{\"children\":\"$La\"}],null],[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$c\",null,{\"fallback\":null,\"children\":\"$Ld\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$e\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\n"])</script><script>self.__next_f.push([1,"8:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"af360 - everything you've built, watched from one place\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"d:\"$8:metadata\"\n"])</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-c271465961823a3e.js" defer=""></script><script src="/_next/static/chunks/framework-6dcb94a73b69c7a9.js" defer=""></script><script src="/_next/static/chunks/main-6828c74376f2b965.js" defer=""></script><script src="/_next/static/chunks/pages/_app-55d77747009218cb.js" defer=""></script><script src="/_next/static/chunks/pages/_error-72c0e9c72b90d370.js" defer=""></script><script src="/_next/static/24e7279870f90176b29aa/_buildManifest.js" defer=""></script><script src="/_next/static/24e7279870f90176b29aa/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"24e7279870f90176b29aa","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-c271465961823a3e.js" defer=""></script><script src="/_next/static/chunks/framework-6dcb94a73b69c7a9.js" defer=""></script><script src="/_next/static/chunks/main-6828c74376f2b965.js" defer=""></script><script src="/_next/static/chunks/pages/_app-55d77747009218cb.js" defer=""></script><script src="/_next/static/chunks/pages/_error-72c0e9c72b90d370.js" defer=""></script><script src="/_next/static/da1c2e66999c334d135d9/_buildManifest.js" defer=""></script><script src="/_next/static/da1c2e66999c334d135d9/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"da1c2e66999c334d135d9","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>