@descryy/runtime-database-observation 0.4.5 → 0.4.7

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/index.d.ts CHANGED
@@ -9,4 +9,6 @@ export type { PostgresLogQuery } from "./postgres-log-parser.ts";
9
9
  export { parsePostgresLogLine } from "./postgres-log-parser.ts";
10
10
  export type { PostgresQueryCollectorOptions } from "./postgres-query-collector.ts";
11
11
  export { createPostgresQueryCollector } from "./postgres-query-collector.ts";
12
+ export type { PostgresStatementLogSource } from "./postgres-log-source.ts";
13
+ export { createPostgresLogSource } from "./postgres-log-source.ts";
12
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,YAAY,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAEhG,YAAY,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAElE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,YAAY,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,YAAY,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAEhG,YAAY,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAElE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,YAAY,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAE7E,YAAY,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -5,4 +5,5 @@ export { createDatabaseQueryCollector, SQLITE_PRELOAD_MODULE_PATH } from "./quer
5
5
  export { resolveObservedDatabaseQuery } from "./graph-mapping.js";
6
6
  export { parsePostgresLogLine } from "./postgres-log-parser.js";
7
7
  export { createPostgresQueryCollector } from "./postgres-query-collector.js";
8
+ export { createPostgresLogSource } from "./postgres-log-source.js";
8
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,YAAY,EAA2C,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAGhG,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAGlE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGhE,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,YAAY,EAA2C,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAGhG,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAGlE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGhE,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAG7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -13,10 +13,10 @@
13
13
  * a real name).
14
14
  *
15
15
  * Verified against PostgreSQL's own documented log format (`log_statement`,
16
- * `log_line_prefix`), not guessed. **Not live-tested against a running
17
- * Postgres server in this session** — no database credentials were reachable
18
- * in the environment this landed in; disclosed rather than silently assumed
19
- * working. The parser is tested against real, doc-verified log-line syntax.
16
+ * `log_line_prefix`), not guessed, and now also **live-tested against a
17
+ * real `postgres:16` Docker container** producing real `LOG: statement:`
18
+ * lines (`postgres-query-collector.ts`'s `test/postgres-live.test.ts`) —
19
+ * not just doc-verified syntax fed in by hand.
20
20
  *
21
21
  * **Disclosed, deliberate scope, same "refuse rather than guess" rule
22
22
  * `query-line-parser.ts` and `table-extraction.ts` already apply:**
@@ -13,10 +13,10 @@
13
13
  * a real name).
14
14
  *
15
15
  * Verified against PostgreSQL's own documented log format (`log_statement`,
