clawconnect-agent 0.2.9 → 0.2.10
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/dist/commands/run.js +9 -1
- package/dist/commands/run.js.map +1 -1
- package/dist/config/config.js +16 -2
- package/dist/config/config.js.map +1 -1
- package/dist/config/profile-log-rotation.d.ts +17 -0
- package/dist/config/profile-log-rotation.js +37 -0
- package/dist/config/profile-log-rotation.js.map +1 -0
- package/dist/core/relay/file-upload.js +4 -1
- package/dist/core/relay/file-upload.js.map +1 -1
- package/dist/core/relay/reconnect.d.ts +13 -3
- package/dist/core/relay/reconnect.js +20 -4
- package/dist/core/relay/reconnect.js.map +1 -1
- package/dist/core/relay/relay-liveness.d.ts +23 -0
- package/dist/core/relay/relay-liveness.js +61 -0
- package/dist/core/relay/relay-liveness.js.map +1 -0
- package/dist/hermes/hermes-relay-manager.d.ts +5 -0
- package/dist/hermes/hermes-relay-manager.js +9 -0
- package/dist/hermes/hermes-relay-manager.js.map +1 -1
- package/dist/hermes/hermes-session-store.js +3 -1
- package/dist/hermes/hermes-session-store.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-state-db.js +16 -2
- package/dist/hermes/runtime/hermes-runtime-state-db.js.map +1 -1
- package/dist/openclaw/relay/chat-history-normalizers.d.ts +50 -0
- package/dist/openclaw/relay/chat-history-normalizers.js +296 -0
- package/dist/openclaw/relay/chat-history-normalizers.js.map +1 -0
- package/dist/openclaw/relay/chat-history.d.ts +7 -0
- package/dist/openclaw/relay/chat-history.js +58 -308
- package/dist/openclaw/relay/chat-history.js.map +1 -1
- package/dist/openclaw/relay/openclaw-context-usage-publisher.d.ts +33 -0
- package/dist/openclaw/relay/openclaw-context-usage-publisher.js +81 -0
- package/dist/openclaw/relay/openclaw-context-usage-publisher.js.map +1 -0
- package/dist/openclaw/relay/openclaw-heartbeat-markers.d.ts +23 -0
- package/dist/openclaw/relay/openclaw-heartbeat-markers.js +53 -0
- package/dist/openclaw/relay/openclaw-heartbeat-markers.js.map +1 -0
- package/dist/openclaw/relay/relay-manager-protocol.d.ts +11 -0
- package/dist/openclaw/relay/source-commit-projection.js +20 -3
- package/dist/openclaw/relay/source-commit-projection.js.map +1 -1
- package/dist/openclaw/relay-manager.js +67 -108
- package/dist/openclaw/relay-manager.js.map +1 -1
- package/dist/runtime-adapters.d.ts +2 -0
- package/dist/runtime-adapters.js +2 -0
- package/dist/runtime-adapters.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-history-normalizers.js","sourceRoot":"","sources":["../../../src/openclaw/relay/chat-history-normalizers.ts"],"names":[],"mappings":"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"}
|
|
@@ -87,6 +87,13 @@ export declare function canonicalizeOpenClawGatewayHistoryResponse(history: Hist
|
|
|
87
87
|
projectionGatewayId?: string;
|
|
88
88
|
sessionDefaults?: GatewaySessionDefaults;
|
|
89
89
|
}): HistoryResponse;
|
|
90
|
+
/**
|
|
91
|
+
* OpenClaw transcript 里 `role: custom` 的 message 行是插件/工具搜索等隐藏元数据,
|
|
92
|
+
* Control UI 不展示。它们必须先参与血缘回溯(parentId 链经过这些行),
|
|
93
|
+
* 但不能进入投影:默认把未知角色当成 assistant 会产生空的“已完成回复”行,
|
|
94
|
+
* 客户端会把它当作结果锚点,提前消掉 waiting 占位。
|
|
95
|
+
*/
|
|
96
|
+
export declare function filterOpenClawHiddenTranscriptRows<T extends HistoryMessage>(messages: T[]): T[];
|
|
90
97
|
/**
|
|
91
98
|
* OpenClaw 会把内部心跳探测写入 transcript。只有精确的保留提示最终得到纯确认回执时,
|
|
92
99
|
* 才隐藏整段内部记录;若心跳产生真实告警,则保留完整内容供用户查看。
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { cleanHistoryString, extractAttachmentIds, fallbackTimelineCreatedAt, historyNumber, historyString, isRecord, messageSeq, normalizeCursor, normalizeHistoryCreatedAt, normalizeHistoryDirection, normalizeHistoryLimit, normalizeHistoryTimestamp, normalizeTimelineContentBlocks, normalizeTimelineCreatedAt, normalizeTimelineMessageState, normalizeTimelineRole, openClawHistoryString, openClawRunId, openClawTranscriptSource, paginateHistoryMessages, parseHistoryCursorSeq, requireProjectionIdentity, requireProjectionSequence, } from "./chat-history-normalizers.js";
|
|
2
2
|
import { DatabaseSync } from "node:sqlite";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
+
import { zstdDecompressSync } from "node:zlib";
|
|
4
5
|
import { restoreGatewayHistoryMessages } from "./gateway-history-projection.js";
|
|
5
6
|
import { readFile, stat } from "fs/promises";
|
|
6
7
|
import { buildHistorySnapshotPage } from "../../core/relay/timeline-event-builder.js";
|
|
@@ -8,6 +9,7 @@ import { canonicalizeOpenClawSessionScope, resolveOpenClawSessionTranscript, ses
|
|
|
8
9
|
import { resolveOpenClawStateDir } from "../runtime/openclaw-paths.js";
|
|
9
10
|
import { normalizeOpenClawAssistantMediaSidecars, normalizeOpenClawAutomaticMediaReplies, } from "./assistant-media-sidecar.js";
|
|
10
11
|
import { adaptOpenClawMessageToolDelivery } from "./outgoing-media-relay.js";
|
|
12
|
+
import { isOpenClawHeartbeatAckText, isOpenClawHeartbeatPromptText } from "./openclaw-heartbeat-markers.js";
|
|
11
13
|
import { createProjectionMetadata, openClawAgentIdFromSessionKey, openClawSourceOrderScope, } from "../../core/relay/timeline-projection-v3.js";
|
|
12
14
|
import { createSourceCommit } from "../../core/relay/source-commit.js";
|
|
13
15
|
/**
|
|
@@ -55,11 +57,6 @@ export function readOpenClawSourceCommitCursor(rawParams, defaults) {
|
|
|
55
57
|
database?.close();
|
|
56
58
|
}
|
|
57
59
|
}
|
|
58
|
-
const DEFAULT_TRANSCRIPT_HISTORY_LIMIT = 100;
|
|
59
|
-
const MAX_TRANSCRIPT_HISTORY_LIMIT = 200;
|
|
60
|
-
const CURSOR_PREFIX = "seq:";
|
|
61
|
-
const OPENCLAW_HEARTBEAT_TRANSCRIPT_PROMPT = "[OpenClaw heartbeat poll]";
|
|
62
|
-
const OPENCLAW_HEARTBEAT_ACK = "HEARTBEAT_OK";
|
|
63
60
|
const transcriptHistoryCache = new Map();
|
|
64
61
|
export function clearTranscriptHistoryCache() {
|
|
65
62
|
transcriptHistoryCache.clear();
|
|
@@ -100,12 +97,7 @@ function readOpenClawSqliteChatHistory(params, defaults) {
|
|
|
100
97
|
const sessionId = cleanHistoryString(session?.current_session_id);
|
|
101
98
|
if (!sessionId)
|
|
102
99
|
return null;
|
|
103
|
-
const rows = database
|
|
104
|
-
SELECT seq, event_json
|
|
105
|
-
FROM transcript_events
|
|
106
|
-
WHERE session_id = ?
|
|
107
|
-
ORDER BY seq ASC
|
|
108
|
-
`).all(sessionId);
|
|
100
|
+
const rows = readSqliteTranscriptEventRows(database, sessionId);
|
|
109
101
|
const visibleParentIds = resolveSqliteVisibleParentIds(rows);
|
|
110
102
|
const messages = rows
|
|
111
103
|
.map((row) => sqliteTranscriptHistoryMessage(row, sessionId, params.projectionVersion === 3, visibleParentIds))
|
|
@@ -490,20 +482,6 @@ function gatewayHistoryMessageId(input) {
|
|
|
490
482
|
}
|
|
491
483
|
return input.providerMessageId ?? `${input.role}-${input.turnId}`;
|
|
492
484
|
}
|
|
493
|
-
function openClawHistoryMetadata(message) {
|
|
494
|
-
return isRecord(message.__openclaw) ? message.__openclaw : undefined;
|
|
495
|
-
}
|
|
496
|
-
function openClawHistoryString(message, ...fields) {
|
|
497
|
-
const metadata = openClawHistoryMetadata(message);
|
|
498
|
-
return metadata ? historyString(metadata, ...fields) : undefined;
|
|
499
|
-
}
|
|
500
|
-
function openClawRunId(message) {
|
|
501
|
-
return openClawHistoryString(message, "runId", "run_id");
|
|
502
|
-
}
|
|
503
|
-
function openClawTranscriptSource(message) {
|
|
504
|
-
const position = openClawHistoryMetadata(message)?.transcriptPosition;
|
|
505
|
-
return isRecord(position) ? historyString(position, "source") : undefined;
|
|
506
|
-
}
|
|
507
485
|
function normalizeTranscriptHistoryParams(rawParams, fallbackSessionKey) {
|
|
508
486
|
const record = isRecord(rawParams) ? rawParams : {};
|
|
509
487
|
const sessionKey = typeof record.sessionKey === "string" && record.sessionKey.trim().length > 0
|
|
@@ -548,15 +526,47 @@ async function readIndexedTranscriptMessages(transcriptPath, sessionKey, project
|
|
|
548
526
|
});
|
|
549
527
|
return visibleMessages;
|
|
550
528
|
}
|
|
529
|
+
/**
|
|
530
|
+
* OpenClaw 会把体积较大的 transcript 事件只写入 `event_zstd`(此时 `event_json` 为 NULL)。
|
|
531
|
+
* 这些行同样是权威时间线的一部分:漏读会造成 source seq 缺口,并切断 `parentId` 血缘链,
|
|
532
|
+
* 使后续嵌套 provider 运行(如 codex-app-server)的行无法回溯到发起它们的移动端 turn。
|
|
533
|
+
* 旧版本 OpenClaw 没有 `event_zstd` 列,因此按实际列集合决定查询语句。
|
|
534
|
+
*/
|
|
535
|
+
function readSqliteTranscriptEventRows(database, sessionId) {
|
|
536
|
+
const columns = database.prepare("PRAGMA table_info(transcript_events)").all();
|
|
537
|
+
const hasZstdColumn = columns.some((column) => column.name === "event_zstd");
|
|
538
|
+
const projection = hasZstdColumn ? "seq, event_json, event_zstd" : "seq, event_json";
|
|
539
|
+
return database.prepare(`
|
|
540
|
+
SELECT ${projection}
|
|
541
|
+
FROM transcript_events
|
|
542
|
+
WHERE session_id = ?
|
|
543
|
+
ORDER BY seq ASC
|
|
544
|
+
`).all(sessionId);
|
|
545
|
+
}
|
|
546
|
+
function sqliteTranscriptEventJson(row) {
|
|
547
|
+
if (typeof row.event_json === "string")
|
|
548
|
+
return row.event_json;
|
|
549
|
+
if (row.event_zstd instanceof Uint8Array && row.event_zstd.byteLength > 0) {
|
|
550
|
+
try {
|
|
551
|
+
return zstdDecompressSync(row.event_zstd).toString("utf8");
|
|
552
|
+
}
|
|
553
|
+
catch (error) {
|
|
554
|
+
console.warn("[openclaw] failed to decompress transcript event", { seq: row.seq, error: String(error) });
|
|
555
|
+
return undefined;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
return undefined;
|
|
559
|
+
}
|
|
551
560
|
function sqliteTranscriptHistoryMessage(row, sessionId, strictProjectionV3 = false, visibleParentIds) {
|
|
552
561
|
const seq = typeof row.seq === "number" && Number.isFinite(row.seq) && row.seq > 0
|
|
553
562
|
? Math.round(row.seq)
|
|
554
563
|
: undefined;
|
|
555
|
-
|
|
564
|
+
const eventJson = sqliteTranscriptEventJson(row);
|
|
565
|
+
if (!seq || eventJson === undefined)
|
|
556
566
|
return null;
|
|
557
567
|
let event;
|
|
558
568
|
try {
|
|
559
|
-
event = JSON.parse(
|
|
569
|
+
event = JSON.parse(eventJson);
|
|
560
570
|
}
|
|
561
571
|
catch {
|
|
562
572
|
return null;
|
|
@@ -596,11 +606,12 @@ function sqliteTranscriptHistoryMessage(row, sessionId, strictProjectionV3 = fal
|
|
|
596
606
|
function resolveSqliteVisibleParentIds(rows) {
|
|
597
607
|
const nodes = new Map();
|
|
598
608
|
for (const row of rows) {
|
|
599
|
-
|
|
609
|
+
const eventJson = sqliteTranscriptEventJson(row);
|
|
610
|
+
if (eventJson === undefined)
|
|
600
611
|
continue;
|
|
601
612
|
let event;
|
|
602
613
|
try {
|
|
603
|
-
event = JSON.parse(
|
|
614
|
+
event = JSON.parse(eventJson);
|
|
604
615
|
}
|
|
605
616
|
catch {
|
|
606
617
|
continue;
|
|
@@ -653,7 +664,21 @@ function prepareTranscriptHistoryMessages(messages, sessionKey, projectionVersio
|
|
|
653
664
|
const explicitSidecars = normalizeOpenClawAssistantMediaSidecars(messages, sessionKey, relationOptions).messages;
|
|
654
665
|
restoreTranscriptTurnLineage(explicitSidecars, projectionVersion);
|
|
655
666
|
const foldedMessages = normalizeOpenClawAutomaticMediaReplies(explicitSidecars, sessionKey, relationOptions).messages;
|
|
656
|
-
return filterOpenClawHeartbeatArtifacts(foldedMessages);
|
|
667
|
+
return filterOpenClawHiddenTranscriptRows(filterOpenClawHeartbeatArtifacts(foldedMessages));
|
|
668
|
+
}
|
|
669
|
+
const OPENCLAW_HIDDEN_TRANSCRIPT_ROLES = new Set(["custom"]);
|
|
670
|
+
/**
|
|
671
|
+
* OpenClaw transcript 里 `role: custom` 的 message 行是插件/工具搜索等隐藏元数据,
|
|
672
|
+
* Control UI 不展示。它们必须先参与血缘回溯(parentId 链经过这些行),
|
|
673
|
+
* 但不能进入投影:默认把未知角色当成 assistant 会产生空的“已完成回复”行,
|
|
674
|
+
* 客户端会把它当作结果锚点,提前消掉 waiting 占位。
|
|
675
|
+
*/
|
|
676
|
+
export function filterOpenClawHiddenTranscriptRows(messages) {
|
|
677
|
+
const visible = messages.filter((message) => {
|
|
678
|
+
const role = typeof message.role === "string" ? message.role.trim().toLowerCase() : "";
|
|
679
|
+
return !OPENCLAW_HIDDEN_TRANSCRIPT_ROLES.has(role);
|
|
680
|
+
});
|
|
681
|
+
return visible.length === messages.length ? messages : visible;
|
|
657
682
|
}
|
|
658
683
|
/**
|
|
659
684
|
* The installed OpenClaw producer records a settled message-tool delivery as
|
|
@@ -767,8 +792,7 @@ function isOpenClawHeartbeatPrompt(message) {
|
|
|
767
792
|
if (content.hasNonTextContent) {
|
|
768
793
|
return false;
|
|
769
794
|
}
|
|
770
|
-
|
|
771
|
-
return text === "[OpenClaw heartbeat poll]" || text === "OpenClaw heartbeat poll";
|
|
795
|
+
return isOpenClawHeartbeatPromptText(content.text);
|
|
772
796
|
}
|
|
773
797
|
function isOpenClawHeartbeatAcknowledgement(message) {
|
|
774
798
|
if (message.role !== "assistant") {
|
|
@@ -778,8 +802,7 @@ function isOpenClawHeartbeatAcknowledgement(message) {
|
|
|
778
802
|
if (content.hasNonTextContent) {
|
|
779
803
|
return false;
|
|
780
804
|
}
|
|
781
|
-
|
|
782
|
-
return text === "HEARTBEAT_OK" || text === "HEARTBEAT OK";
|
|
805
|
+
return isOpenClawHeartbeatAckText(content.text);
|
|
783
806
|
}
|
|
784
807
|
function isHeartbeatToolArtifact(message) {
|
|
785
808
|
if (message.role === "tool" || message.role === "toolResult" || message.role === "tool_result") {
|
|
@@ -909,279 +932,6 @@ function normalizeTranscriptTurnId(value) {
|
|
|
909
932
|
const cleaned = cleanHistoryString(value);
|
|
910
933
|
return cleaned?.replace(/:(?:user|assistant|tool|system)$/i, "") || undefined;
|
|
911
934
|
}
|
|
912
|
-
function cleanHistoryString(value) {
|
|
913
|
-
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
914
|
-
}
|
|
915
|
-
function paginateHistoryMessages(messages, opts) {
|
|
916
|
-
if (messages.length === 0) {
|
|
917
|
-
return { messages: [], hasMore: false };
|
|
918
|
-
}
|
|
919
|
-
if (opts.direction === "newer") {
|
|
920
|
-
const startIndex = opts.cursorSeq === undefined
|
|
921
|
-
? Math.max(0, messages.length - opts.limit)
|
|
922
|
-
: firstIndexAfterSeq(messages, opts.cursorSeq);
|
|
923
|
-
const page = messages.slice(startIndex, startIndex + opts.limit);
|
|
924
|
-
return {
|
|
925
|
-
messages: page,
|
|
926
|
-
hasMore: startIndex + page.length < messages.length,
|
|
927
|
-
...(lastMessageSeq(page) ? { newestCursor: formatHistoryCursor(lastMessageSeq(page)) } : {}),
|
|
928
|
-
};
|
|
929
|
-
}
|
|
930
|
-
const endExclusive = resolveOlderEndExclusive(messages, opts.cursorSeq);
|
|
931
|
-
const start = Math.max(0, endExclusive - opts.limit);
|
|
932
|
-
const page = messages.slice(start, endExclusive);
|
|
933
|
-
const firstSeq = firstMessageSeq(page);
|
|
934
|
-
const newestSeq = lastMessageSeq(page);
|
|
935
|
-
return {
|
|
936
|
-
messages: page,
|
|
937
|
-
hasMore: start > 0,
|
|
938
|
-
...(start > 0 && firstSeq ? { nextCursor: formatHistoryCursor(firstSeq) } : {}),
|
|
939
|
-
...(newestSeq ? { newestCursor: formatHistoryCursor(newestSeq) } : {}),
|
|
940
|
-
};
|
|
941
|
-
}
|
|
942
|
-
function resolveOlderEndExclusive(messages, cursorSeq) {
|
|
943
|
-
if (cursorSeq === undefined) {
|
|
944
|
-
return messages.length;
|
|
945
|
-
}
|
|
946
|
-
const newestSeq = messageSeq(messages[messages.length - 1]);
|
|
947
|
-
if (newestSeq !== undefined && cursorSeq > newestSeq) {
|
|
948
|
-
return messages.length;
|
|
949
|
-
}
|
|
950
|
-
const index = messages.findIndex((message) => {
|
|
951
|
-
const seq = messageSeq(message);
|
|
952
|
-
return seq !== undefined && seq >= cursorSeq;
|
|
953
|
-
});
|
|
954
|
-
return index === -1 ? messages.length : Math.max(0, index);
|
|
955
|
-
}
|
|
956
|
-
function firstIndexAfterSeq(messages, cursorSeq) {
|
|
957
|
-
const index = messages.findIndex((message) => {
|
|
958
|
-
const seq = messageSeq(message);
|
|
959
|
-
return seq !== undefined && seq > cursorSeq;
|
|
960
|
-
});
|
|
961
|
-
return index === -1 ? messages.length : index;
|
|
962
|
-
}
|
|
963
|
-
function normalizeHistoryLimit(value) {
|
|
964
|
-
const parsed = typeof value === "number" && Number.isFinite(value)
|
|
965
|
-
? Math.round(value)
|
|
966
|
-
: typeof value === "string" && value.trim().length > 0
|
|
967
|
-
? Number.parseInt(value.trim(), 10)
|
|
968
|
-
: DEFAULT_TRANSCRIPT_HISTORY_LIMIT;
|
|
969
|
-
if (!Number.isFinite(parsed)) {
|
|
970
|
-
return DEFAULT_TRANSCRIPT_HISTORY_LIMIT;
|
|
971
|
-
}
|
|
972
|
-
return Math.max(1, Math.min(MAX_TRANSCRIPT_HISTORY_LIMIT, parsed));
|
|
973
|
-
}
|
|
974
|
-
function normalizeHistoryDirection(value) {
|
|
975
|
-
return value === "newer" ? "newer" : "older";
|
|
976
|
-
}
|
|
977
|
-
function requireProjectionIdentity(value, field) {
|
|
978
|
-
if (typeof value !== "string" || value.trim().length === 0) {
|
|
979
|
-
throw new Error(`OpenClaw projection v3 identity is missing ${field}`);
|
|
980
|
-
}
|
|
981
|
-
return value.trim();
|
|
982
|
-
}
|
|
983
|
-
function requireProjectionSequence(value, index) {
|
|
984
|
-
if (!Number.isSafeInteger(value) || (value ?? 0) <= 0) {
|
|
985
|
-
throw new Error(`OpenClaw projection v3 sourceOrderSeq is missing or invalid at row ${index}`);
|
|
986
|
-
}
|
|
987
|
-
return value;
|
|
988
|
-
}
|
|
989
|
-
function normalizeCursor(value) {
|
|
990
|
-
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
991
|
-
}
|
|
992
|
-
function parseHistoryCursorSeq(value) {
|
|
993
|
-
const cursor = normalizeCursor(value);
|
|
994
|
-
if (!cursor) {
|
|
995
|
-
return undefined;
|
|
996
|
-
}
|
|
997
|
-
const raw = cursor.startsWith(CURSOR_PREFIX) ? cursor.slice(CURSOR_PREFIX.length) : cursor;
|
|
998
|
-
const parsed = Number.parseInt(raw, 10);
|
|
999
|
-
return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
|
|
1000
|
-
}
|
|
1001
|
-
function formatHistoryCursor(seq) {
|
|
1002
|
-
return `${CURSOR_PREFIX}${seq}`;
|
|
1003
|
-
}
|
|
1004
|
-
function firstMessageSeq(messages) {
|
|
1005
|
-
return messageSeq(messages[0]);
|
|
1006
|
-
}
|
|
1007
|
-
function lastMessageSeq(messages) {
|
|
1008
|
-
return messageSeq(messages[messages.length - 1]);
|
|
1009
|
-
}
|
|
1010
|
-
function messageSeq(message) {
|
|
1011
|
-
const raw = message?.seq ?? (message ? historyNumber(openClawHistoryMetadata(message) ?? {}, "seq") : undefined);
|
|
1012
|
-
return typeof raw === "number" && Number.isFinite(raw) && raw > 0 ? Math.round(raw) : undefined;
|
|
1013
|
-
}
|
|
1014
|
-
function normalizeHistoryTimestamp(value) {
|
|
1015
|
-
if (typeof value === "number" && Number.isFinite(value) && value > 0) {
|
|
1016
|
-
return Math.round(value > 10_000_000_000 ? value : value * 1000);
|
|
1017
|
-
}
|
|
1018
|
-
if (typeof value === "string" && value.trim().length > 0) {
|
|
1019
|
-
const numeric = Number(value.trim());
|
|
1020
|
-
if (Number.isFinite(numeric) && numeric > 0) {
|
|
1021
|
-
return Math.round(numeric > 10_000_000_000 ? numeric : numeric * 1000);
|
|
1022
|
-
}
|
|
1023
|
-
const parsed = Date.parse(value.trim());
|
|
1024
|
-
if (Number.isFinite(parsed) && parsed > 0) {
|
|
1025
|
-
return Math.round(parsed);
|
|
1026
|
-
}
|
|
1027
|
-
}
|
|
1028
|
-
return undefined;
|
|
1029
|
-
}
|
|
1030
|
-
function normalizeHistoryCreatedAt(value) {
|
|
1031
|
-
const timestamp = normalizeHistoryTimestamp(value);
|
|
1032
|
-
return timestamp === undefined ? undefined : new Date(timestamp).toISOString();
|
|
1033
|
-
}
|
|
1034
|
-
function normalizeTimelineRole(value) {
|
|
1035
|
-
const role = typeof value === "string" ? value.trim().toLowerCase().replace("_", "") : "";
|
|
1036
|
-
switch (role) {
|
|
1037
|
-
case "user":
|
|
1038
|
-
case "assistant":
|
|
1039
|
-
case "system":
|
|
1040
|
-
return role;
|
|
1041
|
-
case "tool":
|
|
1042
|
-
case "toolresult":
|
|
1043
|
-
return "tool";
|
|
1044
|
-
default:
|
|
1045
|
-
return "assistant";
|
|
1046
|
-
}
|
|
1047
|
-
}
|
|
1048
|
-
function normalizeTimelineMessageState(message) {
|
|
1049
|
-
return typeof message.errorMessage === "string" && message.errorMessage.trim().length > 0
|
|
1050
|
-
? "failed"
|
|
1051
|
-
: "completed";
|
|
1052
|
-
}
|
|
1053
|
-
function normalizeTimelineCreatedAt(message) {
|
|
1054
|
-
if (typeof message.createdAt === "string" && message.createdAt.trim().length > 0) {
|
|
1055
|
-
return message.createdAt.trim();
|
|
1056
|
-
}
|
|
1057
|
-
const timestamp = normalizeHistoryTimestamp(message.timestamp);
|
|
1058
|
-
return timestamp === undefined ? undefined : new Date(timestamp).toISOString();
|
|
1059
|
-
}
|
|
1060
|
-
function fallbackTimelineCreatedAt(messages, index) {
|
|
1061
|
-
for (let previous = index - 1; previous >= 0; previous -= 1) {
|
|
1062
|
-
const createdAt = normalizeTimelineCreatedAt(messages[previous]);
|
|
1063
|
-
if (!createdAt) {
|
|
1064
|
-
continue;
|
|
1065
|
-
}
|
|
1066
|
-
const ms = Date.parse(createdAt);
|
|
1067
|
-
if (Number.isFinite(ms)) {
|
|
1068
|
-
return new Date(ms + (index - previous)).toISOString();
|
|
1069
|
-
}
|
|
1070
|
-
}
|
|
1071
|
-
for (let next = index + 1; next < messages.length; next += 1) {
|
|
1072
|
-
const createdAt = normalizeTimelineCreatedAt(messages[next]);
|
|
1073
|
-
if (!createdAt) {
|
|
1074
|
-
continue;
|
|
1075
|
-
}
|
|
1076
|
-
const ms = Date.parse(createdAt);
|
|
1077
|
-
if (Number.isFinite(ms)) {
|
|
1078
|
-
return new Date(Math.max(0, ms - (next - index))).toISOString();
|
|
1079
|
-
}
|
|
1080
|
-
}
|
|
1081
|
-
return new Date().toISOString();
|
|
1082
|
-
}
|
|
1083
|
-
function normalizeTimelineContentBlocks(value) {
|
|
1084
|
-
if (typeof value === "string") {
|
|
1085
|
-
const text = value.trim();
|
|
1086
|
-
return text ? [{ type: "text", text }] : [];
|
|
1087
|
-
}
|
|
1088
|
-
if (!Array.isArray(value)) {
|
|
1089
|
-
return [];
|
|
1090
|
-
}
|
|
1091
|
-
return value.flatMap((block) => {
|
|
1092
|
-
if (!isRecord(block)) {
|
|
1093
|
-
return [];
|
|
1094
|
-
}
|
|
1095
|
-
const type = typeof block.type === "string" && block.type.trim().length > 0 ? block.type.trim() : "text";
|
|
1096
|
-
return [normalizeTimelineContentBlock({ ...block, type })];
|
|
1097
|
-
});
|
|
1098
|
-
}
|
|
1099
|
-
function normalizeTimelineContentBlock(block) {
|
|
1100
|
-
const type = String(block.type).trim().toLowerCase();
|
|
1101
|
-
if (!["image", "file", "audio", "voice", "video"].includes(type)) {
|
|
1102
|
-
return { ...block, type };
|
|
1103
|
-
}
|
|
1104
|
-
const fileId = historyString(block, "fileId", "file_id");
|
|
1105
|
-
const previewUrl = historyString(block, "previewUrl", "preview_url", "thumbnailUrl", "thumbnail_url");
|
|
1106
|
-
const downloadUrl = historyString(block, "downloadUrl", "download_url", "downloadPath", "download_path", "url");
|
|
1107
|
-
const declaredTransferState = historyString(block, "transferState", "transfer_state", "status");
|
|
1108
|
-
// OpenClaw transcripts can retain an attachment identity after its media
|
|
1109
|
-
// object has disappeared. Such a block is a stable unavailable placeholder,
|
|
1110
|
-
// not an available attachment: Relay intentionally rejects available blocks
|
|
1111
|
-
// that cannot be previewed or downloaded.
|
|
1112
|
-
const claimsAvailability = declaredTransferState === undefined
|
|
1113
|
-
|| ["available", "linked", "uploaded"].includes(declaredTransferState.toLowerCase());
|
|
1114
|
-
const transferState = !previewUrl && !downloadUrl && claimsAvailability
|
|
1115
|
-
? "expired"
|
|
1116
|
-
: declaredTransferState ?? "available";
|
|
1117
|
-
const attachmentId = historyString(block, "attachmentId", "attachment_id")
|
|
1118
|
-
?? fileId
|
|
1119
|
-
?? stableAttachmentId(block);
|
|
1120
|
-
return compactBlock({
|
|
1121
|
-
...block,
|
|
1122
|
-
type: type === "voice" ? "audio" : type,
|
|
1123
|
-
...(attachmentId ? { attachmentId } : {}),
|
|
1124
|
-
...(fileId ? { fileId } : {}),
|
|
1125
|
-
...(previewUrl ? { previewUrl } : {}),
|
|
1126
|
-
...(downloadUrl ? { downloadUrl } : {}),
|
|
1127
|
-
...(historyString(block, "fileName", "file_name", "name", "filename") ? {
|
|
1128
|
-
fileName: historyString(block, "fileName", "file_name", "name", "filename"),
|
|
1129
|
-
} : {}),
|
|
1130
|
-
...(historyString(block, "mimeType", "mime_type", "contentType", "content_type") ? {
|
|
1131
|
-
mimeType: historyString(block, "mimeType", "mime_type", "contentType", "content_type"),
|
|
1132
|
-
} : {}),
|
|
1133
|
-
...(historyNumber(block, "byteSize", "byte_size", "sizeBytes", "size_bytes") ? {
|
|
1134
|
-
byteSize: historyNumber(block, "byteSize", "byte_size", "sizeBytes", "size_bytes"),
|
|
1135
|
-
} : {}),
|
|
1136
|
-
...(historyNumber(block, "width", "imageWidth", "image_width") ? {
|
|
1137
|
-
width: historyNumber(block, "width", "imageWidth", "image_width"),
|
|
1138
|
-
} : {}),
|
|
1139
|
-
...(historyNumber(block, "height", "imageHeight", "image_height") ? {
|
|
1140
|
-
height: historyNumber(block, "height", "imageHeight", "image_height"),
|
|
1141
|
-
} : {}),
|
|
1142
|
-
transferState,
|
|
1143
|
-
...(!previewUrl && !downloadUrl && transferState === "expired" ? { isRemoteExpired: true } : {}),
|
|
1144
|
-
});
|
|
1145
|
-
}
|
|
1146
|
-
function extractAttachmentIds(blocks) {
|
|
1147
|
-
return blocks
|
|
1148
|
-
.map((block) => historyString(block, "attachmentId", "attachment_id", "fileId", "file_id"))
|
|
1149
|
-
.filter((value) => Boolean(value))
|
|
1150
|
-
.filter((value, index, values) => values.indexOf(value) === index);
|
|
1151
|
-
}
|
|
1152
|
-
function stableAttachmentId(block) {
|
|
1153
|
-
const source = [
|
|
1154
|
-
historyString(block, "fileName", "file_name", "name", "filename"),
|
|
1155
|
-
historyString(block, "mimeType", "mime_type", "contentType", "content_type"),
|
|
1156
|
-
historyString(block, "downloadUrl", "download_url", "downloadPath", "download_path", "url"),
|
|
1157
|
-
historyNumber(block, "byteSize", "byte_size", "sizeBytes", "size_bytes"),
|
|
1158
|
-
].filter((value) => value !== undefined).join("\u0000");
|
|
1159
|
-
return source ? `att_${createHash("sha256").update(source).digest("hex").slice(0, 16)}` : undefined;
|
|
1160
|
-
}
|
|
1161
|
-
function compactBlock(block) {
|
|
1162
|
-
return Object.fromEntries(Object.entries(block).filter(([, value]) => value !== undefined));
|
|
1163
|
-
}
|
|
1164
|
-
function historyString(record, ...fields) {
|
|
1165
|
-
for (const field of fields) {
|
|
1166
|
-
const value = record[field];
|
|
1167
|
-
if (typeof value === "string" && value.trim().length > 0) {
|
|
1168
|
-
return value.trim();
|
|
1169
|
-
}
|
|
1170
|
-
}
|
|
1171
|
-
return undefined;
|
|
1172
|
-
}
|
|
1173
|
-
function historyNumber(record, ...fields) {
|
|
1174
|
-
for (const field of fields) {
|
|
1175
|
-
const value = record[field];
|
|
1176
|
-
if (typeof value === "number" && Number.isFinite(value)) {
|
|
1177
|
-
return Math.round(value);
|
|
1178
|
-
}
|
|
1179
|
-
}
|
|
1180
|
-
return undefined;
|
|
1181
|
-
}
|
|
1182
|
-
function isRecord(value) {
|
|
1183
|
-
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
1184
|
-
}
|
|
1185
935
|
export function extractHistoryOutcome(history, context, preferredText) {
|
|
1186
936
|
const messages = history?.messages ?? [];
|
|
1187
937
|
if (messages.length === 0) {
|