@ai-setting/roy-agent-core 1.7.70 → 1.7.72

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 (66) hide show
  1. package/dist/env/agent/agent-component.js +2 -2
  2. package/dist/env/agent/index.js +2 -2
  3. package/dist/env/agent/summary-agent.d.ts +6 -15
  4. package/dist/env/agent/types.d.ts +0 -17
  5. package/dist/env/event-source/event-source-handlers.js +6 -6
  6. package/dist/env/event-source/index.js +7 -7
  7. package/dist/env/event-source/reset-command.d.ts +41 -0
  8. package/dist/env/index.js +19 -20
  9. package/dist/env/llm/index.js +1 -1
  10. package/dist/env/llm/temperature-policy.d.ts +107 -0
  11. package/dist/env/llm/types.d.ts +2 -2
  12. package/dist/env/prompt/index.js +3 -3
  13. package/dist/env/prompt/prompts-index.d.ts +341 -3
  14. package/dist/env/session/__bench__/replay-compact.d.ts +137 -0
  15. package/dist/env/session/__bench__/run-replay.d.ts +15 -0
  16. package/dist/env/session/compact-checkpoint-content.d.ts +67 -0
  17. package/dist/env/session/index.d.ts +1 -0
  18. package/dist/env/session/index.js +2 -3
  19. package/dist/env/session/session-component.d.ts +47 -30
  20. package/dist/env/session/storage/index.js +1 -1
  21. package/dist/env/session/storage/sqlite.d.ts +8 -0
  22. package/dist/env/session/types.d.ts +45 -30
  23. package/dist/env/task/delegate/delegate-tool.js +4 -4
  24. package/dist/env/task/delegate/index.js +4 -4
  25. package/dist/env/task/index.js +6 -6
  26. package/dist/env/task/mcp/index.js +2 -2
  27. package/dist/env/task/plugins/index.js +4 -4
  28. package/dist/env/task/plugins/lark-card-patch-notifier.d.ts +50 -0
  29. package/dist/env/task/plugins/lark-card-patch-notifier.js +3 -1
  30. package/dist/env/task/prompt/index.d.ts +11 -0
  31. package/dist/env/task/prompt/index.js +16 -0
  32. package/dist/env/task/prompt/task-discipline.d.ts +32 -0
  33. package/dist/env/task/tools/index.js +2 -2
  34. package/dist/env/workflow/engine/index.js +2 -3
  35. package/dist/env/workflow/index.js +6 -7
  36. package/dist/env/workflow/plugins/index.js +2 -2
  37. package/dist/env/workflow/tools/index.js +3 -4
  38. package/dist/index.d.ts +2 -1
  39. package/dist/index.js +39 -28
  40. package/dist/shared/@ai-setting/{roy-agent-core-bk8kyzv8.js → roy-agent-core-1p6syv85.js} +1 -1
  41. package/dist/shared/@ai-setting/{roy-agent-core-8bjj3d1b.js → roy-agent-core-1w9y7mxj.js} +1 -1
  42. package/dist/shared/@ai-setting/{roy-agent-core-nersksh1.js → roy-agent-core-2gzt2q8c.js} +2 -2
  43. package/dist/shared/@ai-setting/{roy-agent-core-27f59kjv.js → roy-agent-core-34jz9mgh.js} +1 -1
  44. package/dist/shared/@ai-setting/{roy-agent-core-tadj19vp.js → roy-agent-core-46rv4d7d.js} +71 -49
  45. package/dist/shared/@ai-setting/roy-agent-core-4jjwewvw.js +182 -0
  46. package/dist/shared/@ai-setting/{roy-agent-core-hx46nhh1.js → roy-agent-core-5gw0qa8m.js} +4 -4
  47. package/dist/shared/@ai-setting/{roy-agent-core-0j94tj1z.js → roy-agent-core-7qvw65jt.js} +4 -4
  48. package/dist/shared/@ai-setting/{roy-agent-core-h5vmff8w.js → roy-agent-core-7sj9xs9c.js} +7 -33
  49. package/dist/shared/@ai-setting/{roy-agent-core-002g6nfk.js → roy-agent-core-attpry6g.js} +3 -3
  50. package/dist/shared/@ai-setting/{roy-agent-core-37tj4y6a.js → roy-agent-core-gr48c89p.js} +3 -3
  51. package/dist/shared/@ai-setting/{roy-agent-core-0cb6w0k7.js → roy-agent-core-hfyfavp3.js} +1 -1
  52. package/dist/shared/@ai-setting/{roy-agent-core-hfr6bzts.js → roy-agent-core-jgb3bb42.js} +1 -1
  53. package/dist/shared/@ai-setting/{roy-agent-core-9bshyqjn.js → roy-agent-core-pakhchy7.js} +183 -132
  54. package/dist/shared/@ai-setting/roy-agent-core-qkdegdvc.js +0 -0
  55. package/dist/shared/@ai-setting/{roy-agent-core-02j24hrg.js → roy-agent-core-rxb00gjm.js} +70 -3
  56. package/dist/shared/@ai-setting/{roy-agent-core-8cx7cfdg.js → roy-agent-core-skyc30qx.js} +1 -2
  57. package/dist/shared/@ai-setting/{roy-agent-core-hy3zn2q2.js → roy-agent-core-sm0sf6sb.js} +20 -0
  58. package/dist/shared/@ai-setting/{roy-agent-core-mw2cen6s.js → roy-agent-core-vah6g5yx.js} +1 -1
  59. package/dist/shared/@ai-setting/{roy-agent-core-07fvy74y.js → roy-agent-core-vm8h5zyj.js} +20 -6
  60. package/dist/shared/@ai-setting/{roy-agent-core-x3xpkx84.js → roy-agent-core-wr7mv7k3.js} +1 -1
  61. package/dist/shared/@ai-setting/{roy-agent-core-npvejsg8.js → roy-agent-core-y12kyxwa.js} +83 -3
  62. package/dist/shared/@ai-setting/{roy-agent-core-vaz9350j.js → roy-agent-core-yhwxpj12.js} +34 -175
  63. package/dist/test-utils/ipc-test-server.d.ts +10 -0
  64. package/package.json +6 -1
  65. package/dist/shared/@ai-setting/roy-agent-core-6m4bw8jy.js +0 -6
  66. package/dist/shared/@ai-setting/roy-agent-core-ze068vc9.js +0 -37
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @fileoverview 回放测试 runner (Task #4933)
3
+ *
4
+ * 建一个**最小但真实**的 Environment(只含 config/llm/agent/prompt 组件),
5
+ * 然后对本仓库的真实 session 做回放压缩。
6
+ *
7
+ * 用法:
8
+ * cd <worktree>
9
+ * bun run packages/core/src/env/session/__bench__/run-replay.ts \
10
+ * --session <sessionId> [--limit N]
11
+ *
12
+ * 也可以一次跑多个:
13
+ * bun run .../run-replay.ts --sessions id1,id2,id3 --limit 800
14
+ */
15
+ export {};
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @fileoverview C 方案 checkpoint 内容处理(Task #4933 重写)
3
+ *
4
+ * 用户决策(飞书群 oc_4afcc8f93c811e5371dd00674d16a6b1):
5
+ * 压缩最终产物是**整段自然语言** checkpoint 正文(`content`),
6
+ * 不再有 summary/processKeyPoints/currentState/nextSteps/userIntents 五栏位,
7
+ * 也不再有固定 markdown 小节契约 + 章节解析器(上一轮方案被用户否定)。
8
+ *
9
+ * 本模块是**纯函数**集合:
10
+ * 1. normalizeCheckpointContent — 守护:只判「有没有实质文本」
11
+ * 2. buildCheckpointFromText — LLM 自然语言输出 → { title, content }
12
+ * 3. adaptLegacyCheckpoint — 旧格式(五栏位)读时适配 → 新格式
13
+ * 4. createCheckpointContent — checkpoint 消息正文渲染
14
+ *
15
+ * 设计原则:
16
+ * - 守护逻辑极简但必须保留:全空 → 拒绝归档(2026-10-16 生产事故,
17
+ * 曾静默吞掉 4731 条消息,绝对不能回归)
18
+ * - 旧 checkpoint 的语义完整保留(读时适配,不写回数据库)
19
+ */
20
+ import type { SessionCheckpoint } from "./types";
21
+ /**
22
+ * 判断一段文本是否可作为 checkpoint 正文。
23
+ *
24
+ * 守护规则(极简):
25
+ * - 非空(trim 后有内容)
26
+ * - 不是降级哨兵
27
+ * - 长度 ≥ MIN_CONTENT_LENGTH
28
+ *
29
+ * @returns 归一化(trim)后的正文,不可用返回 undefined
30
+ */
31
+ export declare function normalizeCheckpointContent(text?: string | null): string | undefined;
32
+ export interface CheckpointFromText {
33
+ title: string;
34
+ content: string;
35
+ }
36
+ /**
37
+ * 把 LLM 输出的整段自然语言构造成 checkpoint 的 title + content。
38
+ *
39
+ * 标题策略:首个 markdown 标题行(`#`~`######`)→ 否则首个非空行;
40
+ * 超长截断到 80 字符。正文整段保留(含列表、代码块等自由形式)。
41
+ *
42
+ * @returns { title, content },文本不可用返回 undefined
43
+ */
44
+ export declare function buildCheckpointFromText(text?: string | null): CheckpointFromText | undefined;
45
+ /**
46
+ * 把旧格式 checkpoint(summary/processKeyPoints/currentState/nextSteps/
47
+ * userIntents 五栏位)在**内存中**适配为新格式(content 整段自然语言)。
48
+ *
49
+ * ⚠️ 只做读时适配:不写回数据库、不修改原对象(纯函数)。
50
+ * 生产库 555 个存量 checkpoint 全是旧格式,靠本函数在读取时
51
+ * 合成 content,新代码无感知。
52
+ *
53
+ * 合成策略:title + summary + 各栏位编号串联,语义完整保留。
54
+ * 新格式原样返回(引用相等)。
55
+ */
56
+ export declare function adaptLegacyCheckpoint(cp: SessionCheckpoint): SessionCheckpoint;
57
+ /**
58
+ * 渲染 checkpoint 消息正文(存为 user 消息,进入 LLM 上下文)。
59
+ *
60
+ * 形态(无伪造小节标题):
61
+ * # Checkpoint: {title}
62
+ *
63
+ * {整段 content}
64
+ *
65
+ * {N} messages compacted at {ISO}
66
+ */
67
+ export declare function createCheckpointContent(checkpoint: SessionCheckpoint): string;
@@ -10,6 +10,7 @@ SessionCheckpointsMeta, // (new)
10
10
  CreateSessionOptions, UpdateSessionOptions, ListSessionsOptions, AddMessageOptions, CompactOptions, // (new)
11
11
  CompactResult, // (new)
12
12
  CompactPreview, // (new)
13
+ CheckpointAdaptReport, // Task #4933
13
14
  GetContextOptions, // (new)
14
15
  GetContextResult, // (new)
15
16
  GetMessagesOptions, } from "./types";
@@ -3,11 +3,10 @@ import {
3
3
  MIN_SESSION_ID_LENGTH,
4
4
  SessionComponent,
5
5
  isValidSessionId
6
- } from "../../shared/@ai-setting/roy-agent-core-9bshyqjn.js";
6
+ } from "../../shared/@ai-setting/roy-agent-core-pakhchy7.js";
7
7
  import {
8
8
  MemorySessionStore
9
- } from "../../shared/@ai-setting/roy-agent-core-hy3zn2q2.js";
10
- import"../../shared/@ai-setting/roy-agent-core-ze068vc9.js";
9
+ } from "../../shared/@ai-setting/roy-agent-core-sm0sf6sb.js";
11
10
  import"../../shared/@ai-setting/roy-agent-core-rvxg1wps.js";
