@hehanlin/open-agent-bridge 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +36 -0
  2. package/dist/adapters/acpAdapter.d.ts +45 -0
  3. package/dist/adapters/acpAdapter.js +171 -0
  4. package/dist/adapters/acpAdapter.js.map +1 -0
  5. package/dist/adapters/adapter.d.ts +50 -0
  6. package/dist/adapters/adapter.js +2 -0
  7. package/dist/adapters/adapter.js.map +1 -0
  8. package/dist/adapters/registry.d.ts +7 -0
  9. package/dist/adapters/registry.js +34 -0
  10. package/dist/adapters/registry.js.map +1 -0
  11. package/dist/agent/agentManager.d.ts +45 -0
  12. package/dist/agent/agentManager.js +110 -0
  13. package/dist/agent/agentManager.js.map +1 -0
  14. package/dist/cli.d.ts +13 -0
  15. package/dist/cli.js +178 -0
  16. package/dist/cli.js.map +1 -0
  17. package/dist/config.d.ts +15 -0
  18. package/dist/config.js +39 -0
  19. package/dist/config.js.map +1 -0
  20. package/dist/detect/acpProbe.d.ts +5 -0
  21. package/dist/detect/acpProbe.js +61 -0
  22. package/dist/detect/acpProbe.js.map +1 -0
  23. package/dist/detect/frameworkDetector.d.ts +30 -0
  24. package/dist/detect/frameworkDetector.js +88 -0
  25. package/dist/detect/frameworkDetector.js.map +1 -0
  26. package/dist/frontier/frontierClient.d.ts +37 -0
  27. package/dist/frontier/frontierClient.js +103 -0
  28. package/dist/frontier/frontierClient.js.map +1 -0
  29. package/dist/frontier/frontierKey.d.ts +19 -0
  30. package/dist/frontier/frontierKey.js +45 -0
  31. package/dist/frontier/frontierKey.js.map +1 -0
  32. package/dist/frontier/health.d.ts +18 -0
  33. package/dist/frontier/health.js +29 -0
  34. package/dist/frontier/health.js.map +1 -0
  35. package/dist/frontier/watchdog.d.ts +23 -0
  36. package/dist/frontier/watchdog.js +47 -0
  37. package/dist/frontier/watchdog.js.map +1 -0
  38. package/dist/fsx/localFs.d.ts +15 -0
  39. package/dist/fsx/localFs.js +29 -0
  40. package/dist/fsx/localFs.js.map +1 -0
  41. package/dist/fsx/safePath.d.ts +1 -0
  42. package/dist/fsx/safePath.js +44 -0
  43. package/dist/fsx/safePath.js.map +1 -0
  44. package/dist/hub/asyncQueue.d.ts +6 -0
  45. package/dist/hub/asyncQueue.js +30 -0
  46. package/dist/hub/asyncQueue.js.map +1 -0
  47. package/dist/hub/hub.d.ts +55 -0
  48. package/dist/hub/hub.js +328 -0
  49. package/dist/hub/hub.js.map +1 -0
  50. package/dist/install/autostart.d.ts +20 -0
  51. package/dist/install/autostart.js +76 -0
  52. package/dist/install/autostart.js.map +1 -0
  53. package/dist/mock/mockRun.d.ts +9 -0
  54. package/dist/mock/mockRun.js +94 -0
  55. package/dist/mock/mockRun.js.map +1 -0
  56. package/dist/store/seq.d.ts +12 -0
  57. package/dist/store/seq.js +55 -0
  58. package/dist/store/seq.js.map +1 -0
  59. package/dist/store/store.d.ts +26 -0
  60. package/dist/store/store.js +88 -0
  61. package/dist/store/store.js.map +1 -0
  62. package/dist/types.d.ts +36 -0
  63. package/dist/types.js +9 -0
  64. package/dist/types.js.map +1 -0
  65. package/package.json +32 -0
