@xgjktech/xg_cwork_im 1.12.9 → 1.13.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 (45) hide show
  1. package/README.md +15 -4
  2. package/dist/src/apply-sync-mapping.js +14 -6
  3. package/dist/src/apply-sync-mapping.js.map +1 -1
  4. package/dist/src/channel.d.ts.map +1 -1
  5. package/dist/src/channel.js +2 -1
  6. package/dist/src/channel.js.map +1 -1
  7. package/dist/src/dispatch-mentioned-reply.d.ts +3 -0
  8. package/dist/src/dispatch-mentioned-reply.d.ts.map +1 -1
  9. package/dist/src/dispatch-mentioned-reply.js +67 -63
  10. package/dist/src/dispatch-mentioned-reply.js.map +1 -1
  11. package/dist/src/gateway-session-queue.d.ts +3 -0
  12. package/dist/src/gateway-session-queue.d.ts.map +1 -1
  13. package/dist/src/gateway-session-queue.js +1 -0
  14. package/dist/src/gateway-session-queue.js.map +1 -1
  15. package/dist/src/inbound-chat-type.d.ts +4 -0
  16. package/dist/src/inbound-chat-type.d.ts.map +1 -1
  17. package/dist/src/inbound-chat-type.js +8 -0
  18. package/dist/src/inbound-chat-type.js.map +1 -1
  19. package/dist/src/inbound-terminal-delivery.d.ts +68 -0
  20. package/dist/src/inbound-terminal-delivery.d.ts.map +1 -0
  21. package/dist/src/inbound-terminal-delivery.js +191 -0
  22. package/dist/src/inbound-terminal-delivery.js.map +1 -0
  23. package/dist/src/inbound-terminal-state.d.ts +46 -0
  24. package/dist/src/inbound-terminal-state.d.ts.map +1 -0
  25. package/dist/src/inbound-terminal-state.js +120 -0
  26. package/dist/src/inbound-terminal-state.js.map +1 -0
  27. package/dist/src/inbound-terminal-state.test.d.ts +2 -0
  28. package/dist/src/inbound-terminal-state.test.d.ts.map +1 -0
  29. package/dist/src/inbound-terminal-state.test.js +151 -0
  30. package/dist/src/inbound-terminal-state.test.js.map +1 -0
  31. package/dist/src/project-path-normalize.d.ts +14 -0
  32. package/dist/src/project-path-normalize.d.ts.map +1 -1
  33. package/dist/src/project-path-normalize.js +26 -0
  34. package/dist/src/project-path-normalize.js.map +1 -1
  35. package/dist/src/send-group-message-tool.d.ts.map +1 -1
  36. package/dist/src/send-group-message-tool.js +4 -2
  37. package/dist/src/send-group-message-tool.js.map +1 -1
  38. package/dist/src/sync-mapping-types.d.ts +58 -8
  39. package/dist/src/sync-mapping-types.d.ts.map +1 -1
  40. package/dist/src/sync-mapping-types.js +19 -5
  41. package/dist/src/sync-mapping-types.js.map +1 -1
  42. package/dist/src/sync-service-client.d.ts +3 -1
  43. package/dist/src/sync-service-client.d.ts.map +1 -1
  44. package/dist/src/sync-service-client.js.map +1 -1
  45. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"inbound-chat-type.js","sourceRoot":"","sources":["../../src/inbound-chat-type.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAMjF,MAAM,UAAU,eAAe,CAAC,GAAY;IACxC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QACpD,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAuB;IAClD,OAAO,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC;AACzD,CAAC;AAKD,MAAM,UAAU,uBAAuB,CAAC,MAAuB;IAC3D,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAAuB,EAAE,iBAA0B;IAC3F,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACtC,GAAc,EACd,MAAuB,EACvB,GAAqC,EACrC,gBAAwB;IAExB,IAAI,cAAc,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAuB;IAC3D,IAAI,cAAc,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"inbound-chat-type.js","sourceRoot":"","sources":["../../src/inbound-chat-type.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AASjF,MAAM,UAAU,eAAe,CAAC,GAAY;IACxC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QACpD,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAuB;IAClD,OAAO,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC;AACzD,CAAC;AAKD,MAAM,UAAU,uBAAuB,CAAC,MAAuB;IAC3D,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAAuB,EAAE,iBAA0B;IAC3F,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACtC,GAAc,EACd,MAAuB,EACvB,GAAqC,EACrC,gBAAwB;IAExB,IAAI,cAAc,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAuB;IAC3D,IAAI,cAAc,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACjD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,yCAAyC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * 入站 IM 消息终态投递:幂等、结构化日志、HTTP 兜底发送。
3
+ */
4
+ import type { Logger } from "./channel-log.js";
5
+ import { type InboundTrigger, type TerminalState } from "./inbound-terminal-state.js";
6
+ import type { SendMessageReply } from "./types.js";
7
+ export type TerminalSendFn = (text: string) => Promise<void>;
8
+ export declare class InboundTerminalController {
9
+ private readonly messageId;
10
+ private readonly groupId;
11
+ private readonly sessionKey;
12
+ private readonly trigger;
13
+ private readonly log;
14
+ private readonly logPrefix;
15
+ private runId;
16
+ private hasBusinessReply;
17
+ private timeoutFired;
18
+ private compactionShown;
19
+ private compactionIncomplete;
20
+ private runtimeErrorHint;
21
+ private noReplySignaled;
22
+ private localTerminalSent;
23
+ private lastResolvedState;
24
+ constructor(args: {
25
+ messageId: string;
26
+ groupId: string;
27
+ sessionKey: string;
28
+ trigger?: InboundTrigger;
29
+ log: Logger;
30
+ logPrefix: string;
31
+ });
32
+ setRunId(runId: string): void;
33
+ markBusinessReplySent(): void;
34
+ markTimeoutFired(): void;
35
+ markNoReplySignaled(): void;
36
+ noteCompactionNotice(text: string): void;
37
+ noteCompactionWsEvent(phase: "start" | "end"): void;
38
+ noteRuntimeErrorFromPayload(text: string): void;
39
+ noteRuntimeError(err: unknown): void;
40
+ /**
41
+ * 尝试发送终态 HTTP 兜底。返回是否已向 IM 发送(含此前已发送的幂等命中)。
42
+ */
43
+ trySendTerminal(state: TerminalState, sendFn: TerminalSendFn, extra?: {
44
+ errorMessage?: string;
45
+ }): Promise<boolean>;
46
+ finalizeAndDeliver(args: {
47
+ sendFn: TerminalSendFn;
48
+ dispatchThrew: boolean;
49
+ dispatchError?: unknown;
50
+ lastDeliverError?: unknown;
51
+ beforeAgentRunBlocked?: boolean;
52
+ deliverInvokeCount: number;
53
+ deliverCallCount: number;
54
+ }): Promise<TerminalState>;
55
+ getLastResolvedState(): TerminalState | undefined;
56
+ getRunId(): string | undefined;
57
+ didTimeoutFire(): boolean;
58
+ wasTerminalDelivered(): boolean;
59
+ private logTerminal;
60
+ }
61
+ export declare function buildTerminalSendFn(args: {
62
+ sendText: (text: string, replyMeta?: SendMessageReply) => Promise<void>;
63
+ replyMeta?: SendMessageReply;
64
+ isSingleChat: boolean;
65
+ }): TerminalSendFn;
66
+ /** cron / 工具主动推送前缀,避免与用户消息回复混淆。 */
67
+ export declare function prefixProactiveOutboundText(text: string, trigger?: "cron" | "tool"): string;
68
+ //# sourceMappingURL=inbound-terminal-delivery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-terminal-delivery.d.ts","sourceRoot":"","sources":["../../src/inbound-terminal-delivery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * 入站 IM 消息终态投递:幂等、结构化日志、HTTP 兜底发送。
3
+ */
4
+ import { buildTerminalUserMessage, classifyRuntimeErrorMessage, formatTerminalLogLine, hasGlobalTerminalSent, markGlobalTerminalSent, resolveTerminalState, } from "./inbound-terminal-state.js";
5
+ export class InboundTerminalController {
6
+ messageId;
7
+ groupId;
8
+ sessionKey;
9
+ trigger;
10
+ log;
11
+ logPrefix;
12
+ runId;
13
+ hasBusinessReply = false;
14
+ timeoutFired = false;
15
+ compactionShown = false;
16
+ compactionIncomplete = false;
17
+ runtimeErrorHint;
18
+ noReplySignaled = false;
19
+ localTerminalSent = false;
20
+ lastResolvedState;
21
+ constructor(args) {
22
+ this.messageId = args.messageId.trim();
23
+ this.groupId = args.groupId.trim();
24
+ this.sessionKey = args.sessionKey;
25
+ this.trigger = args.trigger ?? "user";
26
+ this.log = args.log;
27
+ this.logPrefix = args.logPrefix;
28
+ }
29
+ setRunId(runId) {
30
+ const id = runId.trim();
31
+ if (id)
32
+ this.runId = id;
33
+ }
34
+ markBusinessReplySent() {
35
+ this.hasBusinessReply = true;
36
+ }
37
+ markTimeoutFired() {
38
+ this.timeoutFired = true;
39
+ }
40
+ markNoReplySignaled() {
41
+ this.noReplySignaled = true;
42
+ }
43
+ noteCompactionNotice(text) {
44
+ this.compactionShown = true;
45
+ const lower = text.toLowerCase();
46
+ if (lower.includes("incomplete") || lower.includes("失败") || lower.includes("failed")) {
47
+ this.compactionIncomplete = true;
48
+ }
49
+ }
50
+ noteCompactionWsEvent(phase) {
51
+ this.compactionShown = true;
52
+ if (phase === "start") {
53
+ // 仅 start 不标记 incomplete;end 由 notice 或失败路径设置
54
+ }
55
+ }
56
+ noteRuntimeErrorFromPayload(text) {
57
+ const hint = classifyRuntimeErrorMessage(text);
58
+ this.runtimeErrorHint = hint;
59
+ if (text.toLowerCase().includes("compacting") || text.toLowerCase().includes("compaction")) {
60
+ this.compactionShown = true;
61
+ }
62
+ }
63
+ noteRuntimeError(err) {
64
+ this.runtimeErrorHint = classifyRuntimeErrorMessage(err instanceof Error ? err.message : String(err));
65
+ }
66
+ /**
67
+ * 尝试发送终态 HTTP 兜底。返回是否已向 IM 发送(含此前已发送的幂等命中)。
68
+ */
69
+ async trySendTerminal(state, sendFn, extra) {
70
+ if (state === "success") {
71
+ this.logTerminal(state, false, extra?.errorMessage);
72
+ return false;
73
+ }
74
+ if (this.hasBusinessReply && state !== "timeout") {
75
+ // 超时提示可与后续成功回复共存;其它终态不再覆盖已有业务回复
76
+ this.logTerminal(state, false, extra?.errorMessage);
77
+ return false;
78
+ }
79
+ if (this.localTerminalSent || hasGlobalTerminalSent(this.messageId)) {
80
+ this.logTerminal(state, false, extra?.errorMessage);
81
+ return false;
82
+ }
83
+ const text = buildTerminalUserMessage(state);
84
+ if (!text.trim()) {
85
+ this.logTerminal(state, false, extra?.errorMessage);
86
+ return false;
87
+ }
88
+ try {
89
+ await sendFn(text);
90
+ this.localTerminalSent = true;
91
+ markGlobalTerminalSent(this.messageId, state);
92
+ this.lastResolvedState = state;
93
+ this.logTerminal(state, true, extra?.errorMessage);
94
+ if (state === "timeout") {
95
+ this.hasBusinessReply = true;
96
+ }
97
+ return true;
98
+ }
99
+ catch (err) {
100
+ this.log.error(`${this.logPrefix} [terminal] Failed to send terminal notice state=${state}: ${String(err)}`);
101
+ this.logTerminal(state, false, extra?.errorMessage ?? String(err));
102
+ return false;
103
+ }
104
+ }
105
+ async finalizeAndDeliver(args) {
106
+ const input = {
107
+ hasBusinessReply: this.hasBusinessReply,
108
+ timeoutFired: this.timeoutFired,
109
+ dispatchThrew: args.dispatchThrew,
110
+ dispatchError: args.dispatchError,
111
+ lastDeliverError: args.lastDeliverError,
112
+ beforeAgentRunBlocked: args.beforeAgentRunBlocked,
113
+ compactionShown: this.compactionShown,
114
+ compactionIncomplete: this.compactionIncomplete,
115
+ runtimeErrorHint: this.runtimeErrorHint,
116
+ deliverInvokeCount: args.deliverInvokeCount,
117
+ deliverCallCount: args.deliverCallCount,
118
+ noReplySignaled: this.noReplySignaled,
119
+ };
120
+ const state = resolveTerminalState(input);
121
+ this.lastResolvedState = state;
122
+ if (!this.hasBusinessReply || state === "timeout") {
123
+ const errMsg = this.runtimeErrorHint?.errorMessage ??
124
+ (args.dispatchError instanceof Error
125
+ ? args.dispatchError.message
126
+ : args.dispatchError !== undefined
127
+ ? String(args.dispatchError)
128
+ : args.lastDeliverError instanceof Error
129
+ ? args.lastDeliverError.message
130
+ : args.lastDeliverError !== undefined
131
+ ? String(args.lastDeliverError)
132
+ : undefined);
133
+ await this.trySendTerminal(state, args.sendFn, { errorMessage: errMsg });
134
+ }
135
+ else {
136
+ this.logTerminal("success", true);
137
+ }
138
+ return state;
139
+ }
140
+ getLastResolvedState() {
141
+ return this.lastResolvedState;
142
+ }
143
+ getRunId() {
144
+ return this.runId;
145
+ }
146
+ didTimeoutFire() {
147
+ return this.timeoutFired;
148
+ }
149
+ wasTerminalDelivered() {
150
+ return this.localTerminalSent;
151
+ }
152
+ logTerminal(state, sentToIm, errorMessage) {
153
+ const line = formatTerminalLogLine({
154
+ message_id: this.messageId,
155
+ group_id: this.groupId,
156
+ session_key: this.sessionKey,
157
+ run_id: this.runId,
158
+ trigger: this.trigger,
159
+ terminal_state: state,
160
+ sent_to_im: sentToIm,
161
+ error_type: state === "success" ? undefined : state,
162
+ error_message: errorMessage,
163
+ });
164
+ if (state === "success" && sentToIm) {
165
+ this.log.info(`${this.logPrefix} ${line}`);
166
+ }
167
+ else if (sentToIm) {
168
+ this.log.warn(`${this.logPrefix} ${line}`);
169
+ }
170
+ else {
171
+ this.log.info(`${this.logPrefix} ${line}`);
172
+ }
173
+ }
174
+ }
175
+ export function buildTerminalSendFn(args) {
176
+ return async (text) => {
177
+ await args.sendText(text, args.isSingleChat ? undefined : args.replyMeta);
178
+ };
179
+ }
180
+ /** cron / 工具主动推送前缀,避免与用户消息回复混淆。 */
181
+ export function prefixProactiveOutboundText(text, trigger = "cron") {
182
+ const marker = trigger === "cron" ? "[定时任务]" : "[系统通知]";
183
+ const t = text.trim();
184
+ if (!t)
185
+ return marker;
186
+ if (t.startsWith(marker) || t.startsWith("[定时任务]") || t.startsWith("[系统通知]")) {
187
+ return t;
188
+ }
189
+ return `${marker} ${t}`;
190
+ }
191
+ //# sourceMappingURL=inbound-terminal-delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-terminal-delivery.js","sourceRoot":"","sources":["../../src/inbound-terminal-delivery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * IM 入站消息终态:分类、用户可见文案、结构化日志字段。
3
+ */
4
+ export type InboundTrigger = "user" | "cron" | "tool" | "heartbeat" | "system" | "runtime_continue";
5
+ export type TerminalState = "success" | "no_reply" | "timeout" | "runtime_error" | "precheck_error" | "compaction_failed" | "delivery_failed" | "cancelled" | "superseded";
6
+ export type RuntimeErrorHint = {
7
+ errorType: TerminalState;
8
+ errorMessage: string;
9
+ };
10
+ export declare function classifyRuntimeErrorMessage(message: string): RuntimeErrorHint;
11
+ export declare function classifyRuntimeError(err: unknown): RuntimeErrorHint;
12
+ export declare function buildTerminalUserMessage(state: TerminalState): string;
13
+ export type TerminalLogFields = {
14
+ message_id: string;
15
+ group_id: string;
16
+ session_key: string;
17
+ run_id?: string;
18
+ trigger: InboundTrigger;
19
+ terminal_state: TerminalState;
20
+ sent_to_im: boolean;
21
+ error_type?: TerminalState;
22
+ error_message?: string;
23
+ };
24
+ export declare function formatTerminalLogLine(fields: TerminalLogFields): string;
25
+ export type ResolveTerminalStateInput = {
26
+ hasBusinessReply: boolean;
27
+ timeoutFired: boolean;
28
+ dispatchThrew: boolean;
29
+ dispatchError?: unknown;
30
+ lastDeliverError?: unknown;
31
+ beforeAgentRunBlocked?: boolean;
32
+ compactionShown: boolean;
33
+ compactionIncomplete: boolean;
34
+ runtimeErrorHint?: RuntimeErrorHint;
35
+ deliverInvokeCount: number;
36
+ deliverCallCount: number;
37
+ noReplySignaled: boolean;
38
+ };
39
+ /** 在 finally 阶段根据观测信号推断终态(success 由 hasBusinessReply 在外层短路)。 */
40
+ export declare function resolveTerminalState(input: ResolveTerminalStateInput): TerminalState;
41
+ export declare function hasGlobalTerminalSent(messageId: string): boolean;
42
+ export declare function markGlobalTerminalSent(messageId: string, state: TerminalState): void;
43
+ export declare function peekGlobalTerminalSent(messageId: string): TerminalState | undefined;
44
+ /** 测试用:清空进程级幂等表。 */
45
+ export declare function resetGlobalTerminalSentForTests(): void;
46
+ //# sourceMappingURL=inbound-terminal-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-terminal-state.d.ts","sourceRoot":"","sources":["../../src/inbound-terminal-state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,kBAAkB,CAAC;AAEpG,MAAM,MAAM,aAAa,GACnB,SAAS,GACT,UAAU,GACV,SAAS,GACT,eAAe,GACf,gBAAgB,GAChB,mBAAmB,GACnB,iBAAiB,GACjB,WAAW,GACX,YAAY,CAAC;AAEnB,MAAM,MAAM,gBAAgB,GAAG;IAC3B,SAAS,EAAE,aAAa,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACxB,CAAC;AAcF,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAkB7E;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAKnE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAuBrE;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,EAAE,aAAa,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAavE;AAED,MAAM,MAAM,yBAAyB,GAAG;IACpC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,EAAE,OAAO,CAAC;IACzB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,gEAAgE;AAChE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,aAAa,CA0BpF;AAKD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAMpF;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEnF;AAED,oBAAoB;AACpB,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * IM 入站消息终态:分类、用户可见文案、结构化日志字段。
3
+ */
4
+ const PRECHECK_MARKERS = [
5
+ "context overflow",
6
+ "prompt too large",
7
+ "precheck",
8
+ "too large for the model",
9
+ "too large for this model",
10
+ ];
11
+ const TIMEOUT_MARKERS = ["request timed out", "timed out", "idle timeout", "llm idle timeout"];
12
+ const NO_REPLY_MARKERS = ["no_reply", "no reply"];
13
+ export function classifyRuntimeErrorMessage(message) {
14
+ const raw = message.trim();
15
+ const lower = raw.toLowerCase();
16
+ if (PRECHECK_MARKERS.some((m) => lower.includes(m))) {
17
+ return { errorType: "precheck_error", errorMessage: raw };
18
+ }
19
+ if (TIMEOUT_MARKERS.some((m) => lower.includes(m))) {
20
+ return { errorType: "timeout", errorMessage: raw };
21
+ }
22
+ if (NO_REPLY_MARKERS.some((m) => lower.includes(m))) {
23
+ return { errorType: "no_reply", errorMessage: raw };
24
+ }
25
+ if (lower.includes("compaction") && (lower.includes("incomplete") || lower.includes("failed"))) {
26
+ return { errorType: "compaction_failed", errorMessage: raw };
27
+ }
28
+ return { errorType: "runtime_error", errorMessage: raw };
29
+ }
30
+ export function classifyRuntimeError(err) {
31
+ if (err instanceof Error) {
32
+ return classifyRuntimeErrorMessage(err.message);
33
+ }
34
+ return classifyRuntimeErrorMessage(String(err));
35
+ }
36
+ export function buildTerminalUserMessage(state) {
37
+ switch (state) {
38
+ case "precheck_error":
39
+ return ("当前上下文过大,本轮未能启动模型调用。系统已记录,请稍后重试或等待上下文压缩完成。");
40
+ case "compaction_failed":
41
+ return "上下文压缩后仍未生成回复,请精简对话历史或新开话题后再试。";
42
+ case "timeout":
43
+ return "当前请求处理超时,请稍后重试。";
44
+ case "no_reply":
45
+ return "消息已收到,但这一轮没有生成回复。请换个说法或把需求说具体一些后再试。";
46
+ case "runtime_error":
47
+ return "当前请求处理时出现异常,请稍后重试。";
48
+ case "delivery_failed":
49
+ return "回复已生成但发送到 IM 失败,请稍后重试。";
50
+ case "cancelled":
51
+ return "当前请求已取消。";
52
+ case "superseded":
53
+ return "当前请求已被更新的处理覆盖。";
54
+ case "success":
55
+ return "";
56
+ }
57
+ }
58
+ export function formatTerminalLogLine(fields) {
59
+ const parts = [
60
+ `[terminal] message_id=${fields.message_id}`,
61
+ `group_id=${fields.group_id}`,
62
+ `session_key=${fields.session_key}`,
63
+ fields.run_id ? `run_id=${fields.run_id}` : undefined,
64
+ `trigger=${fields.trigger}`,
65
+ `terminal_state=${fields.terminal_state}`,
66
+ `sent_to_im=${fields.sent_to_im}`,
67
+ fields.error_type ? `error_type=${fields.error_type}` : undefined,
68
+ fields.error_message ? `error_message=${JSON.stringify(fields.error_message)}` : undefined,
69
+ ].filter(Boolean);
70
+ return parts.join(" ");
71
+ }
72
+ /** 在 finally 阶段根据观测信号推断终态(success 由 hasBusinessReply 在外层短路)。 */
73
+ export function resolveTerminalState(input) {
74
+ if (input.hasBusinessReply) {
75
+ return "success";
76
+ }
77
+ if (input.timeoutFired) {
78
+ return "timeout";
79
+ }
80
+ if (input.lastDeliverError !== undefined) {
81
+ return "delivery_failed";
82
+ }
83
+ if (input.runtimeErrorHint) {
84
+ return input.runtimeErrorHint.errorType;
85
+ }
86
+ if (input.dispatchError !== undefined) {
87
+ return classifyRuntimeError(input.dispatchError).errorType;
88
+ }
89
+ if (input.beforeAgentRunBlocked) {
90
+ return "precheck_error";
91
+ }
92
+ if (input.compactionIncomplete || (input.compactionShown && input.deliverCallCount === 0)) {
93
+ return "compaction_failed";
94
+ }
95
+ if (input.noReplySignaled || (input.deliverInvokeCount === 0 && !input.dispatchThrew)) {
96
+ return "no_reply";
97
+ }
98
+ return "runtime_error";
99
+ }
100
+ /** 进程级幂等:同一 message_id 终态 HTTP 最多发一次。 */
101
+ const globalTerminalSent = new Map();
102
+ export function hasGlobalTerminalSent(messageId) {
103
+ return globalTerminalSent.has(messageId.trim());
104
+ }
105
+ export function markGlobalTerminalSent(messageId, state) {
106
+ const id = messageId.trim();
107
+ if (!id)
108
+ return;
109
+ if (!globalTerminalSent.has(id)) {
110
+ globalTerminalSent.set(id, state);
111
+ }
112
+ }
113
+ export function peekGlobalTerminalSent(messageId) {
114
+ return globalTerminalSent.get(messageId.trim());
115
+ }
116
+ /** 测试用:清空进程级幂等表。 */
117
+ export function resetGlobalTerminalSentForTests() {
118
+ globalTerminalSent.clear();
119
+ }
120
+ //# sourceMappingURL=inbound-terminal-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-terminal-state.js","sourceRoot":"","sources":["../../src/inbound-terminal-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=inbound-terminal-state.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-terminal-state.test.d.ts","sourceRoot":"","sources":["../../src/inbound-terminal-state.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,151 @@
1
+ import assert from "node:assert/strict";
2
+ import { describe, it, beforeEach } from "node:test";
3
+ import { buildTerminalUserMessage, classifyRuntimeErrorMessage, hasGlobalTerminalSent, markGlobalTerminalSent, resetGlobalTerminalSentForTests, resolveTerminalState, } from "./inbound-terminal-state.js";
4
+ import { InboundTerminalController, prefixProactiveOutboundText } from "./inbound-terminal-delivery.js";
5
+ describe("classifyRuntimeErrorMessage", () => {
6
+ it("detects precheck overflow", () => {
7
+ const hint = classifyRuntimeErrorMessage("Context overflow: prompt too large for the model (precheck)");
8
+ assert.equal(hint.errorType, "precheck_error");
9
+ });
10
+ it("detects timeout", () => {
11
+ const hint = classifyRuntimeErrorMessage("Request timed out.");
12
+ assert.equal(hint.errorType, "timeout");
13
+ });
14
+ it("detects no_reply", () => {
15
+ const hint = classifyRuntimeErrorMessage("NO_REPLY");
16
+ assert.equal(hint.errorType, "no_reply");
17
+ });
18
+ });
19
+ describe("resolveTerminalState", () => {
20
+ it("returns success when business reply sent", () => {
21
+ assert.equal(resolveTerminalState({
22
+ hasBusinessReply: true,
23
+ timeoutFired: false,
24
+ dispatchThrew: false,
25
+ compactionShown: false,
26
+ compactionIncomplete: false,
27
+ deliverInvokeCount: 1,
28
+ deliverCallCount: 1,
29
+ noReplySignaled: false,
30
+ }), "success");
31
+ });
32
+ it("returns precheck_error from runtime hint", () => {
33
+ assert.equal(resolveTerminalState({
34
+ hasBusinessReply: false,
35
+ timeoutFired: false,
36
+ dispatchThrew: false,
37
+ compactionShown: false,
38
+ compactionIncomplete: false,
39
+ deliverInvokeCount: 1,
40
+ deliverCallCount: 0,
41
+ noReplySignaled: false,
42
+ runtimeErrorHint: {
43
+ errorType: "precheck_error",
44
+ errorMessage: "Context overflow: prompt too large for the model (precheck)",
45
+ },
46
+ }), "precheck_error");
47
+ });
48
+ it("returns compaction_failed when compaction shown without reply", () => {
49
+ assert.equal(resolveTerminalState({
50
+ hasBusinessReply: false,
51
+ timeoutFired: false,
52
+ dispatchThrew: false,
53
+ compactionShown: true,
54
+ compactionIncomplete: false,
55
+ deliverInvokeCount: 0,
56
+ deliverCallCount: 0,
57
+ noReplySignaled: false,
58
+ }), "compaction_failed");
59
+ });
60
+ it("returns no_reply for silent turn", () => {
61
+ assert.equal(resolveTerminalState({
62
+ hasBusinessReply: false,
63
+ timeoutFired: false,
64
+ dispatchThrew: false,
65
+ compactionShown: false,
66
+ compactionIncomplete: false,
67
+ deliverInvokeCount: 0,
68
+ deliverCallCount: 0,
69
+ noReplySignaled: true,
70
+ }), "no_reply");
71
+ });
72
+ it("returns timeout when watchdog fired", () => {
73
+ assert.equal(resolveTerminalState({
74
+ hasBusinessReply: false,
75
+ timeoutFired: true,
76
+ dispatchThrew: false,
77
+ compactionShown: false,
78
+ compactionIncomplete: false,
79
+ deliverInvokeCount: 0,
80
+ deliverCallCount: 0,
81
+ noReplySignaled: false,
82
+ }), "timeout");
83
+ });
84
+ });
85
+ describe("buildTerminalUserMessage", () => {
86
+ it("uses distinct copy for precheck vs no_reply", () => {
87
+ const precheck = buildTerminalUserMessage("precheck_error");
88
+ const noReply = buildTerminalUserMessage("no_reply");
89
+ assert.ok(precheck.includes("上下文过大"));
90
+ assert.ok(noReply.includes("没有生成回复"));
91
+ assert.notEqual(precheck, noReply);
92
+ });
93
+ });
94
+ describe("InboundTerminalController idempotency", () => {
95
+ const noopLog = {
96
+ info: () => { },
97
+ warn: () => { },
98
+ error: () => { },
99
+ };
100
+ beforeEach(() => {
101
+ resetGlobalTerminalSentForTests();
102
+ });
103
+ it("sends terminal only once per message_id", async () => {
104
+ const controller = new InboundTerminalController({
105
+ messageId: "msg-1001",
106
+ groupId: "g1",
107
+ sessionKey: "sk1",
108
+ log: noopLog,
109
+ logPrefix: "[test]",
110
+ });
111
+ let sendCount = 0;
112
+ const sendFn = async () => {
113
+ sendCount++;
114
+ };
115
+ const first = await controller.trySendTerminal("precheck_error", sendFn);
116
+ const second = await controller.trySendTerminal("precheck_error", sendFn);
117
+ assert.equal(first, true);
118
+ assert.equal(second, false);
119
+ assert.equal(sendCount, 1);
120
+ assert.equal(hasGlobalTerminalSent("msg-1001"), true);
121
+ });
122
+ it("finalize delivers precheck when error payload was noted", async () => {
123
+ const controller = new InboundTerminalController({
124
+ messageId: "msg-2002",
125
+ groupId: "g2",
126
+ sessionKey: "sk2",
127
+ log: noopLog,
128
+ logPrefix: "[test]",
129
+ });
130
+ controller.noteRuntimeErrorFromPayload("Context overflow: prompt too large for the model (precheck)");
131
+ let sent = "";
132
+ const state = await controller.finalizeAndDeliver({
133
+ sendFn: async (text) => {
134
+ sent = text;
135
+ },
136
+ dispatchThrew: false,
137
+ deliverInvokeCount: 1,
138
+ deliverCallCount: 0,
139
+ });
140
+ assert.equal(state, "precheck_error");
141
+ assert.ok(sent.includes("上下文过大"));
142
+ markGlobalTerminalSent("msg-2002", "precheck_error");
143
+ });
144
+ });
145
+ describe("prefixProactiveOutboundText", () => {
146
+ it("prefixes cron messages once", () => {
147
+ assert.equal(prefixProactiveOutboundText("今日无新增"), "[定时任务] 今日无新增");
148
+ assert.equal(prefixProactiveOutboundText("[定时任务] 已有"), "[定时任务] 已有");
149
+ });
150
+ });
151
+ //# sourceMappingURL=inbound-terminal-state.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-terminal-state.test.js","sourceRoot":"","sources":["../../src/inbound-terminal-state.test.ts"],"names":[],"mappings":"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"}