@ours.network/sdk 3.0.3 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -0
- package/dist/api/contacts.js +1 -1
- package/dist/api/files.js +1 -1
- package/dist/api/history.js +1 -1
- package/dist/api/identity.js +1 -1
- package/dist/api/messaging.js +1 -1
- package/dist/api/profile.js +1 -1
- package/dist/api/types.d.ts +13 -2
- package/dist/book.js +1 -1
- package/dist/boot.js +1 -1
- package/dist/chunk-2X5HGMMO.js +5 -0
- package/dist/chunk-2ZQPUBE4.js +2 -0
- package/dist/chunk-3CPIRV4P.js +2 -0
- package/dist/chunk-3ZIC5X5I.js +2 -0
- package/dist/{chunk-67DAPEUW.js → chunk-4QU3AKO6.js} +1 -1
- package/dist/chunk-5JKYJZAR.js +2 -0
- package/dist/{chunk-O3WRMYAS.js → chunk-7Q3OCSPV.js} +1 -1
- package/dist/chunk-7ZZWD64L.js +2 -0
- package/dist/chunk-AAXXFRZP.js +4 -0
- package/dist/chunk-AH3RIV2J.js +2 -0
- package/dist/chunk-E34QSIVP.js +2 -0
- package/dist/{chunk-SEZTXIKN.js → chunk-FCQYDCQA.js} +1 -1
- package/dist/{chunk-ZLCQNN5W.js → chunk-IFCOOPD7.js} +2 -2
- package/dist/chunk-MGNMJ64X.js +174 -0
- package/dist/chunk-N4N4OLEW.js +2 -0
- package/dist/chunk-P2AAWXWI.js +2 -0
- package/dist/chunk-PMN5M2JA.js +2 -0
- package/dist/chunk-RL3OEL5W.js +2 -0
- package/dist/{chunk-5KVWI5BW.js → chunk-UZF6OB3R.js} +1 -1
- package/dist/{chunk-PXIK7DM2.js → chunk-VQTATA4V.js} +1 -1
- package/dist/chunk-W34RPHBG.js +2 -0
- package/dist/chunk-WBCVUXOI.js +2 -0
- package/dist/{chunk-ZPG5V73S.js → chunk-WD7K5KPL.js} +1 -1
- package/dist/chunk-WZQNO4PZ.js +2 -0
- package/dist/chunk-XIWAQH6S.js +61 -0
- package/dist/{chunk-LPXPNZTS.js → chunk-XKPZWKI4.js} +1 -1
- package/dist/chunk-Y77ZVHTD.js +2 -0
- package/dist/{chunk-LRMN6BSO.js → chunk-ZOZFAMAX.js} +1 -1
- package/dist/client/http.d.ts +4 -0
- package/dist/client/http.js +1 -1
- package/dist/client/select.js +1 -1
- package/dist/client.d.ts +1 -0
- package/dist/client.js +1 -1
- package/dist/cluster/control.js +1 -1
- package/dist/cluster/manifest.js +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.js +1 -1
- package/dist/connector.js +1 -1
- package/dist/gc.js +1 -1
- package/dist/history-retention.d.ts +37 -0
- package/dist/history-retention.js +2 -0
- package/dist/history.js +1 -1
- package/dist/http/api-routes.js +1 -1
- package/dist/http/server.js +1 -1
- package/dist/identity/hierarchy.js +1 -1
- package/dist/identity/lease.d.ts +1 -0
- package/dist/identity/lease.js +1 -1
- package/dist/identity/lifecycle.d.ts +1 -1
- package/dist/identity/lifecycle.js +1 -1
- package/dist/identity/migration.d.ts +8 -0
- package/dist/identity/migration.js +2 -0
- package/dist/identity/model.d.ts +6 -0
- package/dist/identity/model.js +1 -1
- package/dist/identity/provision.js +1 -1
- package/dist/identity/reaper.d.ts +5 -0
- package/dist/identity/reaper.js +2 -0
- package/dist/identity/release.d.ts +3 -0
- package/dist/identity/release.js +2 -0
- package/dist/identity/staged.d.ts +14 -0
- package/dist/identity/staged.js +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/internal/daemon.js +1 -1
- package/dist/messaging/send.js +1 -1
- package/dist/mufl/handlers.js +1 -1
- package/dist/mufl/tx.js +1 -1
- package/dist/mufl_code/351F16D444E6DAA252D4A8D829D17204360D9015FEF670ACE68FB4747BB3B14E.muflo +0 -0
- package/dist/notify.js +1 -1
- package/dist/runtime/config-drift.js +1 -1
- package/dist/runtime/env.d.ts +1 -0
- package/dist/runtime/env.js +1 -1
- package/dist/state.js +1 -1
- package/dist/sweeps.js +1 -1
- package/dist/uploads.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-2XOTJ6G3.js +0 -2
- package/dist/chunk-5OAIOIQ2.js +0 -2
- package/dist/chunk-EHCBEY52.js +0 -2
- package/dist/chunk-ETBJ4VOK.js +0 -2
- package/dist/chunk-GJXNZNS6.js +0 -2
- package/dist/chunk-HZCFYJAG.js +0 -2
- package/dist/chunk-J2Q2JDUS.js +0 -2
- package/dist/chunk-JTQMUWPE.js +0 -2
- package/dist/chunk-M2WREVID.js +0 -2
- package/dist/chunk-NODVUYDQ.js +0 -2
- package/dist/chunk-PBLR7J42.js +0 -4
- package/dist/chunk-PJ5F7BI6.js +0 -2
- package/dist/chunk-PMDY4YIZ.js +0 -2
- package/dist/chunk-SBKG5P7O.js +0 -2
- package/dist/chunk-TXAIJEXA.js +0 -171
- package/dist/chunk-WS6UFNKF.js +0 -5
package/dist/chunk-PBLR7J42.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as d}from"./chunk-SBKG5P7O.js";import{h as F,j as S,k,l as v}from"./chunk-DIRW7I4S.js";import{I,J as x,K as $,L as C,M as p}from"./chunk-65KGEJBX.js";import{o as b}from"./chunk-O3WRMYAS.js";import{s as w,t as y}from"./chunk-ETBJ4VOK.js";import{b as f}from"./chunk-ZLCQNN5W.js";import{a as u}from"./chunk-Y3VPZJTG.js";import{p as g,q as _}from"./chunk-TXAIJEXA.js";import{readFile as O}from"node:fs/promises";async function D(s){let r=d(s);try{return g(r)}catch(o){throw p("list_incoming_files",String(o))}}async function G(s,r={}){let o=d(s),{wire_ids:i}=r;if(i!==void 0){if(i.length<1||i.length>32)throw I(32);if(i.some(n=>!w(n)))throw x();if(new Set(i).size!==i.length)throw $()}try{let n=_(o,{wire_ids:i,limit:r.limit}),l=[],a=[];for(let e of n.files){let h={file_id:e.file_id,wire_id:e.wire_id,from:e.from,filename:e.filename,path:e.blob_path,mime:e.mime,size:e.byte_length,sha256:e.sha256,status:"processed",date:e.date,kind:e.kind,sender:e.from.name};if(e.kind==="voice_message"){let c=F(f.stt),m;if(!c.ready)m={kind:"unconfigured",reason:c.reason};else try{let t=await S(await O(e.blob_path),e.filename,e.mime,f.stt);m=t.ok?{kind:"transcript",text:t.text}:{kind:"failed",error:t.error}}catch(t){m={kind:"failed",error:t instanceof Error?t.message:String(t)}}h.transcription=k(c,m,{audioPath:e.blob_path,wireId:e.wire_id}),a.push(v({sender:e.from.name,wire:e.wire_id,savedPath:e.blob_path,sizeBytes:e.byte_length},m))}else a.push(` \u2022 ${e.filename} (${e.mime}, ${e.byte_length} B, sha256 ${e.sha256}) from ${e.from.name} \u2192 ${e.blob_path} {${e.wire_id}}`);l.push(h)}return b(o),{files:l,text:a.length===0?"No new files.":`${a.length} new file(s) available from immutable identity blob storage (bytes stay on disk, never in this result):
|
|
3
|
-
${a.join(`
|
|
4
|
-
`)}`,mode:i===void 0?"all_unread":"selected",requested:i??null,remaining:n.remaining}}catch(n){let l=String(n);throw i!==void 0&&/unknown, stale, or no longer unread/i.test(l)?C():p("get_files",l)}}function L(s,r){let o=d(s);return{existsOnDisk:y(o,r.wire_id)!==null}}export{D as a,G as b,L as c};
|
package/dist/chunk-PJ5F7BI6.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{e as d}from"./chunk-GJXNZNS6.js";import{q as a,s as c}from"./chunk-NODVUYDQ.js";import{c as s}from"./chunk-ETBJ4VOK.js";function y(e){try{return a(n=>{let i=c(e,"::a2a_capabilities::get_manifest",n).Reduce("capabilities");return i.IsNil()?[]:[...i.GetKeys()].map(t=>typeof t=="string"?t:t.Visualize())})}catch{return[]}}function R(e){let n="",i="",t="",u="",l=[];try{a(g=>{let p=c(e,"::a2a_capabilities::get_manifest",g),r=o=>{let f=p.Reduce(o);return f.IsNil()?"":f.Visualize()};n=r("app_id"),i=r("name"),t=r("description"),u=r("version");let m=p.Reduce("capabilities");m.IsNil()||(l=[...m.GetKeys()].map(o=>typeof o=="string"?o:o.Visualize()))})}catch{}return{app_id:n,name:i,description:t,version:u,capabilities:l,monitoring_status:"unbound"}}function h(e){let n=[];for(let i of s.values()){if(i.name===e.name)continue;let t=d(i);t.rootCid===e.cid&&n.push({name:i.name,cid:i.cid,role_id:t.roleId,bio:t.bio,monitoring:t.monitoringEnabled,capabilities:y(i)})}return n}function v(e,n){let i=s.get(n)??[...s.values()].find(t=>t.cid===n);return!i||i.name===e.name?null:d(i).rootCid===e.cid?i:null}export{y as a,R as b,h as c,v as d};
|
package/dist/chunk-PMDY4YIZ.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as a}from"./chunk-ETBJ4VOK.js";import{c as d,i as u}from"./chunk-ZLCQNN5W.js";import{join as h}from"node:path";import*as r from"node:fs";var i=new Map,g=new Set,c=new Map,k=new Set;function E(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}function m(e){for(let t of i.values())if(t.token===e)return t}var f=()=>h(d,"bindings.json");function l(){try{r.mkdirSync(d,{recursive:!0});let e=`${f()}.tmp`;r.writeFileSync(e,JSON.stringify({pid:process.pid,bound:[...i.keys()],holders:[...i.values()].map(t=>({identity:t.identity,pid:t.pid}))})),r.renameSync(e,f())}catch(e){u("failed to persist bindings snapshot:",String(e))}}function _(e){let t=c.get(e)?.token;if(!t)return{code:"NOT_BOUND",error:"No identity bound to this session. Call choose_identity (or create_identity) first."};if(g.has(t))return{code:"BINDING_REASSIGNED",error:"Your identity binding was reassigned to another session. Call choose_identity again to continue."};let n=m(t);if(!n)return{code:"NOT_BOUND",error:"No identity bound to this session. Call choose_identity (or create_identity) first."};let o=a.get(n.identity);if(!o)return i.delete(n.identity),l(),{code:"BOUND_IDENTITY_GONE",error:`The bound identity "${n.identity}" no longer exists. Choose another with choose_identity.`};if(o.temp?.closing)return{code:"TEMP_CLOSING",error:`The temporary identity "${o.name}" is closing and no longer accepts work. Its contacts are being notified and its local state deleted.`};n.sid=e;let s=c.get(e)?.pid;return s&&(n.pid=s),{id:o}}function x(e,t){let n=c.get(e),o=n?.token;if(!o)return;for(let[p,y]of[...i])y.token===o&&p!==t&&i.delete(p);let s=i.get(t)?.epoch??0;i.set(t,{identity:t,token:o,pid:n?.pid??0,sid:e,epoch:s+1,boundAt:Date.now()}),g.delete(o),l()}export{i as a,g as b,c,k as d,E as e,m as f,l as g,_ as h,x as i};
|
package/dist/chunk-SBKG5P7O.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as se,b as A}from"./chunk-J2Q2JDUS.js";import{M as p,a as T,f as k,g as q,h as W,i as z,j as U,k as Y,l as G,m as J,n as K,o as Q,p as S,q as X,r as Z,s as ee,t as te,u as oe,v as ne,w as re,x as ie}from"./chunk-65KGEJBX.js";import{a as ae,c as de}from"./chunk-M2WREVID.js";import{b as f,e as b,f as N,g as E}from"./chunk-GJXNZNS6.js";import{j as L,k as _,r as M,v as j}from"./chunk-NODVUYDQ.js";import{a as h,b as v,e as I,f as B,g as H,h as V,i as g}from"./chunk-PMDY4YIZ.js";import{c,n as w,o as $}from"./chunk-ETBJ4VOK.js";import{i as R,p as x}from"./chunk-ZLCQNN5W.js";import{k as D,m as F}from"./chunk-WS6UFNKF.js";import{randomBytes as ce}from"node:crypto";import{isAbsolute as me}from"node:path";function le(r){try{return b(r)}catch{return null}}function C(r){let o=le(r);return{name:r.name,cid:r.cid,bio:o?.bio??"",persona:o?.persona??"",roleId:o?.roleId??"",rootCid:o?.rootCid??"",rootName:o?.rootName??""}}async function P(r,o){o&&await M(async e=>{await j(r,"::a2a_messaging::set_my_bio",{bio:o},e)})}function pe(r){let o=V(r.sessionId());if(!("error"in o))return o.id;throw new T(o.code,o.error)}async function ke(r,o){let{name:e,bio:i,exposeLocal:d,localAutoAccept:s}=o,n=x(e);if(n)throw p("create_identity",n,"NAME_INVALID");if(c.has(e))throw k("create_identity",e);try{let t=await _(e,{exposeLocal:d,localAutoAccept:s});await P(t,i);let a,l=null,m=[],u=[],y=f?c.get(f):void 0;if(y)await N(y,t),a="role",l=y.name,ae()&&de(y);else{a="root";let O=await E(t);m=O.adopted,u=O.failed}return g(r.sessionId(),e),{info:C(t),hierarchy:a,underRoot:l,adopted:m,failed:u,exposedLocal:d,localAutoAccept:s}}catch(t){throw p("create_identity",String(t),"PROVISION_FAILED")}}async function Ae(r,o){let{bio:e,exposeLocal:i,localAutoAccept:d}=o,s=r.leaseToken(),n=r.clientPid();if(!s||!n)throw q();let t=o.name;if(t!==void 0){let l=x(t);if(l)throw p("create_temporary_identity",l,"NAME_INVALID");if(c.has(t)||L.has(t))throw k("create_temporary_identity",t)}else{for(let l=0;l<5&&t===void 0;l++){let m=`tmp-${ce(5).toString("hex")}`;!c.has(m)&&!L.has(m)&&(t=m)}if(t===void 0)throw W()}let a=t;try{let l=await _(a,{exposeLocal:i,localAutoAccept:d,temp:{tokenHash:w(s),pid:n}});return await P(l,e),g(r.sessionId(),a),{info:C(l),ownerPid:n,exposedLocal:i,localAutoAccept:d}}catch(l){throw p("create_temporary_identity",String(l),"PROVISION_FAILED")}}async function Ce(r,o){let e=r.leaseToken(),i;if(o.name!==void 0){if(i=c.get(o.name),!i)return{name:o.name,result:null}}else{let n=e?B(e):void 0;if(i=n?c.get(n.identity):void 0,!i)throw U()}if(!i.temp)throw Y(i.name);let d=i.temp.owner,s=e!==void 0&&d.tokenHash===w(e);if(!s&&!i.temp.closing&&I(d.pid))throw G(i.name,d.pid);try{let n=await A(i,s?"explicit close by owner":"stale reclaim via close_temporary_identity");if(n.deleteError){let t=n.attempted===0?"It had no contacts, so no remove-me notices were needed.":`Remove-me notices: ${n.notified}/${n.attempted} queued, ${n.failed} not sent (best effort \u2014 delivery and remote contact deletion are not guaranteed).`;throw J(i.name,n.deleteError,t)}return{name:i.name,result:n}}catch(n){throw n instanceof T?n:p("close_temporary_identity",String(n),"CLOSE_FAILED")}}async function ve(r,o){let{name:e,bio:i,exposeLocal:d,localAutoAccept:s,skipIfRootExists:n}=o,t=x(e);if(t)throw p("create_root_identity",t,"NAME_INVALID");let a=f;if(n&&a&&c.has(a))throw z(a);if(c.has(e))throw k("create_root_identity",e);try{let l=await _(e,{exposeLocal:d,localAutoAccept:s});await P(l,i);let m=f?c.get(f):void 0;if(m&&m.name!==e)return await N(m,l),g(r.sessionId(),e),{info:C(l),hierarchy:"role",underRoot:m.name,adopted:[],failed:[],exposedLocal:d,localAutoAccept:s};let{adopted:u,failed:y}=await E(l);return g(r.sessionId(),e),{info:C(l),hierarchy:"root",underRoot:null,adopted:u,failed:y,exposedLocal:d,localAutoAccept:s}}catch(l){throw p("create_root_identity",String(l),"PROVISION_FAILED")}}async function Le(r){if(!me(r.path))throw K(r.path);let o={name:r.name,force:r.force,exposeLocal:r.exposeLocal,localAutoAccept:r.localAutoAccept};try{return{written:F(r.path,o,r.overwrite),json:D(o)}}catch(e){throw p("define_local_identity_file",String(e),"WRITE_FAILED")}}async function Se(r,o){let{name:e,force:i}=o;if(!c.has(e))throw Q(e);let d=r.sessionId(),s=r.leaseToken();if(!s)throw S();let n=c.get(e);if(n.temp){if(n.temp.closing)throw X(e);let m=n.temp.owner;if(m.tokenHash!==w(s))throw I(m.pid)?Z(e,m.pid):ee(e,m.pid);let u=r.clientPid();if(u&&u!==m.pid){m.pid=u;try{$(n.dir,n.temp)}catch(y){R(`[${e}] temp marker refresh failed:`,String(y))}}}let t=h.get(e);if(t&&t.token!==s)if(!I(t.pid))R(`auto-reclaiming "${e}" from dead client pid ${t.pid}`),h.delete(e);else if(i)v.add(t.token),h.delete(e);else throw te(e);let a=[...h.values()].find(m=>m.token===s&&m.identity!==e)?.identity,l=a&&c.has(a)?a:null;return g(d,e),{name:e,cid:c.get(e).cid,switchedFrom:l}}async function Ne(r){if(c.size===0)return[];let o=r.leaseToken(),e=t=>{let a=h.get(t);return a?a.token===o?"mine":I(a.pid)?"other-live":null:null},i=t=>{if(!t.temp)return null;let a=t.temp.owner.pid;return t.temp.closing?{state:"closing",ownerPid:a}:o!==void 0&&t.temp.owner.tokenHash===w(o)?{state:"mine",ownerPid:a}:I(a)?{state:"other-live",ownerPid:a}:{state:"stale",ownerPid:a}},d=(t,a)=>({name:t.name,cid:t.cid,kind:a,temp:i(t),session:e(t.name)}),s=f?c.get(f):void 0,n=[];if(s){n.push({...d(s,"root"),temp:null});for(let t of c.values())t.name!==s.name&&b(t).roleId!==""&&n.push(d(t,"role"));for(let t of c.values())t.name===s.name||b(t).roleId!==""||n.push(d(t,"flat"))}else for(let t of c.values())n.push(d(t,"flat"));return n}async function Ee(r){let o=pe(r),e=le(o);return{name:o.name,cid:o.cid,bio:e?.bio??"",persona:e?.persona??"",roleId:e?.roleId??"",rootCid:e?.rootCid??"",rootName:e?.rootName??"",temporary:o.temp!==void 0,isRoot:o.name===f,described:e!==null}}async function Pe(r,o){let{name:e}=o,i=c.get(e);if(!i)throw p("remove_identity",`no identity named "${e}".`,"NO_SUCH_IDENTITY");if(i.temp){let s=r.leaseToken(),n=i.temp.owner;if((s===void 0||n.tokenHash!==w(s))&&!i.temp.closing&&I(n.pid))throw oe(e,n.pid);try{let t=await A(i,"remove_identity");if(t.deleteError){let a=t.attempted===0?"":` Remove-me notices: ${t.notified}/${t.attempted} queued, ${t.failed} not sent (best effort).`;throw ne(e,t.deleteError,a)}return{name:e,kind:"temporary",close:t}}catch(t){throw t instanceof T?t:p("remove_identity",String(t),"CLOSE_FAILED")}}if(e===f){let s=[...c.values()].filter(n=>n.name!==e&&b(n).rootCid===i.cid);if(s.length>0)throw re(e,s.map(n=>n.name))}let d=se(i);if(d)throw ie(e,d);return{name:e,kind:"permanent"}}async function Oe(r){let o=r.leaseToken();if(!o)throw S();let e=[];for(let[i,d]of[...h]){if(d.token!==o)continue;h.delete(i),e.push(i);let s=c.get(i);s?.temp&&s.temp.owner.tokenHash===w(o)&&!s.temp.closing&&A(s,"owning session released its lease").catch(n=>R(`[${i}] close on lease release failed:`,String(n)))}return v.delete(o),H(),R(`lease released by token \u2026${o.slice(-6)}`),{released:e}}export{pe as a,ke as b,Ae as c,Ce as d,ve as e,Le as f,Se as g,Ne as h,Ee as i,Pe as j,Oe as k};
|
package/dist/chunk-TXAIJEXA.js
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{createHash as O,randomUUID as H}from"node:crypto";import*as o from"node:fs";import{dirname as y,join as l,resolve as R,sep as x}from"node:path";import A from"better-sqlite3";var m=200,C=50,b=2*1024*1024,D=8*1024*1024,M="history.sqlite3",N=1,p=new Map,f=new Map,E=new Map,U=t=>l(t.dir,M),Y=t=>l(t.dir,"blobs","sha256");function w(){return{write_failures:0,message_write_failures:0,file_write_failures:0,receipt_update_failures:0,last_failure_at_ms:null}}function $(t){return{...f.get(t.dir)??w()}}function K(t,e,r,s){let i=f.get(t.dir)??w();if(i.write_failures+=1,i.last_failure_at_ms=Date.now(),e==="message"?i.message_write_failures+=1:e==="file"?i.file_write_failures+=1:i.receipt_update_failures+=1,f.set(t.dir,i),s==="out"&&r){let n=E.get(t.dir);n||(n=new Set,E.set(t.dir,n)),n.add(r)}}function Q(t,e){let r=E.get(t.dir);return r?.delete(e)?(r.size===0&&E.delete(t.dir),!0):!1}function F(t){t.exec(`
|
|
3
|
-
CREATE TABLE IF NOT EXISTS history_meta (
|
|
4
|
-
key TEXT PRIMARY KEY,
|
|
5
|
-
value TEXT NOT NULL
|
|
6
|
-
);
|
|
7
|
-
CREATE TABLE IF NOT EXISTS wire_items (
|
|
8
|
-
wire_id TEXT PRIMARY KEY,
|
|
9
|
-
item_kind TEXT NOT NULL CHECK (item_kind IN ('message','file'))
|
|
10
|
-
);
|
|
11
|
-
CREATE TABLE IF NOT EXISTS messages (
|
|
12
|
-
seq INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
13
|
-
wire_id TEXT NOT NULL UNIQUE,
|
|
14
|
-
peer_cid TEXT NOT NULL,
|
|
15
|
-
peer_name_snapshot TEXT NOT NULL,
|
|
16
|
-
direction TEXT NOT NULL CHECK (direction IN ('in','out')),
|
|
17
|
-
body TEXT NOT NULL,
|
|
18
|
-
occurred_at_ms INTEGER NOT NULL,
|
|
19
|
-
reply_to_wire_id TEXT,
|
|
20
|
-
reply_to_sentence INTEGER,
|
|
21
|
-
encryption TEXT NOT NULL CHECK (encryption IN ('legacy','e2e')),
|
|
22
|
-
inbox_state TEXT NOT NULL CHECK (inbox_state IN ('pending_introduction','unread','read')),
|
|
23
|
-
delivery_state TEXT,
|
|
24
|
-
human_read_at_ms INTEGER,
|
|
25
|
-
inserted_at_ms INTEGER NOT NULL
|
|
26
|
-
);
|
|
27
|
-
CREATE INDEX IF NOT EXISTS messages_unread_seq ON messages(inbox_state, seq ASC);
|
|
28
|
-
CREATE INDEX IF NOT EXISTS messages_peer_seq ON messages(peer_cid, seq DESC);
|
|
29
|
-
CREATE TRIGGER IF NOT EXISTS messages_release_wire AFTER DELETE ON messages BEGIN
|
|
30
|
-
DELETE FROM wire_items WHERE wire_id = OLD.wire_id AND item_kind = 'message';
|
|
31
|
-
END;
|
|
32
|
-
CREATE TABLE IF NOT EXISTS files (
|
|
33
|
-
seq INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
34
|
-
wire_id TEXT NOT NULL UNIQUE,
|
|
35
|
-
peer_cid TEXT NOT NULL,
|
|
36
|
-
peer_name_snapshot TEXT NOT NULL,
|
|
37
|
-
direction TEXT NOT NULL CHECK (direction IN ('in','out')),
|
|
38
|
-
filename TEXT NOT NULL,
|
|
39
|
-
mime TEXT NOT NULL,
|
|
40
|
-
byte_length INTEGER NOT NULL,
|
|
41
|
-
sha256 TEXT NOT NULL,
|
|
42
|
-
blob_relpath TEXT NOT NULL,
|
|
43
|
-
occurred_at_ms INTEGER NOT NULL,
|
|
44
|
-
reply_to_wire_id TEXT,
|
|
45
|
-
reply_to_sentence INTEGER,
|
|
46
|
-
encryption TEXT NOT NULL CHECK (encryption IN ('legacy','e2e')),
|
|
47
|
-
inbox_state TEXT NOT NULL CHECK (inbox_state IN ('pending_introduction','unread','read')),
|
|
48
|
-
delivery_state TEXT,
|
|
49
|
-
human_read_at_ms INTEGER,
|
|
50
|
-
inserted_at_ms INTEGER NOT NULL
|
|
51
|
-
);
|
|
52
|
-
CREATE INDEX IF NOT EXISTS files_unread_seq ON files(inbox_state, seq ASC);
|
|
53
|
-
CREATE INDEX IF NOT EXISTS files_peer_seq ON files(peer_cid, seq DESC);
|
|
54
|
-
CREATE TRIGGER IF NOT EXISTS files_release_wire AFTER DELETE ON files BEGIN
|
|
55
|
-
DELETE FROM wire_items WHERE wire_id = OLD.wire_id AND item_kind = 'file';
|
|
56
|
-
END;
|
|
57
|
-
CREATE TABLE IF NOT EXISTS monitoring_items (
|
|
58
|
-
seq INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
59
|
-
item_id TEXT NOT NULL UNIQUE,
|
|
60
|
-
source_cid TEXT NOT NULL,
|
|
61
|
-
source_name_snapshot TEXT NOT NULL,
|
|
62
|
-
direction TEXT NOT NULL CHECK (direction IN ('in','out')),
|
|
63
|
-
peer_cid TEXT NOT NULL,
|
|
64
|
-
peer_name_snapshot TEXT NOT NULL,
|
|
65
|
-
body TEXT NOT NULL,
|
|
66
|
-
occurred_at_ms INTEGER NOT NULL,
|
|
67
|
-
queue_state TEXT NOT NULL CHECK (queue_state IN ('pending','processed')),
|
|
68
|
-
inserted_at_ms INTEGER NOT NULL
|
|
69
|
-
);
|
|
70
|
-
CREATE INDEX IF NOT EXISTS monitoring_pending_seq ON monitoring_items(queue_state, seq ASC);
|
|
71
|
-
CREATE TABLE IF NOT EXISTS control_requests (
|
|
72
|
-
seq INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
73
|
-
item_id TEXT NOT NULL UNIQUE,
|
|
74
|
-
sender_cid TEXT NOT NULL,
|
|
75
|
-
sender_name_snapshot TEXT NOT NULL,
|
|
76
|
-
payload TEXT NOT NULL,
|
|
77
|
-
occurred_at_ms INTEGER NOT NULL,
|
|
78
|
-
queue_state TEXT NOT NULL CHECK (queue_state IN ('pending','processed')),
|
|
79
|
-
inserted_at_ms INTEGER NOT NULL
|
|
80
|
-
);
|
|
81
|
-
CREATE INDEX IF NOT EXISTS control_pending_seq ON control_requests(queue_state, seq ASC);
|
|
82
|
-
`);let e=t.prepare("SELECT value FROM history_meta WHERE key = ?").pluck().get("schema_version");if(e!==void 0&&Number(e)!==N)throw new Error(`unsupported history database schema ${String(e)} (expected ${N})`);t.prepare("INSERT OR IGNORE INTO history_meta(key, value) VALUES (?, ?)").run("schema_version",String(N))}function d(t){let e=p.get(t.dir);if(e)return e;o.mkdirSync(t.dir,{recursive:!0,mode:448}),o.chmodSync(t.dir,448);let r=U(t),s=new A(r);try{o.chmodSync(r,384),s.pragma("journal_mode = WAL"),s.pragma("synchronous = NORMAL"),s.pragma("foreign_keys = ON"),s.pragma("busy_timeout = 5000"),F(s);for(let i of["","-wal","-shm"]){let n=`${r}${i}`;o.existsSync(n)&&o.chmodSync(n,384)}}catch(i){throw s.close(),i}return p.set(t.dir,s),s}function V(t){let e=p.get(t.dir);e&&(p.delete(t.dir),e.close())}function q(t){if(!t.wireId||t.wireId.length>256)throw new Error("invalid wire_id");if(!t.peerCid||t.peerCid.length>256)throw new Error("invalid peer cid");if(!t.peerName||t.peerName.length>512)throw new Error("invalid peer name");if(!Number.isSafeInteger(t.occurredAtMs)||t.occurredAtMs<0)throw new Error("invalid timestamp");if(t.replyToWireId!==void 0&&(!t.replyToWireId||t.replyToWireId.length>256))throw new Error("invalid reply wire_id");if(t.replyToSentence!==void 0&&(!Number.isSafeInteger(t.replyToSentence)||t.replyToSentence<1))throw new Error("invalid reply sentence")}function k(t){if(q(t),t.kind==="message"){if(Buffer.byteLength(t.body,"utf8")>b)throw new Error("message body exceeds host limit");return}if(!t.filename||t.filename.length>512||/[\0]/.test(t.filename))throw new Error("invalid filename");if(t.mime.length>512||/[\r\n\0]/.test(t.mime))throw new Error("invalid MIME type");if(t.bytes.byteLength>D)throw new Error("file exceeds host limit")}function h(t){return t.reply_to_wire_id?t.reply_to_sentence===null?{wire_id:t.reply_to_wire_id}:{wire_id:t.reply_to_wire_id,sentence:t.reply_to_sentence}:null}function I(t){return new Date(t).toISOString()}function S(t){let e={id:t.peer_cid,name:t.peer_name_snapshot};return{seq:t.seq,msg_id:t.seq,wire_id:t.wire_id,from:e,peer:e,direction:t.direction,text:t.body,body:t.body,occurred_at_ms:t.occurred_at_ms,date:I(t.occurred_at_ms),encryption:t.encryption,transport:t.encryption==="e2e"?"double_ratchet":"legacy_box",inbox_state:t.inbox_state,status:t.inbox_state,delivery_state:t.delivery_state,human_read_at_ms:t.human_read_at_ms,reply_to:h(t)}}function g(t,e){let r={id:e.peer_cid,name:e.peer_name_snapshot},s=e.mime||"application/octet-stream";return{seq:e.seq,file_id:e.seq,wire_id:e.wire_id,from:r,peer:r,direction:e.direction,filename:e.filename,mime:s,size:e.byte_length,byte_length:e.byte_length,sha256:e.sha256,occurred_at_ms:e.occurred_at_ms,date:I(e.occurred_at_ms),encryption:e.encryption,inbox_state:e.inbox_state,status:e.inbox_state,delivery_state:e.delivery_state,human_read_at_ms:e.human_read_at_ms,reply_to:h(e),blob_path:l(t.dir,e.blob_relpath),kind:s.startsWith("audio/")?"voice_message":"file"}}function X(t,e){let r=O("sha256").update(e).digest("hex"),s=l("blobs","sha256",r.slice(0,2),r),i=l(t.dir,s);if(o.mkdirSync(y(i),{recursive:!0,mode:448}),o.chmodSync(y(i),448),!o.existsSync(i)){let n=l(y(i),`.${r}.${process.pid}.${H()}.tmp`);try{o.writeFileSync(n,e,{flag:"wx",mode:384}),o.chmodSync(n,384);try{o.renameSync(n,i)}catch(a){if(!o.existsSync(i))throw a;o.rmSync(n,{force:!0})}}catch(a){try{o.rmSync(n,{force:!0})}catch{}throw a}}return o.chmodSync(i,384),{sha256:r,relpath:s}}function j(t,e){k(e);let r=d(t);if(e.direction==="out"&&e.inboxState!==void 0)throw new Error("outbound event cannot set inbox state");let s=e.direction==="in"?e.inboxState??"unread":"read",i=e.direction==="out"?"sent":null;if(e.kind==="message")return r.transaction(()=>r.prepare(`
|
|
83
|
-
INSERT INTO wire_items(wire_id, item_kind) VALUES (?, 'message')
|
|
84
|
-
ON CONFLICT(wire_id) DO NOTHING
|
|
85
|
-
`).run(e.wireId).changes!==1?!1:(r.prepare(`
|
|
86
|
-
INSERT INTO messages (
|
|
87
|
-
wire_id, peer_cid, peer_name_snapshot, direction, body, occurred_at_ms,
|
|
88
|
-
reply_to_wire_id, reply_to_sentence, encryption, inbox_state,
|
|
89
|
-
delivery_state, human_read_at_ms, inserted_at_ms
|
|
90
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
91
|
-
`).run(e.wireId,e.peerCid,e.peerName,e.direction,e.body,e.occurredAtMs,e.replyToWireId??null,e.replyToSentence??null,e.encryption,s,i,e.direction==="out"?e.occurredAtMs:null,Date.now()),!0))();if(r.prepare("SELECT 1 FROM wire_items WHERE wire_id = ?").get(e.wireId))return!1;let a=X(t,e.bytes);return r.transaction(()=>r.prepare(`
|
|
92
|
-
INSERT INTO wire_items(wire_id, item_kind) VALUES (?, 'file')
|
|
93
|
-
ON CONFLICT(wire_id) DO NOTHING
|
|
94
|
-
`).run(e.wireId).changes!==1?!1:(r.prepare(`
|
|
95
|
-
INSERT INTO files (
|
|
96
|
-
wire_id, peer_cid, peer_name_snapshot, direction, filename, mime,
|
|
97
|
-
byte_length, sha256, blob_relpath, occurred_at_ms, reply_to_wire_id,
|
|
98
|
-
reply_to_sentence, encryption, inbox_state, delivery_state,
|
|
99
|
-
human_read_at_ms, inserted_at_ms
|
|
100
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
101
|
-
`).run(e.wireId,e.peerCid,e.peerName,e.direction,e.filename,e.mime||"application/octet-stream",e.bytes.byteLength,a.sha256,a.relpath,e.occurredAtMs,e.replyToWireId??null,e.replyToSentence??null,e.encryption,s,i,e.direction==="out"?e.occurredAtMs:null,Date.now()),!0))()}function z(t,e){if(!e.itemId||!e.sourceCid||!e.sourceName||!e.peerCid||!e.peerName)throw new Error("invalid monitoring event metadata");if(!Number.isSafeInteger(e.occurredAtMs)||e.occurredAtMs<0)throw new Error("invalid monitoring timestamp");if(Buffer.byteLength(e.body,"utf8")>b)throw new Error("monitoring body exceeds host limit");return d(t).prepare(`
|
|
102
|
-
INSERT INTO monitoring_items (
|
|
103
|
-
item_id, source_cid, source_name_snapshot, direction, peer_cid,
|
|
104
|
-
peer_name_snapshot, body, occurred_at_ms, queue_state, inserted_at_ms
|
|
105
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'pending', ?)
|
|
106
|
-
ON CONFLICT(item_id) DO NOTHING
|
|
107
|
-
`).run(e.itemId,e.sourceCid,e.sourceName,e.direction,e.peerCid,e.peerName,e.body,e.occurredAtMs,Date.now()).changes===1}function J(t,e){if(!e.itemId||!e.senderCid||!e.senderName)throw new Error("invalid control event metadata");if(!Number.isSafeInteger(e.occurredAtMs)||e.occurredAtMs<0)throw new Error("invalid control timestamp");if(Buffer.byteLength(e.payload,"utf8")>b)throw new Error("control payload exceeds host limit");return d(t).prepare(`
|
|
108
|
-
INSERT INTO control_requests (
|
|
109
|
-
item_id, sender_cid, sender_name_snapshot, payload,
|
|
110
|
-
occurred_at_ms, queue_state, inserted_at_ms
|
|
111
|
-
) VALUES (?, ?, ?, ?, ?, 'pending', ?)
|
|
112
|
-
ON CONFLICT(item_id) DO NOTHING
|
|
113
|
-
`).run(e.itemId,e.senderCid,e.senderName,e.payload,e.occurredAtMs,Date.now()).changes===1}function Z(t,e){let r=d(t);return r.transaction(()=>{let s=r.prepare(`
|
|
114
|
-
UPDATE messages SET inbox_state = 'unread'
|
|
115
|
-
WHERE direction = 'in' AND peer_cid = ? AND inbox_state = 'pending_introduction'
|
|
116
|
-
`).run(e).changes,i=r.prepare(`
|
|
117
|
-
UPDATE files SET inbox_state = 'unread'
|
|
118
|
-
WHERE direction = 'in' AND peer_cid = ? AND inbox_state = 'pending_introduction'
|
|
119
|
-
`).run(e).changes;return s+i})()}function v(t,e){let r=d(t);return r.transaction(()=>{let s=r.prepare(`
|
|
120
|
-
DELETE FROM messages
|
|
121
|
-
WHERE direction = 'in' AND peer_cid = ? AND inbox_state = 'pending_introduction'
|
|
122
|
-
`).run(e).changes,i=r.prepare(`
|
|
123
|
-
DELETE FROM files
|
|
124
|
-
WHERE direction = 'in' AND peer_cid = ? AND inbox_state = 'pending_introduction'
|
|
125
|
-
`).run(e).changes;return s+i})()}function ee(t){let e=d(t);return{pending_introductions:Number(e.prepare(`
|
|
126
|
-
SELECT
|
|
127
|
-
(SELECT COUNT(*) FROM messages WHERE inbox_state = 'pending_introduction') +
|
|
128
|
-
(SELECT COUNT(*) FROM files WHERE inbox_state = 'pending_introduction')
|
|
129
|
-
`).pluck().get()),monitoring_copies:Number(e.prepare(`
|
|
130
|
-
SELECT COUNT(*) FROM monitoring_items WHERE queue_state = 'pending'
|
|
131
|
-
`).pluck().get()),control_requests:Number(e.prepare(`
|
|
132
|
-
SELECT COUNT(*) FROM control_requests WHERE queue_state = 'pending'
|
|
133
|
-
`).pluck().get())}}function T(t){let e=t??C;if(!Number.isSafeInteger(e)||e<1||e>m)throw new Error(`limit must be an integer from 1 to ${m}`);return e}function te(t){return d(t).prepare(`
|
|
134
|
-
SELECT seq, wire_id, peer_cid, peer_name_snapshot, occurred_at_ms,
|
|
135
|
-
reply_to_wire_id, reply_to_sentence, encryption
|
|
136
|
-
FROM messages
|
|
137
|
-
WHERE direction = 'in' AND inbox_state = 'unread'
|
|
138
|
-
ORDER BY seq ASC
|
|
139
|
-
`).all().map(r=>({seq:r.seq,msg_id:r.seq,wire_id:r.wire_id,from:{id:r.peer_cid,name:r.peer_name_snapshot},occurred_at_ms:r.occurred_at_ms,date:I(r.occurred_at_ms),encryption:r.encryption,inbox_state:"unread",status:"unread",reply_to:h(r)}))}function re(t,e={}){let r=d(t),s=T(e.limit),i=e.wire_ids;return r.transaction(()=>{let n;if(i!==void 0){if(i.length<1||i.length>m)throw new Error(`wire_ids must contain 1-${m} items`);if(new Set(i).size!==i.length)throw new Error("wire_ids must not contain duplicates");let c=r.prepare(`
|
|
140
|
-
SELECT * FROM messages WHERE wire_id = ? AND direction = 'in' AND inbox_state = 'unread'
|
|
141
|
-
`);if(n=i.map(u=>c.get(u)).filter(u=>!!u),n.length!==i.length)throw new Error("selected message wire_id is unknown, stale, or no longer unread")}else n=r.prepare(`
|
|
142
|
-
SELECT * FROM messages
|
|
143
|
-
WHERE direction = 'in' AND inbox_state = 'unread'
|
|
144
|
-
ORDER BY seq ASC LIMIT ?
|
|
145
|
-
`).all(s);let a=r.prepare(`
|
|
146
|
-
UPDATE messages SET inbox_state = 'read'
|
|
147
|
-
WHERE seq = ? AND direction = 'in' AND inbox_state = 'unread'
|
|
148
|
-
`);for(let c of n){if(a.run(c.seq).changes!==1)throw new Error(`message row ${c.seq} changed during read batch`);c.inbox_state="read"}let _=Number(r.prepare(`
|
|
149
|
-
SELECT COUNT(*) FROM messages WHERE direction = 'in' AND inbox_state = 'unread'
|
|
150
|
-
`).pluck().get());return{messages:n.map(S),remaining:_}})()}function ie(t){return d(t).prepare(`
|
|
151
|
-
SELECT * FROM files WHERE direction = 'in' AND inbox_state = 'unread' ORDER BY seq ASC
|
|
152
|
-
`).all().map(r=>g(t,r))}function ne(t,e={}){let r=d(t),s=T(e.limit),i=e.wire_ids;return r.transaction(()=>{let n;if(i!==void 0){if(i.length<1||i.length>m)throw new Error(`wire_ids must contain 1-${m} items`);if(new Set(i).size!==i.length)throw new Error("wire_ids must not contain duplicates");let c=r.prepare(`
|
|
153
|
-
SELECT * FROM files WHERE wire_id = ? AND direction = 'in' AND inbox_state = 'unread'
|
|
154
|
-
`);if(n=i.map(u=>c.get(u)).filter(u=>!!u),n.length!==i.length)throw new Error("selected file wire_id is unknown, stale, or no longer unread")}else n=r.prepare(`
|
|
155
|
-
SELECT * FROM files WHERE direction = 'in' AND inbox_state = 'unread'
|
|
156
|
-
ORDER BY seq ASC LIMIT ?
|
|
157
|
-
`).all(s);let a=r.prepare(`
|
|
158
|
-
UPDATE files SET inbox_state = 'read'
|
|
159
|
-
WHERE seq = ? AND direction = 'in' AND inbox_state = 'unread'
|
|
160
|
-
`);for(let c of n){if(a.run(c.seq).changes!==1)throw new Error(`file row ${c.seq} changed during read batch`);c.inbox_state="read"}let _=Number(r.prepare(`
|
|
161
|
-
SELECT COUNT(*) FROM files WHERE direction = 'in' AND inbox_state = 'unread'
|
|
162
|
-
`).pluck().get());return{files:n.map(c=>g(t,c)),remaining:_}})()}function L(t){let e=[],r=[];return t.peer_cid!==void 0&&(e.push("peer_cid = ?"),r.push(t.peer_cid)),t.direction!==void 0&&(e.push("direction = ?"),r.push(t.direction)),t.before_seq!==void 0&&(e.push("seq < ?"),r.push(t.before_seq)),{sql:e.length?`WHERE ${e.join(" AND ")}`:"",args:r}}function se(t,e={}){let r=d(t),s=T(e.limit),i=L(e),n=r.prepare(`SELECT * FROM messages ${i.sql} ORDER BY seq DESC LIMIT ?`).all(...i.args,s+1),a=n.length>s;return a&&n.pop(),{items:n.map(S),next_cursor:a?n.at(-1).seq:null}}function oe(t,e){let r=d(t).prepare("SELECT * FROM messages WHERE wire_id = ?").get(e);return r?S(r):null}function ae(t,e){let r=d(t).prepare(`
|
|
163
|
-
SELECT COUNT(*) AS total,
|
|
164
|
-
SUM(CASE WHEN direction = 'in' AND inbox_state = 'unread' THEN 1 ELSE 0 END) AS unread
|
|
165
|
-
FROM messages WHERE peer_cid = ?
|
|
166
|
-
`).get(e.peer_cid);return{total:Number(r.total),unread:Number(r.unread??0)}}function de(t,e={}){let r=d(t),s=T(e.limit),i=L(e),n=r.prepare(`SELECT * FROM files ${i.sql} ORDER BY seq DESC LIMIT ?`).all(...i.args,s+1),a=n.length>s;return a&&n.pop(),{items:n.map(_=>g(t,_)),next_cursor:a?n.at(-1).seq:null}}function P(t,e){let r=d(t).prepare("SELECT * FROM files WHERE wire_id = ?").get(e);return r?g(t,r):null}function ce(t,e){let r=P(t,e);if(!r||!o.existsSync(r.blob_path))return null;let s=R(t.dir),i=R(r.blob_path);return i.startsWith(`${s}${x}`)?i:null}function _e(t,e,r,s){let i=d(t),n=r==="read"?2:1;i.transaction(()=>{for(let _ of s)for(let c of["messages","files"])i.prepare(`
|
|
167
|
-
UPDATE ${c}
|
|
168
|
-
SET delivery_state = ?, human_read_at_ms = CASE WHEN ? = 'read' THEN COALESCE(human_read_at_ms, ?) ELSE human_read_at_ms END
|
|
169
|
-
WHERE wire_id = ? AND peer_cid = ? AND direction = 'out'
|
|
170
|
-
AND (CASE delivery_state WHEN 'read' THEN 2 WHEN 'delivered' THEN 1 WHEN 'sent' THEN 0 ELSE -1 END) < ?
|
|
171
|
-
`).run(r,r,Date.now(),_,e,n)})()}function ue(t){let e=d(t);return{messages:Number(e.prepare("SELECT COUNT(*) FROM messages WHERE direction='in' AND inbox_state='unread'").pluck().get()),files:Number(e.prepare("SELECT COUNT(*) FROM files WHERE direction='in' AND inbox_state='unread'").pluck().get())}}export{U as a,Y as b,$ as c,K as d,Q as e,d as f,V as g,j as h,z as i,J as j,Z as k,v as l,ee as m,te as n,re as o,ie as p,ne as q,se as r,oe as s,ae as t,de as u,P as v,ce as w,_e as x,ue as y};
|
package/dist/chunk-WS6UFNKF.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
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};
|