@ai-setting/roy-agent-core 1.7.56 → 1.7.58

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 (108) hide show
  1. package/dist/config/index.js +8 -8
  2. package/dist/env/agent/agent-component.d.ts +11 -0
  3. package/dist/env/agent/index.js +14 -14
  4. package/dist/env/commands/index.js +8 -8
  5. package/dist/env/context/index.js +4 -4
  6. package/dist/env/debug/index.js +8 -8
  7. package/dist/env/error-reply.d.ts +4 -3
  8. package/dist/env/event-source/event-source-handlers.d.ts +28 -0
  9. package/dist/env/event-source/index.js +18 -17
  10. package/dist/env/hook/index.js +6 -6
  11. package/dist/env/index.js +44 -43
  12. package/dist/env/llm/index.js +9 -9
  13. package/dist/env/log-trace/index.js +8 -8
  14. package/dist/env/log-trace/opentelemetry/tracer-provider.d.ts +86 -1
  15. package/dist/env/mcp/index.js +9 -9
  16. package/dist/env/mcp/tool/index.js +2 -2
  17. package/dist/env/memory/index.js +9 -9
  18. package/dist/env/memory/plugin/index.js +2 -2
  19. package/dist/env/plugin/index.js +11 -9
  20. package/dist/env/plugin/lark-cli-notification-channel.d.ts +11 -2
  21. package/dist/env/prompt/index.js +8 -8
  22. package/dist/env/session/index.js +11 -11
  23. package/dist/env/session/storage/index.js +5 -5
  24. package/dist/env/skill/index.js +8 -8
  25. package/dist/env/task/delegate/delegate-tool.d.ts +26 -0
  26. package/dist/env/task/delegate/index.js +9 -9
  27. package/dist/env/task/index.js +18 -17
  28. package/dist/env/task/plugins/index.js +11 -10
  29. package/dist/env/task/plugins/lark-card-patch-notifier.d.ts +109 -2
  30. package/dist/env/task/plugins/lark-card-state-store.d.ts +137 -0
  31. package/dist/env/task/plugins/lark-cli-task-notify-plugin.d.ts +154 -2
  32. package/dist/env/task/storage/index.js +4 -3
  33. package/dist/env/task/tools/index.js +4 -4
  34. package/dist/env/tool/built-in/index.js +4 -4
  35. package/dist/env/tool/index.js +11 -11
  36. package/dist/env/workflow/engine/index.js +13 -13
  37. package/dist/env/workflow/hooks/index.js +8 -8
  38. package/dist/env/workflow/index.js +23 -23
  39. package/dist/env/workflow/nodes/index.js +3 -3
  40. package/dist/env/workflow/plugins/index.js +9 -9
  41. package/dist/env/workflow/service/index.js +3 -3
  42. package/dist/env/workflow/storage/index.js +4 -4
  43. package/dist/env/workflow/tools/index.js +15 -15
  44. package/dist/env/workflow/utils/index.js +5 -5
  45. package/dist/index.js +58 -57
  46. package/dist/shared/@ai-setting/{roy-agent-core-0b3fdnn3.js → roy-agent-core-029r8kdw.js} +4 -4
  47. package/dist/shared/@ai-setting/{roy-agent-core-nra8vfrs.js → roy-agent-core-08njdcpj.js} +1 -1
  48. package/dist/shared/@ai-setting/{roy-agent-core-40xzbjtm.js → roy-agent-core-0kn3zt1t.js} +2 -2
  49. package/dist/shared/@ai-setting/{roy-agent-core-nhk0dsxr.js → roy-agent-core-0yn7a78e.js} +14 -14
  50. package/dist/shared/@ai-setting/{roy-agent-core-tbrn9wdm.js → roy-agent-core-14bq77wr.js} +1 -1
  51. package/dist/shared/@ai-setting/{roy-agent-core-qyqnmz8c.js → roy-agent-core-20m8je6e.js} +1 -1
  52. package/dist/shared/@ai-setting/{roy-agent-core-zmeka63k.js → roy-agent-core-2ctyjy62.js} +1 -1
  53. package/dist/shared/@ai-setting/{roy-agent-core-heft3j4c.js → roy-agent-core-2fk8c9ax.js} +3 -3
  54. package/dist/shared/@ai-setting/{roy-agent-core-8cgtwytv.js → roy-agent-core-4096f575.js} +4 -4
  55. package/dist/shared/@ai-setting/{roy-agent-core-yg247mk4.js → roy-agent-core-47s81t6g.js} +2 -2
  56. package/dist/shared/@ai-setting/{roy-agent-core-q7zksbw0.js → roy-agent-core-5f7myqnb.js} +5 -5
  57. package/dist/shared/@ai-setting/{roy-agent-core-vmg30n5x.js → roy-agent-core-6bradb0j.js} +15 -10
  58. package/dist/shared/@ai-setting/{roy-agent-core-zjttt2y4.js → roy-agent-core-7nb23tdd.js} +1 -1
  59. package/dist/shared/@ai-setting/roy-agent-core-7q4wdze2.js +7 -0
  60. package/dist/shared/@ai-setting/{roy-agent-core-d4jpn06f.js → roy-agent-core-84rs0c8d.js} +7 -7
  61. package/dist/shared/@ai-setting/{roy-agent-core-c6at31ra.js → roy-agent-core-84xtww7d.js} +3 -3
  62. package/dist/shared/@ai-setting/{roy-agent-core-202v00x4.js → roy-agent-core-89sxsrc7.js} +1 -1
  63. package/dist/shared/@ai-setting/{roy-agent-core-ezsyyjxw.js → roy-agent-core-8bngppw0.js} +580 -83
  64. package/dist/shared/@ai-setting/{roy-agent-core-b599jgyd.js → roy-agent-core-8p63s836.js} +1 -1
  65. package/dist/shared/@ai-setting/{roy-agent-core-e0wbq0qq.js → roy-agent-core-991pk4ss.js} +11 -11
  66. package/dist/shared/@ai-setting/{roy-agent-core-5rxs0ra3.js → roy-agent-core-9zhkdg6w.js} +2 -2
  67. package/dist/shared/@ai-setting/{roy-agent-core-gn8f4rhs.js → roy-agent-core-baaa4wtp.js} +2 -2
  68. package/dist/shared/@ai-setting/{roy-agent-core-nntphgww.js → roy-agent-core-c36335nw.js} +146 -8
  69. package/dist/shared/@ai-setting/{roy-agent-core-tc7gw38m.js → roy-agent-core-c7w2h47a.js} +3 -3
  70. package/dist/shared/@ai-setting/{roy-agent-core-j5c3chtn.js → roy-agent-core-cyefe8z5.js} +1 -1
  71. package/dist/shared/@ai-setting/{roy-agent-core-n3b7ztms.js → roy-agent-core-d75t8gea.js} +1 -1
  72. package/dist/shared/@ai-setting/{roy-agent-core-yv9x4wmg.js → roy-agent-core-e1w17tht.js} +2 -2
  73. package/dist/shared/@ai-setting/{roy-agent-core-f8sp1txg.js → roy-agent-core-e250355z.js} +3 -3
  74. package/dist/shared/@ai-setting/{roy-agent-core-9nv586rw.js → roy-agent-core-eanq305k.js} +22 -16
  75. package/dist/shared/@ai-setting/{roy-agent-core-6qgq7h1g.js → roy-agent-core-em4hks9t.js} +4 -4
  76. package/dist/shared/@ai-setting/{roy-agent-core-0bmk44ye.js → roy-agent-core-en2xqxs9.js} +5 -5
  77. package/dist/shared/@ai-setting/{roy-agent-core-3kz6934b.js → roy-agent-core-fbjd7bt6.js} +3 -7
  78. package/dist/shared/@ai-setting/{roy-agent-core-98aa9r0x.js → roy-agent-core-fw6k4w1h.js} +6 -6
  79. package/dist/shared/@ai-setting/{roy-agent-core-2044fbsd.js → roy-agent-core-fy4mcj6x.js} +40 -47
  80. package/dist/shared/@ai-setting/{roy-agent-core-ns3pbyz4.js → roy-agent-core-ge87xbas.js} +1 -1
  81. package/dist/shared/@ai-setting/{roy-agent-core-r9qe0ghe.js → roy-agent-core-geh6j7bw.js} +2 -2
  82. package/dist/shared/@ai-setting/{roy-agent-core-wafk25ff.js → roy-agent-core-gksw1gjb.js} +1 -1
  83. package/dist/shared/@ai-setting/{roy-agent-core-3dkzqqsd.js → roy-agent-core-hefarcp0.js} +1 -1
  84. package/dist/shared/@ai-setting/{roy-agent-core-5gw6w424.js → roy-agent-core-hs41gx9w.js} +5 -5
  85. package/dist/shared/@ai-setting/{roy-agent-core-d14h726p.js → roy-agent-core-jjhw9am6.js} +4 -4
  86. package/dist/shared/@ai-setting/{roy-agent-core-5psjwd08.js → roy-agent-core-jjxdmedn.js} +2 -2
  87. package/dist/shared/@ai-setting/{roy-agent-core-bwzy00t2.js → roy-agent-core-kq9pz2a7.js} +4 -4
  88. package/dist/shared/@ai-setting/{roy-agent-core-8t7wny6v.js → roy-agent-core-m68z3pw1.js} +1 -1
  89. package/dist/shared/@ai-setting/{roy-agent-core-16t0zfbk.js → roy-agent-core-m97jn2ra.js} +1 -1
  90. package/dist/shared/@ai-setting/{roy-agent-core-kzg1jwt8.js → roy-agent-core-n0p0hwgd.js} +1 -1
  91. package/dist/shared/@ai-setting/{roy-agent-core-xcq04fq0.js → roy-agent-core-psg6f1v6.js} +6 -6
  92. package/dist/shared/@ai-setting/{roy-agent-core-4zy2v3br.js → roy-agent-core-q4gdfypk.js} +3 -3
  93. package/dist/shared/@ai-setting/{roy-agent-core-m8n0dffe.js → roy-agent-core-rcgvmtms.js} +1 -1
  94. package/dist/shared/@ai-setting/{roy-agent-core-8seq65bp.js → roy-agent-core-rt115qfc.js} +44 -1
  95. package/dist/shared/@ai-setting/{roy-agent-core-jszgaevt.js → roy-agent-core-syyw58p9.js} +2 -2
  96. package/dist/shared/@ai-setting/{roy-agent-core-3mc6vmvj.js → roy-agent-core-t4x089js.js} +1 -1
  97. package/dist/shared/@ai-setting/{roy-agent-core-qjjf4tjb.js → roy-agent-core-t64nmayv.js} +2 -2
  98. package/dist/shared/@ai-setting/{roy-agent-core-833t16n1.js → roy-agent-core-txwptxk1.js} +3 -3
  99. package/dist/shared/@ai-setting/{roy-agent-core-w7hnjhvx.js → roy-agent-core-tze5596n.js} +3 -3
  100. package/dist/shared/@ai-setting/{roy-agent-core-pjxa78mp.js → roy-agent-core-vath15kt.js} +6 -6
  101. package/dist/shared/@ai-setting/{roy-agent-core-e677am8e.js → roy-agent-core-vgdhxbx3.js} +2 -2
  102. package/dist/shared/@ai-setting/{roy-agent-core-pemxr5n4.js → roy-agent-core-vh0qzb24.js} +2 -2
  103. package/dist/shared/@ai-setting/{roy-agent-core-v2188rnk.js → roy-agent-core-w93z6a42.js} +8 -8
  104. package/dist/shared/@ai-setting/{roy-agent-core-97eyghsp.js → roy-agent-core-ygn5tzt1.js} +2 -2
  105. package/dist/shared/@ai-setting/{roy-agent-core-1pnfkspm.js → roy-agent-core-yphwdm9x.js} +2 -2
  106. package/dist/shared/@ai-setting/{roy-agent-core-gngjkw3b.js → roy-agent-core-ytd5eztz.js} +1 -1
  107. package/dist/utils/temp-file-manager/index.js +2 -2
  108. package/package.json +1 -1
