@cleanslate/sdk 1.0.7 → 1.0.8
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/README.md +49 -4
- package/dist/agent/cleanSlateAgentExecutionPhase.d.ts.map +1 -1
- package/dist/agent/cleanSlateAgentExecutionPhase.js +7 -1
- package/dist/agent/cleanSlateAgentExecutionPhase.js.map +1 -1
- package/dist/agent/cleanSlateExecutionQuery.d.ts +1 -0
- package/dist/agent/cleanSlateExecutionQuery.d.ts.map +1 -1
- package/dist/agent/cleanSlateExecutionQuery.js +135 -89
- package/dist/agent/cleanSlateExecutionQuery.js.map +1 -1
- package/dist/agent/cleanSlateToolResultPromptSerializer.js +27 -5
- package/dist/agent/cleanSlateToolResultPromptSerializer.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/node/cleanSlateHostedAgentRuntime.d.ts +41 -0
- package/dist/node/cleanSlateHostedAgentRuntime.d.ts.map +1 -0
- package/dist/node/cleanSlateHostedAgentRuntime.js +525 -0
- package/dist/node/cleanSlateHostedAgentRuntime.js.map +1 -0
- package/dist/node/cleanSlateNodeAgentRuntime.d.ts +50 -1
- package/dist/node/cleanSlateNodeAgentRuntime.d.ts.map +1 -1
- package/dist/node/cleanSlateNodeAgentRuntime.js +185 -17
- package/dist/node/cleanSlateNodeAgentRuntime.js.map +1 -1
- package/dist/node/cleanSlateNodeBrowserAutomation.d.ts +12 -0
- package/dist/node/cleanSlateNodeBrowserAutomation.d.ts.map +1 -1
- package/dist/node/cleanSlateNodeBrowserAutomation.js +73 -14
- package/dist/node/cleanSlateNodeBrowserAutomation.js.map +1 -1
- package/dist/node/cleanSlateNodeCommandService.d.ts.map +1 -1
- package/dist/node/cleanSlateNodeCommandService.js +4 -0
- package/dist/node/cleanSlateNodeCommandService.js.map +1 -1
- package/dist/node/cleanSlateNodeMainService.d.ts +2 -1
- package/dist/node/cleanSlateNodeMainService.d.ts.map +1 -1
- package/dist/node/cleanSlateNodeMainService.js +1 -0
- package/dist/node/cleanSlateNodeMainService.js.map +1 -1
- package/dist/node/cleanSlateNodeToolContext.d.ts +2 -0
- package/dist/node/cleanSlateNodeToolContext.d.ts.map +1 -1
- package/dist/node/cleanSlateNodeToolContext.js +1 -1
- package/dist/node/cleanSlateNodeToolContext.js.map +1 -1
- package/dist/node/index.d.ts +4 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +2 -0
- package/dist/node/index.js.map +1 -1
- package/dist/protocol/cleanSlateAI.d.ts +62 -0
- package/dist/protocol/cleanSlateAI.d.ts.map +1 -1
- package/dist/protocol/cleanSlateAI.js +1 -0
- package/dist/protocol/cleanSlateAI.js.map +1 -1
- package/dist/protocol/cleanSlateManagedTokenCoordinator.d.ts +16 -0
- package/dist/protocol/cleanSlateManagedTokenCoordinator.d.ts.map +1 -0
- package/dist/protocol/cleanSlateManagedTokenCoordinator.js +66 -0
- package/dist/protocol/cleanSlateManagedTokenCoordinator.js.map +1 -0
- package/dist/services/cleanSlateAgentCoordinator.d.ts +81 -0
- package/dist/services/cleanSlateAgentCoordinator.d.ts.map +1 -0
- package/dist/services/cleanSlateAgentCoordinator.js +243 -0
- package/dist/services/cleanSlateAgentCoordinator.js.map +1 -0
- package/dist/services/cleanSlateConversationBranchService.d.ts +34 -0
- package/dist/services/cleanSlateConversationBranchService.d.ts.map +1 -0
- package/dist/services/cleanSlateConversationBranchService.js +70 -0
- package/dist/services/cleanSlateConversationBranchService.js.map +1 -0
- package/dist/services/cleanSlateTools.d.ts +2 -0
- package/dist/services/cleanSlateTools.d.ts.map +1 -1
- package/dist/services/cleanSlateTools.js +2 -0
- package/dist/services/cleanSlateTools.js.map +1 -1
- package/dist/tools/BrowserAutomationTools.d.ts.map +1 -1
- package/dist/tools/BrowserAutomationTools.js +6 -3
- package/dist/tools/BrowserAutomationTools.js.map +1 -1
- package/dist/tools/ExecuteCommandTool.js +2 -2
- package/dist/tools/ExecuteCommandTool.js.map +1 -1
- package/dist/tools/SpawnWorkerTool.d.ts +3 -0
- package/dist/tools/SpawnWorkerTool.d.ts.map +1 -1
- package/dist/tools/SpawnWorkerTool.js +101 -10
- package/dist/tools/SpawnWorkerTool.js.map +1 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +4 -1
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/types.d.ts +3 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -48,6 +48,7 @@ export function normalizeCleanSlateExecutionState(value = {}) {
|
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
50
|
export const CLEANSLATE_FALLBACK_CONTEXT_WINDOW_TOKENS = 64_000;
|
|
51
|
+
export const CLEANSLATE_HOSTED_AGENT_OWNER = 'cleanslate:main-process';
|
|
51
52
|
export const CLEANSLATE_INDEX_SIZE_LIMIT = 50 * 1024 * 1024; // 50MB
|
|
52
53
|
export const CLEANSLATE_ARTIFACT_SCHEME = 'cleanslate-artifact';
|
|
53
54
|
//# sourceMappingURL=cleanSlateAI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanSlateAI.js","sourceRoot":"","sources":["../../src/protocol/cleanSlateAI.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;
|
|
1
|
+
{"version":3,"file":"cleanSlateAI.js","sourceRoot":"","sources":["../../src/protocol/cleanSlateAI.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAyBhG,MAAM,CAAC,MAAM,2BAA2B,GAAwC,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAE7I,MAAM,UAAU,8BAA8B,CAAC,KAA+B;IAC1E,QAAQ,KAAK,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC;QAC3B,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;QACjC,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC;QACzB,KAAK,QAAQ,CAAC,CAAC,OAAO,QAAQ,CAAC;QAC/B,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC;QAC3B,KAAK,OAAO,CAAC,CAAC,OAAO,YAAY,CAAC;QAClC,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC;IAC7B,CAAC;AACL,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACrD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,2BAAiD,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAU,CAAC;AAIjF,MAAM,UAAU,wBAAwB,CAAC,IAAwB;IAC7D,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,QAAQ,CAAC,CAAC,OAAO,QAAQ,CAAC;QAC/B,KAAK,cAAc,CAAC,CAAC,OAAO,cAAc,CAAC;QAC3C,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC;IAC/B,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,IAAwB;IACrE,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,QAAQ,CAAC,CAAC,OAAO,qCAAqC,CAAC;QAC5D,KAAK,cAAc,CAAC,CAAC,OAAO,kDAAkD,CAAC;QAC/E,KAAK,MAAM,CAAC,CAAC,OAAO,6CAA6C,CAAC;IACtE,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,qBAA2C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrG,CAAC;AAOD,MAAM,UAAU,iCAAiC,CAAC,QAG9C,EAAE;IACF,MAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,QAAQ,KAAK,SAAS;QAChD,CAAC,CAAC,KAAK,CAAC,QAAQ;QAChB,CAAC,CAAC,KAAK,CAAC;IACZ,MAAM,cAAc,GAAG,0BAA0B,CAAC,KAAK,CAAC,cAAc,CAAC;QACnE,CAAC,CAAC,KAAK,CAAC,cAAc;QACtB,CAAC,CAAC,KAAK,CAAC;IAEZ,OAAO;QACH,QAAQ;QACR,cAAc;KACjB,CAAC;AACN,CAAC;AAED,MAAM,CAAC,MAAM,yCAAyC,GAAG,MAAM,CAAC;AAiRhE,MAAM,CAAC,MAAM,6BAA6B,GAAG,yBAAyB,CAAC;AAoOvE,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AACpE,MAAM,CAAC,MAAM,0BAA0B,GAAG,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ICleanSlateManagedTokenRefreshResult } from './cleanSlateAI.js';
|
|
2
|
+
export type ICleanSlateManagedTokenRefreshResponse = ICleanSlateManagedTokenRefreshResult;
|
|
3
|
+
/** Shares successful credential rotations and in-flight refreshes between an
|
|
4
|
+
* account's consumers. Unknown tokens never inherit another account's token. */
|
|
5
|
+
export declare class CleanSlateManagedTokenCoordinator {
|
|
6
|
+
private readonly rotate;
|
|
7
|
+
private readonly rotations;
|
|
8
|
+
private readonly requests;
|
|
9
|
+
private generation;
|
|
10
|
+
constructor(rotate: (previousToken: string) => Promise<ICleanSlateManagedTokenRefreshResponse>);
|
|
11
|
+
resolve(token: string): string;
|
|
12
|
+
refresh(token: string): Promise<ICleanSlateManagedTokenRefreshResponse>;
|
|
13
|
+
clear(): void;
|
|
14
|
+
private resolveResponse;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=cleanSlateManagedTokenCoordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanSlateManagedTokenCoordinator.d.ts","sourceRoot":"","sources":["../../src/protocol/cleanSlateManagedTokenCoordinator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,mBAAmB,CAAC;AAE9E,MAAM,MAAM,sCAAsC,GAAG,oCAAoC,CAAC;AAE1F;gFACgF;AAChF,qBAAa,iCAAiC;IAKjC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6D;IACvF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsE;IAC/F,OAAO,CAAC,UAAU,CAAK;gBAEM,MAAM,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,sCAAsC,CAAC;IAE/G,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI9B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,sCAAsC,CAAC;IA8BvE,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,eAAe;CAcvB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) CleanSlate. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
/** Shares successful credential rotations and in-flight refreshes between an
|
|
6
|
+
* account's consumers. Unknown tokens never inherit another account's token. */
|
|
7
|
+
export class CleanSlateManagedTokenCoordinator {
|
|
8
|
+
constructor(rotate) {
|
|
9
|
+
this.rotate = rotate;
|
|
10
|
+
this.rotations = new Map();
|
|
11
|
+
this.requests = new Map();
|
|
12
|
+
this.generation = 0;
|
|
13
|
+
}
|
|
14
|
+
resolve(token) {
|
|
15
|
+
return this.resolveResponse(token)?.token ?? token;
|
|
16
|
+
}
|
|
17
|
+
refresh(token) {
|
|
18
|
+
const known = this.resolveResponse(token);
|
|
19
|
+
const current = known?.token ?? token;
|
|
20
|
+
const pending = this.requests.get(current);
|
|
21
|
+
if (pending) {
|
|
22
|
+
return pending;
|
|
23
|
+
}
|
|
24
|
+
if (current !== token && known) {
|
|
25
|
+
return Promise.resolve(known);
|
|
26
|
+
}
|
|
27
|
+
const generation = this.generation;
|
|
28
|
+
// Defer the callback until the request is indexed so synchronous callbacks
|
|
29
|
+
// and concurrent consumers cannot start a second rotation of the same token.
|
|
30
|
+
const request = Promise.resolve().then(() => this.rotate(current)).then(response => {
|
|
31
|
+
if (!response.token) {
|
|
32
|
+
throw new Error('CleanSlate received an invalid session-refresh response. Try again.');
|
|
33
|
+
}
|
|
34
|
+
if (generation === this.generation) {
|
|
35
|
+
this.rotations.set(current, { ...response });
|
|
36
|
+
}
|
|
37
|
+
return response;
|
|
38
|
+
}).finally(() => {
|
|
39
|
+
if (this.requests.get(current) === request) {
|
|
40
|
+
this.requests.delete(current);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
this.requests.set(current, request);
|
|
44
|
+
return request;
|
|
45
|
+
}
|
|
46
|
+
clear() {
|
|
47
|
+
this.generation++;
|
|
48
|
+
this.rotations.clear();
|
|
49
|
+
this.requests.clear();
|
|
50
|
+
}
|
|
51
|
+
resolveResponse(token) {
|
|
52
|
+
let response;
|
|
53
|
+
const visited = new Set();
|
|
54
|
+
while (!visited.has(token)) {
|
|
55
|
+
visited.add(token);
|
|
56
|
+
const next = this.rotations.get(token);
|
|
57
|
+
if (!next) {
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
response = next;
|
|
61
|
+
token = next.token;
|
|
62
|
+
}
|
|
63
|
+
return response;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=cleanSlateManagedTokenCoordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanSlateManagedTokenCoordinator.js","sourceRoot":"","sources":["../../src/protocol/cleanSlateManagedTokenCoordinator.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAMhG;gFACgF;AAChF,MAAM,OAAO,iCAAiC;IAK7C,YAA6B,MAAkF;QAAlF,WAAM,GAAN,MAAM,CAA4E;QAJ9F,cAAS,GAAG,IAAI,GAAG,EAAkD,CAAC;QACtE,aAAQ,GAAG,IAAI,GAAG,EAA2D,CAAC;QACvF,eAAU,GAAG,CAAC,CAAC;IAE4F,CAAC;IAEpH,OAAO,CAAC,KAAa;QACpB,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,KAAa;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACb,OAAO,OAAO,CAAC;QAChB,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,IAAI,KAAK,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,2EAA2E;QAC3E,6EAA6E;QAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAClF,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;YACxF,CAAC;YACD,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,QAAQ,CAAC;QACjB,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACf,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,OAAO,EAAE,CAAC;gBAC5C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;QACF,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAEO,eAAe,CAAC,KAAa;QACpC,IAAI,QAA4D,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,MAAM;YACP,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC;YAChB,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC;CACD"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Event } from '../core/event.js';
|
|
2
|
+
import type { CleanSlateStreamPart } from '../agent/cleanSlateAgentTypes.js';
|
|
3
|
+
export type CleanSlateChildAgentKind = 'worker' | 'researcher';
|
|
4
|
+
export type CleanSlateChildAgentStatus = 'queued' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
5
|
+
export interface ICleanSlateSpawnAgentRequest {
|
|
6
|
+
description: string;
|
|
7
|
+
prompt: string;
|
|
8
|
+
kind?: CleanSlateChildAgentKind;
|
|
9
|
+
parentAgentId?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ICleanSlateChildAgentSnapshot {
|
|
12
|
+
id: string;
|
|
13
|
+
parentAgentId?: string;
|
|
14
|
+
kind: CleanSlateChildAgentKind;
|
|
15
|
+
description: string;
|
|
16
|
+
prompt: string;
|
|
17
|
+
status: CleanSlateChildAgentStatus;
|
|
18
|
+
createdAt: number;
|
|
19
|
+
startedAt?: number;
|
|
20
|
+
completedAt?: number;
|
|
21
|
+
output?: string;
|
|
22
|
+
error?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ICleanSlateChildAgentEvent {
|
|
25
|
+
type: 'created' | 'started' | 'progress' | 'completed' | 'failed' | 'cancelled';
|
|
26
|
+
agent: ICleanSlateChildAgentSnapshot;
|
|
27
|
+
delta?: string;
|
|
28
|
+
/** Native runtime event used by hosts to render the child with their normal chat UI. */
|
|
29
|
+
streamPart?: CleanSlateStreamPart;
|
|
30
|
+
}
|
|
31
|
+
export interface ICleanSlateChildAgentExecutionContext {
|
|
32
|
+
id: string;
|
|
33
|
+
signal: AbortSignal;
|
|
34
|
+
emitProgress(delta: string): void;
|
|
35
|
+
emitStreamPart(part: CleanSlateStreamPart): void;
|
|
36
|
+
}
|
|
37
|
+
export type CleanSlateChildAgentExecutor = (request: Readonly<ICleanSlateSpawnAgentRequest>, context: ICleanSlateChildAgentExecutionContext) => Promise<string>;
|
|
38
|
+
export interface ICleanSlateAgentCoordinatorOptions {
|
|
39
|
+
maxConcurrentAgents?: number;
|
|
40
|
+
createId?: () => string;
|
|
41
|
+
now?: () => number;
|
|
42
|
+
}
|
|
43
|
+
export interface ICleanSlateWaitForAgentOptions {
|
|
44
|
+
timeoutMs?: number;
|
|
45
|
+
signal?: AbortSignal;
|
|
46
|
+
}
|
|
47
|
+
/** Model-only completion envelope shared by every host runtime. */
|
|
48
|
+
export declare function formatCleanSlateChildAgentNotification(agent: ICleanSlateChildAgentSnapshot): string;
|
|
49
|
+
/**
|
|
50
|
+
* Host-independent lifecycle owner for child agents.
|
|
51
|
+
*
|
|
52
|
+
* The model-facing tool delegates here; the host only supplies the function
|
|
53
|
+
* that actually runs a child. This keeps identities, cancellation and status
|
|
54
|
+
* consistent across the editor, CLI and third-party SDK hosts.
|
|
55
|
+
*/
|
|
56
|
+
export declare class CleanSlateAgentCoordinator {
|
|
57
|
+
private readonly executor;
|
|
58
|
+
private readonly agents;
|
|
59
|
+
private readonly controllers;
|
|
60
|
+
private readonly completions;
|
|
61
|
+
private readonly _onDidChangeAgent;
|
|
62
|
+
readonly onDidChangeAgent: Event<ICleanSlateChildAgentEvent>;
|
|
63
|
+
private readonly maxConcurrentAgents;
|
|
64
|
+
private readonly createId;
|
|
65
|
+
private readonly now;
|
|
66
|
+
constructor(executor: CleanSlateChildAgentExecutor, options?: ICleanSlateAgentCoordinatorOptions);
|
|
67
|
+
listAgents(parentAgentId?: string): ICleanSlateChildAgentSnapshot[];
|
|
68
|
+
getAgent(id: string): ICleanSlateChildAgentSnapshot | undefined;
|
|
69
|
+
spawnAgent(request: ICleanSlateSpawnAgentRequest, parentSignal?: AbortSignal): Promise<ICleanSlateChildAgentSnapshot>;
|
|
70
|
+
waitForAgent(id: string, options?: ICleanSlateWaitForAgentOptions): Promise<ICleanSlateChildAgentSnapshot>;
|
|
71
|
+
private executeAgent;
|
|
72
|
+
cancelAgent(id: string, reason?: string): boolean;
|
|
73
|
+
private markCancelled;
|
|
74
|
+
private abortReason;
|
|
75
|
+
private normalizeRequest;
|
|
76
|
+
private runningCount;
|
|
77
|
+
private isTerminal;
|
|
78
|
+
private update;
|
|
79
|
+
private fire;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=cleanSlateAgentCoordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanSlateAgentCoordinator.d.ts","sourceRoot":"","sources":["../../src/services/cleanSlateAgentCoordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) CleanSlate. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { Emitter } from '../core/event.js';
|
|
6
|
+
/** Model-only completion envelope shared by every host runtime. */
|
|
7
|
+
export function formatCleanSlateChildAgentNotification(agent) {
|
|
8
|
+
const payload = JSON.stringify({
|
|
9
|
+
agentId: agent.id,
|
|
10
|
+
description: agent.description,
|
|
11
|
+
status: agent.status,
|
|
12
|
+
output: agent.output,
|
|
13
|
+
error: agent.error
|
|
14
|
+
});
|
|
15
|
+
return `<child_agent_notification>${payload.slice(0, 12000)}</child_agent_notification>`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Host-independent lifecycle owner for child agents.
|
|
19
|
+
*
|
|
20
|
+
* The model-facing tool delegates here; the host only supplies the function
|
|
21
|
+
* that actually runs a child. This keeps identities, cancellation and status
|
|
22
|
+
* consistent across the editor, CLI and third-party SDK hosts.
|
|
23
|
+
*/
|
|
24
|
+
export class CleanSlateAgentCoordinator {
|
|
25
|
+
constructor(executor, options = {}) {
|
|
26
|
+
this.executor = executor;
|
|
27
|
+
this.agents = new Map();
|
|
28
|
+
this.controllers = new Map();
|
|
29
|
+
this.completions = new Map();
|
|
30
|
+
this._onDidChangeAgent = new Emitter();
|
|
31
|
+
this.onDidChangeAgent = this._onDidChangeAgent.event;
|
|
32
|
+
this.maxConcurrentAgents = Math.max(1, Math.floor(options.maxConcurrentAgents ?? 4));
|
|
33
|
+
this.createId = options.createId ?? (() => `agent-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`);
|
|
34
|
+
this.now = options.now ?? Date.now;
|
|
35
|
+
}
|
|
36
|
+
listAgents(parentAgentId) {
|
|
37
|
+
return Array.from(this.agents.values())
|
|
38
|
+
.filter(agent => parentAgentId === undefined || agent.parentAgentId === parentAgentId)
|
|
39
|
+
.map(agent => ({ ...agent }))
|
|
40
|
+
.sort((left, right) => left.createdAt - right.createdAt);
|
|
41
|
+
}
|
|
42
|
+
getAgent(id) {
|
|
43
|
+
const agent = this.agents.get(id);
|
|
44
|
+
return agent ? { ...agent } : undefined;
|
|
45
|
+
}
|
|
46
|
+
async spawnAgent(request, parentSignal) {
|
|
47
|
+
const normalized = this.normalizeRequest(request);
|
|
48
|
+
if (this.runningCount() >= this.maxConcurrentAgents) {
|
|
49
|
+
throw new Error(`Child agent limit reached (${this.maxConcurrentAgents}). Wait for an active agent to finish.`);
|
|
50
|
+
}
|
|
51
|
+
const id = this.createId();
|
|
52
|
+
const created = {
|
|
53
|
+
id,
|
|
54
|
+
parentAgentId: normalized.parentAgentId,
|
|
55
|
+
kind: normalized.kind ?? 'worker',
|
|
56
|
+
description: normalized.description,
|
|
57
|
+
prompt: normalized.prompt,
|
|
58
|
+
status: 'queued',
|
|
59
|
+
createdAt: this.now()
|
|
60
|
+
};
|
|
61
|
+
this.agents.set(id, created);
|
|
62
|
+
this.fire('created', created);
|
|
63
|
+
const controller = new AbortController();
|
|
64
|
+
this.controllers.set(id, controller);
|
|
65
|
+
const abortFromParent = () => {
|
|
66
|
+
this.cancelAgent(id, this.abortReason(parentSignal?.reason, 'Cancelled by parent agent.'));
|
|
67
|
+
};
|
|
68
|
+
if (parentSignal?.aborted) {
|
|
69
|
+
abortFromParent();
|
|
70
|
+
this.controllers.delete(id);
|
|
71
|
+
return this.getAgent(id) ?? created;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
parentSignal?.addEventListener('abort', abortFromParent, { once: true });
|
|
75
|
+
}
|
|
76
|
+
const running = this.update(id, { status: 'running', startedAt: this.now() }, 'started');
|
|
77
|
+
const completion = this.executeAgent(id, normalized, controller, parentSignal, abortFromParent);
|
|
78
|
+
this.completions.set(id, completion);
|
|
79
|
+
void completion.finally(() => this.completions.delete(id));
|
|
80
|
+
return running;
|
|
81
|
+
}
|
|
82
|
+
async waitForAgent(id, options = {}) {
|
|
83
|
+
const current = this.getAgent(id);
|
|
84
|
+
if (!current) {
|
|
85
|
+
throw new Error(`Unknown child agent: ${id}`);
|
|
86
|
+
}
|
|
87
|
+
if (this.isTerminal(current.status)) {
|
|
88
|
+
return current;
|
|
89
|
+
}
|
|
90
|
+
const completion = this.completions.get(id);
|
|
91
|
+
if (!completion) {
|
|
92
|
+
return current;
|
|
93
|
+
}
|
|
94
|
+
const timeoutMs = Math.max(0, Math.floor(options.timeoutMs ?? 0));
|
|
95
|
+
return new Promise((resolve, reject) => {
|
|
96
|
+
let settled = false;
|
|
97
|
+
let timer;
|
|
98
|
+
let listener;
|
|
99
|
+
const finish = (callback) => {
|
|
100
|
+
if (settled) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
settled = true;
|
|
104
|
+
if (timer !== undefined) {
|
|
105
|
+
clearTimeout(timer);
|
|
106
|
+
}
|
|
107
|
+
options.signal?.removeEventListener('abort', onAbort);
|
|
108
|
+
listener?.dispose();
|
|
109
|
+
callback();
|
|
110
|
+
};
|
|
111
|
+
const onAbort = () => finish(() => reject(options.signal?.reason ?? new Error('Waiting for child agent was cancelled.')));
|
|
112
|
+
if (options.signal?.aborted) {
|
|
113
|
+
onAbort();
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
options.signal?.addEventListener('abort', onAbort, { once: true });
|
|
117
|
+
listener = this.onDidChangeAgent(event => {
|
|
118
|
+
if (event.agent.id === id && this.isTerminal(event.agent.status)) {
|
|
119
|
+
finish(() => resolve(event.agent));
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
if (timeoutMs > 0) {
|
|
123
|
+
timer = setTimeout(() => finish(() => resolve(this.getAgent(id) ?? current)), timeoutMs);
|
|
124
|
+
}
|
|
125
|
+
void completion.then(agent => finish(() => resolve(agent)), error => finish(() => reject(error)));
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
async executeAgent(id, request, controller, parentSignal, abortFromParent) {
|
|
129
|
+
try {
|
|
130
|
+
const output = await this.executor(request, {
|
|
131
|
+
id,
|
|
132
|
+
signal: controller.signal,
|
|
133
|
+
emitProgress: delta => {
|
|
134
|
+
if (typeof delta === 'string' && delta.length > 0) {
|
|
135
|
+
const current = this.agents.get(id);
|
|
136
|
+
if (!current || this.isTerminal(current.status)) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const next = { ...current, output: `${current.output ?? ''}${delta}` };
|
|
140
|
+
this.agents.set(id, next);
|
|
141
|
+
this.fire('progress', next, delta);
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
emitStreamPart: streamPart => {
|
|
145
|
+
const delta = (streamPart.type === 'chat_text' || streamPart.type === 'text')
|
|
146
|
+
? streamPart.content
|
|
147
|
+
: undefined;
|
|
148
|
+
const current = this.agents.get(id);
|
|
149
|
+
if (!current || this.isTerminal(current.status)) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const next = delta ? { ...current, output: `${current.output ?? ''}${delta}` } : current;
|
|
153
|
+
if (next !== current) {
|
|
154
|
+
this.agents.set(id, next);
|
|
155
|
+
}
|
|
156
|
+
this.fire('progress', next, delta, streamPart);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
if (controller.signal.aborted) {
|
|
160
|
+
return this.markCancelled(id);
|
|
161
|
+
}
|
|
162
|
+
return this.update(id, { status: 'completed', completedAt: this.now(), output }, 'completed');
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
if (controller.signal.aborted) {
|
|
166
|
+
return this.markCancelled(id);
|
|
167
|
+
}
|
|
168
|
+
return this.update(id, {
|
|
169
|
+
status: 'failed',
|
|
170
|
+
completedAt: this.now(),
|
|
171
|
+
error: error instanceof Error ? error.message : String(error)
|
|
172
|
+
}, 'failed');
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
parentSignal?.removeEventListener('abort', abortFromParent);
|
|
176
|
+
this.controllers.delete(id);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
cancelAgent(id, reason = 'Cancelled by host.') {
|
|
180
|
+
const controller = this.controllers.get(id);
|
|
181
|
+
const current = this.agents.get(id);
|
|
182
|
+
if (!controller || !current || this.isTerminal(current.status)) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
// Cancellation is a lifecycle transition, not merely a request to the
|
|
186
|
+
// executor. Publish it synchronously so hosts can unlock their composers
|
|
187
|
+
// even when an underlying command takes time to react to AbortSignal.
|
|
188
|
+
this.markCancelled(id);
|
|
189
|
+
controller.abort(reason);
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
markCancelled(id) {
|
|
193
|
+
const current = this.agents.get(id);
|
|
194
|
+
if (!current) {
|
|
195
|
+
throw new Error(`Unknown child agent: ${id}`);
|
|
196
|
+
}
|
|
197
|
+
if (this.isTerminal(current.status)) {
|
|
198
|
+
return { ...current };
|
|
199
|
+
}
|
|
200
|
+
return this.update(id, { status: 'cancelled', completedAt: this.now() }, 'cancelled');
|
|
201
|
+
}
|
|
202
|
+
abortReason(reason, fallback) {
|
|
203
|
+
if (reason instanceof Error && reason.message.trim()) {
|
|
204
|
+
return reason.message;
|
|
205
|
+
}
|
|
206
|
+
return typeof reason === 'string' && reason.trim() ? reason : fallback;
|
|
207
|
+
}
|
|
208
|
+
normalizeRequest(request) {
|
|
209
|
+
const description = request?.description?.trim();
|
|
210
|
+
const prompt = request?.prompt?.trim();
|
|
211
|
+
if (!description) {
|
|
212
|
+
throw new Error('A child agent description is required.');
|
|
213
|
+
}
|
|
214
|
+
if (!prompt) {
|
|
215
|
+
throw new Error('A child agent prompt is required.');
|
|
216
|
+
}
|
|
217
|
+
const kind = request.kind ?? 'worker';
|
|
218
|
+
if (kind !== 'worker' && kind !== 'researcher') {
|
|
219
|
+
throw new Error(`Unsupported child agent kind: ${String(kind)}`);
|
|
220
|
+
}
|
|
221
|
+
return { ...request, description, prompt, kind };
|
|
222
|
+
}
|
|
223
|
+
runningCount() {
|
|
224
|
+
return Array.from(this.agents.values()).filter(agent => agent.status === 'queued' || agent.status === 'running').length;
|
|
225
|
+
}
|
|
226
|
+
isTerminal(status) {
|
|
227
|
+
return status === 'completed' || status === 'failed' || status === 'cancelled';
|
|
228
|
+
}
|
|
229
|
+
update(id, patch, eventType) {
|
|
230
|
+
const current = this.agents.get(id);
|
|
231
|
+
if (!current) {
|
|
232
|
+
throw new Error(`Unknown child agent: ${id}`);
|
|
233
|
+
}
|
|
234
|
+
const next = { ...current, ...patch };
|
|
235
|
+
this.agents.set(id, next);
|
|
236
|
+
this.fire(eventType, next);
|
|
237
|
+
return { ...next };
|
|
238
|
+
}
|
|
239
|
+
fire(type, agent, delta, streamPart) {
|
|
240
|
+
this._onDidChangeAgent.fire({ type, agent: { ...agent }, delta, streamPart });
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=cleanSlateAgentCoordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanSlateAgentCoordinator.js","sourceRoot":"","sources":["../../src/services/cleanSlateAgentCoordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Event } from '../core/event.js';
|
|
2
|
+
import type { ICleanSlateThreadMessage } from './cleanSlateThreadService.js';
|
|
3
|
+
export type CleanSlateConversationKind = 'primary' | 'side-chat' | 'child-agent';
|
|
4
|
+
export interface ICleanSlateConversationBranch {
|
|
5
|
+
id: string;
|
|
6
|
+
parentId?: string;
|
|
7
|
+
kind: CleanSlateConversationKind;
|
|
8
|
+
title: string;
|
|
9
|
+
createdAt: number;
|
|
10
|
+
updatedAt: number;
|
|
11
|
+
messages: ICleanSlateThreadMessage[];
|
|
12
|
+
}
|
|
13
|
+
/** A small, renderer-free conversation tree for SDK hosts. */
|
|
14
|
+
export declare class CleanSlateConversationBranchService {
|
|
15
|
+
private readonly createId;
|
|
16
|
+
private readonly now;
|
|
17
|
+
private readonly branches;
|
|
18
|
+
private readonly _onDidChangeBranch;
|
|
19
|
+
readonly onDidChangeBranch: Event<ICleanSlateConversationBranch>;
|
|
20
|
+
constructor(createId?: () => string, now?: () => number);
|
|
21
|
+
createBranch(options?: {
|
|
22
|
+
parentId?: string;
|
|
23
|
+
kind?: CleanSlateConversationKind;
|
|
24
|
+
title?: string;
|
|
25
|
+
inheritMessages?: boolean;
|
|
26
|
+
}): ICleanSlateConversationBranch;
|
|
27
|
+
getBranch(id: string): ICleanSlateConversationBranch | undefined;
|
|
28
|
+
listBranches(parentId?: string): ICleanSlateConversationBranch[];
|
|
29
|
+
appendMessage(id: string, message: ICleanSlateThreadMessage): ICleanSlateConversationBranch;
|
|
30
|
+
removeBranch(id: string): boolean;
|
|
31
|
+
private publish;
|
|
32
|
+
private clone;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=cleanSlateConversationBranchService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanSlateConversationBranchService.d.ts","sourceRoot":"","sources":["../../src/services/cleanSlateConversationBranchService.ts"],"names":[],"mappings":"AAKA,OAAO,EAAW,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAE7E,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;AAEjF,MAAM,WAAW,6BAA6B;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,0BAA0B,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,wBAAwB,EAAE,CAAC;CACrC;AAED,8DAA8D;AAC9D,qBAAa,mCAAmC;IAM9C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IANrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoD;IAC7E,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAgD;IACnF,QAAQ,CAAC,iBAAiB,EAAE,KAAK,CAAC,6BAA6B,CAAC,CAAiC;gBAG/E,QAAQ,GAAE,MAAM,MAAqF,EACrG,GAAG,GAAE,MAAM,MAAiB;IAG9C,YAAY,CAAC,OAAO,GAAE;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,0BAA0B,CAAC;QAClC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,OAAO,CAAC;KACrB,GAAG,6BAA6B;IAmBtC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,6BAA6B,GAAG,SAAS;IAKhE,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,6BAA6B,EAAE;IAOhE,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,6BAA6B;IAU3F,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAOjC,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,KAAK;CAMb"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) CleanSlate. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { Emitter } from '../core/event.js';
|
|
6
|
+
/** A small, renderer-free conversation tree for SDK hosts. */
|
|
7
|
+
export class CleanSlateConversationBranchService {
|
|
8
|
+
constructor(createId = () => `conversation-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`, now = Date.now) {
|
|
9
|
+
this.createId = createId;
|
|
10
|
+
this.now = now;
|
|
11
|
+
this.branches = new Map();
|
|
12
|
+
this._onDidChangeBranch = new Emitter();
|
|
13
|
+
this.onDidChangeBranch = this._onDidChangeBranch.event;
|
|
14
|
+
}
|
|
15
|
+
createBranch(options = {}) {
|
|
16
|
+
const parent = options.parentId ? this.branches.get(options.parentId) : undefined;
|
|
17
|
+
if (options.parentId && !parent) {
|
|
18
|
+
throw new Error(`Unknown parent conversation: ${options.parentId}`);
|
|
19
|
+
}
|
|
20
|
+
const timestamp = this.now();
|
|
21
|
+
const branch = {
|
|
22
|
+
id: this.createId(),
|
|
23
|
+
parentId: options.parentId,
|
|
24
|
+
kind: options.kind ?? (parent ? 'side-chat' : 'primary'),
|
|
25
|
+
title: options.title?.trim() || (parent ? 'Side chat' : 'Conversation'),
|
|
26
|
+
createdAt: timestamp,
|
|
27
|
+
updatedAt: timestamp,
|
|
28
|
+
messages: options.inheritMessages && parent ? parent.messages.map(message => ({ ...message, images: message.images ? [...message.images] : undefined })) : []
|
|
29
|
+
};
|
|
30
|
+
this.branches.set(branch.id, branch);
|
|
31
|
+
return this.publish(branch);
|
|
32
|
+
}
|
|
33
|
+
getBranch(id) {
|
|
34
|
+
const branch = this.branches.get(id);
|
|
35
|
+
return branch ? this.clone(branch) : undefined;
|
|
36
|
+
}
|
|
37
|
+
listBranches(parentId) {
|
|
38
|
+
return Array.from(this.branches.values())
|
|
39
|
+
.filter(branch => parentId === undefined || branch.parentId === parentId)
|
|
40
|
+
.map(branch => this.clone(branch))
|
|
41
|
+
.sort((left, right) => left.createdAt - right.createdAt);
|
|
42
|
+
}
|
|
43
|
+
appendMessage(id, message) {
|
|
44
|
+
const branch = this.branches.get(id);
|
|
45
|
+
if (!branch) {
|
|
46
|
+
throw new Error(`Unknown conversation: ${id}`);
|
|
47
|
+
}
|
|
48
|
+
branch.messages.push({ ...message, images: message.images ? [...message.images] : undefined });
|
|
49
|
+
branch.updatedAt = this.now();
|
|
50
|
+
return this.publish(branch);
|
|
51
|
+
}
|
|
52
|
+
removeBranch(id) {
|
|
53
|
+
if (Array.from(this.branches.values()).some(branch => branch.parentId === id)) {
|
|
54
|
+
throw new Error('Remove child conversations before removing their parent.');
|
|
55
|
+
}
|
|
56
|
+
return this.branches.delete(id);
|
|
57
|
+
}
|
|
58
|
+
publish(branch) {
|
|
59
|
+
const snapshot = this.clone(branch);
|
|
60
|
+
this._onDidChangeBranch.fire(snapshot);
|
|
61
|
+
return snapshot;
|
|
62
|
+
}
|
|
63
|
+
clone(branch) {
|
|
64
|
+
return {
|
|
65
|
+
...branch,
|
|
66
|
+
messages: branch.messages.map(message => ({ ...message, images: message.images ? [...message.images] : undefined }))
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=cleanSlateConversationBranchService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanSlateConversationBranchService.js","sourceRoot":"","sources":["../../src/services/cleanSlateConversationBranchService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanSlateTools.d.ts","sourceRoot":"","sources":["../../src/services/cleanSlateTools.ts"],"names":[],"mappings":"AAMA,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAG1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AAGnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AAGjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC"}
|
|
1
|
+
{"version":3,"file":"cleanSlateTools.d.ts","sourceRoot":"","sources":["../../src/services/cleanSlateTools.ts"],"names":[],"mappings":"AAMA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,0CAA0C,CAAC;AACzD,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAG1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AAGnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AAGjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC"}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
// Core Infrastructure
|
|
6
6
|
export * from '../tools/types.js';
|
|
7
|
+
export * from './cleanSlateAgentCoordinator.js';
|
|
8
|
+
export * from './cleanSlateConversationBranchService.js';
|
|
7
9
|
export * from '../tools/utils.js';
|
|
8
10
|
export * from '../tools/registry.js';
|
|
9
11
|
// Discovery Tools
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanSlateTools.js","sourceRoot":"","sources":["../../src/services/cleanSlateTools.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,sBAAsB;AACtB,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAErC,kBAAkB;AAClB,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAE1C,uBAAuB;AACvB,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AAEnD,iBAAiB;AACjB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AAEjD,uBAAuB;AACvB,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC"}
|
|
1
|
+
{"version":3,"file":"cleanSlateTools.js","sourceRoot":"","sources":["../../src/services/cleanSlateTools.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,sBAAsB;AACtB,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,0CAA0C,CAAC;AACzD,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAErC,kBAAkB;AAClB,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAE1C,uBAAuB;AACvB,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AAEnD,iBAAiB;AACjB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AAEjD,uBAAuB;AACvB,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrowserAutomationTools.d.ts","sourceRoot":"","sources":["../../src/tools/BrowserAutomationTools.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAyB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"BrowserAutomationTools.d.ts","sourceRoot":"","sources":["../../src/tools/BrowserAutomationTools.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAyB,MAAM,YAAY,CAAC;AAkBnE,eAAO,MAAM,eAAe,EAAE,cAgE7B,CAAC;AA4KF,eAAO,MAAM,mBAAmB,EAAE,cAgBjC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,cAuB9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,cAe9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAe7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,cAc9B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,cAe/B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,cAe/B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,cAkB/B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,cAkBlC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAiB7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,cAyB5B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,cAiB/B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,cAoBnC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,cAQ/B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,cAapC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAQ7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,cAc/B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,cAkBlC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,cAkBjC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAoB7B,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,cAQxC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,cAQvC,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,cAQxC,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,cAqBzC,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,cAQzC,CAAC"}
|