oceanbus 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -6
- package/dist/agent/identity.d.ts +4 -0
- package/dist/agent/identity.d.ts.map +1 -1
- package/dist/agent/identity.js +24 -1
- package/dist/agent/identity.js.map +1 -1
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +34 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/start.d.ts +13 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +358 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +1 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/crypto/e2e.d.ts +23 -0
- package/dist/crypto/e2e.d.ts.map +1 -0
- package/dist/crypto/e2e.js +209 -0
- package/dist/crypto/e2e.js.map +1 -0
- package/dist/crypto/index.d.ts +2 -0
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/crypto/index.js +13 -1
- package/dist/crypto/index.js.map +1 -1
- package/dist/crypto/key-cache.d.ts +15 -0
- package/dist/crypto/key-cache.d.ts.map +1 -0
- package/dist/crypto/key-cache.js +108 -0
- package/dist/crypto/key-cache.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +85 -14
- package/dist/index.js.map +1 -1
- package/dist/mailbox/cursor.d.ts +1 -0
- package/dist/mailbox/cursor.d.ts.map +1 -1
- package/dist/mailbox/cursor.js +3 -0
- package/dist/mailbox/cursor.js.map +1 -1
- package/dist/mailbox/sync.d.ts +1 -1
- package/dist/mailbox/sync.d.ts.map +1 -1
- package/dist/mailbox/sync.js.map +1 -1
- package/dist/types/agent.d.ts +2 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/config.d.ts +1 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/e2e.d.ts +22 -0
- package/dist/types/e2e.d.ts.map +1 -0
- package/dist/types/e2e.js +3 -0
- package/dist/types/e2e.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -47,7 +47,7 @@ You built an AI Agent. It works perfectly on localhost. But how does **another d
|
|
|
47
47
|
|
|
48
48
|
Without OceanBus: buy a domain, configure DNS, provision SSL certificates, set up a load balancer, open firewall ports, write a WebSocket reconnect loop, build authentication middleware.
|
|
49
49
|
|
|
50
|
-
**With OceanBus: `ob.createIdentity()`.** You get a permanent global address. Messages arrive
|
|
50
|
+
**With OceanBus: `ob.createIdentity()`.** You get a permanent global address. Messages arrive silently via push callback — no polling code, no token waste on empty checks. When idle, zero overhead. When a message lands, your Agent wakes up and handles it. WeChat, email, Slack — plug any notification channel.
|
|
51
51
|
|
|
52
52
|
Now say that other Agent wants to buy something from yours. How does your Agent know the buyer isn't a scammer? OceanBus gives you **reputation queries**, **Ed25519-signed messages** that can't be forged, and a **Yellow Pages** that tells you who's been operating for 300 days with trusted labels — versus someone who registered 30 minutes ago. Your Agent makes the decision. OceanBus provides the evidence.
|
|
53
53
|
|
|
@@ -119,7 +119,8 @@ Organized by what you need — not by module structure.
|
|
|
119
119
|
|---------------|----------|---------|
|
|
120
120
|
| **Get a global identity** | `ob.createIdentity()` → `ob.getAddress()` | Permanent UUID + receiving address on the OceanBus network. No domain needed. |
|
|
121
121
|
| **Send messages** | `ob.send(openid, text)` | 128k-char limit. End-to-end encrypted (XChaCha20-Poly1305). |
|
|
122
|
-
| **Receive messages in real-time** | `ob.startListening(callback)` | Messages arrive within seconds.
|
|
122
|
+
| **Receive messages in real-time** | `ob.startListening(callback)` | Messages arrive within seconds. Dev mode — prints to console. |
|
|
123
|
+
| **Deploy a production listener** | `ob.startMonitor(callback, opts)` | Silent polling. No token on idle. Auto-reply. Push to WeChat/email/Slack via `onNotify`. Self-skip to prevent echo. Error backoff. One call replaces 150 lines of infrastructure code. |
|
|
123
124
|
| **Publish yourself** | `ob.publish({ tags, description })` | One line. Appears in Yellow Pages. Auto-heartbeat. |
|
|
124
125
|
| **Find services** | `ob.l1.yellowPages.discover(tags)` | Discover agents by tag. "Which agents do food delivery?" |
|
|
125
126
|
| **Check reputation** | `ob.l1.reputation.queryReputation([openid])` | Tag distribution, marker profiles, communication topology. You decide who to trust. |
|
|
@@ -163,7 +164,7 @@ oceanbus listen | jq '.content' # JSON stream on stdout
|
|
|
163
164
|
|
|
164
165
|
The SDK receives messages within seconds — no manual refresh needed.
|
|
165
166
|
|
|
166
|
-
**
|
|
167
|
+
**Dev mode — `startListening()` (prints to console):**
|
|
167
168
|
```bash
|
|
168
169
|
# Terminal 1: start listening
|
|
169
170
|
oceanbus listen
|
|
@@ -175,18 +176,55 @@ oceanbus send <friend-openid> "Hey! Are you there?"
|
|
|
175
176
|
# [seq:127] 0rGE3HsKmeAPg...: Hey! Are you there?
|
|
176
177
|
```
|
|
177
178
|
|
|
178
|
-
**Code (agent-to-agent):**
|
|
179
179
|
```javascript
|
|
180
180
|
const ob = await createOceanBus();
|
|
181
181
|
await ob.createIdentity();
|
|
182
182
|
|
|
183
|
-
// Messages arrive in real-time — 2s polling, zero config
|
|
184
183
|
ob.startListening((msg) => {
|
|
185
184
|
console.log(`[${msg.from_openid}] ${msg.content}`);
|
|
186
|
-
// Your agent logic here
|
|
187
185
|
});
|
|
188
186
|
```
|
|
189
187
|
|
|
188
|
+
**Production mode — `startMonitor()` (silent, push-ready):**
|
|
189
|
+
|
|
190
|
+
`startMonitor` is the production-grade upgrade to `startListening`. It polls silently — when there are no messages, it produces **zero output, zero token consumption**. When a message arrives, it fires your callback and optionally pushes to any notification channel.
|
|
191
|
+
|
|
192
|
+
```javascript
|
|
193
|
+
const ob = await createOceanBus({
|
|
194
|
+
identity: { agent_id, api_key, openid },
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
// One call. Polling, cursor, self-skip, error backoff — all handled.
|
|
198
|
+
const stop = ob.startMonitor(
|
|
199
|
+
async (msg) => {
|
|
200
|
+
// Your agent logic here — wake up only when there's a message
|
|
201
|
+
await handleIncomingMessage(msg);
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
intervalMs: 3000, // poll interval (default 2s)
|
|
205
|
+
skipSelf: true, // never echo your own messages
|
|
206
|
+
autoReply: '✅ 已收到', // optional: auto-acknowledge every message
|
|
207
|
+
onNotify: async (msg) => { // optional: push to your notification channel
|
|
208
|
+
await sendWeChatPush(msg); // or email, Slack, Discord webhook...
|
|
209
|
+
// During idle: zero API calls, zero tokens, zero noise
|
|
210
|
+
},
|
|
211
|
+
errorBackoff: { threshold: 5, delayMs: 30000 }, // 5 consecutive errors → 30s cooldown
|
|
212
|
+
}
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
// stop() to gracefully shutdown
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
| Capability | `startListening()` | `startMonitor()` |
|
|
219
|
+
|---|---|---|
|
|
220
|
+
| Polling engine | ✅ | ✅ |
|
|
221
|
+
| Self-skip (no echo) | — | ✅ |
|
|
222
|
+
| Notification callback | — | ✅ `onNotify` |
|
|
223
|
+
| Auto-reply | — | ✅ `autoReply` |
|
|
224
|
+
| Error backoff | — | ✅ |
|
|
225
|
+
| Silent when idle | — | ✅ |
|
|
226
|
+
| Use case | Dev / debugging | PM2 / Docker / serverless |
|
|
227
|
+
|
|
190
228
|
### How Real-Time Delivery Works
|
|
191
229
|
|
|
192
230
|
OceanBus uses **HTTP polling** (not WebSocket or SSE). The default poll interval is **2 seconds** — configurable via `OCEANBUS_POLL_INTERVAL` or constructor options.
|
package/dist/agent/identity.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { HttpClient } from '../client/http-client';
|
|
2
2
|
import type { RegistrationData, OpenIDData, AgentState, ApiKeyData } from '../types/agent';
|
|
3
|
+
import type { X25519KeyPair } from '../types/e2e';
|
|
3
4
|
export declare class AgentIdentityManager {
|
|
4
5
|
private http;
|
|
5
6
|
private apiKey;
|
|
@@ -7,12 +8,15 @@ export declare class AgentIdentityManager {
|
|
|
7
8
|
private extraKeys;
|
|
8
9
|
private openidCache;
|
|
9
10
|
private persistedOpenId;
|
|
11
|
+
private encryptionKeyPair;
|
|
10
12
|
constructor(http: HttpClient, apiKey?: string, agentId?: string);
|
|
11
13
|
getApiKey(): string | null;
|
|
12
14
|
getAgentId(): string | null;
|
|
13
15
|
getCachedOpenId(): string | null;
|
|
14
16
|
setPersistedOpenId(openid: string): void;
|
|
15
17
|
getPersistedOpenId(): string | null;
|
|
18
|
+
getEncryptionKeyPair(): X25519KeyPair;
|
|
19
|
+
hasEncryptionKeyPair(): boolean;
|
|
16
20
|
updateCredential(apiKey: string, agentId?: string): void;
|
|
17
21
|
register(): Promise<RegistrationData>;
|
|
18
22
|
newOpenId(): Promise<OpenIDData>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/agent/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/agent/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAI3F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMlD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,WAAW,CAAuB;IAM1C,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,iBAAiB,CAA8B;gBAE3C,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAM/D,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B,eAAe,IAAI,MAAM,GAAG,IAAI;IAOhC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIxC,kBAAkB,IAAI,MAAM,GAAG,IAAI;IAInC,oBAAoB,IAAI,aAAa;IAOrC,oBAAoB,IAAI,OAAO;IAI/B,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAMlD,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA+BrC,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAgBhC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAOlC,+FAA+F;IACzF,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC;IAM7B,gBAAgB,IAAI,OAAO,CAAC,UAAU,CAAC;IAQ7C,WAAW,IAAI,UAAU;IAgBzB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAe/C,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAepC;2EACuE;IACjE,cAAc,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAIjD;0DACsD;IAChD,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC;IAI1C;2EACuE;IACjE,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,OAAO,CAAC,UAAU;CAKnB"}
|
package/dist/agent/identity.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AgentIdentityManager = void 0;
|
|
4
4
|
const errors_1 = require("../client/errors");
|
|
5
5
|
const pow_1 = require("../crypto/pow");
|
|
6
|
+
const e2e_1 = require("../crypto/e2e");
|
|
6
7
|
class AgentIdentityManager {
|
|
7
8
|
http;
|
|
8
9
|
apiKey;
|
|
@@ -14,6 +15,7 @@ class AgentIdentityManager {
|
|
|
14
15
|
// because newOpenId() generates a NEW OpenID each call (anti-tracking nonce).
|
|
15
16
|
// Service agents need a stable address so others can reach them.
|
|
16
17
|
persistedOpenId = null;
|
|
18
|
+
encryptionKeyPair = null;
|
|
17
19
|
constructor(http, apiKey, agentId) {
|
|
18
20
|
this.http = http;
|
|
19
21
|
this.apiKey = apiKey || null;
|
|
@@ -37,6 +39,15 @@ class AgentIdentityManager {
|
|
|
37
39
|
getPersistedOpenId() {
|
|
38
40
|
return this.persistedOpenId;
|
|
39
41
|
}
|
|
42
|
+
getEncryptionKeyPair() {
|
|
43
|
+
if (!this.encryptionKeyPair) {
|
|
44
|
+
this.encryptionKeyPair = (0, e2e_1.generateEncryptionKeypair)();
|
|
45
|
+
}
|
|
46
|
+
return this.encryptionKeyPair;
|
|
47
|
+
}
|
|
48
|
+
hasEncryptionKeyPair() {
|
|
49
|
+
return this.encryptionKeyPair !== null;
|
|
50
|
+
}
|
|
40
51
|
updateCredential(apiKey, agentId) {
|
|
41
52
|
this.apiKey = apiKey;
|
|
42
53
|
if (agentId)
|
|
@@ -109,12 +120,16 @@ class AgentIdentityManager {
|
|
|
109
120
|
if (!this.agentId || !this.apiKey) {
|
|
110
121
|
throw new errors_1.OceanBusError('Agent identity not initialized');
|
|
111
122
|
}
|
|
112
|
-
|
|
123
|
+
const state = {
|
|
113
124
|
agent_id: this.agentId,
|
|
114
125
|
api_key: this.apiKey,
|
|
115
126
|
openid: this.persistedOpenId || this.openidCache || undefined,
|
|
116
127
|
extra_keys: this.extraKeys,
|
|
117
128
|
};
|
|
129
|
+
if (this.encryptionKeyPair) {
|
|
130
|
+
state.encryption_key = (0, e2e_1.serializeKeyPair)(this.encryptionKeyPair);
|
|
131
|
+
}
|
|
132
|
+
return state;
|
|
118
133
|
}
|
|
119
134
|
loadFromPersistedState(state) {
|
|
120
135
|
this.agentId = state.agent_id;
|
|
@@ -122,6 +137,14 @@ class AgentIdentityManager {
|
|
|
122
137
|
this.extraKeys = state.extra_keys || [];
|
|
123
138
|
this.openidCache = state.openid || null;
|
|
124
139
|
this.persistedOpenId = state.openid || null;
|
|
140
|
+
if (state.encryption_key) {
|
|
141
|
+
try {
|
|
142
|
+
this.encryptionKeyPair = (0, e2e_1.deserializeKeyPair)(state.encryption_key);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
this.encryptionKeyPair = null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
125
148
|
}
|
|
126
149
|
trackExtraKey(key) {
|
|
127
150
|
this.extraKeys.push(key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/agent/identity.ts"],"names":[],"mappings":";;;AAEA,6CAAiD;AACjD,uCAAgD;
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/agent/identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,eAAO,MAAM,WAAW,EAAE,aA8BzB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initCommand = void 0;
|
|
4
|
+
const index_1 = require("../../index");
|
|
5
|
+
exports.initCommand = {
|
|
6
|
+
command: 'init',
|
|
7
|
+
describe: 'Initialize OceanBus identity for this machine',
|
|
8
|
+
handler: async () => {
|
|
9
|
+
try {
|
|
10
|
+
const ob = await (0, index_1.createOceanBus)();
|
|
11
|
+
const data = await ob.register();
|
|
12
|
+
const addr = await ob.getAddress();
|
|
13
|
+
console.log('\n' + '═'.repeat(48));
|
|
14
|
+
console.log(' ✅ OceanBus 身份已创建');
|
|
15
|
+
console.log('═'.repeat(48));
|
|
16
|
+
console.log();
|
|
17
|
+
console.log(` OB 地址: ${addr}`);
|
|
18
|
+
console.log();
|
|
19
|
+
console.log(' 下一步:');
|
|
20
|
+
console.log(` 1. 打开 OceanBus Console H5`);
|
|
21
|
+
console.log(` 2. 点击「🔗 绑定新 Agent」`);
|
|
22
|
+
console.log(` 3. 在 Agent 终端运行配对命令`);
|
|
23
|
+
console.log(` 4. 或运行: npx oceanbus start`);
|
|
24
|
+
console.log();
|
|
25
|
+
// Also output machine-readable result for CC parsing
|
|
26
|
+
process.stderr.write(JSON.stringify({ action: 'init-done', openid: addr }) + '\n');
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
console.error('初始化失败:', err.message);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":";;;AACA,uCAA6C;AAEhC,QAAA,WAAW,GAAkB;IACxC,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,+CAA+C;IACzD,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAA,sBAAc,GAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;YAEjC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,UAAU,EAAE,CAAC;YAEnC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,qDAAqD;YACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACrF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* oceanbus start — Auto-detect CC mode, announce window, listen + heartbeat.
|
|
3
|
+
*
|
|
4
|
+
* CC mode (auto-detected via CLAUDE_CODE_SESSION_ID or non-TTY stdout):
|
|
5
|
+
* stdout → Monitor JSON (入站消息)
|
|
6
|
+
* stdin ← CC AI reply JSON (出站消息)
|
|
7
|
+
*
|
|
8
|
+
* Terminal mode:
|
|
9
|
+
* console.log text output
|
|
10
|
+
*/
|
|
11
|
+
import type { CommandModule } from 'yargs';
|
|
12
|
+
export declare const startCommand: CommandModule;
|
|
13
|
+
//# sourceMappingURL=start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AA2D3C,eAAO,MAAM,YAAY,EAAE,aA2P1B,CAAC"}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.startCommand = void 0;
|
|
37
|
+
const index_1 = require("../../index");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const os = __importStar(require("os"));
|
|
41
|
+
// ── Config paths ──────────────────────────────────────────────
|
|
42
|
+
const OCEANBUS_DIR = path.join(os.homedir(), '.oceanbus');
|
|
43
|
+
const CREDS_FILE = path.join(OCEANBUS_DIR, 'credentials.json');
|
|
44
|
+
const CONSOLE_DIR = path.join(os.homedir(), '.oceanbus-console');
|
|
45
|
+
const PEERS_FILE = path.join(CONSOLE_DIR, 'peers.json');
|
|
46
|
+
// ── Helpers ───────────────────────────────────────────────────
|
|
47
|
+
function loadJSON(file) {
|
|
48
|
+
try {
|
|
49
|
+
return fs.existsSync(file) ? JSON.parse(fs.readFileSync(file, 'utf-8')) : null;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// ── CC detection ──────────────────────────────────────────────
|
|
56
|
+
function isCC() {
|
|
57
|
+
if (process.env.CLAUDE_CODE_SESSION_ID)
|
|
58
|
+
return true;
|
|
59
|
+
// stdin piped or redirected → likely running under Monitor
|
|
60
|
+
if (!process.stdin.isTTY)
|
|
61
|
+
return true;
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
// ── Window name ───────────────────────────────────────────────
|
|
65
|
+
function windowName() {
|
|
66
|
+
return process.env.OCEANBUS_WINDOW_NAME
|
|
67
|
+
|| path.basename(process.cwd())
|
|
68
|
+
|| 'unknown';
|
|
69
|
+
}
|
|
70
|
+
// ── Output ────────────────────────────────────────────────────
|
|
71
|
+
const ccMode = isCC();
|
|
72
|
+
function log(msg) { process.stderr.write(`[ob] ${msg}\n`); }
|
|
73
|
+
function emit(event) {
|
|
74
|
+
// CC mode: Monitor JSON to stdout. Terminal mode: pretty print to stderr.
|
|
75
|
+
if (ccMode) {
|
|
76
|
+
process.stdout.write(JSON.stringify(event) + '\n');
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const text = event.text || '';
|
|
80
|
+
const from = event.from || '?';
|
|
81
|
+
const win = event.window || '';
|
|
82
|
+
console.log(`[${win}] ${from}: ${text}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
let cloudBase = 'http://localhost:3000';
|
|
86
|
+
async function resolvePairingCode(code) {
|
|
87
|
+
try {
|
|
88
|
+
const res = await fetch(`${cloudBase}/api/pairing/${code}`);
|
|
89
|
+
if (!res.ok) {
|
|
90
|
+
log(`pairing code invalid: ${res.status}`);
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
const data = await res.json();
|
|
94
|
+
return data.cloud_openid || null;
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
log(`pairing resolve failed: ${e.message}`);
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// ── Main ──────────────────────────────────────────────────────
|
|
102
|
+
exports.startCommand = {
|
|
103
|
+
command: 'start',
|
|
104
|
+
describe: 'Start listening (auto CC mode, window announce, heartbeat)',
|
|
105
|
+
builder: (yargs) => yargs
|
|
106
|
+
.option('peer', { type: 'string', description: 'H5/Cloud OB openid to connect to' })
|
|
107
|
+
.option('code', { type: 'string', description: '6-char pairing code from H5' })
|
|
108
|
+
.option('gateway-url', { type: 'string', description: 'Cloud API base URL', default: 'http://localhost:3000' }),
|
|
109
|
+
handler: async (argv) => {
|
|
110
|
+
cloudBase = argv['gateway-url'] || process.env.OB_CONSOLE_URL || 'http://localhost:3000';
|
|
111
|
+
// 1. Load or create OB identity
|
|
112
|
+
let creds = loadJSON(CREDS_FILE);
|
|
113
|
+
if (!creds?.openid) {
|
|
114
|
+
log('No identity found. Run "oceanbus init" first.');
|
|
115
|
+
log('Attempting auto-init...');
|
|
116
|
+
try {
|
|
117
|
+
const ob = await (0, index_1.createOceanBus)();
|
|
118
|
+
const reg = await ob.register();
|
|
119
|
+
const openid = await ob.getAddress();
|
|
120
|
+
creds = { agent_id: reg.agent_id, api_key: reg.api_key, openid };
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
log(`Auto-init failed: ${e.message}`);
|
|
124
|
+
process.exit(1);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// 2. Resolve peer
|
|
128
|
+
let peers = loadJSON(PEERS_FILE) || {};
|
|
129
|
+
let peerOpenId = argv.peer || '';
|
|
130
|
+
if (argv.code) {
|
|
131
|
+
const resolved = await resolvePairingCode(argv.code);
|
|
132
|
+
if (resolved) {
|
|
133
|
+
peerOpenId = resolved;
|
|
134
|
+
log(`pairing code resolved → ${peerOpenId.slice(0, 8)}...`);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
log('Failed to resolve pairing code. Continuing without peer.');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (!peerOpenId && Object.keys(peers).length > 0) {
|
|
141
|
+
// Use first known peer
|
|
142
|
+
peerOpenId = Object.values(peers)[0].openid;
|
|
143
|
+
log(`using known peer: ${peerOpenId.slice(0, 8)}...`);
|
|
144
|
+
}
|
|
145
|
+
if (peerOpenId && !peers[peerOpenId]) {
|
|
146
|
+
peers[peerOpenId] = { openid: peerOpenId, boundAt: new Date().toISOString() };
|
|
147
|
+
fs.mkdirSync(path.dirname(PEERS_FILE), { recursive: true });
|
|
148
|
+
fs.writeFileSync(PEERS_FILE, JSON.stringify(peers, null, 2));
|
|
149
|
+
}
|
|
150
|
+
// 3. Create OB — use same pattern as Cloud (memory store + explicit identity)
|
|
151
|
+
const ob = await (0, index_1.createOceanBus)({
|
|
152
|
+
keyStore: { type: 'memory' },
|
|
153
|
+
identity: { agent_id: creds.agent_id, api_key: creds.api_key, openid: creds.openid },
|
|
154
|
+
});
|
|
155
|
+
const myAddr = await ob.getAddress();
|
|
156
|
+
const win = windowName();
|
|
157
|
+
log(`ob: ${myAddr.slice(0, 8)}... window: ${win} mode: ${ccMode ? 'CC' : 'terminal'}`);
|
|
158
|
+
if (peerOpenId)
|
|
159
|
+
log(`peer: ${peerOpenId.slice(0, 8)}...`);
|
|
160
|
+
// 4. Announce window-open (HTTP primary, OB fallback)
|
|
161
|
+
const announceBody = JSON.stringify({
|
|
162
|
+
action: 'window-open',
|
|
163
|
+
window: win,
|
|
164
|
+
cwd: process.cwd(),
|
|
165
|
+
agent_name: win,
|
|
166
|
+
agent_openid: myAddr,
|
|
167
|
+
agent_type: 'cc-window',
|
|
168
|
+
});
|
|
169
|
+
if (peerOpenId) {
|
|
170
|
+
// Try HTTP first (reliable, immediate)
|
|
171
|
+
let announced = false;
|
|
172
|
+
try {
|
|
173
|
+
const res = await fetch(`${cloudBase}/api/agent/announce`, {
|
|
174
|
+
method: 'POST',
|
|
175
|
+
headers: { 'Content-Type': 'application/json' },
|
|
176
|
+
body: announceBody,
|
|
177
|
+
});
|
|
178
|
+
if (res.ok) {
|
|
179
|
+
announced = true;
|
|
180
|
+
log(`window-open (HTTP) → Cloud`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch { /* fallback to OB */ }
|
|
184
|
+
// OB fallback
|
|
185
|
+
if (!announced) {
|
|
186
|
+
try {
|
|
187
|
+
await ob.send(peerOpenId, announceBody);
|
|
188
|
+
log(`window-open (OB) → peer`);
|
|
189
|
+
}
|
|
190
|
+
catch (e) {
|
|
191
|
+
log(`window-open failed: ${e.message}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// 5. Heartbeat (HTTP primary)
|
|
196
|
+
const heartbeat = peerOpenId ? setInterval(() => {
|
|
197
|
+
const beat = JSON.stringify({ action: 'heartbeat', window: win });
|
|
198
|
+
fetch(`${cloudBase}/api/agent/announce`, {
|
|
199
|
+
method: 'POST',
|
|
200
|
+
headers: { 'Content-Type': 'application/json' },
|
|
201
|
+
body: beat,
|
|
202
|
+
}).catch(() => {
|
|
203
|
+
// HTTP failed, try OB
|
|
204
|
+
ob.send(peerOpenId, beat).catch(() => { });
|
|
205
|
+
});
|
|
206
|
+
}, 15_000) : null;
|
|
207
|
+
// 6. Message dedup
|
|
208
|
+
const seen = new Map();
|
|
209
|
+
// 7. HTTP polling receiver (primary — OB listener may have issues)
|
|
210
|
+
const pollInterval = peerOpenId ? setInterval(async () => {
|
|
211
|
+
try {
|
|
212
|
+
const res = await fetch(`${cloudBase}/api/poll?window=${encodeURIComponent(win)}`);
|
|
213
|
+
const data = await res.json();
|
|
214
|
+
for (const msg of data.messages || []) {
|
|
215
|
+
const text = msg.text || '';
|
|
216
|
+
const dedupKey = `http:${text.slice(0, 50)}`;
|
|
217
|
+
if (seen.has(dedupKey))
|
|
218
|
+
continue;
|
|
219
|
+
seen.set(dedupKey, Date.now());
|
|
220
|
+
emit({
|
|
221
|
+
type: 'wechat_msg',
|
|
222
|
+
chat_id: 'h5',
|
|
223
|
+
sender: 'h5',
|
|
224
|
+
text,
|
|
225
|
+
window: msg.window || win,
|
|
226
|
+
time: msg.time || new Date().toLocaleTimeString('zh-CN', { hour12: false }),
|
|
227
|
+
reply_style: 'detailed',
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch { /* Cloud not reachable */ }
|
|
232
|
+
}, 2000) : null;
|
|
233
|
+
// 8. OB listener (fallback receive path — shares seen dedup)
|
|
234
|
+
ob.startListening(async (msg) => {
|
|
235
|
+
if (msg.from_openid === myAddr)
|
|
236
|
+
return;
|
|
237
|
+
let parsed;
|
|
238
|
+
try {
|
|
239
|
+
parsed = JSON.parse(msg.content || '{}');
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
parsed = { text: msg.content || '' };
|
|
243
|
+
}
|
|
244
|
+
const action = parsed.action || parsed.type || 'message';
|
|
245
|
+
const text = parsed.text || '';
|
|
246
|
+
const msgWindow = parsed.window || '';
|
|
247
|
+
// Dedup
|
|
248
|
+
const now = Date.now();
|
|
249
|
+
for (const [k, t] of seen) {
|
|
250
|
+
if (now - t > 5000)
|
|
251
|
+
seen.delete(k);
|
|
252
|
+
}
|
|
253
|
+
const dedupKey = `${msg.from_openid}:${text.slice(0, 50)}`;
|
|
254
|
+
if (seen.has(dedupKey))
|
|
255
|
+
return;
|
|
256
|
+
seen.set(dedupKey, now);
|
|
257
|
+
// Filter: only for us (if window specified, must match)
|
|
258
|
+
if (msgWindow && msgWindow !== win)
|
|
259
|
+
return;
|
|
260
|
+
const time = new Date(msg.created_at || now).toLocaleTimeString('zh-CN', { hour12: false });
|
|
261
|
+
switch (action) {
|
|
262
|
+
case 'bound':
|
|
263
|
+
log(`bound confirmed: ${parsed.agent || parsed.peer_name || '?'}`);
|
|
264
|
+
break;
|
|
265
|
+
case 'message':
|
|
266
|
+
case 'reply':
|
|
267
|
+
case 'command':
|
|
268
|
+
emit({
|
|
269
|
+
type: 'wechat_msg', // Compatible with legacy CC Monitor protocol
|
|
270
|
+
chat_id: parsed.from === 'h5' ? 'h5' : (msg.from_openid || '').slice(0, 10),
|
|
271
|
+
sender: parsed.from || 'agent',
|
|
272
|
+
text,
|
|
273
|
+
window: msgWindow || win,
|
|
274
|
+
time,
|
|
275
|
+
reply_style: 'detailed',
|
|
276
|
+
});
|
|
277
|
+
break;
|
|
278
|
+
default:
|
|
279
|
+
// Unknown action — still emit if has text
|
|
280
|
+
if (text) {
|
|
281
|
+
emit({
|
|
282
|
+
type: 'wechat_msg',
|
|
283
|
+
chat_id: (msg.from_openid || '').slice(0, 10),
|
|
284
|
+
sender: 'agent',
|
|
285
|
+
text,
|
|
286
|
+
window: win,
|
|
287
|
+
time,
|
|
288
|
+
reply_style: 'detailed',
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
// 8. Stdin listener (CC AI replies → OB)
|
|
294
|
+
if (ccMode && peerOpenId) {
|
|
295
|
+
let stdinBuf = '';
|
|
296
|
+
process.stdin.setEncoding('utf-8');
|
|
297
|
+
process.stdin.on('data', (chunk) => {
|
|
298
|
+
stdinBuf += chunk;
|
|
299
|
+
const lines = stdinBuf.split('\n');
|
|
300
|
+
stdinBuf = lines.pop() || '';
|
|
301
|
+
for (const line of lines) {
|
|
302
|
+
if (!line.trim())
|
|
303
|
+
continue;
|
|
304
|
+
try {
|
|
305
|
+
const req = JSON.parse(line);
|
|
306
|
+
if (req.type === 'reply' && req.text) {
|
|
307
|
+
ob.send(peerOpenId, JSON.stringify({
|
|
308
|
+
action: 'reply',
|
|
309
|
+
window: req.window || win,
|
|
310
|
+
text: req.text,
|
|
311
|
+
from: 'agent',
|
|
312
|
+
time: new Date().toLocaleTimeString('zh-CN', { hour12: false }),
|
|
313
|
+
})).catch(() => { });
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
catch { /* ignore malformed JSON */ }
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
process.stdin.resume();
|
|
320
|
+
}
|
|
321
|
+
// 9. Ready
|
|
322
|
+
log('ready — waiting for messages...');
|
|
323
|
+
if (ccMode)
|
|
324
|
+
emit({ type: 'ready', window: win });
|
|
325
|
+
// 10. Graceful shutdown
|
|
326
|
+
let shuttingDown = false;
|
|
327
|
+
async function shutdown() {
|
|
328
|
+
if (shuttingDown)
|
|
329
|
+
return;
|
|
330
|
+
shuttingDown = true;
|
|
331
|
+
log('shutting down...');
|
|
332
|
+
if (heartbeat)
|
|
333
|
+
clearInterval(heartbeat);
|
|
334
|
+
if (peerOpenId) {
|
|
335
|
+
try {
|
|
336
|
+
await fetch(`${cloudBase}/api/agent/announce`, {
|
|
337
|
+
method: 'POST',
|
|
338
|
+
headers: { 'Content-Type': 'application/json' },
|
|
339
|
+
body: JSON.stringify({ action: 'window-close', window: win }),
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
try {
|
|
344
|
+
await ob.send(peerOpenId, JSON.stringify({ action: 'window-close', window: win }));
|
|
345
|
+
}
|
|
346
|
+
catch { /* best effort */ }
|
|
347
|
+
}
|
|
348
|
+
await new Promise(r => setTimeout(r, 200));
|
|
349
|
+
}
|
|
350
|
+
process.exit(0);
|
|
351
|
+
}
|
|
352
|
+
process.on('SIGINT', shutdown);
|
|
353
|
+
process.on('SIGTERM', shutdown);
|
|
354
|
+
// Keep alive
|
|
355
|
+
await new Promise(() => { });
|
|
356
|
+
},
|
|
357
|
+
};
|
|
358
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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"}
|