everyapp 0.3.0-rc.2 → 0.3.0-rc.3

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 (103) hide show
  1. package/dist/access-FZ2ARRET.js +1 -0
  2. package/dist/activity-2RGC4KBA.js +14 -0
  3. package/dist/ai-ZGVUY7AM.js +5 -0
  4. package/dist/apps-IKTWTDHD.js +14 -0
  5. package/dist/{chunk-4JRIS6S6.js → chunk-36VCEEIH.js} +1 -1
  6. package/dist/{chunk-N5GQLGEC.js → chunk-3GZA6EEZ.js} +1 -1
  7. package/dist/{chunk-ONLNJXVQ.js → chunk-475IB5UG.js} +3 -3
  8. package/dist/chunk-4MMHVIHT.js +20 -0
  9. package/dist/{chunk-W3JCQHHU.js → chunk-52NQ23OH.js} +1 -1
  10. package/dist/chunk-6ILATTGU.js +34 -0
  11. package/dist/{chunk-CZXHKPRZ.js → chunk-7BC42ZUS.js} +1 -1
  12. package/dist/{chunk-CB4U7H2G.js → chunk-7SCPBFKI.js} +1 -1
  13. package/dist/{chunk-5PTNYZK6.js → chunk-AEYRJ3TD.js} +3 -3
  14. package/dist/{chunk-23HJ5I2A.js → chunk-AIDX5IYA.js} +1 -1
  15. package/dist/{chunk-OM2HDWVP.js → chunk-CGFABBZA.js} +1 -1
  16. package/dist/{chunk-PNLU5U3P.js → chunk-DB5CMXEV.js} +1 -1
  17. package/dist/{chunk-ELK7QZ2M.js → chunk-DONNKBKB.js} +1 -1
  18. package/dist/{chunk-AGTCKFRB.js → chunk-EEF4FY26.js} +1 -1
  19. package/dist/chunk-EJE6K5GO.js +146 -0
  20. package/dist/chunk-HHVABFYD.js +1 -0
  21. package/dist/chunk-HT76NR3O.js +1 -0
  22. package/dist/chunk-IWP4Q3KV.js +15 -0
  23. package/dist/{chunk-ZFCUH5PK.js → chunk-J2XKGQO7.js} +1 -1
  24. package/dist/{chunk-OP4DYXYI.js → chunk-JBTV62V7.js} +1 -1
  25. package/dist/chunk-JT3R24Y7.js +1 -0
  26. package/dist/{chunk-ZEXVHB22.js → chunk-KS7DIYIJ.js} +1 -1
  27. package/dist/{chunk-H7PDL3X5.js → chunk-KTX5YGBL.js} +1 -1
  28. package/dist/{chunk-J35DDCNU.js → chunk-LKI3XV7I.js} +1 -1
  29. package/dist/{chunk-T2GD7RHS.js → chunk-LTMQP62I.js} +1 -1
  30. package/dist/{chunk-WOVS3GV5.js → chunk-LTYAIGEB.js} +4 -4
  31. package/dist/{chunk-CCWBPAKH.js → chunk-MLZJBYSY.js} +1 -1
  32. package/dist/chunk-NXO2BC3M.js +57 -0
  33. package/dist/{chunk-RMF4YGD6.js → chunk-OHDR7JWQ.js} +39 -38
  34. package/dist/{chunk-6OGVO7QK.js → chunk-ONGI463M.js} +1 -1
  35. package/dist/chunk-Q44H7KLY.js +1 -0
  36. package/dist/{chunk-6PGUCTJ6.js → chunk-RXSJENSN.js} +1 -1
  37. package/dist/{chunk-CZTEDWZ2.js → chunk-SMCUCFS4.js} +1 -1
  38. package/dist/{chunk-2Y5Q6A5K.js → chunk-TQWCYF2T.js} +1 -1
  39. package/dist/chunk-U4ATZJEU.js +6 -0
  40. package/dist/{chunk-YHJZMJYZ.js → chunk-UEQMNXMZ.js} +1 -1
  41. package/dist/{chunk-LXYMDZER.js → chunk-VX4Z3D7A.js} +1 -1
  42. package/dist/{chunk-IFCPALVC.js → chunk-WTKBB5HE.js} +23 -23
  43. package/dist/{chunk-PS7S74DG.js → chunk-WV4G6E4T.js} +1 -1
  44. package/dist/{chunk-IUOBIB5M.js → chunk-WY2V27RK.js} +1 -1
  45. package/dist/{chunk-TLRM3P7V.js → chunk-XEPXX3AI.js} +1 -1
  46. package/dist/chunk-Y6CGMZEB.js +1 -0
  47. package/dist/{chunk-J455FAEN.js → chunk-YCADEJVJ.js} +5 -5
  48. package/dist/{chunk-HOUHG236.js → chunk-ZCJTJDAI.js} +1 -1
  49. package/dist/{chunk-H6QQMY7B.js → chunk-ZH6IAPVK.js} +1 -1
  50. package/dist/{configure-F7UZCJUG.js → configure-EJKUEVYS.js} +1 -1
  51. package/dist/{create-2E5HVWYK.js → create-BKEFXQ5N.js} +1 -1
  52. package/dist/{db-HEQVTDTM.js → db-66QZCKMG.js} +1 -1
  53. package/dist/delete-JR5R2OHE.js +3 -0
  54. package/dist/deploy-G4NB5R2P.js +1 -0
  55. package/dist/{dev-JL3ZP5BT.js → dev-EFDXNBFY.js} +43 -43
  56. package/dist/{email-RLZFUFUN.js → email-LAQDDSYC.js} +1 -1
  57. package/dist/{events-2V5VRBWP.js → events-RRF7OOCI.js} +1 -1
  58. package/dist/{groups-HDG5DVFY.js → groups-CFTGDYZU.js} +1 -1
  59. package/dist/index.js +89 -83
  60. package/dist/install-GXMHD5XS.js +1 -0
  61. package/dist/{login-KHJBC64Z.js → login-YWNHPSC2.js} +1 -1
  62. package/dist/mcp-72WLLKTK.js +1 -0
  63. package/dist/provider-IPV6BDP3.js +13 -0
  64. package/dist/release-4T7BVUZ5.js +1 -0
  65. package/dist/{restore-FFGYV7NO.js → restore-BWPOK4UP.js} +1 -1
  66. package/dist/secret-NLQQNZMK.js +1 -0
  67. package/dist/setup-6PNOX4NZ.js +1 -0
  68. package/dist/{signin-AP3D4XM4.js → signin-X4Z42R7E.js} +1 -1
  69. package/dist/status-VEUCYFRY.js +4 -0
  70. package/dist/teardown-J4CP2EI5.js +22 -0
  71. package/dist/update-NU2SFDNF.js +1 -0
  72. package/dist/{workspace-CJC5I66L.js → workspace-ZLKGLW35.js} +1 -1
  73. package/package.json +4 -4
  74. package/skills/build-every-app/SKILL.md +4 -1
  75. package/skills/build-every-app/patterns.md +6 -0
  76. package/skills/everyapp/SKILL.md +18 -8
  77. package/skills/everyapp/mcp.md +4 -2
  78. package/skills/everyapp/setup/README.md +2 -0
  79. package/skills/everyapp/setup/ai-gateway.md +117 -0
  80. package/skills/everyapp/setup/ai.md +139 -0
  81. package/skills/everyapp/setup/providers.md +26 -8
  82. package/dist/access-LGEN3ABJ.js +0 -1
  83. package/dist/activity-RSD4D66F.js +0 -12
  84. package/dist/apps-4RCFXT74.js +0 -13
  85. package/dist/chunk-EGEWRFVY.js +0 -1
  86. package/dist/chunk-FJJSSVET.js +0 -33
  87. package/dist/chunk-GKBPYVP3.js +0 -25
  88. package/dist/chunk-JYKRUS5C.js +0 -1
  89. package/dist/chunk-LYNBZ7RV.js +0 -57
  90. package/dist/chunk-M2QQ2UD7.js +0 -132
  91. package/dist/chunk-NFU4YFXB.js +0 -1
  92. package/dist/chunk-ZECBN24L.js +0 -15
  93. package/dist/delete-XCSIQIRS.js +0 -3
  94. package/dist/deploy-3QOZEZHC.js +0 -1
  95. package/dist/install-Z5FYXUYM.js +0 -1
  96. package/dist/mcp-EFDUKJ5V.js +0 -1
  97. package/dist/provider-EOI5PTFH.js +0 -13
  98. package/dist/release-74J5ZIL3.js +0 -1
  99. package/dist/secret-7FKKTLHB.js +0 -1
  100. package/dist/setup-PAKRCAFO.js +0 -1
  101. package/dist/status-RMWNHOEK.js +0 -4
  102. package/dist/teardown-E4JNKAZJ.js +0 -22
  103. package/dist/update-DWVZFNPS.js +0 -1