12
11
  import {
13
12
  SessionMessageConverter
@@ -8,6 +8,7 @@ import { type SessionConfig, type Session, type CreateSessionOptions, type Updat
8
8
  type CompactOptions, // (new)
9
9
  type CompactResult, // (new)
10
10
  type CompactPreview, // (new)
11
+ type CheckpointAdaptReport, // Task #4933
11
12
  type GetContextOptions, // (new)
12
13
  type GetContextResult, // (new)
13
14
  type SearchMessagesOptions, // (new)
@@ -15,11 +16,11 @@ type SearchResult, // (new)
15
16
  type ChatTaskBinding, // Task #4023
16
17
  type UpsertChatTaskBindingOptions } from "./types";
17
18
  import type { ConfigComponent } from "../../config/config-component";
18
- import type { SummaryAgentResult } from "../agent/types";
19
19
  export type { SessionConfig, Session, SessionMessage, CreateSessionOptions, UpdateSessionOptions, ListSessionsOptions, AddMessageOptions, SessionCheckpoint, // (new)
20
20
  CompactOptions, // (new)
21
21
  CompactResult, // (new)
22
22
  CompactPreview, // (new)
23
+ CheckpointAdaptReport, // Task #4933
23
24
  GetContextOptions, // (new)
24
25
  GetContextResult, // (new)
25
26
  SearchMessagesOptions, // (new) Search
@@ -27,35 +28,6 @@ SearchResult, // (new) Search
27
28
  MessageMatch, // (new) Search
28
29
  ChatTaskBinding, // Task #4023
29
30
  UpsertChatTaskBindingOptions, } from "./types";
30
- /**
31
- * 把 compact agent 通过 `workflow_submit_output` 提交的数据归一化。
32
- */
33
- export declare function normalizeAgentCheckpoint(data: Record<string, unknown>): SummaryAgentResult;
34
- /**
35
- * 判断一段文本是否可作为 checkpoint 正文(拒绝空白与降级哨兵)。
36
- */
37
- export declare function isUsableCheckpointText(text?: string | null): boolean;
38
- /**
39
- * 降级路径:compact agent 没有调用 `workflow_submit_output` 时,用它输出的
40
- * 纯文本 `finalText` 兜底构造 checkpoint。
41
- *
42
- * 为什么需要(2026-10-16 生产事故 traceId=83eadac2316d5be7529ca42ce7057d63):
43
- * compact 是子 agent。首轮若没调提交工具,`checkpointData` 就是 undefined,
44
- * 旧代码会写出全空 checkpoint(`"Untitled Checkpoint"`)**然后照样归档几百条消息**
45
- * (实测生产 9 次 / 累计吞掉 4731 条 / 单次最多 2710 条)→ 上下文永久丢失且用户无感知。
46
- *
47
- * 而实际上模型往往已经产出了可用的 checkpoint 内容,只是以纯文本形式落在
48
- * `finalText` 里(例:`"## 📌 Checkpoint: lark-cli profile 配置 ..."`),
49
- * 或者包在 ```json 代码块里。这些内容全部可以救回来。
50
- *
51
- * 策略:
52
- * 1. 先从文本里抠 JSON(```json 代码块 / 裸 JSON / 第一个 {...})→ 结构化解析;
53
- * 2. 否则把整段文本作为 `currentState`,title 取首个 markdown 标题行(或首行);
54
- * 3. 文本为空 / 是降级哨兵 → 返回 undefined(调用方继续降级或抛错)
55
- *
56
- * @returns 归一化后的 checkpoint,或 undefined(无可用文本)
57
- */
58
- export declare function buildCheckpointFromFinalText(finalText?: string): SummaryAgentResult | undefined;
59
31
  /**
60
32
  * Marker error class so callers can distinguish "lock exhausted after
61
33
  * retries" from "validation rejected on first attempt". Previously both
@@ -345,6 +317,19 @@ export declare class SessionComponent extends BaseComponent {
345
317
  private executeBeforeHooks;
346
318
  private executeAfterHooks;
347
319
  private generateTitle;
320
+ /**
321
+ * 读取压缩专用模型(`session.compactModel`)。
322
+ *
323
+ * ★ Task #4933:两阶段压缩(compact-hint / compact)统一走该模型。
324
+ * 实现方式:读配置后作为 `AgentContext.model`(run option)传入,
325
+ * run option 在 agent-component.ts:1518
326
+ * `model: (context?.model) ?? agent.config.model` 处优先级最高,
327
+ * 因此**会覆盖**用户级 `~/.local/share/roy-agent/agents/compact.yaml`
328
+ * 里写死的 model 字段。
329
+ *
330
+ * @returns 模型 id(如 `minimax/MiniMax-M3.1-Flash`),未配置返回 undefined
331
+ */
332
+ private getCompactModel;
348
333
  /**
349
334
  * 生成场景化压缩提示 (Compact Hint)
350
335
  *
@@ -408,12 +393,44 @@ export declare class SessionComponent extends BaseComponent {
408
393
  previewCompact(sessionId: string): Promise<CompactPreview>;
409
394
  /**
410
395
  * Get all checkpoints for a session
396
+ *
397
+ * ★ C 方案:旧格式(五栏位)读时适配为新格式(content),
398
+ * 不写回数据库(lazy adapter)。
411
399
  */
412
400
  getCheckpoints(sessionId: string): Promise<SessionCheckpoint[]>;
413
401
  /**
414
402
  * Get a specific checkpoint
403
+ *
404
+ * ★ C 方案:旧格式读时适配(见 getCheckpoints)。
415
405
  */
416
406
  getCheckpoint(sessionId: string, checkpointId: string): Promise<SessionCheckpoint | undefined>;
407
+ /**
408
+ * 读取 checkpoint 的**原始存储形态**(不做适配)。
409
+ *
410
+ * 用途:存量 checkpoint 检查脚本 / adaptStoredCheckpoints 内部统计 ——
411
+ * 需要区分「库里到底存的是旧格式还是新格式」。
412
+ */
413
+ readStoredCheckpointsRaw(sessionId: string): Promise<SessionCheckpoint[]>;
414
+ /**
415
+ * 存量 checkpoint 适配(C 方案 Task #4933)。
416
+ *
417
+ * 生产库有 555 个旧格式 checkpoint(五栏位,无 content)。默认**读时适配**
418
+ * 已能让新代码无感知;本方法提供**显式迁移**能力(把旧格式写回新格式)。
419
+ *
420
+ * ⚠️ 默认 dry-run(`apply: false`):只统计 + 抽样,不写数据库。
421
+ * ⚠️ `apply: true` 会重写 session.metadata —— 如果 roy-agent daemon 正在运行
422
+ * 并持有 sessions.db 的内存缓存,外部进程的写入可能被 daemon 的后续
423
+ * saveCheckpoint 覆盖。建议在 daemon 重启后(或停机时)执行。
424
+ */
425
+ adaptStoredCheckpoints(sessionId: string, options?: {
426
+ apply?: boolean;
427
+ }): Promise<CheckpointAdaptReport>;
428
+ /**
429
+ * 把一组 checkpoint 整体写回 session.metadata.checkpointDetails。
430
+ *
431
+ * 只做「按 id 覆盖」,不动 checkpoints 索引里的 meta(id/title/createdAt 不变)。
432
+ */
433
+ private writeCheckpointsBack;
417
434
  /**
418
435
  * Delete a checkpoint and restore archived messages
419
436
  */
@@ -3,7 +3,7 @@ import {
3
3
  SQLiteSessionStore,
4
4
  getDefaultDataDir,
5
5
  getDefaultSessionDbPath
6
- } from "../../../shared/@ai-setting/roy-agent-core-hy3zn2q2.js";
6
+ } from "../../../shared/@ai-setting/roy-agent-core-sm0sf6sb.js";
7
7
  import"../../../shared/@ai-setting/roy-agent-core-kmbct9yg.js";
