@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.
@@ -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 messages: Array<StreamMessage> = []
372
-
373
- return await new Promise<StreamReadResult>((resolve, reject) => {
374
- let settled = false
375
- let unsub = () => {}
376
-
377
- const finish = (r: StreamReadResult) => {
378
- if (settled) return
379
- settled = true
380
- unsub()
381
- resolve(r)
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
- const LOG_DIR = USE_FILE_LOGS
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
- if (LOG_DIR) {
19
- fs.mkdirSync(LOG_DIR, { recursive: true })
20
- }
13
+ function getLogger(): pino.Logger {
14
+ if (_logger) return _logger
21
15
 
22
- export const LOG_FILE_PATH = LOG_FILE
16
+ const streams: Array<pino.StreamEntry> = []
23
17
 
24
- const streams: Array<pino.StreamEntry> = []
25
- if (LOG_FILE) {
26
- streams.push({
27
- stream: pino.destination({
28
- dest: LOG_FILE,
29
- sync: IS_ELECTRON_MAIN,
30
- }),
31
- })
32
- }
33
- if (USE_PRETTY_LOGS) {
34
- streams.push({
35
- stream: pino.transport({
36
- target: `pino-pretty`,
37
- options: {
38
- colorize: true,
39
- ignore: `pid,hostname,name`,
40
- translateTime: `SYS:HH:MM:ss`,
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
- const logger =
47
- streams.length > 0
48
- ? pino(
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
- pino.multistream(streams)
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 a of args) {
65
- if (a instanceof Error) errors.push(a)
66
- else parts.push(typeof a === `string` ? a : JSON.stringify(a))
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
- logger.info(msg)
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) logger.warn({ err }, msg)
83
- else logger.warn(msg)
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) logger.error({ err }, msg)
89
- else logger.error(msg)
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
- logger.info(obj, msg)
104
+ getLogger().info(obj, msg)
94
105
  },
95
106
  }