@kmlckj/licos-bridge 0.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.
- package/README.md +86 -0
- package/dist/index.js +2 -0
- package/dist/lib/acp-runtime.js +1 -0
- package/dist/lib/agent-manager.js +1 -0
- package/dist/lib/cli.js +1 -0
- package/dist/lib/cloud.js +1 -0
- package/dist/lib/daemon.js +1 -0
- package/dist/lib/frameworks.js +1 -0
- package/dist/lib/ipc.js +1 -0
- package/dist/lib/local-commands.js +1 -0
- package/dist/lib/paths.js +1 -0
- package/dist/lib/service.js +1 -0
- package/dist/lib/utils.js +1 -0
- package/package.json +38 -0
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# @kmlckj/licos-bridge
|
|
2
|
+
|
|
3
|
+
LICOS 本地 Agent 桥接 CLI。它在本机启动后台 daemon,把平台里的本地个人助手连接到本机的 Claude ACP / Codex ACP 运行时。
|
|
4
|
+
|
|
5
|
+
## 前置依赖
|
|
6
|
+
|
|
7
|
+
- Node.js >= 20
|
|
8
|
+
- 本机至少安装或可运行一种 ACP runtime:
|
|
9
|
+
- Claude:`@agentclientprotocol/claude-agent-acp`
|
|
10
|
+
- Codex:`@zed-industries/codex-acp`
|
|
11
|
+
|
|
12
|
+
## 使用
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npx -y @kmlckj/licos-bridge@latest --pat-token=<token> --pair-code=<pair-code> --handshake-url=<platform-url>
|
|
16
|
+
|
|
17
|
+
licos-bridge status
|
|
18
|
+
licos-bridge stop
|
|
19
|
+
licos-bridge refresh
|
|
20
|
+
licos-bridge purge
|
|
21
|
+
licos-bridge service install
|
|
22
|
+
licos-bridge service uninstall
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
为了兼容已有复制命令,包里也提供 `coze-bridge` bin 别名。
|
|
26
|
+
|
|
27
|
+
## 工作目录
|
|
28
|
+
|
|
29
|
+
默认使用:
|
|
30
|
+
|
|
31
|
+
```text
|
|
32
|
+
~/.licos/
|
|
33
|
+
├── bridge/
|
|
34
|
+
│ ├── bridge.pid
|
|
35
|
+
│ ├── bridge.port
|
|
36
|
+
│ ├── bridge.token
|
|
37
|
+
│ ├── bridge.log
|
|
38
|
+
│ └── config.json
|
|
39
|
+
└── agents/<agentId>/
|
|
40
|
+
├── config.json
|
|
41
|
+
├── workspace/
|
|
42
|
+
└── logs/
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
可通过环境变量覆盖:
|
|
46
|
+
|
|
47
|
+
- `LICOS_BRIDGE_HOME`
|
|
48
|
+
- `LICOS_BRIDGE_AGENTS_HOME`
|
|
49
|
+
|
|
50
|
+
## 云端协议入口
|
|
51
|
+
|
|
52
|
+
`--handshake-url` 可以是平台 base URL,也可以直接是 handshake endpoint。
|
|
53
|
+
|
|
54
|
+
默认 handshake path:
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
/api/v1/workbench/local-agent-bridge/handshake
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
handshake 返回的 `frontierUrl` / `data.frontierUrl` 会用于 WebSocket 长连接;也可以用 `--frontier-url` 覆盖。
|
|
61
|
+
|
|
62
|
+
## 已支持的 bridge 控制帧
|
|
63
|
+
|
|
64
|
+
```text
|
|
65
|
+
_agent/create
|
|
66
|
+
_agent/detail
|
|
67
|
+
_agent/update
|
|
68
|
+
_agent/disconnect
|
|
69
|
+
_agent/health
|
|
70
|
+
_agent/getFileTree
|
|
71
|
+
_agent/getFileContent
|
|
72
|
+
_agent/listSkills
|
|
73
|
+
_agent/addSkills
|
|
74
|
+
_agent/removeSkills
|
|
75
|
+
session/new
|
|
76
|
+
session/prompt
|
|
77
|
+
session/cancel
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
文件树和文件内容只读取本地 agent workspace,不会自动上传到平台。技能安装会写入本地 workspace 的 `.skills/<skillId>`,并更新 agent config;安装或移除后会停止当前 ACP runtime,下一轮对话重新加载。
|
|
81
|
+
|
|
82
|
+
`_agent/addSkills` 支持三种输入:
|
|
83
|
+
|
|
84
|
+
- `downloadUrl/packageUrl/archiveUrl/url`:下载 `.zip` / `.skill` 包并解压。
|
|
85
|
+
- `content/skillMd`:直接写成 `SKILL.md`。
|
|
86
|
+
- `files`:直接写入多文件技能目录。
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const Y=h;(function(G,H){const W=h,I=G();while(!![]){try{const J=parseInt(W(0x1ec))/0x1+parseInt(W(0x1f1))/0x2*(parseInt(W(0x1f3))/0x3)+-parseInt(W(0x1e2))/0x4+parseInt(W(0x1e7))/0x5*(-parseInt(W(0x1de))/0x6)+-parseInt(W(0x1ef))/0x7+-parseInt(W(0x1df))/0x8*(-parseInt(W(0x1eb))/0x9)+-parseInt(W(0x1dc))/0xa*(-parseInt(W(0x1e6))/0xb);if(J===H)break;else I['push'](I['shift']());}catch(K){I['push'](I['shift']());}}}(b,0x3e375));function b(){const a0=['6HaGVEB','deprecated','error','mode','catch','stop','message','/refresh','reload','61670SFCXjH','help','1535538jgjylt','8PPiQCG','refresh','log','1493012YScvQq','/send','send','/pair','847PlHWnP','5MzTrQQ','slice','purge','stringify','906894kGTREC','194271esOfTN','version','status','1260847XRczkJ','connect','294238npZjEm','/reload'];b=function(){return a0;};return b();}function h(a,c){a=a-0x1d5;const d=b();let e=d[a];return e;}import{pathToFileURL as j}from'node:url';import{parseArgs as k,printHelp as q}from'./lib/cli.js';import{ensureDaemon as u,ipcRequest as v,readDaemonInfo as w,startDaemon as x}from'./lib/ipc.js';import{buildSendPayload as y,packageVersion as z,printLogs as A,purgeBridge as B,runUpdate as C,statusSnapshot as D}from'./lib/local-commands.js';import{installService as E,uninstallService as F}from'./lib/service.js';import.meta.url===j(process['argv'][0x1])['href']&&async function(G){const X=h,H=k(G);if(H[X(0x1f4)]&&console[X(0x1d5)]('Deprecated:\x20'+H['deprecated']),X(0x1dd)!==H['mode']){if(X(0x1ed)!==H['mode']){if('daemon'===H['mode']){const {startDaemonServer:I}=await import('./lib/daemon.js');return void await I();}if(X(0x1ee)===H['mode']){const J=await D();return void console['log'](JSON[X(0x1ea)](J,null,0x2));}if(X(0x1d8)===H[X(0x1d6)]){const K=await w();return K?(await v('/stop',{},K),void console[X(0x1e1)]('licos-bridge\x20daemon\x20stopped.')):void console['log']('licos-bridge\x20daemon\x20is\x20not\x20running.');}if(X(0x1e0)===H[X(0x1d6)]){const L=await u(),M=await v(X(0x1da),{},L);return void console['log'](JSON['stringify'](M,null,0x2));}if(X(0x1db)===H['mode']){const N=await u(),O=await v(X(0x1f2),{'agentId':H['agentId']},N);return void console[X(0x1e1)](JSON['stringify'](O,null,0x2));}if(X(0x1e1)!==H['mode']){if('update'!==H[X(0x1d6)]){if(X(0x1e9)===H[X(0x1d6)])return await B(),void console['log']('licos-bridge\x20bridge\x20data\x20purged.');if('service-install'!==H['mode']){if('service-uninstall'!==H['mode']){if('pair'===H[X(0x1d6)]){const P=await u(),Q=await v(X(0x1e5),H,P);return void console['log'](JSON[X(0x1ea)](Q,null,0x2));}if(X(0x1f0)===H['mode']){const R=await u(),S=await v('/connect',H,R);return void console['log'](JSON['stringify'](S,null,0x2));}if(X(0x1e4)===H['mode']){const T=await u(),U=await y(H),V=await v(X(0x1e3),U,T);return void console[X(0x1e1)](JSON[X(0x1ea)](V,null,0x2));}if('spawn-daemon'!==H[X(0x1d6)])throw new Error('unsupported\x20command\x20mode:\x20'+H['mode']);await x();}else await F();}else await E();}else await C();}else await A(H);}else console[X(0x1e1)](await z());}else q();}(process['argv'][Y(0x1e8)](0x2))[Y(0x1d7)](G=>{const Z=Y;console[Z(0x1d5)](G instanceof Error?G[Z(0x1d9)]:String(G)),process['exitCode']=0x1;});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const E=d;(function(x,y){const C=d,z=x();while(!![]){try{const A=parseInt(C(0x191))/0x1+parseInt(C(0x198))/0x2*(-parseInt(C(0x192))/0x3)+-parseInt(C(0x199))/0x4*(-parseInt(C(0x181))/0x5)+parseInt(C(0x18f))/0x6+-parseInt(C(0x183))/0x7+parseInt(C(0x17f))/0x8+parseInt(C(0x196))/0x9*(-parseInt(C(0x189))/0xa);if(A===y)break;else z['push'](z['shift']());}catch(B){z['push'](z['shift']());}}}(b,0x71721));import{spawn as f}from'node:child_process';import{readFile as g,writeFile as j}from'node:fs/promises';import{Readable as k,Writable as l}from'node:stream';function d(a,c){a=a-0x17f;const e=b();let f=e[a];return f;}function b(){const P=['start','5658282EiUeaj','readTextFile','optionId','stdin','process','path','1380080IuHNyK','onUpdate','agentId','PROTOCOL_VERSION','kill','stop','697560PclPJE','find','508887XccGbQ','921vJtgKo','session/prompt\x20missing\x20sessionId','agentConfig','cancel','9NtLpBW','closed','4078fiyJug','89068GhYomA','allow','prompt','logger','connection','runtime','framework','newSession','stopping\x20acp\x20runtime','ensureSession','writeTextFile','onClientRequest','3991088cwFQqS','workspace','205kmgRdu'];b=function(){return P;};return b();}import m from'node:path';import*as q from'@agentclientprotocol/sdk';import{resolveAcpBin as u}from'./frameworks.js';import{ensureDir as v,safeResolve as w}from'./utils.js';export class AcpRuntime{constructor({agentConfig:x,onUpdate:y,onClientRequest:z,logger:A}){const D=d;this['agentConfig']=x,this[D(0x18a)]=y,this[D(0x1a4)]=z,this[D(0x19c)]=A,this['sessions']=new Map(),this[D(0x187)]=void 0x0,this[D(0x19d)]=void 0x0,this['closed']=!0x1;}async[E(0x182)](){const F=E;if(this['connection'])return;await v(this['agentConfig']['workspace']);const x=await u(this['agentConfig']['framework']);this[F(0x187)]=f(x['command'],x['args'],{'cwd':this[F(0x194)]['workspace'],'stdio':['pipe','pipe','pipe'],'windowsHide':!0x0,'env':{...process.env,'LICOS_BRIDGE_AGENT_ID':this['agentConfig']['agentId'],'LICOS_BRIDGE_FRAMEWORK':this['agentConfig'][F(0x19f)]}}),this['process']['stderr']?.['on']('data',A=>{const G=F;this[G(0x19c)]?.('acp\x20stderr',{'agentId':this['agentConfig'][G(0x18b)],'text':A['toString']('utf8')['trim']()});}),this[F(0x187)]['on']('exit',(A,B)=>{const H=F;this['closed']=!0x0,this[H(0x19d)]=void 0x0,this[H(0x19c)]?.('acp\x20process\x20exited',{'agentId':this[H(0x194)][H(0x18b)],'code':A,'signal':B});});const y=q['ndJsonStream'](l['toWeb'](this['process'][F(0x186)]),k['toWeb'](this[F(0x187)]['stdout'])),z=new h(this);this[F(0x19d)]=new q['ClientSideConnection'](()=>z,y),await this['connection']['initialize']({'protocolVersion':q[F(0x18c)],'clientCapabilities':{'fs':{'readTextFile':!0x0,'writeTextFile':!0x0}}});}async['ensureSession'](x,y={}){const I=E;await this['start']();const z=this['sessions']['get'](x);if(z)return z;const A=await this[I(0x19d)][I(0x1a0)]({'cwd':this['agentConfig']['workspace'],'mcpServers':y['mcpServers']??this['agentConfig']['mcpServers']??[],'_meta':y['_meta']});return this['sessions']['set'](x,A['sessionId']),A['sessionId'];}async[E(0x19b)](x){const J=E,y=x['sessionId'];if(!y)throw new Error(J(0x193));const z=await this[J(0x1a2)](y,x);return this[J(0x19d)]['prompt']({...x,'sessionId':z});}async['cancel'](x){const K=E,y=this['sessions']['get'](x['sessionId']);this['connection']&&y&&await this[K(0x19d)][K(0x195)]({...x,'sessionId':y});}async[E(0x18e)](x=E(0x18e)){const L=E;this[L(0x197)]=!0x0,this['logger']?.(L(0x1a1),{'agentId':this['agentConfig'][L(0x18b)],'reason':x}),this['process']?.[L(0x18d)](),this['process']=void 0x0,this['connection']=void 0x0,this['sessions']['clear']();}['isAlive'](){return Boolean(this['process']&&!this['closed']&&null===this['process']['exitCode']);}}class h{constructor(x){this['runtime']=x;}async['sessionUpdate'](x){await this['runtime']['onUpdate']?.(this['runtime']['agentConfig'],x);}async['requestPermission'](x){const M=E,y=await this[M(0x19e)]['onClientRequest']?.(this[M(0x19e)]['agentConfig'],'session/request_permission',x);if(y)return y;const z=x['options']?.[M(0x190)](A=>String(A['kind']||'')['startsWith'](M(0x19a)))??x['options']?.[0x0];return z?.[M(0x185)]?{'outcome':{'outcome':'selected','optionId':z['optionId']}}:{'outcome':{'outcome':'cancelled'}};}async[E(0x184)](x){const N=E,y=w(this['runtime'][N(0x194)][N(0x180)],x[N(0x188)]);return{'content':await g(y,'utf8')};}async[E(0x1a3)](x){const O=E,y=w(this['runtime'][O(0x194)]['workspace'],x[O(0x188)]);return await v(m['dirname'](y)),await j(y,x['content']??'','utf8'),{};}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function b(){const aN=['9dHKNIJ','relPath','directory','skillId','text','deployType','loadPersistedAgents','replace','isFile','description','build','find','has','trunc','adm-zip','toISOString','workspace','min','938296hGXrGq','path','platform','now','getData','isArray','entryName',':\x20missing\x20_meta.cozeAgentId','8410tOXIqj','icon','getEntries','content','updateAgentSkills','forwardClientRequest','byteLength','iconUrl','running','stop','cozeAgentId','name','logs','model','installedAt','trim','accessToken','listSkills','cozeIdentity','\x0adescription:\x20','skill_md','match','_agent/getFileContent:\x20missing\x20path','runtimeProvider','1115890qYvQKo','.turbo','removeSkills','configFile','agent\x20','addSkills','runtime','112pkwKEF','.cache','join','enabled','sessionId','_meta','cloud','logger','4839XpnIex','size','handleSession','14397880cDGFMt','register','config','2936472swcIyq','mtimeMs','installSkill','truncated','agent\x20not\x20found:\x20','__pycache__','isDirectory','node_modules','fileTreeExclude','access_token','createOrUpdate','subarray','requireAgent','catch','AGENTS.md','564poXrMK','---\x0aname:\x20','localeCompare','prompt','agentId','depth','2082472rfDkcZ','skills','archive_url','utf8','session/new','skillMd','SKILL.md','push','agents','maxDepth','dist'];b=function(){return aN;};return b();}const ah=j;(function(R,U){const ag=j,V=R();while(!![]){try{const W=-parseInt(ag(0x1d1))/0x1*(parseInt(ag(0x1b2))/0x2)+parseInt(ag(0x1d9))/0x3*(-parseInt(ag(0x1ee))/0x4)+parseInt(ag(0x1ca))/0x5+-parseInt(ag(0x1df))/0x6+-parseInt(ag(0x1f4))/0x7+parseInt(ag(0x1aa))/0x8*(parseInt(ag(0x198))/0x9)+parseInt(ag(0x1dc))/0xa;if(W===U)break;else V['push'](V['shift']());}catch(X){V['push'](V['shift']());}}}(b,0x48028));import{randomUUID as q}from'node:crypto';import{readdir as x,readFile as z,rm as B,stat as C,writeFile as D}from'node:fs/promises';import E from'node:path';import{AcpRuntime as F}from'./acp-runtime.js';function j(a,c){a=a-0x194;const d=b();let e=d[a];return e;}import{agentPaths as G,resolvePaths as H}from'./paths.js';import{ensureDir as J,normalizeFramework as K,pathExists as L,readJson as M,safeName as N,safeRelativePath as O,safeResolve as P,writeJson as Q}from'./utils.js';const k=new Set([ah(0x1e6),'.git','.next','.nuxt',ah(0x1cb),ah(0x1d2),ah(0x197),ah(0x1a2),'target','coverage','.venv',ah(0x1e4)]);export class AgentManager{constructor({cloud:R,logger:U}){const ai=ah;this['cloud']=R,this[ai(0x1d8)]=U,this[ai(0x195)]=new Map();}async[ah(0x19e)](){const aj=ah,R=H();await J(R['agentsRoot']);const U=await x(R['agentsRoot'],{'withFileTypes':!0x0})[aj(0x1ec)](()=>[]);for(const V of U){if(!V['isDirectory']())continue;const W=G(V['name'])[aj(0x1cd)],X=await M(W)[aj(0x1ec)](()=>{});X?.['agentId']&&!X['disconnectedAt']&&this[aj(0x1dd)](X);}}[ah(0x1dd)](R){const ak=ah,U={'deployType':'local',...R,'framework':K(R['framework'])};return this[ak(0x195)]['set'](U['agentId'],{'config':U,'runtime':void 0x0,'lastActiveAt':Date['now']()}),U;}async[ah(0x1e9)](R={}){const al=ah,U=R[al(0x1f2)]||R['id']||q(),V=G(U);await J(V['workspace']),await J(V[al(0x1be)]);const W=await M(V['configFile'],{})['catch'](()=>({})),X={...W,'agentId':U,'name':R[al(0x1bd)]||W['name']||U,'framework':K(R['framework']||R[al(0x1c9)]||R['runtime_provider']||W['framework']||'codex'),'deployType':al(0x1d7)===R['_meta']?.['cozeDeployType']?al(0x1d7):R['deployType']||W['deployType']||'local','workspace':R['workspace']||W['workspace']||V[al(0x1a8)],'cozeIdentity':R[al(0x1c4)]??R['instructions']??W[al(0x1c4)]??'','model':R['model']??W[al(0x1bf)],'modelInfo':R['modelInfo']??W['modelInfo'],'mcpServers':R['mcpServers']??W['mcpServers']??[],'updatedAt':new Date()[al(0x1a7)](),'createdAt':W['createdAt']||new Date()['toISOString']()};return X['cozeIdentity']&&await async function(Y){const am=al,Z=Y['cozeIdentity'][am(0x1c1)]();if(!Z)return;await J(Y[am(0x1a8)]);const a0='claude-code'===Y['framework']?['CLAUDE.md','AGENTS.md']:[am(0x1ed)];for(const a1 of a0){const a2=E['join'](Y[am(0x1a8)],a1);if(!await L(a2)){await D(a2,Z+'\x0a','utf8');continue;}const a3=await z(a2,am(0x1f7));a3['includes'](Z)||await D(a2,a3['trimEnd']()+'\x0a\x0a'+Z+'\x0a',am(0x1f7));}}(X),await Q(V[al(0x1cd)],X,0x180),this['register'](X);}async['disconnect'](R,U){const an=ah,V=this['agents']['get'](R);V?.['runtime']&&await V[an(0x1d0)]['stop'](U||'disconnect'),this[an(0x195)]['delete'](R);const W=G(R)['configFile'],X=await M(W,{})[an(0x1ec)](()=>({}));await Q(W,{...X,'disconnectedAt':Date[an(0x1ad)](),'disconnectReason':U||''},0x180);}async['reload'](R){const ao=ah,U=R?[this[ao(0x1eb)]({'agentId':R})]:[...this['agents']['values']()],V=[];for(const W of U)W[ao(0x1d0)]&&(await W['runtime'][ao(0x1bb)]('reload'),W['runtime']=void 0x0),V['push'](W[ao(0x1de)]['agentId']);return{'ok':!0x0,'reloaded':V};}async['detail'](R={}){const ap=ah,U=this[ap(0x1eb)](R);return{'agent':A(U['config']),'health':this['health']()[ap(0x1a3)](V=>V['agentId']===U['config']['agentId'])};}async['getFileTree'](R={}){const aq=ah,U=this[aq(0x1eb)](R),V=U[aq(0x1de)][aq(0x1a8)],W=O(R[aq(0x1ab)]??R['filePath']??''),X=P(V,W),Y=I(R[aq(0x196)]??R[aq(0x1f3)]??0x5,0x0,0x14),Z=function(a1,a2){const ar=aq,a3=new Set(k);for(const a4 of a1[ar(0x1e7)]??[])a3['add'](a4);for(const a5 of a2['exclude']??[])a3['add'](a5);for(const a6 of a2['include']??[])a3['delete'](a6);return a3;}(U['config'],R),a0={'count':0x0,'truncated':!0x1};return{'workspace':V,'path':W,'tree':await y(V,X,W,Y,Z,a0),'truncated':a0[aq(0x1e2)],'totalNodes':a0['count']};}async['getFileContent'](R={}){const as=ah,U=this['requireAgent'](R)['config'][as(0x1a8)],V=O(R['path']??R['filePath']);if(!V)throw new Error(as(0x1c8));const W=P(U,V),X=await C(W);if(!X[as(0x1a0)]())throw new Error('not\x20a\x20file:\x20'+V);const Y=I(R['maxBytes']??0x100000,0x1,0xa00000),Z=await z(W),a0=Z['byteLength']>Y?Z[as(0x1ea)](0x0,Y):Z;return{'path':V,'size':Z[as(0x1b8)],'content':a0['toString'](R['encoding']||as(0x1f7)),'encoding':R['encoding']||as(0x1f7),'truncated':Z[as(0x1b8)]>Y,'mtimeMs':X['mtimeMs']};}async[ah(0x1c3)](R={}){const at=ah,U=this[at(0x1eb)](R);return{'agentId':U['config'][at(0x1f2)],'skills':S(U['config']['skills']??[])};}async[ah(0x1cf)](R={}){const au=ah,U=this[au(0x1eb)](R),V=Array[au(0x1af)](R['skills'])?R[au(0x1f5)]:[];if(0x0===V['length'])return{'installedSkills':[],'skills':S(U['config'][au(0x1f5)]??[])};const W=[],X=S(U['config']['skills']??[]),Y=new Map(X['map']((Z,a0)=>[Z['skillId'],a0]));for(const Z of V){const a0=await this['installSkill'](U['config'],Z,R);Y[au(0x1a4)](a0['skillId'])?X[Y['get'](a0[au(0x19b)])]=a0:(Y['set'](a0['skillId'],X['length']),X['push'](a0)),W[au(0x194)](a0);}return await this[au(0x1b6)](U,X,'skills-added'),{'installedSkills':W,'skills':X};}async[ah(0x1cc)](R={}){const av=ah,U=this['requireAgent'](R),V=new Set((R['skillIds']??R['skills']??[])['map'](Z=>'string'==typeof Z?Z:v(Z)));if(0x0===V['size'])return{'ok':!0x0,'skills':S(U[av(0x1de)][av(0x1f5)]??[])};const W=S(U['config']['skills']??[]),X=[],Y=[];for(const Z of W){if(!V['has'](Z['skillId'])){X[av(0x194)](Z);continue;}const a0=P(U[av(0x1de)]['workspace'],Z[av(0x199)]);await B(a0,{'recursive':!0x0,'force':!0x0}),Y['push'](Z);}return await this[av(0x1b6)](U,X,'skills-removed'),{'ok':!0x0,'removedSkills':Y,'skills':X};}async[ah(0x1db)](R,U){const aw=ah,V=U?.[aw(0x1d6)]?.[aw(0x1bc)]||U?.['agentId'];if(!V)throw new Error(R+aw(0x1b1));const W=this['agents']['get'](V);if(!W)throw new Error(aw(0x1e3)+V);if(W['lastActiveAt']=Date['now'](),aw(0x1f8)===R)return{'sessionId':U[aw(0x1d5)]||q()};if('session/cancel'===R)return await W['runtime']?.['cancel'](U),{'ok':!0x0};if('session/prompt'!==R)throw new Error('unsupported\x20session\x20method:\x20'+R);if('cloud'===W[aw(0x1de)]['deployType'])throw new Error(aw(0x1ce)+V+'\x20is\x20cloud\x20deploy\x20type;\x20local\x20bridge\x20does\x20not\x20spawn\x20it');const X=function(Y={}){const ax=aw,Z={...Y};if(!Array['isArray'](Z['prompt'])){const a0=Z['content']??Z['text']??Z['message']??'';Z[ax(0x1f1)]=[{'type':'text','text':String(a0)}];}return Z;}(U);return W['runtime']||(W[aw(0x1d0)]=new F({'agentConfig':W['config'],'onUpdate':(Y,Z)=>this[aw(0x1d7)]['sendNotification']('session/update',{...Z,'_meta':{...Z['_meta']||{},'cozeAgentId':Y['agentId'],'cozeCloudSessionId':X['sessionId'],'licosTurnId':X[aw(0x1d6)]?.['licosTurnId']}}),'onClientRequest':(Y,Z,a0)=>this[aw(0x1d7)][aw(0x1b7)](Y,Z,a0),'logger':this['logger']})),W['runtime']['prompt'](X);}async['stopAll'](R){for(const U of this['agents']['values']())await U['runtime']?.['stop'](R);}[ah(0x1eb)](R={}){const ay=ah,U=R?.['_meta']?.['cozeAgentId']||R?.['agentId']||R?.['id'];if(!U)throw new Error('missing\x20agentId');const V=this['agents']['get'](U);if(!V)throw new Error(ay(0x1e3)+U);return V;}async['updateAgentSkills'](R,U,V){const az=ah;R['config']['skills']=S(U),R[az(0x1de)]['updatedAt']=new Date()['toISOString'](),await Q(G(R['config']['agentId'])['configFile'],R[az(0x1de)],0x180),R[az(0x1d0)]&&(await R['runtime']['stop'](V),R['runtime']=void 0x0);}async[ah(0x1e1)](R,U,V){const aB=ah,W=v(U),X=N(W,'skill'),Y=O(U['relPath']||'.skills/'+X),Z=P(R['workspace'],Y);await B(Z,{'recursive':!0x0,'force':!0x0}),await J(Z),U['files']?await async function(a1,a2){const aA=j;if(Array['isArray'](a2))for(const a3 of a2){const a4=O(a3[aA(0x1ab)]||a3[aA(0x1bd)]);await J(E['dirname'](E[aA(0x1d3)](a1,a4))),await D(P(a1,a4),String(a3[aA(0x1b5)]??''),'utf8');}else for(const [a5,a6]of Object['entries'](a2)){const a7=O(a5);await J(E['dirname'](E[aA(0x1d3)](a1,a7))),await D(P(a1,a7),String(a6??''),'utf8');}}(Z,U['files']):U['content']||U[aB(0x1f9)]||U[aB(0x1c6)]?await D(E['join'](Z,'SKILL.md'),String(U[aB(0x1b5)]??U['skillMd']??U['skill_md']),'utf8'):$(U)?await async function(a1,a2,a3){const aC=aB,a4=$(a2),a5={},a6=a2['token']||a2['accessToken']||a2[aC(0x1e8)]||a3['token']||a3[aC(0x1c2)]||a3['access_token'];a6&&(a5['authorization']='Bearer\x20'+a6);const a7=await fetch(a4,{'headers':a5});if(!a7['ok'])throw new Error('download\x20skill\x20failed:\x20HTTP\x20'+a7['status']+'\x20'+await a7[aC(0x19c)]());const a8=Buffer['from'](await a7['arrayBuffer']());await async function(a9,aa){const aD=aC,{default:ab}=await import(aD(0x1a6)),ac=new ab(aa);for(const ad of ac[aD(0x1b4)]()){if(ad['isDirectory'])continue;const ae=O(ad[aD(0x1b0)]),af=P(a9,ae);await J(E['dirname'](af)),await D(af,ad[aD(0x1ae)]());}}(a1,a8);}(Z,U,V):await D(E[aB(0x1d3)](Z,aB(0x1fa)),function(a1){const aE=aB,a2=a1['name']||v(a1),a3=a1[aE(0x1a1)]||'';return aE(0x1ef)+a2+aE(0x1c5)+a3+'\x0a---\x0a\x0a#\x20'+a2+'\x0a\x0a'+a3+'\x0a';}(U),'utf8');const a0=await async function(a1){const aF=aB,a2=await z(E[aF(0x1d3)](a1,'SKILL.md'),aF(0x1f7))['catch'](()=>''),a3=a2['match'](/^---\s*([\s\S]*?)\s*---/),a4=a3?.[0x1]||a2;return{'name':T(a4,'name')||a2[aF(0x1c7)](/^#\s+(.+)$/m)?.[0x1]?.[aF(0x1c1)](),'description':T(a4,'description')||T(a4,'desc')||''};}(Z);return{'skillId':W,'name':a0['name']||U[aB(0x1bd)]||W,'description':a0[aB(0x1a1)]||U[aB(0x1a1)]||'','sourceType':U['sourceType']||U['source']||U['type']||'platform','iconUrl':U['iconUrl']||U[aB(0x1b3)]||'','relPath':Y,'enabled':!0x1!==U[aB(0x1d4)],'installedAt':new Date()['toISOString']()};}['health'](){const aG=ah;return[...this['agents']['values']()]['map'](R=>({'agentId':R[aG(0x1de)][aG(0x1f2)],'name':R['config'][aG(0x1bd)],'framework':R['config']['framework'],'deployType':R['config'][aG(0x19d)],'status':R['runtime']?.['isAlive']()?aG(0x1ba):'idle','lastActiveAt':R['lastActiveAt']}));}}async function y(R,U,V,W,X,Y){const aH=ah;if(Y['count']>=0xbb8)return void(Y['truncated']=!0x0);Y['count']+=0x1;const Z=await C(U),a0={'name':V?E['basename'](V):'','path':V,'type':Z['isDirectory']()?aH(0x19a):'file','size':Z[aH(0x1da)],'mtimeMs':Z[aH(0x1e0)]};if(!Z[aH(0x1e5)]()||W<=0x0)return a0;const a1=await x(U,{'withFileTypes':!0x0}),a2=[];for(const a3 of a1['sort']((a4,a5)=>a4['name'][aH(0x1f0)](a5['name']))){if(X['has'](a3[aH(0x1bd)]))continue;const a4=V?V+'/'+a3[aH(0x1bd)]:a3['name'],a5=await y(R,P(R,a4),a4,W-0x1,X,Y);if(a5&&a2['push'](a5),Y[aH(0x1e2)])break;}return a0['children']=a2,a0;}function I(R,U,V){const aI=ah,W=Number(R);return Number['isFinite'](W)?Math['max'](U,Math[aI(0x1a9)](V,Math[aI(0x1a5)](W))):U;}function A(R){const {cozeIdentity:U,...V}=R;return{...V,'hasIdentity':Boolean(U),'skills':S(R['skills']??[])};}function S(R){const aJ=ah;return R['map'](U=>({'skillId':U['skillId']||U['id'],'name':U['name']||U['skillId']||U['id'],'description':U['description']||'','sourceType':U['sourceType']||U['source']||aJ(0x1ac),'iconUrl':U[aJ(0x1b9)]||U['icon']||'','relPath':O(U['relPath']||'.skills/'+N(U['skillId']||U['id']||U[aJ(0x1bd)],'skill')),'enabled':!0x1!==U['enabled'],'installedAt':U[aJ(0x1c0)]}))['filter'](U=>U['skillId']);}function v(R){const aK=ah,U=R?.[aK(0x19b)]||R?.['id']||R?.['code']||R?.['name'];if(!U)throw new Error('_agent/addSkills:\x20skillId\x20is\x20required');return String(U);}function $(R){const aL=ah;return R['downloadUrl']||R['download_url']||R['packageUrl']||R['package_url']||R['archiveUrl']||R[aL(0x1f6)]||R['url'];}function T(R,U){const aM=ah,V=U[aM(0x19f)](/[.*+?^${}()|[\]\\]/g,'\x5c$&'),W=R[aM(0x1c7)](new RegExp('^'+V+'\x5cs*:\x5cs*(.+)$','mi'));return W?.[0x1]?.[aM(0x19f)](/^['"]|['"]$/g,'')[aM(0x1c1)]();}
|
package/dist/lib/cli.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(c,d){const o=b,f=c();while(!![]){try{const g=-parseInt(o(0x1db))/0x1*(-parseInt(o(0x1cf))/0x2)+parseInt(o(0x1d3))/0x3+parseInt(o(0x1e3))/0x4*(parseInt(o(0x1e9))/0x5)+-parseInt(o(0x1d2))/0x6*(-parseInt(o(0x1d5))/0x7)+parseInt(o(0x1e4))/0x8+-parseInt(o(0x1de))/0x9+-parseInt(o(0x1dd))/0xa*(parseInt(o(0x1e6))/0xb);if(g===d)break;else f['push'](f['shift']());}catch(h){f['push'](f['shift']());}}}(a,0xa84b4));export function parseArgs(c){const p=b,d=[...c];if(0x0===d['length']||e(d,p(0x1e0))||e(d,'-h'))return{'mode':p(0x1e5)};if(e(d,'--version')||e(d,'-v'))return{'mode':'version'};if(e(d,p(0x1e8)))return{'mode':'daemon'};if(e(d,'--status'))return{'mode':'status','deprecated':p(0x1cb)};if(e(d,p(0x1d9)))return{'mode':p(0x1d8),'deprecated':'--stop\x20->\x20stop'};if(e(d,p(0x1ce)))return{'mode':p(0x1d7),'deprecated':'--refresh\x20->\x20refresh'};if(e(d,'--install-service'))return{'mode':'service-install','deprecated':'--install-service\x20->\x20service\x20install'};if(e(d,'--uninstall'))return{'mode':'purge','deprecated':'--uninstall\x20->\x20purge'};const [f,g]=d;if('status'===f)return{'mode':'status'};if(p(0x1d8)===f)return{'mode':'stop'};if('refresh'===f)return{'mode':'refresh'};if('reload'===f)return{'mode':'reload','agentId':n(d,'--agent-id')};if('log'===f)return{'mode':'log','agentId':n(d,p(0x1dc)),'date':n(d,'--date'),'tail':Number(n(d,'-n')??n(d,'--tail')??0xc8),'follow':e(d,'-f')||e(d,p(0x1d4)),'level':n(d,'--level'),'grep':n(d,'--grep'),'raw':e(d,'--raw'),'list':e(d,p(0x1e1))};if('update'===f)return{'mode':'update'};if('purge'===f)return{'mode':'purge'};if(p(0x1cd)===f&&'install'===g)return{'mode':'service-install'};if('service'===f&&'uninstall'===g)return{'mode':'service-uninstall'};if(p(0x1df)===f)return{'mode':'connect','patToken':n(d,p(0x1cc)),'env':n(d,p(0x1e7)),'handshakeUrl':n(d,'--handshake-url'),'frontierUrl':n(d,'--frontier-url'),'mockScenario':n(d,'--mock-scenario'),'agentId':n(d,p(0x1dc))};if('send'===f)return function(k){const q=p,l=k[0x1],m=k[0x2];return['image',q(0x1d1)][q(0x1da)](l)&&m?{'mode':'send','kind':l,'target':m,'agentId':n(k,q(0x1dc)),'sessionId':n(k,'--session-id'),'caption':n(k,'--caption'),'name':n(k,'--name'),'groupFile':e(k,'--group-file'),'mime':n(k,'--mime')}:{'mode':'help'};}(d);if(p(0x1d0)===f)return{'mode':'spawn-daemon'};const h=n(d,'--pat-token'),j=n(d,'--pair-code');return h&&j?{'mode':'pair','patToken':h,'pairCode':j,'agentId':n(d,'--agent-id'),'env':n(d,'--env'),'handshakeUrl':n(d,'--handshake-url'),'frontierUrl':n(d,p(0x1e2)),'mockScenario':n(d,'--mock-scenario')}:{'mode':p(0x1e5)};}function a(){const s=['--follow','2793553QAGSUn','log','refresh','stop','--stop','includes','1217FpZZOJ','--agent-id','1570hFRFwa','7395525wQEosv','connect','--help','--list','--frontier-url','148gfJpRK','2600832leYvch','help','7777wjZxMh','--env','--daemon','22325WkioHG','--status\x20->\x20status','--pat-token','service','--refresh','538UDOhlC','daemon','file','6uukuQd','1215885thqLKH'];a=function(){return s;};return a();}export function printHelp(){const r=b;console[r(0x1d6)]('licos-bridge\x20-\x20local\x20bridge\x20daemon\x20for\x20LICOS\x20Agent\x20Service\x0a\x0aPair\x20(paste\x20from\x20cloud\x20UI;\x20start/reuse\x20daemon\x20and\x20deliver\x20pair-code):\x0a\x20\x20npx\x20-y\x20--registry=https://registry.npmmirror.com\x20@kmlckj/licos-bridge@latest\x20--pat-token=<token>\x20--pair-code=<code>\x20--handshake-url=<url>\x0a\x0aDaemon\x20control:\x0a\x20\x20licos-bridge\x20status\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20show\x20daemon\x20status\x0a\x20\x20licos-bridge\x20stop\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stop\x20daemon\x0a\x20\x20licos-bridge\x20refresh\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20re-detect\x20local\x20agent\x20binaries\x0a\x20\x20licos-bridge\x20reload\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20recycle\x20all\x20agent\x20subprocesses\x0a\x20\x20licos-bridge\x20reload\x20--agent-id\x20<id>\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20recycle\x20one\x20agent\x20subprocess\x0a\x0aView\x20logs:\x0a\x20\x20licos-bridge\x20log\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20bridge\x20last\x20200\x20lines\x0a\x20\x20licos-bridge\x20log\x20--agent-id\x20<id>\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20agent\x20related\x20logs\x0a\x20\x20licos-bridge\x20log\x20[--agent-id\x20<id>]\x20[--date\x20YYYY-MM-DD]\x20\x5c\x0a\x20\x20\x20\x20\x20\x20[-n\x20<N>]\x20[-f]\x20[--level\x20<l>]\x20[--grep\x20<s>]\x20[--raw]\x20[--list]\x0a\x0aUpdate:\x0a\x20\x20licos-bridge\x20update\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stop\x20daemon\x20and\x20run\x20latest\x20package\x20connect\x0a\x20\x20licos-bridge\x20purge\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stop\x20daemon\x20+\x20unregister\x20supervisor\x20+\x20remove\x20bridge\x20data\x0a\x0aOS\x20supervisor\x20(auto-start\x20on\x20login):\x0a\x20\x20licos-bridge\x20service\x20install\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20register\x20supervisor\x0a\x20\x20licos-bridge\x20service\x20uninstall\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20unregister\x20supervisor\x0a\x0aReconnect:\x0a\x20\x20licos-bridge\x20connect\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20reconnect\x20using\x20stored\x20PAT\x0a\x20\x20licos-bridge\x20connect\x20--pat-token\x20<token>\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20reconnect\x20using\x20specified\x20PAT\x0a\x20\x20licos-bridge\x20connect\x20--env=dev\x20--handshake-url=<url>\x20\x20\x20\x20\x20\x20\x20\x20\x20reconnect\x20with\x20route\x20override\x0a\x0aSend\x20file\x20/\x20image:\x0a\x20\x20licos-bridge\x20send\x20image\x20<path>\x20--agent-id\x20<id>\x20--session-id\x20<id>\x20[--caption\x20\x22...\x22]\x0a\x20\x20licos-bridge\x20send\x20file\x20\x20<path>\x20--agent-id\x20<id>\x20--session-id\x20<id>\x20[--caption\x20\x22...\x22]\x20[--name\x20\x22report.pdf\x22]\x0a\x20\x20licos-bridge\x20send\x20file\x20<uri>\x20--agent-id\x20<id>\x20--session-id\x20<id>\x20--group-file\x20--mime\x20<mimeType>\x20[--name\x20\x22...\x22]\x0a\x0aPair\x20flags:\x0a\x20\x20--env\x20<value>\x0a\x20\x20--handshake-url\x20<url>\x0a\x20\x20--frontier-url\x20<url>\x0a\x20\x20--mock-scenario\x20<name>\x0a\x0aInfo:\x0a\x20\x20licos-bridge\x20--version\x20|\x20-v\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20print\x20current\x20bridge\x20version\x0a\x20\x20licos-bridge\x20--help\x20\x20\x20\x20|\x20-h\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20show\x20this\x20help\x0a\x0aDeprecated\x20flags:\x0a\x20\x20--status\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20->\x20licos-bridge\x20status\x0a\x20\x20--stop\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20->\x20licos-bridge\x20stop\x0a\x20\x20--install-service\x20\x20\x20->\x20licos-bridge\x20service\x20install\x0a\x20\x20--uninstall\x20\x20\x20\x20\x20\x20\x20\x20\x20->\x20licos-bridge\x20purge\x0a\x0aCompatibility:\x0a\x20\x20coze-bridge\x20is\x20provided\x20as\x20a\x20bin\x20alias.\x0a\x0aInternal:\x0a\x20\x20<node>\x20<entry>\x20--daemon\x0a');}function e(c,d){return c['includes'](d);}function b(c,d){c=c-0x1cb;const e=a();let f=e[c];return f;}function n(c,d){const f=d+'=',g=c['find'](j=>j['startsWith'](f));if(g)return g['slice'](f['length']);const h=c['indexOf'](d);return h>=0x0&&c[h+0x1]&&!c[h+0x1]['startsWith']('--')?c[h+0x1]:void 0x0;}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const A=c;(function(m,p){const z=c,q=m();while(!![]){try{const u=parseInt(z(0x100))/0x1+-parseInt(z(0xf8))/0x2*(parseInt(z(0x124))/0x3)+-parseInt(z(0x126))/0x4+parseInt(z(0xfa))/0x5*(parseInt(z(0x108))/0x6)+parseInt(z(0x127))/0x7+-parseInt(z(0x114))/0x8*(-parseInt(z(0x116))/0x9)+-parseInt(z(0x12b))/0xa;if(u===p)break;else q['push'](q['shift']());}catch(v){q['push'](q['shift']());}}}(b,0xdb0c9));function b(){const V=['68805gEXRSs','close','2.0','logger','mockScenario','env','toString','heartbeatTimer','handshakeUrl','pairing','bridgeClientId','agentId','now','content','3259527dgHPWz','connectStored','4014812qWdIbd','10145338TtobXh','startsWith','frontier\x20closed','isConnected','30711780QnEcCN','pair','json','sendFrame','forwardClientRequest','sendResponse','delete','get','2pMmGEJ','sendNotification','8920WNCZIt','\x20timed\x20out','pending','handshake\x20failed:\x20HTTP\x20','patToken','open','1618938RoEAea','_agent/pair','frontier\x20is\x20not\x20connected','accessToken','frontier\x20error','result','connect\x20requires\x20stored\x20pat-token\x20or\x20--pat-token','handlers','4632aXLerY','configFile','agentManager','sendRequest','frontierUrl','error','restored','catch','reconnect','https://www.licos.com','set','pairCode','1688CYsYea','device_id'];b=function(){return V;};return b();}import f from'ws';import{detectFrameworks as g}from'./frameworks.js';import{joinUrl as h,readJson as j,writeJson as k}from'./utils.js';import{resolvePaths as l}from'./paths.js';const a=A(0x111),o='/api/v1/workbench/local-agent-bridge/handshake';function c(a,d){a=a-0xf6;const e=b();let f=e[a];return f;}export class CloudConnector{constructor({logger:m}){const B=A;this[B(0x119)]=m,this['ws']=void 0x0,this['pairing']=void 0x0,this['handlers']=new Map(),this['pending']=new Map(),this[B(0x11d)]=void 0x0,this[B(0x10a)]=void 0x0;}['setAgentManager'](m){this['agentManager']=m;}['on'](m,p){const C=A;this['handlers'][C(0x112)](m,p);}async['restore'](){const D=A,m=await j(l()[D(0x109)],{})[D(0x10f)](()=>({}));m?.['pairing']?.['patToken']&&m?.['pairing']?.['pairCode']&&await this['pair'](m['pairing'],{'restored':!0x0})['catch'](p=>{const E=D;this[E(0x119)]?.('restore\x20pair\x20failed',{'error':String(p)});});}async[A(0x12c)](m,p={}){const F=A;this[F(0x11f)]={'handshakeUrl':m[F(0x11e)]||a,'frontierUrl':m[F(0x10c)],'env':m[F(0x11b)],'mockScenario':m['mockScenario'],'agentId':m['agentId'],'patToken':m[F(0xfe)],'pairCode':m['pairCode']},await k(l()['configFile'],{'pairing':this[F(0x11f)],'updatedAt':new Date()['toISOString']()},0x180);const q=await this['handshake'](),u=m['frontierUrl']||d(q,['frontierUrl','frontier_url']);return u&&await this['connect'](u,q),!p[F(0x10e)]&&m[F(0x121)]&&this[F(0xf9)](F(0x101),{'agentId':m[F(0x121)]})[F(0x10f)](()=>{}),{'ok':!0x0,'deviceId':d(q,['deviceId',F(0x115)]),'bridgeClientId':d(q,[F(0x120),'bridge_client_id']),'frontierConnected':Boolean(this['ws']&&this['ws']['readyState']===f['OPEN'])};}async[A(0x125)](m={}){const G=A,p=await j(l()['configFile'],{})['catch'](()=>({})),q=p?.['pairing']??{},u=m['patToken']||q['patToken'];if(!u)throw new Error(G(0x106));return this[G(0x12c)]({...q,...m,'patToken':u,'pairCode':m['pairCode']??q[G(0x113)]},{'connectOnly':!0x0});}async['handshake'](){const H=A,m=await g(),p=(q=this['pairing'][H(0x11e)])?/\/handshake\/?$/['test'](q)?q:h(q,o):h(a,o);var q;const u=await fetch(p,{'method':'POST','headers':{'content-type':'application/json','authorization':'Bearer\x20'+this[H(0x11f)][H(0xfe)],...this['pairing']['env']?{'x-licos-env':this['pairing']['env']}:{},...this['pairing'][H(0x11a)]?{'x-mock-scenario':this['pairing']['mockScenario']}:{}},'body':JSON['stringify']({'pairCode':this[H(0x11f)][H(0x113)],'pair_code':this[H(0x11f)]['pairCode'],'agentId':this['pairing']['agentId'],'agent_id':this['pairing']['agentId'],'mockScenario':this['pairing']['mockScenario'],'mock_scenario':this['pairing']['mockScenario'],'device':{'hostname':process.env.COMPUTERNAME||process.env.HOSTNAME||'','platform':process['platform'],'arch':process['arch'],'nodeVersion':process['version']},'frameworks':m})});if(!u['ok'])throw new Error(H(0xfd)+u['status']+'\x20'+await u['text']());const v=await u[H(0x12d)]();return v['data']??v;}async['connect'](m,p){const I=A;await this['stop'](I(0x110));const q=d(p,[I(0x103),'access_token','frontierToken','frontier_token'])||this['pairing']['patToken'];this['ws']=new f(m,{'headers':{'authorization':'Bearer\x20'+q,...this['pairing'][I(0x11b)]?{'x-licos-env':this['pairing'][I(0x11b)]}:{}}}),this['ws']['on'](I(0xff),()=>{const J=I;this[J(0x119)]?.('frontier\x20connected',{'frontierUrl':m}),this['sendHealth']()[J(0x10f)](()=>{}),this[J(0x11d)]=setInterval(()=>this['sendHealth']()['catch'](()=>{}),0x2710);}),this['ws']['on']('message',u=>{this['handleFrame'](u['toString']('utf8'))['catch'](v=>{this['logger']?.('frontier\x20frame\x20failed',{'error':String(v)});});}),this['ws']['on'](I(0x117),(u,v)=>{const K=I;this['logger']?.(K(0x129),{'code':u,'reason':v[K(0x11c)]()}),clearInterval(this[K(0x11d)]),this['heartbeatTimer']=void 0x0;}),this['ws']['on']('error',u=>{const L=I;this['logger']?.(L(0x104),{'error':String(u)});});}async['handleFrame'](m){const M=A,p=JSON['parse'](m);if(void 0x0!==p['id']&&(void 0x0!==p['result']||void 0x0!==p[M(0x10d)])){const v=this['pending'][M(0xf7)](p['id']);return void(v&&(this[M(0xfc)]['delete'](p['id']),p['error']?v['reject'](new Error(p['error']['message']||JSON['stringify'](p['error']))):v['resolve'](p[M(0x105)])));}const q=p['method']||p['type'],u=this[M(0x107)][M(0xf7)](q)||(q?.[M(0x128)]('session/')?this[M(0x107)]['get']('session/*'):void 0x0);if(u)try{const w=await u(p['params']??p[M(0x123)]??{});void 0x0!==p['id']&&await this['sendResponse'](p['id'],w);}catch(x){if(void 0x0===p['id'])throw x;await this[M(0x130)](p['id'],void 0x0,{'code':-0x7f5b,'message':x['message']||String(x)});}else void 0x0!==p['id']&&await this[M(0x130)](p['id'],void 0x0,{'code':-0x7f59,'message':'method\x20not\x20found:\x20'+q});}async['sendHealth'](){await this['sendNotification']('_agent/health',{'agents':this['agentManager']?.['health']()??[],'ts':Date['now']()});}async[A(0xf9)](m,p){const N=A;await this[N(0x12e)]({'jsonrpc':'2.0','method':m,'params':p});}async[A(0x130)](m,p,q){const O=A;await this['sendFrame'](q?{'jsonrpc':O(0x118),'id':m,'error':q}:{'jsonrpc':'2.0','id':m,'result':p});}async['sendRequest'](m,p,q=0x7530){const P=A,u=Date[P(0x122)]()+'-'+Math['random']()['toString'](0x10)['slice'](0x2);return await this[P(0x12e)]({'jsonrpc':P(0x118),'id':u,'method':m,'params':p}),new Promise((v,w)=>{const x=setTimeout(()=>{const Q=c;this['pending'][Q(0xf6)](u),w(new Error(m+Q(0xfb)));},q);this['pending']['set'](u,{'resolve':y=>{clearTimeout(x),v(y);},'reject':y=>{clearTimeout(x),w(y);}});});}async[A(0x12f)](m,p,q){const R=A;if(this[R(0x12a)]())return this[R(0x10b)]('_agent/client_request',{'agentId':m['agentId'],'method':p,'params':q})['catch'](()=>{});}async['sendBridgeFile'](m){const S=A;if(!this['isConnected']())throw new Error(S(0x102));return this[S(0x10b)]('_agent/sendFile',m,0x1d4c0);}async[A(0x12e)](m){const T=A;if(!this[T(0x12a)]())throw new Error('frontier\x20is\x20not\x20connected');this['ws']['send'](JSON['stringify'](m));}[A(0x12a)](){return Boolean(this['ws']&&this['ws']['readyState']===f['OPEN']);}async['stop'](m){const U=A;clearInterval(this['heartbeatTimer']),this[U(0x11d)]=void 0x0,this['ws']&&(this['logger']?.('closing\x20frontier',{'reason':m}),this['ws'][U(0x117)](),this['ws']=void 0x0);}}function d(m,p){for(const q of p)if(void 0x0!==m?.[q]&&null!==m[q]&&''!==m[q])return m[q];}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(z,A){const N=f,B=z();while(!![]){try{const C=parseInt(N(0x135))/0x1+parseInt(N(0x125))/0x2+-parseInt(N(0x12d))/0x3+-parseInt(N(0x12a))/0x4+-parseInt(N(0x123))/0x5+parseInt(N(0x11c))/0x6*(parseInt(N(0x11f))/0x7)+-parseInt(N(0x11d))/0x8*(-parseInt(N(0x13b))/0x9);if(C===A)break;else B['push'](B['shift']());}catch(D){B['push'](B['shift']());}}}(b,0xc2c56));function b(){const U=['994734wzdYLL','agentId','reason','headers','listSkills','_agent/create','url','127.0.0.1','1042169gzkoRD','_agent/health','POST','health','/reload','_agent/addSkills','1222101osLReG','not\x20found','handleSession','toISOString','disconnect','pid','port','session/cancel','stringify','54ANBgVx','24HFgzJq','/send','47159sekytG','ipc\x20request\x20failed','session/new','/refresh','6705090PoDxHT','_agent/getFileContent','2556456iAQfhq','method','catch','_agent/listSkills','detail','1272076cEMTPm','isConnected','configFile'];b=function(){return U;};return b();}import{createServer as g}from'node:http';import{randomBytes as h}from'node:crypto';import{detectFrameworks as j}from'./frameworks.js';import{AgentManager as k}from'./agent-manager.js';import{CloudConnector as m}from'./cloud.js';import{resolvePaths as q}from'./paths.js';import{appendLog as u,ensureDir as v,readText as w,writeJson as x,writePrivateText as y}from'./utils.js';function f(a,c){a=a-0x115;const d=b();let e=d[a];return e;}export async function startDaemonServer(){const O=f,z=q();await v(z['bridgeRoot']),await v(z['agentsRoot']);const A=(F,G)=>u(z['logFile'],F,G)[O(0x127)](()=>{}),B=new m({'logger':A}),C=new k({'cloud':B,'logger':A});B['setAgentManager'](C),await C['loadPersistedAgents'](),B['on'](O(0x132),F=>C['createOrUpdate'](F)),B['on']('_agent/detail',F=>C[O(0x129)](F)),B['on']('_agent/update',F=>C['createOrUpdate'](F)),B['on']('_agent/disconnect',async F=>(await C[O(0x117)](F[O(0x12e)],F[O(0x12f)]),{'ok':!0x0})),B['on'](O(0x136),()=>({'agents':C[O(0x138)]()})),B['on']('_agent/getFileTree',F=>C['getFileTree'](F)),B['on'](O(0x124),F=>C['getFileContent'](F)),B['on'](O(0x128),F=>C[O(0x131)](F)),B['on'](O(0x13a),F=>C['addSkills'](F)),B['on']('_agent/removeSkills',F=>C['removeSkills'](F)),B['on']('session/*',F=>C['handleSession'](F[O(0x126)]||F['_method']||'session/prompt',F)),B['on']('session/new',F=>C['handleSession'](O(0x121),F)),B['on']('session/prompt',F=>C[O(0x115)]('session/prompt',F)),B['on']('session/cancel',F=>C['handleSession'](O(0x11a),F));const D=await async function(F){const P=O,G=await w(F['tokenFile']);if(G?.['trim']())return G['trim']();const H=h(0x18)['toString']('hex');return await y(F['tokenFile'],H),await x(F[P(0x12c)],{'createdAt':new Date()[P(0x116)]()},0x180),H;}(z),E=g(async(F,G)=>{const R=O;try{if(!function(I,J){const Q=f;return(I[Q(0x130)]['authorization']||'')==='Bearer\x20'+J;}(F,D))return p(G,0x191,{'ok':!0x1,'error':'unauthorized'});const H=await function(I){return new Promise((J,K)=>{const L=[];I['on']('data',M=>L['push'](M)),I['on']('error',K),I['on']('end',()=>{if(0x0===L['length'])return J({});const M=Buffer['concat'](L)['toString']('utf8');J(M?JSON['parse'](M):{});});});}(F);if('GET'===F['method']&&'/status'===F[R(0x133)])return p(G,0xc8,{'ok':!0x0,'pid':process[R(0x118)],'frontierConnected':B[R(0x12b)](),'frameworks':await j(),'agents':C['health']()});if(R(0x137)===F['method']&&'/pair'===F['url'])return p(G,0xc8,await B['pair'](H));if('POST'===F['method']&&'/connect'===F['url'])return p(G,0xc8,await B['connectStored'](H));if(R(0x137)===F['method']&&R(0x122)===F[R(0x133)])return p(G,0xc8,{'ok':!0x0,'frameworks':await j()});if('POST'===F[R(0x126)]&&R(0x139)===F['url'])return p(G,0xc8,await C['reload'](H[R(0x12e)]));if('POST'===F['method']&&R(0x11e)===F['url'])return p(G,0xc8,await B['sendBridgeFile'](H));if('POST'===F['method']&&'/stop'===F[R(0x133)])return p(G,0xc8,{'ok':!0x0}),await B['stop']('ipc\x20stop'),await C['stopAll']('ipc\x20stop'),void E['close'](()=>process['exit'](0x0));p(G,0x194,{'ok':!0x1,'error':R(0x13c)});}catch(I){await A(R(0x120),{'url':F['url'],'error':String(I)}),p(G,0x1f4,{'ok':!0x1,'error':I['message']||String(I)});}});E['listen'](0x0,O(0x134),async()=>{const S=O,F=E['address']();await y(z['portFile'],String(F[S(0x119)])),await y(z['pidFile'],String(process['pid'])),await A('daemon\x20started',{'pid':process['pid'],'port':F['port']}),await B['restore']();});}function p(z,A,B){const T=f;z['writeHead'](A,{'content-type':'application/json;\x20charset=utf-8'}),z['end'](JSON[T(0x11b)](B));}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(k,l){const y=d,m=k();while(!![]){try{const p=parseInt(y(0x1b2))/0x1*(-parseInt(y(0x1a7))/0x2)+parseInt(y(0x1aa))/0x3*(-parseInt(y(0x1a3))/0x4)+parseInt(y(0x1a6))/0x5*(parseInt(y(0x1ab))/0x6)+parseInt(y(0x1a9))/0x7*(parseInt(y(0x19b))/0x8)+-parseInt(y(0x19e))/0x9*(parseInt(y(0x1a8))/0xa)+parseInt(y(0x19d))/0xb+-parseInt(y(0x1af))/0xc;if(p===l)break;else m['push'](m['shift']());}catch(q){m['push'](m['shift']());}}}(b,0x2ea6c));import{fileURLToPath as f}from'node:url';function d(a,c){a=a-0x19b;const e=b();let f=e[a];return f;}import{readFile as g}from'node:fs/promises';import h from'node:path';import{commandVersion as i,findExecutable as j}from'./utils.js';export async function detectFrameworks(){const z=d,k=[],l=j(z(0x1a1)),m=j('codex'),p=j('openclaw');return k[z(0x1ae)]({'id':'claude-code','name':'Claude\x20Code','installed':Boolean(l),'command':l,'version':l?i(l):void 0x0,'acpPackage':'@agentclientprotocol/claude-agent-acp','acpBin':'claude-agent-acp'}),k['push']({'id':z(0x1b0),'name':'Codex','installed':Boolean(m||await r('@zed-industries/codex-acp/bin/codex-acp.js')),'command':m,'version':m?i(m):void 0x0,'acpPackage':z(0x19c),'acpBin':z(0x19f)}),k['push']({'id':'openclaw','name':'OpenClaw','installed':Boolean(p),'command':p,'version':p?i(p):void 0x0,'acpPackage':void 0x0,'acpBin':void 0x0}),k;}function b(){const C=['string','4NkXJoc','execPath','parse','10145ekldly','63638gjIYkO','10hpstNH','1393651yHnhcI','105423ItUnXP','996EjGUAV','@agentclientprotocol/claude-agent-acp','ACP\x20runtime\x20is\x20not\x20supported\x20for\x20framework:\x20','push','2887848gUVsNh','codex','claude-code','5IFZhBn','8HoYBPf','@zed-industries/codex-acp','4129752ohdjKf','2568285LPFUPR','codex-acp','utf8','claude'];b=function(){return C;};return b();}export async function resolveAcpBin(k){const A=d;if(A(0x1b0)===k){const l=import.meta.resolve('@zed-industries/codex-acp/bin/codex-acp.js');return{'command':process[A(0x1a4)],'args':[f(l)]};}if(A(0x1b1)===k)return async function(m,p){const B=A,q=import.meta.resolve(m+'/package.json'),u=f(q),v=h['dirname'](u),w=JSON[B(0x1a5)](await g(u,B(0x1a0))),x=B(0x1a2)==typeof w['bin']?w['bin']:w['bin']?.[p];if(!x)throw new Error(m+'\x20package.json\x20has\x20no\x20bin\x20'+p);return{'command':process['execPath'],'args':[h['join'](v,x)]};}(A(0x1ac),'claude-agent-acp');throw new Error(A(0x1ad)+k);}async function r(k){try{return import.meta.resolve(k),!0x0;}catch{return!0x1;}}
|
package/dist/lib/ipc.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(m,p){const A=c,q=m();while(!![]){try{const s=parseInt(A(0x135))/0x1*(parseInt(A(0x132))/0x2)+parseInt(A(0x13c))/0x3*(parseInt(A(0x138))/0x4)+parseInt(A(0x12f))/0x5*(parseInt(A(0x139))/0x6)+parseInt(A(0x13e))/0x7+-parseInt(A(0x13b))/0x8*(parseInt(A(0x13f))/0x9)+-parseInt(A(0x12d))/0xa*(parseInt(A(0x134))/0xb)+-parseInt(A(0x12e))/0xc*(parseInt(A(0x130))/0xd);if(s===p)break;else q['push'](q['shift']());}catch(u){q['push'](q['shift']());}}}(b,0xe140a));import{fileURLToPath as d}from'node:url';function b(){const F=['483452unDUzU','8370baQFQC','licos-bridge\x20daemon\x20did\x20not\x20start\x20in\x20time','8AHMZMQ','39NFbFhe','Bearer\x20','10152233rKcDtU','10754793isuvCm','json','10ThxTwL','132hNaYkD','6430FpwtHF','2316821HBEonr','all','38BQdzbB','index.js','20149547qqYpHb','57593zhuMuf','\x20failed:\x20HTTP\x20','tokenFile'];b=function(){return F;};return b();}import f from'node:path';import{resolvePaths as g}from'./paths.js';import{isProcessAlive as h,readText as j,sleep as k,spawnDetached as l}from'./utils.js';export async function readDaemonInfo(){const B=c,q=g(),[u,v,w]=await Promise[B(0x131)]([j(q['pidFile']),j(q['portFile']),j(q[B(0x137)])]),x=Number(u),y=Number(v),z=w?.['trim']();if(x&&y&&z&&h(x))return{'pid':x,'port':y,'token':z};}function c(a,d){a=a-0x12d;const e=b();let f=e[a];return f;}export async function ensureDaemon(){const C=c,m=await readDaemonInfo();if(m)return m;await startDaemon();for(let p=0x0;p<0x50;p+=0x1){const q=await readDaemonInfo();if(q)return q;await k(0x64);}throw new Error(C(0x13a));}export async function startDaemon(){const D=c,m=f['resolve'](f['dirname'](d(import.meta.url)),'..',D(0x133));l(m,['--daemon']);}export async function ipcRequest(m,p,q){const E=c,s=await fetch('http://127.0.0.1:'+q['port']+m,{'method':'/status'===m?'GET':'POST','headers':{'authorization':E(0x13d)+q['token'],'content-type':'application/json'},'body':'/status'===m?void 0x0:JSON['stringify'](p??{})}),u=await s[E(0x140)]()['catch'](()=>({}));if(!s['ok'])throw new Error(u['error']||'IPC\x20'+m+E(0x136)+s['status']);return u;}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(D,E){const V=h,F=D();while(!![]){try{const G=parseInt(V(0x1ad))/0x1+parseInt(V(0x19c))/0x2+-parseInt(V(0x1b5))/0x3*(-parseInt(V(0x195))/0x4)+parseInt(V(0x1a7))/0x5*(parseInt(V(0x19f))/0x6)+parseInt(V(0x1b1))/0x7+-parseInt(V(0x1b4))/0x8*(parseInt(V(0x1a1))/0x9)+parseInt(V(0x198))/0xa*(-parseInt(V(0x196))/0xb);if(G===E)break;else F['push'](F['shift']());}catch(H){F['push'](F['shift']());}}}(b,0x77589));import{spawnSync as j}from'node:child_process';import{readdir as k,readFile as m,stat as q}from'node:fs/promises';import{fileURLToPath as u}from'node:url';import v from'node:path';import{detectFrameworks as w}from'./frameworks.js';import{ipcRequest as x,readDaemonInfo as y}from'./ipc.js';import{resolvePaths as z}from'./paths.js';import{readJson as A,readText as B,removeDir as C}from'./utils.js';export async function statusSnapshot(){const W=h,D=await y();if(!D)return{'running':!0x1,'frameworks':await w()};const E=await x('/status',void 0x0,D)['catch'](F=>({'ok':!0x1,'error':F[W(0x1ae)]||String(F)}));return{'running':!0x0,'pid':D['pid'],...E};}export async function purgeBridge(){const X=h,D=await y();D&&await x('/stop',{},D)['catch'](()=>{});const {uninstallService:E}=await import(X(0x1a2));await E()[X(0x1b8)](()=>{}),await C(z()['bridgeRoot']);}export async function packageVersion(){const Y=h,D=await A(v['resolve'](v['dirname'](u(import.meta.url)),'..','..','package.json'),void 0x0)['catch'](()=>{});return D?.['version']||Y(0x18f);}export async function printLogs(D={}){const Z=h,E=z();if(D['list']){const J=await k(E['bridgeRoot'])['catch'](()=>[]);for(const K of J[Z(0x190)](L=>/^bridge(?:-\d{4}-\d{2}-\d{2})?\.log$/['test'](L))['sort']())console['log'](K);return;}const F=D['date']?v['join'](E['bridgeRoot'],'bridge-'+D[Z(0x1a0)]+Z(0x194)):E['logFile'],G=await B(F)??'';let H=G['split'](/\r?\n/)[Z(0x190)](Boolean);D[Z(0x1ac)]&&(H=H[Z(0x190)](L=>L[Z(0x1b7)](D[Z(0x1ac)]))),D[Z(0x19e)]&&(H=H['filter'](L=>L[Z(0x1b7)](D[Z(0x19e)]))),D[Z(0x1a3)]&&(H=H['filter'](L=>L['toLowerCase']()['includes'](String(D[Z(0x1a3)])['toLowerCase']())));const I=Number['isFinite'](D['tail'])?D['tail']:0xc8;I>0x0&&(H=H['slice'](-I));for(const L of H)console['log'](L);D[Z(0x18d)]&&await async function(M,N,O){let P=N;await new Promise(Q=>{const R=setInterval(async()=>{const a0=h,S=await B(M)??'';if(S['length']>P){let T=S[a0(0x1b9)](P)[a0(0x1a4)](/\r?\n/)['filter'](Boolean);P=S['length'],O['agentId']&&(T=T['filter'](U=>U['includes'](O['agentId']))),O['grep']&&(T=T[a0(0x190)](U=>U[a0(0x1b7)](O['grep'])));for(const U of T)console['log'](U);}},0x3e8);process['on']('SIGINT',()=>{clearInterval(R),Q();});});}(E[Z(0x1aa)],G['length'],D);}function b(){const a4=['grep','6LxJPML','date','36NaqMlU','./service.js','level','split','size','image/webp','1449655rpLXwv','kind','.jpg','logFile','.png','agentId','444613nehCIm','message','platform','.md','622972wWuoMI','update\x20failed:\x20','image','350904nPkBtO','3zaromK','target','includes','catch','slice','application/json','mime','application/octet-stream','inherit','follow','caption','0.0.0','filter','sessionId','toString','\x20bytes\x20(max\x2052428800)','.log','1383252bpCwNG','44nyFsqd','/stop','2538880WXKmpO','.json','name','npx','1020984uMXtao','text/markdown'];b=function(){return a4;};return b();}export async function runUpdate(){const a1=h,D=await y();D&&await x(a1(0x197),{},D)[a1(0x1b8)](()=>{});const E='win32'===process[a1(0x1af)]?'npx.cmd':a1(0x19b),F=['-y','--ignore-existing','@kmlckj/licos-bridge@latest','connect'];if(0x0!==j(E,F,{'stdio':a1(0x18c),'windowsHide':!0x0})['status'])throw new Error(a1(0x1b2)+E+'\x20'+F['join']('\x20'));}function h(a,c){a=a-0x18b;const d=b();let e=d[a];return e;}export async function buildSendPayload(D){const a2=h;if(!D[a2(0x1ac)])throw new Error('send\x20requires\x20--agent-id');if(!D['sessionId'])throw new Error('send\x20requires\x20--session-id');if(D['groupFile']){if(!D['mime'])throw new Error('send\x20--group-file\x20requires\x20--mime');return{'kind':D['kind'],'uri':D['target'],'agentId':D['agentId'],'sessionId':D['sessionId'],'caption':D[a2(0x18e)],'name':D[a2(0x19a)],'groupFile':!0x0,'mime':D['mime']};}const E=await q(D[a2(0x1b6)]);if(!E['isFile']())throw new Error('not\x20a\x20file:\x20'+D['target']);if(E[a2(0x1a5)]>0x3200000)throw new Error('file\x20too\x20large:\x20'+E[a2(0x1a5)]+a2(0x193));const F=await m(D['target']);return{'kind':D[a2(0x1a8)],'agentId':D[a2(0x1ac)],'sessionId':D[a2(0x191)],'caption':D[a2(0x18e)],'name':D['name']||v['basename'](D['target']),'mime':D[a2(0x1bb)]||f(D['target'],D['kind']),'size':F['byteLength'],'contentBase64':F[a2(0x192)]('base64')};}function f(D,E){const a3=h,F=v['extname'](D)['toLowerCase']();if(a3(0x1b3)===E){if(a3(0x1ab)===F)return'image/png';if([a3(0x1a9),'.jpeg']['includes'](F))return'image/jpeg';if('.gif'===F)return'image/gif';if('.webp'===F)return a3(0x1a6);}return'.pdf'===F?'application/pdf':'.txt'===F?'text/plain':a3(0x1b0)===F?a3(0x19d):a3(0x199)===F?a3(0x1ba):a3(0x18b);}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(f,g){const k=b,h=f();while(!![]){try{const i=-parseInt(k(0x6e))/0x1*(parseInt(k(0x76))/0x2)+-parseInt(k(0x75))/0x3+parseInt(k(0x77))/0x4+parseInt(k(0x6f))/0x5+-parseInt(k(0x78))/0x6+-parseInt(k(0x72))/0x7+parseInt(k(0x73))/0x8*(parseInt(k(0x74))/0x9);if(i===g)break;else h['push'](h['shift']());}catch(j){h['push'](h['shift']());}}}(a,0xa12e2));function b(c,d){c=c-0x6e;const e=a();let f=e[c];return f;}import c from'node:os';import d from'node:path';function a(){const m=['4994496bwgdHR','join','config.json','resolve','235516AbudbP','4197580YcoLiw','service.log','.licos','1415694lCDWLx','32meMLmL','3667743kWZbfC','835047RPNaBi','10IAeDaj','2724628CkVOmL'];a=function(){return m;};return a();}export function resolvePaths(){const l=b,f=process.env.LICOS_BRIDGE_HOME?d[l(0x7b)](process.env.LICOS_BRIDGE_HOME):d['join'](c['homedir'](),l(0x71)),g=d['join'](f,'bridge');return{'root':f,'bridgeRoot':g,'agentsRoot':process.env.LICOS_BRIDGE_AGENTS_HOME?d['resolve'](process.env.LICOS_BRIDGE_AGENTS_HOME):d['join'](f,'agents'),'pidFile':d[l(0x79)](g,'bridge.pid'),'portFile':d['join'](g,'bridge.port'),'tokenFile':d['join'](g,'bridge.token'),'logFile':d['join'](g,'bridge.log'),'configFile':d['join'](g,l(0x7a)),'serviceLogFile':d[l(0x79)](g,l(0x70))};}export function agentPaths(f){const g=resolvePaths(),h=d['join'](g['agentsRoot'],f);return{'root':h,'configFile':d['join'](h,'config.json'),'workspace':d['join'](h,'workspace'),'logs':d['join'](h,'logs')};}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(m,p){const y=c,q=m();while(!![]){try{const u=-parseInt(y(0x1c4))/0x1+-parseInt(y(0x1c1))/0x2+parseInt(y(0x1b3))/0x3+parseInt(y(0x1cb))/0x4*(-parseInt(y(0x1cc))/0x5)+-parseInt(y(0x1bb))/0x6+parseInt(y(0x1ab))/0x7*(-parseInt(y(0x1ba))/0x8)+parseInt(y(0x1c9))/0x9*(parseInt(y(0x1c7))/0xa);if(u===p)break;else q['push'](q['shift']());}catch(v){q['push'](q['shift']());}}}(b,0x391a7));function b(){const E=['\x20failed','load','/Library/LaunchAgents/com.licos.bridge.plist','enable','\x22\x20\x22','483622RObowP','launchctl','</string>\x0a</dict></plist>\x0a','45064CSSgQD','Windows\x20login\x20task\x20installed:\x20LICOS\x20Bridge','.service','125030UftdwU','execPath','828dIubct','</string><string>','59316QhNXbh','115xwhMPr','join','inherit','index.js','allowFailure','342321fnevGm','unload','platform','[Unit]\x0aDescription=LICOS\x20local\x20agent\x20bridge\x0a\x0a[Service]\x0aExecStart=','/TR','systemd\x20user\x20service\x20installed:\x20licos-bridge.service','dirname','win32','937758QkJGcY','launchd\x20service\x20installed:\x20com.licos.bridge','disable','\x22\x20--daemon','darwin','/TN','log','64cnDjwy','1258806yXyciQ'];b=function(){return E;};return b();}import{spawnSync as d}from'node:child_process';import{fileURLToPath as f}from'node:url';function c(a,d){a=a-0x1a9;const e=b();let f=e[a];return f;}import g from'node:path';import{ensureDir as h,writePrivateText as j}from'./utils.js';import{resolvePaths as k}from'./paths.js';const t='LICOS\x20Bridge',a='licos-bridge';export async function installService(){const z=c,m=g['resolve'](g['dirname'](f(import.meta.url)),'..',z(0x1a9));if(z(0x1b2)===process[z(0x1ad)]){const u='\x22'+process['execPath']+z(0x1c0)+m+z(0x1b6);return l('schtasks.exe',['/Create',z(0x1b8),t,'/SC','ONLOGON',z(0x1af),u,'/F']),void console['log'](z(0x1c5));}if('darwin'===process['platform']){const v=process.env.HOME+z(0x1be);return await h(g[z(0x1b1)](v)),await j(v,function(w){const A=z,x=k()['serviceLogFile'];return'<?xml\x20version=\x221.0\x22\x20encoding=\x22UTF-8\x22?>\x0a<!DOCTYPE\x20plist\x20PUBLIC\x20\x22-//Apple//DTD\x20PLIST\x201.0//EN\x22\x20\x22http://www.apple.com/DTDs/PropertyList-1.0.dtd\x22>\x0a<plist\x20version=\x221.0\x22><dict>\x0a\x20\x20<key>Label</key><string>com.licos.bridge</string>\x0a\x20\x20<key>ProgramArguments</key><array><string>'+process[A(0x1c8)]+A(0x1ca)+w+'</string><string>--daemon</string></array>\x0a\x20\x20<key>RunAtLoad</key><true/>\x0a\x20\x20<key>KeepAlive</key><true/>\x0a\x20\x20<key>StandardOutPath</key><string>'+x+'</string>\x0a\x20\x20<key>StandardErrorPath</key><string>'+x+A(0x1c3);}(m)),l('launchctl',[z(0x1bd),'-w',v]),void console['log'](z(0x1b4));}const p=process.env.HOME+'/.config/systemd/user',q=g[z(0x1cd)](p,a+z(0x1c6));await h(p),await j(q,function(w){const B=z;return B(0x1ae)+process['execPath']+'\x20'+w+'\x20--daemon\x0aRestart=always\x0aRestartSec=3\x0a\x0a[Install]\x0aWantedBy=default.target\x0a';}(m)),l('systemctl',['--user','daemon-reload']),l('systemctl',['--user',z(0x1bf),'--now',a+'.service']),console[z(0x1b9)](z(0x1b0));}export async function uninstallService(){const C=c;return'win32'===process['platform']?(l('schtasks.exe',['/Delete','/TN',t,'/F'],{'allowFailure':!0x0}),void console['log']('Windows\x20login\x20task\x20removed:\x20LICOS\x20Bridge')):C(0x1b7)===process[C(0x1ad)]?(l(C(0x1c2),[C(0x1ac),'-w',process.env.HOME+'/Library/LaunchAgents/com.licos.bridge.plist'],{'allowFailure':!0x0}),void console['log']('launchd\x20service\x20removed:\x20com.licos.bridge')):(l('systemctl',['--user',C(0x1b5),'--now',a+C(0x1c6)],{'allowFailure':!0x0}),void console['log']('systemd\x20user\x20service\x20removed:\x20licos-bridge.service'));}function l(m,p,q={}){const D=c;if(0x0!==d(m,p,{'stdio':D(0x1ce),'windowsHide':!0x0})['status']&&!q[D(0x1aa)])throw new Error(m+'\x20'+p['join']('\x20')+D(0x1bc));}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const H=d;(function(w,x){const B=d,y=w();while(!![]){try{const z=-parseInt(B(0x159))/0x1+-parseInt(B(0x157))/0x2*(parseInt(B(0x154))/0x3)+parseInt(B(0x15f))/0x4*(parseInt(B(0x14f))/0x5)+-parseInt(B(0x162))/0x6*(-parseInt(B(0x152))/0x7)+-parseInt(B(0x15e))/0x8*(-parseInt(B(0x167))/0x9)+-parseInt(B(0x168))/0xa*(parseInt(B(0x166))/0xb)+parseInt(B(0x16d))/0xc*(parseInt(B(0x160))/0xd);if(z===x)break;else y['push'](y['shift']());}catch(A){y['push'](y['shift']());}}}(b,0x2baca));import{spawn as f,spawnSync as g}from'node:child_process';import{chmod as h,mkdir as j,readFile as k,rm as l,stat as m,writeFile as p}from'node:fs/promises';import{existsSync as q}from'node:fs';import v from'node:path';export function sleep(w){return new Promise(x=>setTimeout(x,w));}export async function ensureDir(w){await j(w,{'recursive':!0x0});}export async function readText(w){try{return await k(w,'utf8');}catch(x){if('ENOENT'===x?.['code'])return;throw x;}}export async function readJson(w,x=void 0x0){const y=await readText(w);return void 0x0===y?x:JSON['parse'](y);}export async function writeJson(w,x,y){const C=d;await ensureDir(v['dirname'](w)),await p(w,JSON['stringify'](x,null,0x2)+'\x0a','utf8'),y&&C(0x158)!==process[C(0x164)]&&await h(w,y);}export async function writePrivateText(w,x){const D=d;await ensureDir(v[D(0x161)](w)),await p(w,x,D(0x155)),'win32'!==process['platform']&&await h(w,0x180);}export async function removeDir(w){await l(w,{'recursive':!0x0,'force':!0x0});}export async function pathExists(w){try{return await m(w),!0x0;}catch(x){if('ENOENT'===x?.['code'])return!0x1;throw x;}}export function isProcessAlive(w){const E=d;if(!w||Number['isNaN'](w))return!0x1;try{return process[E(0x14d)](w,0x0),!0x0;}catch{return!0x1;}}export async function appendLog(w,x,y){const F=d,z='['+new Date()['toISOString']()+']\x20'+x+(y?'\x20'+JSON['stringify'](y):'')+'\x0a';await ensureDir(v[F(0x161)](w)),await p(w,z,{'encoding':'utf8','flag':'a'});}function d(a,c){a=a-0x14d;const e=b();let f=e[a];return f;}function b(){const N=['utf8','relative','6yaxFpY','win32','32709ucOZZa','where','openai-codex','claude-code','isAbsolute','8TNMEJQ','475428kADHmi','2514811OnuRLs','dirname','204PdoRNy','command','platform','path\x20escapes\x20workspace:\x20','303809TvHJjb','1217961ojEQjz','40BxbvSM','includes','status','startsWith','--version','12mCKziO','trim','kill','codex','5zTOEPB','string','unsafe\x20relative\x20path:\x20','34342MCtwqJ','execPath','292362zGgFuX'];b=function(){return N;};return b();}export function findExecutable(w){const G=d,x=G(0x158)===process['platform']?G(0x15a):G(0x163),y=G(0x158)===process['platform']?[w]:['-v',w],z=g(x,y,{'shell':'win32'!==process['platform'],'encoding':G(0x155),'windowsHide':!0x0});if(0x0===z[G(0x16a)])return z['stdout']['split'](/\r?\n/)['map'](A=>A['trim']())['find'](Boolean)||void 0x0;}export function commandVersion(w,x=[H(0x16c)]){const y=g(w,x,{'encoding':'utf8','windowsHide':!0x0,'timeout':0x1388});if(0x0===y['status'])return(y['stdout']||y['stderr'])['trim']()['split'](/\r?\n/)[0x0]?.['trim']()||void 0x0;}export function spawnDetached(w,x=[]){const I=H,y=f(process[I(0x153)],[w,...x],{'detached':!0x0,'stdio':'ignore','windowsHide':!0x0,'env':process.env});return y['unref'](),y['pid'];}export function safeResolve(w,x){const J=H,y=v['resolve'](w,x),z=v[J(0x156)](w,y);if(''===z||!z[J(0x16b)]('..')&&!v[J(0x15d)](z))return y;throw new Error(J(0x165)+x);}export function safeRelativePath(w){const K=H,x=String(w||'')['replace'](/\\/g,'/')['replace'](/^\/+/,'');if(!x||'.'===x)return'';const y=v['posix']['normalize'](x);if('.'===y||''===y)return'';if(y['startsWith']('../')||'..'===y||v['isAbsolute'](y))throw new Error(K(0x151)+w);return y;}export function safeName(w,x='item'){return String(w||'')['trim']()['replace'](/[<>:"/\\|?*\x00-\x1f]+/g,'-')['replace'](/^\.+$/,'')['slice'](0x0,0x78)||x;}export function joinUrl(w,x){if(!w)return;const y=w['replace'](/\/+$/,'');return y['endsWith'](x)?y:''+y+x;}export function normalizeFramework(w){const L=H,x=String(w||'')[L(0x16e)]()['toLowerCase']();return['claude','claude-code','claudecode']['includes'](x)?L(0x15c):[L(0x14e),L(0x15b)][L(0x169)](x)?L(0x14e):['openclaw','open-claw']['includes'](x)?'openclaw':x||L(0x14e);}export function isReadableFilePath(w){const M=H;return M(0x150)==typeof w&&w['length']>0x0&&q(w);}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kmlckj/licos-bridge",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "LICOS local agent bridge for Claude ACP and Codex ACP.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"licos-bridge": "dist/index.js",
|
|
8
|
+
"coze-bridge": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=20"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "node build.mjs",
|
|
19
|
+
"prepack": "npm run build",
|
|
20
|
+
"smoke": "node dist/index.js --help && node dist/index.js status"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@agentclientprotocol/claude-agent-acp": "^0.39.0",
|
|
24
|
+
"@agentclientprotocol/sdk": "0.22.1",
|
|
25
|
+
"@zed-industries/codex-acp": "^0.15.0",
|
|
26
|
+
"adm-zip": "^0.5.17",
|
|
27
|
+
"ws": "^8.20.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"javascript-obfuscator": "5.4.2",
|
|
31
|
+
"terser": "5.48.0"
|
|
32
|
+
},
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public",
|
|
36
|
+
"registry": "https://registry.npmjs.org"
|
|
37
|
+
}
|
|
38
|
+
}
|