@faapi/faapi 6.2.0 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +1397 -499
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +156 -3
- package/dist/index.js +1090 -259
- package/dist/index.js.map +1 -1
- package/dist/{routeTypes-Bm--uTbm.d.ts → routeTypes-_17rXzal.d.ts} +355 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +48 -2
- package/dist/testing.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,3 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* app 实例级任务注册表(与 tool/agent/skill registry 同构,方案 A 实例化)
|
|
3
|
+
*
|
|
4
|
+
* 任务清单来自编译期产物(faapi-tasks.js),reload 时整体替换(hydrate 语义)。
|
|
5
|
+
* 每个 app 持有独立实例,多 app 同进程互不串台;详见 taskRegistry.md。
|
|
6
|
+
*/
|
|
7
|
+
interface TaskRegistry {
|
|
8
|
+
/** 全量替换(任务清单来自编译期产物,reload 时整体重新生成) */
|
|
9
|
+
hydrate(tasks: TaskMetadata[]): void;
|
|
10
|
+
/** 按任务名查找 */
|
|
11
|
+
get(name: string): TaskMetadata | undefined;
|
|
12
|
+
/** 所有已注册任务(副本) */
|
|
13
|
+
list(): TaskMetadata[];
|
|
14
|
+
clear(): void;
|
|
15
|
+
}
|
|
16
|
+
declare function createTaskRegistry(): TaskRegistry;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 任务队列驱动抽象(语义层与存储/调度实现分离的边界)
|
|
20
|
+
*
|
|
21
|
+
* 语义层(taskQueue)负责:任务存在性检查、payload zod 校验、任务模块加载、
|
|
22
|
+
* run 执行包装、任务记录(list);驱动层负责:入队存储、worker 消费、
|
|
23
|
+
* 失败重试、停机 drain。换驱动 = 换存储,业务方写法不变。
|
|
24
|
+
*
|
|
25
|
+
* 框架不内置任何驱动实现:外部驱动由独立子包提供——`@faapi/task-pgboss`(Postgres)、
|
|
26
|
+
* `@faapi/task-bullmq`(Redis),主包不依赖它们——按 config.task.driver 动态加载
|
|
27
|
+
* (loadTaskDriver.ts);无任务清单时用 idleTaskDriver 占位(enqueue 显式报错)。
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/** 驱动层交付给语义层执行的单个任务 */
|
|
31
|
+
interface TaskDriverJob {
|
|
32
|
+
/** 队列系统侧任务 id(pg-boss/bullmq 为其自身 id;自定义驱动自行生成) */
|
|
33
|
+
id: string;
|
|
34
|
+
name: string;
|
|
35
|
+
payload: unknown;
|
|
36
|
+
/** 第几次执行(从 1 起,含重试) */
|
|
37
|
+
attempt: number;
|
|
38
|
+
/** 停机/取消信号;驱动不支持取消时为永不 abort 的信号 */
|
|
39
|
+
signal: AbortSignal;
|
|
40
|
+
}
|
|
41
|
+
/** 语义层交给驱动层的执行函数(抛错 = 失败,由驱动按入队时的 retries 重试) */
|
|
42
|
+
type TaskDriverProcess = (job: TaskDriverJob) => Promise<unknown>;
|
|
43
|
+
/**
|
|
44
|
+
* 驱动侧任务查询记录(TaskDriver.list 的返回项)
|
|
45
|
+
*
|
|
46
|
+
* status 由子包从队列系统原生状态映射为 faapi 语义
|
|
47
|
+
* (pgboss:created→pending、active→running、completed→done、cancelled→cancelled;
|
|
48
|
+
* bullmq:waiting/delayed→pending、active→running、completed→done、failed→failed),
|
|
49
|
+
* 语义层零映射直接转 TaskJob。
|
|
50
|
+
*/
|
|
51
|
+
interface TaskDriverRecord {
|
|
52
|
+
id: string;
|
|
53
|
+
name: string;
|
|
54
|
+
payload: unknown;
|
|
55
|
+
status: TaskJobStatus;
|
|
56
|
+
attempts: number;
|
|
57
|
+
/** 执行返回值(已完成时) */
|
|
58
|
+
result?: unknown;
|
|
59
|
+
/** 失败/取消原因 */
|
|
60
|
+
error?: string;
|
|
61
|
+
createdAt: number;
|
|
62
|
+
/** 计划执行时间戳(延迟任务) */
|
|
63
|
+
runAt?: number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 任务队列驱动接口
|
|
67
|
+
*/
|
|
68
|
+
interface TaskDriver {
|
|
69
|
+
/**
|
|
70
|
+
* 入队一个任务,返回驱动侧任务 id
|
|
71
|
+
*
|
|
72
|
+
* @param opts.retries 失败重试次数(语义层从任务 meta 取,驱动负责执行重试策略)
|
|
73
|
+
* @param opts.dedupId 幂等键(可选)——同键任务在队列系统保留期内不重复入队。
|
|
74
|
+
* pgboss 映射 send 自定义 id(驱动内做任意字符串 → 确定性 UUID 映射,冲突跳过);
|
|
75
|
+
* bullmq 映射 jobId。重复投递时返回已存在任务的 id。
|
|
76
|
+
* @throws 驱动已停止 / 连接失败等
|
|
77
|
+
*/
|
|
78
|
+
enqueue(name: string, payload: unknown, opts?: {
|
|
79
|
+
delayMs?: number;
|
|
80
|
+
retries?: number;
|
|
81
|
+
dedupId?: string;
|
|
82
|
+
}): Promise<string>;
|
|
83
|
+
/**
|
|
84
|
+
* 注册某任务的消费 worker(幂等覆盖)。process 抛错 = 本次失败,驱动决定重试。
|
|
85
|
+
* 调用时机:queue.start() 为注册表中每个任务注册一次。
|
|
86
|
+
*/
|
|
87
|
+
startWorker(name: string, opts: {
|
|
88
|
+
concurrency: number;
|
|
89
|
+
process: TaskDriverProcess;
|
|
90
|
+
}): Promise<void> | void;
|
|
91
|
+
/** 停止消费并等待 in-flight 任务(timeoutMs 超时后驱动自行处置),幂等 */
|
|
92
|
+
stop(timeoutMs?: number): Promise<void>;
|
|
93
|
+
/** 仅停止 worker 消费(不断开驱动连接),供 dev reloadTasks 重注册用;可选 */
|
|
94
|
+
stopWorkers?(): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* 查询持久化队列任务(可选能力)
|
|
97
|
+
*
|
|
98
|
+
* 未实现时 TaskClient.listQueued 显式抛错。pg-boss v10 无批量列出 jobs 的公开 API,
|
|
99
|
+
* task-pgboss 未实现;BullMQ API 完整,task-bullmq 全支持。
|
|
100
|
+
* 不传 name 时列出本进程已创建队列/已知任务的范围由驱动自行定义。
|
|
101
|
+
*/
|
|
102
|
+
list?(opts?: {
|
|
103
|
+
name?: string;
|
|
104
|
+
/** 按 faapi 语义状态过滤 */
|
|
105
|
+
state?: TaskJobStatus;
|
|
106
|
+
/** 返回条数上限(默认由驱动决定,建议 50) */
|
|
107
|
+
limit?: number;
|
|
108
|
+
}): Promise<TaskDriverRecord[]>;
|
|
109
|
+
/**
|
|
110
|
+
* 取消队列侧任务(可选能力):等待/延迟中的不再执行。
|
|
111
|
+
* pgboss → boss.cancel(保留 cancelled 记录);bullmq → job.remove()(记录随之移除)。
|
|
112
|
+
*/
|
|
113
|
+
cancel?(name: string, id: string): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* 重试失败/取消的任务(可选能力)。
|
|
116
|
+
* pgboss → boss.resume(仅 cancelled);bullmq → job.retry()(仅 failed)。
|
|
117
|
+
* 任务不存在 / 状态不允许时由驱动抛错。
|
|
118
|
+
*/
|
|
119
|
+
retry?(name: string, id: string): Promise<void>;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* 隔离执行器签名(taskQueue 按任务 meta.timeoutMs 调用;测试可注入 spy)
|
|
124
|
+
*/
|
|
125
|
+
type TaskWorkerRunner = typeof runTaskInWorker;
|
|
126
|
+
interface TaskWorkerOptions {
|
|
127
|
+
/** 任务产物模块绝对路径(`<dist>/tasks/<dir>/task.js`) */
|
|
128
|
+
taskModulePath: string;
|
|
129
|
+
payload: unknown;
|
|
130
|
+
/** signal 由执行器构造(abort/terminate 时触发),宿主只传 config 与 job 信息 */
|
|
131
|
+
taskCtx: {
|
|
132
|
+
config: unknown;
|
|
133
|
+
job: {
|
|
134
|
+
id: string;
|
|
135
|
+
name: string;
|
|
136
|
+
attempt: number;
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
/** 单次执行超时(毫秒) */
|
|
140
|
+
timeoutMs: number;
|
|
141
|
+
/** 外部取消信号(驱动停机超时 abort)——abort 同样触发两段式取消 */
|
|
142
|
+
externalSignal?: AbortSignal;
|
|
143
|
+
/** 宽限期覆盖(默认 KILL_GRACE_MS)——测试注入短值用,业务不配置 */
|
|
144
|
+
killGraceMs?: number;
|
|
145
|
+
}
|
|
146
|
+
declare function runTaskInWorker(options: TaskWorkerOptions): Promise<unknown>;
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* 任务元信息(业务方在 task.ts 中 `export const task = {...}` 声明)
|
|
150
|
+
*
|
|
151
|
+
* 所有字段可选;未声明时由运行时使用默认值(concurrency=1、retries=0、无 cron)。
|
|
152
|
+
*/
|
|
153
|
+
interface FaapiTaskMeta {
|
|
154
|
+
/** 同名任务的最大并行执行数(默认 1) */
|
|
155
|
+
concurrency?: number;
|
|
156
|
+
/** 失败重试次数(默认 0——失败即 failed,不重试) */
|
|
157
|
+
retries?: number;
|
|
158
|
+
/**
|
|
159
|
+
* 单次执行超时(毫秒)。声明后该任务在独立 worker 线程执行,超时两段式取消
|
|
160
|
+
* (先 abort 信号宽限 5s,未退出 terminate 硬杀)——判定超时即执行真正终止。
|
|
161
|
+
* 未声明走进程内执行(零开销,但卡住时框架只能不再等待)。
|
|
162
|
+
*/
|
|
163
|
+
timeoutMs?: number;
|
|
164
|
+
/** cron 表达式(croner 语法,支持秒级)——到点自动入队空 payload */
|
|
165
|
+
cron?: string;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 构建期扫描清单记录(scanTasks 产出,源码路径形式)
|
|
169
|
+
*/
|
|
170
|
+
interface TaskManifest {
|
|
171
|
+
/** 任务名:tasks/ 后目录路径段用 . 连接(如 `send-email`、`a.b`) */
|
|
172
|
+
name: string;
|
|
173
|
+
/** 源码相对路径(`src/tasks/<dir>/task.ts`) */
|
|
174
|
+
filePath: string;
|
|
175
|
+
cron?: string;
|
|
176
|
+
concurrency?: number;
|
|
177
|
+
retries?: number;
|
|
178
|
+
timeoutMs?: number;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* 运行时任务元数据(faapi-tasks.js 水合到 TaskRegistry 后的形态,产物路径形式)
|
|
182
|
+
*/
|
|
183
|
+
interface TaskMetadata {
|
|
184
|
+
name: string;
|
|
185
|
+
/** 产物路径(`<dist>/tasks/<dir>/task.js`),运行时 import 任务模块 */
|
|
186
|
+
filePath: string;
|
|
187
|
+
cron?: string;
|
|
188
|
+
concurrency?: number;
|
|
189
|
+
retries?: number;
|
|
190
|
+
timeoutMs?: number;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* 任务记录状态
|
|
194
|
+
*
|
|
195
|
+
* cancelled = 执行被框架终止(超时两段式取消 / 停机取消),区别于 run 自身抛错的 failed;
|
|
196
|
+
* 驱动重试时记录回到 running 继续流转。
|
|
197
|
+
*/
|
|
198
|
+
type TaskJobStatus = 'pending' | 'running' | 'retry' | 'done' | 'failed' | 'cancelled';
|
|
199
|
+
/**
|
|
200
|
+
* 任务执行记录(内存快照)
|
|
201
|
+
*/
|
|
202
|
+
interface TaskJob {
|
|
203
|
+
id: string;
|
|
204
|
+
name: string;
|
|
205
|
+
payload: unknown;
|
|
206
|
+
status: TaskJobStatus;
|
|
207
|
+
/** 已执行次数(含当前正在执行的一次) */
|
|
208
|
+
attempts: number;
|
|
209
|
+
/** run 的返回值(done 时) */
|
|
210
|
+
result?: unknown;
|
|
211
|
+
/** 错误消息(failed 时) */
|
|
212
|
+
error?: string;
|
|
213
|
+
createdAt: number;
|
|
214
|
+
/** 计划执行时间戳(重试/延迟任务与 createdAt 不同) */
|
|
215
|
+
runAt?: number;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* 传给任务 run 函数的第二参数
|
|
219
|
+
*/
|
|
220
|
+
interface TaskContext {
|
|
221
|
+
/** 优雅停机时对在跑任务 abort 的信号 */
|
|
222
|
+
signal: AbortSignal;
|
|
223
|
+
/** faapi.config.ts 全量配置(含自定义业务配置) */
|
|
224
|
+
config: unknown;
|
|
225
|
+
job: {
|
|
226
|
+
id: string;
|
|
227
|
+
name: string;
|
|
228
|
+
attempt: number;
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* 任务模块形态(task.ts 编译产物中与执行相关的导出)
|
|
233
|
+
*/
|
|
234
|
+
interface TaskModule {
|
|
235
|
+
run?: (payload: unknown, taskCtx: TaskContext) => unknown;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* 任务触发客户端(`tasks` 注入参数 / `ctx.tasks` / `app.tasks` 共用)
|
|
239
|
+
*/
|
|
240
|
+
interface TaskClient {
|
|
241
|
+
/**
|
|
242
|
+
* 入队一个任务
|
|
243
|
+
*
|
|
244
|
+
* @param opts.dedupId 幂等键(可选)——同键任务在队列系统保留期内不重复入队,
|
|
245
|
+
* 重复投递返回已存在任务 id(驱动语义见 driverTypes.md);cron 投递自动携带
|
|
246
|
+
* @returns 任务 id
|
|
247
|
+
* @throws 任务不存在 / 队列已停止 / payload 校验失败(ValidationError)
|
|
248
|
+
*/
|
|
249
|
+
enqueue(name: string, payload?: unknown, opts?: {
|
|
250
|
+
delayMs?: number;
|
|
251
|
+
dedupId?: string;
|
|
252
|
+
}): Promise<{
|
|
253
|
+
id: string;
|
|
254
|
+
}>;
|
|
255
|
+
/** 任务记录快照(可按任务名过滤)——本进程内存活记录,不含其他实例/重启前历史 */
|
|
256
|
+
list(name?: string): TaskJob[];
|
|
257
|
+
/**
|
|
258
|
+
* 持久化队列视图:驱动实现 `TaskDriver.list` 时返回队列侧任务(含其他实例的
|
|
259
|
+
* 与历史执行),并与本进程记录按 id 合并(本进程观测优先:status/attempts/
|
|
260
|
+
* result/error 以本进程为准)
|
|
261
|
+
*
|
|
262
|
+
* @throws 驱动未实现 TaskDriver.list(能力边界见 driverTypes.md——pgboss 未实现,
|
|
263
|
+
* 用 pg-boss 自身 API/SQL 旁路;BullMQ 全支持)
|
|
264
|
+
*/
|
|
265
|
+
listQueued(name?: string): Promise<TaskJob[]>;
|
|
266
|
+
/**
|
|
267
|
+
* 取消队列侧任务:等待/延迟中的不再执行(语义随驱动——pgboss 保留 cancelled
|
|
268
|
+
* 记录,bullmq 为 job.remove 即移除)
|
|
269
|
+
*
|
|
270
|
+
* @throws 驱动未实现 TaskDriver.cancel
|
|
271
|
+
*/
|
|
272
|
+
cancel(name: string, id: string): Promise<void>;
|
|
273
|
+
/**
|
|
274
|
+
* 重试队列侧失败/取消的任务(pgboss 仅 cancelled 可 resume;bullmq 仅 failed
|
|
275
|
+
* 可 retry;任务不存在/状态不允许由驱动抛错)
|
|
276
|
+
*
|
|
277
|
+
* @throws 驱动未实现 TaskDriver.retry
|
|
278
|
+
*/
|
|
279
|
+
retry(name: string, id: string): Promise<void>;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* 任务队列(TaskClient + 生命周期控制,createAppBase 内部使用)
|
|
283
|
+
*/
|
|
284
|
+
interface TaskQueue extends TaskClient {
|
|
285
|
+
/** 开始派发(幂等) */
|
|
286
|
+
start(): void;
|
|
287
|
+
/** 停止接受新任务并等待在跑任务完成(超时 abort),幂等 */
|
|
288
|
+
stop(timeoutMs?: number): Promise<void>;
|
|
289
|
+
/** 重注册 worker(dev reloadTasks 用——驱动连接保持,仅按最新注册表重建消费) */
|
|
290
|
+
reload(): Promise<void>;
|
|
291
|
+
/** 清空任务模块缓存(dev reloadTasks 用) */
|
|
292
|
+
invalidateModules(): void;
|
|
293
|
+
/** 清空 payload schema 缓存(dev reloadTasks 用) */
|
|
294
|
+
invalidateSchemas(): void;
|
|
295
|
+
}
|
|
296
|
+
/** 队列依赖(测试可注入自定义加载器/驱动) */
|
|
297
|
+
interface TaskQueueDeps {
|
|
298
|
+
registry: TaskRegistry;
|
|
299
|
+
rootDir: string;
|
|
300
|
+
/** faapi.config.ts 全量配置,透传给 run 的 TaskContext.config */
|
|
301
|
+
config?: unknown;
|
|
302
|
+
/**
|
|
303
|
+
* 队列驱动(必填):`loadTaskDriver` 解析结果(pgboss/bullmq 子包驱动)
|
|
304
|
+
* 或自定义 TaskDriver 实例;无任务清单时由 createAppBase 传入 idleTaskDriver
|
|
305
|
+
*/
|
|
306
|
+
driver: TaskDriver;
|
|
307
|
+
/** 任务模块加载器(默认:import 产物路径) */
|
|
308
|
+
loadTaskModule?: (filePath: string) => Promise<TaskModule>;
|
|
309
|
+
/** payload schema 加载器(默认:import 任务目录 zod.js,取首个 `*Schema` 导出) */
|
|
310
|
+
loadPayloadSchema?: (filePath: string) => Promise<unknown>;
|
|
311
|
+
/**
|
|
312
|
+
* 隔离执行器(默认 runTaskInWorker)——任务声明 timeoutMs 时由语义层调用,
|
|
313
|
+
* 独立 worker 线程执行 + 超时两段式取消;测试注入 spy 验证执行路径路由
|
|
314
|
+
*/
|
|
315
|
+
runIsolated?: TaskWorkerRunner;
|
|
316
|
+
/**
|
|
317
|
+
* 执行失败/取消钩子(config.task.onFailed)——每次 process 抛错后触发
|
|
318
|
+
* (含将重试的失败);用于告警/死信上报等副作用,自身抛错被忽略
|
|
319
|
+
*/
|
|
320
|
+
onFailed?: TaskFailedHandler;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* 任务失败信息(onFailed 钩子参数)
|
|
324
|
+
*
|
|
325
|
+
* willRetry 按任务 meta.retries 推算(attempt <= retries 时驱动会重试);
|
|
326
|
+
* cancelled = 执行被框架终止(超时终止/停机取消),与 run 自身失败区分。
|
|
327
|
+
*/
|
|
328
|
+
interface TaskFailedInfo {
|
|
329
|
+
task: string;
|
|
330
|
+
jobId: string;
|
|
331
|
+
attempt: number;
|
|
332
|
+
willRetry: boolean;
|
|
333
|
+
cancelled: boolean;
|
|
334
|
+
error: string;
|
|
335
|
+
}
|
|
336
|
+
type TaskFailedHandler = (info: TaskFailedInfo) => Promise<void> | void;
|
|
337
|
+
|
|
1
338
|
/**
|
|
2
339
|
* SSE(Server-Sent Events)支持
|
|
3
340
|
*
|
|
@@ -273,12 +610,23 @@ interface AgentHandleStore {
|
|
|
273
610
|
get(ctx: FaapiContext): unknown;
|
|
274
611
|
clear(): void;
|
|
275
612
|
}
|
|
613
|
+
/** task 客户端工厂函数(由 createAppBase 注册,返回 TaskClient 门面) */
|
|
614
|
+
type TaskHandleFactory = (ctx: FaapiContext) => unknown;
|
|
615
|
+
interface TaskHandleStore {
|
|
616
|
+
/** 注册工厂(null 清理);二次注册覆盖 */
|
|
617
|
+
register(factory: TaskHandleFactory | null): void;
|
|
618
|
+
/** 工厂已注册时返回 TaskClient,未注册返回 undefined */
|
|
619
|
+
get(ctx: FaapiContext): unknown;
|
|
620
|
+
clear(): void;
|
|
621
|
+
}
|
|
276
622
|
/** 一个 app 实例持有的全套注册表 */
|
|
277
623
|
interface AppRegistries {
|
|
278
624
|
tool: ToolRegistry;
|
|
279
625
|
agent: AgentRegistry;
|
|
280
626
|
skill: SkillRegistry;
|
|
627
|
+
task: TaskRegistry;
|
|
281
628
|
agentHandle: AgentHandleStore;
|
|
629
|
+
taskHandle: TaskHandleStore;
|
|
282
630
|
}
|
|
283
631
|
/** 创建一套 app 级注册表(`createAppBase` 每次调用创建独立实例) */
|
|
284
632
|
declare function createAppRegistries(): AppRegistries;
|
|
@@ -342,6 +690,12 @@ interface FaapiContext {
|
|
|
342
690
|
* (injectParams 等消费方回退到默认全局实例)
|
|
343
691
|
*/
|
|
344
692
|
registries?: AppRegistries;
|
|
693
|
+
/**
|
|
694
|
+
* 任务队列客户端(TaskClient:enqueue/list)。
|
|
695
|
+
* 经 createContext 进入请求链路时由框架从 `registries.taskHandle` 工厂注入;
|
|
696
|
+
* 无 app 编排(编程式直调 ctx)时为 undefined
|
|
697
|
+
*/
|
|
698
|
+
tasks?: TaskClient;
|
|
345
699
|
request: Request;
|
|
346
700
|
params: Record<string, string>;
|
|
347
701
|
query: URLSearchParams;
|
|
@@ -706,4 +1060,4 @@ interface RouteInfo {
|
|
|
706
1060
|
output: RouteOutputSchema | null;
|
|
707
1061
|
}
|
|
708
1062
|
|
|
709
|
-
export { type AppRegistries as A, type CorsOptions as C, type FaapiContext as F, type HelmetOptions as H, type InjectorMap as I, type LoggerOptions as L, type RouteManifest as R, type SkillRegistry as S, type
|
|
1063
|
+
export { type AppRegistries as A, type TaskDriverJob as B, type CorsOptions as C, type TaskDriverProcess as D, type TaskDriverRecord as E, type FaapiContext as F, type TaskFailedInfo as G, type HelmetOptions as H, type InjectorMap as I, type TaskJob as J, type TaskJobStatus as K, type LoggerOptions as L, type TaskMetadata as M, type TaskModule as N, type ToolCore as O, type ToolPathMeta as P, type ToolRegistry as Q, type RouteManifest as R, type SkillRegistry as S, type TaskClient as T, cors as U, createAppRegistries as V, type WsRouteManifest as W, createTaskRegistry as X, helmet as Y, logger as Z, type FaapiMiddleware as a, type TaskFailedHandler as b, type TaskQueueDeps as c, type TaskQueue as d, type TaskDriver as e, type TaskRegistry as f, type TaskManifest as g, type ToolMetadata as h, type AgentCore as i, type AgentMetadata as j, type AgentHandleFactory as k, type AgentHandleStore as l, type AgentPathMeta as m, type AgentRegistry as n, type AgentToolDescriptor as o, type FaapiContextConfig as p, type FaapiTaskMeta as q, type FailOptions as r, type Injector as s, type RouteInfo as t, type RouteInputSchema as u, type RouteOutputSchema as v, type RouteParamSchema as w, type SseEvent as x, type SseWriter as y, type TaskContext as z };
|
package/dist/testing.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { F as FaapiContext, a as FaapiMiddleware, I as InjectorMap, R as RouteManifest, W as WsRouteManifest, C as CorsOptions, H as HelmetOptions, L as LoggerOptions } from './routeTypes-
|
|
1
|
+
import { F as FaapiContext, a as FaapiMiddleware, I as InjectorMap, R as RouteManifest, W as WsRouteManifest, C as CorsOptions, H as HelmetOptions, L as LoggerOptions } from './routeTypes-_17rXzal.js';
|
|
2
2
|
import { Server } from 'node:http';
|
|
3
3
|
import { WebSocket } from 'ws';
|
|
4
4
|
|
package/dist/testing.js
CHANGED
|
@@ -371,6 +371,7 @@ function createContextFromUrl(request, url, params, config = {}, ip = "", regist
|
|
|
371
371
|
};
|
|
372
372
|
if (registries) {
|
|
373
373
|
ctx.registries = registries;
|
|
374
|
+
ctx.tasks = registries.taskHandle.get(ctx);
|
|
374
375
|
}
|
|
375
376
|
const extend = config?.extendContext;
|
|
376
377
|
if (typeof extend === "function") {
|
|
@@ -550,8 +551,10 @@ var PARAM_TYPE_MAP = {
|
|
|
550
551
|
fields: "fields",
|
|
551
552
|
agent: "agent",
|
|
552
553
|
// Phase 2.3
|
|
553
|
-
agents: "agents"
|
|
554
|
+
agents: "agents",
|
|
554
555
|
// Phase 2.3
|
|
556
|
+
tasks: "tasks"
|
|
557
|
+
// 任务子系统:TaskClient(入队/查询)
|
|
555
558
|
};
|
|
556
559
|
var injectionCache = /* @__PURE__ */ new WeakMap();
|
|
557
560
|
function resolveInjection(fn) {
|
|
@@ -645,6 +648,29 @@ function queryToObject(params) {
|
|
|
645
648
|
return result;
|
|
646
649
|
}
|
|
647
650
|
|
|
651
|
+
// src/task/taskRegistry.ts
|
|
652
|
+
function createTaskRegistry() {
|
|
653
|
+
let registry = /* @__PURE__ */ new Map();
|
|
654
|
+
return {
|
|
655
|
+
hydrate(tasks) {
|
|
656
|
+
const next = /* @__PURE__ */ new Map();
|
|
657
|
+
for (const task of tasks) {
|
|
658
|
+
next.set(task.name, task);
|
|
659
|
+
}
|
|
660
|
+
registry = next;
|
|
661
|
+
},
|
|
662
|
+
get(name) {
|
|
663
|
+
return registry.get(name);
|
|
664
|
+
},
|
|
665
|
+
list() {
|
|
666
|
+
return Array.from(registry.values());
|
|
667
|
+
},
|
|
668
|
+
clear() {
|
|
669
|
+
registry = /* @__PURE__ */ new Map();
|
|
670
|
+
}
|
|
671
|
+
};
|
|
672
|
+
}
|
|
673
|
+
|
|
648
674
|
// src/injection/registries.ts
|
|
649
675
|
function createToolRegistry() {
|
|
650
676
|
let registry = /* @__PURE__ */ new Map();
|
|
@@ -767,12 +793,29 @@ function createAgentHandleStore() {
|
|
|
767
793
|
}
|
|
768
794
|
};
|
|
769
795
|
}
|
|
796
|
+
function createTaskHandleStore() {
|
|
797
|
+
let currentFactory = null;
|
|
798
|
+
return {
|
|
799
|
+
register(factory) {
|
|
800
|
+
currentFactory = factory;
|
|
801
|
+
},
|
|
802
|
+
get(ctx) {
|
|
803
|
+
if (currentFactory === null) return void 0;
|
|
804
|
+
return currentFactory(ctx);
|
|
805
|
+
},
|
|
806
|
+
clear() {
|
|
807
|
+
currentFactory = null;
|
|
808
|
+
}
|
|
809
|
+
};
|
|
810
|
+
}
|
|
770
811
|
function createAppRegistries() {
|
|
771
812
|
const tool = createToolRegistry();
|
|
772
813
|
const agent = createAgentRegistry(tool);
|
|
773
814
|
const skill = createSkillRegistry();
|
|
815
|
+
const task = createTaskRegistry();
|
|
774
816
|
const agentHandle = createAgentHandleStore();
|
|
775
|
-
|
|
817
|
+
const taskHandle = createTaskHandleStore();
|
|
818
|
+
return { tool, agent, skill, task, agentHandle, taskHandle };
|
|
776
819
|
}
|
|
777
820
|
var defaultRegistries = createAppRegistries();
|
|
778
821
|
|
|
@@ -826,6 +869,9 @@ function getBuiltinInjectionValue(type, ctx, body) {
|
|
|
826
869
|
// Phase 3.5:调 @faapi/agent 插件注册的工厂获取 AgentHandle
|
|
827
870
|
case "agent":
|
|
828
871
|
return ctx.registries ? ctx.registries.agentHandle.get(ctx) : getAgentHandle(ctx);
|
|
872
|
+
// 任务子系统:注入 TaskClient(入队/查询);未注册工厂(无 app 编排)时 undefined
|
|
873
|
+
case "tasks":
|
|
874
|
+
return ctx.registries ? ctx.registries.taskHandle.get(ctx) : void 0;
|
|
829
875
|
default:
|
|
830
876
|
return void 0;
|
|
831
877
|
}
|