@@ -61,7 +61,25 @@
61
61
  * ★ Part 2(workflow 通知):新增 `"stopped"`(灰)—— task 只会用前三种,
62
62
  * 但同一套卡片骨架要给 workflow run 复用,而 workflow 有 stopped 终态。
63
63
  */
64
- export type CardStatus = "running" | "completed" | "failed" | "stopped";
64
+ export type CardStatus = "running" | "completed" | "failed" | "stopped"
65
+ /**
66
+ * ★ Task #4536:任务被**取消**(task.status = "cancelled")
67
+ *
68
+ * 旧实现把 cancelled 映射成 "failed" → 卡片显示「🚨 任务失败」,
69
+ * 语义错误(用户主动取消 ≠ 失败)。新增独立状态,灰色 + 「已取消」。
70
+ */
71
+ | "cancelled"
72
+ /**
73
+ * ★ Task #4540:任务被**删除**(用户口中的「取消」= `deleteTask()` 硬删除)
74
+ *
75
+ * 与 `cancelled` 的区别:
76
+ * - `cancelled` = `updateTask(status="cancelled")`,任务**实体还在**(可查、可恢复)
77
+ * - `deleted` = `deleteTask()`,任务实体**已从库消失**(不可恢复)
78
+ *
79
+ * 语义上必须分开:用户看到「🚫 已取消」会以为任务还能找回来;
80
+ * 硬删除后任务真的没了,卡片应显示「🗑️ 已删除」。
81
+ */
82
+ | "deleted";
65
83
  /** workflow 卡片状态(与 CardStatus 同集合;语义别名,便于阅读) */
