berry-agent-sdk 0.1.0-alpha.2
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 +78 -0
- package/dist/packages/berry-agent-sdk/src/client.d.ts +6 -0
- package/dist/packages/berry-agent-sdk/src/client.js +59 -0
- package/dist/packages/berry-agent-sdk/src/client.js.map +1 -0
- package/dist/packages/berry-agent-sdk/src/http.d.ts +24 -0
- package/dist/packages/berry-agent-sdk/src/http.js +232 -0
- package/dist/packages/berry-agent-sdk/src/http.js.map +1 -0
- package/dist/packages/berry-agent-sdk/src/index.d.ts +25 -0
- package/dist/packages/berry-agent-sdk/src/index.js +22 -0
- package/dist/packages/berry-agent-sdk/src/index.js.map +1 -0
- package/dist/packages/berry-agent-sdk/src/stdio.d.ts +23 -0
- package/dist/packages/berry-agent-sdk/src/stdio.js +238 -0
- package/dist/packages/berry-agent-sdk/src/stdio.js.map +1 -0
- package/dist/packages/berry-agent-sdk/src/types.d.ts +117 -0
- package/dist/packages/berry-agent-sdk/src/types.js +19 -0
- package/dist/packages/berry-agent-sdk/src/types.js.map +1 -0
- package/dist/src/agent/events.d.ts +11 -0
- package/dist/src/agent/events.js +2 -0
- package/dist/src/agent/events.js.map +1 -0
- package/dist/src/agent/index.d.ts +13 -0
- package/dist/src/agent/index.js +3 -0
- package/dist/src/agent/index.js.map +1 -0
- package/dist/src/agent/loop.d.ts +19 -0
- package/dist/src/agent/loop.js +140 -0
- package/dist/src/agent/loop.js.map +1 -0
- package/dist/src/agent/queue.d.ts +105 -0
- package/dist/src/agent/queue.js +120 -0
- package/dist/src/agent/queue.js.map +1 -0
- package/dist/src/agent/stream.d.ts +21 -0
- package/dist/src/agent/stream.js +80 -0
- package/dist/src/agent/stream.js.map +1 -0
- package/dist/src/agent/tools-batch.d.ts +49 -0
- package/dist/src/agent/tools-batch.js +222 -0
- package/dist/src/agent/tools-batch.js.map +1 -0
- package/dist/src/agent/types.d.ts +104 -0
- package/dist/src/agent/types.js +9 -0
- package/dist/src/agent/types.js.map +1 -0
- package/dist/src/channels/ask-queue.d.ts +44 -0
- package/dist/src/channels/ask-queue.js +83 -0
- package/dist/src/channels/ask-queue.js.map +1 -0
- package/dist/src/channels/commands.d.ts +56 -0
- package/dist/src/channels/commands.js +130 -0
- package/dist/src/channels/commands.js.map +1 -0
- package/dist/src/channels/engine/cell.d.ts +55 -0
- package/dist/src/channels/engine/cell.js +144 -0
- package/dist/src/channels/engine/cell.js.map +1 -0
- package/dist/src/channels/engine/diff.d.ts +3 -0
- package/dist/src/channels/engine/diff.js +144 -0
- package/dist/src/channels/engine/diff.js.map +1 -0
- package/dist/src/channels/engine/engine.d.ts +151 -0
- package/dist/src/channels/engine/engine.js +417 -0
- package/dist/src/channels/engine/engine.js.map +1 -0
- package/dist/src/channels/engine/index.d.ts +22 -0
- package/dist/src/channels/engine/index.js +9 -0
- package/dist/src/channels/engine/index.js.map +1 -0
- package/dist/src/channels/engine/input-keys.d.ts +39 -0
- package/dist/src/channels/engine/input-keys.js +87 -0
- package/dist/src/channels/engine/input-keys.js.map +1 -0
- package/dist/src/channels/engine/input.d.ts +174 -0
- package/dist/src/channels/engine/input.js +597 -0
- package/dist/src/channels/engine/input.js.map +1 -0
- package/dist/src/channels/engine/memory-io.d.ts +46 -0
- package/dist/src/channels/engine/memory-io.js +72 -0
- package/dist/src/channels/engine/memory-io.js.map +1 -0
- package/dist/src/channels/engine/process-io.d.ts +23 -0
- package/dist/src/channels/engine/process-io.js +39 -0
- package/dist/src/channels/engine/process-io.js.map +1 -0
- package/dist/src/channels/engine/types.d.ts +202 -0
- package/dist/src/channels/engine/types.js +18 -0
- package/dist/src/channels/engine/types.js.map +1 -0
- package/dist/src/channels/engine/width.d.ts +23 -0
- package/dist/src/channels/engine/width.js +123 -0
- package/dist/src/channels/engine/width.js.map +1 -0
- package/dist/src/channels/index.d.ts +25 -0
- package/dist/src/channels/index.js +16 -0
- package/dist/src/channels/index.js.map +1 -0
- package/dist/src/channels/registry.d.ts +33 -0
- package/dist/src/channels/registry.js +57 -0
- package/dist/src/channels/registry.js.map +1 -0
- package/dist/src/channels/sdk/admit.d.ts +32 -0
- package/dist/src/channels/sdk/admit.js +30 -0
- package/dist/src/channels/sdk/admit.js.map +1 -0
- package/dist/src/channels/sdk/backend.d.ts +19 -0
- package/dist/src/channels/sdk/backend.js +103 -0
- package/dist/src/channels/sdk/backend.js.map +1 -0
- package/dist/src/channels/sdk/cursor.d.ts +51 -0
- package/dist/src/channels/sdk/cursor.js +57 -0
- package/dist/src/channels/sdk/cursor.js.map +1 -0
- package/dist/src/channels/sdk/index.d.ts +20 -0
- package/dist/src/channels/sdk/index.js +21 -0
- package/dist/src/channels/sdk/index.js.map +1 -0
- package/dist/src/channels/sdk/jsonl.d.ts +47 -0
- package/dist/src/channels/sdk/jsonl.js +201 -0
- package/dist/src/channels/sdk/jsonl.js.map +1 -0
- package/dist/src/channels/sdk/protocol.d.ts +297 -0
- package/dist/src/channels/sdk/protocol.js +25 -0
- package/dist/src/channels/sdk/protocol.js.map +1 -0
- package/dist/src/channels/sdk/schema.d.ts +12 -0
- package/dist/src/channels/sdk/schema.js +92 -0
- package/dist/src/channels/sdk/schema.js.map +1 -0
- package/dist/src/channels/sdk/wire-core.d.ts +199 -0
- package/dist/src/channels/sdk/wire-core.js +447 -0
- package/dist/src/channels/sdk/wire-core.js.map +1 -0
- package/dist/src/channels/service.d.ts +66 -0
- package/dist/src/channels/service.js +170 -0
- package/dist/src/channels/service.js.map +1 -0
- package/dist/src/channels/tui/autocomplete/autocomplete.d.ts +32 -0
- package/dist/src/channels/tui/autocomplete/autocomplete.js +43 -0
- package/dist/src/channels/tui/autocomplete/autocomplete.js.map +1 -0
- package/dist/src/channels/tui/autocomplete/file-mentions.d.ts +18 -0
- package/dist/src/channels/tui/autocomplete/file-mentions.js +107 -0
- package/dist/src/channels/tui/autocomplete/file-mentions.js.map +1 -0
- package/dist/src/channels/tui/autocomplete/popup.d.ts +47 -0
- package/dist/src/channels/tui/autocomplete/popup.js +149 -0
- package/dist/src/channels/tui/autocomplete/popup.js.map +1 -0
- package/dist/src/channels/tui/autocomplete/provider.d.ts +38 -0
- package/dist/src/channels/tui/autocomplete/provider.js +8 -0
- package/dist/src/channels/tui/autocomplete/provider.js.map +1 -0
- package/dist/src/channels/tui/autocomplete/token.d.ts +22 -0
- package/dist/src/channels/tui/autocomplete/token.js +69 -0
- package/dist/src/channels/tui/autocomplete/token.js.map +1 -0
- package/dist/src/channels/tui/backend/ansi-rows.d.ts +86 -0
- package/dist/src/channels/tui/backend/ansi-rows.js +209 -0
- package/dist/src/channels/tui/backend/ansi-rows.js.map +1 -0
- package/dist/src/channels/tui/backend/main-screen.d.ts +90 -0
- package/dist/src/channels/tui/backend/main-screen.js +208 -0
- package/dist/src/channels/tui/backend/main-screen.js.map +1 -0
- package/dist/src/channels/tui/backend/osc.d.ts +79 -0
- package/dist/src/channels/tui/backend/osc.js +92 -0
- package/dist/src/channels/tui/backend/osc.js.map +1 -0
- package/dist/src/channels/tui/backend/transcript.d.ts +98 -0
- package/dist/src/channels/tui/backend/transcript.js +231 -0
- package/dist/src/channels/tui/backend/transcript.js.map +1 -0
- package/dist/src/channels/tui/backend/tui-backend.d.ts +324 -0
- package/dist/src/channels/tui/backend/tui-backend.js +916 -0
- package/dist/src/channels/tui/backend/tui-backend.js.map +1 -0
- package/dist/src/channels/tui/editor/editor-model.d.ts +141 -0
- package/dist/src/channels/tui/editor/editor-model.js +544 -0
- package/dist/src/channels/tui/editor/editor-model.js.map +1 -0
- package/dist/src/channels/tui/editor/editor-view.d.ts +36 -0
- package/dist/src/channels/tui/editor/editor-view.js +141 -0
- package/dist/src/channels/tui/editor/editor-view.js.map +1 -0
- package/dist/src/channels/tui/editor/editor.d.ts +50 -0
- package/dist/src/channels/tui/editor/editor.js +276 -0
- package/dist/src/channels/tui/editor/editor.js.map +1 -0
- package/dist/src/channels/tui/editor/undo-stack.d.ts +22 -0
- package/dist/src/channels/tui/editor/undo-stack.js +36 -0
- package/dist/src/channels/tui/editor/undo-stack.js.map +1 -0
- package/dist/src/channels/tui/editor/visual-lines.d.ts +39 -0
- package/dist/src/channels/tui/editor/visual-lines.js +127 -0
- package/dist/src/channels/tui/editor/visual-lines.js.map +1 -0
- package/dist/src/channels/tui/editor/word-nav.d.ts +10 -0
- package/dist/src/channels/tui/editor/word-nav.js +107 -0
- package/dist/src/channels/tui/editor/word-nav.js.map +1 -0
- package/dist/src/channels/tui/history/history-viewer.d.ts +133 -0
- package/dist/src/channels/tui/history/history-viewer.js +404 -0
- package/dist/src/channels/tui/history/history-viewer.js.map +1 -0
- package/dist/src/channels/tui/index.d.ts +16 -0
- package/dist/src/channels/tui/index.js +4 -0
- package/dist/src/channels/tui/index.js.map +1 -0
- package/dist/src/channels/tui/markdown/blocks.d.ts +42 -0
- package/dist/src/channels/tui/markdown/blocks.js +112 -0
- package/dist/src/channels/tui/markdown/blocks.js.map +1 -0
- package/dist/src/channels/tui/markdown/inline.d.ts +24 -0
- package/dist/src/channels/tui/markdown/inline.js +76 -0
- package/dist/src/channels/tui/markdown/inline.js.map +1 -0
- package/dist/src/channels/tui/markdown/markdown.d.ts +34 -0
- package/dist/src/channels/tui/markdown/markdown.js +183 -0
- package/dist/src/channels/tui/markdown/markdown.js.map +1 -0
- package/dist/src/channels/tui/memory/memory-viewer.d.ts +235 -0
- package/dist/src/channels/tui/memory/memory-viewer.js +541 -0
- package/dist/src/channels/tui/memory/memory-viewer.js.map +1 -0
- package/dist/src/channels/tui/overlay/alt-screen.d.ts +79 -0
- package/dist/src/channels/tui/overlay/alt-screen.js +106 -0
- package/dist/src/channels/tui/overlay/alt-screen.js.map +1 -0
- package/dist/src/channels/tui/overlay/overlay.d.ts +53 -0
- package/dist/src/channels/tui/overlay/overlay.js +58 -0
- package/dist/src/channels/tui/overlay/overlay.js.map +1 -0
- package/dist/src/channels/tui/overlay/select-confirm.d.ts +73 -0
- package/dist/src/channels/tui/overlay/select-confirm.js +157 -0
- package/dist/src/channels/tui/overlay/select-confirm.js.map +1 -0
- package/dist/src/channels/tui/panels/todo-panel.d.ts +24 -0
- package/dist/src/channels/tui/panels/todo-panel.js +55 -0
- package/dist/src/channels/tui/panels/todo-panel.js.map +1 -0
- package/dist/src/channels/tui/panels/tool-progress-panel.d.ts +37 -0
- package/dist/src/channels/tui/panels/tool-progress-panel.js +94 -0
- package/dist/src/channels/tui/panels/tool-progress-panel.js.map +1 -0
- package/dist/src/channels/tui/scroll/scroll-view.d.ts +96 -0
- package/dist/src/channels/tui/scroll/scroll-view.js +255 -0
- package/dist/src/channels/tui/scroll/scroll-view.js.map +1 -0
- package/dist/src/channels/tui/status/status-line.d.ts +46 -0
- package/dist/src/channels/tui/status/status-line.js +77 -0
- package/dist/src/channels/tui/status/status-line.js.map +1 -0
- package/dist/src/channels/tui/theme.d.ts +27 -0
- package/dist/src/channels/tui/theme.js +42 -0
- package/dist/src/channels/tui/theme.js.map +1 -0
- package/dist/src/channels/types.d.ts +84 -0
- package/dist/src/channels/types.js +12 -0
- package/dist/src/channels/types.js.map +1 -0
- package/dist/src/channels/ui-core.d.ts +80 -0
- package/dist/src/channels/ui-core.js +210 -0
- package/dist/src/channels/ui-core.js.map +1 -0
- package/dist/src/context/codes.d.ts +1 -0
- package/dist/src/context/codes.js +41 -0
- package/dist/src/context/codes.js.map +1 -0
- package/dist/src/context/events.d.ts +62 -0
- package/dist/src/context/events.js +161 -0
- package/dist/src/context/events.js.map +1 -0
- package/dist/src/context/index.d.ts +16 -0
- package/dist/src/context/index.js +14 -0
- package/dist/src/context/index.js.map +1 -0
- package/dist/src/context/logger.d.ts +67 -0
- package/dist/src/context/logger.js +137 -0
- package/dist/src/context/logger.js.map +1 -0
- package/dist/src/context/scope.d.ts +78 -0
- package/dist/src/context/scope.js +183 -0
- package/dist/src/context/scope.js.map +1 -0
- package/dist/src/context/workspace.d.ts +8 -0
- package/dist/src/context/workspace.js +105 -0
- package/dist/src/context/workspace.js.map +1 -0
- package/dist/src/contracts/agent-events.d.ts +73 -0
- package/dist/src/contracts/agent-events.js +17 -0
- package/dist/src/contracts/agent-events.js.map +1 -0
- package/dist/src/contracts/api.d.ts +249 -0
- package/dist/src/contracts/api.js +334 -0
- package/dist/src/contracts/api.js.map +1 -0
- package/dist/src/contracts/approval.d.ts +37 -0
- package/dist/src/contracts/approval.js +10 -0
- package/dist/src/contracts/approval.js.map +1 -0
- package/dist/src/contracts/env-ref.d.ts +41 -0
- package/dist/src/contracts/env-ref.js +33 -0
- package/dist/src/contracts/env-ref.js.map +1 -0
- package/dist/src/contracts/errors.d.ts +56 -0
- package/dist/src/contracts/errors.js +267 -0
- package/dist/src/contracts/errors.js.map +1 -0
- package/dist/src/contracts/events.d.ts +70 -0
- package/dist/src/contracts/events.js +330 -0
- package/dist/src/contracts/events.js.map +1 -0
- package/dist/src/contracts/index.d.ts +32 -0
- package/dist/src/contracts/index.js +27 -0
- package/dist/src/contracts/index.js.map +1 -0
- package/dist/src/contracts/llm.d.ts +278 -0
- package/dist/src/contracts/llm.js +13 -0
- package/dist/src/contracts/llm.js.map +1 -0
- package/dist/src/contracts/messages.d.ts +63 -0
- package/dist/src/contracts/messages.js +66 -0
- package/dist/src/contracts/messages.js.map +1 -0
- package/dist/src/contracts/redact.d.ts +46 -0
- package/dist/src/contracts/redact.js +224 -0
- package/dist/src/contracts/redact.js.map +1 -0
- package/dist/src/contracts/tools.d.ts +198 -0
- package/dist/src/contracts/tools.js +35 -0
- package/dist/src/contracts/tools.js.map +1 -0
- package/dist/src/contracts/types.d.ts +304 -0
- package/dist/src/contracts/types.js +51 -0
- package/dist/src/contracts/types.js.map +1 -0
- package/dist/src/contracts/ui.d.ts +122 -0
- package/dist/src/contracts/ui.js +16 -0
- package/dist/src/contracts/ui.js.map +1 -0
- package/dist/src/sdk/types.d.ts +144 -0
- package/dist/src/sdk/types.js +33 -0
- package/dist/src/sdk/types.js.map +1 -0
- package/package.json +29 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { SDK_FRAME_KINDS, SDK_REQUEST_VERBS } from './protocol.js';
|
|
2
|
+
import { validateSdkRequest } from './schema.js';
|
|
3
|
+
/** 行终止符两位(编码转义对象——显式转义写法防字面量在编辑/传输中丢失) */
|
|
4
|
+
const LS = '\u2028';
|
|
5
|
+
const PS = '\u2029';
|
|
6
|
+
/** 判别字段的受控名(请求 `verb` / 线帧 `kind`) */
|
|
7
|
+
const FRAME_KIND_SET = new Set(SDK_FRAME_KINDS);
|
|
8
|
+
const REQUEST_VERB_SET = new Set(SDK_REQUEST_VERBS);
|
|
9
|
+
/** decide.answer 四值闭集(contracts ApprovalAskAnswer 减 'unavailable'——结构性
|
|
10
|
+
* 自报值非通道答案,SDK 通道面不受理;2026-09-13 复盘发现 #28:修前注称「同集」
|
|
11
|
+
* 在 unavailable 入集后失真) */
|
|
12
|
+
const APPROVAL_ANSWERS = new Set(['approve', 'reject', 'cancel', 'always']);
|
|
13
|
+
/** decide-result.outcome 闭集(跨入口竞速回执两档) */
|
|
14
|
+
const DECIDE_OUTCOMES = new Set(['applied', 'superseded']);
|
|
15
|
+
/** 解码失败(fail-loud——坏行不产半帧;线面应答形〔错误帧映射〕归宿主 serve 装配批) */
|
|
16
|
+
export class SdkDecodeError extends Error {
|
|
17
|
+
rawLine;
|
|
18
|
+
constructor(message,
|
|
19
|
+
/** 原始行文本(审计面——截断到 200 字符防日志洪水) */
|
|
20
|
+
rawLine) {
|
|
21
|
+
super(`SDK 线解码失败:${message}`);
|
|
22
|
+
this.rawLine = rawLine;
|
|
23
|
+
this.name = 'SdkDecodeError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 编码单帧为一行(含行尾 `\n`)。出站纪律:序列化 + U+2028/U+2029 转义——
|
|
28
|
+
* 返回值保证恰一个 `\n` 且在末尾(行安全锁,测试在册)。
|
|
29
|
+
*/
|
|
30
|
+
export function encodeWireLine(frame) {
|
|
31
|
+
const json = JSON.stringify(frame).replaceAll(LS, '\\u2028').replaceAll(PS, '\\u2029');
|
|
32
|
+
return `${json}\n`;
|
|
33
|
+
}
|
|
34
|
+
/** 值判别:请求(verb 判别字段在闭集内)——非抛型窄卫(消费面路由用) */
|
|
35
|
+
export function isSdkRequest(value) {
|
|
36
|
+
return (typeof value === 'object' &&
|
|
37
|
+
value !== null &&
|
|
38
|
+
'verb' in value &&
|
|
39
|
+
typeof value.verb === 'string' &&
|
|
40
|
+
REQUEST_VERB_SET.has(value.verb));
|
|
41
|
+
}
|
|
42
|
+
/** 结构校验:非对象 / 判别字段缺席 / 判别值不在闭集 —— 各自独立报因 */
|
|
43
|
+
function classify(value, rawLine) {
|
|
44
|
+
if (typeof value !== 'object' || value === null) {
|
|
45
|
+
throw new SdkDecodeError('非 JSON 对象', rawLine);
|
|
46
|
+
}
|
|
47
|
+
const v = value;
|
|
48
|
+
if (typeof v.verb === 'string' && REQUEST_VERB_SET.has(v.verb))
|
|
49
|
+
return 'request';
|
|
50
|
+
if (typeof v.kind === 'string' && FRAME_KIND_SET.has(v.kind))
|
|
51
|
+
return 'frame';
|
|
52
|
+
if (v.verb !== undefined || v.kind !== undefined) {
|
|
53
|
+
throw new SdkDecodeError(`判别值不识别(verb=${String(v.verb)} kind=${String(v.kind)}——闭集外)`, rawLine);
|
|
54
|
+
}
|
|
55
|
+
throw new SdkDecodeError('判别字段缺席(verb/kind 均无)', rawLine);
|
|
56
|
+
}
|
|
57
|
+
/** 标量必填断言(结构性校验——深校验挂账见文件头) */
|
|
58
|
+
function requireString(shape, key, rawLine) {
|
|
59
|
+
const v = shape[key];
|
|
60
|
+
if (typeof v !== 'string')
|
|
61
|
+
throw new SdkDecodeError(`${key} 必填且须为 string`, rawLine);
|
|
62
|
+
return v;
|
|
63
|
+
}
|
|
64
|
+
function requireNumber(shape, key, rawLine) {
|
|
65
|
+
const v = shape[key];
|
|
66
|
+
if (typeof v !== 'number' || !Number.isFinite(v)) {
|
|
67
|
+
throw new SdkDecodeError(`${key} 必填且须为有限数`, rawLine);
|
|
68
|
+
}
|
|
69
|
+
return v;
|
|
70
|
+
}
|
|
71
|
+
/** 逐请求动词的结构性必填校验(六动词族——03 §10.6 收窄律闭集) */
|
|
72
|
+
function validateRequest(shape, verb, rawLine) {
|
|
73
|
+
switch (verb) {
|
|
74
|
+
case 'hello':
|
|
75
|
+
requireNumber(shape, 'protocolVersion', rawLine);
|
|
76
|
+
break;
|
|
77
|
+
case 'prompt':
|
|
78
|
+
requireString(shape, 'messageId', rawLine);
|
|
79
|
+
requireString(shape, 'content', rawLine);
|
|
80
|
+
break;
|
|
81
|
+
case 'interrupt':
|
|
82
|
+
requireString(shape, 'sessionId', rawLine);
|
|
83
|
+
break;
|
|
84
|
+
case 'getEntries':
|
|
85
|
+
requireString(shape, 'sessionId', rawLine);
|
|
86
|
+
requireNumber(shape, 'since', rawLine);
|
|
87
|
+
break;
|
|
88
|
+
case 'decide':
|
|
89
|
+
requireString(shape, 'approvalId', rawLine);
|
|
90
|
+
if (!APPROVAL_ANSWERS.has(shape.answer)) {
|
|
91
|
+
throw new SdkDecodeError('answer 必填且须为 approve/reject/cancel/always 四值闭集', rawLine);
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
case 'sessions':
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** 逐线帧 kind 的结构性必填校验 */
|
|
99
|
+
function validateFrame(shape, kind, rawLine) {
|
|
100
|
+
switch (kind) {
|
|
101
|
+
case 'event':
|
|
102
|
+
requireNumber(shape, 'seq', rawLine);
|
|
103
|
+
requireString(shape, 'sessionId', rawLine);
|
|
104
|
+
if (typeof shape.event !== 'object' ||
|
|
105
|
+
shape.event === null ||
|
|
106
|
+
typeof shape.event.type !== 'string') {
|
|
107
|
+
throw new SdkDecodeError('event 必填且须携 string type(04 §2 十型判别)', rawLine);
|
|
108
|
+
}
|
|
109
|
+
break;
|
|
110
|
+
case 'hello':
|
|
111
|
+
requireString(shape, 'sessionId', rawLine);
|
|
112
|
+
requireNumber(shape, 'protocolVersion', rawLine);
|
|
113
|
+
requireNumber(shape, 'highWaterSeq', rawLine);
|
|
114
|
+
break;
|
|
115
|
+
case 'heartbeat':
|
|
116
|
+
requireString(shape, 'sessionId', rawLine);
|
|
117
|
+
if (shape.runState !== 'idle' && shape.runState !== 'running') {
|
|
118
|
+
throw new SdkDecodeError('runState 必填且须为 idle/running 两值闭集', rawLine);
|
|
119
|
+
}
|
|
120
|
+
requireNumber(shape, 'elapsedMs', rawLine);
|
|
121
|
+
break;
|
|
122
|
+
case 'ack':
|
|
123
|
+
requireString(shape, 'sessionId', rawLine);
|
|
124
|
+
requireString(shape, 'messageId', rawLine);
|
|
125
|
+
if (typeof shape.duplicate !== 'boolean') {
|
|
126
|
+
throw new SdkDecodeError('duplicate 必填且须为 boolean', rawLine);
|
|
127
|
+
}
|
|
128
|
+
requireNumber(shape, 'highWaterSeq', rawLine);
|
|
129
|
+
break;
|
|
130
|
+
case 'replay-end':
|
|
131
|
+
requireString(shape, 'sessionId', rawLine);
|
|
132
|
+
requireNumber(shape, 'lastReplayedSeq', rawLine);
|
|
133
|
+
break;
|
|
134
|
+
case 'entries':
|
|
135
|
+
requireString(shape, 'sessionId', rawLine);
|
|
136
|
+
break;
|
|
137
|
+
case 'decide-result':
|
|
138
|
+
requireString(shape, 'approvalId', rawLine);
|
|
139
|
+
if (!DECIDE_OUTCOMES.has(shape.outcome)) {
|
|
140
|
+
throw new SdkDecodeError('outcome 必填且须为 applied/superseded 两值闭集', rawLine);
|
|
141
|
+
}
|
|
142
|
+
break;
|
|
143
|
+
case 'ask':
|
|
144
|
+
// 审批外推帧恰三必填标量(reason/toolName/suggestedEntry 可选呈现位不校验)
|
|
145
|
+
requireString(shape, 'sessionId', rawLine);
|
|
146
|
+
requireString(shape, 'approvalId', rawLine);
|
|
147
|
+
requireString(shape, 'summary', rawLine);
|
|
148
|
+
break;
|
|
149
|
+
case 'sessions':
|
|
150
|
+
break;
|
|
151
|
+
case 'error':
|
|
152
|
+
requireString(shape, 'code', rawLine);
|
|
153
|
+
requireString(shape, 'message', rawLine);
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 解码单行为请求或线帧(fail-loud:非 JSON / 判别缺席 / 必填缺失各自报因,
|
|
159
|
+
* 坏行不产半帧)。行尾 `\r` 容忍(CRLF 传输面统一 LF——与 TUI 输入解码同律)。
|
|
160
|
+
*/
|
|
161
|
+
export function decodeWireLine(line) {
|
|
162
|
+
const rawLine = line;
|
|
163
|
+
let parsed;
|
|
164
|
+
try {
|
|
165
|
+
parsed = JSON.parse(line);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
throw new SdkDecodeError('非合法 JSON', rawLine);
|
|
169
|
+
}
|
|
170
|
+
const which = classify(parsed, rawLine);
|
|
171
|
+
const shape = parsed;
|
|
172
|
+
if (which === 'request') {
|
|
173
|
+
validateRequest(shape, shape.verb, rawLine);
|
|
174
|
+
// 深校验(批 13e 接入——./schema.ts 单源):结构层过后逐字段 typebox 校验
|
|
175
|
+
//(未知字段拒收/选填语义——HTTP 体校验位同源同件)
|
|
176
|
+
const deep = validateSdkRequest(parsed);
|
|
177
|
+
if (!deep.ok)
|
|
178
|
+
throw new SdkDecodeError(deep.reason, rawLine);
|
|
179
|
+
return deep.value;
|
|
180
|
+
}
|
|
181
|
+
validateFrame(shape, shape.kind, rawLine);
|
|
182
|
+
return parsed;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 流式分帧(stdio 管道跨 chunk 边界的安全分帧):按 `\n` 切行、行尾 `\r` 剥离
|
|
186
|
+
* (CRLF 统一 LF)、空行跳过(心跳间隙的空拍不产帧)。入参 chunk 与上次
|
|
187
|
+
* remainder 拼接后切分;无完整行的 chunk 只进 remainder(零字节丢失、零半帧)。
|
|
188
|
+
*/
|
|
189
|
+
export function splitWireLines(chunk, remainder = '') {
|
|
190
|
+
const joined = remainder + chunk;
|
|
191
|
+
const lastNewline = joined.lastIndexOf('\n');
|
|
192
|
+
if (lastNewline === -1)
|
|
193
|
+
return { lines: [], remainder: joined };
|
|
194
|
+
const lines = joined
|
|
195
|
+
.slice(0, lastNewline)
|
|
196
|
+
.split('\n')
|
|
197
|
+
.map((line) => (line.endsWith('\r') ? line.slice(0, -1) : line))
|
|
198
|
+
.filter((line) => line.length > 0);
|
|
199
|
+
return { lines, remainder: joined.slice(lastNewline + 1) };
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=jsonl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../../../../../src/channels/sdk/jsonl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK 线协议词汇与信封(03 篇 §10.6 线协议七原则 + 线事件词汇条——批 13a 契约先行笔)。
|
|
3
|
+
*
|
|
4
|
+
* 架构位(03 §10.6 件身份条):协议核心(事件外推/请求受理/admit/seq 游标)代码位与
|
|
5
|
+
* channels 通道核同体——SDK 通道后端 = UiBackend 第三后端,本件目录即其协议面;
|
|
6
|
+
* stdio JSONL 传输归宿主 serve 子命令(07 §5);HTTP+SSE 传输与 MCP server 包装归
|
|
7
|
+
* core:sdk 件(src/sdk/ 随批 13e 起域)——三传输同律吃本件词汇,零第二套。
|
|
8
|
+
*
|
|
9
|
+
* 信封定形(03 §10.6 线事件词汇条「信封词面(`{seq, sessionId, event}` 形)随落码
|
|
10
|
+
* 批定形」——本批即定形批):活体事件帧 kind:'event' 恰携三载荷字段 {seq, sessionId,
|
|
11
|
+
* event};线控帧族与请求应答帧平铺自持各自载荷(hello/ack 必携 sessionId——03 §10.6
|
|
12
|
+
* 请求面动词族条·会话生命周期段)。全部帧以顶层 `kind` 判别、全部请求以顶层 `verb`
|
|
13
|
+
* 判别(NDJSON 行一级判别,编解码见 ./jsonl.ts)。
|
|
14
|
+
*/
|
|
15
|
+
import type { AgentEvent } from '../../agent/index.js';
|
|
16
|
+
import type { ApprovalAskAnswer, RetryProbe } from '../../contracts/index.js';
|
|
17
|
+
/** 线协议版本(③/⑤ 版本握手第一天就有:连接即 hello 双方携 protocolVersion 比对) */
|
|
18
|
+
export declare const SDK_PROTOCOL_VERSION = 1;
|
|
19
|
+
/**
|
|
20
|
+
* 高水位约定(全件单源——05 §3.5 崩溃重连对账条):**highWaterSeq = 会话日志当前
|
|
21
|
+
* 长度**(= 下一将分配 seq;既存末条 seq = highWaterSeq − 1;空会话 = 0)。在此
|
|
22
|
+
* 约定下两执法句自洽:调用方已收末 seq ≥ 高水位 ⇒ 尾被截(seq 复用/幻影);
|
|
23
|
+
* `after=N` ≥ 高水位 ⇒ 游标非法(声称已收不存在的事件)。
|
|
24
|
+
*/
|
|
25
|
+
/** 心跳阶段三形(② 心跳是协议义务——载荷「thinking / tool:<名>+<耗时> / retry <attempt>/<next>」定形为判别联合) */
|
|
26
|
+
export type SdkHeartbeatStage = {
|
|
27
|
+
type: 'thinking';
|
|
28
|
+
}
|
|
29
|
+
/** 工具执行中:工具名 + 该阶段已耗时毫秒 */
|
|
30
|
+
| {
|
|
31
|
+
type: 'tool';
|
|
32
|
+
name: string;
|
|
33
|
+
stageElapsedMs: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 驱动重试续入中:probe = contracts RetryProbe(驱动 retryState 只读小面直载
|
|
37
|
+
* ——attempt/nextAt/maxAttempts 单形单源)。重试进度状态源 = 驱动重试循环对
|
|
38
|
+
* 通道核的只读小面(暴露 attempt/nextAt,非事件型、不进 durable——04 §2
|
|
39
|
+
* 「重试续入零新事件型」),心跳载荷是该 seam 的唯一线面出口。
|
|
40
|
+
*/
|
|
41
|
+
| {
|
|
42
|
+
type: 'retry';
|
|
43
|
+
probe: RetryProbe;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* 活体事件帧(信封形 `{seq, sessionId, event}` 恰三载荷字段——03 §10.6 线事件
|
|
47
|
+
* 词汇条定形)。event = 04 §2 活体十型直出(拍板③单源律——不设第二套粗粒度
|
|
48
|
+
* 词汇);message_update 线形剥累积快照只留 delta(① delta 缺省开,改造位在
|
|
49
|
+
* 通道核外推腿、不改活体层事件形状——05 §3.5 第三腿),`--no-delta` 退订降
|
|
50
|
+
* 流量档(07 §5)。
|
|
51
|
+
*
|
|
52
|
+
* **双轨律(批 13b 落码定形——立题批可抄清单 #2「delta 仅直播、Ended 可重放」
|
|
53
|
+
* 同源)**:直播段 = 本帧族(AgentEvent 直出/改造形);重放段 = durable 平铺
|
|
54
|
+
* 投影({@link SdkDurableEntry},queryEntries 同源读面)——两段词汇按构造零
|
|
55
|
+
* 重叠(durable 词 ≠ 活体十型),衔接 = 先重放(至订阅时高水位)后全量吐直播
|
|
56
|
+
* 缓冲,无跨段去重面。掉帧语义:纯活体帧(message_update delta/工具进度)
|
|
57
|
+
* 丢失无害——重放兜底在 durable 面(05 §3.5「累积错无立足点」)。
|
|
58
|
+
*/
|
|
59
|
+
export interface SdkEventFrame {
|
|
60
|
+
kind: 'event';
|
|
61
|
+
/**
|
|
62
|
+
* per-session 单调 seq——**durable 水位语义**(批 13b 落码定形):值 = 外推
|
|
63
|
+
* 时刻会话内存日志长度(05 §1.1 seq = 写入时 log.length;含未落库在飞事件
|
|
64
|
+
* 的内存序)。弱单调(纯活体帧间可同号);durable 锚定帧(message_end 等——
|
|
65
|
+
* durable 落账腿先于外部汇腿同步分发)恒 > 订阅重放尾。崩溃对账消费位:
|
|
66
|
+
* 调用方记已收最大 seq,重连携 after 比对高水位(05 §3.5 尾截断侦测)。
|
|
67
|
+
*/
|
|
68
|
+
seq: number;
|
|
69
|
+
sessionId: string;
|
|
70
|
+
event: AgentEvent;
|
|
71
|
+
}
|
|
72
|
+
/** hello 应答帧(连接受理 + 版本握手结果 + 会话高水位——崩溃对账锚) */
|
|
73
|
+
export interface SdkHelloFrame {
|
|
74
|
+
kind: 'hello';
|
|
75
|
+
/** 服务端线协议版本(与请求侧比对,不符即 SDK_PROTOCOL_MISMATCH 拒连) */
|
|
76
|
+
protocolVersion: number;
|
|
77
|
+
/** 订阅会话 id(请求侧未携会话订阅时 = 连接级握手缺省会话,随首个 ack 落定) */
|
|
78
|
+
sessionId: string;
|
|
79
|
+
/** 会话当前 seq 高水位(约定见文件头——空会话 = 0) */
|
|
80
|
+
highWaterSeq: number;
|
|
81
|
+
}
|
|
82
|
+
/** 心跳帧(②——idle 超阈值即发;间隔值随落码批实测定,13b 接装配定时) */
|
|
83
|
+
export interface SdkHeartbeatFrame {
|
|
84
|
+
kind: 'heartbeat';
|
|
85
|
+
sessionId: string;
|
|
86
|
+
/** run 态两值闭集(审批挂起属 run 内等待,经 ask 外推事件可观察——不发明第三态) */
|
|
87
|
+
runState: 'idle' | 'running';
|
|
88
|
+
/** 当前阶段(idle 态为 null) */
|
|
89
|
+
stage: SdkHeartbeatStage | null;
|
|
90
|
+
/** 当前 run 从启动起累计毫秒(idle 态 = 上一 run 尾值或 0) */
|
|
91
|
+
elapsedMs: number;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* admit 回执帧(④ 幂等 admit——线控事件族四件之一)。同 messageId 同内容重发
|
|
95
|
+
* = 幂等重收执(回执即既存事件本身,经 after 重放可取——不重跑)。
|
|
96
|
+
*/
|
|
97
|
+
export interface SdkAckFrame {
|
|
98
|
+
kind: 'ack';
|
|
99
|
+
sessionId: string;
|
|
100
|
+
/** 回执所归属的调用方 messageId(受理时即落账为 data.dedupeKey——两词一字段两面) */
|
|
101
|
+
messageId: string;
|
|
102
|
+
/** true = 同键同内容既存重收执(幂等档);false = 新受理 */
|
|
103
|
+
duplicate: boolean;
|
|
104
|
+
/**
|
|
105
|
+
* 路由结果观察字段(驱动侧单源路由进 steer/followUp——04 §4 硬律:三通道判定
|
|
106
|
+
* 是驱动侧单源、发送方不指定通道;观察非控制)。缺席 = 新开轮(受理时无在飞 run)。
|
|
107
|
+
*/
|
|
108
|
+
routedChannel?: 'steer' | 'followUp';
|
|
109
|
+
/** 受理时会话高水位(崩溃对账锚) */
|
|
110
|
+
highWaterSeq: number;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 重放游标标记帧(线控事件族四件之四——重放段与直播段的衔接界标)。
|
|
114
|
+
* 直播起播 = 后续 event 帧 seq > lastReplayedSeq 首条(含未落库在飞——05 §3.5
|
|
115
|
+
* 衔接序第 ③ 步;重放尾与直播首无缝衔接 = 落码回归锁位,见 ./cursor.ts)。
|
|
116
|
+
*
|
|
117
|
+
* 〔2026-09-14 遗漏扫描四役定形:本帧曾携 nextCursor 续读游标位——发射位
|
|
118
|
+
* (wire-core handleHello)结构性永不携带,属死契约字段已删;v1 serve 桥
|
|
119
|
+
* 单页全窗成文定案(重放腿跟尽义务由桥并页兑现),跟尽语义活位在 entries
|
|
120
|
+
* 帧的 nextCursor(getEntries 腿续读位)——03 §10.6 四役注记。〕
|
|
121
|
+
*/
|
|
122
|
+
export interface SdkReplayEndFrame {
|
|
123
|
+
kind: 'replay-end';
|
|
124
|
+
sessionId: string;
|
|
125
|
+
/** 重放段末条 seq(空重放 = after 原值或 −1) */
|
|
126
|
+
lastReplayedSeq: number;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 结构化错误帧(⑥ 结构化错误单源:code 直出 contracts 错误码注册表一一对应,
|
|
130
|
+
* 不发明第二套)。willRetry 系**错误事件载荷位**非新事件型;retryAfterMs 系
|
|
131
|
+
* `SDK_OVERLOADED` 专属载荷(⑦ 背压——codex -32001 形)。
|
|
132
|
+
*/
|
|
133
|
+
export interface SdkErrorFrame {
|
|
134
|
+
kind: 'error';
|
|
135
|
+
/** 关联会话(连接级错误缺席——版本握手拒连等) */
|
|
136
|
+
sessionId?: string;
|
|
137
|
+
code: string;
|
|
138
|
+
message: string;
|
|
139
|
+
/** 可重试位(错误事件载荷位——重试期不打断事件流,进度并入心跳载荷) */
|
|
140
|
+
willRetry?: boolean;
|
|
141
|
+
/** SDK_OVERLOADED 携带:建议重试等待毫秒 */
|
|
142
|
+
retryAfterMs?: number;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* durable 事件线面平铺投影形(重放/getEntries 载荷——批 13b 落码定形)。
|
|
146
|
+
* 05 §1.1 durable 事件信封的线面投影:{type, seq, time, data} 平铺直出
|
|
147
|
+
* (queryEntries 同源读面——05 §3.5 第一腿「服务端实现即 queryEvents 同源
|
|
148
|
+
* 读面,无第二查询机制」);type 词汇 = durable 十五型(线面透传不二校验——
|
|
149
|
+
* 词汇注册表单源在 session 侧)。双轨律见 {@link SdkEventFrame} 文注——
|
|
150
|
+
* 本形只走重放/对账段,永不走直播段。
|
|
151
|
+
*/
|
|
152
|
+
export interface SdkDurableEntry {
|
|
153
|
+
/** durable 事件类型(05 §1.1 词汇——`user/message` 式) */
|
|
154
|
+
type: string;
|
|
155
|
+
/** per-session 单调 seq(= 写入时 log.length——重放游标/对账锚) */
|
|
156
|
+
seq: number;
|
|
157
|
+
/** Unix 毫秒时间戳 */
|
|
158
|
+
time: number;
|
|
159
|
+
/** 事件载荷(frozen 投影——预算刀裁后形) */
|
|
160
|
+
data: unknown;
|
|
161
|
+
}
|
|
162
|
+
/** getEntries 应答帧——断线对账读面(服务端实现即 queryEvents 同源读面,05 §3.5 第一腿) */
|
|
163
|
+
export interface SdkEntriesFrame {
|
|
164
|
+
kind: 'entries';
|
|
165
|
+
sessionId: string;
|
|
166
|
+
/** (since, 高水位] 窗口内 durable 事件(重放源 = 会话内存日志——含未落库在飞,装配桥接) */
|
|
167
|
+
entries: SdkDurableEntry[];
|
|
168
|
+
/**
|
|
169
|
+
* 分页续读游标(05 §3.4 强制有帽有界——缺省帽 1000 / 硬帽 10000;缺席 =
|
|
170
|
+
* 已跟尽)。跟尽义务在调用方:在场即携 cursor 续读(SdkGetEntriesRequest
|
|
171
|
+
* .cursor 位回传),单页即止 = 截断不报错(系调用方违约,协议不补发)——
|
|
172
|
+
* 2026-09-14 四役定形:跟尽语义单源在本帧(replay-end 帧曾携同名字段系
|
|
173
|
+
* 死契约位已删,见彼处文注)。
|
|
174
|
+
*/
|
|
175
|
+
nextCursor?: string;
|
|
176
|
+
}
|
|
177
|
+
/** sessions 应答帧——会话清单(与 webui §10.4 会话族端点同读面,词面本批定形) */
|
|
178
|
+
export interface SdkSessionsFrame {
|
|
179
|
+
kind: 'sessions';
|
|
180
|
+
sessions: SdkSessionSummary[];
|
|
181
|
+
}
|
|
182
|
+
/** 会话清单条目(id/标题/末活动时间——03 §10.6 请求面动词族条 sessions 词面定形) */
|
|
183
|
+
export interface SdkSessionSummary {
|
|
184
|
+
id: string;
|
|
185
|
+
/** 无标题会话为 null(不造占位串) */
|
|
186
|
+
title: string | null;
|
|
187
|
+
/** 末活动时间 epoch 毫秒 */
|
|
188
|
+
lastActivityAt: number;
|
|
189
|
+
}
|
|
190
|
+
/** decide 应答帧——跨入口审批竞速回执(03 §10.6 审批外推第三腿) */
|
|
191
|
+
export interface SdkDecideResultFrame {
|
|
192
|
+
kind: 'decide-result';
|
|
193
|
+
/** 所应答审批标识(与 ask 外推事件载荷同词同源——contracts ApprovalAskRequest.approvalId) */
|
|
194
|
+
approvalId: string;
|
|
195
|
+
/** applied = 本应答先 settle 胜出;superseded = 已被他入口应答(幂等回执——TUI/web/SDK 三入口同漏斗) */
|
|
196
|
+
outcome: 'applied' | 'superseded';
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* 审批 ask 外推帧(03 §10.6 审批外推第三腿:「serve/SDK 面审批 = ask 外推
|
|
200
|
+
* (线事件)+ decide 请求应答——汇入 10.4 跨入口审批同一 pending Promise
|
|
201
|
+
* 竞速」)。审批是挂起态非活体流——独立帧族(不入 SDK_FRAME_KINDS 的 event
|
|
202
|
+
* 位、不占 seq、不进 durable);重连补推:hello 订阅受理后未决 ask 全量重推
|
|
203
|
+
* (decide 的应答面才不断线)。approvalId 由 SDK 后端指派(contracts
|
|
204
|
+
* ApprovalAskRequest.approvalId 缺席时补一——挂起身份短形,多连接防串答)。
|
|
205
|
+
*/
|
|
206
|
+
export interface SdkAskFrame {
|
|
207
|
+
kind: 'ask';
|
|
208
|
+
sessionId: string;
|
|
209
|
+
/** 挂起审批身份(decide 请求以此应答——同词同源) */
|
|
210
|
+
approvalId: string;
|
|
211
|
+
/** 目标动作摘要(人可读一行) */
|
|
212
|
+
summary: string;
|
|
213
|
+
/** 请求方/理由(可选呈现) */
|
|
214
|
+
reason?: string;
|
|
215
|
+
/** 发起审批的工具名(可选呈现) */
|
|
216
|
+
toolName?: string;
|
|
217
|
+
/** 「始终允许」草案条目(always 应答的策略表回写目标——缺席 = always 视同 approve) */
|
|
218
|
+
suggestedEntry?: string;
|
|
219
|
+
}
|
|
220
|
+
/** 服务端 → 调用方线帧全族(判别字段 `kind`;闭集见 {@link SDK_FRAME_KINDS}) */
|
|
221
|
+
export type SdkWireFrame = SdkEventFrame | SdkHelloFrame | SdkHeartbeatFrame | SdkAckFrame | SdkReplayEndFrame | SdkErrorFrame | SdkEntriesFrame | SdkSessionsFrame | SdkDecideResultFrame | SdkAskFrame;
|
|
222
|
+
/**
|
|
223
|
+
* 线帧 kind 闭集(十:活体事件帧 + 线控四件〔hello/heartbeat/ack/replay-end〕+
|
|
224
|
+
* 请求应答三件〔entries/sessions/decide-result〕+ 错误帧 + ask 审批外推帧——
|
|
225
|
+
* ask 独立于 event 位,审批挂起态非活体流,见 {@link SdkAskFrame} 文注)。
|
|
226
|
+
*/
|
|
227
|
+
export declare const SDK_FRAME_KINDS: readonly ["event", "hello", "heartbeat", "ack", "replay-end", "error", "entries", "sessions", "decide-result", "ask"];
|
|
228
|
+
/**
|
|
229
|
+
* hello 请求(握手动词)。sessionId 携带 = 续接并订阅该会话事件流(携 after 先
|
|
230
|
+
* 重放后直播);缺席 = 连接级握手(后续 prompt 按各自 sessionId 路由——stdio 单
|
|
231
|
+
* 连接内复用 N 会话,07 §5 serve 细则④)。after 缺席 = 只直播不重放。
|
|
232
|
+
*/
|
|
233
|
+
export interface SdkHelloRequest {
|
|
234
|
+
verb: 'hello';
|
|
235
|
+
protocolVersion: number;
|
|
236
|
+
sessionId?: string;
|
|
237
|
+
/** 订阅游标:重放窗口 = (after, 订阅时高水位];合法性见 ./cursor.ts */
|
|
238
|
+
after?: number;
|
|
239
|
+
/**
|
|
240
|
+
* 退订 message_update delta(`--no-delta` 线面承载位——07 §5 serve 细则:
|
|
241
|
+
* 降流量档;durable 定稿事件不受影响——只剥直播 delta 流)。受理后本连接
|
|
242
|
+
* 不再外推 message_update 帧(Ended 帧/重放面照常)。
|
|
243
|
+
*/
|
|
244
|
+
noDelta?: boolean;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* prompt 请求(新发——携 messageId 幂等键)。**prompt 单入口、调用方不选通道**:
|
|
248
|
+
* 会话内在飞 run 时的并发 prompt 由驱动侧单源路由进 steer/followUp(04 §4 硬律),
|
|
249
|
+
* 路由结果随 ack 观察字段回示;三通道词 steer/followUp/inject 不出现在请求面。
|
|
250
|
+
* sessionId 缺席即新建会话(ack 与事件信封必携 sessionId——调用方以首应答获
|
|
251
|
+
* 会话句柄);显式携带即续接;命中已闭会话回结构化错误(对齐 webui 已闭 404 语义)。
|
|
252
|
+
*/
|
|
253
|
+
export interface SdkPromptRequest {
|
|
254
|
+
verb: 'prompt';
|
|
255
|
+
/** 调用方自选幂等键——受理时即落账为 data.dedupeKey(05 §3.5 两词一字段两面) */
|
|
256
|
+
messageId: string;
|
|
257
|
+
content: string;
|
|
258
|
+
sessionId?: string;
|
|
259
|
+
}
|
|
260
|
+
/** interrupt 请求(受理经事件流可观察:turn/end reason='interrupted';心跳转 idle) */
|
|
261
|
+
export interface SdkInterruptRequest {
|
|
262
|
+
verb: 'interrupt';
|
|
263
|
+
sessionId: string;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* decide 请求(审批应答——汇入 10.4 跨入口审批同一 pending Promise 竞速:先
|
|
267
|
+
* settle 者胜、后到 superseded 幂等回执)。answer 值域 = contracts
|
|
268
|
+
* ApprovalAskAnswer 四值闭集(approve/reject/cancel/always——与 TUI/web 入口
|
|
269
|
+
* 同一 settle 值域,跨入口竞速语义才闭合);approvalId 与 ask 外推事件载荷
|
|
270
|
+
* 同词同源(contracts ApprovalAskRequest.approvalId)。
|
|
271
|
+
*/
|
|
272
|
+
export interface SdkDecideRequest {
|
|
273
|
+
verb: 'decide';
|
|
274
|
+
approvalId: string;
|
|
275
|
+
answer: ApprovalAskAnswer;
|
|
276
|
+
/** 应答附注(进审批审计面,可选) */
|
|
277
|
+
note?: string;
|
|
278
|
+
}
|
|
279
|
+
/** getEntries 请求(断线对账——since 语义同 hello.after:窗口 (since, 高水位]) */
|
|
280
|
+
export interface SdkGetEntriesRequest {
|
|
281
|
+
verb: 'getEntries';
|
|
282
|
+
sessionId: string;
|
|
283
|
+
since: number;
|
|
284
|
+
/** 分页续读游标(首轮缺席;跟尽义务在调用方) */
|
|
285
|
+
cursor?: string;
|
|
286
|
+
}
|
|
287
|
+
/** sessions 请求(会话清单——id/标题/末活动时间) */
|
|
288
|
+
export interface SdkSessionsRequest {
|
|
289
|
+
verb: 'sessions';
|
|
290
|
+
}
|
|
291
|
+
/** 调用方请求全族(判别字段 `verb`;闭集见 {@link SDK_REQUEST_VERBS}) */
|
|
292
|
+
export type SdkRequest = SdkHelloRequest | SdkPromptRequest | SdkInterruptRequest | SdkDecideRequest | SdkGetEntriesRequest | SdkSessionsRequest;
|
|
293
|
+
/**
|
|
294
|
+
* 请求动词六件闭集(03 §10.6 请求面动词族条——v1 收窄律;steer/followUp/inject
|
|
295
|
+
* 三通道词**不在场**是执法位:驱动侧单源律的结构锁,测试断言在册)。
|
|
296
|
+
*/
|
|
297
|
+
export declare const SDK_REQUEST_VERBS: readonly ["hello", "prompt", "interrupt", "decide", "getEntries", "sessions"];
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** 线协议版本(③/⑤ 版本握手第一天就有:连接即 hello 双方携 protocolVersion 比对) */
|
|
2
|
+
export const SDK_PROTOCOL_VERSION = 1;
|
|
3
|
+
/**
|
|
4
|
+
* 线帧 kind 闭集(十:活体事件帧 + 线控四件〔hello/heartbeat/ack/replay-end〕+
|
|
5
|
+
* 请求应答三件〔entries/sessions/decide-result〕+ 错误帧 + ask 审批外推帧——
|
|
6
|
+
* ask 独立于 event 位,审批挂起态非活体流,见 {@link SdkAskFrame} 文注)。
|
|
7
|
+
*/
|
|
8
|
+
export const SDK_FRAME_KINDS = [
|
|
9
|
+
'event',
|
|
10
|
+
'hello',
|
|
11
|
+
'heartbeat',
|
|
12
|
+
'ack',
|
|
13
|
+
'replay-end',
|
|
14
|
+
'error',
|
|
15
|
+
'entries',
|
|
16
|
+
'sessions',
|
|
17
|
+
'decide-result',
|
|
18
|
+
'ask',
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* 请求动词六件闭集(03 §10.6 请求面动词族条——v1 收窄律;steer/followUp/inject
|
|
22
|
+
* 三通道词**不在场**是执法位:驱动侧单源律的结构锁,测试断言在册)。
|
|
23
|
+
*/
|
|
24
|
+
export const SDK_REQUEST_VERBS = ['hello', 'prompt', 'interrupt', 'decide', 'getEntries', 'sessions'];
|
|
25
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../../../src/channels/sdk/protocol.ts"],"names":[],"mappings":"AAiBA,4DAA4D;AAC5D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAkOtC;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO;IACP,OAAO;IACP,WAAW;IACX,KAAK;IACL,YAAY;IACZ,OAAO;IACP,SAAS;IACT,UAAU;IACV,eAAe;IACf,KAAK;CACG,CAAC;AAoFX;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAU,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SdkRequest } from './protocol.js';
|
|
2
|
+
/**
|
|
3
|
+
* 请求深校验(非抛型)。输入须已过 jsonl.ts 结构层(verb 在闭集内)——本层
|
|
4
|
+
* 补逐字段校验;独立调用时对判别字段缺席/闭集外同样诚实拒收(reason 单句)。
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateSdkRequest(value: unknown): {
|
|
7
|
+
ok: true;
|
|
8
|
+
value: SdkRequest;
|
|
9
|
+
} | {
|
|
10
|
+
ok: false;
|
|
11
|
+
reason: string;
|
|
12
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK 线协议请求面 typebox 深校验(03 §10.6 请求面动词族条「每动词 typebox
|
|
3
|
+
* schema 校验后消费——webui 微路由同纪律」;13a 挂账批 13e 兑现件)。
|
|
4
|
+
*
|
|
5
|
+
* 单源律:六动词 schema 全集即请求面唯一深校验真源——stdio 解码位
|
|
6
|
+
* (./jsonl.ts decodeWireLine 尾段)与 HTTP 体校验位(core:sdk 件经 channels
|
|
7
|
+
* 公开面消费)同源接入,零第二套。结构层(判别字段闭集/必填标量型)仍由
|
|
8
|
+
* jsonl.ts 先行快校——本层补齐逐字段型/选填语义/未知字段拒收。
|
|
9
|
+
*
|
|
10
|
+
* 非抛型结果面:{ok, value} | {ok:false, reason}——错误帧映射归宿主传输层
|
|
11
|
+
* (stdio = SdkDecodeError 包装;HTTP = 400 携结构化错误码),本层零错误词。
|
|
12
|
+
*/
|
|
13
|
+
import { Type } from 'typebox';
|
|
14
|
+
import { Value } from 'typebox/value';
|
|
15
|
+
// 顶部 typebox 注入形态说明:typebox 主包 + value 子路径均入 channels externals
|
|
16
|
+
// 白名单(tools/conversation/web/exec/skills 同律——schema 层宿主件直用)。
|
|
17
|
+
/** 公共字段词面:未知字段拒收(收窄律执法——请求面六动词载荷即全集) */
|
|
18
|
+
const strict = { additionalProperties: false };
|
|
19
|
+
/** hello 请求 schema(protocolVersion 必填;sessionId/after/noDelta 选填) */
|
|
20
|
+
const HelloSchema = Type.Object({
|
|
21
|
+
verb: Type.Literal('hello'),
|
|
22
|
+
protocolVersion: Type.Integer(),
|
|
23
|
+
sessionId: Type.Optional(Type.String()),
|
|
24
|
+
after: Type.Optional(Type.Integer()),
|
|
25
|
+
noDelta: Type.Optional(Type.Boolean()),
|
|
26
|
+
}, strict);
|
|
27
|
+
/** prompt 请求 schema(messageId/content 必填;sessionId 选填——缺席即新建) */
|
|
28
|
+
const PromptSchema = Type.Object({
|
|
29
|
+
verb: Type.Literal('prompt'),
|
|
30
|
+
messageId: Type.String(),
|
|
31
|
+
content: Type.String(),
|
|
32
|
+
sessionId: Type.Optional(Type.String()),
|
|
33
|
+
}, strict);
|
|
34
|
+
/** interrupt 请求 schema(sessionId 必填) */
|
|
35
|
+
const InterruptSchema = Type.Object({
|
|
36
|
+
verb: Type.Literal('interrupt'),
|
|
37
|
+
sessionId: Type.String(),
|
|
38
|
+
}, strict);
|
|
39
|
+
/** decide 请求 schema(approvalId/answer 必填;note 选填——answer 四值闭集) */
|
|
40
|
+
const DecideSchema = Type.Object({
|
|
41
|
+
verb: Type.Literal('decide'),
|
|
42
|
+
approvalId: Type.String(),
|
|
43
|
+
answer: Type.Union([
|
|
44
|
+
Type.Literal('approve'),
|
|
45
|
+
Type.Literal('reject'),
|
|
46
|
+
Type.Literal('cancel'),
|
|
47
|
+
Type.Literal('always'),
|
|
48
|
+
]),
|
|
49
|
+
note: Type.Optional(Type.String()),
|
|
50
|
+
}, strict);
|
|
51
|
+
/** getEntries 请求 schema(sessionId/since 必填;cursor 选填——分页续读) */
|
|
52
|
+
const GetEntriesSchema = Type.Object({
|
|
53
|
+
verb: Type.Literal('getEntries'),
|
|
54
|
+
sessionId: Type.String(),
|
|
55
|
+
since: Type.Integer(),
|
|
56
|
+
cursor: Type.Optional(Type.String()),
|
|
57
|
+
}, strict);
|
|
58
|
+
/** sessions 请求 schema(零载荷) */
|
|
59
|
+
const SessionsSchema = Type.Object({ verb: Type.Literal('sessions') }, strict);
|
|
60
|
+
/** 六动词 schema 分派表(verb 判别字段路由——与 SDK_REQUEST_VERBS 同序) */
|
|
61
|
+
const SCHEMAS_BY_VERB = {
|
|
62
|
+
hello: HelloSchema,
|
|
63
|
+
prompt: PromptSchema,
|
|
64
|
+
interrupt: InterruptSchema,
|
|
65
|
+
decide: DecideSchema,
|
|
66
|
+
getEntries: GetEntriesSchema,
|
|
67
|
+
sessions: SessionsSchema,
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* 请求深校验(非抛型)。输入须已过 jsonl.ts 结构层(verb 在闭集内)——本层
|
|
71
|
+
* 补逐字段校验;独立调用时对判别字段缺席/闭集外同样诚实拒收(reason 单句)。
|
|
72
|
+
*/
|
|
73
|
+
export function validateSdkRequest(value) {
|
|
74
|
+
if (typeof value !== 'object' || value === null) {
|
|
75
|
+
return { ok: false, reason: '请求须为 JSON 对象' };
|
|
76
|
+
}
|
|
77
|
+
const verb = value.verb;
|
|
78
|
+
const schema = typeof verb === 'string' ? SCHEMAS_BY_VERB[verb] : undefined;
|
|
79
|
+
if (schema === undefined) {
|
|
80
|
+
return { ok: false, reason: `请求动词不识别(verb=${String(verb)}——闭集外或缺席)` };
|
|
81
|
+
}
|
|
82
|
+
if (!Value.Check(schema, value)) {
|
|
83
|
+
// 逐字段首错定位(fail-loud 可行动报因——webui 微路由同纪律)
|
|
84
|
+
const errors = [...Value.Errors(schema, value)];
|
|
85
|
+
const first = errors[0];
|
|
86
|
+
const at = first === undefined ? '' : `(${first.instancePath || '(root)'}:${first.message})`;
|
|
87
|
+
return { ok: false, reason: `${verb} 请求载荷不合 schema${at}` };
|
|
88
|
+
}
|
|
89
|
+
// Value.Check 通过即结构吻合 SdkRequest 判别联合——窄化断言位
|
|
90
|
+
return { ok: true, value: value };
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../../../src/channels/sdk/schema.ts"],"names":[],"mappings":"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"}
|