@netnodeag/kraftwerk 0.76.0 → 0.78.0

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 (65) hide show
  1. package/README.md +33 -27
  2. package/dist/cli/cloud.d.ts +2 -0
  3. package/dist/cli/cloud.js +262 -0
  4. package/dist/cli/daemon.js +9 -0
  5. package/dist/cli/doctor.js +16 -8
  6. package/dist/cli/init.js +2 -2
  7. package/dist/cli/invite.d.ts +2 -0
  8. package/dist/cli/invite.js +48 -0
  9. package/dist/cli/kraftwerk.js +7 -0
  10. package/dist/client/relay.d.ts +40 -0
  11. package/dist/client/relay.js +35 -0
  12. package/dist/client/routes.d.ts +5 -0
  13. package/dist/client/routes.js +5 -0
  14. package/dist/config.d.ts +15 -28
  15. package/dist/config.js +5 -19
  16. package/dist/core/chat/channel-turns.d.ts +2 -2
  17. package/dist/core/chat/channel-turns.js +2 -2
  18. package/dist/core/chat/sessions.d.ts +20 -3
  19. package/dist/core/chat/sessions.js +22 -7
  20. package/dist/core/chat/types.d.ts +21 -0
  21. package/dist/core/cloud.d.ts +152 -0
  22. package/dist/core/cloud.js +98 -0
  23. package/dist/core/routines.d.ts +22 -2
  24. package/dist/core/routines.js +26 -0
  25. package/dist/server/api/chats.js +45 -8
  26. package/dist/server/api/cloud.d.ts +86 -0
  27. package/dist/server/api/cloud.js +51 -0
  28. package/dist/server/api/devices.d.ts +15 -9
  29. package/dist/server/api/devices.js +3 -2
  30. package/dist/server/api/index.d.ts +108 -11
  31. package/dist/server/api/index.js +2 -0
  32. package/dist/server/api/router.d.ts +3 -2
  33. package/dist/server/api/router.js +12 -0
  34. package/dist/server/api/workspace.d.ts +16 -1
  35. package/dist/server/api/workspace.js +2 -1
  36. package/dist/server/cloud.d.ts +104 -33
  37. package/dist/server/cloud.js +279 -185
  38. package/dist/server/hub-context.d.ts +1 -1
  39. package/dist/server/hub-context.js +3 -3
  40. package/dist/server/members.d.ts +87 -0
  41. package/dist/server/members.js +117 -0
  42. package/dist/server/relay.d.ts +21 -1
  43. package/dist/server/relay.js +74 -3
  44. package/dist/server/server.d.ts +3 -2
  45. package/dist/server/server.js +13 -6
  46. package/dist/server/trust.d.ts +16 -0
  47. package/dist/server/trust.js +12 -1
  48. package/package.json +1 -1
  49. package/schema/kraftwerk.schema.json +4 -4
  50. package/web/dist/assets/{dist-T1sNLC62.js → dist-B-yVL5lk.js} +1 -1
  51. package/web/dist/assets/{dist-DFXmaDc5.js → dist-B9EMB1Ie.js} +1 -1
  52. package/web/dist/assets/{dist-BQpWYkxm.js → dist-BTc878j7.js} +1 -1
  53. package/web/dist/assets/{dist-fgB7OEJy.js → dist-C90kUzps.js} +1 -1
  54. package/web/dist/assets/{dist-l7foWlFx.js → dist-CpLdAqFQ.js} +1 -1
  55. package/web/dist/assets/{dist-flnLXEzU.js → dist-Crnb8VVO.js} +1 -1
  56. package/web/dist/assets/{dist-vuciRCSz.js → dist-D0rjnN8S.js} +1 -1
  57. package/web/dist/assets/{dist-BTVP-6On.js → dist-D4SDXoGw.js} +1 -1
  58. package/web/dist/assets/{dist-BwIca_Uj.js → dist-DHRhdODt.js} +1 -1
  59. package/web/dist/assets/{dist-BYkcY-Vl.js → dist-DQbifCX0.js} +1 -1
  60. package/web/dist/assets/dist-lSJ-O7kT.js +1 -0
  61. package/web/dist/assets/{editor-C6Ok8NPo.js → editor-DHAdW1g_.js} +3 -3
  62. package/web/dist/assets/{index-z4tpCCzk.js → index-D7JVAjll.js} +5 -5
  63. package/web/dist/index.html +1 -1
  64. package/web/dist-remote/sw.js +1 -1
  65. package/web/dist/assets/dist-BURf1l-A.js +0 -1
