@xfxstudio/claworld 2026.5.6-testing → 2026.5.10-testing.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.
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/skills/claworld-a2a-channel-agent/SKILL.md +49 -9
- package/skills/claworld-join-and-chat/SKILL.md +14 -1
- package/src/lib/relay/agent-readable-markdown.js +24 -1
- package/src/openclaw/plugin/claworld-channel-plugin.js +17 -661
- package/src/openclaw/plugin/register.js +3 -37
- package/src/openclaw/plugin/relay-client-shared.js +6 -41
- package/src/openclaw/protocol/relay-event-protocol.js +6 -16
- package/src/openclaw/runtime/working-memory.js +56 -1037
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import path from 'node:path';
|
|
3
2
|
|
|
4
3
|
import {
|
|
5
4
|
applyRuntimeIdentity,
|
|
@@ -33,11 +32,6 @@ import { createInboundSessionRouter } from '../runtime/inbound-session-router.js
|
|
|
33
32
|
import { createOutboundSessionBridge } from '../runtime/outbound-session-bridge.js';
|
|
34
33
|
import { createCanonicalResultBuilder } from '../runtime/canonical-result-builder.js';
|
|
35
34
|
import { createDemoSessionBootstrap } from '../runtime/demo-session-bootstrap.js';
|
|
36
|
-
import {
|
|
37
|
-
appendClaworldJournalEvent,
|
|
38
|
-
buildClaworldRuntimeMaintenanceEvent,
|
|
39
|
-
} from '../runtime/working-memory.js';
|
|
40
|
-
import { resolveOpenClawWorkspaceRoot } from '../runtime/workspace-resolver.js';
|
|
41
35
|
import {
|
|
42
36
|
broadcastModeratedWorld,
|
|
43
37
|
createModeratedWorld,
|
|
@@ -1847,385 +1841,6 @@ function buildDeliveryInboundEnvelope({
|
|
|
1847
1841
|
};
|
|
1848
1842
|
}
|
|
1849
1843
|
|
|
1850
|
-
function resolveRuntimeManagementEnvelope(event = {}) {
|
|
1851
|
-
const envelope = event?.delivery && typeof event.delivery === 'object' && !Array.isArray(event.delivery)
|
|
1852
|
-
? event.delivery
|
|
1853
|
-
: {};
|
|
1854
|
-
const payload = envelope.payload && typeof envelope.payload === 'object' && !Array.isArray(envelope.payload)
|
|
1855
|
-
? envelope.payload
|
|
1856
|
-
: {};
|
|
1857
|
-
const notification = payload.notification && typeof payload.notification === 'object' && !Array.isArray(payload.notification)
|
|
1858
|
-
? payload.notification
|
|
1859
|
-
: {};
|
|
1860
|
-
return {
|
|
1861
|
-
envelope,
|
|
1862
|
-
payload,
|
|
1863
|
-
notification,
|
|
1864
|
-
eventType: resolveNormalizedText(envelope.eventType || payload.eventType || event.eventType, null),
|
|
1865
|
-
eventName: resolveNormalizedText(envelope.eventName || payload.eventName || notification.notificationType, null),
|
|
1866
|
-
eventId: resolveNormalizedText(
|
|
1867
|
-
envelope.eventId,
|
|
1868
|
-
resolveNormalizedText(payload.inboxItemId, resolveNormalizedText(notification.notificationId, null)),
|
|
1869
|
-
),
|
|
1870
|
-
sessionKey: resolveNormalizedText(envelope.sessionKey, resolveNormalizedText(payload.sessionKey, null)),
|
|
1871
|
-
targetAgentId: resolveNormalizedText(
|
|
1872
|
-
envelope.targetAgentId,
|
|
1873
|
-
resolveNormalizedText(payload.targetAgentId, resolveNormalizedText(notification.targetAgentId, null)),
|
|
1874
|
-
),
|
|
1875
|
-
worldId: resolveNormalizedText(envelope.worldId, resolveNormalizedText(payload.worldId, resolveNormalizedText(notification.relatedObjects?.worldId, null))),
|
|
1876
|
-
conversationKey: resolveNormalizedText(
|
|
1877
|
-
envelope.conversationKey,
|
|
1878
|
-
resolveNormalizedText(payload.conversationKey, resolveNormalizedText(notification.relatedObjects?.conversationKey, null)),
|
|
1879
|
-
),
|
|
1880
|
-
createdAt: envelope.createdAt || payload.createdAt || notification.createdAt || null,
|
|
1881
|
-
};
|
|
1882
|
-
}
|
|
1883
|
-
|
|
1884
|
-
function stableJsonPreview(value = null, maxChars = 1200) {
|
|
1885
|
-
if (!value || typeof value !== 'object') return null;
|
|
1886
|
-
let json;
|
|
1887
|
-
try {
|
|
1888
|
-
json = JSON.stringify(value, null, 2);
|
|
1889
|
-
} catch {
|
|
1890
|
-
return null;
|
|
1891
|
-
}
|
|
1892
|
-
if (json.length <= maxChars) return json;
|
|
1893
|
-
return `${json.slice(0, Math.max(0, maxChars - 3))}...`;
|
|
1894
|
-
}
|
|
1895
|
-
|
|
1896
|
-
function buildManagementRuntimeEventBody(details = {}, { localSessionKey = null } = {}) {
|
|
1897
|
-
const notification = details.notification || {};
|
|
1898
|
-
const relatedObjects = notification.relatedObjects || details.payload?.relatedObjects || null;
|
|
1899
|
-
const nextActions = notification.nextActions || details.payload?.nextActions || null;
|
|
1900
|
-
const lines = [
|
|
1901
|
-
'Claworld management event received.',
|
|
1902
|
-
'',
|
|
1903
|
-
`Event type: ${details.eventType || 'unknown'}`,
|
|
1904
|
-
`Event name: ${details.eventName || details.eventType || 'unknown'}`,
|
|
1905
|
-
details.eventId ? `Event id: ${details.eventId}` : null,
|
|
1906
|
-
`Management session: ${localSessionKey || details.sessionKey || 'unknown'}`,
|
|
1907
|
-
details.targetAgentId ? `Target agent: ${details.targetAgentId}` : null,
|
|
1908
|
-
details.worldId ? `World: ${details.worldId}` : null,
|
|
1909
|
-
details.conversationKey ? `Conversation: ${details.conversationKey}` : null,
|
|
1910
|
-
'',
|
|
1911
|
-
notification.notificationType ? `Notification type: ${notification.notificationType}` : null,
|
|
1912
|
-
notification.title ? `Title: ${notification.title}` : null,
|
|
1913
|
-
notification.body ? `Body: ${notification.body}` : null,
|
|
1914
|
-
notification.whyReceived ? `Why received: ${notification.whyReceived}` : null,
|
|
1915
|
-
relatedObjects ? 'Related objects:' : null,
|
|
1916
|
-
relatedObjects ? stableJsonPreview(relatedObjects, 900) : null,
|
|
1917
|
-
Array.isArray(nextActions) && nextActions.length > 0 ? 'Next actions:' : null,
|
|
1918
|
-
Array.isArray(nextActions) && nextActions.length > 0 ? stableJsonPreview(nextActions, 900) : null,
|
|
1919
|
-
'',
|
|
1920
|
-
'Handle this as a Claworld Management Session input: decide whether to record, digest, act, report, or ask the user according to the current Claworld working memory and proactivity settings.',
|
|
1921
|
-
].filter((line) => line != null && line !== '');
|
|
1922
|
-
return lines.join('\n');
|
|
1923
|
-
}
|
|
1924
|
-
|
|
1925
|
-
function normalizeSessionStoreKey(value) {
|
|
1926
|
-
return resolveNormalizedText(value, '').toLowerCase();
|
|
1927
|
-
}
|
|
1928
|
-
|
|
1929
|
-
function resolveSessionStoreEntry(store = null, sessionKey = null) {
|
|
1930
|
-
if (!store || typeof store !== 'object' || Array.isArray(store)) return null;
|
|
1931
|
-
const normalizedSessionKey = resolveNormalizedText(sessionKey, null);
|
|
1932
|
-
if (!normalizedSessionKey) return null;
|
|
1933
|
-
if (store[normalizedSessionKey] && typeof store[normalizedSessionKey] === 'object') {
|
|
1934
|
-
return store[normalizedSessionKey];
|
|
1935
|
-
}
|
|
1936
|
-
const lowerSessionKey = normalizeSessionStoreKey(normalizedSessionKey);
|
|
1937
|
-
if (store[lowerSessionKey] && typeof store[lowerSessionKey] === 'object') {
|
|
1938
|
-
return store[lowerSessionKey];
|
|
1939
|
-
}
|
|
1940
|
-
const match = Object.entries(store).find(([key, value]) => (
|
|
1941
|
-
normalizeSessionStoreKey(key) === lowerSessionKey
|
|
1942
|
-
&& value
|
|
1943
|
-
&& typeof value === 'object'
|
|
1944
|
-
&& !Array.isArray(value)
|
|
1945
|
-
));
|
|
1946
|
-
return match ? match[1] : null;
|
|
1947
|
-
}
|
|
1948
|
-
|
|
1949
|
-
function readRuntimeSessionStoreEntry({ runtime = null, sessionStorePath = null, sessionKey = null } = {}) {
|
|
1950
|
-
if (!runtime?.agent?.session?.loadSessionStore || !sessionStorePath || !sessionKey) return null;
|
|
1951
|
-
try {
|
|
1952
|
-
return resolveSessionStoreEntry(
|
|
1953
|
-
runtime.agent.session.loadSessionStore(sessionStorePath),
|
|
1954
|
-
sessionKey,
|
|
1955
|
-
);
|
|
1956
|
-
} catch {
|
|
1957
|
-
return null;
|
|
1958
|
-
}
|
|
1959
|
-
}
|
|
1960
|
-
|
|
1961
|
-
function resolveSessionFilePathFromRuntime({
|
|
1962
|
-
runtime = null,
|
|
1963
|
-
sessionId = null,
|
|
1964
|
-
record = {},
|
|
1965
|
-
sessionStorePath = null,
|
|
1966
|
-
localAgentId = null,
|
|
1967
|
-
} = {}) {
|
|
1968
|
-
const normalizedSessionId = resolveNormalizedText(sessionId, null);
|
|
1969
|
-
if (!normalizedSessionId) return null;
|
|
1970
|
-
|
|
1971
|
-
const sessionsDir = sessionStorePath
|
|
1972
|
-
? path.dirname(path.resolve(sessionStorePath))
|
|
1973
|
-
: null;
|
|
1974
|
-
if (typeof runtime?.agent?.session?.resolveSessionFilePath === 'function') {
|
|
1975
|
-
try {
|
|
1976
|
-
const resolved = runtime.agent.session.resolveSessionFilePath(
|
|
1977
|
-
normalizedSessionId,
|
|
1978
|
-
record,
|
|
1979
|
-
{
|
|
1980
|
-
...(sessionsDir ? { sessionsDir } : {}),
|
|
1981
|
-
...(localAgentId ? { agentId: localAgentId } : {}),
|
|
1982
|
-
},
|
|
1983
|
-
);
|
|
1984
|
-
const normalized = resolveNormalizedText(resolved, null);
|
|
1985
|
-
if (normalized) return normalized;
|
|
1986
|
-
} catch {
|
|
1987
|
-
// Fall through to the local derivation below.
|
|
1988
|
-
}
|
|
1989
|
-
}
|
|
1990
|
-
|
|
1991
|
-
const candidate = resolveNormalizedText(record?.sessionFile, null);
|
|
1992
|
-
if (candidate) {
|
|
1993
|
-
if (path.isAbsolute(candidate) || !sessionsDir) return candidate;
|
|
1994
|
-
return path.resolve(sessionsDir, candidate);
|
|
1995
|
-
}
|
|
1996
|
-
|
|
1997
|
-
if (sessionsDir) {
|
|
1998
|
-
return path.join(sessionsDir, `${normalizedSessionId}.jsonl`);
|
|
1999
|
-
}
|
|
2000
|
-
return null;
|
|
2001
|
-
}
|
|
2002
|
-
|
|
2003
|
-
function resolveSessionRecordArtifacts(record = null, fallbackStorePath = null, options = {}) {
|
|
2004
|
-
const normalizedRecord = record && typeof record === 'object' && !Array.isArray(record) ? record : {};
|
|
2005
|
-
const nestedSession = normalizedRecord.session && typeof normalizedRecord.session === 'object' && !Array.isArray(normalizedRecord.session)
|
|
2006
|
-
? normalizedRecord.session
|
|
2007
|
-
: {};
|
|
2008
|
-
const sessionId = resolveNormalizedText(
|
|
2009
|
-
normalizedRecord.sessionId,
|
|
2010
|
-
resolveNormalizedText(nestedSession.sessionId, resolveNormalizedText(normalizedRecord.id, null)),
|
|
2011
|
-
);
|
|
2012
|
-
const sessionStorePath = resolveNormalizedText(
|
|
2013
|
-
normalizedRecord.storePath,
|
|
2014
|
-
resolveNormalizedText(normalizedRecord.sessionStorePath, fallbackStorePath),
|
|
2015
|
-
);
|
|
2016
|
-
const directSessionFile = resolveNormalizedText(
|
|
2017
|
-
normalizedRecord.sessionFile,
|
|
2018
|
-
resolveNormalizedText(
|
|
2019
|
-
normalizedRecord.sessionPath,
|
|
2020
|
-
resolveNormalizedText(
|
|
2021
|
-
normalizedRecord.filePath,
|
|
2022
|
-
resolveNormalizedText(normalizedRecord.path, resolveNormalizedText(nestedSession.filePath, null)),
|
|
2023
|
-
),
|
|
2024
|
-
),
|
|
2025
|
-
);
|
|
2026
|
-
const sessionFile = directSessionFile || resolveSessionFilePathFromRuntime({
|
|
2027
|
-
runtime: options.runtime,
|
|
2028
|
-
sessionId,
|
|
2029
|
-
record: normalizedRecord,
|
|
2030
|
-
sessionStorePath,
|
|
2031
|
-
localAgentId: options.localAgentId,
|
|
2032
|
-
});
|
|
2033
|
-
const transcriptPath = resolveNormalizedText(
|
|
2034
|
-
normalizedRecord.transcriptPath,
|
|
2035
|
-
resolveNormalizedText(nestedSession.transcriptPath, sessionFile),
|
|
2036
|
-
);
|
|
2037
|
-
return {
|
|
2038
|
-
sessionId,
|
|
2039
|
-
sessionFile,
|
|
2040
|
-
sessionStorePath,
|
|
2041
|
-
transcriptPath,
|
|
2042
|
-
};
|
|
2043
|
-
}
|
|
2044
|
-
|
|
2045
|
-
async function recordRuntimeInboundSessionArtifacts({
|
|
2046
|
-
runtime = null,
|
|
2047
|
-
currentCfg = {},
|
|
2048
|
-
localAgentId = null,
|
|
2049
|
-
sessionKey = null,
|
|
2050
|
-
ctx = {},
|
|
2051
|
-
logger = console,
|
|
2052
|
-
runtimeAccountId = null,
|
|
2053
|
-
logLabel = 'inbound',
|
|
2054
|
-
logContext = {},
|
|
2055
|
-
} = {}) {
|
|
2056
|
-
let sessionStorePath = null;
|
|
2057
|
-
let sessionRecord = null;
|
|
2058
|
-
const sessionApi = runtime?.channel?.session || {};
|
|
2059
|
-
const localSessionKey = resolveNormalizedText(ctx?.SessionKey, sessionKey);
|
|
2060
|
-
|
|
2061
|
-
if (sessionApi.resolveStorePath && localAgentId) {
|
|
2062
|
-
sessionStorePath = sessionApi.resolveStorePath(currentCfg.session?.store, {
|
|
2063
|
-
agentId: localAgentId,
|
|
2064
|
-
});
|
|
2065
|
-
const onRecordError = (error) => {
|
|
2066
|
-
logger.error?.(`[claworld:${runtimeAccountId}] failed to record ${logLabel} inbound session`, {
|
|
2067
|
-
...logContext,
|
|
2068
|
-
sessionKey,
|
|
2069
|
-
localSessionKey,
|
|
2070
|
-
localAgentId,
|
|
2071
|
-
error: error?.message || String(error),
|
|
2072
|
-
});
|
|
2073
|
-
};
|
|
2074
|
-
try {
|
|
2075
|
-
if (typeof sessionApi.recordSessionMetaFromInbound === 'function') {
|
|
2076
|
-
sessionRecord = await sessionApi.recordSessionMetaFromInbound({
|
|
2077
|
-
storePath: sessionStorePath,
|
|
2078
|
-
sessionKey: localSessionKey,
|
|
2079
|
-
ctx,
|
|
2080
|
-
});
|
|
2081
|
-
} else if (typeof sessionApi.recordInboundSession === 'function') {
|
|
2082
|
-
sessionRecord = await sessionApi.recordInboundSession({
|
|
2083
|
-
storePath: sessionStorePath,
|
|
2084
|
-
sessionKey: localSessionKey,
|
|
2085
|
-
ctx,
|
|
2086
|
-
onRecordError,
|
|
2087
|
-
});
|
|
2088
|
-
}
|
|
2089
|
-
} catch (error) {
|
|
2090
|
-
onRecordError(error);
|
|
2091
|
-
}
|
|
2092
|
-
if (!sessionRecord) {
|
|
2093
|
-
sessionRecord = readRuntimeSessionStoreEntry({
|
|
2094
|
-
runtime,
|
|
2095
|
-
sessionStorePath,
|
|
2096
|
-
sessionKey: localSessionKey,
|
|
2097
|
-
});
|
|
2098
|
-
}
|
|
2099
|
-
}
|
|
2100
|
-
|
|
2101
|
-
return {
|
|
2102
|
-
sessionStorePath,
|
|
2103
|
-
sessionRecord,
|
|
2104
|
-
sessionArtifacts: resolveSessionRecordArtifacts(sessionRecord, sessionStorePath, {
|
|
2105
|
-
runtime,
|
|
2106
|
-
localAgentId,
|
|
2107
|
-
}),
|
|
2108
|
-
};
|
|
2109
|
-
}
|
|
2110
|
-
|
|
2111
|
-
function buildDeliveryRuntimeMaintenanceEvent({
|
|
2112
|
-
delivery = {},
|
|
2113
|
-
metadata = {},
|
|
2114
|
-
payload = {},
|
|
2115
|
-
localSessionKey = null,
|
|
2116
|
-
localAgentId = null,
|
|
2117
|
-
sessionArtifacts = {},
|
|
2118
|
-
workspaceRoot = null,
|
|
2119
|
-
} = {}) {
|
|
2120
|
-
const deliveryId = resolveNormalizedText(delivery.deliveryId, null);
|
|
2121
|
-
const sessionKey = resolveNormalizedText(delivery.sessionKey, null);
|
|
2122
|
-
const requestId = resolveNormalizedText(
|
|
2123
|
-
metadata.kickoffRequestId,
|
|
2124
|
-
resolveNormalizedText(metadata.requestId, resolveNormalizedText(metadata.chatRequestId, null)),
|
|
2125
|
-
);
|
|
2126
|
-
const worldId = resolveNormalizedText(
|
|
2127
|
-
metadata.worldId,
|
|
2128
|
-
resolveNormalizedText(delivery.worldId, null),
|
|
2129
|
-
);
|
|
2130
|
-
const conversationKey = resolveNormalizedText(metadata.conversationKey, resolveNormalizedText(delivery.conversationKey, null));
|
|
2131
|
-
const fromAgentId = resolveNormalizedText(metadata.fromAgentId, null);
|
|
2132
|
-
const summary = [
|
|
2133
|
-
'Inbound Claworld delivery joined local session',
|
|
2134
|
-
requestId ? `for request ${requestId}` : null,
|
|
2135
|
-
fromAgentId ? `from ${fromAgentId}` : null,
|
|
2136
|
-
].filter(Boolean).join(' ');
|
|
2137
|
-
return buildClaworldRuntimeMaintenanceEvent({
|
|
2138
|
-
id: deliveryId ? `runtime:delivery:${deliveryId}` : null,
|
|
2139
|
-
timestamp: delivery.createdAt || metadata.createdAt || payload.createdAt || null,
|
|
2140
|
-
kind: metadata.deliveryType ? `delivery.${metadata.deliveryType}` : 'delivery',
|
|
2141
|
-
eventType: 'delivery',
|
|
2142
|
-
scope: 'conversation',
|
|
2143
|
-
summary,
|
|
2144
|
-
excerpt: payload.contextText
|
|
2145
|
-
? 'Inbound delivery included contextText; raw dialogue is kept in the OpenClaw session transcript.'
|
|
2146
|
-
: 'Inbound delivery routed into an OpenClaw conversation session; raw dialogue is kept in the session transcript.',
|
|
2147
|
-
refs: {
|
|
2148
|
-
deliveryId,
|
|
2149
|
-
requestId,
|
|
2150
|
-
chatRequestId: requestId,
|
|
2151
|
-
worldId,
|
|
2152
|
-
conversationKey,
|
|
2153
|
-
fromAgentId,
|
|
2154
|
-
sessionKey: localSessionKey || sessionKey,
|
|
2155
|
-
relaySessionKey: sessionKey,
|
|
2156
|
-
},
|
|
2157
|
-
relations: {
|
|
2158
|
-
deliveryId,
|
|
2159
|
-
requestId,
|
|
2160
|
-
chatRequestId: requestId,
|
|
2161
|
-
worldId,
|
|
2162
|
-
conversationKey,
|
|
2163
|
-
fromAgentId,
|
|
2164
|
-
localAgentId,
|
|
2165
|
-
localSessionKey,
|
|
2166
|
-
relaySessionKey: sessionKey,
|
|
2167
|
-
sessionKey: localSessionKey || sessionKey,
|
|
2168
|
-
sessionId: sessionArtifacts.sessionId,
|
|
2169
|
-
sessionFile: sessionArtifacts.sessionFile,
|
|
2170
|
-
sessionStorePath: sessionArtifacts.sessionStorePath,
|
|
2171
|
-
transcriptPath: sessionArtifacts.transcriptPath,
|
|
2172
|
-
},
|
|
2173
|
-
artifacts: {
|
|
2174
|
-
workspaceRoot,
|
|
2175
|
-
...sessionArtifacts,
|
|
2176
|
-
},
|
|
2177
|
-
});
|
|
2178
|
-
}
|
|
2179
|
-
|
|
2180
|
-
function buildManagementRuntimeMaintenanceEvent(details = {}, {
|
|
2181
|
-
localSessionKey = null,
|
|
2182
|
-
localAgentId = null,
|
|
2183
|
-
sessionArtifacts = {},
|
|
2184
|
-
workspaceRoot = null,
|
|
2185
|
-
} = {}) {
|
|
2186
|
-
const notification = details.notification || {};
|
|
2187
|
-
const refs = {
|
|
2188
|
-
inboxItemId: details.payload?.inboxItemId || details.eventId,
|
|
2189
|
-
notificationId: notification.notificationId,
|
|
2190
|
-
notificationType: notification.notificationType || details.payload?.notificationType,
|
|
2191
|
-
worldId: details.worldId,
|
|
2192
|
-
conversationKey: details.conversationKey,
|
|
2193
|
-
targetAgentId: details.targetAgentId,
|
|
2194
|
-
sessionKey: localSessionKey || details.sessionKey,
|
|
2195
|
-
relaySessionKey: details.sessionKey,
|
|
2196
|
-
};
|
|
2197
|
-
return buildClaworldRuntimeMaintenanceEvent({
|
|
2198
|
-
id: details.eventId ? `runtime:${details.eventType}:${details.eventId}` : null,
|
|
2199
|
-
timestamp: details.createdAt || notification.createdAt || null,
|
|
2200
|
-
kind: details.eventName || details.eventType || 'runtime_event',
|
|
2201
|
-
eventType: details.eventType || 'runtime_event',
|
|
2202
|
-
scope: 'management',
|
|
2203
|
-
summary: notification.title || notification.body || `${details.eventType || 'runtime'} event received.`,
|
|
2204
|
-
excerpt: buildManagementRuntimeEventBody(details),
|
|
2205
|
-
refs,
|
|
2206
|
-
relations: {
|
|
2207
|
-
inboxItemId: refs.inboxItemId,
|
|
2208
|
-
notificationId: refs.notificationId,
|
|
2209
|
-
notificationType: refs.notificationType,
|
|
2210
|
-
worldId: details.worldId,
|
|
2211
|
-
conversationKey: details.conversationKey,
|
|
2212
|
-
targetAgentId: details.targetAgentId,
|
|
2213
|
-
localAgentId,
|
|
2214
|
-
localSessionKey,
|
|
2215
|
-
relaySessionKey: details.sessionKey,
|
|
2216
|
-
sessionKey: localSessionKey || details.sessionKey,
|
|
2217
|
-
sessionId: sessionArtifacts.sessionId,
|
|
2218
|
-
sessionFile: sessionArtifacts.sessionFile,
|
|
2219
|
-
sessionStorePath: sessionArtifacts.sessionStorePath,
|
|
2220
|
-
transcriptPath: sessionArtifacts.transcriptPath,
|
|
2221
|
-
},
|
|
2222
|
-
artifacts: {
|
|
2223
|
-
workspaceRoot,
|
|
2224
|
-
...sessionArtifacts,
|
|
2225
|
-
},
|
|
2226
|
-
});
|
|
2227
|
-
}
|
|
2228
|
-
|
|
2229
1844
|
function createDeliveryReplyDispatcher({
|
|
2230
1845
|
runtime,
|
|
2231
1846
|
currentCfg,
|
|
@@ -2614,13 +2229,10 @@ async function maybeBridgeRuntimeInboundEvent({
|
|
|
2614
2229
|
const eventType = resolveNormalizedText(delivery.eventType, resolveNormalizedText(event?.eventType, 'delivery'));
|
|
2615
2230
|
const deliveryId = resolveInboundMessageId({ delivery, payload, metadata });
|
|
2616
2231
|
const sessionKey = resolveNormalizedText(delivery.sessionKey, null);
|
|
2617
|
-
const fallbackRuntimeEventText = eventType !== 'delivery'
|
|
2618
|
-
? buildManagementRuntimeEventBody(resolveRuntimeManagementEnvelope(event))
|
|
2619
|
-
: null;
|
|
2620
2232
|
const contextText = resolveNormalizedText(payload.contextText, null);
|
|
2621
2233
|
const incomingText = resolveNormalizedText(
|
|
2622
2234
|
payload.commandText,
|
|
2623
|
-
contextText ? null : resolveNormalizedText(payload.text, resolveNormalizedText(payload.body,
|
|
2235
|
+
contextText ? null : resolveNormalizedText(payload.text, resolveNormalizedText(payload.body, null)),
|
|
2624
2236
|
);
|
|
2625
2237
|
const commandText = resolveNormalizedText(payload.commandText, incomingText);
|
|
2626
2238
|
const fromAgentId = resolveNormalizedText(metadata.fromAgentId, null);
|
|
@@ -2719,9 +2331,6 @@ async function maybeBridgeRuntimeInboundEvent({
|
|
|
2719
2331
|
OriginatingFrom: remoteIdentity,
|
|
2720
2332
|
OriginatingTo: remoteIdentity,
|
|
2721
2333
|
ChatType: isManagementSession ? 'management' : 'direct',
|
|
2722
|
-
SessionType: isManagementSession ? 'management' : 'direct',
|
|
2723
|
-
sessionType: isManagementSession ? 'management' : 'direct',
|
|
2724
|
-
sessionKind: isManagementSession ? 'management' : 'conversation',
|
|
2725
2334
|
SenderName: senderName,
|
|
2726
2335
|
SenderId: remoteIdentity,
|
|
2727
2336
|
MessageId: deliveryId,
|
|
@@ -2737,66 +2346,25 @@ async function maybeBridgeRuntimeInboundEvent({
|
|
|
2737
2346
|
UntrustedContext,
|
|
2738
2347
|
});
|
|
2739
2348
|
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
|
|
2750
|
-
|
|
2751
|
-
|
|
2752
|
-
|
|
2753
|
-
|
|
2754
|
-
const workspaceRoot = resolveOpenClawWorkspaceRoot({
|
|
2755
|
-
sources: [
|
|
2756
|
-
{ agentId: localAgentId, localAgentId },
|
|
2757
|
-
currentCfg,
|
|
2758
|
-
runtimeConfig,
|
|
2759
|
-
],
|
|
2760
|
-
config: currentCfg,
|
|
2761
|
-
agentId: localAgentId,
|
|
2762
|
-
});
|
|
2763
|
-
let journalResult = null;
|
|
2764
|
-
if (workspaceRoot) {
|
|
2765
|
-
try {
|
|
2766
|
-
const maintenanceEvent = isRelayDelivery
|
|
2767
|
-
? buildDeliveryRuntimeMaintenanceEvent({
|
|
2768
|
-
delivery,
|
|
2769
|
-
metadata,
|
|
2770
|
-
payload,
|
|
2771
|
-
localSessionKey,
|
|
2772
|
-
localAgentId,
|
|
2773
|
-
sessionArtifacts,
|
|
2774
|
-
workspaceRoot,
|
|
2775
|
-
})
|
|
2776
|
-
: buildManagementRuntimeMaintenanceEvent(resolveRuntimeManagementEnvelope(event), {
|
|
2349
|
+
if (runtime?.channel?.session?.recordInboundSession && runtime?.channel?.session?.resolveStorePath && localAgentId) {
|
|
2350
|
+
const storePath = runtime.channel.session.resolveStorePath(currentCfg.session?.store, {
|
|
2351
|
+
agentId: localAgentId,
|
|
2352
|
+
});
|
|
2353
|
+
await runtime.channel.session.recordInboundSession({
|
|
2354
|
+
storePath,
|
|
2355
|
+
sessionKey: inboundCtx.SessionKey || sessionKey,
|
|
2356
|
+
ctx: inboundCtx,
|
|
2357
|
+
onRecordError: (error) => {
|
|
2358
|
+
logger.error?.(`[claworld:${runtimeAccountId}] failed to record inbound session`, {
|
|
2359
|
+
eventType,
|
|
2360
|
+
deliveryId,
|
|
2361
|
+
sessionKey,
|
|
2777
2362
|
localSessionKey,
|
|
2778
2363
|
localAgentId,
|
|
2779
|
-
|
|
2780
|
-
workspaceRoot,
|
|
2364
|
+
error: error?.message || String(error),
|
|
2781
2365
|
});
|
|
2782
|
-
|
|
2783
|
-
|
|
2784
|
-
maintenanceEvent,
|
|
2785
|
-
{
|
|
2786
|
-
trigger: isRelayDelivery ? 'delivery' : 'runtime_event',
|
|
2787
|
-
rule: isRelayDelivery ? 'runtime_delivery_joined_session' : 'runtime_event_joined_session',
|
|
2788
|
-
},
|
|
2789
|
-
);
|
|
2790
|
-
} catch (error) {
|
|
2791
|
-
logger.warn?.(`[claworld:${runtimeAccountId}] inbound journal append failed`, {
|
|
2792
|
-
eventType,
|
|
2793
|
-
deliveryId,
|
|
2794
|
-
sessionKey,
|
|
2795
|
-
localSessionKey,
|
|
2796
|
-
localAgentId,
|
|
2797
|
-
error: error?.message || String(error),
|
|
2798
|
-
});
|
|
2799
|
-
}
|
|
2366
|
+
},
|
|
2367
|
+
});
|
|
2800
2368
|
}
|
|
2801
2369
|
|
|
2802
2370
|
logger.info?.(`[claworld:${runtimeAccountId}] ${isRelayDelivery ? 'routing delivery into runtime session' : 'routing inbound event into runtime session'}`, {
|
|
@@ -2805,15 +2373,12 @@ async function maybeBridgeRuntimeInboundEvent({
|
|
|
2805
2373
|
sessionKey,
|
|
2806
2374
|
localSessionKey,
|
|
2807
2375
|
localAgentId,
|
|
2808
|
-
sessionId: sessionArtifacts.sessionId || null,
|
|
2809
|
-
sessionFile: sessionArtifacts.sessionFile || null,
|
|
2810
2376
|
remoteIdentity,
|
|
2811
2377
|
routeStatus: routed?.status || null,
|
|
2812
2378
|
bodyPreview: String(Body || '').slice(0, 240),
|
|
2813
2379
|
rawBodyPreview: String(RawBody || '').slice(0, 240),
|
|
2814
2380
|
allowReply,
|
|
2815
2381
|
commandAuthorized,
|
|
2816
|
-
journal: journalResult?.ok === true,
|
|
2817
2382
|
});
|
|
2818
2383
|
|
|
2819
2384
|
if (isRelayDelivery && metadata.acceptanceRequired !== false) {
|
|
@@ -2926,199 +2491,6 @@ async function maybeBridgeRuntimeInboundEvent({
|
|
|
2926
2491
|
};
|
|
2927
2492
|
}
|
|
2928
2493
|
|
|
2929
|
-
async function maybeBridgeRuntimeManagementEvent({
|
|
2930
|
-
runtimeConfig,
|
|
2931
|
-
runtimeAccountId,
|
|
2932
|
-
event,
|
|
2933
|
-
logger,
|
|
2934
|
-
runtime,
|
|
2935
|
-
cfg,
|
|
2936
|
-
inbound,
|
|
2937
|
-
}) {
|
|
2938
|
-
const details = resolveRuntimeManagementEnvelope(event);
|
|
2939
|
-
const route = event?.route || inbound?.routeInboundEvent?.(details.envelope, {
|
|
2940
|
-
sessionTarget: runtimeConfig.routing?.sessionTarget,
|
|
2941
|
-
fallbackTarget: runtimeConfig.routing?.fallbackTarget,
|
|
2942
|
-
}) || null;
|
|
2943
|
-
const sessionKey = resolveNormalizedText(details.sessionKey, resolveNormalizedText(route?.sessionKey, null));
|
|
2944
|
-
const eventId = resolveNormalizedText(details.eventId, `${details.eventType || 'runtime_event'}:${Date.now()}`);
|
|
2945
|
-
|
|
2946
|
-
if (
|
|
2947
|
-
!runtime?.channel?.reply?.finalizeInboundContext
|
|
2948
|
-
|| !runtime?.channel?.reply?.dispatchReplyFromConfig
|
|
2949
|
-
|| !runtime?.channel?.reply?.createReplyDispatcherWithTyping
|
|
2950
|
-
) {
|
|
2951
|
-
logger.warn?.(`[claworld:${runtimeAccountId}] skipping management event bridge: missing runtime bridge hooks`, {
|
|
2952
|
-
eventType: details.eventType,
|
|
2953
|
-
eventName: details.eventName,
|
|
2954
|
-
sessionKey,
|
|
2955
|
-
});
|
|
2956
|
-
return { skipped: true, reason: 'missing_runtime_bridge_hooks' };
|
|
2957
|
-
}
|
|
2958
|
-
if (!details.eventType || !sessionKey || route?.status === 'invalid') {
|
|
2959
|
-
logger.warn?.(`[claworld:${runtimeAccountId}] skipping management event bridge: missing runtime event payload`, {
|
|
2960
|
-
eventType: details.eventType,
|
|
2961
|
-
eventName: details.eventName,
|
|
2962
|
-
sessionKey,
|
|
2963
|
-
routeStatus: route?.status || null,
|
|
2964
|
-
});
|
|
2965
|
-
return { skipped: true, reason: 'missing_management_event_payload' };
|
|
2966
|
-
}
|
|
2967
|
-
|
|
2968
|
-
const loadedCfg = await runtime.config?.loadConfig?.() || {};
|
|
2969
|
-
const currentCfg = {
|
|
2970
|
-
...(loadedCfg && typeof loadedCfg === 'object' && !Array.isArray(loadedCfg) ? loadedCfg : {}),
|
|
2971
|
-
...(cfg && typeof cfg === 'object' && !Array.isArray(cfg) ? cfg : {}),
|
|
2972
|
-
agents: cfg?.agents || loadedCfg?.agents,
|
|
2973
|
-
bindings: cfg?.bindings || loadedCfg?.bindings,
|
|
2974
|
-
channels: cfg?.channels || loadedCfg?.channels,
|
|
2975
|
-
session: cfg?.session || loadedCfg?.session,
|
|
2976
|
-
};
|
|
2977
|
-
const localAgentId = resolveBoundLocalAgentId({
|
|
2978
|
-
cfg: currentCfg,
|
|
2979
|
-
runtimeConfig,
|
|
2980
|
-
});
|
|
2981
|
-
const localSessionKey = buildAgentScopedLocalSessionKey({
|
|
2982
|
-
sessionKey,
|
|
2983
|
-
localAgentId,
|
|
2984
|
-
});
|
|
2985
|
-
const body = buildManagementRuntimeEventBody(details, { localSessionKey });
|
|
2986
|
-
const timestamp = Date.parse(details.createdAt || '');
|
|
2987
|
-
const inboundTimestamp = Number.isFinite(timestamp) ? timestamp : Date.now();
|
|
2988
|
-
const localIdentity = normalizeClaworldText(runtimeConfig.relay?.agentId, runtimeConfig.accountId);
|
|
2989
|
-
const inboundCtx = runtime.channel.reply.finalizeInboundContext({
|
|
2990
|
-
Body: body,
|
|
2991
|
-
RawBody: body,
|
|
2992
|
-
CommandBody: body,
|
|
2993
|
-
BodyForAgent: body,
|
|
2994
|
-
BodyForCommands: body,
|
|
2995
|
-
From: 'claworld:management',
|
|
2996
|
-
To: `claworld:${localIdentity}`,
|
|
2997
|
-
SessionKey: localSessionKey || sessionKey,
|
|
2998
|
-
RelaySessionKey: sessionKey,
|
|
2999
|
-
AccountId: runtimeConfig.accountId,
|
|
3000
|
-
OriginatingChannel: 'claworld',
|
|
3001
|
-
OriginatingFrom: 'management',
|
|
3002
|
-
OriginatingTo: localIdentity,
|
|
3003
|
-
ChatType: 'management',
|
|
3004
|
-
SessionType: 'management',
|
|
3005
|
-
sessionType: 'management',
|
|
3006
|
-
sessionKind: 'management',
|
|
3007
|
-
SenderName: 'Claworld Management',
|
|
3008
|
-
SenderId: 'claworld-management',
|
|
3009
|
-
MessageId: eventId,
|
|
3010
|
-
Provider: 'claworld',
|
|
3011
|
-
Surface: 'claworld',
|
|
3012
|
-
ConversationLabel: 'Claworld Management',
|
|
3013
|
-
Timestamp: inboundTimestamp,
|
|
3014
|
-
MessageSid: eventId,
|
|
3015
|
-
WasMentioned: false,
|
|
3016
|
-
CommandAuthorized: false,
|
|
3017
|
-
RelayEventId: eventId,
|
|
3018
|
-
RelayEventType: details.eventType,
|
|
3019
|
-
RelayEventName: details.eventName,
|
|
3020
|
-
RelayTargetAgentId: details.targetAgentId,
|
|
3021
|
-
});
|
|
3022
|
-
|
|
3023
|
-
const {
|
|
3024
|
-
sessionStorePath,
|
|
3025
|
-
sessionArtifacts,
|
|
3026
|
-
} = await recordRuntimeInboundSessionArtifacts({
|
|
3027
|
-
runtime,
|
|
3028
|
-
currentCfg,
|
|
3029
|
-
localAgentId,
|
|
3030
|
-
sessionKey,
|
|
3031
|
-
ctx: inboundCtx,
|
|
3032
|
-
logger,
|
|
3033
|
-
runtimeAccountId,
|
|
3034
|
-
logLabel: 'management',
|
|
3035
|
-
logContext: {
|
|
3036
|
-
eventType: details.eventType,
|
|
3037
|
-
eventName: details.eventName,
|
|
3038
|
-
},
|
|
3039
|
-
});
|
|
3040
|
-
|
|
3041
|
-
const workspaceRoot = resolveOpenClawWorkspaceRoot({
|
|
3042
|
-
sources: [
|
|
3043
|
-
{ agentId: localAgentId, localAgentId },
|
|
3044
|
-
currentCfg,
|
|
3045
|
-
runtimeConfig,
|
|
3046
|
-
],
|
|
3047
|
-
config: currentCfg,
|
|
3048
|
-
agentId: localAgentId,
|
|
3049
|
-
});
|
|
3050
|
-
let journalResult = null;
|
|
3051
|
-
if (workspaceRoot) {
|
|
3052
|
-
try {
|
|
3053
|
-
journalResult = await appendClaworldJournalEvent(
|
|
3054
|
-
workspaceRoot,
|
|
3055
|
-
buildManagementRuntimeMaintenanceEvent(details, {
|
|
3056
|
-
localSessionKey,
|
|
3057
|
-
localAgentId,
|
|
3058
|
-
sessionArtifacts,
|
|
3059
|
-
workspaceRoot,
|
|
3060
|
-
}),
|
|
3061
|
-
);
|
|
3062
|
-
} catch (error) {
|
|
3063
|
-
logger.warn?.(`[claworld:${runtimeAccountId}] management event journal append failed`, {
|
|
3064
|
-
eventType: details.eventType,
|
|
3065
|
-
eventName: details.eventName,
|
|
3066
|
-
sessionKey,
|
|
3067
|
-
error: error?.message || String(error),
|
|
3068
|
-
});
|
|
3069
|
-
}
|
|
3070
|
-
}
|
|
3071
|
-
|
|
3072
|
-
logger.info?.(`[claworld:${runtimeAccountId}] routing management event into runtime session`, {
|
|
3073
|
-
eventType: details.eventType,
|
|
3074
|
-
eventName: details.eventName,
|
|
3075
|
-
eventId,
|
|
3076
|
-
sessionKey,
|
|
3077
|
-
localSessionKey,
|
|
3078
|
-
localAgentId,
|
|
3079
|
-
sessionId: sessionArtifacts.sessionId || null,
|
|
3080
|
-
sessionFile: sessionArtifacts.sessionFile || null,
|
|
3081
|
-
routeStatus: route?.status || null,
|
|
3082
|
-
journal: journalResult?.ok === true,
|
|
3083
|
-
});
|
|
3084
|
-
|
|
3085
|
-
const {
|
|
3086
|
-
dispatchResult,
|
|
3087
|
-
runtimeOutputSummary,
|
|
3088
|
-
} = await runDeliveryReplyDispatch({
|
|
3089
|
-
runtime,
|
|
3090
|
-
currentCfg,
|
|
3091
|
-
relayClient: null,
|
|
3092
|
-
deliveryId: eventId,
|
|
3093
|
-
sessionKey,
|
|
3094
|
-
localAgentId,
|
|
3095
|
-
allowReply: false,
|
|
3096
|
-
logger,
|
|
3097
|
-
runtimeAccountId,
|
|
3098
|
-
inboundCtx,
|
|
3099
|
-
});
|
|
3100
|
-
|
|
3101
|
-
logger.info?.(`[claworld:${runtimeAccountId}] management event bridge completed`, {
|
|
3102
|
-
eventType: details.eventType,
|
|
3103
|
-
eventName: details.eventName,
|
|
3104
|
-
eventId,
|
|
3105
|
-
sessionKey,
|
|
3106
|
-
localSessionKey,
|
|
3107
|
-
queuedFinal: Boolean(dispatchResult?.queuedFinal),
|
|
3108
|
-
routeStatus: route?.status || null,
|
|
3109
|
-
runtimeOutputSummary,
|
|
3110
|
-
});
|
|
3111
|
-
|
|
3112
|
-
return {
|
|
3113
|
-
skipped: false,
|
|
3114
|
-
ok: true,
|
|
3115
|
-
queuedFinal: Boolean(dispatchResult?.queuedFinal),
|
|
3116
|
-
sessionKey,
|
|
3117
|
-
localSessionKey,
|
|
3118
|
-
routeStatus: route?.status || null,
|
|
3119
|
-
};
|
|
3120
|
-
}
|
|
3121
|
-
|
|
3122
2494
|
export function createClaworldChannelPlugin({
|
|
3123
2495
|
logger = console,
|
|
3124
2496
|
relayClientFactory = createClaworldRelayClient,
|
|
@@ -3553,7 +2925,6 @@ export function createClaworldChannelPlugin({
|
|
|
3553
2925
|
eventType: event?.eventType || null,
|
|
3554
2926
|
target: event?.route?.target || null,
|
|
3555
2927
|
deliveryId: event?.delivery?.deliveryId || null,
|
|
3556
|
-
eventId: event?.delivery?.eventId || null,
|
|
3557
2928
|
sessionKey: event?.delivery?.sessionKey || null,
|
|
3558
2929
|
});
|
|
3559
2930
|
|
|
@@ -3573,21 +2944,6 @@ export function createClaworldChannelPlugin({
|
|
|
3573
2944
|
error: error?.message || String(error),
|
|
3574
2945
|
});
|
|
3575
2946
|
});
|
|
3576
|
-
} else if (event?.route?.sessionKind === 'management' || event?.delivery?.sessionKey?.startsWith?.('management:')) {
|
|
3577
|
-
const runtimeContext = accountRuntimeContexts.get(accountKey) || {};
|
|
3578
|
-
maybeBridgeRuntimeManagementEvent({
|
|
3579
|
-
runtimeConfig,
|
|
3580
|
-
runtimeAccountId,
|
|
3581
|
-
event,
|
|
3582
|
-
logger,
|
|
3583
|
-
runtime: runtimeContext.runtime,
|
|
3584
|
-
cfg: runtimeContext.cfg,
|
|
3585
|
-
inbound,
|
|
3586
|
-
}).catch((error) => {
|
|
3587
|
-
logger.error?.(`[claworld:${runtimeAccountId}] management event bridge exception`, {
|
|
3588
|
-
error: error?.message || String(error),
|
|
3589
|
-
});
|
|
3590
|
-
});
|
|
3591
2947
|
}
|
|
3592
2948
|
});
|
|
3593
2949
|
|