66
84
  export type WorkflowCardStatus = CardStatus;
67
85
  /** 里程碑(关键节点):时间 + 标题 + 描述 */
@@ -167,11 +185,27 @@ export interface FinishTaskOptions {
167
185
  messageId: string;
168
186
  chatId?: string;
169
187
  profile?: string;
170
- status: Extract<CardStatus, "completed" | "failed">;
188
+ /**
189
+ * 终态卡片状态
190
+ *
191
+ * ★ Task #4536 扩展:
192
+ * - `completed` task.status = completed
193
+ * - `failed` task.status = failed / timeout
194
+ * - `cancelled` task.status = cancelled(**不再**误标「失败」)
195
+ * - `stopped` task.status = paused(用户 stop / 暂停;不是终结,可 resume)
196
+ */
197
+ status: Exclude<CardStatus, "running">;
171
198
  meta?: TaskMeta;
172
199
  /** 终态补充说明(会作为最后一条里程碑 append) */
173
200
  finalStep?: string;
174
201
  progress?: number;
202
+ /**
203
+ * 收尾里程碑的自定义标题(Task #4536 / xval round2 NIT 3)
204
+ *
205
+ * `pauseTask` 默认写「Task 已暂停」;archived 场景应传「Task 已归档」,
206
+ * 否则归档任务的卡片会误显示"已暂停"。
207
+ */
208
+ pausedMilestoneTitle?: string;
175
209
  }
