@lansenger/openclaw-channel-lansenger 0.0.1 → 0.0.2
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/dist/src/lansenger-core/agents/binding-manager.d.ts +0 -13
- package/dist/src/lansenger-core/agents/binding-manager.js +1 -1
- package/dist/src/lansenger-core/pairing/pairing-manager.d.ts +1 -0
- package/dist/src/lansenger-core/pairing/pairing-manager.js +1 -1
- package/dist/src/lansenger-core/utils/file-system.js +1 -1
- package/dist/src/lansenger-core/utils/media.js +1 -1
- package/dist/src/lansenger-core/utils/pairing-session.js +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
|
@@ -14,20 +14,7 @@ export interface BotAgentBinding {
|
|
|
14
14
|
*/
|
|
15
15
|
export declare class BindingManager {
|
|
16
16
|
private bindings;
|
|
17
|
-
private storagePath;
|
|
18
17
|
constructor();
|
|
19
|
-
/**
|
|
20
|
-
* Get storage file path
|
|
21
|
-
*/
|
|
22
|
-
private getStorageFilePath;
|
|
23
|
-
/**
|
|
24
|
-
* Load bindings from storage
|
|
25
|
-
*/
|
|
26
|
-
private loadBindings;
|
|
27
|
-
/**
|
|
28
|
-
* Save bindings to storage
|
|
29
|
-
*/
|
|
30
|
-
private saveBindings;
|
|
31
18
|
/**
|
|
32
19
|
* Bind a bot to an agent
|
|
33
20
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import{logger as n}from"../index.js";export class BindingManager{bindings=[];constructor(){n.info("Initialized binding manager with in-memory storage")}bindBotToAgent(i,t){const d=this.bindings.findIndex(n=>n.botId===i);d>=0?(this.bindings[d]={botId:i,agentId:t,lastUpdated:(new Date).toISOString()},n.info(`Updated binding: ${i} -> ${t}`)):(this.bindings.push({botId:i,agentId:t,lastUpdated:(new Date).toISOString()}),n.info(`Added binding: ${i} -> ${t}`))}getBotAgent(n){const i=this.bindings.find(i=>i.botId===n);return i?i.agentId:"default"}getAllBindings(){return[...this.bindings]}removeBinding(i){const t=this.bindings.length;this.bindings=this.bindings.filter(n=>n.botId!==i),this.bindings.length<t&&n.info(`Removed binding for bot: ${i}`)}hasBinding(n){return this.bindings.some(i=>i.botId===n)}}let i=null;export function createBindingManager(){return i||(i=new BindingManager),i}export function getBindingManager(){return i||(i=new BindingManager),i}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{logger as e}from"../utils/error-handling.js";
|
|
1
|
+
import{logger as e}from"../utils/error-handling.js";export class PairingManager{pairingData;constructor(){this.pairingData={pairingRequests:{},approvedUsers:[],lastUpdated:(new Date).toISOString()},e.debug("Initialized PairingManager with in-memory storage")}generatePairingCode(){const i="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";let t="";for(let e=0;e<8;e++)t+=i.charAt(Math.floor(36*Math.random()));return e.debug("Generated new pairing code",{code:t}),t}getExistingPairingCode(i){e.debug("Checking for existing pairing code",{identifier:i});for(const t in this.pairingData.pairingRequests){const r=this.pairingData.pairingRequests[t];if(r.staffId===i||r.userId===i){const a=new Date(r.createdAt),s=((new Date).getTime()-a.getTime())/36e5;if(s<=1)return e.debug("Found existing valid pairing code",{identifier:i,code:t,diffInHours:s}),t;e.debug("Found existing but expired pairing code",{identifier:i,code:t,diffInHours:s}),delete this.pairingData.pairingRequests[t],this.pairingData.lastUpdated=(new Date).toISOString()}}return e.debug("No existing valid pairing code found",{identifier:i}),null}storePairingRequest(i,t,r){e.info("Storing pairing request",{code:i,userId:t,staffId:r}),e.info("Current pairingRequests before storing:",Object.keys(this.pairingData.pairingRequests)),this.pairingData.pairingRequests[i]={code:i,userId:t,staffId:r,createdAt:(new Date).toISOString()},this.pairingData.lastUpdated=(new Date).toISOString(),e.info("Pairing request stored in memory:",this.pairingData.pairingRequests[i]),e.info("Pairing request stored successfully",{code:i,userId:t,staffId:r})}getPairingRequest(i){e.debug("Getting pairing request",{code:i});const t=this.pairingData.pairingRequests[i];if(!t)return e.debug("No pairing request found",{code:i}),null;const r=new Date(t.createdAt),a=((new Date).getTime()-r.getTime())/36e5;return a>1?(e.debug("Pairing request expired",{code:i,diffInHours:a}),delete this.pairingData.pairingRequests[i],this.pairingData.lastUpdated=(new Date).toISOString(),null):(e.debug("Found valid pairing request",{code:i,staffId:t.staffId}),t)}approveUser(i){e.debug("Approving user",{staffId:i}),this.pairingData.approvedUsers.includes(i)?e.debug("User already in approved list",{staffId:i}):(e.debug("Adding user to approved list",{staffId:i}),this.pairingData.approvedUsers.push(i),this.pairingData.lastUpdated=(new Date).toISOString(),e.debug("User added to approved list successfully",{staffId:i,approvedUsers:this.pairingData.approvedUsers}))}isUserApproved(i){try{e.debug("Checking if user is approved",{staffId:i});const t=this.pairingData.approvedUsers.includes(i);return e.debug("User approval status",{staffId:i,isApproved:t,approvedUsers:this.pairingData.approvedUsers}),t}catch(t){return e.error("Error checking if user is approved",{error:t,staffId:i}),!1}}removePairingRequest(e){delete this.pairingData.pairingRequests[e],this.pairingData.lastUpdated=(new Date).toISOString()}approvePairingRequest(i){e.debug("Approving pairing request",{code:i});const t=this.getPairingRequest(i);return t?(e.debug("Pairing request found, approving user",{code:i,staffId:t.staffId}),this.approveUser(t.staffId),this.removePairingRequest(i),e.debug("Pairing request approved successfully",{code:i,staffId:t.staffId}),!0):(e.debug("Pairing request not found or expired",{code:i}),!1)}getSessionByCode(i){e.debug("Getting session by code",{code:i});const t=this.getPairingRequest(i);return t?(e.debug("Found session for code",{code:i,staffId:t.staffId}),{staffId:t.staffId}):(e.debug("No session found for code",{code:i}),null)}}export function createPairingManager(e){return new PairingManager}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as
|
|
1
|
+
import*as r from"fs";import*as e from"path";import{logger as t}from"./error-handling.js";import{tryGetLansengerRuntime as i}from"../../openclaw-adapter/runtime-store.js";export function getStorageFilePath(){let o;const a=i();if(a&&a.state){const r=a.state.resolveStateDir();o=e.join(r,"extensions/openclaw-channel-lansenger/data"),t.info("Using runtime state directory for storage:",{stateDir:r})}else o=e.join("data"),t.info("Using relative data directory for storage");try{r.existsSync(o)||(r.mkdirSync(o,{recursive:!0}),t.info("Created storage directory:",{storageDir:o}))}catch(r){return t.error("Failed to create storage directory:",{error:r,storageDir:o}),"pairing-data.json"}return e.join(o,"pairing-data.json")}export function readFile(e){try{return r.readFileSync(e,"utf8")}catch(r){return t.error("Failed to read file:",{error:r,filePath:e}),"{}"}}export function writeFile(e,i){try{r.writeFileSync(e,i)}catch(r){t.error("Failed to write file:",{error:r,filePath:e})}}export function fileExists(e){try{return r.existsSync(e)}catch(r){return t.error("Failed to check if file exists:",{error:r,filePath:e}),!1}}export function createDirectory(e){try{r.existsSync(e)||r.mkdirSync(e,{recursive:!0})}catch(r){t.error("Failed to create directory:",{error:r,dirPath:e})}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import t from"node:fs";import e from"node:
|
|
1
|
+
import t from"node:fs";import e from"node:os";import n from"node:path";import o from"node:https";import i from"node:http";import{fileURLToPath as r}from"node:url";const a=r(import.meta.url);n.dirname(a);export function getMediaType(t,e){const n=t.toLowerCase();if(/\.(jpg|jpeg|png|gif|webp|bmp)(\?|$)/i.test(n))return"image";if(/\.(mp4|mov|avi|mkv|webm)(\?|$)/i.test(n))return"video";if(/\.(mp3|wav|ogg|m4a|aac)(\?|$)/i.test(n))return"audio";if(e){if(e.startsWith("image/"))return"image";if(e.startsWith("video/"))return"video";if(e.startsWith("audio/"))return"audio"}return"file"}export function getFileExtension(t){const e=t.match(/\.([a-zA-Z0-9]+)(\?|$)/);return e?e[1].toLowerCase():"bin"}export async function downloadToTempFile(r,a="unknown"){if(r.startsWith("/")||r.startsWith("file://")){return{path:r.replace("file://",""),isTemp:!1}}getFileExtension(r);const s=Date.now(),c=e.tmpdir(),m=n.join(c,"openclaw-lansenger","media","inbound",a);t.existsSync(m)||t.mkdirSync(m,{recursive:!0});const p=new URL(r);let d=n.basename(p.pathname);n.extname(d)||(d+="."+getFileExtension(r));const u=`${s}_${d}`,l=n.join(m,u);return new Promise((e,n)=>{const s=r.startsWith("https")?o:i,c=t.createWriteStream(l);s.get(r,o=>{if(301===o.statusCode||302===o.statusCode){c.close();try{t.unlinkSync(l)}catch{}const i=o.headers.location;return i?void downloadToTempFile(i,a).then(e).catch(n):void n(new Error("Redirect without location header"))}if(200===o.statusCode)o.pipe(c),c.on("finish",()=>{c.close(),e({path:l,isTemp:!1})}),c.on("error",e=>{try{t.unlinkSync(l)}catch{}n(e)});else{c.close();try{t.unlinkSync(l)}catch{}n(new Error(`Failed to download: HTTP ${o.statusCode}`))}}).on("error",e=>{c.close();try{t.unlinkSync(l)}catch{}n(e)})})}export async function uploadImage(t,e){throw new Error("Lanxin image upload not implemented yet")}export async function uploadFile(t,e,n,o="stream"){throw new Error("Lanxin file upload not implemented yet")}export function cleanupTemp(e,n){if(n)try{t.unlinkSync(e)}catch{}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export const pairingSessionManager=new class{sessions=new Map;staffIdToCode=new Map;constructor(){}generateCode(){const s="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";let e="";for(let t=0;t<6;t++)e+=s.charAt(Math.floor(36*Math.random()));return e}createSession(s,e){const t=this.generateCode(),o={code:t,staffId:e,createdAt:Date.now(),accountId:s};return this.sessions.set(t,o),this.staffIdToCode.set(`${s}:${e}`,t),o}getSessionByCode(s){return this.sessions.get(s)}getSessionByStaffId(s,e){const t=this.staffIdToCode.get(`${s}:${e}`);if(t)return this.sessions.get(t)}deleteSession(s){const e=this.sessions.get(s);e&&(this.staffIdToCode.delete(`${e.accountId}:${e.staffId}`),this.sessions.delete(s))}clearSessions(s){for(const[e,t]of this.sessions.entries())t.accountId===s&&(this.staffIdToCode.delete(`${s}:${t.staffId}`),this.sessions.delete(e))}clearAllSessions(){this.sessions.clear(),this.staffIdToCode.clear()}};
|
package/openclaw.plugin.json
CHANGED