weifuwu 0.90.0 → 0.91.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.
Files changed (72) hide show
  1. package/README.md +4 -2
  2. package/dist/client/components/WordCloud/WordCloud.d.ts +79 -0
  3. package/dist/client/components/index.d.ts +2 -0
  4. package/dist/client/components/index.js +33 -33
  5. package/dist/client/components/style.css +95 -1
  6. package/dist/client/layout/weifuwu-layout.css +19 -0
  7. package/dist/client/vdom/core/v2/diff.d.ts +2 -2
  8. package/dist/client/vdom/hooks/env.d.ts +20 -0
  9. package/dist/client/vdom/index.js +3 -3
  10. package/dist/client/vdom/testing.js +2 -2
  11. package/dist/server/ai/approvals.d.ts +24 -0
  12. package/dist/server/ai/assemble.d.ts +19 -0
  13. package/dist/server/ai/client.d.ts +22 -0
  14. package/dist/server/ai/contracts.d.ts +67 -2
  15. package/dist/server/ai/index.d.ts +14 -43
  16. package/dist/server/ai/memory-server.d.ts +50 -0
  17. package/dist/server/ai/memory.d.ts +46 -0
  18. package/dist/server/ai/multimodal.d.ts +52 -0
  19. package/dist/server/ai/openai.d.ts +16 -0
  20. package/dist/server/db/body.d.ts +31 -0
  21. package/dist/server/db/consistency.d.ts +28 -0
  22. package/dist/server/db/contracts.d.ts +3 -27
  23. package/dist/server/db/filter.d.ts +24 -0
  24. package/dist/server/db/gql-from-shape.d.ts +42 -0
  25. package/dist/server/db/http.d.ts +38 -0
  26. package/dist/server/db/memory-sql.d.ts +66 -8
  27. package/dist/server/db/ops.d.ts +70 -0
  28. package/dist/server/db/orm.d.ts +110 -0
  29. package/dist/server/db/query-builder.d.ts +4 -2
  30. package/dist/server/db/query.d.ts +90 -32
  31. package/dist/server/db/rest-from-shape.d.ts +56 -0
  32. package/dist/server/db/schema.d.ts +78 -0
  33. package/dist/server/db/server.d.ts +0 -2
  34. package/dist/server/db/shape.d.ts +131 -0
  35. package/dist/server/db/typed-query.d.ts +113 -0
  36. package/dist/server/email/api.d.ts +15 -0
  37. package/dist/server/email/contracts.d.ts +8 -3
  38. package/dist/server/email/index.d.ts +23 -30
  39. package/dist/server/email/memory-email-server.d.ts +43 -0
  40. package/dist/server/email/memory-email.d.ts +30 -0
  41. package/dist/server/index.d.ts +33 -10
  42. package/dist/server/index.js +9843 -4133
  43. package/dist/server/messager/index.d.ts +133 -12
  44. package/dist/server/postgres/client.d.ts +4 -4
  45. package/dist/server/postgres/types.d.ts +33 -13
  46. package/dist/server/redis/types.d.ts +2 -0
  47. package/dist/server/response.d.ts +3 -3
  48. package/dist/server/types.d.ts +2 -5
  49. package/dist/server/user/app-auth.d.ts +74 -0
  50. package/dist/server/user/index.d.ts +277 -5
  51. package/dist/server/workflow/contracts.d.ts +202 -0
  52. package/dist/server/workflow/expression.d.ts +89 -0
  53. package/dist/server/workflow/index.d.ts +70 -0
  54. package/dist/server/workflow/index.js +2476 -0
  55. package/dist/server/workflow/runner.d.ts +19 -0
  56. package/dist/server/workflow/std.d.ts +27 -0
  57. package/dist/server/workflow/steps.d.ts +12 -0
  58. package/dist/server/workflow/store.d.ts +19 -0
  59. package/dist/server/workflow/tojs.d.ts +28 -0
  60. package/dist/server/workflow/validate.d.ts +23 -0
  61. package/dist/server/workflow/views.d.ts +66 -0
  62. package/dist/server/workflow/wfjs.d.ts +27 -0
  63. package/dist/server/workflows/cron.d.ts +16 -0
  64. package/dist/server/workflows/index.d.ts +267 -0
  65. package/dist/shared/zod.d.ts +351 -0
  66. package/docs/client.md +6 -0
  67. package/docs/server.md +455 -11
  68. package/package.json +9 -3
  69. package/dist/server/db/postgres-server.d.ts +0 -39
  70. package/dist/server/db/sql-parser.d.ts +0 -24
  71. package/dist/server/db/test-servers.d.ts +0 -21
  72. package/dist/server/email/smtp.d.ts +0 -34
