@modelprofile.com/flexharness 10.24.0 → 11.0.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 (135) hide show
  1. package/dist_ts/00_commitinfo_data.js +2 -2
  2. package/dist_ts/classes.codesandbox.js +1 -1
  3. package/dist_ts/classes.flexharness.admission.d.ts +17 -0
  4. package/dist_ts/classes.flexharness.admission.js +263 -0
  5. package/dist_ts/classes.flexharness.callbacks.d.ts +38 -0
  6. package/dist_ts/classes.flexharness.callbacks.js +313 -0
  7. package/dist_ts/classes.flexharness.compaction.d.ts +25 -0
  8. package/dist_ts/classes.flexharness.compaction.js +87 -0
  9. package/dist_ts/classes.flexharness.configurations.d.ts +11 -0
  10. package/dist_ts/classes.flexharness.configurations.js +137 -0
  11. package/dist_ts/classes.flexharness.core.d.ts +143 -0
  12. package/dist_ts/classes.flexharness.core.js +1538 -0
  13. package/dist_ts/classes.flexharness.d.ts +2 -437
  14. package/dist_ts/classes.flexharness.deletion.d.ts +31 -0
  15. package/dist_ts/classes.flexharness.deletion.js +396 -0
  16. package/dist_ts/classes.flexharness.imports.d.ts +24 -0
  17. package/dist_ts/classes.flexharness.imports.js +345 -0
  18. package/dist_ts/classes.flexharness.js +119 -9776
  19. package/dist_ts/classes.flexharness.lifecycle.d.ts +47 -0
  20. package/dist_ts/classes.flexharness.lifecycle.js +625 -0
  21. package/dist_ts/classes.flexharness.permissions.d.ts +19 -0
  22. package/dist_ts/classes.flexharness.permissions.js +450 -0
  23. package/dist_ts/classes.flexharness.projects.d.ts +55 -0
  24. package/dist_ts/classes.flexharness.projects.js +575 -0
  25. package/dist_ts/classes.flexharness.prompts.d.ts +44 -0
  26. package/dist_ts/classes.flexharness.prompts.js +659 -0
  27. package/dist_ts/classes.flexharness.providers.d.ts +18 -0
  28. package/dist_ts/classes.flexharness.providers.js +267 -0
  29. package/dist_ts/classes.flexharness.results.d.ts +26 -0
  30. package/dist_ts/classes.flexharness.results.js +89 -0
  31. package/dist_ts/classes.flexharness.reversions.d.ts +52 -0
  32. package/dist_ts/classes.flexharness.reversions.js +1306 -0
  33. package/dist_ts/classes.flexharness.runs.d.ts +63 -0
  34. package/dist_ts/classes.flexharness.runs.js +1058 -0
  35. package/dist_ts/classes.flexharness.sessions.d.ts +20 -0
  36. package/dist_ts/classes.flexharness.sessions.js +381 -0
  37. package/dist_ts/classes.flexharness.slashcommands.d.ts +40 -0
  38. package/dist_ts/classes.flexharness.slashcommands.js +458 -0
  39. package/dist_ts/classes.flexharness.subagents.d.ts +31 -0
  40. package/dist_ts/classes.flexharness.subagents.js +690 -0
  41. package/dist_ts/classes.flexharness.tooldispatch.d.ts +53 -0
  42. package/dist_ts/classes.flexharness.tooldispatch.js +418 -0
  43. package/dist_ts/classes.stores.js +1 -1
  44. package/dist_ts/classes.toolcatalog.js +1 -1
  45. package/dist_ts/errors.js +1 -1
  46. package/dist_ts/functions.toolpermissions.js +1 -1
  47. package/dist_ts/interfaces.d.ts +3 -3
  48. package/dist_ts/interfaces.flexharness.d.ts +455 -0
  49. package/dist_ts/interfaces.flexharness.js +2 -0
  50. package/dist_ts/utils.flexharness.d.ts +19 -0
  51. package/dist_ts/utils.flexharness.js +83 -0
  52. package/dist_ts/utils.harnessoptions.js +1 -1
  53. package/dist_ts/utils.json.js +1 -1
  54. package/dist_ts/utils.schemadeclarations.js +1 -1
  55. package/dist_ts/utils.sessionimport.js +1 -1
  56. package/dist_ts/utils.sessionmetrics.d.ts +1 -1
  57. package/dist_ts_chat/classes.chatsession.js +1 -1
  58. package/dist_ts_chat_harness/classes.transcript.js +1 -1
  59. package/dist_ts_chat_harness/functions.intents.js +1 -1
  60. package/dist_ts_chat_harness/functions.mapping.d.ts +1 -1
  61. package/dist_ts_chat_harness/functions.mapping.js +1 -1
  62. package/dist_ts_chat_harness_server/classes.chathub.d.ts +18 -7
  63. package/dist_ts_chat_harness_server/classes.chathub.js +65 -62
  64. package/dist_ts_chat_harness_server/classes.chatsubscription.d.ts +5 -3
  65. package/dist_ts_chat_harness_server/classes.chatsubscription.js +4 -4
  66. package/dist_ts_chat_harness_server/classes.scopedirectory.d.ts +17 -0
  67. package/dist_ts_chat_harness_server/classes.scopedirectory.js +49 -0
  68. package/dist_ts_chat_harness_server/classes.sessionlists.d.ts +3 -5
  69. package/dist_ts_chat_harness_server/classes.sessionlists.js +11 -12
  70. package/dist_ts_chat_harness_server/classes.turngate.d.ts +8 -2
  71. package/dist_ts_chat_harness_server/classes.turngate.js +22 -21
  72. package/dist_ts_chat_harness_server/functions.errorprojector.js +1 -1
  73. package/dist_ts_chat_harness_server/index.d.ts +3 -2
  74. package/dist_ts_chat_harness_server/index.js +3 -2
  75. package/dist_ts_chat_harness_server/interfaces.d.ts +35 -2
  76. package/dist_ts_chat_harness_server/plugins.d.ts +1 -1
  77. package/dist_ts_chat_harness_typedsocket/classes.clienttransport.d.ts +28 -3
  78. package/dist_ts_chat_harness_typedsocket/classes.clienttransport.js +71 -15
  79. package/dist_ts_chat_harness_typedsocket/classes.serverbinding.d.ts +5 -3
  80. package/dist_ts_chat_harness_typedsocket/classes.serverbinding.js +79 -16
  81. package/dist_ts_chat_harness_typedsocket/index.d.ts +2 -2
  82. package/dist_ts_chat_harness_typedsocket/index.js +1 -1
  83. package/dist_ts_chat_harness_typedsocket/interfaces.requests.d.ts +20 -11
  84. package/dist_ts_chat_web/flexchat-input.js +1 -1
  85. package/dist_ts_chat_web/flexchat-message.js +1 -1
  86. package/dist_ts_chat_web/flexchat-window.js +1 -1
  87. package/dist_ts_compaction/smartagent.compaction.js +1 -1
  88. package/dist_ts_kvm/ocr.js +1 -1
  89. package/dist_ts_ocr/classes.imageocr.js +1 -1
  90. package/dist_ts_ocr/ocr.mistral.js +1 -1
  91. package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +1 -1
  92. package/dist_ts_tools/tool.browser.js +1 -1
  93. package/dist_ts_tools/tool.filesystem.js +1 -1
  94. package/dist_ts_tools/tool.shell.js +1 -1
  95. package/dist_ts_tools_node/tool.context.js +1 -1
  96. package/dist_ts_typedrequest/catalog.d.ts +2 -2
  97. package/dist_ts_typedrequest/catalog.js +1 -1
  98. package/package.json +3 -3
  99. package/ts/00_commitinfo_data.ts +1 -1
  100. package/ts/classes.flexharness.admission.ts +331 -0
  101. package/ts/classes.flexharness.callbacks.ts +352 -0
  102. package/ts/classes.flexharness.compaction.ts +167 -0
  103. package/ts/classes.flexharness.configurations.ts +167 -0
  104. package/ts/classes.flexharness.core.ts +1830 -0
  105. package/ts/classes.flexharness.deletion.ts +616 -0
  106. package/ts/classes.flexharness.imports.ts +414 -0
  107. package/ts/classes.flexharness.lifecycle.ts +786 -0
  108. package/ts/classes.flexharness.permissions.ts +535 -0
  109. package/ts/classes.flexharness.projects.ts +1006 -0
  110. package/ts/classes.flexharness.prompts.ts +857 -0
  111. package/ts/classes.flexharness.providers.ts +322 -0
  112. package/ts/classes.flexharness.results.ts +98 -0
  113. package/ts/classes.flexharness.reversions.ts +1684 -0
  114. package/ts/classes.flexharness.runs.ts +1204 -0
  115. package/ts/classes.flexharness.sessions.ts +483 -0
  116. package/ts/classes.flexharness.slashcommands.ts +705 -0
  117. package/ts/classes.flexharness.subagents.ts +860 -0
  118. package/ts/classes.flexharness.tooldispatch.ts +475 -0
  119. package/ts/classes.flexharness.ts +147 -12567
  120. package/ts/interfaces.flexharness.ts +517 -0
  121. package/ts/utils.flexharness.ts +121 -0
  122. package/ts_chat_harness_server/classes.chathub.ts +68 -61
  123. package/ts_chat_harness_server/classes.chatsubscription.ts +7 -5
  124. package/ts_chat_harness_server/classes.scopedirectory.ts +67 -0
  125. package/ts_chat_harness_server/classes.sessionlists.ts +11 -19
  126. package/ts_chat_harness_server/classes.turngate.ts +28 -21
  127. package/ts_chat_harness_server/index.ts +4 -5
  128. package/ts_chat_harness_server/interfaces.ts +35 -2
  129. package/ts_chat_harness_server/plugins.ts +0 -3
  130. package/ts_chat_harness_server/readme.md +6 -4
  131. package/ts_chat_harness_typedsocket/classes.clienttransport.ts +92 -23
  132. package/ts_chat_harness_typedsocket/classes.serverbinding.ts +88 -16
  133. package/ts_chat_harness_typedsocket/index.ts +4 -2
  134. package/ts_chat_harness_typedsocket/interfaces.requests.ts +15 -11
  135. package/ts_chat_harness_typedsocket/readme.md +7 -3