16
- * `log_line_prefix`), not guessed. **Not live-tested against a running
17
- * Postgres server in this session** — no database credentials were reachable
18
- * in the environment this landed in; disclosed rather than silently assumed
19
- * working. The parser is tested against real, doc-verified log-line syntax.
16
+ * `log_line_prefix`), not guessed, and now also **live-tested against a
17
+ * real `postgres:16` Docker container** producing real `LOG: statement:`
18
+ * lines (`postgres-query-collector.ts`'s `test/postgres-live.test.ts`) —
19
+ * not just doc-verified syntax fed in by hand.
20
20
  *
21
21
  * **Disclosed, deliberate scope, same "refuse rather than guess" rule
22
22
  * `query-line-parser.ts` and `table-extraction.ts` already apply:**
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Live sources for Postgres's own statement log (RG-5(b)/(c)) — the piece
3
+ * `postgres-query-collector.ts` consumes but, until now, nothing in this
4
+ * repo produced. Two concrete shapes, matching what a deployment can
5
+ * actually hand this collector:
6
+ *
7
+ * - `{ kind: "file" }` — a log file the operator already writes to
8
+ * (`log_destination = 'stderr'` plus `logging_collector = on`, or any
9
+ * equivalent). Tailed from its current end: pre-existing content is not
10
+ * replayed, only what is appended after this source starts.
11
+ * - `{ kind: "dockerContainer" }` — a Docker container whose own stdout IS
12
+ * the statement log, which is the default for the official `postgres`
13
+ * image (`log_statement = 'all'` logs to stdout, not a file, unless
14
+ * `logging_collector` is turned on). Followed via `docker logs -f
15
+ * --since <when this source was created> <container>` — nothing from
16
+ * before the channel started, and nothing lost between the channel
17
+ * starting and the follower attaching. `--tail 0` (the first version)
18
+ * began at the moment of attach instead; the source is lazy, so that
19
+ * moment is whenever the collector first reads, and a query issued in
20
+ * between — often the application's first request — was silently missed
21
+ * (found as an intermittent failure of the desktop's Postgres end-to-end
22
+ * test under load). The boundary uses the docker daemon's own log
23
+ * timestamps against this host's clock, so it assumes a local daemon.
24
+ *
25
+ * **Never turns logging on.** `log_statement` is the operator's own
26
+ * setting; this module only reads whatever a deployment already produces.
27
+ * Its callers are what disclose "database channel: not observed" when
28
+ * neither shape is configured — this module has no opinion on that, it
29
+ * only knows how to tail a source once one is named.
30
+ *
31
+ * Both branches accept an optional `AbortSignal` so a caller can end a
32
+ * live tail deterministically: the docker branch kills the `docker logs
33
+ * -f` child (which ends its stdout, which ends the async iterable, which
34
+ * is what lets `PostgresQueryCollector.stop()` — which just awaits its
35
+ * consume loop finishing — ever resolve for a source that would otherwise
36
+ * run forever); the file branch checks the signal between polls.
37
+ */
38
+ import { type ProcessOutputSource } from "@descryy/runtime-backend-observation";
39
+ export type PostgresStatementLogSource = {
40
+ readonly kind: "file";
41
+ readonly path: string;
42
+ } | {
43
+ readonly kind: "dockerContainer";
44
+ readonly container: string;
45
+ };
46
+ /**
47
+ * Builds the `ProcessOutputSource` `createPostgresQueryCollector` consumes,
48
+ * over whichever statement-log shape a caller configured. `serviceName`
49
+ * follows `ProcessOutputSource`'s own required-not-optional contract —
50
+ * `null` is a real statement ("no declared service"), never an omission.
51
+ */
52
+ export declare function createPostgresLogSource(logSource: PostgresStatementLogSource, processId: string, serviceName: string | null, options?: {
53
+ readonly signal?: AbortSignal;
54
+ }): ProcessOutputSource;
55
+ //# sourceMappingURL=postgres-log-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-log-source.d.ts","sourceRoot":"","sources":["../src/postgres-log-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAIH,OAAO,EAAwC,KAAK,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAEtH,MAAM,MAAM,0BAA0B,GAClC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AA+GrE;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,0BAA0B,EACrC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAC1C,mBAAmB,CAUrB"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Live sources for Postgres's own statement log (RG-5(b)/(c)) — the piece
3
+ * `postgres-query-collector.ts` consumes but, until now, nothing in this
4
+ * repo produced. Two concrete shapes, matching what a deployment can
5
+ * actually hand this collector:
6
+ *
7
+ * - `{ kind: "file" }` — a log file the operator already writes to
8
+ * (`log_destination = 'stderr'` plus `logging_collector = on`, or any
9
+ * equivalent). Tailed from its current end: pre-existing content is not
10
+ * replayed, only what is appended after this source starts.
11
+ * - `{ kind: "dockerContainer" }` — a Docker container whose own stdout IS
12
+ * the statement log, which is the default for the official `postgres`
13
+ * image (`log_statement = 'all'` logs to stdout, not a file, unless
14
+ * `logging_collector` is turned on). Followed via `docker logs -f
15
+ * --since <when this source was created> <container>` — nothing from
16
+ * before the channel started, and nothing lost between the channel
17
+ * starting and the follower attaching. `--tail 0` (the first version)
18
+ * began at the moment of attach instead; the source is lazy, so that
19
+ * moment is whenever the collector first reads, and a query issued in
20
+ * between — often the application's first request — was silently missed
21
+ * (found as an intermittent failure of the desktop's Postgres end-to-end
22
+ * test under load). The boundary uses the docker daemon's own log
23
+ * timestamps against this host's clock, so it assumes a local daemon.
24
+ *
25
+ * **Never turns logging on.** `log_statement` is the operator's own
26
+ * setting; this module only reads whatever a deployment already produces.
27
+ * Its callers are what disclose "database channel: not observed" when
28
+ * neither shape is configured — this module has no opinion on that, it
29
+ * only knows how to tail a source once one is named.
30
+ *
31
+ * Both branches accept an optional `AbortSignal` so a caller can end a
32
+ * live tail deterministically: the docker branch kills the `docker logs
33
+ * -f` child (which ends its stdout, which ends the async iterable, which
34
+ * is what lets `PostgresQueryCollector.stop()` — which just awaits its
35
+ * consume loop finishing — ever resolve for a source that would otherwise
36
+ * run forever); the file branch checks the signal between polls.
37
+ */
38
+ import { spawn } from "node:child_process";
39
+ import { readFile, stat } from "node:fs/promises";
40
+ import { LineSplitter } from "@descryy/runtime-backend-observation";
41
+ const FILE_POLL_INTERVAL_MS = 200;
42
+ function sleep(ms) {
43
+ return new Promise((resolve) => setTimeout(resolve, ms));
44
+ }
45
+ async function* tailFile(path, signal) {
46
+ let offset;
47
+ try {
48
+ offset = (await stat(path)).size;
49
+ }
50
+ catch {
51
+ offset = 0;
52
+ }
53
+ const splitter = new LineSplitter();
54
+ while (signal?.aborted !== true) {
55
+ let size;
56
+ try {
57
+ size = (await stat(path)).size;
58
+ }
59
+ catch {
60
+ await sleep(FILE_POLL_INTERVAL_MS);
61
+ continue;
62
+ }
63
+ if (size > offset) {
64
+ const buffer = await readFile(path);
65
+ const chunk = buffer.subarray(offset).toString("utf8");
66
+ offset = size;
67
+ const observedAt = new Date().toISOString();
68
+ for (const text of splitter.push(chunk)) {
69
+ yield { text, stream: "combined", observedAt };
70
+ }
71
+ }
72
+ await sleep(FILE_POLL_INTERVAL_MS);
73
+ }
74
+ }
75
+ /**
76
+ * Merges `docker logs -f`'s own stdout and stderr into one line stream.
77
+ *
78
+ * **Both, deliberately.** The official Postgres image's default
79
+ * `log_destination = 'stderr'` means its statement log arrives on the
80
+ * *container's* stderr — which `docker logs` relays on its own stderr fd,
81
+ * not stdout. Reading stdout alone (the first version of this function)
82
+ * measurably captured nothing against a real container; this was found by
83
+ * running it, not reasoned from documentation.
84
+ *
85
+ * Not a `for await` over either stream directly: iterating two independent
86
+ * readables in that style serialises them (fully drain one before touching
87
+ * the other), which would reorder-and-delay whichever stream is read
88
+ * second. This uses `data` events on both instead, queued in arrival order
89
+ * — the same "no true cross-stream ordering guarantee" disclosure
90
+ * `process-output.ts`'s own header already states for `ManagedProcess`.
91
+ */
92
+ async function* tailDockerContainer(container, since, signal) {
93
+ const child = spawn("docker", ["logs", "-f", "--since", since.toISOString(), container], {
94
+ stdio: ["ignore", "pipe", "pipe"],
95
+ ...(signal === undefined ? {} : { signal }),
96
+ });
97
+ const splitter = new LineSplitter();
98
+ const queue = [];
99
+ let waiter = null;
100
+ let done = false;
101
+ function wake() {
102
+ if (waiter !== null) {
103
+ const resolve = waiter;
104
+ waiter = null;
105
+ resolve();
106
+ }
107
+ }
108
+ function onChunk(chunk) {
109
+ queue.push(chunk.toString("utf8"));
110
+ wake();
111
+ }
112
+ function onDone() {
113
+ done = true;
114
+ wake();
115
+ }
116
+ child.stdout.on("data", onChunk);
117
+ child.stderr.on("data", onChunk);
118
+ child.once("close", onDone);
119
+ // An aborted signal kills the child, which surfaces as an 'error' event on
120
+ // the ChildProcess itself (not either stream) -- swallowed here, because
121
+ // `onDone` (via 'close', which always follows) is this generator's real
122
+ // end signal, and an unhandled 'error' event would otherwise crash the
123
+ // process.
124
+ child.on("error", () => undefined);
125
+ try {
126
+ for (;;) {
127
+ while (queue.length > 0) {
128
+ const chunk = queue.shift();
129
+ const observedAt = new Date().toISOString();
130
+ for (const text of splitter.push(chunk)) {
131
+ yield { text, stream: "combined", observedAt };
132
+ }
133
+ }
134
+ if (done)
135
+ return;
136
+ await new Promise((resolve) => {
137
+ waiter = resolve;
138
+ });
139
+ }
140
+ }
141
+ finally {
142
+ child.stdout.off("data", onChunk);
143
+ child.stderr.off("data", onChunk);
144
+ if (child.exitCode === null && child.signalCode === null)
145
+ child.kill();
146
+ }
147
+ }
148
+ /**
149
+ * Builds the `ProcessOutputSource` `createPostgresQueryCollector` consumes,
150
+ * over whichever statement-log shape a caller configured. `serviceName`
151
+ * follows `ProcessOutputSource`'s own required-not-optional contract —
152
+ * `null` is a real statement ("no declared service"), never an omission.
153
+ */
154
+ export function createPostgresLogSource(logSource, processId, serviceName, options) {
155
+ // Taken here, eagerly, not inside the generator: the generator does not run
156
+ // until the collector first reads, and that delay is the window `--since`
157
+ // exists to close.
158
+ const startedAt = new Date();
159
+ const lines = logSource.kind === "file"
160
+ ? tailFile(logSource.path, options?.signal)
161
+ : tailDockerContainer(logSource.container, startedAt, options?.signal);
162
+ return { processId, serviceName, lines };
163
+ }
164
+ //# sourceMappingURL=postgres-log-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-log-source.js","sourceRoot":"","sources":["../src/postgres-log-source.ts"],"names":[],"mappings":"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"}
@@ -16,9 +16,15 @@
16
16
  * this collector does not add. See `packages/database-observation`'s
17
17
  * package description for the same disclosure on the `node:sqlite` path.
18
18
  *
19
- * **Not live-tested against a running Postgres server** — see
20
- * `postgres-log-parser.ts`'s own header for why, and what was tested instead
21
- * (the parser, against real documented log-line syntax).
19
+ * **Live-tested against a real, disposable `postgres:16` Docker container**
20
+ * (`test/postgres-live.test.ts`): a real `INSERT`/`SELECT` issued via
21
+ * `psql` inside the container, its statement log tailed via
22
+ * `createPostgresLogSource`'s `dockerContainer` source (`docker logs -f`),
23
+ * and a real `DATABASE_QUERY` record read back out. Found in the process:
24
+ * the official image's default `log_destination = 'stderr'` means the
25
+ * statement log arrives on the container's stderr, which `docker logs`
26
+ * relays on its own stderr fd — a stdout-only tail captured nothing against
27
+ * the real thing. Skips with a named reason when Docker is unavailable.
22
28
  */
23
29
  import type { Collector } from "@descryy/runtime-contracts";
24
30
  import { type ProcessOutputSource } from "@descryy/runtime-backend-observation";
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-query-collector.d.ts","sourceRoot":"","sources":["../src/postgres-query-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAmF,MAAM,4BAA4B,CAAC;AAC7I,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAMvG,MAAM,WAAW,6BAA6B;IAC5C,+HAA+H;IAC/H,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,mHAAmH;IACnH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AA2BD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,6BAA6B,GAAG,SAAS,CA6F9F"}
1
+ {"version":3,"file":"postgres-query-collector.d.ts","sourceRoot":"","sources":["../src/postgres-query-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAmF,MAAM,4BAA4B,CAAC;AAC7I,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAMvG,MAAM,WAAW,6BAA6B;IAC5C,+HAA+H;IAC/H,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,mHAAmH;IACnH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AA2BD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,6BAA6B,GAAG,SAAS,CA6F9F"}
@@ -16,9 +16,15 @@
16
16
  * this collector does not add. See `packages/database-observation`'s
17
17
  * package description for the same disclosure on the `node:sqlite` path.
18
18
  *
19
- * **Not live-tested against a running Postgres server** — see
20
- * `postgres-log-parser.ts`'s own header for why, and what was tested instead
21
- * (the parser, against real documented log-line syntax).
19
+ * **Live-tested against a real, disposable `postgres:16` Docker container**
20
+ * (`test/postgres-live.test.ts`): a real `INSERT`/`SELECT` issued via
21
+ * `psql` inside the container, its statement log tailed via
22
+ * `createPostgresLogSource`'s `dockerContainer` source (`docker logs -f`),
23
+ * and a real `DATABASE_QUERY` record read back out. Found in the process:
24
+ * the official image's default `log_destination = 'stderr'` means the
25
+ * statement log arrives on the container's stderr, which `docker logs`
26
+ * relays on its own stderr fd — a stdout-only tail captured nothing against
27
+ * the real thing. Skips with a named reason when Docker is unavailable.
22
28
  */
23
29
  import { extractCorrelationIds } from "@descryy/runtime-backend-observation";
24
30
  import { parsePostgresLogLine } from "./postgres-log-parser.js";
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-query-collector.js","sourceRoot":"","sources":["../src/postgres-query-collector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgres-query-collector.js","sourceRoot":"","sources":["../src/postgres-query-collector.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@descryy/runtime-database-observation",
3
- "version": "0.4.5",
3
+ "version": "0.4.7",
4
4
  "type": "module",
5
5
  "description": "Database query observation (plan §18, checklist §14): real DATABASE_QUERY capture via driver instrumentation, never parsed application logs. Driver #1 is node:sqlite.",
6
6
  "license": "UNLICENSED",
@@ -29,12 +29,12 @@
29
29
  "build": "tsc -b"
30
30
  },
31
31
  "dependencies": {
32
- "@descryy/runtime-contracts": "0.3.1",
33
- "@descryy/runtime-backend-observation": "0.3.4",
34
- "@descryy/runtime-graph-correlator": "0.4.5"
32
+ "@descryy/runtime-contracts": "0.3.3",
33
+ "@descryy/runtime-backend-observation": "0.3.6",
34
+ "@descryy/runtime-graph-correlator": "0.4.7"
35
35
  },
36
36
  "devDependencies": {
37
- "@descryy/runtime-controller": "0.3.4",
38
- "@descryy/runtime-orchestrator": "0.4.5"
37
+ "@descryy/runtime-controller": "0.3.6",
38
+ "@descryy/runtime-orchestrator": "0.4.7"
39
39
  }
40
40
  }