@@ -13,7 +13,7 @@
13
13
  */
14
14
  import { type Context, type Middleware } from '../types.ts';
15
15
  import type { Router } from '../core/router.ts';
16
- import type { SqlClient } from '../postgres/types.ts';
16
+ import type { Orm } from '../db/orm.ts';
17
17
  import type { Redis } from '../db/contracts.ts';
18
18
  import type { WebSocketHandler } from '../core/ws.ts';
19
19
  export type MessageSenderType = 'user' | 'agent' | 'system';
@@ -98,23 +98,14 @@ export interface MessagerSystem extends Middleware<Context, Context & MessagerIn
98
98
  /** 核心服务(测试/服务层直接调用;ctx.msg 同对象) */
99
99
  client: MessagerClient;
100
100
  /** 幂等建表(conversations + members + messages) */
101
- migrate: () => Promise<void>;
102
101
  /** HTTP 路由(P3):/api/messages/* */
103
102
  routes: (app: Router<any>, opts?: {
104
103
  prefix?: string;
105
104
  }) => void;
106
105
  }
107
106
  export interface MessagerOptions {
108
- sql: SqlClient;
109
- /**
110
- * 连接级事务(传 `pg.transaction` / `pool.begin`)——提供时会话创建原子。
111
- * 不传 → 裸执行(回退面:成员 insert 失败时孤儿会话——低影响;并发唯一性由
112
- * M9 direct_key 唯一约束兜底)。
113
- * M10(2027-XX):原实现 sql.unsafe('BEGIN'/'COMMIT') 在连接池下断裂——
114
- * pool.query 每条 acquire/release 任意连接(BEGIN 在 A、INSERT 在 B、COMMIT 在 C)
115
- * ——`pool.begin` 才是连接亲和的正途。
116
- */
117
- transaction?: <T>(fn: (sql: SqlClient) => Promise<T>) => Promise<T>;
107
+ /** 声明式 ORM(postgres() 中间件的 .orm——表绑定/校验/事务) */
108
+ orm: Orm;
118
109
  /** Redis(可选:多进程广播/实时推送需要;不传则仅本进程内广播)——
119
110
  * 传 `redis().redis`(中间件)或 `new RedisPool()`/`RedisPool.create()` */
120
111
  redis?: Redis;
@@ -125,4 +116,134 @@ declare module '../types.ts' {
125
116
  msg?: MessagerClient;
126
117
  }
127
118
  }
119
+ export declare const MESSAGER_TABLES: {
120
+ readonly conversations: {
121
+ readonly id: import("../db/shape.ts").WithMeta<import("../../shared/zod.ts").ZodString, {
122
+ pk: true;
123
+ default: "random";
124
+ }>;
125
+ readonly type: import("../../shared/zod.ts").ZodString;
126
+ readonly created_by: import("../../shared/zod.ts").ZodNullable<import("../../shared/zod.ts").ZodString>;
127
+ readonly direct_key: import("../../shared/zod.ts").ZodNullable<import("../../shared/zod.ts").ZodString>;
128
+ readonly created_at: import("../db/shape.ts").WithMeta<import("../../shared/zod.ts").ZodDate, {
129
+ default: "now";
130
+ }>;
131
+ };
132
+ readonly members: {
133
+ readonly conversation_id: import("../db/shape.ts").WithMeta<import("../../shared/zod.ts").ZodString, {
134
+ notNull: true;
135
+ }>;
136
+ readonly user_id: import("../db/shape.ts").WithMeta<import("../../shared/zod.ts").ZodString, {
137
+ notNull: true;
138
+ }>;
139
+ readonly last_read_at: import("../../shared/zod.ts").ZodNullable<import("../../shared/zod.ts").ZodDate>;
140
+ readonly joined_at: import("../db/shape.ts").WithMeta<import("../../shared/zod.ts").ZodDate, {
141
+ default: "now";
142
+ }>;
143
+ };
144
+ readonly messages: {
145
+ readonly id: import("../db/shape.ts").WithMeta<import("../../shared/zod.ts").ZodString, {
146
+ pk: true;
147
+ default: "random";
148
+ }>;
149
+ readonly conversation_id: import("../db/shape.ts").WithMeta<import("../../shared/zod.ts").ZodString, {
150
+ notNull: true;
151
+ }>;
152
+ readonly sender_type: import("../../shared/zod.ts").ZodString;
153
+ readonly sender_id: import("../../shared/zod.ts").ZodNullable<import("../../shared/zod.ts").ZodString>;
154
+ readonly content: import("../db/shape.ts").WithMeta<import("../../shared/zod.ts").ZodString, {
155
+ notNull: true;
156
+ }>;
157
+ readonly msg_type: import("../../shared/zod.ts").ZodString;
158
+ readonly created_at: import("../db/shape.ts").WithMeta<import("../../shared/zod.ts").ZodDate, {
159
+ default: "now";
160
+ }>;
161
+ readonly edited_at: import("../../shared/zod.ts").ZodNullable<import("../../shared/zod.ts").ZodDate>;
162
+ readonly deleted_at: import("../../shared/zod.ts").ZodNullable<import("../../shared/zod.ts").ZodDate>;
163
+ };
164
+ };
128
165
  export declare function messager(options: MessagerOptions): MessagerSystem;