8
8
  import"../../../shared/@ai-setting/roy-agent-core-40rv283c.js";
9
9
  import"../../../shared/@ai-setting/roy-agent-core-zjdzk1gg.js";
@@ -92,6 +92,14 @@ export declare class SQLiteSessionStore extends BaseSessionStore {
92
92
  getMessageIndexes(sessionId: string, role: string): Promise<number[]>;
93
93
  saveCheckpoint(sessionId: string, checkpoint: SessionCheckpoint): Promise<void>;
94
94
  getCheckpoints(sessionId: string): Promise<SessionCheckpoint[]>;
95
+ /**
96
+ * 按 id 覆盖写回一组 checkpoint 明细(Task #4933 存量格式迁移用)。
97
+ *
98
+ * 只改 `metadata.checkpointDetails`,不动 `metadata.checkpoints` 索引
99
+ * (id / title / messageIndex / createdAt 都是不变的元数据)。
100
+ * 返回是否有任何变更被写入。
101
+ */
102
+ replaceCheckpointDetails(sessionId: string, checkpoints: SessionCheckpoint[]): Promise<boolean>;
95
103
  getCheckpoint(sessionId: string, checkpointId: string): Promise<SessionCheckpoint | undefined>;
96
104
  deleteCheckpoint(sessionId: string, checkpointId: string): Promise<boolean>;
97
105
  archiveMessages(sessionId: string, checkpointId: string, beforeIndex: number): Promise<number>;
@@ -83,10 +83,6 @@ export interface CheckpointMeta {
83
83
  createdAt: number;
84
84
  type: CheckpointType;
85
85
  }
86
- /**
87
- * User Intent type - represents a user's intent extracted from conversation
88
- */
89
- export type UserIntent = string;
90
86
  /**
91
87
  * Recent message for checkpoint
92
88
  *
@@ -100,14 +96,18 @@ export interface RecentMessage {
100
96
  * Complete checkpoint information (includes generated content)
101
97
  */
102
98
  export interface SessionCheckpoint extends CheckpointMeta {
103
- summary: string;
104
- processKeyPoints: string[];
105
- currentState: string;
106
- nextSteps: string[];
99
+ /**
100
+ * ★ C 方案(Task #4933 重写):整段自然语言 checkpoint 正文。
101
+ *
102
+ * 用户决策:压缩产物不再结构化 —— 没有 summary /
103
+ * processKeyPoints / currentState / nextSteps / userIntents 五栏位,
104
+ * 也没有固定 markdown 小节契约。正文形式自由(段落/列表/代码块都行)。
105
+ *
106
+ * 旧格式存量数据(生产 555 个)由 adaptLegacyCheckpoint()
107
+ * 在读取时合成 content,不写回数据库。
108
+ */
109
+ content: string;
107
110
  messageCountBefore: number;
108
- metadata?: Record<string, unknown>;
109
- /** User intents extracted from the conversation */
110
- userIntents: UserIntent[];
111
111
  /**
112
112
  * Recent messages preserved from the compacted conversation
113
113
  *
@@ -378,16 +378,10 @@ export interface CheckpointPart {
378
378
  type: "checkpoint";
379
379
  /** Checkpoint ID reference */
380
380
  checkpointId: string;
381
- /** Markdown content summarizing the checkpoint */
381
+ /** Checkpoint content (整段自然语言正文) */
382
382
  content: string;
383
383
  /** Title of the checkpoint */
384
384
  title?: string;
385
- /** Process key points */
386
- processKeyPoints?: string[];
387
- /** Current state description */
388
- currentState?: string;
389
- /** Next steps */
390
- nextSteps?: string[];
391
385
  /** Number of messages that were compacted */
392
386
  messageCountBefore?: number;
393
387
  /** Creation timestamp */
@@ -515,30 +509,27 @@ export interface AddMessageOptions {
515
509
  }
516
510
  /**
517
511
  * Options for compact operation
512
+ *
513
+ * ★ Task #4933(C 方案):只剩 `scenarioHint` 一个语义字段。
514
+ * 旧的 processKeyPoints / currentState / nextSteps 三栏位 hint 已删除
515
+ * (它们是「五栏位结构化」时代的遗留 —— C 方案下压缩产物是整段自然语言,
516
+ * 用户/CLI 再拼装结构化栏位没有意义,且会让后续开发者误以为五栏位仍是契约)。
517
+ * `summary` 同样未在 compact() 中被读取(HEAD 之前即如此),一并移除。
518
518
  */
519
519
  export interface CompactOptions {
520
- /** User-provided summary hint for checkpoint generation */
521
- summary?: string;
522
- /** User-provided process key points hint */
523
- processKeyPoints?: string[];
524
- /** User-provided current state hint */
525
- currentState?: string;
526
- /** User-provided next steps hint */
527
- nextSteps?: string[];
528
520
  /** Whether this is auto-triggered compact */
529
521
  auto?: boolean;
530
522
  /**
531
523
  * Scenario hint for guiding checkpoint generation
532
524
  *
533
525
  * A natural language description that provides context about the current scenario.
534
- * This helps the SummaryAgent generate more relevant checkpoints based on the specific
535
- * situation. Examples:
526
+ * This helps the checkpoint generator produce more relevant content based on the
527
+ * specific situation. Examples:
536
528
  * - "Task execution in progress: implementing feature X, current working directory is /path/to/project"
537
529
  * - "Bug investigation: analyzing crash dump, current hypothesis is memory corruption"
538
530
  * - "Code review session: reviewing PR #123, focus on security implications"
539
531
  *
540
- * When provided, this will be prepended to the system prompt to guide the checkpoint
541
- * generation with scenario-specific emphasis.
532
+ * When provided, it is injected into the compact agent's query as a focus hint.
542
533
  */
543
534
  scenarioHint?: string;
544
535
  }
@@ -559,6 +550,30 @@ export interface CompactPreview {
559
550
  estimatedCheckpointTokens: number;
560
551
  wouldTrigger: boolean;
561
552
  }
553
+ /**
554
+ * 存量 checkpoint 适配报告(Task #4933 C 方案)
555
+ *
556
+ * 生产库有 555 个旧格式 checkpoint(五栏位,无 content)。
557
+ * `adaptStoredCheckpoints()` 默认 dry-run,返回本报告用于人工核对。
558
+ */
559
+ export interface CheckpointAdaptReport {
560
+ sessionId: string;
561
+ /** checkpoint 总数 */
562
+ total: number;
563
+ /** 旧格式(无 content)数量 */
564
+ legacy: number;
565
+ /** 新格式(已有 content)数量 */
566
+ modern: number;
567
+ /** 实际写回的数量(dry-run 时恒为 0) */
568
+ applied: number;
569
+ /** 抽样(最多 3 条),用于人工确认合成正文质量 */
570
+ samples: Array<{
571
+ id: string;
572
+ title: string;
573
+ contentLength: number;
574
+ contentPreview: string;
575
+ }>;
576
+ }
562
577
  /**
563
578
  * Options for getting session context
564
579
  */
@@ -12,13 +12,13 @@ import {
12
12
  deriveTriggerEventIdFromEnvContext,
13
13
  getSubAgentSpec,
14
14
  handleBackgroundTask
15
- } from "../../../shared/@ai-setting/roy-agent-core-0j94tj1z.js";
15
+ } from "../../../shared/@ai-setting/roy-agent-core-7qvw65jt.js";
16
16
  import"../../../shared/@ai-setting/roy-agent-core-fttgm52a.js";
17
17
  import"../../../shared/@ai-setting/roy-agent-core-na18zwj0.js";
18
+ import"../../../shared/@ai-setting/roy-agent-core-yhwxpj12.js";
18
19
  import"../../../shared/@ai-setting/roy-agent-core-1pg0fepg.js";
19
- import"../../../shared/@ai-setting/roy-agent-core-vaz9350j.js";
20
- import"../../../shared/@ai-setting/roy-agent-core-6m4bw8jy.js";
21
- import"../../../shared/@ai-setting/roy-agent-core-07fvy74y.js";
20
+ import"../../../shared/@ai-setting/roy-agent-core-4jjwewvw.js";
21
+ import"../../../shared/@ai-setting/roy-agent-core-vm8h5zyj.js";
22
22
  import"../../../shared/@ai-setting/roy-agent-core-qxnbvgwe.js";
23
23
  import"../../../shared/@ai-setting/roy-agent-core-c1v263jn.js";
24
24
  import"../../../shared/@ai-setting/roy-agent-core-cpcd24n2.js";
@@ -5,13 +5,13 @@ import {
5
5
  BackgroundTaskEventTypes,
6
6
  BackgroundTaskManager,
7
7
  createDelegateTool
8
- } from "../../../shared/@ai-setting/roy-agent-core-0j94tj1z.js";
8
+ } from "../../../shared/@ai-setting/roy-agent-core-7qvw65jt.js";
9
9
  import"../../../shared/@ai-setting/roy-agent-core-fttgm52a.js";
