@x-otto/service 0.0.1-alpha.0 → 0.0.1-alpha.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 +68 -68
- package/dist/index.d.ts +116 -45
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/package.json +14 -14
package/README.md
CHANGED
|
@@ -1,59 +1,59 @@
|
|
|
1
1
|
# @x-otto/service
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## Module Purpose
|
|
4
4
|
|
|
5
|
-
Otto
|
|
6
|
-
|
|
5
|
+
Otto's network transport layer: Hono-based HTTP API + WebSocket real-time communication + event bridging +
|
|
6
|
+
a standalone persistence storage service (persistenced).
|
|
7
7
|
|
|
8
|
-
##
|
|
8
|
+
## Core Features
|
|
9
9
|
|
|
10
|
-
|
|
|
10
|
+
| Module/Export | Function |
|
|
11
11
|
|-----------|------|
|
|
12
|
-
| `CodingService` | Hono
|
|
13
|
-
| `WebSocketManager` | WebSocket
|
|
14
|
-
| `EventBridge` | AgentSession
|
|
15
|
-
| `TraceBridge` |
|
|
16
|
-
| `DebugBridge` | devtools
|
|
17
|
-
| `InboundRouter` |
|
|
18
|
-
| `EventBus` |
|
|
19
|
-
| `startPersistenced` |
|
|
20
|
-
|
|
21
|
-
## HTTP API
|
|
22
|
-
|
|
23
|
-
|
|
|
12
|
+
| `CodingService` | Hono app lifecycle + component orchestration (WS Manager / DebugBridge / InboundRouter) |
|
|
13
|
+
| `WebSocketManager` | WebSocket connection management + session subscription + auth (origin/token) |
|
|
14
|
+
| `EventBridge` | One-way mapping from AgentSession events to WS `Session.event` |
|
|
15
|
+
| `TraceBridge` | Per-session trace tail → WS (`Trace.event`) |
|
|
16
|
+
| `DebugBridge` | Bridges the devtools debug protocol to HTTP/WebSocket |
|
|
17
|
+
| `InboundRouter` | Dispatches inbound messages from frontend to backend |
|
|
18
|
+
| `EventBus` | In-process event bus (`append / subscribe`) |
|
|
19
|
+
| `startPersistenced` | Standalone persistence storage service launcher (SQLite + HTTP API) |
|
|
20
|
+
|
|
21
|
+
## HTTP API Routes
|
|
22
|
+
|
|
23
|
+
| Route Prefix | Endpoint | Description |
|
|
24
24
|
|----------|------|------|
|
|
25
|
-
| `/api/health` | `GET /` |
|
|
26
|
-
| `/api/chat` | `POST /query` / `GET /messages` / `POST /interrupt` / `DELETE /clear` |
|
|
27
|
-
| `/api/sessions` | `GET/POST /` / `GET /current` / `GET /:id/messages` / `POST /:id/resume` (501) / `GET /:id/trace` / `GET /:id/export` / `GET/PUT/DELETE /:id/model` |
|
|
28
|
-
| `/api/sessions` (
|
|
29
|
-
| `/api/storage` | `GET /:namespace` / `GET/PUT/DELETE /:namespace/:id` | RemotePersistence
|
|
30
|
-
| `/api/setting` | `GET/PUT /` (PUT 501) / `GET /providers` / `GET /models` / `POST /verify-model` / `POST /mode\|autonomy\|thinking` (501) |
|
|
31
|
-
| `/api/devtools` | `GET /status` / `GET /breakpoints` | Devtools
|
|
32
|
-
| `/api/debugger` |
|
|
33
|
-
| `/api/logs` | `GET /history` / `GET /stream` (SSE) |
|
|
34
|
-
| `/api/catalog` |
|
|
25
|
+
| `/api/health` | `GET /` | Health check |
|
|
26
|
+
| `/api/chat` | `POST /query` / `GET /messages` / `POST /interrupt` / `DELETE /clear` | Session conversation |
|
|
27
|
+
| `/api/sessions` | `GET/POST /` / `GET /current` / `GET /:id/messages` / `POST /:id/resume` (501) / `GET /:id/trace` / `GET /:id/export` / `GET/PUT/DELETE /:id/model` | Session CRUD |
|
|
28
|
+
| `/api/sessions` (subdomain) | `POST /verify-path` / `POST /browse-directory` / `GET /files` (workspace) + time-travel endpoints | workspace + timetravel |
|
|
29
|
+
| `/api/storage` | `GET /:namespace` / `GET/PUT/DELETE /:namespace/:id` | RemotePersistence wire protocol server |
|
|
30
|
+
| `/api/setting` | `GET/PUT /` (PUT 501) / `GET /providers` / `GET /models` / `POST /verify-model` / `POST /mode\|autonomy\|thinking` (501) | Settings management |
|
|
31
|
+
| `/api/devtools` | `GET /status` / `GET /breakpoints` | Devtools worker bridge |
|
|
32
|
+
| `/api/debugger` | Breakpoint CRUD / pause / resume / inject / state | Debugger API |
|
|
33
|
+
| `/api/logs` | `GET /history` / `GET /stream` (SSE) | Log query and streaming |
|
|
34
|
+
| `/api/catalog` | Exposes extension/sigil catalog to the frontend | Plugin catalog |
|
|
35
35
|
|
|
36
36
|
## WebSocket
|
|
37
37
|
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
`{ method, params }`
|
|
38
|
+
- Upgrade route: `/ws`
|
|
39
|
+
- Optional origin allowlist + `?token=` bearer auth (fail-closed, timingSafeEqual)
|
|
40
|
+
- After connecting, clients subscribe to a given session's event stream (`Session.subscribe` / `Session.unsubscribe`)
|
|
41
|
+
- Message format: server→client is a discriminated union `{ type, data }`; client→server is
|
|
42
|
+
JSON-RPC-style `{ method, params }`
|
|
43
43
|
|
|
44
|
-
##
|
|
44
|
+
## Installation
|
|
45
45
|
|
|
46
46
|
```bash
|
|
47
47
|
pnpm add @x-otto/service
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
Or build from the repo:
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
53
|
pnpm --filter @x-otto/service build
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
##
|
|
56
|
+
## Quick Start
|
|
57
57
|
|
|
58
58
|
```ts
|
|
59
59
|
import { createApp } from '@x-otto/coding'
|
|
@@ -68,43 +68,43 @@ await service.start()
|
|
|
68
68
|
|
|
69
69
|
## API
|
|
70
70
|
|
|
71
|
-
|
|
|
71
|
+
| Export | Type | Description |
|
|
72
72
|
|------|------|------|
|
|
73
|
-
| `CodingService` | `class` |
|
|
74
|
-
| `createCodingService` | `function` |
|
|
75
|
-
| `WebSocketManager` | `class` | WebSocket
|
|
76
|
-
| `EventBridge` | `class` | AgentSession
|
|
77
|
-
| `DebugBridge` | `class` |
|
|
78
|
-
| `InboundRouter` | `class` |
|
|
79
|
-
| `encodeSessionEvent` | `function` |
|
|
80
|
-
| `createProjectorState` | `function` |
|
|
81
|
-
| `startPersistenced` | `function` |
|
|
82
|
-
| `eventBus` | `instance` |
|
|
83
|
-
| `EventBus` | `class` |
|
|
84
|
-
|
|
85
|
-
##
|
|
73
|
+
| `CodingService` | `class` | Core service class (orchestrates WS Manager / bridges / InboundRouter) |
|
|
74
|
+
| `createCodingService` | `function` | Factory function |
|
|
75
|
+
| `WebSocketManager` | `class` | WebSocket connection management + subscription + broadcast |
|
|
76
|
+
| `EventBridge` | `class` | AgentSession event → WS mapping |
|
|
77
|
+
| `DebugBridge` | `class` | Debug protocol bridge |
|
|
78
|
+
| `InboundRouter` | `class` | Inbound message dispatch |
|
|
79
|
+
| `encodeSessionEvent` | `function` | Session event → Session.event envelope |
|
|
80
|
+
| `createProjectorState` | `function` | Creates a projection accumulator |
|
|
81
|
+
| `startPersistenced` | `function` | Starts the standalone storage service |
|
|
82
|
+
| `eventBus` | `instance` | In-process EventBus singleton |
|
|
83
|
+
| `EventBus` | `class` | Event bus class |
|
|
84
|
+
|
|
85
|
+
## Directory Overview
|
|
86
86
|
|
|
87
87
|
```
|
|
88
88
|
src/
|
|
89
|
-
coding-service.ts #
|
|
90
|
-
create-app.ts # Hono
|
|
91
|
-
websocket-manager.ts # WebSocket
|
|
92
|
-
event-bridge.ts #
|
|
93
|
-
event-bus.ts #
|
|
89
|
+
coding-service.ts # core orchestration
|
|
90
|
+
create-app.ts # Hono app assembly
|
|
91
|
+
websocket-manager.ts # WebSocket connection management
|
|
92
|
+
event-bridge.ts # event bridging
|
|
93
|
+
event-bus.ts # in-process event bus
|
|
94
94
|
trace-bridge.ts # trace tail → WS
|
|
95
|
-
debug-bridge.ts #
|
|
96
|
-
debug-event-router.ts # devtools
|
|
97
|
-
inbound-router.ts #
|
|
98
|
-
session-event-wire.ts #
|
|
99
|
-
message-serializer.ts #
|
|
100
|
-
persistenced-app.ts #
|
|
101
|
-
types.ts #
|
|
102
|
-
routes/ #
|
|
103
|
-
middleware/ #
|
|
95
|
+
debug-bridge.ts # debug bridging
|
|
96
|
+
debug-event-router.ts # devtools events → WS
|
|
97
|
+
inbound-router.ts # inbound message dispatch
|
|
98
|
+
session-event-wire.ts # session events → neutral SessionEvent (sanitized + wrapped)
|
|
99
|
+
message-serializer.ts # message serialization
|
|
100
|
+
persistenced-app.ts # standalone storage service
|
|
101
|
+
types.ts # core types
|
|
102
|
+
routes/ # route implementations (chat/sessions/setting/storage/debugger/devtools/logs/catalog, etc.)
|
|
103
|
+
middleware/ # middleware (request-id / access-log / rate-limit / storage-auth)
|
|
104
104
|
index.ts
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
##
|
|
107
|
+
## Development Commands
|
|
108
108
|
|
|
109
109
|
```bash
|
|
110
110
|
pnpm --filter @x-otto/service build
|
|
@@ -112,8 +112,8 @@ pnpm --filter @x-otto/service typecheck
|
|
|
112
112
|
pnpm --filter @x-otto/service clean
|
|
113
113
|
```
|
|
114
114
|
|
|
115
|
-
##
|
|
115
|
+
## Related Packages
|
|
116
116
|
|
|
117
|
-
`@x-otto/agent
|
|
118
|
-
`@x-otto/hooks
|
|
119
|
-
`@x-otto/workspace
|
|
117
|
+
`@x-otto/agent`, `@x-otto/ai`, `@x-otto/coding`, `@x-otto/schedule`, `@x-otto/devtools`, `@x-otto/otel`,
|
|
118
|
+
`@x-otto/hooks`, `@x-otto/persistence`, `@x-otto/session-contract`, `@x-otto/shared`, `@x-otto/trace-view`,
|
|
119
|
+
`@x-otto/workspace`; external dependencies `hono`, `@hono/node-server`, `ws`
|
package/dist/index.d.ts
CHANGED
|
@@ -330,8 +330,23 @@ declare class WebSocketManager extends TypedEventEmitter<WebSocketManagerEvents>
|
|
|
330
330
|
private readonly maxMessagesPerSecond;
|
|
331
331
|
private readonly maxConnections;
|
|
332
332
|
private clientId;
|
|
333
|
+
/**
|
|
334
|
+
* RFC-354 R1:连接 id → 身份 id(token 派生)映射。
|
|
335
|
+
*
|
|
336
|
+
* **两个概念必须分开**:
|
|
337
|
+
* - 连接 id(`clients` 的键、`sendToClient` 的寻址依据):每连接唯一自增,
|
|
338
|
+
* 否则同一 token 开第二个连接会覆盖第一个的 socket 句柄。
|
|
339
|
+
* - 身份 id(write-lease owner、授权判定依据):从 token 派生,与 HTTP 侧同构,
|
|
340
|
+
* 使同一凭据的 WS/HTTP 属于同一身份(修复 attach 自我拒绝回归)。
|
|
341
|
+
*/
|
|
342
|
+
private readonly clientIdentities;
|
|
333
343
|
/** RFC-335 S4:client 断连触发点——InboundRouter 释放 write-lease。 */
|
|
334
344
|
onClientDisconnected?: (clientId: string) => void;
|
|
345
|
+
/**
|
|
346
|
+
* RFC-354 R1:连接 id → 授权身份 id。未知连接回落到连接 id 本身(fail-safe:
|
|
347
|
+
* 宁可退化成"仅该连接可写",也不要误放行)。
|
|
348
|
+
*/
|
|
349
|
+
identityOf(connectionId: string): string;
|
|
335
350
|
get clientCount(): number;
|
|
336
351
|
constructor(options?: WebSocketManagerOptions);
|
|
337
352
|
handleUpgrade(request: IncomingMessage, socket: Socket, head: Buffer, pathname: string): boolean;
|
|
@@ -345,6 +360,14 @@ declare class WebSocketManager extends TypedEventEmitter<WebSocketManagerEvents>
|
|
|
345
360
|
unsubscribeClient(clientId: string, sessionId: string): void;
|
|
346
361
|
clearSessionSubscriptions(sessionId: string): void;
|
|
347
362
|
sendToClient(clientId: string, message: WebSocketMessage): void;
|
|
363
|
+
/**
|
|
364
|
+
* RFC-354 R1:按**授权身份**投递到其名下全部在线连接。
|
|
365
|
+
*
|
|
366
|
+
* 用于以 lease owner(身份 id)为收件人的定向通知——`sendToClient` 收的是连接 id,
|
|
367
|
+
* 直接把 owner 喂进去会静默投递失败(Map 查不到)。同一身份可能有多条连接
|
|
368
|
+
* (多个 attach 窗口 / web-ui 与 CLI 共用 token),全部通知。
|
|
369
|
+
*/
|
|
370
|
+
sendToIdentity(identity: string, message: WebSocketMessage): void;
|
|
348
371
|
close(): void;
|
|
349
372
|
private onConnection;
|
|
350
373
|
private handleSystemClientMessage;
|
|
@@ -399,6 +422,98 @@ declare class DebugBridge extends TypedEventEmitter<DebugBridgeEvents> {
|
|
|
399
422
|
private normalizeLevel;
|
|
400
423
|
}
|
|
401
424
|
//#endregion
|
|
425
|
+
//#region src/write-lease-manager.d.ts
|
|
426
|
+
/**
|
|
427
|
+
* RFC-335 S4 协议面:写租约管理器(write lease)。
|
|
428
|
+
*
|
|
429
|
+
* 唯一写权语义(同一 session 至多 1 client 持有写权):
|
|
430
|
+
* - acquire(idempotent by same clientId):同 clientId 重复 acquire 视为 no-op;
|
|
431
|
+
* 另一 clientId 申请在 released 前 deny。
|
|
432
|
+
* - release:仅持有者可 release;非持有者 release 视为 no-op(不报错——防下线风暴)。
|
|
433
|
+
* - releaseAllForClient:该 client 断连重置——唯一强清理端点。
|
|
434
|
+
*
|
|
435
|
+
* 实现主调点是 inbound-router:WS 显式 verb 派单 acquire/release,
|
|
436
|
+
* ws.onclose / server-shutdown 走 releaseAllForClient。无 timer、无心跳。
|
|
437
|
+
* 死租约终态:kill -9 / 网络断 → 下一 attach 收到 denied,
|
|
438
|
+
* receive 明确报错(deny reason 含另一 clientId), 下 a client 需
|
|
439
|
+
* explicit `--force` 类 override(后续 PR)或人工冻结老 client。
|
|
440
|
+
* 这是 RFC-335 §S4 第一期在我 5 明文「不扩服务新 timer/state machine」
|
|
441
|
+
* 的最低必要面——deny-early反馈 &后面的 disconnect 释放点。
|
|
442
|
+
*/
|
|
443
|
+
interface WriteLeaseManager {
|
|
444
|
+
/** 申请 sessionId 的唯一写权。返回结果不抛错:denied/acquired 当事儿类型。 */
|
|
445
|
+
acquire(sessionId: string, clientId: string): WriteLeaseAcquireResult;
|
|
446
|
+
/** 释放 sessionId 的写权。仅持有者可 release。返回是否真释放了(幂等)。 */
|
|
447
|
+
release(sessionId: string, clientId: string): boolean;
|
|
448
|
+
/** 清理某个 client 名下的所有写租约(断连清理点)。返回被释放的 sessionId 列表。 */
|
|
449
|
+
releaseAllForClient(clientId: string): string[];
|
|
450
|
+
/** ownerOf:debug/UI 需要现处 leaseOwner。 */
|
|
451
|
+
ownerOf(sessionId: string): string | undefined;
|
|
452
|
+
/** canClientWrite(sessionId, clientId):Chat.query/Chat.* 的前置校验。 */
|
|
453
|
+
canClientWrite(sessionId: string, clientId: string): boolean;
|
|
454
|
+
/**
|
|
455
|
+
* RFC-335 S4 补丁:force_acquire——强抢走 sessionId 的写权(不论原持有者问同)。
|
|
456
|
+
* 用于 kill -9 后原来 client 占着 lease 没释放的人工接管场景。
|
|
457
|
+
* 返回原 owner(若有)及新 owner 状态。
|
|
458
|
+
* **审计语义**:调用方负责把本 action 记为「显式人工 force」——非普通共享;
|
|
459
|
+
* 原 owner 后续才需改为「写权被剥夺」。
|
|
460
|
+
*/
|
|
461
|
+
forceAcquire(sessionId: string, clientId: string): {
|
|
462
|
+
previousOwner: string | undefined;
|
|
463
|
+
newOwner: string;
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
type WriteLeaseAcquireResult = {
|
|
467
|
+
kind: 'acquired';
|
|
468
|
+
} | {
|
|
469
|
+
kind: 'denied'; /** 强 owner clientId——拒绝反馈调用方需呈现 owner */
|
|
470
|
+
leaseOwner: string;
|
|
471
|
+
};
|
|
472
|
+
//#endregion
|
|
473
|
+
//#region src/inbound-router.d.ts
|
|
474
|
+
declare class InboundRouter {
|
|
475
|
+
private readonly ws;
|
|
476
|
+
private readonly app;
|
|
477
|
+
private readonly bridge;
|
|
478
|
+
/**
|
|
479
|
+
* RFC-335 M3:按 cursor 读取待补发事件。以回调注入而非直接依赖 CodingService,
|
|
480
|
+
* 避免 router ↔ service 循环依赖(CodingService 已持有 router)。
|
|
481
|
+
* 未注入时 `since` 参数被忽略,退化为纯实时订阅(旧行为)。
|
|
482
|
+
*/
|
|
483
|
+
private readonly readEventsSince?;
|
|
484
|
+
/** RFC-335 S4 协议面:session 写租约 per-session 单持有者裁决。仅由 dispatch 路径 mutation。 */
|
|
485
|
+
readonly writeLease: WriteLeaseManager;
|
|
486
|
+
constructor(ws: WebSocketManager, app: ServiceHostPort, bridge: DebugBridge | null,
|
|
487
|
+
/**
|
|
488
|
+
* RFC-335 M3:按 cursor 读取待补发事件。以回调注入而非直接依赖 CodingService,
|
|
489
|
+
* 避免 router ↔ service 循环依赖(CodingService 已持有 router)。
|
|
490
|
+
* 未注入时 `since` 参数被忽略,退化为纯实时订阅(旧行为)。
|
|
491
|
+
*/
|
|
492
|
+
|
|
493
|
+
readEventsSince?: ((sessionId: string, after: number) => EventLogRead) | undefined);
|
|
494
|
+
dispatch(clientId: string, message: WebSocketClientMessage): void;
|
|
495
|
+
/**
|
|
496
|
+
* RFC-335 M3:补发 `after` 之后的事件,衔接 snapshot 与实时流。
|
|
497
|
+
*
|
|
498
|
+
* 缺口(cursor 已被环形缓冲逐出)时**必须**显式告知客户端重新水合,绝不静默补发
|
|
499
|
+
* "能补的那部分"——那会让客户端以为序列完整,实则中间缺一段且永远无法察觉。
|
|
500
|
+
*/
|
|
501
|
+
private replaySince;
|
|
502
|
+
private resolveSession;
|
|
503
|
+
/**
|
|
504
|
+
* RFC-222 D2:prompt 被拒绝(如并发 isBusy 守卫)时的错误必须**定向**发给触发本次
|
|
505
|
+
* 请求的客户端(`sendToClient`),不得广播给该 session 的全部订阅者(`sendToSession`)
|
|
506
|
+
* ——多端场景下正在正常执行中的其他客户端不应收到与自己无关的 "prompt failed"。
|
|
507
|
+
*/
|
|
508
|
+
private handleQuery;
|
|
509
|
+
private handleApproval;
|
|
510
|
+
private handleAskUserResponse;
|
|
511
|
+
private handlePlanApprovalResponse;
|
|
512
|
+
private handleDebugCommand;
|
|
513
|
+
private handleDebugSetBreakpoint;
|
|
514
|
+
private handleDebugSetBreakpointsActive;
|
|
515
|
+
}
|
|
516
|
+
//#endregion
|
|
402
517
|
//#region src/coding-service.d.ts
|
|
403
518
|
declare class CodingService {
|
|
404
519
|
readonly app: ServiceHostPort;
|
|
@@ -415,7 +530,7 @@ declare class CodingService {
|
|
|
415
530
|
private readonly eventLog;
|
|
416
531
|
private readonly bridges;
|
|
417
532
|
private readonly traceBridges;
|
|
418
|
-
|
|
533
|
+
readonly router: InboundRouter;
|
|
419
534
|
private started;
|
|
420
535
|
readonly bridge: DebugBridge | null;
|
|
421
536
|
readonly ws: WebSocketManager;
|
|
@@ -491,50 +606,6 @@ declare class EventBridge {
|
|
|
491
606
|
detach(): void;
|
|
492
607
|
}
|
|
493
608
|
//#endregion
|
|
494
|
-
//#region src/inbound-router.d.ts
|
|
495
|
-
declare class InboundRouter {
|
|
496
|
-
private readonly ws;
|
|
497
|
-
private readonly app;
|
|
498
|
-
private readonly bridge;
|
|
499
|
-
/**
|
|
500
|
-
* RFC-335 M3:按 cursor 读取待补发事件。以回调注入而非直接依赖 CodingService,
|
|
501
|
-
* 避免 router ↔ service 循环依赖(CodingService 已持有 router)。
|
|
502
|
-
* 未注入时 `since` 参数被忽略,退化为纯实时订阅(旧行为)。
|
|
503
|
-
*/
|
|
504
|
-
private readonly readEventsSince?;
|
|
505
|
-
/** RFC-335 S4 协议面:session 写租约 per-session 单持有者裁决。仅由 dispatch 路径 mutation。 */
|
|
506
|
-
private readonly writeLease;
|
|
507
|
-
constructor(ws: WebSocketManager, app: ServiceHostPort, bridge: DebugBridge | null,
|
|
508
|
-
/**
|
|
509
|
-
* RFC-335 M3:按 cursor 读取待补发事件。以回调注入而非直接依赖 CodingService,
|
|
510
|
-
* 避免 router ↔ service 循环依赖(CodingService 已持有 router)。
|
|
511
|
-
* 未注入时 `since` 参数被忽略,退化为纯实时订阅(旧行为)。
|
|
512
|
-
*/
|
|
513
|
-
|
|
514
|
-
readEventsSince?: ((sessionId: string, after: number) => EventLogRead) | undefined);
|
|
515
|
-
dispatch(clientId: string, message: WebSocketClientMessage): void;
|
|
516
|
-
/**
|
|
517
|
-
* RFC-335 M3:补发 `after` 之后的事件,衔接 snapshot 与实时流。
|
|
518
|
-
*
|
|
519
|
-
* 缺口(cursor 已被环形缓冲逐出)时**必须**显式告知客户端重新水合,绝不静默补发
|
|
520
|
-
* "能补的那部分"——那会让客户端以为序列完整,实则中间缺一段且永远无法察觉。
|
|
521
|
-
*/
|
|
522
|
-
private replaySince;
|
|
523
|
-
private resolveSession;
|
|
524
|
-
/**
|
|
525
|
-
* RFC-222 D2:prompt 被拒绝(如并发 isBusy 守卫)时的错误必须**定向**发给触发本次
|
|
526
|
-
* 请求的客户端(`sendToClient`),不得广播给该 session 的全部订阅者(`sendToSession`)
|
|
527
|
-
* ——多端场景下正在正常执行中的其他客户端不应收到与自己无关的 "prompt failed"。
|
|
528
|
-
*/
|
|
529
|
-
private handleQuery;
|
|
530
|
-
private handleApproval;
|
|
531
|
-
private handleAskUserResponse;
|
|
532
|
-
private handlePlanApprovalResponse;
|
|
533
|
-
private handleDebugCommand;
|
|
534
|
-
private handleDebugSetBreakpoint;
|
|
535
|
-
private handleDebugSetBreakpointsActive;
|
|
536
|
-
}
|
|
537
|
-
//#endregion
|
|
538
609
|
//#region src/session-event-wire.d.ts
|
|
539
610
|
/** 投影 + 脱敏 + 包装为 WS `Session.event`。projector 为调用方持有的 per-session 累加器。 */
|
|
540
611
|
declare function encodeSessionEvent(event: AgentSessionEvent, projector: ProjectorState): WebSocketMessage[];
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/message-serializer.ts","../src/types.ts","../src/session-event-log.ts","../src/websocket-manager.ts","../src/debug-bridge.ts","../src/
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/message-serializer.ts","../src/types.ts","../src/session-event-log.ts","../src/websocket-manager.ts","../src/debug-bridge.ts","../src/write-lease-manager.ts","../src/inbound-router.ts","../src/coding-service.ts","../src/event-bridge.ts","../src/session-event-wire.ts","../src/persistenced-app.ts","../src/event-bus.ts"],"mappings":"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"}
|