@modelprofile.com/flexharness 10.0.0 → 10.2.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.
Files changed (48) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/classes.flexharness.d.ts +13 -1
  3. package/dist_ts/classes.flexharness.js +302 -188
  4. package/dist_ts/classes.stores.js +11 -119
  5. package/dist_ts/errors.d.ts +7 -2
  6. package/dist_ts/errors.js +1 -1
  7. package/dist_ts/interfaces.d.ts +18 -0
  8. package/dist_ts/interfaces.js +1 -1
  9. package/dist_ts/utils.storerules.d.ts +28 -0
  10. package/dist_ts/utils.storerules.js +107 -0
  11. package/dist_ts_chat_harness/classes.transcript.d.ts +103 -0
  12. package/dist_ts_chat_harness/classes.transcript.js +296 -0
  13. package/dist_ts_chat_harness/functions.intents.d.ts +62 -0
  14. package/dist_ts_chat_harness/functions.intents.js +96 -0
  15. package/dist_ts_chat_harness/functions.mapping.d.ts +33 -0
  16. package/dist_ts_chat_harness/functions.mapping.js +220 -0
  17. package/dist_ts_chat_harness/index.d.ts +3 -0
  18. package/dist_ts_chat_harness/index.js +4 -0
  19. package/dist_ts_chat_harness/plugins.d.ts +1 -0
  20. package/dist_ts_chat_harness/plugins.js +2 -0
  21. package/dist_ts_stores_nosqldb/classes.nosqldbstores.d.ts +31 -0
  22. package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +312 -0
  23. package/dist_ts_stores_nosqldb/classes.recordstore.d.ts +110 -0
  24. package/dist_ts_stores_nosqldb/classes.recordstore.js +437 -0
  25. package/dist_ts_stores_nosqldb/index.d.ts +2 -0
  26. package/dist_ts_stores_nosqldb/index.js +3 -0
  27. package/dist_ts_stores_nosqldb/plugins.d.ts +7 -0
  28. package/dist_ts_stores_nosqldb/plugins.js +10 -0
  29. package/package.json +24 -4
  30. package/readme.md +6 -0
  31. package/ts/00_commitinfo_data.ts +1 -1
  32. package/ts/classes.flexharness.ts +324 -205
  33. package/ts/classes.stores.ts +28 -172
  34. package/ts/errors.ts +8 -2
  35. package/ts/interfaces.ts +19 -0
  36. package/ts/readme.md +6 -0
  37. package/ts/utils.storerules.ts +177 -0
  38. package/ts_chat_harness/classes.transcript.ts +399 -0
  39. package/ts_chat_harness/functions.intents.ts +169 -0
  40. package/ts_chat_harness/functions.mapping.ts +267 -0
  41. package/ts_chat_harness/index.ts +33 -0
  42. package/ts_chat_harness/plugins.ts +18 -0
  43. package/ts_chat_harness/readme.md +117 -0
  44. package/ts_stores_nosqldb/classes.nosqldbstores.ts +465 -0
  45. package/ts_stores_nosqldb/classes.recordstore.ts +560 -0
  46. package/ts_stores_nosqldb/index.ts +9 -0
  47. package/ts_stores_nosqldb/plugins.ts +38 -0
  48. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2NoYXRfaGFybmVzcy9wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -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
+ }