@agentuity/runtime 0.0.51 → 0.0.52

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 (104) hide show
  1. package/dist/_config.js +99 -0
  2. package/dist/_config.js.map +1 -0
  3. package/dist/_context.js +82 -0
  4. package/dist/_context.js.map +1 -0
  5. package/dist/_idle.js +24 -0
  6. package/dist/_idle.js.map +1 -0
  7. package/dist/_server.js +489 -0
  8. package/dist/_server.js.map +1 -0
  9. package/dist/_services.js +258 -0
  10. package/dist/_services.js.map +1 -0
  11. package/dist/_tokens.js +98 -0
  12. package/dist/_tokens.js.map +1 -0
  13. package/dist/_util.js +54 -0
  14. package/dist/_util.js.map +1 -0
  15. package/dist/_waituntil.js +87 -0
  16. package/dist/_waituntil.js.map +1 -0
  17. package/dist/agent.js +507 -0
  18. package/dist/agent.js.map +1 -0
  19. package/dist/app.d.ts +6 -1
  20. package/dist/app.d.ts.map +1 -1
  21. package/dist/app.js +72 -0
  22. package/dist/app.js.map +1 -0
  23. package/dist/eval.js +2 -0
  24. package/dist/eval.js.map +1 -0
  25. package/dist/index.js +11 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/io/email.js +154 -0
  28. package/dist/io/email.js.map +1 -0
  29. package/dist/logger/console.js +274 -0
  30. package/dist/logger/console.js.map +1 -0
  31. package/dist/logger/index.js +3 -0
  32. package/dist/logger/index.js.map +1 -0
  33. package/dist/logger/internal.js +133 -0
  34. package/dist/logger/internal.js.map +1 -0
  35. package/dist/logger/logger.js +2 -0
  36. package/dist/logger/logger.js.map +1 -0
  37. package/dist/logger/user.js +7 -0
  38. package/dist/logger/user.js.map +1 -0
  39. package/dist/logger/util.js +77 -0
  40. package/dist/logger/util.js.map +1 -0
  41. package/dist/otel/config.js +23 -0
  42. package/dist/otel/config.js.map +1 -0
  43. package/dist/otel/console.js +52 -0
  44. package/dist/otel/console.js.map +1 -0
  45. package/dist/otel/exporters/index.js +4 -0
  46. package/dist/otel/exporters/index.js.map +1 -0
  47. package/dist/otel/exporters/jsonl-log-exporter.js +103 -0
  48. package/dist/otel/exporters/jsonl-log-exporter.js.map +1 -0
  49. package/dist/otel/exporters/jsonl-metric-exporter.js +104 -0
  50. package/dist/otel/exporters/jsonl-metric-exporter.js.map +1 -0
  51. package/dist/otel/exporters/jsonl-trace-exporter.js +111 -0
  52. package/dist/otel/exporters/jsonl-trace-exporter.js.map +1 -0
  53. package/dist/otel/fetch.js +81 -0
  54. package/dist/otel/fetch.js.map +1 -0
  55. package/dist/otel/http.js +44 -0
  56. package/dist/otel/http.js.map +1 -0
  57. package/dist/otel/logger.js +278 -0
  58. package/dist/otel/logger.js.map +1 -0
  59. package/dist/otel/otel.js +233 -0
  60. package/dist/otel/otel.js.map +1 -0
  61. package/dist/router.js +350 -0
  62. package/dist/router.js.map +1 -0
  63. package/dist/services/evalrun/composite.js +26 -0
  64. package/dist/services/evalrun/composite.js.map +1 -0
  65. package/dist/services/evalrun/http.js +74 -0
  66. package/dist/services/evalrun/http.js.map +1 -0
  67. package/dist/services/evalrun/index.js +5 -0
  68. package/dist/services/evalrun/index.js.map +1 -0
  69. package/dist/services/evalrun/json.js +38 -0
  70. package/dist/services/evalrun/json.js.map +1 -0
  71. package/dist/services/evalrun/local.js +22 -0
  72. package/dist/services/evalrun/local.js.map +1 -0
  73. package/dist/services/local/_db.js +144 -0
  74. package/dist/services/local/_db.js.map +1 -0
  75. package/dist/services/local/_router.js +60 -0
  76. package/dist/services/local/_router.js.map +1 -0
  77. package/dist/services/local/_util.js +42 -0
  78. package/dist/services/local/_util.js.map +1 -0
  79. package/dist/services/local/index.js +8 -0
  80. package/dist/services/local/index.js.map +1 -0
  81. package/dist/services/local/keyvalue.js +114 -0
  82. package/dist/services/local/keyvalue.js.map +1 -0
  83. package/dist/services/local/objectstore.js +117 -0
  84. package/dist/services/local/objectstore.js.map +1 -0
  85. package/dist/services/local/stream.js +218 -0
  86. package/dist/services/local/stream.js.map +1 -0
  87. package/dist/services/local/vector.js +183 -0
  88. package/dist/services/local/vector.js.map +1 -0
  89. package/dist/services/session/composite.js +26 -0
  90. package/dist/services/session/composite.js.map +1 -0
  91. package/dist/services/session/http.js +42 -0
  92. package/dist/services/session/http.js.map +1 -0
  93. package/dist/services/session/index.js +5 -0
  94. package/dist/services/session/index.js.map +1 -0
  95. package/dist/services/session/json.js +35 -0
  96. package/dist/services/session/json.js.map +1 -0
  97. package/dist/services/session/local.js +22 -0
  98. package/dist/services/session/local.js.map +1 -0
  99. package/dist/session.js +199 -0
  100. package/dist/session.js.map +1 -0
  101. package/dist/workbench.js +38 -0
  102. package/dist/workbench.js.map +1 -0
  103. package/package.json +5 -5
  104. package/src/app.ts +6 -1