10
10
  import"../../../shared/@ai-setting/roy-agent-core-na18zwj0.js";
11
+ import"../../../shared/@ai-setting/roy-agent-core-yhwxpj12.js";
11
12
  import"../../../shared/@ai-setting/roy-agent-core-1pg0fepg.js";
12
- import"../../../shared/@ai-setting/roy-agent-core-vaz9350j.js";
13
- import"../../../shared/@ai-setting/roy-agent-core-6m4bw8jy.js";
14
- import"../../../shared/@ai-setting/roy-agent-core-07fvy74y.js";
13
+ import"../../../shared/@ai-setting/roy-agent-core-4jjwewvw.js";
14
+ import"../../../shared/@ai-setting/roy-agent-core-vm8h5zyj.js";
15
15
  import"../../../shared/@ai-setting/roy-agent-core-qxnbvgwe.js";
16
16
  import"../../../shared/@ai-setting/roy-agent-core-c1v263jn.js";
17
17
  import"../../../shared/@ai-setting/roy-agent-core-cpcd24n2.js";
@@ -5,27 +5,27 @@ import {
5
5
  TaskPriorityEnum,
6
6
  TaskStatusEnum,
7
7
  TaskTypeEnum
8
- } from "../../shared/@ai-setting/roy-agent-core-nersksh1.js";
8
+ } from "../../shared/@ai-setting/roy-agent-core-2gzt2q8c.js";
9
9
  import"../../shared/@ai-setting/roy-agent-core-58804s3j.js";
