@ours.network/sdk 1.7.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +48 -29
  2. package/dist/api/contacts.js +1 -1
  3. package/dist/api/conversations.js +1 -1
  4. package/dist/api/files.js +1 -1
  5. package/dist/api/identity.js +1 -1
  6. package/dist/api/messaging.js +1 -1
  7. package/dist/api/profile.js +1 -1
  8. package/dist/book.js +1 -1
  9. package/dist/boot.js +1 -1
  10. package/dist/{chunk-2BSXRX6I.js → chunk-2PVVBIA7.js} +1 -1
  11. package/dist/{chunk-EWT5DWPA.js → chunk-3CDGP5EO.js} +1 -1
  12. package/dist/chunk-3KI5FM4I.js +2 -0
  13. package/dist/{chunk-WOPXC4VC.js → chunk-64C2NWXL.js} +1 -1
  14. package/dist/{chunk-BCVDO2DW.js → chunk-7JZS2BAP.js} +1 -1
  15. package/dist/{chunk-ZTGUX6EV.js → chunk-AQK45DI7.js} +1 -1
  16. package/dist/{chunk-BWTNLYDF.js → chunk-CGAOZPMV.js} +1 -1
  17. package/dist/{chunk-4SXZ6CUL.js → chunk-CGXQP3Q4.js} +1 -1
  18. package/dist/chunk-CHDY74S7.js +3 -0
  19. package/dist/chunk-CIHGEBUR.js +2 -0
  20. package/dist/{chunk-IU6MOFTJ.js → chunk-EHCBEY52.js} +1 -1
  21. package/dist/{chunk-SBQCXH54.js → chunk-HPPNU5YV.js} +1 -1
  22. package/dist/{chunk-K2UCTMMS.js → chunk-K7TLSZ3X.js} +1 -1
  23. package/dist/{chunk-G3CKYZJ7.js → chunk-MQ5AXTPT.js} +1 -1
  24. package/dist/{chunk-E2RQVNQK.js → chunk-OWZIFNZN.js} +1 -1
  25. package/dist/{chunk-JHS7YUMA.js → chunk-PQXV4GQ5.js} +1 -1
  26. package/dist/chunk-R5ISAB5B.js +2 -0
  27. package/dist/{chunk-QXKDTQMT.js → chunk-T76BFV6S.js} +1 -1
  28. package/dist/{chunk-ARYFH7MF.js → chunk-TIBWO3T3.js} +1 -1
  29. package/dist/{chunk-3RZX2WOJ.js → chunk-TUWHVJ37.js} +1 -1
  30. package/dist/{chunk-LIJDSFUD.js → chunk-V7PKYHV7.js} +1 -1
  31. package/dist/{chunk-UOHHUOWR.js → chunk-W2BPK7VV.js} +1 -1
  32. package/dist/chunk-WS6UFNKF.js +5 -0
  33. package/dist/{chunk-PPJAMKLP.js → chunk-XT75POTM.js} +1 -1
  34. package/dist/chunk-Y3VPZJTG.js +2 -0
  35. package/dist/client/http.d.ts +5 -0
  36. package/dist/client/select.d.ts +29 -1
  37. package/dist/client/select.js +1 -1
  38. package/dist/client.js +1 -1
  39. package/dist/cluster/control.js +1 -1
  40. package/dist/cluster/manifest.js +1 -1
  41. package/dist/config.d.ts +0 -1
  42. package/dist/config.js +1 -1
  43. package/dist/connector.js +1 -1
  44. package/dist/constants.d.ts +2 -0
  45. package/dist/constants.js +2 -0
  46. package/dist/gc.js +1 -1
  47. package/dist/http/api-routes.js +1 -1
  48. package/dist/http/server.d.ts +2 -0
  49. package/dist/http/server.js +1 -1
  50. package/dist/identity/hierarchy.js +1 -1
  51. package/dist/identity/lease.js +1 -1
  52. package/dist/identity/lifecycle.js +1 -1
  53. package/dist/identity/model.d.ts +1 -2
  54. package/dist/identity/model.js +1 -1
  55. package/dist/identity/provision.js +1 -1
  56. package/dist/index.d.ts +3 -11
  57. package/dist/index.js +1 -1
  58. package/dist/internal/daemon.d.ts +11 -0
  59. package/dist/internal/daemon.js +2 -0
  60. package/dist/internal/state-root-lock.d.ts +25 -0
  61. package/dist/internal/state-root-lock.js +2 -0
  62. package/dist/messaging/send.js +1 -1
  63. package/dist/mufl/handlers.js +1 -1
  64. package/dist/mufl/tx.js +1 -1
  65. package/dist/mufl_code/7962BB01B1D3E782A1F80B083A900AEC30BAC8F8CE79282B31821802B94A39B6.muflo +0 -0
  66. package/dist/notify.js +1 -1
  67. package/dist/render/adapt-to-json.js +1 -1
  68. package/dist/runtime/config-drift.js +1 -1
  69. package/dist/runtime/env.js +1 -1
  70. package/dist/state.js +1 -1
  71. package/dist/sweeps.js +1 -1
  72. package/dist/uploads.js +1 -1
  73. package/package.json +3 -7
  74. package/dist/chunk-EUILVQOZ.js +0 -2
  75. package/dist/chunk-IB2U7K6Y.js +0 -5
  76. package/dist/chunk-IDH22QWU.js +0 -2
  77. package/dist/chunk-NOOGH2RZ.js +0 -2
  78. package/dist/chunk-SYRQA3MQ.js +0 -2
  79. package/dist/daemon.d.ts +0 -5
  80. package/dist/daemon.js +0 -2
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
+ import{a as s}from"./chunk-HPPNU5YV.js";import{I as h,J as y,K as x,L as F,M as l}from"./chunk-65KGEJBX.js";import{H as S,I as d,J as _,M as f,p as c}from"./chunk-MQ5AXTPT.js";import{d as p,f as g}from"./chunk-TUWHVJ37.js";import{t as m,u as w}from"./chunk-CIHGEBUR.js";import{a}from"./chunk-Y3VPZJTG.js";async function N(r){let n=s(r);try{return S(t=>p(_(n,"::actor::list_incoming_files",t)))}catch(t){throw l("list_incoming_files",String(t))}}async function P(r,n={}){let t=s(r),{wire_ids:e}=n;if(e!==void 0){if(e.length<1||e.length>32)throw h(32);if(e.some(i=>!m(i)))throw y();if(new Set(e).size!==e.length)throw x()}try{let i=await d(async o=>{let u=await f(t,"::actor::get_files",e===void 0?{}:{wire_ids:e},o);return await g(t,u.Reduce("files"))});return c(t),{files:i.files,text:i.text,mode:e===void 0?"all_unread":"selected",requested:e??null}}catch(i){let o=String(i);throw e!==void 0&&/unknown, stale, or no longer unread/i.test(o)?F():l("get_files",o)}}function T(r,n){let t=s(r);return{existsOnDisk:w(t,n.wire_id)!==null}}async function b(r,n){let t=s(r),{file_ids:e}=n;try{let i=await d(async o=>(await f(t,"::actor::defer_files",{file_ids:e},o)).Reduce("deferred").Visualize());return c(t),{deferred:i}}catch(i){throw l("defer_files",String(i))}}export{N as a,P as b,T as c,b as d};
@@ -1,3 +1,3 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{e as a}from"./chunk-ZHH3PWEW.js";import{d as s,f as i,g as u,h as p}from"./chunk-IB2U7K6Y.js";import{timingSafeEqual as d}from"node:crypto";var b="1.7.0",r=s(),_=r.stateDir,k=r.brokerUrl,g=process.env.OURS_TRANSPORT??"http",E=r.port,A=r.gcIntervalMs,c=r.apiVisibility,R=Number(process.env.OURS_TEST_STARTUP_HEARTBEAT_MS||"")||void 0,N=g==="http"?a(_,{heartbeatMs:R}):null,v=(...e)=>process.stderr.write(`ours: ${e.join(" ")}
2
+ import{e as a}from"./chunk-ZHH3PWEW.js";import{d as s,f as i,g as u,h as p}from"./chunk-WS6UFNKF.js";import{timingSafeEqual as d}from"node:crypto";var b="2.0.1",r=s(),_=r.stateDir,k=r.brokerUrl,g=process.env.OURS_TRANSPORT??"http",E=r.port,A=r.gcIntervalMs,c=r.apiVisibility,R=Number(process.env.OURS_TEST_STARTUP_HEARTBEAT_MS||"")||void 0,N=g==="http"?a(_,{heartbeatMs:R}):null,v=(...e)=>process.stderr.write(`ours: ${e.join(" ")}
3
3
  `);function S(){if(c==="open")return null;if(c==="shared"){let e=u(r);if(!e)throw new Error(`apiVisibility=shared requires an operator-supplied token so it can be distributed to cross-user agents \u2014 set OURS_API_TOKEN or "apiToken" in config (${i(r)} is not used for shared mode). Use apiVisibility=owner for a same-user-only auto-token, or =open to disable auth.`);return e}return p(r,{generate:!0}).token}var f=S();function T(e){let t=e.headers["x-ours-api-token"];if(typeof t=="string"&&t)return t;let o=e.headers.authorization;if(typeof o=="string"){let n=/^Bearer\s+(.+)$/i.exec(o.trim());if(n)return n[1]}}function h(e){if(f===null)return!0;let t=T(e);if(!t)return!1;let o=Buffer.from(t),n=Buffer.from(f);return o.length===n.length&&d(o,n)}function P(e,t){return h(e)?!0:(t.writeHead(401,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"unauthorized"})),!1)}var O=/^[A-Za-z0-9 _.@-]{1,64}$/,l="contact-book";function y(e){return O.test(e)?e==="."||e===".."||e.includes("/")||e.includes("\\")?"invalid name":e===l?`"${l}" is reserved for the local contact book`:e==="root.json"||e==="bindings.json"?`"${e}" is reserved for daemon bookkeeping`:null:"name must be 1-64 chars of letters, digits, space, _ . @ or -"}export{b as a,r as b,_ as c,k as d,E as e,A as f,c as g,N as h,v as i,f as j,T as k,h as l,P as m,O as n,l as o,y as p};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a as d}from"./chunk-SBQCXH54.js";import{M as r,y as T,z as j}from"./chunk-65KGEJBX.js";import{H as y,I as u,J as p,M as l,Q as N,U as L,V as A,p as z,r as P,w as f}from"./chunk-G3CKYZJ7.js";import{a as C,b as V,g as x,h as I,j as S,k as B}from"./chunk-3RZX2WOJ.js";import{d as _,f as k}from"./chunk-BCVDO2DW.js";async function U(s,a={}){let e=d(s),{name:i,mode:o}=a;if(o==="public"&&i)throw T();try{return await u(async t=>{let n={};i&&(n.name=i),o&&(n.mode=o);let c=await l(e,"::a2a_messaging::generate_invite",n,t);return{blob:S(Buffer.from(c.Reduce("invite").GetBinary())),inviteId:c.Reduce("invite_id").Visualize(),mode:c.Reduce("mode").Visualize()==="public"?"public":"one_time"}})}catch(t){throw r("generate_invite",String(t))}}async function $(s){let a=d(s);try{return y(e=>{let i=p(a,"::a2a_messaging::list_invites",e),o=[];if(i.IsNil())return o;for(let t of i.GetKeys()){let n=i.Reduce(t);if(n.IsNil())continue;let c=n.Reduce("assigned").Visualize(),m=n.Reduce("created").Visualize();o.push({invite_id:typeof t=="string"?t:t.Visualize(),mode:n.Reduce("mode").Visualize(),assigned:c==="%%NIL"?"":c,created:m==="%%NIL"?"":m})}return o})}catch(e){throw r("list_invites",String(e))}}async function H(s,a){let e=d(s),{invite_id:i}=a;try{return await u(async o=>{let t=await l(e,"::a2a_messaging::revoke_invite",{invite_id:i},o),n=t.Reduce("was_public");return{revoked:t.Reduce("revoked").GetBoolean(),wasPublic:n.IsNil()?!1:n.GetBoolean()}})}catch(o){throw r("revoke_invite",String(o))}}async function J(s,a){let e=d(s),{invite:i,name:o}=a,t;try{if(t=B(i),t.length===0)throw new Error("the invite blob is empty")}catch(n){throw r("add_contact",n instanceof Error?n.message:"the invite blob is not valid.","INVITE_MALFORMED")}try{return await u(async n=>{let m={invite:e.pw.packet.NewBinaryFromBuffer(t).Attach(n)};o&&(m.name=o);let g=await l(e,"::a2a_messaging::add_contact",m,n),R=g.Reduce("container_id").Visualize(),v=g.Reduce("pending").Visualize(),h=g.Reduce("inviter_name").Visualize(),w=b=>!b||b==="%%NIL",G=w(v)?w(h)?R:h:v;return f(e),{display:G,cid:R}})}catch(n){throw r("add_contact",String(n))}}async function Q(s){let a=d(s);try{return y(e=>({contacts:C(p(a,"::a2a_messaging::list_contacts",e)),pending:x(p(a,"::actor::list_pending_introductions",e)),roots:I(p(a,"::a2a_messaging::list_contact_roots",e)),degraded:P(p(a,"::a2a_messaging::list_degraded_contacts",e)),renames:V(p(a,"::a2a_messaging::list_import_renames",e))}))}catch(e){throw r("list_contacts",String(e))}}async function X(s){let a=Object.values(N()),e=s.leaseToken(),i=e?k(e)?.identity:void 0;return a.map(o=>({name:o.name,container_id:o.container_id,published_at:o.published_at,isMine:o.name===i}))}async function Y(s,a){let e=d(s),{expose:i,auto_accept:o}=a;if(i===void 0&&o===void 0)throw j();let t=[];try{return o!==void 0&&(await u(async n=>{await l(e,"::actor::set_local_policy",{auto_accept:o},n)}),t.push(`auto_accept=${o}`)),i===!0?(await L(e),t.push("published in the local contact book")):i===!1&&(A(e),t.push("removed from the local contact book")),{identity:e.name,changes:t}}catch(n){throw r("set_local_book_policy",String(n))}}async function Z(s,a){let e=d(s),{contact:i}=a;try{return _.add(e.name),await u(async o=>{let t=await l(e,"::a2a_messaging::remove_contact",{contact:i},o),n=t.Reduce("removed").Visualize(),c=t.Reduce("container_id").Visualize(),m=t.Reduce("notified"),g=m.IsNil()?void 0:m.GetBoolean();return{name:n,cid:c,notified:g}})}catch(o){throw r("remove_contact",String(o))}finally{_.delete(e.name)}}async function ee(s,a){let e=d(s),{contact:i,name:o}=a;try{return await u(async t=>{let n=await l(e,"::a2a_messaging::rename_contact",{contact:i,name:o},t);return{from:n.Reduce("renamed").Visualize(),cid:n.Reduce("container_id").Visualize()}})}catch(t){throw r("rename_contact",String(t))}}async function te(s,a){let e=d(s),{contact:i,action:o}=a;try{if(o==="approve"){let t=await u(async n=>{let c=await l(e,"::actor::approve_introduction",{contact:i},n);return{action:"approve",name:c.Reduce("approved").Visualize(),cid:c.Reduce("container_id").Visualize(),flushed:c.Reduce("flushed").Visualize()}});return z(e),f(e),t}return await u(async t=>{let n=await l(e,"::actor::reject_introduction",{contact:i},t);return{action:"reject",name:n.Reduce("rejected").Visualize(),dropped:n.Reduce("dropped_messages").Visualize()}})}catch(t){throw r("respond_to_introduction",String(t))}}export{U as a,$ as b,H as c,J as d,Q as e,X as f,Y as g,Z as h,ee as i,te as j};
2
+ import{a as d}from"./chunk-HPPNU5YV.js";import{M as r,y as T,z as j}from"./chunk-65KGEJBX.js";import{H as y,I as u,J as p,M as l,Q as N,U as L,V as A,p as z,r as P,w as f}from"./chunk-MQ5AXTPT.js";import{a as C,b as V,g as x,h as I,j as S,k as B}from"./chunk-TUWHVJ37.js";import{d as _,f as k}from"./chunk-7JZS2BAP.js";async function U(s,a={}){let e=d(s),{name:i,mode:o}=a;if(o==="public"&&i)throw T();try{return await u(async t=>{let n={};i&&(n.name=i),o&&(n.mode=o);let c=await l(e,"::a2a_messaging::generate_invite",n,t);return{blob:S(Buffer.from(c.Reduce("invite").GetBinary())),inviteId:c.Reduce("invite_id").Visualize(),mode:c.Reduce("mode").Visualize()==="public"?"public":"one_time"}})}catch(t){throw r("generate_invite",String(t))}}async function $(s){let a=d(s);try{return y(e=>{let i=p(a,"::a2a_messaging::list_invites",e),o=[];if(i.IsNil())return o;for(let t of i.GetKeys()){let n=i.Reduce(t);if(n.IsNil())continue;let c=n.Reduce("assigned").Visualize(),m=n.Reduce("created").Visualize();o.push({invite_id:typeof t=="string"?t:t.Visualize(),mode:n.Reduce("mode").Visualize(),assigned:c==="%%NIL"?"":c,created:m==="%%NIL"?"":m})}return o})}catch(e){throw r("list_invites",String(e))}}async function H(s,a){let e=d(s),{invite_id:i}=a;try{return await u(async o=>{let t=await l(e,"::a2a_messaging::revoke_invite",{invite_id:i},o),n=t.Reduce("was_public");return{revoked:t.Reduce("revoked").GetBoolean(),wasPublic:n.IsNil()?!1:n.GetBoolean()}})}catch(o){throw r("revoke_invite",String(o))}}async function J(s,a){let e=d(s),{invite:i,name:o}=a,t;try{if(t=B(i),t.length===0)throw new Error("the invite blob is empty")}catch(n){throw r("add_contact",n instanceof Error?n.message:"the invite blob is not valid.","INVITE_MALFORMED")}try{return await u(async n=>{let m={invite:e.pw.packet.NewBinaryFromBuffer(t).Attach(n)};o&&(m.name=o);let g=await l(e,"::a2a_messaging::add_contact",m,n),R=g.Reduce("container_id").Visualize(),v=g.Reduce("pending").Visualize(),h=g.Reduce("inviter_name").Visualize(),w=b=>!b||b==="%%NIL",G=w(v)?w(h)?R:h:v;return f(e),{display:G,cid:R}})}catch(n){throw r("add_contact",String(n))}}async function Q(s){let a=d(s);try{return y(e=>({contacts:C(p(a,"::a2a_messaging::list_contacts",e)),pending:x(p(a,"::actor::list_pending_introductions",e)),roots:I(p(a,"::a2a_messaging::list_contact_roots",e)),degraded:P(p(a,"::a2a_messaging::list_degraded_contacts",e)),renames:V(p(a,"::a2a_messaging::list_import_renames",e))}))}catch(e){throw r("list_contacts",String(e))}}async function X(s){let a=Object.values(N()),e=s.leaseToken(),i=e?k(e)?.identity:void 0;return a.map(o=>({name:o.name,container_id:o.container_id,published_at:o.published_at,isMine:o.name===i}))}async function Y(s,a){let e=d(s),{expose:i,auto_accept:o}=a;if(i===void 0&&o===void 0)throw j();let t=[];try{return o!==void 0&&(await u(async n=>{await l(e,"::actor::set_local_policy",{auto_accept:o},n)}),t.push(`auto_accept=${o}`)),i===!0?(await L(e),t.push("published in the local contact book")):i===!1&&(A(e),t.push("removed from the local contact book")),{identity:e.name,changes:t}}catch(n){throw r("set_local_book_policy",String(n))}}async function Z(s,a){let e=d(s),{contact:i}=a;try{return _.add(e.name),await u(async o=>{let t=await l(e,"::a2a_messaging::remove_contact",{contact:i},o),n=t.Reduce("removed").Visualize(),c=t.Reduce("container_id").Visualize(),m=t.Reduce("notified"),g=m.IsNil()?void 0:m.GetBoolean();return{name:n,cid:c,notified:g}})}catch(o){throw r("remove_contact",String(o))}finally{_.delete(e.name)}}async function ee(s,a){let e=d(s),{contact:i,name:o}=a;try{return await u(async t=>{let n=await l(e,"::a2a_messaging::rename_contact",{contact:i,name:o},t);return{from:n.Reduce("renamed").Visualize(),cid:n.Reduce("container_id").Visualize()}})}catch(t){throw r("rename_contact",String(t))}}async function te(s,a){let e=d(s),{contact:i,action:o}=a;try{if(o==="approve"){let t=await u(async n=>{let c=await l(e,"::actor::approve_introduction",{contact:i},n);return{action:"approve",name:c.Reduce("approved").Visualize(),cid:c.Reduce("container_id").Visualize(),flushed:c.Reduce("flushed").Visualize()}});return z(e),f(e),t}return await u(async t=>{let n=await l(e,"::actor::reject_introduction",{contact:i},t);return{action:"reject",name:n.Reduce("rejected").Visualize(),dropped:n.Reduce("dropped_messages").Visualize()}})}catch(t){throw r("respond_to_introduction",String(t))}}export{U as a,$ as b,H as c,J as d,Q as e,X as f,Y as g,Z as h,ee as i,te as j};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{c as p,h as w,j as I,k as b,l as x}from"./chunk-DIRW7I4S.js";import{m as h}from"./chunk-NOOGH2RZ.js";import{b as _}from"./chunk-QXKDTQMT.js";import{b as z}from"./chunk-P55RJGZU.js";import{basename as M,join as $}from"node:path";import{createHash as S,randomUUID as G}from"node:crypto";import{mkdir as C,open as O,rename as v,unlink as N,lstat as D}from"node:fs/promises";import{brotliCompressSync as K,brotliDecompressSync as P}from"node:zlib";function Z(e){let n=[];if(e.IsNil())return n;for(let i of e.GetKeys()){let t=e.Reduce(i);t.IsNil()||n.push({name:t.Reduce("name").Visualize(),container_id:t.Reduce("container_id").Visualize()})}return n}function ee(e){let n={};if(e.IsNil())return n;for(let i of e.GetKeys()){let t=e.Reduce(i);t.IsNil()||(n[typeof i=="string"?i:i.Visualize()]=t.Visualize())}return n}function te(e){let n=[];if(e.IsNil())return n;for(let i=0;;i++){let t=e.Reduce(i);if(t.IsNil())break;let s=t.Reduce("reply_to"),o=null;if(!s.IsNil()){o={wire_id:s.Reduce("wire_id").Visualize()};let r=s.Reduce("sentence");r.IsNil()||(o.sentence=parseInt(r.Visualize(),10))}n.push({msg_id:parseInt(t.Reduce("msg_id").Visualize(),10),sender_id:t.Reduce("sender_id").Visualize(),sender_name:t.Reduce("sender_name").Visualize(),text:t.Reduce("text").Visualize(),date:t.Reduce("date").Visualize(),status:t.Reduce("status").Visualize(),wire_id:t.Reduce("wire_id").Visualize(),reply_to:o})}return n}function ie(e){let n=[];if(e.IsNil())return n;for(let i=0;;i++){let t=e.Reduce(i);if(t.IsNil())break;let s=t.Reduce("filename").Visualize(),o=t.Reduce("mime").Visualize()||"application/octet-stream",r=t.Reduce("reply_to"),a=null;if(!r.IsNil()){a={wire_id:r.Reduce("wire_id").Visualize()};let u=parseInt(r.Reduce("sentence").Visualize(),10);Number.isSafeInteger(u)&&u>0&&(a.sentence=u)}n.push({file_id:parseInt(t.Reduce("file_id").Visualize(),10),wire_id:t.Reduce("wire_id").Visualize(),from:{id:t.Reduce("sender_id").Visualize(),name:t.Reduce("sender_name").Visualize()},filename:s,mime:o,size:parseInt(t.Reduce("size").Visualize(),10),size_source:"received_payload",status:t.Reduce("status").Visualize(),date:t.Reduce("date").Visualize(),sha256:null,reply_to:a,kind:p(o,s)?"voice_message":"file"})}return n}function ne(e){if(e.length===0)return"No files received.";let n=[];for(let i of e){let t=i.kind==="voice_message"?"\u{1F3A4} voice message \xB7 ":"";n.push(` \u2022 ${t}${i.filename} (${i.mime}, ${i.size} B) from ${i.from.name} [${i.status}] {${i.wire_id}} sender_id=${i.from.id}`)}return`${n.length} file(s):
2
+ import{c as p,h as w,j as I,k as b,l as x}from"./chunk-DIRW7I4S.js";import{m as h}from"./chunk-CIHGEBUR.js";import{b as _}from"./chunk-T76BFV6S.js";import{b as z}from"./chunk-P55RJGZU.js";import{basename as M,join as $}from"node:path";import{createHash as S,randomUUID as G}from"node:crypto";import{mkdir as C,open as O,rename as v,unlink as N,lstat as D}from"node:fs/promises";import{brotliCompressSync as K,brotliDecompressSync as P}from"node:zlib";function Z(e){let n=[];if(e.IsNil())return n;for(let i of e.GetKeys()){let t=e.Reduce(i);t.IsNil()||n.push({name:t.Reduce("name").Visualize(),container_id:t.Reduce("container_id").Visualize()})}return n}function ee(e){let n={};if(e.IsNil())return n;for(let i of e.GetKeys()){let t=e.Reduce(i);t.IsNil()||(n[typeof i=="string"?i:i.Visualize()]=t.Visualize())}return n}function te(e){let n=[];if(e.IsNil())return n;for(let i=0;;i++){let t=e.Reduce(i);if(t.IsNil())break;let s=t.Reduce("reply_to"),o=null;if(!s.IsNil()){o={wire_id:s.Reduce("wire_id").Visualize()};let r=s.Reduce("sentence");r.IsNil()||(o.sentence=parseInt(r.Visualize(),10))}n.push({msg_id:parseInt(t.Reduce("msg_id").Visualize(),10),sender_id:t.Reduce("sender_id").Visualize(),sender_name:t.Reduce("sender_name").Visualize(),text:t.Reduce("text").Visualize(),date:t.Reduce("date").Visualize(),status:t.Reduce("status").Visualize(),wire_id:t.Reduce("wire_id").Visualize(),reply_to:o})}return n}function ie(e){let n=[];if(e.IsNil())return n;for(let i=0;;i++){let t=e.Reduce(i);if(t.IsNil())break;let s=t.Reduce("filename").Visualize(),o=t.Reduce("mime").Visualize()||"application/octet-stream",r=t.Reduce("reply_to"),a=null;if(!r.IsNil()){a={wire_id:r.Reduce("wire_id").Visualize()};let u=parseInt(r.Reduce("sentence").Visualize(),10);Number.isSafeInteger(u)&&u>0&&(a.sentence=u)}n.push({file_id:parseInt(t.Reduce("file_id").Visualize(),10),wire_id:t.Reduce("wire_id").Visualize(),from:{id:t.Reduce("sender_id").Visualize(),name:t.Reduce("sender_name").Visualize()},filename:s,mime:o,size:parseInt(t.Reduce("size").Visualize(),10),size_source:"received_payload",status:t.Reduce("status").Visualize(),date:t.Reduce("date").Visualize(),sha256:null,reply_to:a,kind:p(o,s)?"voice_message":"file"})}return n}function ne(e){if(e.length===0)return"No files received.";let n=[];for(let i of e){let t=i.kind==="voice_message"?"\u{1F3A4} voice message \xB7 ":"";n.push(` \u2022 ${t}${i.filename} (${i.mime}, ${i.size} B) from ${i.from.name} [${i.status}] {${i.wire_id}} sender_id=${i.from.id}`)}return`${n.length} file(s):
3
3
  ${n.join(`
4
4
  `)}`}async function j(e,n,i){await C(e,{recursive:!0,mode:448});let t=await D(e);if(!t.isDirectory()||t.isSymbolicLink())throw new Error("received-files directory is not a safe directory");let s=$(e,`.${M(n)}.${G()}.tmp`),o=await O(s,"wx",384);try{await o.writeFile(i),await o.sync()}catch(r){throw await o.close().catch(()=>{}),await N(s).catch(()=>{}),r}await o.close();try{await v(s,n)}catch(r){throw await N(s).catch(()=>{}),r}}async function re(e,n){let i=[];if(n.IsNil())return{text:"No new files.",files:i};let t=h(e),s=[];for(let o=0;;o++){let r=n.Reduce(o);if(r.IsNil())break;let a=r.Reduce("filename").Visualize(),u=r.Reduce("mime").Visualize()||"application/octet-stream",f=r.Reduce("sender_name").Visualize(),A=r.Reduce("sender_id").Visualize(),F=parseInt(r.Reduce("file_id").Visualize(),10),B=r.Reduce("date").Visualize(),d=r.Reduce("wire_id").Visualize(),c=Buffer.from(r.Reduce("data").GetBinary()),V=S("sha256").update(c).digest("hex"),l=$(t,`${d}-${z(a)}`);await j(t,l,c);let g={file_id:F,wire_id:d,from:{id:A,name:f},filename:a,path:l,mime:u,size:c.length,sha256:V,status:"processed",date:B,kind:p(u,a)?"voice_message":"file",sender:f};if(p(u,a)){let y=w(_.stt),m;if(!y.ready)m={kind:"unconfigured",reason:y.reason};else{let R=await I(c,a,u,_.stt);m=R.ok?{kind:"transcript",text:R.text}:{kind:"failed",error:R.error}}g.transcription=b(y,m,{audioPath:l,wireId:d}),s.push(x({sender:f,wire:d,savedPath:l,sizeBytes:c.length},m)),i.push(g);continue}i.push(g),s.push(` \u2022 ${a} (${u}, ${c.length} B, sha256 ${V}) from ${f} \u2192 ${l} {${d}}`)}return s.length===0?{text:"No new files.",files:i}:{text:`${s.length} new file(s) written to your identity's files dir \u2014 paths + metadata below (bytes stay on disk, never in this result). If your OS user can read the path, use it directly; otherwise use save_file({ wire_id, dest_path }) to stream a copy to a path you can write:
5
5
  ${s.join(`
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{b as s,e as p}from"./chunk-2BSXRX6I.js";import{I as f,M as c,Q as g,S as l,w as u}from"./chunk-G3CKYZJ7.js";import{c as d,d as a}from"./chunk-NOOGH2RZ.js";function S(e,t){if(!s||!d.has(s))return null;let r=d.get(t)??[...d.values()].find(n=>n.cid===t);if(!r||r.name===e.name)return null;let i=n=>n.name===s||p(n).roleId!=="";return i(e)&&i(r)?r:null}async function V(e,t,r){let i=l(t);return await f(async n=>{await c(e,"::actor::connect_sibling",{name:t.name,target_ad:e.pw.packet.NewBinaryFromBuffer(i).Attach(n),text:r},n)}),u(e),`"${t.name}" was not a contact yet \u2014 connected as an intra-root sibling (delegation-cert auto-accept) and delivered the message.`}async function N(e,t,r){if(!a)throw new Error(`"${t}" is not a contact, and the local contact book is unavailable.`);let i=g(),n=i[t]??Object.values(i).find(o=>o.container_id===t);if(!n)throw new Error(`"${t}" is not a contact and has no local contact-book entry. Use generate_invite/add_contact for remote peers, or list_local_contact_book to see local ones.`);if(n.container_id===e.cid)throw new Error("that contact-book entry is this identity itself.");let m=Buffer.from(n.address_document,"base64url"),w=Buffer.from(n.registrar_sig,"base64url"),y=l(e);return await f(async o=>{let k=await c(a,"::actor::mint_introduction",{joiner_ad:a.pw.packet.NewBinaryFromBuffer(y).Attach(o),target_ad:a.pw.packet.NewBinaryFromBuffer(m).Attach(o)},o),b=Buffer.from(k.Reduce("intro").GetBinary());await c(e,"::actor::connect_local",{name:n.name,target_ad:e.pw.packet.NewBinaryFromBuffer(m).Attach(o),intro:e.pw.packet.NewBinaryFromBuffer(b).Attach(o),entry_sig:e.pw.packet.NewBinaryFromBuffer(w).Attach(o),text:r},o)}),u(e),`"${n.name}" was not a contact yet \u2014 connected via the local contact book and sent the message with the introduction. If "${n.name}" requires approval for local introductions, delivery completes once they approve.`}var R=e=>{let t=n=>!e.Reduce(n).IsNil(),r=e.Reduce("wire_id").Visualize(),i=t("sent_to")?e.Reduce("sent_to").Visualize():"";if(t("downgrade_refused"))return{kind:"refused",wireId:r,cid:i};if(t("migrating"))return{kind:"migrating",wireId:r,cid:i,queued:t("queued")?Number(e.Reduce("queued").Visualize()):0};if(t("route")){let n=t("retained")&&!e.Reduce("retained").GetBoolean();return{kind:"e2e",wireId:r,cid:i,notRetained:n}}return t("deferred")?{kind:"deferred",wireId:r,queued:t("queued")?Number(e.Reduce("queued").Visualize()):0}:{kind:"sent",wireId:r}};export{S as a,V as b,N as c,R as d};
2
+ import{b as s,e as p}from"./chunk-2PVVBIA7.js";import{I as f,M as c,Q as g,S as l,w as u}from"./chunk-MQ5AXTPT.js";import{c as d,d as a}from"./chunk-CIHGEBUR.js";function S(e,t){if(!s||!d.has(s))return null;let r=d.get(t)??[...d.values()].find(n=>n.cid===t);if(!r||r.name===e.name)return null;let i=n=>n.name===s||p(n).roleId!=="";return i(e)&&i(r)?r:null}async function V(e,t,r){let i=l(t);return await f(async n=>{await c(e,"::actor::connect_sibling",{name:t.name,target_ad:e.pw.packet.NewBinaryFromBuffer(i).Attach(n),text:r},n)}),u(e),`"${t.name}" was not a contact yet \u2014 connected as an intra-root sibling (delegation-cert auto-accept) and delivered the message.`}async function N(e,t,r){if(!a)throw new Error(`"${t}" is not a contact, and the local contact book is unavailable.`);let i=g(),n=i[t]??Object.values(i).find(o=>o.container_id===t);if(!n)throw new Error(`"${t}" is not a contact and has no local contact-book entry. Use generate_invite/add_contact for remote peers, or list_local_contact_book to see local ones.`);if(n.container_id===e.cid)throw new Error("that contact-book entry is this identity itself.");let m=Buffer.from(n.address_document,"base64url"),w=Buffer.from(n.registrar_sig,"base64url"),y=l(e);return await f(async o=>{let k=await c(a,"::actor::mint_introduction",{joiner_ad:a.pw.packet.NewBinaryFromBuffer(y).Attach(o),target_ad:a.pw.packet.NewBinaryFromBuffer(m).Attach(o)},o),b=Buffer.from(k.Reduce("intro").GetBinary());await c(e,"::actor::connect_local",{name:n.name,target_ad:e.pw.packet.NewBinaryFromBuffer(m).Attach(o),intro:e.pw.packet.NewBinaryFromBuffer(b).Attach(o),entry_sig:e.pw.packet.NewBinaryFromBuffer(w).Attach(o),text:r},o)}),u(e),`"${n.name}" was not a contact yet \u2014 connected via the local contact book and sent the message with the introduction. If "${n.name}" requires approval for local introductions, delivery completes once they approve.`}var R=e=>{let t=n=>!e.Reduce(n).IsNil(),r=e.Reduce("wire_id").Visualize(),i=t("sent_to")?e.Reduce("sent_to").Visualize():"";if(t("downgrade_refused"))return{kind:"refused",wireId:r,cid:i};if(t("migrating"))return{kind:"migrating",wireId:r,cid:i,queued:t("queued")?Number(e.Reduce("queued").Visualize()):0};if(t("route")){let n=t("retained")&&!e.Reduce("retained").GetBoolean();return{kind:"e2e",wireId:r,cid:i,notRetained:n}}return t("deferred")?{kind:"deferred",wireId:r,queued:t("queued")?Number(e.Reduce("queued").Visualize()):0}:{kind:"sent",wireId:r}};export{S as a,V as b,N as c,R as d};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a as H}from"./chunk-IU6MOFTJ.js";import{c as L,d as B}from"./chunk-K2UCTMMS.js";import{d as F}from"./chunk-EWT5DWPA.js";import{a as u,b as n,c as A,d as U,e as P,f as C}from"./chunk-2BSXRX6I.js";import{A as I,C as D,D as N,W as M,j as k,v as h,x as g}from"./chunk-G3CKYZJ7.js";import{a as v,b as E,c as O}from"./chunk-YRPUM6JG.js";import{g as $}from"./chunk-BCVDO2DW.js";import{a as f,b as _,c as l,d as b,q as y,r as S,w as R}from"./chunk-NOOGH2RZ.js";import{d as m,h as s,i as o}from"./chunk-QXKDTQMT.js";import{adapt_wrapper as K}from"@adapt-toolkit/sdk/executables";var T=!1;function ne(){return T}function j(){if(T)throw new Error('bootWrapper() has already run in this process. It boots the ADAPT environment, which can only be initialised once \u2014 a second call fails inside the native layer with "Failed to invoke initializer in ADAPT environment", which names neither the double init nor the caller. NOTE THAT startDaemon() CALLS bootWrapper() ITSELF: the two are alternatives, not steps. Use startDaemon() for the HTTP daemon, or bootWrapper() alone for a stdio/in-process host \u2014 never both.');T=!0,H()}async function ae(){j(),s?.update("wrapper"),O(v());let x=["--broker_address",m,"--test_mode","--logger_config","--level","INFO","--stdout","stderr","--logger_config_end"];o(`booting wrapper (unit ${E.hash.slice(0,12)}\u2026, broker ${m})`),_(await K.start(x)),f.on_packet_created_cb=e=>o(`wrapper: packet ready ${e.slice(0,12)}\u2026`),f.start();let p=Number(process.env.OURS_TEST_BOOT_HOLD_MS||"")||0;p>0&&(o(`TEST HOLD: boot window open ${p}ms (OURS_TEST_BOOT_HOLD_MS)`),await new Promise(e=>setTimeout(e,p))),s?.update("registrar");try{await N()}catch(e){o("failed to start the contact-book registrar (local contact book disabled):",String(e))}S();let i=R(),d=Math.max(0,Number(process.env.OURS_TEST_FAKE_RESTORE_COUNT||"")||0),c=Math.max(0,Number(process.env.OURS_TEST_FAKE_RESTORE_MS||"")||0),W=i.length===0&&d>0?d:i.length;s?.update("identities",{completed:0,total:W});for(let e of i)I.add(e);if(i.length===0&&d>0){o(`TEST: simulating ${d} fake identity restore(s), ${c}ms each`);for(let e=0;e<d;e++)c>0&&await new Promise(a=>setTimeout(a,c)),s?.update("identities",{completed:e+1,total:d})}else if(i.length===0)o("no persisted identities \u2014 start with create_identity");else{o(`restoring ${i.length} identit${i.length===1?"y":"ies"}: ${i.join(", ")}`);for(let[e,a]of i.entries()){try{let t=await D(a);b&&await M(t);let r=y(t.dir);r&&(t.temp=r)}catch(t){o(`failed to restore "${a}":`,String(t))}s?.update("identities",{completed:e+1,total:i.length})}}s?.update("reconciliation"),F(),u(A()),n&&!l.has(n)&&(o(`root marker names a missing identity "${n}" \u2014 clearing it`),u(null),U()),n&&o(`root identity: ${n}`);{let e=n?l.get(n):void 0;n&&!e&&o(`re-delegation on upgrade DEGRADED: root "${n}" is not among the restored identities \u2014 role certs not refreshed this boot`);let a=[];if(e)for(let t of l.values()){if(t.name===e.name)continue;let r;try{r=P(t)}catch{r=void 0}if(!(!r||!r.hasCert)){if(r.rootCid!==e.cid){o(`[${t.name}] re-delegation skipped: delegated by a different root (${r.rootCid.slice(0,12)}\u2026), not this host root \u2014 left as-is`);continue}try{await C(e,t),a.push(t)}catch(w){k(t,{event:"redelegation_failed",error:String(w).slice(0,300)}),o(`[${t.name}] boot re-delegation (upgrade cert refresh) failed:`,String(w))}}}for(let t of l.values()){await h(t),await g(t);for(let r of[1e4,3e4,9e4])setTimeout(()=>{h(t).catch(()=>{})},r),setTimeout(()=>{g(t).catch(()=>{})},r)}a.length>0&&o(`refreshed ${a.length} role delegation cert(s) against the live AD on boot`)}$(),B(),L()}export{ne as a,ae as b};
2
+ import{a as H}from"./chunk-EHCBEY52.js";import{c as L,d as B}from"./chunk-K7TLSZ3X.js";import{d as F}from"./chunk-3CDGP5EO.js";import{a as u,b as n,c as A,d as U,e as P,f as C}from"./chunk-2PVVBIA7.js";import{A as I,C as D,D as N,W as M,j as k,v as h,x as g}from"./chunk-MQ5AXTPT.js";import{a as v,b as E,c as O}from"./chunk-YRPUM6JG.js";import{g as $}from"./chunk-7JZS2BAP.js";import{a as f,b as _,c as l,d as b,q as y,r as S,v as R}from"./chunk-CIHGEBUR.js";import{d as m,h as s,i as o}from"./chunk-T76BFV6S.js";import{adapt_wrapper as K}from"@adapt-toolkit/sdk/executables";var T=!1;function ne(){return T}function j(){if(T)throw new Error('bootWrapper() has already run in this process. It boots the ADAPT environment, which can only be initialised once \u2014 a second call fails inside the native layer with "Failed to invoke initializer in ADAPT environment", which names neither the double init nor the caller. NOTE THAT startDaemon() CALLS bootWrapper() ITSELF: the two are alternatives, not steps. Use startDaemon() for the HTTP daemon, or bootWrapper() alone for a stdio/in-process host \u2014 never both.');T=!0,H()}async function ae(){j(),s?.update("wrapper"),O(v());let x=["--broker_address",m,"--test_mode","--logger_config","--level","INFO","--stdout","stderr","--logger_config_end"];o(`booting wrapper (unit ${E.hash.slice(0,12)}\u2026, broker ${m})`),_(await K.start(x)),f.on_packet_created_cb=e=>o(`wrapper: packet ready ${e.slice(0,12)}\u2026`),f.start();let p=Number(process.env.OURS_TEST_BOOT_HOLD_MS||"")||0;p>0&&(o(`TEST HOLD: boot window open ${p}ms (OURS_TEST_BOOT_HOLD_MS)`),await new Promise(e=>setTimeout(e,p))),s?.update("registrar");try{await N()}catch(e){o("failed to start the contact-book registrar (local contact book disabled):",String(e))}S();let i=R(),d=Math.max(0,Number(process.env.OURS_TEST_FAKE_RESTORE_COUNT||"")||0),c=Math.max(0,Number(process.env.OURS_TEST_FAKE_RESTORE_MS||"")||0),W=i.length===0&&d>0?d:i.length;s?.update("identities",{completed:0,total:W});for(let e of i)I.add(e);if(i.length===0&&d>0){o(`TEST: simulating ${d} fake identity restore(s), ${c}ms each`);for(let e=0;e<d;e++)c>0&&await new Promise(a=>setTimeout(a,c)),s?.update("identities",{completed:e+1,total:d})}else if(i.length===0)o("no persisted identities \u2014 start with create_identity");else{o(`restoring ${i.length} identit${i.length===1?"y":"ies"}: ${i.join(", ")}`);for(let[e,a]of i.entries()){try{let t=await D(a);b&&await M(t);let r=y(t.dir);r&&(t.temp=r)}catch(t){o(`failed to restore "${a}":`,String(t))}s?.update("identities",{completed:e+1,total:i.length})}}s?.update("reconciliation"),F(),u(A()),n&&!l.has(n)&&(o(`root marker names a missing identity "${n}" \u2014 clearing it`),u(null),U()),n&&o(`root identity: ${n}`);{let e=n?l.get(n):void 0;n&&!e&&o(`re-delegation on upgrade DEGRADED: root "${n}" is not among the restored identities \u2014 role certs not refreshed this boot`);let a=[];if(e)for(let t of l.values()){if(t.name===e.name)continue;let r;try{r=P(t)}catch{r=void 0}if(!(!r||!r.hasCert)){if(r.rootCid!==e.cid){o(`[${t.name}] re-delegation skipped: delegated by a different root (${r.rootCid.slice(0,12)}\u2026), not this host root \u2014 left as-is`);continue}try{await C(e,t),a.push(t)}catch(w){k(t,{event:"redelegation_failed",error:String(w).slice(0,300)}),o(`[${t.name}] boot re-delegation (upgrade cert refresh) failed:`,String(w))}}}for(let t of l.values()){await h(t),await g(t);for(let r of[1e4,3e4,9e4])setTimeout(()=>{h(t).catch(()=>{})},r),setTimeout(()=>{g(t).catch(()=>{})},r)}a.length>0&&o(`refreshed ${a.length} role delegation cert(s) against the live AD on boot`)}$(),B(),L()}export{ne as a,ae as b};
@@ -0,0 +1,5 @@
1
+ import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
+ import*as o from"node:fs";import{randomBytes as S}from"node:crypto";import{homedir as g}from"node:os";import{resolve as c,join as a,dirname as p,basename as b}from"node:path";var y=["owner","shared","open"],s={brokerUrl:"wss://broker1.ours.network",port:3050,stateDir:c(g(),".ours"),gcIntervalMs:36e5,apiVisibility:"owner"};function d(){return process.env.OURS_CONFIG??a(g(),".ours","config.json")}function T(){let t;try{t=o.readFileSync(d(),"utf8")}catch{return{}}let e;try{e=JSON.parse(t)}catch{return{}}let r={};if(typeof e.brokerUrl=="string"&&(r.brokerUrl=e.brokerUrl),typeof e.port=="number"&&Number.isFinite(e.port)&&(r.port=e.port),typeof e.stateDir=="string"&&(r.stateDir=c(e.stateDir)),typeof e.gcIntervalMs=="number"&&Number.isFinite(e.gcIntervalMs)&&(r.gcIntervalMs=e.gcIntervalMs),typeof e.apiVisibility=="string"&&y.includes(e.apiVisibility)&&(r.apiVisibility=e.apiVisibility),typeof e.apiToken=="string"&&e.apiToken.trim()&&(r.apiToken=e.apiToken.trim()),e.stt&&typeof e.stt=="object"){let i=e.stt,n={};typeof i.provider=="string"&&(n.provider=i.provider),typeof i.apiKey=="string"&&(n.apiKey=i.apiKey),typeof i.model=="string"&&(n.model=i.model),typeof i.baseUrl=="string"&&(n.baseUrl=i.baseUrl),typeof i.language=="string"&&(n.language=i.language),typeof i.maxBytes=="number"&&Number.isFinite(i.maxBytes)&&(n.maxBytes=i.maxBytes),typeof i.timeoutMs=="number"&&Number.isFinite(i.timeoutMs)&&(n.timeoutMs=i.timeoutMs),i.custom&&typeof i.custom=="object"&&(n.custom=i.custom),r.stt=n}return r}function _(){let t=process.env.OURS_API_VISIBILITY?.trim().toLowerCase();return t&&y.includes(t)?t:void 0}function l(t){let e=process.env[t];if(e===void 0)return;let r=parseInt(e,10);return Number.isNaN(r)?void 0:r}function E(){let t=T();return{brokerUrl:process.env.OURS_BROKER_URL??t.brokerUrl??s.brokerUrl,port:l("OURS_PORT")??t.port??s.port,stateDir:c(process.env.OURS_STATE_DIR??t.stateDir??s.stateDir),gcIntervalMs:l("OURS_GC_INTERVAL_MS")??t.gcIntervalMs??s.gcIntervalMs,apiVisibility:_()??t.apiVisibility??s.apiVisibility,apiToken:process.env.OURS_API_TOKEN?.trim()||t.apiToken,stt:v(t.stt)}}function v(t){let e={};process.env.OURS_STT_PROVIDER?.trim()&&(e.provider=process.env.OURS_STT_PROVIDER.trim()),process.env.OURS_STT_API_KEY?.trim()&&(e.apiKey=process.env.OURS_STT_API_KEY.trim()),process.env.OURS_STT_MODEL?.trim()&&(e.model=process.env.OURS_STT_MODEL.trim()),process.env.OURS_STT_BASE_URL?.trim()&&(e.baseUrl=process.env.OURS_STT_BASE_URL.trim()),process.env.OURS_STT_LANGUAGE?.trim()&&(e.language=process.env.OURS_STT_LANGUAGE.trim());let r={...t??{},...e};return Object.keys(r).length?r:void 0}var O="daemon-token";function k(t){return a(t.stateDir,O)}function C(t){let e=process.env.OURS_API_TOKEN?.trim();return e||t.apiToken?.trim()||void 0}function F(t,e={}){let r=process.env.OURS_API_TOKEN?.trim();if(r)return{token:r,source:"env"};let i=t.apiToken?.trim();if(i)return{token:i,source:"config"};let n=k(t);try{let u=o.readFileSync(n,"utf8").trim();if(u)return{token:u,source:"file"}}catch{}if(!e.generate)return null;let f=S(32).toString("hex");try{o.mkdirSync(p(n),{recursive:!0}),o.writeFileSync(n,f+`
3
+ `,{mode:384}),o.chmodSync(n,384)}catch{}return{token:f,source:"generated"}}function w(t){let e=d();o.mkdirSync(p(e),{recursive:!0}),o.writeFileSync(e,JSON.stringify(t,null,2)+`
4
+ `,{mode:384});try{o.chmodSync(e,384)}catch{}return e}var m=".ours-identity";function I(t){if(!t.name.trim())throw new Error("identity name must not be empty");let e={identity:t.name.trim()};return t.force&&(e.force=!0),e.expose_local=t.exposeLocal??!0,e.local_auto_accept=t.localAutoAccept??!0,e}function U(t){let e=c(t);return b(e)===m?e:a(e,m)}function N(t,e,r=!1){let i=I(e),n=U(t);if(!r&&o.existsSync(n))throw new Error(`${n} already exists \u2014 pass overwrite to replace it`);return o.mkdirSync(p(n),{recursive:!0}),o.writeFileSync(n,JSON.stringify(i,null,2)+`
5
+ `),n}export{y as a,s as b,d as c,E as d,O as e,k as f,C as g,F as h,w as i,m as j,I as k,U as l,N as m};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-SBQCXH54.js";import{M as i}from"./chunk-65KGEJBX.js";import{H as u,I as d,J as l,M as p}from"./chunk-G3CKYZJ7.js";function m(s){let o=[],r=s.Reduce("messages");if(r.IsNil())return o;for(let e=0;;e++){let t=r.Reduce(e);if(t.IsNil())break;let n=t.Reduce("wire_id"),c=t.Reduce("receipt");o.push({dir:t.Reduce("dir").Visualize()==="out"?"out":"in",text:t.Reduce("text").Visualize(),date:t.Reduce("date").Visualize(),read:t.Reduce("read").GetBoolean(),wire_id:n.IsNil()?"":n.Visualize(),receipt:c.IsNil()?null:c.Visualize()})}return o}async function _(s,o){let r=a(s);try{let e=u(t=>m(l(r,"::actor::get_conversation",t,{contact:o.contact})));return{contact:o.contact,messages:e}}catch(e){throw i("get_conversation",String(e))}}async function v(s,o){let r=a(s);try{let e=u(t=>{let n=l(r,"::actor::get_receipts",t,{contact:o.contact}).Reduce("receipts"),c={};if(n.IsNil())return c;for(let R of n.GetKeys()){let y=R.Visualize();c[y]=n.Reduce(y).Visualize()}return c});return{contact:o.contact,receipts:e}}catch(e){throw i("get_receipts",String(e))}}async function h(s,o){let r=a(s);try{let e=await d(async t=>{let n=await p(r,"::actor::mark_read",{contact:o.contact},t);return Number(n.Reduce("marked").Visualize())});return{contact:o.contact,marked:e}}catch(e){throw i("mark_read",String(e))}}async function C(s,o){let r=a(s);try{return await d(async e=>{let t=await p(r,"::actor::set_local_policy",{keep_history:o.keep_history},e);return{keepHistory:t.Reduce("keep_history").GetBoolean(),autoAccept:t.Reduce("auto_accept").GetBoolean()}})}catch(e){throw i("set_local_policy",String(e))}}export{_ as a,v as b,h as c,C as d};
2
+ import{a}from"./chunk-HPPNU5YV.js";import{M as i}from"./chunk-65KGEJBX.js";import{H as u,I as d,J as l,M as p}from"./chunk-MQ5AXTPT.js";function m(s){let o=[],r=s.Reduce("messages");if(r.IsNil())return o;for(let e=0;;e++){let t=r.Reduce(e);if(t.IsNil())break;let n=t.Reduce("wire_id"),c=t.Reduce("receipt");o.push({dir:t.Reduce("dir").Visualize()==="out"?"out":"in",text:t.Reduce("text").Visualize(),date:t.Reduce("date").Visualize(),read:t.Reduce("read").GetBoolean(),wire_id:n.IsNil()?"":n.Visualize(),receipt:c.IsNil()?null:c.Visualize()})}return o}async function _(s,o){let r=a(s);try{let e=u(t=>m(l(r,"::actor::get_conversation",t,{contact:o.contact})));return{contact:o.contact,messages:e}}catch(e){throw i("get_conversation",String(e))}}async function v(s,o){let r=a(s);try{let e=u(t=>{let n=l(r,"::actor::get_receipts",t,{contact:o.contact}).Reduce("receipts"),c={};if(n.IsNil())return c;for(let R of n.GetKeys()){let y=R.Visualize();c[y]=n.Reduce(y).Visualize()}return c});return{contact:o.contact,receipts:e}}catch(e){throw i("get_receipts",String(e))}}async function h(s,o){let r=a(s);try{let e=await d(async t=>{let n=await p(r,"::actor::mark_read",{contact:o.contact},t);return Number(n.Reduce("marked").Visualize())});return{contact:o.contact,marked:e}}catch(e){throw i("mark_read",String(e))}}async function C(s,o){let r=a(s);try{return await d(async e=>{let t=await p(r,"::actor::set_local_policy",{keep_history:o.keep_history},e);return{keepHistory:t.Reduce("keep_history").GetBoolean(),autoAccept:t.Reduce("auto_accept").GetBoolean()}})}catch(e){throw i("set_local_policy",String(e))}}export{_ as a,v as b,h as c,C as d};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
+ var E=32;export{E as a};
@@ -77,6 +77,11 @@ export declare class OursClient {
77
77
  private readonly clientPid;
78
78
  private readonly apiToken;
79
79
  private readonly fetchImpl;
80
+ /**
81
+ * Low-level, unverified construction seam for injected transports and tests.
82
+ * Applications should use `attachOursClient`, which proves endpoint/state-root
83
+ * coherence before this client can send a credential-bearing request.
84
+ */
80
85
  constructor(opts: OursClientOptions);
81
86
  private headers;
82
87
  /**
@@ -9,11 +9,22 @@ export type DaemonSelectionErrorCode =
9
9
  /** A config file was named and could not be read. */
10
10
  | 'CONFIG_UNREADABLE'
11
11
  /** A config file was read and does not say what it must. */
12
- | 'CONFIG_INVALID';
12
+ | 'CONFIG_INVALID'
13
+ /** No daemon answered at the coherently selected endpoint. */
14
+ | 'DAEMON_UNAVAILABLE';
13
15
  export declare class DaemonSelectionError extends Error {
14
16
  readonly code: DaemonSelectionErrorCode;
15
17
  constructor(code: DaemonSelectionErrorCode, message: string);
16
18
  }
19
+ /** A coherent daemon selection whose loopback endpoint is not running. */
20
+ export declare class DaemonUnavailableError extends DaemonSelectionError {
21
+ readonly endpoint: string;
22
+ readonly stateDir: string;
23
+ constructor(endpoint: string, stateDir: string, options?: {
24
+ cause?: unknown;
25
+ });
26
+ }
27
+ import { OursClient } from './http.js';
17
28
  /**
18
29
  * Where a resolved field came from. `token-file` is the daemon's own last resort:
19
30
  * `<stateDir>/daemon-token`, written 0600 by the daemon in `owner` visibility.
@@ -106,3 +117,20 @@ export declare function assertDaemonStateDir(config: ResolvedDaemonConfig, opts?
106
117
  fetch?: typeof globalThis.fetch;
107
118
  timeoutMs?: number;
108
119
  }): Promise<void>;
120
+ export interface AttachOursClientOptions extends ResolveDaemonConfigOptions {
121
+ /** Stable lease token for this application session; random when omitted. */
122
+ readonly leaseToken?: string;
123
+ /** OS-authoritative client pid; defaults to process.pid. */
124
+ readonly clientPid?: number;
125
+ /** Injected transport for tests or a host-specific HTTP implementation. */
126
+ readonly fetch?: typeof globalThis.fetch;
127
+ }
128
+ /**
129
+ * The supported application attach path.
130
+ *
131
+ * It resolves endpoint, state directory and token as one coherent selection,
132
+ * proves the daemon's state root through unauthenticated `/state-dir`, and only
133
+ * then creates a credential-bearing client. Applications should use this rather
134
+ * than constructing OursClient directly.
135
+ */
136
+ export declare function attachOursClient(options?: AttachOursClientOptions): Promise<OursClient>;
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d,e,f}from"../chunk-IDH22QWU.js";import"../chunk-IB2U7K6Y.js";export{c as DAEMON_TOKEN_FILE,b as DEFAULT_DAEMON_PORT,a as DaemonSelectionError,f as assertDaemonStateDir,e as describeDaemonConfig,d as resolveDaemonConfig};
2
+ import{a,b,c,d,e,f,g,h}from"../chunk-3KI5FM4I.js";import"../chunk-OA7XXAFG.js";import"../chunk-65KGEJBX.js";import"../chunk-XYU2DSWR.js";import"../chunk-WS6UFNKF.js";export{d as DAEMON_TOKEN_FILE,c as DEFAULT_DAEMON_PORT,a as DaemonSelectionError,b as DaemonUnavailableError,g as assertDaemonStateDir,h as attachOursClient,f as describeDaemonConfig,e as resolveDaemonConfig};
package/dist/client.js CHANGED
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a as H}from"./chunk-OA7XXAFG.js";import{a as I,b as J,c as L,d as O,e as P,f as Q}from"./chunk-IDH22QWU.js";import{A as K,B as S,C as U,D as b,E as h,F as l,G as z,H as A,I as B,J as C,K as D,L as F,M as G,a as e,b as o,c as t,d as i,e as n,f as r,g as c,h as R,i as d,j as f,k as p,l as s,m as v,n as a,o as m,p as x,q as E,r as N,s as g,t as y,u as M,v as j,w as k,x as q,y as u,z as w}from"./chunk-65KGEJBX.js";import"./chunk-XYU2DSWR.js";import"./chunk-IB2U7K6Y.js";export{L as DAEMON_TOKEN_FILE,J as DEFAULT_DAEMON_PORT,I as DaemonSelectionError,H as OursClient,e as OursError,Q as assertDaemonStateDir,P as describeDaemonConfig,t as errBindingReassigned,y as errBoundElsewhere,i as errBoundIdentityGone,D as errDuplicateId,l as errFileTooLarge,U as errFileUnreadable,j as errIdentityClosedWithError,q as errIdentityPartiallyRemoved,B as errInvalidSelection,C as errMalformedId,r as errNameTaken,c as errNoLeaseHeaders,x as errNoLeaseToken,w as errNoPolicyArgs,A as errNoRoot,m as errNoSuchIdentity,o as errNotBound,f as errNotBoundNoName,p as errNotTemporary,a as errPathNotAbsolute,u as errPublicInviteNamed,R as errRandomNameExhausted,d as errRootExists,k as errRootHasRoles,z as errSaveFileFallback,K as errSendFileArgs,S as errSendFileFilenameRequired,b as errSendFileUploadArgs,v as errTempClosedWithError,n as errTempClosingBound,E as errTempClosingChoose,s as errTempOwnedElsewhereClose,M as errTempOwnedElsewhereRemove,N as errTempOwnedLive,g as errTempStale,G as errTool,F as errUnknownOrStaleId,h as errUploadNotFound,O as resolveDaemonConfig};
2
+ import{a as I,b as J,c as L,d as O,e as P,f as Q,g as T,h as V}from"./chunk-3KI5FM4I.js";import{a as H}from"./chunk-OA7XXAFG.js";import{A as K,B as S,C as U,D as b,E as h,F as l,G as z,H as A,I as B,J as C,K as D,L as F,M as G,a as e,b as o,c as t,d as i,e as n,f as r,g as c,h as R,i as d,j as f,k as p,l as s,m as v,n as a,o as m,p as x,q as E,r as N,s as g,t as y,u as M,v as j,w as k,x as q,y as u,z as w}from"./chunk-65KGEJBX.js";import"./chunk-XYU2DSWR.js";import"./chunk-WS6UFNKF.js";export{O as DAEMON_TOKEN_FILE,L as DEFAULT_DAEMON_PORT,I as DaemonSelectionError,J as DaemonUnavailableError,H as OursClient,e as OursError,T as assertDaemonStateDir,V as attachOursClient,Q as describeDaemonConfig,t as errBindingReassigned,y as errBoundElsewhere,i as errBoundIdentityGone,D as errDuplicateId,l as errFileTooLarge,U as errFileUnreadable,j as errIdentityClosedWithError,q as errIdentityPartiallyRemoved,B as errInvalidSelection,C as errMalformedId,r as errNameTaken,c as errNoLeaseHeaders,x as errNoLeaseToken,w as errNoPolicyArgs,A as errNoRoot,m as errNoSuchIdentity,o as errNotBound,f as errNotBoundNoName,p as errNotTemporary,a as errPathNotAbsolute,u as errPublicInviteNamed,R as errRandomNameExhausted,d as errRootExists,k as errRootHasRoles,z as errSaveFileFallback,K as errSendFileArgs,S as errSendFileFilenameRequired,b as errSendFileUploadArgs,v as errTempClosedWithError,n as errTempClosingBound,E as errTempClosingChoose,s as errTempOwnedElsewhereClose,M as errTempOwnedElsewhereRemove,N as errTempOwnedLive,g as errTempStale,G as errTool,F as errUnknownOrStaleId,h as errUploadNotFound,P as resolveDaemonConfig};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d}from"../chunk-EWT5DWPA.js";import"../chunk-BWTNLYDF.js";import"../chunk-2BSXRX6I.js";import"../chunk-G3CKYZJ7.js";import"../chunk-YRPUM6JG.js";import"../chunk-3RZX2WOJ.js";import"../chunk-DIRW7I4S.js";import"../chunk-BCVDO2DW.js";import"../chunk-NOOGH2RZ.js";import"../chunk-QXKDTQMT.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-IB2U7K6Y.js";export{b as PROTOCOL_VERSION,c as clusterSweep,a as envelopeDispatch,d as startClusterSweep};
2
+ import{a,b,c,d}from"../chunk-3CDGP5EO.js";import"../chunk-CGAOZPMV.js";import"../chunk-2PVVBIA7.js";import"../chunk-MQ5AXTPT.js";import"../chunk-YRPUM6JG.js";import"../chunk-TUWHVJ37.js";import"../chunk-DIRW7I4S.js";import"../chunk-7JZS2BAP.js";import"../chunk-CIHGEBUR.js";import"../chunk-T76BFV6S.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-Y3VPZJTG.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-WS6UFNKF.js";export{b as PROTOCOL_VERSION,c as clusterSweep,a as envelopeDispatch,d as startClusterSweep};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d}from"../chunk-BWTNLYDF.js";import"../chunk-2BSXRX6I.js";import"../chunk-G3CKYZJ7.js";import"../chunk-YRPUM6JG.js";import"../chunk-3RZX2WOJ.js";import"../chunk-DIRW7I4S.js";import"../chunk-BCVDO2DW.js";import"../chunk-NOOGH2RZ.js";import"../chunk-QXKDTQMT.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-IB2U7K6Y.js";export{b as buildManifest,d as findAgentOf,c as listAgentsFor,a as manifestCapabilities};
2
+ import{a,b,c,d}from"../chunk-CGAOZPMV.js";import"../chunk-2PVVBIA7.js";import"../chunk-MQ5AXTPT.js";import"../chunk-YRPUM6JG.js";import"../chunk-TUWHVJ37.js";import"../chunk-DIRW7I4S.js";import"../chunk-7JZS2BAP.js";import"../chunk-CIHGEBUR.js";import"../chunk-T76BFV6S.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-Y3VPZJTG.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-WS6UFNKF.js";export{b as buildManifest,d as findAgentOf,c as listAgentsFor,a as manifestCapabilities};
package/dist/config.d.ts CHANGED
@@ -6,7 +6,6 @@ export interface OursConfig {
6
6
  port: number;
7
7
  stateDir: string;
8
8
  gcIntervalMs: number;
9
- autoStart: boolean;
10
9
  apiVisibility: ApiVisibility;
11
10
  apiToken?: string;
12
11
  stt?: SttUserConfig;
package/dist/config.js CHANGED
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d,e,f,g,h,i,j,k,l,m}from"./chunk-IB2U7K6Y.js";export{e as API_TOKEN_FILENAME,a as API_VISIBILITIES,b as DEFAULT_CONFIG,j as IDENTITY_FILENAME,f as apiTokenPath,k as buildIdentityFile,c as configPath,g as explicitApiToken,d as loadConfig,h as resolveApiToken,l as resolveIdentityFilePath,i as writeConfig,m as writeIdentityFile};
2
+ import{a,b,c,d,e,f,g,h,i,j,k,l,m}from"./chunk-WS6UFNKF.js";export{e as API_TOKEN_FILENAME,a as API_VISIBILITIES,b as DEFAULT_CONFIG,j as IDENTITY_FILENAME,f as apiTokenPath,k as buildIdentityFile,c as configPath,g as explicitApiToken,d as loadConfig,h as resolveApiToken,l as resolveIdentityFilePath,i as writeConfig,m as writeIdentityFile};
package/dist/connector.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a as oe}from"./chunk-5EWCIQH6.js";import{mkdirSync as ie,writeFileSync as Me,readFileSync as Ae,readdirSync as Ie,statSync as z,unlinkSync as De,chmodSync as ae,createWriteStream as xe}from"node:fs";import{join as $,dirname as Ne,resolve as $e}from"node:path";import{homedir as Ue}from"node:os";import{Readable as Le}from"node:stream";import{pipeline as Ce}from"node:stream/promises";var Pe="1.7.0",Je=new Set(["choose_identity","create_identity","create_root_identity"]),Fe="save_file",He="get_files",ce=a=>new Promise(g=>setTimeout(g,a)),q=a=>typeof a?.method=="string"&&a.id!==void 0&&a.id!==null,je=a=>a&&typeof a=="object"&&!("method"in a)&&a.id!==void 0&&a.id!==null,de=a=>{let g=a.result;return!!a.error||!!(g&&g.isError)},ue=Number(process.env.OURS_RESTORE_TTL_MS)>0?Number(process.env.OURS_RESTORE_TTL_MS):7*24*60*60*1e3,le=["1","true","yes","on"].includes((process.env.OURS_NO_AUTORESTORE??"").trim().toLowerCase());async function Ye(a){let g=new URL(a.url),S=!1,o=(...e)=>{if(!S)try{process.stderr.write(`[ours-proxy] ${e.join(" ")}
2
+ import{a as oe}from"./chunk-5EWCIQH6.js";import{mkdirSync as ie,writeFileSync as Me,readFileSync as Ae,readdirSync as Ie,statSync as z,unlinkSync as De,chmodSync as ae,createWriteStream as xe}from"node:fs";import{join as $,dirname as Ne,resolve as $e}from"node:path";import{homedir as Ue}from"node:os";import{Readable as Le}from"node:stream";import{pipeline as Ce}from"node:stream/promises";var Pe="2.0.1",Je=new Set(["choose_identity","create_identity","create_root_identity"]),Fe="save_file",He="get_files",ce=a=>new Promise(g=>setTimeout(g,a)),q=a=>typeof a?.method=="string"&&a.id!==void 0&&a.id!==null,je=a=>a&&typeof a=="object"&&!("method"in a)&&a.id!==void 0&&a.id!==null,de=a=>{let g=a.result;return!!a.error||!!(g&&g.isError)},ue=Number(process.env.OURS_RESTORE_TTL_MS)>0?Number(process.env.OURS_RESTORE_TTL_MS):7*24*60*60*1e3,le=["1","true","yes","on"].includes((process.env.OURS_NO_AUTORESTORE??"").trim().toLowerCase());async function Ye(a){let g=new URL(a.url),S=!1,o=(...e)=>{if(!S)try{process.stderr.write(`[ours-proxy] ${e.join(" ")}
3
3
  `)}catch{S=!0,y(0)}},G=()=>{S=!0,y(0)};process.stderr.on("error",G),process.stdout.on("error",G);let B=e=>Number.isInteger(e)&&e>1,W=Number(process.env.OURS_CLIENT_PID),R=B(W)?W:B(process.ppid)?process.ppid:process.pid,Y=(process.env.CLAUDE_CODE_SESSION_ID??"").trim()||`client:${R}`,b=null,I=null,L,f=null,D=new Map,C=new Set,T=null,v=le?null:(process.env.CLAUDE_CODE_SESSION_ID??"").trim()||null,fe=a.stateDir??process.env.OURS_STATE_DIR??$(Ue(),".ours"),k=$(fe,"session-restore"),Q=v&&/^[A-Za-z0-9._-]{1,200}$/.test(v)?v:null,h=Q?$(k,`${Q}.json`):null,X=!1,P=null;function pe(e){if(h)try{ie(k,{recursive:!0,mode:448}),Me(h,JSON.stringify({claudeSessionId:v,identity:e,boundAt:new Date().toISOString()}),{mode:384}),ae(k,448),ae(h,384)}catch(n){o("restore persist failed (non-fatal):",String(n))}}function me(){if(!h)return null;try{if(Date.now()-z(h).mtimeMs>ue)return null;let e=JSON.parse(Ae(h,"utf8"));return(typeof e.identity=="string"?e.identity.trim():"")||null}catch{return null}}function ge(){try{let e=Date.now();for(let n of Ie(k)){if(!n.endsWith(".json"))continue;let t=$(k,n);try{e-z(t).mtimeMs>ue&&(De(t),o("session-restore: pruned expired record",n))}catch{}}}catch{}}let E=(()=>{let e=(process.env.OURS_REQUEST_TIMEOUT_MS??"").trim();if(e==="")return 12e4;let n=Number(e);return Number.isFinite(n)&&n>=0?n:12e4})(),p=new Map,x=new Map;function J(e,n,t){let i=p.get(e);if(!i)return;p.delete(e),i.progressToken!==void 0&&x.delete(i.progressToken);let s=Date.now()-i.sentAt;o(`FAILING BACK request id=${String(e)} method=${i.method} waited_ms=${s} reason=${t}`),m.send({jsonrpc:"2.0",id:e,error:{code:n,message:`ours proxy: no response from the ours daemon for "${i.method}" after ${s}ms (${t}). The request was NOT retried \u2014 retry it yourself if it is safe to repeat.`,data:{reason:t,method:i.method,waitedMs:s}}}).catch(r=>o("fail-back send failed:",String(r)))}E>0&&setInterval(()=>{let n=Date.now();for(let[t,i]of[...p])i.deadline<=n&&J(t,-32001,"watchdog timeout")},1e3).unref?.();let ye=6e4,Z=3,F=0,w=0;function he(e,n){m.send({jsonrpc:"2.0",method:"notifications/message",params:{level:e,logger:"ours-proxy",data:n}}).catch(t=>o("downstream notify failed:",String(t)))}let l=null,we=()=>l,N=!1,O=!1,_=!1,M=[],_e="__ours_proxy_init__",H=0,A=new Set,j=new Set,m=a.transports.createStdioServer();m.onmessage=e=>{let n=[],t=!1;for(let i of U(e)){let s=i;if(s.method==="notifications/initialized"&&(t=!0),q(s)){if(s.method==="initialize"&&(b=s,I)){o("absorbed re-initialize locally \u2014 upstream session kept stable"),m.send({jsonrpc:"2.0",id:s.id,result:I}).catch(r=>o("local initialize reply failed:",String(r)));continue}if(s.method==="tools/call"){let r=s.params;if(r&&Je.has(r.name??"")&&typeof r.arguments?.name=="string"&&D.set(s.id,r.arguments.name),r?.name===He&&C.add(s.id),r?.name===Fe){let c=s.params?.arguments??{};be(s.id,c);continue}}if(E>0){let r=s.id,c=s.params?._meta,d=Date.now();p.set(r,{method:typeof s.method=="string"?s.method:"unknown",sentAt:d,deadline:d+E,transport:null,progressToken:c?.progressToken}),c?.progressToken!==void 0&&x.set(c.progressToken,r)}}n.push(s)}if(n.length){let i=Array.isArray(e)?n:n[0];ee(i)}t&&Se()},m.onclose=()=>void y(0),m.onerror=e=>o("downstream error:",String(e));let K=e=>{o(`stdin ${e} \u2014 the client is gone; shutting down`),y(0)};process.stdin.once("end",()=>K("reached EOF")),process.stdin.once("close",()=>K("closed"));function Se(){if(X||!f)return;X=!0;let e=`__ours_proxy_restore_${++H}__`;A.add(e),P=e,o("session-restore: self-recovering bound identity",`"${f}"`),ee({jsonrpc:"2.0",id:e,method:"tools/call",params:{name:"choose_identity",arguments:{name:f}}})}function Re(e,n){if(!(E<=0))for(let t of U(e)){let i=t.id;if(i===void 0)continue;let s=p.get(i);s&&(s.transport=n)}}async function be(e,n){let t=String(n.wire_id??"").trim(),i=String(n.dest_path??"").trim(),s=(r,c=!1)=>m.send({jsonrpc:"2.0",id:e,result:{content:[{type:"text",text:r}],isError:c}}).catch(d=>o("save_file reply failed:",String(d)));if(!t||!i){await s("save_file: both `wire_id` and `dest_path` are required.",!0);return}if(!/^[A-Za-z0-9]+$/.test(t)){await s("save_file: invalid wire_id.",!0);return}try{let r=new URL(g.href);r.pathname=`/files/${encodeURIComponent(t)}`,r.search="";let c={"x-ours-lease-token":Y};a.apiToken&&(c["x-ours-api-token"]=a.apiToken);let d=await fetch(r,{headers:c});if(d.status===401||d.status===403){await s("save_file: ours daemon authentication failed; the monitor may be disarmed.",!0);return}if(d.status===404){await s(`save_file: no file with wire_id ${t} is available to the bound identity. Run get_files first; it may already be saved, or it belongs to another identity.`,!0);return}if(!d.ok||!d.body){await s(`save_file: ours daemon returned HTTP ${d.status}. Your ours daemon may be too old to support save_file \u2014 update it, or use get_files and copy the returned path yourself.`,!0);return}let u=$e(i);ie(Ne(u),{recursive:!0}),await Ce(Le.fromWeb(d.body),xe(u));let Oe=z(u).size;await s(`Saved file (wire_id ${t}) to ${u} (${Oe} bytes). The bytes were streamed daemon\u2192proxy\u2192disk and never entered this result.`)}catch(r){await s(`save_file failed: ${String(r)}`,!0)}}function ee(e){if(N&&l){let n=l;Re(e,n),l.send(e).catch(t=>{o("upstream send failed:",String(t));let i=U(e),s=i.filter(r=>!q(r));s.length&&M.push(Array.isArray(e)?s:s[0]);for(let r of i){let c=r;q(c)&&p.has(c.id)&&J(c.id,-32e3,"upstream send failed")}V(n,"send failed")})}else M.push(e)}function V(e,n){if(O||_||l!==null&&e!==l)return;o(`upstream dropped (${n}) \u2014 reconnecting`),N=!1;let t=l;l=null;try{t?.close?.()}catch{}if(t)for(let[i,s]of[...p])s.transport===t&&J(i,-32e3,`upstream dropped (${n})`);ke()}function Te(e){e.onmessage=n=>{let t=[];for(let i of U(n)){let s=i;if(s.method==="notifications/progress"){let r=s.params?.progressToken;if(r!==void 0){let c=x.get(r),d=c!==void 0?p.get(c):void 0;d&&(d.deadline=Date.now()+E)}}if(je(s)){let r=s.id,c=p.get(r);c&&(p.delete(r),c.progressToken!==void 0&&x.delete(c.progressToken));let d=s.result?.protocolVersion;if(d&&(j.has(r)||ne(r))){L=d;try{l?.setProtocolVersion?.(d)}catch{}if(I==null&&ne(r)&&!A.has(r)){let u=s.result??null;u&&T&&(u.instructions=`${u.instructions?u.instructions+`
4
4
 
5
5
  `:""}${T}`),I=u}j.delete(r)}if(A.has(r)){A.delete(r),r===P&&(P=null,de(s)&&(f=null,o("session-restore: re-bind refused (identity live elsewhere) \u2014 staying unbound")));continue}if(C.has(r)&&(C.delete(r),a.annotateResult?.(s)&&o("get_files: daemon copy unreadable by this OS user \u2014 asked the agent for a destination")),D.has(r)){let u=D.get(r);D.delete(r),de(s)||(f=u,o("bound identity tracked:",u),pe(u))}}t.push(s)}if(t.length){let i=Array.isArray(n)?t:t[0];m.send(i).catch(s=>o("downstream send failed:",String(s)))}},e.onerror=n=>{let t=String(n);if(o("upstream error:",t),!/Maximum reconnection attempts \(\d+\) exceeded/.test(t))return;let i=Date.now();if(i-F<ye){o(`notification stream exhausted again within cooldown \u2014 not escalating (${Math.round((i-F)/1e3)}s since last)`);return}if(F=i,w++,w>Z){o(`NOTIFICATION STREAM DEAD \u2014 ${w-1} reconnect escalations exhausted; server\u2192client notifications are NOT arriving`),he("error",`ours proxy: the server\u2192client notification stream could not be re-established after ${w-1} attempts. Tool calls still work, but you will NOT receive new-mail or other server notifications until this session reconnects. Treat any "waiting for a message" as unreliable.`);return}o(`notification stream exhausted its retries \u2014 escalating to a full reconnect (${w}/${Z})`),V(e,"notification stream exhausted")},e.onclose=()=>V(e,"closed")}let ne=e=>b!=null&&b.id===e;async function te(){a.ensureDaemon&&await a.ensureDaemon().catch(n=>o("ensureDaemon:",String(n)));let e=a.transports.createHttpClient(g,{reconnectionOptions:{initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:5},requestInit:{headers:{"x-ours-lease-token":Y,"x-ours-client-pid":String(R),...a.apiToken?{"x-ours-api-token":a.apiToken}:{}}}});if(Te(e),await e.start(),L)try{e.setProtocolVersion?.(L)}catch{}l=e}async function se(e,n){n&&e.id!==void 0&&A.add(e.id),await l.send(e)}let ve=()=>{if(R===process.pid)return!0;try{return process.kill(R,0),!0}catch(e){return e.code!=="ESRCH"}};async function ke(){if(_||O)return;_=!0;let e=500;for(;;){if(O){_=!1;return}if(!ve()){o(`client pid ${R} is gone \u2014 abandoning reconnect instead of churning the daemon's sessions`),_=!1,y(0);return}try{if(await te(),b){let t=`${_e}${H}`;j.add(t),await se({...b,id:t},!0),await l.send({jsonrpc:"2.0",method:"notifications/initialized"})}if(f){let t=`__ours_proxy_rebind_${++H}__`;await se({jsonrpc:"2.0",id:t,method:"tools/call",params:{name:"choose_identity",arguments:{name:f}}},!0)}N=!0;let n=M.splice(0);for(let t of n)await l.send(t).catch(i=>o("flush failed:",String(i)));o("upstream reconnected",f?`(re-bound "${f}")`:""),w=0,_=!1;return}catch(n){o("reconnect attempt failed:",String(n)),await ce(e),e=Math.min(Math.floor(e*1.5),1e4)}}}async function y(e){if(!O){O=!0;try{await l?.close()}catch{}try{await m.close()}catch{}process.exit(e)}}process.on("SIGINT",()=>void y(0)),process.on("SIGTERM",()=>void y(0));let re=e=>{let n=e?.code;return n==="EPIPE"||n==="ECONNRESET"||n==="ERR_STREAM_DESTROYED"||n==="ERR_STREAM_WRITE_AFTER_END"};process.on("unhandledRejection",e=>{if(re(e)){S=!0,y(0);return}o("UNHANDLED REJECTION (proxy stays up):",e instanceof Error?e.stack??e.message:String(e))}),process.on("uncaughtException",e=>{if(re(e)){S=!0,y(0);return}o("UNCAUGHT EXCEPTION (proxy stays up):",e?.stack??String(e))});async function Ee(){let e=new URL(g.href);e.pathname="/state-dir";let n;try{n=await(await fetch(e,{signal:AbortSignal.timeout(3e3)})).json()}catch(t){o("compat handshake: could not read daemon /state-dir, proceeding:",String(t));return}T=oe({selfVersion:Pe,daemonVersion:typeof n?.version=="string"?n.version:null}),T&&o(T)}if((async()=>{a.ensureDaemon&&await a.ensureDaemon().catch(t=>o("ensureDaemon:",String(t))),await Ee();let e=500;for(;;)try{await te();break}catch(t){o("initial upstream connect failed, retrying:",String(t)),await ce(e),e=Math.min(Math.floor(e*1.5),1e4)}N=!0;let n=M.splice(0);for(let t=0;t<n.length;t++){let i=we();if(!i){M.unshift(...n.slice(t));break}await i.send(n[t]).catch(s=>o("flush failed:",String(s)))}o(`upstream ready \u2014 stdio \u21C4 ${g.href}`)})(),v){ge();let e=me();e&&(f=e,o("session-restore: found prior binding for this session \u2014 will self-recover",`"${e}"`))}else le&&o("session-restore: disabled via OURS_NO_AUTORESTORE \u2014 pure in-memory binding");await m.start(),o("proxy started (stdio transport up)")}function U(a){return Array.isArray(a)?a:[a]}export{Ye as runProxy};
@@ -0,0 +1,2 @@
1
+ /** Maximum explicit file wire-id selection accepted by getFiles. */
2
+ export declare const FILE_SELECTION_CAP = 32;
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
+ import{a}from"./chunk-Y3VPZJTG.js";export{a as FILE_SELECTION_CAP};
package/dist/gc.js CHANGED
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a,b}from"./chunk-JHS7YUMA.js";import"./chunk-G3CKYZJ7.js";import"./chunk-YRPUM6JG.js";import"./chunk-3RZX2WOJ.js";import"./chunk-DIRW7I4S.js";import"./chunk-BCVDO2DW.js";import"./chunk-NOOGH2RZ.js";import"./chunk-QXKDTQMT.js";import"./chunk-ZHH3PWEW.js";import"./chunk-LKFYUCN7.js";import"./chunk-P55RJGZU.js";import"./chunk-XYU2DSWR.js";import"./chunk-IB2U7K6Y.js";export{a as startGcTimer,b as stopGcTimer};
2
+ import{a,b}from"./chunk-PQXV4GQ5.js";import"./chunk-MQ5AXTPT.js";import"./chunk-YRPUM6JG.js";import"./chunk-TUWHVJ37.js";import"./chunk-DIRW7I4S.js";import"./chunk-7JZS2BAP.js";import"./chunk-CIHGEBUR.js";import"./chunk-T76BFV6S.js";import"./chunk-ZHH3PWEW.js";import"./chunk-LKFYUCN7.js";import"./chunk-Y3VPZJTG.js";import"./chunk-P55RJGZU.js";import"./chunk-XYU2DSWR.js";import"./chunk-WS6UFNKF.js";export{a as startGcTimer,b as stopGcTimer};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d}from"../chunk-4SXZ6CUL.js";import"../chunk-ARYFH7MF.js";import"../chunk-PPJAMKLP.js";import"../chunk-SYRQA3MQ.js";import"../chunk-ZTGUX6EV.js";import"../chunk-E2RQVNQK.js";import"../chunk-VXVW4KJU.js";import"../chunk-LIJDSFUD.js";import"../chunk-WOPXC4VC.js";import"../chunk-SBQCXH54.js";import"../chunk-K2UCTMMS.js";import"../chunk-65KGEJBX.js";import"../chunk-EWT5DWPA.js";import"../chunk-BWTNLYDF.js";import"../chunk-2BSXRX6I.js";import"../chunk-G3CKYZJ7.js";import"../chunk-YRPUM6JG.js";import"../chunk-3RZX2WOJ.js";import"../chunk-DIRW7I4S.js";import"../chunk-BCVDO2DW.js";import"../chunk-NOOGH2RZ.js";import"../chunk-QXKDTQMT.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-IB2U7K6Y.js";export{b as API_OPERATIONS,a as API_PREFIX,c as enterApiSession,d as serveApiOperation};
2
+ import{a,b,c,d}from"../chunk-CGXQP3Q4.js";import"../chunk-TIBWO3T3.js";import"../chunk-XT75POTM.js";import"../chunk-R5ISAB5B.js";import"../chunk-AQK45DI7.js";import"../chunk-OWZIFNZN.js";import"../chunk-VXVW4KJU.js";import"../chunk-V7PKYHV7.js";import"../chunk-64C2NWXL.js";import"../chunk-HPPNU5YV.js";import"../chunk-K7TLSZ3X.js";import"../chunk-65KGEJBX.js";import"../chunk-3CDGP5EO.js";import"../chunk-CGAOZPMV.js";import"../chunk-2PVVBIA7.js";import"../chunk-MQ5AXTPT.js";import"../chunk-YRPUM6JG.js";import"../chunk-TUWHVJ37.js";import"../chunk-DIRW7I4S.js";import"../chunk-7JZS2BAP.js";import"../chunk-CIHGEBUR.js";import"../chunk-T76BFV6S.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-Y3VPZJTG.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-WS6UFNKF.js";export{b as API_OPERATIONS,a as API_PREFIX,c as enterApiSession,d as serveApiOperation};
@@ -118,6 +118,8 @@ export interface DaemonOptions {
118
118
  * CALLBACK FIRES (see the wiring below).
119
119
  */
120
120
  onIdentityNotify?(identityName: string, summary: string, boundSessionId: string | null): void;
121
+ /** Package-private lifecycle hook used by the CLI-bundled state-root lock. */
122
+ onShutdown?(): Promise<void> | void;
121
123
  }
122
124
  export interface DaemonHandle {
123
125
  port: number;
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a}from"../chunk-EUILVQOZ.js";import"../chunk-NBEWKZG4.js";import"../chunk-V64IUVSS.js";import"../chunk-37D5PCFY.js";import"../chunk-JHS7YUMA.js";import"../chunk-4SXZ6CUL.js";import"../chunk-UOHHUOWR.js";import"../chunk-IU6MOFTJ.js";import"../chunk-ARYFH7MF.js";import"../chunk-PPJAMKLP.js";import"../chunk-SYRQA3MQ.js";import"../chunk-ZTGUX6EV.js";import"../chunk-E2RQVNQK.js";import"../chunk-VXVW4KJU.js";import"../chunk-LIJDSFUD.js";import"../chunk-WOPXC4VC.js";import"../chunk-SBQCXH54.js";import"../chunk-K2UCTMMS.js";import"../chunk-65KGEJBX.js";import"../chunk-EWT5DWPA.js";import"../chunk-BWTNLYDF.js";import"../chunk-2BSXRX6I.js";import"../chunk-G3CKYZJ7.js";import"../chunk-YRPUM6JG.js";import"../chunk-3RZX2WOJ.js";import"../chunk-DIRW7I4S.js";import"../chunk-BCVDO2DW.js";import"../chunk-NOOGH2RZ.js";import"../chunk-QXKDTQMT.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-IB2U7K6Y.js";export{a as startDaemon};
2
+ import{a as ye}from"../chunk-NBEWKZG4.js";import{d as $}from"../chunk-V64IUVSS.js";import{a as G}from"../chunk-37D5PCFY.js";import{a as ue,b as z}from"../chunk-PQXV4GQ5.js";import{a as ge,d as he}from"../chunk-CGXQP3Q4.js";import{b as me}from"../chunk-W2BPK7VV.js";import"../chunk-EHCBEY52.js";import"../chunk-TIBWO3T3.js";import"../chunk-XT75POTM.js";import"../chunk-R5ISAB5B.js";import"../chunk-AQK45DI7.js";import{e as le,f as pe,h as fe}from"../chunk-OWZIFNZN.js";import{b as ce}from"../chunk-VXVW4KJU.js";import"../chunk-V7PKYHV7.js";import"../chunk-64C2NWXL.js";import"../chunk-HPPNU5YV.js";import{b as re,c as ae}from"../chunk-K7TLSZ3X.js";import"../chunk-65KGEJBX.js";import{b as de}from"../chunk-3CDGP5EO.js";import"../chunk-CGAOZPMV.js";import"../chunk-2PVVBIA7.js";import{F as se,a as ne,b as U,o as oe,q as ie}from"../chunk-MQ5AXTPT.js";import"../chunk-YRPUM6JG.js";import"../chunk-TUWHVJ37.js";import"../chunk-DIRW7I4S.js";import{a as M,b as ee,c as w,e as L,f as A,g as te}from"../chunk-7JZS2BAP.js";import{c as v,o as Z,u as q}from"../chunk-CIHGEBUR.js";import{a as P,b as Q,c as H,d as W,e as N,g as X,h as b,i as l,m as I,p as Y}from"../chunk-T76BFV6S.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-Y3VPZJTG.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-WS6UFNKF.js";import{createServer as ke}from"node:http";import{randomUUID as Re}from"node:crypto";import*as D from"node:fs";ye();function Ne(r){if(!r||typeof r!="object"||Array.isArray(r))return!1;let f=r;return f.jsonrpc==="2.0"&&f.method==="initialize"}var Oe=["brokerUrl","port","stateDir","gcIntervalMs","apiVisibility"];function we(r){return new Promise((f,u)=>{let O="";r.on("data",g=>O+=g),r.on("end",()=>{try{f(JSON.parse(O))}catch(g){u(g)}}),r.on("error",u)})}async function Ve(r={}){try{return await Ce(r)}catch(f){throw b?.failed(),l(`fatal startup error: ${f?.stack??f}`),f}}async function Ce(r){let f=r.handleSignals!==!1;if(process.env.OURS_TEST_STARTUP_FAIL==="1")throw new Error("forced startup failure (OURS_TEST_STARTUP_FAIL)");if(r.config){let t=Oe.filter(e=>r.config[e]!==Q[e]);if(t.length>0)throw new Error(`startDaemon(config) disagrees with the config resolved at module load (${t.join(", ")}). The engine reads its config when src/runtime/env.ts is imported, so a later override cannot move the state dir, port or broker \u2014 set OURS_* env or config.json before importing the SDK.`)}let u=r.mcp,O=u?.isInitializeRequest??Ne,g=null;if(typeof r.onIdentityNotify=="function"){let t=r.onIdentityNotify;g=(e,i)=>{t(e,i,M.get(e)?.sid??null)},ne(g)}l("booting wrapper\u2026");try{await me(),ue()}catch(t){throw g&&U(g),z(),t}l(`wrapper ready (identities=${v.size}), starting HTTP server\u2026`),b?.update("server");let p={},T=new Map,k=new Map,Se=3e4,J=t=>{let e=k.get(t);e?e.n++:k.set(t,{n:1,since:Date.now()})},B=t=>{let e=k.get(t);e&&--e.n<=0&&k.delete(t)},F=()=>{let t=0;for(let e of[...T.keys()]){if(e==="stdio")continue;let i=w.get(e)?.pid;if(i===void 0||i<=1||L(i))continue;let n=k.get(e);if(n&&n.n>0&&Date.now()-n.since<Se)continue;let o=T.get(e);T.delete(e),delete p[e],w.delete(e),k.delete(e),o?.close().catch(()=>{}),u?.onSessionClosed?.(e),t++,l(`session ${e.slice(0,8)}\u2026 reaped (client pid ${i} dead)`)}return t},V=setInterval(()=>{F(),ae(),fe()},6e4);V.unref?.();let _=1e3,ve=10*6e4,h=new Map,Ie=(t,e)=>{let i=Array.isArray(e)?e:[e];for(let n of i){let o=n;!o||typeof o!="object"||o.id===void 0||o.id===null||typeof o.method!="string"||h.set(`${t}:${String(o.id)}`,{method:o.method,at:Date.now()})}if(h.size>_){let n=Date.now()-ve;for(let[o,a]of h)if(a.at<n&&h.delete(o),h.size<=_)break;for(;h.size>_;){let o=h.keys().next();if(o.done)break;h.delete(o.value)}}},Te=(t,e)=>{try{let i=e instanceof Error?e.message:String(e),n=/No connection established for request ID:\s*(\S+)/.exec(i);if(!n)return;let o=n[1],a=h.get(`${t}:${o}`);h.delete(`${t}:${o}`),l(`UNDELIVERABLE RESPONSE session=${t.slice(0,8)}\u2026 request_id=${o} method=${a?.method??"unknown"} age_ms=${a?Date.now()-a.at:"unknown"} at=${new Date().toISOString()} \u2014 the answer was produced but its stream was already gone`)}catch{}},S=ke(async(t,e)=>{let i=new URL(t.url,`http://localhost:${N}`);if(t.method==="GET"&&i.pathname==="/state-dir"){e.writeHead(200,{"Content-Type":"application/json"}),e.end(JSON.stringify({stateDir:H,version:P,compat:1}));return}if(t.method==="GET"&&(i.pathname==="/version"||i.pathname==="/info")){e.writeHead(200,{"Content-Type":"application/json"}),e.end(JSON.stringify({name:"ours",version:P,compat:1,protocol:de,pid:process.pid,stateDir:H}));return}if(t.method==="GET"&&i.pathname==="/identities"){if(!I(t,e))return;e.writeHead(200,{"Content-Type":"application/json"}),e.end(JSON.stringify({identities:[...v.values()].map(n=>({name:n.name,...n.temp?{temporary:!0,stale:!L(n.temp.owner.pid)}:{}}))}));return}if(t.method==="GET"&&i.pathname==="/unread"){if(!I(t,e))return;e.writeHead(200,{"Content-Type":"application/json"}),e.end(JSON.stringify(ie()));return}{let n=/^\/identities\/([^/]+)\/notifications$/.exec(i.pathname);if(t.method==="GET"&&n){if(!I(t,e))return;let o=decodeURIComponent(n[1]);if(Y(o)!==null){e.writeHead(400,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"invalid identity name"}));return}await oe(t,e,o,i.searchParams.get("since"),i.searchParams.get("kinds"));return}}if(t.method==="POST"&&i.pathname==="/files/upload"){if(!I(t,e))return;let n=t.headers["x-ours-lease-token"],o=typeof n=="string"&&n?A(n):void 0,a=o?v.get(o.identity):void 0;if(!a){e.writeHead(401,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"no identity bound to this session"}));return}let y=t.headers["content-length"],d=typeof y=="string"?Number(y):NaN,m=t.headers["x-ours-filename"];try{let s=await pe(a,t,{filename:typeof m=="string"?decodeURIComponent(m):"",mime:typeof t.headers["content-type"]=="string"?t.headers["content-type"]:"",declaredBytes:Number.isInteger(d)&&d>=0?d:null,cap:ce()});e.writeHead(200,{"Content-Type":"application/json"}),e.end(JSON.stringify(s))}catch(s){let R=s instanceof le?s.status:500;e.headersSent||(e.writeHead(R,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:s instanceof Error?s.message:String(s)})))}return}{let n=/^\/files\/([^/]+)$/.exec(i.pathname);if(t.method==="GET"&&n){if(!I(t,e))return;let o=decodeURIComponent(n[1]),a=t.headers["x-ours-lease-token"],y=typeof a=="string"&&a?A(a):void 0,d=y?v.get(y.identity):void 0;if(!d){e.writeHead(401,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"no identity bound to this session"}));return}let m=q(d,o);if(!m){e.writeHead(404,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:"no such file for the bound identity (run get_files first, or it belongs to another identity)"}));return}try{let s=D.statSync(m);e.writeHead(200,{"Content-Type":"application/octet-stream","Content-Length":String(s.size)});let R=D.createReadStream(m);R.on("error",()=>{try{e.destroy()}catch{}}),R.pipe(e)}catch(s){e.writeHead(500,{"Content-Type":"application/json"}),e.end(JSON.stringify({error:`failed to read file: ${String(s)}`}))}return}}if(i.pathname.startsWith(ge)){await he(t,e,i.pathname,we);return}if(i.pathname!=="/mcp"||!u){e.writeHead(404,{"Content-Type":"text/plain"}),e.end("Not found");return}if(I(t,e))try{if(t.method==="POST"){let n=await we(t),o=t.headers["mcp-session-id"],a=t.headers["x-ours-lease-token"],y=t.headers["x-ours-client-pid"],d=y?parseInt(y,10):void 0,m={token:a,pid:Number.isInteger(d)?d:void 0};if(o&&p[o]){w.set(o,m),Ie(o,n),J(o),$(e);try{await p[o].handleRequest(t,e,n)}finally{B(o)}}else if(!o&&O(n)){F();let s=u.createTransport({sessionIdGenerator:()=>Re(),onsessioninitialized:c=>{p[c]=s,w.set(c,m),T.set(c,E),u.onSessionInitialized?.(c,E),l(`session ${c.slice(0,8)}\u2026 initialized`)}}),R={sessionId:()=>s.sessionId??"pending",leaseToken:()=>w.get(s.sessionId??"pending")?.token,clientPid:()=>w.get(s.sessionId??"pending")?.pid},E=u.createServer(R);E.server.onerror=c=>Te(s.sessionId??"pending",c),s.onclose=()=>{let c=s.sessionId;c&&(delete p[c],T.delete(c),w.delete(c),u.onSessionClosed?.(c),l(`session ${c.slice(0,8)}\u2026 closed (lease kept)`))},await E.connect(s),$(e),await s.handleRequest(t,e,n)}else e.writeHead(400,{"Content-Type":"application/json"}),e.end(JSON.stringify({jsonrpc:"2.0",error:{code:-32e3,message:"Bad Request: No valid session ID"},id:null}))}else if(t.method==="GET"){let n=t.headers["mcp-session-id"];if(!n||!p[n]){e.writeHead(400,{"Content-Type":"text/plain"}),e.end("Invalid or missing session ID");return}J(n),$(e);try{await p[n].handleRequest(t,e)}finally{B(n)}}else if(t.method==="DELETE"){let n=t.headers["mcp-session-id"];if(!n||!p[n]){e.writeHead(400,{"Content-Type":"text/plain"}),e.end("Invalid or missing session ID");return}let o=w.get(n)?.token??t.headers["x-ours-lease-token"];if(o){for(let[a,y]of[...M]){if(y.token!==o)continue;M.delete(a);let d=v.get(a);d?.temp&&d.temp.owner.tokenHash===Z(o)&&!d.temp.closing&&re(d,"owning session released its lease").catch(m=>l(`[${a}] close on lease release failed:`,String(m)))}ee.delete(o),te(),l(`lease released by token \u2026${o.slice(-6)}`)}await p[n].handleRequest(t,e)}else e.writeHead(405,{"Content-Type":"text/plain"}),e.end("Method not allowed")}catch(n){l("HTTP handler error:",String(n)),e.headersSent||(e.writeHead(500,{"Content-Type":"application/json"}),e.end(JSON.stringify({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})))}});S.requestTimeout=0;let K=!1,x=async()=>{if(!K){K=!0,clearInterval(V),z(),g&&U(g);for(let t of Object.keys(p)){try{await p[t].close()}catch{}delete p[t]}T.clear();for(let t of v.values())try{se(t)}catch(e){l(`[${t.name}] shutdown save failed:`,String(e))}S.closeAllConnections?.()}};try{await new Promise((t,e)=>{let i=n=>e(n);S.once("error",i),S.listen(N,"127.0.0.1",()=>{S.off("error",i),b?.ready(),l(`MCP server v${r.version??P} ready (transport=http, port=${N}, visibility=${X}, identities=${v.size}, state=${H}, broker=${W})`),t()})})}catch(t){throw await x(),t}let C=async()=>{l("shutting down\u2026"),await x(),S.close(),await r.onShutdown?.(),process.exit(0)};f&&(process.on("SIGINT",C),process.on("SIGTERM",C));let j=S.address();return{port:typeof j=="object"&&j!==null?j.port:N,close:async()=>{f&&(process.off("SIGINT",C),process.off("SIGTERM",C)),await x(),await new Promise(t=>S.close(()=>t()))}}}export{Ve as startDaemon};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d,e,f,g}from"../chunk-2BSXRX6I.js";import"../chunk-G3CKYZJ7.js";import"../chunk-YRPUM6JG.js";import"../chunk-3RZX2WOJ.js";import"../chunk-DIRW7I4S.js";import"../chunk-BCVDO2DW.js";import"../chunk-NOOGH2RZ.js";import"../chunk-QXKDTQMT.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-IB2U7K6Y.js";export{d as clearRootMarker,f as delegateRole,e as describeIdentity,g as establishRoot,c as readRootMarker,b as rootName,a as setRootName};
2
+ import{a,b,c,d,e,f,g}from"../chunk-2PVVBIA7.js";import"../chunk-MQ5AXTPT.js";import"../chunk-YRPUM6JG.js";import"../chunk-TUWHVJ37.js";import"../chunk-DIRW7I4S.js";import"../chunk-7JZS2BAP.js";import"../chunk-CIHGEBUR.js";import"../chunk-T76BFV6S.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-Y3VPZJTG.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-WS6UFNKF.js";export{d as clearRootMarker,f as delegateRole,e as describeIdentity,g as establishRoot,c as readRootMarker,b as rootName,a as setRootName};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d,e,f,g,h,i}from"../chunk-BCVDO2DW.js";import"../chunk-NOOGH2RZ.js";import"../chunk-QXKDTQMT.js";import"../chunk-ZHH3PWEW.js";import"../chunk-IB2U7K6Y.js";export{i as bindSession,f as leaseByToken,a as leases,d as outboundRemovalInFlight,g as persistBindings,e as pidAlive,h as resolveBound,c as sessionHeaders,b as tombstones};
2
+ import{a,b,c,d,e,f,g,h,i}from"../chunk-7JZS2BAP.js";import"../chunk-CIHGEBUR.js";import"../chunk-T76BFV6S.js";import"../chunk-ZHH3PWEW.js";import"../chunk-Y3VPZJTG.js";import"../chunk-WS6UFNKF.js";export{i as bindSession,f as leaseByToken,a as leases,d as outboundRemovalInFlight,g as persistBindings,e as pidAlive,h as resolveBound,c as sessionHeaders,b as tombstones};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d}from"../chunk-K2UCTMMS.js";import"../chunk-2BSXRX6I.js";import"../chunk-G3CKYZJ7.js";import"../chunk-YRPUM6JG.js";import"../chunk-3RZX2WOJ.js";import"../chunk-DIRW7I4S.js";import"../chunk-BCVDO2DW.js";import"../chunk-NOOGH2RZ.js";import"../chunk-QXKDTQMT.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-IB2U7K6Y.js";export{b as closeTemporaryIdentity,a as deleteIdentityCompletely,d as sweepOrphanTempDirs,c as sweepStaleTempIdentities};
2
+ import{a,b,c,d}from"../chunk-K7TLSZ3X.js";import"../chunk-2PVVBIA7.js";import"../chunk-MQ5AXTPT.js";import"../chunk-YRPUM6JG.js";import"../chunk-TUWHVJ37.js";import"../chunk-DIRW7I4S.js";import"../chunk-7JZS2BAP.js";import"../chunk-CIHGEBUR.js";import"../chunk-T76BFV6S.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-Y3VPZJTG.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-WS6UFNKF.js";export{b as closeTemporaryIdentity,a as deleteIdentityCompletely,d as sweepOrphanTempDirs,c as sweepStaleTempIdentities};
@@ -1,5 +1,6 @@
1
1
  import type { AdaptWrapper, AdaptPacketWrapper } from '@adapt-toolkit/sdk/wrappers';