@@ -0,0 +1 @@
1
+ import{a,b,c,d,e,f,g,h,i}from"./chunk-EEF4FY26.js";import"./chunk-E3EPK27P.js";import"./chunk-WTKBB5HE.js";import"./chunk-LTYAIGEB.js";import"./chunk-CGFABBZA.js";import"./chunk-XEPXX3AI.js";import"./chunk-J2XKGQO7.js";import"./chunk-36VCEEIH.js";import"./chunk-IWP4Q3KV.js";import"./chunk-ZCJTJDAI.js";import"./chunk-OHDR7JWQ.js";import"./chunk-HT76NR3O.js";import"./chunk-LTMQP62I.js";import"./chunk-KTX5YGBL.js";import"./chunk-MLZJBYSY.js";import"./chunk-JT3R24Y7.js";import"./chunk-NXO2BC3M.js";export{c as APPS_APPLICATION_NAME,b as GATEWAY_APPLICATION_NAME,a as POLICY_NAME,e as off,d as on,f as show,i as showAccess,h as turnAccessOff,g as turnAccessOn};
@@ -0,0 +1,14 @@
1
+ import{a as v,c as w,d as x,e as A,f as g}from"./chunk-DONNKBKB.js";import{O as L,P as R,R as U,U as z,V as D,W as j,X as B,Y as H,k as F,l as N}from"./chunk-EJE6K5GO.js";import"./chunk-CGFABBZA.js";import"./chunk-36VCEEIH.js";import"./chunk-OHDR7JWQ.js";import"./chunk-HT76NR3O.js";import"./chunk-LTMQP62I.js";import"./chunk-MLZJBYSY.js";import"./chunk-JT3R24Y7.js";import{Ic as y,Pc as $,Ub as W,c as f,f as k,ib as I,lb as M}from"./chunk-NXO2BC3M.js";import t from"chalk";var C="workspace.update";async function ue(e){await $(e,n=>J({flags:e,out:n}))}async function ge(e){await $(e,n=>V({flags:e,out:n}))}async function fe(e){await $(e,n=>Q({flags:e,out:n}))}async function ke(e){await $(e,n=>Z({flags:e,out:n}))}async function ye(e,n){await $(e,o=>ee({flags:e,out:o},n))}async function $e(e){await $(e,n=>te({flags:e,out:n}))}async function ve(e,n){await $(e,o=>ae({flags:e,out:o},n))}var u=e=>e.toLocaleString("en-US"),T=e=>e===0?t.dim("\u2013"):`$${(e/1e6).toFixed(4)}`,K=e=>`$${(e/1e6).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`;async function J(e){let{out:n,flags:o}=e,{ws:r}=await v(e),i=o.month??L(new Date(r.now)),s=await R(r,i),l=a=>{if(!a.callable)return t.dim("removed");if(a.capUnlimited)return t.dim("none (unlimited)");let h=[a.effectiveMonthlyCallCap===null?null:{kind:"calls",cap:u(a.effectiveMonthlyCallCap),source:a.capSource},a.effectiveMonthlyCostCapMicros===null?null:{kind:"cost",cap:K(a.effectiveMonthlyCostCapMicros),source:a.costCapSource}].filter(b=>b!==null);return h.length===0?t.dim("none"):h.map(b=>{let P=b.source==="default"?`${b.cap} ${t.dim("(default)")}`:b.cap;return a.pausedBy===b.kind?`${P} ${t.yellow("paused")}`:P}).join(" / ")},m=y(["APP","CALLS","FAILED","TOOL CALLS","TOKENS IN/OUT","COST","CAP"],s.byApp.map(a=>[a.appSlug??a.appRowId,u(a.calls),a.failures>0?t.yellow(u(a.failures)):t.dim("0"),u(a.toolCalls),`${u(a.inputTokens)}/${u(a.outputTokens)}`,T(a.costMicros),l(a)])),p=y(["MEMBER","CALLS","FAILED","TOOL CALLS","TOKENS IN/OUT","COST"],s.byMember.map(a=>[a.userId===""?t.dim("the apps themselves"):a.email??t.dim(`${a.userId} (no longer a member)`),u(a.calls),a.failures>0?t.yellow(u(a.failures)):t.dim("0"),u(a.toolCalls),`${u(a.inputTokens)}/${u(a.outputTokens)}`,T(a.costMicros)])),c=y(["PROVIDER","KIND","CALLS","FAILED","TOKENS IN/OUT","COST"],s.byTarget.map(a=>[a.target,a.kind,u(a.calls),a.failures>0?t.yellow(u(a.failures)):t.dim("0"),`${u(a.inputTokens)}/${u(a.outputTokens)}`,T(a.costMicros)])),d=s.byApp.reduce((a,h)=>a+h.calls,0),X=s.byApp.reduce((a,h)=>a+h.toolCalls,0),S=s.byApp.filter(a=>a.paused).length,E=`${r.organization.name}, ${i}: ${k(d,"provider call")} and ${k(X,"tool call")} across ${k(s.byApp.length,"app")}${S>0?`, ${S} paused`:""}`,O=[s.defaultMonthlyCallCap===null?null:`${u(s.defaultMonthlyCallCap)} calls a month`,s.defaultMonthlyCostCapMicros===null?null:`${K(s.defaultMonthlyCostCapMicros)} a month`].filter(a=>a!==null),G=O.length===0?"No workspace default cap.":`Workspace default cap: ${O.join(" or ")} for every app without its own.`;n.emit({type:"done",message:E,display:[E,t.dim(G),"",t.bold("By app"),...s.byApp.length>0?m:[t.dim("no apps")],"",t.bold("By member"),...s.byMember.length>0?p:[t.dim("no calls")],"",t.bold("By provider"),...s.byTarget.length>0?c:[t.dim("no calls")],"",t.dim(`Cap an app: ${f} workspace app cap <app> [<n|off>] [--usd <dollars|off>] [--unlimited]; the default: ${f} workspace cap default [<n|off>] [--usd <dollars|off>]`)].join(`
2
+ `),data:{organization:r.organization,...s}})}async function V(e){let{out:n,flags:o}=e,{ws:r}=await v(e),i=o.app===void 0?void 0:await N(r,o.app,{callable:!0}),s=o.user===void 0?void 0:await w(r,o.user),l=await U(r,{limit:o.limit,before:o.before,appRowId:i?.id,userId:s?.id,decision:o.decision,risk:o.risk,since:o.since}),m=y(["WHEN (UTC)","WHO","APP","TOOL","RISK","DECISION","OUTCOME","MS","CLIENT"],l.calls.map(d=>[A(d.createdAt),d.user.email??t.dim(d.user.id),d.app.slug?`${d.app.slug}${d.app.removed?t.dim(" (removed)"):""}`:t.dim("gateway"),d.tool.via?`${d.tool.name} ${t.dim(`via ${d.tool.via}`)}`:d.tool.name,d.tool.risk??t.dim("\u2013"),d.decision==="allowed"?t.green("allowed"):t.red(`blocked${d.reason?t.dim(` (${d.reason})`):""}`),d.outcome,d.durationMs===null?t.dim("\u2013"):String(d.durationMs),d.credential.clientName??d.credential.clientInfo??t.dim(d.credential.kind)])),p=l.nextBefore?`${l.nextBefore.createdAt}:${l.nextBefore.id}`:null,c=`${k(l.calls.length,"tool call")} in ${r.organization.name}${l.nextBefore?" (more before this page)":""}`;n.emit({type:"done",message:c,display:[l.calls.length>0?m.join(`
3
+ `):t.dim("No tool calls match."),...p?[t.dim(`Next page: ${f} workspace activity --before ${p}`)]:[]].join(`
4
+ `),data:{organization:r.organization,calls:l.calls.map(d=>({...d,createdAt:g(d.createdAt)})),nextBefore:p,...p?{next:[{command:`${f} workspace activity --before ${p}`,note:"the next page"}]}:{}}})}async function Y(e,n){try{return(await F(e,n)).id}catch(o){if(!(o instanceof W)||o.code!=="USER_NOT_FOUND")throw o;return n.trim()}}async function Q(e){let{out:n,flags:o}=e,{ws:r}=await v(e),i=o.actor===void 0?void 0:await Y(r,o.actor),s=await z(r,{limit:o.limit,before:o.before,actorId:i,type:o.type,since:o.since}),l=y(["WHEN (UTC)","WHO","WHAT","SUBJECT","TYPE"],s.events.map(c=>[A(c.time),I(c.actor),c.label,M(c.subject)||t.dim("\u2013"),t.dim(c.type)])),m=s.nextBefore?`${s.nextBefore.time}:${s.nextBefore.id}`:null,p=`${k(s.events.length,"audit event")} in ${r.organization.name}${s.nextBefore?" (more before this page)":""}`;n.emit({type:"done",message:p,display:[s.events.length>0?l.join(`
5
+ `):t.dim("No audit events match."),t.dim("Kept 90 days. Test pings and tool calls are left out unless --type names them (tool.*, *): workspace activity lists the calls."),...m?[t.dim(`Next page: ${f} workspace audit --before ${m}`)]:[]].join(`
6
+ `),data:{organization:r.organization,events:s.events.map(c=>({...c,time:g(c.time)})),nextBefore:m,...m?{next:[{command:`${f} workspace audit --before ${m}`,note:"the next page"}]}:{}}})}var _=e=>({id:e.id,user:e.user,name:e.name,prefix:e.prefix,app:e.app.slug,scopes:e.scopes,active:e.active,createdAt:g(e.createdAt),expiresAt:g(e.expiresAt),lastUsedAt:g(e.lastUsedAt),revokedAt:g(e.revokedAt)});async function Z(e){let{out:n,flags:o}=e,{ws:r}=await v(e),i=o.user===void 0?void 0:await w(r,o.user),s=await D(r,i?.id),l=o.all?s:s.filter(c=>c.active),m=y(["ID","MEMBER","NAME","PREFIX","APP","SCOPES","STATE","LAST USED","EXPIRES"],l.map(c=>[c.id,c.user.email,c.name,`${c.prefix}\u2026`,c.app.slug??t.dim("all apps"),c.scopes.join(","),c.revokedAt!==null?t.dim("revoked"):c.active?t.green("active"):t.yellow("expired"),A(c.lastUsedAt),A(c.expiresAt)])),p=`${k(l.length,o.all?"personal access token":"active personal access token")}${i?` of ${x(i)}`:""} in ${r.organization.name}${!o.all&&s.length>l.length?` (${s.length-l.length} revoked or expired: --all)`:""}`;n.emit({type:"done",message:p,display:[l.length>0?m.join(`
7
+ `):t.dim(p),t.dim(`Revoke one: ${f} workspace token revoke <id>. Tokens are made in Admin \u2192 Tokens; a value is never shown again.`)].join(`
8
+ `),data:{organization:r.organization,tokens:l.map(_)}})}async function ee(e,n){let{out:o}=e,{ws:r}=await v(e);o.emit({type:"step",step:C,status:"start",message:`Revoking the token ${n}...`});let{token:i,already:s}=await j(r,n);o.emit({type:"step",step:C,status:"ok",message:`Revoked ${i.name}`,data:{tokenId:i.id,already:s}});let l=s?[`${i.user.email}'s token ${i.name} (${i.prefix}\u2026) was revoked already, on ${A(i.revokedAt)} UTC.`]:[`Revoked ${i.user.email}'s token ${i.name} (${i.prefix}\u2026).`,"It stops working on its next request."];o.emit({type:"done",message:l.join(`
9
+ `),display:[l[0],...l.slice(1).map(m=>t.dim(m))].join(`
10
+ `),data:{organization:r.organization,token:_(i),already:s}})}var q=e=>({id:e.id,user:e.user,clientName:e.clientName,clientDomain:e.clientDomain,redirectHost:e.redirectHost,apps:e.apps,access:e.access,createdAt:g(e.createdAt),lastUsedAt:g(e.lastUsedAt),revokedAt:g(e.revokedAt),revokedReason:e.revokedReason});async function te(e){let{out:n,flags:o}=e,{ws:r}=await v(e),i=o.user===void 0?void 0:await w(r,o.user),s=await B(r,i?.id),l=y(["ID","MEMBER","AI APP","APPS","ACCESS","LAST USED","SINCE"],s.map(p=>[p.id,p.user.email,`${p.clientName}${p.clientDomain?t.dim(` (${p.clientDomain})`):""}`,p.apps==="all"?"all":p.apps.join(", ")||t.dim("none"),p.access==="write"?"read & write":"read",A(p.lastUsedAt),A(p.createdAt)])),m=`${k(s.length,"AI connection")}${i?` of ${x(i)}`:""} in ${r.organization.name}`;n.emit({type:"done",message:m,display:[s.length>0?l.join(`
11
+ `):t.dim(m),t.dim(`Revoke one: ${f} workspace connection revoke <id>`)].join(`
12
+ `),data:{organization:r.organization,connections:s.map(q)}})}async function ae(e,n){let{out:o}=e,{ws:r}=await v(e);o.emit({type:"step",step:C,status:"start",message:`Revoking the connection ${n}...`});let{connection:i,already:s}=await H(r,n);o.emit({type:"step",step:C,status:"ok",message:`Revoked ${i.clientName}`,data:{connectionId:i.id,already:s}});let l=s?[`${i.user.email}'s connection from ${i.clientName} was revoked already${i.revokedReason?` (${i.revokedReason})`:""}.`]:[`Revoked ${i.user.email}'s connection from ${i.clientName}.`,"The client is out on its next request; its grant in the Gateway's authorization server lapses on its own."];o.emit({type:"done",message:l.join(`
13
+ `),display:[l[0],...l.slice(1).map(m=>t.dim(m))].join(`
14
+ `),data:{organization:r.organization,connection:q(i),already:s}})}export{ge as activity,fe as audit,ve as connectionRevoke,$e as connections,V as listActivity,Q as listAudit,te as listConnections,Z as listTokens,J as reportUsage,ae as revokeConnection,ee as revokeToken,ye as tokenRevoke,ke as tokens,ue as usage};
@@ -0,0 +1,5 @@
1
+ import{c as P,d as u,e as T,j as k}from"./chunk-EJE6K5GO.js";import{B as h}from"./chunk-WTKBB5HE.js";import"./chunk-LTYAIGEB.js";import"./chunk-CGFABBZA.js";import{a as E,f as D}from"./chunk-Q44H7KLY.js";import"./chunk-J2XKGQO7.js";import"./chunk-36VCEEIH.js";import"./chunk-IWP4Q3KV.js";import"./chunk-475IB5UG.js";import"./chunk-ZCJTJDAI.js";import{ra as _,ta as b}from"./chunk-OHDR7JWQ.js";import"./chunk-HT76NR3O.js";import"./chunk-LTMQP62I.js";import"./chunk-KTX5YGBL.js";import{a as I}from"./chunk-MLZJBYSY.js";import"./chunk-JT3R24Y7.js";import{Hc as C,Ic as f,P as g,Pc as c,Ub as $,c as r,k as w}from"./chunk-NXO2BC3M.js";import d from"chalk";var j="everyapp",x="ai.update";async function te(t){await c(t,e=>F({flags:t,out:e}))}async function ae(t){await c(t,e=>O({flags:t,out:e}))}async function oe(t,e){await c(t,a=>S({flags:t,out:a},e))}async function ne(t){await c(t,e=>N({flags:t,out:e},t.id))}async function ie(t){await c(t,e=>K({flags:t,out:e}))}async function m(t){let{flags:e,out:a,createCf:n}=t,s=await b({gateway:_(e.gateway),accountId:e["account-id"],interactive:I(e.json??!1),login:{json:e.json,out:a,step:"login"},createCf:n}),o=await k(s.db,s.deployer,{now:t.now?.()});return{gateway:s,ws:o}}function Y(t){let{resolution:e,aiGateway:a}=t;return{provider:e.provider,label:e.label,model:e.model,source:e.source,configured:e.configured,settings:e.settings,via:e.via,chat:e.chat,...e.embeddings?{embeddings:e.embeddings}:{},candidates:e.candidates,...e.problem?{problem:e.problem}:{},aiGateway:a}}var A=t=>`${t.label} (${t.model})`;function W(t,e){return t.map(a=>[a.id===e?d.bold(a.id):a.id,a.label,a.configured?d.green("set"):d.dim("not set"),a.settings.join(" "),a.model,a.id===e?d.green("\u2190 the default"):""])}function R(t){let{resolution:e}=t;switch(e.source){case"setting":return e.configured?`Chosen with ${r} ai default; ${e.settings.join(" and ")} ${e.settings.length===1?"is":"are"} set.`:`Chosen with ${r} ai default, but ${w(e.settings)} ${e.settings.length===1?"isn't":"aren't"} set: apps get ai_default_not_configured until ${r} secret set ${e.settings.join(" ")}.`;case"order":return`Nothing chosen: the first provider of the order whose key is set. ${r} ai default <provider> picks another.`;case"none":return`Nothing is set yet: apps that need a chat model show "Needs setup" until one key is set (${r} secret set ${e.settings.join(" ")}, or any provider's below).`}}async function F(t){let{out:e}=t,{gateway:a,ws:n}=await m(t),s=await u(a.cf,n),{resolution:o,aiGateway:i}=s,p=[...C([{label:"Default",value:o.configured?A(o):`${A(o)} ${d.yellow("not configured")}`},{label:"Route",value:`/api/ai/default/v1/chat/completions \u2192 ${o.chat.path}${o.embeddings?`; /v1/embeddings \u2192 ${o.embeddings.path}`:""}`},{label:"Through",value:i.on?"Cloudflare AI Gateway":`direct (${r} ai gateway on puts AI Gateway in front)`}]),"",R(s),...o.problem?[d.yellow(`The stored choice can't serve: ${o.problem}.`)]:[],"",...f(["Provider","Name","Key","Setting","Model",""],W(o.candidates,o.provider))];e.emit({type:"done",message:p.join(`
2
+ `),data:Y(s)})}async function O(t){let{out:e}=t,{gateway:a,ws:n}=await m(t),s=await u(a.cf,n),{resolution:o}=s;e.emit({type:"done",message:[...f(["Provider","Name","Key","Setting","Model",""],W(o.candidates,o.provider)),"",`An app that pins a provider lists it under providers; one that takes the default says ai: { chat: true }. ${r} ai default <provider>[/<model>] chooses.`].join(`
3
+ `),data:{candidates:o.candidates,provider:o.provider,aiGateway:s.aiGateway}})}async function S(t,e){let{out:a}=t,n=T(e),{gateway:s,ws:o}=await m(t);a.emit({type:"step",step:x,status:"start",message:"Setting the default model provider..."});let i=await P(o,n),p=await u(s.cf,o),{resolution:l}=p,y=v=>v===null?"the shipped order":g(v);a.emit({type:"step",step:x,status:"ok",message:`${o.organization.name}: the default model provider is ${y(n)}`,data:{choice:n===null?null:g(n),was:i.was===null?null:g(i.was)}});let G=[i.changed?`${o.organization.name}: the default is ${y(n)} (was ${y(i.was)}).`:`${o.organization.name} had ${y(n)} already. Nothing changed.`,`Apps that ask for the default get ${A(l)} on the Gateway within 30 seconds.`];l.configured||G.push(d.yellow(`${w(l.settings)} ${l.settings.length===1?"isn't":"aren't"} set: until then those apps get ai_default_not_configured. Set it: ${r} secret set ${l.settings.join(" ")}`)),a.emit({type:"done",message:G.join(`
4
+ `),data:Y(p)})}async function N(t,e=j){let{out:a}=t,n=e.trim().toLowerCase();if(!E(n))throw new $("AI_GATEWAY_ID_INVALID",`${e} isn't a valid AI Gateway id: lowercase letters, digits and single hyphens, 64 characters at most`,{fix:`${r} ai gateway on --id <name>`});let s=await m(t),o=t.ensureAiGateway??D;a.emit({type:"step",step:"ai.gateway",status:"start",message:`Finding AI Gateway ${n}...`});let i=await o(s.gateway.cf,{id:n,accountId:s.gateway.accountId});a.emit({type:"step",step:"ai.gateway",status:"ok",message:i.created?`Made AI Gateway ${i.id}`:`AI Gateway ${i.id} exists`,data:{id:i.id,url:i.url,created:i.created}}),await h(s.gateway,{AI_GATEWAY_ID:i.id},{flags:t.flags,out:a}),a.emit({type:"done",message:[`Every model call to a provider AI Gateway fronts goes through ${i.url} from the Gateway's next request, the provider's own key still on it.`,`Logs: Cloudflare dashboard \u2192 AI \u2192 AI Gateway \u2192 ${i.id}. For an authenticated gateway: ${r} secret set AI_GATEWAY_API_KEY.`].join(`
5
+ `),data:{id:i.id,url:i.url,created:i.created}})}async function K(t){let{out:e}=t,a=await m(t),n=await u(a.gateway.cf,a.ws);if(!n.names.includes("AI_GATEWAY_ID")){e.emit({type:"done",message:"AI Gateway isn't in front: AI_GATEWAY_ID isn't set. Nothing changed.",data:{on:!1,changed:!1}});return}await h(a.gateway,{AI_GATEWAY_ID:null},{flags:t.flags,out:e}),e.emit({type:"done",message:`Model calls go direct from the Gateway's next request. The AI Gateway and its logs stay in the account${n.names.includes("AI_GATEWAY_API_KEY")?`; AI_GATEWAY_API_KEY stays until ${r} secret unset AI_GATEWAY_API_KEY`:""}.`,data:{on:!1,changed:!0}})}export{S as chooseDefault,ie as gatewayOff,ne as gatewayOn,ae as list,O as listCandidates,oe as setDefault,te as show,F as showDefault,K as turnGatewayOff,N as turnGatewayOn};
@@ -0,0 +1,14 @@
1
+ import{a as v,g as X,h as O,j as Y}from"./chunk-DONNKBKB.js";import{G as H,I as J,J as K,K as q,L as B,M as Q,l as V}from"./chunk-EJE6K5GO.js";import{a as D,d as _,e as L}from"./chunk-CGFABBZA.js";import"./chunk-36VCEEIH.js";import"./chunk-OHDR7JWQ.js";import{a as R}from"./chunk-HT76NR3O.js";import"./chunk-LTMQP62I.js";import"./chunk-MLZJBYSY.js";import"./chunk-JT3R24Y7.js";import{Ic as E,Pc as $,Ub as N,Yb as F,c as C,f as w}from"./chunk-NXO2BC3M.js";import m from"chalk";var h="workspace.update";async function ke(e){await $(e,n=>re({flags:e,out:n}))}async function Ce(e,n){await $(e,a=>pe({flags:e,out:a},n))}async function Se(e,n){await $(e,a=>ce({flags:e,out:a},n))}var ee=e=>e==="off"?null:e;async function Ae(e,n,a){await $(e,r=>le({flags:e,out:r},n,a===void 0?void 0:ee(a),e.unlimited??!1,e.usd))}async function Me(e,n){await $(e,a=>ue({flags:e,out:a},n===void 0?void 0:ee(n),e.usd))}function se(e){if(!e)return null;try{let n=JSON.parse(e);return n&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}function ie(e,n){let a=se(e.manifest);if(!a||e.tier==="dispatch"||e.status==="pending")return null;try{return L(a)?_({manifest:a,appId:e.appSlug,gatewayNames:n,secretNames:R(e.secretNames)}).setup:null}catch{return null}}var P=(e,n)=>({id:e.id,appId:e.appSlug,name:e.name,description:e.description,status:e.status,scope:e.scope,tier:e.tier,hostname:e.hostname,everyone:e.everyone,accessCount:e.accessCount,...n===void 0?{}:{setup:n}});async function re(e){let{out:n}=e,{gateway:a,ws:r}=await v(e),u=await H(r),s=null;try{s=await D(a.cf)}catch(t){n.emit({type:"warning",code:"SETTINGS_UNKNOWN",message:`Couldn't list the Gateway's settings, so what each app needs set is unknown
2
+ ${F(t)}`})}let p=u.map(t=>({app:t,setup:ie(t,s)})),l=E(["APP","NAME","STATUS","WHO CAN OPEN","SETUP"],p.map(({app:t,setup:o})=>[t.appSlug,t.name,t.status==="active"?m.green(t.status):m.yellow(t.status),t.scope==="shared"?"everyone, every organization":t.everyone?`everyone ${m.dim(`(${t.accessCount})`)}`:w(t.accessCount,"member"),o===null?m.dim("\u2013"):o.ready?m.green("ready"):m.yellow(`needs ${o.unmet.map(g=>g.names.join(" or ")).join(", ")}`)])),c=p.filter(({setup:t})=>t&&!t.ready);n.emit({type:"done",message:`${w(u.length,"app")} in ${r.organization.name}${c.length>0?`, ${c.length} needing setup`:""}`,display:u.length>0?l.join(`
3
+ `):m.dim(`No apps in ${r.organization.name} yet.`),data:{organization:r.organization,apps:p.map(({app:t,setup:o})=>P(t,o)),...c.length>0?{next:c.flatMap(({app:t,setup:o})=>o?.command?[{command:o.command.command,note:t.appSlug}]:[])}:{}}})}async function pe(e,n){let{out:a,flags:r}=e,{ws:u}=await v(e);a.emit({type:"step",step:h,status:"start",message:`Updating ${n}...`});let{app:s,granted:p}=await J(u,n,{name:r.name,description:r.description,everyone:r.everyone===void 0?void 0:r.everyone==="on"});a.emit({type:"step",step:h,status:"ok",message:`Updated ${s.appSlug}`,data:{appRowId:s.id,granted:p}});let l=[`${s.appSlug} is "${s.name}"${s.description?`: ${s.description}`:""}.`,s.scope==="shared"?"A shared app: every member of every organization can open it.":s.everyone?`Available to everyone in ${u.organization.name}${p>0?` (${w(p,"member")} granted now)`:""}; new members get it on joining.`:`Private: ${w(s.accessCount,"member")} can open it (workspace app access ${s.appSlug}).`];a.emit({type:"done",message:l.join(`
4
+ `),display:[l[0],m.dim(l[1])].join(`
5
+ `),data:{organization:u.organization,app:P(s),granted:p}})}async function ce(e,n){let{out:a,flags:r}=e,{change:u}=Y(r),{ws:s}=await v(e),p=await V(s,n),l=[],c=[],t;u?(a.emit({type:"step",step:h,status:"start",message:`Changing who can open ${p.appSlug}...`}),{granted:l,revoked:c,users:t}=await q(s,p,u),a.emit({type:"step",step:h,status:"ok",message:`${p.appSlug}: ${w(l.length,"grant")} added, ${c.length} revoked`,data:{appRowId:p.id,granted:l.length,revoked:c.length}})):t=await K(s,p);let o=t.filter(i=>i.direct||i.viaGroups.length>0),g=E(["EMAIL","ROLE","STATUS","DIRECT","VIA GROUPS"],t.map(i=>[i.email,i.primaryRole??i.role,X(i),i.direct?m.green("yes"):m.dim("no"),i.viaGroups.length>0?i.viaGroups.join(", "):m.dim("\u2013")])),f=u?`${p.appSlug}: granted ${l.length>0?l.map(i=>i.email).join(", "):"nobody"}, revoked ${c.length>0?c.map(i=>i.email).join(", "):"nobody"}; ${w(o.length,"member")} can open it now.`:`${w(o.length,"member")} of ${t.length} can open ${p.appSlug}${p.everyone?" (available to everyone)":""}.`;a.emit({type:"done",message:f,display:[f,g.join(`
6
+ `)].join(`
7
+ `),data:{organization:s.organization,app:P({...p,accessCount:o.length}),users:t.map(i=>({...O(i),direct:i.direct,viaGroups:i.viaGroups})),...u?{granted:l.map(O),revoked:c.map(O)}:{}}})}var U=e=>`${e.toLocaleString("en-US")} calls a month`,T=e=>`$${(e/1e6).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})} a month`;function ne(e,n){let a=[e===null?null:U(e),n===null?null:T(n)].filter(r=>r!==null);return a.length?a.join(" or "):null}function Z(e,n,a=null){return n?"no cap at all":ne(e,a)??"no cap of its own"}function te(e){return e===null?null:{subscriptionId:e,message:`Owners and admins are emailed at 80% and at the cap (the built-in Cap alerts subscription; ${C} events list shows it).`}}var I="a provider tool answers a tool error naming the cap, and an app's brokered call gets 429 app_monthly_cap_exceeded until the next UTC month.",ae="A dollar cap counts only the cost a provider reports (OpenRouter, DataForSEO); other calls count toward the call cap alone.",oe=e=>e===void 0?void 0:e==="off"?null:e;async function le(e,n,a,r=!1,u){let{out:s}=e,p=oe(u);if(r&&(a!==void 0||p!==void 0))throw new N("INVALID_VALUE",`--unlimited takes no number, no off and no --usd
8
+ An app has caps of its own (a number of calls, --usd, or both), no cap whatever the workspace defaults (--unlimited), or neither (off).`,{fix:`give --unlimited alone: ${C} workspace app cap ${n} --unlimited`});if(!r&&a===void 0&&p===void 0)throw new N("MISSING_ARGUMENT",`Missing the cap
9
+ Give a number of calls per month, --usd with dollars per month, off for no cap of its own, or --unlimited.`,{data:{usage:`${C} workspace app cap <app> [<n|off>] [--usd <dollars|off>] [--unlimited] [flags]`}});let{ws:l}=await v(e);s.emit({type:"step",step:h,status:"start",message:`Setting ${n}'s cap...`});let c=await B(l,n,a,{unlimited:r,costUsd:p}),{app:t,was:o,wasUnlimited:g,wasCostCapMicros:f,effective:i,before:S,effectiveCost:d,beforeCost:b,capAlertsId:k}=c,W=c.cap===o&&c.costCapMicros===f&&r===g,y=Z(c.cap,r,c.costCapMicros),G={cap:c.cap,costCapMicros:c.costCapMicros,unlimited:r,was:o,wasCostCapMicros:f,wasUnlimited:g,effectiveCap:i.cap,capSource:i.source,effectiveCostCapMicros:d.cap,costCapSource:d.source};s.emit({type:"step",step:h,status:"ok",message:`${t.appSlug}: ${y}`,data:{appRowId:t.id,...G}});let A=[i.cap===null?null:i.source==="default"?`The workspace default of ${U(i.cap)}`:U(i.cap),d.cap===null?null:d.source==="default"?`the workspace default of ${T(d.cap)}`:T(d.cap)].filter(j=>j!==null),x=A.length===0?S.cap===null&&b.cap===null?"Its provider calls are not capped.":"Its provider calls are no longer capped.":d.cap===null?i.source==="default"?`The workspace default of ${U(i.cap)} binds it; past it, ${I}`:`Past it, ${I}`:`${A.join(" and ")} ${A.length>1?"bind":"binds"} it; past ${A.length>1?"either":"it"}, ${I}`,M=[W?`${t.appSlug} had ${y} already. Nothing changed.`:`${t.appSlug}: ${y} for ${l.organization.name} (was ${Z(o,g,f)}).`,x.charAt(0).toUpperCase()+x.slice(1),...d.cap===null?[]:[ae]],z=te(k);z&&M.push(z.message),s.emit({type:"done",message:M.join(`
10
+ `),display:[M[0],...M.slice(1).map(j=>m.dim(j))].join(`
11
+ `),data:{organization:l.organization,app:P(t),...G,capAlerts:z}})}async function ue(e,n,a){let{out:r}=e,u=oe(a);if(n===void 0&&u===void 0)throw new N("MISSING_ARGUMENT",`Missing the default
12
+ Give a number of calls per month, --usd with dollars per month, or off.`,{data:{usage:`${C} workspace cap default [<n|off>] [--usd <dollars|off>] [flags]`}});let{ws:s}=await v(e);r.emit({type:"step",step:h,status:"start",message:"Setting the workspace default cap..."});let p=await Q(s,n,u),{was:l,wasCostCapMicros:c,capAlertsId:t}=p,o={cap:p.cap,costCapMicros:p.costCapMicros},g=(k,W)=>{let y=ne(k,W);return y===null?"no default cap":`a default cap of ${y}`},f={cap:o.cap,was:l,costCapMicros:o.costCapMicros,wasCostCapMicros:c};r.emit({type:"step",step:h,status:"ok",message:`${s.organization.name}: ${g(o.cap,o.costCapMicros)}`,data:f});let i=o.cap===null&&o.costCapMicros===null,S=o.cap!==null&&o.costCapMicros!==null,d=[o.cap===l&&o.costCapMicros===c?`${s.organization.name} had ${g(o.cap,o.costCapMicros)} already. Nothing changed.`:`${s.organization.name}: ${g(o.cap,o.costCapMicros)} (was ${g(l,c)}).`,i?"Every app without a cap of its own is uncapped on the Gateway within 30 seconds; an app's own cap or --unlimited stays.":`Every app without a cap or --unlimited of its own is held to ${S?"them":"it"} on the Gateway within 30 seconds; past ${S?"either":"it"}, ${I}`,...o.costCapMicros===null?[]:[ae]],b=te(t);b&&d.push(b.message),r.emit({type:"done",message:d.join(`
13
+ `),display:[d[0],...d.slice(1).map(k=>m.dim(k))].join(`
14
+ `),data:{organization:s.organization,...f,capAlerts:b}})}export{Se as appAccess,ce as appAccessCommand,Ae as appCap,Ce as appSet,ke as apps,Me as capDefault,re as listApps,le as setCap,ue as setDefaultCap,pe as updateApp};
@@ -1 +1 @@
1
- import{n as a}from"./chunk-JYKRUS5C.js";import{Gb as c,bc as i}from"./chunk-LYNBZ7RV.js";async function m(e,t){return(await i(e,{plane:"account",args:["workers","secrets","list","--worker",t]},a)).map(r=>r.name).sort()}async function p(e,t,n){try{return await e.run({plane:"account",mode:"json",args:["workers","secrets","delete",n,"--worker",t,"--force"]}),!0}catch(r){if(r instanceof c&&(r.kind==="not_found"||/not[_ ]found/i.test(r.message)))return!1;throw r}}async function d(e,t,n){let r={secrets:Object.fromEntries(Object.entries(n).map(([s,o])=>[s,o===null?null:{name:s,type:"secret_text",text:o}]))};await e.run({plane:"account",mode:"json",files:{"secrets.json":r},args:s=>["workers","secrets","bulk","--worker",t,"--body",`@${s["secrets.json"]}`]})}export{m as a,p as b,d as c};
1
+ import{n as a}from"./chunk-JT3R24Y7.js";import{Zb as c,uc as i}from"./chunk-NXO2BC3M.js";async function m(e,t){return(await i(e,{plane:"account",args:["workers","secrets","list","--worker",t]},a)).map(r=>r.name).sort()}async function p(e,t,n){try{return await e.run({plane:"account",mode:"json",args:["workers","secrets","delete",n,"--worker",t,"--force"]}),!0}catch(r){if(r instanceof c&&(r.kind==="not_found"||/not[_ ]found/i.test(r.message)))return!1;throw r}}async function d(e,t,n){let r={secrets:Object.fromEntries(Object.entries(n).map(([s,o])=>[s,o===null?null:{name:s,type:"secret_text",text:o}]))};await e.run({plane:"account",mode:"json",files:{"secrets.json":r},args:s=>["workers","secrets","bulk","--worker",t,"--body",`@${s["secrets.json"]}`]})}export{m as a,p as b,d as c};
@@ -1,2 +1,2 @@
1
- import{d}from"./chunk-W3JCQHHU.js";import{o as u,p as f}from"./chunk-JYKRUS5C.js";import{Bb as a,bc as i,cc as l,d as c}from"./chunk-LYNBZ7RV.js";function $(n,t,r){return i(n,{plane:"account",args:["dns","records","list","-z",t,"--name-exact",r,"--per-page","100"]},f)}async function v(n,t,r){await n.run({plane:"account",mode:"json",args:["dns","records","delete",r,"-z",t,"--force"]})}function y(n){return`*.${n.slice(n.indexOf(".")+1)}`}function z(n){return`${n.type}${n.content?` ${n.content}`:""}`}var p=50,g=20;function C(n){return`https://dash.cloudflare.com/${n}/domains/overview`}async function _(n,t,r){let o=d(t),e=await w(n,t,r);if(!e)throw new a("ZONE_NOT_FOUND",`No zone in this Cloudflare account holds ${t}
1
+ import{d}from"./chunk-52NQ23OH.js";import{o as u,p as f}from"./chunk-JT3R24Y7.js";import{Ub as a,d as c,uc as i,vc as l}from"./chunk-NXO2BC3M.js";function $(n,t,r){return i(n,{plane:"account",args:["dns","records","list","-z",t,"--name-exact",r,"--per-page","100"]},f)}async function v(n,t,r){await n.run({plane:"account",mode:"json",args:["dns","records","delete",r,"-z",t,"--force"]})}function y(n){return`*.${n.slice(n.indexOf(".")+1)}`}function z(n){return`${n.type}${n.content?` ${n.content}`:""}`}var p=50,g=20;function C(n){return`https://dash.cloudflare.com/${n}/domains/overview`}async function _(n,t,r){let o=d(t),e=await w(n,t,r);if(!e)throw new a("ZONE_NOT_FOUND",`No zone in this Cloudflare account holds ${t}
2
2
  Looked for ${o.join(", ")}. Buy a domain in the dashboard (Domains, ${C(r)}), or add one you own and point its nameservers at Cloudflare.`,{fix:"use a domain that is on Cloudflare in this account"});if(e.status&&e.status!=="active")throw new a("ZONE_NOT_ACTIVE",`The Cloudflare zone ${e.name} is ${e.status}, not active`,{fix:`finish its nameserver setup (Cloudflare dashboard \u2192 ${e.name} \u2192 Overview)`,rerun:c()});return{id:e.id,name:e.name}}async function w(n,t,r){let e=(await Promise.all(d(t).map(async s=>(await i(n,{plane:"account",args:["zones","list","--name",s,"--account-id",r]},u)).find(m=>m.name.toLowerCase()===s)??null))).find(s=>s!==null);return e?{id:e.id,name:e.name.toLowerCase(),status:e.status??null}:null}function A(n,t){return`https://dash.cloudflare.com/${n}/${t}`}async function D(n,t){return(await l(n,["zones","list","--account-id",t],u,{perPage:p,maxPages:g})).map(o=>({id:o.id,name:o.name.toLowerCase(),status:o.status??null}))}export{$ as a,v as b,y as c,z as d,C as e,_ as f,w as g,A as h,D as i};
@@ -1,4 +1,4 @@
1
- import{createHash as I,createHmac as m}from"node:crypto";var _="https://gateway.dev.localhost";var u=`-----BEGIN PRIVATE KEY-----
1
+ import{createHash as d,createHmac as y}from"node:crypto";var l="https://gateway.dev.localhost";var p=`-----BEGIN PRIVATE KEY-----
2
2
  MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCHjTNZ/5Aresl0
3
3
  xM2jL5cX2LJ1XmtpZJ4S3gNfJ5j3xzwhkdGPLZRdpph6PB55tGy/0DP5tm4vdx8n
4
4
  QTuk4Z3hUI6JIbUGMmCWZMLXCFXgx3qqEsNU4/qLO1QlLEPCeVHzlS07I0ngbl1h
@@ -26,7 +26,7 @@ sBwG4E6M/yUbgdbNjnv+AuVYS8Uyvf6x/xaWH3zssluIXhod0Two22bjtkPGJ2nx
26
26
  1ZXmbxSdWVGwLZn3GYRoRu6X6VGTbFAaK1mb7KDfwjoaauV7G3A2mw6M5xxg4zx/
27
27
  hsbx0DA4sMMIUEniw9W/YA==
28
28
  -----END PRIVATE KEY-----
29
- `;var o=Object.freeze({workerName:"every-hosted--sentinel",organizationId:"everyapp-hosted-deploy-sentinel",gatewayUrl:"https://every-hosted--sentinel.invalid",publicKey:`-----BEGIN PUBLIC KEY-----
29
+ `;var o=Object.freeze({workerName:"every-hosted--sentinel",organizationId:"everyapp-hosted-deploy-sentinel",accountId:"every-hosted--sentinel-account",gatewayUrl:"https://every-hosted--sentinel.invalid",publicKey:`-----BEGIN PUBLIC KEY-----
30
30
  EVERYAPPHOSTEDDEPLOYSENTINEL
31
31
  -----END PUBLIC KEY-----
32
- `});function s(t){return`${o.workerName}--${t}`}function a(t){let r=(e,c)=>Object.fromEntries((e??[]).map(i=>[i,c(s(i))])),{resources:n}=t;return{workerName:o.workerName,organizationId:o.organizationId,gatewayUrl:o.gatewayUrl,identityPublicKeys:[o.publicKey],resources:{d1:r(n?.d1,e=>({name:e,id:e})),kv:r(n?.kv,e=>({id:e})),hyperdrive:r(n?.hyperdrive?.map(e=>e.name),e=>({id:e})),r2:r(n?.r2,e=>({name:e}))}}}var l=Object.freeze({enabled:!0,headSamplingRate:1,redactQueryString:!0,logs:Object.freeze({enabled:!0,invocationLogs:!0,persist:!0,headSamplingRate:1}),traces:Object.freeze({enabled:!0,persist:!0,headSamplingRate:.1}),issues:Object.freeze({enabled:!0})});var E=63;function A(t,r){let n=`${t}--${r}`;if(n.length>E)throw new Error(`Helper Worker ${n} is longer than Cloudflare's ${E} characters; shorten its name in everyapp.config.ts.`);return n}function d(t,r){return`${t}--${r.toLowerCase().replaceAll("_","-")}`}function p(t,r){return I("sha256").update(`${t}:${r}`).digest("hex").slice(0,32)}export{_ as a,u as b,o as c,s as d,a as e,l as f,A as g,d as h,p as i};
32
+ `});function a(t){return`${o.workerName}--${t}`}function s(t,r){return`https://gateway.ai.cloudflare.com/v1/${t}/${r}`}function E(t){let r=(e,_)=>Object.fromEntries((e??[]).map(i=>[i,_(a(i))])),{resources:n}=t;return{workerName:o.workerName,organizationId:o.organizationId,accountId:o.accountId,gatewayUrl:o.gatewayUrl,identityPublicKeys:[o.publicKey],resources:{d1:r(n?.d1,e=>({name:e,id:e})),kv:r(n?.kv,e=>({id:e})),hyperdrive:r(n?.hyperdrive?.map(e=>e.name),e=>({id:e})),r2:r(n?.r2,e=>({name:e})),vectorize:r(n?.vectorize?.map(e=>e.name),e=>({name:e})),aiGateway:r(n?.aiGateway?.map(e=>e.name),e=>({id:e,accountId:o.accountId,url:s(o.accountId,e)}))}}}var I=Object.freeze({enabled:!0,headSamplingRate:1,redactQueryString:!0,logs:Object.freeze({enabled:!0,invocationLogs:!0,persist:!0,headSamplingRate:1}),traces:Object.freeze({enabled:!0,persist:!0,headSamplingRate:.1}),issues:Object.freeze({enabled:!0})});var c=63;function A(t,r){let n=`${t}--${r}`;if(n.length>c)throw new Error(`Helper Worker ${n} is longer than Cloudflare's ${c} characters; shorten its name in everyapp.config.ts.`);return n}function u(t,r){return`${t}--${r.toLowerCase().replaceAll("_","-")}`}function f(t,r){return d("sha256").update(`${t}:${r}`).digest("hex").slice(0,32)}export{l as a,p as b,o as c,a as d,s as e,E as f,I as g,A as h,u as i,f as j};
@@ -0,0 +1,20 @@
1
+ import{a as le}from"./chunk-U4ATZJEU.js";import{b as re,e as ne,g as ie,i as se,l as oe,m as D,n as ae,o as L,r as pe,s as ce}from"./chunk-ONGI463M.js";import{d as ee,e as te,f as W}from"./chunk-KTX5YGBL.js";import{Ab as Y,Db as H,Gb as S,Ub as l,Zb as K,b as x,c as N,gc as q,hc as J,j as V,jc as X,pc as Q,qc as I,rc as Z,yb as G}from"./chunk-NXO2BC3M.js";import{spawn as We,spawnSync as Ce}from"node:child_process";import U from"node:fs";import A from"node:fs/promises";import{createRequire as Be}from"node:module";import w from"node:path";import{z as $}from"zod";import xe from"node:fs";import Ne from"node:path";import Ie from"node:fs/promises";import ue from"node:path";var De=200*1024*1024,Le=5*6e4,Pe=5,Te=new Set([301,302,303,307,308]);function P(e){let t=/^([\w.-]+)\/([\w.-]+)$/.exec(e.trim());if(t)return`${t[1]}/${t[2].replace(/\.git$/,"")}`;let r;try{r=new URL(e.trim())}catch{return null}if(r.protocol!=="https:"||r.hostname!=="github.com")return null;let[n,i]=r.pathname.split("/").filter(Boolean);return!n||!i?null:`${n}/${i.replace(/\.git$/,"")}`}async function he({repo:e,asset:t,tag:r,...n}){let i=P(e);if(!i)throw new l("RELEASE_NOT_FOUND",`${e} isn't a GitHub repository (https://github.com/<owner>/<repo>).`);let o=r?`https://github.com/${i}/releases/download/${encodeURIComponent(r)}/${encodeURIComponent(t)}`:`https://github.com/${i}/releases/latest/download/${encodeURIComponent(t)}`,s=await C(o,{...n,notFound:`${i} has no ${r?`release ${r}`:"published release"} with ${t} that can be downloaded without signing in (https://github.com/${i}/releases).`});if(!s.tag)throw await s.cleanup(),new l("RELEASE_DOWNLOAD_FAILED",`GitHub didn't say which release of ${i} ${o} is.`);return{...s,tag:s.tag,repo:i}}async function C(e,{fetch:t=fetch,timeoutMs:r=Le,maxBytes:n=De,notFound:i}={}){let o=AbortSignal.timeout(r),{response:s,current:a,tag:p}=await je(e,t,o).catch(f=>{throw me(f,e)});if(s.status===404)throw await s.body?.cancel(),new l("RELEASE_NOT_FOUND",i??`${e} doesn't exist (404).`);if(!s.ok||!s.body)throw await s.body?.cancel(),new l("RELEASE_DOWNLOAD_FAILED",`Couldn't download ${e}: HTTP ${s.status}.`,{retryable:s.status>=500});if(Number(s.headers.get("content-length"))>n)throw await s.body.cancel(),ge(e,n);let{dir:u,cleanup:y}=await I("release-download-"),m=ue.join(u,ue.posix.basename(a.pathname)||"release.tar.gz");try{let f=await Ie.open(m,"wx",384);try{let E=0;for await(let b of s.body){if(E+=b.byteLength,E>n)throw ge(e,n);await f.write(b)}}finally{await f.close()}}catch(f){throw await s.body.cancel().catch(()=>{}),await y(),me(f,e)}return{tarball:m,tag:p,url:e,cleanup:y}}async function je(e,t,r){let n=de(e,e),i=fe(n);for(let o=0;;o+=1){let s=await t(n.href,{redirect:"manual",credentials:"omit",signal:r,headers:{accept:"application/octet-stream"}});if(!Te.has(s.status))return{response:s,current:n,tag:i};let a=s.headers.get("location");if(await s.body?.cancel(),!a||o>=Pe)throw new l("RELEASE_DOWNLOAD_FAILED",`${e} redirects ${a?"too many times":"nowhere"}.`);n=de(new URL(a,n).href,e),i??=fe(n)}}function de(e,t){let r;try{r=new URL(e)}catch{throw new l("RELEASE_DOWNLOAD_FAILED",`${e} isn't a URL.`)}if(r.protocol!=="https:")throw new l("RELEASE_DOWNLOAD_FAILED",`${t} ${e===t?"isn't":`redirects to ${e}, which isn't`} an HTTPS URL.`);return r}function fe(e){if(e.hostname!=="github.com")return null;let t=/^\/[^/]+\/[^/]+\/releases\/download\/([^/]+)\/[^/]+$/.exec(e.pathname);return t?decodeURIComponent(t[1]):null}function ge(e,t){return new l("RELEASE_TOO_LARGE",`${e} is over ${Math.round(t/1024/1024)} MB, too big for a release
2
+ A release is a few MB. Check the URL.`)}function me(e,t){if(e instanceof l)return e;let r=e.name;return new l("RELEASE_DOWNLOAD_FAILED",r==="TimeoutError"||r==="AbortError"?`Downloading ${t} timed out.`:`Couldn't download ${t}: ${e.message}`,{retryable:!0})}function T(e){return/^[a-z][a-z0-9+.-]*:\/\//i.test(e)}async function we(e,{asset:t,what:r,step:n,missing:i,out:o,fetch:s}){if(!T(e)){let u=Ne.resolve(e);if(!xe.existsSync(u))throw new l("RELEASE_NOT_FOUND",i);return{tarball:u,origin:{kind:"file",path:u},cleanup:async()=>{}}}let a=B(e);o.emit({type:"progress",step:n,message:`Downloading ${r} from ${a?`${a.repo}${a.tag?` release ${a.tag}`:"'s latest release"}`:e}...`,data:{url:e}});let p,d;if(a){let u=await he({repo:a.repo,asset:t,tag:a.tag,fetch:s});p=u,d={kind:"github",repo:u.repo,tag:u.tag}}else{p=await C(e,{fetch:s});let u=p.tag?P(e):null;d=u&&p.tag?{kind:"github",repo:u,tag:p.tag}:{kind:"url",url:e}}return{tarball:p.tarball,origin:d,cleanup:p.cleanup}}function B(e){let t=P(e);if(!t||!T(e))return null;let r=new URL(e).pathname.split("/").filter(Boolean).slice(2);return r.length===0||r.length===1&&r[0]==="releases"?{repo:t}:r.length===3&&r[0]==="releases"&&r[1]==="tag"?{repo:t,tag:decodeURIComponent(r[2])}:r.length===2&&r[0]==="releases"&&r[1]==="latest"?{repo:t}:null}var z="everyapp-release.tar.gz",_="migrations",ye=w.join(".cloudflare","output"),O="v0",Ue="0.3.0",ze="0.3.0",be=/^(\.DS_Store|\._.*)$/;function Me(e){try{return Be(w.join(e,"package.json"))("@every-app/sdk/package.json").version??null}catch{return null}}var Fe=re.extend({kind:$.literal("app"),appId:$.string().min(1),cliVersion:$.string(),sdkVersion:$.string().nullable(),manifest:$.record($.string(),$.unknown())});function Tt(e){switch(e.kind){case"github":return`github.com/${e.repo} (release ${e.tag})`;case"url":return e.url;case"file":return e.path;case"checkout":return"this checkout"}}function Ve(e){if(e.migrations?.engine==="prisma")throw new l("RELEASE_MIGRATIONS_UNSUPPORTED",`${e.id} migrates with Prisma, which a release can't carry
3
+ Prisma migrations (migrations.engine "prisma") need the app's source and its Prisma CLI.`,{rerun:`${N} deploy`,rerunNote:"from the app's checkout"});if(e.migrations?.dialect==="postgresql")return W(e);let t=e.resources?.d1??[];return t.length===0?null:(te(t,e.migrations),W(e))}async function Ge(e){return(await A.readdir(e,{recursive:!0,withFileTypes:!0})).filter(t=>!t.isDirectory()).map(t=>w.relative(e,w.join(t.parentPath,t.name)).split(w.sep).join("/")).sort()}async function Ye(e){let t=(await Ge(e)).filter(r=>{let n=w.posix.basename(r);return n.startsWith(".dev.vars")||n.startsWith(".env")||n.endsWith(".pem")||/(^|\/)\.cloudflare\/(state|types)(\/|$)/.test(r)||/(^|\/)\.(wrangler|everyapp)(\/|$)/.test(r)});if(t.length>0)throw new l("RELEASE_LOCAL_STATE",`Refusing to pack local state or secrets into the release:
4
+ ${t.join(`
5
+ `)}`)}async function He(e){let t;try{t=await A.readFile(w.join(e,"meta","_journal.json"),"utf8")}catch(n){if(Q(n))return[];throw n}return(JSON.parse(t).entries??[]).map(({tag:n,when:i})=>({tag:n,when:i}))}function Ee(e,t){let r=Ce("git",t,{cwd:e,encoding:"utf8"});return r.status===0?r.stdout.trim():null}function Ke(e){return new Promise((t,r)=>{let n=We("tar",e,{stdio:["ignore","ignore","pipe"],env:{...process.env,COPYFILE_DISABLE:"1"}}),i="";n.stderr.on("data",o=>i+=o.toString()),n.once("error",r),n.once("close",o=>o===0?t():r(new l("RELEASE_PACK_FAILED",`tar couldn't pack the release (exit ${o}): ${i.trim()}`)))})}async function jt({cwd:e,manifest:t,outFile:r,cfVersion:n,builtAt:i=new Date}){let o=w.join(e,ye),s=U.existsSync(o)?(await A.readdir(o)).filter(y=>!be.test(y)):[];if(s.length!==1||s[0]!==O)throw new l("RELEASE_PACK_FAILED",`Expected the Build Output ${O} alone in ${o}, found ${s.length?s.join(", "):"none"}.`);let a=w.join(o,O);if(!await L(a))throw new l("RELEASE_PACK_FAILED",`The app's Build Output isn't a production build
6
+ A release ships only one.`,{fix:"build with `cf build` (production by default)"});let p=Ve(t),{dir:d,cleanup:u}=await I("app-release-stage-");try{let y=(h,j)=>A.cp(h,w.join(d,j),{recursive:!0,dereference:!0,filter:R=>!be.test(w.basename(R))});await y(a,w.join(ye,O));let m=p?w.resolve(e,p):null,f=m!==null&&U.existsSync(m)&&U.statSync(m).isDirectory();f&&await y(m,_),await Ye(d);let E=JSON.parse(await A.readFile(w.join(e,"package.json"),"utf8").catch(()=>"{}")),b=Ee(e,["rev-parse","HEAD"]),c=b!==null&&!!Ee(e,["status","--porcelain","--","."]),g={schema:1,kind:"app",appId:t.id,version:E.version??"0.0.0",gitSha:b?`${b}${c?"-dirty":""}`:"unknown",builtAt:i.toISOString(),cfVersion:n,cliVersion:x,sdkVersion:Me(e),buildOutputVersion:O,sha256:await ne(d),migrations:f?await He(w.join(d,_)):[],minCli:Ue,minSdk:ze,manifest:t.migrations||f?{...t,migrations:{engine:"drizzle",...t.migrations,dir:_}}:t};return await A.writeFile(w.join(d,"release.json"),`${JSON.stringify(g,null,2)}
7
+ `),await A.mkdir(w.dirname(r),{recursive:!0}),await A.rm(r,{force:!0}),await Ke(["-czf",r,"-C",d,"."]),g}finally{await u()}}async function qe(e,{origin:t={kind:"file",path:e},version:r=x}={}){let{dir:n,manifest:i,cleanup:o}=await ie(e,"app",Fe);try{se(i,r,`${i.appId} ${i.version}`);let s;try{s=Y(i.manifest,ee)}catch(p){throw p instanceof G?new l("RELEASE_INVALID",`${e} carries a manifest this everyapp refuses: ${p.message}`):p}if(s.id!==i.appId)throw new l("RELEASE_INVALID",`${e} says it is ${i.appId}, but its manifest is ${s.id}'s.`);let a=s.migrations?.dir;if(a!==void 0&&a!==_)throw new l("RELEASE_INVALID",`${e}'s manifest keeps its migrations in ${a}; a release keeps them in ${_}/.`);return{dir:n,release:i,manifest:s,origin:t,cleanup:o}}catch(s){throw await o(),s}}async function xt(e,{out:t,fetch:r,version:n}){let i=T(e)?B(e):null,o;try{o=await we(e,{asset:z,what:"the app",step:"app.release",missing:`${e} is neither a URL nor a file
8
+ Pass a GitHub repository URL (https://github.com/<owner>/<repo>), a release tarball's URL, or a downloaded ${z}.`,out:t,fetch:r})}catch(s){throw i&&s instanceof l&&s.code==="RELEASE_NOT_FOUND"?new l("NO_RELEASE",`${i.repo} publishes no everyapp release${i.tag?` ${i.tag}`:""}
9
+ Its GitHub releases have no ${z}.`,{fix:`clone it, then run pnpm install in it and this checkout's ${N} deploy from its directory`}):s}try{let s=await qe(o.tarball,{origin:o.origin,version:n});return{...s,cleanup:async()=>{await s.cleanup(),await o.cleanup()}}}catch(s){throw await o.cleanup(),s}}import{rmSync as Je}from"node:fs";import v from"node:fs/promises";import k from"node:path";import{execa as Xe}from"execa";var Qe=["drizzle.config.ts","drizzle.config.js"],ke=12e4;async function Gt({cwd:e,manifest:t,out:r}){let n=t.migrations?.engine??"drizzle",i=t.migrations?.dialect==="postgresql",o=(m,f={})=>r.emit({type:"warning",code:"SCHEMA_CHECK_SKIPPED",step:"app.schema",message:`Can't check the schema against the migrations: ${m}${f.detail?`
10
+ ${f.detail}`:""}`,...f.fix?{data:{fix:f.fix}}:{}});if(n==="prisma"){r.emit({type:"progress",step:"app.schema",message:"To check a Prisma schema against its migrations: prisma migrate diff --from-migrations <dir> --to-schema <schema> --exit-code, with datasource.shadowDatabaseUrl set in prisma.config.ts."}),r.emit({type:"step",step:"app.schema",status:"skip",message:"Schema not checked against migrations (Prisma needs a shadow database; --verbose shows how)",data:{engine:n}});return}if(!i&&!t.resources?.d1?.length||n!=="drizzle")return;let s;try{s=(await X(e,"drizzle-kit","drizzle-kit")).binPath}catch{o("drizzle-kit isn't installed",{fix:"add drizzle-kit to devDependencies"});return}let a=t.migrations?.config,p=await Ze(e,a?[a]:Qe);if(!p){o(a?`no ${a} (migrations.config)`:"no drizzle.config.ts",a?{}:{detail:'An app whose drizzle config lives elsewhere sets migrations.config to its path; an app that writes its SQL by hand sets migrations.engine to "d1-sql".'});return}r.emit({type:"step",step:"app.schema",status:"start",message:"Checking the schema..."});let d=k.resolve(e,t.migrations?.dir??"drizzle");le(e,".everyapp/"),await v.mkdir(k.join(e,".everyapp"),{recursive:!0});let u=await v.mkdtemp(k.join(e,".everyapp","schema-check-")),y=q({sync:()=>Je(u,{recursive:!0,force:!0})});try{let m=k.join(u,"migrations");await v.cp(d,m,{recursive:!0}).catch(async h=>{if(h.code!=="ENOENT")throw h;await v.mkdir(m)});let f=new Set(await ve(m)),E=k.join(u,"drizzle.config.ts");await v.writeFile(E,[`import config from ${JSON.stringify(p)};`,`export default { ...config, out: ${JSON.stringify(k.relative(e,m).split(k.sep).join("/"))} };`,""].join(`
11
+ `));let b=k.join(u,"report-failure.cjs");await v.writeFile(b,["const report = console.error;","console.error = (...args) => {"," if (args.some((arg) => arg instanceof Error)) process.exitCode = 1;"," report(...args);","};",""].join(`
12
+ `));let c=await Xe(process.execPath,["--require",b,s,"generate","--config",E],{cwd:e,stdin:"ignore",reject:!1,timeout:ke,env:{NODE_NO_WARNINGS:"1"}});if((await ve(m)).filter(h=>!f.has(h)).length>0)throw new l("SCHEMA_DRIFT",`The schema has changes no migration covers
13
+ drizzle-kit would write a new migration for them. Nothing was migrated or uploaded.`,{rerun:"pnpm db:generate",rerunNote:"then run this again"});if(c.failed){let h=c.stderr.split(`
14
+ `).map(R=>R.trim()).filter(Boolean),j=h.find(R=>/^\w*Error\b/.test(R))??h.at(-1)??(c.timedOut?`no answer in ${ke/1e3} s`:`exit ${c.exitCode}`);throw new l("SCHEMA_CHECK_FAILED",`drizzle-kit couldn't compare the schema with the migrations
15
+ ${j}. Nothing was migrated or uploaded.`,{rerun:"pnpm db:generate",rerunNote:"in a terminal; it asks about renamed columns and tables"})}r.emit({type:"step",step:"app.schema",status:"ok",message:"The schema matches the migrations."})}finally{await v.rm(u,{recursive:!0,force:!0}),y()}}async function Ze(e,t){for(let r of t){let n=k.join(e,r);try{if((await v.stat(n)).isFile())return n}catch{}}return null}async function ve(e){return(await v.readdir(e,{recursive:!0,withFileTypes:!0})).filter(r=>r.isFile()&&r.name.endsWith(".sql")).map(r=>k.relative(e,k.join(r.parentPath,r.name)))}var et=6e5,Ae={EVERYAPP_BUILD:"1"};async function Qt({cwd:e,cf:t,buildCommand:r,verbose:n}){if(r){await Z(r,[],{cwd:e,env:{...process.env,...Ae,NODE_OPTIONS:J(process.env.NODE_OPTIONS)},shell:!0,echo:n,what:"Build",code:"BUILD_FAILED"});return}await t.run({args:["build"],plane:"project",cwd:e,mode:"text",env:Ae,timeoutMs:et,...n?{onOutput:i=>void process.stderr.write(i)}:{}}).catch(i=>{throw i instanceof K?new l("BUILD_FAILED",["Build failed","cf build's last lines:",...V(i.stdout,i.stderr).map(o=>` ${o}`)].join(`
16
+ `)):i})}import tt from"node:fs/promises";import M from"node:path";var rt=new Set(["text","json","secret","version-metadata","assets","d1","kv","r2","durable-object","workflow","worker","hyperdrive","vectorize","ai","browser","images"]);function Re(e,t){return e==="EVERY_APP_GATEWAY"&&t.worker===H&&t.exportName==="AppGateway"}function F(e,t){return e===t||e.startsWith(`${t}${S}`)}function nt(e,t){let{workerName:r,helperWorkers:n=[]}=t,i=[];e.name!==r&&i.push(`its name is "${e.name}", not "${r}"`),i.push(...Se(e));let o=e.env??{};for(let a of["EVERYAPP_IDENTITY_PUBLIC_KEYS","EVERYAPP_IDENTITY_ISSUER"])o[a]?.type!=="text"&&i.push(`${a} isn't built in`);let s=o.EVERYAPP_AUDIENCE;return(s?.type!=="text"||s.value!==r)&&i.push(`EVERYAPP_AUDIENCE isn't the Worker's name ("${r}")`),i.push(...Oe(o,t,(a,p)=>Re(a,p)||n.includes(String(p.worker))),..._e(e.exports??{},t.deletedDurableObjects??[],r)),i}function it(e,t,r){let n=[];return e.name!==t&&n.push(`its name is "${e.name}", not "${t}"`),n.push(...Se(e),...Oe(e.env??{},r,Re),..._e(e.exports??{},[],r.workerName)),n}function Se(e){let t=[];e.workersDev!==!1&&t.push("workersDev isn't false"),e.previewUrls!==!1&&t.push("previewUrls isn't false"),e.domains?.length&&t.push("it declares domains (apps are served through the gateway)");for(let r of e.triggers??[])r.type!=="scheduled"&&t.push(r.type==="fetch"?"it declares routes (apps are served through the gateway)":`it declares a trigger of type "${String(r.type)}" (apps may only declare cron schedules)`);return e.env?.EVERYAPP_DEV&&t.push("EVERYAPP_DEV is set, which only `everyapp dev` may do"),t}function Oe(e,{workerName:t,resources:r,helperWorkers:n=[],declared:i},o){let s=[],a=new Set([t,...n]),p=new Set(Object.values(r.d1??{}).map(c=>c.id)),d=new Set(Object.values(r.kv??{}).map(c=>c.id)),u=new Set(Object.values(r.hyperdrive??{}).map(c=>c.id)),y=new Set(Object.values(r.vectorize??{}).map(c=>c.name)),m=Object.values(r.r2??{}).map(c=>c.name),f=i?.ai??[],E=i?.browser??[],b=i?.images??[];for(let[c,g]of Object.entries(e)){if(!rt.has(String(g.type))){s.push(`${c} is a ${String(g.type)} binding, which Every App apps can't use`);continue}switch(g.type){case"worker":o(c,g)||s.push(`${c} binds Worker "${String(g.worker)}"; apps may only bind the gateway's AppGateway and, from the app's own Worker, its helper Workers`);break;case"durable-object":a.has(String(g.worker))||s.push(`${c} binds another Worker's Durable Object ("${String(g.worker)}")`);break;case"d1":p.has(String(g.id))||s.push(`${c} isn't a D1 database the deploy provisioned`);break;case"kv":d.has(String(g.id))||s.push(`${c} isn't a KV namespace the deploy provisioned`);break;case"hyperdrive":u.has(String(g.id))||s.push(`${c} isn't a Hyperdrive config the deploy provisioned`);break;case"vectorize":y.has(String(g.name))||s.push(`${c} is Vectorize index "${String(g.name)}", which isn't one the deploy provisioned`);break;case"ai":f.includes(c)||s.push(f.length>0?`${c} is a Workers AI binding, which isn't one of the app's in resources.ai (${f.join(", ")})`:`${c} is a Workers AI binding, which everyapp.config.ts doesn't declare; list it in resources.ai`);break;case"browser":E.includes(c)||s.push(E.length>0?`${c} is a Browser Rendering binding, which isn't one of the app's in resources.browser (${E.join(", ")})`:`${c} is a Browser Rendering binding, which everyapp.config.ts doesn't declare; list it in resources.browser`);break;case"images":b.includes(c)||s.push(b.length>0?`${c} is an Images binding, which isn't one of the app's in resources.images (${b.join(", ")})`:`${c} is an Images binding, which everyapp.config.ts doesn't declare; list it in resources.images`);break;case"r2":{let h=String(g.name??"");m.length>0?m.includes(h)||s.push(`${c} is bucket "${h}", which isn't one of the app's buckets in resources.r2 (${m.join(", ")})`):F(h,t)||s.push(`${c} is bucket "${h}"; an app's buckets are named after its Worker (${t} or ${t}${S}<name>)`);break}case"workflow":{let h=String(g.name??"");(!a.has(String(g.worker))||!F(h,t))&&s.push(`${c} binds Workflow "${h}" of Worker "${String(g.worker)}"; an app binds only its own Workflows, named after its Worker (${t}${S}<name>)`);break}}}return s}function _e(e,t,r){let n=[];for(let[i,o]of Object.entries(e))if(o.type!=="worker"){if(o.type==="workflow"){let s=String(o.name??"");F(s,r)||n.push(`Workflow ${i} is named "${s}"; an app's Workflows are named after its Worker (${r}${S}<name>)`);continue}if(o.type!=="durable-object"){n.push(`export ${i} is a ${String(o.type)}, which Every App apps can't declare`);continue}switch(o.container!==void 0&&n.push(`Durable Object class ${i} is backed by a container, which Every App apps can't run`),o.state??"created"){case"created":case"renamed":break;case"deleted":t.includes(i)||n.push(`Durable Object class ${i} is marked deleted, which deletes its data; remove it from everyapp.config.ts and deploy with --allow-delete-durable-object-data instead`);break;case"transferred":n.push(`Durable Object class ${i} would move its data to Worker "${String(o.transferredTo)}"`);break;case"expecting-transfer":n.push(`Durable Object class ${i} would take the data of Worker "${String(o.transferFrom)}"'s class`);break;default:n.push(`Durable Object class ${i} has state "${o.state}", which everyapp doesn't deploy`)}}return n}async function or({cwd:e,inputs:t}){if(!await L(M.join(e,oe)))throw new l("APP_POLICY","The app's Build Output isn't a production build. The manifest's build command must run `cf build` (production by default).");let r=await ot(e),n=t.helperWorkers??[],i=[],o=r.get(D);if(!o)throw new l("APP_POLICY","The app's Build Output has no default Worker. Build it from everyAppWorker() in cloudflare.config.ts.");i.push(...nt(o.config,t));for(let[a,{config:p}]of r){if(a===D)continue;let d=String(p.name);if(!n.includes(d)){i.push(`the build has a Worker "${d}" that everyapp.config.ts doesn't declare in workers`);continue}i.push(...it(p,d,t).map(u=>`${d}: ${u}`))}for(let a of n)[...r.values()].some(({config:p})=>p.name===a)||i.push(`the build has no Worker ${a}, which everyapp.config.ts declares; add it to the Vite plugin's auxiliaryWorkers with everyAppAuxiliaryWorker()`);if(i.length>0)throw new l("APP_POLICY",`The built Worker can't be deployed as an Every App app:
17
+ - ${i.join(`
18
+ - `)}
19
+ Build it from everyAppWorker() in cloudflare.config.ts.`);let s={};for(let[a,{config:p,directory:d}]of r){if(a!==D){let u=String(p.name);s[u]=$e(p,u)}if(p.manifest){let u={...p.manifest.modules??{}};for(let y of await ce(M.join(d,"bundle")))u[y]={type:"sourcemap"};p.manifest={...p.manifest,modules:u}}pe(p),await tt.writeFile(M.join(d,"worker.config.json"),`${JSON.stringify(p,null,2)}
20
+ `)}return{workflows:$e(o.config,t.workerName),helperWorkflows:s,r2Buckets:[...new Set([...r.values()].flatMap(({config:a})=>st(a)))].sort()}}function st(e){let t=e.env??{};return Object.values(t).filter(r=>r?.type==="r2"&&typeof r.name=="string").map(r=>r.name)}function $e(e,t){let r=[...Object.values(e.exports??{}).filter(n=>n.type==="workflow").map(n=>String(n.name)),...Object.values(e.env??{}).filter(n=>n.type==="workflow"&&n.worker===t).map(n=>String(n.name))];return[...new Set(r)]}async function ot(e){let t=new Map;for await(let{name:r,config:n,directory:i}of ae(e))t.set(r,{config:n,directory:i});return t}export{Gt as a,Qt as b,or as c,z as d,Tt as e,jt as f,xt as g};
@@ -1 +1 @@
1
- import{Bb as r}from"./chunk-LYNBZ7RV.js";var s="[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?",a=new RegExp(`^(?=.{1,253}$)(?:${s}\\.)+${s}$`);function o(n){return a.test(n)}function f(n){if(n===void 0)return;let e=n.trim().toLowerCase().replace(/^https?:\/\//,"").replace(/[/?#].*$/,"").replace(/\.$/,"");if(!o(e))throw new r("INVALID_DOMAIN",`${n} isn't a full hostname`,{fix:"use a name like apps.example.com"});return e}function l(n,e){if(!n.endsWith(`.${e}`))return!1;let t=n.slice(0,-(e.length+1));return t.length>0&&!t.includes(".")&&o(n)}function c(n,e){return n.filter(t=>l(t,e))}function d(n){let e=n.split("."),t=[];for(let i=0;i<=e.length-2;i+=1)t.push(e.slice(i).join("."));return t}export{f as a,l as b,c,d};
1
+ import{Ub as r}from"./chunk-NXO2BC3M.js";var s="[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?",a=new RegExp(`^(?=.{1,253}$)(?:${s}\\.)+${s}$`);function o(n){return a.test(n)}function f(n){if(n===void 0)return;let e=n.trim().toLowerCase().replace(/^https?:\/\//,"").replace(/[/?#].*$/,"").replace(/\.$/,"");if(!o(e))throw new r("INVALID_DOMAIN",`${n} isn't a full hostname`,{fix:"use a name like apps.example.com"});return e}function l(n,e){if(!n.endsWith(`.${e}`))return!1;let t=n.slice(0,-(e.length+1));return t.length>0&&!t.includes(".")&&o(n)}function c(n,e){return n.filter(t=>l(t,e))}function d(n){let e=n.split("."),t=[];for(let i=0;i<=e.length-2;i+=1)t.push(e.slice(i).join("."));return t}export{f as a,l as b,c,d};
@@ -0,0 +1,34 @@
1
+ import{a as hr,b as br,c as Cr,e as Ee}from"./chunk-4MMHVIHT.js";import{a as N,b as O,c as Rr,d as Er,e as Ar,f as Ir,g as Nr,h as X,i as $r}from"./chunk-HHVABFYD.js";import{b as Sr,c as Or}from"./chunk-DB5CMXEV.js";import{a as wr,d as yr,e as Re}from"./chunk-SMCUCFS4.js";import{a as vr,b as kr}from"./chunk-BHMRY53V.js";import{b as Lt}from"./chunk-WTKBB5HE.js";import{a as xt}from"./chunk-LTYAIGEB.js";import{a as Ot,b as Ct,d as ge,e as Dt,m as _t,q as Pt}from"./chunk-CGFABBZA.js";import{a as qt,b as Yt,c as Jt,d as Zt,e as Xt}from"./chunk-YCADEJVJ.js";import{b as pr,c as cr,d as lr,f as dr,g as ve,h as mr,j as ur,l as fr,m as Z,n as ke,p as gr}from"./chunk-Y6CGMZEB.js";import{b as nr,c as ir,d as ar,e as or,g as sr}from"./chunk-Q44H7KLY.js";import{d as jt,e as Vt,f as Bt,g as Kt,m as Ht}from"./chunk-ZH6IAPVK.js";import{n as Ft}from"./chunk-ONGI463M.js";import{a as Qt,b as er,c as tr,d as rr,g as be}from"./chunk-WV4G6E4T.js";import{P as gt}from"./chunk-XEPXX3AI.js";import{c as Tt,e as we,f as Mt}from"./chunk-J2XKGQO7.js";import{a as D,b as F,e as fe,f as T,g as St,h as M}from"./chunk-IWP4Q3KV.js";import{c as S,d as he,e as Wt,h as H,i as Ut}from"./chunk-475IB5UG.js";import{b as zt}from"./chunk-RXSJENSN.js";import{g as ft}from"./chunk-ZCJTJDAI.js";import{aa as kt,ha as Rt,ja as Et,ka as At,m as wt,n as yt,o as ht,p as bt,ra as It,ta as Nt,u as vt}from"./chunk-OHDR7JWQ.js";import{f as ue}from"./chunk-LTMQP62I.js";import{a as J,e as Gt,f as ye}from"./chunk-KTX5YGBL.js";import{a as dt,b as mt,h as ut}from"./chunk-MLZJBYSY.js";import{Ab as Ye,Bb as Je,Fb as Ze,Gb as Xe,H as He,Mb as de,Nb as Qe,Ob as et,Pc as $t,Qb as tt,Rb as rt,Ub as m,Vb as nt,Wb as it,Xb as at,Yb as ot,_b as K,b as ce,c as I,d as $,jc as st,k as le,nc as me,sc as pt,wb as qe,wc as ct,yc as lt}from"./chunk-NXO2BC3M.js";import Vr from"node:path";import en from"chalk";async function Dr({whoami:e,discovery:n,out:i,offer:t}){let{deps:o}=t,a=t.accountId?["--account-id",t.accountId]:[];if(!o.interactive){let u=await tn(e,t).catch(()=>null),y=[I,"setup","--domain",u??"<hostname>",...a].join(" ");throw new nt("install_gateway",`Install a Gateway first: ${rn(n)}
2
+ Apps deploy behind one. Setup needs a person once, to create the owner account.`,void 0,{rerun:y,data:{accounts:n.probed,...u?{domain:u}:{}}})}let r=await ue({whoami:e,flag:t.accountId,interactive:!0}),s=r.name??r.id,p=await Re(o.createCf(r.id),r.id),w=`apps.${p.length===1?p[0]:await o.prompts.pickZone(p)}`;if(t.yes)ut(en.dim(`${s} has no Gateway yet, so --yes installs one at ${w} first.`));else if(!await(t.confirm??mt)(`Install a Gateway at ${w}?`,[`${s} has no Gateway yet. Apps deploy behind one, so it's installed first.`]))throw new it(`Cancelled. Nothing deployed.
3
+ Apps deploy behind a Gateway. To install one elsewhere: ${[I,"setup","--domain","<hostname>",...a].join(" ")}`);return await yr({whoami:e,discovery:n,flags:{domain:w,"account-id":r.id,"force-dns":t.forceDns,yes:t.yes,verbose:t.verbose},out:i,deps:o}),vt({whoami:e,createCf:o.createCf,accountId:r.id,interactive:!0})}async function tn(e,n){let i=await ue({whoami:e,flag:n.accountId,interactive:!1});return`apps.${(await Re(n.deps.createCf(i.id),i.id))[0]}`}function rn(e){let n=e.probed.map(i=>i.name??i.id);return n.length===1?`${n[0]} has none yet`:`none of ${n.join(", ")} has one yet`}import nn from"node:fs/promises";var _r=64,an=["d1","kv","hyperdrive","r2","vectorize"];function on(e){return an.includes(e)}function sn(e,n){let i=structuredClone(e),t=i.name===S.workerName,o=i.env??{};for(let[p,l]of Object.entries(o))pn(p,l,n);n.shared&&o.EVERY_APP_ORG_ID&&(delete o.EVERY_APP_ORG_ID,o.EVERYAPP_SHARED={type:"text",value:"1"});let a=JSON.stringify([S.publicKey]),r=Ae(i,p=>p===a?JSON.stringify(n.identityPublicKeys):p.replaceAll(S.gatewayUrl,()=>n.gatewayUrl).replaceAll(S.accountId,()=>n.accountId).replaceAll(S.organizationId,()=>n.organizationId).replaceAll(S.workerName,()=>n.workerName));if(t&&n.deletedDurableObjects?.length){let p=r.exports??={};for(let l of n.deletedDurableObjects){if(p[l])throw new m("APP_POLICY",`Durable Object class ${l} is both exported by the build and being deleted; declare it in everyapp.config.ts, or stop exporting it.`);p[l]={type:"durable-object",state:"deleted"}}}let s=Tr(r);if(s.length>0)throw new m("INSTALL_PLACEHOLDER_LEFT",`The build of ${String(r.name)} still holds a build placeholder after installing it, at ${s.join(", ")}. Build the Worker from everyAppWorker() in cloudflare.config.ts, and leave its names, keys and ids to the deploy.`);return ln(r),r}async function Pr({cwd:e,target:n}){for await(let{file:i,config:t}of Ft(e))await nn.writeFile(i,`${JSON.stringify(sn(t,n),null,2)}
4
+ `)}function pn(e,n,i){if(n.type==="json"){cn(e,n,i);return}let t=String(n.type);if(!on(t))return;let o=he(e);if(n[t==="kv"||t==="hyperdrive"?"id":"name"]!==o)return;let r=i.resources[t]?.[e];if(!r)throw new m("INSTALL_INPUTS_MISSING",`The build binds ${D[t]} ${e}, which the deploy didn't provision`,{fix:"declare it in everyapp.config.ts's resources"});Object.assign(n,r)}function cn(e,n,i){let t=n.value;if(typeof t!="object"||t===null||Array.isArray(t)||t.id!==he(e))return;let o=i.resources.aiGateway?.[e];if(!o)throw new m("INSTALL_INPUTS_MISSING",`The build binds ${D["ai-gateway"]} ${e}, which the deploy didn't provision`,{fix:"declare it in everyapp.config.ts's resources.aiGateway"});n.value={id:o.id,accountId:o.accountId,url:o.url}}function Ae(e,n){return typeof e=="string"?n(e):Array.isArray(e)?e.map(i=>Ae(i,n)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([i,t])=>[i,Ae(t,n)])):e}function Tr(e,n=""){let i=[S.workerName,S.accountId,S.organizationId,S.gatewayUrl,S.publicKey].flatMap(o=>[o,JSON.stringify(o).slice(1,-1)]),t=o=>i.some(a=>o.includes(a));return typeof e=="string"?t(e)?[n||"(root)"]:[]:e&&typeof e=="object"?Object.entries(e).flatMap(([o,a])=>{let r=n?`${n}.${o}`:o;return t(o)?[r]:Tr(a,r)}):[]}function ln(e){let n=[...Object.entries(e.env??{}),...Object.entries(e.exports??{})].filter(([,i])=>i.type==="workflow");for(let[i,t]of n){let o=String(t.name);if(o.length>_r)throw new m("WORKFLOW_NAME_TOO_LONG",`${i} would be the Workflow "${o}", longer than Cloudflare's ${_r} characters`,{fix:"shorten its binding name in everyapp.config.ts"})}}async function Mr({cf:e,names:n,appId:i,out:t}){let o=[];for(let a of[...new Set(n)].sort()){try{if(await Sr(e,a))continue;await Or(e,a)}catch(r){if(K(r,"already_exists"))continue;throw K(r,"r2_not_enabled")?new m("R2_NOT_ENABLED",`R2 isn't enabled in this Cloudflare account, and ${i} needs an R2 bucket (${a})
5
+ Enable it once in the dashboard: R2 Object Storage \u2192 Get started (free until something is stored).`,{fix:"enable R2 in the Cloudflare dashboard (R2 Object Storage)",rerun:$()}):r}o.push(a),t.emit({type:"progress",step:"app.build",message:`Created R2 bucket "${a}".`,data:{bucket:a}})}return o}async function Ne({cf:e,gatewayDb:n,registration:i},t){let o=t?.name??"",a=t?.workerName??i.workerName;if(!(await F(n,i.workerName)).some(s=>s.kind==="worker"&&s.binding===o)){if(await Tt(e,a)!==null)throw new m("WORKER_NAME_TAKEN",`A Worker named ${a} already exists in this Cloudflare account
6
+ No deploy of this app created it; it may belong to another Gateway or project.`,{fix:"delete or rename it",rerun:$()});await T(n,i.workerName,{kind:"worker",binding:o,name:a,resourceId:a})}}async function xr(e){let{cf:n,registration:i,manifest:t}=e,o=await F(e.gatewayDb,i.workerName),a=async()=>{let g=t.resources?.aiGateway??[];if(g.length===0)return{};let h={};for(let{name:d,...A}of g){let R=await un({...e,owned:o,binding:d,settings:A});h[d]={id:R,accountId:e.accountId,url:Wt(e.accountId,R)}}return{aiGateway:h}},r=(g,h)=>$e({...e,owned:o,kind:g,binding:h,name:Ie(i,g,h),find:g==="d1"?d=>wt(n,d):d=>ht(n,d),create:g==="d1"?d=>yt(n,d):d=>bt(n,d)}),s={};for(let g of t.resources?.d1??[])s[g]={name:Ie(i,"d1",g),id:await r("d1",g)};let p={};for(let g of t.resources?.kv??[])p[g]={id:await r("kv",g)};let l=t.resources?.r2??[],w=l.length?{r2:Object.fromEntries(l.map(g=>[g,{name:Ie(i,"r2",g)}]))}:{},u=t.resources?.hyperdrive??[],y=async()=>dn({...e,owned:o});if(u.length===0)return{d1:s,kv:p,...w,...await y(),...await a()};let f=new Map(u.map(({name:g})=>{let h=Nr(e.secrets??{},t,g);return[g,h?X(h.url,h.variable):null]})),b={};for(let{name:g,caching:h="off"}of u)b[g]={id:await gn({...e,owned:o,binding:g,name:fn(i.workerName,g),origin:f.get(g)??null,originVariables:Ar(g,u.length),caching:h})};return{d1:s,kv:p,...w,hyperdrive:b,...await y(),...await a()}}async function dn(e){let{cf:n,registration:i,manifest:t}=e,o=t.resources?.vectorize??[];if(o.length===0)return{};let a=o.map(s=>({binding:s.name,name:Qe(i.workerName,s.name),shape:mn(s)}));for(let{binding:s,name:p}of a)if(p.length>de)throw new m("VECTORIZE_NAME_TOO_LONG",`${s} would be the Vectorize index "${p}", longer than Cloudflare's ${de} characters`,{fix:"shorten its binding name in everyapp.config.ts"});let r={};for(let{binding:s,name:p,shape:l}of a){let w=null;await $e({...e,kind:"vectorize",binding:s,name:p,find:async y=>(w=await mr(n,y),w?.name??null),create:async y=>(await ur(n,y,l)).name});let u=w;if(u&&!fr(u,l))throw new m("VECTORIZE_CONFIG_MISMATCH",`Vectorize index "${p}" has ${Z(u.config??{})}, but everyapp.config.ts declares ${Z(l)} for ${s}
7
+ An index can't be reshaped once it is created.`,{fix:`rename the binding in everyapp.config.ts to make a new one, or change ${s} back to ${Z(u.config??{})}`,rerun:$()});r[s]={name:p}}return{vectorize:r}}function mn(e){return e.preset!==void 0?{preset:e.preset}:{dimensions:e.dimensions,metric:e.metric}}async function un(e){let{cf:n,registration:i,binding:t,settings:o,onChanged:a}=e,r=rt(i.workerName,t);if(!tt(r))throw new m("INVALID_MANIFEST",`resources.aiGateway: ${t} would be the AI Gateway "${r}", which Cloudflare refuses (lowercase letters and digits joined by single hyphens, at most ${et} characters)`,{fix:"shorten the binding name in everyapp.config.ts"});let s={found:null};await $e({...e,kind:"ai-gateway",name:r,find:async l=>(s.found=await ar(n,l),s.found?.id??null),create:async l=>(await or(n,l,o)).id});let p=s.found;if(p&&!ir(p,o)){await sr(n,p,o);let l=M({kind:"ai-gateway",name:r}),w=nr(o);(p.collect_logs??!1)!==w.collectLogs&&a?.(w.collectLogs?`Turned on request logs on ${l} (collectLogs).`:`Turned off request logs on ${l} (collectLogs: false).`),(p.cache_ttl??0)!==w.cacheTtl&&a?.(w.cacheTtl===0?`Turned off response caching on ${l} (no cacheTtl).`:`Set ${l} to cache responses for ${w.cacheTtl} s (cacheTtl).`)}return r}function fn(e,n){return`${e}${Xe}${n.toLowerCase().replaceAll("_","-")}`}async function gn(e){let{cf:n,gatewayDb:i,registration:t,owned:o,binding:a,name:r,origin:s,originVariables:p,caching:l}=e,{onRecreated:w,onChanged:u}=e,{workerName:y}=t,f={kind:"hyperdrive",binding:a,name:r},b=M(f),g=Er(a),h=o.find(R=>R.kind==="hyperdrive"&&R.binding===a&&R.name===r),d=await pr(n,r),A=async R=>{let _=s!==null&&!ve(R,s),x=!dr(R,l);!_&&!x||(await lr(n,R.id,{..._?{origin:s}:{},...x||l==="off"?{caching:l}:{}}),_&&u?.(`Pointed ${b} at the database in ${N}.`),x&&u?.(l==="off"?`Turned off query caching on ${b} (Hyperdrive never invalidates a cached read when the app writes; caching: "default" in everyapp.config.ts turns it on).`:`Turned on Hyperdrive's query caching on ${b} (caching: "default").`))};if(h?.resourceId){if(d?.id===h.resourceId)return await A(d),d.id;if(d)throw Gr(f,h.resourceId);w?.(b,f.kind)}else if(h){if(d)return await T(i,y,{...f,resourceId:d.id}),await A(d),d.id}else if(d){if(s&&ve(d,s))return await T(i,y,{...f,resourceId:d.id}),u?.(`Adopted ${b}, which connects to the database in ${N}.`),await A(d),d.id;throw new m("RESOURCE_NAME_TAKEN",`A Hyperdrive config named "${r}" already exists in this Cloudflare account
8
+ No deploy of this app created it.`,{fix:`to use it, set ${g} in ${N} to the URL of the database it connects to; otherwise delete or rename it`,rerun:$()})}if(!s)throw new m("HYPERDRIVE_ORIGIN_MISSING",`${a} needs the database its Hyperdrive config connects to
9
+ Creating the config needs its URL, from ${N} on the machine that deploys; nothing in that file reaches the Worker.`,{fix:`set ${Ir(p)} in ${N} to postgres://<user>:<password>@<host>:<port>/<database>`,rerun:$(),data:{binding:a,variables:p,file:N}});return Lr(e,f,()=>cr(n,r,s,l))}function Ie(e,n,i){let t=e.resources[n][i];if(!t||Ze(t))throw new m("RESOURCE_NAME_MISSING",`The Gateway assigned no usable ${D[n]} name for binding ${i}`,{rerun:`${I} setup`,rerunNote:"to upgrade the Gateway"});return t}async function $e(e){let{gatewayDb:n,registration:i,owned:t,kind:o,binding:a,name:r,find:s,create:p,onRecreated:l}=e,{workerName:w}=i,u={kind:o,binding:a,name:r},y=t.find(b=>b.kind===o&&b.binding===a&&b.name===r),f=await s(r);if(y?.resourceId){if(f===y.resourceId)return f;if(f)throw Gr(u,y.resourceId);l?.(M(u),o)}else if(y){if(f)return await T(n,w,{...u,resourceId:f}),f}else if(f)throw new m("RESOURCE_NAME_TAKEN",`${/^[AEIOU]/.test(D[o])?"An":"A"} ${D[o]} named "${r}" already exists in this Cloudflare account
10
+ No deploy of this app created it; it may belong to another Gateway, app or project.`,{fix:"delete or rename it",rerun:$()});return Lr(e,u,()=>p(r))}async function Lr({gatewayDb:e,registration:n,onCreated:i},t,o){let{workerName:a}=n;await T(e,a,{...t,resourceId:null});let r;try{r=await o()}catch(s){throw K(s,"already_exists")?(await St(e,a,{kind:t.kind,binding:t.binding}),new m("RESOURCE_NAME_TAKEN",`${M(t)} was created by someone else while this deploy was creating it`,{fix:"delete or rename it",rerun:$()})):s}return await T(e,a,{...t,resourceId:r}),i?.(M(t),t.kind),r}function Gr(e,n){return new m("RESOURCE_REPLACED",`${M(e)} isn't the one this app created
11
+ That one (${n}) was deleted, and this one was created by someone else since.`,{fix:"delete or rename it",rerun:$()})}function Se(e,n){return(n.resources?.workflows??[]).map(i=>({binding:i.name,className:i.className,name:Ut(e,i.name),worker:i.worker?H(e,i.worker):e}))}async function Wr({cf:e,workerName:n,names:i}){for(let t of i){let o=await ke(e,t);if(o&&o.script_name!==n)throw new m("WORKFLOW_NAME_TAKEN",`A Workflow named "${t}" already exists in this Cloudflare account
12
+ It runs on Worker ${o.script_name??"(unknown)"}, not ${n}; deploying would take it over.`,{fix:"delete or rename it",rerun:$()})}}async function Ur({cf:e,workerName:n,previousManifest:i,names:t}){let o=qe.safeParse(i);if(!o.success)return[];let a=[];for(let r of Se(n,o.data))t.includes(r.name)||(await ke(e,r.name))?.script_name===r.worker&&a.push(r);return a}import{execa as wn}from"execa";var yn=10*6e4;function Q({packageName:e,binName:n,env:i={},missing:t}){return async({args:o,cwd:a,env:r})=>{let s;try{s=(await st(a,e,n)).binPath}catch{throw t()}let p=await wn(process.execPath,[s,...o],{cwd:a,env:{NODE_NO_WARNINGS:"1",...i,...r},stdin:"ignore",reject:!1,timeout:yn});return{exitCode:p.timedOut?124:p.exitCode??1,stdout:String(p.stdout??""),stderr:String(p.stderr??"")}}}async function ee({run:e,args:n,cwd:i,databaseUrl:t,reasonPatterns:o,failed:a}){let{password:r}=X(t,O),s=await e({args:n,cwd:i,env:{[O]:t}});if(s.exitCode===0)return s.stdout;let l=$r(`${s.stderr}
13
+ ${s.stdout}`,[t,r,encodeURIComponent(r)]).split(`
14
+ `).map(u=>u.trim()).filter(Boolean),w=o.map(u=>l.find(y=>u.test(y))).find(u=>u!==void 0);throw a(w??l.at(-1)??`exit ${s.exitCode}`)}function hn(){return Q({packageName:"drizzle-kit",binName:"drizzle-kit",missing:()=>new m("DRIZZLE_KIT_MISSING",`Postgres migrations need drizzle-kit, which isn't installed
15
+ Nothing was migrated or uploaded.`,{fix:"add drizzle-kit to devDependencies, then deploy again"})})}async function zr({cwd:e,databaseUrl:n,config:i,run:t=hn()}){await ee({run:t,args:["migrate",...i?["--config",i]:[]],cwd:e,databaseUrl:n,reasonPatterns:[/error/i],failed:o=>new m("MIGRATION_FAILED",`drizzle-kit couldn't migrate the Postgres database
16
+ ${o}. Nothing was uploaded.`,{fix:`check ${O} in ${N} and the migrations`})})}function bn(){return Q({packageName:"prisma",binName:"prisma",env:{PRISMA_HIDE_UPDATE_MESSAGE:"1"},missing:()=>new m("PRISMA_MISSING",`Prisma migrations need prisma, which isn't installed
17
+ Nothing was migrated or uploaded.`,{fix:"add prisma to devDependencies, then deploy again"})})}async function jr({cwd:e,databaseUrl:n,config:i,run:t=bn()}){return[...(await ee({run:t,args:["migrate","deploy",...i?["--config",i]:[]],cwd:e,databaseUrl:n,reasonPatterns:[/\bP\d{4}\b/,/error/i],failed:a=>new m("MIGRATION_FAILED",`prisma migrate deploy couldn't migrate the Postgres database
18
+ ${a}. Nothing was uploaded.`,{fix:`check ${O} in ${N}, prisma.config.ts (its datasource reads it) and the migrations`})})).matchAll(/^Applying migration `([^`]+)`/gm)].map(a=>a[1])}var vn=new Set(["pending","binding"]);async function Br(e){let n={rollback:null};try{return await kn(e,n)}catch(i){throw at(i,n.rollback)}}async function kn(e,n){let{cwd:i,out:t}=e,o=e.interactive??dt(e.json??!1),a=e.release,r=a?.manifest??e.manifest??await J(i),s=a?.dir??i;a&&An(r);let p=r.migrations?.dialect==="postgresql",l=p||r.resources?.hyperdrive?.length?await Rr(i):{};if(p&&!l[O])throw new m("POSTGRES_URL_MISSING",`${r.id} needs a Postgres URL to migrate its database
19
+ Format: postgres://<user>:<password>@<host>:<port>/<database>`,{fix:`set ${O} in ${N}, then deploy again`});let w=a?null:await kr(i);if(!a&&!w)throw new m("MISSING_CLOUDFLARE_CONFIG",vr);w&&!w.usesEveryAppWorker&&t.emit({type:"warning",code:"NONSTANDARD_CLOUDFLARE_CONFIG",message:`cloudflare.config.ts doesn't use everyAppWorker()
20
+ The deploy checks the Worker it builds against the app policy.`});let u=e.offerInstall,y=qt(e.reconcile,t,e.verbose);t.emit({type:"step",step:"app.connect",status:"start",message:"Finding your Gateway..."});let{cf:f,accountId:b,accountName:g,databaseId:h,db:d,install:A,gatewayUrl:R,deployer:_}=await Nt({gateway:e.gateway,accountId:e.accountId,interactive:o,login:{json:e.json,out:t,step:"app.login"},createCf:e.createCf,onNoGateway:u?({whoami:W,discovery:ie})=>Dr({whoami:W,discovery:ie,out:t,offer:{accountId:e.accountId,yes:u.yes,confirm:u.confirm,forceDns:e.forceDns,verbose:e.verbose,deps:{...wr({gateway:y,interactive:o}),...e.createCf?{createCf:e.createCf}:{},...u.setup}}}):void 0});t.emit({type:"step",step:"app.connect",status:"ok",data:{gatewayUrl:R}});let x=await xt(d,A);En(r,x,R);let[Fr,Oe]=await Promise.all([kt(d),Et(d,r.id)]),Ce=!Oe||vn.has(Oe.status);t.emit({type:"step",step:"app.deploy",status:"ok",message:`Deploying ${r.id}${a?` ${a.release.version} from ${Ee(a.origin)}`:""} to ${R}.`,data:{appId:r.id,organizationName:Fr?.organization.name??g,firstDeploy:Ce,gatewayUrl:R,gatewayHost:new URL(R).host,...a?{version:a.release.version,origin:Ee(a.origin),release:{version:a.release.version,gitSha:a.release.gitSha,origin:a.origin,sha256:a.release.sha256}}:{}}}),await Ht(A,y.source);let De=A.jwtPublicKey;if(!De)throw new m("IDENTITY_KEY_UNKNOWN",`The Gateway is missing its sign-in public key
21
+ App Workers need it to check who is signed in.`,{fix:"restore JWT_PUBLIC_KEY as in https://github.com/every-app/every-app/blob/main/docs/runbooks/key-rotation.md"});let{plan:E,organization:L,hasOwner:Hr,deployerGranted:qr}=await Yt(d,{manifest:r,install:A,deployer:_,accountName:g}),C=E.app.hostname,v=E.app.workerName,_e=E.kind!=="existing",Pe=Je(r,E.app.tier);if(Pe.length>0)throw new m("TIER_POLICY",`${r.id} can't be deployed as configured
22
+ ${Pe.join(`
23
+ `)}`,{fix:"change everyapp.config.ts, then deploy again"});let te=ct(r),re=lt(r);t.emit({type:"step",step:"app.register",status:"ok",message:`${_e?"Registered":"Updating"} ${r.id} as ${v} at https://${C} (${E.app.status}).`,data:{appId:r.id,workerName:v,hostname:C,status:E.app.status,existingApp:!_e,firstDeploy:Ce,defaultAccess:E.app.isDefault,deployerAccess:qr,hasOwner:Hr,publicRoutes:te,mcp:re,scope:E.app.scope,organizationId:L.id,organizationName:L.name,gatewayUrl:R}});let{outsideBase:z,newHost:Te}=await jt({cf:f,out:t,install:A,hostname:C,forceDns:e.forceDns,cfAsks:o&&t.verbose}),j=await ft({db:d,out:t},{workerName:v,appId:r.id,purpose:"app.deploy"}),V,ne,q=[];try{let W=In(E,r,e.allowDeleteDurableObjectData??!1),ie=await Nn({cf:f,plan:E,workerName:v,manifest:r,allowDelete:e.allowDeleteWorkflows??!1}),Le=!1,ae={cf:f,gatewayDb:d,registration:{workerName:v,resources:E.resources},onCreated:(c,k)=>{t.emit({type:"progress",step:"app.resources",message:`Created ${c}.`}),k==="hyperdrive"&&(Le=!0)},onRecreated:(c,k)=>t.emit({type:"warning",code:"RESOURCE_RECREATED",step:"app.resources",message:`The ${k==="d1"?"database":D[k]} ${r.id} used before is gone; creating a new, empty one
24
+ ${c} no longer exists in this Cloudflare account.`}),onChanged:c=>t.emit({type:"progress",step:"app.resources",message:c})},P=(r.workers??[]).map(c=>({name:c.name,workerName:H(v,c.name)}));t.emit({type:"step",step:"app.resources",status:"start",message:"Preparing the app's resources..."}),await Ne(ae);for(let c of P)await Ne(ae,c);let U=await At(d,E.app.id),oe=be(r).receives;!oe&&U.inbound.length>0&&t.emit({type:"warning",code:"EMAIL_INBOUND_UNDECLARED",step:"app.email",message:`everyapp.config.ts no longer declares inbound email; removing the app's mail routes
25
+ Its addresses (${U.inbound.join(", ")}) stay on the Gateway until you clear them.`,data:{rerun:`${I} email unset inbound`}});let B=await Qt({cf:f,gatewayDb:d,accountId:b,workerName:v,addresses:oe?U.inbound:[],interactive:o,enableRouting:e.enableEmailRouting,confirm:e.confirm}),Ge=await xr({...ae,manifest:r,secrets:l,accountId:b});if(t.emit({type:"step",step:"app.resources",status:"ok",message:"The app's resources are ready."}),Le){let c=r.resources?.hyperdrive?.some(k=>k.caching==="default")?"default":"off";t.emit({type:"step",step:"app.hyperdrive",status:"ok",message:"Created the app's Hyperdrive config.",data:{caching:c}})}!a&&r.install!==!1&&(t.emit({type:"step",step:"app.install",status:"start",message:"Installing dependencies..."}),await(e.installDeps??pt)({cwd:i,description:"Installing dependencies...",install:r.install,verbose:e.verbose??!1}),t.emit({type:"step",step:"app.install",status:"ok"}));let We={workerName:v,organizationId:L.id,accountId:b,gatewayUrl:R,identityPublicKeys:[De],resources:Ge,deletedDurableObjects:W,helperWorkers:P.map(c=>c.workerName),declared:r.resources};a||(t.emit({type:"step",step:"app.build",status:"start",message:"Building..."}),await br({cwd:i,cf:f,buildCommand:r.build,verbose:e.verbose??!1})),await Pr({cwd:s,target:We});let{workflows:Ue,helperWorkflows:ze,r2Buckets:Yr}=await Cr({cwd:s,inputs:We});await Mr({cf:f,names:Yr,appId:r.id,out:t});for(let c of[{workerName:v,names:Ue},...P.map(k=>({workerName:k.workerName,names:ze[k.workerName]??[]}))])await Wr({cf:f,...c});t.emit({type:"step",step:"app.build",status:"ok",message:`${a?"Installed the release":"Built the app"} and checked its Worker${P.length?"s":""}.`,data:{release:a!==void 0,workflows:[...Ue,...Object.values(ze).flat()]}}),a?t.emit({type:"progress",step:"app.schema",message:`The release's publisher checked its migrations against its schema when it packed ${r.id} ${a.release.version}.`}):await hr({cwd:i,manifest:r,out:t});let Jr=(await F(d,v)).filter(c=>c.kind==="worker"),je=c=>Jr.find(k=>k.binding===c)?.versionId,Zr={question:"Replace the version that's serving?",effect:"Migrations run first."};for(let c of[{workerName:v,shownAs:r.id,recordedVersionIds:[E.versionId,je("")]},...P.map(k=>({workerName:k.workerName,shownAs:`${r.id}'s ${k.name} Worker`,recordedVersionIds:[je(k.name)]}))])await Mt({cf:f,...c,interactive:o,confirm:e.confirm,change:Zr});await j.check(),n.rollback=await $n({cf:f,out:t,cwd:s,manifest:r,resources:Ge,accountId:b,registry:d,workerName:v,restoreCommand:`${I} db restore${a?` ${r.id}`:""}`,appSecrets:l,drizzleKit:e.drizzleKit,prisma:e.prisma});let Ve={GATEWAY_URL:R,EVERY_APP_ORG_ID:L.id};for(let c of P)await j.check(),t.emit({type:"step",step:"app.helper",status:"start",message:`Uploading ${c.workerName}...`,data:{name:c.name,workerName:c.workerName}}),await we({cf:f,cwd:s,workerName:c.workerName,buildOutputWorker:c.workerName,accountId:b,message:`everyapp ${ce} ${r.id} ${c.name}`,secrets:Ve,interactive:o,attach:t.verbose,out:t,step:"app.helper",onUploaded:k=>fe(d,v,k,c.name)}),t.emit({type:"step",step:"app.helper",status:"ok",message:`Uploaded ${c.workerName}.`,data:{name:c.name,workerName:c.workerName}});await j.check(),t.emit({type:"step",step:"app.upload",status:"start",message:`Uploading ${v}...`});let Be=await we({cf:f,cwd:s,workerName:v,accountId:b,message:`everyapp ${ce} ${r.id}`,secrets:Ve,interactive:o,attach:t.verbose,out:t,step:"app.upload",onUploaded:c=>fe(d,v,c)});if(!Be.versionId)throw new m("VERSION_UNKNOWN",`Cloudflare reports no version for ${r.id} after the upload`,{data:{workerName:v}});V=Be.versionId,t.emit({type:"step",step:"app.upload",status:"ok",message:`Uploaded version ${V}.`,data:{versionId:V}});for(let c of ie)await gr(f,c.name),t.emit({type:"step",step:"app.workflows",status:"ok",message:`Deleted the Workflow ${c.binding} (${c.name}) with its instances.`,data:{binding:c.binding,name:c.name}});let Ke=be(r).sends&&A.deploymentMode!=="hosted";if(B){await j.check(),t.emit({type:"step",step:"app.email",status:"start",message:`Routing ${r.id}'s mail...`,data:{removing:B.routes.length===0}});let{routed:c,removed:k}=await er({cf:f,gatewayDb:d,plan:B,onProgress:pe=>t.emit({type:"progress",step:"app.email",message:pe})}),Y={appId:r.id,workerName:v,senders:U.senders,routed:c,removed:k,sendersSettable:Ke},Fe=Y.sendersSettable?rr(Y.routed,Y.senders):[];t.emit({type:"step",step:"app.email",status:"ok",message:tr(Y),data:{addresses:c,removed:k,enabled:B.enable.map(({domain:pe})=>pe),...Fe.length>0?{replyHint:`To reply from ${Fe.join(", ")}, set up Email Sending, then: ${I} email set --sender`}:{}}})}!B&&oe&&U.inbound.length===0&&(t.emit({type:"step",step:"app.email",status:"skip",message:`${r.id} receives no mail yet.`}),q.push({command:`${I} email set --inbound <address>`,note:`routes mail to ${r.id}`})),Ke&&U.senders.length===0&&q.push({command:`${I} email set --sender '*@<domain>'`,note:`lets ${r.id} send as your domain`});let Xr=(E.previousManifest?.workers??[]).map(c=>String(c.name)).filter(c=>!P.some(k=>k.name===c));for(let c of Xr)t.emit({type:"warning",code:"HELPER_WORKER_KEPT",step:"app.upload",message:`Helper Worker ${c} is no longer in everyapp.config.ts, but it still runs
26
+ Its Worker is ${H(v,c)}.`,data:{fix:"delete that Worker in the Cloudflare dashboard"}});let se=await Ct(f,v).catch(c=>(t.emit({type:"progress",step:"app.secrets",message:`Couldn't list ${v}'s secrets: ${ot(c).split(`
27
+ `)[0]}`}),null));ne=await Rt(d,E.app.id,{versionId:V,manifest:r,actor:_.actor,email:_.email,source:a?"release":"cli",...se?{secretNames:se}:{}});let Qr=await Rn({cf:f,manifest:r,appId:r.id,secretNames:se,out:t,next:q,providers:x});await Lt(d,{appRowId:E.app.id,setup:Qr,deployer:_},t)}finally{await j.release()}await Jt({cf:f,db:d,databaseId:h,out:t,accountId:b,appId:r.id,workerName:v,publishHost:Te,interactive:o,forceDns:e.forceDns,seams:{...e.reconcile,openRelease:y.openRelease,source:y.source},verb:"deploy"});let G=`https://${C}`,Me=!z&&(e.waitForLive??!0),xe=await Zt({wait:Me,db:d,appRowId:E.app.id,appId:r.id,hostname:C,out:t,seams:e.live,message:`${r.id} is live at ${G}.`,verb:"deploy"});if(!xe){let W=z?"outside-base":Me?void 0:Te?"certificate":"first-visit";t.emit(ne==="active"&&!z?{type:"step",step:"app.live",status:"ok",message:`${r.id} is live at ${G}.`,data:{hostname:C,url:G}}:{type:"step",step:"app.live",status:"skip",message:`${r.id} isn't live yet: ${G}.`,data:{hostname:C,url:G,...W?{reason:W}:{}}})}return await gt({cf:f,db:d,install:A,out:t},{appId:r.id,surface:{publicRoutes:te.length>0,mcp:re!==null}}),z&&t.emit({type:"warning",code:"APP_HOST_OUTSIDE_BASE",step:"app.domain",message:`${C} isn't one label below ${A.appBaseDomain}
28
+ The Gateway only serves names directly under ${A.appBaseDomain}, so ${r.id} can't be reached.`}),{liveUrl:G,gatewayUrl:R,organizationId:L.id,organizationName:L.name,hostname:C,workerName:v,versionId:V,live:xe||ne==="active"&&!z,publicRoutes:te,mcp:re,next:q}}async function Rn({cf:e,manifest:n,appId:i,secretNames:t,out:o,next:a,providers:r}){if(!Dt(n,r))return ge({manifest:n,appId:i,gatewayNames:[],secretNames:[],lookup:r}).setup;let s=await Ot(e).catch(()=>null),{setup:p}=ge({manifest:n,appId:i,gatewayNames:s,secretNames:t,lookup:r});if(p.ready||!p.command)return p;let l=Pt(p),w=p.unmet.find(u=>u.why);return o.emit({type:"warning",code:"APP_NEEDS_SETUP",step:"app.secrets",message:[`${i} won't open until ${le(l)} ${l.length===1?"is":"are"} set`,...w?[_t(w)[0]]:[]].join(`
29
+ `),data:{setup:p}}),a.push({command:p.command.command,note:`asks for each; ${i} opens once they are set`}),p}function En(e,n,i){let t=Object.keys(e.capabilities??{}).filter(o=>!n.get(o));if(t.length>0){let o=He(n);throw new m("CAPABILITY_UNKNOWN",[`${e.id} lists ${le(t)} under capabilities, which ${i.replace(/^https:\/\//,"")} doesn't offer`,`Neither the built-in catalog nor the providers registered on this Gateway ${t.length===1?"has it":"have them"}. It offers: ${o.join(", ")}.`].join(`
30
+ `),{fix:`register ${t.length===1?"it":"each"} with ${I} provider add <spec.json or https URL> (or fix the id in everyapp.config.ts), then deploy again`,data:{unknown:t,offered:o}})}Ye(e,{capabilities:n})}function An(e){if(e.migrations?.dialect==="postgresql")throw new m("RELEASE_MIGRATIONS_UNSUPPORTED",`${e.id} can't deploy from a release: its Postgres migrations need the source`,{fix:`clone it, then run pnpm install in it and this checkout's ${I} deploy from its directory`})}function In(e,n,i){let t=new Map((n.resources?.durableObjects??[]).map(a=>[a.className,a.worker]));for(let a of e.previousManifest?.resources?.durableObjects??[]){let r=String(a.className),s=a.worker?String(a.worker):void 0;if(t.has(r)&&t.get(r)!==s)throw new m("DURABLE_OBJECT_MOVED",`${r} can't move to another Worker
31
+ A Durable Object's data can't follow it.`,{fix:"give the class a new name in everyapp.config.ts"});if(!t.has(r)&&s)throw new m("HELPER_DURABLE_OBJECT_REMOVED",`The helper Worker ${s} still defines ${r}
32
+ Removing a helper Worker's Durable Object class isn't supported yet.`,{fix:`keep declaring ${r} in everyapp.config.ts`})}let o=(e.previousManifest?.resources?.durableObjects??[]).map(a=>String(a.className)).filter(a=>!t.has(a));if(o.length>0&&!i){let a=o.length===1;throw new m("DURABLE_OBJECT_REMOVED",`Deploying would delete ${a?`${o[0]}'s data`:`the data of ${o.join(", ")}`} for good
33
+ everyapp.config.ts no longer declares the Durable Object class${a?"":"es"} ${o.join(", ")}.`)}return o}async function Nn({cf:e,plan:n,workerName:i,manifest:t,allowDelete:o}){let a=await Ur({cf:e,workerName:i,previousManifest:n.previousManifest,names:Se(i,t).map(r=>r.name)});if(a.length>0&&!o){let r=a.length===1;throw new m("WORKFLOW_REMOVED",`Deploying would delete the Workflow${r?"":"s"} ${a.map(s=>s.binding).join(", ")} and ${r?"its":"their"} instances
34
+ everyapp.config.ts no longer declares ${r?"it":"them"}. Renaming a binding renames its Workflow.`)}return a}async function $n({cf:e,out:n,cwd:i,manifest:t,resources:o,accountId:a,registry:r,workerName:s,restoreCommand:p,appSecrets:l,drizzleKit:w,prisma:u}){if(t.migrations?.dialect==="postgresql")return await Sn({out:n,cwd:i,manifest:t,appSecrets:l,drizzleKit:w,prisma:u}),null;let y=t.resources?.d1??[];if(y.length===0)return null;let f=Gt(y,t.migrations),b=o.d1?.[f]?.id,g=Vr.resolve(i,ye(t));if(!b||!await me(g))return Kr(n),null;n.emit({type:"step",step:"app.migrations",status:"start",message:"Migrating the database..."});let h=await Vt({cf:e,databaseId:b,accountId:a,dir:g,registry:r,target:zt(s),restoreCommand:p});return n.emit({type:"step",step:"app.migrations",status:"ok",message:h.applied.length>0?`Applied ${h.applied.join(", ")}.${Bt(h.rollback)}`:"The app's database is up to date.",data:Kt(h)}),h.rollback}async function Sn({out:e,cwd:n,manifest:i,appSecrets:t,drizzleKit:o,prisma:a}){let r=i.migrations?.engine==="prisma"?"prisma":"drizzle",s=r==="drizzle"?ye(i):i.migrations?.dir;if(s!==void 0&&!await me(Vr.resolve(n,s))){Kr(e);return}e.emit({type:"step",step:"app.migrations",status:"start",message:"Migrating the Postgres database...",data:{dialect:"postgresql",engine:r}});let p={cwd:n,databaseUrl:t[O],config:i.migrations?.config},l;r==="prisma"?l=await jr({...p,...a?{run:a}:{}}):await zr({...p,...o?{run:o}:{}}),e.emit({type:"step",step:"app.migrations",status:"ok",message:`Migrated the app's Postgres database (${r==="prisma"?"prisma migrate deploy":"drizzle-kit migrate"}).`,data:{dialect:"postgresql",engine:r,...l?{applied:l}:{}}})}function Kr(e){e.emit({type:"step",step:"app.migrations",status:"skip",message:"No migrations to apply."})}async function Ea(e){await $t(e,async n=>{let i=process.cwd(),t=await Br({cwd:i,manifest:await J(i),gateway:It(e.gateway),accountId:e["account-id"],out:n,json:e.json,verbose:e.verbose,allowDeleteDurableObjectData:e["allow-delete-durable-object-data"],allowDeleteWorkflows:e["allow-delete-workflows"],forceDns:e["force-dns"],enableEmailRouting:e["enable-email-routing"],waitForLive:!e["no-wait"],offerInstall:{yes:e.yes}});n.emit({type:"done",...On(t)})})}function On(e){return{data:{...Xt(e),organization:e.organizationName,publicRoutes:e.publicRoutes,mcp:e.mcp,...e.next.length>0?{next:e.next}:{}}}}export{Br as a,Ea as b,On as c};
@@ -1,2 +1,2 @@
1
- import{i as d}from"./chunk-ONLNJXVQ.js";import{e as g,f as c}from"./chunk-H7PDL3X5.js";import{a as m,e as y}from"./chunk-JYKRUS5C.js";import{Wb as a,bc as l,pb as p}from"./chunk-LYNBZ7RV.js";import e from"node:path";var u=".cloudflare/state",A=6e5;async function L(i,t){let r=t.resources?.d1??[];if(r.length===0)return{status:"skipped",reason:"no_d1"};let o=g(r,t.migrations),n=c(t);return await a(e.resolve(i,n))?{status:"found",binding:o,dir:n}:{status:"skipped",reason:"no_migrations_dir"}}async function b({cwd:i,manifest:t,cf:r,onApply:o}){let n=await L(i,t);return n.status==="skipped"?n:(o?.(),{status:"applied",...await R({cwd:i,manifest:t,cf:r,...n})})}async function R({cwd:i,manifest:t,cf:r,binding:o,dir:n}){let s=d(p(t.id),o);return{applied:(await l(r,{plane:"project",cwd:i,local:!0,timeoutMs:A,env:f(i),args:["d1","migrations","apply",s,"--local","--persist-to",u,"--dir",n]},m)).map(M=>M.name),database:s}}async function k({cwd:i,manifest:t,cf:r}){let o=g(t.resources?.d1??[],t.migrations);return(await l(r,{plane:"project",cwd:i,local:!0,env:f(i),args:["d1","migrations","list",d(p(t.id),o),"--local","--persist-to",u,"--dir",c(t)]},y)).map(s=>s.Name)}function f(i){let t=e.join(i,".everyapp","registry");return{CLOUDFLARE_REGISTRY_PATH:t,MINIFLARE_REGISTRY_PATH:t}}async function I(i){let t=await a(e.join(i,".wrangler","state")),r=await a(e.join(i,u));return!t||r?null:`Local data now lives in .cloudflare/state
1
+ import{j as d}from"./chunk-475IB5UG.js";import{e as g,f as c}from"./chunk-KTX5YGBL.js";import{a as m,e as y}from"./chunk-JT3R24Y7.js";import{Cb as p,nc as a,uc as l}from"./chunk-NXO2BC3M.js";import e from"node:path";var u=".cloudflare/state",A=6e5;async function L(i,t){let r=t.resources?.d1??[];if(r.length===0)return{status:"skipped",reason:"no_d1"};let o=g(r,t.migrations),n=c(t);return await a(e.resolve(i,n))?{status:"found",binding:o,dir:n}:{status:"skipped",reason:"no_migrations_dir"}}async function b({cwd:i,manifest:t,cf:r,onApply:o}){let n=await L(i,t);return n.status==="skipped"?n:(o?.(),{status:"applied",...await R({cwd:i,manifest:t,cf:r,...n})})}async function R({cwd:i,manifest:t,cf:r,binding:o,dir:n}){let s=d(p(t.id),o);return{applied:(await l(r,{plane:"project",cwd:i,local:!0,timeoutMs:A,env:f(i),args:["d1","migrations","apply",s,"--local","--persist-to",u,"--dir",n]},m)).map(M=>M.name),database:s}}async function k({cwd:i,manifest:t,cf:r}){let o=g(t.resources?.d1??[],t.migrations);return(await l(r,{plane:"project",cwd:i,local:!0,env:f(i),args:["d1","migrations","list",d(p(t.id),o),"--local","--persist-to",u,"--dir",c(t)]},y)).map(s=>s.Name)}function f(i){let t=e.join(i,".everyapp","registry");return{CLOUDFLARE_REGISTRY_PATH:t,MINIFLARE_REGISTRY_PATH:t}}async function I(i){let t=await a(e.join(i,".wrangler","state")),r=await a(e.join(i,u));return!t||r?null:`Local data now lives in .cloudflare/state
2
2
  Rows in the old .wrangler/state database weren't copied over.`}export{L as a,b,R as c,k as d,f as e,I as f};
@@ -1,4 +1,4 @@
1
- import{d as L}from"./chunk-M2QQ2UD7.js";import{A as x,E as T,O as y,P as h,Q as O,R as F,qa as k,sa as z,w as I}from"./chunk-RMF4YGD6.js";import{a as D}from"./chunk-CCWBPAKH.js";import{c as v,f as A,pc as C}from"./chunk-LYNBZ7RV.js";import u from"chalk";import f from"chalk";async function E(t){let{flags:e,out:l,createCf:i}=t,r=await z({gateway:k(e.gateway),accountId:e["account-id"],interactive:D(e.json??!1),login:{json:e.json,out:l,step:"login"},createCf:i});await x(r.db);let o=await L(r.db,e.org);return{gateway:r,organization:o}}function $(t){return t===null?f.dim("never"):new Date(t).toISOString().slice(0,16).replace("T"," ")}var d=t=>t===null?null:new Date(t).toISOString();function R(t){return t.sink==="email"?t.recipients==="owners"?"email \u2192 owners":"email \u2192 owners and admins":t.url?I(t.url):"(no URL)"}function B(t){return t.includes("*")?"everything":t.join(", ")}function X(t){return{id:t.id,name:t.name,sink:t.sink,target:R(t),recipients:t.recipients,events:t.events,enabled:t.enabled,builtin:t.builtin,createdAt:d(t.createdAt),createdBy:t.createdBy,lastDeliveryAt:d(t.lastDeliveryAt),lastDeliveryStatus:t.lastDeliveryStatus,consecutiveFailures:t.consecutiveFailures}}var H=t=>`${t.name} (${t.id})`;function N(t,e){let l=y(t,e),i=t.lastStatusCode!==null&&t.lastStatusCode>0?t.lastStatusCode:null,r=i===null?"":t.sink==="email"?`, ${i} mailed`:` ${i}`;switch(l){case"delivered":return f.green(`delivered${r}`);case"dead":return f.red("dead");case"failed":return f.yellow(`failed${r}, retrying`);default:return f.dim(t.attempts>0?"sending":"queued")}}function b(t,e){return{id:t.id,eventId:t.eventId,type:t.type,subscriptionId:t.subscriptionId,subscriptionName:t.subscriptionName,sink:t.sink,status:t.status,state:y(t,e),attempts:t.attempts,lastStatusCode:t.lastStatusCode,lastError:t.lastError,nextAttemptAt:d(t.nextAttemptAt),lastAttemptAt:d(t.lastAttemptAt),deliveredAt:d(t.deliveredAt),redeliveredAt:d(t.redeliveredAt),createdAt:d(t.createdAt)}}var S=t=>({id:t.id,name:t.name,slug:t.slug});var j=20;function et(t){let e=Number(t);if(!Number.isInteger(e)||e<1||e>h)throw new Error(`Use a whole number from 1 to ${h}.`);return e}var G=t=>{let e=t.lastError?.split(`
1
+ import{i as L}from"./chunk-EJE6K5GO.js";import{B as x,F as T,P as y,Q as h,R as O,S as F,ra as k,ta as z,w as I}from"./chunk-OHDR7JWQ.js";import{a as D}from"./chunk-MLZJBYSY.js";import{Ic as C,c as v,f as A}from"./chunk-NXO2BC3M.js";import u from"chalk";import f from"chalk";async function E(t){let{flags:e,out:l,createCf:i}=t,r=await z({gateway:k(e.gateway),accountId:e["account-id"],interactive:D(e.json??!1),login:{json:e.json,out:l,step:"login"},createCf:i});await x(r.db);let o=await L(r.db,e.org);return{gateway:r,organization:o}}function $(t){return t===null?f.dim("never"):new Date(t).toISOString().slice(0,16).replace("T"," ")}var d=t=>t===null?null:new Date(t).toISOString();function R(t){return t.sink==="email"?t.recipients==="owners"?"email \u2192 owners":"email \u2192 owners and admins":t.url?I(t.url):"(no URL)"}function B(t){return t.includes("*")?"everything":t.join(", ")}function X(t){return{id:t.id,name:t.name,sink:t.sink,target:R(t),recipients:t.recipients,events:t.events,enabled:t.enabled,builtin:t.builtin,createdAt:d(t.createdAt),createdBy:t.createdBy,lastDeliveryAt:d(t.lastDeliveryAt),lastDeliveryStatus:t.lastDeliveryStatus,consecutiveFailures:t.consecutiveFailures}}var H=t=>`${t.name} (${t.id})`;function N(t,e){let l=y(t,e),i=t.lastStatusCode!==null&&t.lastStatusCode>0?t.lastStatusCode:null,r=i===null?"":t.sink==="email"?`, ${i} mailed`:` ${i}`;switch(l){case"delivered":return f.green(`delivered${r}`);case"dead":return f.red("dead");case"failed":return f.yellow(`failed${r}, retrying`);default:return f.dim(t.attempts>0?"sending":"queued")}}function b(t,e){return{id:t.id,eventId:t.eventId,type:t.type,subscriptionId:t.subscriptionId,subscriptionName:t.subscriptionName,sink:t.sink,status:t.status,state:y(t,e),attempts:t.attempts,lastStatusCode:t.lastStatusCode,lastError:t.lastError,nextAttemptAt:d(t.nextAttemptAt),lastAttemptAt:d(t.lastAttemptAt),deliveredAt:d(t.deliveredAt),redeliveredAt:d(t.redeliveredAt),createdAt:d(t.createdAt)}}var S=t=>({id:t.id,name:t.name,slug:t.slug});var j=20;function et(t){let e=Number(t);if(!Number.isInteger(e)||e<1||e>h)throw new Error(`Use a whole number from 1 to ${h}.`);return e}var G=t=>{let e=t.lastError?.split(`
2
2
  `)[0];return e?u.dim(e.length>60?`${e.slice(0,59)}\u2026`:e):""};async function nt(t,e){let{out:l,flags:i}=t,{gateway:r,organization:o}=await E(t),c=t.now?.()??Date.now(),n=e?await T(r.db,o,e):null,s=await O(r.db,{organizationId:o.id,...n?{subscriptionId:n.id}:{},dead:i.dead??!1,limit:i.limit??j,now:c}),m=n?` to ${n.name}`:"",p=i.dead?"dead ":"",g=s.length===0?`No ${p}deliveries${m} in the last 30 days`:s.length===1?`The last ${p}delivery${m}`:`The last ${s.length} ${p}deliveries${m}`,w=s.filter(a=>a.status==="dead");l.emit({type:"done",message:g,display:[...s.length===0?[u.dim(`${g}.`)]:[...C(["WHEN","DELIVERY","EVENT","TO","STATUS","TRIES","NEXT","LAST ERROR"],s.map(a=>[$(a.createdAt),a.id,a.type??u.dim("(expired)"),a.subscriptionName??u.dim(a.subscriptionId),N(a,c),String(a.attempts),a.status==="pending"&&a.nextAttemptAt!==null?$(a.nextAttemptAt):"",G(a)])),...w.length>0?["",u.dim(`Send a dead one again: ${v} events redeliver <delivery>`)]:[]]].join(`
3
3
  `),data:{organization:S(o),subscriptionId:n?.id??null,dead:i.dead??!1,deliveries:s.map(a=>b(a,c))}})}async function at(t,e){let{out:l}=t,{gateway:i,organization:r}=await E(t),o=t.now?.()??Date.now(),{delivery:c,previous:n,outcome:s}=await F(i.db,r,e,o),m=`${n.type??"the event"} to ${n.subscriptionName??n.subscriptionId}`,p=n.status==="dead"?`it was dead after ${A(n.attempts,"attempt")}`:`it was ${n.attempts>0?"failing":"queued"}`,g=s==="attempting"?`${n.id} is being sent right now. Nothing changed.`:s==="delivered"?`${n.id} was already delivered (${m}). Nothing changed.`:`Queued ${n.id} again (${m}; ${p}).`,w=s==="queued"?"The Gateway sends it within a minute, with the full retry schedule.":`See how it went: ${v} events deliveries ${n.subscriptionId}`;l.emit({type:"done",message:`${g} ${w}`,display:[g,u.dim(w)].join(`
4
4
  `),data:{outcome:s,delivery:b(c,o),previousStatus:n.status,organization:S(r)}})}export{E as a,$ as b,R as c,B as d,X as e,H as f,b as g,S as h,et as i,nt as j,at as k};
@@ -1,4 +1,4 @@
1
- import{c as e}from"./chunk-LYNBZ7RV.js";import{buildCommand as n,buildRouteMap as c}from"@stricli/core";var r={kind:"parsed",parse:String,brief:"The Gateway's URL, checked against the Gateway in your Cloudflare account (default: EVERYAPP_GATEWAY_URL)",optional:!0},i={kind:"parsed",parse:String,brief:"The Cloudflare account of the Gateway, when your login sees several (default: CLOUDFLARE_ACCOUNT_ID)",optional:!0},g={kind:"parsed",parse:String,brief:"The organization to act on, by slug, id or name (default: the install organization; a name two organizations share is refused, ORG_AMBIGUOUS: give the slug)",placeholder:"slug",optional:!0},l={kind:"boolean",brief:"Print NDJSON events on stdout and never prompt (exit 0 done, 1 error, 2 action required, 251/252 bad command or arguments)",optional:!0},f={kind:"boolean",brief:"Print the result as an NDJSON event",optional:!0},d={kind:"boolean",brief:"Show every step and progress line, the output of what everyapp runs, and an unexpected error's stack trace",optional:!0},w={kind:"boolean",brief:"Skip everyapp's own confirmations (never cf's questions, or the one before replacing a Worker changed outside everyapp)",optional:!0},u={kind:"boolean",brief:"Publish new hostnames even where a DNS record answers them (one at a hostname is replaced)",optional:!0},y={"allow-delete-durable-object-data":{kind:"boolean",brief:"Deploy even though Durable Object classes were removed, deleting their data",optional:!0},"allow-delete-workflows":{kind:"boolean",brief:"Deploy even though Workflows were removed, deleting them and their instances",optional:!0},"force-dns":{...u,brief:"Publish the app's new hostname even where a DNS record answers it (one at the hostname is replaced)"},"enable-email-routing":{kind:"boolean",brief:"Turn on Email Routing for the domains the app's inbound addresses (everyapp email set --inbound) name that don't route mail yet (locks their MX and SPF records to Cloudflare)",optional:!0}};var p=(o=>(o.Senders="senders",o.Inbound="inbound",o))(p||{}),t={manifest:{kind:"parsed",parse:String,brief:"Path to everyapp.config.ts, if it isn't in this directory",placeholder:"path",optional:!0},gateway:r,"account-id":i,json:l,verbose:d},m=n({loader:async()=>{let{set:a}=await import("./email-RLZFUFUN.js");return a},parameters:{positional:{kind:"tuple",parameters:[]},flags:{sender:{kind:"parsed",parse:String,variadic:!0,optional:!0,placeholder:"pattern",brief:"Address the app may send as: '*@<domain>' or one address (repeat, up to 20)"},inbound:{kind:"parsed",parse:String,variadic:!0,optional:!0,placeholder:"address",brief:"Address whose mail goes to the app: '*@<apex>' or one address (repeat, up to 50)"},"enable-email-routing":{kind:"boolean",optional:!0,brief:"Turn on Email Routing for inbound domains without asking"},...t}},docs:{brief:"Set senders or inbound addresses, without a deploy",fullDescription:["Each flag replaces its whole list; a list you don't name is kept. The Gateway","picks up a change within 30 seconds, without a deploy. Addresses set before","the app's first upload are routed by its next deploy.","","Requirements:"," --sender everyapp.config.ts lists capabilities.email; each domain is set up for Email Sending"," --inbound everyapp.config.ts declares email: { inbound: true }; the domain is on Cloudflare DNS","","Examples:",` ${e} email set --sender '*@mail.example.com'`,` ${e} email set --inbound reports@mail.example.com`,` ${e} email set --inbound '*@example.com' --enable-email-routing`].join(`
2
- `)}}),b=n({loader:async()=>{let{unset:a}=await import("./email-RLZFUFUN.js");return a},parameters:{positional:{kind:"array",minimum:1,parameter:{brief:"List to clear: senders or inbound",placeholder:"senders|inbound",parse:a=>{let s=Object.values(p).find(o=>o===a);if(!s)throw new Error("Use senders, inbound, or both.");return s}}},flags:t},docs:{brief:"Clear senders or inbound addresses, without a deploy",fullDescription:["Clearing inbound addresses removes their Email Routing rules; a catch-all goes","back to dropping mail. Nothing is built or deployed.","","Examples:",` ${e} email unset inbound`,` ${e} email unset senders inbound`].join(`
3
- `)}}),h=n({loader:async()=>{let{show:a}=await import("./email-RLZFUFUN.js");return a},parameters:{positional:{kind:"tuple",parameters:[]},flags:t},docs:{brief:"Show the app's senders and inbound addresses",fullDescription:["Lists the app's senders and inbound addresses on the Gateway, and whether each","inbound address is routed.","","Examples:",` ${e} email show`,` ${e} email show --manifest ../analytics/everyapp.config.ts`].join(`
1
+ import{c as e}from"./chunk-NXO2BC3M.js";import{buildCommand as n,buildRouteMap as c}from"@stricli/core";var r={kind:"parsed",parse:String,brief:"The Gateway's URL, checked against the Gateway in your Cloudflare account (default: EVERYAPP_GATEWAY_URL)",optional:!0},i={kind:"parsed",parse:String,brief:"The Cloudflare account of the Gateway, when your login sees several (default: CLOUDFLARE_ACCOUNT_ID)",optional:!0},g={kind:"parsed",parse:String,brief:"The organization to act on, by slug, id or name (default: the install organization; a name two organizations share is refused, ORG_AMBIGUOUS: give the slug)",placeholder:"slug",optional:!0},l={kind:"boolean",brief:"Print NDJSON events on stdout and never prompt (exit 0 done, 1 error, 2 action required, 251/252 bad command or arguments)",optional:!0},f={kind:"boolean",brief:"Print the result as an NDJSON event",optional:!0},d={kind:"boolean",brief:"Show every step and progress line, the output of what everyapp runs, and an unexpected error's stack trace",optional:!0},w={kind:"boolean",brief:"Skip everyapp's own confirmations (never cf's questions, or the one before replacing a Worker changed outside everyapp)",optional:!0},u={kind:"boolean",brief:"Publish new hostnames even where a DNS record answers them (one at a hostname is replaced)",optional:!0},y={"allow-delete-durable-object-data":{kind:"boolean",brief:"Deploy even though Durable Object classes were removed, deleting their data",optional:!0},"allow-delete-workflows":{kind:"boolean",brief:"Deploy even though Workflows were removed, deleting them and their instances",optional:!0},"force-dns":{...u,brief:"Publish the app's new hostname even where a DNS record answers it (one at the hostname is replaced)"},"enable-email-routing":{kind:"boolean",brief:"Turn on Email Routing for the domains the app's inbound addresses (everyapp email set --inbound) name that don't route mail yet (locks their MX and SPF records to Cloudflare)",optional:!0}};var p=(o=>(o.Senders="senders",o.Inbound="inbound",o))(p||{}),t={manifest:{kind:"parsed",parse:String,brief:"Path to everyapp.config.ts, if it isn't in this directory",placeholder:"path",optional:!0},gateway:r,"account-id":i,json:l,verbose:d},m=n({loader:async()=>{let{set:a}=await import("./email-LAQDDSYC.js");return a},parameters:{positional:{kind:"tuple",parameters:[]},flags:{sender:{kind:"parsed",parse:String,variadic:!0,optional:!0,placeholder:"pattern",brief:"Address the app may send as: '*@<domain>' or one address (repeat, up to 20)"},inbound:{kind:"parsed",parse:String,variadic:!0,optional:!0,placeholder:"address",brief:"Address whose mail goes to the app: '*@<apex>' or one address (repeat, up to 50)"},"enable-email-routing":{kind:"boolean",optional:!0,brief:"Turn on Email Routing for inbound domains without asking"},...t}},docs:{brief:"Set senders or inbound addresses, without a deploy",fullDescription:["Each flag replaces its whole list; a list you don't name is kept. The Gateway","picks up a change within 30 seconds, without a deploy. Addresses set before","the app's first upload are routed by its next deploy.","","Requirements:"," --sender everyapp.config.ts lists capabilities.email; each domain is set up for Email Sending"," --inbound everyapp.config.ts declares email: { inbound: true }; the domain is on Cloudflare DNS","","Examples:",` ${e} email set --sender '*@mail.example.com'`,` ${e} email set --inbound reports@mail.example.com`,` ${e} email set --inbound '*@example.com' --enable-email-routing`].join(`
2
+ `)}}),b=n({loader:async()=>{let{unset:a}=await import("./email-LAQDDSYC.js");return a},parameters:{positional:{kind:"array",minimum:1,parameter:{brief:"List to clear: senders or inbound",placeholder:"senders|inbound",parse:a=>{let s=Object.values(p).find(o=>o===a);if(!s)throw new Error("Use senders, inbound, or both.");return s}}},flags:t},docs:{brief:"Clear senders or inbound addresses, without a deploy",fullDescription:["Clearing inbound addresses removes their Email Routing rules; a catch-all goes","back to dropping mail. Nothing is built or deployed.","","Examples:",` ${e} email unset inbound`,` ${e} email unset senders inbound`].join(`
3
+ `)}}),h=n({loader:async()=>{let{show:a}=await import("./email-LAQDDSYC.js");return a},parameters:{positional:{kind:"tuple",parameters:[]},flags:t},docs:{brief:"Show the app's senders and inbound addresses",fullDescription:["Lists the app's senders and inbound addresses on the Gateway, and whether each","inbound address is routed.","","Examples:",` ${e} email show`,` ${e} email show --manifest ../analytics/everyapp.config.ts`].join(`
4
4
  `)}}),S=c({routes:{show:h,set:m,unset:b},docs:{brief:"Manage the addresses an app sends as and receives at"}});export{r as a,i as b,g as c,l as d,f as e,d as f,w as g,u as h,y as i,S as j};
@@ -1,2 +1,2 @@
1
- import{Bb as o}from"./chunk-LYNBZ7RV.js";import i from"node:fs";import t from"node:path";import{fileURLToPath as a}from"node:url";function p(e=import.meta.url){let r=t.dirname(a(e));for(let n=r;;n=t.dirname(n)){if(i.existsSync(t.join(n,"apps","every-app-gateway","scripts","build-release.ts"))&&i.existsSync(t.join(n,"packages","cli","package.json")))return n;if(t.dirname(n)===n)return null}}function c(e=import.meta.url){let r=p(e);if(r)return r;throw new o("CHECKOUT_MISSING",`everyapp has to run from a checkout of the Every App repository
1
+ import{Ub as o}from"./chunk-NXO2BC3M.js";import i from"node:fs";import t from"node:path";import{fileURLToPath as a}from"node:url";function p(e=import.meta.url){let r=t.dirname(a(e));for(let n=r;;n=t.dirname(n)){if(i.existsSync(t.join(n,"apps","every-app-gateway","scripts","build-release.ts"))&&i.existsSync(t.join(n,"packages","cli","package.json")))return n;if(t.dirname(n)===n)return null}}function c(e=import.meta.url){let r=p(e);if(r)return r;throw new o("CHECKOUT_MISSING",`everyapp has to run from a checkout of the Every App repository
2
2
  This copy is installed in ${u(t.dirname(a(e)))}, outside any checkout.`,{fix:`in your checkout, run pnpm everyapp ${process.argv.slice(2).join(" ")}`.trimEnd()})}function u(e){for(let r=e;t.dirname(r)!==r;r=t.dirname(r))if(i.existsSync(t.join(r,"package.json")))return r;return e}function s(e){try{return i.realpathSync(e)}catch{return t.resolve(e)}}function h(e,r=c()){let n=t.relative(s(r),s(e));return n===""||n!==".."&&!n.startsWith(`..${t.sep}`)&&!t.isAbsolute(n)}export{p as a,c as b,s as c,h as d};
@@ -1 +1 @@
1
- import{a as d}from"./chunk-4JRIS6S6.js";import{Aa as u,Ba as g,Ca as S,G as p,ba as f,c as l,pc as c,qb as m}from"./chunk-LYNBZ7RV.js";import a from"chalk";function $(e){return d(e,m)}async function C(e,n){return(await d(e,n)).filter(t=>!f(t))}function w(e,n=p){let t=n.unboundSettings?.();return t&&t.size>0?e.filter(r=>!t.has(r)):[...e]}function I(e){let n=e.lookup??p,t=e.gatewayNames===null?null:w(e.gatewayNames,n),r=g(u(e.manifest,n),(o,i)=>{let s=o==="gateway"?t:e.secretNames;return s===null?null:s.includes(i)});return{report:r,setup:S(r,{cli:l,appId:e.appId})}}function M(e,n=p){return u(e,n).some(t=>t.names.length>0)}function P(e,n=p){let t=new Set;for(let r of u(e,n))if(r.holder==="gateway")for(let o of[...r.names,...r.alsoReads])t.add(o);return[...t]}function O(e,n){let t=new Map,r=(o,i)=>{let s=t.get(o);s?s.required||=i:t.set(o,{name:o,required:i,set:n.includes(o)})};for(let o of e)if(o.holder==="gateway"){for(let i of o.names)r(i,o.need.kind!=="optional");for(let i of o.alsoReads)r(i,!1)}return[...t.values()]}function W(e,n){return e.filter(t=>t.holder==="gateway"&&t.blocking).flatMap(t=>t.names).filter((t,r,o)=>!n.includes(t)&&o.indexOf(t)===r)}var y=`${a.yellow("!")} not set`;function k(e){if(e.set===!0)return`${a.green("\u2713")} set`;if(e.set===null)return e.holder==="app"?`${a.yellow("!")} not recorded`:`${a.yellow("!")} couldn't check`;switch(e.need.kind){case"required":return y;case"optional":return a.dim("not set (optional)");case"anyOf":return e.blocking?y:a.dim(`not set (one of: ${e.need.group})`)}}function h(e){return e.names.join("+")}function A(e,n){return n.filter(t=>t.names.length>0).map(t=>({app:e,setting:h(t),where:t.holder==="gateway"?"Gateway":e,status:k(t)}))}function U(e,n,t){return A(e,t.filter(r=>r.holder==="app")).map(r=>({...r,where:`${n} helper`}))}function _(e,{app:n=!0}={}){return n?c(["APP","SETTING","WHERE","STATUS"],e.map(t=>[t.app,t.setting,t.where,t.status])):c(["SETTING","WHERE","STATUS"],e.map(t=>[t.setting,t.where,t.status]))}function b(e){let n=e.names.join(" and "),t=e.why??(e.label===n?void 0:n);return[t?`${e.label}: ${t}`:e.label,...e.hint?[e.hint]:[],...e.docs?[`Get it at ${e.docs}`]:[]]}var R=".claude/skills/everyapp";function N(e){return e.setup?`Guide: ${R}/${e.setup}`:e.kind==="capability"||e.kind==="provider"?`Guide: ${l} provider show ${e.id}`:null}function q(e){let n=new Set;return e.flatMap(t=>{let r=b(t),o=N(t);return!o||n.has(o)?r:(n.add(o),[...r,o])})}function j(e){let n=[],t=r=>{for(let o of r.names)n.includes(o)||n.push(o)};for(let r of e.unmet)r.need.kind==="required"&&t(r);for(let r of e.groups){if(r.met)continue;let o=e.unmet.find(i=>i.id===r.members[0]);o&&t(o)}return n}export{$ as a,C as b,w as c,I as d,M as e,P as f,O as g,W as h,k as i,A as j,U as k,_ as l,b as m,R as n,N as o,q as p,j as q};
1
+ import{a as d}from"./chunk-36VCEEIH.js";import{Db as m,Fa as u,G as p,Ga as g,Ha as S,Ic as c,c as l,ga as f}from"./chunk-NXO2BC3M.js";import a from"chalk";function $(e){return d(e,m)}async function C(e,n){return(await d(e,n)).filter(t=>!f(t))}function w(e,n=p){let t=n.unboundSettings?.();return t&&t.size>0?e.filter(r=>!t.has(r)):[...e]}function I(e){let n=e.lookup??p,t=e.gatewayNames===null?null:w(e.gatewayNames,n),r=g(u(e.manifest,n),(o,i)=>{let s=o==="gateway"?t:e.secretNames;return s===null?null:s.includes(i)});return{report:r,setup:S(r,{cli:l,appId:e.appId})}}function M(e,n=p){return u(e,n).some(t=>t.names.length>0)}function P(e,n=p){let t=new Set;for(let r of u(e,n))if(r.holder==="gateway")for(let o of[...r.names,...r.alsoReads])t.add(o);return[...t]}function O(e,n){let t=new Map,r=(o,i)=>{let s=t.get(o);s?s.required||=i:t.set(o,{name:o,required:i,set:n.includes(o)})};for(let o of e)if(o.holder==="gateway"){for(let i of o.names)r(i,o.need.kind!=="optional");for(let i of o.alsoReads)r(i,!1)}return[...t.values()]}function W(e,n){return e.filter(t=>t.holder==="gateway"&&t.blocking).flatMap(t=>t.names).filter((t,r,o)=>!n.includes(t)&&o.indexOf(t)===r)}var y=`${a.yellow("!")} not set`;function k(e){if(e.set===!0)return`${a.green("\u2713")} set`;if(e.set===null)return e.holder==="app"?`${a.yellow("!")} not recorded`:`${a.yellow("!")} couldn't check`;switch(e.need.kind){case"required":return y;case"optional":return a.dim("not set (optional)");case"anyOf":return e.blocking?y:a.dim(`not set (one of: ${e.need.group})`)}}function h(e){return e.names.join("+")}function A(e,n){return n.filter(t=>t.names.length>0).map(t=>({app:e,setting:h(t),where:t.holder==="gateway"?"Gateway":e,status:k(t)}))}function U(e,n,t){return A(e,t.filter(r=>r.holder==="app")).map(r=>({...r,where:`${n} helper`}))}function _(e,{app:n=!0}={}){return n?c(["APP","SETTING","WHERE","STATUS"],e.map(t=>[t.app,t.setting,t.where,t.status])):c(["SETTING","WHERE","STATUS"],e.map(t=>[t.setting,t.where,t.status]))}function b(e){let n=e.names.join(" and "),t=e.why??(e.label===n?void 0:n);return[t?`${e.label}: ${t}`:e.label,...e.hint?[e.hint]:[],...e.docs?[`Get it at ${e.docs}`]:[]]}var R=".claude/skills/everyapp";function N(e){return e.setup?`Guide: ${R}/${e.setup}`:e.kind==="capability"||e.kind==="provider"?`Guide: ${l} provider show ${e.id}`:null}function q(e){let n=new Set;return e.flatMap(t=>{let r=b(t),o=N(t);return!o||n.has(o)?r:(n.add(o),[...r,o])})}function j(e){let n=[],t=r=>{for(let o of r.names)n.includes(o)||n.push(o)};for(let r of e.unmet)r.need.kind==="required"&&t(r);for(let r of e.groups){if(r.met)continue;let o=e.unmet.find(i=>i.id===r.members[0]);o&&t(o)}return n}export{$ as a,C as b,w as c,I as d,M as e,P as f,O as g,W as h,k as i,A as j,U as k,_ as l,b as m,R as n,N as o,q as p,j as q};
@@ -1 +1 @@
1
- import{m as r}from"./chunk-JYKRUS5C.js";import{bc as t}from"./chunk-LYNBZ7RV.js";var u=100;function c(e,n){return t(e,{plane:"account",args:["r2","buckets","list","--name-contains",n,"--per-page",String(u)]},r).then(o=>o.map(s=>s.name))}async function f(e,n){return(await c(e,n)).includes(n)}async function p(e,n){await e.run({plane:"account",mode:"json",args:["r2","buckets","create","--name",n]})}async function m(e,n){await e.run({plane:"account",mode:"json",args:["r2","buckets","delete",n,"--force"]})}export{c as a,f as b,p as c,m as d};
1
+ import{m as r}from"./chunk-JT3R24Y7.js";import{uc as t}from"./chunk-NXO2BC3M.js";var u=100;function c(e,n){return t(e,{plane:"account",args:["r2","buckets","list","--name-contains",n,"--per-page",String(u)]},r).then(o=>o.map(s=>s.name))}async function f(e,n){return(await c(e,n)).includes(n)}async function p(e,n){await e.run({plane:"account",mode:"json",args:["r2","buckets","create","--name",n]})}async function m(e,n){await e.run({plane:"account",mode:"json",args:["r2","buckets","delete",n,"--force"]})}export{c as a,f as b,p as c,m as d};
@@ -1 +1 @@
1
- import{e as m,f as d}from"./chunk-M2QQ2UD7.js";import{qa as l,sa as p}from"./chunk-RMF4YGD6.js";import{a as i}from"./chunk-CCWBPAKH.js";import{Bb as o}from"./chunk-LYNBZ7RV.js";import s from"chalk";async function b(e){let{flags:t,out:r,createCf:n}=e,a=await p({gateway:l(t.gateway),accountId:t["account-id"],interactive:i(t.json??!1),login:{json:t.json,out:r,step:"login"},createCf:n}),g=await m(a.db,a.deployer,{org:t.org,now:e.now?.()});return{gateway:a,ws:g,gatewayUrl:a.gatewayUrl}}function x(e){return e.interactive??i(e.flags.json??!1)}async function W(e,t){try{let r=await d(e,t);return{id:r.id,email:r.email,member:!0}}catch(r){if(!(r instanceof o)||r.code!=="USER_NOT_FOUND"||t.includes("@"))throw r;return{id:t.trim(),email:null,member:!1}}}var v=e=>e.member?e.email??e.id:`${e.id} (no longer a member)`;function F(e){return e===null?s.dim("never"):new Date(e).toISOString().slice(0,16).replace("T"," ")}var c=e=>e===null?null:new Date(e).toISOString();function C(e){return e.deactivated?s.yellow("deactivated"):s.green("active")}function h(e){return{id:e.id,email:e.email,name:e.name,role:e.primaryRole??e.role,deactivated:e.deactivated,createdAt:c(e.createdAt)}}function O(e){return{id:e.id,email:e.email,role:e.role,status:e.status,expiresAt:c(e.expiresAt),expired:!e.live&&e.status==="pending",createdAt:c(e.createdAt)}}function A(e){let{add:t,remove:r,set:n}=e;if(n&&(t||r))throw new o("FLAGS_CONFLICT","--set replaces the whole list: give it alone, or --add and --remove without it");return!t&&!r&&!n?{change:null}:{change:{add:t,remove:r,set:n}}}export{b as a,x as b,W as c,v as d,F as e,c as f,C as g,h,O as i,A as j};
1
+ import{j as m,k as d}from"./chunk-EJE6K5GO.js";import{ra as l,ta as p}from"./chunk-OHDR7JWQ.js";import{a as i}from"./chunk-MLZJBYSY.js";import{Ub as o}from"./chunk-NXO2BC3M.js";import s from"chalk";async function b(e){let{flags:t,out:r,createCf:n}=e,a=await p({gateway:l(t.gateway),accountId:t["account-id"],interactive:i(t.json??!1),login:{json:t.json,out:r,step:"login"},createCf:n}),g=await m(a.db,a.deployer,{org:t.org,now:e.now?.()});return{gateway:a,ws:g,gatewayUrl:a.gatewayUrl}}function x(e){return e.interactive??i(e.flags.json??!1)}async function W(e,t){try{let r=await d(e,t);return{id:r.id,email:r.email,member:!0}}catch(r){if(!(r instanceof o)||r.code!=="USER_NOT_FOUND"||t.includes("@"))throw r;return{id:t.trim(),email:null,member:!1}}}var v=e=>e.member?e.email??e.id:`${e.id} (no longer a member)`;function F(e){return e===null?s.dim("never"):new Date(e).toISOString().slice(0,16).replace("T"," ")}var c=e=>e===null?null:new Date(e).toISOString();function C(e){return e.deactivated?s.yellow("deactivated"):s.green("active")}function h(e){return{id:e.id,email:e.email,name:e.name,role:e.primaryRole??e.role,deactivated:e.deactivated,createdAt:c(e.createdAt)}}function O(e){return{id:e.id,email:e.email,role:e.role,status:e.status,expiresAt:c(e.expiresAt),expired:!e.live&&e.status==="pending",createdAt:c(e.createdAt)}}function A(e){let{add:t,remove:r,set:n}=e;if(n&&(t||r))throw new o("FLAGS_CONFLICT","--set replaces the whole list: give it alone, or --add and --remove without it");return!t&&!r&&!n?{change:null}:{change:{add:t,remove:r,set:n}}}export{b as a,x as b,W as c,v as d,F as e,c as f,C as g,h,O as i,A as j};
@@ -1,4 +1,4 @@
1
- import{a as Te,b as tt,c as nt,d as Le,e as q}from"./chunk-E3EPK27P.js";import{B as Me}from"./chunk-IFCPALVC.js";import{A as Q,B as Z,C as Xe,D as Ke,E as Qe,F as Ce,G as Ee,H as ve,I as De,J as Oe,K as ke,L as et,M as Pe,N as me,O as ct,b as Ae,c as We,d as je,e as we,f as Be,g as He,h as $e,i as Ve,k as Ye,l as ie,m as Ze,n as be,o as Se,p as qe,q as xe,r as ce,s as Ie,t as K,u as le,v as re,w as Y,x as de,y as Je,z as _e}from"./chunk-TLRM3P7V.js";import{a as oe}from"./chunk-4JRIS6S6.js";import{c as it,e as ot}from"./chunk-HOUHG236.js";import{$ as dt,B as rt,qa as pt,sa as mt,y as lt}from"./chunk-RMF4YGD6.js";import{a as pe,f as st,i as at}from"./chunk-CCWBPAKH.js";import{Bb as z,Gb as Fe,c as H,f as V,k as A,oc as Re,qb as ae,rc as ne,wc as ue}from"./chunk-LYNBZ7RV.js";import u from"chalk";var x="Every App gateway members",ut="Every App gateway",It="Every App apps",_t="720h",tn=24*3600,D="access.update";async function nn(t){await ue(t,e=>Dt({flags:t,out:e,emails:t.email,emailDomains:t["email-domain"],team:t.team,session:t.session,teamSession:t["team-session"],writeSettings:t["write-settings"]}))}async function sn(t){await ue(t,e=>Tt({flags:t,out:e,keepApplications:t["keep-applications"]}))}async function an(t){await ue(t,e=>Lt({flags:t,out:e}))}var Ct=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,Et=/^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9-]{2,63}$/,ht=/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;function Ge({flags:t,out:e,createCf:s}){return mt({gateway:pt(t.gateway),accountId:t["account-id"],interactive:pe(t.json??!1),login:{json:t.json,out:e,step:"login"},createCf:s})}function ft(t){if(t.deploymentMode==="hosted")throw new z("ACCESS_HOSTED",`This Gateway can't be put behind Cloudflare Access
1
+ import{a as Te,b as tt,c as nt,d as Le,e as q}from"./chunk-E3EPK27P.js";import{B as Me}from"./chunk-WTKBB5HE.js";import{A as Q,B as Z,C as Xe,D as Ke,E as Qe,F as Ce,G as Ee,H as ve,I as De,J as Oe,K as ke,L as et,M as Pe,N as me,O as ct,b as Ae,c as We,d as je,e as we,f as Be,g as He,h as $e,i as Ve,k as Ye,l as ie,m as Ze,n as be,o as Se,p as qe,q as xe,r as ce,s as Ie,t as K,u as le,v as re,w as Y,x as de,y as Je,z as _e}from"./chunk-XEPXX3AI.js";import{a as oe}from"./chunk-36VCEEIH.js";import{c as it,e as ot}from"./chunk-ZCJTJDAI.js";import{C as rt,aa as dt,ra as pt,ta as mt,y as lt}from"./chunk-OHDR7JWQ.js";import{a as pe,f as st,i as at}from"./chunk-MLZJBYSY.js";import{Db as ae,Hc as Re,Kc as ne,Pc as ue,Ub as z,Zb as Fe,c as H,f as V,k as A}from"./chunk-NXO2BC3M.js";import u from"chalk";var x="Every App gateway members",ut="Every App gateway",It="Every App apps",_t="720h",tn=24*3600,D="access.update";async function nn(t){await ue(t,e=>Dt({flags:t,out:e,emails:t.email,emailDomains:t["email-domain"],team:t.team,session:t.session,teamSession:t["team-session"],writeSettings:t["write-settings"]}))}async function sn(t){await ue(t,e=>Tt({flags:t,out:e,keepApplications:t["keep-applications"]}))}async function an(t){await ue(t,e=>Lt({flags:t,out:e}))}var Ct=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,Et=/^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9-]{2,63}$/,ht=/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;function Ge({flags:t,out:e,createCf:s}){return mt({gateway:pt(t.gateway),accountId:t["account-id"],interactive:pe(t.json??!1),login:{json:t.json,out:e,step:"login"},createCf:s})}function ft(t){if(t.deploymentMode==="hosted")throw new z("ACCESS_HOSTED",`This Gateway can't be put behind Cloudflare Access
2
2
  Hosted Gateways ignore the Access settings.`)}function gt(t,e){let s=e.trim(),n=et(s);if(n===null||n<=0)throw new z("ACCESS_SESSION_INVALID",`${t} ${e} isn't a duration Access takes
3
3
  Use hours and minutes, like 720h or 2h30m.`);return s}async function yt(t,e){let s="(u.banned IS NULL OR u.banned = 0 OR (u.ban_expires IS NOT NULL AND u.ban_expires <= ?1))",[n=[],m=[],f=[]]=await t.run([{sql:`SELECT u.email FROM users u WHERE ${s} ORDER BY u.email`,params:[e]},{sql:"SELECT DISTINCT email FROM invitations WHERE status = 'pending' AND expires_at > ?1 ORDER BY email",params:[e]},{sql:`SELECT u.email FROM users u
4
4
  WHERE ${s}