@aotui/runtime 1.0.3 → 1.0.5
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/openclaw/agent-adapter.d.ts +37 -0
- package/dist/adapters/openclaw/agent-adapter.js +156 -0
- package/dist/adapters/openclaw/agent-adapter.js.map +1 -0
- package/dist/adapters/openclaw/index.d.ts +5 -0
- package/dist/adapters/openclaw/index.js +6 -0
- package/dist/adapters/openclaw/index.js.map +1 -0
- package/dist/adapters/openclaw/kernel-service.d.ts +14 -0
- package/dist/adapters/openclaw/kernel-service.js +52 -0
- package/dist/adapters/openclaw/kernel-service.js.map +1 -0
- package/dist/adapters/openclaw/projector.d.ts +9 -0
- package/dist/adapters/openclaw/projector.js +164 -0
- package/dist/adapters/openclaw/projector.js.map +1 -0
- package/dist/adapters/openclaw/session-desktop-manager.d.ts +29 -0
- package/dist/adapters/openclaw/session-desktop-manager.js +136 -0
- package/dist/adapters/openclaw/session-desktop-manager.js.map +1 -0
- package/dist/adapters/openclaw/types.d.ts +102 -0
- package/dist/adapters/openclaw/types.js +2 -0
- package/dist/adapters/openclaw/types.js.map +1 -0
- package/dist/engine/app/manager.d.ts +8 -1
- package/dist/engine/app/manager.js +24 -9
- package/dist/engine/app/manager.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { IKernel } from '../../spi/runtime/kernel.interface.js';
|
|
2
|
+
import type { AOTUIAgentAdapter, AOTUISnapshotProjector, DesktopRecord, OpenClawLikeAgentRuntime, OpenClawLikeMessage, OpenClawLikeTool, SessionDesktopManager } from './types.js';
|
|
3
|
+
type OpenClawAgentAdapterOptions = {
|
|
4
|
+
sessionKey: string;
|
|
5
|
+
sessionId?: string;
|
|
6
|
+
agentId?: string;
|
|
7
|
+
kernel: IKernel;
|
|
8
|
+
desktopManager: SessionDesktopManager;
|
|
9
|
+
agent: OpenClawLikeAgentRuntime;
|
|
10
|
+
baseTools?: OpenClawLikeTool[];
|
|
11
|
+
projector?: AOTUISnapshotProjector;
|
|
12
|
+
ownerId?: string;
|
|
13
|
+
};
|
|
14
|
+
export declare class OpenClawAgentAdapter implements AOTUIAgentAdapter {
|
|
15
|
+
private readonly options;
|
|
16
|
+
private readonly sessionKey;
|
|
17
|
+
private readonly ownerId;
|
|
18
|
+
private readonly baseTools;
|
|
19
|
+
private readonly projector;
|
|
20
|
+
private readonly bindingCache;
|
|
21
|
+
private originalTransformContext?;
|
|
22
|
+
private desktopRecord?;
|
|
23
|
+
constructor(options: OpenClawAgentAdapterOptions);
|
|
24
|
+
install(): Promise<void>;
|
|
25
|
+
dispose(): Promise<void>;
|
|
26
|
+
getSessionKey(): string;
|
|
27
|
+
getDesktopRecord(): DesktopRecord;
|
|
28
|
+
ensureDesktopReady(): Promise<void>;
|
|
29
|
+
buildAotuiMessages(): Promise<OpenClawLikeMessage[]>;
|
|
30
|
+
buildAotuiTools(): Promise<OpenClawLikeTool[]>;
|
|
31
|
+
routeToolCall(toolName: string, args: unknown, toolCallId: string): Promise<unknown>;
|
|
32
|
+
refreshToolsAndContext(): Promise<void>;
|
|
33
|
+
private acquireSnapshot;
|
|
34
|
+
private createTool;
|
|
35
|
+
private resolveBinding;
|
|
36
|
+
}
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,156 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-adapter.js","sourceRoot":"","sources":["../../../src/adapters/openclaw/agent-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
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;
|
|
@@ -0,0 +1,52 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projector.js","sourceRoot":"","sources":["../../../src/adapters/openclaw/projector.ts"],"names":[],"mappings":"AAsCA,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEnC,SAAS,sBAAsB,CAAC,IAAmB,EAAE,UAAkB,EAAE,IAAsC,EAAE,MAAe;IAC5H,OAAO;QACH,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU;QACV,IAAI;QACJ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC;AACN,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ;WACzB,KAAK,KAAK,IAAI;WACb,KAA4B,CAAC,IAAI,KAAK,WAAW;WAClD,OAAQ,KAA4B,CAAC,KAAK,KAAK,QAAQ;WACvD,OAAQ,KAA4B,CAAC,SAAS,EAAE,EAAE,KAAK,QAAQ,CAAC;AAC3E,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACvD,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAwC;IACnE,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC;QACzC,MAAM,QAAQ,GAA4B;YACtC,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACpD,CAAC;QAEF,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACpB,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAC7C,CAAC;QACD,IAAI,SAAS,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAED,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;QAClC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,OAAO;QACH,IAAI,EAAE,QAAQ;QACd,UAAU;QACV,QAAQ;QACR,oBAAoB,EAAE,KAAK;KAC9B,CAAC;AACN,CAAC;AAED,SAAS,mBAAmB,CAAC,IAI5B;IACG,OAAO;QACH,OAAO,EAAE;YACL,KAAK,EAAE,IAAI,CAAC,KAAsC;YAClD,UAAU,EAAE,QAA8C;YAC1D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAwC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpF;QACD,IAAI,EAAE,IAAI,CAAC,aAAkC;QAC7C,IAAI,EAAE,EAAE;KACX,CAAC;AACN,CAAC;AAED,SAAS,yBAAyB,CAAC,QAAwB,EAAE,IAAmB;IAC5E,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;IACvC,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,IAAI,UAAU,CAAC,iBAAiB,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,UAAU,CAAC,iBAAiB;YACrC,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,oBAAoB,CAAC,EAAE;SACtG,CAAC,CAAC;IACP,CAAC;IAED,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,UAAU,CAAC,YAAY;YAChC,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC,EAAE;SACjG,CAAC,CAAC;IACP,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3E,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,MAAM;gBACzB,OAAO,EAAE,IAAI,CAAC,MAAM;gBACpB,QAAQ,EAAE;oBACN,CAAC,kBAAkB,CAAC,EAAE,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC;iBAC7F;aACJ,CAAC,CAAC;QACP,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,MAAM;YAC7B,OAAO,EAAE,QAAQ,CAAC,MAAM;YACxB,QAAQ,EAAE;gBACN,CAAC,kBAAkB,CAAC,EAAE,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC;aAChG;SACJ,CAAC,CAAC;IACP,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAA4B;IAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,kBAAkB,CAAC,CAAC;IACxD,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAK,QAAqC,CAAC,KAAK,KAAK,IAAI,CAAC;AACtH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAA+B;IACtE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,4BAA4B,CACxC,QAA+B,EAC/B,QAA+B;IAE/B,OAAO,CAAC,GAAG,0BAA0B,CAAC,QAAQ,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,OAAO,yBAAyB;IAClC,eAAe,CAAC,QAAwB,EAAE,IAAmB;QACzD,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,OAAO,yBAAyB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACd,CAAC;QAED,OAAO;YACH;gBACI,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,QAAQ,CAAC,MAAM;gBACxB,QAAQ,EAAE;oBACN,CAAC,kBAAkB,CAAC,EAAE,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;iBACnF;aACJ;SACJ,CAAC;IACN,CAAC;IAED,mBAAmB,CAAC,QAAwB,EAAE,KAAoB;QAC9D,MAAM,QAAQ,GAAuB,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAgC,CAAC;QAE3D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;YACxD,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE;oBAC5B,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE;oBAC9D,UAAU,EAAE,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;oBACzD,SAAS,EAAE,mBAAmB,CAAC;wBAC3B,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE;qBACpC,CAAC;iBACL,CAAC,CAAC;gBACH,SAAS;YACb,CAAC;YAED,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC;gBACtC,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC;gBACjD,QAAQ,CAAC,IAAI,CAAC;oBACV,QAAQ;oBACR,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ;oBAC1C,UAAU,EAAE,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC/C,SAAS,EAAE,mBAAmB,CAAC;wBAC3B,KAAK;wBACL,MAAM,EAAE,KAAK,CAAC,QAAQ;wBACtB,aAAa;qBAChB,CAAC;iBACL,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ"}
|
|
@@ -0,0 +1,29 @@
|
|
|
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 {};
|
|
@@ -0,0 +1,136 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-desktop-manager.js","sourceRoot":"","sources":["../../../src/adapters/openclaw/session-desktop-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { Operation } from '../../spi/core/operations.js';
|
|
2
|
+
import type { CachedSnapshot } from '../../spi/core/snapshot.js';
|
|
3
|
+
import type { DesktopID } from '../../spi/core/types.js';
|
|
4
|
+
import type { IKernel } from '../../spi/runtime/kernel.interface.js';
|
|
5
|
+
import type { RuntimeConfigInput } from '../../facades/facades.js';
|
|
6
|
+
export type OpenClawLikeMessageRole = 'system' | 'user' | 'assistant' | 'tool';
|
|
7
|
+
export type OpenClawLikeMessage = {
|
|
8
|
+
role: OpenClawLikeMessageRole;
|
|
9
|
+
content: unknown;
|
|
10
|
+
metadata?: Record<string, unknown>;
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
};
|
|
13
|
+
export type OpenClawLikeTool = {
|
|
14
|
+
name: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
parameters?: Record<string, unknown>;
|
|
17
|
+
execute: (toolCallId: string, args: unknown, signal?: AbortSignal, onUpdate?: (update: unknown) => void) => Promise<unknown>;
|
|
18
|
+
};
|
|
19
|
+
export type OpenClawLikeAgentRuntime = {
|
|
20
|
+
setTools(tools: OpenClawLikeTool[]): void;
|
|
21
|
+
transformContext?: (messages: OpenClawLikeMessage[], signal?: AbortSignal) => Promise<OpenClawLikeMessage[]>;
|
|
22
|
+
};
|
|
23
|
+
export type AOTUIInjectedMessageKind = 'system_instruction' | 'desktop_state' | 'view_state';
|
|
24
|
+
export type AOTUIInjectedMessageMeta = {
|
|
25
|
+
aotui: true;
|
|
26
|
+
desktopKey: string;
|
|
27
|
+
snapshotId: string;
|
|
28
|
+
kind: AOTUIInjectedMessageKind;
|
|
29
|
+
viewId?: string;
|
|
30
|
+
};
|
|
31
|
+
export type DesktopBindingInput = {
|
|
32
|
+
sessionKey: string;
|
|
33
|
+
sessionId?: string;
|
|
34
|
+
agentId?: string;
|
|
35
|
+
channelId?: string;
|
|
36
|
+
accountId?: string;
|
|
37
|
+
threadId?: string | number;
|
|
38
|
+
parentSessionKey?: string;
|
|
39
|
+
workspaceDir?: string;
|
|
40
|
+
};
|
|
41
|
+
export type DesktopRecordStatus = 'active' | 'idle' | 'suspended' | 'destroying';
|
|
42
|
+
export type DesktopRecord = {
|
|
43
|
+
desktopKey: string;
|
|
44
|
+
desktopId: DesktopID;
|
|
45
|
+
sessionKey: string;
|
|
46
|
+
baseSessionKey?: string;
|
|
47
|
+
parentSessionKey?: string;
|
|
48
|
+
threadId?: string;
|
|
49
|
+
sessionId?: string;
|
|
50
|
+
agentId: string;
|
|
51
|
+
createdAt: number;
|
|
52
|
+
lastActiveAt: number;
|
|
53
|
+
status: DesktopRecordStatus;
|
|
54
|
+
};
|
|
55
|
+
export type AOTUIToolBinding = {
|
|
56
|
+
toolName: string;
|
|
57
|
+
description: string;
|
|
58
|
+
parameters?: Record<string, unknown>;
|
|
59
|
+
operation: Operation;
|
|
60
|
+
};
|
|
61
|
+
export interface SessionDesktopManager {
|
|
62
|
+
ensureDesktop(input: DesktopBindingInput): Promise<DesktopRecord>;
|
|
63
|
+
touchDesktop(sessionKey: string, sessionId?: string): Promise<void>;
|
|
64
|
+
suspendDesktop(sessionKey: string, reason?: string): Promise<void>;
|
|
65
|
+
resumeDesktop(sessionKey: string): Promise<void>;
|
|
66
|
+
resetDesktop(sessionKey: string, next?: {
|
|
67
|
+
sessionId?: string;
|
|
68
|
+
reason?: string;
|
|
69
|
+
}): Promise<DesktopRecord>;
|
|
70
|
+
destroyDesktop(sessionKey: string, reason?: string): Promise<void>;
|
|
71
|
+
destroyAll(reason?: string): Promise<void>;
|
|
72
|
+
getDesktop(sessionKey: string): DesktopRecord | undefined;
|
|
73
|
+
listDesktops(): DesktopRecord[];
|
|
74
|
+
sweepIdle(now?: number): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
export interface AOTUISnapshotProjector {
|
|
77
|
+
projectMessages(snapshot: CachedSnapshot, meta: DesktopRecord): OpenClawLikeMessage[];
|
|
78
|
+
projectToolBindings(snapshot: CachedSnapshot, meta: DesktopRecord): AOTUIToolBinding[];
|
|
79
|
+
}
|
|
80
|
+
export interface AOTUIAgentAdapter {
|
|
81
|
+
install(): Promise<void>;
|
|
82
|
+
dispose(): Promise<void>;
|
|
83
|
+
getSessionKey(): string;
|
|
84
|
+
getDesktopRecord(): DesktopRecord;
|
|
85
|
+
ensureDesktopReady(): Promise<void>;
|
|
86
|
+
buildAotuiMessages(): Promise<OpenClawLikeMessage[]>;
|
|
87
|
+
buildAotuiTools(): Promise<OpenClawLikeTool[]>;
|
|
88
|
+
routeToolCall(toolName: string, args: unknown, toolCallId: string): Promise<unknown>;
|
|
89
|
+
refreshToolsAndContext(): Promise<void>;
|
|
90
|
+
}
|
|
91
|
+
export interface AOTUIKernelService {
|
|
92
|
+
start(): Promise<void>;
|
|
93
|
+
stop(reason?: string): Promise<void>;
|
|
94
|
+
isStarted(): boolean;
|
|
95
|
+
getKernel(): IKernel;
|
|
96
|
+
getDesktopManager(): SessionDesktopManager;
|
|
97
|
+
}
|
|
98
|
+
export type OpenClawKernelServiceOptions = {
|
|
99
|
+
runtimeConfig?: RuntimeConfigInput;
|
|
100
|
+
idleSuspendMs?: number;
|
|
101
|
+
idleDestroyMs?: number;
|
|
102
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/openclaw/types.ts"],"names":[],"mappings":""}
|
|
@@ -42,6 +42,10 @@ export interface InstalledApp {
|
|
|
42
42
|
modulePath?: string;
|
|
43
43
|
/** [RFC-014] 懒加载: Worker 脚本路径 */
|
|
44
44
|
workerScript?: string;
|
|
45
|
+
/** [RFC-025] Reopen 时复用的启动配置 */
|
|
46
|
+
config?: import('../../spi/app/app-config.interface.js').AppLaunchConfig;
|
|
47
|
+
/** [RFC-005] Reopen 时复用的 Runtime 配置 */
|
|
48
|
+
runtimeConfig?: import('../../spi/config/index.js').RuntimeConfig;
|
|
45
49
|
/** [RFC-014] 消息角色 */
|
|
46
50
|
promptRole?: 'user' | 'assistant';
|
|
47
51
|
}
|
|
@@ -131,7 +135,10 @@ export declare class AppManager {
|
|
|
131
135
|
*/
|
|
132
136
|
openApp(appId: AppID): Promise<void>;
|
|
133
137
|
/**
|
|
134
|
-
* 关闭指定 App
|
|
138
|
+
* 关闭指定 App
|
|
139
|
+
*
|
|
140
|
+
* 关闭后会真正释放 Worker,并把 App 从活动 Snapshot/Tool 集合中移除。
|
|
141
|
+
* 安装元数据会保留,因此后续仍可通过 open_app 重新启动。
|
|
135
142
|
*/
|
|
136
143
|
closeApp(appId: AppID): Promise<void>;
|
|
137
144
|
/**
|
|
@@ -80,6 +80,10 @@ export class AppManager {
|
|
|
80
80
|
html: '', // 初始为空,之后通过 mirrorDOM 同步
|
|
81
81
|
status: 'running',
|
|
82
82
|
installedAt: Date.now(),
|
|
83
|
+
modulePath: appModulePath,
|
|
84
|
+
workerScript: options?.workerScriptPath,
|
|
85
|
+
config: options?.config,
|
|
86
|
+
runtimeConfig: options?.runtimeConfig,
|
|
83
87
|
promptRole: options?.promptRole,
|
|
84
88
|
});
|
|
85
89
|
this.desktop.logSystem(`Installed Worker app: ${appId}`);
|
|
@@ -106,6 +110,8 @@ export class AppManager {
|
|
|
106
110
|
installedAt: Date.now(),
|
|
107
111
|
modulePath: options.modulePath,
|
|
108
112
|
workerScript: options.workerScriptPath,
|
|
113
|
+
config: undefined,
|
|
114
|
+
runtimeConfig: undefined,
|
|
109
115
|
promptRole: options.promptRole,
|
|
110
116
|
});
|
|
111
117
|
this.desktop.logSystem(`Registered pending app: ${appId} (${options.name ?? 'unnamed'})`);
|
|
@@ -122,8 +128,8 @@ export class AppManager {
|
|
|
122
128
|
console.warn(`[AppManager] Cannot start ${appId}: not found`);
|
|
123
129
|
return false;
|
|
124
130
|
}
|
|
125
|
-
if (app.status !== 'pending') {
|
|
126
|
-
console.warn(`[AppManager] App ${appId} is not
|
|
131
|
+
if (app.status !== 'pending' && app.status !== 'closed') {
|
|
132
|
+
console.warn(`[AppManager] App ${appId} is not startable (status: ${app.status})`);
|
|
127
133
|
return false;
|
|
128
134
|
}
|
|
129
135
|
if (!app.modulePath) {
|
|
@@ -135,10 +141,14 @@ export class AppManager {
|
|
|
135
141
|
appId,
|
|
136
142
|
name: app.name,
|
|
137
143
|
description: app.description,
|
|
144
|
+
whatItIs: app.whatItIs,
|
|
145
|
+
whenToUse: app.whenToUse,
|
|
138
146
|
workerScriptPath: app.workerScript,
|
|
147
|
+
config: app.config,
|
|
148
|
+
runtimeConfig: app.runtimeConfig,
|
|
139
149
|
promptRole: app.promptRole,
|
|
140
150
|
});
|
|
141
|
-
this.desktop.logSystem(`Started
|
|
151
|
+
this.desktop.logSystem(`Started staged app: ${appId}`);
|
|
142
152
|
return true;
|
|
143
153
|
}
|
|
144
154
|
// ════════════════════════════════════════════════════════════════
|
|
@@ -193,15 +203,15 @@ export class AppManager {
|
|
|
193
203
|
* 打开指定 App (显示已关闭/折叠的 App)
|
|
194
204
|
*/
|
|
195
205
|
async openApp(appId) {
|
|
196
|
-
// [RFC-014] Check if app is pending and start it
|
|
206
|
+
// [RFC-014] Check if app is staged (pending/closed) and start it
|
|
197
207
|
const app = this.installedApps.get(appId);
|
|
198
|
-
if (app
|
|
208
|
+
if (app && (app.status === 'pending' || app.status === 'closed')) {
|
|
199
209
|
const started = await this.startPendingApp(appId);
|
|
200
210
|
if (!started) {
|
|
201
|
-
console.warn(`Failed to start
|
|
211
|
+
console.warn(`Failed to start staged app ${appId}`);
|
|
202
212
|
return;
|
|
203
213
|
}
|
|
204
|
-
|
|
214
|
+
return;
|
|
205
215
|
}
|
|
206
216
|
const worker = this.workers.get(appId);
|
|
207
217
|
if (!worker) {
|
|
@@ -216,13 +226,18 @@ export class AppManager {
|
|
|
216
226
|
this.desktop.emitSignal('app_opened');
|
|
217
227
|
}
|
|
218
228
|
/**
|
|
219
|
-
* 关闭指定 App
|
|
229
|
+
* 关闭指定 App
|
|
230
|
+
*
|
|
231
|
+
* 关闭后会真正释放 Worker,并把 App 从活动 Snapshot/Tool 集合中移除。
|
|
232
|
+
* 安装元数据会保留,因此后续仍可通过 open_app 重新启动。
|
|
220
233
|
*/
|
|
221
234
|
async closeApp(appId) {
|
|
222
235
|
const worker = this.workers.get(appId);
|
|
223
236
|
if (!worker)
|
|
224
237
|
return;
|
|
225
|
-
|
|
238
|
+
await worker.close();
|
|
239
|
+
worker.dispose();
|
|
240
|
+
this.workers.delete(appId);
|
|
226
241
|
const app = this.installedApps.get(appId);
|
|
227
242
|
if (app)
|
|
228
243
|
app.status = 'closed';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/engine/app/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAsB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/engine/app/manager.ts"],"names":[],"mappings":"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"}
|