@xenosystem/agent-interface-electron-host 0.1.25 → 0.1.27
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/sdkAgent.d.ts +48 -10
- package/dist/sdkAgent.d.ts.map +1 -1
- package/dist/sdkAgent.js +175 -64
- package/dist/sdkAgent.js.map +1 -1
- package/dist/sdkExecutionSettlement.d.ts +27 -0
- package/dist/sdkExecutionSettlement.d.ts.map +1 -0
- package/dist/sdkExecutionSettlement.js +53 -0
- package/dist/sdkExecutionSettlement.js.map +1 -0
- package/dist/sdkNativeHeadlessRunner.d.ts +2 -0
- package/dist/sdkNativeHeadlessRunner.d.ts.map +1 -1
- package/dist/sdkNativeHeadlessRunner.js +9 -0
- package/dist/sdkNativeHeadlessRunner.js.map +1 -1
- package/dist/sdkNativeRunner.d.ts +2 -0
- package/dist/sdkNativeRunner.d.ts.map +1 -1
- package/dist/sdkNativeRunner.js +8 -0
- package/dist/sdkNativeRunner.js.map +1 -1
- package/dist/sdkReasoning.d.ts +3 -0
- package/dist/sdkReasoning.d.ts.map +1 -0
- package/dist/sdkReasoning.js +7 -0
- package/dist/sdkReasoning.js.map +1 -0
- package/dist/sdkSessionMutationAuthority.d.ts +26 -0
- package/dist/sdkSessionMutationAuthority.d.ts.map +1 -0
- package/dist/sdkSessionMutationAuthority.js +165 -0
- package/dist/sdkSessionMutationAuthority.js.map +1 -0
- package/dist/toolCategoryPolicy.d.ts +9 -0
- package/dist/toolCategoryPolicy.d.ts.map +1 -0
- package/dist/toolCategoryPolicy.js +36 -0
- package/dist/toolCategoryPolicy.js.map +1 -0
- package/dist/workspaceEnvironmentTools.d.ts +7 -0
- package/dist/workspaceEnvironmentTools.d.ts.map +1 -0
- package/dist/workspaceEnvironmentTools.js +24 -0
- package/dist/workspaceEnvironmentTools.js.map +1 -0
- package/package.json +2 -2
package/dist/sdkAgent.d.ts
CHANGED
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
* built-in tools (Read, Write, Edit, Glob, Grep, Bash).
|
|
10
10
|
*/
|
|
11
11
|
import { type PermissionWaitListener } from '@xenosystem/agent-interface-host';
|
|
12
|
-
import { type
|
|
12
|
+
import { type CommandExecutionPort } from '@xenosystem/agent-interface-host/node';
|
|
13
|
+
import { type SdkExecutionSettlementRegistry } from '@xenosystem/agent-interface-host/node';
|
|
13
14
|
export type { SdkAgentSurface } from './sdkAgentSurface.js';
|
|
14
15
|
import type { SdkAgentSurface } from './sdkAgentSurface.js';
|
|
15
16
|
import { type AgentPermissionProfileName, type AgentSandboxCapabilities, type RuntimeEventEnvelope, type RuntimeEventStore } from '@xenosystem/agent-interface-host/node';
|
|
@@ -58,6 +59,31 @@ export declare function injectContextIntoActiveRun(conversationId: string, input
|
|
|
58
59
|
pendingCount: number;
|
|
59
60
|
} | undefined>;
|
|
60
61
|
export declare function logAgentDebug(message: string, meta?: Record<string, unknown>): void;
|
|
62
|
+
declare function loadSdk(): Promise<{
|
|
63
|
+
AgentLoop: typeof import("@xenosystem/agent-sdk")["AgentLoop"];
|
|
64
|
+
AGENT_EFFORT_LEVELS: typeof import("@xenosystem/agent-sdk")["AGENT_EFFORT_LEVELS"];
|
|
65
|
+
ToolRegistry: typeof import("@xenosystem/agent-sdk")["ToolRegistry"];
|
|
66
|
+
createDefaultToolRegistry: typeof import("@xenosystem/agent-sdk")["createDefaultToolRegistry"];
|
|
67
|
+
createWebContextRequestFactory: typeof import("@xenosystem/agent-sdk")["createWebContextRequestFactory"];
|
|
68
|
+
compileAgentProfile: typeof import("@xenosystem/agent-sdk")["compileAgentProfile"];
|
|
69
|
+
resolveBuiltInAgentProfile: typeof import("@xenosystem/agent-sdk")["resolveBuiltInAgentProfile"];
|
|
70
|
+
createXenoHostGovernedAutomationRuntime: typeof import("@xenosystem/agent-sdk")["createXenoHostGovernedAutomationRuntime"];
|
|
71
|
+
readXenoHostAutomationEnvironment: typeof import("@xenosystem/agent-sdk")["readXenoHostAutomationEnvironment"];
|
|
72
|
+
PermissionEngine: typeof import("@xenosystem/agent-sdk")["PermissionEngine"];
|
|
73
|
+
createAuditBackedPermissionEngine: typeof import("@xenosystem/agent-sdk")["createAuditBackedPermissionEngine"];
|
|
74
|
+
SessionManager: typeof import("@xenosystem/agent-sdk")["SessionManager"];
|
|
75
|
+
SessionRegistry: typeof import("@xenosystem/agent-sdk")["SessionRegistry"];
|
|
76
|
+
getAgentHome: typeof import("@xenosystem/agent-sdk")["getAgentHome"];
|
|
77
|
+
CheckpointManager: typeof import("@xenosystem/agent-sdk")["CheckpointManager"];
|
|
78
|
+
XenoRuntimeEventBus: typeof import("@xenosystem/agent-sdk")["XenoRuntimeEventBus"];
|
|
79
|
+
TurnDiffTracker: typeof import("@xenosystem/agent-sdk")["TurnDiffTracker"];
|
|
80
|
+
initializeSessionRuntime: typeof import("@xenosystem/agent-sdk")["initializeSessionRuntime"];
|
|
81
|
+
activateSessionRuntime: typeof import("@xenosystem/agent-sdk")["activateSessionRuntime"];
|
|
82
|
+
cleanupSessionRuntime: typeof import("@xenosystem/agent-sdk")["cleanupSessionRuntime"];
|
|
83
|
+
taskOutputTool: typeof import("@xenosystem/agent-sdk")["taskOutputTool"];
|
|
84
|
+
taskStopTool: typeof import("@xenosystem/agent-sdk")["taskStopTool"];
|
|
85
|
+
backgroundProcessManager: unknown;
|
|
86
|
+
}>;
|
|
61
87
|
interface SdkGovernedAutomationModulePort {
|
|
62
88
|
compileAgentProfile: typeof import('@xenosystem/agent-sdk')['compileAgentProfile'];
|
|
63
89
|
resolveBuiltInAgentProfile: typeof import('@xenosystem/agent-sdk')['resolveBuiltInAgentProfile'];
|
|
@@ -81,6 +107,11 @@ export declare function registerSdkNativeGovernedAutomationTools(options: {
|
|
|
81
107
|
}): number;
|
|
82
108
|
export type { AgentPermissionProfileName, AgentSandboxCapabilities, } from '@xenosystem/agent-interface-host/node';
|
|
83
109
|
export interface SdkAgentRunOptions {
|
|
110
|
+
settlementRegistry?: SdkExecutionSettlementRegistry;
|
|
111
|
+
workspaceEnvironment?: {
|
|
112
|
+
values: Record<string, string>;
|
|
113
|
+
redact(value: Record<string, unknown>): Record<string, unknown>;
|
|
114
|
+
};
|
|
84
115
|
requestId: string;
|
|
85
116
|
conversationId?: string;
|
|
86
117
|
hostBinding?: {
|
|
@@ -107,6 +138,7 @@ export interface SdkAgentRunOptions {
|
|
|
107
138
|
systemPrompt?: string;
|
|
108
139
|
maxIterations?: number;
|
|
109
140
|
enableThinking?: boolean;
|
|
141
|
+
reasoningEffort?: string;
|
|
110
142
|
getAuthToken: () => string | null;
|
|
111
143
|
getPlatformAuthToken?: () => string | null;
|
|
112
144
|
mainWindow: SdkAgentSurface;
|
|
@@ -157,14 +189,7 @@ export interface SdkAgentRunOptions {
|
|
|
157
189
|
}
|
|
158
190
|
export interface AgentCommandExecutionEnvironment {
|
|
159
191
|
resolutionForConversation(conversationId: string | undefined): {
|
|
160
|
-
executor:
|
|
161
|
-
execute(request: {
|
|
162
|
-
argv: readonly [string, ...string[]];
|
|
163
|
-
cwd: string;
|
|
164
|
-
timeoutMs: number;
|
|
165
|
-
maxOutputBytes?: number;
|
|
166
|
-
}): Promise<CommandExecutionResult>;
|
|
167
|
-
};
|
|
192
|
+
executor: CommandExecutionPort;
|
|
168
193
|
isolation: {
|
|
169
194
|
isolation: string;
|
|
170
195
|
};
|
|
@@ -210,6 +235,8 @@ export interface SdkNativeControlService {
|
|
|
210
235
|
}): Promise<{
|
|
211
236
|
success: boolean;
|
|
212
237
|
sessions?: unknown[];
|
|
238
|
+
sessionListRevision?: number;
|
|
239
|
+
attachedSessionIds?: string[];
|
|
213
240
|
error?: string;
|
|
214
241
|
}>;
|
|
215
242
|
showSession(params: {
|
|
@@ -231,27 +258,35 @@ export interface SdkNativeControlService {
|
|
|
231
258
|
sessionHistoryPath?: string;
|
|
232
259
|
coordinationSessionId?: string;
|
|
233
260
|
checkpoints?: unknown[];
|
|
261
|
+
sessionListRevision?: number;
|
|
234
262
|
error?: string;
|
|
235
263
|
}>;
|
|
236
264
|
detachSession(params: {
|
|
237
265
|
conversationId: string;
|
|
238
266
|
}): Promise<{
|
|
239
267
|
success: boolean;
|
|
268
|
+
sessionListRevision?: number;
|
|
240
269
|
error?: string;
|
|
241
270
|
}>;
|
|
242
271
|
deleteSession(params: {
|
|
243
272
|
sessionId: string;
|
|
273
|
+
expectedSessionListRevision?: number;
|
|
244
274
|
}): Promise<{
|
|
245
275
|
success: boolean;
|
|
276
|
+
sessionListRevision?: number;
|
|
246
277
|
error?: string;
|
|
278
|
+
code?: 'revision_conflict' | 'session_attached' | 'mutation_failed';
|
|
247
279
|
}>;
|
|
248
280
|
cleanSessions(params: {
|
|
249
281
|
workingDirectory: string;
|
|
250
282
|
excludeSessionIds?: string[];
|
|
283
|
+
expectedSessionListRevision?: number;
|
|
251
284
|
}): Promise<{
|
|
252
285
|
success: boolean;
|
|
253
286
|
result?: unknown;
|
|
287
|
+
sessionListRevision?: number;
|
|
254
288
|
error?: string;
|
|
289
|
+
code?: 'revision_conflict' | 'session_attached' | 'mutation_failed';
|
|
255
290
|
}>;
|
|
256
291
|
listCheckpoints(params: {
|
|
257
292
|
sessionId: string;
|
|
@@ -301,5 +336,8 @@ export interface SdkNativeControlService {
|
|
|
301
336
|
totalSize?: number;
|
|
302
337
|
}>;
|
|
303
338
|
}
|
|
304
|
-
export declare function createSdkNativeControlService(
|
|
339
|
+
export declare function createSdkNativeControlService(options?: {
|
|
340
|
+
authorityRoot?: string;
|
|
341
|
+
sdkLoader?: typeof loadSdk;
|
|
342
|
+
}): SdkNativeControlService;
|
|
305
343
|
//# sourceMappingURL=sdkAgent.d.ts.map
|
package/dist/sdkAgent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdkAgent.d.ts","sourceRoot":"","sources":["../src/sdkAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,kCAAkC,CAAA;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"sdkAgent.d.ts","sourceRoot":"","sources":["../src/sdkAgent.ts"],"names":[],"mappings":"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"}
|
package/dist/sdkAgent.js
CHANGED
|
@@ -10,7 +10,13 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { createPermissionWaitRegistry, } from '@xenosystem/agent-interface-host';
|
|
12
12
|
import { commandSucceeded, commandShellArgv, LocalCommandExecutor, } from '@xenosystem/agent-interface-host/node';
|
|
13
|
+
import { sdkExecutionSettlements } from '@xenosystem/agent-interface-host/node';
|
|
13
14
|
import { spawn } from 'child_process';
|
|
15
|
+
import { createHash } from 'node:crypto';
|
|
16
|
+
import { requireSdkReasoningEffort } from './sdkReasoning.js';
|
|
17
|
+
import { enforceToolCategoryPolicy } from './toolCategoryPolicy.js';
|
|
18
|
+
import { protectWorkspaceToolResults } from './workspaceEnvironmentTools.js';
|
|
19
|
+
import { SdkSessionMutationAuthority } from './sdkSessionMutationAuthority.js';
|
|
14
20
|
import { mkdirSync, readFileSync, existsSync, readdirSync, statSync, writeFileSync } from 'fs';
|
|
15
21
|
import { resolve as pathResolve, dirname, join, basename, extname, relative } from 'path';
|
|
16
22
|
import { homedir } from 'os';
|
|
@@ -439,7 +445,7 @@ function truncateHubToolOutput(output, limit = 12_000) {
|
|
|
439
445
|
* the one `WorkspaceHostService.runCommand` adopting the port could not cover.
|
|
440
446
|
* Both now go through the same executor the composition binds per run.
|
|
441
447
|
*/
|
|
442
|
-
function executeAgentShellCommand(input, cwd, environment, conversationId) {
|
|
448
|
+
function executeAgentShellCommand(input, cwd, environment, conversationId, workspaceEnvironment, executionIdentity, settlementRegistry = sdkExecutionSettlements) {
|
|
443
449
|
const command = typeof input.command === 'string' ? input.command : '';
|
|
444
450
|
if (!command.trim()) {
|
|
445
451
|
return Promise.resolve({ success: false, output: '', error: 'Missing required parameter: command' });
|
|
@@ -448,11 +454,14 @@ function executeAgentShellCommand(input, cwd, environment, conversationId) {
|
|
|
448
454
|
const resolution = environment?.resolutionForConversation(conversationId);
|
|
449
455
|
const executor = resolution?.executor ?? fallbackCommandExecutor;
|
|
450
456
|
const destination = resolution?.isolation.isolation === 'sandboxed' ? 'sandbox' : 'host';
|
|
451
|
-
|
|
457
|
+
const request = {
|
|
452
458
|
argv: commandShellArgv(command, destination),
|
|
453
459
|
cwd,
|
|
454
460
|
timeoutMs,
|
|
455
|
-
|
|
461
|
+
...(workspaceEnvironment ? { env: workspaceEnvironment.values } : {}),
|
|
462
|
+
};
|
|
463
|
+
return (executionIdentity ? settlementRegistry.execute(executionIdentity, executor, request) : executor.execute(request))
|
|
464
|
+
.then((result) => toolResultFromExecution(result));
|
|
456
465
|
}
|
|
457
466
|
function toolResultFromExecution(result) {
|
|
458
467
|
const output = truncateHubToolOutput([result.stdout.trimEnd(), result.stderr.trimEnd()].filter(Boolean).join('\n'));
|
|
@@ -2183,6 +2192,7 @@ async function loadSdk() {
|
|
|
2183
2192
|
const sdk = await import('@xenosystem/agent-sdk');
|
|
2184
2193
|
sdkModules = {
|
|
2185
2194
|
AgentLoop: sdk.AgentLoop,
|
|
2195
|
+
AGENT_EFFORT_LEVELS: sdk.AGENT_EFFORT_LEVELS,
|
|
2186
2196
|
ToolRegistry: sdk.ToolRegistry,
|
|
2187
2197
|
createDefaultToolRegistry: sdk.createDefaultToolRegistry,
|
|
2188
2198
|
createWebContextRequestFactory: sdk.createWebContextRequestFactory,
|
|
@@ -2194,6 +2204,7 @@ async function loadSdk() {
|
|
|
2194
2204
|
createAuditBackedPermissionEngine: sdk.createAuditBackedPermissionEngine,
|
|
2195
2205
|
SessionManager: sdk.SessionManager,
|
|
2196
2206
|
SessionRegistry: sdk.SessionRegistry,
|
|
2207
|
+
getAgentHome: sdk.getAgentHome,
|
|
2197
2208
|
CheckpointManager: sdk.CheckpointManager,
|
|
2198
2209
|
XenoRuntimeEventBus: sdk.XenoRuntimeEventBus,
|
|
2199
2210
|
TurnDiffTracker: sdk.TurnDiffTracker,
|
|
@@ -2202,9 +2213,14 @@ async function loadSdk() {
|
|
|
2202
2213
|
cleanupSessionRuntime: sdk.cleanupSessionRuntime,
|
|
2203
2214
|
taskOutputTool: sdk.taskOutputTool,
|
|
2204
2215
|
taskStopTool: sdk.taskStopTool,
|
|
2216
|
+
backgroundProcessManager: sdk.backgroundProcessManager,
|
|
2205
2217
|
};
|
|
2206
2218
|
return sdkModules;
|
|
2207
2219
|
}
|
|
2220
|
+
let defaultSdkSessionMutationAuthority;
|
|
2221
|
+
function getDefaultSdkSessionMutationAuthority() {
|
|
2222
|
+
return defaultSdkSessionMutationAuthority ??= loadSdk().then(sdk => new SdkSessionMutationAuthority(join(sdk.getAgentHome(), 'interface')));
|
|
2223
|
+
}
|
|
2208
2224
|
/**
|
|
2209
2225
|
* The testable composition seam for SDK-native governed automation. Keeping
|
|
2210
2226
|
* discovery and registration here proves the Interface is a client of the
|
|
@@ -3186,7 +3202,20 @@ function wrapRegisteredMultiPathTool(toolRegistry, toolName, pathParams, allowed
|
|
|
3186
3202
|
toolRegistry.register(wrappedTool);
|
|
3187
3203
|
}
|
|
3188
3204
|
export async function runSdkAgent(options) {
|
|
3189
|
-
const
|
|
3205
|
+
const sdk = await loadSdk();
|
|
3206
|
+
const identity = { requestId: options.requestId, ...(options.conversationId ? { conversationId: options.conversationId } : {}) };
|
|
3207
|
+
const registry = options.settlementRegistry ?? sdkExecutionSettlements;
|
|
3208
|
+
await registry.retryAcknowledgedReleases();
|
|
3209
|
+
const ownerId = registry.begin(identity, sdk.backgroundProcessManager);
|
|
3210
|
+
try {
|
|
3211
|
+
await runSdkAgentOwned(options, ownerId);
|
|
3212
|
+
}
|
|
3213
|
+
finally {
|
|
3214
|
+
registry.finish(identity);
|
|
3215
|
+
}
|
|
3216
|
+
}
|
|
3217
|
+
async function runSdkAgentOwned(options, ownerId) {
|
|
3218
|
+
const { requestId, conversationId, hostBinding, sdkSessionId, subagentRunId, workspaceId, teamId, agentId, model, messages, systemPrompt, maxIterations = 10, enableThinking = false, reasoningEffort, getAuthToken, getPlatformAuthToken, mainWindow, signal, capabilities, permissionProfile, allowedDirectories, approvalRules: rawApprovalRules, allowTextOnlyFallback = false, toolExecution, onPersistedRuntimeEvent, prepareRuntimeEventForPersistence, runtimeEventStore: injectedRuntimeEventStore, coordinationTools, isProduction, executionEnvironment, workspaceEnvironment, } = options;
|
|
3190
3219
|
const approvalRules = normalizeApprovalRules(rawApprovalRules);
|
|
3191
3220
|
const resolvedPermissionProfile = resolveAgentPermissionProfile({
|
|
3192
3221
|
...(permissionProfile ? { requestedProfile: permissionProfile } : {}),
|
|
@@ -3277,6 +3306,7 @@ export async function runSdkAgent(options) {
|
|
|
3277
3306
|
// configured, Web Context replaces both legacy direct-network web tools.
|
|
3278
3307
|
const toolRegistry = sdk.createDefaultToolRegistry({
|
|
3279
3308
|
cwd: toolRuntimeCwd,
|
|
3309
|
+
ownerSessionId: ownerId,
|
|
3280
3310
|
askUser: createHubAskUserHandler(mainWindow, requestId),
|
|
3281
3311
|
...(webContextTools ? { webContext: webContextTools } : {}),
|
|
3282
3312
|
});
|
|
@@ -3522,7 +3552,7 @@ export async function runSdkAgent(options) {
|
|
|
3522
3552
|
if (typeof input.timeout !== 'number' && typeof input.timeout_ms !== 'number') {
|
|
3523
3553
|
input.timeout = DEFAULT_AGENT_TOOL_TIMEOUT_MS;
|
|
3524
3554
|
}
|
|
3525
|
-
return executeAgentShellCommand(input, bashPolicyPath, executionEnvironment, conversationId);
|
|
3555
|
+
return executeAgentShellCommand(input, bashPolicyPath, executionEnvironment, conversationId, workspaceEnvironment, { requestId, ...(conversationId ? { conversationId } : {}) }, options.settlementRegistry ?? sdkExecutionSettlements);
|
|
3526
3556
|
}
|
|
3527
3557
|
};
|
|
3528
3558
|
toolRegistry.unregister('Bash');
|
|
@@ -3735,6 +3765,11 @@ export async function runSdkAgent(options) {
|
|
|
3735
3765
|
const baseEvent = event && typeof event === 'object' && !Array.isArray(event)
|
|
3736
3766
|
? sanitizeRuntimeEventForHub(event, runtimeModeGuard)
|
|
3737
3767
|
: event;
|
|
3768
|
+
// This runner constructs a fresh AgentLoop per request. Its final totals
|
|
3769
|
+
// therefore have a known request boundary, unlike legacy session counters.
|
|
3770
|
+
if (baseEvent && typeof baseEvent === 'object' && !Array.isArray(baseEvent) && rawType === 'turn.completed') {
|
|
3771
|
+
Object.assign(baseEvent, { usageBasis: 'request', model: isLocalModel ? model : modelId });
|
|
3772
|
+
}
|
|
3738
3773
|
const enrichedEvent = subagentRunId && baseEvent && typeof baseEvent === 'object' && !Array.isArray(baseEvent)
|
|
3739
3774
|
? { ...baseEvent, subagentRunId }
|
|
3740
3775
|
: baseEvent;
|
|
@@ -4112,6 +4147,9 @@ export async function runSdkAgent(options) {
|
|
|
4112
4147
|
allowedDirectoriesCount: dirs.length,
|
|
4113
4148
|
approvalRulesCount: approvalRules.length,
|
|
4114
4149
|
});
|
|
4150
|
+
enforceToolCategoryPolicy(toolRegistry, caps);
|
|
4151
|
+
if (workspaceEnvironment && Object.keys(workspaceEnvironment.values).length)
|
|
4152
|
+
protectWorkspaceToolResults(toolRegistry, workspaceEnvironment.redact);
|
|
4115
4153
|
if (latestUserMessageRequestsNoTools(messages)) {
|
|
4116
4154
|
unregisterAllTools(toolRegistry);
|
|
4117
4155
|
emitRuntimeEvent({
|
|
@@ -4133,42 +4171,65 @@ export async function runSdkAgent(options) {
|
|
|
4133
4171
|
sessionRuntime = undefined;
|
|
4134
4172
|
}
|
|
4135
4173
|
if (!sessionRuntime) {
|
|
4136
|
-
|
|
4174
|
+
let createdRuntime;
|
|
4175
|
+
let runtimeReachedAttachmentAuthority = false;
|
|
4137
4176
|
try {
|
|
4138
|
-
|
|
4139
|
-
|
|
4140
|
-
|
|
4141
|
-
|
|
4142
|
-
|
|
4143
|
-
|
|
4144
|
-
|
|
4145
|
-
|
|
4146
|
-
|
|
4147
|
-
|
|
4177
|
+
const established = await (await getDefaultSdkSessionMutationAuthority()).establishAttachment(conversationId, async () => {
|
|
4178
|
+
const resumeSessionId = pendingCheckpointRestore?.sessionId || sdkSessionId || undefined;
|
|
4179
|
+
try {
|
|
4180
|
+
createdRuntime = await sdk.initializeSessionRuntime({
|
|
4181
|
+
cwd: toolRuntimeCwd,
|
|
4182
|
+
role: sessionRole,
|
|
4183
|
+
model,
|
|
4184
|
+
...(hostBinding ? { hostBinding: structuredClone(hostBinding) } : {}),
|
|
4185
|
+
...(resumeSessionId ? { resume: resumeSessionId } : {}),
|
|
4186
|
+
...(pendingCheckpointRestore?.checkpointId
|
|
4187
|
+
? { checkpoint: pendingCheckpointRestore.checkpointId }
|
|
4188
|
+
: {}),
|
|
4189
|
+
});
|
|
4190
|
+
}
|
|
4191
|
+
catch (err) {
|
|
4192
|
+
if (!sdkSessionId || pendingCheckpointRestore)
|
|
4193
|
+
throw err;
|
|
4194
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
4195
|
+
logAgentDebug('Unable to resume SDK session; creating a replacement session', {
|
|
4196
|
+
requestId,
|
|
4197
|
+
conversationId,
|
|
4198
|
+
sdkSessionId,
|
|
4199
|
+
error: error.message,
|
|
4200
|
+
});
|
|
4201
|
+
createdRuntime = await sdk.initializeSessionRuntime({
|
|
4202
|
+
cwd: toolRuntimeCwd,
|
|
4203
|
+
role: sessionRole,
|
|
4204
|
+
model,
|
|
4205
|
+
...(hostBinding ? { hostBinding: structuredClone(hostBinding) } : {}),
|
|
4206
|
+
});
|
|
4207
|
+
}
|
|
4208
|
+
createdRuntime = await sdk.activateSessionRuntime(createdRuntime, {
|
|
4209
|
+
cwd: toolRuntimeCwd,
|
|
4210
|
+
role: sessionRole,
|
|
4211
|
+
model,
|
|
4212
|
+
...(hostBinding ? { hostBinding: structuredClone(hostBinding) } : {}),
|
|
4213
|
+
});
|
|
4214
|
+
const activeSessionId = createdRuntime?.sessionManager?.meta?.id;
|
|
4215
|
+
if (typeof activeSessionId !== 'string' || !activeSessionId)
|
|
4216
|
+
throw new Error('SDK session runtime did not expose an authoritative session ID.');
|
|
4217
|
+
runtimeReachedAttachmentAuthority = true;
|
|
4218
|
+
return { sessionId: activeSessionId, value: createdRuntime };
|
|
4219
|
+
}, async (activeSessionId) => {
|
|
4220
|
+
if (!await sdk.SessionRegistry.find(activeSessionId))
|
|
4221
|
+
throw new Error('SDK session disappeared before runtime attachment was recorded.');
|
|
4222
|
+
}, runtime => sdk.cleanupSessionRuntime(runtime, 'abandoned'));
|
|
4223
|
+
sessionRuntime = established.value;
|
|
4148
4224
|
}
|
|
4149
4225
|
catch (err) {
|
|
4150
|
-
|
|
4151
|
-
|
|
4152
|
-
|
|
4153
|
-
|
|
4154
|
-
|
|
4155
|
-
|
|
4156
|
-
sdkSessionId,
|
|
4157
|
-
error: error.message,
|
|
4158
|
-
});
|
|
4159
|
-
sessionRuntime = await sdk.initializeSessionRuntime({
|
|
4160
|
-
cwd: toolRuntimeCwd,
|
|
4161
|
-
role: sessionRole,
|
|
4162
|
-
model,
|
|
4163
|
-
...(hostBinding ? { hostBinding: structuredClone(hostBinding) } : {}),
|
|
4164
|
-
});
|
|
4226
|
+
// An operation that failed before returning an established runtime
|
|
4227
|
+
// still owns its provisional SDK object; the authority disposes only
|
|
4228
|
+
// values that reached validation/publication.
|
|
4229
|
+
if (createdRuntime && !runtimeReachedAttachmentAuthority)
|
|
4230
|
+
await sdk.cleanupSessionRuntime(createdRuntime, 'abandoned');
|
|
4231
|
+
throw err;
|
|
4165
4232
|
}
|
|
4166
|
-
sessionRuntime = await sdk.activateSessionRuntime(sessionRuntime, {
|
|
4167
|
-
cwd: toolRuntimeCwd,
|
|
4168
|
-
role: sessionRole,
|
|
4169
|
-
model,
|
|
4170
|
-
...(hostBinding ? { hostBinding: structuredClone(hostBinding) } : {}),
|
|
4171
|
-
});
|
|
4172
4233
|
hubSessionRuntimes.set(conversationId, sessionRuntime);
|
|
4173
4234
|
if (pendingCheckpointRestore) {
|
|
4174
4235
|
pendingSdkCheckpointRestores.delete(conversationId);
|
|
@@ -4485,9 +4546,11 @@ export async function runSdkAgent(options) {
|
|
|
4485
4546
|
'Bash',
|
|
4486
4547
|
]);
|
|
4487
4548
|
const agent = new sdk.AgentLoop({
|
|
4549
|
+
ownerSessionId: ownerId,
|
|
4488
4550
|
apiKey,
|
|
4489
4551
|
baseURL,
|
|
4490
4552
|
model: isLocalModel ? model : modelId,
|
|
4553
|
+
...(reasoningEffort ? { effort: requireSdkReasoningEffort(reasoningEffort, sdk.AGENT_EFFORT_LEVELS) } : {}),
|
|
4491
4554
|
maxTokens: 8192,
|
|
4492
4555
|
maxIterations,
|
|
4493
4556
|
systemPrompt: runtimeSystemPrompt,
|
|
@@ -5005,6 +5068,20 @@ function toIpcPlainArray(value) {
|
|
|
5005
5068
|
const plain = toIpcPlainValue(value);
|
|
5006
5069
|
return Array.isArray(plain) ? plain : [];
|
|
5007
5070
|
}
|
|
5071
|
+
function canonicalSessionValue(value) {
|
|
5072
|
+
if (Array.isArray(value))
|
|
5073
|
+
return value.map(canonicalSessionValue);
|
|
5074
|
+
if (!value || typeof value !== 'object')
|
|
5075
|
+
return value;
|
|
5076
|
+
return Object.fromEntries(Object.entries(value)
|
|
5077
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
5078
|
+
.map(([key, entry]) => [key, canonicalSessionValue(entry)]));
|
|
5079
|
+
}
|
|
5080
|
+
async function readSdkSessionFingerprint(sdk) {
|
|
5081
|
+
const sessions = toIpcPlainArray(await sdk.SessionRegistry.list({ limit: Number.MAX_SAFE_INTEGER }));
|
|
5082
|
+
const rows = sessions.map(entry => JSON.stringify(canonicalSessionValue(entry))).sort();
|
|
5083
|
+
return createHash('sha256').update(JSON.stringify(rows)).digest('hex');
|
|
5084
|
+
}
|
|
5008
5085
|
function findHubSessionRuntimeBySdkSessionId(sessionId) {
|
|
5009
5086
|
for (const runtime of hubSessionRuntimes.values()) {
|
|
5010
5087
|
if (runtime?.sessionManager?.meta?.id === sessionId)
|
|
@@ -5036,9 +5113,16 @@ async function cleanupHubSessionRuntime(conversationId, status = 'abandoned') {
|
|
|
5036
5113
|
error: error.message,
|
|
5037
5114
|
});
|
|
5038
5115
|
}
|
|
5116
|
+
try {
|
|
5117
|
+
await (await getDefaultSdkSessionMutationAuthority()).recordDetachment(conversationId);
|
|
5118
|
+
}
|
|
5119
|
+
catch (err) {
|
|
5120
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
5121
|
+
logAgentDebug('Failed to record SDK session runtime detachment', { conversationId, status, error: error.message });
|
|
5122
|
+
}
|
|
5039
5123
|
}
|
|
5040
|
-
async function getSdkCheckpointManager(sessionId) {
|
|
5041
|
-
const sdk = await
|
|
5124
|
+
async function getSdkCheckpointManager(sessionId, sdkLoader = loadSdk) {
|
|
5125
|
+
const sdk = await sdkLoader();
|
|
5042
5126
|
const activeRuntime = findHubSessionRuntimeBySdkSessionId(sessionId);
|
|
5043
5127
|
if (activeRuntime?.checkpointManager)
|
|
5044
5128
|
return activeRuntime.checkpointManager;
|
|
@@ -5165,17 +5249,34 @@ export function createSdkNativeInteractionService() {
|
|
|
5165
5249
|
answerAskUser: answerSdkAskUser,
|
|
5166
5250
|
};
|
|
5167
5251
|
}
|
|
5168
|
-
export function createSdkNativeControlService() {
|
|
5252
|
+
export function createSdkNativeControlService(options = {}) {
|
|
5253
|
+
const sdkLoader = options.sdkLoader ?? loadSdk;
|
|
5254
|
+
let authorityPromise;
|
|
5255
|
+
const authority = () => {
|
|
5256
|
+
if (!options.authorityRoot && !options.sdkLoader)
|
|
5257
|
+
return getDefaultSdkSessionMutationAuthority();
|
|
5258
|
+
return authorityPromise ??= (async () => {
|
|
5259
|
+
const sdk = await sdkLoader();
|
|
5260
|
+
return new SdkSessionMutationAuthority(options.authorityRoot ?? join(sdk.getAgentHome(), 'interface'));
|
|
5261
|
+
})();
|
|
5262
|
+
};
|
|
5263
|
+
const mutationFailure = (err) => {
|
|
5264
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
5265
|
+
const code = error.message.startsWith('SDK_SESSION_REVISION_CONFLICT:') ? 'revision_conflict'
|
|
5266
|
+
: error.message.startsWith('SDK_SESSION_ATTACHED:') ? 'session_attached' : 'mutation_failed';
|
|
5267
|
+
return { success: false, code, error: error.message };
|
|
5268
|
+
};
|
|
5169
5269
|
return {
|
|
5170
5270
|
async listSessions(params = {}) {
|
|
5171
5271
|
try {
|
|
5172
|
-
const sdk = await
|
|
5272
|
+
const sdk = await sdkLoader();
|
|
5173
5273
|
const sessions = await sdk.SessionRegistry.list({
|
|
5174
5274
|
...(typeof params.role === 'string' ? { role: params.role } : {}),
|
|
5175
5275
|
...(typeof params.workingDirectory === 'string' ? { workingDirectory: params.workingDirectory } : {}),
|
|
5176
5276
|
limit: typeof params.limit === 'number' ? params.limit : 100,
|
|
5177
5277
|
});
|
|
5178
|
-
|
|
5278
|
+
const snapshot = await (await authority()).observeSessionList(await readSdkSessionFingerprint(sdk));
|
|
5279
|
+
return { success: true, sessions: toIpcPlainArray(sessions), sessionListRevision: snapshot.sessionListRevision, attachedSessionIds: [...new Set(Object.values(snapshot.attachments))] };
|
|
5179
5280
|
}
|
|
5180
5281
|
catch (err) {
|
|
5181
5282
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
@@ -5187,11 +5288,11 @@ export function createSdkNativeControlService() {
|
|
|
5187
5288
|
const sessionId = String(params?.sessionId || '');
|
|
5188
5289
|
if (!sessionId)
|
|
5189
5290
|
return { success: false, error: 'Missing sessionId' };
|
|
5190
|
-
const sdk = await
|
|
5291
|
+
const sdk = await sdkLoader();
|
|
5191
5292
|
const meta = await sdk.SessionRegistry.find(sessionId);
|
|
5192
5293
|
if (!meta)
|
|
5193
5294
|
return { success: false, error: 'SDK session not found' };
|
|
5194
|
-
const checkpoints = await getSdkCheckpointManager(sessionId).then((manager) => manager.list());
|
|
5295
|
+
const checkpoints = await getSdkCheckpointManager(sessionId, sdkLoader).then((manager) => manager.list());
|
|
5195
5296
|
return {
|
|
5196
5297
|
success: true,
|
|
5197
5298
|
session: toIpcPlainValue(meta),
|
|
@@ -5210,7 +5311,7 @@ export function createSdkNativeControlService() {
|
|
|
5210
5311
|
const sessionId = String(params?.sessionId || '');
|
|
5211
5312
|
if (!conversationId || !sessionId)
|
|
5212
5313
|
return { success: false, error: 'Missing conversationId or sessionId' };
|
|
5213
|
-
const sdk = await
|
|
5314
|
+
const sdk = await sdkLoader();
|
|
5214
5315
|
const meta = await sdk.SessionRegistry.find(sessionId);
|
|
5215
5316
|
if (!meta)
|
|
5216
5317
|
return { success: false, error: 'SDK session not found' };
|
|
@@ -5219,7 +5320,11 @@ export function createSdkNativeControlService() {
|
|
|
5219
5320
|
if (currentRuntime && currentSessionId !== sessionId) {
|
|
5220
5321
|
await cleanupHubSessionRuntime(conversationId, 'abandoned');
|
|
5221
5322
|
}
|
|
5222
|
-
const checkpoints = await getSdkCheckpointManager(sessionId).then((manager) => manager.list());
|
|
5323
|
+
const checkpoints = await getSdkCheckpointManager(sessionId, sdkLoader).then((manager) => manager.list());
|
|
5324
|
+
const snapshot = await (await authority()).recordAttachment(conversationId, sessionId, async () => {
|
|
5325
|
+
if (!await sdk.SessionRegistry.find(sessionId))
|
|
5326
|
+
throw new Error('SDK session disappeared before attachment was recorded.');
|
|
5327
|
+
});
|
|
5223
5328
|
return {
|
|
5224
5329
|
success: true,
|
|
5225
5330
|
session: toIpcPlainValue(meta),
|
|
@@ -5227,6 +5332,7 @@ export function createSdkNativeControlService() {
|
|
|
5227
5332
|
sessionHistoryPath: `.xeno\\sessions\\${sessionId}.md`,
|
|
5228
5333
|
coordinationSessionId: sessionId.startsWith('session-') ? sessionId : `session-${sessionId}`,
|
|
5229
5334
|
checkpoints: toIpcPlainArray(checkpoints),
|
|
5335
|
+
sessionListRevision: snapshot.sessionListRevision,
|
|
5230
5336
|
};
|
|
5231
5337
|
}
|
|
5232
5338
|
catch (err) {
|
|
@@ -5240,7 +5346,8 @@ export function createSdkNativeControlService() {
|
|
|
5240
5346
|
if (!conversationId)
|
|
5241
5347
|
return { success: false, error: 'Missing conversationId' };
|
|
5242
5348
|
await cleanupHubSessionRuntime(conversationId, 'abandoned');
|
|
5243
|
-
|
|
5349
|
+
const snapshot = await (await authority()).recordDetachment(conversationId);
|
|
5350
|
+
return { success: true, sessionListRevision: snapshot.sessionListRevision };
|
|
5244
5351
|
}
|
|
5245
5352
|
catch (err) {
|
|
5246
5353
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
@@ -5252,17 +5359,15 @@ export function createSdkNativeControlService() {
|
|
|
5252
5359
|
const sessionId = String(params?.sessionId || '');
|
|
5253
5360
|
if (!sessionId)
|
|
5254
5361
|
return { success: false, error: 'Missing sessionId' };
|
|
5255
|
-
const sdk = await
|
|
5256
|
-
const
|
|
5257
|
-
|
|
5258
|
-
|
|
5259
|
-
}
|
|
5260
|
-
|
|
5261
|
-
return { success: true };
|
|
5362
|
+
const sdk = await sdkLoader();
|
|
5363
|
+
const snapshot = await (await authority()).mutate(params.expectedSessionListRevision, () => readSdkSessionFingerprint(sdk), state => {
|
|
5364
|
+
if (findHubSessionRuntimeEntryBySdkSessionId(sessionId) || Object.values(state.attachments).includes(sessionId))
|
|
5365
|
+
throw new Error('SDK_SESSION_ATTACHED: Detach this SDK session before deleting it.');
|
|
5366
|
+
}, () => sdk.SessionRegistry.delete(sessionId));
|
|
5367
|
+
return { success: true, sessionListRevision: snapshot.sessionListRevision };
|
|
5262
5368
|
}
|
|
5263
5369
|
catch (err) {
|
|
5264
|
-
|
|
5265
|
-
return { success: false, error: error.message };
|
|
5370
|
+
return mutationFailure(err);
|
|
5266
5371
|
}
|
|
5267
5372
|
},
|
|
5268
5373
|
async cleanSessions(params) {
|
|
@@ -5273,13 +5378,19 @@ export function createSdkNativeControlService() {
|
|
|
5273
5378
|
: [];
|
|
5274
5379
|
if (!workingDirectory)
|
|
5275
5380
|
return { success: false, error: 'Missing workingDirectory' };
|
|
5276
|
-
const sdk = await
|
|
5277
|
-
|
|
5278
|
-
|
|
5381
|
+
const sdk = await sdkLoader();
|
|
5382
|
+
let result;
|
|
5383
|
+
const snapshot = await (await authority()).mutate(params.expectedSessionListRevision, () => readSdkSessionFingerprint(sdk), async (state) => {
|
|
5384
|
+
const candidates = await sdk.SessionRegistry.list({ workingDirectory });
|
|
5385
|
+
const attached = new Set([...Object.values(state.attachments), ...[...hubSessionRuntimes.values()].flatMap(runtime => typeof runtime?.sessionManager?.meta?.id === 'string' ? [runtime.sessionManager.meta.id] : [])]);
|
|
5386
|
+
const collision = candidates.find(session => attached.has(session.id) && !excludeSessionIds.includes(session.id));
|
|
5387
|
+
if (collision)
|
|
5388
|
+
throw new Error(`SDK_SESSION_ATTACHED: Session ${collision.id} became attached; reload before cleaning.`);
|
|
5389
|
+
}, async () => { result = await sdk.SessionRegistry.purgeWorkingDirectory(workingDirectory, { excludeSessionIds }); });
|
|
5390
|
+
return { success: true, result: toIpcPlainValue(result), sessionListRevision: snapshot.sessionListRevision };
|
|
5279
5391
|
}
|
|
5280
5392
|
catch (err) {
|
|
5281
|
-
|
|
5282
|
-
return { success: false, error: error.message };
|
|
5393
|
+
return mutationFailure(err);
|
|
5283
5394
|
}
|
|
5284
5395
|
},
|
|
5285
5396
|
async listCheckpoints(params) {
|
|
@@ -5287,7 +5398,7 @@ export function createSdkNativeControlService() {
|
|
|
5287
5398
|
const sessionId = String(params?.sessionId || '');
|
|
5288
5399
|
if (!sessionId)
|
|
5289
5400
|
return { success: false, error: 'Missing sessionId' };
|
|
5290
|
-
const checkpoints = await getSdkCheckpointManager(sessionId).then((manager) => manager.list());
|
|
5401
|
+
const checkpoints = await getSdkCheckpointManager(sessionId, sdkLoader).then((manager) => manager.list());
|
|
5291
5402
|
return { success: true, checkpoints: toIpcPlainArray(checkpoints) };
|
|
5292
5403
|
}
|
|
5293
5404
|
catch (err) {
|
|
@@ -5302,7 +5413,7 @@ export function createSdkNativeControlService() {
|
|
|
5302
5413
|
const conversationId = typeof params?.conversationId === 'string' ? params.conversationId.trim() : '';
|
|
5303
5414
|
if (!sessionId || !checkpointId)
|
|
5304
5415
|
return { success: false, error: 'Missing sessionId or checkpointId' };
|
|
5305
|
-
const restored = await getSdkCheckpointManager(sessionId).then((manager) => manager.restore(checkpointId));
|
|
5416
|
+
const restored = await getSdkCheckpointManager(sessionId, sdkLoader).then((manager) => manager.restore(checkpointId));
|
|
5306
5417
|
if (conversationId) {
|
|
5307
5418
|
pendingSdkCheckpointRestores.set(conversationId, { sessionId, checkpointId });
|
|
5308
5419
|
const runtimeEntry = findHubSessionRuntimeEntryBySdkSessionId(sessionId);
|
|
@@ -5327,7 +5438,7 @@ export function createSdkNativeControlService() {
|
|
|
5327
5438
|
const checkpointId = String(params?.checkpointId || '');
|
|
5328
5439
|
if (!sessionId || !checkpointId)
|
|
5329
5440
|
return { success: false, error: 'Missing sessionId or checkpointId' };
|
|
5330
|
-
await getSdkCheckpointManager(sessionId).then((manager) => manager.delete(checkpointId));
|
|
5441
|
+
await getSdkCheckpointManager(sessionId, sdkLoader).then((manager) => manager.delete(checkpointId));
|
|
5331
5442
|
return { success: true };
|
|
5332
5443
|
}
|
|
5333
5444
|
catch (err) {
|