166
+ export declare const WEIFUWU_MESSAGER_SCHEMA: {
167
+ tables: ({
168
+ name: string;
169
+ columns: {
170
+ id: import("../db/shape.ts").WithMeta<import("../../shared/zod.ts").ZodString, {
171
+ pk: true;
172
+ default: "random";
173
+ }>;
174
+ type: import("../../shared/zod.ts").ZodString;
175
+ created_by: import("../../shared/zod.ts").ZodString;
176
+ direct_key: import("../../shared/zod.ts").ZodNullable<import("../../shared/zod.ts").ZodString>;
177
+ created_at: import("../../shared/zod.ts").ZodDate;
178
+ conversation_id?: undefined;
179
+ user_id?: undefined;
180
+ last_read_at?: undefined;
181
+ joined_at?: undefined;
182
+ sender_type?: undefined;
183
+ sender_id?: undefined;
184
+ content?: undefined;
185
+ msg_type?: undefined;
186
+ edited_at?: undefined;
187
+ deleted_at?: undefined;
188
+ };
189
+ uniques?: undefined;
190
+ indexes?: undefined;
191
+ } | {
192
+ name: string;
193
+ columns: {
194
+ conversation_id: import("../db/shape.ts").WithMeta<import("../../shared/zod.ts").ZodString, {
195
+ notNull: true;
196
+ }>;
197
+ user_id: import("../db/shape.ts").WithMeta<import("../../shared/zod.ts").ZodString, {
198
+ notNull: true;
199
+ }>;
200
+ last_read_at: import("../../shared/zod.ts").ZodDate;
201
+ joined_at: import("../../shared/zod.ts").ZodDate;
202
+ id?: undefined;
203
+ type?: undefined;
204
+ created_by?: undefined;
205
+ direct_key?: undefined;
206
+ created_at?: undefined;
207
+ sender_type?: undefined;
208
+ sender_id?: undefined;
209
+ content?: undefined;
210
+ msg_type?: undefined;
211
+ edited_at?: undefined;
212
+ deleted_at?: undefined;
213
+ };
214
+ uniques: string[][];
215
+ indexes?: undefined;
216
+ } | {
217
+ name: string;
218
+ columns: {
219
+ id: import("../db/shape.ts").WithMeta<import("../../shared/zod.ts").ZodString, {
220
+ pk: true;
221
+ default: "random";
222
+ }>;
223
+ conversation_id: import("../db/shape.ts").WithMeta<import("../../shared/zod.ts").ZodString, {
224
+ notNull: true;
225
+ }>;
226
+ sender_type: import("../../shared/zod.ts").ZodString;
227
+ sender_id: import("../../shared/zod.ts").ZodString;
228
+ content: import("../../shared/zod.ts").ZodString;
229
+ msg_type: import("../../shared/zod.ts").ZodString;
230
+ created_at: import("../../shared/zod.ts").ZodDate;
231
+ edited_at: import("../../shared/zod.ts").ZodDate;
232
+ deleted_at: import("../../shared/zod.ts").ZodDate;
233
+ type?: undefined;
234
+ created_by?: undefined;
235
+ direct_key?: undefined;
236
+ user_id?: undefined;
237
+ last_read_at?: undefined;
238
+ joined_at?: undefined;
239
+ };
240
+ indexes: {
241
+ cols: (string | {
242
+ col: string;
243
+ desc: true;
244
+ })[];
245
+ name: string;
246
+ }[];
247
+ uniques?: undefined;
248
+ })[];
249
+ };
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * weifuwu/postgres — PostgreSQL 中间件(自研客户端)
3
3
  *
