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,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 事件分派四模式(04 §6「作用域与事件四模式」后半——分派契约)。
|
|
3
|
+
*
|
|
4
|
+
* 四模式(模式是事件契约的一部分):
|
|
5
|
+
* - emit:广播——全部监听器各跑各,异常互相隔离(单腿炸不波及他腿与调用方);
|
|
6
|
+
* - waterfall:串行管线——监听器必须调 next() 委托、不调即短路(管线后段
|
|
7
|
+
* 不再执行;守门行语义依赖它);异常沿链传播(管线失败);
|
|
8
|
+
* - parallel:全体并发,Promise.all 收口(异常传播);
|
|
9
|
+
* - serial:排队串行(不短路,与 waterfall 的区别 = 无委托链);异常隔离
|
|
10
|
+
* 不停后段(上报后继续)。
|
|
11
|
+
*
|
|
12
|
+
* 词汇纪律:自定义事件名走域名前缀(件/插件域);未注册词 emit/on 均
|
|
13
|
+
* fail-loud(EVENT_NOT_REGISTERED)、撞名 EVENT_DUPLICATE 拒静默覆盖。
|
|
14
|
+
*/
|
|
15
|
+
import { BaseError } from '../contracts/index.js';
|
|
16
|
+
/**
|
|
17
|
+
* 事件分派器:词汇注册表 + 四模式派发。一个 ctx 一枚(装载运行时的通信契约
|
|
18
|
+
* 单源——双实现 = 通信割裂)。
|
|
19
|
+
*/
|
|
20
|
+
export class EventDispatch {
|
|
21
|
+
/** 词汇注册表(name → 已注册标记;单源执法面) */
|
|
22
|
+
registered = new Set();
|
|
23
|
+
/** 监听器表(name → 注册序监听器列表;on 返回退订闭包;泛型在存储侧擦除为 unknown、取回侧 cast 还原) */
|
|
24
|
+
listeners = new Map();
|
|
25
|
+
/** serial 排队尾(per-name 链式 promise——排队串行) */
|
|
26
|
+
serialQueues = new Map();
|
|
27
|
+
/** 隔离腿异常上报(缺省 stderr 直写;装配根接 logger) */
|
|
28
|
+
onListenerError;
|
|
29
|
+
constructor(options) {
|
|
30
|
+
this.onListenerError =
|
|
31
|
+
options?.onListenerError ??
|
|
32
|
+
((eventName, err) => {
|
|
33
|
+
// 缺省面:stderr 直写(context 自身的 logger 尚未装配——先有鸡问题)
|
|
34
|
+
console.error(`[context] 事件监听器异常(${eventName})`, err);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/** 注册事件词汇(装载期声明面);撞名拒 EVENT_DUPLICATE(禁静默覆盖) */
|
|
38
|
+
registerEventNames(names) {
|
|
39
|
+
for (const name of names) {
|
|
40
|
+
if (this.registered.has(name)) {
|
|
41
|
+
throw new BaseError('EVENT_DUPLICATE', `事件词汇 ${name} 已注册——拒静默覆盖(词汇注册表单源)`);
|
|
42
|
+
}
|
|
43
|
+
this.registered.add(name);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** 判别词汇是否已注册(装配断言/诊断面) */
|
|
47
|
+
isRegistered(name) {
|
|
48
|
+
return this.registered.has(name);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 挂通知型监听器(emit/serial 共用监听面——同词两模式收同一监听器形态)。
|
|
52
|
+
* 词未注册拒 EVENT_NOT_REGISTERED(fail-loud 禁散播未声明事件名)。
|
|
53
|
+
* @returns 退订闭包(消费方经 scope.effect 组合生命周期)
|
|
54
|
+
*/
|
|
55
|
+
on(name, listener) {
|
|
56
|
+
this.assertRegistered(name);
|
|
57
|
+
const list = this.listeners.get(name) ?? [];
|
|
58
|
+
const entry = { notify: listener };
|
|
59
|
+
list.push(entry);
|
|
60
|
+
this.listeners.set(name, list);
|
|
61
|
+
return () => {
|
|
62
|
+
const current = this.listeners.get(name);
|
|
63
|
+
if (!current)
|
|
64
|
+
return;
|
|
65
|
+
const idx = current.indexOf(entry);
|
|
66
|
+
if (idx >= 0)
|
|
67
|
+
current.splice(idx, 1);
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 广播:全部监听器并发各跑各,异常互相隔离(单腿炸不波及他腿与调用方——
|
|
72
|
+
* 上报 onListenerError 后照常收口)。
|
|
73
|
+
*/
|
|
74
|
+
async emit(name, data) {
|
|
75
|
+
this.assertRegistered(name);
|
|
76
|
+
const legs = (this.listeners.get(name) ?? []).map((entry) => entry.notify);
|
|
77
|
+
await Promise.all(legs.map(async (listener) => {
|
|
78
|
+
try {
|
|
79
|
+
await listener?.(data);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
this.onListenerError(name, err);
|
|
83
|
+
}
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 串行管线:监听器必须调 next(value) 委托——不调即短路(管线后段不再执行,
|
|
88
|
+
* 返回值为该监听器的产出);异常沿链传播(管线失败语义——守门行依赖)。
|
|
89
|
+
*/
|
|
90
|
+
async waterfall(name, value) {
|
|
91
|
+
this.assertRegistered(name);
|
|
92
|
+
// 存储侧泛型擦除为 unknown——取回 cast 还原为本次调用的 T(注册/派发两侧的
|
|
93
|
+
// 类型对齐由调用方契约保证,这里只做类型往返)
|
|
94
|
+
const chain = (this.listeners.get(name) ?? []).map((entry) => entry.waterfall).filter(Boolean);
|
|
95
|
+
// 自尾向头组合:每层 next 即下一段;尾 = 直通(value 原样出管线)
|
|
96
|
+
let next = (v) => Promise.resolve(v);
|
|
97
|
+
for (const listener of chain.reverse()) {
|
|
98
|
+
const downstream = next;
|
|
99
|
+
next = (v) => Promise.resolve(listener(v, downstream));
|
|
100
|
+
}
|
|
101
|
+
return next(value);
|
|
102
|
+
}
|
|
103
|
+
/** 挂管线监听器(waterfall 专用面——与 on 分开:形态不同防误用) */
|
|
104
|
+
onWaterfall(name, listener) {
|
|
105
|
+
this.assertRegistered(name);
|
|
106
|
+
const list = this.listeners.get(name) ?? [];
|
|
107
|
+
const entry = { waterfall: listener };
|
|
108
|
+
list.push(entry);
|
|
109
|
+
this.listeners.set(name, list);
|
|
110
|
+
return () => {
|
|
111
|
+
const current = this.listeners.get(name);
|
|
112
|
+
if (!current)
|
|
113
|
+
return;
|
|
114
|
+
const idx = current.indexOf(entry);
|
|
115
|
+
if (idx >= 0)
|
|
116
|
+
current.splice(idx, 1);
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 全体并发,Promise.all 收口(异常传播——与 emit 的区别即异常语义)。
|
|
121
|
+
* 监听器面与 on 共用(通知型返回值参与收口)。
|
|
122
|
+
*/
|
|
123
|
+
async parallel(name, data) {
|
|
124
|
+
this.assertRegistered(name);
|
|
125
|
+
const legs = (this.listeners.get(name) ?? []).map((entry) => entry.notify);
|
|
126
|
+
const results = await Promise.all(legs.map((listener) => Promise.resolve(listener ? listener(data) : undefined)));
|
|
127
|
+
// 监听器返回面 unknown(通知型契约)——收口侧由调用方以 R 断言(并发计算型的
|
|
128
|
+
// 类型对齐是调用方契约,存储侧无从静态验证)
|
|
129
|
+
return results;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 排队串行:逐监听器顺序执行(后段等前段完成);不短路——异常隔离上报后
|
|
133
|
+
* 继续下一段(与 waterfall 的区别 = 无委托链、异常不停段)。
|
|
134
|
+
* 同词多次派发按到达序排队(per-name 链式 promise)。
|
|
135
|
+
*/
|
|
136
|
+
serial(name, data) {
|
|
137
|
+
this.assertRegistered(name);
|
|
138
|
+
const legs = (this.listeners.get(name) ?? []).map((entry) => entry.notify);
|
|
139
|
+
const tail = this.serialQueues.get(name) ?? Promise.resolve();
|
|
140
|
+
const run = tail.then(async () => {
|
|
141
|
+
for (const listener of legs) {
|
|
142
|
+
try {
|
|
143
|
+
await listener?.(data);
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
this.onListenerError(name, err);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
// 队尾吞异常(隔离语义:一次派发的失败不堵后续派发的排队)
|
|
151
|
+
this.serialQueues.set(name, run.then(() => undefined, () => undefined));
|
|
152
|
+
return run;
|
|
153
|
+
}
|
|
154
|
+
/** 未注册词执法(emit/on/waterfall/parallel/serial 共用) */
|
|
155
|
+
assertRegistered(name) {
|
|
156
|
+
if (!this.registered.has(name)) {
|
|
157
|
+
throw new BaseError('EVENT_NOT_REGISTERED', `事件词 ${name} 未注册——fail-loud(词汇注册表单源,先 registerEventNames)`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../../src/context/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* context 模块公开面(L1 运行时基座——02 §2.2;一切件在其上)。
|
|
3
|
+
*
|
|
4
|
+
* 本批落码:作用域(effect LIFO 回卷/fork 级联/stale 护栏)+ 事件分派四模式
|
|
5
|
+
* + provide/get 服务注册表 + 自写 logger + canonical 工作区根。
|
|
6
|
+
* jiti 加载原语与目录信任判定随 host 装载批定形(消费面 = 插件装载器——
|
|
7
|
+
* 契约先于实现的纵切序),02 §2.2 职责清单不变。
|
|
8
|
+
*/
|
|
9
|
+
import './codes.js';
|
|
10
|
+
export { Scope, SCOPE_EFFECT_CAPACITY } from './scope.js';
|
|
11
|
+
export type { Disposer } from './scope.js';
|
|
12
|
+
export { EventDispatch } from './events.js';
|
|
13
|
+
export type { NotifyListener, WaterfallListener, ListenerErrorReporter } from './events.js';
|
|
14
|
+
export { LogLevelState, createLogger, childLogger } from './logger.js';
|
|
15
|
+
export type { LogLevel, LogSink, Logger } from './logger.js';
|
|
16
|
+
export { canonicalWorkspaceRoot, clearWorkspaceRootCache } from './workspace.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* context 模块公开面(L1 运行时基座——02 §2.2;一切件在其上)。
|
|
3
|
+
*
|
|
4
|
+
* 本批落码:作用域(effect LIFO 回卷/fork 级联/stale 护栏)+ 事件分派四模式
|
|
5
|
+
* + provide/get 服务注册表 + 自写 logger + canonical 工作区根。
|
|
6
|
+
* jiti 加载原语与目录信任判定随 host 装载批定形(消费面 = 插件装载器——
|
|
7
|
+
* 契约先于实现的纵切序),02 §2.2 职责清单不变。
|
|
8
|
+
*/
|
|
9
|
+
import './codes.js';
|
|
10
|
+
export { Scope, SCOPE_EFFECT_CAPACITY } from './scope.js';
|
|
11
|
+
export { EventDispatch } from './events.js';
|
|
12
|
+
export { LogLevelState, createLogger, childLogger } from './logger.js';
|
|
13
|
+
export { canonicalWorkspaceRoot, clearWorkspaceRootCache } from './workspace.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/context/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,YAAY,CAAC;AAEpB,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 自写轻量 logger(07 §6 日志级别策略——约百行,不引入日志库)。
|
|
3
|
+
*
|
|
4
|
+
* 细则逐条:
|
|
5
|
+
* - 级别四档 error/warn/info/debug + silent 全静默;缺省 info(发布物即生产);
|
|
6
|
+
* - 结构化 JSON 行(time/level/module/msg + 上下文字段)写 stderr;
|
|
7
|
+
* - 模块前缀分级:BERRY_AGENT_LOG_LEVEL 逗号分隔 per-module 条目
|
|
8
|
+
* (`info,session:debug`);条目按 lastIndexOf(':') 切分(模块名含冒号可表达
|
|
9
|
+
* ——`core:memory` 里的冒号不是分隔符);前缀匹配(`session` 命中 `session`
|
|
10
|
+
* 与 `session:*` 全体);
|
|
11
|
+
* - 共享阈值盒:同盒树的 logger 持同一盒引用,setLevel 改盒值全树即时生效;
|
|
12
|
+
* child logger 不入登记表(防慢性泄漏);
|
|
13
|
+
* - 无效条目 stderr 警告后跳过(视同未设——静默失效比无反馈更糟);
|
|
14
|
+
* - 纪律红线(消费方义务):只在 debug 出现的分支,其行为必须同时是 durable
|
|
15
|
+
* 事件或运行时断言——进程日志职责收窄为「启动/崩溃/守门/恢复」诊断。
|
|
16
|
+
*/
|
|
17
|
+
/** 级别权重(数值越大越啰嗦——debug 3 最详;silent 独立档不入权重表) */
|
|
18
|
+
declare const LEVEL_WEIGHTS: {
|
|
19
|
+
readonly error: 0;
|
|
20
|
+
readonly warn: 1;
|
|
21
|
+
readonly info: 2;
|
|
22
|
+
readonly debug: 3;
|
|
23
|
+
};
|
|
24
|
+
export type LogLevel = keyof typeof LEVEL_WEIGHTS | 'silent';
|
|
25
|
+
/** 日志输出面(缺省 process.stderr;测试注入内存 sink) */
|
|
26
|
+
export type LogSink = (line: string) => void;
|
|
27
|
+
/**
|
|
28
|
+
* 阈值盒(共享状态):全局级 + per-module 前缀覆盖表。
|
|
29
|
+
* createLogger 树全体持同一盒引用——setGlobalLevel/setModuleLevel 改盒即全树
|
|
30
|
+
* 即时生效;盒本身即解析态,logger 对象不入任何登记表。
|
|
31
|
+
*/
|
|
32
|
+
export declare class LogLevelState {
|
|
33
|
+
/** 全局阈值(缺省 info——发布物即生产) */
|
|
34
|
+
private global;
|
|
35
|
+
/** per-module 前缀覆盖(前缀 → 级别;匹配取最长前缀) */
|
|
36
|
+
private readonly modules;
|
|
37
|
+
/** 从 env 串建盒(无效条目 stderr 警告后跳过——视同未设) */
|
|
38
|
+
static fromEnv(env: string | undefined, warn?: (msg: string) => void): LogLevelState;
|
|
39
|
+
/** 改全局阈值(全树即时生效——运行期提降级面) */
|
|
40
|
+
setGlobalLevel(level: LogLevel): void;
|
|
41
|
+
/** 设/覆盖某模块前缀阈值(前缀匹配:`session` 命中 `session` 与 `session:*` 全体) */
|
|
42
|
+
setModuleLevel(prefix: string, level: LogLevel): void;
|
|
43
|
+
/** 解析模块生效级:最长匹配前缀条目 ?? 全局(silent 压倒一切——显式全静默) */
|
|
44
|
+
resolve(module: string): LogLevel;
|
|
45
|
+
}
|
|
46
|
+
/** logger 实例形态(模块名绑定的四方法输出器——纯值对象,不入登记表) */
|
|
47
|
+
export interface Logger {
|
|
48
|
+
readonly module: string;
|
|
49
|
+
debug(msg: string, fields?: Record<string, unknown>): void;
|
|
50
|
+
info(msg: string, fields?: Record<string, unknown>): void;
|
|
51
|
+
warn(msg: string, fields?: Record<string, unknown>): void;
|
|
52
|
+
error(msg: string, fields?: Record<string, unknown>): void;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 建模块 logger(child 面共享 state 盒——树内全树同盒即时生效)。
|
|
56
|
+
* @param module 模块名(域分段用 ':'——如 `session`、`core:memory`)
|
|
57
|
+
* @param state 共享阈值盒(缺省独立盒 info——测试/独立小面用;ctx 装配时传同一盒)
|
|
58
|
+
* @param sink 输出面(缺省 process.stderr;测试注入内存)
|
|
59
|
+
* @param clock 时间源(缺省 Date.now——测试可注入定值)
|
|
60
|
+
*/
|
|
61
|
+
export declare function createLogger(module: string, state?: LogLevelState, sink?: LogSink, clock?: () => number): Logger;
|
|
62
|
+
/**
|
|
63
|
+
* 派生 child logger(`session` → `session:sqlite` 式域细分):同盒同 sink 同
|
|
64
|
+
* clock——setLevel 改盒全树(含 child)即时生效。仅接受 createLogger 产物。
|
|
65
|
+
*/
|
|
66
|
+
export declare function childLogger(parent: Logger, subModule: string): Logger;
|
|
67
|
+
export {};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 自写轻量 logger(07 §6 日志级别策略——约百行,不引入日志库)。
|
|
3
|
+
*
|
|
4
|
+
* 细则逐条:
|
|
5
|
+
* - 级别四档 error/warn/info/debug + silent 全静默;缺省 info(发布物即生产);
|
|
6
|
+
* - 结构化 JSON 行(time/level/module/msg + 上下文字段)写 stderr;
|
|
7
|
+
* - 模块前缀分级:BERRY_AGENT_LOG_LEVEL 逗号分隔 per-module 条目
|
|
8
|
+
* (`info,session:debug`);条目按 lastIndexOf(':') 切分(模块名含冒号可表达
|
|
9
|
+
* ——`core:memory` 里的冒号不是分隔符);前缀匹配(`session` 命中 `session`
|
|
10
|
+
* 与 `session:*` 全体);
|
|
11
|
+
* - 共享阈值盒:同盒树的 logger 持同一盒引用,setLevel 改盒值全树即时生效;
|
|
12
|
+
* child logger 不入登记表(防慢性泄漏);
|
|
13
|
+
* - 无效条目 stderr 警告后跳过(视同未设——静默失效比无反馈更糟);
|
|
14
|
+
* - 纪律红线(消费方义务):只在 debug 出现的分支,其行为必须同时是 durable
|
|
15
|
+
* 事件或运行时断言——进程日志职责收窄为「启动/崩溃/守门/恢复」诊断。
|
|
16
|
+
*/
|
|
17
|
+
/** 级别权重(数值越大越啰嗦——debug 3 最详;silent 独立档不入权重表) */
|
|
18
|
+
const LEVEL_WEIGHTS = { error: 0, warn: 1, info: 2, debug: 3 };
|
|
19
|
+
/**
|
|
20
|
+
* 阈值盒(共享状态):全局级 + per-module 前缀覆盖表。
|
|
21
|
+
* createLogger 树全体持同一盒引用——setGlobalLevel/setModuleLevel 改盒即全树
|
|
22
|
+
* 即时生效;盒本身即解析态,logger 对象不入任何登记表。
|
|
23
|
+
*/
|
|
24
|
+
export class LogLevelState {
|
|
25
|
+
/** 全局阈值(缺省 info——发布物即生产) */
|
|
26
|
+
global = 'info';
|
|
27
|
+
/** per-module 前缀覆盖(前缀 → 级别;匹配取最长前缀) */
|
|
28
|
+
modules = new Map();
|
|
29
|
+
/** 从 env 串建盒(无效条目 stderr 警告后跳过——视同未设) */
|
|
30
|
+
static fromEnv(env, warn = defaultEnvWarn) {
|
|
31
|
+
const state = new LogLevelState();
|
|
32
|
+
if (!env)
|
|
33
|
+
return state;
|
|
34
|
+
for (const rawEntry of env.split(',')) {
|
|
35
|
+
const entry = rawEntry.trim();
|
|
36
|
+
if (!entry)
|
|
37
|
+
continue;
|
|
38
|
+
// lastIndexOf(':') 切分:模块名含冒号(core:memory)可表达——
|
|
39
|
+
// 最右一个冒号才是「模块:级别」分隔符
|
|
40
|
+
const sep = entry.lastIndexOf(':');
|
|
41
|
+
const levelText = sep >= 0 ? entry.slice(sep + 1) : entry;
|
|
42
|
+
const moduleText = sep >= 0 ? entry.slice(0, sep) : '';
|
|
43
|
+
const level = parseLevel(levelText);
|
|
44
|
+
if (!level) {
|
|
45
|
+
warn(`BERRY_AGENT_LOG_LEVEL 无效条目 "${entry}"(级别 "${levelText}" 不在闭集 error|warn|info|debug|silent)——已跳过`);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (sep >= 0 && moduleText)
|
|
49
|
+
state.modules.set(moduleText, level);
|
|
50
|
+
else
|
|
51
|
+
state.setGlobalLevel(level);
|
|
52
|
+
}
|
|
53
|
+
return state;
|
|
54
|
+
}
|
|
55
|
+
/** 改全局阈值(全树即时生效——运行期提降级面) */
|
|
56
|
+
setGlobalLevel(level) {
|
|
57
|
+
this.global = level;
|
|
58
|
+
}
|
|
59
|
+
/** 设/覆盖某模块前缀阈值(前缀匹配:`session` 命中 `session` 与 `session:*` 全体) */
|
|
60
|
+
setModuleLevel(prefix, level) {
|
|
61
|
+
this.modules.set(prefix, level);
|
|
62
|
+
}
|
|
63
|
+
/** 解析模块生效级:最长匹配前缀条目 ?? 全局(silent 压倒一切——显式全静默) */
|
|
64
|
+
resolve(module) {
|
|
65
|
+
if (this.global === 'silent')
|
|
66
|
+
return 'silent';
|
|
67
|
+
let best;
|
|
68
|
+
for (const [prefix, level] of this.modules) {
|
|
69
|
+
// 前缀匹配:模块名等于前缀、或以前缀+':' 开头(域分段符)
|
|
70
|
+
const matches = module === prefix || module.startsWith(`${prefix}:`);
|
|
71
|
+
if (!matches)
|
|
72
|
+
continue;
|
|
73
|
+
if (!best || prefix.length > best.prefix.length)
|
|
74
|
+
best = { prefix, level };
|
|
75
|
+
}
|
|
76
|
+
const resolved = best?.level ?? this.global;
|
|
77
|
+
return resolved === 'silent' ? 'silent' : resolved;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** 单条级别字面量解析(大小写不敏感;无效返回 null) */
|
|
81
|
+
function parseLevel(text) {
|
|
82
|
+
const lower = text.toLowerCase();
|
|
83
|
+
if (lower === 'silent')
|
|
84
|
+
return 'silent';
|
|
85
|
+
if (lower in LEVEL_WEIGHTS)
|
|
86
|
+
return lower;
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
/** env 无效值警告的缺省面(bootstrapping 阶段 stderr 一行) */
|
|
90
|
+
function defaultEnvWarn(msg) {
|
|
91
|
+
process.stderr.write(`[logger] ${msg}\n`);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* logger → 内部三件(盒/sink/clock)弱关联:childLogger 派生的唯一缝。
|
|
95
|
+
* WeakMap 不阻回收(logger 亡即条目亡——「不入登记表防慢性泄漏」的兑现形态:
|
|
96
|
+
* 强引用登记表不存在,弱关联只为派生期取参)。
|
|
97
|
+
*/
|
|
98
|
+
const loggerInternals = new WeakMap();
|
|
99
|
+
/**
|
|
100
|
+
* 建模块 logger(child 面共享 state 盒——树内全树同盒即时生效)。
|
|
101
|
+
* @param module 模块名(域分段用 ':'——如 `session`、`core:memory`)
|
|
102
|
+
* @param state 共享阈值盒(缺省独立盒 info——测试/独立小面用;ctx 装配时传同一盒)
|
|
103
|
+
* @param sink 输出面(缺省 process.stderr;测试注入内存)
|
|
104
|
+
* @param clock 时间源(缺省 Date.now——测试可注入定值)
|
|
105
|
+
*/
|
|
106
|
+
export function createLogger(module, state = new LogLevelState(), sink = (line) => process.stderr.write(`${line}\n`), clock = Date.now) {
|
|
107
|
+
const write = (level, msg, fields) => {
|
|
108
|
+
const resolved = state.resolve(module);
|
|
109
|
+
if (resolved === 'silent')
|
|
110
|
+
return;
|
|
111
|
+
if (LEVEL_WEIGHTS[level] > LEVEL_WEIGHTS[resolved])
|
|
112
|
+
return;
|
|
113
|
+
// 结构化 JSON 行:time/level/module/msg + 上下文字段平铺
|
|
114
|
+
sink(JSON.stringify({ time: clock(), level, module, msg, ...fields }));
|
|
115
|
+
};
|
|
116
|
+
const logger = {
|
|
117
|
+
module,
|
|
118
|
+
debug: (msg, fields) => write('debug', msg, fields),
|
|
119
|
+
info: (msg, fields) => write('info', msg, fields),
|
|
120
|
+
warn: (msg, fields) => write('warn', msg, fields),
|
|
121
|
+
error: (msg, fields) => write('error', msg, fields),
|
|
122
|
+
};
|
|
123
|
+
loggerInternals.set(logger, { state, sink, clock });
|
|
124
|
+
return logger;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 派生 child logger(`session` → `session:sqlite` 式域细分):同盒同 sink 同
|
|
128
|
+
* clock——setLevel 改盒全树(含 child)即时生效。仅接受 createLogger 产物。
|
|
129
|
+
*/
|
|
130
|
+
export function childLogger(parent, subModule) {
|
|
131
|
+
const internals = loggerInternals.get(parent);
|
|
132
|
+
if (!internals) {
|
|
133
|
+
throw new Error('childLogger 仅接受 createLogger 产物(缺内部面——勿手工构造 Logger 对象)');
|
|
134
|
+
}
|
|
135
|
+
return createLogger(`${parent.module}:${subModule}`, internals.state, internals.sink, internals.clock);
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../../src/context/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/** disposer 形态:同步或异步清理函数(effect 登记的回卷腿)。返回 void——TS 的 void 返回豁免天然吸收 async 腿(Promise 返回值可赋 void 返回位) */
|
|
2
|
+
export type Disposer = () => void;
|
|
3
|
+
/**
|
|
4
|
+
* effect 总注册帽(03 §3.4:10^4——可用性防线,失控登记不拖垮回卷序)。
|
|
5
|
+
* 真源即执法位点:自有 disposers 长度即计数,无第二计数位(包装层形否决——
|
|
6
|
+
* 帽下帽双重记账〔03 §3.4 遗漏审计批钉位〕);fork 面独立同律(子作用域
|
|
7
|
+
* 各有自有帽,级联回卷总量不受限)。导出供测试与文档引用。
|
|
8
|
+
*/
|
|
9
|
+
export declare const SCOPE_EFFECT_CAPACITY = 10000;
|
|
10
|
+
/**
|
|
11
|
+
* 作用域:服务注册面(provide/get)+ 可逆注册面(effect)+ fork 树。
|
|
12
|
+
* 生命周期三级(进程根/会话/run)= 三次 createScope/fork 的使用形态。
|
|
13
|
+
*/
|
|
14
|
+
export declare class Scope {
|
|
15
|
+
/** 父作用域(fork 派生关系;根作用域为 undefined) */
|
|
16
|
+
private readonly parent?;
|
|
17
|
+
/** 自有服务注册(fork 面继承 = get 沿父链上溯;子重提供同名 = 遮蔽合法) */
|
|
18
|
+
private readonly services;
|
|
19
|
+
/**
|
|
20
|
+
* 服务主位账(同主刷新律——04 §6 定形注:/reload 撬名修复批)。键值与
|
|
21
|
+
* services 同集(每次成功 provide 同步落位;匿名提供 = undefined 位)。
|
|
22
|
+
* 刷新判据专用,不另设公共读面。
|
|
23
|
+
*/
|
|
24
|
+
private readonly owners;
|
|
25
|
+
/** 已登记 disposer(登记序)——回卷按逆序 LIFO */
|
|
26
|
+
private readonly disposers;
|
|
27
|
+
/** 未回卷的子作用域(父回卷时级联先卷) */
|
|
28
|
+
private readonly children;
|
|
29
|
+
/** 回卷旗标(stale 护栏判据;回卷后一切迟到登记拒) */
|
|
30
|
+
private disposed;
|
|
31
|
+
/** @param parent 父作用域(缺省 = 根作用域);派生走 fork() 不直调本构造器 */
|
|
32
|
+
private constructor();
|
|
33
|
+
/** 创建根作用域(进程根/会话/run 三级的使用入口之一) */
|
|
34
|
+
static createRoot(): Scope;
|
|
35
|
+
/**
|
|
36
|
+
* 派生子作用域:子先于父回卷(逆序天然)、父回卷级联全部未卷子;
|
|
37
|
+
* provide 面继承(get 上溯)、effect 面独立(子的副作用不污染父的回卷序)。
|
|
38
|
+
*/
|
|
39
|
+
fork(): Scope;
|
|
40
|
+
/** 作用域是否已回卷(异步腿竞速收口的 stale 判据) */
|
|
41
|
+
get isDisposed(): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* 登记服务(装载期接线、运行期取用)。
|
|
44
|
+
* 撞名分档(同主刷新律——04 §6 定形注):同 owner 重供 = 原位刷新
|
|
45
|
+
* (upsert——依赖方下次取用即见新值;`/reload` 换代重跑同装配位的结构性
|
|
46
|
+
* 支撑);跨主撞名与匿名重供(任一方匿名即不可证明同主)照旧拒
|
|
47
|
+
* CONTEXT_SERVICE_DUPLICATE(两方抢一名仍是装配 bug)。
|
|
48
|
+
* owner 真源 = 装载器注入非自报(ctx.provide 恒 = 本插件 id——包装层注入;
|
|
49
|
+
* 宿主装配位 = 装配位标识)。迟到注册(已回卷)拒 SCOPE_STALE。
|
|
50
|
+
*/
|
|
51
|
+
provide(name: string, service: unknown, owner?: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* 取服务(沿 fork 链上溯——provide 面继承)。
|
|
54
|
+
* 缺席 fail-loud(CONTEXT_SERVICE_MISSING,拼错名立即炸)。
|
|
55
|
+
* 判缺席用沿链 has 而非值判 undefined——已注册的 undefined 值服务不算缺席。
|
|
56
|
+
*/
|
|
57
|
+
get<T>(name: string): T;
|
|
58
|
+
/** 可选消费(「诚实缺席不 fail-loud」的唯一档——如浏览器引擎缺席) */
|
|
59
|
+
tryGet<T>(name: string): T | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* 沿 fork 链枚举可见服务名(自身 + 全部祖先,就近在前)。
|
|
62
|
+
* 03 §3.1「服务目录运行时可枚举」的机制腿——ctx.get 缺席报错附现行名单,
|
|
63
|
+
* 点名错误当场响亮可诊。子遮蔽父同名时两现(就近位次即遮蔽序——诚实枚举)。
|
|
64
|
+
*/
|
|
65
|
+
serviceNames(): string[];
|
|
66
|
+
/**
|
|
67
|
+
* 登记可逆副作用:register 立即执行、其返回的 disposer 进 LIFO 回卷序。
|
|
68
|
+
* 迟到登记(已回卷)拒 SCOPE_STALE——迟到的 disposer 不再执行(回卷已过,
|
|
69
|
+
* 补跑只会撕裂状态)。
|
|
70
|
+
*/
|
|
71
|
+
effect(register: () => Disposer): void;
|
|
72
|
+
/**
|
|
73
|
+
* 回卷作用域:子先级联回卷 → 自有 disposer 按 LIFO 逆序回卷 → 标记 disposed。
|
|
74
|
+
* 幂等(二次调用直接返回);disposer 异常不中断回卷(清算是尽力序——
|
|
75
|
+
* 单腿炸不掩护其余腿的清算义务)。
|
|
76
|
+
*/
|
|
77
|
+
dispose(): Promise<void>;
|
|
78
|
+
}
|