176
210
  export interface StartTaskResult {
177
211
  messageId: string;
@@ -449,6 +483,22 @@ export declare function buildWorkflowCard(opts: {
449
483
  updateCount?: number;
450
484
  spinner?: string;
451
485
  }): CardPayload;
486
+ /**
487
+ * 卡片状态的对外快照(Task #4536)
488
+ *
489
+ * 用于持久化 / 重启恢复:`exportState` / `hydrateState` 的载荷类型。
490
+ */
491
+ export interface CardStateSnapshot {
492
+ chatId?: string;
493
+ profile?: string;
494
+ meta?: TaskMeta;
495
+ startedAt?: string;
496
+ updateCount?: number;
497
+ spinnerIndex?: number;
498
+ milestones?: Milestone[];
499
+ processSteps?: ProcessStep[];
500
+ progress?: number;
501
+ }
452
502
  /**
453
503
  * LarkCardPatchNotifier - 封装单卡片 patch 逻辑
454
504
  */
@@ -480,6 +530,63 @@ export declare class LarkCardPatchNotifier {
480
530
  * (旧实现传 `--content` 是非法 flag → 秒失败 → 卡片永远停在初始态)。
481
531
  */
482
532
  updateTask(opts: UpdateTaskOptions): Promise<void>;
533
+ /**
534
+ * 导出某张卡片的累积内容快照(Task #4536 / xval MAJOR 3)
535
+ *
536
+ * 供上层(`LarkCliTaskNotifyHook`)持久化到 store,让 roy-agent 重启后
537
+ * 第一次 patch 仍能带上原里程碑 / 过程步骤 / 更新计数,而不是退回
538
+ * "第 1 次更新 + 暂无里程碑"。
539
+ *
540
+ * 返回 `undefined` 表示本 notifier 没有该 messageId 的状态
541
+ * (例如刚重启 —— 此时调用方应先用 {@link hydrateState} 灌入)。
542
+ */
543
+ exportState(messageId: string): CardStateSnapshot | undefined;
544
+ /**
545
+ * 注入某张卡片的状态快照(Task #4536 / xval MAJOR 3)
546
+ *
547
+ * 用于**进程重启后**从持久层恢复卡片内容:之后 `updateTask` /
548
+ * `pauseTask` 会基于这份快照继续累积,而不是从空白重建。
549
+ *
550
+ * ★ 幂等:已有 state 时不覆盖(内存里的比持久化的更新)。
551
+ */
552
+ hydrateState(messageId: string, snapshot: CardStateSnapshot): void;
553
+ /**
554
+ * 暂停卡片(Task #4536:stop / archived)+ unpin,**保留**卡片状态与时间线
555
+ *
556
+ * ★ 为什么不能复用 `finishTask`(xval MAJOR 2 回归):
557
+ * `finishTask` 末尾会 `states.delete(messageId)` —— 那是终态语义(卡片到此为止)。
558
+ * `paused` **不是**终态(可 resume),如果也删状态:
559
+ * 1. resume 后 `updateTask` 从空 state 重建 → 里程碑 / 过程步骤 /
560
+ * "第 N 次更新" 全部丢失,卡片退回"第 1 次更新 + 暂无里程碑";
561
+ * 2. 卡片 action handler 的 fallback 也会把 paused 卡片重建成蓝色 running。
562
+ *
563
+ * 所以 pause 只做三件事:patch 成灰底「已暂停」、unpin、**保留 state**。
564
+ * 只有 `unpinOnFinish` 为 true 时才 unpin(与 finishTask 一致)。
565
+ */
566
+ pauseTask(opts: FinishTaskOptions): Promise<void>;
567
+ /**
568
+ * 单独 pin 一条已存在的卡片消息(Task #4536)
569
+ *
570
+ * 用途:任务 **resume**(paused → active)后把卡片重新置顶,
571
+ * 让 pin 状态与任务状态保持一致(stop 时 unpin,resume 时 re-pin)。
572
+ *
573
+ * ★ 与 `startTask` 里的 pin 走**同一套** lark-cli 契约:
574
+ * `im pins create --data '{"message_id":"om_xxx"}'`(绝不传 --chat-id/--message-id,
575
+ * 那是非法 flag → unknown flag → pin 永远失败,Task #4230 的老坑)。
576
+ *
577
+ * 失败直接抛出,由调用方决定降级(pin 失败不应阻断卡片 patch)。
578
+ */
579
+ pinMessage(messageId: string, profile?: string): Promise<void>;
580
+ /**
581
+ * 单独 unpin 一条已存在的卡片消息(Task #4540)
582
+ *
583
+ * 与 {@link pinMessage} 配对。为什么需要它:`finishTask` / `pauseTask` 的
584
+ * unpin 是"尽力而为"的副作用,且一旦 patch 抛错,unpin 那段可能整段跳过。
585
+ * 而用户最在意的是「pin 别再挂着」—— 所以删除任务时额外补一次显式 unpin。
586
+ *
587
+ * 幂等:已 unpin 的消息再 delete 只会 warn(由 `buildUnpinArgs` 保证带 `--yes`)。
588
+ */
589
+ unpinMessage(messageId: string, profile?: string): Promise<void>;
483
590
  /**
484
591
  * 完成任务:patch final status(终态里程碑 → 进度 100%)+ unpin
485
592
  *
@@ -0,0 +1,137 @@
1
+ /**
2
+ * @fileoverview LarkCardStateStore — 任务进展卡片消息的**持久化**记录(Task #4536)
3
+ *
4
+ * ## 为什么需要
5
+ *
6
+ * `LarkCliTaskNotifyHook` 原来只把「taskId → messageId」存在内存 `Map` 里:
7
+ *
8
+ * ```typescript
9
+ * private cardMessageIds: Map<number, string> = new Map();
10
+ * ```
11
+ *
12
+ * ⇒ roy-agent 进程一重启,之前发过的卡片**再也无法被 patch**,
13
+ * 变成永远停在「进行中」的孤儿卡片,pin 也一直挂着。
14
+ *
15
+ * ## 设计选型:独立 SQLite 库文件(不写 task.context)
16
+ *
17
+ * | 方案 | 结论 |
18
+ * |------|------|
19
+ * | a) 写 `task.context` | ❌ 写 context 会同步触发 `task:after.update` → 本插件重入(现有 `CARD_START_INFLIGHT_SENTINEL` 就是被这个坑逼出来的);且 context 会被 `renderTaskInfoLines` 渲染进卡片正文,messageId/chatId 会污染用户可见内容 |
20
+ * | b) 给 `tasks.db` 加表 | ❌ 需要 migration,且插件层拿不到 task store 句柄,耦合更重 |
21
+ *
22
+ * ※ 关于 `task:after.complete` 影响面的准确描述见
23
+ * `lark-cli-task-notify-plugin.ts` 里 `onAfterUpdate` 的注释(xval round2 NIT-2 更正)。
24
+ * | c) 独立 JSON 文件 | ❌ 无事务、无跨进程锁,并发 hook 会互相覆盖 |
25
+ * | **c') 独立 SQLite 库文件** | ✅ 复用既有 `createCompatibleDatabase`(bun:sqlite / better-sqlite3 双运行时),UPSERT 原子、自带跨进程锁、零 migration |
26
+ *
27
+ * 库文件:`~/.local/share/roy-agent/lark-cards.db`(与 `tasks.db` / `workflows.db` 同目录)
28
+ *
29
+ * ## 记录生命周期
30
+ *
31
+ * ```
32
+ * startTask 成功 → upsert({status: "open", pinned: true})
33
+ * patch 成功 → upsert/touch(messageId 不变)
34
+ * paused(stop) → markPaused() → status="paused"(保留 messageId,resume 可复用)
35
+ * resume → markReopened()→ status="open"
36
+ * completed/failed/cancelled → markClosed() → status="closed" + closedAt
37
+ * ```
38
+ *
39
+ * ★ 终态**不删除**记录:保留 messageId/chatId 便于事后追溯(用户手动删卡片后
40
+ * 再 patch 会失败,但记录本身仍有诊断价值)。
41
+ */
42
+ /**
43
+ * 卡片记录状态
44
+ *
45
+ * - `open` 进行中(卡片 pin 着,可 patch)
46
+ * - `paused` 已暂停(stop)。**保留 messageId**:任务 resume 后继续 patch 同一张卡
47
+ * - `closed` 已终结(completed / failed / cancelled)。记录保留,不再 patch
48
+ */
49
+ export type LarkCardRecordStatus = "open" | "paused" | "closed";
50
+ /** 一条卡片持久化记录 */
51
+ export interface LarkCardState {
52
+ /** 任务 ID(主键) */
53
+ taskId: number;
54
+ /** 飞书 message_id(om_xxx) */
55
+ messageId: string;
56
+ /** 飞书 chat_id(oc_xxx) */
57
+ chatId: string;
58
+ /** lark-cli profile(多 appId 场景) */
59
+ profile?: string;
60
+ /** 当前 pin 状态(true = 置顶中) */
61
+ pinned: boolean;
62
+ /** 记录状态 */
63
+ status: LarkCardRecordStatus;
64
+ /** 首次发卡时间(ms epoch) */
65
+ createdAt: number;
66
+ /** 最后更新时间(ms epoch) */
67
+ updatedAt: number;
68
+ /** 终结时间(ms epoch);仅 status=closed 有值 */
69
+ closedAt?: number;
70
+ /**
71
+ * 卡片自持的累积内容(Task #4536 / xval MAJOR 3)
72
+ *
73
+ * ★ 为什么要持久化:`LarkCardPatchNotifier` 的里程碑 / 过程步骤 / 更新计数
74
+ * 只存在内存里。只持久化 messageId 的话,重启后第一次 patch 会用空状态
75
+ * 重建卡片 → 用户看到"暂无里程碑 / 第 1 次更新",历史进展被静默抹掉。
76
+ *
77
+ * 存 JSON 字符串(不建子表):内容规模小(每次更新只 append 一条),
78
+ * 读取模式永远是"整张卡一起取出",不需要按里程碑查询。
79
+ */
80
+ timeline?: string;
81
+ }
82
+ /** 持久化端口(hook 只依赖这个接口,便于测试注入内存实现) */
83
+ export interface LarkCardStateStore {
84
+ /** 写入或覆盖一条记录 */
85
+ upsert(state: LarkCardState): void;
86
+ /** 按 taskId 读取 */
87
+ get(taskId: number): LarkCardState | undefined;
88
+ /** 列出全部记录(诊断用) */
89
+ list(): LarkCardState[];
90
+ /** 更新 pin 状态 */
91
+ markPinned(taskId: number, pinned: boolean): void;
92
+ /** 标记为暂停(保留 messageId) */
93
+ markPaused(taskId: number): void;
94
+ /** 从暂停/终结翻回进行中(resume) */
95
+ markReopened(taskId: number): void;
96
+ /** 标记终结(completed / failed / cancelled) */
97
+ markClosed(taskId: number): void;
98
+ /** 真删除(仅测试/手工清理用) */
99
+ delete(taskId: number): void;
100
+ /** 释放资源 */
101
+ close(): void;
102
+ }
103
+ export declare class MemoryLarkCardStateStore implements LarkCardStateStore {
104
+ private readonly records;
105
+ upsert(state: LarkCardState): void;
106
+ get(taskId: number): LarkCardState | undefined;
107
+ list(): LarkCardState[];
108
+ markPinned(taskId: number, pinned: boolean): void;
109
+ markPaused(taskId: number): void;
110
+ markReopened(taskId: number): void;
111
+ markClosed(taskId: number): void;
112
+ delete(taskId: number): void;
113
+ close(): void;
114
+ }
115
+ export declare class SqliteLarkCardStateStore implements LarkCardStateStore {
116
+ private readonly db;
117
+ constructor(dbPath: string);
118
+ upsert(state: LarkCardState): void;
119
+ get(taskId: number): LarkCardState | undefined;
120
+ list(): LarkCardState[];
121
+ markPinned(taskId: number, pinned: boolean): void;
122
+ markPaused(taskId: number): void;
123
+ markReopened(taskId: number): void;
124
+ markClosed(taskId: number): void;
125
+ delete(taskId: number): void;
126
+ close(): void;
127
+ }
128
+ /** 默认库文件路径:`$HOME/.local/share/roy-agent/lark-cards.db` */
129
+ export declare function getDefaultLarkCardDbPath(): string;
130
+ /**
131
+ * 创建持久化 store
132
+ *
133
+ * ★ 失败降级:SQLite 打不开(权限 / 磁盘满 / 运行时缺 sqlite)时
134
+ * **不抛错**,回落内存实现并 warn —— 卡片该发还得发,绝不能因为
135
+ * 持久化层故障让通知路径整体崩掉(诉求 C:健壮性)。
136
+ */
137
+ export declare function createLarkCardStateStore(dbPath?: string): LarkCardStateStore;
@@ -25,6 +25,7 @@
25
25
  import type { Hook, HookContext } from "../../hook/types";
26
26
  import { getEnvContextOrEmpty } from "../../context";
27
27
  import { LarkCardPatchNotifier } from "./lark-card-patch-notifier";
28
+ import { type LarkCardState, type LarkCardStateStore } from "./lark-card-state-store";
28
29
  /**
29
30
  * 从 EnvContext 提取 lark 专属字段
30
31
  *
@@ -80,6 +81,16 @@ export interface TaskNotifyConfig {
80
81
  * 不传 → plugin 自己 new 一个(messageId 由 plugin 的 Map 跟踪)。
81
82
  */
82
83
  cardNotifier?: LarkCardPatchNotifier;
84
+ /**
85
+ * 卡片消息持久化 store(Task #4536)
86
+ *
87
+ * 不传 → 自动创建 SQLite 实现(`~/.local/share/roy-agent/lark-cards.db`);
88
+ * 测试可注入 `MemoryLarkCardStateStore` 或任何符合接口的实现。
89
+ *
90
+ * ★ 为什么需要:原来 messageId 只存内存 Map,进程重启即丢 →
91
+ * 老卡片再也无法 patch(永远停在"进行中")+ pin 一直挂着。
92
+ */
93
+ cardStateStore?: LarkCardStateStore;
83
94
  }
84
95
  /**
85
96
  * 卡片路由端口(Task #4230 follow-up)
@@ -114,8 +125,25 @@ export declare class LarkCliTaskNotifyHook implements Hook {
114
125
  *
115
126
  * 同一 task 的 create → update → complete 必须复用同一 messageId
116
127
  * (单卡片语义:不刷屏)。不同 task 的卡片互不干扰。
128
+ *
129
+ * ★ Task #4536:这是**进程内缓存**(读穿透 L2 持久化 store 后回填),
130
+ * 权威数据在 `cardStateStore`(SQLite)。重启后从 store 恢复。
117
131
  */
118
132
  private cardMessageIds;
133
+ /**
134
+ * 卡片记录持久化 store(Task #4536,L2 权威层)
135
+ *
136
+ * 记录 `{taskId → messageId, chatId, profile, pinned, status}`,
137
+ * 让 roy-agent 重启后仍能 patch 同一张卡片、并正确 unpin。
138
+ */
139
+ private cardStateStore?;
140
+ /**
141
+ * 已经做过「内存 ← 持久层」回填的 taskId 集合
142
+ *
143
+ * `restoreCardState()` 是异步的,而 hook 每来一次事件都会调用它;
144
+ * 用这个集合做一次性短路,避免每次事件都打一次 SQL 查询。
145
+ */
146
+ private restoredTaskIds;
119
147
  /**
120
148
  * 操作记录节流状态
121
149
  * key: `op:${taskId}`,value: 上次 patch 时间戳
@@ -155,8 +183,52 @@ export declare class LarkCliTaskNotifyHook implements Hook {
155
183
  private onAfterCreate;
156
184
  /** 任务更新:patch 卡片(进度/当前步骤/状态) */
157
185
  private onAfterUpdate;
186
+ /**
187
+ * 判定本次 update 是否属于「收尾」事件(Task #4536)
188
+ *
189
+ * 返回卡片终态;`undefined` 表示这是普通进展更新(继续 patch,不动 pin)。
190
+ *
191
+ * 依据 `changes.status`(本次变更)**优先**,其次看 `task.status`(当前值)——
192
+ * 因为 AFTER_UPDATE 里 `changes` 只包含本次更新的字段,resume 时 status 变回
193
+ * active(`changes.status === "active"`)必须能正确翻回 open。
194
+ */
195
+ private cardStatusOf;
158
196
  /** 任务终态:patch 终态 + unpin */
159
197
  private onAfterComplete;
198
+ /**
199
+ * 任务被**删除**(用户口中的「取消」)→ 卡片收尾 + unpin(Task #4540)
200
+ *
201
+ * ## 为什么需要这个 handler
202
+ *
203
+ * 用户真机反馈:「我测试创建了一个任务,然后又取消了他。但是这个卡片消息没有
204
+ * 变化,然后这个 pin 也没有取消。」
205
+ *
206
+ * 实测发现「取消」有两种完全不同的语义,走两条完全不同的代码路径:
207
+ *
208
+ * | 用户/工具意图 | 实际调用 | 触发 hook |
209
+ * |--------------------------|--------------------------------|----------------------|
210
+ * | `tasks update --status cancelled` | `updateTask(status="cancelled")` | `task:after.update` → `cardStatusOf` → `sendCardFinish` ✅ 早已支持 |
211
+ * | 直接「取消/删除」任务 | **`deleteTask()`(硬删除)** | `task:after.delete` → **本 handler** |
212
+ *
213
+ * 旧代码只处理了前者 → 后者卡片永远停在"进行中"、pin 永远挂着。
214
+ *
215
+ * ## 为什么必须依赖持久层(#4536 的价值)
216
+ *
217
+ * `TaskDeleteResultContext` 只有 `{ id, deleted }` —— **拿不到 Task 对象**
218
+ * (数据已经从 store 删了)。能用的只有:
219
+ * 1. `cardStateStore`(#4536 持久化的 `lark-cards.db`)→ messageId / chatId / profile
220
+ * 2. `cardNotifier` 内存态(同进程内刚发过卡时)→ 里程碑 / 过程步骤 / 进度
221
+ *
222
+ * 两者都没有 → 说明这个任务从来没发过卡(或库被清)→ 静默 skip,**绝不发新卡**。
223
+ *
224
+ * ## 幂等 / 降级
225
+ *
226
+ * - `deleted === false` → 删除失败,任务还在 → 什么都不做
227
+ * - 记录缺失 / messageId 为空 → skip(debug log)
228
+ * - patch 失败 → warn,**仍继续 unpin**(卡片文案改不了但 pin 必须取消)
229
+ * - unpin 失败 → warn,不抛
230
+ */
231
+ private onAfterDelete;
160
232
  /**
161
233
  * 操作记录创建:把 operation 追加进卡片时间线
162
234
  *
@@ -164,6 +236,77 @@ export declare class LarkCliTaskNotifyHook implements Hook {
164
236
  * 旧实现会 fallback `startTask`(凭空多发一张卡)——已删除。
165
237
  */
166
238
  private onAfterOperationCreate;
239
+ /**
240
+ * 从持久层回填内存 messageId(一次性/幂等)
241
+ *
242
+ * 进程重启后内存 Map 是空的;第一次收到该 task 的事件时从这里恢复
243
+ * 原卡片的 messageId / chatId / profile / pin 状态,从而 patch 到**同一张卡**
244
+ * 而不是重新发一张新的(用户诉求 A 的核心验收点)。
245
+ *
246
+ * ★ 已 `closed` 的记录不再回填 messageId:终态卡片已经 unpin 且不应再被 patch;
247
+ * 如果该 task 后来被重新打开(新 create),会走全新建卡流程。
248
+ * ★ 已 `paused` 的记录**要**回填:pause → resume 后必须复用同一张卡。
249
+ */
250
+ private restoreCardState;
251
+ /**
252
+ * 从持久层恢复卡片内容到 notifier(Task #4536 / xval MAJOR 3)
253
+ *
254
+ * `timeline` 是 `CardStateSnapshot` 的 JSON;解析失败只 warn(不阻断)。
255
+ */
256
+ private hydrateNotifierState;
257
+ /**
258
+ * 把 notifier 的卡片内容快照序列化进记录(Task #4536 / xval MAJOR 3)
259
+ *
260
+ * 每次 patch / pause 之后调用,让"重启后恢复内容"始终有最新数据。
261
+ */
262
+ private snapshotTimeline;
263
+ /** 落库:发卡成功 / patch 成功后同步记录(失败仅 warn) */
264
+ private persistCardState;
265
+ /** 落库:pin 状态变化(失败仅 warn) */
266
+ private persistPinned;
267
+ /**
268
+ * 落库:暂停(stop)
269
+ *
270
+ * ★ paused **不是**终结 —— 保留 `open` 语义的 messageId,只翻 status。
271
+ * 任务 resume 后要能继续 patch 同一张卡(诉求 B 的 pause→resume→pause)。
272
+ */
273
+ private persistPaused;
274
+ /**
275
+ * 丢弃持久层里的旧 messageId(Task #4536 / xval MAJOR 4)
276
+ *
277
+ * 用于 reopen 场景:旧卡片已 closed + unpin,不能再被 patch。
278
+ * 只把 `messageId` 清空、状态保持原样(closed),这样:
279
+ * - 若新卡创建成功 → `persistCardState` 会写一条完整新记录(覆盖);
280
+ * - 若新卡创建失败 → 记录仍是 closed 且**无可用 messageId**,
281
+ * 重启后 `restoreCardState` 不会把它当活卡片复活。
282
+ */
283
+ private dropStaleMessageId;
284
+ /** 落库:resume / 重新打开(paused|closed → open) */
285
+ private persistReopened;
286
+ /** 落库:终结(completed / failed / cancelled)—— 保留记录供追溯 */
287
+ private persistClosed;
288
+ /**
289
+ * 重新快照当前卡片的累积内容并落库(Task #4536 / xval MAJOR 3)
290
+ *
291
+ * 幂等 + 失败降级:拿不到记录 / notifier 无状态时静默跳过。
292
+ */
293
+ private refreshTimeline;
294
+ /**
295
+ * resume 后重新 pin 卡片(Task #4536)
296
+ *
297
+ * ★ 为什么需要:`stop`(paused)时我们已经 unpin 了;任务被 resume 后如果
298
+ * 不 re-pin,用户就再也看不到置顶的进展卡片 —— pin 状态必须跟任务状态一致。
299
+ *
300
+ * ★ 失败降级(诉求 C):pin 失败**不阻断**后续 patch,只 warn 并保持
301
+ * 持久层 `pinned=false`(如实反映真实状态,不谎报)。
302
+ */
303
+ private repinAfterResume;
304
+ /** 合并「写记录」所需的公共字段(读旧记录失败也不抛,降级为 now) */
305
+ private buildCardState;
306
+ /** 对外只读:某 task 的持久化卡片记录(debug / 排查用) */
307
+ getCardState(taskId: number): LarkCardState | undefined;
308
+ /** 对外只读:全部持久化卡片记录(debug / 排查用) */
309
+ listCardStates(): LarkCardState[];
167
310
  private isCardModeEnabled;
168
311
  /**
169
312
  * 解析「卡片该发到哪个群」(Task #4230 follow-up)
@@ -184,7 +327,7 @@ export declare class LarkCliTaskNotifyHook implements Hook {
184
327
  * 用于:无触发群时找最近的专属群兜底(Task #4394:不再用于"是否别人的群"判定)。
185
328
  */
186
329
  private collectLineage;
187
- /** 发初始卡片(+ pin)并缓存 messageId */
330
+ /** 发初始卡片(+ pin)并缓存 + 持久化 messageId */
188
331
  private sendCardStart;
189
332
  /**
190
333
  * patch 卡片(进度 / 当前步骤 / 状态)
@@ -193,7 +336,16 @@ export declare class LarkCliTaskNotifyHook implements Hook {
193
336
  * 降级补发一次 startTask —— 只发生一次,失败则打 sentinel 不再重试。
194
337
  */
195
338
  private sendCardUpdate;
196
- /** 终态:patch final status + unpin,并清理 messageId 缓存 */
339
+ /**
340
+ * 终态:patch final status + unpin,并同步持久化
341
+ *
342
+ * 覆盖三种「收尾」语义(Task #4536):
343
+ * - `completed` → 卡片「🎉 全部完成!」+ unpin + 记录 closed
344
+ * - `cancelled` → 卡片「🚫 已取消」 + unpin + 记录 closed
345
+ * - `failed` / `timeout` → 卡片「🚨 任务失败」+ unpin + 记录 closed
346
+ * - `paused`(用户 stop **或** 循环任务已暂停)→ 卡片「⏹️ 已暂停」+ unpin,
347
+ * 但记录只标 `paused`(**不是** closed)—— 任务 resume 后要复用同一张卡
348
+ */
197
349
  private sendCardFinish;
198
350
  /**
199
351
  * 解析 chatId(优先级:replyChannel > task.context)
@@ -1,10 +1,11 @@
1
+ import"../../../shared/@ai-setting/roy-agent-core-7q4wdze2.js";
1
2
  import {
2
3
  SQLiteTaskStore,
3
4
  getDefaultDataDir,
4
5
  getDefaultTaskDbPath
5
- } from "../../../shared/@ai-setting/roy-agent-core-3kz6934b.js";
6
- import"../../../shared/@ai-setting/roy-agent-core-b599jgyd.js";
7
- import"../../../shared/@ai-setting/roy-agent-core-8seq65bp.js";
6
+ } from "../../../shared/@ai-setting/roy-agent-core-fbjd7bt6.js";
7
+ import"../../../shared/@ai-setting/roy-agent-core-8p63s836.js";
8
+ import"../../../shared/@ai-setting/roy-agent-core-rt115qfc.js";
8
9
  import"../../../shared/@ai-setting/roy-agent-core-jnszp0jq.js";
9
10
  import"../../../shared/@ai-setting/roy-agent-core-fs0mn2jk.js";
10
11
  export {
@@ -9,10 +9,10 @@ import {
9
9
  searchTasksTool,
10
10
  treeTasksTool,
11
11
  updateTaskTool
12
- } from "../../../shared/@ai-setting/roy-agent-core-pemxr5n4.js";
13
- import"../../../shared/@ai-setting/roy-agent-core-jszgaevt.js";
14
- import"../../../shared/@ai-setting/roy-agent-core-b599jgyd.js";
15
- import"../../../shared/@ai-setting/roy-agent-core-8seq65bp.js";
12
+ } from "../../../shared/@ai-setting/roy-agent-core-vh0qzb24.js";
13
+ import"../../../shared/@ai-setting/roy-agent-core-syyw58p9.js";
14
+ import"../../../shared/@ai-setting/roy-agent-core-8p63s836.js";
15
+ import"../../../shared/@ai-setting/roy-agent-core-rt115qfc.js";
16
16
  import"../../../shared/@ai-setting/roy-agent-core-jnszp0jq.js";
17
17
  import"../../../shared/@ai-setting/roy-agent-core-fs0mn2jk.js";
18
18
  export {
@@ -8,7 +8,7 @@ import {
8
8
  grepTool,
9
9
  readFileTool,
10
10
  writeFileTool
11
- } from "../../../shared/@ai-setting/roy-agent-core-4zy2v3br.js";
11
+ } from "../../../shared/@ai-setting/roy-agent-core-q4gdfypk.js";
12
12
  import {
13
13
  getUnderstandImageLLMProvider,
14
14
  resetUnderstandImageLLMProvider,
@@ -19,10 +19,10 @@ import {
19
19
  createQueryBackgroundProcessTool,
20
20
  queryBackgroundProcessTool
21
21
  } from "../../../shared/@ai-setting/roy-agent-core-amkqnyzy.js";
22
- import"../../../shared/@ai-setting/roy-agent-core-tbrn9wdm.js";
22
+ import"../../../shared/@ai-setting/roy-agent-core-14bq77wr.js";
23
23
  import"../../../shared/@ai-setting/roy-agent-core-zjdzk1gg.js";
24
- import"../../../shared/@ai-setting/roy-agent-core-b599jgyd.js";
25
- import"../../../shared/@ai-setting/roy-agent-core-8seq65bp.js";
24
+ import"../../../shared/@ai-setting/roy-agent-core-8p63s836.js";
25
+ import"../../../shared/@ai-setting/roy-agent-core-rt115qfc.js";
26
26
  import"../../../shared/@ai-setting/roy-agent-core-jnszp0jq.js";
27
27
  import"../../../shared/@ai-setting/roy-agent-core-fs0mn2jk.js";
28
28
  export {
@@ -9,7 +9,7 @@ import {
9
9
  grepTool,
10
10
  readFileTool,
11
11
  writeFileTool
12
- } from "../../shared/@ai-setting/roy-agent-core-4zy2v3br.js";
12
+ } from "../../shared/@ai-setting/roy-agent-core-q4gdfypk.js";
13
13
  import {
14
14
  getUnderstandImageLLMProvider,
15
15
  resetUnderstandImageLLMProvider,
@@ -17,25 +17,25 @@ import {
17
17
  understandImageTool
18
18
  } from "../../shared/@ai-setting/roy-agent-core-xwm8zavb.js";
19
19
  import"../../shared/@ai-setting/roy-agent-core-amkqnyzy.js";
20
- import"../../shared/@ai-setting/roy-agent-core-tbrn9wdm.js";
20
+ import"../../shared/@ai-setting/roy-agent-core-14bq77wr.js";
21
21
  import {
22
22
  ToolComponent,
23
23
  ToolRegistry,
24
24
  ToolValidator,
25
25
  getMaxOutputSize,
26
26
  setToolConfigComponent
27
- } from "../../shared/@ai-setting/roy-agent-core-98aa9r0x.js";
28
- import"../../shared/@ai-setting/roy-agent-core-kzg1jwt8.js";
27
+ } from "../../shared/@ai-setting/roy-agent-core-fw6k4w1h.js";
28
+ import"../../shared/@ai-setting/roy-agent-core-n0p0hwgd.js";
29
29
  import"../../shared/@ai-setting/roy-agent-core-zjdzk1gg.js";
30
30
  import"../../shared/@ai-setting/roy-agent-core-e25xkv53.js";
31
31
  import"../../shared/@ai-setting/roy-agent-core-7hh0brvs.js";
32
- import"../../shared/@ai-setting/roy-agent-core-40xzbjtm.js";
33
- import"../../shared/@ai-setting/roy-agent-core-gngjkw3b.js";
34
- import"../../shared/@ai-setting/roy-agent-core-1pnfkspm.js";
35
- import"../../shared/@ai-setting/roy-agent-core-16t0zfbk.js";
36
- import"../../shared/@ai-setting/roy-agent-core-jszgaevt.js";
37
- import"../../shared/@ai-setting/roy-agent-core-b599jgyd.js";
38
- import"../../shared/@ai-setting/roy-agent-core-8seq65bp.js";
32
+ import"../../shared/@ai-setting/roy-agent-core-0kn3zt1t.js";
33
+ import"../../shared/@ai-setting/roy-agent-core-ytd5eztz.js";
34
+ import"../../shared/@ai-setting/roy-agent-core-yphwdm9x.js";
35
+ import"../../shared/@ai-setting/roy-agent-core-m97jn2ra.js";
36
+ import"../../shared/@ai-setting/roy-agent-core-syyw58p9.js";
37
+ import"../../shared/@ai-setting/roy-agent-core-8p63s836.js";
38
+ import"../../shared/@ai-setting/roy-agent-core-rt115qfc.js";
39
39
  import"../../shared/@ai-setting/roy-agent-core-jnszp0jq.js";
40
40
  import"../../shared/@ai-setting/roy-agent-core-fs0mn2jk.js";
41
41
  export {
@@ -5,27 +5,27 @@ import {
5
5
  Scheduler,
6
6
  WorkflowEngine,
7
7
  init_engine
8
- } from "../../../shared/@ai-setting/roy-agent-core-v2188rnk.js";
8
+ } from "../../../shared/@ai-setting/roy-agent-core-w93z6a42.js";
9
9
  import"../../../shared/@ai-setting/roy-agent-core-6atd905e.js";
10
- import"../../../shared/@ai-setting/roy-agent-core-833t16n1.js";
11
- import"../../../shared/@ai-setting/roy-agent-core-n3b7ztms.js";
10
+ import"../../../shared/@ai-setting/roy-agent-core-txwptxk1.js";
11
+ import"../../../shared/@ai-setting/roy-agent-core-d75t8gea.js";
12
12
  import"../../../shared/@ai-setting/roy-agent-core-1db4vpc6.js";
13
13
  import"../../../shared/@ai-setting/roy-agent-core-ze068vc9.js";
14
- import"../../../shared/@ai-setting/roy-agent-core-3dkzqqsd.js";
15
- import"../../../shared/@ai-setting/roy-agent-core-r9qe0ghe.js";
16
- import"../../../shared/@ai-setting/roy-agent-core-3mc6vmvj.js";
14
+ import"../../../shared/@ai-setting/roy-agent-core-hefarcp0.js";
15
+ import"../../../shared/@ai-setting/roy-agent-core-geh6j7bw.js";
16
+ import"../../../shared/@ai-setting/roy-agent-core-t4x089js.js";
17
17
  import"../../../shared/@ai-setting/roy-agent-core-ddwa0n6h.js";
18
18
  import {
19
19
  DAGManager
20
- } from "../../../shared/@ai-setting/roy-agent-core-nra8vfrs.js";
20
+ } from "../../../shared/@ai-setting/roy-agent-core-08njdcpj.js";
21
21
  import"../../../shared/@ai-setting/roy-agent-core-jrj30vq3.js";
22
22
  import"../../../shared/@ai-setting/roy-agent-core-e25xkv53.js";
23
- import"../../../shared/@ai-setting/roy-agent-core-gngjkw3b.js";
24
- import"../../../shared/@ai-setting/roy-agent-core-1pnfkspm.js";
25
- import"../../../shared/@ai-setting/roy-agent-core-16t0zfbk.js";
26
- import"../../../shared/@ai-setting/roy-agent-core-jszgaevt.js";
27
- import"../../../shared/@ai-setting/roy-agent-core-b599jgyd.js";
28
- import"../../../shared/@ai-setting/roy-agent-core-8seq65bp.js";
23
+ import"../../../shared/@ai-setting/roy-agent-core-ytd5eztz.js";
24
+ import"../../../shared/@ai-setting/roy-agent-core-yphwdm9x.js";
25
+ import"../../../shared/@ai-setting/roy-agent-core-m97jn2ra.js";
26
+ import"../../../shared/@ai-setting/roy-agent-core-syyw58p9.js";
27
+ import"../../../shared/@ai-setting/roy-agent-core-8p63s836.js";
28
+ import"../../../shared/@ai-setting/roy-agent-core-rt115qfc.js";
29
29
  import"../../../shared/@ai-setting/roy-agent-core-jnszp0jq.js";
30
30
  import"../../../shared/@ai-setting/roy-agent-core-fs0mn2jk.js";
31
31
  init_engine();
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  init_hooks
3
- } from "../../../shared/@ai-setting/roy-agent-core-3dkzqqsd.js";
3
+ } from "../../../shared/@ai-setting/roy-agent-core-hefarcp0.js";
4
4
  import {
5
5
  WorkflowHookPoints,
6
6
  emitWorkflowNodeHook,
7
7
  emitWorkflowRunHook,
8
8
  getRegisteredWorkflowHookPoints
9
- } from "../../../shared/@ai-setting/roy-agent-core-r9qe0ghe.js";
10
- import"../../../shared/@ai-setting/roy-agent-core-gngjkw3b.js";
11
- import"../../../shared/@ai-setting/roy-agent-core-1pnfkspm.js";
12
- import"../../../shared/@ai-setting/roy-agent-core-16t0zfbk.js";
13
- import"../../../shared/@ai-setting/roy-agent-core-jszgaevt.js";
14
- import"../../../shared/@ai-setting/roy-agent-core-b599jgyd.js";
15
- import"../../../shared/@ai-setting/roy-agent-core-8seq65bp.js";
9
+ } from "../../../shared/@ai-setting/roy-agent-core-geh6j7bw.js";
10
+ import"../../../shared/@ai-setting/roy-agent-core-ytd5eztz.js";
11
+ import"../../../shared/@ai-setting/roy-agent-core-yphwdm9x.js";
12
+ import"../../../shared/@ai-setting/roy-agent-core-m97jn2ra.js";
13
+ import"../../../shared/@ai-setting/roy-agent-core-syyw58p9.js";
14
+ import"../../../shared/@ai-setting/roy-agent-core-8p63s836.js";
15
+ import"../../../shared/@ai-setting/roy-agent-core-rt115qfc.js";
16
16
  import"../../../shared/@ai-setting/roy-agent-core-jnszp0jq.js";
17
17
  import"../../../shared/@ai-setting/roy-agent-core-fs0mn2jk.js";
18
18
  init_hooks();