10
10
  import"../../shared/@ai-setting/roy-agent-core-jm136jzh.js";
11
- import"../../shared/@ai-setting/roy-agent-core-0j94tj1z.js";
11
+ import"../../shared/@ai-setting/roy-agent-core-7qvw65jt.js";
12
12
  import"../../shared/@ai-setting/roy-agent-core-fttgm52a.js";
13
13
  import"../../shared/@ai-setting/roy-agent-core-ntq0gz7q.js";
14
14
  import {
15
15
  TaskEntityEventTypes
16
16
  } from "../../shared/@ai-setting/roy-agent-core-8gxth0eh.js";
17
- import"../../shared/@ai-setting/roy-agent-core-h5vmff8w.js";
17
+ import"../../shared/@ai-setting/roy-agent-core-7sj9xs9c.js";
18
18
  import"../../shared/@ai-setting/roy-agent-core-p5cz9m8v.js";
19
19
  import"../../shared/@ai-setting/roy-agent-core-na18zwj0.js";
20
+ import"../../shared/@ai-setting/roy-agent-core-yhwxpj12.js";
20
21
  import {
21
22
  SQLiteTaskStore,
22
23
  getDefaultTaskDbPath
23
24
  } from "../../shared/@ai-setting/roy-agent-core-abqhkbn3.js";