package/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # open-agent-bridge
2
+
3
+ 一句话:在飞书界面里管理用户本机的 AI agent —— 用户在飞书消息列表点一个 bot 进入:bot 未绑 agent 则按引导起本机 daemon、选设备与框架新增并绑定 agent,已绑则直接在该 bot 会话里对话。agent 实际运行在用户本机的 claude / codex / openclaw 上。
4
+
5
+ ## 运行
6
+
7
+ ```bash
8
+ npx @hehanlin/open-agent-bridge --token=<device_token>
9
+ ```
10
+
11
+ 可用 `--server=<base>` 覆盖默认服务端地址。token 会以 `0600` 权限保存到 `~/.open-agent-bridge/device_token`。
12
+
13
+ ## 探测
14
+
15
+ ```bash
16
+ npx @hehanlin/open-agent-bridge --detect
17
+ ```
18
+
19
+ 只探测本机可用框架,不联网、不需要 token。
20
+
21
+ ## Mock 运行
22
+
23
+ ```bash
24
+ npx @hehanlin/open-agent-bridge --mock-run
25
+ ```
26
+
27
+ 不连接真实 Frontier、不需要 token;会在本机临时目录创建 mock agent,模拟云端下发 `_agent/create`、`session/new`、`session/prompt`,并以 NDJSON 打印 daemon 上行帧。
28
+
29
+ ## 自启
30
+
31
+ ```bash
32
+ npx @hehanlin/open-agent-bridge --install-autostart --dry-run
33
+ npx @hehanlin/open-agent-bridge --install-autostart
34
+ ```
35
+
36
+ macOS 生成 launchd plist,Linux 生成 systemd user unit;自启文件不会内嵌 token,运行时从本地 Store 读取。
@@ -0,0 +1,45 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { LocalFs } from '../fsx/localFs.js';
3
+ import type { Adapter, AgentRequest, ContentBlock, SessionUpdate, SpawnRecipe } from './adapter.js';
4
+ export declare class AcpAdapter implements Adapter {
5
+ private readonly deps;
6
+ private child?;
7
+ private connection?;
8
+ private readonly updateHandlers;
9
+ private readonly requestHandlers;
10
+ private readonly exitHandlers;
11
+ constructor(deps: {
12
+ recipe: SpawnRecipe;
13
+ localFs: LocalFs;
14
+ spawnImpl?: typeof spawn;
15
+ logSink?: (line: string) => void;
16
+ });
17
+ start(): Promise<void>;
18
+ stop(_reason?: string): Promise<void>;
19
+ initialize(): Promise<void>;
20
+ sessionNew(opts: {
21
+ cwd: string;
22
+ }): Promise<{
23
+ acpSessionId: string;
24
+ }>;
25
+ sessionLoad(opts: {
26
+ sessionId: string;
27
+ cwd: string;
28
+ }): Promise<void>;
29
+ sessionPrompt(opts: {
30
+ sessionId: string;
31
+ prompt: ContentBlock[];
32
+ }): Promise<{
33
+ stopReason: string;
34
+ }>;
35
+ sessionCancel(opts: {
36
+ sessionId: string;
37
+ }): Promise<void>;
38
+ onUpdate(cb: (u: SessionUpdate) => void): void;
39
+ onAgentRequest(cb: (r: AgentRequest) => void): void;
40
+ onExit(cb: (code: number | null) => void): void;
41
+ private createClient;
42
+ private handlePermission;
43
+ private pipeStderr;
44
+ private mustConnection;
45
+ }
@@ -0,0 +1,171 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { Readable, Writable } from 'node:stream';
3
+ import * as acp from '@zed-industries/agent-client-protocol';
4
+ import { OaError } from '../types.js';
5
+ export class AcpAdapter {
6
+ deps;
7
+ child;
8
+ connection;
9
+ updateHandlers = [];
10
+ requestHandlers = [];
11
+ exitHandlers = [];
12
+ constructor(deps) {
13
+ this.deps = deps;
14
+ }
15
+ async start() {
16
+ if (this.child) {
17
+ return;
18
+ }
19
+ const spawnImpl = this.deps.spawnImpl ?? spawn;
20
+ const child = spawnImpl(this.deps.recipe.cmd, this.deps.recipe.args, {
21
+ cwd: this.deps.recipe.cwd,
22
+ env: this.deps.recipe.env ? { ...process.env, ...this.deps.recipe.env } : process.env,
23
+ stdio: 'pipe'
24
+ });
25
+ this.child = child;
26
+ this.pipeStderr(child);
27
+ child.on('exit', (code) => {
28
+ for (const cb of this.exitHandlers) {
29
+ cb(code);
30
+ }
31
+ });
32
+ const input = Writable.toWeb(child.stdin);
33
+ const output = Readable.toWeb(child.stdout);
34
+ const stream = acp.ndJsonStream(input, output);
35
+ const client = this.createClient();
36
+ this.connection = new acp.ClientSideConnection(() => client, stream);
37
+ }
38
+ async stop(_reason) {
39
+ const child = this.child;
40
+ if (!child) {
41
+ return;
42
+ }
43
+ this.child = undefined;
44
+ this.connection = undefined;
45
+ if (child.exitCode !== null || child.killed) {
46
+ return;
47
+ }
48
+ await new Promise((resolve) => {
49
+ const timer = setTimeout(resolve, 1_000);
50
+ timer.unref?.();
51
+ child.once('exit', () => {
52
+ clearTimeout(timer);
53
+ resolve();
54
+ });
55
+ child.kill();
56
+ });
57
+ }
58
+ async initialize() {
59
+ await this.mustConnection().initialize({
60
+ protocolVersion: acp.PROTOCOL_VERSION,
61
+ clientCapabilities: { fs: { readTextFile: true, writeTextFile: true } }
62
+ });
63
+ }
64
+ async sessionNew(opts) {
65
+ const result = await this.mustConnection().newSession({ cwd: opts.cwd, mcpServers: [] });
66
+ return { acpSessionId: result.sessionId };
67
+ }
68
+ async sessionLoad(opts) {
69
+ await this.mustConnection().loadSession({ sessionId: opts.sessionId, cwd: opts.cwd, mcpServers: [] });
70
+ }
71
+ async sessionPrompt(opts) {
72
+ const result = await this.mustConnection().prompt({ sessionId: opts.sessionId, prompt: opts.prompt });
73
+ return { stopReason: result.stopReason };
74
+ }
75
+ async sessionCancel(opts) {
76
+ await this.mustConnection().cancel({ sessionId: opts.sessionId });
77
+ }
78
+ onUpdate(cb) {
79
+ this.updateHandlers.push(cb);
80
+ }
81
+ onAgentRequest(cb) {
82
+ this.requestHandlers.push(cb);
83
+ }
84
+ onExit(cb) {
85
+ this.exitHandlers.push(cb);
86
+ }
87
+ createClient() {
88
+ return {
89
+ sessionUpdate: async (params) => {
90
+ for (const cb of this.updateHandlers) {
91
+ cb(params.update);
92
+ }
93
+ },
94
+ requestPermission: async (params) => this.handlePermission(params),
95
+ readTextFile: async (params) => {
96
+ try {
97
+ return await this.deps.localFs.readTextFile({
98
+ path: params.path,
99
+ line: params.line ?? undefined,
100
+ limit: params.limit ?? undefined
101
+ });
102
+ }
103
+ catch (error) {
104
+ throw toRequestError(error);
105
+ }
106
+ },
107
+ writeTextFile: async (params) => {
108
+ try {
109
+ await this.deps.localFs.writeTextFile({ path: params.path, content: params.content });
110
+ return {};
111
+ }
112
+ catch (error) {
113
+ throw toRequestError(error);
114
+ }
115
+ }
116
+ };
117
+ }
118
+ async handlePermission(params) {
119
+ if (this.requestHandlers.length === 0) {
120
+ return { outcome: { outcome: 'cancelled' } };
121
+ }
122
+ return new Promise((resolve) => {
123
+ let settled = false;
124
+ const respond = (optionId) => {
125
+ if (settled) {
126
+ return;
127
+ }
128
+ settled = true;
129
+ resolve(optionId === null ? { outcome: { outcome: 'cancelled' } } : { outcome: { outcome: 'selected', optionId } });
130
+ };
131
+ const request = {
132
+ kind: 'permission',
133
+ sessionId: params.sessionId,
134
+ toolCall: params.toolCall,
135
+ options: params.options.map((option) => ({ optionId: option.optionId, name: option.name })),
136
+ respond
137
+ };
138
+ for (const cb of this.requestHandlers) {
139
+ cb(request);
140
+ }
141
+ });
142
+ }
143
+ pipeStderr(child) {
144
+ let buffer = '';
145
+ child.stderr.on('data', (chunk) => {
146
+ buffer += String(chunk);
147
+ let newline = buffer.indexOf('\n');
148
+ while (newline >= 0) {
149
+ const line = buffer.slice(0, newline).trimEnd();
150
+ buffer = buffer.slice(newline + 1);
151
+ if (line.length > 0) {
152
+ this.deps.logSink?.(line);
153
+ }
154
+ newline = buffer.indexOf('\n');
155
+ }
156
+ });
157
+ }
158
+ mustConnection() {
159
+ if (!this.connection) {
160
+ throw new Error('AcpAdapter has not been started');
161
+ }
162
+ return this.connection;
163
+ }
164
+ }
165
+ function toRequestError(error) {
166
+ if (error instanceof OaError) {
167
+ return new acp.RequestError(-32000, error.code);
168
+ }
169
+ return error;
170
+ }
171
+ //# sourceMappingURL=acpAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acpAdapter.js","sourceRoot":"","sources":["../../src/adapters/acpAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ export interface ContentBlock {
2
+ type: 'text' | 'image' | 'audio' | 'resource' | 'resource_link';
3
+ [k: string]: unknown;
4
+ }
5
+ export interface SessionUpdate {
6
+ sessionUpdate: string;
7
+ [k: string]: unknown;
8
+ }
9
+ export type AgentRequest = {
10
+ kind: 'permission';
11
+ sessionId: string;
12
+ toolCall: unknown;
13
+ options: {
14
+ optionId: string;
15
+ name: string;
16
+ }[];
17
+ respond: (optionId: string | null) => void;
18
+ };
19
+ export interface Adapter {
20
+ start(): Promise<void>;
21
+ stop(reason?: string): Promise<void>;
22
+ initialize(): Promise<void>;
23
+ sessionNew(opts: {
24
+ cwd: string;
25
+ }): Promise<{
26
+ acpSessionId: string;
27
+ }>;
28
+ sessionLoad(opts: {
29
+ sessionId: string;
30
+ cwd: string;
31
+ }): Promise<void>;
32
+ sessionPrompt(opts: {
33
+ sessionId: string;
34
+ prompt: ContentBlock[];
35
+ }): Promise<{
36
+ stopReason: string;
37
+ }>;
38
+ sessionCancel(opts: {
39
+ sessionId: string;
40
+ }): Promise<void>;
41
+ onUpdate(cb: (u: SessionUpdate) => void): void;
42
+ onAgentRequest(cb: (r: AgentRequest) => void): void;
43
+ onExit(cb: (code: number | null) => void): void;
44
+ }
45
+ export interface SpawnRecipe {
46
+ cmd: string;
47
+ args: string[];
48
+ env?: Record<string, string>;
49
+ cwd: string;
50
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/adapters/adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { Framework } from '../types.js';
2
+ import type { SpawnRecipe } from './adapter.js';
3
+ export declare function recipeFor(framework: Framework, ctx: {
4
+ agentId: string;
5
+ workspace: string;
6
+ }): SpawnRecipe;
7
+ export declare function resolveBin(pkgName: string, binName?: string): string;
@@ -0,0 +1,34 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { dirname, join } from 'node:path';
4
+ const require = createRequire(import.meta.url);
5
+ export function recipeFor(framework, ctx) {
6
+ switch (framework) {
7
+ case 'claude-code':
8
+ return { cmd: process.execPath, args: [resolveBin('@agentclientprotocol/claude-agent-acp')], cwd: ctx.workspace };
9
+ case 'codex':
10
+ return {
11
+ cmd: process.execPath,
12
+ args: [resolveBin('@zed-industries/codex-acp'), '-c', 'sandbox_mode="danger-full-access"', '-c', 'approval_policy="never"'],
13
+ cwd: ctx.workspace
14
+ };
15
+ case 'openclaw':
16
+ return { cmd: 'openclaw', args: ['acp', '--session', `agent:${ctx.agentId}`], cwd: ctx.workspace };
17
+ case 'hermes':
18
+ return { cmd: 'hermes', args: ['acp'], cwd: ctx.workspace };
19
+ }
20
+ }
21
+ export function resolveBin(pkgName, binName) {
22
+ const packageJsonPath = require.resolve(`${pkgName}/package.json`);
23
+ const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
24
+ const binRel = typeof pkg.bin === 'string' ? pkg.bin : pkg.bin?.[binName ?? Object.keys(pkg.bin)[0] ?? ''];
25
+ if (!binRel) {
26
+ throw new Error(`package has no bin: ${pkgName}`);
27
+ }
28
+ const binPath = join(dirname(packageJsonPath), binRel);
29
+ if (!existsSync(binPath)) {
30
+ throw new Error(`package bin not found: ${binPath}`);
31
+ }
32
+ return binPath;
33
+ }
34
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/adapters/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAI1C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,UAAU,SAAS,CAAC,SAAoB,EAAE,GAA2C;IACzF,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,aAAa;YAChB,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,uCAAuC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;QACpH,KAAK,OAAO;YACV,OAAO;gBACL,GAAG,EAAE,OAAO,CAAC,QAAQ;gBACrB,IAAI,EAAE,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE,IAAI,EAAE,mCAAmC,EAAE,IAAI,EAAE,yBAAyB,CAAC;gBAC3H,GAAG,EAAE,GAAG,CAAC,SAAS;aACnB,CAAC;QACJ,KAAK,UAAU;YACb,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;QACrG,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;IAChE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,OAAgB;IAC1D,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,eAAe,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAA8C,CAAC;IAC3G,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3G,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { FrameworkDetector } from '../detect/frameworkDetector.js';
2
+ import { Store, type AgentConfig } from '../store/store.js';
3
+ import type { Framework } from '../types.js';
4
+ export interface AgentRecord {
5
+ config: AgentConfig;
6
+ status: 'online' | 'busy' | 'error';
7
+ reloadAfterTurn?: boolean;
8
+ }
9
+ export declare class AgentManager {
10
+ private readonly deps;
11
+ private readonly records;
12
+ constructor(deps: {
13
+ store: Store;
14
+ detector: FrameworkDetector;
15
+ onDisconnect?: (agentId: string) => Promise<void>;
16
+ });
17
+ handleCreate(p: {
18
+ agentId: string;
19
+ framework: Framework;
20
+ name: string;
21
+ workspace?: string;
22
+ }): Promise<{
23
+ ok: true;
24
+ agentId: string;
25
+ workspace: string;
26
+ }>;
27
+ handleUpdate(p: {
28
+ agentId: string;
29
+ name?: string;
30
+ cozeIdentity?: string;
31
+ }): Promise<{
32
+ ok: true;
33
+ }>;
34
+ handleDisconnect(p: {
35
+ agentId: string;
36
+ reason?: string;
37
+ }): Promise<{
38
+ ok: true;
39
+ }>;
40
+ reviveAll(): Promise<AgentRecord[]>;
41
+ get(agentId: string): AgentRecord | undefined;
42
+ list(): AgentRecord[];
43
+ private assertFrameworkSupported;
44
+ private loadRecord;
45
+ }
@@ -0,0 +1,110 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { OaError } from '../types.js';
4
+ export class AgentManager {
5
+ deps;
6
+ records = new Map();
7
+ constructor(deps) {
8
+ this.deps = deps;
9
+ }
10
+ async handleCreate(p) {
11
+ await this.assertFrameworkSupported(p.framework);
12
+ const existing = await this.deps.store.readAgentConfig(p.agentId);
13
+ const dirs = await this.deps.store.ensureAgentDir(p.agentId);
14
+ const workspace = p.workspace ?? existing?.workspace ?? dirs.workspace;
15
+ await mkdir(workspace, { recursive: true, mode: 0o700 });
16
+ const config = {
17
+ agentId: p.agentId,
18
+ framework: p.framework,
19
+ name: p.name,
20
+ workspace,
21
+ acpSessions: existing?.acpSessions ?? {},
22
+ cozeIdentity: existing?.cozeIdentity
23
+ };
24
+ if (p.framework === 'claude-code') {
25
+ await writeClaudeBypassFiles(workspace);
26
+ }
27
+ await this.deps.store.writeAgentConfig(p.agentId, config);
28
+ this.records.set(p.agentId, { config, status: 'online' });
29
+ return { ok: true, agentId: p.agentId, workspace };
30
+ }
31
+ async handleUpdate(p) {
32
+ const record = await this.loadRecord(p.agentId);
33
+ const config = {
34
+ ...record.config,
35
+ name: p.name ?? record.config.name,
36
+ cozeIdentity: p.cozeIdentity ?? record.config.cozeIdentity
37
+ };
38
+ await this.deps.store.writeAgentConfig(p.agentId, config);
39
+ this.records.set(p.agentId, { ...record, config, reloadAfterTurn: true });
40
+ return { ok: true };
41
+ }
42
+ async handleDisconnect(p) {
43
+ const record = await this.loadRecord(p.agentId);
44
+ const config = { ...record.config, disconnectedAt: Date.now() };
45
+ await this.deps.store.writeAgentConfig(p.agentId, config);
46
+ this.records.set(p.agentId, { ...record, config, status: 'error' });
47
+ await this.deps.onDisconnect?.(p.agentId);
48
+ return { ok: true };
49
+ }
50
+ async reviveAll() {
51
+ const revived = [];
52
+ for (const config of await this.deps.store.listAgents()) {
53
+ if (config.disconnectedAt !== undefined) {
54
+ continue;
55
+ }
56
+ const record = { config, status: 'online' };
57
+ this.records.set(config.agentId, record);
58
+ revived.push(record);
59
+ }
60
+ return revived;
61
+ }
62
+ get(agentId) {
63
+ return this.records.get(agentId);
64
+ }
65
+ list() {
66
+ return [...this.records.values()];
67
+ }
68
+ async assertFrameworkSupported(framework) {
69
+ const frameworks = await this.deps.detector.detect();
70
+ if (!frameworks.some((item) => item.name === framework)) {
71
+ throw new OaError('E_FRAMEWORK_UNSUPPORTED');
72
+ }
73
+ }
74
+ async loadRecord(agentId) {
75
+ const cached = this.records.get(agentId);
76
+ if (cached) {
77
+ return cached;
78
+ }
79
+ const config = await this.deps.store.readAgentConfig(agentId);
80
+ if (!config) {
81
+ throw new OaError('E_AGENT_NOT_FOUND');
82
+ }
83
+ const record = { config, status: config.disconnectedAt === undefined ? 'online' : 'error' };
84
+ this.records.set(agentId, record);
85
+ return record;
86
+ }
87
+ }
88
+ async function writeClaudeBypassFiles(workspace) {
89
+ await mkdir(join(workspace, '.claude'), { recursive: true, mode: 0o700 });
90
+ await writeIfMissing(join(workspace, 'CLAUDE.md'), '# open-agent-bridge\n\nThis workspace is managed by the local open-agent-bridge daemon.\n');
91
+ // Risk note from the daemon plan: claude-code runs in a user-owned local workspace,
92
+ // and bypassPermissions is written only for explicitly created claude-code agents.
93
+ await writeFile(join(workspace, '.claude', 'settings.local.json'), `${JSON.stringify({ permissions: { defaultMode: 'bypassPermissions' } }, null, 2)}\n`, { mode: 0o600 });
94
+ }
95
+ async function writeIfMissing(path, content) {
96
+ try {
97
+ await readFile(path, 'utf8');
98
+ }
99
+ catch (error) {
100
+ if (isNotFound(error)) {
101
+ await writeFile(path, content, { mode: 0o600 });
102
+ return;
103
+ }
104
+ throw error;
105
+ }
106
+ }
107
+ function isNotFound(error) {
108
+ return typeof error === 'object' && error !== null && 'code' in error && error.code === 'ENOENT';
109
+ }
110
+ //# sourceMappingURL=agentManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentManager.js","sourceRoot":"","sources":["../../src/agent/agentManager.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ export interface CliArgs {
3
+ token?: string;
4
+ server?: string;
5
+ detect: boolean;
6
+ installAutostart: boolean;
7
+ mockRun: boolean;
8
+ dryRun: boolean;
9
+ help: boolean;
10
+ version: boolean;
11
+ }
12
+ export declare function parseCliArgs(argv: string[]): CliArgs;
13
+ export declare function main(argv?: string[]): Promise<void>;