2
2
  import type { AdaptValue } from '@adapt-toolkit/sdk/backend';
3
+ export { FILE_SELECTION_CAP } from '../constants.js';
3
4
  type Pending = {
4
5
  resolve: (v: AdaptValue) => void;
5
6
  reject: (e: Error) => void;
@@ -61,7 +62,5 @@ export declare function readTempMetaFile(dir: string): {
61
62
  export declare function tightenIdentityPerms(): void;
62
63
  export declare const isWireId: (s: string) => boolean;
63
64
  export declare const isSelectableWireId: (s: string) => boolean;
64
- export declare const FILE_SELECTION_CAP = 32;
65
65
  export declare function findIdentityFile(id: Identity, wireId: string): string | null;
66
66
  export declare function listPersistedNames(): string[];
67
- export {};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w}from"../chunk-NOOGH2RZ.js";import"../chunk-QXKDTQMT.js";import"../chunk-ZHH3PWEW.js";import"../chunk-IB2U7K6Y.js";export{u as FILE_SELECTION_CAP,j as dataPath,m as filesDirFor,v as findIdentityFile,o as hashLeaseToken,c as identities,h as identityDir,t as isSelectableWireId,s as isWireId,i as keyPath,w as listPersistedNames,k as notifyLogPath,q as readTempMetaFile,d as registrar,e as registrarAdBlob,f as setRegistrar,g as setRegistrarAdBlob,b as setWrapper,n as tempMetaPath,r as tightenIdentityPerms,l as unreadPath,a as wrapper,p as writeTempMetaFile};
2
+ import{a as b,b as c,c as d,d as e,e as f,f as g,g as h,h as i,i as j,j as k,k as l,l as m,m as n,n as o,o as p,p as q,q as r,r as s,s as t,t as u,u as v,v as w}from"../chunk-CIHGEBUR.js";import"../chunk-T76BFV6S.js";import"../chunk-ZHH3PWEW.js";import{a}from"../chunk-Y3VPZJTG.js";import"../chunk-WS6UFNKF.js";export{a as FILE_SELECTION_CAP,k as dataPath,n as filesDirFor,v as findIdentityFile,p as hashLeaseToken,d as identities,i as identityDir,u as isSelectableWireId,t as isWireId,j as keyPath,w as listPersistedNames,l as notifyLogPath,r as readTempMetaFile,e as registrar,f as registrarAdBlob,g as setRegistrar,h as setRegistrarAdBlob,c as setWrapper,o as tempMetaPath,s as tightenIdentityPerms,m as unreadPath,b as wrapper,q as writeTempMetaFile};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{A as b,B as c,C as d,z as a}from"../chunk-G3CKYZJ7.js";import"../chunk-YRPUM6JG.js";import"../chunk-3RZX2WOJ.js";import"../chunk-DIRW7I4S.js";import"../chunk-BCVDO2DW.js";import"../chunk-NOOGH2RZ.js";import"../chunk-QXKDTQMT.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-IB2U7K6Y.js";export{a as createPacket,c as provisionIdentity,b as reservedNames,d as restoreIdentity};
2
+ import{A as b,B as c,C as d,z as a}from"../chunk-MQ5AXTPT.js";import"../chunk-YRPUM6JG.js";import"../chunk-TUWHVJ37.js";import"../chunk-DIRW7I4S.js";import"../chunk-7JZS2BAP.js";import"../chunk-CIHGEBUR.js";import"../chunk-T76BFV6S.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-Y3VPZJTG.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-WS6UFNKF.js";export{a as createPacket,c as provisionIdentity,b as reservedNames,d as restoreIdentity};
package/dist/index.d.ts CHANGED
@@ -1,14 +1,6 @@
1
1
  export * from './errors.js';
2
- export type * from './api/types.js';
3
- export * from './api/identity.js';
4
- export * from './api/contacts.js';
5
- export * from './api/messaging.js';
6
- export * from './api/files.js';
7
- export * from './api/profile.js';
8
- export * from './api/conversations.js';
9
2
  export * from './client/http.js';
10
- export * from './version-advisory.js';
11
- export { FILE_SELECTION_CAP } from './identity/model.js';
12
- export * from './events.js';
13
- export { PINNED_FILE_ENVELOPE_CAP, resolveFileEnvelopeCap, envelopeSkipMargin, needsEnvelopeMeasurement, measureFileEnvelope, maxFilePayloadBytes, checkFileEnvelope, type BinarySource, type ReplyRef, type FileEnvelopeCheck, } from './messaging/file-limit.js';
14
3
  export * from './client/select.js';
4
+ export * from './version-advisory.js';
5
+ export { FILE_SELECTION_CAP } from './constants.js';
6
+ export type { MessageReceivedRecord, MessengerNotificationEvent, NotificationEvent, ReceiptKind, ReceiptReceivedRecord, SyncRequiredRecord, UnknownNotificationEvent, } from './events.js';
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a as Ve}from"./chunk-OA7XXAFG.js";import{a as be,b as qe,c as we,d as ze,e as Ge,f as He}from"./chunk-IDH22QWU.js";import{a as Je}from"./chunk-5EWCIQH6.js";import{a as ae,b as ie,c as ye,d as se,e as ve,f as Fe,g as Ce,h as Pe,i as _e,j as ce}from"./chunk-ARYFH7MF.js";import{a as Ie,b as Le,c as Ne,d as ke}from"./chunk-PPJAMKLP.js";import{a as ue,b as Se,c as de,d as he}from"./chunk-SYRQA3MQ.js";import{a as Ae,b as Be,c as Me,d as Oe,e as Re}from"./chunk-ZTGUX6EV.js";import"./chunk-E2RQVNQK.js";import{a as o,b as r,c as p,d as t,e as m,f,g as x}from"./chunk-VXVW4KJU.js";import"./chunk-LIJDSFUD.js";import{a as ge,b as je,c as De,d as Te}from"./chunk-WOPXC4VC.js";import{a as ee,b as oe,c as re,d as pe,e as te,f as me,g as fe,h as xe,i as le,j as Ee,k as ne}from"./chunk-SBQCXH54.js";import"./chunk-K2UCTMMS.js";import{A as w,B as z,C as G,D as H,E as J,F as K,G as Q,H as U,I as W,J as X,K as Y,L as Z,M as $,a as v,b as F,c as C,d as P,e as _,f as c,g as I,h as L,i as N,j as k,k as u,l as S,m as d,n as h,o as A,p as B,q as M,r as O,s as R,t as g,u as j,v as D,w as T,x as V,y as b,z as q}from"./chunk-65KGEJBX.js";import"./chunk-EWT5DWPA.js";import"./chunk-BWTNLYDF.js";import"./chunk-2BSXRX6I.js";import"./chunk-G3CKYZJ7.js";import"./chunk-YRPUM6JG.js";import"./chunk-3RZX2WOJ.js";import"./chunk-DIRW7I4S.js";import"./chunk-BCVDO2DW.js";import{u as e}from"./chunk-NOOGH2RZ.js";import"./chunk-QXKDTQMT.js";import"./chunk-ZHH3PWEW.js";import"./chunk-LKFYUCN7.js";import"./chunk-P55RJGZU.js";import{a as l,b as E,c as n,d as a,e as i,f as y,g as s}from"./chunk-XYU2DSWR.js";import"./chunk-IB2U7K6Y.js";export{we as DAEMON_TOKEN_FILE,qe as DEFAULT_DAEMON_PORT,be as DaemonSelectionError,e as FILE_SELECTION_CAP,Ve as OursClient,v as OursError,o as PINNED_FILE_ENVELOPE_CAP,E as VETOABLE_EVENTS,se as addContact,je as advertiseMigrate,He as assertDaemonStateDir,x as checkFileEnvelope,fe as chooseIdentity,pe as closeTemporaryIdentityOp,oe as createIdentity,te as createRootIdentity,re as createTemporaryIdentity,le as currentIdentity,he as deferFiles,Re as deferMessages,me as defineLocalIdentityFile,Ge as describeDaemonConfig,y as emitDaemonEvent,s as emitDaemonNotification,p as envelopeSkipMargin,C as errBindingReassigned,g as errBoundElsewhere,P as errBoundIdentityGone,Y as errDuplicateId,K as errFileTooLarge,G as errFileUnreadable,D as errIdentityClosedWithError,V as errIdentityPartiallyRemoved,W as errInvalidSelection,X as errMalformedId,c as errNameTaken,I as errNoLeaseHeaders,B as errNoLeaseToken,q as errNoPolicyArgs,U as errNoRoot,A as errNoSuchIdentity,F as errNotBound,k as errNotBoundNoName,u as errNotTemporary,h as errPathNotAbsolute,b as errPublicInviteNamed,L as errRandomNameExhausted,N as errRootExists,T as errRootHasRoles,Q as errSaveFileFallback,w as errSendFileArgs,z as errSendFileFilenameRequired,H as errSendFileUploadArgs,d as errTempClosedWithError,_ as errTempClosingBound,M as errTempClosingChoose,S as errTempOwnedElsewhereClose,j as errTempOwnedElsewhereRemove,O as errTempOwnedLive,R as errTempStale,$ as errTool,Z as errUnknownOrStaleId,J as errUploadNotFound,Je as formatVersionAdvisory,ae as generateInvite,Ie as getConversation,Se as getFiles,Oe as getMessages,Le as getReceipts,i as isDefaultHandler,ve as listContacts,xe as listIdentities,ue as listIncomingFiles,Me as listIncomingMessages,ie as listInvites,Fe as listLocalContactBook,Ne as markRead,f as maxFilePayloadBytes,m as measureFileEnvelope,t as needsEnvelopeMeasurement,l as normalizeNotificationEvent,Te as readvertiseOnUpgrade,ne as releaseLease,Pe as removeContact,Ee as removeIdentity,_e as renameContact,ee as requireBound,a as resetDaemonEventHandlers,ze as resolveDaemonConfig,r as resolveFileEnvelopeCap,ce as respondToIntroduction,ye as revokeInvite,de as saveFileFallbackNotice,Be as sendFile,Ae as sendMessage,ge as setBio,ke as setConversationPolicy,n as setDaemonEventHandler,Ce as setLocalBookPolicy,De as setPersona};
2
+ import{a as z,b as B,c as D,d as G,e as H,f as J,g as Q,h as V}from"./chunk-3KI5FM4I.js";import{a as l}from"./chunk-OA7XXAFG.js";import{a as W}from"./chunk-5EWCIQH6.js";import{A as k,B as q,C as u,D as w,E as A,F,G as K,H as O,I as P,J as T,K as U,L as b,M as h,a as o,b as t,c as r,d as i,e as n,f as c,g as f,h as p,i as R,j as d,k as m,l as s,m as v,n as x,o as E,p as a,q as N,r as g,s as y,t as C,u as I,v as L,w as M,x as S,y as _,z as j}from"./chunk-65KGEJBX.js";import{a as e}from"./chunk-Y3VPZJTG.js";import"./chunk-XYU2DSWR.js";import"./chunk-WS6UFNKF.js";export{G as DAEMON_TOKEN_FILE,D as DEFAULT_DAEMON_PORT,z as DaemonSelectionError,B as DaemonUnavailableError,e as FILE_SELECTION_CAP,l as OursClient,o as OursError,Q as assertDaemonStateDir,V as attachOursClient,J as describeDaemonConfig,r as errBindingReassigned,C as errBoundElsewhere,i as errBoundIdentityGone,U as errDuplicateId,F as errFileTooLarge,u as errFileUnreadable,L as errIdentityClosedWithError,S as errIdentityPartiallyRemoved,P as errInvalidSelection,T as errMalformedId,c as errNameTaken,f as errNoLeaseHeaders,a as errNoLeaseToken,j as errNoPolicyArgs,O as errNoRoot,E as errNoSuchIdentity,t as errNotBound,d as errNotBoundNoName,m as errNotTemporary,x as errPathNotAbsolute,_ as errPublicInviteNamed,p as errRandomNameExhausted,R as errRootExists,M as errRootHasRoles,K as errSaveFileFallback,k as errSendFileArgs,q as errSendFileFilenameRequired,w as errSendFileUploadArgs,v as errTempClosedWithError,n as errTempClosingBound,N as errTempClosingChoose,s as errTempOwnedElsewhereClose,I as errTempOwnedElsewhereRemove,g as errTempOwnedLive,y as errTempStale,h as errTool,b as errUnknownOrStaleId,A as errUploadNotFound,W as formatVersionAdvisory,H as resolveDaemonConfig};
@@ -0,0 +1,11 @@
1
+ import type { DaemonHandle, DaemonOptions } from '../http/server.js';
2
+ export type { DaemonHandle, DaemonOptions, McpIntegration, McpServerLike, McpTransportInit, McpTransportLike, } from '../http/server.js';
3
+ export { StateRootLockedError, canonicalStateDir, stateRootLockPath } from './state-root-lock.js';
4
+ interface InternalDaemonOptions extends DaemonOptions {
5
+ /** Repository lifecycle-test seam; fires after the locked runtime import. */
6
+ onRuntimeLoaded?(): void;
7
+ }
8
+ /** Internal kernel boot used by repository engine tests; never package-exported. */
9
+ export declare function bootKernel(): Promise<void>;
10
+ /** Internal daemon host used only by the bundled operator CLI and repo tests. */
11
+ export declare function startDaemon(opts?: InternalDaemonOptions): Promise<DaemonHandle>;
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
+ import{a as k,b as w,c as y,d as p}from"../chunk-CHDY74S7.js";import{a as m}from"../chunk-EHCBEY52.js";import{d as l}from"../chunk-WS6UFNKF.js";import*as n from"node:fs";var D=l(),a=null;async function d(){if(m(),a)return{lock:a,acquired:!1};let t=await p(D.stateDir);n.mkdirSync(t.stateDir,{recursive:!0,mode:448});let o=n.realpathSync.native(t.stateDir);if(o!==t.stateDir)throw await t.close(),new Error(`state directory canonical path changed during lock acquisition: locked ${JSON.stringify(t.stateDir)}, created ${JSON.stringify(o)}`);return a=t,{lock:t,acquired:!0}}async function r(t){a===t&&(a=null,await t.close())}async function R(){let{lock:t,acquired:o}=await d();try{let{bootWrapper:e}=await import("../boot.js");await e()}catch(e){throw o&&await r(t),e}}async function O(t={}){let{lock:o,acquired:e}=await d();try{let i=await import("../http/server.js"),{onRuntimeLoaded:u,...f}=t;u?.();let c=await i.startDaemon({...f,onShutdown:async()=>r(o)}),s=!1;return{port:c.port,close:async()=>{if(!s){s=!0;try{await c.close()}finally{await r(o)}}}}}catch(i){throw e&&await r(o),i}}export{k as StateRootLockedError,R as bootKernel,w as canonicalStateDir,O as startDaemon,y as stateRootLockPath};
@@ -0,0 +1,25 @@
1
+ export interface StateRootLockOwner {
2
+ pid: number;
3
+ stateDir: string;
4
+ startedAt: string;
5
+ }
6
+ export interface StateRootLock {
7
+ readonly stateDir: string;
8
+ readonly socketPath: string;
9
+ readonly owner: StateRootLockOwner;
10
+ close(): Promise<void>;
11
+ }
12
+ export declare class StateRootLockedError extends Error {
13
+ readonly stateDir: string;
14
+ readonly ownerPid: number | null;
15
+ readonly owner: StateRootLockOwner | null;
16
+ readonly code: "STATE_ROOT_LOCKED";
17
+ constructor(stateDir: string, ownerPid: number | null, owner: StateRootLockOwner | null);
18
+ }
19
+ /** Resolve symlinks in the existing prefix without creating the state root. */
20
+ export declare function canonicalStateDir(input: string): string;
21
+ export declare function stateRootLockPath(stateDir: string): {
22
+ directory: string;
23
+ socketPath: string;
24
+ };
25
+ export declare function acquireStateRootLock(inputStateDir: string): Promise<StateRootLock>;
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
+ import{a,b,c,d}from"../chunk-CHDY74S7.js";export{a as StateRootLockedError,d as acquireStateRootLock,b as canonicalStateDir,c as stateRootLockPath};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d}from"../chunk-LIJDSFUD.js";import"../chunk-2BSXRX6I.js";import"../chunk-G3CKYZJ7.js";import"../chunk-YRPUM6JG.js";import"../chunk-3RZX2WOJ.js";import"../chunk-DIRW7I4S.js";import"../chunk-BCVDO2DW.js";import"../chunk-NOOGH2RZ.js";import"../chunk-QXKDTQMT.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-IB2U7K6Y.js";export{a as findSibling,d as parseSendVerdict,c as sendViaLocalBook,b as sendViaSibling};
2
+ import{a,b,c,d}from"../chunk-V7PKYHV7.js";import"../chunk-2PVVBIA7.js";import"../chunk-MQ5AXTPT.js";import"../chunk-YRPUM6JG.js";import"../chunk-TUWHVJ37.js";import"../chunk-DIRW7I4S.js";import"../chunk-7JZS2BAP.js";import"../chunk-CIHGEBUR.js";import"../chunk-T76BFV6S.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-Y3VPZJTG.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-WS6UFNKF.js";export{a as findSibling,d as parseSendVerdict,c as sendViaLocalBook,b as sendViaSibling};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{y as a}from"../chunk-G3CKYZJ7.js";import"../chunk-YRPUM6JG.js";import"../chunk-3RZX2WOJ.js";import"../chunk-DIRW7I4S.js";import"../chunk-BCVDO2DW.js";import"../chunk-NOOGH2RZ.js";import"../chunk-QXKDTQMT.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-IB2U7K6Y.js";export{a as wireHandlers};
2
+ import{y as a}from"../chunk-MQ5AXTPT.js";import"../chunk-YRPUM6JG.js";import"../chunk-TUWHVJ37.js";import"../chunk-DIRW7I4S.js";import"../chunk-7JZS2BAP.js";import"../chunk-CIHGEBUR.js";import"../chunk-T76BFV6S.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-Y3VPZJTG.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-WS6UFNKF.js";export{a as wireHandlers};
package/dist/mufl/tx.js CHANGED
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{H as a,I as b,J as c,K as d,L as e,M as f}from"../chunk-G3CKYZJ7.js";import"../chunk-YRPUM6JG.js";import"../chunk-3RZX2WOJ.js";import"../chunk-DIRW7I4S.js";import"../chunk-BCVDO2DW.js";import"../chunk-NOOGH2RZ.js";import"../chunk-QXKDTQMT.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-IB2U7K6Y.js";export{e as enqueueMutation,f as mutatingTx,c as readonlyTx,d as withLock,a as withScope,b as withScopeAsync};
2
+ import{H as a,I as b,J as c,K as d,L as e,M as f}from"../chunk-MQ5AXTPT.js";import"../chunk-YRPUM6JG.js";import"../chunk-TUWHVJ37.js";import"../chunk-DIRW7I4S.js";import"../chunk-7JZS2BAP.js";import"../chunk-CIHGEBUR.js";import"../chunk-T76BFV6S.js";import"../chunk-ZHH3PWEW.js";import"../chunk-LKFYUCN7.js";import"../chunk-Y3VPZJTG.js";import"../chunk-P55RJGZU.js";import"../chunk-XYU2DSWR.js";import"../chunk-WS6UFNKF.js";export{e as enqueueMutation,f as mutatingTx,c as readonlyTx,d as withLock,a as withScope,b as withScopeAsync};
package/dist/notify.js CHANGED
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q}from"./chunk-G3CKYZJ7.js";import"./chunk-YRPUM6JG.js";import"./chunk-3RZX2WOJ.js";import"./chunk-DIRW7I4S.js";import"./chunk-BCVDO2DW.js";import"./chunk-NOOGH2RZ.js";import"./chunk-QXKDTQMT.js";import"./chunk-ZHH3PWEW.js";import"./chunk-LKFYUCN7.js";import"./chunk-P55RJGZU.js";import"./chunk-XYU2DSWR.js";import"./chunk-IB2U7K6Y.js";export{e as NOTIFY_KIND_SETS,j as appendNotifyLog,l as binHexField,b as clearNotifyHook,c as fireNotify,h as fireNotifyWaiters,g as notifyEventMatches,d as notifyHooks,m as notifyLogSize,f as parseNotifyKinds,k as readE2eWireIds,n as readNotifyRange,p as refreshUnread,o as serveNotifications,a as setNotifyHook,q as unreadSummary,i as waitForNotify};
2
+ import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q}from"./chunk-MQ5AXTPT.js";import"./chunk-YRPUM6JG.js";import"./chunk-TUWHVJ37.js";import"./chunk-DIRW7I4S.js";import"./chunk-7JZS2BAP.js";import"./chunk-CIHGEBUR.js";import"./chunk-T76BFV6S.js";import"./chunk-ZHH3PWEW.js";import"./chunk-LKFYUCN7.js";import"./chunk-Y3VPZJTG.js";import"./chunk-P55RJGZU.js";import"./chunk-XYU2DSWR.js";import"./chunk-WS6UFNKF.js";export{e as NOTIFY_KIND_SETS,j as appendNotifyLog,l as binHexField,b as clearNotifyHook,c as fireNotify,h as fireNotifyWaiters,g as notifyEventMatches,d as notifyHooks,m as notifyLogSize,f as parseNotifyKinds,k as readE2eWireIds,n as readNotifyRange,p as refreshUnread,o as serveNotifications,a as setNotifyHook,q as unreadSummary,i as waitForNotify};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d,e,f,g,h,i,j,k,l}from"../chunk-3RZX2WOJ.js";import"../chunk-DIRW7I4S.js";import"../chunk-NOOGH2RZ.js";import"../chunk-QXKDTQMT.js";import"../chunk-ZHH3PWEW.js";import"../chunk-P55RJGZU.js";import"../chunk-IB2U7K6Y.js";export{l as adaptValueToJson,k as decodeWireBin,j as encodeWireBin,i as fmtContactRoot,h as renderContactRoots,a as renderContacts,d as renderFileMetadata,e as renderFiles,b as renderImportRenames,c as renderInbox,g as renderPending,f as writeIncomingFiles};
2
+ import{a,b,c,d,e,f,g,h,i,j,k,l}from"../chunk-TUWHVJ37.js";import"../chunk-DIRW7I4S.js";import"../chunk-CIHGEBUR.js";import"../chunk-T76BFV6S.js";import"../chunk-ZHH3PWEW.js";import"../chunk-Y3VPZJTG.js";import"../chunk-P55RJGZU.js";import"../chunk-WS6UFNKF.js";export{l as adaptValueToJson,k as decodeWireBin,j as encodeWireBin,i as fmtContactRoot,h as renderContactRoots,a as renderContacts,d as renderFileMetadata,e as renderFiles,b as renderImportRenames,c as renderInbox,g as renderPending,f as writeIncomingFiles};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a}from"../chunk-IU6MOFTJ.js";import"../chunk-IB2U7K6Y.js";export{a as assertConfigNotDrifted};
2
+ import{a}from"../chunk-EHCBEY52.js";import"../chunk-WS6UFNKF.js";export{a as assertConfigNotDrifted};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p}from"../chunk-QXKDTQMT.js";import"../chunk-ZHH3PWEW.js";import"../chunk-IB2U7K6Y.js";export{j as API_TOKEN,g as API_VISIBILITY,o as BOOK_DIR_NAME,d as BROKER_URL,b as CONFIG,f as GC_INTERVAL_MS,n as NAME_RE,e as PORT,c as STATE_DIR,a as VERSION,l as authOk,i as log,m as requireAuth,h as startupProgress,k as tokenFromReq,p as validateName};
2
+ import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p}from"../chunk-T76BFV6S.js";import"../chunk-ZHH3PWEW.js";import"../chunk-WS6UFNKF.js";export{j as API_TOKEN,g as API_VISIBILITY,o as BOOK_DIR_NAME,d as BROKER_URL,b as CONFIG,f as GC_INTERVAL_MS,n as NAME_RE,e as PORT,c as STATE_DIR,a as VERSION,l as authOk,i as log,m as requireAuth,h as startupProgress,k as tokenFromReq,p as validateName};