@agentuity/runtime 0.0.51 → 0.0.53
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/dist/_config.js +99 -0
- package/dist/_config.js.map +1 -0
- package/dist/_context.d.ts +11 -11
- package/dist/_context.d.ts.map +1 -1
- package/dist/_context.js +84 -0
- package/dist/_context.js.map +1 -0
- package/dist/_idle.js +24 -0
- package/dist/_idle.js.map +1 -0
- package/dist/_server.js +489 -0
- package/dist/_server.js.map +1 -0
- package/dist/_services.js +258 -0
- package/dist/_services.js.map +1 -0
- package/dist/_tokens.js +98 -0
- package/dist/_tokens.js.map +1 -0
- package/dist/_util.js +54 -0
- package/dist/_util.js.map +1 -0
- package/dist/_waituntil.js +87 -0
- package/dist/_waituntil.js.map +1 -0
- package/dist/agent.d.ts +24 -15
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +507 -0
- package/dist/agent.js.map +1 -0
- package/dist/app.d.ts +6 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +72 -0
- package/dist/app.js.map +1 -0
- package/dist/eval.d.ts +1 -1
- package/dist/eval.d.ts.map +1 -1
- package/dist/eval.js +2 -0
- package/dist/eval.js.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/io/email.js +154 -0
- package/dist/io/email.js.map +1 -0
- package/dist/logger/console.js +274 -0
- package/dist/logger/console.js.map +1 -0
- package/dist/logger/index.js +3 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/internal.js +133 -0
- package/dist/logger/internal.js.map +1 -0
- package/dist/logger/logger.js +2 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/user.js +7 -0
- package/dist/logger/user.js.map +1 -0
- package/dist/logger/util.js +77 -0
- package/dist/logger/util.js.map +1 -0
- package/dist/otel/config.js +23 -0
- package/dist/otel/config.js.map +1 -0
- package/dist/otel/console.js +52 -0
- package/dist/otel/console.js.map +1 -0
- package/dist/otel/exporters/index.js +4 -0
- package/dist/otel/exporters/index.js.map +1 -0
- package/dist/otel/exporters/jsonl-log-exporter.js +103 -0
- package/dist/otel/exporters/jsonl-log-exporter.js.map +1 -0
- package/dist/otel/exporters/jsonl-metric-exporter.js +104 -0
- package/dist/otel/exporters/jsonl-metric-exporter.js.map +1 -0
- package/dist/otel/exporters/jsonl-trace-exporter.js +111 -0
- package/dist/otel/exporters/jsonl-trace-exporter.js.map +1 -0
- package/dist/otel/fetch.js +81 -0
- package/dist/otel/fetch.js.map +1 -0
- package/dist/otel/http.js +44 -0
- package/dist/otel/http.js.map +1 -0
- package/dist/otel/logger.js +278 -0
- package/dist/otel/logger.js.map +1 -0
- package/dist/otel/otel.js +233 -0
- package/dist/otel/otel.js.map +1 -0
- package/dist/router.js +350 -0
- package/dist/router.js.map +1 -0
- package/dist/services/evalrun/composite.js +26 -0
- package/dist/services/evalrun/composite.js.map +1 -0
- package/dist/services/evalrun/http.js +74 -0
- package/dist/services/evalrun/http.js.map +1 -0
- package/dist/services/evalrun/index.js +5 -0
- package/dist/services/evalrun/index.js.map +1 -0
- package/dist/services/evalrun/json.js +38 -0
- package/dist/services/evalrun/json.js.map +1 -0
- package/dist/services/evalrun/local.js +22 -0
- package/dist/services/evalrun/local.js.map +1 -0
- package/dist/services/local/_db.js +144 -0
- package/dist/services/local/_db.js.map +1 -0
- package/dist/services/local/_router.js +60 -0
- package/dist/services/local/_router.js.map +1 -0
- package/dist/services/local/_util.js +42 -0
- package/dist/services/local/_util.js.map +1 -0
- package/dist/services/local/index.js +8 -0
- package/dist/services/local/index.js.map +1 -0
- package/dist/services/local/keyvalue.js +114 -0
- package/dist/services/local/keyvalue.js.map +1 -0
- package/dist/services/local/objectstore.js +117 -0
- package/dist/services/local/objectstore.js.map +1 -0
- package/dist/services/local/stream.js +218 -0
- package/dist/services/local/stream.js.map +1 -0
- package/dist/services/local/vector.js +183 -0
- package/dist/services/local/vector.js.map +1 -0
- package/dist/services/session/composite.js +26 -0
- package/dist/services/session/composite.js.map +1 -0
- package/dist/services/session/http.js +42 -0
- package/dist/services/session/http.js.map +1 -0
- package/dist/services/session/index.js +5 -0
- package/dist/services/session/index.js.map +1 -0
- package/dist/services/session/json.js +35 -0
- package/dist/services/session/json.js.map +1 -0
- package/dist/services/session/local.js +22 -0
- package/dist/services/session/local.js.map +1 -0
- package/dist/session.js +199 -0
- package/dist/session.js.map +1 -0
- package/dist/workbench.js +38 -0
- package/dist/workbench.js.map +1 -0
- package/package.json +5 -5
- package/src/_context.ts +34 -13
- package/src/agent.ts +76 -40
- package/src/app.ts +6 -1
- package/src/eval.ts +1 -1
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { formatMessage } from './util';
|
|
2
|
+
const cyan = '\x1b[1;96m';
|
|
3
|
+
const reset = '\x1b[0m';
|
|
4
|
+
/**
|
|
5
|
+
* Simple internal logger that doesn't depend on other SDK modules
|
|
6
|
+
* This logger is only for SDK internal diagnostics and debugging
|
|
7
|
+
*/
|
|
8
|
+
class InternalLogger {
|
|
9
|
+
config;
|
|
10
|
+
constructor() {
|
|
11
|
+
this.config = this.loadConfig();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Load configuration from environment variables
|
|
15
|
+
*/
|
|
16
|
+
loadConfig() {
|
|
17
|
+
const envLevel = process.env.AGENTUITY_SDK_LOG_LEVEL?.toLowerCase();
|
|
18
|
+
// Validate log level
|
|
19
|
+
const validLevels = ['debug', 'info', 'warn', 'error', 'silent'];
|
|
20
|
+
const level = validLevels.includes(envLevel) ? envLevel : 'silent';
|
|
21
|
+
return {
|
|
22
|
+
level,
|
|
23
|
+
context: {
|
|
24
|
+
'@agentuity/source': 'sdk-internal',
|
|
25
|
+
'@agentuity/timestamp': new Date().toISOString(),
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if a log level should be output based on current configuration
|
|
31
|
+
*/
|
|
32
|
+
shouldLog(level) {
|
|
33
|
+
if (this.config.level === 'silent')
|
|
34
|
+
return false;
|
|
35
|
+
const levelPriority = {
|
|
36
|
+
debug: 0,
|
|
37
|
+
info: 1,
|
|
38
|
+
warn: 2,
|
|
39
|
+
error: 3,
|
|
40
|
+
silent: 4,
|
|
41
|
+
};
|
|
42
|
+
return levelPriority[level] >= levelPriority[this.config.level];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Format a log message with context
|
|
46
|
+
*/
|
|
47
|
+
formatMessage(message, ...args) {
|
|
48
|
+
const formattedMessage = formatMessage(false, this.config.context, message, args);
|
|
49
|
+
return `${cyan}[INTERNAL]${reset} ${formattedMessage}`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Log a debug message
|
|
53
|
+
*/
|
|
54
|
+
debug(message, ...args) {
|
|
55
|
+
if (this.shouldLog('debug')) {
|
|
56
|
+
console.debug(this.formatMessage(message, ...args));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Log an info message
|
|
61
|
+
*/
|
|
62
|
+
info(message, ...args) {
|
|
63
|
+
if (this.shouldLog('info')) {
|
|
64
|
+
console.info(this.formatMessage(message, ...args));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Log a warning message
|
|
69
|
+
*/
|
|
70
|
+
warn(message, ...args) {
|
|
71
|
+
if (this.shouldLog('warn')) {
|
|
72
|
+
console.warn(this.formatMessage(message, ...args));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Log an error message
|
|
77
|
+
*/
|
|
78
|
+
error(message, ...args) {
|
|
79
|
+
if (this.shouldLog('error')) {
|
|
80
|
+
console.error(this.formatMessage(message, ...args));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Update configuration at runtime
|
|
85
|
+
*/
|
|
86
|
+
updateConfig(config) {
|
|
87
|
+
this.config = { ...this.config, ...config };
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get current configuration
|
|
91
|
+
*/
|
|
92
|
+
getConfig() {
|
|
93
|
+
return { ...this.config };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Check if logging is enabled
|
|
97
|
+
*/
|
|
98
|
+
isEnabled() {
|
|
99
|
+
return this.config.level !== 'silent';
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Create a child logger with additional context
|
|
103
|
+
*/
|
|
104
|
+
child(context) {
|
|
105
|
+
const childLogger = new InternalLogger();
|
|
106
|
+
childLogger.updateConfig({
|
|
107
|
+
...this.config,
|
|
108
|
+
context: {
|
|
109
|
+
...this.config.context,
|
|
110
|
+
...context,
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
return childLogger;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Singleton instance - not exported
|
|
117
|
+
const internalLogger = new InternalLogger();
|
|
118
|
+
/**
|
|
119
|
+
* Internal logger for SDK use only
|
|
120
|
+
* This is NOT exported from the main SDK index
|
|
121
|
+
*/
|
|
122
|
+
export const internal = {
|
|
123
|
+
debug: (message, ...args) => internalLogger.debug(message, ...args),
|
|
124
|
+
info: (message, ...args) => internalLogger.info(message, ...args),
|
|
125
|
+
warn: (message, ...args) => internalLogger.warn(message, ...args),
|
|
126
|
+
error: (message, ...args) => internalLogger.error(message, ...args),
|
|
127
|
+
// Utility methods
|
|
128
|
+
updateConfig: (config) => internalLogger.updateConfig(config),
|
|
129
|
+
getConfig: () => internalLogger.getConfig(),
|
|
130
|
+
isEnabled: () => internalLogger.isEnabled(),
|
|
131
|
+
child: (context) => internalLogger.child(context),
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../src/logger/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,IAAI,GAAG,YAAY,CAAC;AAC1B,MAAM,KAAK,GAAG,SAAS,CAAC;AAexB;;;GAGG;AACH,MAAM,cAAc;IACX,MAAM,CAAuB;IAErC;QACC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACK,UAAU;QACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,WAAW,EAAE,CAAC;QAEpE,qBAAqB;QACrB,MAAM,WAAW,GAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,QAAoB,CAAC,CAAC,CAAC,CAAE,QAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE7F,OAAO;YACN,KAAK;YACL,OAAO,EAAE;gBACR,mBAAmB,EAAE,cAAc;gBACnC,sBAAsB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAChD;SACD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,KAAe;QAChC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAEjD,MAAM,aAAa,GAAG;YACrB,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;SACT,CAAC;QAEF,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,OAAgB,EAAE,GAAG,IAAe;QACzD,MAAM,gBAAgB,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAClF,OAAO,GAAG,IAAI,aAAa,KAAK,IAAI,gBAAgB,EAAE,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAgB,EAAE,GAAG,IAAe;QACzC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAgB,EAAE,GAAG,IAAe;QACxC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAgB,EAAE,GAAG,IAAe;QACxC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAgB,EAAE,GAAG,IAAe;QACzC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAAqC;QACjD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,SAAS;QACR,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,SAAS;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAgC;QACrC,MAAM,WAAW,GAAG,IAAI,cAAc,EAAE,CAAC;QACzC,WAAW,CAAC,YAAY,CAAC;YACxB,GAAG,IAAI,CAAC,MAAM;YACd,OAAO,EAAE;gBACR,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;gBACtB,GAAG,OAAO;aACV;SACD,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACpB,CAAC;CACD;AAED,oCAAoC;AACpC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;AAE5C;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACvB,KAAK,EAAE,CAAC,OAAgB,EAAE,GAAG,IAAe,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IACvF,IAAI,EAAE,CAAC,OAAgB,EAAE,GAAG,IAAe,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IACrF,IAAI,EAAE,CAAC,OAAgB,EAAE,GAAG,IAAe,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IACrF,KAAK,EAAE,CAAC,OAAgB,EAAE,GAAG,IAAe,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IAEvF,kBAAkB;IAClB,YAAY,EAAE,CAAC,MAAqC,EAAE,EAAE,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC;IAC5F,SAAS,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE;IAC3C,SAAS,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE;IAC3C,KAAK,EAAE,CAAC,OAAgC,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC;CAC1E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger/logger.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { createLogger } from '@agentuity/server';
|
|
2
|
+
/**
|
|
3
|
+
* User-facing logger instance
|
|
4
|
+
* This is the logger that SDK consumers should use
|
|
5
|
+
*/
|
|
6
|
+
export const logger = createLogger((process.env.AGENTUITY_LOG_LEVEL || 'info'), false, (process.env.COLOR_SCHEME ?? 'dark'));
|
|
7
|
+
//# sourceMappingURL=user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/logger/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGnE;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAW,YAAY,CACzC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,MAAM,CAAa,EACvD,KAAK,EACL,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAgB,CACnD,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { formatWithOptions, inspect } from 'node:util';
|
|
2
|
+
import { safeStringify } from '@agentuity/core';
|
|
3
|
+
export function buildContextString(context) {
|
|
4
|
+
if (context) {
|
|
5
|
+
const contextStr = context && Object.keys(context).length > 0
|
|
6
|
+
? Object.entries(context)
|
|
7
|
+
.map(([key, value]) => {
|
|
8
|
+
try {
|
|
9
|
+
return `${key}=${typeof value === 'object' ? safeStringify(value) : value}`;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return `${key}=[object Object]`;
|
|
13
|
+
}
|
|
14
|
+
})
|
|
15
|
+
.join(' ')
|
|
16
|
+
: '';
|
|
17
|
+
return contextStr;
|
|
18
|
+
}
|
|
19
|
+
return '';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Formats a log message with context
|
|
23
|
+
*
|
|
24
|
+
* @param message - The message to format
|
|
25
|
+
* @param args - Additional arguments for formatting
|
|
26
|
+
* @returns The formatted message with context
|
|
27
|
+
* @private
|
|
28
|
+
*/
|
|
29
|
+
export function formatMessage(displayContext, context, message, args) {
|
|
30
|
+
// Format the context string
|
|
31
|
+
const contextStr = displayContext ? buildContextString(context) : null;
|
|
32
|
+
// Format the message based on its type
|
|
33
|
+
let _message;
|
|
34
|
+
if (typeof message === 'string') {
|
|
35
|
+
_message = message;
|
|
36
|
+
}
|
|
37
|
+
else if (typeof message === 'number' || typeof message === 'boolean') {
|
|
38
|
+
_message = String(message);
|
|
39
|
+
}
|
|
40
|
+
else if (message === null) {
|
|
41
|
+
_message = 'null';
|
|
42
|
+
}
|
|
43
|
+
else if (message === undefined) {
|
|
44
|
+
_message = 'undefined';
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Use inspect for objects for better formatting
|
|
48
|
+
_message = inspect(message, { depth: null, colors: false });
|
|
49
|
+
}
|
|
50
|
+
// Format the message with args
|
|
51
|
+
let formattedMessage;
|
|
52
|
+
try {
|
|
53
|
+
// Only use format if we have arguments
|
|
54
|
+
if (args.length > 0) {
|
|
55
|
+
formattedMessage = formatWithOptions({ depth: null }, _message, ...args);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
formattedMessage = _message;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// If formatting fails, use a simple concatenation
|
|
63
|
+
formattedMessage = `${_message} ${args
|
|
64
|
+
.map((arg) => {
|
|
65
|
+
try {
|
|
66
|
+
return typeof arg === 'object' ? safeStringify(arg) : String(arg);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return '[object Object]';
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
.join(' ')}`;
|
|
73
|
+
}
|
|
74
|
+
// Combine message with context
|
|
75
|
+
return `${formattedMessage}${contextStr ? ` [${contextStr}]` : ''}`;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/logger/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as runtimeConfig from '../_config';
|
|
2
|
+
import { registerOtel } from './otel';
|
|
3
|
+
export function register(registerConfig) {
|
|
4
|
+
const url = process.env.AGENTUITY_OTLP_URL ?? 'https://otel.agentuity.cloud';
|
|
5
|
+
const bearerToken = process.env.AGENTUITY_OTLP_BEARER_TOKEN;
|
|
6
|
+
const config = {
|
|
7
|
+
spanProcessors: registerConfig.processors,
|
|
8
|
+
name: runtimeConfig.getAppName(),
|
|
9
|
+
version: runtimeConfig.getAppVersion(),
|
|
10
|
+
cliVersion: runtimeConfig.getCLIVersion(),
|
|
11
|
+
devmode: runtimeConfig.isDevMode(),
|
|
12
|
+
orgId: runtimeConfig.getOrganizationId(),
|
|
13
|
+
projectId: runtimeConfig.getProjectId(),
|
|
14
|
+
deploymentId: runtimeConfig.getDeploymentId(),
|
|
15
|
+
environment: runtimeConfig.getEnvironment(),
|
|
16
|
+
logLevel: registerConfig.logLevel,
|
|
17
|
+
jsonlBasePath: process.env.AGENTUITY_CLOUD_EXPORT_DIR,
|
|
18
|
+
bearerToken,
|
|
19
|
+
url,
|
|
20
|
+
};
|
|
21
|
+
return registerOtel(config);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/otel/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,aAAa,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAmBtC,MAAM,UAAU,QAAQ,CAAC,cAAkC;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,8BAA8B,CAAC;IAC7E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;IAC5D,MAAM,MAAM,GAAe;QAC1B,cAAc,EAAE,cAAc,CAAC,UAAU;QACzC,IAAI,EAAE,aAAa,CAAC,UAAU,EAAE;QAChC,OAAO,EAAE,aAAa,CAAC,aAAa,EAAE;QACtC,UAAU,EAAE,aAAa,CAAC,aAAa,EAAE;QACzC,OAAO,EAAE,aAAa,CAAC,SAAS,EAAE;QAClC,KAAK,EAAE,aAAa,CAAC,iBAAiB,EAAE;QACxC,SAAS,EAAE,aAAa,CAAC,YAAY,EAAE;QACvC,YAAY,EAAE,aAAa,CAAC,eAAe,EAAE;QAC7C,WAAW,EAAE,aAAa,CAAC,cAAc,EAAE;QAC3C,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B;QACrD,WAAW;QACX,GAAG;KACH,CAAC;IAEF,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { SeverityNumber } from '@opentelemetry/api-logs';
|
|
2
|
+
import { ExportResultCode } from '@opentelemetry/core';
|
|
3
|
+
import { createLogger } from '@agentuity/server';
|
|
4
|
+
/**
|
|
5
|
+
* Console implementation of the LogRecordExporter interface
|
|
6
|
+
*/
|
|
7
|
+
export class ConsoleLogRecordExporter {
|
|
8
|
+
logger;
|
|
9
|
+
/**
|
|
10
|
+
* Creates a new console log record exporter
|
|
11
|
+
*/
|
|
12
|
+
constructor(logLevel) {
|
|
13
|
+
this.logger = createLogger(logLevel, false, process.env.COLOR_SCHEME ?? 'dark');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Exports log records to the console
|
|
17
|
+
*
|
|
18
|
+
* @param logs - The log records to export
|
|
19
|
+
* @param resultCallback - Callback function to report the export result
|
|
20
|
+
*/
|
|
21
|
+
export(logs, resultCallback) {
|
|
22
|
+
for (const log of logs) {
|
|
23
|
+
switch (log.severityNumber) {
|
|
24
|
+
case SeverityNumber.DEBUG:
|
|
25
|
+
this.logger.debug(log.body);
|
|
26
|
+
break;
|
|
27
|
+
case SeverityNumber.INFO:
|
|
28
|
+
this.logger.info(log.body);
|
|
29
|
+
break;
|
|
30
|
+
case SeverityNumber.WARN:
|
|
31
|
+
this.logger.warn(log.body);
|
|
32
|
+
break;
|
|
33
|
+
case SeverityNumber.ERROR:
|
|
34
|
+
this.logger.error(log.body);
|
|
35
|
+
break;
|
|
36
|
+
default:
|
|
37
|
+
this.logger.info(log.body);
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
resultCallback({ code: ExportResultCode.SUCCESS });
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Shuts down the exporter
|
|
45
|
+
*
|
|
46
|
+
* @returns A promise that resolves when shutdown is complete
|
|
47
|
+
*/
|
|
48
|
+
shutdown() {
|
|
49
|
+
return Promise.resolve();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/otel/console.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAqB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE1E,OAAO,EAAoB,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGnE;;GAEG;AACH,MAAM,OAAO,wBAAwB;IACnB,MAAM,CAAS;IAEhC;;OAEG;IACH,YAAY,QAAkB;QAC7B,IAAI,CAAC,MAAM,GAAG,YAAY,CACzB,QAAQ,EACR,KAAK,EACJ,OAAO,CAAC,GAAG,CAAC,YAA4B,IAAI,MAAM,CACnD,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,IAAyB,EAAE,cAA8C;QAC/E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,QAAQ,GAAG,CAAC,cAAc,EAAE,CAAC;gBAC5B,KAAK,cAAc,CAAC,KAAK;oBACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC5B,MAAM;gBACP,KAAK,cAAc,CAAC,IAAI;oBACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC3B,MAAM;gBACP,KAAK,cAAc,CAAC,IAAI;oBACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC3B,MAAM;gBACP,KAAK,cAAc,CAAC,KAAK;oBACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC5B,MAAM;gBACP;oBACC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC3B,MAAM;YACR,CAAC;QACF,CAAC;QACD,cAAc,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACP,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/otel/exporters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { ExportResultCode } from '@opentelemetry/core';
|
|
2
|
+
import { existsSync, appendFileSync, mkdirSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
/**
|
|
6
|
+
* JSONL implementation of the LogRecordExporter interface
|
|
7
|
+
* Writes logs to a timestamped JSONL file
|
|
8
|
+
*/
|
|
9
|
+
export class JSONLLogExporter {
|
|
10
|
+
currentFile = null;
|
|
11
|
+
basePath;
|
|
12
|
+
filePrefix;
|
|
13
|
+
/**
|
|
14
|
+
* Creates a new JSONL log record exporter
|
|
15
|
+
* @param basePath - Directory to store the JSONL files
|
|
16
|
+
*/
|
|
17
|
+
constructor(basePath) {
|
|
18
|
+
this.basePath = basePath;
|
|
19
|
+
this.filePrefix = 'otel-log';
|
|
20
|
+
this.ensureDirectory();
|
|
21
|
+
}
|
|
22
|
+
ensureDirectory() {
|
|
23
|
+
if (!existsSync(this.basePath)) {
|
|
24
|
+
mkdirSync(this.basePath, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
getOrCreateFile() {
|
|
28
|
+
// If current file exists, use it
|
|
29
|
+
if (this.currentFile && existsSync(this.currentFile)) {
|
|
30
|
+
return this.currentFile;
|
|
31
|
+
}
|
|
32
|
+
this.currentFile = join(this.basePath, `${this.filePrefix}-${Date.now()}.${randomUUID()}.jsonl`);
|
|
33
|
+
return this.currentFile;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Exports log records to a JSONL file
|
|
37
|
+
*
|
|
38
|
+
* @param logs - The log records to export
|
|
39
|
+
* @param resultCallback - Callback function to report the export result
|
|
40
|
+
*/
|
|
41
|
+
export(logs, resultCallback) {
|
|
42
|
+
try {
|
|
43
|
+
if (logs.length === 0) {
|
|
44
|
+
resultCallback({ code: ExportResultCode.SUCCESS });
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const file = this.getOrCreateFile();
|
|
48
|
+
const lines = [];
|
|
49
|
+
for (const log of logs) {
|
|
50
|
+
const record = {
|
|
51
|
+
timestamp: log.hrTime,
|
|
52
|
+
observedTimestamp: log.hrTimeObserved,
|
|
53
|
+
severityNumber: log.severityNumber,
|
|
54
|
+
severityText: log.severityText,
|
|
55
|
+
body: log.body,
|
|
56
|
+
attributes: log.attributes,
|
|
57
|
+
resource: log.resource.attributes,
|
|
58
|
+
instrumentationScope: log.instrumentationScope,
|
|
59
|
+
spanContext: log.spanContext,
|
|
60
|
+
};
|
|
61
|
+
lines.push(JSON.stringify(record));
|
|
62
|
+
}
|
|
63
|
+
const payload = `${lines.join('\n')}\n`;
|
|
64
|
+
try {
|
|
65
|
+
appendFileSync(file, payload, 'utf-8');
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
// File may have been deleted, reset and retry once
|
|
69
|
+
const code = err.code;
|
|
70
|
+
if (code === 'ENOENT') {
|
|
71
|
+
this.currentFile = null;
|
|
72
|
+
const newFile = this.getOrCreateFile();
|
|
73
|
+
appendFileSync(newFile, payload, 'utf-8');
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
throw err;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
resultCallback({ code: ExportResultCode.SUCCESS });
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
resultCallback({
|
|
83
|
+
code: ExportResultCode.FAILED,
|
|
84
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Shuts down the exporter
|
|
90
|
+
*
|
|
91
|
+
* @returns A promise that resolves when shutdown is complete
|
|
92
|
+
*/
|
|
93
|
+
async shutdown() {
|
|
94
|
+
this.currentFile = null;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Forces a flush of any pending data
|
|
98
|
+
*/
|
|
99
|
+
async forceFlush() {
|
|
100
|
+
// No-op for file-based exporter as writes are synchronous
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=jsonl-log-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl-log-exporter.js","sourceRoot":"","sources":["../../../src/otel/exporters/jsonl-log-exporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { ExportResultCode } from '@opentelemetry/core';
|
|
2
|
+
import { AggregationTemporality, } from '@opentelemetry/sdk-metrics';
|
|
3
|
+
import { existsSync, appendFileSync, mkdirSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { randomUUID } from 'node:crypto';
|
|
6
|
+
/**
|
|
7
|
+
* JSONL implementation of the PushMetricExporter interface
|
|
8
|
+
* Writes metrics to a timestamped JSONL file
|
|
9
|
+
*/
|
|
10
|
+
export class JSONLMetricExporter {
|
|
11
|
+
currentFile = null;
|
|
12
|
+
basePath;
|
|
13
|
+
filePrefix;
|
|
14
|
+
/**
|
|
15
|
+
* Creates a new JSONL metric exporter
|
|
16
|
+
* @param basePath - Directory to store the JSONL files
|
|
17
|
+
*/
|
|
18
|
+
constructor(basePath) {
|
|
19
|
+
this.basePath = basePath;
|
|
20
|
+
this.filePrefix = 'otel-metric';
|
|
21
|
+
this.ensureDirectory();
|
|
22
|
+
}
|
|
23
|
+
ensureDirectory() {
|
|
24
|
+
if (!existsSync(this.basePath)) {
|
|
25
|
+
mkdirSync(this.basePath, { recursive: true });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
getOrCreateFile() {
|
|
29
|
+
// If current file exists, use it
|
|
30
|
+
if (this.currentFile && existsSync(this.currentFile)) {
|
|
31
|
+
return this.currentFile;
|
|
32
|
+
}
|
|
33
|
+
this.currentFile = join(this.basePath, `${this.filePrefix}-${Date.now()}.${randomUUID()}.jsonl`);
|
|
34
|
+
return this.currentFile;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Exports metrics to a JSONL file
|
|
38
|
+
*
|
|
39
|
+
* @param metrics - The resource metrics to export
|
|
40
|
+
* @param resultCallback - Callback function to report the export result
|
|
41
|
+
*/
|
|
42
|
+
export(metrics, resultCallback) {
|
|
43
|
+
try {
|
|
44
|
+
const file = this.getOrCreateFile();
|
|
45
|
+
const record = {
|
|
46
|
+
resource: metrics.resource.attributes,
|
|
47
|
+
scopeMetrics: metrics.scopeMetrics.map((sm) => ({
|
|
48
|
+
scope: sm.scope,
|
|
49
|
+
metrics: sm.metrics.map((m) => ({
|
|
50
|
+
descriptor: m.descriptor,
|
|
51
|
+
dataPointType: m.dataPointType,
|
|
52
|
+
dataPoints: m.dataPoints,
|
|
53
|
+
aggregationTemporality: m.aggregationTemporality,
|
|
54
|
+
})),
|
|
55
|
+
})),
|
|
56
|
+
};
|
|
57
|
+
const line = JSON.stringify(record) + '\n';
|
|
58
|
+
try {
|
|
59
|
+
appendFileSync(file, line, 'utf-8');
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
// File may have been deleted, reset and retry once
|
|
63
|
+
const code = err.code;
|
|
64
|
+
if (code === 'ENOENT') {
|
|
65
|
+
this.currentFile = null;
|
|
66
|
+
const newFile = this.getOrCreateFile();
|
|
67
|
+
appendFileSync(newFile, line, 'utf-8');
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
resultCallback({ code: ExportResultCode.SUCCESS });
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
resultCallback({
|
|
77
|
+
code: ExportResultCode.FAILED,
|
|
78
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Shuts down the exporter
|
|
84
|
+
*
|
|
85
|
+
* @returns A promise that resolves when shutdown is complete
|
|
86
|
+
*/
|
|
87
|
+
async shutdown() {
|
|
88
|
+
this.currentFile = null;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Forces a flush of any pending data
|
|
92
|
+
*/
|
|
93
|
+
async forceFlush() {
|
|
94
|
+
// No-op for file-based exporter as writes are synchronous
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Selects the aggregation temporality for the given instrument type
|
|
98
|
+
*/
|
|
99
|
+
selectAggregationTemporality(_instrumentType) {
|
|
100
|
+
// Default to cumulative temporality
|
|
101
|
+
return AggregationTemporality.CUMULATIVE;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=jsonl-metric-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl-metric-exporter.js","sourceRoot":"","sources":["../../../src/otel/exporters/jsonl-metric-exporter.ts"],"names":[],"mappings":"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"}
|