4
- * 注入 ctx.sql(callable tagged template + 方法面)。
4
+ * 注入 ctx.orm(声明式 ORM——业务唯一数据入口;ctx.sql 已删除)。
5
5
  * 零第三方依赖——PG v3 协议自研。
6
6
  *
7
- * ctx.sql`SELECT * FROM t WHERE id = ${id}` ← tagged template → 参数化
8
- * ctx.sql.unsafe(sql, params?) ← 原生 SQL(DDL/动态表名)
9
- * ctx.sql.begin(fn) ← 事务(postgres.js 兼容)
7
+ * ctx.orm.table('users').select().where({...}).run() ← 表绑定查询
8
+ * ctx.orm.query.from(...).join(...) ← 跨表查询
9
+ * ctx.orm.execute(sql, params?) ← 原生逃生舱(DDL/迁移)
10
10
  */
11
11
  import type { PostgresOptions, PostgresClient } from './types.ts';
12
12
  export declare const MIGRATIONS_TABLE = "_weifuwu_migrations";
@@ -1,20 +1,16 @@
1
1
  import type { Context, Middleware, Closeable } from '../types.ts';
2
- import type { Sql } from '../db/contracts.ts';
3
- declare module '../types.ts' {
4
- interface Context {
5
- sql: Sql;
6
- }
7
- }
8
- /** 契约:SQL 标签模板(ctx.sql)——定义于 src/db/contracts.ts(自研引擎实现) */
9
- export type { Sql };
10
- /** 旧名兼容(SqlClient → Sql,契约单一来源 db/contracts.ts) */
11
- export type SqlClient = Sql;
2
+ import type { Orm, OrmTenant, CtxOrm } from '../db/orm.ts';
12
3
  export interface PostgresInjected {
13
- sql: SqlClient;
4
+ /** 声明式 ORM(shape+operator+adapter——业务唯一数据入口;ctx.sql 已删除)
5
+ * W1:tenant 配置后为 CtxOrm(ctxTable 自动 scope 面);未配置时 ctxTable
6
+ * 等价 table(无 scope 语义——类型统一 CtxOrm——诚实标注) */
7
+ orm: CtxOrm;
14
8
  }
