@modelprofile.com/flexharness 10.17.1 → 10.19.0
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_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/errors.d.ts +4 -0
- package/dist_ts/errors.js +9 -1
- package/dist_ts/functions.toolpermissions.d.ts +24 -0
- package/dist_ts/functions.toolpermissions.js +38 -0
- package/dist_ts/index.d.ts +1 -0
- package/dist_ts/index.js +2 -1
- package/dist_ts/plugins.d.ts +1 -1
- package/dist_ts/plugins.js +1 -1
- package/dist_ts_chat_harness/classes.chatclient.d.ts +95 -0
- package/dist_ts_chat_harness/classes.chatclient.js +263 -0
- package/dist_ts_chat_harness/classes.chatrequesterror.d.ts +4 -0
- package/dist_ts_chat_harness/classes.chatrequesterror.js +8 -0
- package/dist_ts_chat_harness/classes.transcript.d.ts +1 -1
- package/dist_ts_chat_harness/classes.transcript.js +1 -1
- package/dist_ts_chat_harness/functions.intents.d.ts +1 -2
- package/dist_ts_chat_harness/functions.intents.js +1 -1
- package/dist_ts_chat_harness/functions.mapping.d.ts +1 -1
- package/dist_ts_chat_harness/functions.mapping.js +1 -1
- package/dist_ts_chat_harness/index.d.ts +3 -0
- package/dist_ts_chat_harness/index.js +3 -1
- package/dist_ts_chat_harness/interfaces.chat.d.ts +136 -0
- package/dist_ts_chat_harness/interfaces.chat.js +2 -0
- package/dist_ts_chat_harness/plugins.js +1 -1
- package/dist_ts_chat_harness_server/classes.chathub.d.ts +78 -0
- package/dist_ts_chat_harness_server/classes.chathub.js +332 -0
- package/dist_ts_chat_harness_server/classes.chatsubscription.d.ts +55 -0
- package/dist_ts_chat_harness_server/classes.chatsubscription.js +236 -0
- package/dist_ts_chat_harness_server/classes.sessionlists.d.ts +21 -0
- package/dist_ts_chat_harness_server/classes.sessionlists.js +70 -0
- package/dist_ts_chat_harness_server/classes.turngate.d.ts +38 -0
- package/dist_ts_chat_harness_server/classes.turngate.js +207 -0
- package/dist_ts_chat_harness_server/errors.d.ts +5 -0
- package/dist_ts_chat_harness_server/errors.js +9 -0
- package/dist_ts_chat_harness_server/functions.errorprojector.d.ts +11 -0
- package/dist_ts_chat_harness_server/functions.errorprojector.js +32 -0
- package/dist_ts_chat_harness_server/functions.validation.d.ts +18 -0
- package/dist_ts_chat_harness_server/functions.validation.js +88 -0
- package/dist_ts_chat_harness_server/index.d.ts +4 -0
- package/dist_ts_chat_harness_server/index.js +4 -0
- package/dist_ts_chat_harness_server/interfaces.d.ts +67 -0
- package/dist_ts_chat_harness_server/interfaces.js +2 -0
- package/dist_ts_chat_harness_server/plugins.d.ts +7 -0
- package/dist_ts_chat_harness_server/plugins.js +6 -0
- package/dist_ts_chat_harness_typedsocket/classes.clienttransport.d.ts +22 -0
- package/dist_ts_chat_harness_typedsocket/classes.clienttransport.js +55 -0
- package/dist_ts_chat_harness_typedsocket/classes.serverbinding.d.ts +46 -0
- package/dist_ts_chat_harness_typedsocket/classes.serverbinding.js +110 -0
- package/dist_ts_chat_harness_typedsocket/index.d.ts +3 -0
- package/dist_ts_chat_harness_typedsocket/index.js +3 -0
- package/dist_ts_chat_harness_typedsocket/interfaces.requests.d.ts +38 -0
- package/dist_ts_chat_harness_typedsocket/interfaces.requests.js +2 -0
- package/dist_ts_chat_harness_typedsocket/plugins.d.ts +9 -0
- package/dist_ts_chat_harness_typedsocket/plugins.js +8 -0
- package/dist_ts_ocr/ocr.mistral.d.ts +20 -1
- package/dist_ts_ocr/ocr.mistral.js +66 -43
- package/dist_ts_tools/tool.filesystem.d.ts +2 -0
- package/dist_ts_tools/tool.filesystem.js +42 -1
- package/dist_ts_tools_node/classes.workspacereversion.d.ts +48 -0
- package/dist_ts_tools_node/classes.workspacereversion.js +202 -0
- package/dist_ts_tools_node/functions.fileimages.d.ts +22 -0
- package/dist_ts_tools_node/functions.fileimages.js +87 -0
- package/dist_ts_tools_node/index.d.ts +3 -1
- package/dist_ts_tools_node/index.js +2 -1
- package/dist_ts_tools_node/plugins.d.ts +1 -0
- package/dist_ts_tools_node/tool.context.d.ts +20 -0
- package/dist_ts_tools_node/tool.context.js +25 -4
- package/package.json +28 -4
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/errors.ts +10 -0
- package/ts/functions.toolpermissions.ts +60 -0
- package/ts/index.ts +6 -0
- package/ts/plugins.ts +1 -0
- package/ts_chat_harness/classes.chatclient.ts +343 -0
- package/ts_chat_harness/classes.chatrequesterror.ts +7 -0
- package/ts_chat_harness/classes.transcript.ts +1 -1
- package/ts_chat_harness/functions.intents.ts +2 -2
- package/ts_chat_harness/functions.mapping.ts +1 -1
- package/ts_chat_harness/index.ts +20 -0
- package/ts_chat_harness/interfaces.chat.ts +108 -0
- package/ts_chat_harness/readme.md +24 -0
- package/ts_chat_harness_server/classes.chathub.ts +400 -0
- package/ts_chat_harness_server/classes.chatsubscription.ts +257 -0
- package/ts_chat_harness_server/classes.sessionlists.ts +90 -0
- package/ts_chat_harness_server/classes.turngate.ts +247 -0
- package/ts_chat_harness_server/errors.ts +9 -0
- package/ts_chat_harness_server/functions.errorprojector.ts +40 -0
- package/ts_chat_harness_server/functions.validation.ts +104 -0
- package/ts_chat_harness_server/index.ts +19 -0
- package/ts_chat_harness_server/interfaces.ts +92 -0
- package/ts_chat_harness_server/plugins.ts +62 -0
- package/ts_chat_harness_server/readme.md +91 -0
- package/ts_chat_harness_typedsocket/classes.clienttransport.ts +87 -0
- package/ts_chat_harness_typedsocket/classes.serverbinding.ts +172 -0
- package/ts_chat_harness_typedsocket/index.ts +17 -0
- package/ts_chat_harness_typedsocket/interfaces.requests.ts +40 -0
- package/ts_chat_harness_typedsocket/plugins.ts +28 -0
- package/ts_chat_harness_typedsocket/readme.md +57 -0
- package/ts_ocr/ocr.mistral.ts +102 -49
- package/ts_ocr/readme.md +12 -1
- package/ts_tools/readme.md +10 -0
- package/ts_tools/tool.filesystem.ts +55 -0
- package/ts_tools_node/classes.workspacereversion.ts +255 -0
- package/ts_tools_node/functions.fileimages.ts +89 -0
- package/ts_tools_node/index.ts +7 -1
- package/ts_tools_node/plugins.ts +11 -0
- package/ts_tools_node/readme.md +27 -0
- package/ts_tools_node/tool.context.ts +49 -3
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@modelprofile.com/flexharness',
|
|
6
|
-
version: '10.
|
|
6
|
+
version: '10.19.0',
|
|
7
7
|
description: 'The FlexHarness toolbox source repository and shared dependency catalog.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSwrQkFBK0I7SUFDckMsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLDBFQUEwRTtDQUN4RixDQUFBIn0=
|
package/dist_ts/errors.d.ts
CHANGED
|
@@ -60,6 +60,10 @@ export declare class FlexHarnessExternalError extends FlexHarnessError {
|
|
|
60
60
|
export declare class FlexHarnessPermissionRejectedError extends FlexHarnessError {
|
|
61
61
|
constructor(permissionId: string, options?: ErrorOptions);
|
|
62
62
|
}
|
|
63
|
+
export declare class FlexHarnessToolPermissionDeniedError extends FlexHarnessError {
|
|
64
|
+
readonly permissionType: string;
|
|
65
|
+
constructor(permissionType: string);
|
|
66
|
+
}
|
|
63
67
|
export declare class FlexHarnessPermissionStateError extends FlexHarnessError {
|
|
64
68
|
constructor(message: string);
|
|
65
69
|
}
|
package/dist_ts/errors.js
CHANGED
|
@@ -118,6 +118,14 @@ export class FlexHarnessPermissionRejectedError extends FlexHarnessError {
|
|
|
118
118
|
this.name = 'FlexHarnessPermissionRejectedError';
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
|
+
export class FlexHarnessToolPermissionDeniedError extends FlexHarnessError {
|
|
122
|
+
permissionType;
|
|
123
|
+
constructor(permissionType) {
|
|
124
|
+
super('FLEX_TOOL_PERMISSION_DENIED', `The tool policy denies "${permissionType}" requests.`);
|
|
125
|
+
this.name = 'FlexHarnessToolPermissionDeniedError';
|
|
126
|
+
this.permissionType = permissionType;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
121
129
|
export class FlexHarnessPermissionStateError extends FlexHarnessError {
|
|
122
130
|
constructor(message) {
|
|
123
131
|
super('FLEX_PERMISSION_STATE', message);
|
|
@@ -194,4 +202,4 @@ export function modelLimitErrorInfo(error) {
|
|
|
194
202
|
export function errorMessage(error) {
|
|
195
203
|
return error instanceof Error ? error.message : String(error);
|
|
196
204
|
}
|
|
197
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBR3hDLE1BQU0sb0JBQW9CLEdBQTRDO0lBQ3BFLFdBQVcsRUFBRSxrQkFBa0I7SUFDL0IsVUFBVSxFQUFFLGlCQUFpQjtDQUM5QixDQUFDO0FBRUYsTUFBTSxPQUFPLGdCQUFpQixTQUFRLEtBQUs7SUFDekIsSUFBSSxDQUFTO0lBRTdCLFlBQVksSUFBWSxFQUFFLE9BQWUsRUFBRSxPQUFzQjtRQUMvRCxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLDBCQUEyQixTQUFRLGdCQUFnQjtJQUM5RCxZQUFZLE9BQWUsRUFBRSxPQUFzQjtRQUNqRCxLQUFLLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxJQUFJLEdBQUcsNEJBQTRCLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGdCQUFnQjtJQUMxRDtRQUNFLEtBQUssQ0FBQyxhQUFhLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsSUFBSSxHQUFHLHdCQUF3QixDQUFDO0lBQ3ZDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxnQkFBZ0I7SUFDNUQsWUFBWSxRQUFnQixFQUFFLEVBQVU7UUFDdEMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsUUFBUSxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsSUFBSSxHQUFHLDBCQUEwQixDQUFD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
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import type { IFlexToolProviderContext } from './interfaces.js';
|
|
3
|
+
/** What a tool permission request of one `type` gets: granted, asked of the session's controller, or refused. */
|
|
4
|
+
export type TFlexToolPermissionDecision = 'allow' | 'ask' | 'deny';
|
|
5
|
+
export interface IFlexToolPermissionRequesterOptions {
|
|
6
|
+
/** The decision per tool request `type`, such as `{ write: 'allow', shell: 'ask' }`. */
|
|
7
|
+
policy?: Readonly<Record<string, TFlexToolPermissionDecision>>;
|
|
8
|
+
/** The decision for a type the policy does not name. Defaults to `ask`. */
|
|
9
|
+
defaultDecision?: TFlexToolPermissionDecision;
|
|
10
|
+
/**
|
|
11
|
+
* The key an `always` answer is remembered under for the session. Defaults to the request's type
|
|
12
|
+
* and a digest of its metadata, so an approval covers exactly the same request again. Return
|
|
13
|
+
* `undefined` to require an answer for every request.
|
|
14
|
+
*/
|
|
15
|
+
rememberKey?: (request: plugins.IToolPermissionRequest) => string | undefined;
|
|
16
|
+
}
|
|
17
|
+
/** A tool permission handler, as `IToolExecutionContext.requestPermission` takes it. */
|
|
18
|
+
export type TFlexToolPermissionRequester = (request: plugins.IToolPermissionRequest) => Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Connects the permission requests of the `/tools` factories (`write`, `delete`, `shell`, ...) to a
|
|
21
|
+
* FlexHarness run: a request the policy allows passes, one it denies fails the tool call, and every
|
|
22
|
+
* other one becomes a pending FlexHarness permission the session's controller answers.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createFlexToolPermissionRequester(context: Pick<IFlexToolProviderContext<unknown>, 'requestPermission'>, options?: IFlexToolPermissionRequesterOptions): TFlexToolPermissionRequester;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { FlexHarnessToolPermissionDeniedError } from './errors.js';
|
|
3
|
+
import { normalizeJsonValue } from './utils.json.js';
|
|
4
|
+
const defaultRememberKey = (requestArg) => {
|
|
5
|
+
const digest = plugins.crypto
|
|
6
|
+
.createHash('sha256')
|
|
7
|
+
.update(JSON.stringify(normalizeJsonValue(requestArg.metadata ?? null)))
|
|
8
|
+
.digest('hex')
|
|
9
|
+
.slice(0, 32);
|
|
10
|
+
return `tool:${requestArg.type}:${digest}`;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Connects the permission requests of the `/tools` factories (`write`, `delete`, `shell`, ...) to a
|
|
14
|
+
* FlexHarness run: a request the policy allows passes, one it denies fails the tool call, and every
|
|
15
|
+
* other one becomes a pending FlexHarness permission the session's controller answers.
|
|
16
|
+
*/
|
|
17
|
+
export function createFlexToolPermissionRequester(context, options = {}) {
|
|
18
|
+
const policy = options.policy ?? {};
|
|
19
|
+
const defaultDecision = options.defaultDecision ?? 'ask';
|
|
20
|
+
const rememberKeyOf = options.rememberKey ?? defaultRememberKey;
|
|
21
|
+
return async (requestArg) => {
|
|
22
|
+
requestArg.abortSignal?.throwIfAborted();
|
|
23
|
+
const decision = Object.hasOwn(policy, requestArg.type) ? policy[requestArg.type] : defaultDecision;
|
|
24
|
+
if (decision === 'allow')
|
|
25
|
+
return;
|
|
26
|
+
if (decision === 'deny')
|
|
27
|
+
throw new FlexHarnessToolPermissionDeniedError(requestArg.type);
|
|
28
|
+
const rememberKey = rememberKeyOf(requestArg);
|
|
29
|
+
await context.requestPermission({
|
|
30
|
+
kind: requestArg.type,
|
|
31
|
+
description: requestArg.title,
|
|
32
|
+
...(requestArg.toolCallId === undefined ? {} : { toolCallId: requestArg.toolCallId }),
|
|
33
|
+
...(rememberKey === undefined ? {} : { rememberKey }),
|
|
34
|
+
...(requestArg.metadata === undefined ? {} : { metadata: normalizeJsonValue(requestArg.metadata) }),
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLnRvb2xwZXJtaXNzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2Z1bmN0aW9ucy50b29scGVybWlzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRW5FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBcUJyRCxNQUFNLGtCQUFrQixHQUFHLENBQUMsVUFBMEMsRUFBVSxFQUFFO0lBQ2hGLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNO1NBQzFCLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDcEIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3ZFLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDYixLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sUUFBUSxVQUFVLENBQUMsSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDO0FBQzdDLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsaUNBQWlDLENBQy9DLE9BQXFFLEVBQ3JFLFVBQStDLEVBQUU7SUFFakQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDcEMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsSUFBSSxLQUFLLENBQUM7SUFDekQsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxrQkFBa0IsQ0FBQztJQUNoRSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRTtRQUMxQixVQUFVLENBQUMsV0FBVyxFQUFFLGNBQWMsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO1FBQ3BHLElBQUksUUFBUSxLQUFLLE9BQU87WUFBRSxPQUFPO1FBQ2pDLElBQUksUUFBUSxLQUFLLE1BQU07WUFBRSxNQUFNLElBQUksb0NBQW9DLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pGLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxNQUFNLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztZQUM5QixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7WUFDckIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1lBQzdCLEdBQUcsQ0FBQyxVQUFVLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckYsR0FBRyxDQUFDLFdBQVcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUNyRCxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7U0FDcEcsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQyJ9
|
package/dist_ts/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export * from './classes.stores.js';
|
|
|
3
3
|
export { FlexToolCatalog } from './classes.toolcatalog.js';
|
|
4
4
|
export * from './errors.js';
|
|
5
5
|
export * from './interfaces.js';
|
|
6
|
+
export { createFlexToolPermissionRequester, type IFlexToolPermissionRequesterOptions, type TFlexToolPermissionDecision, type TFlexToolPermissionRequester, } from './functions.toolpermissions.js';
|
|
6
7
|
export { normalizeJsonValue } from './utils.json.js';
|
|
7
8
|
export { assertFlexProjectManagementSnapshot, assertFlexProjectManagementRecord, assertFlexProjectManagementTombstone, createEmptyFlexProjectManagementSnapshot, } from './utils.projectmanagement.js';
|
|
8
9
|
export { FLEX_SLASH_COMMAND_MAX_INPUT_BYTES, isReservedSlashCommandName, isValidSlashCommandName, parseSlashCommand, } from './utils.slashcommands.js';
|
package/dist_ts/index.js
CHANGED
|
@@ -3,7 +3,8 @@ export * from './classes.stores.js';
|
|
|
3
3
|
export { FlexToolCatalog } from './classes.toolcatalog.js';
|
|
4
4
|
export * from './errors.js';
|
|
5
5
|
export * from './interfaces.js';
|
|
6
|
+
export { createFlexToolPermissionRequester, } from './functions.toolpermissions.js';
|
|
6
7
|
export { normalizeJsonValue } from './utils.json.js';
|
|
7
8
|
export { assertFlexProjectManagementSnapshot, assertFlexProjectManagementRecord, assertFlexProjectManagementTombstone, createEmptyFlexProjectManagementSnapshot, } from './utils.projectmanagement.js';
|
|
8
9
|
export { FLEX_SLASH_COMMAND_MAX_INPUT_BYTES, isReservedSlashCommandName, isValidSlashCommandName, parseSlashCommand, } from './utils.slashcommands.js';
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsT0FBTyxFQUNMLGlDQUFpQyxHQUlsQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFDTCxtQ0FBbUMsRUFDbkMsaUNBQWlDLEVBQ2pDLG9DQUFvQyxFQUNwQyx3Q0FBd0MsR0FDekMsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQ0wsa0NBQWtDLEVBQ2xDLDBCQUEwQixFQUMxQix1QkFBdUIsRUFDdkIsaUJBQWlCLEdBQ2xCLE1BQU0sMEJBQTBCLENBQUMifQ==
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -70,7 +70,7 @@ export interface ICodeSandboxEngine {
|
|
|
70
70
|
export declare const importCodeSandboxEngine: () => Promise<ICodeSandboxEngine>;
|
|
71
71
|
import { AgentEventStoreConflictError, AgentPendingInputQueue, AgentPendingInputRejectedError, AgentSession, AgentToolCallScheduler, buildModelMessages, ToolJobStoreConflictError, createAgentEvent, filterModelVisibleAgentEvents, getAgentGenerationTransactions, isGenerationInModelContext, modelMessagesToAgentEvents, tool, validateAgentEventArchiveV2, validateAgentEventSnapshotV2, z } from '@modelprofile.com/flexharness-agent';
|
|
72
72
|
export { AgentEventStoreConflictError, AgentPendingInputQueue, AgentPendingInputRejectedError, AgentSession, AgentToolCallScheduler, buildModelMessages, ToolJobStoreConflictError, createAgentEvent, filterModelVisibleAgentEvents, getAgentGenerationTransactions, isGenerationInModelContext, modelMessagesToAgentEvents, tool, validateAgentEventArchiveV2, validateAgentEventSnapshotV2, z, };
|
|
73
|
-
export type { IAgentAppliedInput, ISmartAiCacheDispatch, IAgentEventArchiveV2, IAgentContextCompactionOptions, IAgentEventSnapshotV2, IAgentEventStoreV2, IAgentGenerateResult, IAgentGenerationHandle, IAgentGenerationLease, IAgentRetryEvent, IAgentRunResult, IAgentSession, IAgentSessionOptions, IAgentToolCallUpdateEvent, IAgentToolExecutionOptions, IAgentRuntimeEventPayload, IGenerationBegunEvent, IGenerationExecutionCompletedEvent, IGenerationExecutionStartedEvent, IGenerationOutcomeEvent, IToolExecutionContext, IToolExecutionIntentEvent, IToolJobSnapshot, IToolJobState, IToolJobStore, TAgentContextBuilder, TAgentContextCompactor, TAgentEvent, TAgentGenerationOutcome, TAgentModelCallUsage, TAgentModelCallUsageEvent, TAgentObservedModelCallUsage, TAgentRetryReason, TAgentToolCallFinishEvent, TAgentToolExecutionReconciliationOptions, } from '@modelprofile.com/flexharness-agent';
|
|
73
|
+
export type { IAgentAppliedInput, ISmartAiCacheDispatch, IAgentEventArchiveV2, IAgentContextCompactionOptions, IAgentEventSnapshotV2, IAgentEventStoreV2, IAgentGenerateResult, IAgentGenerationHandle, IAgentGenerationLease, IAgentRetryEvent, IAgentRunResult, IAgentSession, IAgentSessionOptions, IAgentToolCallUpdateEvent, IAgentToolExecutionOptions, IAgentRuntimeEventPayload, IGenerationBegunEvent, IGenerationExecutionCompletedEvent, IGenerationExecutionStartedEvent, IGenerationOutcomeEvent, IToolExecutionContext, IToolExecutionIntentEvent, IToolJobSnapshot, IToolJobState, IToolJobStore, IToolPermissionRequest, TAgentContextBuilder, TAgentContextCompactor, TAgentEvent, TAgentGenerationOutcome, TAgentModelCallUsage, TAgentModelCallUsageEvent, TAgentObservedModelCallUsage, TAgentRetryReason, TAgentToolCallFinishEvent, TAgentToolExecutionReconciliationOptions, } from '@modelprofile.com/flexharness-agent';
|
|
74
74
|
import { getSmartAiCacheWaitMs, isModelLimitError, isModelLimitInfo } from '@modelprofile.com/flexharness-models';
|
|
75
75
|
export { getSmartAiCacheWaitMs, isModelLimitError, isModelLimitInfo };
|
|
76
76
|
export type { IModelLimitInfo } from '@modelprofile.com/flexharness-models';
|
package/dist_ts/plugins.js
CHANGED
|
@@ -27,4 +27,4 @@ import { AgentEventStoreConflictError, AgentPendingInputQueue, AgentPendingInput
|
|
|
27
27
|
export { AgentEventStoreConflictError, AgentPendingInputQueue, AgentPendingInputRejectedError, AgentSession, AgentToolCallScheduler, buildModelMessages, ToolJobStoreConflictError, createAgentEvent, filterModelVisibleAgentEvents, getAgentGenerationTransactions, isGenerationInModelContext, modelMessagesToAgentEvents, tool, validateAgentEventArchiveV2, validateAgentEventSnapshotV2, z, };
|
|
28
28
|
import { getSmartAiCacheWaitMs, isModelLimitError, isModelLimitInfo } from '@modelprofile.com/flexharness-models';
|
|
29
29
|
export { getSmartAiCacheWaitMs, isModelLimitError, isModelLimitInfo };
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkMsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFFbEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFFL0Msb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLElBQUksbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0FBa0VyRCxtRUFBbUU7QUFDbkUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxJQUFpQyxFQUFFO0lBQzdFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUMvQyxNQUFNLENBQUMseUJBQXlCLENBQUM7UUFDakMsTUFBTSxDQUFDLHdDQUF3QyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxPQUFPLENBQUM7S0FDaEIsQ0FBQyxDQUFDO0lBQ0gsNEZBQTRGO0lBQzVGLE1BQU0sY0FBYyxHQUFJLE9BQWdDLENBQUMsT0FBcUUsQ0FBQztJQUMvSCxPQUFPO1FBQ0wsU0FBUyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsK0JBQStCLENBQUMsY0FBYyxDQUE4QjtRQUM5RyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSTtLQUNqRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsb0JBQW9CO0FBQ3BCLE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsc0JBQXNCLEVBQ3RCLDhCQUE4QixFQUM5QixZQUFZLEVBQ1osc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQix5QkFBeUIsRUFDekIsZ0JBQWdCLEVBQ2hCLDZCQUE2QixFQUM3Qiw4QkFBOEIsRUFDOUIsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUMxQixJQUFJLEVBQ0osMkJBQTJCLEVBQzNCLDRCQUE0QixFQUM1QixDQUFDLEdBQ0YsTUFBTSxxQ0FBcUMsQ0FBQztBQUU3QyxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHNCQUFzQixFQUN0Qiw4QkFBOEIsRUFDOUIsWUFBWSxFQUNaLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIseUJBQXlCLEVBQ3pCLGdCQUFnQixFQUNoQiw2QkFBNkIsRUFDN0IsOEJBQThCLEVBQzlCLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsSUFBSSxFQUNKLDJCQUEyQixFQUMzQiw0QkFBNEIsRUFDNUIsQ0FBQyxHQUNGLENBQUM7QUF3Q0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFbEgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLENBQUMifQ==
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type * as plugins from './plugins.js';
|
|
2
|
+
import type { TJsonValue } from '@modelprofile.com/flexharness';
|
|
3
|
+
import type { IFlexHarnessChatHistoryState, IFlexHarnessChatSessionsPush, IFlexHarnessChatSteerOutcome, IFlexHarnessChatToolRequest, IFlexHarnessChatUpdate, TFlexHarnessChatMethod, TFlexHarnessChatRequest, TFlexHarnessChatResponse } from './interfaces.chat.js';
|
|
4
|
+
/** Where a `FlexHarnessChatClient` hands the hub's pushes. */
|
|
5
|
+
export interface IFlexHarnessChatPushHandlers {
|
|
6
|
+
update(push: IFlexHarnessChatUpdate): void;
|
|
7
|
+
sessions(push: IFlexHarnessChatSessionsPush): void;
|
|
8
|
+
/** Runs a tool of a turn; settles at once when the signal aborts. */
|
|
9
|
+
tool(request: IFlexHarnessChatToolRequest, abortSignal: AbortSignal | undefined): Promise<TJsonValue>;
|
|
10
|
+
}
|
|
11
|
+
/** The tab's connection to the hub. It names the tab in every request it carries. */
|
|
12
|
+
export interface IFlexHarnessChatClientTransport {
|
|
13
|
+
request<TMethod extends TFlexHarnessChatMethod>(method: TMethod, request: TFlexHarnessChatRequest<TMethod>): Promise<TFlexHarnessChatResponse<TMethod>>;
|
|
14
|
+
/** Routes the hub's pushes to the handlers until the returned function is called. */
|
|
15
|
+
listen(handlers: IFlexHarnessChatPushHandlers): () => void;
|
|
16
|
+
/** Calls back whenever the connection was lost and is restored, until the returned function is called. */
|
|
17
|
+
onReconnect(callback: () => void): () => void;
|
|
18
|
+
}
|
|
19
|
+
/** What the chat view learns; every member is optional. */
|
|
20
|
+
export interface IFlexHarnessChatClientListener {
|
|
21
|
+
/** the tab (re)attached; its conversations, newest first */
|
|
22
|
+
attached?(sessions: plugins.IHarnessSessionMeta[]): void;
|
|
23
|
+
sessions?(sessions: plugins.IHarnessSessionMeta[]): void;
|
|
24
|
+
/** the rows of the open conversation, in order; deltas mutate these objects */
|
|
25
|
+
rows?(rows: plugins.IHarnessMessage[]): void;
|
|
26
|
+
delta?(delta: plugins.THarnessStreamDelta): void;
|
|
27
|
+
status?(status: plugins.IHarnessStatus): void;
|
|
28
|
+
usage?(usage: plugins.IHarnessUsage): void;
|
|
29
|
+
permissions?(permissions: plugins.IHarnessPermissionRequest[]): void;
|
|
30
|
+
history?(history: IFlexHarnessChatHistoryState): void;
|
|
31
|
+
steer?(outcome: IFlexHarnessChatSteerOutcome): void;
|
|
32
|
+
/** the open conversation could not be followed again and was closed; the message says why */
|
|
33
|
+
closed?(message: string): void;
|
|
34
|
+
/** attaching again after a reconnect failed; the message says why */
|
|
35
|
+
error?(message: string): void;
|
|
36
|
+
}
|
|
37
|
+
/** Runs one tool of a turn in this tab and answers with what the model reads. */
|
|
38
|
+
export type TFlexHarnessChatToolExecutor = (input: TJsonValue, context: {
|
|
39
|
+
toolCallId: string;
|
|
40
|
+
abortSignal?: AbortSignal;
|
|
41
|
+
}) => Promise<TJsonValue>;
|
|
42
|
+
export interface IFlexHarnessChatClientOptions {
|
|
43
|
+
transport: IFlexHarnessChatClientTransport;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* A tab's side of a `FlexHarnessChatHub`: attaches the tab, follows one conversation through
|
|
47
|
+
* numbered updates and opens it again after a gap or a reconnect, sends what the composer emits,
|
|
48
|
+
* and runs the tools of the tab's turns, one after another. `dispose()` releases the transport.
|
|
49
|
+
*/
|
|
50
|
+
export declare class FlexHarnessChatClient {
|
|
51
|
+
private readonly transport;
|
|
52
|
+
private readonly tools;
|
|
53
|
+
private readonly stopListening;
|
|
54
|
+
private readonly stopWatchingReconnects;
|
|
55
|
+
private listener;
|
|
56
|
+
private sessionsById;
|
|
57
|
+
private open;
|
|
58
|
+
/** counts opens and closes, so a failed reopen closes only what nothing replaced meanwhile */
|
|
59
|
+
private openEpoch;
|
|
60
|
+
/** tools run one after another, so a tool never races the one the model called before it */
|
|
61
|
+
private toolQueue;
|
|
62
|
+
private disposed;
|
|
63
|
+
constructor(optionsArg: IFlexHarnessChatClientOptions);
|
|
64
|
+
setListener(listenerArg: IFlexHarnessChatClientListener | null): void;
|
|
65
|
+
/** Runs the named tool when a turn of this tab calls it, until the returned function is called. */
|
|
66
|
+
registerTool(nameArg: string, executorArg: TFlexHarnessChatToolExecutor): () => void;
|
|
67
|
+
/** The conversation the tab follows, if any. */
|
|
68
|
+
get sessionId(): string | null;
|
|
69
|
+
/** Attaches the tab, and follows its open conversation again. */
|
|
70
|
+
attach(): Promise<plugins.IHarnessSessionMeta[]>;
|
|
71
|
+
/** Follows a conversation; its transcript arrives as updates. */
|
|
72
|
+
openSession(sessionIdArg: string): Promise<TFlexHarnessChatResponse<'flexHarnessChatOpen'>>;
|
|
73
|
+
/** Stops following the open conversation; the next message starts a new one. */
|
|
74
|
+
newConversation(): Promise<void>;
|
|
75
|
+
/** Sends a message to the open conversation, or starts a new one with it. */
|
|
76
|
+
send(detailArg: plugins.IHarnessComposerSendDetail, contextArg: TJsonValue): Promise<TFlexHarnessChatResponse<'flexHarnessChatSend'>>;
|
|
77
|
+
abort(): Promise<void>;
|
|
78
|
+
/** Answers a permission card of the open conversation (`harness-permission-response`). */
|
|
79
|
+
respondToPermission(detailArg: plugins.IHarnessPermissionResponseDetail): Promise<void>;
|
|
80
|
+
/** Undoes the open conversation's last turn; the conversation is shown again from a reset. */
|
|
81
|
+
undo(): Promise<string>;
|
|
82
|
+
redo(): Promise<string>;
|
|
83
|
+
renameSession(sessionIdArg: string, titleArg: string): Promise<void>;
|
|
84
|
+
deleteSession(sessionIdArg: string): Promise<void>;
|
|
85
|
+
/** Stops taking pushes and reconnects; the tab's tools are no longer run. */
|
|
86
|
+
dispose(): void;
|
|
87
|
+
private requireOpenSessionId;
|
|
88
|
+
private sessionList;
|
|
89
|
+
private clear;
|
|
90
|
+
/** Follows the conversation again; when that fails, closes it and says why. */
|
|
91
|
+
private reopen;
|
|
92
|
+
private applySessions;
|
|
93
|
+
private applyUpdate;
|
|
94
|
+
private runTool;
|
|
95
|
+
}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
const errorText = (errorArg, fallbackArg) => (errorArg instanceof Error && errorArg.message) || fallbackArg;
|
|
2
|
+
/** 128 random bits as hex; `getRandomValues` works on plain http too, unlike `randomUUID`. */
|
|
3
|
+
const randomId = () => Array.from(globalThis.crypto.getRandomValues(new Uint8Array(16)), (byte) => byte.toString(16).padStart(2, '0')).join('');
|
|
4
|
+
/**
|
|
5
|
+
* A tab's side of a `FlexHarnessChatHub`: attaches the tab, follows one conversation through
|
|
6
|
+
* numbered updates and opens it again after a gap or a reconnect, sends what the composer emits,
|
|
7
|
+
* and runs the tools of the tab's turns, one after another. `dispose()` releases the transport.
|
|
8
|
+
*/
|
|
9
|
+
export class FlexHarnessChatClient {
|
|
10
|
+
transport;
|
|
11
|
+
tools = new Map();
|
|
12
|
+
stopListening;
|
|
13
|
+
stopWatchingReconnects;
|
|
14
|
+
listener = null;
|
|
15
|
+
sessionsById = new Map();
|
|
16
|
+
open = null;
|
|
17
|
+
/** counts opens and closes, so a failed reopen closes only what nothing replaced meanwhile */
|
|
18
|
+
openEpoch = 0;
|
|
19
|
+
/** tools run one after another, so a tool never races the one the model called before it */
|
|
20
|
+
toolQueue = Promise.resolve();
|
|
21
|
+
disposed = false;
|
|
22
|
+
constructor(optionsArg) {
|
|
23
|
+
this.transport = optionsArg.transport;
|
|
24
|
+
this.stopListening = this.transport.listen({
|
|
25
|
+
update: (pushArg) => this.applyUpdate(pushArg),
|
|
26
|
+
sessions: (pushArg) => this.applySessions(pushArg),
|
|
27
|
+
tool: (requestArg, abortSignalArg) => this.runTool(requestArg, abortSignalArg),
|
|
28
|
+
});
|
|
29
|
+
this.stopWatchingReconnects = this.transport.onReconnect(() => {
|
|
30
|
+
void this.attach().catch((error) => this.listener?.error?.(errorText(error, 'The conversation could not be reattached after a reconnect.')));
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
setListener(listenerArg) {
|
|
34
|
+
this.listener = listenerArg;
|
|
35
|
+
}
|
|
36
|
+
/** Runs the named tool when a turn of this tab calls it, until the returned function is called. */
|
|
37
|
+
registerTool(nameArg, executorArg) {
|
|
38
|
+
this.tools.set(nameArg, executorArg);
|
|
39
|
+
return () => {
|
|
40
|
+
if (this.tools.get(nameArg) === executorArg)
|
|
41
|
+
this.tools.delete(nameArg);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** The conversation the tab follows, if any. */
|
|
45
|
+
get sessionId() {
|
|
46
|
+
return this.open?.sessionId ?? null;
|
|
47
|
+
}
|
|
48
|
+
/** Attaches the tab, and follows its open conversation again. */
|
|
49
|
+
async attach() {
|
|
50
|
+
const result = await this.transport.request('flexHarnessChatAttach', {});
|
|
51
|
+
this.sessionsById = new Map(result.sessions.map((session) => [session.id, session]));
|
|
52
|
+
// attaching ends the hub's subscription of this tab
|
|
53
|
+
const reopen = this.open?.sessionId;
|
|
54
|
+
this.open = null;
|
|
55
|
+
this.listener?.attached?.(result.sessions);
|
|
56
|
+
if (reopen && this.sessionsById.has(reopen))
|
|
57
|
+
await this.reopen(reopen);
|
|
58
|
+
else if (reopen)
|
|
59
|
+
this.clear();
|
|
60
|
+
return result.sessions;
|
|
61
|
+
}
|
|
62
|
+
/** Follows a conversation; its transcript arrives as updates. */
|
|
63
|
+
async openSession(sessionIdArg) {
|
|
64
|
+
this.openEpoch++;
|
|
65
|
+
const open = {
|
|
66
|
+
sessionId: sessionIdArg,
|
|
67
|
+
subscriptionId: randomId(),
|
|
68
|
+
nextSeq: 1,
|
|
69
|
+
rows: new Map(),
|
|
70
|
+
order: [],
|
|
71
|
+
};
|
|
72
|
+
// registered before the request: updates can overtake its answer
|
|
73
|
+
this.open = open;
|
|
74
|
+
try {
|
|
75
|
+
return await this.transport.request('flexHarnessChatOpen', {
|
|
76
|
+
sessionId: sessionIdArg,
|
|
77
|
+
subscriptionId: open.subscriptionId,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (this.open === open)
|
|
82
|
+
this.open = null;
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/** Stops following the open conversation; the next message starts a new one. */
|
|
87
|
+
async newConversation() {
|
|
88
|
+
const open = this.open;
|
|
89
|
+
this.clear();
|
|
90
|
+
if (open)
|
|
91
|
+
await this.transport.request('flexHarnessChatClose', { subscriptionId: open.subscriptionId });
|
|
92
|
+
}
|
|
93
|
+
/** Sends a message to the open conversation, or starts a new one with it. */
|
|
94
|
+
async send(detailArg, contextArg) {
|
|
95
|
+
const sessionId = this.open?.sessionId;
|
|
96
|
+
const result = await this.transport.request('flexHarnessChatSend', {
|
|
97
|
+
...(sessionId ? { sessionId } : {}),
|
|
98
|
+
send: { delivery: detailArg.delivery, text: detailArg.text, attachments: detailArg.attachments },
|
|
99
|
+
context: contextArg,
|
|
100
|
+
});
|
|
101
|
+
if (result.sessionId !== this.open?.sessionId)
|
|
102
|
+
await this.openSession(result.sessionId);
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
async abort() {
|
|
106
|
+
const sessionId = this.open?.sessionId;
|
|
107
|
+
if (sessionId)
|
|
108
|
+
await this.transport.request('flexHarnessChatAbort', { sessionId });
|
|
109
|
+
}
|
|
110
|
+
/** Answers a permission card of the open conversation (`harness-permission-response`). */
|
|
111
|
+
async respondToPermission(detailArg) {
|
|
112
|
+
// the card reports a remembered approval as `remember`, which FlexHarness calls `always`
|
|
113
|
+
await this.transport.request('flexHarnessChatPermission', {
|
|
114
|
+
sessionId: this.requireOpenSessionId(),
|
|
115
|
+
permissionId: detailArg.requestId,
|
|
116
|
+
decision: detailArg.response === 'reject' ? 'reject' : detailArg.remember ? 'always' : 'once',
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/** Undoes the open conversation's last turn; the conversation is shown again from a reset. */
|
|
120
|
+
async undo() {
|
|
121
|
+
return (await this.transport.request('flexHarnessChatHistory', {
|
|
122
|
+
sessionId: this.requireOpenSessionId(),
|
|
123
|
+
direction: 'undo',
|
|
124
|
+
})).runId;
|
|
125
|
+
}
|
|
126
|
+
async redo() {
|
|
127
|
+
return (await this.transport.request('flexHarnessChatHistory', {
|
|
128
|
+
sessionId: this.requireOpenSessionId(),
|
|
129
|
+
direction: 'redo',
|
|
130
|
+
})).runId;
|
|
131
|
+
}
|
|
132
|
+
async renameSession(sessionIdArg, titleArg) {
|
|
133
|
+
const result = await this.transport.request('flexHarnessChatSessionUpdate', { sessionId: sessionIdArg, title: titleArg });
|
|
134
|
+
this.sessionsById.set(result.session.id, result.session);
|
|
135
|
+
this.listener?.sessions?.(this.sessionList());
|
|
136
|
+
}
|
|
137
|
+
async deleteSession(sessionIdArg) {
|
|
138
|
+
await this.transport.request('flexHarnessChatSessionDelete', { sessionId: sessionIdArg });
|
|
139
|
+
this.sessionsById.delete(sessionIdArg);
|
|
140
|
+
this.listener?.sessions?.(this.sessionList());
|
|
141
|
+
if (this.open?.sessionId === sessionIdArg)
|
|
142
|
+
this.clear();
|
|
143
|
+
}
|
|
144
|
+
/** Stops taking pushes and reconnects; the tab's tools are no longer run. */
|
|
145
|
+
dispose() {
|
|
146
|
+
if (this.disposed)
|
|
147
|
+
return;
|
|
148
|
+
this.disposed = true;
|
|
149
|
+
this.stopListening();
|
|
150
|
+
this.stopWatchingReconnects();
|
|
151
|
+
this.tools.clear();
|
|
152
|
+
this.listener = null;
|
|
153
|
+
this.open = null;
|
|
154
|
+
}
|
|
155
|
+
requireOpenSessionId() {
|
|
156
|
+
const sessionId = this.open?.sessionId;
|
|
157
|
+
if (!sessionId)
|
|
158
|
+
throw new Error('No conversation is open.');
|
|
159
|
+
return sessionId;
|
|
160
|
+
}
|
|
161
|
+
sessionList() {
|
|
162
|
+
return [...this.sessionsById.values()].sort((left, right) => (right.updatedAt ?? 0) - (left.updatedAt ?? 0));
|
|
163
|
+
}
|
|
164
|
+
clear() {
|
|
165
|
+
this.openEpoch++;
|
|
166
|
+
this.open = null;
|
|
167
|
+
this.listener?.rows?.([]);
|
|
168
|
+
this.listener?.permissions?.([]);
|
|
169
|
+
this.listener?.status?.({ type: 'idle' });
|
|
170
|
+
this.listener?.usage?.({});
|
|
171
|
+
}
|
|
172
|
+
/** Follows the conversation again; when that fails, closes it and says why. */
|
|
173
|
+
async reopen(sessionIdArg) {
|
|
174
|
+
const reopening = this.openSession(sessionIdArg);
|
|
175
|
+
const epoch = this.openEpoch;
|
|
176
|
+
try {
|
|
177
|
+
await reopening;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
// another conversation was opened or a new one started meanwhile: that one stays
|
|
181
|
+
if (this.openEpoch !== epoch)
|
|
182
|
+
return;
|
|
183
|
+
this.clear();
|
|
184
|
+
this.listener?.closed?.(errorText(error, 'The conversation could not be opened again.'));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
applySessions(pushArg) {
|
|
188
|
+
for (const id of pushArg.deletedIds)
|
|
189
|
+
this.sessionsById.delete(id);
|
|
190
|
+
for (const session of pushArg.upserts)
|
|
191
|
+
this.sessionsById.set(session.id, session);
|
|
192
|
+
this.listener?.sessions?.(this.sessionList());
|
|
193
|
+
}
|
|
194
|
+
applyUpdate(updateArg) {
|
|
195
|
+
const open = this.open;
|
|
196
|
+
if (!open || updateArg.subscriptionId !== open.subscriptionId)
|
|
197
|
+
return;
|
|
198
|
+
if (updateArg.seq !== open.nextSeq) {
|
|
199
|
+
// an update was lost: read the conversation again
|
|
200
|
+
void this.reopen(open.sessionId);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
open.nextSeq++;
|
|
204
|
+
if (updateArg.reset)
|
|
205
|
+
open.rows.clear();
|
|
206
|
+
if (updateArg.rows) {
|
|
207
|
+
for (const row of updateArg.rows.upserts)
|
|
208
|
+
open.rows.set(row.id, row);
|
|
209
|
+
open.order = updateArg.rows.order;
|
|
210
|
+
const kept = new Set(open.order);
|
|
211
|
+
for (const id of [...open.rows.keys()]) {
|
|
212
|
+
if (!kept.has(id))
|
|
213
|
+
open.rows.delete(id);
|
|
214
|
+
}
|
|
215
|
+
this.listener?.rows?.(open.order.flatMap((id) => open.rows.get(id) ?? []));
|
|
216
|
+
}
|
|
217
|
+
for (const delta of updateArg.deltas ?? [])
|
|
218
|
+
this.listener?.delta?.(delta);
|
|
219
|
+
if (updateArg.status)
|
|
220
|
+
this.listener?.status?.(updateArg.status);
|
|
221
|
+
if (updateArg.usage)
|
|
222
|
+
this.listener?.usage?.(updateArg.usage);
|
|
223
|
+
if (updateArg.permissions)
|
|
224
|
+
this.listener?.permissions?.(updateArg.permissions);
|
|
225
|
+
if (updateArg.history)
|
|
226
|
+
this.listener?.history?.(updateArg.history);
|
|
227
|
+
for (const steer of updateArg.steers ?? [])
|
|
228
|
+
this.listener?.steer?.(steer);
|
|
229
|
+
}
|
|
230
|
+
runTool(requestArg, abortSignalArg) {
|
|
231
|
+
const run = this.toolQueue.then(() => {
|
|
232
|
+
abortSignalArg?.throwIfAborted();
|
|
233
|
+
const executor = this.tools.get(requestArg.name);
|
|
234
|
+
if (!executor)
|
|
235
|
+
throw new Error(`This tab does not run the tool "${requestArg.name}".`);
|
|
236
|
+
return untilAborted(executor(requestArg.input, {
|
|
237
|
+
toolCallId: requestArg.toolCallId,
|
|
238
|
+
...(abortSignalArg ? { abortSignal: abortSignalArg } : {}),
|
|
239
|
+
}), abortSignalArg);
|
|
240
|
+
});
|
|
241
|
+
this.toolQueue = run.catch(() => undefined);
|
|
242
|
+
return run;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/** The work's result, or a rejection as soon as the signal aborts; the work itself may run on. */
|
|
246
|
+
const untilAborted = (workArg, signalArg) => {
|
|
247
|
+
if (!signalArg)
|
|
248
|
+
return workArg;
|
|
249
|
+
if (signalArg.aborted)
|
|
250
|
+
return Promise.reject(signalArg.reason ?? new Error('The tool call was cancelled.'));
|
|
251
|
+
return new Promise((resolve, reject) => {
|
|
252
|
+
const onAbort = () => reject(signalArg.reason ?? new Error('The tool call was cancelled.'));
|
|
253
|
+
signalArg.addEventListener('abort', onAbort, { once: true });
|
|
254
|
+
workArg.then((value) => {
|
|
255
|
+
signalArg.removeEventListener('abort', onAbort);
|
|
256
|
+
resolve(value);
|
|
257
|
+
}, (error) => {
|
|
258
|
+
signalArg.removeEventListener('abort', onAbort);
|
|
259
|
+
reject(error);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
};
|
|
263
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jaGF0Y2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfY2hhdF9oYXJuZXNzL2NsYXNzZXMuY2hhdGNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF1RUEsTUFBTSxTQUFTLEdBQUcsQ0FBQyxRQUFpQixFQUFFLFdBQW1CLEVBQVUsRUFBRSxDQUNuRSxDQUFDLFFBQVEsWUFBWSxLQUFLLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFdBQVcsQ0FBQztBQUVqRSw4RkFBOEY7QUFDOUYsTUFBTSxRQUFRLEdBQUcsR0FBVyxFQUFFLENBQzVCLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRTNIOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8scUJBQXFCO0lBQ2YsU0FBUyxDQUFrQztJQUMzQyxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXdDLENBQUM7SUFDeEQsYUFBYSxDQUFhO0lBQzFCLHNCQUFzQixDQUFhO0lBQzVDLFFBQVEsR0FBMEMsSUFBSSxDQUFDO0lBQ3ZELFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBdUMsQ0FBQztJQUM5RCxJQUFJLEdBQTZCLElBQUksQ0FBQztJQUM5Qyw4RkFBOEY7SUFDdEYsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUN0Qiw0RkFBNEY7SUFDcEYsU0FBUyxHQUFxQixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEQsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUV6QixZQUFZLFVBQXlDO1FBQ25ELElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxD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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** A chat request the hub refuses; its message is written for the person in the tab. */
|
|
2
|
+
export class FlexHarnessChatRequestError extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'FlexHarnessChatRequestError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jaGF0cmVxdWVzdGVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfY2hhdF9oYXJuZXNzL2NsYXNzZXMuY2hhdHJlcXVlc3RlcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3RkFBd0Y7QUFDeEYsTUFBTSxPQUFPLDJCQUE0QixTQUFRLEtBQUs7SUFDcEQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsNkJBQTZCLENBQUM7SUFDNUMsQ0FBQztDQUNGIn0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type * as plugins from './plugins.js';
|
|
2
|
-
import type { IFlexMessage, IFlexPermissionRequest, IFlexProjectStateResult, IFlexSession, TFlexHarnessEvent } from '
|
|
2
|
+
import type { IFlexMessage, IFlexPermissionRequest, IFlexProjectStateResult, IFlexSession, TFlexHarnessEvent } from '@modelprofile.com/flexharness';
|
|
3
3
|
export interface IFlexHarnessTranscriptOptions {
|
|
4
4
|
scopeId: string;
|
|
5
5
|
sessionId: string;
|