@xgjktech/xg_cwork_im 1.18.9 → 1.19.1

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 (69) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +4 -14
  3. package/dist/index.js.map +1 -1
  4. package/dist/src/action-store-lifecycle.test.js +0 -2
  5. package/dist/src/action-store-lifecycle.test.js.map +1 -1
  6. package/dist/src/block-streaming-config.test.js.map +1 -1
  7. package/dist/src/dispatch-mentioned-reply.d.ts +1 -1
  8. package/dist/src/dispatch-mentioned-reply.d.ts.map +1 -1
  9. package/dist/src/dispatch-mentioned-reply.js +32 -4
  10. package/dist/src/dispatch-mentioned-reply.js.map +1 -1
  11. package/dist/src/inbound-display.js +1 -1
  12. package/dist/src/inbound-display.js.map +1 -1
  13. package/dist/src/per-message-model-pending.d.ts +34 -8
  14. package/dist/src/per-message-model-pending.d.ts.map +1 -1
  15. package/dist/src/per-message-model-pending.js +84 -16
  16. package/dist/src/per-message-model-pending.js.map +1 -1
  17. package/dist/src/plan-core-adapter.d.ts +46 -0
  18. package/dist/src/plan-core-adapter.d.ts.map +1 -0
  19. package/dist/src/plan-core-adapter.js +103 -0
  20. package/dist/src/plan-core-adapter.js.map +1 -0
  21. package/dist/src/plan-core-adapter.test.d.ts +2 -0
  22. package/dist/src/plan-core-adapter.test.d.ts.map +1 -0
  23. package/dist/src/plan-core-adapter.test.js +164 -0
  24. package/dist/src/plan-core-adapter.test.js.map +1 -0
  25. package/dist/src/plan-core-db.d.ts +22 -0
  26. package/dist/src/plan-core-db.d.ts.map +1 -0
  27. package/dist/src/plan-core-db.js +91 -0
  28. package/dist/src/plan-core-db.js.map +1 -0
  29. package/dist/src/plan-core-db.test.d.ts +2 -0
  30. package/dist/src/plan-core-db.test.d.ts.map +1 -0
  31. package/dist/src/plan-core-db.test.js +115 -0
  32. package/dist/src/plan-core-db.test.js.map +1 -0
  33. package/dist/src/plan-core-snapshot.d.ts +23 -0
  34. package/dist/src/plan-core-snapshot.d.ts.map +1 -0
  35. package/dist/src/plan-core-snapshot.js +65 -0
  36. package/dist/src/plan-core-snapshot.js.map +1 -0
  37. package/dist/src/plan-core-snapshot.test.d.ts +2 -0
  38. package/dist/src/plan-core-snapshot.test.d.ts.map +1 -0
  39. package/dist/src/plan-core-snapshot.test.js +155 -0
  40. package/dist/src/plan-core-snapshot.test.js.map +1 -0
  41. package/dist/src/plan-stat-event.d.ts +4 -19
  42. package/dist/src/plan-stat-event.d.ts.map +1 -1
  43. package/dist/src/plan-stat-event.js +4 -88
  44. package/dist/src/plan-stat-event.js.map +1 -1
  45. package/dist/src/plan-stat-event.test.js +1 -245
  46. package/dist/src/plan-stat-event.test.js.map +1 -1
  47. package/dist/src/plan-tool-middleware.d.ts +2 -10
  48. package/dist/src/plan-tool-middleware.d.ts.map +1 -1
  49. package/dist/src/plan-tool-middleware.js +11 -60
  50. package/dist/src/plan-tool-middleware.js.map +1 -1
  51. package/dist/src/plan-tool-middleware.test.js +83 -603
  52. package/dist/src/plan-tool-middleware.test.js.map +1 -1
  53. package/dist/src/plugin-dispose.d.ts +1 -1
  54. package/dist/src/plugin-dispose.d.ts.map +1 -1
  55. package/dist/src/plugin-dispose.js +3 -5
  56. package/dist/src/plugin-dispose.js.map +1 -1
  57. package/dist/src/register-per-message-model-hook.d.ts +8 -3
  58. package/dist/src/register-per-message-model-hook.d.ts.map +1 -1
  59. package/dist/src/register-per-message-model-hook.js +23 -9
  60. package/dist/src/register-per-message-model-hook.js.map +1 -1
  61. package/dist/src/register-per-message-model-hook.test.js +144 -27
  62. package/dist/src/register-per-message-model-hook.test.js.map +1 -1
  63. package/dist/src/session-model-fallback.d.ts +13 -0
  64. package/dist/src/session-model-fallback.d.ts.map +1 -0
  65. package/dist/src/session-model-fallback.js +24 -0
  66. package/dist/src/session-model-fallback.js.map +1 -0
  67. package/dist/src/turn-agent-event-subscription.d.ts +1 -1
  68. package/dist/src/turn-agent-event-subscription.js +1 -1
  69. package/package.json +9 -5
