@modelprofile.com/flexharness-agent 6.0.0 → 6.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.
Files changed (40) hide show
  1. package/dist_ts_agent/classes.sessionengine.d.ts +93 -0
  2. package/dist_ts_agent/classes.sessionengine.js +2140 -0
  3. package/dist_ts_agent/index.d.ts +3 -2
  4. package/dist_ts_agent/index.js +3 -2
  5. package/dist_ts_agent/persistence.file.d.ts +24 -0
  6. package/dist_ts_agent/persistence.file.js +199 -0
  7. package/dist_ts_agent/plugins.d.ts +0 -7
  8. package/dist_ts_agent/plugins.js +1 -9
  9. package/dist_ts_agent/plugins.node.d.ts +7 -0
  10. package/dist_ts_agent/plugins.node.js +9 -0
  11. package/dist_ts_agent/plugins.portable.d.ts +4 -0
  12. package/dist_ts_agent/plugins.portable.js +5 -0
  13. package/dist_ts_agent/runner.d.ts +4 -0
  14. package/dist_ts_agent/runner.js +34 -0
  15. package/dist_ts_agent/runtime.interfaces.d.ts +21 -0
  16. package/dist_ts_agent/runtime.interfaces.js +2 -0
  17. package/dist_ts_agent/runtime.run.d.ts +3 -0
  18. package/dist_ts_agent/runtime.run.js +94 -0
  19. package/dist_ts_agent/smartagent.classes.agent.js +4 -93
  20. package/dist_ts_agent/smartagent.classes.session.d.ts +5 -88
  21. package/dist_ts_agent/smartagent.classes.session.js +19 -2134
  22. package/dist_ts_agent/smartagent.events.js +2 -2
  23. package/dist_ts_agent/smartagent.persistence.d.ts +2 -22
  24. package/dist_ts_agent/smartagent.persistence.js +3 -198
  25. package/package.json +9 -3
  26. package/readme.md +6 -0
  27. package/ts_agent/classes.sessionengine.ts +2591 -0
  28. package/ts_agent/index.ts +2 -2
  29. package/ts_agent/persistence.file.ts +232 -0
  30. package/ts_agent/plugins.node.ts +10 -0
  31. package/ts_agent/plugins.portable.ts +5 -0
  32. package/ts_agent/plugins.ts +0 -10
  33. package/ts_agent/readme.md +6 -0
  34. package/ts_agent/runner.ts +40 -0
  35. package/ts_agent/runtime.interfaces.ts +21 -0
  36. package/ts_agent/runtime.run.ts +107 -0
  37. package/ts_agent/smartagent.classes.agent.ts +4 -101
  38. package/ts_agent/smartagent.classes.session.ts +24 -2582
  39. package/ts_agent/smartagent.events.ts +1 -1
  40. package/ts_agent/smartagent.persistence.ts +2 -224
