sentienceapi 0.90.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +43 -0
- package/README.md +946 -0
- package/dist/actions.d.ts +54 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +349 -0
- package/dist/actions.js.map +1 -0
- package/dist/agent.d.ts +157 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +437 -0
- package/dist/agent.js.map +1 -0
- package/dist/browser.d.ts +46 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +622 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +174 -0
- package/dist/cli.js.map +1 -0
- package/dist/conversational-agent.d.ts +123 -0
- package/dist/conversational-agent.d.ts.map +1 -0
- package/dist/conversational-agent.js +327 -0
- package/dist/conversational-agent.js.map +1 -0
- package/dist/expect.d.ts +16 -0
- package/dist/expect.d.ts.map +1 -0
- package/dist/expect.js +66 -0
- package/dist/expect.js.map +1 -0
- package/dist/generator.d.ts +16 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +205 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/inspector.d.ts +13 -0
- package/dist/inspector.d.ts.map +1 -0
- package/dist/inspector.js +147 -0
- package/dist/inspector.js.map +1 -0
- package/dist/llm-provider.d.ts +60 -0
- package/dist/llm-provider.d.ts.map +1 -0
- package/dist/llm-provider.js +106 -0
- package/dist/llm-provider.js.map +1 -0
- package/dist/query.d.ts +8 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +337 -0
- package/dist/query.js.map +1 -0
- package/dist/read.d.ts +40 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +86 -0
- package/dist/read.js.map +1 -0
- package/dist/recorder.d.ts +44 -0
- package/dist/recorder.d.ts.map +1 -0
- package/dist/recorder.js +256 -0
- package/dist/recorder.js.map +1 -0
- package/dist/screenshot.d.ts +17 -0
- package/dist/screenshot.d.ts.map +1 -0
- package/dist/screenshot.js +37 -0
- package/dist/screenshot.js.map +1 -0
- package/dist/snapshot.d.ts +23 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +187 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/tracing/cloud-sink.d.ts +74 -0
- package/dist/tracing/cloud-sink.d.ts.map +1 -0
- package/dist/tracing/cloud-sink.js +262 -0
- package/dist/tracing/cloud-sink.js.map +1 -0
- package/dist/tracing/index.d.ts +12 -0
- package/dist/tracing/index.d.ts.map +1 -0
- package/dist/tracing/index.js +28 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/jsonl-sink.d.ts +41 -0
- package/dist/tracing/jsonl-sink.d.ts.map +1 -0
- package/dist/tracing/jsonl-sink.js +168 -0
- package/dist/tracing/jsonl-sink.js.map +1 -0
- package/dist/tracing/sink.d.ts +24 -0
- package/dist/tracing/sink.d.ts.map +1 -0
- package/dist/tracing/sink.js +15 -0
- package/dist/tracing/sink.js.map +1 -0
- package/dist/tracing/tracer-factory.d.ts +57 -0
- package/dist/tracing/tracer-factory.d.ts.map +1 -0
- package/dist/tracing/tracer-factory.js +274 -0
- package/dist/tracing/tracer-factory.js.map +1 -0
- package/dist/tracing/tracer.d.ts +74 -0
- package/dist/tracing/tracer.d.ts.map +1 -0
- package/dist/tracing/tracer.js +131 -0
- package/dist/tracing/tracer.js.map +1 -0
- package/dist/tracing/types.d.ts +63 -0
- package/dist/tracing/types.d.ts.map +1 -0
- package/dist/tracing/types.js +8 -0
- package/dist/tracing/types.js.map +1 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +29 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +74 -0
- package/dist/utils.js.map +1 -0
- package/dist/wait.d.ts +20 -0
- package/dist/wait.d.ts.map +1 -0
- package/dist/wait.js +63 -0
- package/dist/wait.js.map +1 -0
- package/package.json +72 -0
- package/spec/README.md +72 -0
- package/spec/SNAPSHOT_V1.md +208 -0
- package/spec/sdk-types.md +259 -0
- package/spec/snapshot.schema.json +148 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CloudTraceSink - Enterprise Cloud Upload
|
|
3
|
+
*
|
|
4
|
+
* Implements "Local Write, Batch Upload" pattern for cloud tracing
|
|
5
|
+
*
|
|
6
|
+
* PRODUCTION HARDENING:
|
|
7
|
+
* - Uses persistent cache directory (~/.sentience/traces/pending/) to survive crashes
|
|
8
|
+
* - Supports non-blocking close() to avoid hanging user scripts
|
|
9
|
+
* - Preserves traces locally on upload failure
|
|
10
|
+
*/
|
|
11
|
+
import { TraceSink } from './sink';
|
|
12
|
+
/**
|
|
13
|
+
* CloudTraceSink writes trace events to a local temp file,
|
|
14
|
+
* then uploads the complete trace to cloud storage on close()
|
|
15
|
+
*
|
|
16
|
+
* Architecture:
|
|
17
|
+
* 1. **Local Buffer**: Writes to temp file (zero latency, non-blocking)
|
|
18
|
+
* 2. **Pre-signed URL**: Uses secure pre-signed PUT URL from backend API
|
|
19
|
+
* 3. **Batch Upload**: Uploads complete file on close() or at intervals
|
|
20
|
+
* 4. **Zero Credential Exposure**: Never embeds cloud credentials in SDK
|
|
21
|
+
*
|
|
22
|
+
* This design ensures:
|
|
23
|
+
* - Fast agent performance (microseconds per emit, not milliseconds)
|
|
24
|
+
* - Security (credentials stay on backend)
|
|
25
|
+
* - Reliability (network issues don't crash the agent)
|
|
26
|
+
*
|
|
27
|
+
* Example:
|
|
28
|
+
* const sink = new CloudTraceSink(uploadUrl);
|
|
29
|
+
* const tracer = new Tracer(runId, sink);
|
|
30
|
+
* tracer.emitRunStart('SentienceAgent');
|
|
31
|
+
* await tracer.close(); // Uploads to cloud
|
|
32
|
+
*/
|
|
33
|
+
export declare class CloudTraceSink extends TraceSink {
|
|
34
|
+
private uploadUrl;
|
|
35
|
+
private tempFilePath;
|
|
36
|
+
private runId;
|
|
37
|
+
private writeStream;
|
|
38
|
+
private closed;
|
|
39
|
+
/**
|
|
40
|
+
* Create a new CloudTraceSink
|
|
41
|
+
*
|
|
42
|
+
* @param uploadUrl - Pre-signed PUT URL from Sentience API
|
|
43
|
+
* @param runId - Run ID for persistent cache naming
|
|
44
|
+
*/
|
|
45
|
+
constructor(uploadUrl: string, runId?: string);
|
|
46
|
+
/**
|
|
47
|
+
* Emit a trace event to local temp file (fast, non-blocking)
|
|
48
|
+
*
|
|
49
|
+
* @param event - Event dictionary from TraceEvent
|
|
50
|
+
*/
|
|
51
|
+
emit(event: Record<string, any>): void;
|
|
52
|
+
/**
|
|
53
|
+
* Upload data to cloud using Node's built-in https module
|
|
54
|
+
*/
|
|
55
|
+
private _uploadToCloud;
|
|
56
|
+
/**
|
|
57
|
+
* Upload buffered trace to cloud via pre-signed URL
|
|
58
|
+
*
|
|
59
|
+
* @param blocking - If false, upload happens in background (default: true)
|
|
60
|
+
*
|
|
61
|
+
* PRODUCTION FIX: Non-blocking mode prevents hanging user scripts
|
|
62
|
+
* on slow uploads (Risk #2 from production hardening plan)
|
|
63
|
+
*/
|
|
64
|
+
close(blocking?: boolean): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Internal upload logic (called by both blocking and non-blocking close)
|
|
67
|
+
*/
|
|
68
|
+
private _doUpload;
|
|
69
|
+
/**
|
|
70
|
+
* Get unique identifier for this sink
|
|
71
|
+
*/
|
|
72
|
+
getSinkType(): string;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=cloud-sink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-sink.d.ts","sourceRoot":"","sources":["../../src/tracing/cloud-sink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAkBnC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,cAAe,SAAQ,SAAS;IAC3C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,MAAM,CAAkB;IAEhC;;;;;OAKG;gBACS,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IA8B7C;;;;OAIG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAkBtC;;OAEG;YACW,cAAc;IAwC5B;;;;;;;OAOG;IACG,KAAK,CAAC,QAAQ,GAAE,OAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BpD;;OAEG;YACW,SAAS;IA+CvB;;OAEG;IACH,WAAW,IAAI,MAAM;CAGtB"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CloudTraceSink - Enterprise Cloud Upload
|
|
4
|
+
*
|
|
5
|
+
* Implements "Local Write, Batch Upload" pattern for cloud tracing
|
|
6
|
+
*
|
|
7
|
+
* PRODUCTION HARDENING:
|
|
8
|
+
* - Uses persistent cache directory (~/.sentience/traces/pending/) to survive crashes
|
|
9
|
+
* - Supports non-blocking close() to avoid hanging user scripts
|
|
10
|
+
* - Preserves traces locally on upload failure
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.CloudTraceSink = void 0;
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const os = __importStar(require("os"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const zlib = __importStar(require("zlib"));
|
|
51
|
+
const https = __importStar(require("https"));
|
|
52
|
+
const http = __importStar(require("http"));
|
|
53
|
+
const url_1 = require("url");
|
|
54
|
+
const sink_1 = require("./sink");
|
|
55
|
+
/**
|
|
56
|
+
* Get persistent cache directory for traces
|
|
57
|
+
* Uses ~/.sentience/traces/pending/ (survives process crashes)
|
|
58
|
+
*/
|
|
59
|
+
function getPersistentCacheDir() {
|
|
60
|
+
const homeDir = os.homedir();
|
|
61
|
+
const cacheDir = path.join(homeDir, '.sentience', 'traces', 'pending');
|
|
62
|
+
// Create directory if it doesn't exist
|
|
63
|
+
if (!fs.existsSync(cacheDir)) {
|
|
64
|
+
fs.mkdirSync(cacheDir, { recursive: true });
|
|
65
|
+
}
|
|
66
|
+
return cacheDir;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* CloudTraceSink writes trace events to a local temp file,
|
|
70
|
+
* then uploads the complete trace to cloud storage on close()
|
|
71
|
+
*
|
|
72
|
+
* Architecture:
|
|
73
|
+
* 1. **Local Buffer**: Writes to temp file (zero latency, non-blocking)
|
|
74
|
+
* 2. **Pre-signed URL**: Uses secure pre-signed PUT URL from backend API
|
|
75
|
+
* 3. **Batch Upload**: Uploads complete file on close() or at intervals
|
|
76
|
+
* 4. **Zero Credential Exposure**: Never embeds cloud credentials in SDK
|
|
77
|
+
*
|
|
78
|
+
* This design ensures:
|
|
79
|
+
* - Fast agent performance (microseconds per emit, not milliseconds)
|
|
80
|
+
* - Security (credentials stay on backend)
|
|
81
|
+
* - Reliability (network issues don't crash the agent)
|
|
82
|
+
*
|
|
83
|
+
* Example:
|
|
84
|
+
* const sink = new CloudTraceSink(uploadUrl);
|
|
85
|
+
* const tracer = new Tracer(runId, sink);
|
|
86
|
+
* tracer.emitRunStart('SentienceAgent');
|
|
87
|
+
* await tracer.close(); // Uploads to cloud
|
|
88
|
+
*/
|
|
89
|
+
class CloudTraceSink extends sink_1.TraceSink {
|
|
90
|
+
/**
|
|
91
|
+
* Create a new CloudTraceSink
|
|
92
|
+
*
|
|
93
|
+
* @param uploadUrl - Pre-signed PUT URL from Sentience API
|
|
94
|
+
* @param runId - Run ID for persistent cache naming
|
|
95
|
+
*/
|
|
96
|
+
constructor(uploadUrl, runId) {
|
|
97
|
+
super();
|
|
98
|
+
this.writeStream = null;
|
|
99
|
+
this.closed = false;
|
|
100
|
+
this.uploadUrl = uploadUrl;
|
|
101
|
+
this.runId = runId || `trace-${Date.now()}`;
|
|
102
|
+
// PRODUCTION FIX: Use persistent cache directory instead of /tmp
|
|
103
|
+
// This ensures traces survive process crashes!
|
|
104
|
+
const cacheDir = getPersistentCacheDir();
|
|
105
|
+
this.tempFilePath = path.join(cacheDir, `${this.runId}.jsonl`);
|
|
106
|
+
try {
|
|
107
|
+
// Open file in append mode
|
|
108
|
+
this.writeStream = fs.createWriteStream(this.tempFilePath, {
|
|
109
|
+
flags: 'a',
|
|
110
|
+
encoding: 'utf-8',
|
|
111
|
+
autoClose: true,
|
|
112
|
+
});
|
|
113
|
+
// Handle stream errors (suppress if closed)
|
|
114
|
+
this.writeStream.on('error', (error) => {
|
|
115
|
+
if (!this.closed) {
|
|
116
|
+
console.error('[CloudTraceSink] Stream error:', error);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error('[CloudTraceSink] Failed to initialize sink:', error);
|
|
122
|
+
this.writeStream = null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Emit a trace event to local temp file (fast, non-blocking)
|
|
127
|
+
*
|
|
128
|
+
* @param event - Event dictionary from TraceEvent
|
|
129
|
+
*/
|
|
130
|
+
emit(event) {
|
|
131
|
+
if (this.closed) {
|
|
132
|
+
throw new Error('CloudTraceSink is closed');
|
|
133
|
+
}
|
|
134
|
+
if (!this.writeStream) {
|
|
135
|
+
console.error('[CloudTraceSink] Write stream not available');
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
const jsonStr = JSON.stringify(event);
|
|
140
|
+
this.writeStream.write(jsonStr + '\n');
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
console.error('[CloudTraceSink] Write error:', error);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Upload data to cloud using Node's built-in https module
|
|
148
|
+
*/
|
|
149
|
+
async _uploadToCloud(data) {
|
|
150
|
+
return new Promise((resolve, reject) => {
|
|
151
|
+
const url = new url_1.URL(this.uploadUrl);
|
|
152
|
+
const protocol = url.protocol === 'https:' ? https : http;
|
|
153
|
+
const options = {
|
|
154
|
+
hostname: url.hostname,
|
|
155
|
+
port: url.port || (url.protocol === 'https:' ? 443 : 80),
|
|
156
|
+
path: url.pathname + url.search,
|
|
157
|
+
method: 'PUT',
|
|
158
|
+
headers: {
|
|
159
|
+
'Content-Type': 'application/x-gzip',
|
|
160
|
+
'Content-Encoding': 'gzip',
|
|
161
|
+
'Content-Length': data.length,
|
|
162
|
+
},
|
|
163
|
+
timeout: 60000, // 1 minute timeout
|
|
164
|
+
};
|
|
165
|
+
const req = protocol.request(options, (res) => {
|
|
166
|
+
// Consume response data (even if we don't use it)
|
|
167
|
+
res.on('data', () => { });
|
|
168
|
+
res.on('end', () => {
|
|
169
|
+
resolve(res.statusCode || 500);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
req.on('error', (error) => {
|
|
173
|
+
reject(error);
|
|
174
|
+
});
|
|
175
|
+
req.on('timeout', () => {
|
|
176
|
+
req.destroy();
|
|
177
|
+
reject(new Error('Upload timeout'));
|
|
178
|
+
});
|
|
179
|
+
req.write(data);
|
|
180
|
+
req.end();
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Upload buffered trace to cloud via pre-signed URL
|
|
185
|
+
*
|
|
186
|
+
* @param blocking - If false, upload happens in background (default: true)
|
|
187
|
+
*
|
|
188
|
+
* PRODUCTION FIX: Non-blocking mode prevents hanging user scripts
|
|
189
|
+
* on slow uploads (Risk #2 from production hardening plan)
|
|
190
|
+
*/
|
|
191
|
+
async close(blocking = true) {
|
|
192
|
+
if (this.closed) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
this.closed = true;
|
|
196
|
+
// Non-blocking mode: fire-and-forget background upload
|
|
197
|
+
if (!blocking) {
|
|
198
|
+
// Close the write stream synchronously
|
|
199
|
+
if (this.writeStream && !this.writeStream.destroyed) {
|
|
200
|
+
this.writeStream.end();
|
|
201
|
+
}
|
|
202
|
+
// Upload in background (don't await)
|
|
203
|
+
this._doUpload().catch((error) => {
|
|
204
|
+
console.error(`❌ [Sentience] Background upload failed: ${error.message}`);
|
|
205
|
+
console.error(` Local trace preserved at: ${this.tempFilePath}`);
|
|
206
|
+
});
|
|
207
|
+
console.log('📤 [Sentience] Trace upload started in background');
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// Blocking mode: wait for upload to complete
|
|
211
|
+
await this._doUpload();
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Internal upload logic (called by both blocking and non-blocking close)
|
|
215
|
+
*/
|
|
216
|
+
async _doUpload() {
|
|
217
|
+
try {
|
|
218
|
+
// 1. Close write stream
|
|
219
|
+
if (this.writeStream && !this.writeStream.destroyed) {
|
|
220
|
+
const stream = this.writeStream;
|
|
221
|
+
stream.removeAllListeners('error');
|
|
222
|
+
await new Promise((resolve) => {
|
|
223
|
+
stream.end(() => {
|
|
224
|
+
resolve();
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
// 2. Read and compress trace data
|
|
229
|
+
if (!fs.existsSync(this.tempFilePath)) {
|
|
230
|
+
console.warn('[CloudTraceSink] Temp file does not exist, skipping upload');
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const traceData = fs.readFileSync(this.tempFilePath);
|
|
234
|
+
const compressedData = zlib.gzipSync(traceData);
|
|
235
|
+
// 3. Upload to cloud via pre-signed URL
|
|
236
|
+
console.log(`📤 [Sentience] Uploading trace to cloud (${compressedData.length} bytes)...`);
|
|
237
|
+
const statusCode = await this._uploadToCloud(compressedData);
|
|
238
|
+
if (statusCode === 200) {
|
|
239
|
+
console.log('✅ [Sentience] Trace uploaded successfully');
|
|
240
|
+
// 4. Delete temp file on success
|
|
241
|
+
fs.unlinkSync(this.tempFilePath);
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
console.error(`❌ [Sentience] Upload failed: HTTP ${statusCode}`);
|
|
245
|
+
console.error(` Local trace preserved at: ${this.tempFilePath}`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
console.error(`❌ [Sentience] Error uploading trace: ${error.message}`);
|
|
250
|
+
console.error(` Local trace preserved at: ${this.tempFilePath}`);
|
|
251
|
+
// Don't throw - preserve trace locally even if upload fails
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get unique identifier for this sink
|
|
256
|
+
*/
|
|
257
|
+
getSinkType() {
|
|
258
|
+
return `CloudTraceSink(${this.uploadUrl.substring(0, 50)}...)`;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
exports.CloudTraceSink = CloudTraceSink;
|
|
262
|
+
//# sourceMappingURL=cloud-sink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-sink.js","sourceRoot":"","sources":["../../src/tracing/cloud-sink.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracing Module
|
|
3
|
+
*
|
|
4
|
+
* Exports all tracing functionality
|
|
5
|
+
*/
|
|
6
|
+
export * from './types';
|
|
7
|
+
export * from './sink';
|
|
8
|
+
export * from './jsonl-sink';
|
|
9
|
+
export * from './cloud-sink';
|
|
10
|
+
export * from './tracer';
|
|
11
|
+
export * from './tracer-factory';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tracing Module
|
|
4
|
+
*
|
|
5
|
+
* Exports all tracing functionality
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
19
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
__exportStar(require("./types"), exports);
|
|
23
|
+
__exportStar(require("./sink"), exports);
|
|
24
|
+
__exportStar(require("./jsonl-sink"), exports);
|
|
25
|
+
__exportStar(require("./cloud-sink"), exports);
|
|
26
|
+
__exportStar(require("./tracer"), exports);
|
|
27
|
+
__exportStar(require("./tracer-factory"), exports);
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,yCAAuB;AACvB,+CAA6B;AAC7B,+CAA6B;AAC7B,2CAAyB;AACzB,mDAAiC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSONL Trace Sink
|
|
3
|
+
*
|
|
4
|
+
* Writes trace events to a local JSONL (JSON Lines) file
|
|
5
|
+
*/
|
|
6
|
+
import { TraceSink } from './sink';
|
|
7
|
+
/**
|
|
8
|
+
* JsonlTraceSink writes trace events to a JSONL file (one JSON object per line)
|
|
9
|
+
*/
|
|
10
|
+
export declare class JsonlTraceSink extends TraceSink {
|
|
11
|
+
private path;
|
|
12
|
+
private writeStream;
|
|
13
|
+
private closed;
|
|
14
|
+
/**
|
|
15
|
+
* Create a new JSONL trace sink
|
|
16
|
+
* @param filePath - Path to the JSONL file (will be created if doesn't exist)
|
|
17
|
+
*/
|
|
18
|
+
constructor(filePath: string);
|
|
19
|
+
/**
|
|
20
|
+
* Emit a trace event (write as JSON line)
|
|
21
|
+
* @param event - Event dictionary
|
|
22
|
+
*/
|
|
23
|
+
emit(event: Record<string, any>): void;
|
|
24
|
+
/**
|
|
25
|
+
* Close the sink and flush buffered data
|
|
26
|
+
*/
|
|
27
|
+
close(): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Get sink type identifier
|
|
30
|
+
*/
|
|
31
|
+
getSinkType(): string;
|
|
32
|
+
/**
|
|
33
|
+
* Get file path
|
|
34
|
+
*/
|
|
35
|
+
getPath(): string;
|
|
36
|
+
/**
|
|
37
|
+
* Check if sink is closed
|
|
38
|
+
*/
|
|
39
|
+
isClosed(): boolean;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=jsonl-sink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl-sink.d.ts","sourceRoot":"","sources":["../../src/tracing/jsonl-sink.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC;;GAEG;AACH,qBAAa,cAAe,SAAQ,SAAS;IAC3C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,MAAM,CAAkB;IAEhC;;;OAGG;gBACS,QAAQ,EAAE,MAAM;IAiC5B;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAoCtC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B5B;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGpB"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* JSONL Trace Sink
|
|
4
|
+
*
|
|
5
|
+
* Writes trace events to a local JSONL (JSON Lines) file
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.JsonlTraceSink = void 0;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const sink_1 = require("./sink");
|
|
45
|
+
/**
|
|
46
|
+
* JsonlTraceSink writes trace events to a JSONL file (one JSON object per line)
|
|
47
|
+
*/
|
|
48
|
+
class JsonlTraceSink extends sink_1.TraceSink {
|
|
49
|
+
/**
|
|
50
|
+
* Create a new JSONL trace sink
|
|
51
|
+
* @param filePath - Path to the JSONL file (will be created if doesn't exist)
|
|
52
|
+
*/
|
|
53
|
+
constructor(filePath) {
|
|
54
|
+
super();
|
|
55
|
+
this.writeStream = null;
|
|
56
|
+
this.closed = false;
|
|
57
|
+
this.path = filePath;
|
|
58
|
+
// Create parent directories if needed (synchronously)
|
|
59
|
+
const dir = path.dirname(filePath);
|
|
60
|
+
try {
|
|
61
|
+
if (!fs.existsSync(dir)) {
|
|
62
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
63
|
+
}
|
|
64
|
+
// Verify directory is writable
|
|
65
|
+
fs.accessSync(dir, fs.constants.W_OK);
|
|
66
|
+
// Open file in append mode with line buffering
|
|
67
|
+
this.writeStream = fs.createWriteStream(filePath, {
|
|
68
|
+
flags: 'a',
|
|
69
|
+
encoding: 'utf-8',
|
|
70
|
+
autoClose: true,
|
|
71
|
+
});
|
|
72
|
+
// Handle stream errors (suppress logging if stream is closed)
|
|
73
|
+
this.writeStream.on('error', (error) => {
|
|
74
|
+
if (!this.closed) {
|
|
75
|
+
console.error('[JsonlTraceSink] Stream error:', error);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error('[JsonlTraceSink] Failed to initialize sink:', error);
|
|
81
|
+
this.writeStream = null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Emit a trace event (write as JSON line)
|
|
86
|
+
* @param event - Event dictionary
|
|
87
|
+
*/
|
|
88
|
+
emit(event) {
|
|
89
|
+
if (this.closed) {
|
|
90
|
+
// Only warn in non-test environments to avoid test noise
|
|
91
|
+
const isTestEnv = process.env.CI === 'true' ||
|
|
92
|
+
process.env.NODE_ENV === 'test' ||
|
|
93
|
+
process.env.JEST_WORKER_ID !== undefined ||
|
|
94
|
+
(typeof global !== 'undefined' && global.__JEST__);
|
|
95
|
+
if (!isTestEnv) {
|
|
96
|
+
console.warn('[JsonlTraceSink] Attempted to emit after close()');
|
|
97
|
+
}
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (!this.writeStream) {
|
|
101
|
+
console.error('[JsonlTraceSink] Write stream not available');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const jsonLine = JSON.stringify(event) + '\n';
|
|
106
|
+
const written = this.writeStream.write(jsonLine);
|
|
107
|
+
// If write returns false, the stream is backpressured
|
|
108
|
+
// We don't need to wait, but we could add a drain listener if needed
|
|
109
|
+
if (!written) {
|
|
110
|
+
// Stream is backpressured - wait for drain
|
|
111
|
+
this.writeStream.once('drain', () => {
|
|
112
|
+
// Stream is ready again
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
// Log error but don't crash agent execution
|
|
118
|
+
console.error('[JsonlTraceSink] Failed to write event:', error);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Close the sink and flush buffered data
|
|
123
|
+
*/
|
|
124
|
+
async close() {
|
|
125
|
+
if (this.closed) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this.closed = true;
|
|
129
|
+
// Check if stream exists and is writable
|
|
130
|
+
if (!this.writeStream || this.writeStream.destroyed) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// Store reference to satisfy TypeScript null checks
|
|
134
|
+
const stream = this.writeStream;
|
|
135
|
+
// Remove error listener to prevent late errors
|
|
136
|
+
stream.removeAllListeners('error');
|
|
137
|
+
return new Promise((resolve) => {
|
|
138
|
+
stream.end((err) => {
|
|
139
|
+
if (err) {
|
|
140
|
+
// Silently ignore close errors in production
|
|
141
|
+
// (they're logged during stream lifetime if needed)
|
|
142
|
+
}
|
|
143
|
+
// Always resolve, don't reject on close errors
|
|
144
|
+
resolve();
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get sink type identifier
|
|
150
|
+
*/
|
|
151
|
+
getSinkType() {
|
|
152
|
+
return `JsonlTraceSink(${this.path})`;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get file path
|
|
156
|
+
*/
|
|
157
|
+
getPath() {
|
|
158
|
+
return this.path;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Check if sink is closed
|
|
162
|
+
*/
|
|
163
|
+
isClosed() {
|
|
164
|
+
return this.closed;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
exports.JsonlTraceSink = JsonlTraceSink;
|
|
168
|
+
//# sourceMappingURL=jsonl-sink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl-sink.js","sourceRoot":"","sources":["../../src/tracing/jsonl-sink.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TraceSink Abstract Class
|
|
3
|
+
*
|
|
4
|
+
* Defines the interface for trace event sinks (local files, cloud storage, etc.)
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Abstract base class for trace sinks
|
|
8
|
+
*/
|
|
9
|
+
export declare abstract class TraceSink {
|
|
10
|
+
/**
|
|
11
|
+
* Emit a trace event
|
|
12
|
+
* @param event - Event dictionary to emit
|
|
13
|
+
*/
|
|
14
|
+
abstract emit(event: Record<string, any>): void;
|
|
15
|
+
/**
|
|
16
|
+
* Close the sink and flush buffered data
|
|
17
|
+
*/
|
|
18
|
+
abstract close(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Get unique identifier for this sink (for debugging)
|
|
21
|
+
*/
|
|
22
|
+
abstract getSinkType(): string;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=sink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../../src/tracing/sink.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,8BAAsB,SAAS;IAC7B;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAE/C;;OAEG;IACH,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,WAAW,IAAI,MAAM;CAC/B"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TraceSink Abstract Class
|
|
4
|
+
*
|
|
5
|
+
* Defines the interface for trace event sinks (local files, cloud storage, etc.)
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.TraceSink = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Abstract base class for trace sinks
|
|
11
|
+
*/
|
|
12
|
+
class TraceSink {
|
|
13
|
+
}
|
|
14
|
+
exports.TraceSink = TraceSink;
|
|
15
|
+
//# sourceMappingURL=sink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sink.js","sourceRoot":"","sources":["../../src/tracing/sink.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH;;GAEG;AACH,MAAsB,SAAS;CAgB9B;AAhBD,8BAgBC"}
|