@@ -1,10 +1,18 @@
1
1
  /**
2
2
  * 单轮模型覆盖:在 dispatch 前登记,由 before_model_resolve 消费。
3
- * 仅当当前候选与用户点名模型一致时生效;主候选被跳过进入 fallback 时不得覆盖回原模型。
4
- * 主通道仍以 replyOptions.modelOverride 为准,本机制只在候选一致时补一次显式覆盖。
3
+ *
4
+ * 语义:
5
+ * - 覆盖只作用于本轮回复的「首次模型解析」(runId 首次调用);模型 fallback 重试不重复覆盖。
6
+ * - 若登记时该 session 正处于自动降级(modelOverrideSource === "auto")且用户点名的正是降级来源
7
+ * (被冷却/额度跳过的原模型),则放弃覆盖,避免把降级候选改回不可用的原模型。
8
+ *
9
+ * 注意:OpenClaw 的 replyOptions 并不消费 modelOverride(该字段仅 2026.5.17~2026.5.22 短暂存在,
10
+ * 用于 WebChat 图片模型路由,之后已移除)。因此本机制是单轮模型覆盖的唯一生效通道。
5
11
  */
6
12
  import { getSharedMap } from "./process-shared-store.js";
7
13
  const pendingBySessionKey = getSharedMap("pending-per-message-model");