24
25
  import"../../shared/@ai-setting/roy-agent-core-1pg0fepg.js";
25
- import"../../shared/@ai-setting/roy-agent-core-vaz9350j.js";
26
26
  import"../../shared/@ai-setting/roy-agent-core-tr3ep81v.js";
27
- import"../../shared/@ai-setting/roy-agent-core-6m4bw8jy.js";
28
- import"../../shared/@ai-setting/roy-agent-core-07fvy74y.js";
27
+ import"../../shared/@ai-setting/roy-agent-core-4jjwewvw.js";
28
+ import"../../shared/@ai-setting/roy-agent-core-vm8h5zyj.js";
29
29
  import"../../shared/@ai-setting/roy-agent-core-qxnbvgwe.js";
30
30
  import"../../shared/@ai-setting/roy-agent-core-c1v263jn.js";
31
31
  import"../../shared/@ai-setting/roy-agent-core-7hh0brvs.js";
@@ -6,13 +6,13 @@ import {
6
6
  searchTasksTool,
7
7
  treeTasksTool,
8
8
  updateTaskTool
9
- } from "../../../shared/@ai-setting/roy-agent-core-h5vmff8w.js";
9
+ } from "../../../shared/@ai-setting/roy-agent-core-7sj9xs9c.js";
10
10
  import {
11
11
  createOperationTool,
12
12
  listOperationsTool
13
13
  } from "../../../shared/@ai-setting/roy-agent-core-p5cz9m8v.js";