@@ -0,0 +1,218 @@
1
+ import { now } from './_util';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { randomUUID } from 'node:crypto';
5
+ import { mkdirSync, existsSync, unlinkSync } from 'node:fs';
6
+ import { openSync, writeSync, closeSync, readFileSync } from 'node:fs';
7
+ export class LocalStreamStorage {
8
+ #db;
9
+ #projectPath;
10
+ #serverUrl;
11
+ #tempDir;
12
+ constructor(db, projectPath, serverUrl) {
13
+ this.#db = db;
14
+ this.#projectPath = projectPath;
15
+ this.#serverUrl = serverUrl;
16
+ // Create temp directory for stream buffering
17
+ this.#tempDir = join(homedir(), '.config', 'agentuity', 'streams');
18
+ if (!existsSync(this.#tempDir)) {
19
+ mkdirSync(this.#tempDir, { recursive: true });
20
+ }
21
+ }
22
+ async create(name, props) {
23
+ if (!name || name.length < 1 || name.length > 254) {
24
+ throw new Error('Stream name must be between 1 and 254 characters');
25
+ }
26
+ const id = randomUUID();
27
+ const timestamp = now();
28
+ const metadata = props?.metadata ? JSON.stringify(props.metadata) : null;
29
+ // Insert stream record with NULL data
30
+ const stmt = this.#db.prepare(`
31
+ INSERT INTO stream_storage (
32
+ project_path, id, name, metadata, content_type, created_at
33
+ )
34
+ VALUES (?, ?, ?, ?, ?, ?)
35
+ `);
36
+ stmt.run(this.#projectPath, id, name, metadata, props?.contentType || 'application/octet-stream', timestamp);
37
+ const url = `${this.#serverUrl}/_agentuity/local/stream/${id}`;
38
+ return new LocalStream(id, url, this.#db, this.#projectPath, this.#tempDir, props?.compress ?? false);
39
+ }
40
+ async list(params) {
41
+ if (params?.limit && (params.limit <= 0 || params.limit > 1000)) {
42
+ throw new Error('limit must be between 1 and 1000');
43
+ }
44
+ let query = `
45
+ SELECT id, name, metadata, size_bytes
46
+ FROM stream_storage
47
+ WHERE project_path = ?
48
+ `;
49
+ const queryParams = [this.#projectPath];
50
+ // Add filters
51
+ if (params?.name) {
52
+ query += ` AND name = ?`;
53
+ queryParams.push(params.name);
54
+ }
55
+ if (params?.metadata) {
56
+ // Simple JSON matching - check if metadata contains all key-value pairs
57
+ for (const [key, value] of Object.entries(params.metadata)) {
58
+ query += ` AND metadata LIKE ?`;
59
+ queryParams.push(`%"${key}":"${value}"%`);
60
+ }
61
+ }
62
+ // Get total count
63
+ const countQuery = this.#db.query(query.replace('SELECT id, name, metadata, size_bytes', 'SELECT COUNT(*) as count'));
64
+ const { count } = countQuery.get(...queryParams);
65
+ // Add pagination
66
+ query += ` ORDER BY created_at DESC`;
67
+ if (params?.limit) {
68
+ query += ` LIMIT ${params.limit}`;
69
+ }
70
+ if (params?.offset) {
71
+ query += ` OFFSET ${params.offset}`;
72
+ }
73
+ const stmt = this.#db.query(query);
74
+ const rows = stmt.all(...queryParams);
75
+ const streams = rows.map((row) => ({
76
+ id: row.id,
77
+ name: row.name,
78
+ metadata: row.metadata ? JSON.parse(row.metadata) : {},
79
+ url: `${this.#serverUrl}/_agentuity/local/stream/${row.id}`,
80
+ sizeBytes: row.size_bytes,
81
+ }));
82
+ return {
83
+ success: true,
84
+ streams,
85
+ total: count,
86
+ };
87
+ }
88
+ async delete(id) {
89
+ if (!id?.trim()) {
90
+ throw new Error('Stream id is required');
91
+ }
92
+ const stmt = this.#db.prepare(`
93
+ DELETE FROM stream_storage
94
+ WHERE project_path = ? AND id = ?
95
+ `);
96
+ stmt.run(this.#projectPath, id);
97
+ }
98
+ }
99
+ class LocalStream extends WritableStream {
100
+ id;
101
+ url;
102
+ #db;
103
+ #projectPath;
104
+ #compressed;
105
+ #tempFilePath;
106
+ #fileHandle = null;
107
+ #bytesWritten = 0;
108
+ #closed = false;
109
+ constructor(id, url, db, projectPath, tempDir, compressed) {
110
+ super({
111
+ write: async (chunk) => {
112
+ await this.#writeToFile(chunk);
113
+ },
114
+ close: async () => {
115
+ await this.#persist();
116
+ },
117
+ });
118
+ this.id = id;
119
+ this.url = url;
120
+ this.#db = db;
121
+ this.#projectPath = projectPath;
122
+ this.#compressed = compressed;
123
+ this.#tempFilePath = join(tempDir, `${id}.tmp`);
124
+ // Open file for writing
125
+ this.#fileHandle = openSync(this.#tempFilePath, 'w');
126
+ }
127
+ get bytesWritten() {
128
+ return this.#bytesWritten;
129
+ }
130
+ get compressed() {
131
+ return this.#compressed;
132
+ }
133
+ async write(chunk) {
134
+ if (this.#closed) {
135
+ throw new Error('Stream is closed');
136
+ }
137
+ let binary;
138
+ if (chunk instanceof Uint8Array) {
139
+ binary = chunk;
140
+ }
141
+ else if (typeof chunk === 'string') {
142
+ binary = new TextEncoder().encode(chunk);
143
+ }
144
+ else if (chunk instanceof ArrayBuffer) {
145
+ binary = new Uint8Array(chunk);
146
+ }
147
+ else if (typeof chunk === 'object') {
148
+ binary = new TextEncoder().encode(JSON.stringify(chunk));
149
+ }
150
+ else {
151
+ binary = new TextEncoder().encode(String(chunk));
152
+ }
153
+ await this.#writeToFile(binary);
154
+ }
155
+ async close() {
156
+ if (this.#closed) {
157
+ return;
158
+ }
159
+ this.#closed = true;
160
+ // Close file handle if open
161
+ if (this.#fileHandle !== null) {
162
+ closeSync(this.#fileHandle);
163
+ this.#fileHandle = null;
164
+ }
165
+ await this.#persist();
166
+ }
167
+ getReader() {
168
+ const db = this.#db;
169
+ const projectPath = this.#projectPath;
170
+ const id = this.id;
171
+ return new ReadableStream({
172
+ start(controller) {
173
+ const query = db.query(`
174
+ SELECT data FROM stream_storage
175
+ WHERE project_path = ? AND id = ?
176
+ `);
177
+ const row = query.get(projectPath, id);
178
+ if (!row || !row.data) {
179
+ controller.error(new Error('Stream not found or not finalized'));
180
+ return;
181
+ }
182
+ controller.enqueue(new Uint8Array(row.data));
183
+ controller.close();
184
+ },
185
+ });
186
+ }
187
+ async #writeToFile(chunk) {
188
+ if (this.#fileHandle === null) {
189
+ throw new Error('File handle is closed');
190
+ }
191
+ const written = writeSync(this.#fileHandle, chunk);
192
+ this.#bytesWritten += written;
193
+ }
194
+ async #persist() {
195
+ // Read buffered file
196
+ let data = readFileSync(this.#tempFilePath);
197
+ // Optional: Apply compression if enabled
198
+ if (this.#compressed) {
199
+ const { gzipSync } = await import('node:zlib');
200
+ data = gzipSync(data);
201
+ }
202
+ // Update DB with finalized data
203
+ const stmt = this.#db.prepare(`
204
+ UPDATE stream_storage
205
+ SET data = ?, size_bytes = ?
206
+ WHERE project_path = ? AND id = ?
207
+ `);
208
+ stmt.run(data, this.#bytesWritten, this.#projectPath, this.id);
209
+ // Clean up temp file
210
+ try {
211
+ unlinkSync(this.#tempFilePath);
212
+ }
213
+ catch {
214
+ // Ignore cleanup errors
215
+ }
216
+ }
217
+ }
218
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../src/services/local/stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,183 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { simpleEmbedding, cosineSimilarity, now } from './_util';
3
+ export class LocalVectorStorage {
4
+ #db;
5
+ #projectPath;
6
+ constructor(db, projectPath) {
7
+ this.#db = db;
8
+ this.#projectPath = projectPath;
9
+ }
10
+ async upsert(name, ...documents) {
11
+ if (!name?.trim()) {
12
+ throw new Error('Vector storage name is required');
13
+ }
14
+ if (documents.length === 0) {
15
+ throw new Error('At least one document is required');
16
+ }
17
+ const results = [];
18
+ const stmt = this.#db.prepare(`
19
+ INSERT INTO vector_storage (
20
+ project_path, name, id, key, embedding, document, metadata, created_at, updated_at
21
+ )
22
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
23
+ ON CONFLICT(project_path, name, key)
24
+ DO UPDATE SET
25
+ embedding = excluded.embedding,
26
+ document = excluded.document,
27
+ metadata = excluded.metadata,
28
+ updated_at = excluded.updated_at
29
+ `);
30
+ for (const doc of documents) {
31
+ if (!doc.key?.trim()) {
32
+ throw new Error('Each document must have a non-empty key');
33
+ }
34
+ // Generate or use provided embeddings
35
+ let embedding;
36
+ if ('embeddings' in doc && doc.embeddings) {
37
+ if (!Array.isArray(doc.embeddings) || doc.embeddings.length === 0) {
38
+ throw new Error('Embeddings must be a non-empty array');
39
+ }
40
+ embedding = doc.embeddings;
41
+ }
42
+ else if ('document' in doc && doc.document) {
43
+ if (!doc.document?.trim()) {
44
+ throw new Error('Document text must be non-empty');
45
+ }
46
+ embedding = simpleEmbedding(doc.document);
47
+ }
48
+ else {
49
+ throw new Error('Each document must have either embeddings or document text');
50
+ }
51
+ const id = randomUUID();
52
+ const timestamp = now();
53
+ const embeddingJson = JSON.stringify(embedding);
54
+ const documentText = 'document' in doc ? doc.document : null;
55
+ const metadata = doc.metadata ? JSON.stringify(doc.metadata) : null;
56
+ stmt.run(this.#projectPath, name, id, doc.key, embeddingJson, documentText ?? null, metadata ?? null, timestamp, timestamp);
57
+ const row = this.#db
58
+ .prepare('SELECT id FROM vector_storage WHERE project_path = ? AND name = ? AND key = ?')
59
+ .get(this.#projectPath, name, doc.key);
60
+ const actualId = row?.id ?? id;
61
+ results.push({ key: doc.key, id: actualId });
62
+ }
63
+ return results;
64
+ }
65
+ async get(name, key) {
66
+ if (!name?.trim() || !key?.trim()) {
67
+ throw new Error('Vector storage name and key are required');
68
+ }
69
+ const query = this.#db.query(`
70
+ SELECT id, key, embedding, document, metadata
71
+ FROM vector_storage
72
+ WHERE project_path = ? AND name = ? AND key = ?
73
+ `);
74
+ const row = query.get(this.#projectPath, name, key);
75
+ if (!row) {
76
+ return { exists: false };
77
+ }
78
+ return {
79
+ exists: true,
80
+ data: {
81
+ id: row.id,
82
+ key: row.key,
83
+ embeddings: JSON.parse(row.embedding),
84
+ document: row.document || undefined,
85
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
86
+ similarity: 1.0, // Perfect match for direct get
87
+ },
88
+ };
89
+ }
90
+ async getMany(name, ...keys) {
91
+ if (!name?.trim()) {
92
+ throw new Error('Vector storage name is required');
93
+ }
94
+ if (keys.length === 0) {
95
+ return new Map();
96
+ }
97
+ const results = await Promise.all(keys.map(async (key) => {
98
+ const result = await this.get(name, key);
99
+ return { key, result };
100
+ }));
101
+ const map = new Map();
102
+ for (const { key, result } of results) {
103
+ if (result.exists) {
104
+ map.set(key, result.data);
105
+ }
106
+ }
107
+ return map;
108
+ }
109
+ async search(name, params) {
110
+ if (!name?.trim()) {
111
+ throw new Error('Vector storage name is required');
112
+ }
113
+ if (!params.query?.trim()) {
114
+ throw new Error('Query is required');
115
+ }
116
+ // Generate query embedding
117
+ const queryEmbedding = simpleEmbedding(params.query);
118
+ // Fetch all vectors for this name
119
+ const query = this.#db.query(`
120
+ SELECT id, key, embedding, metadata
121
+ FROM vector_storage
122
+ WHERE project_path = ? AND name = ?
123
+ `);
124
+ const rows = query.all(this.#projectPath, name);
125
+ // Calculate similarities
126
+ const results = [];
127
+ for (const row of rows) {
128
+ const embedding = JSON.parse(row.embedding);
129
+ const similarity = cosineSimilarity(queryEmbedding, embedding);
130
+ // Apply similarity threshold
131
+ if (params.similarity !== undefined && similarity < params.similarity) {
132
+ continue;
133
+ }
134
+ // Apply metadata filter
135
+ if (params.metadata) {
136
+ const rowMetadata = row.metadata ? JSON.parse(row.metadata) : {};
137
+ const matches = Object.entries(params.metadata).every(([key, value]) => rowMetadata[key] === value);
138
+ if (!matches) {
139
+ continue;
140
+ }
141
+ }
142
+ results.push({
143
+ id: row.id,
144
+ key: row.key,
145
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
146
+ similarity,
147
+ });
148
+ }
149
+ // Sort by similarity descending
150
+ results.sort((a, b) => b.similarity - a.similarity);
151
+ // Apply limit
152
+ const limit = params.limit || 10;
153
+ return results.slice(0, limit);
154
+ }
155
+ async delete(name, ...keys) {
156
+ if (!name?.trim()) {
157
+ throw new Error('Vector storage name is required');
158
+ }
159
+ if (keys.length === 0) {
160
+ return 0;
161
+ }
162
+ const placeholders = keys.map(() => '?').join(', ');
163
+ const stmt = this.#db.prepare(`
164
+ DELETE FROM vector_storage
165
+ WHERE project_path = ? AND name = ? AND key IN (${placeholders})
166
+ `);
167
+ const result = stmt.run(this.#projectPath, name, ...keys);
168
+ return result.changes;
169
+ }
170
+ async exists(name) {
171
+ if (!name?.trim()) {
172
+ throw new Error('Vector storage name is required');
173
+ }
174
+ const query = this.#db.query(`
175
+ SELECT COUNT(*) as count
176
+ FROM vector_storage
177
+ WHERE project_path = ? AND name = ?
178
+ `);
179
+ const { count } = query.get(this.#projectPath, name);
180
+ return count > 0;
181
+ }
182
+ }
183
+ //# sourceMappingURL=vector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector.js","sourceRoot":"","sources":["../../../src/services/local/vector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * A composite implementation of SessionEventProvider that forwards events to multiple providers
3
+ */
4
+ export class CompositeSessionEventProvider {
5
+ providers;
6
+ constructor(...providers) {
7
+ this.providers = providers;
8
+ }
9
+ /**
10
+ * called when the session starts
11
+ *
12
+ * @param event SessionStartEvent
13
+ */
14
+ async start(event) {
15
+ await Promise.all(this.providers.map((p) => p.start(event)));
16
+ }
17
+ /**
18
+ * called when the session completes
19
+ *
20
+ * @param event SessionCompleteEvent
21
+ */
22
+ async complete(event) {
23
+ await Promise.all(this.providers.map((p) => p.complete(event)));
24
+ }
25
+ }
26
+ //# sourceMappingURL=composite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite.js","sourceRoot":"","sources":["../../../src/services/session/composite.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,OAAO,6BAA6B;IACjC,SAAS,CAAyB;IAE1C,YAAY,GAAG,SAAiC;QAC/C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;IACD;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,KAAwB;QACnC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,KAA2B;QACzC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;CACD"}
@@ -0,0 +1,42 @@
1
+ import { APIResponseSchemaNoData } from '@agentuity/server';
2
+ import { SessionStartEventDelayedSchema, SessionCompleteEventDelayedSchema, } from '@agentuity/core';
3
+ /**
4
+ * An implementation of the SessionEventProvider which uses HTTP for delivery
5
+ */
6
+ export class HTTPSessionEventProvider {
7
+ apiClient;
8
+ logger;
9
+ constructor(client, logger) {
10
+ this.apiClient = client;
11
+ this.logger = logger;
12
+ }
13
+ /**
14
+ * called when the session starts
15
+ *
16
+ * @param event SessionStartEvent
17
+ */
18
+ async start(event) {
19
+ this.logger.debug('Sending session start event: %s', event.id);
20
+ const resp = await this.apiClient.request('POST', '/session/2025-03-17', APIResponseSchemaNoData(), { ...event, timestamp: Date.now() }, SessionStartEventDelayedSchema);
21
+ if (resp.success) {
22
+ this.logger.debug('Session start event sent successfully: %s', event.id);
23
+ return;
24
+ }
25
+ throw new Error(resp.message);
26
+ }
27
+ /**
28
+ * called when the session completes
29
+ *
30
+ * @param event SessionCompleteEvent
31
+ */
32
+ async complete(event) {
33
+ this.logger.debug('Sending session complete event: %s', event.id);
34
+ const resp = await this.apiClient.request('PUT', '/session/2025-03-17', APIResponseSchemaNoData(), { ...event, timestamp: Date.now() }, SessionCompleteEventDelayedSchema);
35
+ if (resp.success) {
36
+ this.logger.debug('Session complete event sent successfully: %s', event.id);
37
+ return;
38
+ }
39
+ throw new Error(resp.message);
40
+ }
41
+ }
42
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/services/session/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAGN,8BAA8B,EAC9B,iCAAiC,GAGjC,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,OAAO,wBAAwB;IAC5B,SAAS,CAAY;IACrB,MAAM,CAAS;IAEvB,YAAY,MAAiB,EAAE,MAAc;QAC5C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,KAAwB;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CACxC,MAAM,EACN,qBAAqB,EACrB,uBAAuB,EAAE,EACzB,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EACnC,8BAA8B,CAC9B,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YACzE,OAAO;QACR,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,KAA2B;QACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CACxC,KAAK,EACL,qBAAqB,EACrB,uBAAuB,EAAE,EACzB,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EACnC,iCAAiC,CACjC,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5E,OAAO;QACR,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;CACD"}
@@ -0,0 +1,5 @@
1
+ export * from './composite';
2
+ export * from './http';
3
+ export * from './json';
4
+ export * from './local';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/session/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { join } from 'node:path';
2
+ import { randomUUID } from 'node:crypto';
3
+ /**
4
+ * An implementation of the SessionEventProvider which uses JSON logs for delivery
5
+ */
6
+ export class JSONSessionEventProvider {
7
+ directory;
8
+ constructor(directory) {
9
+ this.directory = directory;
10
+ }
11
+ makeFilename(type) {
12
+ return join(this.directory, `session-${type}.${Date.now()}${randomUUID()}.json`);
13
+ }
14
+ /**
15
+ * called when the session starts
16
+ *
17
+ * @param event SessionStartEvent
18
+ */
19
+ async start(event) {
20
+ const filename = this.makeFilename('start');
21
+ const payload = JSON.stringify({ ...event, timestamp: new Date() }) + '\n';
22
+ await Bun.file(filename).write(payload);
23
+ }
24
+ /**
25
+ * called when the session completes
26
+ *
27
+ * @param event SessionCompleteEvent
28
+ */
29
+ async complete(event) {
30
+ const filename = this.makeFilename('complete');
31
+ const payload = JSON.stringify({ ...event, timestamp: new Date() }) + '\n';
32
+ await Bun.file(filename).write(payload);
33
+ }
34
+ }
35
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/services/session/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC;;GAEG;AACH,MAAM,OAAO,wBAAwB;IAC5B,SAAS,CAAS;IAE1B,YAAY,SAAiB;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;IACO,YAAY,CAAC,IAA0B;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;IACD;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,KAAwB;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;QAC3E,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,KAA2B;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;QAC3E,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;CACD"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * An implementation of the SessionEventProvider which is no-op
3
+ */
4
+ export class LocalSessionEventProvider {
5
+ /**
6
+ * called when the session starts
7
+ *
8
+ * @param event SessionStartEvent
9
+ */
10
+ async start(_event) {
11
+ // no op
12
+ }
13
+ /**
14
+ * called when the session completes
15
+ *
16
+ * @param event SessionCompleteEvent
17
+ */
18
+ async complete(_event) {
19
+ // no op
20
+ }
21
+ }
22
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../../src/services/session/local.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,OAAO,yBAAyB;IACrC;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,MAAyB;QACpC,QAAQ;IACT,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,MAA4B;QAC1C,QAAQ;IACT,CAAC;CACD"}