@modelprofile.com/flexharness 10.0.0 → 10.1.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.stores.js +11 -119
- package/dist_ts/errors.d.ts +7 -2
- package/dist_ts/errors.js +1 -1
- package/dist_ts/utils.storerules.d.ts +28 -0
- package/dist_ts/utils.storerules.js +107 -0
- package/dist_ts_chat_harness/classes.transcript.d.ts +88 -0
- package/dist_ts_chat_harness/classes.transcript.js +268 -0
- package/dist_ts_chat_harness/functions.intents.d.ts +62 -0
- package/dist_ts_chat_harness/functions.intents.js +96 -0
- package/dist_ts_chat_harness/functions.mapping.d.ts +33 -0
- package/dist_ts_chat_harness/functions.mapping.js +220 -0
- package/dist_ts_chat_harness/index.d.ts +3 -0
- package/dist_ts_chat_harness/index.js +4 -0
- package/dist_ts_chat_harness/plugins.d.ts +1 -0
- package/dist_ts_chat_harness/plugins.js +2 -0
- package/dist_ts_stores_nosqldb/classes.nosqldbstores.d.ts +31 -0
- package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +312 -0
- package/dist_ts_stores_nosqldb/classes.recordstore.d.ts +110 -0
- package/dist_ts_stores_nosqldb/classes.recordstore.js +437 -0
- package/dist_ts_stores_nosqldb/index.d.ts +2 -0
- package/dist_ts_stores_nosqldb/index.js +3 -0
- package/dist_ts_stores_nosqldb/plugins.d.ts +7 -0
- package/dist_ts_stores_nosqldb/plugins.js +10 -0
- package/package.json +24 -4
- package/readme.md +4 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.stores.ts +28 -172
- package/ts/errors.ts +8 -2
- package/ts/readme.md +4 -0
- package/ts/utils.storerules.ts +177 -0
- package/ts_chat_harness/classes.transcript.ts +365 -0
- package/ts_chat_harness/functions.intents.ts +169 -0
- package/ts_chat_harness/functions.mapping.ts +267 -0
- package/ts_chat_harness/index.ts +33 -0
- package/ts_chat_harness/plugins.ts +18 -0
- package/ts_chat_harness/readme.md +114 -0
- package/ts_stores_nosqldb/classes.nosqldbstores.ts +465 -0
- package/ts_stores_nosqldb/classes.recordstore.ts +560 -0
- package/ts_stores_nosqldb/index.ts +9 -0
- package/ts_stores_nosqldb/plugins.ts +38 -0
- package/ts_stores_nosqldb/readme.md +53 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
function base64Utf8(text) {
|
|
2
|
+
const bytes = new TextEncoder().encode(text);
|
|
3
|
+
let binary = '';
|
|
4
|
+
for (let offset = 0; offset < bytes.length; offset += 0x8000) {
|
|
5
|
+
binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));
|
|
6
|
+
}
|
|
7
|
+
return btoa(binary);
|
|
8
|
+
}
|
|
9
|
+
function attachmentToPromptPart(attachment) {
|
|
10
|
+
if (attachment.truncated) {
|
|
11
|
+
throw new Error(`Attachment "${attachment.name}" is truncated and cannot be sent.`);
|
|
12
|
+
}
|
|
13
|
+
const described = { mediaType: attachment.mediaType, name: attachment.name };
|
|
14
|
+
if (attachment.kind === 'text' && attachment.text !== undefined) {
|
|
15
|
+
return { type: 'file', data: base64Utf8(attachment.text), ...described };
|
|
16
|
+
}
|
|
17
|
+
if (attachment.dataBase64 === undefined) {
|
|
18
|
+
throw new Error(`Attachment "${attachment.name}" carries no payload.`);
|
|
19
|
+
}
|
|
20
|
+
return attachment.kind === 'image'
|
|
21
|
+
? { type: 'image', data: attachment.dataBase64, ...described }
|
|
22
|
+
: { type: 'file', data: attachment.dataBase64, ...described };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Maps `harness-send`. A message sent while idle, or queued behind the running turn, becomes a
|
|
26
|
+
* queued prompt. A steer joins the running turn; with no running turn it is the next turn's
|
|
27
|
+
* input, so it is queued as well. A steer keeps the prompt options for that case only: it answers
|
|
28
|
+
* on the running turn's model. A steer id comes from `crypto.randomUUID()`, which browsers offer
|
|
29
|
+
* in secure contexts only (HTTPS or localhost).
|
|
30
|
+
*/
|
|
31
|
+
export function flexHarnessSendIntent(target, detail, options = {}) {
|
|
32
|
+
const prompt = [
|
|
33
|
+
...(detail.text.length > 0 ? [{ type: 'text', text: detail.text }] : []),
|
|
34
|
+
...detail.attachments.map(attachmentToPromptPart),
|
|
35
|
+
];
|
|
36
|
+
const modelHint = options.modelHint ?? detail.model;
|
|
37
|
+
const promptOptions = modelHint === undefined ? {} : { modelHint };
|
|
38
|
+
if (detail.delivery === 'steer' && options.activeQueueId !== undefined) {
|
|
39
|
+
return {
|
|
40
|
+
...target,
|
|
41
|
+
type: 'steerPrompt',
|
|
42
|
+
queueId: options.activeQueueId,
|
|
43
|
+
steerId: globalThis.crypto.randomUUID(),
|
|
44
|
+
prompt,
|
|
45
|
+
options: promptOptions,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return { ...target, type: 'enqueuePrompt', prompt, options: promptOptions };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Maps `harness-permission-response`. The card reports a remembered approval as `remember`,
|
|
52
|
+
* which FlexHarness calls `always`.
|
|
53
|
+
*/
|
|
54
|
+
export function flexHarnessPermissionIntent(target, detail) {
|
|
55
|
+
const decision = detail.response === 'reject'
|
|
56
|
+
? 'reject'
|
|
57
|
+
: detail.remember ? 'always' : 'once';
|
|
58
|
+
return { ...target, type: 'respondToPermission', permissionId: detail.requestId, decision };
|
|
59
|
+
}
|
|
60
|
+
/** Maps `harness-abort`. */
|
|
61
|
+
export function flexHarnessAbortIntent(target) {
|
|
62
|
+
return { ...target, type: 'abort' };
|
|
63
|
+
}
|
|
64
|
+
const steerNotRunningCode = 'FLEX_STEER_NOT_RUNNING';
|
|
65
|
+
/**
|
|
66
|
+
* Makes the call an intent names, on the server that owns the harness, once the harness admitted
|
|
67
|
+
* it. A queued prompt returns its admission: its `completion` settles when the run ends, and the
|
|
68
|
+
* caller owns it, as with `enqueuePrompt()`. A steer whose turn ended before the harness took it
|
|
69
|
+
* is the next turn's input, so it is queued instead and returns that admission.
|
|
70
|
+
*/
|
|
71
|
+
export async function runFlexHarnessChatIntent(harness, intent) {
|
|
72
|
+
switch (intent.type) {
|
|
73
|
+
case 'enqueuePrompt':
|
|
74
|
+
return harness.enqueuePrompt(intent.scopeId, intent.sessionId, intent.prompt, intent.options);
|
|
75
|
+
case 'steerPrompt':
|
|
76
|
+
try {
|
|
77
|
+
await harness.steerPrompt(intent.scopeId, intent.sessionId, intent.queueId, {
|
|
78
|
+
steerId: intent.steerId,
|
|
79
|
+
prompt: intent.prompt,
|
|
80
|
+
});
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (error.code !== steerNotRunningCode)
|
|
85
|
+
throw error;
|
|
86
|
+
return harness.enqueuePrompt(intent.scopeId, intent.sessionId, intent.prompt, intent.options);
|
|
87
|
+
}
|
|
88
|
+
case 'respondToPermission':
|
|
89
|
+
await harness.respondToPermission(intent.scopeId, intent.sessionId, intent.permissionId, intent.decision);
|
|
90
|
+
return undefined;
|
|
91
|
+
case 'abort':
|
|
92
|
+
await harness.abort(intent.scopeId, intent.sessionId);
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmludGVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19jaGF0X2hhcm5lc3MvZnVuY3Rpb25zLmludGVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaURBLFNBQVMsVUFBVSxDQUFDLElBQVk7SUFDOUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLEtBQUssSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM3RCxNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0QixDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxVQUFzQztJQUNwRSxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsVUFBVSxDQUFDLElBQUksb0NBQW9DLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdFLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNoRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFH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
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type * as plugins from './plugins.js';
|
|
2
|
+
import type { IFlexAttachmentMessagePart, IFlexMessage, IFlexModelIdentity, IFlexPermissionRequest, IFlexProjectStateResult, IFlexSession, IFlexToolMessagePart, IFlexUsage } from '../dist_ts/interfaces.js';
|
|
3
|
+
/** When a streamed part started and ended, as the events that carried it stated. */
|
|
4
|
+
export interface IFlexPartTiming {
|
|
5
|
+
startedAt?: number;
|
|
6
|
+
endedAt?: number;
|
|
7
|
+
}
|
|
8
|
+
export type TFlexPartTimings = ReadonlyMap<string, IFlexPartTiming>;
|
|
9
|
+
/** The transcript row of one part of an assistant message. */
|
|
10
|
+
export declare const flexPartRowId: (messageId: string, partId: string) => string;
|
|
11
|
+
export declare const flexPartTimingKey: (messageId: string, partId: string) => string;
|
|
12
|
+
export declare const flexModelLabel: (model: IFlexModelIdentity) => string;
|
|
13
|
+
export declare const flexUsageToHarness: (usage: IFlexUsage) => plugins.IHarnessUsage;
|
|
14
|
+
export declare function flexToolPartToHarness(part: IFlexToolMessagePart, timing?: IFlexPartTiming): plugins.IHarnessToolCall;
|
|
15
|
+
/**
|
|
16
|
+
* The public projection keeps no attachment payload. An attachment the components can show needs
|
|
17
|
+
* its name, media type and size; one whose source did not state all three, such as a remote URL
|
|
18
|
+
* of unknown size, has no row.
|
|
19
|
+
*/
|
|
20
|
+
export declare function flexAttachmentToHarness(part: IFlexAttachmentMessagePart): plugins.IHarnessAttachment | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* The transcript rows of one message. A user message is one row. An assistant message has one
|
|
23
|
+
* row per part, in part order: a text row, a reasoning row, or a tool row, so every streamed
|
|
24
|
+
* delta addresses exactly one row. The run's usage and error attach to its last text or reasoning
|
|
25
|
+
* row, or to a row of their own when the message has none.
|
|
26
|
+
*/
|
|
27
|
+
export declare function flexMessageToHarnessRows(message: IFlexMessage, messageIndex: number, timings?: TFlexPartTimings): plugins.IHarnessMessage[];
|
|
28
|
+
export declare function flexPermissionToHarness(request: IFlexPermissionRequest): plugins.IHarnessPermissionRequest;
|
|
29
|
+
export declare function flexSessionToHarnessStatus(session: IFlexSession): plugins.IHarnessStatus;
|
|
30
|
+
/** A session-list row. `title` falls back to the session id, which is what the session is named by. */
|
|
31
|
+
export declare function flexSessionToHarnessMeta(session: IFlexSession): plugins.IHarnessSessionMeta;
|
|
32
|
+
export declare function flexProjectToHarnessTodos(project: IFlexProjectStateResult): plugins.IHarnessTodoItem[];
|
|
33
|
+
export declare function flexProjectToHarnessScratchpad(sessionId: string, project: IFlexProjectStateResult): plugins.IHarnessScratchpad;
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/** The transcript row of one part of an assistant message. */
|
|
2
|
+
export const flexPartRowId = (messageId, partId) => `${messageId}:${partId}`;
|
|
3
|
+
export const flexPartTimingKey = flexPartRowId;
|
|
4
|
+
const epoch = (timestamp) => {
|
|
5
|
+
if (timestamp === undefined)
|
|
6
|
+
return undefined;
|
|
7
|
+
const value = Date.parse(timestamp);
|
|
8
|
+
return Number.isFinite(value) ? value : undefined;
|
|
9
|
+
};
|
|
10
|
+
export const flexModelLabel = (model) => `${model.provider}/${model.model}`;
|
|
11
|
+
export const flexUsageToHarness = (usage) => ({
|
|
12
|
+
inputTokens: usage.inputTokens,
|
|
13
|
+
outputTokens: usage.outputTokens,
|
|
14
|
+
totalTokens: usage.totalTokens,
|
|
15
|
+
cacheReadTokens: usage.cacheReadTokens,
|
|
16
|
+
cacheWriteTokens: usage.cacheWriteTokens,
|
|
17
|
+
});
|
|
18
|
+
const toolStatuses = {
|
|
19
|
+
running: 'running',
|
|
20
|
+
completed: 'completed',
|
|
21
|
+
failed: 'error',
|
|
22
|
+
cancelled: 'stopped',
|
|
23
|
+
};
|
|
24
|
+
export function flexToolPartToHarness(part, timing) {
|
|
25
|
+
return {
|
|
26
|
+
id: part.toolCallId,
|
|
27
|
+
name: part.toolName,
|
|
28
|
+
status: toolStatuses[part.status],
|
|
29
|
+
input: part.input,
|
|
30
|
+
...(part.output === undefined ? {} : { output: part.output }),
|
|
31
|
+
...(part.status === 'failed' ? { isError: true } : {}),
|
|
32
|
+
...(part.error === undefined ? {} : { errorText: part.error }),
|
|
33
|
+
...(part.childSessionId === undefined ? {} : { childSessionId: part.childSessionId }),
|
|
34
|
+
...(part.model === undefined ? {} : { model: flexModelLabel(part.model) }),
|
|
35
|
+
...(timing?.startedAt === undefined ? {} : { startedAt: timing.startedAt }),
|
|
36
|
+
...(timing?.endedAt === undefined ? {} : { finishedAt: timing.endedAt }),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The public projection keeps no attachment payload. An attachment the components can show needs
|
|
41
|
+
* its name, media type and size; one whose source did not state all three, such as a remote URL
|
|
42
|
+
* of unknown size, has no row.
|
|
43
|
+
*/
|
|
44
|
+
export function flexAttachmentToHarness(part) {
|
|
45
|
+
if (part.name === undefined || part.mediaType === undefined || part.sizeBytes === undefined) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
id: part.partId,
|
|
50
|
+
name: part.name,
|
|
51
|
+
mediaType: part.mediaType,
|
|
52
|
+
size: part.sizeBytes,
|
|
53
|
+
kind: part.attachmentType === 'image' ? 'image' : 'binary',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function attachmentsOf(message) {
|
|
57
|
+
return message.parts.flatMap((part) => {
|
|
58
|
+
if (part.type !== 'attachment')
|
|
59
|
+
return [];
|
|
60
|
+
const attachment = flexAttachmentToHarness(part);
|
|
61
|
+
return attachment ? [attachment] : [];
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The transcript rows of one message. A user message is one row. An assistant message has one
|
|
66
|
+
* row per part, in part order: a text row, a reasoning row, or a tool row, so every streamed
|
|
67
|
+
* delta addresses exactly one row. The run's usage and error attach to its last text or reasoning
|
|
68
|
+
* row, or to a row of their own when the message has none.
|
|
69
|
+
*/
|
|
70
|
+
export function flexMessageToHarnessRows(message, messageIndex, timings = new Map()) {
|
|
71
|
+
const createdAt = epoch(message.createdAt) ?? 0;
|
|
72
|
+
const completedAt = epoch(message.completedAt);
|
|
73
|
+
const identity = {
|
|
74
|
+
...(message.model === undefined ? {} : { model: flexModelLabel(message.model) }),
|
|
75
|
+
...(message.model?.variant === undefined ? {} : { effort: message.model.variant }),
|
|
76
|
+
};
|
|
77
|
+
if (message.role === 'user') {
|
|
78
|
+
const attachments = attachmentsOf(message);
|
|
79
|
+
return [{
|
|
80
|
+
id: message.messageId,
|
|
81
|
+
role: 'user',
|
|
82
|
+
text: message.parts.flatMap((part) => part.type === 'text' ? [part.text] : []).join('\n\n'),
|
|
83
|
+
createdAt,
|
|
84
|
+
order: { messageIndex, partIndex: 0 },
|
|
85
|
+
...(attachments.length === 0 ? {} : { attachments }),
|
|
86
|
+
}];
|
|
87
|
+
}
|
|
88
|
+
const streaming = message.status === 'streaming';
|
|
89
|
+
const rows = [];
|
|
90
|
+
let terminalRow;
|
|
91
|
+
message.parts.forEach((part, partIndex) => {
|
|
92
|
+
const timing = timings.get(flexPartTimingKey(message.messageId, part.partId));
|
|
93
|
+
const base = {
|
|
94
|
+
id: flexPartRowId(message.messageId, part.partId),
|
|
95
|
+
createdAt: timing?.startedAt ?? createdAt,
|
|
96
|
+
order: { messageIndex, partIndex },
|
|
97
|
+
...identity,
|
|
98
|
+
};
|
|
99
|
+
switch (part.type) {
|
|
100
|
+
case 'text': {
|
|
101
|
+
const row = {
|
|
102
|
+
...base,
|
|
103
|
+
role: 'assistant',
|
|
104
|
+
text: part.text,
|
|
105
|
+
...(streaming && partIndex === message.parts.length - 1 ? { streaming: true } : {}),
|
|
106
|
+
};
|
|
107
|
+
rows.push(row);
|
|
108
|
+
terminalRow = row;
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
case 'reasoning': {
|
|
112
|
+
const startedAt = timing?.startedAt ?? createdAt;
|
|
113
|
+
const endedAt = part.status === 'running'
|
|
114
|
+
? undefined
|
|
115
|
+
: timing?.endedAt ?? completedAt ?? startedAt;
|
|
116
|
+
const row = {
|
|
117
|
+
...base,
|
|
118
|
+
role: 'assistant',
|
|
119
|
+
text: '',
|
|
120
|
+
reasoning: [{
|
|
121
|
+
id: part.partId,
|
|
122
|
+
text: part.text,
|
|
123
|
+
startedAt,
|
|
124
|
+
...(endedAt === undefined ? {} : { endedAt }),
|
|
125
|
+
}],
|
|
126
|
+
};
|
|
127
|
+
rows.push(row);
|
|
128
|
+
terminalRow = row;
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
case 'tool':
|
|
132
|
+
rows.push({ ...base, role: 'tool', text: '', toolCall: flexToolPartToHarness(part, timing) });
|
|
133
|
+
break;
|
|
134
|
+
case 'attachment': {
|
|
135
|
+
const attachment = flexAttachmentToHarness(part);
|
|
136
|
+
if (attachment)
|
|
137
|
+
rows.push({ ...base, role: 'assistant', text: '', attachments: [attachment] });
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
const terminal = {
|
|
143
|
+
...(message.usage === undefined ? {} : { usage: flexUsageToHarness(message.usage) }),
|
|
144
|
+
...(message.error === undefined ? {} : { error: message.error }),
|
|
145
|
+
};
|
|
146
|
+
if (Object.keys(terminal).length > 0) {
|
|
147
|
+
if (terminalRow) {
|
|
148
|
+
Object.assign(terminalRow, terminal);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
rows.push({
|
|
152
|
+
id: message.messageId,
|
|
153
|
+
role: 'assistant',
|
|
154
|
+
text: '',
|
|
155
|
+
createdAt: completedAt ?? createdAt,
|
|
156
|
+
order: { messageIndex, partIndex: message.parts.length },
|
|
157
|
+
...identity,
|
|
158
|
+
...terminal,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return rows;
|
|
163
|
+
}
|
|
164
|
+
export function flexPermissionToHarness(request) {
|
|
165
|
+
const metadata = request.metadata;
|
|
166
|
+
return {
|
|
167
|
+
id: request.permissionId,
|
|
168
|
+
sessionId: request.sessionId,
|
|
169
|
+
...(epoch(request.createdAt) === undefined ? {} : { createdAt: epoch(request.createdAt) }),
|
|
170
|
+
title: request.description,
|
|
171
|
+
type: request.kind,
|
|
172
|
+
...(metadata !== null && typeof metadata === 'object' && !Array.isArray(metadata)
|
|
173
|
+
? { metadata: { ...metadata } }
|
|
174
|
+
: {}),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
export function flexSessionToHarnessStatus(session) {
|
|
178
|
+
switch (session.activity.status) {
|
|
179
|
+
case 'running':
|
|
180
|
+
case 'scheduled':
|
|
181
|
+
case 'waiting_permission':
|
|
182
|
+
return { type: 'busy' };
|
|
183
|
+
case 'failed':
|
|
184
|
+
return {
|
|
185
|
+
type: 'error',
|
|
186
|
+
...(session.activity.error === undefined ? {} : { message: session.activity.error }),
|
|
187
|
+
};
|
|
188
|
+
default:
|
|
189
|
+
return { type: 'idle' };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const sessionCardStates = {
|
|
193
|
+
idle: 'normal',
|
|
194
|
+
scheduled: 'working',
|
|
195
|
+
running: 'working',
|
|
196
|
+
waiting_permission: 'attention',
|
|
197
|
+
failed: 'error',
|
|
198
|
+
cancelled: 'normal',
|
|
199
|
+
};
|
|
200
|
+
/** A session-list row. `title` falls back to the session id, which is what the session is named by. */
|
|
201
|
+
export function flexSessionToHarnessMeta(session) {
|
|
202
|
+
return {
|
|
203
|
+
id: session.sessionId,
|
|
204
|
+
title: session.title ?? session.sessionId,
|
|
205
|
+
...(epoch(session.createdAt) === undefined ? {} : { createdAt: epoch(session.createdAt) }),
|
|
206
|
+
...(epoch(session.updatedAt) === undefined ? {} : { updatedAt: epoch(session.updatedAt) }),
|
|
207
|
+
state: sessionCardStates[session.activity.status],
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
export function flexProjectToHarnessTodos(project) {
|
|
211
|
+
return project.state.tasks.map((task) => ({
|
|
212
|
+
id: task.id,
|
|
213
|
+
content: task.content,
|
|
214
|
+
status: task.status,
|
|
215
|
+
}));
|
|
216
|
+
}
|
|
217
|
+
export function flexProjectToHarnessScratchpad(sessionId, project) {
|
|
218
|
+
return { id: sessionId, text: project.state.scratchpad, revision: project.revision };
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLm1hcHBpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19jaGF0X2hhcm5lc3MvZnVuY3Rpb25zLm1hcHBpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBcUJBLDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxTQUFpQixFQUFFLE1BQWMsRUFBVSxFQUFFLENBQUMsR0FBRyxTQUFTLElBQUksTUFBTSxFQUFFLENBQUM7QUFFckcsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDO0FBRS9DLE1BQU0sS0FBSyxHQUFHLENBQUMsU0FBNkIsRUFBc0IsRUFBRTtJQUNsRSxJQUFJLFNBQVMsS0FBSyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3BELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQXlCLEVBQVUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7QUFFeEcsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxLQUFpQixFQUF5QixFQUFFLENBQUMsQ0FBQztJQUMvRSxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7SUFDOUIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO0lBQ2hDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztJQUM5QixlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWU7SUFDdEMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtDQUN6QyxDQUFDLENBQUM7QUFFSCxNQUFNLFlBQVks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
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { FlexHarnessTranscript, type IFlexHarnessEventDelivery, type IFlexHarnessTranscriptChange, type IFlexHarnessTranscriptOptions, type IFlexHarnessTranscriptSnapshot, type IFlexHarnessTranscriptView, } from './classes.transcript.js';
|
|
2
|
+
export { flexAttachmentToHarness, flexMessageToHarnessRows, flexModelLabel, flexPartRowId, flexPermissionToHarness, flexProjectToHarnessScratchpad, flexProjectToHarnessTodos, flexSessionToHarnessMeta, flexSessionToHarnessStatus, flexToolPartToHarness, flexUsageToHarness, type IFlexPartTiming, type TFlexPartTimings, } from './functions.mapping.js';
|
|
3
|
+
export { flexHarnessAbortIntent, flexHarnessPermissionIntent, flexHarnessSendIntent, runFlexHarnessChatIntent, type IFlexHarnessChatTarget, type IFlexHarnessSendIntentOptions, type TFlexHarnessChatHost, type TFlexHarnessChatIntent, } from './functions.intents.js';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { FlexHarnessTranscript, } from './classes.transcript.js';
|
|
2
|
+
export { flexAttachmentToHarness, flexMessageToHarnessRows, flexModelLabel, flexPartRowId, flexPermissionToHarness, flexProjectToHarnessScratchpad, flexProjectToHarnessTodos, flexSessionToHarnessMeta, flexSessionToHarnessStatus, flexToolPartToHarness, flexUsageToHarness, } from './functions.mapping.js';
|
|
3
|
+
export { flexHarnessAbortIntent, flexHarnessPermissionIntent, flexHarnessSendIntent, runFlexHarnessChatIntent, } from './functions.intents.js';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19jaGF0X2hhcm5lc3MvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHFCQUFxQixHQU10QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsd0JBQXdCLEVBQ3hCLGNBQWMsRUFDZCxhQUFhLEVBQ2IsdUJBQXVCLEVBQ3ZCLDhCQUE4QixFQUM5Qix5QkFBeUIsRUFDekIsd0JBQXdCLEVBQ3hCLDBCQUEwQixFQUMxQixxQkFBcUIsRUFDckIsa0JBQWtCLEdBR25CLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QiwyQkFBMkIsRUFDM0IscUJBQXFCLEVBQ3JCLHdCQUF3QixHQUt6QixNQUFNLHdCQUF3QixDQUFDIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { IHarnessAttachment, IHarnessComposerSendDetail, IHarnessMessage, IHarnessPermissionRequest, IHarnessPermissionResponseDetail, IHarnessQuestionRequest, IHarnessScratchpad, IHarnessSessionMeta, IHarnessStatus, IHarnessTodoItem, IHarnessToolCall, IHarnessUsage, THarnessSessionCardState, THarnessStreamDelta, THarnessToolStatus, } from '@design.estate/dees-catalog';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import type { IFlexAgentEventStoreProvider, IFlexHarnessStores, IFlexPermissionStore, IFlexProjectManagementStore, IFlexProjectionStore, IFlexScopeStore, IFlexToolJobStoreProvider } from '../dist_ts/interfaces.js';
|
|
3
|
+
export interface INoSqlFlexHarnessStoresOptions {
|
|
4
|
+
/**
|
|
5
|
+
* An initialized database the application owns, on NoSQLDB or a MongoDB deployment with
|
|
6
|
+
* transactions. The stores never close it.
|
|
7
|
+
*/
|
|
8
|
+
db: plugins.SmartdataDb;
|
|
9
|
+
/** Client deadline of every database call and transaction, 1 to 120000 ms. Defaults to 30000. */
|
|
10
|
+
operationTimeoutMs?: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Every FlexHarness persistence domain on `@lossless.org/client/nosqldb`, with compare-and-swap
|
|
14
|
+
* that holds across processes. Records live in `flexharness_records`; payloads longer than one
|
|
15
|
+
* chunk live in `flexharness_chunks`.
|
|
16
|
+
*/
|
|
17
|
+
export declare class NoSqlFlexHarnessStores implements IFlexHarnessStores {
|
|
18
|
+
readonly scopes: IFlexScopeStore;
|
|
19
|
+
readonly projections: IFlexProjectionStore;
|
|
20
|
+
readonly permissions: IFlexPermissionStore;
|
|
21
|
+
readonly projectManagement: IFlexProjectManagementStore;
|
|
22
|
+
readonly agentEvents: IFlexAgentEventStoreProvider;
|
|
23
|
+
readonly jobs: IFlexToolJobStoreProvider;
|
|
24
|
+
private readonly records;
|
|
25
|
+
constructor(options: INoSqlFlexHarnessStoresOptions);
|
|
26
|
+
/**
|
|
27
|
+
* Creates or verifies the two collections and their indexes. Every store operation awaits the
|
|
28
|
+
* same preparation, so calling it at startup only moves that work, and its failure, forward.
|
|
29
|
+
*/
|
|
30
|
+
prepare(): Promise<void>;
|
|
31
|
+
}
|