@@ -15,7 +15,7 @@
15
15
  } catch (e) {}
16
16
  })();
17
17
  </script>
18
- <script type="module" crossorigin src="/assets/index-z4tpCCzk.js"></script>
18
+ <script type="module" crossorigin src="/assets/index-D7JVAjll.js"></script>
19
19
  <link rel="stylesheet" crossorigin href="/assets/index-BKDJocDd.css">
20
20
  </head>
21
21
  <body>
@@ -1 +1 @@
1
- (function(){var e=()=>globalThis.crypto.subtle,t=new TextEncoder,n=new TextDecoder;function r(e){let t=``;for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}function i(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var a=e=>r(e).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``),o=e=>i(e.replace(/-/g,`+`).replace(/_/g,`/`)+`===`.slice((e.length+3)%4)),s=(...e)=>{let t=new Uint8Array(e.reduce((e,t)=>e+t.length,0)),n=0;for(let r of e)t.set(r,n),n+=r.length;return t};async function c(){let t=await e().generateKey({name:`X25519`},!0,[`deriveBits`]);return{privateKey:t.privateKey,publicKey:new Uint8Array(await e().exportKey(`raw`,t.publicKey))}}var l=t=>{if(t.length!==32)throw Error(`invalid public key`);return e().importKey(`raw`,t,{name:`X25519`},!1,[])},u=async(t,n)=>new Uint8Array(await e().deriveBits({name:`X25519`,public:await l(n)},t,256));async function d(t){return a(new Uint8Array(await e().digest(`SHA-256`,t)).subarray(0,16))}async function f(n,r){let i=await e().importKey(`raw`,n,`HKDF`,!1,[`deriveKey`]),a=n=>e().deriveKey({name:`HKDF`,hash:`SHA-256`,salt:r,info:t.encode(`kraftwerk-relay-v1 ${n}`)},i,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`]);return{toDaemon:await a(`to-daemon`),toClient:await a(`to-client`)}}var p=e=>{let t=new Uint8Array(12);return new DataView(t.buffer).setBigUint64(4,BigInt(e)),t};function m(a,o){let s=0,c=0,l=Promise.resolve(),u=Promise.resolve();return{seal(n){let i=l.then(async()=>{let i=p(s++);return r(new Uint8Array(await e().encrypt({name:`AES-GCM`,iv:i},a,t.encode(n))))});return l=i.catch(()=>{}),i},open(t){let r=u.then(async()=>{let r=p(c++);try{return n.decode(await e().decrypt({name:`AES-GCM`,iv:r},o,i(t)))}catch{throw Error(`relay message failed to decrypt — tampered, replayed or out of order`)}});return u=r.catch(()=>{}),r}}}async function h(e){let t=await c();return{hello:{t:`hello`,v:1,key:r(t.publicKey)},async finish(n){if(n?.t!==`ready`||typeof n.key!=`string`||typeof n.box!=`string`)throw Error(`not a relay handshake answer`);let r=i(n.key),a=await f(s(await u(t.privateKey,e),await u(t.privateKey,r)),s(t.publicKey,e,r)),o=m(a.toDaemon,a.toClient);if(await o.open(n.box).catch(()=>``)!==`ready`)throw Error(`the machine did not prove its key — wrong pairing link, or not the machine you paired with`);return o}}}var g=1;async function _(e){let t=await d(e.publicKey),a=`${e.relayUrl}${e.relayUrl.includes(`?`)?`&`:`?`}id=${encodeURIComponent(t)}`,o=await h(e.publicKey),s=e.connect?e.connect(a):new WebSocket(a),c=null,l=``,u,f=new Promise(e=>u=e),p=new Map,m=1,_=e=>{if(!l){l=e||`the connection closed`;for(let e of p.values()){e.reject(Error(l));try{e.stream?.error(Error(l))}catch{}}p.clear(),u(l)}},v=new Promise((t,r)=>{let i=setTimeout(()=>{r(Error(`the machine did not answer through the relay`)),s.close()},e.timeoutMs??15e3);s.addEventListener(`open`,()=>s.send(JSON.stringify(o.hello))),s.addEventListener(`close`,e=>{clearTimeout(i);let t=e.reason||(e.code===4404?`the machine is not connected to the relay`:`the relay closed the connection`);r(Error(t)),_(t)}),s.addEventListener(`error`,()=>{});let a=!0,l=Promise.resolve();s.addEventListener(`message`,e=>{let u=typeof e.data==`string`?e.data:n.decode(e.data);l=l.then(async()=>{if(a){a=!1;try{c=await o.finish(JSON.parse(u)),clearTimeout(i),t(c)}catch(e){clearTimeout(i),r(e),s.close(4400,`handshake failed`)}return}if(!c)return;let e;try{e=JSON.parse(await c.open(u))}catch(e){s.close(4400,`bad message`),_(e.message);return}y(e)})})}),y=e=>{let t=p.get(e.id);if(t){if(e.t===`res`){let n=new ReadableStream({start:e=>{t.stream=e},cancel:()=>{p.delete(e.id),b({t:`abort`,id:e.id})}}),r=e.status,i=r===204||r===304||r>=100&&r<200;t.resolve(new Response(i?null:n,{status:r,headers:e.headers}))}else if(e.t===`data`)try{t.stream?.enqueue(i(e.chunk))}catch{}else if(e.t===`end`){p.delete(e.id);try{t.stream?.close()}catch{}}else if(e.t===`fail`){p.delete(e.id);let n=Error(e.error);t.reject(n);try{t.stream?.error(n)}catch{}}}},b=async e=>{c&&s.readyState===g&&s.send(await c.seal(JSON.stringify(e)))};return await v,{fetch:async(e,t)=>{if(l)throw Error(l);let n=new Request(typeof e==`string`&&e.startsWith(`/`)?`http://relay${e}`:e,t),i=new URL(n.url),a={};n.headers.forEach((e,t)=>a[t]=e);let o=n.method===`GET`||n.method===`HEAD`?void 0:new Uint8Array(await n.arrayBuffer()),s=m++;return new Promise((e,t)=>{p.set(s,{resolve:e,reject:t,signal:n.signal}),n.signal?.addEventListener(`abort`,()=>{let e=p.get(s);if(!e)return;p.delete(s);let t=new DOMException(`aborted`,`AbortError`);e.reject(t);try{e.stream?.error(t)}catch{}b({t:`abort`,id:s})}),b({t:`req`,id:s,method:n.method,url:i.pathname+i.search,headers:a,...o?.length?{body:r(o)}:{}}).catch(e=>{p.delete(s),t(e)})})},close:()=>{s.close(1e3,`bye`),_(`closed`)},closed:f}}var v=`kraftwerk-remote`;function y(){return new Promise((e,t)=>{let n=indexedDB.open(v,1);n.onupgradeneeded=()=>{n.result.createObjectStore(`machines`,{keyPath:`key`}),n.result.createObjectStore(`state`)},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}async function b(e,t,n){let r=await y();try{return await new Promise((i,a)=>{let o=n(r.transaction(e,t).objectStore(e));o.onsuccess=()=>i(o.result),o.onerror=()=>a(o.error)})}finally{r.close()}}var x=()=>b(`machines`,`readonly`,e=>e.getAll()),S=e=>b(`machines`,`readwrite`,t=>t.put(e)),C=()=>b(`state`,`readonly`,e=>e.get(`current`)),w=e=>b(`state`,`readwrite`,t=>t.put(e,`current`));async function T(){let[e,t]=await Promise.all([C(),x()]);return t.find(t=>t.key===e)??(t.length===1?t[0]:void 0)}var E=e=>`${e.replace(/^http/,`ws`)}/api/relay/client`,D=self;D.addEventListener(`install`,e=>e.waitUntil(D.skipWaiting())),D.addEventListener(`activate`,e=>e.waitUntil(D.clients.claim()));var O=null;function k(e){if(O?.key===e)return O.t;O?.t.then(e=>e.close()).catch(()=>{});let t=_({relayUrl:E(D.location.origin),publicKey:o(e)}),n={key:e,t};return O=n,t.then(e=>void e.closed.then(()=>O===n&&(O=null)),()=>O===n&&(O=null)),t}var A=(e,t,n)=>new Response(`<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${t}</title><body style="font:16px system-ui;padding:24px;max-width:36em;margin:auto"><h1 style="font-size:20px">${t}</h1><p>${n}</p><p><a href="/_kw/">Machines</a> · <a href="" onclick="location.reload();return false">Try again</a></p>`,{status:e,headers:{"content-type":`text/html; charset=utf-8`}});async function j(e,t){let n=new URL(e.url),r=new Headers(e.headers);r.set(`authorization`,`Bearer ${t.token}`),r.set(`host`,n.host);let i=await k(t.key),a=e.method===`GET`||e.method===`HEAD`?void 0:await e.arrayBuffer(),o=await i.fetch(n.pathname+n.search,{method:e.method,headers:r,body:a,signal:e.signal});if(e.method===`POST`&&/^(\/w\/[^/]+)?\/api\/pair$/.test(n.pathname)&&o.ok){let{token:e}=await o.clone().json().catch(()=>({}));e&&await S({...t,token:e,pairedAt:new Date().toISOString()})}return o}D.addEventListener(`fetch`,e=>{let t=new URL(e.request.url);t.origin!==D.location.origin||t.pathname.startsWith(`/_kw/`)||e.respondWith((async()=>{if(e.request.mode===`navigate`&&e.request.method!==`GET`)return A(403,`Refused`,`A form from another page tried to act on your machine.`);let t=await T();if(!t)return e.request.mode===`navigate`?Response.redirect(`/_kw/`,302):new Response(JSON.stringify({error:`no machine paired here`}),{status:503});try{return await j(e.request,t)}catch(n){if(n.name===`AbortError`)throw n;let r=n.message;return e.request.mode===`navigate`?A(502,`${t.label} is not reachable`,`${r}. Is the Mac awake, and is remote access on (<code>kraftwerk remote</code>)?`):new Response(JSON.stringify({error:r}),{status:502,headers:{"content-type":`application/json`}})}})())}),D.addEventListener(`message`,e=>{let t=e.data,n=e.ports[0];if(t?.type!==`pair`||!t.key||!t.code||!n)return;let r=t.key;(async()=>{try{O=null;let e=await(await k(r)).fetch(`/api/pair`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({code:t.code,name:t.name||`phone`})}),i=await e.json().catch(()=>({}));if(!e.ok||!i.token)throw Error(i.error??`pairing failed (${e.status})`);await S({key:r,token:i.token,label:t.label||`your machine`,pairedAt:new Date().toISOString()}),await w(r),n.postMessage({ok:!0})}catch(e){n.postMessage({ok:!1,error:e.message})}})()})})();
1
+ (function(){var e=()=>globalThis.crypto.subtle,t=new TextEncoder,n=new TextDecoder;function r(e){let t=``;for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}function i(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var a=e=>r(e).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``),o=e=>i(e.replace(/-/g,`+`).replace(/_/g,`/`)+`===`.slice((e.length+3)%4)),s=(...e)=>{let t=new Uint8Array(e.reduce((e,t)=>e+t.length,0)),n=0;for(let r of e)t.set(r,n),n+=r.length;return t};async function c(){let t=await e().generateKey({name:`X25519`},!0,[`deriveBits`]);return{privateKey:t.privateKey,publicKey:new Uint8Array(await e().exportKey(`raw`,t.publicKey))}}var l=t=>{if(t.length!==32)throw Error(`invalid public key`);return e().importKey(`raw`,t,{name:`X25519`},!1,[])},u=async(t,n)=>new Uint8Array(await e().deriveBits({name:`X25519`,public:await l(n)},t,256));async function d(t){return a(new Uint8Array(await e().digest(`SHA-256`,t)).subarray(0,16))}async function f(n,r){let i=await e().importKey(`raw`,n,`HKDF`,!1,[`deriveKey`]),a=n=>e().deriveKey({name:`HKDF`,hash:`SHA-256`,salt:r,info:t.encode(`kraftwerk-relay-v1 ${n}`)},i,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`]);return{toDaemon:await a(`to-daemon`),toClient:await a(`to-client`)}}var p=e=>{let t=new Uint8Array(12);return new DataView(t.buffer).setBigUint64(4,BigInt(e)),t};function m(a,o){let s=0,c=0,l=Promise.resolve(),u=Promise.resolve();return{seal(n){let i=l.then(async()=>{let i=p(s++);return r(new Uint8Array(await e().encrypt({name:`AES-GCM`,iv:i},a,t.encode(n))))});return l=i.catch(()=>{}),i},open(t){let r=u.then(async()=>{let r=p(c++);try{return n.decode(await e().decrypt({name:`AES-GCM`,iv:r},o,i(t)))}catch{throw Error(`relay message failed to decrypt — tampered, replayed or out of order`)}});return u=r.catch(()=>{}),r}}}async function h(e){let t=await c();return{hello:{t:`hello`,v:1,key:r(t.publicKey)},async finish(n){if(n?.t!==`ready`||typeof n.key!=`string`||typeof n.box!=`string`)throw Error(`not a relay handshake answer`);let r=i(n.key),a=await f(s(await u(t.privateKey,e),await u(t.privateKey,r)),s(t.publicKey,e,r)),o=m(a.toDaemon,a.toClient);if(await o.open(n.box).catch(()=>``)!==`ready`)throw Error(`the machine did not prove its key — wrong pairing link, or not the machine you paired with`);return o}}}var g=1;async function _(e){let t=await d(e.publicKey),a=`${e.relayUrl}${e.relayUrl.includes(`?`)?`&`:`?`}id=${encodeURIComponent(t)}`,o=await h(e.publicKey),s=e.connect?e.connect(a):new WebSocket(a),c=null,l=``,u,f=new Promise(e=>u=e),p=new Map,m=1,_=null,v=e=>{if(!l){l=e||`the connection closed`;for(let e of p.values()){e.reject(Error(l));try{e.stream?.error(Error(l))}catch{}}p.clear(),u(l)}},y=new Promise((t,r)=>{let i=setTimeout(()=>{r(Error(`the machine did not answer through the relay`)),s.close()},e.timeoutMs??15e3);s.addEventListener(`open`,()=>s.send(JSON.stringify(o.hello))),s.addEventListener(`close`,e=>{clearTimeout(i);let t=e.reason||(e.code===4404?`the machine is not connected to the relay`:`the relay closed the connection`);r(Error(t)),v(t)}),s.addEventListener(`error`,()=>{});let a=!0,l=Promise.resolve();s.addEventListener(`message`,e=>{let u=typeof e.data==`string`?e.data:n.decode(e.data);l=l.then(async()=>{if(a){a=!1;try{c=await o.finish(JSON.parse(u)),clearTimeout(i),t(c)}catch(e){clearTimeout(i),r(e),s.close(4400,`handshake failed`)}return}if(!c)return;let e;try{e=JSON.parse(await c.open(u))}catch(e){s.close(4400,`bad message`),v(e.message);return}b(e)})})}),b=e=>{if(e.t===`auth`){_?.(e),_=null;return}let t=p.get(e.id);if(t){if(e.t===`res`){let n=new ReadableStream({start:e=>{t.stream=e},cancel:()=>{p.delete(e.id),x({t:`abort`,id:e.id})}}),r=e.status,i=r===204||r===304||r>=100&&r<200;t.resolve(new Response(i?null:n,{status:r,headers:e.headers}))}else if(e.t===`data`)try{t.stream?.enqueue(i(e.chunk))}catch{}else if(e.t===`end`){p.delete(e.id);try{t.stream?.close()}catch{}}else if(e.t===`fail`){p.delete(e.id);let n=Error(e.error);t.reject(n);try{t.stream?.error(n)}catch{}}}},x=async e=>{c&&s.readyState===g&&s.send(await c.seal(JSON.stringify(e)))};await y;let S;if(e.member){let t=e.member,n=await new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`the machine did not answer the member's hello`)),e.timeoutMs??15e3);_=e=>{clearTimeout(i),n(e)},f.then(e=>{clearTimeout(i),r(Error(e))}),x({t:`auth`,memberToken:t.token,workspaceId:t.workspaceId}).catch(r)});if(!n.ok)throw s.close(1e3,`bye`),v(n.error),Error(n.error);S={member:n.member,workspace:n.workspace}}return{fetch:async(e,t)=>{if(l)throw Error(l);let n=new Request(typeof e==`string`&&e.startsWith(`/`)?`http://relay${e}`:e,t),i=new URL(n.url),a={};n.headers.forEach((e,t)=>a[t]=e);let o=n.method===`GET`||n.method===`HEAD`?void 0:new Uint8Array(await n.arrayBuffer()),s=m++;return new Promise((e,t)=>{p.set(s,{resolve:e,reject:t,signal:n.signal}),n.signal?.addEventListener(`abort`,()=>{let e=p.get(s);if(!e)return;p.delete(s);let t=new DOMException(`aborted`,`AbortError`);e.reject(t);try{e.stream?.error(t)}catch{}x({t:`abort`,id:s})}),x({t:`req`,id:s,method:n.method,url:i.pathname+i.search,headers:a,...o?.length?{body:r(o)}:{}}).catch(e=>{p.delete(s),t(e)})})},close:()=>{s.close(1e3,`bye`),v(`closed`)},closed:f,...S?{member:S}:{}}}var v=`kraftwerk-remote`;function y(){return new Promise((e,t)=>{let n=indexedDB.open(v,1);n.onupgradeneeded=()=>{n.result.createObjectStore(`machines`,{keyPath:`key`}),n.result.createObjectStore(`state`)},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}async function b(e,t,n){let r=await y();try{return await new Promise((i,a)=>{let o=n(r.transaction(e,t).objectStore(e));o.onsuccess=()=>i(o.result),o.onerror=()=>a(o.error)})}finally{r.close()}}var x=()=>b(`machines`,`readonly`,e=>e.getAll()),S=e=>b(`machines`,`readwrite`,t=>t.put(e)),C=()=>b(`state`,`readonly`,e=>e.get(`current`)),w=e=>b(`state`,`readwrite`,t=>t.put(e,`current`));async function T(){let[e,t]=await Promise.all([C(),x()]);return t.find(t=>t.key===e)??(t.length===1?t[0]:void 0)}var E=e=>`${e.replace(/^http/,`ws`)}/api/relay/client`,D=self;D.addEventListener(`install`,e=>e.waitUntil(D.skipWaiting())),D.addEventListener(`activate`,e=>e.waitUntil(D.clients.claim()));var O=null;function k(e){if(O?.key===e)return O.t;O?.t.then(e=>e.close()).catch(()=>{});let t=_({relayUrl:E(D.location.origin),publicKey:o(e)}),n={key:e,t};return O=n,t.then(e=>void e.closed.then(()=>O===n&&(O=null)),()=>O===n&&(O=null)),t}var A=(e,t,n)=>new Response(`<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${t}</title><body style="font:16px system-ui;padding:24px;max-width:36em;margin:auto"><h1 style="font-size:20px">${t}</h1><p>${n}</p><p><a href="/_kw/">Machines</a> · <a href="" onclick="location.reload();return false">Try again</a></p>`,{status:e,headers:{"content-type":`text/html; charset=utf-8`}});async function j(e,t){let n=new URL(e.url),r=new Headers(e.headers);r.set(`authorization`,`Bearer ${t.token}`),r.set(`host`,n.host);let i=await k(t.key),a=e.method===`GET`||e.method===`HEAD`?void 0:await e.arrayBuffer(),o=await i.fetch(n.pathname+n.search,{method:e.method,headers:r,body:a,signal:e.signal});if(e.method===`POST`&&/^(\/w\/[^/]+)?\/api\/pair$/.test(n.pathname)&&o.ok){let{token:e}=await o.clone().json().catch(()=>({}));e&&await S({...t,token:e,pairedAt:new Date().toISOString()})}return o}D.addEventListener(`fetch`,e=>{let t=new URL(e.request.url);t.origin!==D.location.origin||t.pathname.startsWith(`/_kw/`)||e.respondWith((async()=>{if(e.request.mode===`navigate`&&e.request.method!==`GET`)return A(403,`Refused`,`A form from another page tried to act on your machine.`);let t=await T();if(!t)return e.request.mode===`navigate`?Response.redirect(`/_kw/`,302):new Response(JSON.stringify({error:`no machine paired here`}),{status:503});try{return await j(e.request,t)}catch(n){if(n.name===`AbortError`)throw n;let r=n.message;return e.request.mode===`navigate`?A(502,`${t.label} is not reachable`,`${r}. Is the Mac awake, and is remote access on (<code>kraftwerk remote</code>)?`):new Response(JSON.stringify({error:r}),{status:502,headers:{"content-type":`application/json`}})}})())}),D.addEventListener(`message`,e=>{let t=e.data,n=e.ports[0];if(t?.type!==`pair`||!t.key||!t.code||!n)return;let r=t.key;(async()=>{try{O=null;let e=await(await k(r)).fetch(`/api/pair`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({code:t.code,name:t.name||`phone`})}),i=await e.json().catch(()=>({}));if(!e.ok||!i.token)throw Error(i.error??`pairing failed (${e.status})`);await S({key:r,token:i.token,label:t.label||`your machine`,pairedAt:new Date().toISOString()}),await w(r),n.postMessage({ok:!0})}catch(e){n.postMessage({ok:!1,error:e.message})}})()})})();
@@ -1 +0,0 @@
1
- import{a as e}from"./editor-C6Ok8NPo.js";export{e as markdown};