14
+ const appliedRunIds = getSharedMap("per-message-model-applied-run");
15
+ const APPLIED_RUN_TTL_MS = 60 * 60_000;
8
16
  export function normalizeModelRefRaw(raw) {
9
17
  return raw.trim().replace(/^["']|["']$/g, "").trim();
10
18
  }
@@ -19,31 +27,90 @@ export function splitModelRef(raw) {
19
27
  const model = normalized.slice(slash + 1).trim();
20
28
  if (!provider || !model)
21
29
  return undefined;
22
- return { raw: normalized, provider, model };
30
+ return { raw: normalized, provider, model, sessionInAutoFallback: false };
23
31
  }
24
- return { raw: normalized, model: normalized };
32
+ return { raw: normalized, model: normalized, sessionInAutoFallback: false };
33
+ }
34
+ /** 比较用归一化 key:有 provider 时 `provider/model`,否则仅 model。 */
35
+ export function normalizeModelRefForCompare(provider, model) {
36
+ const p = (provider ?? "").trim().toLowerCase();
37
+ const m = (model ?? "").trim().toLowerCase();
38
+ if (!m)
39
+ return "";
40
+ return p ? `${p}/${m}` : m;
25
41
  }
26
42
  /**
27
- * 单轮覆盖只在「当前候选 == 用户点名的目标模型」时生效。
28
- * 主模型被冷却/额度跳过进入 fallback 后,当前候选已不是目标模型,
29
- * 钩子不得再把 fallback 候选改回目标模型。目标未带 provider 时仅比对 model。
43
+ * 用户点名的目标模型是否就是当前自动降级的来源模型。
44
+ * 先比对 model(大小写不敏感);origin 带 provider 时再要求 provider 一致(目标未带 provider 视为通配)。
30
45
  */
31
- export function matchesPendingCandidate(ctxProvider, ctxModel, pending) {
32
- const candidateProvider = (ctxProvider ?? "").trim().toLowerCase();
33
- const candidateModel = (ctxModel ?? "").trim();
46
+ export function targetMatchesFallbackOrigin(pending) {
47
+ const originModel = pending.fallbackOrigin?.model?.trim().toLowerCase() ?? "";
48
+ const targetModel = pending.model.trim().toLowerCase();
49
+ if (!originModel || !targetModel || originModel !== targetModel)
50
+ return false;
51
+ const originProvider = (pending.fallbackOrigin?.provider ?? "").trim().toLowerCase();
52
+ if (!originProvider)
53
+ return true;
34
54
  const targetProvider = (pending.provider ?? "").trim().toLowerCase();
35
- const targetModel = pending.model.trim();
36
- if (candidateModel !== targetModel) {
55
+ return targetProvider === "" || targetProvider === originProvider;
56
+ }
57
+ /** session 正处于自动降级,且目标就是降级来源时,放弃覆盖。 */
58
+ export function shouldSkipOverrideForActiveFallback(pending) {
59
+ return pending.sessionInAutoFallback === true && targetMatchesFallbackOrigin(pending);
60
+ }
61
+ /**
62
+ * 本轮 run 是否首次解析模型。模型 fallback 会为同一 runId 再次调用 before_model_resolve,
63
+ * 此时返回 false,避免降级候选被覆盖回主模型。runId 缺失时不限制。
64
+ */
65
+ export function claimPerMessageModelRun(runId) {
66
+ const key = runId?.trim();
67
+ if (!key)
68
+ return true;
69
+ const now = Date.now();
70
+ for (const [id, ts] of appliedRunIds) {
71
+ if (now - ts > APPLIED_RUN_TTL_MS) {
72
+ appliedRunIds.delete(id);
73
+ }
74
+ }
75
+ if (appliedRunIds.has(key)) {
37
76
  return false;
38
77
  }
39
- return targetProvider === "" || candidateProvider === targetProvider;
78
+ appliedRunIds.set(key, now);
79
+ return true;
40
80
  }
41
- export function setPendingPerMessageModel(sessionKey, raw) {
81
+ /** session entry 提取自动降级上下文(纯函数,便于单测)。 */
82
+ export function resolveSessionFallbackContextFromEntry(entry) {
83
+ if (!entry)
84
+ return { sessionInAutoFallback: false };
85
+ const originModel = entry.modelOverrideFallbackOriginModel?.trim();
86
+ const originProvider = entry.modelOverrideFallbackOriginProvider?.trim();
87
+ const sessionInAutoFallback = entry.modelOverrideSource === "auto";
88
+ if (!sessionInAutoFallback && !originModel) {
89
+ return { sessionInAutoFallback: false };
90
+ }
91
+ return {
92
+ sessionInAutoFallback,
93
+ ...(originModel
94
+ ? {
95
+ fallbackOrigin: {
96
+ ...(originProvider ? { provider: originProvider } : {}),
97
+ model: originModel,
98
+ },
99
+ }
100
+ : {}),
101
+ };
102
+ }
103
+ export function setPendingPerMessageModel(sessionKey, raw, fallbackContext) {
42
104
  const parsed = splitModelRef(raw);
43
105
  if (!parsed)
44
106
  return undefined;
45
- pendingBySessionKey.set(sessionKey, parsed);
46
- return parsed;
107
+ const pending = {
108
+ ...parsed,
109
+ sessionInAutoFallback: fallbackContext?.sessionInAutoFallback === true,
110
+ ...(fallbackContext?.fallbackOrigin ? { fallbackOrigin: fallbackContext.fallbackOrigin } : {}),
111
+ };
112
+ pendingBySessionKey.set(sessionKey, pending);
113
+ return pending;
47
114
  }
48
115
  export function takePendingPerMessageModel(sessionKey) {
49
116
  if (!sessionKey?.trim())
@@ -62,5 +129,6 @@ export function clearPendingPerMessageModel(sessionKey) {
62
129
  /** 插件卸载/重载时清空全部待消费的单轮模型覆盖。 */
63
130
  export function clearAllPendingPerMessageModel() {
64
131
  pendingBySessionKey.clear();
132
+ appliedRunIds.clear();
65
133
  }
66
134
  //# sourceMappingURL=per-message-model-pending.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"per-message-model-pending.js","sourceRoot":"","sources":["../../src/per-message-model-pending.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"per-message-model-pending.js","sourceRoot":"","sources":["../../src/per-message-model-pending.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { Plan, TaskStatus } from "@xgjktech/xg-openclaw-shared";
2
+ /** 每条 core 计划步骤的入参形态(progress_card 事件 steps 可能为旧版 string[])。 */
3
+ export type CorePlanStepInput = string | {
4
+ step?: string;
5
+ status?: string;
6
+ };
7
+ export type CorePlanUpdatePayload = {
8
+ phase?: string;
9
+ title?: string;
10
+ explanation?: string;
11
+ steps?: readonly CorePlanStepInput[];
12
+ source?: string;
13
+ };
14
+ /** 归一化后的 core 步骤。 */
15
+ export type CorePlanStep = {
16
+ step: string;
17
+ status: TaskStatus;
18
+ };
19
+ /** 按 sessionKey 派生稳定的 planId(前端按 planId 覆盖/去重依赖稳定 id)。 */
20
+ export declare function buildCorePlanId(sessionKey: string): string;
21
+ export declare function normalizeCorePlanSteps(steps: readonly CorePlanStepInput[] | undefined): CorePlanStep[];
22
+ /** 取或记录首次观察到该会话计划的时间(进程内记忆,跨重启由 DB 快照补 createdAt)。 */
23
+ export declare function resolveCorePlanCreatedAt(sessionKey: string, nowMs: number, createdAtIso?: string): string;
24
+ /** 仅测试用:清空进程内 firstSeen 记忆。 */
25
+ export declare function resetCorePlanFirstSeenForTest(): void;
26
+ /** 组装带内部 origin 的 Plan;core steps 为空时不产计划(纯 markdown 或清空,交由快照/后续事件决定)。 */
27
+ export declare function buildPlanFromCoreUpdate(params: {
28
+ sessionKey: string;
29
+ groupId: string;
30
+ payload: CorePlanUpdatePayload;
31
+ accountId?: string;
32
+ nowMs?: number;
33
+ /** DB 回放时用落库的创建时间,进程内 firstSeen 不再生效。 */
34
+ createdAtIso?: string;
35
+ }): Plan | undefined;
36
+ /**
37
+ * progress_card 事件 → PLAN_STAT 增量(source:"tool")。
38
+ * 绝不抛(sendPlanStat 本身 fire-and-forget,内部已 catch)。
39
+ */
40
+ export declare function handleCorePlanUpdate(params: {
41
+ sessionKey: string;
42
+ groupId: string;
43
+ payload: CorePlanUpdatePayload;
44
+ accountId?: string;
45
+ }): void;
46
+ //# sourceMappingURL=plan-core-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-core-adapter.d.ts","sourceRoot":"","sources":["../../src/plan-core-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAoB,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAYvF,gEAAgE;AAChE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E,MAAM,MAAM,qBAAqB,GAAG;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qBAAqB;AACrB,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAEhE,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,sBAAsB,CAClC,KAAK,EAAE,SAAS,iBAAiB,EAAE,GAAG,SAAS,GAChD,YAAY,EAAE,CAuBhB;AAID,sDAAsD;AACtD,wBAAgB,wBAAwB,CACpC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,GACtB,MAAM,CAUR;AAED,+BAA+B;AAC/B,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD;AAED,0EAA0E;AAC1E,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,IAAI,GAAG,SAAS,CA8BnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,IAAI,CAUP"}
@@ -0,0 +1,103 @@
1
+ import { createHash } from "node:crypto";
2
+ import { sendPlanStat } from "./plan-stat-event.js";
3
+ const LOG_PREFIX = "[xg_cwork_im] [plan-core-adapter]";
4
+ const CORE_PLAN_STATUSES = new Set(["pending", "in_progress", "completed"]);
5
+ const FALLBACK_PLAN_GOAL = "任务执行计划";
6
+ /** progress_card 的 explanation 形如 "2/5 complete",不是 goal,需回退。 */
7
+ const COMPLETION_ONLY_EXPLANATION_RE = /^\d+\/\d+\s+complete$/i;
8
+ /** 按 sessionKey 派生稳定的 planId(前端按 planId 覆盖/去重依赖稳定 id)。 */
9
+ export function buildCorePlanId(sessionKey) {
10
+ const digest = createHash("sha256").update(`core-plan:${sessionKey}`).digest("hex");
11
+ return `core-${digest.slice(0, 16)}`;
12
+ }
13
+ export function normalizeCorePlanSteps(steps) {
14
+ if (!Array.isArray(steps)) {
15
+ return [];
16
+ }
17
+ const out = [];
18
+ for (const entry of steps) {
19
+ if (typeof entry === "string") {
20
+ const step = entry.trim();
21
+ if (step)
22
+ out.push({ step, status: "pending" });
23
+ continue;
24
+ }
25
+ if (!entry || typeof entry !== "object") {
26
+ continue;
27
+ }
28
+ const step = typeof entry.step === "string" ? entry.step.trim() : "";
29
+ const rawStatus = typeof entry.status === "string" ? entry.status : "";
30
+ if (!step)
31
+ continue;
32
+ const status = CORE_PLAN_STATUSES.has(rawStatus)
33
+ ? rawStatus
34
+ : "pending";
35
+ out.push({ step, status });
36
+ }
37
+ return out;
38
+ }
39
+ const firstSeenBySession = new Map();
40
+ /** 取或记录首次观察到该会话计划的时间(进程内记忆,跨重启由 DB 快照补 createdAt)。 */
41
+ export function resolveCorePlanCreatedAt(sessionKey, nowMs, createdAtIso) {
42
+ if (createdAtIso) {
43
+ return createdAtIso;
44
+ }
45
+ const existing = firstSeenBySession.get(sessionKey);
46
+ if (existing !== undefined) {
47
+ return new Date(existing).toISOString();
48
+ }
49
+ firstSeenBySession.set(sessionKey, nowMs);
50
+ return new Date(nowMs).toISOString();
51
+ }
52
+ /** 仅测试用:清空进程内 firstSeen 记忆。 */
53
+ export function resetCorePlanFirstSeenForTest() {
54
+ firstSeenBySession.clear();
55
+ }
56
+ /** 组装带内部 origin 的 Plan;core steps 为空时不产计划(纯 markdown 或清空,交由快照/后续事件决定)。 */
57
+ export function buildPlanFromCoreUpdate(params) {
58
+ const { sessionKey, groupId, payload, accountId, createdAtIso } = params;
59
+ const nowMs = params.nowMs ?? Date.now();
60
+ const steps = normalizeCorePlanSteps(payload.steps);
61
+ if (steps.length === 0) {
62
+ return undefined;
63
+ }
64
+ const tasks = steps.map((step) => ({
65
+ title: step.step,
66
+ status: step.status,
67
+ }));
68
+ const explanation = typeof payload.explanation === "string" ? payload.explanation.trim() : "";
69
+ const goal = explanation && !COMPLETION_ONLY_EXPLANATION_RE.test(explanation)
70
+ ? explanation
71
+ : FALLBACK_PLAN_GOAL;
72
+ const origin = {
73
+ channel: "xg_cwork_im",
74
+ to: groupId,
75
+ sessionKey,
76
+ ...(accountId ? { accountId } : {}),
77
+ };
78
+ return {
79
+ planId: buildCorePlanId(sessionKey),
80
+ goal,
81
+ createdAt: resolveCorePlanCreatedAt(sessionKey, nowMs, createdAtIso),
82
+ updatedAt: new Date(nowMs).toISOString(),
83
+ tasks,
84
+ origin,
85
+ };
86
+ }
87
+ /**
88
+ * progress_card 事件 → PLAN_STAT 增量(source:"tool")。
89
+ * 绝不抛(sendPlanStat 本身 fire-and-forget,内部已 catch)。
90
+ */
91
+ export function handleCorePlanUpdate(params) {
92
+ try {
93
+ const plan = buildPlanFromCoreUpdate(params);
94
+ if (!plan) {
95
+ return;
96
+ }
97
+ sendPlanStat({ plan, source: "tool" });
98
+ }
99
+ catch (err) {
100
+ console.warn(`${LOG_PREFIX} adapter 内部异常已吞: ${String(err)}`);
101
+ }
102
+ }
103
+ //# sourceMappingURL=plan-core-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-core-adapter.js","sourceRoot":"","sources":["../../src/plan-core-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plan-core-adapter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-core-adapter.test.d.ts","sourceRoot":"","sources":["../../src/plan-core-adapter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,164 @@
1
+ import assert from "node:assert/strict";
2
+ import { describe, it, beforeEach } from "node:test";
3
+ import { buildCorePlanId, buildPlanFromCoreUpdate, handleCorePlanUpdate, normalizeCorePlanSteps, resetCorePlanFirstSeenForTest, } from "./plan-core-adapter.js";
4
+ import { resetPlanWsRegistryForTest, setPlanWsClient } from "./plan-ws-registry.js";
5
+ const NOW = Date.parse("2026-09-08T00:00:00.000Z");
6
+ function makeRecordingClient() {
7
+ const calls = [];
8
+ const client = {
9
+ start: async () => { },
10
+ streamProgress: async () => { },
11
+ streamUsage: async () => { },
12
+ sendEvent: async (opts) => {
13
+ calls.push(opts);
14
+ },
15
+ end: async () => { },
16
+ };
17
+ return { client, calls };
18
+ }
19
+ beforeEach(() => {
20
+ resetPlanWsRegistryForTest();
21
+ resetCorePlanFirstSeenForTest();
22
+ });
23
+ describe("buildCorePlanId", () => {
24
+ it("对同一 sessionKey 稳定、不同 sessionKey 不同,且带 core- 前缀", () => {
25
+ const a1 = buildCorePlanId("sess-1");
26
+ const a2 = buildCorePlanId("sess-1");
27
+ const b = buildCorePlanId("sess-2");
28
+ assert.match(a1, /^core-/);
29
+ assert.equal(a1, a2);
30
+ assert.notEqual(a1, b);
31
+ });
32
+ });
33
+ describe("normalizeCorePlanSteps", () => {
34
+ it("typed 步骤透传 step/status", () => {
35
+ assert.deepEqual(normalizeCorePlanSteps([
36
+ { step: " 做 A ", status: "in_progress" },
37
+ { step: "做 B", status: "completed" },
38
+ ]), [
39
+ { step: "做 A", status: "in_progress" },
40
+ { step: "做 B", status: "completed" },
41
+ ]);
42
+ });
43
+ it("旧版 string 步骤归一为 pending", () => {
44
+ assert.deepEqual(normalizeCorePlanSteps(["做 A", " "]), [{ step: "做 A", status: "pending" }]);
45
+ });
46
+ it("非法 status / 空文本丢弃,非法 status 回退 pending", () => {
47
+ assert.deepEqual(normalizeCorePlanSteps([
48
+ { step: "ok", status: "blocked" },
49
+ { step: "", status: "pending" },
50
+ "valid",
51
+ null,
52
+ ]), [
53
+ { step: "ok", status: "pending" },
54
+ { step: "valid", status: "pending" },
55
+ ]);
56
+ });
57
+ it("undefined / 非数组 → 空", () => {
58
+ assert.deepEqual(normalizeCorePlanSteps(undefined), []);
59
+ assert.deepEqual(normalizeCorePlanSteps("x"), []);
60
+ });
61
+ });
62
+ describe("buildPlanFromCoreUpdate", () => {
63
+ it("steps 映射为 tasks,origin 为内部路由字段", () => {
64
+ const plan = buildPlanFromCoreUpdate({
65
+ sessionKey: "sess-1",
66
+ groupId: "g-1",
67
+ payload: {
68
+ phase: "update",
69
+ title: "Plan updated",
70
+ explanation: "迁移配置",
71
+ steps: [
72
+ { step: "备份", status: "completed" },
73
+ { step: "校验", status: "in_progress" },
74
+ ],
75
+ },
76
+ nowMs: NOW,
77
+ });
78
+ assert.equal(plan.planId, buildCorePlanId("sess-1"));
79
+ assert.equal(plan.goal, "迁移配置");
80
+ assert.equal(plan.updatedAt, new Date(NOW).toISOString());
81
+ assert.deepEqual(plan.tasks, [
82
+ { title: "备份", status: "completed" },
83
+ { title: "校验", status: "in_progress" },
84
+ ]);
85
+ assert.deepEqual(plan.origin, {
86
+ channel: "xg_cwork_im",
87
+ to: "g-1",
88
+ sessionKey: "sess-1",
89
+ });
90
+ });
91
+ it("completion 计数 explanation 回退固定 goal", () => {
92
+ const plan = buildPlanFromCoreUpdate({
93
+ sessionKey: "sess-1",
94
+ groupId: "g-1",
95
+ payload: { steps: [{ step: "A", status: "completed" }], explanation: "2/5 complete" },
96
+ nowMs: NOW,
97
+ });
98
+ assert.equal(plan.goal, "任务执行计划");
99
+ });
100
+ it("createdAtIso 覆盖进程内 firstSeen", () => {
101
+ const first = buildPlanFromCoreUpdate({
102
+ sessionKey: "sess-1",
103
+ groupId: "g-1",
104
+ payload: { steps: [{ step: "A", status: "pending" }] },
105
+ nowMs: NOW,
106
+ });
107
+ const second = buildPlanFromCoreUpdate({
108
+ sessionKey: "sess-1",
109
+ groupId: "g-1",
110
+ payload: { steps: [{ step: "A", status: "completed" }] },
111
+ nowMs: NOW + 60_000,
112
+ });
113
+ assert.equal(second.createdAt, first.createdAt, "同会话 createdAt 保持首次");
114
+ const fromDb = buildPlanFromCoreUpdate({
115
+ sessionKey: "sess-db",
116
+ groupId: "g-1",
117
+ payload: { steps: [{ step: "A", status: "pending" }] },
118
+ nowMs: NOW,
119
+ createdAtIso: "2026-09-01T00:00:00.000Z",
120
+ });
121
+ assert.equal(fromDb.createdAt, "2026-09-01T00:00:00.000Z");
122
+ });
123
+ it("空 steps → undefined(不产计划)", () => {
124
+ assert.equal(buildPlanFromCoreUpdate({
125
+ sessionKey: "sess-1",
126
+ groupId: "g-1",
127
+ payload: { steps: [] },
128
+ nowMs: NOW,
129
+ }), undefined);
130
+ });
131
+ });
132
+ describe("handleCorePlanUpdate", () => {
133
+ it("有 steps 且 WS 已登记 → 发一条 source=tool 的 PLAN_STAT", () => {
134
+ const { client, calls } = makeRecordingClient();
135
+ setPlanWsClient("g-1", client, "msg-1");
136
+ handleCorePlanUpdate({
137
+ sessionKey: "sess-1",
138
+ groupId: "g-1",
139
+ payload: { steps: [{ step: "备份", status: "pending" }] },
140
+ });
141
+ assert.equal(calls.length, 1);
142
+ assert.equal(calls[0].event, "PLAN_STAT");
143
+ assert.equal(calls[0].data.source, "tool");
144
+ assert.equal(calls[0].data.plan.planId, buildCorePlanId("sess-1"));
145
+ });
146
+ it("空 steps → 不发送、不外抛", () => {
147
+ const { client, calls } = makeRecordingClient();
148
+ setPlanWsClient("g-1", client, "msg-1");
149
+ assert.doesNotThrow(() => handleCorePlanUpdate({
150
+ sessionKey: "sess-1",
151
+ groupId: "g-1",
152
+ payload: { steps: [] },
153
+ }));
154
+ assert.equal(calls.length, 0);
155
+ });
156
+ it("未登记 WS client → 不外抛", () => {
157
+ assert.doesNotThrow(() => handleCorePlanUpdate({
158
+ sessionKey: "sess-1",
159
+ groupId: "g-nowhere",
160
+ payload: { steps: [{ step: "A", status: "pending" }] },
161
+ }));
162
+ });
163
+ });
164
+ //# sourceMappingURL=plan-core-adapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-core-adapter.test.js","sourceRoot":"","sources":["../../src/plan-core-adapter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export type StoredCoreProgressCard = {
2
+ steps: Array<{
3
+ step: string;
4
+ status: "pending" | "in_progress" | "completed";
5
+ }>;
6
+ markdown?: string;
7
+ revision: number;
8
+ createdAtMs: number;
9
+ updatedAtMs: number;
10
+ };
11
+ /** 供 index.ts 装配:注入 api.runtime.state.resolveStateDir()(与旧 plans.sqlite 同一基址)。 */
12
+ export declare function setCoreAgentStateBase(dir: string): void;
13
+ export declare function resolveCoreAgentSqlitePath(agentId: string): string | undefined;
14
+ /**
15
+ * 只读当前 agent 的 openclaw-agent.sqlite 里 session_progress_cards 一行。
16
+ * 文件/表/行缺失、任何解析或打开异常 → undefined,绝不外抛(调用点在热路径)。
17
+ */
18
+ export declare function readCoreProgressCard(params: {
19
+ agentId: string;
20
+ sessionKey: string;
21
+ }): StoredCoreProgressCard | undefined;
22
+ //# sourceMappingURL=plan-core-db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-core-db.d.ts","sourceRoot":"","sources":["../../src/plan-core-db.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,sBAAsB,GAAG;IACjC,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,CAAA;KAAE,CAAC,CAAC;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACvB,CAAC;AAIF,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvD;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK9E;AA0BD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACtB,GAAG,sBAAsB,GAAG,SAAS,CAsDrC"}
@@ -0,0 +1,91 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ import { join } from "node:path";
3
+ const LOG_PREFIX = "[xg_cwork_im] [plan-core-db]";
4
+ const CORE_STATUSES = new Set(["pending", "in_progress", "completed"]);
5
+ let coreStateBase;
6
+ /** 供 index.ts 装配:注入 api.runtime.state.resolveStateDir()(与旧 plans.sqlite 同一基址)。 */
7
+ export function setCoreAgentStateBase(dir) {
8
+ coreStateBase = dir;
9
+ }
10
+ export function resolveCoreAgentSqlitePath(agentId) {
11
+ if (!coreStateBase) {
12
+ return undefined;
13
+ }
14
+ return join(coreStateBase, "agents", agentId, "agent", "openclaw-agent.sqlite");
15
+ }
16
+ function isStoredCoreStep(entry) {
17
+ if (!entry || typeof entry !== "object") {
18
+ return false;
19
+ }
20
+ const raw = entry;
21
+ if (typeof raw.step !== "string" || !raw.step.trim()) {
22
+ return false;
23
+ }
24
+ return typeof raw.status === "string" && CORE_STATUSES.has(raw.status);
25
+ }
26
+ function parseStoredSteps(raw) {
27
+ if (!Array.isArray(raw)) {
28
+ return [];
29
+ }
30
+ const out = [];
31
+ for (const entry of raw) {
32
+ if (isStoredCoreStep(entry)) {
33
+ out.push({ step: entry.step.trim(), status: entry.status });
34
+ }
35
+ }
36
+ return out;
37
+ }
38
+ /**
39
+ * 只读当前 agent 的 openclaw-agent.sqlite 里 session_progress_cards 一行。
40
+ * 文件/表/行缺失、任何解析或打开异常 → undefined,绝不外抛(调用点在热路径)。
41
+ */
42
+ export function readCoreProgressCard(params) {
43
+ const { agentId, sessionKey } = params;
44
+ const dbPath = resolveCoreAgentSqlitePath(agentId);
45
+ if (!dbPath) {
46
+ return undefined;
47
+ }
48
+ let db;
49
+ try {
50
+ db = new DatabaseSync(dbPath, { readOnly: true });
51
+ db.exec("PRAGMA busy_timeout = 5000;");
52
+ const row = db
53
+ .prepare("SELECT markdown, steps_json, revision, created_at, updated_at " +
54
+ "FROM session_progress_cards WHERE session_key = ?;")
55
+ .get(sessionKey);
56
+ if (!row) {
57
+ return undefined;
58
+ }
59
+ let stepsJson;
60
+ try {
61
+ stepsJson = row.steps_json ? JSON.parse(row.steps_json) : [];
62
+ }
63
+ catch {
64
+ stepsJson = [];
65
+ }
66
+ const steps = parseStoredSteps(stepsJson);
67
+ if (steps.length === 0) {
68
+ return undefined;
69
+ }
70
+ return {
71
+ steps,
72
+ ...(row.markdown ? { markdown: row.markdown } : {}),
73
+ revision: row.revision ?? 0,
74
+ createdAtMs: row.created_at ?? 0,
75
+ updatedAtMs: row.updated_at ?? 0,
76
+ };
77
+ }
78
+ catch (err) {
79
+ console.warn(`${LOG_PREFIX} 读取 core progress card 失败 agentId=${agentId}: ${String(err)}`);
80
+ return undefined;
81
+ }
82
+ finally {
83
+ try {
84
+ db?.close();
85
+ }
86
+ catch {
87
+ // close 失败可忽略
88
+ }
89
+ }
90
+ }
91
+ //# sourceMappingURL=plan-core-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-core-db.js","sourceRoot":"","sources":["../../src/plan-core-db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plan-core-db.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-core-db.test.d.ts","sourceRoot":"","sources":["../../src/plan-core-db.test.ts"],"names":[],"mappings":""}