14
14
  import"../../../shared/@ai-setting/roy-agent-core-tr3ep81v.js";
15
- import"../../../shared/@ai-setting/roy-agent-core-6m4bw8jy.js";
15
+ import"../../../shared/@ai-setting/roy-agent-core-4jjwewvw.js";
16
16
  import"../../../shared/@ai-setting/roy-agent-core-7cbpmk4q.js";
17
17
  import"../../../shared/@ai-setting/roy-agent-core-qq96p0tj.js";
18
18
  import"../../../shared/@ai-setting/roy-agent-core-7f7t9wwp.js";
@@ -17,13 +17,13 @@ import {
17
17
  formatExtractorInputFromDescription,
18
18
  getDefaultLarkCardDbPath,
19
19
  parseExtractorOutput
20
- } from "../../../shared/@ai-setting/roy-agent-core-hx46nhh1.js";
20
+ } from "../../../shared/@ai-setting/roy-agent-core-5gw0qa8m.js";
21
21
  import"../../../shared/@ai-setting/roy-agent-core-na18zwj0.js";
22
+ import"../../../shared/@ai-setting/roy-agent-core-yhwxpj12.js";
22
23
  import"../../../shared/@ai-setting/roy-agent-core-abqhkbn3.js";
23
24
  import"../../../shared/@ai-setting/roy-agent-core-1pg0fepg.js";
24
- import"../../../shared/@ai-setting/roy-agent-core-vaz9350j.js";
25
25
  import"../../../shared/@ai-setting/roy-agent-core-tr3ep81v.js";
26
- import"../../../shared/@ai-setting/roy-agent-core-6m4bw8jy.js";
26
+ import"../../../shared/@ai-setting/roy-agent-core-4jjwewvw.js";
27
27
  import {
28
28
  DEFAULT_APP_LINK_BASE,
29
29
  LarkCardPatchNotifier,
@@ -42,7 +42,7 @@ import {
42
42
  renderWorkflowInfoLines,
43
43
  resolveTaskTitleForDisplay,
44
44
  sanitizeInlineText
45
- } from "../../../shared/@ai-setting/roy-agent-core-tadj19vp.js";
45
+ } from "../../../shared/@ai-setting/roy-agent-core-46rv4d7d.js";
46
46
  import"../../../shared/@ai-setting/roy-agent-core-yr1mryb8.js";
47
47
  import"../../../shared/@ai-setting/roy-agent-core-mds8tqd0.js";
48
48
  import"../../../shared/@ai-setting/roy-agent-core-jrj30vq3.js";
@@ -103,6 +103,43 @@ export interface ProcessStep {
103
103
  description?: string;
104
104
  /** 步骤分类(如 research / code / test),有值时追加到标题括号内 */
105
105
  category?: string;
106
+ /**
107
+ * ★ Task #4889 —— 这条过程步骤的**语义来源**。
108
+ *
109
+ * ## 为什么需要这个字段
110
+ *
111
+ * 「过程信息」区历史上混装了两种**语义完全不同**的东西:
112
+ *
113
+ * 1. **operation** —— 真正的任务操作记录(`task_operation_create` 写的)。
114
+ * core 自己派生(`deriveTimelineFromOperation`),title 是人写的
115
+ * 里程碑标题,形如「勘查反转:manifest 并非残废」。
116
+ * 2. **tool-trace** —— 工具调用轨迹。插件派生(`describeToolUse`),
117
+ * title 是**动作名**,形如「执行命令」「记录进展」。
118
+ *
119
+ * 两者在卡片上同属一个「🔧 过程信息」区块、底部统一计「N 个过程」,
120
+ * 用户读起来就等同于「**每个工具调用都记了一条操作记录**」
121
+ * —— 这正是 Task #4889 用户反馈的核心不满。
122
+ *
123
+ * 所以:卡片按 source **分区呈现**,让两种语义在 UI 上泾渭分明。
124
+ *
125
+ * - `"tool-trace"` → 渲染进「🔧 执行轨迹(工具调用)」区
126
+ * - `"operation"` / 缺省 → 渲染进「📝 操作记录」区
127
+ *
128
+ * 缺省视为 operation:**旧数据(没有这个字段)必须继续渲染在操作记录区**,
129
+ * 不能因为新增字段就丢掉历史内容。
130
+ */
131
+ source?: "operation" | "tool-trace";
132
+ /**
133
+ * ★ Task #4889 —— 该步骤的**唯一标识**(可选)。
134
+ *
135
+ * 有 id 时,去重完全按 id 进行 —— 于是「同一个工具被连续调用两次」
136
+ * (title 相同、timestamp 可能同毫秒)不会撞成同一条而被**静默吞掉**。
137
+ *
138
+ * 缺省时退化为「内容 key」去重(同 title+timestamp+description+category+source
139
+ * 视为同一条)—— 对 operation 记录是对的(同一 operation 重复上报就是同一条),
140
+ * 对 tool-trace 则要求生产方补 id(插件已补)。
141
+ */
142
+ id?: string;
106
143
  }