@@ -0,0 +1,575 @@
1
+ import * as plugins from './plugins.js';
2
+ import { FlexHarnessNotFoundError, FlexHarnessStoreConflictError, FlexHarnessValidationError, } from './errors.js';
3
+ import { FLEX_PROJECT_MANAGEMENT_LIMITS, } from './interfaces.js';
4
+ import { cloneSerializable } from './utils.json.js';
5
+ import { assertFlexProjectManagementRecord, assertFlexProjectManagementSnapshot, createEmptyFlexProjectManagementSnapshot, } from './utils.projectmanagement.js';
6
+ import { maxTransferIdentifierBytes, publicSnapshot } from './utils.transfer.js';
7
+ import { validateCreateProjectTaskInput, validateProjectTaskId, validateUpdateProjectTaskInput, validateUtf8String, } from './utils.validation.js';
8
+ import { queueOperation, requireSessionGeneration, sha256Hex } from './utils.flexharness.js';
9
+ const maxProjectManagementTombstoneConflicts = 8;
10
+ /** The project tasks, goal and scratchpad that a session tree shares, and their agent tools. */
11
+ export class FlexHarnessProjectManagement {
12
+ core;
13
+ projectManagementQueues = new Map();
14
+ constructor(core) {
15
+ this.core = core;
16
+ }
17
+ async getProjectState(scopeId, sessionId) {
18
+ const { state, stored } = await this.resolveProjectManagementSession(scopeId, sessionId, 'read');
19
+ const snapshot = await this.readProjectManagementState(state, stored);
20
+ return this.projectStateResult(snapshot);
21
+ }
22
+ async listProjectTasks(scopeId, sessionId) {
23
+ const { state, stored } = await this.resolveProjectManagementSession(scopeId, sessionId, 'read');
24
+ const snapshot = await this.readProjectManagementState(state, stored);
25
+ return this.projectTasksResult(snapshot, snapshot.tasks);
26
+ }
27
+ async createProjectTask(scopeId, sessionId, input) {
28
+ validateCreateProjectTaskInput(input);
29
+ const { state, stored } = await this.resolveProjectManagementSession(scopeId, sessionId, 'write');
30
+ return this.createProjectTaskInState(state, stored, input, Object.freeze({ actor: 'application' }));
31
+ }
32
+ async updateProjectTask(scopeId, sessionId, input) {
33
+ validateUpdateProjectTaskInput(input);
34
+ const { state, stored } = await this.resolveProjectManagementSession(scopeId, sessionId, 'write');
35
+ return this.updateProjectTaskInState(state, stored, input, Object.freeze({ actor: 'application' }));
36
+ }
37
+ async deleteProjectTask(scopeId, sessionId, taskId) {
38
+ validateProjectTaskId(taskId);
39
+ const { state, stored } = await this.resolveProjectManagementSession(scopeId, sessionId, 'write');
40
+ return this.deleteProjectTaskInState(state, stored, taskId, Object.freeze({ actor: 'application' }));
41
+ }
42
+ async clearProjectTasks(scopeId, sessionId) {
43
+ const { state, stored } = await this.resolveProjectManagementSession(scopeId, sessionId, 'write');
44
+ return this.clearProjectTasksInState(state, stored, Object.freeze({ actor: 'application' }));
45
+ }
46
+ async getProjectGoal(scopeId, sessionId) {
47
+ const { state, stored } = await this.resolveProjectManagementSession(scopeId, sessionId, 'read');
48
+ const snapshot = await this.readProjectManagementState(state, stored);
49
+ return this.projectGoalResult(snapshot);
50
+ }
51
+ async setProjectGoal(scopeId, sessionId, goal) {
52
+ validateUtf8String(goal, 'project goal', FLEX_PROJECT_MANAGEMENT_LIMITS.maxGoalBytes, true);
53
+ const { state, stored } = await this.resolveProjectManagementSession(scopeId, sessionId, 'write');
54
+ return this.setProjectGoalInState(state, stored, goal, Object.freeze({ actor: 'application' }));
55
+ }
56
+ async clearProjectGoal(scopeId, sessionId) {
57
+ const { state, stored } = await this.resolveProjectManagementSession(scopeId, sessionId, 'write');
58
+ return this.clearProjectGoalInState(state, stored, Object.freeze({ actor: 'application' }));
59
+ }
60
+ async getProjectScratchpad(scopeId, sessionId) {
61
+ const { state, stored } = await this.resolveProjectManagementSession(scopeId, sessionId, 'read');
62
+ const snapshot = await this.readProjectManagementState(state, stored);
63
+ return this.projectScratchpadResult(snapshot);
64
+ }
65
+ async setProjectScratchpad(scopeId, sessionId, content) {
66
+ validateUtf8String(content, 'project scratchpad', FLEX_PROJECT_MANAGEMENT_LIMITS.maxScratchpadBytes);
67
+ const { state, stored } = await this.resolveProjectManagementSession(scopeId, sessionId, 'write');
68
+ return this.setProjectScratchpadInState(state, stored, content, Object.freeze({ actor: 'application' }));
69
+ }
70
+ async appendProjectScratchpad(scopeId, sessionId, content) {
71
+ validateUtf8String(content, 'project scratchpad append', FLEX_PROJECT_MANAGEMENT_LIMITS.maxScratchpadBytes);
72
+ const { state, stored } = await this.resolveProjectManagementSession(scopeId, sessionId, 'write');
73
+ return this.appendProjectScratchpadInState(state, stored, content, Object.freeze({ actor: 'application' }));
74
+ }
75
+ async clearProjectScratchpad(scopeId, sessionId) {
76
+ const { state, stored } = await this.resolveProjectManagementSession(scopeId, sessionId, 'write');
77
+ return this.clearProjectScratchpadInState(state, stored, Object.freeze({ actor: 'application' }));
78
+ }
79
+ requireProjectManagementTools() {
80
+ const projectManagement = this.core.builtInTools.projectManagement;
81
+ if (!projectManagement) {
82
+ throw new FlexHarnessValidationError('Project management is not configured for this FlexHarness.');
83
+ }
84
+ return projectManagement;
85
+ }
86
+ projectManagementKey(storageKey, sessionId) {
87
+ return JSON.stringify([storageKey, sessionId]);
88
+ }
89
+ queueProjectManagementOperation(storageKey, sessionId, operation) {
90
+ return queueOperation(this.projectManagementQueues, this.projectManagementKey(storageKey, sessionId), operation);
91
+ }
92
+ async awaitProjectManagementOperations(storageKey, sessionIds) {
93
+ const barriers = [...new Set(sessionIds)]
94
+ .map((sessionId) => this.projectManagementQueues.get(this.projectManagementKey(storageKey, sessionId)))
95
+ .filter((barrier) => barrier !== undefined);
96
+ await Promise.all(barriers);
97
+ }
98
+ async resolveProjectManagementSession(scopeId, sessionId, access) {
99
+ this.requireProjectManagementTools();
100
+ const { state } = await this.core.resolveState(scopeId);
101
+ await state.scopeQueue;
102
+ this.core.assertOpen();
103
+ this.core.assertStateAcceptingWork(state);
104
+ const stored = this.core.requireSession(state, sessionId);
105
+ if (access === 'write')
106
+ this.core.assertSessionWritable(stored);
107
+ return { state, stored };
108
+ }
109
+ assertProjectManagementSession(state, stored) {
110
+ this.core.assertOpen();
111
+ this.core.assertStateAcceptingWork(state);
112
+ if (state.sessions.get(stored.session.sessionId) !== stored
113
+ || state.tombstones.has(stored.session.sessionId)) {
114
+ throw new FlexHarnessNotFoundError('Session', stored.session.sessionId);
115
+ }
116
+ }
117
+ async loadProjectManagementState(state, stored) {
118
+ const store = this.core.stores.projectManagement;
119
+ const generation = requireSessionGeneration(stored.session);
120
+ const sessionContext = this.createProjectManagementSessionContext(state, stored.session);
121
+ const record = await store.load(state.storageKey, stored.session.sessionId, sessionContext);
122
+ if (record === undefined) {
123
+ return createEmptyFlexProjectManagementSnapshot(generation.sessionGenerationId, generation.sessionGenerationSequence);
124
+ }
125
+ assertFlexProjectManagementRecord(record);
126
+ if (record.sessionGenerationId === generation.sessionGenerationId) {
127
+ if (record.sessionGenerationSequence !== generation.sessionGenerationSequence) {
128
+ throw new FlexHarnessStoreConflictError(this.projectManagementKey(state.storageKey, stored.session.sessionId), 0, record.revision);
129
+ }
130
+ if (!('deletedAt' in record))
131
+ return cloneSerializable(record);
132
+ throw new FlexHarnessNotFoundError('Project management state', stored.session.sessionId);
133
+ }
134
+ if ('deletedAt' in record
135
+ && record.sessionGenerationSequence < generation.sessionGenerationSequence) {
136
+ return createEmptyFlexProjectManagementSnapshot(generation.sessionGenerationId, generation.sessionGenerationSequence);
137
+ }
138
+ throw new FlexHarnessStoreConflictError(this.projectManagementKey(state.storageKey, stored.session.sessionId), 0, record.revision);
139
+ }
140
+ readProjectManagementState(state, stored) {
141
+ return this.queueProjectManagementOperation(state.storageKey, stored.session.sessionId, async () => {
142
+ this.assertProjectManagementSession(state, stored);
143
+ const snapshot = await this.loadProjectManagementState(state, stored);
144
+ this.assertProjectManagementSession(state, stored);
145
+ return publicSnapshot(snapshot);
146
+ });
147
+ }
148
+ mutateProjectManagementState(state, stored, writeContext, mutation) {
149
+ return this.queueProjectManagementOperation(state.storageKey, stored.session.sessionId, async () => {
150
+ this.assertProjectManagementSession(state, stored);
151
+ const snapshot = await this.loadProjectManagementState(state, stored);
152
+ this.assertProjectManagementSession(state, stored);
153
+ const expectedRevision = snapshot.revision;
154
+ const result = mutation(snapshot);
155
+ if (result.changed) {
156
+ snapshot.revision = expectedRevision + 1;
157
+ assertFlexProjectManagementSnapshot(snapshot);
158
+ this.assertProjectManagementSession(state, stored);
159
+ await this.core.stores.projectManagement.save(state.storageKey, stored.session.sessionId, cloneSerializable(snapshot), expectedRevision, Object.freeze(cloneSerializable(writeContext)));
160
+ }
161
+ return {
162
+ snapshot: publicSnapshot(snapshot),
163
+ value: result.value === undefined ? result.value : publicSnapshot(result.value),
164
+ };
165
+ });
166
+ }
167
+ projectStateResult(snapshot) {
168
+ return publicSnapshot({ revision: snapshot.revision, state: snapshot });
169
+ }
170
+ createProjectManagementSessionContext(state, session) {
171
+ const source = 'deletedAt' in session
172
+ ? session.subagent
173
+ : this.core.subagentTasks.createSubagentProvenance(state, session);
174
+ const subagent = source === undefined
175
+ ? undefined
176
+ : Object.freeze({ ...cloneSerializable(source) });
177
+ return Object.freeze({
178
+ ...requireSessionGeneration(session),
179
+ ...(subagent === undefined ? {} : { subagent }),
180
+ });
181
+ }
182
+ projectTaskResult(snapshot, task) {
183
+ return publicSnapshot({ revision: snapshot.revision, task, state: snapshot });
184
+ }
185
+ projectTasksResult(snapshot, tasks) {
186
+ return publicSnapshot({ revision: snapshot.revision, tasks, state: snapshot });
187
+ }
188
+ projectGoalResult(snapshot) {
189
+ return publicSnapshot({
190
+ revision: snapshot.revision,
191
+ goal: snapshot.goal ?? null,
192
+ state: snapshot,
193
+ });
194
+ }
195
+ projectScratchpadResult(snapshot) {
196
+ return publicSnapshot({
197
+ revision: snapshot.revision,
198
+ scratchpad: snapshot.scratchpad,
199
+ state: snapshot,
200
+ });
201
+ }
202
+ async createProjectTaskInState(state, stored, input, writeContext) {
203
+ const status = input.status ?? 'pending';
204
+ const priority = input.priority ?? 'medium';
205
+ const result = await this.mutateProjectManagementState(state, stored, writeContext, (snapshot) => {
206
+ const existing = snapshot.tasks.find((task) => task.id === input.id);
207
+ if (existing) {
208
+ if (existing.content === input.content
209
+ && existing.status === status
210
+ && existing.priority === priority)
211
+ return { changed: false, value: existing };
212
+ throw new FlexHarnessValidationError(`Project task "${input.id}" already exists with different creation data.`);
213
+ }
214
+ if (snapshot.tasks.length >= FLEX_PROJECT_MANAGEMENT_LIMITS.maxTasks) {
215
+ throw new FlexHarnessValidationError('Project task count has reached its limit.');
216
+ }
217
+ const timestamp = new Date().toISOString();
218
+ const task = {
219
+ id: input.id,
220
+ content: input.content,
221
+ status,
222
+ priority,
223
+ createdAt: timestamp,
224
+ updatedAt: timestamp,
225
+ };
226
+ snapshot.tasks.push(task);
227
+ return { changed: true, value: task };
228
+ });
229
+ return this.projectTaskResult(result.snapshot, result.value);
230
+ }
231
+ async updateProjectTaskInState(state, stored, input, writeContext) {
232
+ const result = await this.mutateProjectManagementState(state, stored, writeContext, (snapshot) => {
233
+ const task = snapshot.tasks.find((entry) => entry.id === input.id);
234
+ if (!task)
235
+ throw new FlexHarnessNotFoundError('Project task', input.id);
236
+ const changed = (input.content !== undefined && input.content !== task.content)
237
+ || (input.status !== undefined && input.status !== task.status)
238
+ || (input.priority !== undefined && input.priority !== task.priority);
239
+ if (!changed)
240
+ return { changed: false, value: task };
241
+ if (input.content !== undefined)
242
+ task.content = input.content;
243
+ if (input.status !== undefined)
244
+ task.status = input.status;
245
+ if (input.priority !== undefined)
246
+ task.priority = input.priority;
247
+ task.updatedAt = new Date().toISOString();
248
+ return { changed: true, value: task };
249
+ });
250
+ return this.projectTaskResult(result.snapshot, result.value);
251
+ }
252
+ async deleteProjectTaskInState(state, stored, taskId, writeContext) {
253
+ const result = await this.mutateProjectManagementState(state, stored, writeContext, (snapshot) => {
254
+ const index = snapshot.tasks.findIndex((task) => task.id === taskId);
255
+ if (index < 0)
256
+ throw new FlexHarnessNotFoundError('Project task', taskId);
257
+ const [task] = snapshot.tasks.splice(index, 1);
258
+ return { changed: true, value: task };
259
+ });
260
+ return this.projectTaskResult(result.snapshot, result.value);
261
+ }
262
+ async clearProjectTasksInState(state, stored, writeContext) {
263
+ const result = await this.mutateProjectManagementState(state, stored, writeContext, (snapshot) => {
264
+ const tasks = snapshot.tasks;
265
+ if (tasks.length === 0)
266
+ return { changed: false, value: [] };
267
+ snapshot.tasks = [];
268
+ return { changed: true, value: tasks };
269
+ });
270
+ return this.projectTasksResult(result.snapshot, result.value);
271
+ }
272
+ async setProjectGoalInState(state, stored, goal, writeContext) {
273
+ const result = await this.mutateProjectManagementState(state, stored, writeContext, (snapshot) => {
274
+ if (snapshot.goal === goal)
275
+ return { changed: false, value: undefined };
276
+ snapshot.goal = goal;
277
+ return { changed: true, value: undefined };
278
+ });
279
+ return this.projectGoalResult(result.snapshot);
280
+ }
281
+ async clearProjectGoalInState(state, stored, writeContext) {
282
+ const result = await this.mutateProjectManagementState(state, stored, writeContext, (snapshot) => {
283
+ if (snapshot.goal === undefined)
284
+ return { changed: false, value: undefined };
285
+ delete snapshot.goal;
286
+ return { changed: true, value: undefined };
287
+ });
288
+ return this.projectGoalResult(result.snapshot);
289
+ }
290
+ async setProjectScratchpadInState(state, stored, content, writeContext) {
291
+ const result = await this.mutateProjectManagementState(state, stored, writeContext, (snapshot) => {
292
+ if (snapshot.scratchpad === content)
293
+ return { changed: false, value: undefined };
294
+ snapshot.scratchpad = content;
295
+ return { changed: true, value: undefined };
296
+ });
297
+ return this.projectScratchpadResult(result.snapshot);
298
+ }
299
+ async appendProjectScratchpadInState(state, stored, content, writeContext) {
300
+ const result = await this.mutateProjectManagementState(state, stored, writeContext, (snapshot) => {
301
+ if (content.length === 0)
302
+ return { changed: false, value: undefined };
303
+ const appended = `${snapshot.scratchpad}${content}`;
304
+ validateUtf8String(appended, 'project scratchpad', FLEX_PROJECT_MANAGEMENT_LIMITS.maxScratchpadBytes);
305
+ snapshot.scratchpad = appended;
306
+ return { changed: true, value: undefined };
307
+ });
308
+ return this.projectScratchpadResult(result.snapshot);
309
+ }
310
+ async clearProjectScratchpadInState(state, stored, writeContext) {
311
+ const result = await this.mutateProjectManagementState(state, stored, writeContext, (snapshot) => {
312
+ if (snapshot.scratchpad.length === 0)
313
+ return { changed: false, value: undefined };
314
+ snapshot.scratchpad = '';
315
+ return { changed: true, value: undefined };
316
+ });
317
+ return this.projectScratchpadResult(result.snapshot);
318
+ }
319
+ createProjectTaskTool(run) {
320
+ const status = plugins.z.enum(['pending', 'in_progress', 'completed', 'cancelled']);
321
+ const priority = plugins.z.enum(['high', 'medium', 'low']);
322
+ const id = plugins.z.string().min(1).max(FLEX_PROJECT_MANAGEMENT_LIMITS.maxTaskIdBytes);
323
+ const content = plugins.z.string().min(1).max(FLEX_PROJECT_MANAGEMENT_LIMITS.maxTaskContentBytes);
324
+ return plugins.tool({
325
+ description: 'List, create, update, delete, or clear session-local project tasks.',
326
+ strict: false,
327
+ inputSchema: plugins.z.object({
328
+ action: plugins.z.enum(['list', 'create', 'update', 'delete', 'clear']),
329
+ id: id.optional(),
330
+ content: content.optional(),
331
+ status: status.optional(),
332
+ priority: priority.optional(),
333
+ }).strict().superRefine((input, context) => {
334
+ const rejectFields = (...fields) => {
335
+ for (const field of fields) {
336
+ if (input[field] === undefined)
337
+ continue;
338
+ context.addIssue({
339
+ code: 'custom',
340
+ path: [field],
341
+ message: `Task action "${input.action}" does not accept ${field}.`,
342
+ });
343
+ }
344
+ };
345
+ if (input.action === 'list' || input.action === 'clear') {
346
+ rejectFields('id', 'content', 'status', 'priority');
347
+ }
348
+ else if (input.action === 'create') {
349
+ if (input.content === undefined) {
350
+ context.addIssue({
351
+ code: 'custom',
352
+ path: ['content'],
353
+ message: 'Task creation requires content.',
354
+ });
355
+ }
356
+ }
357
+ else if (input.action === 'update') {
358
+ if (input.id === undefined) {
359
+ context.addIssue({
360
+ code: 'custom',
361
+ path: ['id'],
362
+ message: 'Task update requires an id.',
363
+ });
364
+ }
365
+ if (input.content === undefined
366
+ && input.status === undefined
367
+ && input.priority === undefined) {
368
+ context.addIssue({
369
+ code: 'custom',
370
+ message: 'Task update requires content, status, or priority.',
371
+ });
372
+ }
373
+ }
374
+ else {
375
+ if (input.id === undefined) {
376
+ context.addIssue({
377
+ code: 'custom',
378
+ path: ['id'],
379
+ message: 'Task deletion requires an id.',
380
+ });
381
+ }
382
+ rejectFields('content', 'status', 'priority');
383
+ }
384
+ }),
385
+ execute: (input, options) => this.executeProjectTaskTool(run, input, options?.toolCallId),
386
+ });
387
+ }
388
+ createProjectGoalTool(run) {
389
+ return plugins.tool({
390
+ description: 'Get, set, or clear the session-local project goal.',
391
+ strict: false,
392
+ inputSchema: plugins.z.object({
393
+ action: plugins.z.enum(['get', 'set', 'clear']),
394
+ goal: plugins.z.string()
395
+ .min(1)
396
+ .max(FLEX_PROJECT_MANAGEMENT_LIMITS.maxGoalBytes)
397
+ .optional(),
398
+ }).strict().superRefine((input, context) => {
399
+ if (input.action === 'set' && input.goal === undefined) {
400
+ context.addIssue({
401
+ code: 'custom',
402
+ path: ['goal'],
403
+ message: 'Goal set requires a goal.',
404
+ });
405
+ }
406
+ else if (input.action !== 'set' && input.goal !== undefined) {
407
+ context.addIssue({
408
+ code: 'custom',
409
+ path: ['goal'],
410
+ message: `Goal action "${input.action}" does not accept goal.`,
411
+ });
412
+ }
413
+ }),
414
+ execute: (input, options) => this.executeProjectGoalTool(run, input, options?.toolCallId),
415
+ });
416
+ }
417
+ createProjectScratchpadTool(run) {
418
+ const content = plugins.z.string().max(FLEX_PROJECT_MANAGEMENT_LIMITS.maxScratchpadBytes);
419
+ return plugins.tool({
420
+ description: 'Get, set, append to, or clear the session-local project scratchpad.',
421
+ strict: false,
422
+ inputSchema: plugins.z.object({
423
+ action: plugins.z.enum(['get', 'set', 'append', 'clear']),
424
+ content: content.optional(),
425
+ }).strict().superRefine((input, context) => {
426
+ if ((input.action === 'set' || input.action === 'append')
427
+ && input.content === undefined) {
428
+ context.addIssue({
429
+ code: 'custom',
430
+ path: ['content'],
431
+ message: `Scratchpad ${input.action} requires content.`,
432
+ });
433
+ }
434
+ else if ((input.action === 'get' || input.action === 'clear')
435
+ && input.content !== undefined) {
436
+ context.addIssue({
437
+ code: 'custom',
438
+ path: ['content'],
439
+ message: `Scratchpad action "${input.action}" does not accept content.`,
440
+ });
441
+ }
442
+ }),
443
+ execute: (input, options) => this.executeProjectScratchpadTool(run, input, options?.toolCallId),
444
+ });
445
+ }
446
+ projectManagementAgentWriteContext(run, toolCallId) {
447
+ return Object.freeze({
448
+ actor: 'agent',
449
+ runId: run.runId,
450
+ ...(run.stored.session.agent === undefined ? {} : { agent: run.stored.session.agent }),
451
+ ...(toolCallId === undefined ? {} : { toolCallId }),
452
+ });
453
+ }
454
+ async executeProjectTaskTool(run, input, toolCallId) {
455
+ this.assertProjectManagementSession(run.state, run.stored);
456
+ if (input.action === 'list') {
457
+ const snapshot = await this.readProjectManagementState(run.state, run.stored);
458
+ return this.projectTasksResult(snapshot, snapshot.tasks);
459
+ }
460
+ const writeContext = this.projectManagementAgentWriteContext(run, toolCallId);
461
+ if (input.action === 'create') {
462
+ const id = input.id ?? (() => {
463
+ validateUtf8String(toolCallId, 'task toolCallId', maxTransferIdentifierBytes, true);
464
+ return this.createProjectTaskId(run.state.storageKey, run.sessionId, run.runId, toolCallId);
465
+ })();
466
+ const createInput = {
467
+ id,
468
+ content: input.content,
469
+ ...(input.status === undefined ? {} : { status: input.status }),
470
+ ...(input.priority === undefined ? {} : { priority: input.priority }),
471
+ };
472
+ validateCreateProjectTaskInput(createInput);
473
+ return this.createProjectTaskInState(run.state, run.stored, createInput, writeContext);
474
+ }
475
+ if (input.action === 'update') {
476
+ const updateInput = {
477
+ id: input.id,
478
+ ...(input.content === undefined ? {} : { content: input.content }),
479
+ ...(input.status === undefined ? {} : { status: input.status }),
480
+ ...(input.priority === undefined ? {} : { priority: input.priority }),
481
+ };
482
+ validateUpdateProjectTaskInput(updateInput);
483
+ return this.updateProjectTaskInState(run.state, run.stored, updateInput, writeContext);
484
+ }
485
+ if (input.action === 'delete') {
486
+ validateProjectTaskId(input.id);
487
+ return this.deleteProjectTaskInState(run.state, run.stored, input.id, writeContext);
488
+ }
489
+ return this.clearProjectTasksInState(run.state, run.stored, writeContext);
490
+ }
491
+ async executeProjectGoalTool(run, input, toolCallId) {
492
+ this.assertProjectManagementSession(run.state, run.stored);
493
+ if (input.action === 'get') {
494
+ return this.projectGoalResult(await this.readProjectManagementState(run.state, run.stored));
495
+ }
496
+ const writeContext = this.projectManagementAgentWriteContext(run, toolCallId);
497
+ if (input.action === 'set') {
498
+ validateUtf8String(input.goal, 'project goal', FLEX_PROJECT_MANAGEMENT_LIMITS.maxGoalBytes, true);
499
+ return this.setProjectGoalInState(run.state, run.stored, input.goal, writeContext);
500
+ }
501
+ return this.clearProjectGoalInState(run.state, run.stored, writeContext);
502
+ }
503
+ async executeProjectScratchpadTool(run, input, toolCallId) {
504
+ this.assertProjectManagementSession(run.state, run.stored);
505
+ if (input.action === 'get') {
506
+ return this.projectScratchpadResult(await this.readProjectManagementState(run.state, run.stored));
507
+ }
508
+ const writeContext = this.projectManagementAgentWriteContext(run, toolCallId);
509
+ if (input.action === 'set') {
510
+ validateUtf8String(input.content, 'project scratchpad', FLEX_PROJECT_MANAGEMENT_LIMITS.maxScratchpadBytes);
511
+ return this.setProjectScratchpadInState(run.state, run.stored, input.content, writeContext);
512
+ }
513
+ if (input.action === 'append') {
514
+ validateUtf8String(input.content, 'project scratchpad append', FLEX_PROJECT_MANAGEMENT_LIMITS.maxScratchpadBytes);
515
+ return this.appendProjectScratchpadInState(run.state, run.stored, input.content, writeContext);
516
+ }
517
+ return this.clearProjectScratchpadInState(run.state, run.stored, writeContext);
518
+ }
519
+ createProjectTaskId(storageKey, sessionId, runId, toolCallId) {
520
+ return `task_${sha256Hex(JSON.stringify([
521
+ 'flexharness-project-task-v1',
522
+ storageKey,
523
+ sessionId,
524
+ runId,
525
+ toolCallId,
526
+ ]))}`;
527
+ }
528
+ async tombstoneProjectManagementSession(state, sessionTombstone) {
529
+ const storageKey = state.storageKey;
530
+ const store = this.core.stores.projectManagement;
531
+ const sessionId = sessionTombstone.sessionId;
532
+ const generation = requireSessionGeneration(sessionTombstone);
533
+ const sessionContext = this.createProjectManagementSessionContext(state, sessionTombstone);
534
+ let lastConflict;
535
+ for (let attempt = 0; attempt <= maxProjectManagementTombstoneConflicts; attempt++) {
536
+ const current = await store.load(storageKey, sessionId, sessionContext);
537
+ if (current !== undefined) {
538
+ assertFlexProjectManagementRecord(current);
539
+ if (current.sessionGenerationId === generation.sessionGenerationId) {
540
+ if (current.sessionGenerationSequence !== generation.sessionGenerationSequence) {
541
+ throw new FlexHarnessStoreConflictError(this.projectManagementKey(storageKey, sessionId), 0, current.revision);
542
+ }
543
+ if ('deletedAt' in current)
544
+ return;
545
+ }
546
+ else if (!('deletedAt' in current)
547
+ || current.sessionGenerationSequence >= generation.sessionGenerationSequence) {
548
+ throw new FlexHarnessStoreConflictError(this.projectManagementKey(storageKey, sessionId), 0, current.revision);
549
+ }
550
+ }
551
+ if (attempt === maxProjectManagementTombstoneConflicts)
552
+ break;
553
+ const expectedRevision = current === undefined
554
+ || current.sessionGenerationId !== generation.sessionGenerationId
555
+ ? 0
556
+ : current.revision;
557
+ const tombstone = {
558
+ schemaVersion: 1,
559
+ revision: expectedRevision + 1,
560
+ ...generation,
561
+ deletedAt: sessionTombstone.deletedAt,
562
+ };
563
+ try {
564
+ await store.tombstoneSession(storageKey, sessionId, tombstone, expectedRevision, sessionContext);
565
+ }
566
+ catch (error) {
567
+ if (!(error instanceof FlexHarnessStoreConflictError))
568
+ throw error;
569
+ lastConflict = error;
570
+ }
571
+ }
572
+ throw lastConflict ?? new FlexHarnessValidationError(`Project management tombstone for session "${sessionId}" could not be durably confirmed.`);
573
+ }
574
+ }
575
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mbGV4aGFybmVzcy5wcm9qZWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuZmxleGhhcm5lc3MucHJvamVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLHdCQUF3QixFQUN4Qiw2QkFBNkIsRUFDN0IsMEJBQTBCLEdBQzNCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCw4QkFBOEIsR0FlL0IsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsaUNBQWlDLEVBQ2pDLG1DQUFtQyxFQUNuQyx3Q0FBd0MsR0FDekMsTUFBTSw4QkFBOEIsQ0FBQztBQUV0QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUNMLDhCQUE4QixFQUM5QixxQkFBcUIsRUFDckIsOEJBQThCLEVBQzlCLGtCQUFrQixHQUNuQixNQUFNLHVCQUF1QixDQUFDO0FBUy9CLE9BQU8sRUFBRSxjQUFjLEVBQUUsd0JBQXdCLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHN0YsTUFBTSxzQ0FBc0MsR0FBRyxDQUFDLENBQUM7QUFFakQsZ0dBQWdHO0FBQ2hHLE1BQU0sT0FBTyw0QkFBNEI7SUFHVixJQUFJO0lBRmpCLHVCQUF1QixHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBRTNFLFlBQTZCLElBQTZCO29CQUE3QixJQUFJO0lBQTRCLENBQUM7SUFFdkQsS0FBSyxDQUFDLGVBQWUsQ0FDMUIsT0FBZSxFQUNmLFNBQWlCO1FBRWpCLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsK0JBQStCLENBQUMsT0FBTyxFQUFFLFNB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