@modelprofile.com/flexharness 9.6.1 → 9.7.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/classes.flexharness.d.ts +7 -0
- package/dist_ts/classes.flexharness.js +186 -16
- package/dist_ts/interfaces.d.ts +26 -1
- package/dist_ts/interfaces.js +2 -1
- package/dist_ts/utils.harnessoptions.d.ts +1 -1
- package/dist_ts/utils.harnessoptions.js +1 -1
- package/dist_ts/utils.json.js +10 -1
- package/dist_ts/utils.validation.d.ts +2 -0
- package/dist_ts/utils.validation.js +16 -2
- package/package.json +3 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.flexharness.ts +250 -11
- package/ts/interfaces.ts +32 -0
- package/ts/utils.harnessoptions.ts +1 -1
- package/ts/utils.json.ts +12 -0
- package/ts/utils.validation.ts +19 -0
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import { FlexHarnessValidationError } from './errors.js';
|
|
3
|
-
import { FLEX_PROJECT_MANAGEMENT_LIMITS, FLEX_SESSION_GENERATION_COHORT_MAX_ENTRIES, FLEX_SESSION_GENERATION_ID_MAX_BYTES, } from './interfaces.js';
|
|
3
|
+
import { FLEX_PROJECT_MANAGEMENT_LIMITS, FLEX_SESSION_GENERATION_COHORT_MAX_ENTRIES, FLEX_SESSION_GENERATION_ID_MAX_BYTES, FLEX_SESSION_CONFIGURATION_REF_MAX_BYTES, } from './interfaces.js';
|
|
4
4
|
const maxProjectedErrorNameBytes = 128;
|
|
5
5
|
const maxProjectedErrorMessageBytes = 2048;
|
|
6
6
|
const maxProjectedErrorCodeBytes = 128;
|
|
7
7
|
const controlCharacterPattern = /[\u0000-\u001f\u007f]/u;
|
|
8
|
+
const configurationControlCharacterPattern = /[\u0000-\u001f\u007f-\u009f]/u;
|
|
9
|
+
const unpairedSurrogatePattern = /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u;
|
|
10
|
+
export function isValidSessionConfigurationRef(value) {
|
|
11
|
+
return typeof value === 'string'
|
|
12
|
+
&& Boolean(value.trim())
|
|
13
|
+
&& Buffer.byteLength(value, 'utf8') <= FLEX_SESSION_CONFIGURATION_REF_MAX_BYTES
|
|
14
|
+
&& !configurationControlCharacterPattern.test(value)
|
|
15
|
+
&& !unpairedSurrogatePattern.test(value);
|
|
16
|
+
}
|
|
17
|
+
export function validateSessionConfigurationRef(value) {
|
|
18
|
+
if (!isValidSessionConfigurationRef(value)) {
|
|
19
|
+
throw new FlexHarnessValidationError(`configurationRef must be a non-empty well-formed string without control characters of at most ${FLEX_SESSION_CONFIGURATION_REF_MAX_BYTES} UTF-8 bytes.`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
8
22
|
export function validateIdentifier(value, name) {
|
|
9
23
|
if (typeof value !== 'string' || value.length === 0) {
|
|
10
24
|
throw new FlexHarnessValidationError(`${name} must be a non-empty string.`);
|
|
@@ -248,4 +262,4 @@ export function validateSlashCommandExecutionOptions(options) {
|
|
|
248
262
|
validatePromptOptions(promptOptions, false);
|
|
249
263
|
return promptOptions;
|
|
250
264
|
}
|
|
251
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMudmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3V0aWxzLnZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pELE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsMENBQTBDLEVBQzFDLG9DQUFvQyxHQUNyQyxNQUFNLGlCQUFpQixDQUFDO0FBZXpCLE1BQU0sMEJBQTBCLEdBQUcsR0FBRyxDQUFDO0FBQ3ZDLE1BQU0sNkJBQTZCLEdBQUcsSUFBSSxDQUFDO0FBQzNDLE1BQU0sMEJBQTBCLEdBQUcsR0FBRyxDQUFDO0FBQ3ZDLE1BQU0sdUJBQXVCLEdBQUcsd0JBQXdCLENBQUM7QUFFekQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxJQUFZO0lBQzVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxJQUFJLDBCQUEwQixDQUFDLEdBQUcsSUFBSSw4QkFBOEIsQ0FBQyxDQUFDO0lBQzlFLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxLQUFjLEVBQ2QsSUFBWSxFQUNaLFFBQWdCLEVBQ2hCLFFBQVEsR0FBRyxLQUFLO0lBRWhCLElBQ0UsT0FBTyxLQUFLLEtBQUssUUFBUTtXQUN0QixDQUFDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztXQUMzQixNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxRQUFRLEVBQzlDLENBQUM7UUFDRCxNQUFNLElBQUksMEJBQTBCLENBQ2xDLEdBQUcsSUFBSSxZQUFZLFFBQVEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLHFCQUFxQixRQUFRLGVBQWUsQ0FDaEcsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLDJCQUEyQixDQUN6QyxLQUFjLEVBQ2QsSUFBSSxHQUFHLHFCQUFxQjtJQUU1QixJQUNFLE9BQU8sS0FBSyxLQUFLLFFBQVE7V0FDdEIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFO1dBQ2IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsb0NBQW9DO1dBQ3ZFLHVCQUF1QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFDdEMsQ0FBQztRQUNELE1BQU0sSUFBSSwwQkFBMEIsQ0FDbEMsR0FBRyxJQUFJLHFFQUFxRSxvQ0FBb0MsZUFBZSxDQUNoSSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGlDQUFpQyxDQUFDLEtBQWMsRUFBRSxJQUFZO0lBQ3JFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0RCxNQUFNLElBQUksMEJBQTBCLENBQUMsR0FBRyxJQUFJLDhCQUE4QixDQUFDLENBQUM7SUFDOUUsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLG9DQUFvQyxDQUMzQyxLQUFjLEVBQ2QsSUFBWTtJQUVaLElBQ0UsQ0FBQyxLQUFLO1dBQ0gsT0FBTyxLQUFLLEtBQUssUUFBUTtXQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztXQUNwQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNuRSxDQUFDO1FBQ0QsTUFBTSxJQUFJLDBCQUEwQixDQUFDLEdBQUcsSUFBSSwwQkFBMEIsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxLQUFnQyxDQUFDO0lBQy9DLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsSUFDRSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7V0FDZCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRO2VBQ3hDLENBQUMsQ0FBQyxXQUFXLEVBQUUscUJBQXFCLEVBQUUsMkJBQTJCLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDdEYsQ0FBQztRQUNELE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyxHQUFHLElBQUksK0NBQStDLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ0Qsa0JBQWtCLENBQUMsS0FBSyxDQUFDLFNBQW1CLEVBQUUsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ25FLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLElBQUksc0JBQXNCLENBQUMsQ0FBQztJQUN0RixpQ0FBaUMsQ0FDL0IsS0FBSyxDQUFDLHlCQUF5QixFQUMvQixHQUFHLElBQUksNEJBQTRCLENBQ3BDLENBQUM7SUFDRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDbkIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFtQjtRQUNwQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsbUJBQW1CO1FBQzlDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyx5QkFBeUI7S0FDM0QsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSwwQ0FBMEMsQ0FDeEQsS0FBOEM7SUFLOUMsSUFDRSxDQUFDLEtBQUs7V0FDSCxPQUFPLEtBQUssS0FBSyxRQUFRO1dBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1dBQ3BCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQ25FLENBQUM7UUFDRCxNQUFNLElBQUksMEJBQTBCLENBQ2xDLDZEQUE2RCxDQUM5RCxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsSUFDRSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7V0FDZCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRO2VBQ3hDLENBQUMsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDakQsQ0FBQztRQUNELE1BQU0sSUFBSSwwQkFBMEIsQ0FDbEMseUZBQXlGLENBQzFGLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsb0NBQW9DLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN0RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsMENBQTBDLEVBQUUsQ0FBQztRQUMvRSxNQUFNLElBQUksMEJBQTBCLENBQ2xDLDRCQUE0QiwwQ0FBMEMsV0FBVyxDQUNsRixDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBR2xDLENBQUM7SUFDSixJQUFJLGlCQUFxQyxDQUFDO0lBQzFDLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNqRSxNQUFNLEtBQUssR0FBRyxvQ0FBb0MsQ0FDaEQsUUFBUSxFQUNSLG9CQUFvQixLQUFLLEdBQUcsQ0FDN0IsQ0FBQztRQUNGLElBQUkscUJBQXFCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQy9DLE1BQU0sSUFBSSwwQkFBMEIsQ0FDbEMsa0RBQWtELEtBQUssQ0FBQyxTQUFTLElBQUksQ0FDdEUsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLGlCQUFpQixLQUFLLFNBQVMsSUFBSSxpQkFBaUIsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUUsTUFBTSxJQUFJLDBCQUEwQixDQUNsQyxtRUFBbUUsQ0FDcEUsQ0FBQztRQUNKLENBQUM7UUFDRCxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRCxpQkFBaUIsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLENBQUM7QUFDekMsQ0FBQztBQUVELDhHQUE4RztBQUM5RyxTQUFTLGlCQUFpQixDQUFDLEtBQWM7SUFDdkMsSUFDRSxDQUFDLEtBQUs7V0FDSCxPQUFPLEtBQUssS0FBSyxRQUFRO1dBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1dBQ3BCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25FLE9BQU8sS0FBSyxDQUFDO0lBQ2YsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQzFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0QsT0FBTyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksVUFBVSxLQUFLLFNBQVMsSUFBSSxPQUFPLElBQUksVUFBVSxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxLQUFjO0lBQ3ZELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1NBQ3JELElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDN0MsSUFDRSxjQUFjO1dBQ1gsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztXQUN2RixPQUFPLElBQUksS0FBSyxRQUFRO1dBQ3hCLENBQUMsSUFBSTtXQUNMLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLDBCQUEwQjtXQUM1RCxPQUFPLE9BQU8sS0FBSyxRQUFRO1dBQzNCLENBQUMsT0FBTztXQUNSLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLDZCQUE2QjtXQUNsRSxDQUFDLElBQUksS0FBSyxTQUFTO2VBQ2pCLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUTttQkFDdkIsQ0FBQyxJQUFJO21CQUNMLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLDBCQUEwQixDQUFDLENBQUMsRUFDckUsQ0FBQztRQUNELE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDbkIsSUFBSTtRQUNKLE9BQU87UUFDUCxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztLQUN2RSxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLDRCQUE0QixDQUFDLE9BQWtDO0lBQzdFLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxNQUFNLElBQUksMEJBQTBCLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE1BQU0sSUFBSSwwQkFBMEIsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0lBQ3pHLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxPQUFPLElBQUksR0FBRyxLQUFLLFVBQVUsQ0FBQyxDQUFDO0lBQ2pGLElBQUksY0FBYztRQUFFLE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyxtQ0FBbUMsY0FBYyxJQUFJLENBQUMsQ0FBQztJQUNoSCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNyRixrQkFBa0IsQ0FDaEIsT0FBTyxDQUFDLEtBQUssRUFDYixPQUFPLEVBQ1AsOEJBQThCLENBQUMsYUFBYSxFQUM1QyxJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3ZHLE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEtBQWM7SUFDdEQsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEYsTUFBTSxJQUFJLDBCQUEwQixDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsS0FBYztJQUN4RCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQWM7SUFDbEQsa0JBQWtCLENBQ2hCLEtBQUssRUFDTCxpQkFBaUIsRUFDakIsOEJBQThCLENBQUMsY0FBYyxFQUM3QyxJQUFJLENBQ0wsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsS0FBYztJQUN2RCxrQkFBa0IsQ0FDaEIsS0FBSyxFQUNMLHNCQUFzQixFQUN0Qiw4QkFBOEIsQ0FBQyxtQkFBbUIsRUFDbEQsSUFBSSxDQUNMLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLDhCQUE4QixDQUFDLEtBQWtDO0lBQy9FLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxNQUFNLElBQUksMEJBQTBCLENBQUMsbURBQW1ELENBQUMsQ0FBQztJQUM1RixDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDbkMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekUsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQixNQUFNLElBQUksMEJBQTBCLENBQUMsK0NBQStDLFdBQVcsSUFBSSxDQUFDLENBQUM7SUFDdkcsQ0FBQztJQUNELHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVM7UUFBRSx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEUsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLFNBQVM7UUFBRSwyQkFBMkIsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVELE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyxLQUFrQztJQUMvRSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEUsTUFBTSxJQUFJLDBCQUEwQixDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9GLElBQUksV0FBVyxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLDBCQUEwQixDQUFDLCtDQUErQyxXQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLDBCQUEwQixDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUNELHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUztRQUFFLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUztRQUFFLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4RSxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssU0FBUztRQUFFLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE9BQTJCLEVBQUUsU0FBa0I7SUFDbkYsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3RFLE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxTQUFTO1FBQ3pCLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRixJQUFJLFdBQVc7UUFBRSxNQUFNLElBQUksMEJBQTBCLENBQUMsa0NBQWtDLFdBQVcsSUFBSSxDQUFDLENBQUM7SUFDekcsSUFBSSxPQUFPLENBQUMsU0FBUyxLQUFLLFNBQVM7UUFBRSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTO1FBQUUsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMvRSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEcsTUFBTSxJQUFJLDBCQUEwQixDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsNkJBQTZCLENBQzNDLE9BQW1DO0lBRW5DLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxNQUFNLElBQUksMEJBQTBCLENBQUMsNENBQTRDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxXQUFXLENBQUMsQ0FBQztJQUM1RSxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyxzQ0FBc0MsV0FBVyxJQUFJLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsU0FBUyxLQUFLLFNBQVM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMvQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQzFDLENBQUM7QUFFRCxNQUFNLFVBQVUsb0NBQW9DLENBQ2xELE9BQTBDO0lBRTFDLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxNQUFNLElBQUksMEJBQTBCLENBQUMseURBQXlELENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7U0FDckMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0UsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQixNQUFNLElBQUksMEJBQTBCLENBQ2xDLG1EQUFtRCxXQUFXLElBQUksQ0FDbkUsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxZQUFZLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDN0UsTUFBTSxJQUFJLDBCQUEwQixDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUF1QjtRQUN4QyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVFLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUMxRSxDQUFDO0lBQ0YscUJBQXFCLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVDLE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUMifQ==
|
|
265
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMudmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3V0aWxzLnZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pELE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsMENBQTBDLEVBQzFDLG9DQUFvQyxFQUNwQyx3Q0FBd0MsR0FDekMsTUFBTSxpQkFBaUIsQ0FBQztBQWV6QixNQUFNLDBCQUEwQixHQUFHLEdBQUcsQ0FBQztBQUN2QyxNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQztBQUMzQyxNQUFNLDBCQUEwQixHQUFHLEdBQUcsQ0FBQztBQUN2QyxNQUFNLHVCQUF1QixHQUFHLHdCQUF3QixDQUFDO0FBQ3pELE1BQU0sb0NBQW9DLEdBQUcsK0JBQStCLENBQUM7QUFDN0UsTUFBTSx3QkFBd0IsR0FBRyx5RUFBeUUsQ0FBQztBQUUzRyxNQUFNLFVBQVUsOEJBQThCLENBQUMsS0FBYztJQUMzRCxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVE7V0FDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztXQUNyQixNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSx3Q0FBd0M7V0FDNUUsQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1dBQ2pELENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRCxNQUFNLFVBQVUsK0JBQStCLENBQUMsS0FBYztJQUM1RCxJQUFJLENBQUMsOEJBQThCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMzQyxNQUFNLElBQUksMEJBQTBCLENBQ2xDLGlHQUFpRyx3Q0FBd0MsZUFBZSxDQUN6SixDQUFDO0lBQ0osQ0FB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
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"author": "Task Venture Capital GmbH",
|
|
3
3
|
"license": "MIT",
|
|
4
4
|
"name": "@modelprofile.com/flexharness",
|
|
5
|
-
"version": "9.
|
|
5
|
+
"version": "9.7.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"description": "Managed agent sessions with tools, MCP, chat, OCR, documents and browser control through focused subpath imports.",
|
|
8
8
|
"main": "./dist_ts/index.js",
|
|
@@ -62,8 +62,8 @@
|
|
|
62
62
|
}
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@modelprofile.com/flexharness-agent": "9.
|
|
66
|
-
"@modelprofile.com/flexharness-models": "9.
|
|
65
|
+
"@modelprofile.com/flexharness-agent": "9.7.0",
|
|
66
|
+
"@modelprofile.com/flexharness-models": "9.7.0",
|
|
67
67
|
"@push.rocks/smartrequest": "^5.0.1",
|
|
68
68
|
"ai": "^7.0.107",
|
|
69
69
|
"zod": "^4.4.1"
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -79,6 +79,7 @@ import type {
|
|
|
79
79
|
IFlexPendingReversionRelease,
|
|
80
80
|
IFlexRedoSessionResult,
|
|
81
81
|
IFlexResolvedModel,
|
|
82
|
+
IFlexResolvedSessionConfiguration,
|
|
82
83
|
IFlexResolvedScope,
|
|
83
84
|
IFlexResourceToolProviderDescriptor,
|
|
84
85
|
IFlexRunFinishedEvent,
|
|
@@ -212,6 +213,7 @@ import {
|
|
|
212
213
|
validatePromptOptions,
|
|
213
214
|
validateSlashCommandExecutionOptions,
|
|
214
215
|
validateSessionGenerationId,
|
|
216
|
+
validateSessionConfigurationRef,
|
|
215
217
|
validateUpdateProjectTaskInput,
|
|
216
218
|
validateUpdateSessionOptions,
|
|
217
219
|
validateUtf8String,
|
|
@@ -396,6 +398,7 @@ interface IActiveRun {
|
|
|
396
398
|
reservedUserMessage?: IFlexMessage;
|
|
397
399
|
reservedAssistantMessage?: IFlexMessage;
|
|
398
400
|
modelResolution?: IFlexResolvedModel;
|
|
401
|
+
subagents: ReadonlyMap<string, Readonly<IFlexSubagentDefinition>>;
|
|
399
402
|
delegatedRunAdmissionOwner?: IDelegatedRunAdmissionOwner;
|
|
400
403
|
delegatedRunAdmissionClose?: Promise<void>;
|
|
401
404
|
completion: Promise<IFlexPromptResult>;
|
|
@@ -511,6 +514,20 @@ interface IActiveSlashCommandListing {
|
|
|
511
514
|
completion: Promise<unknown>;
|
|
512
515
|
}
|
|
513
516
|
|
|
517
|
+
interface IResolvedSessionConfiguration<TScope> {
|
|
518
|
+
subagents: ReadonlyMap<string, Readonly<IFlexSubagentDefinition>>;
|
|
519
|
+
slashCommands: ReadonlyMap<string, TRegisteredSlashCommand<TScope>>;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
interface ISessionConfigurationOwner<TScope> {
|
|
523
|
+
storageKey: string;
|
|
524
|
+
sessionId: string;
|
|
525
|
+
controller: AbortController;
|
|
526
|
+
completion: Promise<IResolvedSessionConfiguration<TScope>>;
|
|
527
|
+
settled: boolean;
|
|
528
|
+
waiters: number;
|
|
529
|
+
}
|
|
530
|
+
|
|
514
531
|
interface ISlashCommandInvocationOwner {
|
|
515
532
|
scopeId: string;
|
|
516
533
|
storageKey: string;
|
|
@@ -743,6 +760,7 @@ function containsStoreCommitUncertainty(error: unknown, seen = new Set<unknown>(
|
|
|
743
760
|
export class FlexHarness<TScope = unknown> {
|
|
744
761
|
private readonly scopeResolver: IFlexHarnessOptions<TScope>['scopeResolver'];
|
|
745
762
|
private readonly modelResolver: IFlexHarnessOptions<TScope>['modelResolver'];
|
|
763
|
+
private readonly sessionConfigurationResolver: IFlexHarnessOptions<TScope>['sessionConfigurationResolver'];
|
|
746
764
|
private readonly toolProvider: IFlexHarnessOptions<TScope>['toolProvider'];
|
|
747
765
|
private readonly resourceToolProviderResolver: IFlexHarnessOptions<TScope>['resourceToolProviderResolver'];
|
|
748
766
|
private readonly executionContextProvider: IFlexHarnessOptions<TScope>['executionContextProvider'];
|
|
@@ -764,6 +782,7 @@ export class FlexHarness<TScope = unknown> {
|
|
|
764
782
|
private readonly maxSubagentDepth: number;
|
|
765
783
|
private readonly maxSubagentCallsPerRun: number;
|
|
766
784
|
private readonly stateLoads = new Map<string, Promise<IStorageState>>();
|
|
785
|
+
private readonly sessionConfigurations = new Map<string, ISessionConfigurationOwner<TScope>>();
|
|
767
786
|
private readonly scopeAdmissions = new Map<string, IScopeAdmissionState>();
|
|
768
787
|
private readonly scopeRetirements = new Map<string, Promise<void>>();
|
|
769
788
|
private readonly storageDrains = new Map<string, Promise<void>>();
|
|
@@ -810,6 +829,7 @@ export class FlexHarness<TScope = unknown> {
|
|
|
810
829
|
}
|
|
811
830
|
this.scopeResolver = options.scopeResolver;
|
|
812
831
|
this.modelResolver = options.modelResolver;
|
|
832
|
+
this.sessionConfigurationResolver = options.sessionConfigurationResolver;
|
|
813
833
|
this.toolProvider = options.toolProvider;
|
|
814
834
|
this.resourceToolProviderResolver = options.resourceToolProviderResolver;
|
|
815
835
|
this.executionContextProvider = options.executionContextProvider;
|
|
@@ -878,13 +898,14 @@ export class FlexHarness<TScope = unknown> {
|
|
|
878
898
|
throw new FlexHarnessValidationError('createSession options must be a plain object.');
|
|
879
899
|
}
|
|
880
900
|
const unsupported = Object.keys(options).find(
|
|
881
|
-
(key) => !['sessionId', 'sessionGenerationId', 'title'].includes(key),
|
|
901
|
+
(key) => !['sessionId', 'sessionGenerationId', 'configurationRef', 'title'].includes(key),
|
|
882
902
|
);
|
|
883
903
|
if (unsupported) throw new FlexHarnessValidationError(`createSession does not support "${unsupported}".`);
|
|
884
904
|
const requestedSessionGenerationId = options.sessionGenerationId;
|
|
885
905
|
if (requestedSessionGenerationId !== undefined) {
|
|
886
906
|
validateSessionGenerationId(requestedSessionGenerationId);
|
|
887
907
|
}
|
|
908
|
+
if (options.configurationRef !== undefined) validateSessionConfigurationRef(options.configurationRef);
|
|
888
909
|
const resolved = await this.resolveState(scopeId);
|
|
889
910
|
const sessionId = options.sessionId ?? plugins.crypto.randomUUID();
|
|
890
911
|
validateIdentifier(sessionId, 'sessionId');
|
|
@@ -933,6 +954,7 @@ export class FlexHarness<TScope = unknown> {
|
|
|
933
954
|
sessionId,
|
|
934
955
|
sessionGenerationId: requestedSessionGenerationId ?? createSessionGenerationId(),
|
|
935
956
|
sessionGenerationSequence: resolved.state.revision + 1,
|
|
957
|
+
...(options.configurationRef === undefined ? {} : { configurationRef: options.configurationRef }),
|
|
936
958
|
...(options.title ? { title: options.title } : {}),
|
|
937
959
|
createdAt: timestamp,
|
|
938
960
|
updatedAt: timestamp,
|
|
@@ -1205,6 +1227,9 @@ export class FlexHarness<TScope = unknown> {
|
|
|
1205
1227
|
sessionId,
|
|
1206
1228
|
sessionGenerationId: createSessionGenerationId(),
|
|
1207
1229
|
sessionGenerationSequence: state.revision + 1,
|
|
1230
|
+
...(parent?.session.configurationRef === undefined
|
|
1231
|
+
? {}
|
|
1232
|
+
: { configurationRef: parent.session.configurationRef }),
|
|
1208
1233
|
...(options.title === undefined ? {} : { title: options.title }),
|
|
1209
1234
|
createdAt: options.createdAt,
|
|
1210
1235
|
updatedAt: options.updatedAt,
|
|
@@ -1800,6 +1825,12 @@ export class FlexHarness<TScope = unknown> {
|
|
|
1800
1825
|
): Promise<void> {
|
|
1801
1826
|
const { deletedSessions, descendantRoots } = reservation;
|
|
1802
1827
|
const reason = this.trustInternalError(new FlexHarnessAbortError('The session subtree was deleted.'));
|
|
1828
|
+
const configurationSettlement = this.abortSessionConfigurations(
|
|
1829
|
+
state.storageKey,
|
|
1830
|
+
reason,
|
|
1831
|
+
new Set(deletedSessions.map((deleted) => deleted.sessionId)),
|
|
1832
|
+
);
|
|
1833
|
+
if (configurationSettlement) await configurationSettlement;
|
|
1803
1834
|
const slashCommandErrors: unknown[] = [];
|
|
1804
1835
|
for (const deleted of deletedSessions) {
|
|
1805
1836
|
const listingSettlement = this.abortSlashCommandListings(
|
|
@@ -1940,16 +1971,160 @@ export class FlexHarness<TScope = unknown> {
|
|
|
1940
1971
|
return publicSnapshot(createBoundedTransferMessage(this.requireMessage(stored, messageId)));
|
|
1941
1972
|
}
|
|
1942
1973
|
|
|
1974
|
+
private async resolveSessionConfiguration(
|
|
1975
|
+
scopeId: string,
|
|
1976
|
+
scope: TScope,
|
|
1977
|
+
state: IStorageState,
|
|
1978
|
+
stored: IStoredSessionState,
|
|
1979
|
+
signal?: AbortSignal,
|
|
1980
|
+
): Promise<IResolvedSessionConfiguration<TScope>> {
|
|
1981
|
+
const configurationRef = stored.session.configurationRef;
|
|
1982
|
+
if (configurationRef === undefined) {
|
|
1983
|
+
return { subagents: this.subagents, slashCommands: this.slashCommands };
|
|
1984
|
+
}
|
|
1985
|
+
const sessionId = stored.session.sessionId;
|
|
1986
|
+
const generation = requireSessionGeneration(stored.session);
|
|
1987
|
+
const key = JSON.stringify([
|
|
1988
|
+
state.storageKey,
|
|
1989
|
+
sessionId,
|
|
1990
|
+
generation.sessionGenerationId,
|
|
1991
|
+
generation.sessionGenerationSequence,
|
|
1992
|
+
configurationRef,
|
|
1993
|
+
]);
|
|
1994
|
+
let owner = this.sessionConfigurations.get(key);
|
|
1995
|
+
if (!owner) {
|
|
1996
|
+
const controller = new AbortController();
|
|
1997
|
+
const parent = stored.session.parentSessionId === undefined
|
|
1998
|
+
? undefined
|
|
1999
|
+
: state.sessions.get(stored.session.parentSessionId);
|
|
2000
|
+
if (stored.session.parentSessionId !== undefined && !parent) {
|
|
2001
|
+
throw this.trustInternalError(new FlexHarnessAbortError('The session parent is no longer available.'));
|
|
2002
|
+
}
|
|
2003
|
+
const parentGeneration = parent === undefined ? undefined : requireSessionGeneration(parent.session);
|
|
2004
|
+
const context = Object.freeze({
|
|
2005
|
+
scopeId,
|
|
2006
|
+
scope,
|
|
2007
|
+
storageKey: state.storageKey,
|
|
2008
|
+
sessionId,
|
|
2009
|
+
...generation,
|
|
2010
|
+
configurationRef,
|
|
2011
|
+
...(parent === undefined ? {} : {
|
|
2012
|
+
parentSessionId: parent.session.sessionId,
|
|
2013
|
+
parentSessionGenerationId: parentGeneration!.sessionGenerationId,
|
|
2014
|
+
parentSessionGenerationSequence: parentGeneration!.sessionGenerationSequence,
|
|
2015
|
+
}),
|
|
2016
|
+
...(stored.session.agent === undefined ? {} : { agent: stored.session.agent }),
|
|
2017
|
+
depth: stored.session.depth ?? 0,
|
|
2018
|
+
signal: controller.signal,
|
|
2019
|
+
});
|
|
2020
|
+
let rejectAbort!: (reason: unknown) => void;
|
|
2021
|
+
const aborted = new Promise<never>((_resolve, reject) => { rejectAbort = reject; });
|
|
2022
|
+
const onAbort = () => rejectAbort(controller.signal.reason);
|
|
2023
|
+
controller.signal.addEventListener('abort', onAbort, { once: true });
|
|
2024
|
+
const resolved = Promise.resolve().then(() => {
|
|
2025
|
+
if (!this.sessionConfigurationResolver) {
|
|
2026
|
+
throw new Error('A sessionConfigurationResolver is required for bound sessions.');
|
|
2027
|
+
}
|
|
2028
|
+
return this.sessionConfigurationResolver.resolveSessionConfiguration(context);
|
|
2029
|
+
});
|
|
2030
|
+
const completion = Promise.race([resolved, aborted]).then((configuration) => {
|
|
2031
|
+
controller.signal.throwIfAborted();
|
|
2032
|
+
if (
|
|
2033
|
+
state.lifecycle !== 'active'
|
|
2034
|
+
|| state.sessions.get(sessionId) !== stored
|
|
2035
|
+
|| stored.session.configurationRef !== configurationRef
|
|
2036
|
+
|| stored.session.sessionGenerationId !== generation.sessionGenerationId
|
|
2037
|
+
|| stored.session.sessionGenerationSequence !== generation.sessionGenerationSequence
|
|
2038
|
+
) {
|
|
2039
|
+
throw this.trustInternalError(new FlexHarnessAbortError(
|
|
2040
|
+
'The session configuration lost its session generation ownership.',
|
|
2041
|
+
));
|
|
2042
|
+
}
|
|
2043
|
+
if (
|
|
2044
|
+
!configuration
|
|
2045
|
+
|| typeof configuration !== 'object'
|
|
2046
|
+
|| Array.isArray(configuration)
|
|
2047
|
+
|| ![Object.prototype, null].includes(Object.getPrototypeOf(configuration))
|
|
2048
|
+
|| Reflect.ownKeys(configuration).some((name) =>
|
|
2049
|
+
typeof name !== 'string' || !['subagents', 'slashCommands'].includes(name))
|
|
2050
|
+
) throw new FlexHarnessValidationError('Resolved session configuration is invalid.');
|
|
2051
|
+
return Object.freeze({
|
|
2052
|
+
subagents: normalizeSubagents(configuration.subagents),
|
|
2053
|
+
slashCommands: normalizeSlashCommands(configuration.slashCommands),
|
|
2054
|
+
});
|
|
2055
|
+
}).catch((error: unknown) => {
|
|
2056
|
+
if (this.sessionConfigurations.get(key)?.completion === completion) {
|
|
2057
|
+
this.sessionConfigurations.delete(key);
|
|
2058
|
+
}
|
|
2059
|
+
if (controller.signal.aborted) throw controller.signal.reason;
|
|
2060
|
+
throw this.projectOperationError(
|
|
2061
|
+
error,
|
|
2062
|
+
'sessionConfigurationResolver',
|
|
2063
|
+
scopeId,
|
|
2064
|
+
sessionId,
|
|
2065
|
+
'session-configuration',
|
|
2066
|
+
);
|
|
2067
|
+
}).finally(() => {
|
|
2068
|
+
controller.signal.removeEventListener('abort', onAbort);
|
|
2069
|
+
const current = this.sessionConfigurations.get(key);
|
|
2070
|
+
if (current?.completion === completion) current.settled = true;
|
|
2071
|
+
});
|
|
2072
|
+
owner = { storageKey: state.storageKey, sessionId, controller, completion, settled: false, waiters: 0 };
|
|
2073
|
+
this.sessionConfigurations.set(key, owner);
|
|
2074
|
+
}
|
|
2075
|
+
owner.waiters++;
|
|
2076
|
+
let onConsumerAbort: (() => void) | undefined;
|
|
2077
|
+
const consumerAbort = signal && new Promise<never>((_resolve, reject) => {
|
|
2078
|
+
onConsumerAbort = () => reject(signal.reason ?? this.trustInternalError(
|
|
2079
|
+
new FlexHarnessAbortError('Session configuration resolution was aborted.'),
|
|
2080
|
+
));
|
|
2081
|
+
signal.addEventListener('abort', onConsumerAbort, { once: true });
|
|
2082
|
+
if (signal.aborted) onConsumerAbort();
|
|
2083
|
+
});
|
|
2084
|
+
try {
|
|
2085
|
+
return await (consumerAbort
|
|
2086
|
+
? Promise.race([owner.completion, consumerAbort])
|
|
2087
|
+
: owner.completion);
|
|
2088
|
+
} finally {
|
|
2089
|
+
if (signal && onConsumerAbort) signal.removeEventListener('abort', onConsumerAbort);
|
|
2090
|
+
owner.waiters--;
|
|
2091
|
+
if (owner.waiters === 0 && !owner.settled && !owner.controller.signal.aborted) {
|
|
2092
|
+
if (this.sessionConfigurations.get(key) === owner) this.sessionConfigurations.delete(key);
|
|
2093
|
+
owner.controller.abort(this.trustInternalError(new FlexHarnessAbortError(
|
|
2094
|
+
'Session configuration resolution has no active callers.',
|
|
2095
|
+
)));
|
|
2096
|
+
}
|
|
2097
|
+
}
|
|
2098
|
+
}
|
|
2099
|
+
|
|
2100
|
+
private abortSessionConfigurations(
|
|
2101
|
+
storageKey: string,
|
|
2102
|
+
reason: FlexHarnessAbortError,
|
|
2103
|
+
sessionIds?: ReadonlySet<string>,
|
|
2104
|
+
): Promise<void> | undefined {
|
|
2105
|
+
const owners = [...this.sessionConfigurations.entries()].filter(([, owner]) =>
|
|
2106
|
+
owner.storageKey === storageKey && (sessionIds === undefined || sessionIds.has(owner.sessionId)));
|
|
2107
|
+
if (owners.length === 0) return undefined;
|
|
2108
|
+
for (const [key, owner] of owners) {
|
|
2109
|
+
this.sessionConfigurations.delete(key);
|
|
2110
|
+
if (!owner.controller.signal.aborted) owner.controller.abort(reason);
|
|
2111
|
+
}
|
|
2112
|
+
return Promise.allSettled(owners.map(([, owner]) => owner.completion)).then(() => undefined);
|
|
2113
|
+
}
|
|
2114
|
+
|
|
1943
2115
|
public async listSlashCommands(
|
|
1944
2116
|
scopeId: string,
|
|
1945
2117
|
sessionId: string,
|
|
1946
2118
|
): Promise<IFlexSlashCommandDescriptor[]> {
|
|
1947
|
-
const { state } = await this.resolveState(scopeId);
|
|
2119
|
+
const { scope, state } = await this.resolveState(scopeId);
|
|
1948
2120
|
return this.trackSlashCommandListing(scopeId, state, sessionId, async (signal) => {
|
|
1949
2121
|
await this.awaitReversionOperation(state.scopeQueue, signal);
|
|
1950
2122
|
signal.throwIfAborted();
|
|
1951
2123
|
this.assertStateAcceptingWork(state);
|
|
1952
2124
|
const stored = this.requireSession(state, sessionId);
|
|
2125
|
+
const configuration = await this.resolveSessionConfiguration(
|
|
2126
|
+
scopeId, scope.scope, state, stored, signal,
|
|
2127
|
+
);
|
|
1953
2128
|
await this.reconcileContextAvailability(state, stored);
|
|
1954
2129
|
signal.throwIfAborted();
|
|
1955
2130
|
const sessionAvailable = this.isSessionAvailableForSlashCommand(state, stored);
|
|
@@ -1965,6 +2140,7 @@ export class FlexHarness<TScope = unknown> {
|
|
|
1965
2140
|
stored,
|
|
1966
2141
|
sessionAvailable,
|
|
1967
2142
|
reversionIdleReason,
|
|
2143
|
+
configuration.slashCommands,
|
|
1968
2144
|
);
|
|
1969
2145
|
if (stored.session.origin === undefined) return descriptors;
|
|
1970
2146
|
return publicSnapshot(descriptors.map((descriptor): IFlexSlashCommandDescriptor => ({
|
|
@@ -1980,6 +2156,7 @@ export class FlexHarness<TScope = unknown> {
|
|
|
1980
2156
|
stored: IStoredSessionState,
|
|
1981
2157
|
sessionAvailable: boolean,
|
|
1982
2158
|
reversionIdleReason?: string,
|
|
2159
|
+
slashCommands: ReadonlyMap<string, TRegisteredSlashCommand<TScope>> = this.slashCommands,
|
|
1983
2160
|
): IFlexSlashCommandDescriptor[] {
|
|
1984
2161
|
const sessionAvailability = sessionAvailable
|
|
1985
2162
|
? {}
|
|
@@ -2058,7 +2235,7 @@ export class FlexHarness<TScope = unknown> {
|
|
|
2058
2235
|
workspaceReversion: workspaceReversion(redoUnit),
|
|
2059
2236
|
},
|
|
2060
2237
|
];
|
|
2061
|
-
for (const registration of
|
|
2238
|
+
for (const registration of slashCommands.values()) {
|
|
2062
2239
|
const template = typeof registration.template === 'string';
|
|
2063
2240
|
const availability = template
|
|
2064
2241
|
? this.slashCommandPromptAvailability(
|
|
@@ -2087,6 +2264,26 @@ export class FlexHarness<TScope = unknown> {
|
|
|
2087
2264
|
sessionId: string,
|
|
2088
2265
|
untouchedInput: string,
|
|
2089
2266
|
options: IFlexSlashCommandExecutionOptions = {},
|
|
2267
|
+
): Promise<TFlexSlashCommandExecutionResult> {
|
|
2268
|
+
return this.executeSlashCommandInternal(scopeId, sessionId, untouchedInput, options, false);
|
|
2269
|
+
}
|
|
2270
|
+
|
|
2271
|
+
/** Resolves the exact session configuration before looking up custom commands. */
|
|
2272
|
+
public async executeSessionSlashCommand(
|
|
2273
|
+
scopeId: string,
|
|
2274
|
+
sessionId: string,
|
|
2275
|
+
untouchedInput: string,
|
|
2276
|
+
options: IFlexSlashCommandExecutionOptions = {},
|
|
2277
|
+
): Promise<TFlexSlashCommandExecutionResult> {
|
|
2278
|
+
return this.executeSlashCommandInternal(scopeId, sessionId, untouchedInput, options, true);
|
|
2279
|
+
}
|
|
2280
|
+
|
|
2281
|
+
private async executeSlashCommandInternal(
|
|
2282
|
+
scopeId: string,
|
|
2283
|
+
sessionId: string,
|
|
2284
|
+
untouchedInput: string,
|
|
2285
|
+
options: IFlexSlashCommandExecutionOptions,
|
|
2286
|
+
sessionAware: boolean,
|
|
2090
2287
|
): Promise<TFlexSlashCommandExecutionResult> {
|
|
2091
2288
|
const currentInvocation = this.slashCommandInvocationContext.getStore();
|
|
2092
2289
|
if (currentInvocation?.scopeId === scopeId && currentInvocation.sessionId === sessionId) {
|
|
@@ -2094,8 +2291,8 @@ export class FlexHarness<TScope = unknown> {
|
|
|
2094
2291
|
}
|
|
2095
2292
|
const parsed = parseSlashCommand(untouchedInput);
|
|
2096
2293
|
if (parsed.type !== 'parsed') return parsed;
|
|
2097
|
-
|
|
2098
|
-
if (!isReservedSlashCommandName(parsed.name) && !registration) {
|
|
2294
|
+
let registration = sessionAware ? undefined : this.slashCommands.get(parsed.name);
|
|
2295
|
+
if (!sessionAware && !isReservedSlashCommandName(parsed.name) && !registration) {
|
|
2099
2296
|
return Object.freeze({
|
|
2100
2297
|
type: 'unknown',
|
|
2101
2298
|
input: parsed.input,
|
|
@@ -2111,6 +2308,31 @@ export class FlexHarness<TScope = unknown> {
|
|
|
2111
2308
|
this.assertStateAcceptingWork(state);
|
|
2112
2309
|
const stored = this.requireSession(state, sessionId);
|
|
2113
2310
|
this.assertSessionWritable(stored);
|
|
2311
|
+
if (sessionAware) {
|
|
2312
|
+
const configuration = await this.resolveSessionConfiguration(
|
|
2313
|
+
scopeId, scope.scope, state, stored, options.signal,
|
|
2314
|
+
);
|
|
2315
|
+
this.assertStateAcceptingWork(state);
|
|
2316
|
+
if (state.sessions.get(sessionId) !== stored) {
|
|
2317
|
+
throw this.trustInternalError(new FlexHarnessAbortError(
|
|
2318
|
+
'The session was deleted during slash command resolution.',
|
|
2319
|
+
));
|
|
2320
|
+
}
|
|
2321
|
+
registration = configuration.slashCommands.get(parsed.name);
|
|
2322
|
+
if (!isReservedSlashCommandName(parsed.name) && !registration) {
|
|
2323
|
+
return Object.freeze({
|
|
2324
|
+
type: 'unknown',
|
|
2325
|
+
input: parsed.input,
|
|
2326
|
+
name: parsed.name,
|
|
2327
|
+
rawArguments: parsed.rawArguments,
|
|
2328
|
+
arguments: parsed.arguments,
|
|
2329
|
+
});
|
|
2330
|
+
}
|
|
2331
|
+
} else if (stored.session.configurationRef !== undefined) {
|
|
2332
|
+
throw new FlexHarnessValidationError(
|
|
2333
|
+
'A bound session requires executeSessionSlashCommand().',
|
|
2334
|
+
);
|
|
2335
|
+
}
|
|
2114
2336
|
const sessionKey = this.slashCommandSessionKey(state.storageKey, sessionId);
|
|
2115
2337
|
const invocationOwner = this.slashCommandInvocationContext.getStore();
|
|
2116
2338
|
if (invocationOwner?.sessionKey === sessionKey) {
|
|
@@ -3733,6 +3955,7 @@ export class FlexHarness<TScope = unknown> {
|
|
|
3733
3955
|
|
|
3734
3956
|
private createActiveRun(queued: IQueuedPrompt): IActiveRun {
|
|
3735
3957
|
return {
|
|
3958
|
+
subagents: this.subagents,
|
|
3736
3959
|
state: queued.state,
|
|
3737
3960
|
stored: queued.stored,
|
|
3738
3961
|
originCompactorContext: this.createCompactorContext(
|
|
@@ -4959,6 +5182,13 @@ export class FlexHarness<TScope = unknown> {
|
|
|
4959
5182
|
signal: AbortSignal,
|
|
4960
5183
|
): Promise<plugins.IAgentGenerationLease> {
|
|
4961
5184
|
signal.throwIfAborted();
|
|
5185
|
+
run.subagents = (await this.resolveSessionConfiguration(
|
|
5186
|
+
run.scopeId,
|
|
5187
|
+
run.scope as TScope,
|
|
5188
|
+
run.state,
|
|
5189
|
+
run.stored,
|
|
5190
|
+
signal,
|
|
5191
|
+
)).subagents;
|
|
4962
5192
|
await this.prepareRunReversion(run, signal);
|
|
4963
5193
|
run.phase = 'running';
|
|
4964
5194
|
const queued = run.stored.outstandingPromptsById.get(run.queueId);
|
|
@@ -5121,7 +5351,7 @@ export class FlexHarness<TScope = unknown> {
|
|
|
5121
5351
|
|
|
5122
5352
|
private enabledBuiltInToolNames(run: IActiveRun): Set<string> {
|
|
5123
5353
|
const names = new Set<string>();
|
|
5124
|
-
if (
|
|
5354
|
+
if (run.subagents.size > 0 && (run.stored.session.depth ?? 0) < this.maxSubagentDepth) {
|
|
5125
5355
|
names.add('delegate');
|
|
5126
5356
|
}
|
|
5127
5357
|
if (this.builtInTools.renameSession) names.add('rename_session');
|
|
@@ -5144,7 +5374,7 @@ export class FlexHarness<TScope = unknown> {
|
|
|
5144
5374
|
|
|
5145
5375
|
private createBuiltInTools(run: IActiveRun): Record<string, unknown> {
|
|
5146
5376
|
const tools: Record<string, unknown> = {};
|
|
5147
|
-
if (
|
|
5377
|
+
if (run.subagents.size > 0 && (run.stored.session.depth ?? 0) < this.maxSubagentDepth) {
|
|
5148
5378
|
tools.delegate = this.createSubagentTool(run);
|
|
5149
5379
|
}
|
|
5150
5380
|
if (this.builtInTools.renameSession) tools.rename_session = this.createRenameSessionTool(run);
|
|
@@ -5475,7 +5705,7 @@ export class FlexHarness<TScope = unknown> {
|
|
|
5475
5705
|
}
|
|
5476
5706
|
|
|
5477
5707
|
private createSubagentTool(run: IActiveRun): unknown {
|
|
5478
|
-
const available = [...
|
|
5708
|
+
const available = [...run.subagents.values()]
|
|
5479
5709
|
.map((definition) => `- ${definition.name}: ${definition.description}`)
|
|
5480
5710
|
.join('\n');
|
|
5481
5711
|
return plugins.tool({
|
|
@@ -5527,7 +5757,7 @@ export class FlexHarness<TScope = unknown> {
|
|
|
5527
5757
|
validateUtf8String(input.taskId, 'taskId', maxSubagentTaskIdBytes, true);
|
|
5528
5758
|
}
|
|
5529
5759
|
validateUtf8String(toolCallId, 'delegate toolCallId', maxTransferIdentifierBytes, true);
|
|
5530
|
-
const definition =
|
|
5760
|
+
const definition = run.subagents.get(input.subagentType);
|
|
5531
5761
|
if (!definition || (run.stored.session.depth ?? 0) >= this.maxSubagentDepth) {
|
|
5532
5762
|
throw new FlexHarnessValidationError(`Subagent "${input.subagentType}" is not available.`);
|
|
5533
5763
|
}
|
|
@@ -5738,7 +5968,7 @@ export class FlexHarness<TScope = unknown> {
|
|
|
5738
5968
|
if (state.activeRuns.get(run.sessionId) !== run || run.callbacksClosed) {
|
|
5739
5969
|
throw new FlexHarnessAbortError('The parent run no longer owns this subagent request.');
|
|
5740
5970
|
}
|
|
5741
|
-
if (run.stored.session.agent !== undefined && !
|
|
5971
|
+
if (run.stored.session.agent !== undefined && !run.subagents.has(run.stored.session.agent)) {
|
|
5742
5972
|
throw new FlexHarnessValidationError(`Parent subagent "${run.stored.session.agent}" is disabled.`);
|
|
5743
5973
|
}
|
|
5744
5974
|
if ((run.stored.session.depth ?? 0) >= this.maxSubagentDepth) {
|
|
@@ -5760,8 +5990,11 @@ export class FlexHarness<TScope = unknown> {
|
|
|
5760
5990
|
if (
|
|
5761
5991
|
existing.session.parentSessionId !== run.sessionId
|
|
5762
5992
|
|| existing.session.agent !== definition.name
|
|
5993
|
+
|| existing.session.configurationRef !== run.stored.session.configurationRef
|
|
5763
5994
|
) {
|
|
5764
|
-
throw new FlexHarnessValidationError(
|
|
5995
|
+
throw new FlexHarnessValidationError(
|
|
5996
|
+
`Task session "${sessionId}" is not owned by this parent, agent, and configuration.`,
|
|
5997
|
+
);
|
|
5765
5998
|
}
|
|
5766
5999
|
if (
|
|
5767
6000
|
taskId === undefined
|
|
@@ -5802,6 +6035,9 @@ export class FlexHarness<TScope = unknown> {
|
|
|
5802
6035
|
sessionId,
|
|
5803
6036
|
sessionGenerationId: createSessionGenerationId(),
|
|
5804
6037
|
sessionGenerationSequence: state.revision + 1,
|
|
6038
|
+
...(run.stored.session.configurationRef === undefined
|
|
6039
|
+
? {}
|
|
6040
|
+
: { configurationRef: run.stored.session.configurationRef }),
|
|
5805
6041
|
title: `Subagent: ${definition.name}`,
|
|
5806
6042
|
createdAt: timestamp,
|
|
5807
6043
|
updatedAt: timestamp,
|
|
@@ -10254,6 +10490,8 @@ export class FlexHarness<TScope = unknown> {
|
|
|
10254
10490
|
return;
|
|
10255
10491
|
}
|
|
10256
10492
|
if (state.lifecycle !== 'fenced') state.lifecycle = 'retiring';
|
|
10493
|
+
const configurationSettlement = this.abortSessionConfigurations(storageKey, reason);
|
|
10494
|
+
if (configurationSettlement) await configurationSettlement;
|
|
10257
10495
|
for (const staged of [...state.sessionImports.values()]) {
|
|
10258
10496
|
if (staged.phase === 'staging') this.releaseStagedSessionImport(staged);
|
|
10259
10497
|
}
|
|
@@ -10444,6 +10682,7 @@ export class FlexHarness<TScope = unknown> {
|
|
|
10444
10682
|
this.scopeRetirements.clear();
|
|
10445
10683
|
this.storageDrains.clear();
|
|
10446
10684
|
this.storageCompactorLifecycleControllers.clear();
|
|
10685
|
+
this.sessionConfigurations.clear();
|
|
10447
10686
|
}
|
|
10448
10687
|
|
|
10449
10688
|
private async abortSlashCommandExecutions(
|
package/ts/interfaces.ts
CHANGED
|
@@ -158,6 +158,8 @@ export interface IFlexSession {
|
|
|
158
158
|
sessionId: string;
|
|
159
159
|
sessionGenerationId?: string;
|
|
160
160
|
sessionGenerationSequence?: number;
|
|
161
|
+
/** Opaque immutable configuration revision bound to this exact session generation. */
|
|
162
|
+
configurationRef?: string;
|
|
161
163
|
title?: string;
|
|
162
164
|
createdAt: string;
|
|
163
165
|
updatedAt: string;
|
|
@@ -295,6 +297,7 @@ export const FLEX_SESSION_IMPORT_MAXIMUM_LIMITS = Object.freeze({
|
|
|
295
297
|
export interface IFlexCreateSessionOptions {
|
|
296
298
|
sessionId?: string;
|
|
297
299
|
sessionGenerationId?: string;
|
|
300
|
+
configurationRef?: string;
|
|
298
301
|
title?: string;
|
|
299
302
|
}
|
|
300
303
|
|
|
@@ -731,6 +734,33 @@ export interface IFlexSessionGeneration {
|
|
|
731
734
|
sessionGenerationSequence: number;
|
|
732
735
|
}
|
|
733
736
|
|
|
737
|
+
export const FLEX_SESSION_CONFIGURATION_REF_MAX_BYTES = 1024;
|
|
738
|
+
|
|
739
|
+
export interface IFlexSessionConfigurationResolverContext<TScope> extends IFlexSessionGeneration {
|
|
740
|
+
readonly scopeId: string;
|
|
741
|
+
readonly scope: TScope;
|
|
742
|
+
readonly storageKey: string;
|
|
743
|
+
readonly sessionId: string;
|
|
744
|
+
readonly configurationRef: string;
|
|
745
|
+
readonly parentSessionId?: string;
|
|
746
|
+
readonly parentSessionGenerationId?: string;
|
|
747
|
+
readonly parentSessionGenerationSequence?: number;
|
|
748
|
+
readonly agent?: string;
|
|
749
|
+
readonly depth: number;
|
|
750
|
+
readonly signal: AbortSignal;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
export interface IFlexResolvedSessionConfiguration<TScope> {
|
|
754
|
+
subagents?: readonly IFlexSubagentDefinition[];
|
|
755
|
+
slashCommands?: readonly TFlexSlashCommandRegistration<TScope>[];
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
export interface IFlexSessionConfigurationResolver<TScope> {
|
|
759
|
+
resolveSessionConfiguration(
|
|
760
|
+
context: IFlexSessionConfigurationResolverContext<TScope>,
|
|
761
|
+
): Promise<IFlexResolvedSessionConfiguration<TScope>> | IFlexResolvedSessionConfiguration<TScope>;
|
|
762
|
+
}
|
|
763
|
+
|
|
734
764
|
export interface IFlexSubagentProvenance {
|
|
735
765
|
readonly parentSessionId: string;
|
|
736
766
|
readonly parentSessionGenerationId: string;
|
|
@@ -1107,6 +1137,7 @@ export interface IFlexRedoSessionResult {
|
|
|
1107
1137
|
|
|
1108
1138
|
export type TFlexExternalErrorSource =
|
|
1109
1139
|
| 'modelResolver'
|
|
1140
|
+
| 'sessionConfigurationResolver'
|
|
1110
1141
|
| 'toolProvider'
|
|
1111
1142
|
| 'delegatedRunAdmissionProvider'
|
|
1112
1143
|
| 'toolExecution'
|
|
@@ -1253,6 +1284,7 @@ export interface IFlexBuiltInToolsOptions {
|
|
|
1253
1284
|
export interface IFlexHarnessOptions<TScope> {
|
|
1254
1285
|
scopeResolver: IFlexScopeResolver<TScope>;
|
|
1255
1286
|
modelResolver: IFlexModelResolver<TScope>;
|
|
1287
|
+
sessionConfigurationResolver?: IFlexSessionConfigurationResolver<TScope>;
|
|
1256
1288
|
toolProvider?: IFlexToolProvider<TScope>;
|
|
1257
1289
|
resourceToolProviderResolver?: IFlexResourceToolProviderResolver<TScope>;
|
|
1258
1290
|
executionContextProvider?: IFlexExecutionContextProvider<TScope>;
|