107
144
  /**
108
145
  * 任务元信息(卡片顶部"任务栏位"区块的数据源)
@@ -454,6 +491,19 @@ export declare function renderMilestones(milestones: Milestone[]): string;
454
491
  * 样式:`- **HH:mm:ss → 现在** <title>` + 可选缩进说明行
455
492
  */
456
493
  export declare function renderProcessSteps(steps: ProcessStep[]): string;
494
+ /**
495
+ * ★ Task #4889 —— 按语义来源把过程步骤分成两组。
496
+ *
497
+ * - `operations` —— 真正的 task operation 记录(缺省 source 也归这里)
498
+ * - `toolTraces` —— 工具调用轨迹
499
+ *
500
+ * 分区是**呈现层**的职责:语义(这条到底是不是一条操作记录)在生产方决定,
501
+ * core 只负责不把两者混在一个区块里。
502
+ */
503
+ export declare function partitionProcessSteps(steps: ProcessStep[]): {
504
+ operations: ProcessStep[];
505
+ toolTraces: ProcessStep[];
506
+ };
457
507
  /**
458
508
  * 构造 card JSON payload(Card 2.0 schema,用户验收样式 Task #4230 v2)
459
509
  *
@@ -11,6 +11,7 @@ import {
11
11
  humanizeValue,
12
12
  isTerminalStatusForTimeline,
13
13
  isTerminalStatusForWorkflowTimeline,
14
+ partitionProcessSteps,
14
15
  renderContextAsLines,
15
16
  renderMilestones,
16
17
  renderProcessSteps,
@@ -19,7 +20,7 @@ import {
19
20
  renderWorkflowInfoLines,
20
21
  resolveTaskTitleForDisplay,
21
22
  sanitizeInlineText
22
- } from "../../../shared/@ai-setting/roy-agent-core-tadj19vp.js";
23
+ } from "../../../shared/@ai-setting/roy-agent-core-46rv4d7d.js";
23
24
  import"../../../shared/@ai-setting/roy-agent-core-qq96p0tj.js";
24
25
  import"../../../shared/@ai-setting/roy-agent-core-7f7t9wwp.js";
25
26
  import"../../../shared/@ai-setting/roy-agent-core-85xyctnb.js";
@@ -33,6 +34,7 @@ export {
33
34
  renderProcessSteps,
34
35
  renderMilestones,
35
36
  renderContextAsLines,
37
+ partitionProcessSteps,
36
38
  isTerminalStatusForWorkflowTimeline,
37
39
  isTerminalStatusForTimeline,
38
40
  humanizeValue,
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @fileoverview Task #4889 — 任务纪律子路径公开导出面
3
+ *
4
+ * 消费方式:
5
+ * import { TASK_DISCIPLINE_PROMPT } from "@ai-setting/roy-agent-core/env/task/prompt";
6
+ *
7
+ * 设计(/tmp/4889-phase1-design.md §1.3-1.6):
8
+ * TASK_DISCIPLINE_PROMPT 是唯一真相源;4 个分片供
9
+ * 「部分缺失」的 runtime 只补自己缺的那块。
10
+ */
11
+ export { TASK_DISCIPLINE_PROMPT, TASK_DISCIPLINE_LIFECYCLE, TASK_DISCIPLINE_OPERATION, TASK_DISCIPLINE_GOALS, TASK_DISCIPLINE_COMPLETE, } from "./task-discipline";
@@ -0,0 +1,16 @@
1
+ import"../../../shared/@ai-setting/roy-agent-core-qkdegdvc.js";
2
+ import {
3
+ TASK_DISCIPLINE_COMPLETE,
4
+ TASK_DISCIPLINE_GOALS,
5
+ TASK_DISCIPLINE_LIFECYCLE,
6
+ TASK_DISCIPLINE_OPERATION,
7
+ TASK_DISCIPLINE_PROMPT
8
+ } from "../../../shared/@ai-setting/roy-agent-core-4jjwewvw.js";
9
+ import"../../../shared/@ai-setting/roy-agent-core-fs0mn2jk.js";
10
+ export {
11
+ TASK_DISCIPLINE_PROMPT,
12
+ TASK_DISCIPLINE_OPERATION,
13
+ TASK_DISCIPLINE_LIFECYCLE,
14
+ TASK_DISCIPLINE_GOALS,
15
+ TASK_DISCIPLINE_COMPLETE
16
+ };