@migor/agentia 0.10.2 → 0.10.4
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/CHANGELOG.md +969 -64
- package/LICENSE +1 -1
- package/README.en.md +93 -38
- package/README.md +105 -218
- package/dist/AGENTS.md +234 -41
- package/dist/core/limits.d.ts +33 -1
- package/dist/core/limits.js +37 -1
- package/dist/core/limits.js.map +1 -1
- package/dist/core/run.d.ts +2 -2
- package/dist/core/timeout.d.ts +5 -5
- package/dist/core/timeout.js +5 -5
- package/dist/core/tool.d.ts +2 -2
- package/dist/core/trace-sink.d.ts +8 -0
- package/dist/core/trace-sink.js +24 -0
- package/dist/core/trace-sink.js.map +1 -0
- package/dist/core/trace.d.ts +12 -2
- package/dist/core/trace.js +10 -1
- package/dist/core/trace.js.map +1 -1
- package/dist/engine/concurrency.d.ts +1 -1
- package/dist/engine/concurrency.js +1 -1
- package/dist/engine/errors.d.ts +2 -2
- package/dist/engine/errors.js +2 -2
- package/dist/engine/loop-result.d.ts +3 -3
- package/dist/engine/loop.js +99 -56
- package/dist/engine/loop.js.map +1 -1
- package/dist/engine/mcp-server-http.js +1 -1
- package/dist/engine/mcp-server-http.js.map +1 -1
- package/dist/engine/mcp-server-stdio.js +7 -3
- package/dist/engine/mcp-server-stdio.js.map +1 -1
- package/dist/engine/mcp-server.d.ts +17 -2
- package/dist/engine/mcp-server.js +42 -17
- package/dist/engine/mcp-server.js.map +1 -1
- package/dist/engine/resume-input.d.ts +1 -1
- package/dist/engine/resume-input.js +1 -1
- package/dist/engine/retry.d.ts +15 -0
- package/dist/engine/retry.js +51 -2
- package/dist/engine/retry.js.map +1 -1
- package/dist/engine/span-scope.d.ts +15 -0
- package/dist/engine/span-scope.js +8 -1
- package/dist/engine/span-scope.js.map +1 -1
- package/dist/engine/spec.d.ts +5 -1
- package/dist/engine/spec.js.map +1 -1
- package/dist/engine/tracer.d.ts +8 -4
- package/dist/engine/tracer.js +24 -17
- package/dist/engine/tracer.js.map +1 -1
- package/dist/engine/turn.d.ts +2 -2
- package/dist/engine/turn.js +19 -4
- package/dist/engine/turn.js.map +1 -1
- package/dist/engine/types.d.ts +13 -5
- package/dist/engine/types.js +1 -0
- package/dist/engine/types.js.map +1 -1
- package/dist/eval/export.js +2 -2
- package/dist/eval/export.js.map +1 -1
- package/dist/eval/harvest.d.ts +4 -1
- package/dist/eval/harvest.js +32 -6
- package/dist/eval/harvest.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/integrations/anthropic.d.ts +1 -1
- package/dist/integrations/anthropic.js +1 -1
- package/dist/integrations/anthropic.js.map +1 -1
- package/dist/integrations/file-sink.d.ts +0 -16
- package/dist/integrations/file-sink.js +24 -6
- package/dist/integrations/file-sink.js.map +1 -1
- package/dist/integrations/mcp-http.js +4 -3
- package/dist/integrations/mcp-http.js.map +1 -1
- package/dist/integrations/mcp-protocol.d.ts +35 -10
- package/dist/integrations/mcp-protocol.js +19 -1
- package/dist/integrations/mcp-protocol.js.map +1 -1
- package/dist/integrations/mcp-stdio.js +91 -50
- package/dist/integrations/mcp-stdio.js.map +1 -1
- package/dist/integrations/mcp.d.ts +1 -1
- package/dist/integrations/mcp.js +19 -3
- package/dist/integrations/mcp.js.map +1 -1
- package/dist/integrations/metrics-otlp.d.ts +1 -1
- package/dist/integrations/metrics-otlp.js +8 -2
- package/dist/integrations/metrics-otlp.js.map +1 -1
- package/dist/integrations/metrics-render.js +17 -6
- package/dist/integrations/metrics-render.js.map +1 -1
- package/dist/integrations/metrics-state.d.ts +2 -2
- package/dist/integrations/metrics-state.js +4 -4
- package/dist/integrations/metrics-state.js.map +1 -1
- package/dist/integrations/metrics.d.ts +2 -2
- package/dist/integrations/otlp.d.ts +29 -6
- package/dist/integrations/otlp.js +128 -7
- package/dist/integrations/otlp.js.map +1 -1
- package/dist/integrations/report.d.ts +14 -2
- package/dist/integrations/report.js +39 -6
- package/dist/integrations/report.js.map +1 -1
- package/dist/runtime/run.d.ts +1 -1
- package/dist/runtime/run.js +19 -17
- package/dist/runtime/run.js.map +1 -1
- package/dist/store/fsStore.js +9 -5
- package/dist/store/fsStore.js.map +1 -1
- package/dist/store/record.d.ts +2 -2
- package/dist/store/record.js +1 -1
- package/dist/store/sqliteStore.d.ts +2 -2
- package/dist/store/sqliteStore.js +3 -3
- package/dist/store/sqliteStore.js.map +1 -1
- package/dist/store/store.d.ts +27 -7
- package/dist/store/store.js +43 -5
- package/dist/store/store.js.map +1 -1
- package/dist/toolkit/collect.d.ts +11 -5
- package/dist/toolkit/collect.js +10 -4
- package/dist/toolkit/collect.js.map +1 -1
- package/dist/toolkit/discover.js +27 -1
- package/dist/toolkit/discover.js.map +1 -1
- package/dist/toolkit/module.js +183 -50
- package/dist/toolkit/module.js.map +1 -1
- package/dist/toolkit/prompt.d.ts +1 -1
- package/dist/toolkit/prompt.js +2 -2
- package/dist/toolkit/prompt.js.map +1 -1
- package/dist/toolkit/subagent.d.ts +1 -1
- package/dist/toolkit/subagent.js +17 -3
- package/dist/toolkit/subagent.js.map +1 -1
- package/dist/transport/approval-policy.js +1 -1
- package/dist/transport/approval-policy.js.map +1 -1
- package/dist/transport/approval-supervisor.d.ts +8 -0
- package/dist/transport/approval-supervisor.js +23 -3
- package/dist/transport/approval-supervisor.js.map +1 -1
- package/dist/transport/async.d.ts +3 -0
- package/dist/transport/async.js +128 -25
- package/dist/transport/async.js.map +1 -1
- package/dist/transport/http-endpoints.js +1 -1
- package/dist/transport/http-route.js +2 -2
- package/dist/transport/http-route.js.map +1 -1
- package/dist/transport/http-shapes.d.ts +1 -1
- package/dist/transport/http-shapes.js +1 -1
- package/dist/transport/resume-scanner.d.ts +7 -0
- package/dist/transport/resume-scanner.js +40 -9
- package/dist/transport/resume-scanner.js.map +1 -1
- package/dist/transport/run-call-options.js +7 -3
- package/dist/transport/run-call-options.js.map +1 -1
- package/dist/transport/scheduler.js +5 -0
- package/dist/transport/scheduler.js.map +1 -1
- package/dist/transport/serve.d.ts +92 -0
- package/dist/transport/serve.js +155 -0
- package/dist/transport/serve.js.map +1 -0
- package/dist/transport/signal-supervisor.d.ts +10 -2
- package/dist/transport/signal-supervisor.js +15 -2
- package/dist/transport/signal-supervisor.js.map +1 -1
- package/dist/transport/wake-policy.d.ts +1 -1
- package/package.json +23 -10
package/dist/runtime/run.js
CHANGED
|
@@ -3,6 +3,7 @@ import { runAgent } from '../engine/loop.js';
|
|
|
3
3
|
import { TraceRecorder, resolveTraceLimits } from '../engine/tracer.js';
|
|
4
4
|
import { classifyError } from '../engine/errors.js';
|
|
5
5
|
import { RunContext, withRunContext } from './context.js';
|
|
6
|
+
import { flushTraceSinks } from '../core/trace-sink.js';
|
|
6
7
|
/**
|
|
7
8
|
* Run —— 一次运行的生命周期容器(spec §2/§6.1)。
|
|
8
9
|
* runId == recorder.traceId == traceId(1:1)。
|
|
@@ -217,6 +218,12 @@ const EMPTY_REPLY_MARK = '(本次无文本输出)';
|
|
|
217
218
|
/**
|
|
218
219
|
* 读会话历史,拼在传入 messages 之前。失败当「无历史」继续 ——
|
|
219
220
|
* 与 memory 水合同款防护:辅助动作失败不得击穿 run。
|
|
221
|
+
*
|
|
222
|
+
* ⚠️ 但**不再零信号**(2026-10-16 ref-session-failure-loud,与 `flushSinks` / memory 回写
|
|
223
|
+
* 同款纪律):吞之前落一条 `console.warn`。理由是本处失败的**形状最坏** —— 它没有
|
|
224
|
+
* 「报错」,只是让本次 run 变成「第一轮」,而下一次 `append` 会把坏的那份覆盖掉 ⇒
|
|
225
|
+
* **整段对话历史无声消失**,使用者只会觉得「它忘了」。没有这条告警时,唯一的可见性
|
|
226
|
+
* 出口是 dev runner 启动期那次探测(生产路径根本没有)。
|
|
220
227
|
*/
|
|
221
228
|
async function loadSession(session, incoming) {
|
|
222
229
|
if (!session)
|
|
@@ -225,12 +232,16 @@ async function loadSession(session, incoming) {
|
|
|
225
232
|
const history = await session.store.load(session.id);
|
|
226
233
|
return history.length > 0 ? [...history, ...incoming] : incoming;
|
|
227
234
|
}
|
|
228
|
-
catch {
|
|
235
|
+
catch (e) {
|
|
236
|
+
console.warn('[agentia] 会话历史读取失败,本次 run 按「没有历史」继续(多轮会表现为这是第一轮):' +
|
|
237
|
+
(e instanceof Error ? e.message : String(e)));
|
|
229
238
|
return incoming;
|
|
230
239
|
}
|
|
231
240
|
}
|
|
232
241
|
/**
|
|
233
|
-
* 把本轮消息 + 回复追加回会话(**只在成功路径调用**)。失败吞掉(同 memory
|
|
242
|
+
* 把本轮消息 + 回复追加回会话(**只在成功路径调用**)。失败吞掉(同 memory 回写防护),
|
|
243
|
+
* 但**不再零信号**:吞之前落一条 `console.warn`(2026-10-16 ref-session-failure-loud,
|
|
244
|
+
* 同 `loadSession` 那条理由 —— 写失败 = 这一轮白聊,下一个 run 看不到它)。
|
|
234
245
|
*
|
|
235
246
|
* 三条不变量(都是为了下一轮还能把这个历史发出去):
|
|
236
247
|
* 1. **只有成功路径回写** —— 失败时若只存下用户的提问,历史就会以 user 结尾,
|
|
@@ -252,8 +263,9 @@ async function appendSession(session, incoming, finalText) {
|
|
|
252
263
|
{ role: 'assistant', content: finalText || EMPTY_REPLY_MARK },
|
|
253
264
|
]);
|
|
254
265
|
}
|
|
255
|
-
catch {
|
|
256
|
-
|
|
266
|
+
catch (e) {
|
|
267
|
+
console.warn('[agentia] 会话历史回写失败,本轮对话不会被记住:' +
|
|
268
|
+
(e instanceof Error ? e.message : String(e)));
|
|
257
269
|
}
|
|
258
270
|
}
|
|
259
271
|
/**
|
|
@@ -271,21 +283,11 @@ async function runBeforeFlush(hook, trace, result) {
|
|
|
271
283
|
}
|
|
272
284
|
}
|
|
273
285
|
/**
|
|
274
|
-
* 投递 trace 给所有 sink
|
|
275
|
-
*
|
|
276
|
-
* 否则 sink 天天挂、面板一切如常,「trace 根本没落盘」要等下游消费时才发现。
|
|
286
|
+
* 投递 trace 给所有 sink:抛错或永久挂起都不得影响 run 结果;
|
|
287
|
+
* 失败与超时均有 console.warn,后续 sink 仍照常接收(实现与 MCP 反向桥共用)。
|
|
277
288
|
*/
|
|
278
289
|
async function flushSinks(sinks, trace) {
|
|
279
|
-
|
|
280
|
-
return;
|
|
281
|
-
for (const sink of sinks) {
|
|
282
|
-
try {
|
|
283
|
-
await sink.export(trace);
|
|
284
|
-
}
|
|
285
|
-
catch (e) {
|
|
286
|
-
console.warn('[agentia] trace sink 投递失败:', e instanceof Error ? e.message : e);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
290
|
+
await flushTraceSinks(sinks, trace);
|
|
289
291
|
}
|
|
290
292
|
/** 水合:store 值注入 blackboard;contextInit 已写的同名 key 不覆盖(用户种子优先)。
|
|
291
293
|
* 返回本次读到的**版本句柄**(没实现 CAS 的 store 恒为 `undefined`)—— 回写时原样递回。 */
|
package/dist/runtime/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"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"}
|
package/dist/store/fsStore.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { appendFileSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, truncateSync, writeFileSync, } from 'node:fs';
|
|
2
2
|
import { dirname } from 'node:path';
|
|
3
3
|
import { parseTaskRecord } from './record.js';
|
|
4
|
+
import { cloneTaskRecord } from './store.js';
|
|
4
5
|
/**
|
|
5
6
|
* Agentia —— 文件宿主 TaskStore(spec §6.6:异步耐久 = 换宿主不换语义)。
|
|
6
7
|
*
|
|
@@ -21,7 +22,7 @@ export class FileTaskStore {
|
|
|
21
22
|
onLoadError;
|
|
22
23
|
// 刻意**不实现** `listDue`(到期索引):记录常驻内存 Map(构造期 load 之后 `list()` 只是
|
|
23
24
|
// snapshot),每轮扫描本来就便宜 —— 它真正贵的全表读在构造期,索引管不到那里
|
|
24
|
-
// (实测读数见 spec §10 2026-09-28
|
|
25
|
+
// (实测读数见 spec §10 2026-09-28 ref-due-index-measure)。runner 对缺失的 listDue 回退全表,语义不变。
|
|
25
26
|
byTask = new Map();
|
|
26
27
|
byKey = new Map(); // idempotencyKey → taskId
|
|
27
28
|
constructor(file, onLoadError) {
|
|
@@ -100,19 +101,22 @@ export class FileTaskStore {
|
|
|
100
101
|
// 「已存」而磁盘没有(append-only 日志里也没这一笔),进程重启后记录静默回退,
|
|
101
102
|
// 任务状态与持久层两本账。顺序反过来时抛错点在内存推进之后,丢的就是这个不变量。
|
|
102
103
|
this.append(rec);
|
|
103
|
-
|
|
104
|
+
// 内存同样只存副本(2026-10-13 ref-retry-validation):调用方此后对 rec 的推进不得绕过 save 直接可见
|
|
105
|
+
this.byTask.set(rec.taskId, cloneTaskRecord(rec));
|
|
104
106
|
if (rec.idempotencyKey)
|
|
105
107
|
this.byKey.set(rec.idempotencyKey, rec.taskId);
|
|
106
108
|
}
|
|
107
109
|
get(taskId) {
|
|
108
|
-
|
|
110
|
+
const rec = this.byTask.get(taskId);
|
|
111
|
+
return rec === undefined ? undefined : cloneTaskRecord(rec);
|
|
109
112
|
}
|
|
110
113
|
byIdempotency(key) {
|
|
111
114
|
const taskId = this.byKey.get(key);
|
|
112
|
-
|
|
115
|
+
const rec = taskId ? this.byTask.get(taskId) : undefined;
|
|
116
|
+
return rec === undefined ? undefined : cloneTaskRecord(rec);
|
|
113
117
|
}
|
|
114
118
|
list() {
|
|
115
|
-
return [...this.byTask.values()];
|
|
119
|
+
return [...this.byTask.values()].map(cloneTaskRecord);
|
|
116
120
|
}
|
|
117
121
|
clear() {
|
|
118
122
|
this.byTask.clear();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fsStore.js","sourceRoot":"","sources":["../../src/store/fsStore.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,UAAU,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACV,MAAM,EACN,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"fsStore.js","sourceRoot":"","sources":["../../src/store/fsStore.ts"],"names":[],"mappings":"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"}
|
package/dist/store/record.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 为什么单独成件:**落盘的数据不受类型系统保护**。`JSON.parse(raw) as TaskRecord` 里那个 `as`
|
|
5
5
|
* 是一句「我保证它是」—— TS 只检查你**写进**类型的值,不检查**盘上**的值。于是改名这类破坏性
|
|
6
|
-
* 变更(2026-09-28
|
|
6
|
+
* 变更(2026-09-28 ref-suspend-state-reason:`awaiting_approval` → `suspended` + `suspendedReason`、
|
|
7
7
|
* `approvalPendingSince` → `suspendedSince`)在这条接缝上会**静默失效**:旧记录带着一个
|
|
8
8
|
* `RunStatus` 里**已经不存在**的值被读回来,而每一处判断都按新语义去读它。
|
|
9
9
|
*
|
|
@@ -25,7 +25,7 @@ import type { TaskRecord } from './store.js';
|
|
|
25
25
|
/**
|
|
26
26
|
* 把一条记录里的旧版本形状**就地**归一,返回「有没有动过」。
|
|
27
27
|
*
|
|
28
|
-
* 目前只认 2026-09-28
|
|
28
|
+
* 目前只认 2026-09-28 ref-suspend-state-reason 那一批改名(状态值 + 挂起时刻字段)。原则:**只搬运盘上真有的东西**,
|
|
29
29
|
* 不凭空补造 —— 新形状的记录若缺 `suspendedReason`,本函数不动它(那是另一个缺陷,
|
|
30
30
|
* 不该由垫片掩盖成「看起来正常」)。
|
|
31
31
|
*
|
package/dist/store/record.js
CHANGED
|
@@ -8,7 +8,7 @@ const LEGACY_SINCE_KEY = 'approvalPendingSince';
|
|
|
8
8
|
/**
|
|
9
9
|
* 把一条记录里的旧版本形状**就地**归一,返回「有没有动过」。
|
|
10
10
|
*
|
|
11
|
-
* 目前只认 2026-09-28
|
|
11
|
+
* 目前只认 2026-09-28 ref-suspend-state-reason 那一批改名(状态值 + 挂起时刻字段)。原则:**只搬运盘上真有的东西**,
|
|
12
12
|
* 不凭空补造 —— 新形状的记录若缺 `suspendedReason`,本函数不动它(那是另一个缺陷,
|
|
13
13
|
* 不该由垫片掩盖成「看起来正常」)。
|
|
14
14
|
*
|
|
@@ -6,7 +6,7 @@ import type { TaskRecord, TaskStore } from './store.js';
|
|
|
6
6
|
* - save = INSERT OR REPLACE(整行记录 JSON 存 json 列,last-wins);
|
|
7
7
|
* - byIdempotency 取该键最近一次 save 的记录(按 rowid 倒序,失败重提产生的新任务胜出);
|
|
8
8
|
* - list 按写入顺序返回;clear 清空整表;
|
|
9
|
-
* - `listDue(before)`(到期索引,2026-09-28
|
|
9
|
+
* - `listDue(before)`(到期索引,2026-09-28 ref-due-index-measure):派生列 `wake_at` + `(status, wake_at)`
|
|
10
10
|
* 索引,只回「在睡且到点」的记录(存量库构造期就地迁移:ALTER + 从 json 回填);
|
|
11
11
|
* - 构造即就绪(建表 + 索引,无异步),重启续跑同样交给 AsyncRunner.resumePending()。
|
|
12
12
|
*
|
|
@@ -36,7 +36,7 @@ export declare class SqliteTaskStore implements TaskStore {
|
|
|
36
36
|
byIdempotency(key: string): TaskRecord | undefined;
|
|
37
37
|
list(): TaskRecord[];
|
|
38
38
|
/**
|
|
39
|
-
* 到期索引(2026-09-28
|
|
39
|
+
* 到期索引(2026-09-28 ref-due-index-measure 落地):只回「在睡且到点」的记录,走 `idx_tasks_due` 索引
|
|
40
40
|
* —— 代价是 O(到期数) 而不是 O(全表)。口径与 `wake-policy.ts` 的 `timerDue` 对齐
|
|
41
41
|
* (status + wake_at 两列;`suspendedReason` 那一半由调用方复核,见 #redispatch)。
|
|
42
42
|
*/
|
|
@@ -20,7 +20,7 @@ function loadDatabaseSync() {
|
|
|
20
20
|
* - save = INSERT OR REPLACE(整行记录 JSON 存 json 列,last-wins);
|
|
21
21
|
* - byIdempotency 取该键最近一次 save 的记录(按 rowid 倒序,失败重提产生的新任务胜出);
|
|
22
22
|
* - list 按写入顺序返回;clear 清空整表;
|
|
23
|
-
* - `listDue(before)`(到期索引,2026-09-28
|
|
23
|
+
* - `listDue(before)`(到期索引,2026-09-28 ref-due-index-measure):派生列 `wake_at` + `(status, wake_at)`
|
|
24
24
|
* 索引,只回「在睡且到点」的记录(存量库构造期就地迁移:ALTER + 从 json 回填);
|
|
25
25
|
* - 构造即就绪(建表 + 索引,无异步),重启续跑同样交给 AsyncRunner.resumePending()。
|
|
26
26
|
*
|
|
@@ -56,7 +56,7 @@ export class SqliteTaskStore {
|
|
|
56
56
|
)
|
|
57
57
|
`);
|
|
58
58
|
this.db.exec('CREATE INDEX IF NOT EXISTS idx_tasks_idempotency ON tasks(idempotency_key)');
|
|
59
|
-
// wake_at 派生列(2026-09-28
|
|
59
|
+
// wake_at 派生列(2026-09-28 ref-due-index-measure,到期索引):json 内 wakeAt 的反规范化副本,
|
|
60
60
|
// 专供 `listDue` 的索引过滤(status, wake_at)。
|
|
61
61
|
//
|
|
62
62
|
// 为什么是派生列而不是查询时 `json_extract`:json_extract 要对**扫到的每一行**解析
|
|
@@ -148,7 +148,7 @@ export class SqliteTaskStore {
|
|
|
148
148
|
return out;
|
|
149
149
|
}
|
|
150
150
|
/**
|
|
151
|
-
* 到期索引(2026-09-28
|
|
151
|
+
* 到期索引(2026-09-28 ref-due-index-measure 落地):只回「在睡且到点」的记录,走 `idx_tasks_due` 索引
|
|
152
152
|
* —— 代价是 O(到期数) 而不是 O(全表)。口径与 `wake-policy.ts` 的 `timerDue` 对齐
|
|
153
153
|
* (status + wake_at 两列;`suspendedReason` 那一半由调用方复核,见 #redispatch)。
|
|
154
154
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteStore.js","sourceRoot":"","sources":["../../src/store/sqliteStore.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,4DAA4D;AAC5D,yDAAyD;AACzD,2DAA2D;AAC3D,2DAA2D;AAC3D,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAEtD,SAAS,gBAAgB;IACvB,IAAI,CAAC;QACH,OAAQ,cAAc,CAAC,aAAa,CAAkC,CAAC,YAAY,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,eAAe;IACT,EAAE,CAAe;IAClC,gDAAgD;IAC/B,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhD,YAAY,IAAY;QACtB,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;QACxC,IAAI,CAAC,EAAE,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACjC,gDAAgD;QAChD,0DAA0D;QAC1D,uDAAuD;QACvD,sDAAsD;QACtD,mCAAmC;QACnC,kCAAkC;QAClC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC3C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,gCAAgC;YAChC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC5C,CAAC;QACD,4DAA4D;QAC5D,4EAA4E;QAC5E,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;KAOZ,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;QAC3F,
|
|
1
|
+
{"version":3,"file":"sqliteStore.js","sourceRoot":"","sources":["../../src/store/sqliteStore.ts"],"names":[],"mappings":"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"}
|
package/dist/store/store.d.ts
CHANGED
|
@@ -55,13 +55,13 @@ export interface TaskRecord {
|
|
|
55
55
|
*/
|
|
56
56
|
suspendedSince?: number | undefined;
|
|
57
57
|
/**
|
|
58
|
-
* 挂起原因(2026-09-28
|
|
58
|
+
* 挂起原因(2026-09-28 ref-suspend-state-reason):`approval` = 等人工决定、`timer` = 等一个时刻。
|
|
59
59
|
* **随记录落库**(与 `suspendedSince` 同批):进程重启后靠它决定用哪条闸 ——
|
|
60
60
|
* 审批超时只对 `approval` 成立,到期唤醒只对 `timer` 成立。
|
|
61
61
|
*/
|
|
62
62
|
suspendedReason?: SuspendedReason | undefined;
|
|
63
63
|
/**
|
|
64
|
-
* 时间挂起的目标时刻(epoch ms,2026-09-28
|
|
64
|
+
* 时间挂起的目标时刻(epoch ms,2026-09-28 ref-suspend-state-reason 的 timer 侧):到点由到期扫描唤醒
|
|
65
65
|
* (`resumePending` / `poll` 的惰性路径,判据见 `transport/wake-policy.ts`)。
|
|
66
66
|
* **随记录落库** —— 「睡到后天下午三点接着跑」这件事只有它活得比进程久。
|
|
67
67
|
*
|
|
@@ -70,7 +70,7 @@ export interface TaskRecord {
|
|
|
70
70
|
*/
|
|
71
71
|
wakeAt?: number | undefined;
|
|
72
72
|
/**
|
|
73
|
-
* 挂起期间投递、**尚未注入消息历史**的事件(2026-09-28
|
|
73
|
+
* 挂起期间投递、**尚未注入消息历史**的事件(2026-09-28 ref-run-event-input,run 事件投入口)。
|
|
74
74
|
* **随记录落库**(重启不丢;先落库再派发那条纪律的载体)。续跑段由引擎在未决
|
|
75
75
|
* tool_use 解决之后渲染成 user 文本消息注入(见 `engine/loop.ts` 的注入点纪律),
|
|
76
76
|
* 跑通(不再挂起)后由宿主清掉 —— 它们已进历史;再次挂起则**保留**(那次续跑
|
|
@@ -86,23 +86,32 @@ export interface TaskRecord {
|
|
|
86
86
|
deliveredEventIds?: string[] | undefined;
|
|
87
87
|
}
|
|
88
88
|
export interface TaskStore {
|
|
89
|
+
/**
|
|
90
|
+
* 落库。存进去的必须是**副本**而不是调用方的活引用(2026-10-13 ref-retry-validation)——
|
|
91
|
+
* 调用方的纪律是「改 rec → save → 继续改 rec → 再 save」,存活引用会让
|
|
92
|
+
* 「两次 save 之间的中间态」对其他读者可见,且某次 save 失败时污染已留在库里。
|
|
93
|
+
*/
|
|
89
94
|
save(rec: TaskRecord): MaybePromise<void>;
|
|
90
95
|
/**
|
|
91
96
|
* 取任务记录。返回的必须是**反序列化副本 / 快照,不是内部活引用** ——
|
|
92
97
|
* engine/transport 的纪律是「先变异 rec、再 `await save` 落库」(如 resume-scanner /
|
|
93
98
|
* approval-supervisor 的「重读 → 改 status → 先落库再派发」):若 `get` 交出活引用,
|
|
94
|
-
* 变异会在 `save`
|
|
99
|
+
* 变异会在 `save` 之前就被其他读者看见,「未落库的中间态」直接对外可见;
|
|
100
|
+
* save 失败时那些变异就**留在库里**(落不了库的决定却改了记录)。
|
|
101
|
+
* `byIdempotency` / `list` / `listDue` 同一纪律(2026-10-13 ref-retry-validation 坐实:内建实现
|
|
102
|
+
* 统一走 `cloneTaskRecord`,下方)。
|
|
95
103
|
*/
|
|
96
104
|
get(taskId: string): MaybePromise<TaskRecord | undefined>;
|
|
97
|
-
/** 幂等键 → 最近一次任务(last-wins
|
|
105
|
+
/** 幂等键 → 最近一次任务(last-wins)。返回副本,纪律同 `get` */
|
|
98
106
|
byIdempotency(key: string): MaybePromise<TaskRecord | undefined>;
|
|
107
|
+
/** 全表快照。每条都是副本,纪律同 `get` */
|
|
99
108
|
list(): MaybePromise<TaskRecord[]>;
|
|
100
109
|
/**
|
|
101
|
-
* **可选**:到期索引(2026-09-28
|
|
110
|
+
* **可选**:到期索引(2026-09-28 ref-due-index-measure 落地)—— 只回「`suspended` 且 `wakeAt <= before`」
|
|
102
111
|
* 的记录(`wakeAt` 缺失的不回)。`AsyncRunner` 的扫描在**到期唤醒那一半**用它替代全表
|
|
103
112
|
* 过滤(`listDue?.(now) ?? list()` 的输入),没有实现的 store 回退全表,语义不变。
|
|
104
113
|
*
|
|
105
|
-
* 实现与否的分判(spec §10 2026-09-28
|
|
114
|
+
* 实现与否的分判(spec §10 2026-09-28 ref-due-index-measure 的实测):`list()` 是**真查询**的 store
|
|
106
115
|
* (sqlite:10k 记录一轮 ~105ms 线性增长)值得实现;记录本就在内存的(InMemory /
|
|
107
116
|
* File —— list 只是返回 Map snapshot)**不实现**,回退路径就是它们的现状。
|
|
108
117
|
*
|
|
@@ -130,6 +139,17 @@ export interface TaskStore {
|
|
|
130
139
|
*/
|
|
131
140
|
close?(): MaybePromise<void>;
|
|
132
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* TaskRecord 的深拷贝(2026-10-13 ref-retry-validation,副本契约的唯一落点:`save` 入库与
|
|
144
|
+
* `get` / `byIdempotency` / `list` 出站都走它)。
|
|
145
|
+
*
|
|
146
|
+
* 递归克隆数组与**纯对象**(原型为 `Object.prototype` 或 null);函数与类实例
|
|
147
|
+
* 按引用保留 —— `spec.options` 里合法地装着 `AbortSignal` / `ModelClient` /
|
|
148
|
+
* 工具的 `run` 等进程内对象,它们不是「会被调用方变异的数据」,而 `structuredClone`
|
|
149
|
+
* 遇上它们直接抛 `DataCloneError`(sqlite/redis 序列化时本来也会丢它们,见
|
|
150
|
+
* `RunInvocationOptions.fallbacks` 的序列化边界注释)。
|
|
151
|
+
*/
|
|
152
|
+
export declare function cloneTaskRecord(rec: TaskRecord): TaskRecord;
|
|
133
153
|
export declare class InMemoryTaskStore implements TaskStore {
|
|
134
154
|
private readonly byTask;
|
|
135
155
|
private readonly byKey;
|
package/dist/store/store.js
CHANGED
|
@@ -7,9 +7,44 @@ export function isThenable(x) {
|
|
|
7
7
|
export function nextTaskId() {
|
|
8
8
|
return `task_${randomUUID()}`;
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* TaskRecord 的深拷贝(2026-10-13 ref-retry-validation,副本契约的唯一落点:`save` 入库与
|
|
12
|
+
* `get` / `byIdempotency` / `list` 出站都走它)。
|
|
13
|
+
*
|
|
14
|
+
* 递归克隆数组与**纯对象**(原型为 `Object.prototype` 或 null);函数与类实例
|
|
15
|
+
* 按引用保留 —— `spec.options` 里合法地装着 `AbortSignal` / `ModelClient` /
|
|
16
|
+
* 工具的 `run` 等进程内对象,它们不是「会被调用方变异的数据」,而 `structuredClone`
|
|
17
|
+
* 遇上它们直接抛 `DataCloneError`(sqlite/redis 序列化时本来也会丢它们,见
|
|
18
|
+
* `RunInvocationOptions.fallbacks` 的序列化边界注释)。
|
|
19
|
+
*/
|
|
20
|
+
export function cloneTaskRecord(rec) {
|
|
21
|
+
return cloneData(rec);
|
|
22
|
+
}
|
|
23
|
+
function cloneData(value) {
|
|
24
|
+
if (Array.isArray(value))
|
|
25
|
+
return value.map(cloneData);
|
|
26
|
+
if (value !== null && typeof value === 'object') {
|
|
27
|
+
const proto = Object.getPrototypeOf(value);
|
|
28
|
+
// 类实例(AbortSignal 等)按引用保留:克隆它没有意义,也克隆不了
|
|
29
|
+
if (proto !== Object.prototype && proto !== null)
|
|
30
|
+
return value;
|
|
31
|
+
const out = {};
|
|
32
|
+
for (const [k, v] of Object.entries(value)) {
|
|
33
|
+
// 直接赋值 '__proto__' 会走原型 setter:自有键丢失且副本原型被改。
|
|
34
|
+
Object.defineProperty(out, k, {
|
|
35
|
+
value: cloneData(v),
|
|
36
|
+
writable: true,
|
|
37
|
+
enumerable: true,
|
|
38
|
+
configurable: true,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
10
45
|
export class InMemoryTaskStore {
|
|
11
46
|
// 刻意**不实现** `listDue`(到期索引):记录本就在内存 Map 里,`list()` 只是返回 snapshot ——
|
|
12
|
-
// 到期过滤的成本与全表相同,索引无利可省(实测与触发条件见 spec §10 2026-09-28
|
|
47
|
+
// 到期过滤的成本与全表相同,索引无利可省(实测与触发条件见 spec §10 2026-09-28 ref-due-index-measure)。
|
|
13
48
|
// AsyncRunner 的扫描对缺失的 listDue 回退全表过滤,语义不变。
|
|
14
49
|
byTask = new Map();
|
|
15
50
|
byKey = new Map(); // idempotencyKey → taskId
|
|
@@ -29,7 +64,8 @@ export class InMemoryTaskStore {
|
|
|
29
64
|
this.maxRecords = max;
|
|
30
65
|
}
|
|
31
66
|
save(rec) {
|
|
32
|
-
|
|
67
|
+
// 存副本(契约见 TaskStore.save):调用方此后对 rec 的推进不得绕过 save 直接可见
|
|
68
|
+
this.byTask.set(rec.taskId, cloneTaskRecord(rec));
|
|
33
69
|
if (rec.idempotencyKey)
|
|
34
70
|
this.byKey.set(rec.idempotencyKey, rec.taskId);
|
|
35
71
|
if (this.byTask.size > this.maxRecords)
|
|
@@ -50,14 +86,16 @@ export class InMemoryTaskStore {
|
|
|
50
86
|
}
|
|
51
87
|
}
|
|
52
88
|
get(taskId) {
|
|
53
|
-
|
|
89
|
+
const rec = this.byTask.get(taskId);
|
|
90
|
+
return rec === undefined ? undefined : cloneTaskRecord(rec);
|
|
54
91
|
}
|
|
55
92
|
byIdempotency(key) {
|
|
56
93
|
const taskId = this.byKey.get(key);
|
|
57
|
-
|
|
94
|
+
const rec = taskId ? this.byTask.get(taskId) : undefined;
|
|
95
|
+
return rec === undefined ? undefined : cloneTaskRecord(rec);
|
|
58
96
|
}
|
|
59
97
|
list() {
|
|
60
|
-
return [...this.byTask.values()];
|
|
98
|
+
return [...this.byTask.values()].map(cloneTaskRecord);
|
|
61
99
|
}
|
|
62
100
|
clear() {
|
|
63
101
|
this.byTask.clear();
|
package/dist/store/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAqBzC,oDAAoD;AACpD,MAAM,UAAU,UAAU,CAAI,CAAkB;IAC9C,OAAO,CAAC,CAAC,CAAC,IAAI,OAAQ,CAAgB,CAAC,IAAI,KAAK,UAAU,CAAC;AAC7D,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,UAAU;IACxB,OAAO,QAAQ,UAAU,EAAE,EAAE,CAAC;AAChC,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,20 +22,26 @@ export declare function isScannableInstance(instance: unknown): instance is obje
|
|
|
22
22
|
* 父类的 spec(spec 沿原型链继承,调用仍走实例上的子类实现)。
|
|
23
23
|
*/
|
|
24
24
|
export declare function scanDecoratedMethods<S>(instance: object, registry: WeakMap<Function, S>): DecoratedMethod<S>[];
|
|
25
|
-
/** 装饰器收到的标准 context
|
|
25
|
+
/** 装饰器收到的标准 context 子集(本框架只用到这四个字段) */
|
|
26
26
|
export interface CapabilityDecoratorContext {
|
|
27
27
|
kind: string;
|
|
28
28
|
name: string | symbol;
|
|
29
29
|
/** 标准装饰器 context 的私有方法标记(`#method` 的 kind 同样是 'method') */
|
|
30
30
|
private?: boolean;
|
|
31
|
+
/** 标准装饰器 context 的静态方法标记 */
|
|
32
|
+
static?: boolean;
|
|
31
33
|
}
|
|
32
34
|
/**
|
|
33
|
-
*
|
|
35
|
+
* 四类能力装饰器共用的目标守卫:只接类方法,且**拒绝私有方法**;
|
|
36
|
+
* 除 @Prompt 外(纯文本资产,静态收集是显式支持形态,见 prompt.ts)同时**拒绝静态方法**。
|
|
34
37
|
*
|
|
35
|
-
* 收集走 `Reflect.ownKeys`,私有名(#method
|
|
36
|
-
*
|
|
38
|
+
* 收集走 `Reflect.ownKeys`,私有名(#method)在其中不可见;静态方法挂在**构造函数**上,
|
|
39
|
+
* 而 `scanDecoratedMethods` 只扫实例原型链 —— 不拦的话能力会静默从菜单里消失,
|
|
40
|
+
* 作者只能靠「模型说没有这个工具」反推。
|
|
37
41
|
*/
|
|
38
|
-
export declare function assertMethodTarget(context: CapabilityDecoratorContext, kind: string
|
|
42
|
+
export declare function assertMethodTarget(context: CapabilityDecoratorContext, kind: string, opts?: {
|
|
43
|
+
allowStatic?: boolean;
|
|
44
|
+
}): void;
|
|
39
45
|
/** 能力名解析:spec.name 缺省取方法名;私有符号方法名必须显式给 name。 */
|
|
40
46
|
export declare function capabilityName(spec: {
|
|
41
47
|
name?: string;
|
package/dist/toolkit/collect.js
CHANGED
|
@@ -44,18 +44,24 @@ export function scanDecoratedMethods(instance, registry) {
|
|
|
44
44
|
return found;
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
47
|
-
*
|
|
47
|
+
* 四类能力装饰器共用的目标守卫:只接类方法,且**拒绝私有方法**;
|
|
48
|
+
* 除 @Prompt 外(纯文本资产,静态收集是显式支持形态,见 prompt.ts)同时**拒绝静态方法**。
|
|
48
49
|
*
|
|
49
|
-
* 收集走 `Reflect.ownKeys`,私有名(#method
|
|
50
|
-
*
|
|
50
|
+
* 收集走 `Reflect.ownKeys`,私有名(#method)在其中不可见;静态方法挂在**构造函数**上,
|
|
51
|
+
* 而 `scanDecoratedMethods` 只扫实例原型链 —— 不拦的话能力会静默从菜单里消失,
|
|
52
|
+
* 作者只能靠「模型说没有这个工具」反推。
|
|
51
53
|
*/
|
|
52
|
-
export function assertMethodTarget(context, kind) {
|
|
54
|
+
export function assertMethodTarget(context, kind, opts) {
|
|
53
55
|
if (context.kind !== 'method') {
|
|
54
56
|
throw new Error(`${kind} 只能修饰类方法,收到 kind=${String(context.kind)}`);
|
|
55
57
|
}
|
|
56
58
|
if (context.private) {
|
|
57
59
|
throw new Error(`${kind} 不支持私有方法(#method):收集用 Reflect.ownKeys,私有名不可见`);
|
|
58
60
|
}
|
|
61
|
+
if (context.static === true && opts?.allowStatic !== true) {
|
|
62
|
+
throw new Error(`${kind} 不支持静态方法(static):收集只扫实例原型链,静态方法挂在构造函数上不会被收进菜单` +
|
|
63
|
+
`(@Tool/@SubAgent/@Skill 的能力调用需要实例 this;@Prompt 是唯一支持静态的能力类)`);
|
|
64
|
+
}
|
|
59
65
|
}
|
|
60
66
|
/**
|
|
61
67
|
* 能力名合法性:与 MCP 桥(integrations/mcp.ts)同口径 `^[A-Za-z0-9_-]{1,64}$`。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/toolkit/collect.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAiB;IACnD,OAAO,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,OAAO,QAAQ,KAAK,UAAU,CAAC;AAC/F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,QAA8B;IAE9B,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAyB,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;IAExC,IAAI,KAAK,GAAkB,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3D,OAAO,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;QAC3C,oDAAoD;QACpD,0CAA0C;QAC1C,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU;gBAAE,SAAS;YACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAiB,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI;gBAAE,SAAS,CAAC,qCAAqC;YAC1D,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;
|
|
1
|
+
{"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/toolkit/collect.ts"],"names":[],"mappings":"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"}
|
package/dist/toolkit/discover.js
CHANGED
|
@@ -109,9 +109,35 @@ function isDirLike(full, e) {
|
|
|
109
109
|
return false;
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* 读能力类的 `static deps`(可选的依赖声明)。
|
|
114
|
+
*
|
|
115
|
+
* 只认「字符串数组」这一种形状:别的是用户自己的字段(或继承来的),静默当没有 ——
|
|
116
|
+
* 写错了(比如 `deps = 'WORKDIR'`)不报错、也不注入,那正是要避免的静默失效,
|
|
117
|
+
* 所以这里**响亮报错**(装配期比运行期便宜得多)。
|
|
118
|
+
*/
|
|
119
|
+
function staticDepsOf(cls) {
|
|
120
|
+
const raw = cls?.deps;
|
|
121
|
+
if (raw === undefined)
|
|
122
|
+
return undefined;
|
|
123
|
+
if (Array.isArray(raw) && raw.every((d) => typeof d === 'string'))
|
|
124
|
+
return raw;
|
|
125
|
+
throw new Error(`能力类的 static deps 必须是字符串数组(如 static readonly deps = ['WORKDIR']),` +
|
|
126
|
+
`实际:${JSON.stringify(raw)}`);
|
|
127
|
+
}
|
|
112
128
|
function normalizeExport(name, exported, entry) {
|
|
113
129
|
if (typeof exported === 'function') {
|
|
114
|
-
|
|
130
|
+
const cls = exported;
|
|
131
|
+
// 能力类可以**自带依赖声明**(`static readonly deps = ['WORKDIR']`)。
|
|
132
|
+
//
|
|
133
|
+
// 为什么需要(2026-10-16 ref-di-dup-loud):此前 discover 对「default export
|
|
134
|
+
// 是类」只产 `{ useClass }`(没有 deps),于是**需要注入的能力必须挪出 discover**、改到
|
|
135
|
+
// 显式 `providers` 里再注册一遍 —— 结果同一 token 出现两次(一次无 deps、一次有),
|
|
136
|
+
// 靠「后注册覆盖先注册」碰巧成立,顺序一变就静默失效。能力文件夹本来就该是
|
|
137
|
+
// 「能力 + 它的依赖」的完整单元,依赖声明写在类旁边,装配文件不必知道。
|
|
138
|
+
// 与 Folder 直接导出 Provider 对象那条路并列(本函数下面两行),多一个更轻的选择。
|
|
139
|
+
const deps = staticDepsOf(cls);
|
|
140
|
+
return deps ? [{ provide: name, useClass: cls, deps }] : [{ provide: name, useClass: cls }];
|
|
115
141
|
}
|
|
116
142
|
if (isProvider(exported)) {
|
|
117
143
|
return [exported];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/toolkit/discover.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/toolkit/discover.ts"],"names":[],"mappings":"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"}
|