@electric-ax/agents-server 0.4.12 → 0.4.14
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/entrypoint.js +325 -62
- package/dist/index.cjs +325 -62
- package/dist/index.d.cts +50 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.js +325 -62
- package/package.json +9 -9
- package/src/entity-manager.ts +351 -1
- package/src/routing/durable-streams-router.ts +4 -1
- package/src/routing/entities-router.ts +226 -0
- package/src/routing/stream-append.ts +3 -0
- package/src/stream-client.ts +14 -33
- package/src/utils/log.ts +63 -52
package/src/stream-client.ts
CHANGED
|
@@ -225,7 +225,7 @@ export class StreamClient {
|
|
|
225
225
|
|
|
226
226
|
async create(
|
|
227
227
|
path: string,
|
|
228
|
-
opts: { contentType: string; body?: Uint8Array | string }
|
|
228
|
+
opts: { contentType: string; body?: Uint8Array | string; closed?: boolean }
|
|
229
229
|
): Promise<void> {
|
|
230
230
|
return await withSpan(`stream.create`, async (span) => {
|
|
231
231
|
span.setAttributes({
|
|
@@ -237,6 +237,7 @@ export class StreamClient {
|
|
|
237
237
|
headers: this.streamHeaders(),
|
|
238
238
|
contentType: opts.contentType,
|
|
239
239
|
body: opts.body,
|
|
240
|
+
closed: opts.closed,
|
|
240
241
|
})
|
|
241
242
|
})
|
|
242
243
|
}
|
|
@@ -368,38 +369,18 @@ export class StreamClient {
|
|
|
368
369
|
offset: fromOffset ?? `-1`,
|
|
369
370
|
live: false,
|
|
370
371
|
})
|
|
371
|
-
const
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
unsub = response.subscribeBytes((chunk) => {
|
|
385
|
-
messages.push({
|
|
386
|
-
data: chunk.data,
|
|
387
|
-
offset: chunk.offset,
|
|
388
|
-
})
|
|
389
|
-
if (chunk.upToDate || chunk.streamClosed) {
|
|
390
|
-
finish({ messages })
|
|
391
|
-
}
|
|
392
|
-
})
|
|
393
|
-
|
|
394
|
-
response.closed
|
|
395
|
-
.then(() => finish({ messages }))
|
|
396
|
-
.catch((err) => {
|
|
397
|
-
if (settled) return
|
|
398
|
-
settled = true
|
|
399
|
-
unsub()
|
|
400
|
-
reject(err)
|
|
401
|
-
})
|
|
402
|
-
})
|
|
372
|
+
const body = await response.body()
|
|
373
|
+
return {
|
|
374
|
+
messages:
|
|
375
|
+
body.length === 0
|
|
376
|
+
? []
|
|
377
|
+
: [
|
|
378
|
+
{
|
|
379
|
+
data: body,
|
|
380
|
+
offset: response.offset,
|
|
381
|
+
},
|
|
382
|
+
],
|
|
383
|
+
}
|
|
403
384
|
})
|
|
404
385
|
}
|
|
405
386
|
|
package/src/utils/log.ts
CHANGED
|
@@ -8,62 +8,73 @@ const USE_FILE_LOGS = process.env.ELECTRIC_AGENTS_LOG_FILE !== `false`
|
|
|
8
8
|
const USE_PRETTY_LOGS =
|
|
9
9
|
LOG_LEVEL !== `silent` && !process.env.VITEST && !IS_ELECTRON_MAIN
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
? (process.env.ELECTRIC_AGENTS_LOG_DIR ?? path.resolve(process.cwd(), `logs`))
|
|
13
|
-
: undefined
|
|
14
|
-
const LOG_FILE = LOG_DIR
|
|
15
|
-
? path.join(LOG_DIR, `agent-server-${Date.now()}.jsonl`)
|
|
16
|
-
: undefined
|
|
11
|
+
let _logger: pino.Logger | undefined
|
|
17
12
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
13
|
+
function getLogger(): pino.Logger {
|
|
14
|
+
if (_logger) return _logger
|
|
21
15
|
|
|
22
|
-
|
|
16
|
+
const streams: Array<pino.StreamEntry> = []
|
|
23
17
|
|
|
24
|
-
|
|
25
|
-
if (
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
})
|
|
44
|
-
}
|
|
18
|
+
try {
|
|
19
|
+
if (USE_FILE_LOGS) {
|
|
20
|
+
const logDir =
|
|
21
|
+
process.env.ELECTRIC_AGENTS_LOG_DIR ??
|
|
22
|
+
path.resolve(process.cwd(), `logs`)
|
|
23
|
+
fs.mkdirSync(logDir, { recursive: true })
|
|
24
|
+
const logFile = path.join(logDir, `agent-server-${Date.now()}.jsonl`)
|
|
25
|
+
streams.push({
|
|
26
|
+
stream: pino.destination({
|
|
27
|
+
dest: logFile,
|
|
28
|
+
sync: IS_ELECTRON_MAIN,
|
|
29
|
+
}),
|
|
30
|
+
})
|
|
31
|
+
}
|
|
32
|
+
} catch (err) {
|
|
33
|
+
process.stderr.write(
|
|
34
|
+
`[agents-server] Failed to initialize file logging: ${err instanceof Error ? err.message : err}\n`
|
|
35
|
+
)
|
|
36
|
+
}
|
|
45
37
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
{
|
|
38
|
+
try {
|
|
39
|
+
if (USE_PRETTY_LOGS) {
|
|
40
|
+
streams.push({
|
|
41
|
+
stream: pino.transport({
|
|
42
|
+
target: `pino-pretty`,
|
|
43
|
+
options: {
|
|
44
|
+
colorize: true,
|
|
45
|
+
ignore: `pid,hostname,name`,
|
|
46
|
+
translateTime: `SYS:HH:MM:ss`,
|
|
47
|
+
},
|
|
48
|
+
}),
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
} catch {
|
|
52
|
+
// pino-pretty unavailable — continue without pretty logging
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
_logger =
|
|
56
|
+
streams.length > 0
|
|
57
|
+
? pino(
|
|
58
|
+
{
|
|
59
|
+
base: undefined,
|
|
60
|
+
level: LOG_LEVEL,
|
|
61
|
+
},
|
|
62
|
+
pino.multistream(streams)
|
|
63
|
+
)
|
|
64
|
+
: pino({
|
|
50
65
|
base: undefined,
|
|
66
|
+
enabled: false,
|
|
51
67
|
level: LOG_LEVEL,
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
: pino({
|
|
56
|
-
base: undefined,
|
|
57
|
-
enabled: false,
|
|
58
|
-
level: LOG_LEVEL,
|
|
59
|
-
})
|
|
68
|
+
})
|
|
69
|
+
return _logger
|
|
70
|
+
}
|
|
60
71
|
|
|
61
72
|
function formatArgs(args: Array<unknown>): { err?: Error; msg: string } {
|
|
62
73
|
const errors: Array<Error> = []
|
|
63
74
|
const parts: Array<string> = []
|
|
64
|
-
for (const
|
|
65
|
-
if (
|
|
66
|
-
else parts.push(typeof
|
|
75
|
+
for (const value of args) {
|
|
76
|
+
if (value instanceof Error) errors.push(value)
|
|
77
|
+
else parts.push(typeof value === `string` ? value : JSON.stringify(value))
|
|
67
78
|
}
|
|
68
79
|
return {
|
|
69
80
|
err: errors[0],
|
|
@@ -74,22 +85,22 @@ function formatArgs(args: Array<unknown>): { err?: Error; msg: string } {
|
|
|
74
85
|
export const serverLog = {
|
|
75
86
|
info(...args: Array<unknown>): void {
|
|
76
87
|
const { msg } = formatArgs(args)
|
|
77
|
-
|
|
88
|
+
getLogger().info(msg)
|
|
78
89
|
},
|
|
79
90
|
|
|
80
91
|
warn(...args: Array<unknown>): void {
|
|
81
92
|
const { err, msg } = formatArgs(args)
|
|
82
|
-
if (err)
|
|
83
|
-
else
|
|
93
|
+
if (err) getLogger().warn({ err }, msg)
|
|
94
|
+
else getLogger().warn(msg)
|
|
84
95
|
},
|
|
85
96
|
|
|
86
97
|
error(...args: Array<unknown>): void {
|
|
87
98
|
const { err, msg } = formatArgs(args)
|
|
88
|
-
if (err)
|
|
89
|
-
else
|
|
99
|
+
if (err) getLogger().error({ err }, msg)
|
|
100
|
+
else getLogger().error(msg)
|
|
90
101
|
},
|
|
91
102
|
|
|
92
103
|
event(obj: Record<string, unknown>, msg: string): void {
|
|
93
|
-
|
|
104
|
+
getLogger().info(obj, msg)
|
|
94
105
|
},
|
|
95
106
|
}
|