15
9
  export interface PostgresOptions {
16
10
  /** 连接字符串(默认 DATABASE_URL) */
17
11
  connection?: string;
12
+ /** 内存模式(测试——AST 直执行零 wire:不建 PgPool——memorySql 直调) */
13
+ memory?: boolean;
18
14
  /** 池大小(连接数)。默认 10。 */
19
15
  max?: number;
20
16
  /** 池全忙时 acquire 超时 ms(防饿死)。默认 30_000。0 = 无限。 */
@@ -22,6 +18,9 @@ export interface PostgresOptions {
22
18
  /** 语句超时 ms(慢查询保护,会话级 SET statement_timeout)。默认 0 = 禁用。 */
23
19
  statementTimeoutMs?: number;
24
20
  /** 查询观测钩子(慢查询日志/审计) */
21
+ /** 租户 scope(W1 接线——中间件注入 ctx.orm = orm.withCtx(ctx)——select/update/delete
22
+ * 自动预置 tenant 条件 + insert 自动注入字段——平台手写 app_id 过滤收口) */
23
+ tenant?: OrmTenant;
25
24
  /** 查询观测钩子(慢查询日志/审计);第 4 参数为请求级 traceId(x-trace-id 头,无则 undefined) */
26
25
  onQuery?: (query: string, durationMs: number, rowCount: number, traceId?: string) => void;
27
26
  /** postgres.js 兼容名(= max) */
@@ -39,14 +38,20 @@ export interface PostgresOptions {
39
38
  idle_timeout?: number;
40
39
  }
41
40
  export interface PostgresClient extends Middleware<Context, Context & PostgresInjected>, Closeable {
42
- sql: SqlClient;
41
+ /** 声明式 ORM(shape+operator+adapter——表绑定/校验/类型收窄/gql) */
42
+ orm: Orm;
43
43
  /** Creates the migration tracking table (_weifuwu_migrations). Called once at startup. */
44
44
  migrate: () => Promise<void>;
45
45
  /** Record that a module's migration has been applied (idempotent). */
46
46
  markMigrated: (moduleName: string) => Promise<void>;
47
47
  /** Check whether a module has already been migrated. */
48
48
  isMigrated: (moduleName: string) => Promise<boolean>;
49
- transaction: <T>(fn: (sql: SqlClient) => Promise<T>, retryOpts?: {
49
+ /** 迁移面(DDL 唯一入口):执行 + 记录(已迁移名跳过)。业务查询不 execute——全算子化。 */
50
+ runMigration: (name: string, sql: string) => Promise<void>;
51
+ /** 声明式 Schema 迁移(SchemaModule → 生成 DDL → 执行+记录——业务零 SQL 字符串) */
52
+ migrateModule: (name: string, mod: import('../db/schema.ts').SchemaModule) => Promise<void>;
53
+ /** ORM 面事务(fn 收 orm——含 orm.query/execute——连接级同连接) */
54
+ transaction: <T>(fn: (orm: Orm) => Promise<T>, retryOpts?: {
50
55
  maxRetries?: number;
51
56
  }) => Promise<T>;
52
57
  /** Connection pool configuration summary. */
@@ -56,5 +61,20 @@ export interface PostgresClient extends Middleware<Context, Context & PostgresIn
56
61
  waiting: number;
57
62
  max: number;
58
63
  };
64
+ /** 一致性诊断(W3):orm 注册表(声明权威)vs information_schema(库实况)——
65
+ * 表缺失/列缺失 error(必须修)· 类型不匹配 warn(声明/DDL 对齐面·粗粒度
66
+ * 等价组)· 库多余表/列 warn(残留提示)——零参数(registry 自动枚举——
67
+ * 惰性注册先用 tables(orm) 先行) */
68
+ checkConsistency: () => Promise<{
69
+ ok: boolean;
70
+ issues: {
71
+ level: 'error' | 'warn';
72
+ kind: string;
73
+ table: string;
74
+ column?: string;
75
+ expected?: string;
76
+ found?: string;
77
+ }[];
78
+ }>;
59
79
  close: () => Promise<void>;
60
80
  }
@@ -10,6 +10,8 @@ export type { Redis };
10
10
  export type RedisOptions = {
11
11
  /** Redis URL(默认 REDIS_URL 环境变量;两者都缺 → 构造抛错,禁止静默回退 localhost) */
12
12
  url?: string;
13
+ /** 内存模式(测试——MemoryRedis 直调零 wire) */
14
+ memory?: boolean;
13
15
  /** 池大小(连接数)。默认 5。 */
14
16
  poolSize?: number;
15
17
  /** 所有 key 自动加前缀(多应用共享 Redis 时隔离命名空间) */
@@ -7,9 +7,9 @@
7
7
  * import { ok, created, badRequest, notFound, redirect } from 'weifuwu'
8
8
  *
9
9
  * app.get('/users/:id', async (req, ctx) => {
10
- * const [user] = await ctx.sql`SELECT * FROM users WHERE id = ${ctx.params.id}`
11
- * if (!user) return notFound('用户不存在')
12
- * return ok(user)
10
+ * const user = await ctx.orm.query.from('users').where({ id: { eq: ctx.params.id } }).run()
11
+ * if (!user.length) return notFound('用户不存在')
12
+ * return ok(user[0])
13
13
  * })
14
14
  * ```
15
15
  */
@@ -1,6 +1,3 @@
1
- import type { Sql } from "./postgres/types.ts";
2
- export type { Sql };
3
- export type { SqlClient } from './postgres/types.ts';
4
1
  /** Re-export for downstream usage. */
5
2
  /** Lightweight WebSocket interface for WS handler types (avoids external dep resolution). */
6
3
  export interface WebSocket {
@@ -89,9 +86,9 @@ export declare class HttpError extends Error {
89
86
  *
90
87
  * const myMw = createMiddleware({
91
88
  * injects: ['myField'],
92
- * depends: ['sql'],
89
+ * depends: ['orm'],
93
90
  * setup: async (ctx) => {
94
- * const result = await ctx.sql`SELECT ...`
91
+ * const result = await ctx.orm.query.from('things').where({ kind: { eq: 'x' } }).run()
95
92
  * return { myField: result }
96
93
  * },
97
94
  * })
@@ -0,0 +1,74 @@
1
+ /**
2
+ * weifuwu/appAuth — 业务侧认证中间件(分离模式:_builtin 控制平面签发 token →
3
+ * 业务应用独立进程解析——零网络验签·ctx 注入与 userSystem 同语义)
4
+ *
5
+ * 与 userSystem 的分工(路由命名空间定案):
6
+ * userSystem = _builtin 侧(控制平面:建库/成员/签发/全量路由)
7
+ * appAuth = 业务应用侧(薄:验签解析 → ctx.session/ctx.user/ctx.appId/ctx.builtin)
8
+ *
9
+ * 运行时注入面(类型由应用层标注——平台模式 AppCtx 自包含接口):
10
+ * ctx.user { id, email?, name? } | null (token 包内——零查库)
11
+ * ctx.session { userId, appId, role } | null (身份三元组——主面)
12
+ * ctx.appId string (便捷面)
13
+ * ctx.auth { requireAuth(), userId, appId, role }(薄方法面)
14
+ * ctx.builtin { get/post } (机器客户端——appId+appKey 自动带)
15
+ *
16
+ * 注:
17
+ * - token 由 _builtin 签发(HMAC-SHA256·共享 secret)——验签零网络
18
+ * - 角色变更/停用即时性:TTL 后生效(诚实边界——需即时配 verifyToken 在线校验)
19
+ * - ctx.user 无查库——业务需要更多面用 ctx.orm 自查(共享 DB 模式)
20
+ */
21
+ import type { Middleware, Context, User } from '../types.ts';
22
+ /**
23
+ * AuthInterface 公共面(两实现同构视图):
24
+ * 本地 = userSystem().asAppAuth()(查库——角色/账号即时)
25
+ * 远程 = appAuth()(token 验签快照——TTL 边界)
26
+ * 业务代码只见 AuthPort(薄面字段——两实现都真)——方法面(AuthApi)为
27
+ * 控制平面专属(本地超集——远程不存在——分离部署时业务侧不用) */
28
+ /** 当前会话(token 解出的应用态——{ userId, appId, role }·平台账号 token = null) */
29
+ export interface Session {
30
+ userId: string;
31
+ appId: string;
32
+ role: string;
33
+ }
34
+ export interface AuthPort {
35
+ /** 未登录抛 HttpError(401);返回当前会话三元组 */
36
+ requireAuth(): Session;
37
+ readonly userId: string | undefined;
38
+ readonly appId: string | undefined;
39
+ readonly role: string | undefined;
40
+ }
41
+ /** 中间件注入面(本地/远程同构) */
42
+ export interface AuthInjected extends Context {
43
+ /** 当前用户(token 包内/查库——未登录 = null) */
44
+ user: User | null;
45
+ /** 身份三元组(主面) */
46
+ session: Session | null;
47
+ /** 便捷面(token 应用态) */
48
+ appId?: string;
49
+ /** 公共薄面(方法面=控制平面专属——业务代码勿用) */
50
+ auth: AuthPort;
51
+ /** 机器客户端(仅远程实现 appAuth·builtin 配置时) */
52
+ builtin?: BuiltinClient;
53
+ }
54
+ export interface BuiltinClient {
55
+ get<T = unknown>(path: string): Promise<T>;
56
+ post<T = unknown>(path: string, body?: unknown): Promise<T>;
57
+ }
58
+ export interface AppAuthOptions {
59
+ /** HMAC 共享密钥(与 _builtin 签发面一致) */
60
+ secret: string;
61
+ /** 机器通信(可选——不配则无 ctx.builtin) */
62
+ builtin?: {
63
+ /** _builtin 控制平面 baseUrl(如 http://localhost:3000) */
64
+ baseUrl: string;
65
+ /** 本应用 id(X-Wf-App-Id) */
66
+ appId: string;
67
+ /** 本应用 appKey(X-Wf-App-Key) */
68
+ appKey: string;
69
+ };
70
+ /** 在线校验(可选——每次请求回 _builtin 强制校验 token——默认关=纯验签零网络) */
71
+ verifyToken?: (token: string) => Promise<boolean>;
72
+ }
73
+ /** 业务侧认证中间件工厂(分离模式——解析 _builtin 签发的 token——远程实现) */
74
+ export declare function appAuth(options: AppAuthOptions): Middleware<Context, AuthInjected>;