@@ -5,9 +5,9 @@ export { filterModelVisibleAgentEvents, getAgentGenerationTransactions, getOpenA
5
5
  export { createAgentEvent, createAgentEventId, modelMessagesToAgentEvents, } from './smartagent.events.js';
6
6
  export { ToolRegistry } from './smartagent.classes.toolregistry.js';
7
7
  export { AgentGenerationLeaseCleanupError, ContextOverflowError, } from './smartagent.interfaces.js';
8
- export { AgentEventStoreConflictError, FileAgentEventStore, InMemoryAgentEventStore, isAgentEventStoreV2, validateAgentEventArchiveV2, validateAgentEventSnapshotV2, } from './smartagent.persistence.js';
8
+ export { AgentEventStoreConflictError, InMemoryAgentEventStore, isAgentEventStoreV2, validateAgentEventArchiveV2, validateAgentEventSnapshotV2, } from './smartagent.persistence.js';
9
9
  export type { IAgentCacheOptions, IAgentContextOverflowInvocationOptions, IAgentContextBuildOptions, IAgentContextCompactionOptions, IAgentCompactOptions, IAgentEventRetentionOptions, IAgentBeginGenerationOptions, IAgentGenerateOptions, IAgentGenerateResult, IAgentGenerationHandle, IAgentGenerationLease, IAgentGenerationPreparationContext, IAgentRunOptions, IAgentRunResult, IAgentSession, IAgentSessionAbortOptions, IAgentSessionChange, IAgentSessionOptions, IAgentScheduleGenerateOptions, IAgentToolCallRecord, IAgentToolCallStartEvent, IAgentToolCallUpdateEvent, ProviderOptions, TAgentCacheRetention, TAgentCacheSetting, TAgentPrompt, TAgentContextBuilder, TAgentContextCompactor, TAgentGenerationPrepare, TAgentSessionChangeListener, TAgentToolCallFinishEvent, TAgentToolExecutionReconciliationOptions, } from './smartagent.interfaces.js';
10
- export type { IAgentEventArchive, IAgentEventArchiveV2, IAgentEventSnapshot, IAgentEventSnapshotV2, IAgentEventStore, IAgentEventStoreV2, IFileAgentEventStoreOptions, TAgentEventArchive, TAgentEventSnapshot, TAgentEventStore, } from './smartagent.persistence.js';
10
+ export type { IAgentEventArchive, IAgentEventArchiveV2, IAgentEventSnapshot, IAgentEventSnapshotV2, IAgentEventStore, IAgentEventStoreV2, TAgentEventArchive, TAgentEventSnapshot, TAgentEventStore, } from './smartagent.persistence.js';
11
11
  export type { IAgentEventBase, IAgentRuntimeEventPayload, IArchivedAgentGenerationTransaction, IAssistantMessageEvent, IContextCompactionEvent, IGenerationBegunEvent, IGenerationExecutionCompletedEvent, IGenerationExecutionStartedEvent, IGenerationOutcomeEvent, IModelMessageEvent, IModelMessagesToEventsOptions, IModelMessageEventIdentityCoordinates, IRuntimeEvent, ISystemMessageEvent, IToolCallEvent, IToolExecutionIntentEvent, IToolExecutionReconciliationEvent, IToolResultEvent, IUserMessageEvent, TAgentAssistantMessage, TAgentConversationEvent, TAgentControlEvent, TAgentEvent, TAgentEventInput, TAgentSystemMessage, TAgentGenerationOutcome, TAgentToolCallPart, TAgentToolMessage, TAgentToolResultOutput, TAgentToolResultPart, TAgentUserMessage, TModelMessageEmittedEventKind, TModelMessageEventIdentityFactory, TToolExecutionReconciliation, } from './smartagent.events.js';
12
12
  export type { IAgentGenerationTransaction, TAgentGenerationTransactionState, } from './smartagent.transactions.js';
13
13
  export * from './tool.contracts.js';
@@ -15,3 +15,4 @@ export * from './tool.persistence.js';
15
15
  export * from './tool.adapter.js';
16
16
  export { tool, jsonSchema, stepCountIs } from 'ai';
17
17
  export { z } from 'zod';
18
+ export { FileAgentEventStore, type IFileAgentEventStoreOptions } from './persistence.file.js';
@@ -5,10 +5,11 @@ export { filterModelVisibleAgentEvents, getAgentGenerationTransactions, getOpenA
5
5
  export { createAgentEvent, createAgentEventId, modelMessagesToAgentEvents, } from './smartagent.events.js';
6
6
  export { ToolRegistry } from './smartagent.classes.toolregistry.js';
7
7
  export { AgentGenerationLeaseCleanupError, ContextOverflowError, } from './smartagent.interfaces.js';
8
- export { AgentEventStoreConflictError, FileAgentEventStore, InMemoryAgentEventStore, isAgentEventStoreV2, validateAgentEventArchiveV2, validateAgentEventSnapshotV2, } from './smartagent.persistence.js';
8
+ export { AgentEventStoreConflictError, InMemoryAgentEventStore, isAgentEventStoreV2, validateAgentEventArchiveV2, validateAgentEventSnapshotV2, } from './smartagent.persistence.js';
9
9
  export * from './tool.contracts.js';
10
10
  export * from './tool.persistence.js';
11
11
  export * from './tool.adapter.js';
12
12
  export { tool, jsonSchema, stepCountIs } from 'ai';
13
13
  export { z } from 'zod';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19hZ2VudC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsOEJBQThCLEVBQzlCLGtDQUFrQyxFQUNsQyxnQ0FBZ0MsRUFDaEMseUJBQXlCLEdBQzFCLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsMEJBQTBCLEdBQzNCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3BFLE9BQU8sRUFDTCxnQ0FBZ0MsRUFDaEMsb0JBQW9CLEdBQ3JCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0IsNEJBQTRCLEdBQzdCLE1BQU0sNkJBQTZCLENBQUM7QUF1RnJDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNuRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDIn0=
14
+ export { FileAgentEventStore } from './persistence.file.js';
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19hZ2VudC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsOEJBQThCLEVBQzlCLGtDQUFrQyxFQUNsQyxnQ0FBZ0MsRUFDaEMseUJBQXlCLEdBQzFCLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsMEJBQTBCLEdBQzNCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3BFLE9BQU8sRUFDTCxnQ0FBZ0MsRUFDaEMsb0JBQW9CLEdBQ3JCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUNMLDRCQUE0QixFQUM1Qix1QkFBdUIsRUFDdkIsbUJBQW1CLEVBQ25CLDJCQUEyQixFQUMzQiw0QkFBNEIsR0FDN0IsTUFBTSw2QkFBNkIsQ0FBQztBQXNGckMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsT0FBTyxFQUFFLG1CQUFtQixFQUFvQyxNQUFNLHVCQUF1QixDQUFDIn0=
@@ -0,0 +1,24 @@
1
+ import type { TAgentEvent } from './smartagent.events.js';
2
+ import { type IAgentEventArchiveV2, type IAgentEventStoreV2, type TAgentEventArchive, type TAgentEventSnapshot } from './smartagent.persistence.js';
3
+ export interface IFileAgentEventStoreOptions {
4
+ rootDir: string;
5
+ /** Maximum time spent waiting for another writer. Default: 10 seconds. */
6
+ lockTimeoutMs?: number;
7
+ }
8
+ export declare class FileAgentEventStore implements IAgentEventStoreV2 {
9
+ readonly eventSchemaVersion: 2;
10
+ private readonly rootDir;
11
+ private readonly lockTimeoutMs;
12
+ constructor(options: IFileAgentEventStoreOptions);
13
+ private sessionKey;
14
+ private snapshotPath;
15
+ private archivePath;
16
+ private readValue;
17
+ private syncDirectory;
18
+ private writeAtomic;
19
+ private withSessionLock;
20
+ load(sessionId: string): Promise<TAgentEventSnapshot | undefined>;
21
+ save(sessionId: string, events: readonly TAgentEvent[], expectedRevision: number): Promise<number>;
22
+ archive(archive: IAgentEventArchiveV2): Promise<void>;
23
+ loadArchive(sessionId: string, archiveId: string): Promise<TAgentEventArchive | undefined>;
24
+ }
@@ -0,0 +1,199 @@
1
+ import * as plugins from './plugins.node.js';
2
+ import { AgentEventStoreConflictError, clone, createSnapshot, validateAgentEventArchiveV2, validateAgentEventSnapshotV2, } from './smartagent.persistence.js';
3
+ const SNAPSHOT_SCHEMA_VERSION = 2;
4
+ const ARCHIVE_SCHEMA_VERSION = 2;
5
+ const assertSessionId = (sessionId) => {
6
+ if (!sessionId.trim())
7
+ throw new Error('Agent event store sessionId must not be empty.');
8
+ };
9
+ const decodeSnapshot = (value, sessionId) => {
10
+ const snapshot = value;
11
+ if (snapshot?.schemaVersion === SNAPSHOT_SCHEMA_VERSION) {
12
+ try {
13
+ return validateAgentEventSnapshotV2(value, sessionId);
14
+ }
15
+ catch {
16
+ throw new Error(`Invalid agent event snapshot for session "${sessionId}".`);
17
+ }
18
+ }
19
+ if (!snapshot
20
+ || snapshot.schemaVersion !== 1
21
+ || snapshot.sessionId !== sessionId
22
+ || !Number.isSafeInteger(snapshot.revision)
23
+ || (snapshot.revision ?? -1) < 1
24
+ || !Array.isArray(snapshot.events)) {
25
+ throw new Error(`Invalid agent event snapshot for session "${sessionId}".`);
26
+ }
27
+ return snapshot;
28
+ };
29
+ const decodeArchive = (value, sessionId, archiveId) => {
30
+ const archive = value;
31
+ if (archive?.schemaVersion === ARCHIVE_SCHEMA_VERSION) {
32
+ try {
33
+ return validateAgentEventArchiveV2(value, sessionId, archiveId);
34
+ }
35
+ catch {
36
+ throw new Error(`Invalid agent event archive "${archiveId}" for session "${sessionId}".`);
37
+ }
38
+ }
39
+ if (!archive
40
+ || archive.schemaVersion !== 1
41
+ || archive.sessionId !== sessionId
42
+ || archive.archiveId !== archiveId
43
+ || !Array.isArray(archive.events)) {
44
+ throw new Error(`Invalid agent event archive "${archiveId}" for session "${sessionId}".`);
45
+ }
46
+ return archive;
47
+ };
48
+ const sleep = async (milliseconds) => {
49
+ await new Promise((resolve) => setTimeout(resolve, milliseconds));
50
+ };
51
+ export class FileAgentEventStore {
52
+ eventSchemaVersion = 2;
53
+ rootDir;
54
+ lockTimeoutMs;
55
+ constructor(options) {
56
+ if (!options.rootDir.trim())
57
+ throw new Error('FileAgentEventStore rootDir must not be empty.');
58
+ this.rootDir = plugins.path.resolve(options.rootDir);
59
+ this.lockTimeoutMs = options.lockTimeoutMs ?? 10_000;
60
+ if (!Number.isSafeInteger(this.lockTimeoutMs) || this.lockTimeoutMs <= 0) {
61
+ throw new Error('lockTimeoutMs must be a positive integer.');
62
+ }
63
+ }
64
+ sessionKey(sessionId) {
65
+ assertSessionId(sessionId);
66
+ return plugins.crypto.createHash('sha256').update(sessionId).digest('hex');
67
+ }
68
+ snapshotPath(sessionId) {
69
+ return plugins.path.join(this.rootDir, 'sessions', `${this.sessionKey(sessionId)}.bin`);
70
+ }
71
+ archivePath(sessionId, archiveId) {
72
+ if (!archiveId.trim())
73
+ throw new Error('Agent event archiveId must not be empty.');
74
+ const archiveKey = plugins.crypto.createHash('sha256').update(archiveId).digest('hex');
75
+ return plugins.path.join(this.rootDir, 'archives', this.sessionKey(sessionId), `${archiveKey}.bin`);
76
+ }
77
+ async readValue(filePath) {
78
+ try {
79
+ return plugins.v8.deserialize(await plugins.fs.readFile(filePath));
80
+ }
81
+ catch (error) {
82
+ if (error.code === 'ENOENT')
83
+ return undefined;
84
+ throw error;
85
+ }
86
+ }
87
+ async syncDirectory(directoryPath) {
88
+ const handle = await plugins.fs.open(directoryPath, 'r');
89
+ try {
90
+ await handle.sync();
91
+ }
92
+ finally {
93
+ await handle.close();
94
+ }
95
+ }
96
+ async writeAtomic(filePath, value) {
97
+ const directoryPath = plugins.path.dirname(filePath);
98
+ await plugins.fs.mkdir(directoryPath, { recursive: true });
99
+ const temporaryPath = `${filePath}.${process.pid}.${plugins.crypto.randomUUID()}.tmp`;
100
+ let handle;
101
+ try {
102
+ handle = await plugins.fs.open(temporaryPath, 'wx');
103
+ await handle.writeFile(plugins.v8.serialize(value));
104
+ await handle.sync();
105
+ await handle.close();
106
+ handle = undefined;
107
+ await plugins.fs.rename(temporaryPath, filePath);
108
+ await this.syncDirectory(directoryPath);
109
+ }
110
+ finally {
111
+ if (handle)
112
+ await handle.close().catch(() => undefined);
113
+ await plugins.fs.rm(temporaryPath, { force: true });
114
+ }
115
+ }
116
+ async withSessionLock(sessionId, operation) {
117
+ const lockPath = plugins.path.join(this.rootDir, 'locks', `${this.sessionKey(sessionId)}.lock`);
118
+ const ownerPath = plugins.path.join(lockPath, 'owner');
119
+ const ownerToken = plugins.crypto.randomUUID();
120
+ const ownerRecord = JSON.stringify({ token: ownerToken });
121
+ await plugins.fs.mkdir(plugins.path.dirname(lockPath), { recursive: true });
122
+ const startedAt = Date.now();
123
+ while (true) {
124
+ try {
125
+ await plugins.fs.mkdir(lockPath);
126
+ try {
127
+ await plugins.fs.writeFile(ownerPath, ownerRecord, 'utf8');
128
+ }
129
+ catch (error) {
130
+ await plugins.fs.rm(lockPath, { recursive: true, force: true });
131
+ throw error;
132
+ }
133
+ break;
134
+ }
135
+ catch (error) {
136
+ if (error.code !== 'EEXIST')
137
+ throw error;
138
+ if (Date.now() - startedAt >= this.lockTimeoutMs) {
139
+ throw new Error(`Timed out waiting for the event-store lock for session "${sessionId}" at "${lockPath}".`);
140
+ }
141
+ await sleep(20);
142
+ }
143
+ }
144
+ try {
145
+ return await operation();
146
+ }
147
+ finally {
148
+ let stillOwner = false;
149
+ try {
150
+ const owner = JSON.parse(await plugins.fs.readFile(ownerPath, 'utf8'));
151
+ stillOwner = owner.token === ownerToken;
152
+ }
153
+ catch { }
154
+ if (stillOwner)
155
+ await plugins.fs.rm(lockPath, { recursive: true, force: true });
156
+ }
157
+ }
158
+ async load(sessionId) {
159
+ const value = await this.readValue(this.snapshotPath(sessionId));
160
+ return value === undefined ? undefined : decodeSnapshot(value, sessionId);
161
+ }
162
+ async save(sessionId, events, expectedRevision) {
163
+ return this.withSessionLock(sessionId, async () => {
164
+ const filePath = this.snapshotPath(sessionId);
165
+ const currentValue = await this.readValue(filePath);
166
+ const actualRevision = currentValue === undefined
167
+ ? 0
168
+ : decodeSnapshot(currentValue, sessionId).revision;
169
+ if (actualRevision !== expectedRevision) {
170
+ throw new AgentEventStoreConflictError(sessionId, expectedRevision, actualRevision);
171
+ }
172
+ const revision = expectedRevision + 1;
173
+ await this.writeAtomic(filePath, createSnapshot(sessionId, revision, events));
174
+ return revision;
175
+ });
176
+ }
177
+ async archive(archive) {
178
+ const nextArchive = clone(archive);
179
+ await this.withSessionLock(archive.sessionId, async () => {
180
+ const filePath = this.archivePath(archive.sessionId, archive.archiveId);
181
+ const currentValue = await this.readValue(filePath);
182
+ if (currentValue !== undefined) {
183
+ const current = decodeArchive(currentValue, archive.sessionId, archive.archiveId);
184
+ const currentIds = current.events.map((event) => event.id).join('\n');
185
+ const nextIds = nextArchive.events.map((event) => event.id).join('\n');
186
+ if (currentIds !== nextIds) {
187
+ throw new Error(`Archive "${archive.archiveId}" already exists with different events.`);
188
+ }
189
+ return;
190
+ }
191
+ await this.writeAtomic(filePath, nextArchive);
192
+ });
193
+ }
194
+ async loadArchive(sessionId, archiveId) {
195
+ const value = await this.readValue(this.archivePath(sessionId, archiveId));
196
+ return value === undefined ? undefined : decodeArchive(value, sessionId, archiveId);
197
+ }
198
+ }
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVuY2UuZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2FnZW50L3BlcnNpc3RlbmNlLmZpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQztBQUU3QyxPQUFPLEVBQ0wsNEJBQTRCLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFDbkQsMkJBQTJCLEVBQUUsNEJBQTRCLEdBRzFELE1BQU0sNkJBQTZCLENBQUM7QUFFckMsTUFBTSx1QkFBdUIsR0FBRyxDQUFVLENBQUM7QUFDM0MsTUFBTSxzQkFBc0IsR0FBRyxDQUFVLENBQUM7QUFRMUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxTQUFpQixFQUFRLEVBQUU7SUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7QUFDM0YsQ0FBQyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFjLEVBQUUsU0FBaUIsRUFBdUIsRUFBRTtJQUNoRixNQUFNLFFBQVEsR0FBRyxLQUFxQyxDQUFDO0lBQ3ZELElBQUksUUFBUSxFQUFFLGFBQWEsS0FBSyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3hELElBQUksQ0FBQztZQUNILE9BQU8sNEJBQTRCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxTQUFTLElBQUksQ0FBQyxDQUFDO1FBQzlFLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFDRSxDQUFDLFFBQVE7V0FDTixRQUFRLENBQUMsYUFBYSxLQUFLLENBQUM7V0FDNUIsUUFBUSxDQUFDLFNBQVMsS0FBSyxTQUFTO1dBQ2hDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1dBQ3hDLENBQUMsUUFBUSxD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
@@ -1,10 +1,3 @@
1
- import { AsyncLocalStorage } from 'node:async_hooks';
2
- import * as crypto from 'node:crypto';
3
- import * as fs from 'node:fs/promises';
4
- import * as path from 'node:path';
5
- import { isDeepStrictEqual } from 'node:util';
6
- import * as v8 from 'node:v8';
7
- export { AsyncLocalStorage, crypto, fs, isDeepStrictEqual, path, v8 };
8
1
  import { streamText, generateText, stepCountIs, wrapLanguageModel } from 'ai';
9
2
  export { streamText, generateText, stepCountIs, wrapLanguageModel };
10
3
  export type { AssistantModelMessage, ModelMessage, StepResult, SystemModelMessage, ToolSet, ToolModelMessage, ToolExecutionOptions, StreamTextResult, UserModelMessage, } from 'ai';
@@ -1,11 +1,3 @@
1
- // node native
2
- import { AsyncLocalStorage } from 'node:async_hooks';
3
- import * as crypto from 'node:crypto';
4
- import * as fs from 'node:fs/promises';
5
- import * as path from 'node:path';
6
- import { isDeepStrictEqual } from 'node:util';
7
- import * as v8 from 'node:v8';
8
- export { AsyncLocalStorage, crypto, fs, isDeepStrictEqual, path, v8 };
9
1
  // ai-sdk core
10
2
  import { streamText, generateText, stepCountIs, wrapLanguageModel } from 'ai';
11
3
  export { streamText, generateText, stepCountIs, wrapLanguageModel };
@@ -15,4 +7,4 @@ export { applySmartAiCacheProviderOptions, createSmartAiCachingMiddleware, resol
15
7
  // zod
16
8
  import { z } from 'zod';
17
9
  export { z };
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2FnZW50L3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkMsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzlDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRTlCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUV0RSxjQUFjO0FBQ2QsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRTlFLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO0FBY3BFLDZCQUE2QjtBQUM3QixPQUFPLEVBQ0wsZ0NBQWdDLEVBQ2hDLDhCQUE4QixFQUM5QixVQUFVLEVBQ1YsMkJBQTJCLEVBQzNCLElBQUksR0FDTCxNQUFNLHNDQUFzQyxDQUFDO0FBRTlDLE9BQU8sRUFDTCxnQ0FBZ0MsRUFDaEMsOEJBQThCLEVBQzlCLDJCQUEyQixFQUMzQixJQUFJLEVBQ0osVUFBVSxHQUNYLENBQUM7QUFnQkYsTUFBTTtBQUNOLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDIn0=
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2FnZW50L3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLElBQUksQ0FBQztBQUU5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztBQWNwRSw2QkFBNkI7QUFDN0IsT0FBTyxFQUNMLGdDQUFnQyxFQUNoQyw4QkFBOEIsRUFDOUIsVUFBVSxFQUNWLDJCQUEyQixFQUMzQixJQUFJLEdBQ0wsTUFBTSxzQ0FBc0MsQ0FBQztBQUU5QyxPQUFPLEVBQ0wsZ0NBQWdDLEVBQ2hDLDhCQUE4QixFQUM5QiwyQkFBMkIsRUFDM0IsSUFBSSxFQUNKLFVBQVUsR0FDWCxDQUFDO0FBZ0JGLE1BQU07QUFDTixPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyJ9
@@ -0,0 +1,7 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import * as crypto from 'node:crypto';
3
+ import * as fs from 'node:fs/promises';
4
+ import * as path from 'node:path';
5
+ import { isDeepStrictEqual } from 'node:util';
6
+ import * as v8 from 'node:v8';
7
+ export { AsyncLocalStorage, crypto, fs, isDeepStrictEqual, path, v8 };
@@ -0,0 +1,9 @@
1
+ // node native
2
+ import { AsyncLocalStorage } from 'node:async_hooks';
3
+ import * as crypto from 'node:crypto';
4
+ import * as fs from 'node:fs/promises';
5
+ import * as path from 'node:path';
6
+ import { isDeepStrictEqual } from 'node:util';
7
+ import * as v8 from 'node:v8';
8
+ export { AsyncLocalStorage, crypto, fs, isDeepStrictEqual, path, v8 };
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5ub2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfYWdlbnQvcGx1Z2lucy5ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWM7QUFDZCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM5QyxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU5QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMifQ==
@@ -0,0 +1,4 @@
1
+ import { sha256 } from '@noble/hashes/sha2.js';
2
+ import { bytesToHex, utf8ToBytes } from '@noble/hashes/utils.js';
3
+ import { strictCircularDeepEqual } from 'fast-equals';
4
+ export { sha256, bytesToHex, utf8ToBytes, strictCircularDeepEqual };
@@ -0,0 +1,5 @@
1
+ import { sha256 } from '@noble/hashes/sha2.js';
2
+ import { bytesToHex, utf8ToBytes } from '@noble/hashes/utils.js';
3
+ import { strictCircularDeepEqual } from 'fast-equals';
4
+ export { sha256, bytesToHex, utf8ToBytes, strictCircularDeepEqual };
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5wb3J0YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2FnZW50L3BsdWdpbnMucG9ydGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXRELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSxDQUFDIn0=
@@ -0,0 +1,4 @@
1
+ import type { IAgentRunOptions, IAgentRunResult } from './smartagent.interfaces.js';
2
+ /** Run in Node or a secure browser context, with internally owned cleanup. */
3
+ export declare function runAgent(options: IAgentRunOptions): Promise<IAgentRunResult>;
4
+ export type { IAgentRunOptions, IAgentRunResult } from './smartagent.interfaces.js';
@@ -0,0 +1,34 @@
1
+ import * as plugins from './plugins.portable.js';
2
+ import { AgentSessionEngine } from './classes.sessionengine.js';
3
+ import { runAgentWithSession } from './runtime.run.js';
4
+ const portablePlatform = {
5
+ createClaimToken: () => btoa(String.fromCharCode(...globalThis.crypto.getRandomValues(new Uint8Array(32))))
6
+ .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''),
7
+ hashClaimToken: (token) => plugins.bytesToHex(plugins.sha256(plugins.utf8ToBytes(token))),
8
+ equalClaimDigests: (left, right) => {
9
+ if (left.length !== right.length)
10
+ return false;
11
+ let difference = 0;
12
+ for (let index = 0; index < left.length; index++) {
13
+ difference |= left.charCodeAt(index) ^ right.charCodeAt(index);
14
+ }
15
+ return difference === 0;
16
+ },
17
+ isDeepEqual: plugins.strictCircularDeepEqual,
18
+ reportListenerError: (error) => console.warn('FLEXHARNESS_SESSION_LISTENER_ERROR', error),
19
+ };
20
+ // This class and its factory are deliberately not exported. Callbacks receive
21
+ // data only; no caller can close this session from inside its active callback.
22
+ class RunnerSession extends AgentSessionEngine {
23
+ constructor(options) {
24
+ super(options, portablePlatform, { kind: 'encapsulated' });
25
+ }
26
+ static create(options) {
27
+ return this.createWithFactory(options, () => new RunnerSession(options));
28
+ }
29
+ }
30
+ /** Run in Node or a secure browser context, with internally owned cleanup. */
31
+ export function runAgent(options) {
32
+ return runAgentWithSession(options, (sessionOptions) => RunnerSession.create(sessionOptions));
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfYWdlbnQvcnVubmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJdkQsTUFBTSxnQkFBZ0IsR0FBMEI7SUFDOUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEcsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQzdELGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6RixpQkFBaUIsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNqQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMvQyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNqRCxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxPQUFPLFVBQVUsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUNELFdBQVcsRUFBRSxPQUFPLENBQUMsdUJBQXVCO0lBQzVDLG1CQUFtQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxFQUFFLEtBQUssQ0FBQztDQUMxRixDQUFDO0FBRUYsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSxNQUFNLGFBQWMsU0FBUSxrQkFBa0I7SUFDNUMsWUFBWSxPQUE2QjtRQUN2QyxLQUFLLENBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVNLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBNkI7UUFDaEQsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztDQUNGO0FBRUQsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxRQUFRLENBQUMsT0FBeUI7SUFDaEQsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUNoRyxDQUFDIn0=
@@ -0,0 +1,21 @@
1
+ /** Internal platform boundary; only the documented agent entrypoints are exported. */
2
+ export interface IAgentCallbackState {
3
+ active: boolean;
4
+ }
5
+ export interface IAgentCallbackScope {
6
+ getStore(): IAgentCallbackState | undefined;
7
+ run<TValue>(state: IAgentCallbackState, callback: () => TValue): TValue;
8
+ }
9
+ export type TAgentSessionOwnership = {
10
+ kind: 'exposed';
11
+ callbackScope: IAgentCallbackScope;
12
+ } | {
13
+ kind: 'encapsulated';
14
+ };
15
+ export interface IAgentRuntimePlatform {
16
+ createClaimToken(): string;
17
+ hashClaimToken(token: string): string;
18
+ equalClaimDigests(left: string, right: string): boolean;
19
+ isDeepEqual(left: unknown, right: unknown): boolean;
20
+ reportListenerError(error: unknown): void;
21
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5pbnRlcmZhY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfYWdlbnQvcnVudGltZS5pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,3 @@
1
+ import type { IAgentSession, IAgentSessionOptions } from './smartagent.interfaces.js';
2
+ import type { IAgentRunOptions, IAgentRunResult } from './smartagent.interfaces.js';
3
+ export declare function runAgentWithSession(options: IAgentRunOptions, createSession: (options: IAgentSessionOptions) => Promise<IAgentSession>): Promise<IAgentRunResult>;
@@ -0,0 +1,94 @@
1
+ const mergeToolCalls = (target, source) => {
2
+ const indexes = new Map(target.map((record, index) => [record.toolCallId, index]));
3
+ for (const record of source) {
4
+ const existingIndex = indexes.get(record.toolCallId);
5
+ if (existingIndex === undefined) {
6
+ target.push({ ...record });
7
+ indexes.set(record.toolCallId, target.length - 1);
8
+ }
9
+ else {
10
+ target[existingIndex] = { ...target[existingIndex], ...record };
11
+ }
12
+ }
13
+ };
14
+ export async function runAgentWithSession(options, createSession) {
15
+ const session = await createSession({
16
+ model: options.model,
17
+ system: options.system,
18
+ tools: options.tools,
19
+ providerOptions: options.providerOptions,
20
+ sessionId: options.sessionId,
21
+ eventStore: options.eventStore,
22
+ cache: options.cache,
23
+ maxSteps: options.maxSteps,
24
+ messages: options.messages,
25
+ events: options.events,
26
+ executionContext: options.executionContext,
27
+ contextBuilder: options.contextBuilder,
28
+ contextCompactor: options.contextCompactor,
29
+ eventRetention: options.eventRetention,
30
+ changeListenerTimeoutMs: options.changeListenerTimeoutMs,
31
+ maxPendingSessionChanges: options.maxPendingSessionChanges,
32
+ generationLeaseCleanupTimeoutMs: options.generationLeaseCleanupTimeoutMs,
33
+ maxArchivedTransactionTombstones: options.maxArchivedTransactionTombstones,
34
+ onToken: options.onToken,
35
+ onReasoningStart: options.onReasoningStart,
36
+ onReasoningDelta: options.onReasoningDelta,
37
+ onReasoningEnd: options.onReasoningEnd,
38
+ onToolCallStart: options.onToolCallStart,
39
+ onToolCallUpdate: options.onToolCallUpdate,
40
+ onToolCallFinish: options.onToolCallFinish,
41
+ onToolCall: options.onToolCall,
42
+ onToolResult: options.onToolResult,
43
+ onContextOverflow: options.onContextOverflow,
44
+ maxContextOverflowRetries: options.maxContextOverflowRetries,
45
+ });
46
+ let totalSteps = 0;
47
+ let totalInput = 0;
48
+ let totalOutput = 0;
49
+ let totalCacheRead = 0;
50
+ let totalCacheWrite = 0;
51
+ let validationRetries = 0;
52
+ const toolCalls = [];
53
+ try {
54
+ await session.pushUserMessage(options.prompt);
55
+ while (true) {
56
+ const generationResult = await session.generate({
57
+ maxSteps: options.maxSteps,
58
+ abort: options.abort,
59
+ });
60
+ totalSteps += generationResult.steps;
61
+ totalInput += generationResult.usage.inputTokens;
62
+ totalOutput += generationResult.usage.outputTokens;
63
+ totalCacheRead += generationResult.usage.cacheReadTokens;
64
+ totalCacheWrite += generationResult.usage.cacheWriteTokens;
65
+ mergeToolCalls(toolCalls, generationResult.toolCalls);
66
+ const runResult = {
67
+ text: generationResult.text,
68
+ messages: session.getModelMessages(),
69
+ steps: totalSteps,
70
+ finishReason: generationResult.finishReason,
71
+ usage: {
72
+ inputTokens: totalInput,
73
+ outputTokens: totalOutput,
74
+ totalTokens: totalInput + totalOutput,
75
+ cacheReadTokens: totalCacheRead,
76
+ cacheWriteTokens: totalCacheWrite,
77
+ },
78
+ toolCalls,
79
+ };
80
+ const validationPrompt = await options.validateCompletion?.(runResult);
81
+ if (typeof validationPrompt !== 'string')
82
+ return runResult;
83
+ if (validationRetries >= (options.maxValidationRetries ?? 0)) {
84
+ throw new Error(`Agent completion validation failed: ${validationPrompt}`);
85
+ }
86
+ validationRetries++;
87
+ await session.pushUserMessage(validationPrompt);
88
+ }
89
+ }
90
+ finally {
91
+ await session.close();
92
+ }
93
+ }
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5ydW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19hZ2VudC9ydW50aW1lLnJ1bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxNQUFNLGNBQWMsR0FBRyxDQUNyQixNQUE4QixFQUM5QixNQUF1QyxFQUNqQyxFQUFFO0lBQ1IsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkYsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRCxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQ3ZDLE9BQXlCLEVBQ3pCLGFBQXdFO0lBRXhFLE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDO1FBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsS0FBSyxF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
@@ -1,95 +1,6 @@
1
1
  import { AgentSession } from './smartagent.classes.session.js';
2
- const mergeToolCalls = (target, source) => {
3
- const indexes = new Map(target.map((record, index) => [record.toolCallId, index]));
4
- for (const record of source) {
5
- const existingIndex = indexes.get(record.toolCallId);
6
- if (existingIndex === undefined) {
7
- target.push({ ...record });
8
- indexes.set(record.toolCallId, target.length - 1);
9
- }
10
- else {
11
- target[existingIndex] = { ...target[existingIndex], ...record };
12
- }
13
- }
14
- };
15
- export async function runAgent(options) {
16
- const session = await AgentSession.create({
17
- model: options.model,
18
- system: options.system,
19
- tools: options.tools,
20
- providerOptions: options.providerOptions,
21
- sessionId: options.sessionId,
22
- eventStore: options.eventStore,
23
- cache: options.cache,
24
- maxSteps: options.maxSteps,
25
- messages: options.messages,
26
- events: options.events,
27
- executionContext: options.executionContext,
28
- contextBuilder: options.contextBuilder,
29
- contextCompactor: options.contextCompactor,
30
- eventRetention: options.eventRetention,
31
- changeListenerTimeoutMs: options.changeListenerTimeoutMs,
32
- maxPendingSessionChanges: options.maxPendingSessionChanges,
33
- generationLeaseCleanupTimeoutMs: options.generationLeaseCleanupTimeoutMs,
34
- maxArchivedTransactionTombstones: options.maxArchivedTransactionTombstones,
35
- onToken: options.onToken,
36
- onReasoningStart: options.onReasoningStart,
37
- onReasoningDelta: options.onReasoningDelta,
38
- onReasoningEnd: options.onReasoningEnd,
39
- onToolCallStart: options.onToolCallStart,
40
- onToolCallUpdate: options.onToolCallUpdate,
41
- onToolCallFinish: options.onToolCallFinish,
42
- onToolCall: options.onToolCall,
43
- onToolResult: options.onToolResult,
44
- onContextOverflow: options.onContextOverflow,
45
- maxContextOverflowRetries: options.maxContextOverflowRetries,
46
- });
47
- let totalSteps = 0;
48
- let totalInput = 0;
49
- let totalOutput = 0;
50
- let totalCacheRead = 0;
51
- let totalCacheWrite = 0;
52
- let validationRetries = 0;
53
- const toolCalls = [];
54
- try {
55
- await session.pushUserMessage(options.prompt);
56
- while (true) {
57
- const generationResult = await session.generate({
58
- maxSteps: options.maxSteps,
59
- abort: options.abort,
60
- });
61
- totalSteps += generationResult.steps;
62
- totalInput += generationResult.usage.inputTokens;
63
- totalOutput += generationResult.usage.outputTokens;
64
- totalCacheRead += generationResult.usage.cacheReadTokens;
65
- totalCacheWrite += generationResult.usage.cacheWriteTokens;
66
- mergeToolCalls(toolCalls, generationResult.toolCalls);
67
- const runResult = {
68
- text: generationResult.text,
69
- messages: session.getModelMessages(),
70
- steps: totalSteps,
71
- finishReason: generationResult.finishReason,
72
- usage: {
73
- inputTokens: totalInput,
74
- outputTokens: totalOutput,
75
- totalTokens: totalInput + totalOutput,
76
- cacheReadTokens: totalCacheRead,
77
- cacheWriteTokens: totalCacheWrite,
78
- },
79
- toolCalls,
80
- };
81
- const validationPrompt = await options.validateCompletion?.(runResult);
82
- if (typeof validationPrompt !== 'string')
83
- return runResult;
84
- if (validationRetries >= (options.maxValidationRetries ?? 0)) {
85
- throw new Error(`Agent completion validation failed: ${validationPrompt}`);
86
- }
87
- validationRetries++;
88
- await session.pushUserMessage(validationPrompt);
89
- }
90
- }
91
- finally {
92
- await session.close();
93
- }
2
+ import { runAgentWithSession } from './runtime.run.js';
3
+ export function runAgent(options) {
4
+ return runAgentWithSession(options, (sessionOptions) => AgentSession.create(sessionOptions));
94
5
  }
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLmFnZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfYWdlbnQvc21hcnRhZ2VudC5jbGFzc2VzLmFnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQU8vRCxNQUFNLGNBQWMsR0FBRyxDQUNyQixNQUE4QixFQUM5QixNQUF1QyxFQUNqQyxFQUFFO0lBQ1IsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkYsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRCxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUFDLE9BQXlCO0lBQ3RELE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUN4QyxLQUFL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
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLmFnZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfYWdlbnQvc21hcnRhZ2VudC5jbGFzc2VzLmFnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUd2RCxNQUFNLFVBQVUsUUFBUSxDQUFDLE9BQXlCO0lBQ2hELE9BQU8sbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDL0YsQ0FBQyJ9