@aotui/runtime 1.0.6 → 1.0.9
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/adapters/system-instruction.d.ts +1 -1
- package/dist/adapters/system-instruction.js +20 -238
- package/dist/adapters/system-instruction.js.map +1 -1
- package/dist/engine/app/index.d.ts +1 -1
- package/dist/engine/app/index.js.map +1 -1
- package/dist/engine/app/registry.d.ts +21 -0
- package/dist/engine/app/registry.js +166 -106
- package/dist/engine/app/registry.js.map +1 -1
- package/dist/engine/system/dispatcher.js +3 -3
- package/dist/engine/system/dispatcher.js.map +1 -1
- package/dist/engine/view/snapshot/templates.d.ts +2 -2
- package/dist/engine/view/snapshot/templates.js +0 -2
- package/dist/engine/view/snapshot/templates.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/kernel/index.d.ts +4 -1
- package/dist/kernel/index.js +35 -2
- package/dist/kernel/index.js.map +1 -1
- package/dist/worker-runtime/app-kernel/AppKernel.js +6 -6
- package/dist/worker-runtime/app-kernel/AppKernel.js.map +1 -1
- package/dist/worker-runtime/app-kernel/view-registry.js +3 -3
- package/dist/worker-runtime/app-kernel/view-registry.js.map +1 -1
- package/dist/worker-runtime/index.js +24 -24
- package/dist/worker-runtime/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/adapters/openclaw/agent-adapter.d.ts +0 -37
- package/dist/adapters/openclaw/agent-adapter.js +0 -156
- package/dist/adapters/openclaw/agent-adapter.js.map +0 -1
- package/dist/adapters/openclaw/index.d.ts +0 -5
- package/dist/adapters/openclaw/index.js +0 -6
- package/dist/adapters/openclaw/index.js.map +0 -1
- package/dist/adapters/openclaw/kernel-service.d.ts +0 -14
- package/dist/adapters/openclaw/kernel-service.js +0 -52
- package/dist/adapters/openclaw/kernel-service.js.map +0 -1
- package/dist/adapters/openclaw/projector.d.ts +0 -9
- package/dist/adapters/openclaw/projector.js +0 -164
- package/dist/adapters/openclaw/projector.js.map +0 -1
- package/dist/adapters/openclaw/session-desktop-manager.d.ts +0 -29
- package/dist/adapters/openclaw/session-desktop-manager.js +0 -136
- package/dist/adapters/openclaw/session-desktop-manager.js.map +0 -1
- package/dist/adapters/openclaw/types.d.ts +0 -102
- package/dist/adapters/openclaw/types.js +0 -2
- package/dist/adapters/openclaw/types.js.map +0 -1
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { OpenClawSnapshotProjector, replaceAotuiInjectedMessages } from './projector.js';
|
|
2
|
-
function normalizeSessionKey(sessionKey) {
|
|
3
|
-
return sessionKey.trim().toLowerCase();
|
|
4
|
-
}
|
|
5
|
-
export class OpenClawAgentAdapter {
|
|
6
|
-
options;
|
|
7
|
-
sessionKey;
|
|
8
|
-
ownerId;
|
|
9
|
-
baseTools;
|
|
10
|
-
projector;
|
|
11
|
-
bindingCache = new Map();
|
|
12
|
-
originalTransformContext;
|
|
13
|
-
desktopRecord;
|
|
14
|
-
constructor(options) {
|
|
15
|
-
this.options = options;
|
|
16
|
-
this.sessionKey = normalizeSessionKey(options.sessionKey);
|
|
17
|
-
this.ownerId = options.ownerId ?? 'openclaw';
|
|
18
|
-
this.baseTools = [...(options.baseTools ?? [])];
|
|
19
|
-
this.projector = options.projector ?? new OpenClawSnapshotProjector();
|
|
20
|
-
}
|
|
21
|
-
async install() {
|
|
22
|
-
await this.ensureDesktopReady();
|
|
23
|
-
await this.refreshToolsAndContext();
|
|
24
|
-
this.originalTransformContext = this.options.agent.transformContext;
|
|
25
|
-
this.options.agent.transformContext = async (messages, signal) => {
|
|
26
|
-
const baseMessages = this.originalTransformContext
|
|
27
|
-
? await this.originalTransformContext(messages, signal)
|
|
28
|
-
: messages;
|
|
29
|
-
await this.refreshToolsAndContext();
|
|
30
|
-
const injectedMessages = await this.buildAotuiMessages();
|
|
31
|
-
return replaceAotuiInjectedMessages(baseMessages, injectedMessages);
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
async dispose() {
|
|
35
|
-
this.options.agent.transformContext = this.originalTransformContext;
|
|
36
|
-
}
|
|
37
|
-
getSessionKey() {
|
|
38
|
-
return this.sessionKey;
|
|
39
|
-
}
|
|
40
|
-
getDesktopRecord() {
|
|
41
|
-
if (!this.desktopRecord) {
|
|
42
|
-
throw new Error(`Desktop is not ready for session ${this.sessionKey}`);
|
|
43
|
-
}
|
|
44
|
-
return this.desktopRecord;
|
|
45
|
-
}
|
|
46
|
-
async ensureDesktopReady() {
|
|
47
|
-
if (this.desktopRecord) {
|
|
48
|
-
await this.options.desktopManager.touchDesktop(this.sessionKey, this.options.sessionId);
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
this.desktopRecord = await this.options.desktopManager.ensureDesktop({
|
|
52
|
-
sessionKey: this.sessionKey,
|
|
53
|
-
sessionId: this.options.sessionId,
|
|
54
|
-
agentId: this.options.agentId,
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
async buildAotuiMessages() {
|
|
58
|
-
const snapshot = await this.acquireSnapshot();
|
|
59
|
-
try {
|
|
60
|
-
return this.projector.projectMessages(snapshot, this.getDesktopRecord());
|
|
61
|
-
}
|
|
62
|
-
finally {
|
|
63
|
-
this.options.kernel.releaseSnapshot(snapshot.id);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
async buildAotuiTools() {
|
|
67
|
-
const snapshot = await this.acquireSnapshot();
|
|
68
|
-
try {
|
|
69
|
-
const bindings = this.projector.projectToolBindings(snapshot, this.getDesktopRecord());
|
|
70
|
-
this.bindingCache.clear();
|
|
71
|
-
for (const binding of bindings) {
|
|
72
|
-
this.bindingCache.set(binding.toolName, binding);
|
|
73
|
-
}
|
|
74
|
-
return bindings.map((binding) => this.createTool(binding));
|
|
75
|
-
}
|
|
76
|
-
finally {
|
|
77
|
-
this.options.kernel.releaseSnapshot(snapshot.id);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
async routeToolCall(toolName, args, toolCallId) {
|
|
81
|
-
const binding = await this.resolveBinding(toolName);
|
|
82
|
-
if (!binding) {
|
|
83
|
-
return {
|
|
84
|
-
toolCallId,
|
|
85
|
-
toolName,
|
|
86
|
-
error: {
|
|
87
|
-
code: 'E_TOOL_NOT_FOUND',
|
|
88
|
-
message: `Unknown AOTUI tool: ${toolName}`,
|
|
89
|
-
},
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
const operation = {
|
|
93
|
-
...binding.operation,
|
|
94
|
-
args: args ?? {},
|
|
95
|
-
};
|
|
96
|
-
const desktopRecord = this.getDesktopRecord();
|
|
97
|
-
this.options.kernel.acquireLock(desktopRecord.desktopId, this.ownerId);
|
|
98
|
-
try {
|
|
99
|
-
const result = await this.options.kernel.execute(desktopRecord.desktopId, operation, this.ownerId);
|
|
100
|
-
if (result.success) {
|
|
101
|
-
return {
|
|
102
|
-
toolCallId,
|
|
103
|
-
toolName,
|
|
104
|
-
result: result.data ?? { success: true },
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
return {
|
|
108
|
-
toolCallId,
|
|
109
|
-
toolName,
|
|
110
|
-
error: result.error ?? {
|
|
111
|
-
code: 'E_OPERATION_FAILED',
|
|
112
|
-
message: 'AOTUI operation failed',
|
|
113
|
-
},
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
finally {
|
|
117
|
-
this.options.kernel.releaseLock(desktopRecord.desktopId, this.ownerId);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
async refreshToolsAndContext() {
|
|
121
|
-
const aotuiTools = await this.buildAotuiTools();
|
|
122
|
-
this.options.agent.setTools([...this.baseTools, ...aotuiTools]);
|
|
123
|
-
await this.options.desktopManager.touchDesktop(this.sessionKey, this.options.sessionId);
|
|
124
|
-
}
|
|
125
|
-
async acquireSnapshot() {
|
|
126
|
-
await this.ensureDesktopReady();
|
|
127
|
-
return await this.options.kernel.acquireSnapshot(this.getDesktopRecord().desktopId);
|
|
128
|
-
}
|
|
129
|
-
createTool(binding) {
|
|
130
|
-
return {
|
|
131
|
-
name: binding.toolName,
|
|
132
|
-
description: binding.description,
|
|
133
|
-
parameters: binding.parameters,
|
|
134
|
-
execute: async (toolCallId, args) => await this.routeToolCall(binding.toolName, args, toolCallId),
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
async resolveBinding(toolName) {
|
|
138
|
-
const cached = this.bindingCache.get(toolName);
|
|
139
|
-
if (cached) {
|
|
140
|
-
return cached;
|
|
141
|
-
}
|
|
142
|
-
const snapshot = await this.acquireSnapshot();
|
|
143
|
-
try {
|
|
144
|
-
const bindings = this.projector.projectToolBindings(snapshot, this.getDesktopRecord());
|
|
145
|
-
this.bindingCache.clear();
|
|
146
|
-
for (const binding of bindings) {
|
|
147
|
-
this.bindingCache.set(binding.toolName, binding);
|
|
148
|
-
}
|
|
149
|
-
return this.bindingCache.get(toolName);
|
|
150
|
-
}
|
|
151
|
-
finally {
|
|
152
|
-
this.options.kernel.releaseSnapshot(snapshot.id);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
//# sourceMappingURL=agent-adapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-adapter.js","sourceRoot":"","sources":["../../../src/adapters/openclaw/agent-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/openclaw/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { AOTUIKernelService, OpenClawKernelServiceOptions, SessionDesktopManager } from './types.js';
|
|
2
|
-
export declare class DefaultAOTUIKernelService implements AOTUIKernelService {
|
|
3
|
-
private readonly options;
|
|
4
|
-
private started;
|
|
5
|
-
private kernel?;
|
|
6
|
-
private desktopManager?;
|
|
7
|
-
constructor(options?: OpenClawKernelServiceOptions);
|
|
8
|
-
start(): Promise<void>;
|
|
9
|
-
stop(reason?: string): Promise<void>;
|
|
10
|
-
isStarted(): boolean;
|
|
11
|
-
getKernel(): import("../../index.js").IKernel;
|
|
12
|
-
getDesktopManager(): SessionDesktopManager;
|
|
13
|
-
}
|
|
14
|
-
export declare function createOpenClawKernelService(options?: OpenClawKernelServiceOptions): AOTUIKernelService;
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { createRuntime } from '../../facades/facades.js';
|
|
2
|
-
import { InMemorySessionDesktopManager } from './session-desktop-manager.js';
|
|
3
|
-
export class DefaultAOTUIKernelService {
|
|
4
|
-
options;
|
|
5
|
-
started = false;
|
|
6
|
-
kernel;
|
|
7
|
-
desktopManager;
|
|
8
|
-
constructor(options = {}) {
|
|
9
|
-
this.options = options;
|
|
10
|
-
}
|
|
11
|
-
async start() {
|
|
12
|
-
if (this.started) {
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
this.kernel = createRuntime(this.options.runtimeConfig ?? {});
|
|
16
|
-
this.desktopManager = new InMemorySessionDesktopManager(this.kernel, {
|
|
17
|
-
idleSuspendMs: this.options.idleSuspendMs,
|
|
18
|
-
idleDestroyMs: this.options.idleDestroyMs,
|
|
19
|
-
});
|
|
20
|
-
this.started = true;
|
|
21
|
-
}
|
|
22
|
-
async stop(reason) {
|
|
23
|
-
if (!this.started) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
if (this.desktopManager) {
|
|
27
|
-
await this.desktopManager.destroyAll(reason ?? 'service_stop');
|
|
28
|
-
}
|
|
29
|
-
this.desktopManager = undefined;
|
|
30
|
-
this.kernel = undefined;
|
|
31
|
-
this.started = false;
|
|
32
|
-
}
|
|
33
|
-
isStarted() {
|
|
34
|
-
return this.started;
|
|
35
|
-
}
|
|
36
|
-
getKernel() {
|
|
37
|
-
if (!this.kernel) {
|
|
38
|
-
throw new Error('AOTUI kernel service has not been started');
|
|
39
|
-
}
|
|
40
|
-
return this.kernel;
|
|
41
|
-
}
|
|
42
|
-
getDesktopManager() {
|
|
43
|
-
if (!this.desktopManager) {
|
|
44
|
-
throw new Error('AOTUI kernel service has not been started');
|
|
45
|
-
}
|
|
46
|
-
return this.desktopManager;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
export function createOpenClawKernelService(options = {}) {
|
|
50
|
-
return new DefaultAOTUIKernelService(options);
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=kernel-service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kernel-service.js","sourceRoot":"","sources":["../../../src/adapters/openclaw/kernel-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAO7E,MAAM,OAAO,yBAAyB;IAKL;IAJrB,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,CAAoC;IAC1C,cAAc,CAAyB;IAE/C,YAA6B,UAAwC,EAAE;QAA1C,YAAO,GAAP,OAAO,CAAmC;IAAG,CAAC;IAE3E,KAAK,CAAC,KAAK;QACP,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACX,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,cAAc,GAAG,IAAI,6BAA6B,CAAC,IAAI,CAAC,MAAM,EAAE;YACjE,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa;YACzC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa;SAC5C,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAe;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO;QACX,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,SAAS;QACL,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,iBAAiB;QACb,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;CACJ;AAED,MAAM,UAAU,2BAA2B,CACvC,UAAwC,EAAE;IAE1C,OAAO,IAAI,yBAAyB,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { CachedSnapshot } from '../../spi/core/snapshot.js';
|
|
2
|
-
import type { AOTUISnapshotProjector, AOTUIToolBinding, DesktopRecord, OpenClawLikeMessage } from './types.js';
|
|
3
|
-
export declare function isAotuiInjectedMessage(message: OpenClawLikeMessage): boolean;
|
|
4
|
-
export declare function stripAotuiInjectedMessages(messages: OpenClawLikeMessage[]): OpenClawLikeMessage[];
|
|
5
|
-
export declare function replaceAotuiInjectedMessages(messages: OpenClawLikeMessage[], injected: OpenClawLikeMessage[]): OpenClawLikeMessage[];
|
|
6
|
-
export declare class OpenClawSnapshotProjector implements AOTUISnapshotProjector {
|
|
7
|
-
projectMessages(snapshot: CachedSnapshot, meta: DesktopRecord): OpenClawLikeMessage[];
|
|
8
|
-
projectToolBindings(snapshot: CachedSnapshot, _meta: DesktopRecord): AOTUIToolBinding[];
|
|
9
|
-
}
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
const AOTUI_METADATA_KEY = 'aotui';
|
|
2
|
-
function createInjectedMetadata(meta, snapshotId, kind, viewId) {
|
|
3
|
-
return {
|
|
4
|
-
aotui: true,
|
|
5
|
-
desktopKey: meta.desktopKey,
|
|
6
|
-
snapshotId,
|
|
7
|
-
kind,
|
|
8
|
-
...(viewId ? { viewId } : {}),
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
function isOperationEntry(entry) {
|
|
12
|
-
return typeof entry === 'object'
|
|
13
|
-
&& entry !== null
|
|
14
|
-
&& entry.type === 'operation'
|
|
15
|
-
&& typeof entry.appId === 'string'
|
|
16
|
-
&& typeof entry.operation?.id === 'string';
|
|
17
|
-
}
|
|
18
|
-
function isTypeToolEntry(entry) {
|
|
19
|
-
return typeof entry === 'object' && entry !== null;
|
|
20
|
-
}
|
|
21
|
-
function convertParamsToSchema(params) {
|
|
22
|
-
const properties = {};
|
|
23
|
-
const required = [];
|
|
24
|
-
for (const param of params ?? []) {
|
|
25
|
-
const paramType = param.type ?? 'string';
|
|
26
|
-
const property = {
|
|
27
|
-
type: paramType === 'enum' ? 'string' : paramType,
|
|
28
|
-
};
|
|
29
|
-
if (param.description) {
|
|
30
|
-
property.description = param.description;
|
|
31
|
-
}
|
|
32
|
-
if (paramType === 'enum' && Array.isArray(param.options)) {
|
|
33
|
-
property.enum = [...param.options];
|
|
34
|
-
}
|
|
35
|
-
properties[param.name] = property;
|
|
36
|
-
if (param.required) {
|
|
37
|
-
required.push(param.name);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return {
|
|
41
|
-
type: 'object',
|
|
42
|
-
properties,
|
|
43
|
-
required,
|
|
44
|
-
additionalProperties: false,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
function createViewOperation(meta) {
|
|
48
|
-
return {
|
|
49
|
-
context: {
|
|
50
|
-
appId: meta.appId,
|
|
51
|
-
snapshotId: 'latest',
|
|
52
|
-
...(meta.viewId ? { viewId: meta.viewId } : {}),
|
|
53
|
-
},
|
|
54
|
-
name: meta.operationName,
|
|
55
|
-
args: {},
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
function projectStructuredMessages(snapshot, meta) {
|
|
59
|
-
const structured = snapshot.structured;
|
|
60
|
-
if (!structured) {
|
|
61
|
-
return [];
|
|
62
|
-
}
|
|
63
|
-
const messages = [];
|
|
64
|
-
if (structured.systemInstruction) {
|
|
65
|
-
messages.push({
|
|
66
|
-
role: 'user',
|
|
67
|
-
content: structured.systemInstruction,
|
|
68
|
-
metadata: { [AOTUI_METADATA_KEY]: createInjectedMetadata(meta, snapshot.id, 'system_instruction') },
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
if (structured.desktopState) {
|
|
72
|
-
messages.push({
|
|
73
|
-
role: 'user',
|
|
74
|
-
content: structured.desktopState,
|
|
75
|
-
metadata: { [AOTUI_METADATA_KEY]: createInjectedMetadata(meta, snapshot.id, 'desktop_state') },
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
if (Array.isArray(structured.viewStates) && structured.viewStates.length > 0) {
|
|
79
|
-
for (const view of structured.viewStates) {
|
|
80
|
-
messages.push({
|
|
81
|
-
role: view.role ?? 'user',
|
|
82
|
-
content: view.markup,
|
|
83
|
-
metadata: {
|
|
84
|
-
[AOTUI_METADATA_KEY]: createInjectedMetadata(meta, snapshot.id, 'view_state', view.viewId),
|
|
85
|
-
},
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
return messages;
|
|
89
|
-
}
|
|
90
|
-
for (const fragment of structured.appStates) {
|
|
91
|
-
messages.push({
|
|
92
|
-
role: fragment.role ?? 'user',
|
|
93
|
-
content: fragment.markup,
|
|
94
|
-
metadata: {
|
|
95
|
-
[AOTUI_METADATA_KEY]: createInjectedMetadata(meta, snapshot.id, 'view_state', fragment.appId),
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
return messages;
|
|
100
|
-
}
|
|
101
|
-
export function isAotuiInjectedMessage(message) {
|
|
102
|
-
const metadata = message.metadata?.[AOTUI_METADATA_KEY];
|
|
103
|
-
return typeof metadata === 'object' && metadata !== null && metadata.aotui === true;
|
|
104
|
-
}
|
|
105
|
-
export function stripAotuiInjectedMessages(messages) {
|
|
106
|
-
return messages.filter((message) => !isAotuiInjectedMessage(message));
|
|
107
|
-
}
|
|
108
|
-
export function replaceAotuiInjectedMessages(messages, injected) {
|
|
109
|
-
return [...stripAotuiInjectedMessages(messages), ...injected];
|
|
110
|
-
}
|
|
111
|
-
export class OpenClawSnapshotProjector {
|
|
112
|
-
projectMessages(snapshot, meta) {
|
|
113
|
-
if (snapshot.structured) {
|
|
114
|
-
return projectStructuredMessages(snapshot, meta);
|
|
115
|
-
}
|
|
116
|
-
if (!snapshot.markup) {
|
|
117
|
-
return [];
|
|
118
|
-
}
|
|
119
|
-
return [
|
|
120
|
-
{
|
|
121
|
-
role: 'user',
|
|
122
|
-
content: snapshot.markup,
|
|
123
|
-
metadata: {
|
|
124
|
-
[AOTUI_METADATA_KEY]: createInjectedMetadata(meta, snapshot.id, 'desktop_state'),
|
|
125
|
-
},
|
|
126
|
-
},
|
|
127
|
-
];
|
|
128
|
-
}
|
|
129
|
-
projectToolBindings(snapshot, _meta) {
|
|
130
|
-
const bindings = [];
|
|
131
|
-
const indexMap = snapshot.indexMap;
|
|
132
|
-
for (const [key, value] of Object.entries(indexMap ?? {})) {
|
|
133
|
-
if (isOperationEntry(value)) {
|
|
134
|
-
bindings.push({
|
|
135
|
-
toolName: value.operation.id,
|
|
136
|
-
description: value.operation.displayName || value.operation.id,
|
|
137
|
-
parameters: convertParamsToSchema(value.operation.params),
|
|
138
|
-
operation: createViewOperation({
|
|
139
|
-
appId: value.appId,
|
|
140
|
-
operationName: value.operation.id,
|
|
141
|
-
}),
|
|
142
|
-
});
|
|
143
|
-
continue;
|
|
144
|
-
}
|
|
145
|
-
if (key.startsWith('tool:') && isTypeToolEntry(value)) {
|
|
146
|
-
const toolName = key.slice('tool:'.length);
|
|
147
|
-
const appId = value.appId || 'system';
|
|
148
|
-
const operationName = value.toolName || toolName;
|
|
149
|
-
bindings.push({
|
|
150
|
-
toolName,
|
|
151
|
-
description: value.description || toolName,
|
|
152
|
-
parameters: convertParamsToSchema(value.params),
|
|
153
|
-
operation: createViewOperation({
|
|
154
|
-
appId,
|
|
155
|
-
viewId: value.viewType,
|
|
156
|
-
operationName,
|
|
157
|
-
}),
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return bindings;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
//# sourceMappingURL=projector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"projector.js","sourceRoot":"","sources":["../../../src/adapters/openclaw/projector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { IKernel } from '../../spi/runtime/kernel.interface.js';
|
|
2
|
-
import type { DesktopBindingInput, DesktopRecord, SessionDesktopManager } from './types.js';
|
|
3
|
-
type SessionDesktopManagerOptions = {
|
|
4
|
-
idleSuspendMs?: number;
|
|
5
|
-
idleDestroyMs?: number;
|
|
6
|
-
afterCreate?: (record: DesktopRecord) => Promise<void> | void;
|
|
7
|
-
};
|
|
8
|
-
export declare class InMemorySessionDesktopManager implements SessionDesktopManager {
|
|
9
|
-
private readonly kernel;
|
|
10
|
-
private readonly records;
|
|
11
|
-
private readonly idleSuspendMs;
|
|
12
|
-
private readonly idleDestroyMs;
|
|
13
|
-
private readonly afterCreate?;
|
|
14
|
-
constructor(kernel: IKernel, options?: SessionDesktopManagerOptions);
|
|
15
|
-
ensureDesktop(input: DesktopBindingInput): Promise<DesktopRecord>;
|
|
16
|
-
touchDesktop(sessionKey: string, sessionId?: string): Promise<void>;
|
|
17
|
-
suspendDesktop(sessionKey: string, _reason?: string): Promise<void>;
|
|
18
|
-
resumeDesktop(sessionKey: string): Promise<void>;
|
|
19
|
-
resetDesktop(sessionKey: string, next?: {
|
|
20
|
-
sessionId?: string;
|
|
21
|
-
reason?: string;
|
|
22
|
-
}): Promise<DesktopRecord>;
|
|
23
|
-
destroyDesktop(sessionKey: string, _reason?: string): Promise<void>;
|
|
24
|
-
destroyAll(reason?: string): Promise<void>;
|
|
25
|
-
getDesktop(sessionKey: string): DesktopRecord | undefined;
|
|
26
|
-
listDesktops(): DesktopRecord[];
|
|
27
|
-
sweepIdle(now?: number): Promise<void>;
|
|
28
|
-
}
|
|
29
|
-
export {};
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
function normalizeSessionKey(sessionKey) {
|
|
2
|
-
return sessionKey.trim().toLowerCase();
|
|
3
|
-
}
|
|
4
|
-
function normalizeAgentId(agentId) {
|
|
5
|
-
return agentId?.trim().toLowerCase() || 'main';
|
|
6
|
-
}
|
|
7
|
-
function parseThreadInfo(sessionKey) {
|
|
8
|
-
const normalized = normalizeSessionKey(sessionKey);
|
|
9
|
-
const topicIndex = normalized.lastIndexOf(':topic:');
|
|
10
|
-
const threadIndex = normalized.lastIndexOf(':thread:');
|
|
11
|
-
const markerIndex = Math.max(topicIndex, threadIndex);
|
|
12
|
-
const marker = topicIndex > threadIndex ? ':topic:' : ':thread:';
|
|
13
|
-
if (markerIndex === -1) {
|
|
14
|
-
return {};
|
|
15
|
-
}
|
|
16
|
-
const baseSessionKey = normalized.slice(0, markerIndex);
|
|
17
|
-
const threadId = normalized.slice(markerIndex + marker.length) || undefined;
|
|
18
|
-
return { baseSessionKey, threadId };
|
|
19
|
-
}
|
|
20
|
-
function toDesktopId(sessionKey) {
|
|
21
|
-
return normalizeSessionKey(sessionKey);
|
|
22
|
-
}
|
|
23
|
-
export class InMemorySessionDesktopManager {
|
|
24
|
-
kernel;
|
|
25
|
-
records = new Map();
|
|
26
|
-
idleSuspendMs;
|
|
27
|
-
idleDestroyMs;
|
|
28
|
-
afterCreate;
|
|
29
|
-
constructor(kernel, options = {}) {
|
|
30
|
-
this.kernel = kernel;
|
|
31
|
-
this.idleSuspendMs = options.idleSuspendMs ?? 5 * 60_000;
|
|
32
|
-
this.idleDestroyMs = options.idleDestroyMs ?? 60 * 60_000;
|
|
33
|
-
this.afterCreate = options.afterCreate;
|
|
34
|
-
}
|
|
35
|
-
async ensureDesktop(input) {
|
|
36
|
-
const sessionKey = normalizeSessionKey(input.sessionKey);
|
|
37
|
-
const existing = this.records.get(sessionKey);
|
|
38
|
-
if (existing) {
|
|
39
|
-
existing.lastActiveAt = Date.now();
|
|
40
|
-
existing.sessionId = input.sessionId ?? existing.sessionId;
|
|
41
|
-
if (existing.status === 'suspended') {
|
|
42
|
-
await this.kernel.resume(existing.desktopId);
|
|
43
|
-
}
|
|
44
|
-
existing.status = 'active';
|
|
45
|
-
return existing;
|
|
46
|
-
}
|
|
47
|
-
const { baseSessionKey, threadId } = parseThreadInfo(sessionKey);
|
|
48
|
-
const desktopId = await this.kernel.createDesktop(toDesktopId(sessionKey));
|
|
49
|
-
const record = {
|
|
50
|
-
desktopKey: sessionKey,
|
|
51
|
-
desktopId,
|
|
52
|
-
sessionKey,
|
|
53
|
-
...(baseSessionKey ? { baseSessionKey } : {}),
|
|
54
|
-
...(input.parentSessionKey ? { parentSessionKey: normalizeSessionKey(input.parentSessionKey) } : {}),
|
|
55
|
-
...(threadId ? { threadId } : {}),
|
|
56
|
-
...(input.sessionId ? { sessionId: input.sessionId } : {}),
|
|
57
|
-
agentId: normalizeAgentId(input.agentId),
|
|
58
|
-
createdAt: Date.now(),
|
|
59
|
-
lastActiveAt: Date.now(),
|
|
60
|
-
status: 'active',
|
|
61
|
-
};
|
|
62
|
-
this.records.set(sessionKey, record);
|
|
63
|
-
if (this.afterCreate) {
|
|
64
|
-
await this.afterCreate(record);
|
|
65
|
-
}
|
|
66
|
-
return record;
|
|
67
|
-
}
|
|
68
|
-
async touchDesktop(sessionKey, sessionId) {
|
|
69
|
-
const record = this.records.get(normalizeSessionKey(sessionKey));
|
|
70
|
-
if (!record) {
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
record.lastActiveAt = Date.now();
|
|
74
|
-
record.status = 'active';
|
|
75
|
-
if (sessionId) {
|
|
76
|
-
record.sessionId = sessionId;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
async suspendDesktop(sessionKey, _reason) {
|
|
80
|
-
const record = this.records.get(normalizeSessionKey(sessionKey));
|
|
81
|
-
if (!record || record.status === 'suspended') {
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
await this.kernel.suspend(record.desktopId);
|
|
85
|
-
record.status = 'suspended';
|
|
86
|
-
}
|
|
87
|
-
async resumeDesktop(sessionKey) {
|
|
88
|
-
const record = this.records.get(normalizeSessionKey(sessionKey));
|
|
89
|
-
if (!record) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
await this.kernel.resume(record.desktopId);
|
|
93
|
-
record.status = 'active';
|
|
94
|
-
record.lastActiveAt = Date.now();
|
|
95
|
-
}
|
|
96
|
-
async resetDesktop(sessionKey, next) {
|
|
97
|
-
await this.destroyDesktop(sessionKey, next?.reason);
|
|
98
|
-
return await this.ensureDesktop({ sessionKey, sessionId: next?.sessionId });
|
|
99
|
-
}
|
|
100
|
-
async destroyDesktop(sessionKey, _reason) {
|
|
101
|
-
const normalized = normalizeSessionKey(sessionKey);
|
|
102
|
-
const record = this.records.get(normalized);
|
|
103
|
-
if (!record) {
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
record.status = 'destroying';
|
|
107
|
-
await this.kernel.destroyDesktop(record.desktopId);
|
|
108
|
-
this.records.delete(normalized);
|
|
109
|
-
}
|
|
110
|
-
async destroyAll(reason) {
|
|
111
|
-
const keys = Array.from(this.records.keys());
|
|
112
|
-
for (const sessionKey of keys) {
|
|
113
|
-
await this.destroyDesktop(sessionKey, reason);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
getDesktop(sessionKey) {
|
|
117
|
-
return this.records.get(normalizeSessionKey(sessionKey));
|
|
118
|
-
}
|
|
119
|
-
listDesktops() {
|
|
120
|
-
return Array.from(this.records.values());
|
|
121
|
-
}
|
|
122
|
-
async sweepIdle(now = Date.now()) {
|
|
123
|
-
for (const record of this.records.values()) {
|
|
124
|
-
const idleMs = now - record.lastActiveAt;
|
|
125
|
-
if (idleMs >= this.idleDestroyMs) {
|
|
126
|
-
await this.destroyDesktop(record.sessionKey, 'idle_destroy');
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
if (idleMs >= this.idleSuspendMs && record.status === 'active') {
|
|
130
|
-
await this.suspendDesktop(record.sessionKey, 'idle_suspend');
|
|
131
|
-
record.status = 'idle';
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
//# sourceMappingURL=session-desktop-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-desktop-manager.js","sourceRoot":"","sources":["../../../src/adapters/openclaw/session-desktop-manager.ts"],"names":[],"mappings":"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"}
|