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.
Files changed (55) hide show
  1. package/README.md +44 -6
  2. package/dist/agent/identity.d.ts +4 -0
  3. package/dist/agent/identity.d.ts.map +1 -1
  4. package/dist/agent/identity.js +24 -1
  5. package/dist/agent/identity.js.map +1 -1
  6. package/dist/cli/commands/init.d.ts +3 -0
  7. package/dist/cli/commands/init.d.ts.map +1 -0
  8. package/dist/cli/commands/init.js +34 -0
  9. package/dist/cli/commands/init.js.map +1 -0
  10. package/dist/cli/commands/start.d.ts +13 -0
  11. package/dist/cli/commands/start.d.ts.map +1 -0
  12. package/dist/cli/commands/start.js +358 -0
  13. package/dist/cli/commands/start.js.map +1 -0
  14. package/dist/cli/index.d.ts.map +1 -1
  15. package/dist/cli/index.js +4 -0
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/config/defaults.d.ts.map +1 -1
  18. package/dist/config/defaults.js +1 -0
  19. package/dist/config/defaults.js.map +1 -1
  20. package/dist/crypto/e2e.d.ts +23 -0
  21. package/dist/crypto/e2e.d.ts.map +1 -0
  22. package/dist/crypto/e2e.js +209 -0
  23. package/dist/crypto/e2e.js.map +1 -0
  24. package/dist/crypto/index.d.ts +2 -0
  25. package/dist/crypto/index.d.ts.map +1 -1
  26. package/dist/crypto/index.js +13 -1
  27. package/dist/crypto/index.js.map +1 -1
  28. package/dist/crypto/key-cache.d.ts +15 -0
  29. package/dist/crypto/key-cache.d.ts.map +1 -0
  30. package/dist/crypto/key-cache.js +108 -0
  31. package/dist/crypto/key-cache.js.map +1 -0
  32. package/dist/index.d.ts +7 -0
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +85 -14
  35. package/dist/index.js.map +1 -1
  36. package/dist/mailbox/cursor.d.ts +1 -0
  37. package/dist/mailbox/cursor.d.ts.map +1 -1
  38. package/dist/mailbox/cursor.js +3 -0
  39. package/dist/mailbox/cursor.js.map +1 -1
  40. package/dist/mailbox/sync.d.ts +1 -1
  41. package/dist/mailbox/sync.d.ts.map +1 -1
  42. package/dist/mailbox/sync.js.map +1 -1
  43. package/dist/types/agent.d.ts +2 -0
  44. package/dist/types/agent.d.ts.map +1 -1
  45. package/dist/types/config.d.ts +1 -0
  46. package/dist/types/config.d.ts.map +1 -1
  47. package/dist/types/e2e.d.ts +22 -0
  48. package/dist/types/e2e.d.ts.map +1 -0
  49. package/dist/types/e2e.js +3 -0
  50. package/dist/types/e2e.js.map +1 -0
  51. package/dist/types/index.d.ts +1 -0
  52. package/dist/types/index.d.ts.map +1 -1
  53. package/dist/types/index.js +1 -0
  54. package/dist/types/index.js.map +1 -1
  55. 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 in a callback. The network handles the rest end-to-end encrypted, no server required.
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. No refresh needed. |
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
- **Terminal (human-to-human):**
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.
@@ -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;AAQ3F,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;gBAElC,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,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;IAYzB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQ/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"}
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"}
@@ -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
- return {
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":"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"}
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/agent/identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CommandModule } from 'yargs';
2
+ export declare const initCommand: CommandModule;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -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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"}