beeos-claw 0.6.7 → 0.6.8

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.
@@ -1 +1 @@
1
- import{mkdir,readFile}from"node:fs/promises";import{dirname}from"node:path";import{withOwnedDirectoryLock}from"../runtime/owned-directory-lock.js";import{MonotonicJournalSegments}from"../runtime/monotonic-journal-segments.js";import{TERMINAL_AUTHORITY_CONTRACT_REVISION,TERMINAL_AUTHORITY_SCHEMA_HASH,TERMINAL_AUTHORITY_SCHEMA_VERSION}from"./terminal-authority-contract.js";const emptyDocument=()=>({version:1,revision:"0",bindings:[]});export class InMemoryTerminalAuthorityJournal{bindings=new Map;async bindNew(i,n){assertTerminalId(n);const r=[...this.bindings.values()].find(n=>n.authorityHash===i.authorityHash);if(r)return assertMatches(r,i),{binding:r,recovered:!0};if(this.bindings.has(n))throw new Error("terminal authority binding collision");const t=bindingFor(n,i);return this.bindings.set(n,t),{binding:t,recovered:!1}}async resume(i){const n=this.bindings.get(i.resumeTerminalId);if(!n)throw new Error("terminal resume binding not found");assertResumeMatches(n,i);const r=bindingFor(n.terminalId,i);return this.bindings.set(r.terminalId,r),r}async assertBound(i,n){const r=this.bindings.get(i);if(!r||!matches(r,n))throw new Error("terminal authority binding mismatch");return r}async inspect(){return[...this.bindings.values()]}}export class FileTerminalAuthorityJournal{file;segments;constructor(i){this.file=i,this.segments=new MonotonicJournalSegments(i)}async bindNew(i,n){return assertTerminalId(n),await this.mutate(r=>{const t=r.bindings.find(n=>n.authorityHash===i.authorityHash);if(t)return assertMatches(t,i),{binding:t,recovered:!0};if(r.bindings.some(i=>i.terminalId===n))throw new Error("terminal authority binding collision");const e=bindingFor(n,i);return r.bindings.push(e),{binding:e,recovered:!1}})}async resume(i){return assertTerminalId(i.resumeTerminalId),await this.mutate(n=>{const r=n.bindings.findIndex(n=>n.terminalId===i.resumeTerminalId);if(r<0)throw new Error("terminal resume binding not found");const t=n.bindings[r];assertResumeMatches(t,i);const e=bindingFor(t.terminalId,i);return n.bindings[r]=e,e})}async assertBound(i,n){const r=(await this.read()).bindings.find(n=>n.terminalId===i);if(!r||!matches(r,n))throw new Error("terminal authority binding mismatch");return r}async inspect(){return(await this.read()).bindings.map(i=>({...i}))}async mutate(i){return await mkdir(dirname(this.file),{recursive:!0,mode:448}),await withOwnedDirectoryLock(`${this.file}.lock`,async n=>{const r=await this.segments.authorityFloor(),t=await this.read(),e=i(t);return t.revision=String(BigInt(t.revision)+1n),await n.assertOwned(),await this.segments.publish(n.epoch,[{key:"snapshot",logicalRevision:t.revision,value:structuredClone(t)}],r),await this.segments.prune(),e},{epochFloor:()=>this.segments.authorityFloor()})}async read(){const i=new Map;try{const n=parseDocument(JSON.parse(await readFile(this.file,"utf8")));i.set("snapshot",{value:n,logicalRevision:n.revision,publisherEpoch:"0"})}catch(i){if("ENOENT"!==i.code)throw i}const n=await this.segments.reduce(i);return structuredClone(n.get("snapshot")?.value??emptyDocument())}}function bindingFor(i,n){return Object.freeze({version:1,terminalId:i,schemaVersion:TERMINAL_AUTHORITY_SCHEMA_VERSION,contractRevision:TERMINAL_AUTHORITY_CONTRACT_REVISION,schemaHash:TERMINAL_AUTHORITY_SCHEMA_HASH,scopeHash:n.scopeHash,authorityHash:n.authorityHash,terminalBindingHash:n.terminalBindingHash})}function matches(i,n){return i.schemaVersion===n.schemaVersion&&i.contractRevision===n.contractRevision&&i.schemaHash===n.schemaHash&&i.scopeHash===n.scopeHash&&i.authorityHash===n.authorityHash&&i.terminalBindingHash===n.terminalBindingHash}function assertMatches(i,n){if(!matches(i,n))throw new Error("terminal authority binding mismatch")}function assertResumeMatches(i,n){if(i.schemaVersion!==n.schemaVersion||i.contractRevision!==n.contractRevision||i.schemaHash!==n.schemaHash||i.scopeHash!==n.scopeHash||i.terminalBindingHash!==n.terminalBindingHash)throw new Error("terminal resume binding mismatch")}function parseDocument(i){if(!i||"object"!=typeof i||Array.isArray(i))throw new Error("terminal authority journal is corrupt");const n=i;if(1!==n.version||"string"!=typeof n.revision||!/^(0|[1-9][0-9]*)$/.test(n.revision)||!Array.isArray(n.bindings))throw new Error("terminal authority journal is corrupt");const r=n.bindings.map(parseBinding);if(new Set(r.map(i=>i.terminalId)).size!==r.length)throw new Error("terminal authority journal duplicate binding");return{version:1,revision:n.revision,bindings:r}}function parseBinding(i){if(!i||"object"!=typeof i||Array.isArray(i))throw new Error("terminal authority journal is corrupt");const n=i,r=["version","terminalId","schemaVersion","contractRevision","schemaHash","scopeHash","authorityHash","terminalBindingHash"];if(Object.keys(n).some(i=>!r.includes(i))||1!==n.version||n.schemaVersion!==TERMINAL_AUTHORITY_SCHEMA_VERSION||n.contractRevision!==TERMINAL_AUTHORITY_CONTRACT_REVISION||n.schemaHash!==TERMINAL_AUTHORITY_SCHEMA_HASH||"string"!=typeof n.terminalId||"string"!=typeof n.scopeHash||"string"!=typeof n.authorityHash||"string"!=typeof n.terminalBindingHash)throw new Error("terminal authority journal is corrupt");if(assertTerminalId(n.terminalId),![n.scopeHash,n.authorityHash,n.terminalBindingHash].every(i=>HEX_256.test(i)))throw new Error("terminal authority journal is corrupt");return Object.freeze({...n})}function assertTerminalId(i){if(!UUID_PATTERN.test(i))throw new Error("terminal authority terminal id is invalid")}const UUID_PATTERN=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,HEX_256=/^[0-9a-f]{64}$/;
1
+ import{mkdir,readFile}from"node:fs/promises";import{dirname}from"node:path";import{withOwnedDirectoryLock}from"../runtime/owned-directory-lock.js";import{MonotonicJournalSegments}from"../runtime/monotonic-journal-segments.js";import{TERMINAL_AUTHORITY_CONTRACT_REVISION,TERMINAL_AUTHORITY_SCHEMA_HASH,TERMINAL_AUTHORITY_SCHEMA_VERSION}from"./terminal-authority-contract.js";const emptyDocument=()=>({version:1,revision:"0",bindings:[]});export class InMemoryTerminalAuthorityJournal{bindings=new Map;async bindNew(i,n){assertTerminalId(n);const r=[...this.bindings.values()].find(n=>n.authorityHash===i.authorityHash);if(r)return assertMatches(r,i),{binding:r,recovered:!0};if(this.bindings.has(n))throw new Error("terminal authority binding collision");const t=bindingFor(n,i);return this.bindings.set(n,t),{binding:t,recovered:!1}}async resume(i){const n=this.bindings.get(i.resumeTerminalId);if(!n)throw new Error("terminal resume binding not found");assertResumeMatches(n,i);const r=bindingFor(n.terminalId,i);return this.bindings.set(r.terminalId,r),r}async assertBound(i,n){const r=this.bindings.get(i);if(!r||!matches(r,n))throw new Error("terminal authority binding mismatch");return r}async inspect(){return[...this.bindings.values()]}}export class FileTerminalAuthorityJournal{file;segments;constructor(i){this.file=i,this.segments=new MonotonicJournalSegments(i)}async bindNew(i,n){return assertTerminalId(n),await this.mutate(r=>{const t=r.bindings.find(n=>n.authorityHash===i.authorityHash);if(t)return assertMatches(t,i),{binding:t,recovered:!0};if(r.bindings.some(i=>i.terminalId===n))throw new Error("terminal authority binding collision");const e=bindingFor(n,i);return r.bindings.push(e),{binding:e,recovered:!1}})}async resume(i){return assertTerminalId(i.resumeTerminalId),await this.mutate(n=>{const r=n.bindings.findIndex(n=>n.terminalId===i.resumeTerminalId);if(r<0)throw new Error("terminal resume binding not found");const t=n.bindings[r];assertResumeMatches(t,i);const e=bindingFor(t.terminalId,i);return n.bindings[r]=e,e})}async assertBound(i,n){const r=(await this.read()).bindings.find(n=>n.terminalId===i);if(!r||!matches(r,n))throw new Error("terminal authority binding mismatch");return r}async inspect(){return(await this.read()).bindings.map(i=>({...i}))}async mutate(i){return await mkdir(dirname(this.file),{recursive:!0,mode:448}),await withOwnedDirectoryLock(`${this.file}.lock`,async n=>{const r=await this.segments.authorityFloor(),t=await this.read(),e=i(t);return t.revision=String(BigInt(t.revision)+1n),await n.assertOwned(),await this.segments.publish(n.epoch,[{key:"snapshot",logicalRevision:t.revision,value:structuredClone(t)}],r),await this.segments.prune(),e},{epochFloor:()=>this.segments.authorityFloor()})}async read(){const i=new Map;try{const n=parseDocument(JSON.parse(await readFile(this.file,"utf8")));i.set("snapshot",{value:n,logicalRevision:n.revision,publisherEpoch:"0"})}catch(i){if("ENOENT"!==i.code)throw i}const n=await this.segments.reduce(i);return structuredClone(n.get("snapshot")?.value??emptyDocument())}}function bindingFor(i,n){return Object.freeze({version:1,terminalId:i,schemaVersion:TERMINAL_AUTHORITY_SCHEMA_VERSION,contractRevision:TERMINAL_AUTHORITY_CONTRACT_REVISION,schemaHash:TERMINAL_AUTHORITY_SCHEMA_HASH,scopeHash:n.scopeHash,authorityHash:n.authorityHash,terminalBindingHash:n.terminalBindingHash})}function matches(i,n){return i.schemaVersion===n.schemaVersion&&i.contractRevision===n.contractRevision&&i.schemaHash===n.schemaHash&&i.scopeHash===n.scopeHash&&i.authorityHash===n.authorityHash&&i.terminalBindingHash===n.terminalBindingHash}function assertMatches(i,n){if(!matches(i,n))throw new Error("terminal authority binding mismatch")}function assertResumeMatches(i,n){if(i.schemaVersion!==n.schemaVersion||i.contractRevision!==n.contractRevision||i.schemaHash!==n.schemaHash||i.scopeHash!==n.scopeHash)throw new Error("terminal resume binding mismatch")}function parseDocument(i){if(!i||"object"!=typeof i||Array.isArray(i))throw new Error("terminal authority journal is corrupt");const n=i;if(1!==n.version||"string"!=typeof n.revision||!/^(0|[1-9][0-9]*)$/.test(n.revision)||!Array.isArray(n.bindings))throw new Error("terminal authority journal is corrupt");const r=n.bindings.map(parseBinding);if(new Set(r.map(i=>i.terminalId)).size!==r.length)throw new Error("terminal authority journal duplicate binding");return{version:1,revision:n.revision,bindings:r}}function parseBinding(i){if(!i||"object"!=typeof i||Array.isArray(i))throw new Error("terminal authority journal is corrupt");const n=i,r=["version","terminalId","schemaVersion","contractRevision","schemaHash","scopeHash","authorityHash","terminalBindingHash"];if(Object.keys(n).some(i=>!r.includes(i))||1!==n.version||n.schemaVersion!==TERMINAL_AUTHORITY_SCHEMA_VERSION||n.contractRevision!==TERMINAL_AUTHORITY_CONTRACT_REVISION||n.schemaHash!==TERMINAL_AUTHORITY_SCHEMA_HASH||"string"!=typeof n.terminalId||"string"!=typeof n.scopeHash||"string"!=typeof n.authorityHash||"string"!=typeof n.terminalBindingHash)throw new Error("terminal authority journal is corrupt");if(assertTerminalId(n.terminalId),![n.scopeHash,n.authorityHash,n.terminalBindingHash].every(i=>HEX_256.test(i)))throw new Error("terminal authority journal is corrupt");return Object.freeze({...n})}function assertTerminalId(i){if(!UUID_PATTERN.test(i))throw new Error("terminal authority terminal id is invalid")}const UUID_PATTERN=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,HEX_256=/^[0-9a-f]{64}$/;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "beeos-claw",
3
- "version": "0.6.7",
3
+ "version": "0.6.8",
4
4
  "description": "OpenClaw plugin that bridges the BeeOS platform with the local OpenClaw Gateway, providing file transfer, ACP bridge, and observability.",
5
5
  "license": "MIT",
6
6
  "author": "BeeOS <dev@beeos.ai>",