@xgjktech/xg_cwork_im 1.19.17 → 1.19.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +489 -489
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/src/action-store-lifecycle.test.js +5 -5
- package/dist/src/build-project-prompt.test.js +18 -18
- package/dist/src/gateway-session-queue.d.ts +0 -3
- package/dist/src/gateway-session-queue.d.ts.map +1 -1
- package/dist/src/gateway-session-queue.js +0 -1
- package/dist/src/gateway-session-queue.js.map +1 -1
- package/dist/src/plan-core-db.test.js +9 -9
- package/dist/src/plan-core-snapshot.test.js +9 -9
- package/dist/src/register-run-model-context-hook.d.ts +11 -0
- package/dist/src/register-run-model-context-hook.d.ts.map +1 -0
- package/dist/src/register-run-model-context-hook.js +23 -0
- package/dist/src/register-run-model-context-hook.js.map +1 -0
- package/dist/src/run-model-context.d.ts +45 -0
- package/dist/src/run-model-context.d.ts.map +1 -0
- package/dist/src/run-model-context.js +108 -0
- package/dist/src/run-model-context.js.map +1 -0
- package/dist/src/run-model-context.test.d.ts +2 -0
- package/dist/src/run-model-context.test.d.ts.map +1 -0
- package/dist/src/run-model-context.test.js +68 -0
- package/dist/src/run-model-context.test.js.map +1 -0
- package/dist/src/run-usage-session.d.ts +4 -1
- package/dist/src/run-usage-session.d.ts.map +1 -1
- package/dist/src/run-usage-session.js +13 -1
- package/dist/src/run-usage-session.js.map +1 -1
- package/dist/src/run-usage.d.ts +15 -0
- package/dist/src/run-usage.d.ts.map +1 -1
- package/dist/src/run-usage.js +30 -4
- package/dist/src/run-usage.js.map +1 -1
- package/dist/src/run-usage.test.js +99 -11
- package/dist/src/run-usage.test.js.map +1 -1
- package/package.json +2 -2
- package/dist/src/single-chat-no-reply-fallback.d.ts +0 -14
- package/dist/src/single-chat-no-reply-fallback.d.ts.map +0 -1
- package/dist/src/single-chat-no-reply-fallback.js +0 -20
- package/dist/src/single-chat-no-reply-fallback.js.map +0 -1
- package/dist/src/subagent-progress-hooks.d.ts +0 -11
- package/dist/src/subagent-progress-hooks.d.ts.map +0 -1
- package/dist/src/subagent-progress-hooks.js +0 -41
- package/dist/src/subagent-progress-hooks.js.map +0 -1
package/dist/src/run-usage.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* (agent-runner 在回合结束时写入 modelProvider / model / inputTokens / outputTokens 等)。
|
|
7
7
|
* 不解析 deliver 正文 usage footer / usage bar。
|
|
8
8
|
*/
|
|
9
|
+
import type { RunModelContext } from "./run-model-context.js";
|
|
9
10
|
/** session store 中与用量相关的字段(子集) */
|
|
10
11
|
export type SessionUsageFields = {
|
|
11
12
|
modelProvider?: string;
|
|
@@ -13,6 +14,12 @@ export type SessionUsageFields = {
|
|
|
13
14
|
inputTokens?: number;
|
|
14
15
|
outputTokens?: number;
|
|
15
16
|
totalTokens?: number;
|
|
17
|
+
/** totalTokens 是否为最新上下文快照;false 表示已过期,前端以「~」近似展示 */
|
|
18
|
+
totalTokensFresh?: boolean;
|
|
19
|
+
/** 模型上下文窗口上限(圆环分母兜底) */
|
|
20
|
+
contextTokens?: number;
|
|
21
|
+
/** 提示词预算(contextBudgetStatus.promptBudgetBeforeReserve,圆环优先分母) */
|
|
22
|
+
promptBudgetBeforeReserve?: number;
|
|
16
23
|
cacheRead?: number;
|
|
17
24
|
cacheWrite?: number;
|
|
18
25
|
estimatedCostUsd?: number;
|
|
@@ -24,6 +31,9 @@ export type RunUsageSnapshot = {
|
|
|
24
31
|
inputTokens?: number;
|
|
25
32
|
outputTokens?: number;
|
|
26
33
|
totalTokens?: number;
|
|
34
|
+
totalTokensFresh?: boolean;
|
|
35
|
+
contextTokens?: number;
|
|
36
|
+
promptBudgetBeforeReserve?: number;
|
|
27
37
|
cacheReadTokens?: number;
|
|
28
38
|
cacheWriteTokens?: number;
|
|
29
39
|
estimatedCostUsd?: number;
|
|
@@ -36,6 +46,11 @@ export type ImStreamRunUsageData = {
|
|
|
36
46
|
replyToMsgId: string;
|
|
37
47
|
usage: RunUsageSnapshot;
|
|
38
48
|
};
|
|
49
|
+
/**
|
|
50
|
+
* entry 优先、`llm_output` 缓存兜底:entry 缺 model / contextTokens 时(preserveRuntimeModel
|
|
51
|
+
* 场景)用缓存的有效上下文预算与生效模型补全,保证前端用量圆环有分母。
|
|
52
|
+
*/
|
|
53
|
+
export declare function mergeRunModelContextFields(fields: SessionUsageFields, modelContext: RunModelContext): SessionUsageFields;
|
|
39
54
|
/** 本轮是否值得发 RUN_USAGE(至少有模型或 token 之一)。 */
|
|
40
55
|
export declare function hasReportableUsage(usage: RunUsageSnapshot | undefined): boolean;
|
|
41
56
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-usage.d.ts","sourceRoot":"","sources":["../../src/run-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,kCAAkC;AAClC,MAAM,MAAM,kBAAkB,GAAG;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,MAAM,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAaF,0CAA0C;AAC1C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,GAAG,OAAO,CAa/E;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CACzC,KAAK,EAAE,kBAAkB,GAAG,SAAS,GAAG,IAAI,EAC5C,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1B,gBAAgB,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"run-usage.d.ts","sourceRoot":"","sources":["../../src/run-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,kCAAkC;AAClC,MAAM,MAAM,kBAAkB,GAAG;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,wBAAwB;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,MAAM,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAaF;;;GAGG;AACH,wBAAgB,0BAA0B,CACtC,MAAM,EAAE,kBAAkB,EAC1B,YAAY,EAAE,eAAe,GAC9B,kBAAkB,CAWpB;AAED,0CAA0C;AAC1C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,GAAG,OAAO,CAa/E;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CACzC,KAAK,EAAE,kBAAkB,GAAG,SAAS,GAAG,IAAI,EAC5C,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1B,gBAAgB,GAAG,SAAS,CA0C9B;AAuBD,wBAAgB,sBAAsB,CAClC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACnD,oBAAoB,CAMtB"}
|
package/dist/src/run-usage.js
CHANGED
|
@@ -17,6 +17,22 @@ function nonEmpty(s) {
|
|
|
17
17
|
const t = s.trim();
|
|
18
18
|
return t.length > 0 ? t : undefined;
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* entry 优先、`llm_output` 缓存兜底:entry 缺 model / contextTokens 时(preserveRuntimeModel
|
|
22
|
+
* 场景)用缓存的有效上下文预算与生效模型补全,保证前端用量圆环有分母。
|
|
23
|
+
*/
|
|
24
|
+
export function mergeRunModelContextFields(fields, modelContext) {
|
|
25
|
+
return {
|
|
26
|
+
...fields,
|
|
27
|
+
...(fields.modelProvider == null && modelContext.provider
|
|
28
|
+
? { modelProvider: modelContext.provider }
|
|
29
|
+
: {}),
|
|
30
|
+
...(fields.model == null && modelContext.model ? { model: modelContext.model } : {}),
|
|
31
|
+
...(fields.contextTokens == null && modelContext.contextTokenBudget != null
|
|
32
|
+
? { contextTokens: modelContext.contextTokenBudget }
|
|
33
|
+
: {}),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
20
36
|
/** 本轮是否值得发 RUN_USAGE(至少有模型或 token 之一)。 */
|
|
21
37
|
export function hasReportableUsage(usage) {
|
|
22
38
|
if (!usage)
|
|
@@ -49,10 +65,12 @@ export function buildRunUsageFromSessionEntry(entry, opts) {
|
|
|
49
65
|
const estimatedCostUsd = typeof entry.estimatedCostUsd === "number" && Number.isFinite(entry.estimatedCostUsd)
|
|
50
66
|
? entry.estimatedCostUsd
|
|
51
67
|
: undefined;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
68
|
+
// totalTokens 为 OpenClaw 上下文 prompt 快照,用于「当前会话用量圆环」的分子。
|
|
69
|
+
// 缺 entry 值时**不做** input+output 兜底,避免把计费合计误当上下文占用。
|
|
70
|
+
const totalTokens = positiveInt(entry.totalTokens);
|
|
71
|
+
const totalTokensFresh = typeof entry.totalTokensFresh === "boolean" ? entry.totalTokensFresh : undefined;
|
|
72
|
+
const contextTokens = positiveInt(entry.contextTokens);
|
|
73
|
+
const promptBudgetBeforeReserve = positiveInt(entry.promptBudgetBeforeReserve);
|
|
56
74
|
const snapshot = {
|
|
57
75
|
...(provider ? { provider } : {}),
|
|
58
76
|
...(model ? { model } : {}),
|
|
@@ -60,6 +78,9 @@ export function buildRunUsageFromSessionEntry(entry, opts) {
|
|
|
60
78
|
...(inputTokens != null ? { inputTokens } : {}),
|
|
61
79
|
...(outputTokens != null ? { outputTokens } : {}),
|
|
62
80
|
...(totalTokens != null ? { totalTokens } : {}),
|
|
81
|
+
...(totalTokensFresh != null ? { totalTokensFresh } : {}),
|
|
82
|
+
...(contextTokens != null ? { contextTokens } : {}),
|
|
83
|
+
...(promptBudgetBeforeReserve != null ? { promptBudgetBeforeReserve } : {}),
|
|
63
84
|
...(cacheReadTokens != null ? { cacheReadTokens } : {}),
|
|
64
85
|
...(cacheWriteTokens != null ? { cacheWriteTokens } : {}),
|
|
65
86
|
...(estimatedCostUsd != null ? { estimatedCostUsd } : {}),
|
|
@@ -77,6 +98,11 @@ function runUsageSnapshotToWire(usage) {
|
|
|
77
98
|
...(usage.inputTokens != null ? { inputTokens: usage.inputTokens } : {}),
|
|
78
99
|
...(usage.outputTokens != null ? { outputTokens: usage.outputTokens } : {}),
|
|
79
100
|
...(usage.totalTokens != null ? { totalTokens: usage.totalTokens } : {}),
|
|
101
|
+
...(usage.totalTokensFresh != null ? { totalTokensFresh: usage.totalTokensFresh } : {}),
|
|
102
|
+
...(usage.contextTokens != null ? { contextTokens: usage.contextTokens } : {}),
|
|
103
|
+
...(usage.promptBudgetBeforeReserve != null
|
|
104
|
+
? { promptBudgetBeforeReserve: usage.promptBudgetBeforeReserve }
|
|
105
|
+
: {}),
|
|
80
106
|
...(usage.cacheReadTokens != null ? { cacheReadTokens: usage.cacheReadTokens } : {}),
|
|
81
107
|
...(usage.cacheWriteTokens != null ? { cacheWriteTokens: usage.cacheWriteTokens } : {}),
|
|
82
108
|
...(usage.estimatedCostUsd != null ? { estimatedCostUsd: usage.estimatedCostUsd } : {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-usage.js","sourceRoot":"","sources":["../../src/run-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"run-usage.js","sourceRoot":"","sources":["../../src/run-usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import { describe, it } from "node:test";
|
|
3
|
-
import { buildRunUsageFromSessionEntry, hasReportableUsage, toImStreamRunUsageData, } from "./run-usage.js";
|
|
3
|
+
import { buildRunUsageFromSessionEntry, hasReportableUsage, mergeRunModelContextFields, toImStreamRunUsageData, } from "./run-usage.js";
|
|
4
4
|
describe("buildRunUsageFromSessionEntry", () => {
|
|
5
5
|
it("maps session store fields to RUN_USAGE snapshot", () => {
|
|
6
6
|
const u = buildRunUsageFromSessionEntry({
|
|
@@ -19,12 +19,29 @@ describe("buildRunUsageFromSessionEntry", () => {
|
|
|
19
19
|
assert.equal(u.modelRef, "openai/gpt-5.5");
|
|
20
20
|
assert.equal(u.inputTokens, 1_200);
|
|
21
21
|
assert.equal(u.outputTokens, 89);
|
|
22
|
-
assert.equal(u.totalTokens,
|
|
22
|
+
assert.equal(u.totalTokens, undefined);
|
|
23
23
|
assert.equal(u.cacheReadTokens, 10_000);
|
|
24
24
|
assert.equal(u.cacheWriteTokens, 0);
|
|
25
25
|
assert.equal(u.estimatedCostUsd, 0.0123);
|
|
26
26
|
assert.equal(u.runId, "run-1");
|
|
27
27
|
});
|
|
28
|
+
it("maps context ring fields (contextTokens / promptBudget / freshness)", () => {
|
|
29
|
+
const u = buildRunUsageFromSessionEntry({
|
|
30
|
+
modelProvider: "openai",
|
|
31
|
+
model: "gpt-5.5",
|
|
32
|
+
inputTokens: 100,
|
|
33
|
+
outputTokens: 20,
|
|
34
|
+
totalTokens: 26_002,
|
|
35
|
+
totalTokensFresh: false,
|
|
36
|
+
contextTokens: 200_000,
|
|
37
|
+
promptBudgetBeforeReserve: 180_000,
|
|
38
|
+
});
|
|
39
|
+
assert.ok(u);
|
|
40
|
+
assert.equal(u.totalTokens, 26_002);
|
|
41
|
+
assert.equal(u.totalTokensFresh, false);
|
|
42
|
+
assert.equal(u.contextTokens, 200_000);
|
|
43
|
+
assert.equal(u.promptBudgetBeforeReserve, 180_000);
|
|
44
|
+
});
|
|
28
45
|
it("prefers explicit totalTokens from session", () => {
|
|
29
46
|
const u = buildRunUsageFromSessionEntry({
|
|
30
47
|
modelProvider: "xgjk-newapi",
|
|
@@ -36,6 +53,15 @@ describe("buildRunUsageFromSessionEntry", () => {
|
|
|
36
53
|
assert.ok(u);
|
|
37
54
|
assert.equal(u.totalTokens, 26_002);
|
|
38
55
|
});
|
|
56
|
+
it("does not fall back to input+output for totalTokens (context snapshot only)", () => {
|
|
57
|
+
const u = buildRunUsageFromSessionEntry({
|
|
58
|
+
inputTokens: 10,
|
|
59
|
+
outputTokens: 2,
|
|
60
|
+
});
|
|
61
|
+
assert.ok(u);
|
|
62
|
+
assert.equal(u.totalTokens, undefined);
|
|
63
|
+
assert.equal(u.modelRef, undefined);
|
|
64
|
+
});
|
|
39
65
|
it("accepts model-only entry", () => {
|
|
40
66
|
const u = buildRunUsageFromSessionEntry({
|
|
41
67
|
modelProvider: "openai",
|
|
@@ -46,15 +72,6 @@ describe("buildRunUsageFromSessionEntry", () => {
|
|
|
46
72
|
assert.equal(u.inputTokens, undefined);
|
|
47
73
|
assert.equal(hasReportableUsage(u), true);
|
|
48
74
|
});
|
|
49
|
-
it("accepts tokens-only entry", () => {
|
|
50
|
-
const u = buildRunUsageFromSessionEntry({
|
|
51
|
-
inputTokens: 10,
|
|
52
|
-
outputTokens: 2,
|
|
53
|
-
});
|
|
54
|
-
assert.ok(u);
|
|
55
|
-
assert.equal(u.totalTokens, 12);
|
|
56
|
-
assert.equal(u.modelRef, undefined);
|
|
57
|
-
});
|
|
58
75
|
it("returns undefined for empty entry", () => {
|
|
59
76
|
assert.equal(buildRunUsageFromSessionEntry({}), undefined);
|
|
60
77
|
assert.equal(buildRunUsageFromSessionEntry(null), undefined);
|
|
@@ -86,5 +103,76 @@ describe("toImStreamRunUsageData", () => {
|
|
|
86
103
|
},
|
|
87
104
|
});
|
|
88
105
|
});
|
|
106
|
+
it("passes context ring fields through to the wire payload", () => {
|
|
107
|
+
const data = toImStreamRunUsageData({
|
|
108
|
+
inputTokens: 100,
|
|
109
|
+
outputTokens: 5,
|
|
110
|
+
totalTokens: 26_002,
|
|
111
|
+
totalTokensFresh: true,
|
|
112
|
+
contextTokens: 200_000,
|
|
113
|
+
promptBudgetBeforeReserve: 180_000,
|
|
114
|
+
source: "session",
|
|
115
|
+
}, { groupId: "g1", replyToMsgId: "m1" });
|
|
116
|
+
assert.deepEqual(data.usage, {
|
|
117
|
+
inputTokens: 100,
|
|
118
|
+
outputTokens: 5,
|
|
119
|
+
totalTokens: 26_002,
|
|
120
|
+
totalTokensFresh: true,
|
|
121
|
+
contextTokens: 200_000,
|
|
122
|
+
promptBudgetBeforeReserve: 180_000,
|
|
123
|
+
source: "session",
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe("mergeRunModelContextFields", () => {
|
|
128
|
+
it("fills missing model and contextTokens from the captured llm_output context", () => {
|
|
129
|
+
const merged = mergeRunModelContextFields({ inputTokens: 2_084, outputTokens: 92, totalTokens: 40_052 }, {
|
|
130
|
+
provider: "xgjk-newapi",
|
|
131
|
+
model: "MiniMax-M2.7-Cloud",
|
|
132
|
+
contextTokenBudget: 200_000,
|
|
133
|
+
updatedAt: Date.now(),
|
|
134
|
+
});
|
|
135
|
+
assert.deepEqual(merged, {
|
|
136
|
+
inputTokens: 2_084,
|
|
137
|
+
outputTokens: 92,
|
|
138
|
+
totalTokens: 40_052,
|
|
139
|
+
modelProvider: "xgjk-newapi",
|
|
140
|
+
model: "MiniMax-M2.7-Cloud",
|
|
141
|
+
contextTokens: 200_000,
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
it("keeps entry values when already present", () => {
|
|
145
|
+
const merged = mergeRunModelContextFields({
|
|
146
|
+
modelProvider: "openai",
|
|
147
|
+
model: "gpt-5.5",
|
|
148
|
+
contextTokens: 128_000,
|
|
149
|
+
totalTokens: 1_000,
|
|
150
|
+
}, {
|
|
151
|
+
provider: "other",
|
|
152
|
+
model: "other-model",
|
|
153
|
+
contextTokenBudget: 200_000,
|
|
154
|
+
updatedAt: Date.now(),
|
|
155
|
+
});
|
|
156
|
+
assert.equal(merged.modelProvider, "openai");
|
|
157
|
+
assert.equal(merged.model, "gpt-5.5");
|
|
158
|
+
assert.equal(merged.contextTokens, 128_000);
|
|
159
|
+
});
|
|
160
|
+
it("does not fabricate fields when the captured context is empty", () => {
|
|
161
|
+
const merged = mergeRunModelContextFields({ inputTokens: 1, outputTokens: 1 }, { updatedAt: Date.now() });
|
|
162
|
+
assert.deepEqual(merged, { inputTokens: 1, outputTokens: 1 });
|
|
163
|
+
});
|
|
164
|
+
it("merged fields produce a reportable snapshot with modelRef", () => {
|
|
165
|
+
const merged = mergeRunModelContextFields({ totalTokens: 40_052 }, {
|
|
166
|
+
provider: "xgjk-newapi",
|
|
167
|
+
model: "MiniMax-M2.7-Cloud",
|
|
168
|
+
contextTokenBudget: 200_000,
|
|
169
|
+
updatedAt: Date.now(),
|
|
170
|
+
});
|
|
171
|
+
const usage = buildRunUsageFromSessionEntry(merged);
|
|
172
|
+
assert.ok(usage);
|
|
173
|
+
assert.equal(usage.modelRef, "xgjk-newapi/MiniMax-M2.7-Cloud");
|
|
174
|
+
assert.equal(usage.contextTokens, 200_000);
|
|
175
|
+
assert.equal(usage.totalTokens, 40_052);
|
|
176
|
+
});
|
|
89
177
|
});
|
|
90
178
|
//# sourceMappingURL=run-usage.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-usage.test.js","sourceRoot":"","sources":["../../src/run-usage.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACH,6BAA6B,EAC7B,kBAAkB,EAClB,sBAAsB,GACzB,MAAM,gBAAgB,CAAC;AAExB,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,6BAA6B,CACnC;YACI,aAAa,EAAE,QAAQ;YACvB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,KAAK;YAClB,YAAY,EAAE,EAAE;YAChB,SAAS,EAAE,MAAM;YACjB,UAAU,EAAE,CAAC;YACb,gBAAgB,EAAE,MAAM;SAC3B,EACD,EAAE,KAAK,EAAE,OAAO,EAAE,CACrB,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,CAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,CAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,CAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,CAAE,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,CAAE,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAE,CAAC,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"run-usage.test.js","sourceRoot":"","sources":["../../src/run-usage.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xgjktech/xg_cwork_im",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.19",
|
|
4
4
|
"description": "XG CWork IM channel plugin for OpenClaw",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bot",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"build": "tsc -p tsconfig.json",
|
|
26
26
|
"type-check": "tsc -p tsconfig.json --noEmit",
|
|
27
27
|
"lint": "tsc -p tsconfig.json --noEmit",
|
|
28
|
-
"test": "npm run build && node --test dist/src/action-store-lifecycle.test.js dist/src/account-reconciler.test.js dist/src/inbound-terminal-state.test.js dist/src/user-facing-errors.test.js dist/src/deliver-text.test.js dist/src/assistant-item-delivery.test.js dist/src/agent-context-types.test.js dist/src/build-project-prompt.test.js dist/src/nas-volumes.test.js dist/src/workspace-event.test.js dist/src/workspace-event-scheduler.test.js dist/src/connection-workspace-event.test.js dist/src/block-streaming-config.test.js dist/src/channel-disabled-account.test.js dist/src/per-message-fallback-notice.test.js dist/src/register-per-message-model-hook.test.js dist/src/thinking-ws-progress.test.js dist/src/resource-file.test.js dist/src/turn-deliver-buffer.test.js dist/src/run-usage.test.js dist/src/ws-run-event-unmapped.test.js dist/src/item-event-guard.test.js dist/src/inbound-model.test.js dist/src/auto-model-router.test.js dist/src/channel-config.test.js dist/src/send-service.test.js dist/src/send-file-tool.test.js dist/src/tool-event-adapter.test.js dist/src/plan-core-adapter.test.js dist/src/plan-core-db.test.js dist/src/plan-core-snapshot.test.js dist/src/plan-tool-middleware.test.js dist/src/plan-ws-registry.test.js dist/src/plan-stat-event.test.js dist/src/active-round-registry.test.js dist/src/interrupt-round.test.js dist/src/subagent-monitor.test.js dist/src/turn-end-controller.test.js dist/src/turn-agent-event-subscription.test.js dist/src/session-env-store.test.js dist/src/register-exec-env-hook.test.js dist/src/cron-appkey-binding-store.test.js dist/src/ws-inbound-schema.test.js dist/src/connection.test.js dist/src/reply-dispatch-driver.test.js",
|
|
28
|
+
"test": "npm run build && node --test dist/src/action-store-lifecycle.test.js dist/src/account-reconciler.test.js dist/src/inbound-terminal-state.test.js dist/src/user-facing-errors.test.js dist/src/deliver-text.test.js dist/src/assistant-item-delivery.test.js dist/src/agent-context-types.test.js dist/src/build-project-prompt.test.js dist/src/nas-volumes.test.js dist/src/workspace-event.test.js dist/src/workspace-event-scheduler.test.js dist/src/connection-workspace-event.test.js dist/src/block-streaming-config.test.js dist/src/channel-disabled-account.test.js dist/src/per-message-fallback-notice.test.js dist/src/register-per-message-model-hook.test.js dist/src/thinking-ws-progress.test.js dist/src/resource-file.test.js dist/src/turn-deliver-buffer.test.js dist/src/run-usage.test.js dist/src/run-model-context.test.js dist/src/ws-run-event-unmapped.test.js dist/src/item-event-guard.test.js dist/src/inbound-model.test.js dist/src/auto-model-router.test.js dist/src/channel-config.test.js dist/src/send-service.test.js dist/src/send-file-tool.test.js dist/src/tool-event-adapter.test.js dist/src/plan-core-adapter.test.js dist/src/plan-core-db.test.js dist/src/plan-core-snapshot.test.js dist/src/plan-tool-middleware.test.js dist/src/plan-ws-registry.test.js dist/src/plan-stat-event.test.js dist/src/active-round-registry.test.js dist/src/interrupt-round.test.js dist/src/subagent-monitor.test.js dist/src/turn-end-controller.test.js dist/src/turn-agent-event-subscription.test.js dist/src/session-env-store.test.js dist/src/register-exec-env-hook.test.js dist/src/cron-appkey-binding-store.test.js dist/src/ws-inbound-schema.test.js dist/src/connection.test.js dist/src/reply-dispatch-driver.test.js",
|
|
29
29
|
"install:prod": "npm install --omit=dev",
|
|
30
30
|
"prepublishOnly": "npm run build"
|
|
31
31
|
},
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 单聊轮次结束但未向 IM 发出正文时的兜底话术(如模型输出 NO_REPLY、deliver 未被调用)。
|
|
3
|
-
*/
|
|
4
|
-
import type { WsMessageParams } from "./types.js";
|
|
5
|
-
export declare function shouldSendSingleChatNoReplyFallback(args: {
|
|
6
|
-
params: WsMessageParams;
|
|
7
|
-
hasFirstReply: boolean;
|
|
8
|
-
deliverCallCount: number;
|
|
9
|
-
dispatchError?: unknown;
|
|
10
|
-
lastDeliverError?: unknown;
|
|
11
|
-
}): boolean;
|
|
12
|
-
/** 单聊静默轮次兜底:简短告知并引导重试。 */
|
|
13
|
-
export declare function buildSingleChatNoReplyFallbackText(): string;
|
|
14
|
-
//# sourceMappingURL=single-chat-no-reply-fallback.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"single-chat-no-reply-fallback.d.ts","sourceRoot":"","sources":["../../src/single-chat-no-reply-fallback.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,wBAAgB,mCAAmC,CAAC,IAAI,EAAE;IACtD,MAAM,EAAE,eAAe,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,OAAO,CAMV;AAED,0BAA0B;AAC1B,wBAAgB,kCAAkC,IAAI,MAAM,CAE3D"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 单聊轮次结束但未向 IM 发出正文时的兜底话术(如模型输出 NO_REPLY、deliver 未被调用)。
|
|
3
|
-
*/
|
|
4
|
-
import { isImSingleChat } from "./inbound-chat-type.js";
|
|
5
|
-
export function shouldSendSingleChatNoReplyFallback(args) {
|
|
6
|
-
if (args.hasFirstReply)
|
|
7
|
-
return false;
|
|
8
|
-
if (args.dispatchError !== undefined || args.lastDeliverError !== undefined)
|
|
9
|
-
return false;
|
|
10
|
-
if (!isImSingleChat(args.params))
|
|
11
|
-
return false;
|
|
12
|
-
if (args.deliverCallCount > 0)
|
|
13
|
-
return false;
|
|
14
|
-
return true;
|
|
15
|
-
}
|
|
16
|
-
/** 单聊静默轮次兜底:简短告知并引导重试。 */
|
|
17
|
-
export function buildSingleChatNoReplyFallbackText() {
|
|
18
|
-
return "消息已收到,但这一轮没有生成回复。请换个说法或把需求说具体一些后再试。";
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=single-chat-no-reply-fallback.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"single-chat-no-reply-fallback.js","sourceRoot":"","sources":["../../src/single-chat-no-reply-fallback.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,MAAM,UAAU,mCAAmC,CAAC,IAMnD;IACG,IAAI,IAAI,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC1F,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,IAAI,CAAC,gBAAgB,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,kCAAkC;IAC9C,OAAO,qCAAqC,CAAC;AACjD,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
|
|
2
|
-
import type { ImStreamClient } from "./connection.js";
|
|
3
|
-
interface SubagentWsTarget {
|
|
4
|
-
streamClient: ImStreamClient;
|
|
5
|
-
groupId: string;
|
|
6
|
-
replyToMsgId: string;
|
|
7
|
-
}
|
|
8
|
-
export declare function registerSubagentProgressHooks(api: OpenClawPluginApi): void;
|
|
9
|
-
export declare function setSubagentWsTarget(childSessionKey: string, target: SubagentWsTarget): void;
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=subagent-progress-hooks.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-progress-hooks.d.ts","sourceRoot":"","sources":["../../src/subagent-progress-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,UAAU,gBAAgB;IACtB,YAAY,EAAE,cAAc,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACxB;AAYD,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAqC1E;AAED,wBAAgB,mBAAmB,CAC/B,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,gBAAgB,GACzB,IAAI,CAEN"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
const subagentWsTargets = new Map();
|
|
2
|
-
export function registerSubagentProgressHooks(api) {
|
|
3
|
-
// subagent_progress is not in the installed SDK's PluginHookName type union,
|
|
4
|
-
// but the runtime supports it. Cast to bypass the type check.
|
|
5
|
-
api.on("subagent_progress", async (event) => {
|
|
6
|
-
const childSessionKey = event.childSessionKey;
|
|
7
|
-
if (!childSessionKey)
|
|
8
|
-
return;
|
|
9
|
-
const target = subagentWsTargets.get(childSessionKey);
|
|
10
|
-
if (!target)
|
|
11
|
-
return;
|
|
12
|
-
let displayText;
|
|
13
|
-
if (event.phase === "started") {
|
|
14
|
-
displayText = "子任务已启动";
|
|
15
|
-
}
|
|
16
|
-
else if (event.phase === "ended") {
|
|
17
|
-
displayText = event.outcome === "ok" ? "子任务已完成" : `子任务异常: ${event.outcome ?? "unknown"}`;
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
displayText = "子任务状态更新";
|
|
21
|
-
}
|
|
22
|
-
try {
|
|
23
|
-
await target.streamClient.streamProgress({
|
|
24
|
-
groupId: target.groupId,
|
|
25
|
-
replyToMsgId: target.replyToMsgId,
|
|
26
|
-
event: "RUN_EVENT",
|
|
27
|
-
displayText,
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
// WS best-effort: don't propagate errors from progress events
|
|
32
|
-
}
|
|
33
|
-
if (event.phase === "ended") {
|
|
34
|
-
subagentWsTargets.delete(childSessionKey);
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
export function setSubagentWsTarget(childSessionKey, target) {
|
|
39
|
-
subagentWsTargets.set(childSessionKey, target);
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=subagent-progress-hooks.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-progress-hooks.js","sourceRoot":"","sources":["../../src/subagent-progress-hooks.ts"],"names":[],"mappings":"AAiBA,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA4B,CAAC;AAE9D,MAAM,UAAU,6BAA6B,CAAC,GAAsB;IAChE,6EAA6E;IAC7E,8DAA8D;IAC7D,GAAG,CAAC,EAA8F,CAC/F,mBAAmB,EACnB,KAAK,EAAE,KAA4B,EAAE,EAAE;QACnC,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,eAAe;YAAE,OAAO;QAE7B,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,IAAI,WAAmB,CAAC;QACxB,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC5B,WAAW,GAAG,QAAQ,CAAC;QAC3B,CAAC;aAAM,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YACjC,WAAW,GAAG,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC;QAC7F,CAAC;aAAM,CAAC;YACJ,WAAW,GAAG,SAAS,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC;YACD,MAAM,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC;gBACrC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,KAAK,EAAE,WAAW;gBAClB,WAAW;aACd,CAAC,CAAC;QACP,CAAC;QAAC,MAAM,CAAC;YACL,8DAA8D;QAClE,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC1B,iBAAiB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC;AAED,MAAM,UAAU,mBAAmB,CAC/B,eAAuB,EACvB,MAAwB;IAExB,iBAAiB,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AACnD,CAAC"}
|