@adonis-agora/telescope 0.3.3 → 0.5.0
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/CHANGELOG.md +10 -0
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +6 -0
- package/dist/configure.js.map +1 -1
- package/dist/providers/telescope_ai_provider.d.ts +9 -1
- package/dist/providers/telescope_ai_provider.d.ts.map +1 -1
- package/dist/providers/telescope_ai_provider.js +22 -2
- package/dist/providers/telescope_ai_provider.js.map +1 -1
- package/dist/providers/telescope_alerts_provider.d.ts +1 -0
- package/dist/providers/telescope_alerts_provider.d.ts.map +1 -1
- package/dist/providers/telescope_alerts_provider.js +37 -1
- package/dist/providers/telescope_alerts_provider.js.map +1 -1
- package/dist/providers/telescope_mcp_provider.d.ts +26 -0
- package/dist/providers/telescope_mcp_provider.d.ts.map +1 -0
- package/dist/providers/telescope_mcp_provider.js +114 -0
- package/dist/providers/telescope_mcp_provider.js.map +1 -0
- package/dist/providers/telescope_provider.d.ts +8 -0
- package/dist/providers/telescope_provider.d.ts.map +1 -1
- package/dist/providers/telescope_provider.js +56 -1
- package/dist/providers/telescope_provider.js.map +1 -1
- package/dist/providers/telescope_ui_provider.d.ts +2 -0
- package/dist/providers/telescope_ui_provider.d.ts.map +1 -1
- package/dist/providers/telescope_ui_provider.js +106 -22
- package/dist/providers/telescope_ui_provider.js.map +1 -1
- package/dist/providers/telescope_watchers_provider.d.ts +13 -2
- package/dist/providers/telescope_watchers_provider.d.ts.map +1 -1
- package/dist/providers/telescope_watchers_provider.js +57 -7
- package/dist/providers/telescope_watchers_provider.js.map +1 -1
- package/dist/src/ai/define_config.d.ts +39 -7
- package/dist/src/ai/define_config.d.ts.map +1 -1
- package/dist/src/ai/define_config.js +14 -4
- package/dist/src/ai/define_config.js.map +1 -1
- package/dist/src/ai/diagnosis_coordinator.d.ts +106 -0
- package/dist/src/ai/diagnosis_coordinator.d.ts.map +1 -0
- package/dist/src/ai/diagnosis_coordinator.js +143 -0
- package/dist/src/ai/diagnosis_coordinator.js.map +1 -0
- package/dist/src/ai/factory.d.ts +8 -5
- package/dist/src/ai/factory.d.ts.map +1 -1
- package/dist/src/ai/factory.js +20 -8
- package/dist/src/ai/factory.js.map +1 -1
- package/dist/src/ai/index.d.ts +3 -1
- package/dist/src/ai/index.d.ts.map +1 -1
- package/dist/src/ai/index.js +3 -1
- package/dist/src/ai/index.js.map +1 -1
- package/dist/src/alerts/alert_rule.d.ts +79 -11
- package/dist/src/alerts/alert_rule.d.ts.map +1 -1
- package/dist/src/alerts/alerter.d.ts +11 -1
- package/dist/src/alerts/alerter.d.ts.map +1 -1
- package/dist/src/alerts/alerter.js +21 -1
- package/dist/src/alerts/alerter.js.map +1 -1
- package/dist/src/alerts/alerter_service.d.ts +103 -0
- package/dist/src/alerts/alerter_service.d.ts.map +1 -0
- package/dist/src/alerts/alerter_service.js +215 -0
- package/dist/src/alerts/alerter_service.js.map +1 -0
- package/dist/src/alerts/index.d.ts +4 -2
- package/dist/src/alerts/index.d.ts.map +1 -1
- package/dist/src/alerts/index.js +4 -2
- package/dist/src/alerts/index.js.map +1 -1
- package/dist/src/alerts/slack_format.d.ts.map +1 -1
- package/dist/src/alerts/slack_format.js +35 -2
- package/dist/src/alerts/slack_format.js.map +1 -1
- package/dist/src/client_errors/config.d.ts +66 -0
- package/dist/src/client_errors/config.d.ts.map +1 -0
- package/dist/src/client_errors/config.js +17 -0
- package/dist/src/client_errors/config.js.map +1 -0
- package/dist/src/client_errors/index.d.ts +5 -0
- package/dist/src/client_errors/index.d.ts.map +1 -0
- package/dist/src/client_errors/index.js +5 -0
- package/dist/src/client_errors/index.js.map +1 -0
- package/dist/src/client_errors/ingestor.d.ts +87 -0
- package/dist/src/client_errors/ingestor.d.ts.map +1 -0
- package/dist/src/client_errors/ingestor.js +135 -0
- package/dist/src/client_errors/ingestor.js.map +1 -0
- package/dist/src/client_errors/rate_limiter.d.ts +53 -0
- package/dist/src/client_errors/rate_limiter.d.ts.map +1 -0
- package/dist/src/client_errors/rate_limiter.js +83 -0
- package/dist/src/client_errors/rate_limiter.js.map +1 -0
- package/dist/src/client_errors/validation.d.ts +62 -0
- package/dist/src/client_errors/validation.d.ts.map +1 -0
- package/dist/src/client_errors/validation.js +109 -0
- package/dist/src/client_errors/validation.js.map +1 -0
- package/dist/src/define_config.d.ts +120 -0
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js +41 -0
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/entry.d.ts +20 -0
- package/dist/src/entry.d.ts.map +1 -1
- package/dist/src/entry.js +20 -0
- package/dist/src/entry.js.map +1 -1
- package/dist/src/index.d.ts +17 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +16 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/define_config.d.ts +57 -0
- package/dist/src/mcp/define_config.d.ts.map +1 -0
- package/dist/src/mcp/define_config.js +35 -0
- package/dist/src/mcp/define_config.js.map +1 -0
- package/dist/src/mcp/index.d.ts +7 -0
- package/dist/src/mcp/index.d.ts.map +1 -0
- package/dist/src/mcp/index.js +7 -0
- package/dist/src/mcp/index.js.map +1 -0
- package/dist/src/mcp/server.d.ts +89 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +279 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/metrics/pulse.d.ts +158 -0
- package/dist/src/metrics/pulse.d.ts.map +1 -0
- package/dist/src/metrics/pulse.js +414 -0
- package/dist/src/metrics/pulse.js.map +1 -0
- package/dist/src/overload_guard.d.ts +77 -0
- package/dist/src/overload_guard.d.ts.map +1 -0
- package/dist/src/overload_guard.js +134 -0
- package/dist/src/overload_guard.js.map +1 -0
- package/dist/src/pruner.d.ts +93 -0
- package/dist/src/pruner.d.ts.map +1 -0
- package/dist/src/pruner.js +120 -0
- package/dist/src/pruner.js.map +1 -0
- package/dist/src/registry.d.ts +26 -0
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/registry.js +19 -0
- package/dist/src/registry.js.map +1 -1
- package/dist/src/service.d.ts +16 -1
- package/dist/src/service.d.ts.map +1 -1
- package/dist/src/service.js +19 -1
- package/dist/src/service.js.map +1 -1
- package/dist/src/stores/lucid.d.ts +20 -0
- package/dist/src/stores/lucid.d.ts.map +1 -1
- package/dist/src/stores/lucid.js +89 -4
- package/dist/src/stores/lucid.js.map +1 -1
- package/dist/src/telescope_middleware.d.ts.map +1 -1
- package/dist/src/telescope_middleware.js +3 -1
- package/dist/src/telescope_middleware.js.map +1 -1
- package/dist/src/ui/api.d.ts +9 -1
- package/dist/src/ui/api.d.ts.map +1 -1
- package/dist/src/ui/api.js +23 -1
- package/dist/src/ui/api.js.map +1 -1
- package/dist/src/ui/auth.d.ts +112 -0
- package/dist/src/ui/auth.d.ts.map +1 -0
- package/dist/src/ui/auth.js +130 -0
- package/dist/src/ui/auth.js.map +1 -0
- package/dist/src/ui/dashboard_auth.d.ts +34 -0
- package/dist/src/ui/dashboard_auth.d.ts.map +1 -0
- package/dist/src/ui/dashboard_auth.js +57 -0
- package/dist/src/ui/dashboard_auth.js.map +1 -0
- package/dist/src/ui/define_config.d.ts +15 -0
- package/dist/src/ui/define_config.d.ts.map +1 -1
- package/dist/src/ui/define_config.js +4 -0
- package/dist/src/ui/define_config.js.map +1 -1
- package/dist/src/ui/index.d.ts +7 -1
- package/dist/src/ui/index.d.ts.map +1 -1
- package/dist/src/ui/index.js +6 -1
- package/dist/src/ui/index.js.map +1 -1
- package/dist/src/ui/login_page.d.ts +23 -0
- package/dist/src/ui/login_page.d.ts.map +1 -0
- package/dist/src/ui/login_page.js +170 -0
- package/dist/src/ui/login_page.js.map +1 -0
- package/dist/src/ui/session_cookie.d.ts +42 -0
- package/dist/src/ui/session_cookie.d.ts.map +1 -0
- package/dist/src/ui/session_cookie.js +97 -0
- package/dist/src/ui/session_cookie.js.map +1 -0
- package/dist/src/watchers/define_config.d.ts +115 -12
- package/dist/src/watchers/define_config.d.ts.map +1 -1
- package/dist/src/watchers/define_config.js +48 -11
- package/dist/src/watchers/define_config.js.map +1 -1
- package/dist/src/watchers/http_client_watcher.d.ts +91 -31
- package/dist/src/watchers/http_client_watcher.d.ts.map +1 -1
- package/dist/src/watchers/http_client_watcher.js +161 -53
- package/dist/src/watchers/http_client_watcher.js.map +1 -1
- package/dist/src/watchers/index.d.ts +9 -5
- package/dist/src/watchers/index.d.ts.map +1 -1
- package/dist/src/watchers/index.js +6 -2
- package/dist/src/watchers/index.js.map +1 -1
- package/dist/src/watchers/lucid_query_watcher.d.ts +20 -2
- package/dist/src/watchers/lucid_query_watcher.d.ts.map +1 -1
- package/dist/src/watchers/lucid_query_watcher.js +44 -10
- package/dist/src/watchers/lucid_query_watcher.js.map +1 -1
- package/dist/src/watchers/profiling_watcher.d.ts +144 -0
- package/dist/src/watchers/profiling_watcher.d.ts.map +1 -0
- package/dist/src/watchers/profiling_watcher.js +231 -0
- package/dist/src/watchers/profiling_watcher.js.map +1 -0
- package/dist/src/watchers/query_family_hash.d.ts +7 -2
- package/dist/src/watchers/query_family_hash.d.ts.map +1 -1
- package/dist/src/watchers/query_family_hash.js +8 -3
- package/dist/src/watchers/query_family_hash.js.map +1 -1
- package/dist/src/watchers/record.d.ts.map +1 -1
- package/dist/src/watchers/record.js +4 -0
- package/dist/src/watchers/record.js.map +1 -1
- package/dist/src/watchers/schedule_watcher.d.ts +143 -0
- package/dist/src/watchers/schedule_watcher.d.ts.map +1 -0
- package/dist/src/watchers/schedule_watcher.js +195 -0
- package/dist/src/watchers/schedule_watcher.js.map +1 -0
- package/dist/stubs/config/telescope.stub +0 -65
- package/dist/stubs/config/telescope_ai.stub +0 -36
- package/dist/stubs/config/telescope_alerts.stub +0 -47
- package/dist/stubs/config/telescope_mcp.stub +0 -0
- package/dist/stubs/config/telescope_ui.stub +0 -53
- package/dist/stubs/config/telescope_watchers.stub +0 -41
- package/dist/stubs/database/migrations/create_telescope_entries_table.stub +2 -2
- package/package.json +12 -2
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { ResolvedTelescopeConfig } from './define_config.js';
|
|
2
|
+
import type { TelescopeStore } from './store.js';
|
|
3
|
+
/** What kicked off a prune cycle: the interval timer, or an on-demand request. */
|
|
4
|
+
export type PruneTrigger = 'scheduled' | 'manual';
|
|
5
|
+
/**
|
|
6
|
+
* One recorded prune cycle, kept in an in-memory ring buffer on the pruner so a
|
|
7
|
+
* future dashboard can show retention activity. Prune runs are deliberately NOT
|
|
8
|
+
* stored as telescope entries — they would be pruned themselves and add write
|
|
9
|
+
* load to the very store retention is meant to shrink.
|
|
10
|
+
*/
|
|
11
|
+
export interface PruneRun {
|
|
12
|
+
/** ISO timestamp when the cycle started. */
|
|
13
|
+
at: string;
|
|
14
|
+
trigger: PruneTrigger;
|
|
15
|
+
/** Wall-clock duration of the whole cycle. */
|
|
16
|
+
durationMs: number;
|
|
17
|
+
/** Number of entries deleted this cycle. */
|
|
18
|
+
deletedTotal: number;
|
|
19
|
+
/** The step error message captured this cycle, if the delete threw (swallowed + logged). */
|
|
20
|
+
error?: string;
|
|
21
|
+
}
|
|
22
|
+
/** The resolved pruner slice of the telescope config. */
|
|
23
|
+
export type ResolvedPruneConfig = ResolvedTelescopeConfig['prune'];
|
|
24
|
+
/** A monotonic-ish wall clock, injectable so time-based pruning is testable. */
|
|
25
|
+
export interface Clock {
|
|
26
|
+
now(): number;
|
|
27
|
+
}
|
|
28
|
+
/** The sink for the pruner's operational warnings. Defaults to `console`. */
|
|
29
|
+
export interface PrunerLogger {
|
|
30
|
+
warn(message: string): void;
|
|
31
|
+
}
|
|
32
|
+
/** Constructor seams for {@link TelescopePruner} (clock + logger), all optional. */
|
|
33
|
+
export interface PrunerDeps {
|
|
34
|
+
clock?: Clock;
|
|
35
|
+
logger?: PrunerLogger;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Background retention for a {@link TelescopeStore}. On a timer (and on demand via
|
|
39
|
+
* {@link pruneNow}) it deletes entries older than the configured cutoff, optionally
|
|
40
|
+
* keeping the newest `keepLast` — so the store never grows without bound.
|
|
41
|
+
*
|
|
42
|
+
* Ported from `nestjs-telescope`'s `TelescopePruner`, trimmed to this headless
|
|
43
|
+
* slice: a single global cutoff (the store contract exposes one `prune`, with no
|
|
44
|
+
* per-type/`pruneScoped` variant yet — see DEFERRED), plus the recent-runs ring
|
|
45
|
+
* buffer and the fire-and-forget, never-throw scheduling that keeps a slow or
|
|
46
|
+
* failing store from ever crashing the host.
|
|
47
|
+
*/
|
|
48
|
+
export declare class TelescopePruner {
|
|
49
|
+
private readonly store;
|
|
50
|
+
private readonly config;
|
|
51
|
+
private timer;
|
|
52
|
+
/** Recent prune cycles, newest-first, capped at {@link MAX_PRUNE_RUNS}. */
|
|
53
|
+
private readonly runs;
|
|
54
|
+
/** Start time (epoch ms) of the most recent SCHEDULED cycle, for nextRunAt. */
|
|
55
|
+
private lastScheduledRunAtMs;
|
|
56
|
+
private readonly clock;
|
|
57
|
+
private readonly logger;
|
|
58
|
+
constructor(store: TelescopeStore, config: ResolvedPruneConfig, deps?: PrunerDeps);
|
|
59
|
+
/**
|
|
60
|
+
* Arm the interval timer. A no-op when pruning is disabled or already started.
|
|
61
|
+
* The timer is unref'd so it never keeps the host's event loop alive, and every
|
|
62
|
+
* cycle is fire-and-forget with a final catch so a rejection can never become an
|
|
63
|
+
* unhandled rejection or crash the host.
|
|
64
|
+
*/
|
|
65
|
+
start(): void;
|
|
66
|
+
/** Stop the interval timer (called by the provider at shutdown). */
|
|
67
|
+
stop(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Run ONE prune cycle on demand (e.g. a future dashboard's "Prune now"),
|
|
70
|
+
* recording it as a `manual` run. Resolves to the number of entries deleted.
|
|
71
|
+
*/
|
|
72
|
+
pruneNow(): Promise<number>;
|
|
73
|
+
/** Recent prune runs (newest-first), copied so callers can't mutate the ring. */
|
|
74
|
+
getRuns(): PruneRun[];
|
|
75
|
+
/**
|
|
76
|
+
* Predicted next SCHEDULED prune time (epoch ms), or null when pruning is
|
|
77
|
+
* disabled. Derived from the last scheduled run's start + the interval, falling
|
|
78
|
+
* back to now + interval before the first cycle has run.
|
|
79
|
+
*/
|
|
80
|
+
getNextRunAtMs(): number | null;
|
|
81
|
+
/**
|
|
82
|
+
* One prune tick: delete everything older than `now - afterMs`, keeping the
|
|
83
|
+
* newest `keepLast` of the doomed set when configured. The delete is guarded so
|
|
84
|
+
* a throwing/slow store is captured on the run and never propagates.
|
|
85
|
+
*/
|
|
86
|
+
private runCycle;
|
|
87
|
+
/**
|
|
88
|
+
* Append a run to the newest-first ring buffer, evicting the oldest past the
|
|
89
|
+
* cap. Recording must NEVER throw into the prune path, so it is fully guarded.
|
|
90
|
+
*/
|
|
91
|
+
private recordRun;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=pruner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pruner.d.ts","sourceRoot":"","sources":["../../src/pruner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,kFAAkF;AAClF,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;AAElD;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,4CAA4C;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,YAAY,CAAC;IACtB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,yDAAyD;AACzD,MAAM,MAAM,mBAAmB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAEnE,gFAAgF;AAChF,MAAM,WAAW,KAAK;IACpB,GAAG,IAAI,MAAM,CAAC;CACf;AAED,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,oFAAoF;AACpF,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IAUxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,CAAC,KAAK,CAA+C;IAC5D,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IACvC,+EAA+E;IAC/E,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAGnB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,mBAAmB,EAC5C,IAAI,GAAE,UAAe;IAMvB;;;;;OAKG;IACH,KAAK,IAAI,IAAI;IAUb,oEAAoE;IACpE,IAAI,IAAI,IAAI;IAOZ;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAIjC,iFAAiF;IACjF,OAAO,IAAI,QAAQ,EAAE;IAIrB;;;;OAIG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAK/B;;;;OAIG;YACW,QAAQ;IAuBtB;;;OAGG;IACH,OAAO,CAAC,SAAS;CAQlB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/** Ring-buffer cap for recent prune runs (newest-first). */
|
|
2
|
+
const MAX_PRUNE_RUNS = 100;
|
|
3
|
+
/**
|
|
4
|
+
* Background retention for a {@link TelescopeStore}. On a timer (and on demand via
|
|
5
|
+
* {@link pruneNow}) it deletes entries older than the configured cutoff, optionally
|
|
6
|
+
* keeping the newest `keepLast` — so the store never grows without bound.
|
|
7
|
+
*
|
|
8
|
+
* Ported from `nestjs-telescope`'s `TelescopePruner`, trimmed to this headless
|
|
9
|
+
* slice: a single global cutoff (the store contract exposes one `prune`, with no
|
|
10
|
+
* per-type/`pruneScoped` variant yet — see DEFERRED), plus the recent-runs ring
|
|
11
|
+
* buffer and the fire-and-forget, never-throw scheduling that keeps a slow or
|
|
12
|
+
* failing store from ever crashing the host.
|
|
13
|
+
*/
|
|
14
|
+
export class TelescopePruner {
|
|
15
|
+
store;
|
|
16
|
+
config;
|
|
17
|
+
timer = null;
|
|
18
|
+
/** Recent prune cycles, newest-first, capped at {@link MAX_PRUNE_RUNS}. */
|
|
19
|
+
runs = [];
|
|
20
|
+
/** Start time (epoch ms) of the most recent SCHEDULED cycle, for nextRunAt. */
|
|
21
|
+
lastScheduledRunAtMs = null;
|
|
22
|
+
clock;
|
|
23
|
+
logger;
|
|
24
|
+
constructor(store, config, deps = {}) {
|
|
25
|
+
this.store = store;
|
|
26
|
+
this.config = config;
|
|
27
|
+
this.clock = deps.clock ?? Date;
|
|
28
|
+
this.logger = deps.logger ?? console;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Arm the interval timer. A no-op when pruning is disabled or already started.
|
|
32
|
+
* The timer is unref'd so it never keeps the host's event loop alive, and every
|
|
33
|
+
* cycle is fire-and-forget with a final catch so a rejection can never become an
|
|
34
|
+
* unhandled rejection or crash the host.
|
|
35
|
+
*/
|
|
36
|
+
start() {
|
|
37
|
+
if (!this.config.enabled || this.timer)
|
|
38
|
+
return;
|
|
39
|
+
this.timer = setInterval(() => {
|
|
40
|
+
this.runCycle('scheduled').catch((error) => {
|
|
41
|
+
this.logger.warn(`Telescope prune failed: ${asError(error).message}`);
|
|
42
|
+
});
|
|
43
|
+
}, this.config.intervalMs);
|
|
44
|
+
this.timer.unref?.();
|
|
45
|
+
}
|
|
46
|
+
/** Stop the interval timer (called by the provider at shutdown). */
|
|
47
|
+
stop() {
|
|
48
|
+
if (this.timer) {
|
|
49
|
+
clearInterval(this.timer);
|
|
50
|
+
this.timer = null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Run ONE prune cycle on demand (e.g. a future dashboard's "Prune now"),
|
|
55
|
+
* recording it as a `manual` run. Resolves to the number of entries deleted.
|
|
56
|
+
*/
|
|
57
|
+
async pruneNow() {
|
|
58
|
+
return this.runCycle('manual');
|
|
59
|
+
}
|
|
60
|
+
/** Recent prune runs (newest-first), copied so callers can't mutate the ring. */
|
|
61
|
+
getRuns() {
|
|
62
|
+
return [...this.runs];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Predicted next SCHEDULED prune time (epoch ms), or null when pruning is
|
|
66
|
+
* disabled. Derived from the last scheduled run's start + the interval, falling
|
|
67
|
+
* back to now + interval before the first cycle has run.
|
|
68
|
+
*/
|
|
69
|
+
getNextRunAtMs() {
|
|
70
|
+
if (!this.config.enabled)
|
|
71
|
+
return null;
|
|
72
|
+
return (this.lastScheduledRunAtMs ?? this.clock.now()) + this.config.intervalMs;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* One prune tick: delete everything older than `now - afterMs`, keeping the
|
|
76
|
+
* newest `keepLast` of the doomed set when configured. The delete is guarded so
|
|
77
|
+
* a throwing/slow store is captured on the run and never propagates.
|
|
78
|
+
*/
|
|
79
|
+
async runCycle(trigger) {
|
|
80
|
+
const startedAtMs = this.clock.now();
|
|
81
|
+
const cutoff = new Date(startedAtMs - this.config.afterMs);
|
|
82
|
+
let deletedTotal = 0;
|
|
83
|
+
let error;
|
|
84
|
+
try {
|
|
85
|
+
deletedTotal = await this.store.prune(cutoff, this.config.keepLast);
|
|
86
|
+
}
|
|
87
|
+
catch (caught) {
|
|
88
|
+
error = asError(caught).message;
|
|
89
|
+
this.logger.warn(`Telescope prune step failed: ${error}`);
|
|
90
|
+
}
|
|
91
|
+
if (trigger === 'scheduled')
|
|
92
|
+
this.lastScheduledRunAtMs = startedAtMs;
|
|
93
|
+
this.recordRun({
|
|
94
|
+
at: new Date(startedAtMs).toISOString(),
|
|
95
|
+
trigger,
|
|
96
|
+
durationMs: this.clock.now() - startedAtMs,
|
|
97
|
+
deletedTotal,
|
|
98
|
+
...(error !== undefined ? { error } : {}),
|
|
99
|
+
});
|
|
100
|
+
return deletedTotal;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Append a run to the newest-first ring buffer, evicting the oldest past the
|
|
104
|
+
* cap. Recording must NEVER throw into the prune path, so it is fully guarded.
|
|
105
|
+
*/
|
|
106
|
+
recordRun(run) {
|
|
107
|
+
try {
|
|
108
|
+
this.runs.unshift(run);
|
|
109
|
+
while (this.runs.length > MAX_PRUNE_RUNS)
|
|
110
|
+
this.runs.pop();
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
this.logger.warn(`Telescope failed to record prune run: ${asError(error).message}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function asError(error) {
|
|
118
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=pruner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pruner.js","sourceRoot":"","sources":["../../src/pruner.ts"],"names":[],"mappings":"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"}
|
package/dist/src/registry.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { DiagnosisCoordinator } from './ai/diagnosis_coordinator.js';
|
|
1
2
|
import type { ExtensionRegistry } from './extension/registry.js';
|
|
2
3
|
import type { TelescopeStore } from './store.js';
|
|
3
4
|
import type { EntryEvents } from './stream/entry_events.js';
|
|
@@ -21,6 +22,20 @@ export interface TelescopeRuntime {
|
|
|
21
22
|
* streaming is disabled / not booted.
|
|
22
23
|
*/
|
|
23
24
|
entryEvents: EntryEvents | null;
|
|
25
|
+
/**
|
|
26
|
+
* Overload-shed flag. While `true` (set by the overload guard when the event
|
|
27
|
+
* loop is lagging) every ingestion entry point — the request middleware and the
|
|
28
|
+
* watcher `safeRecord` helper — drops new entries so telescope can never amplify
|
|
29
|
+
* an incident. Reset to `false` on boot/shutdown and when load recovers.
|
|
30
|
+
*/
|
|
31
|
+
paused: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* The AI diagnosis coordinator published by the AI provider, or `null` when the
|
|
34
|
+
* AI feature is not installed. The MCP `diagnose_exception` tool and the alerter
|
|
35
|
+
* read it from here (no DI) to attach probable-cause analysis; when `null` — or
|
|
36
|
+
* when its `isConfigured()` is `false` — both degrade to their non-AI behaviour.
|
|
37
|
+
*/
|
|
38
|
+
diagnosisCoordinator: DiagnosisCoordinator | null;
|
|
24
39
|
}
|
|
25
40
|
/** The shared runtime handle. */
|
|
26
41
|
export declare function getTelescopeRuntime(): TelescopeRuntime;
|
|
@@ -30,6 +45,17 @@ export declare function setTelescopeRuntime(store: TelescopeStore, requestWatche
|
|
|
30
45
|
export declare function setTelescopeExtensionRegistry(registry: ExtensionRegistry | null): void;
|
|
31
46
|
/** Publish the SSE entry-events bus so the UI stream route can subscribe to it. */
|
|
32
47
|
export declare function setTelescopeEntryEvents(entryEvents: EntryEvents | null): void;
|
|
48
|
+
/**
|
|
49
|
+
* Publish the AI diagnosis coordinator (called by the AI provider at register) so
|
|
50
|
+
* the MCP tool and the alerter can attach probable-cause analysis. Pass `null` to
|
|
51
|
+
* clear it (AI disabled / provider shutdown).
|
|
52
|
+
*/
|
|
53
|
+
export declare function setTelescopeDiagnosisCoordinator(coordinator: DiagnosisCoordinator | null): void;
|
|
54
|
+
/**
|
|
55
|
+
* Toggle the overload-shed flag (called by the overload guard). While paused,
|
|
56
|
+
* every ingestion entry point drops new entries. Idempotent.
|
|
57
|
+
*/
|
|
58
|
+
export declare function setTelescopePaused(paused: boolean): void;
|
|
33
59
|
/** Tear down the runtime (called by the provider at shutdown). */
|
|
34
60
|
export declare function resetTelescopeRuntime(): void;
|
|
35
61
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,iDAAiD;IACjD,qBAAqB,EAAE,OAAO,CAAC;IAC/B,4FAA4F;IAC5F,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC;;;;OAIG;IACH,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,iDAAiD;IACjD,qBAAqB,EAAE,OAAO,CAAC;IAC/B,4FAA4F;IAC5F,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC;;;;OAIG;IACH,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC;;;;;OAKG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,oBAAoB,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACnD;AAeD,iCAAiC;AACjC,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAED,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,OAAO,GAAG,IAAI,CAG/F;AAED,4FAA4F;AAC5F,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAEtF;AAED,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAE7E;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,WAAW,EAAE,oBAAoB,GAAG,IAAI,GACvC,IAAI,CAEN;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAExD;AAED,kEAAkE;AAClE,wBAAgB,qBAAqB,IAAI,IAAI,CAO5C"}
|
package/dist/src/registry.js
CHANGED
|
@@ -5,6 +5,8 @@ const runtime = globalStore[RUNTIME_KEY] ?? {
|
|
|
5
5
|
requestWatcherEnabled: false,
|
|
6
6
|
registry: null,
|
|
7
7
|
entryEvents: null,
|
|
8
|
+
paused: false,
|
|
9
|
+
diagnosisCoordinator: null,
|
|
8
10
|
};
|
|
9
11
|
globalStore[RUNTIME_KEY] = runtime;
|
|
10
12
|
/** The shared runtime handle. */
|
|
@@ -24,11 +26,28 @@ export function setTelescopeExtensionRegistry(registry) {
|
|
|
24
26
|
export function setTelescopeEntryEvents(entryEvents) {
|
|
25
27
|
runtime.entryEvents = entryEvents;
|
|
26
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Publish the AI diagnosis coordinator (called by the AI provider at register) so
|
|
31
|
+
* the MCP tool and the alerter can attach probable-cause analysis. Pass `null` to
|
|
32
|
+
* clear it (AI disabled / provider shutdown).
|
|
33
|
+
*/
|
|
34
|
+
export function setTelescopeDiagnosisCoordinator(coordinator) {
|
|
35
|
+
runtime.diagnosisCoordinator = coordinator;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Toggle the overload-shed flag (called by the overload guard). While paused,
|
|
39
|
+
* every ingestion entry point drops new entries. Idempotent.
|
|
40
|
+
*/
|
|
41
|
+
export function setTelescopePaused(paused) {
|
|
42
|
+
runtime.paused = paused;
|
|
43
|
+
}
|
|
27
44
|
/** Tear down the runtime (called by the provider at shutdown). */
|
|
28
45
|
export function resetTelescopeRuntime() {
|
|
29
46
|
runtime.store = null;
|
|
30
47
|
runtime.requestWatcherEnabled = false;
|
|
31
48
|
runtime.registry = null;
|
|
32
49
|
runtime.entryEvents = null;
|
|
50
|
+
runtime.paused = false;
|
|
51
|
+
runtime.diagnosisCoordinator = null;
|
|
33
52
|
}
|
|
34
53
|
//# sourceMappingURL=registry.js.map
|
package/dist/src/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAyCA,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAC3D,MAAM,WAAW,GAAG,UAAsE,CAAC;AAE3F,MAAM,OAAO,GAAqB,WAAW,CAAC,WAAW,CAAC,IAAI;IAC5D,KAAK,EAAE,IAAI;IACX,qBAAqB,EAAE,KAAK;IAC5B,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,IAAI;IACjB,MAAM,EAAE,KAAK;IACb,oBAAoB,EAAE,IAAI;CAC3B,CAAC;AACF,WAAW,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC;AAEnC,iCAAiC;AACjC,MAAM,UAAU,mBAAmB;IACjC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,mBAAmB,CAAC,KAAqB,EAAE,qBAA8B;IACvF,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;IACtB,OAAO,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;AACxD,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,6BAA6B,CAAC,QAAkC;IAC9E,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC9B,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,uBAAuB,CAAC,WAA+B;IACrE,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gCAAgC,CAC9C,WAAwC;IAExC,OAAO,CAAC,oBAAoB,GAAG,WAAW,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAe;IAChD,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;AAC1B,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,qBAAqB;IACnC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IACrB,OAAO,CAAC,qBAAqB,GAAG,KAAK,CAAC;IACtC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;IACvB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;AACtC,CAAC"}
|
package/dist/src/service.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Entry } from './entry.js';
|
|
2
|
+
import { type PulseQuery, type PulseServiceOptions, type PulseSummary } from './metrics/pulse.js';
|
|
2
3
|
import type { EntryQuery, TelescopeStore } from './store.js';
|
|
3
4
|
/** A `{ familyHash | tag, count }` aggregate for top-N style summaries. */
|
|
4
5
|
export interface CountBucket {
|
|
@@ -13,9 +14,23 @@ export interface CountBucket {
|
|
|
13
14
|
*/
|
|
14
15
|
export declare class TelescopeService {
|
|
15
16
|
private readonly store;
|
|
16
|
-
|
|
17
|
+
/** Defaults for the {@link getHealth} pulse rollup (window, cards, top-N). */
|
|
18
|
+
private readonly pulseOptions;
|
|
19
|
+
/** Lazily-built pulse aggregator over the store (created on first `getHealth`). */
|
|
20
|
+
private pulseService;
|
|
21
|
+
constructor(store: TelescopeStore,
|
|
22
|
+
/** Defaults for the {@link getHealth} pulse rollup (window, cards, top-N). */
|
|
23
|
+
pulseOptions?: PulseServiceOptions);
|
|
17
24
|
/** The underlying store, for advanced callers (and the provider's shutdown). */
|
|
18
25
|
get telescopeStore(): TelescopeStore;
|
|
26
|
+
/**
|
|
27
|
+
* The aggregated "at a glance" health rollup (slowest entries, error rate,
|
|
28
|
+
* throughput, top exceptions, cache hit ratio, slow route/outgoing/job
|
|
29
|
+
* hotspots, N+1, load-by-user) over a trailing window. Reads the store on
|
|
30
|
+
* demand through a {@link PulseService}; `query.windowMs` overrides the
|
|
31
|
+
* configured default for a single call.
|
|
32
|
+
*/
|
|
33
|
+
getHealth(query?: PulseQuery): Promise<PulseSummary>;
|
|
19
34
|
/** List entries matching `query`, newest-first. */
|
|
20
35
|
list(query?: EntryQuery): Promise<Entry[]>;
|
|
21
36
|
/** Fetch one entry by id, or `null`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,qBAAa,gBAAgB;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACL,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,YAAY;IAN/B,mFAAmF;IACnF,OAAO,CAAC,YAAY,CAA6B;gBAG9B,KAAK,EAAE,cAAc;IACtC,8EAA8E;IAC7D,YAAY,GAAE,mBAAwB;IAGzD,gFAAgF;IAChF,IAAI,cAAc,IAAI,cAAc,CAEnC;IAED;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAKpD,mDAAmD;IACnD,IAAI,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAI1C,wCAAwC;IACxC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAIvC,iEAAiE;IACjE,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAI1C,sCAAsC;IACtC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAIxB;;;;OAIG;IACG,WAAW,CAAC,KAAK,SAAK,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IASpE,0EAA0E;IACpE,OAAO,CAAC,KAAK,SAAK,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAUnE"}
|
package/dist/src/service.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { PulseService, } from './metrics/pulse.js';
|
|
1
2
|
/**
|
|
2
3
|
* The headless query API over recorded entries — what a future dashboard, an
|
|
3
4
|
* `inspector` endpoint, or your own controller reads. Thin facade over a
|
|
@@ -6,13 +7,30 @@
|
|
|
6
7
|
*/
|
|
7
8
|
export class TelescopeService {
|
|
8
9
|
store;
|
|
9
|
-
|
|
10
|
+
pulseOptions;
|
|
11
|
+
/** Lazily-built pulse aggregator over the store (created on first `getHealth`). */
|
|
12
|
+
pulseService = null;
|
|
13
|
+
constructor(store,
|
|
14
|
+
/** Defaults for the {@link getHealth} pulse rollup (window, cards, top-N). */
|
|
15
|
+
pulseOptions = {}) {
|
|
10
16
|
this.store = store;
|
|
17
|
+
this.pulseOptions = pulseOptions;
|
|
11
18
|
}
|
|
12
19
|
/** The underlying store, for advanced callers (and the provider's shutdown). */
|
|
13
20
|
get telescopeStore() {
|
|
14
21
|
return this.store;
|
|
15
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* The aggregated "at a glance" health rollup (slowest entries, error rate,
|
|
25
|
+
* throughput, top exceptions, cache hit ratio, slow route/outgoing/job
|
|
26
|
+
* hotspots, N+1, load-by-user) over a trailing window. Reads the store on
|
|
27
|
+
* demand through a {@link PulseService}; `query.windowMs` overrides the
|
|
28
|
+
* configured default for a single call.
|
|
29
|
+
*/
|
|
30
|
+
getHealth(query) {
|
|
31
|
+
this.pulseService ??= new PulseService(this.store, this.pulseOptions);
|
|
32
|
+
return this.pulseService.getHealth(query ?? {});
|
|
33
|
+
}
|
|
16
34
|
/** List entries matching `query`, newest-first. */
|
|
17
35
|
list(query) {
|
|
18
36
|
return this.store.list(query);
|
package/dist/src/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,14 @@ export interface TelescopeColumns {
|
|
|
39
39
|
* scripts without a migration runner.
|
|
40
40
|
*/
|
|
41
41
|
export declare function createTableStatements(tableName?: string): string[];
|
|
42
|
+
/**
|
|
43
|
+
* The marker table backing the fingerprint gate. One row PER owned entries table
|
|
44
|
+
* (keyed by that table's name, so two telescope tables in one database never
|
|
45
|
+
* clobber each other's marker) records the fingerprint of the schema the store
|
|
46
|
+
* last reconciled. Deliberately NOT fingerprinted itself, so its own shape can
|
|
47
|
+
* never invalidate the gate.
|
|
48
|
+
*/
|
|
49
|
+
export declare const SCHEMA_META_TABLE_NAME = "telescope_schema_meta";
|
|
42
50
|
/**
|
|
43
51
|
* The slice of an AdonisJS Lucid `Database` (or `QueryClientContract`) this store
|
|
44
52
|
* uses. Typed structurally so `@adonisjs/lucid` stays an *optional peer* dependency
|
|
@@ -119,6 +127,18 @@ export declare class LucidTelescopeStore implements TelescopeStore {
|
|
|
119
127
|
/** Run table creation (optional) + sequence seeding exactly once. */
|
|
120
128
|
private init;
|
|
121
129
|
private doInit;
|
|
130
|
+
/**
|
|
131
|
+
* Fingerprint-gated table creation. Maintains the {@link SCHEMA_META_TABLE_NAME}
|
|
132
|
+
* marker, compares the stored fingerprint against one computed in memory from
|
|
133
|
+
* the DDL, and SKIPS re-issuing the (five-statement) CREATE TABLE + index DDL
|
|
134
|
+
* when they match. Only an absent/mismatched fingerprint (fresh DB, column/index
|
|
135
|
+
* change, or a {@link SCHEMA_REVISION} bump) runs the DDL, then re-caches.
|
|
136
|
+
*/
|
|
137
|
+
private reconcileSchema;
|
|
138
|
+
/** Reads this table's stored fingerprint, or null when the marker row is absent. */
|
|
139
|
+
private readStoredFingerprint;
|
|
140
|
+
/** Upserts this table's marker row (delete + insert, portable across dialects). */
|
|
141
|
+
private writeStoredFingerprint;
|
|
122
142
|
}
|
|
123
143
|
/** Options for {@link createTelescopeTable}. */
|
|
124
144
|
export interface CreateTableOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucid.d.ts","sourceRoot":"","sources":["../../../src/stores/lucid.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,KAAK,EAAE,KAAK,WAAW,EAAiB,MAAM,aAAa,CAAC;AAC5F,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE9D;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AAEtD;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,GAAE,MAA2B,GAAG,MAAM,EAAE,CAmBtF;
|
|
1
|
+
{"version":3,"file":"lucid.d.ts","sourceRoot":"","sources":["../../../src/stores/lucid.ts"],"names":[],"mappings":"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"}
|
package/dist/src/stores/lucid.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
2
|
import { currentTraceId } from '../context_accessor.js';
|
|
3
3
|
import { isBatchOrigin } from '../entry.js';
|
|
4
4
|
/**
|
|
@@ -37,6 +37,57 @@ export function createTableStatements(tableName = DEFAULT_TABLE_NAME) {
|
|
|
37
37
|
`CREATE INDEX IF NOT EXISTS "${tableName}_family_hash_idx" ON "${tableName}" ("family_hash")`,
|
|
38
38
|
];
|
|
39
39
|
}
|
|
40
|
+
// ── Schema fingerprint gate ──────────────────────────────────────────────────
|
|
41
|
+
//
|
|
42
|
+
// With `autoCreateTable`, `doInit` used to re-issue every `createTableStatements`
|
|
43
|
+
// (a CREATE TABLE + four CREATE INDEX) on the first use of each fresh store —
|
|
44
|
+
// harmless (`IF NOT EXISTS`) but five DDL round-trips of pure no-op in steady
|
|
45
|
+
// state, on every boot / reconnect. The gate replaces that with: maintain a
|
|
46
|
+
// `telescope_schema_meta` marker, read its one fingerprint row, and compare it
|
|
47
|
+
// against one computed purely in memory from the DDL. When they match we SKIP the
|
|
48
|
+
// create statements entirely; only an absent/mismatched fingerprint (fresh DB,
|
|
49
|
+
// column/index change, or SCHEMA_REVISION bump) pays for the DDL, then re-caches.
|
|
50
|
+
/**
|
|
51
|
+
* Hand-bump escape hatch for schema changes the fingerprint below can't see.
|
|
52
|
+
* Nothing today needs it — the `createTableStatements` array already encodes the
|
|
53
|
+
* whole table + index shape — but bumping this invalidates every stored
|
|
54
|
+
* fingerprint, forcing each process to re-run the (idempotent) DDL once.
|
|
55
|
+
*/
|
|
56
|
+
const SCHEMA_REVISION = 1;
|
|
57
|
+
/**
|
|
58
|
+
* The marker table backing the fingerprint gate. One row PER owned entries table
|
|
59
|
+
* (keyed by that table's name, so two telescope tables in one database never
|
|
60
|
+
* clobber each other's marker) records the fingerprint of the schema the store
|
|
61
|
+
* last reconciled. Deliberately NOT fingerprinted itself, so its own shape can
|
|
62
|
+
* never invalidate the gate.
|
|
63
|
+
*/
|
|
64
|
+
export const SCHEMA_META_TABLE_NAME = 'telescope_schema_meta';
|
|
65
|
+
/**
|
|
66
|
+
* `CREATE TABLE IF NOT EXISTS` DDL for the fingerprint marker table. Idempotent
|
|
67
|
+
* and introspection-free, portable across sqlite / Postgres / MySQL (quoted
|
|
68
|
+
* identifiers, portable types) — mirroring {@link createTableStatements}' style.
|
|
69
|
+
*/
|
|
70
|
+
function createSchemaMetaTableStatement() {
|
|
71
|
+
return `CREATE TABLE IF NOT EXISTS "${SCHEMA_META_TABLE_NAME}" (
|
|
72
|
+
"id" VARCHAR(255) PRIMARY KEY NOT NULL,
|
|
73
|
+
"fingerprint" VARCHAR(64) NOT NULL,
|
|
74
|
+
"applied_at" BIGINT NOT NULL
|
|
75
|
+
)`;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Pure, in-memory sha256 of the owned table's schema. The
|
|
79
|
+
* {@link createTableStatements} array IS the canonical schema definition here —
|
|
80
|
+
* it encodes the table name plus every column and index — so hashing it, folded
|
|
81
|
+
* with {@link SCHEMA_REVISION}, re-heals on any column/index/name change or a
|
|
82
|
+
* manual revision bump and matches byte-for-byte otherwise.
|
|
83
|
+
*/
|
|
84
|
+
function computeSchemaFingerprint(tableName) {
|
|
85
|
+
const payload = JSON.stringify({
|
|
86
|
+
revision: SCHEMA_REVISION,
|
|
87
|
+
statements: createTableStatements(tableName),
|
|
88
|
+
});
|
|
89
|
+
return createHash('sha256').update(payload).digest('hex');
|
|
90
|
+
}
|
|
40
91
|
/**
|
|
41
92
|
* A persistent, SQL-backed {@link TelescopeStore} on AdonisJS Lucid. Uses Lucid's
|
|
42
93
|
* **async** query builder directly, so it works on every dialect Lucid supports
|
|
@@ -176,9 +227,7 @@ export class LucidTelescopeStore {
|
|
|
176
227
|
}
|
|
177
228
|
async doInit() {
|
|
178
229
|
if (this.autoCreateTable) {
|
|
179
|
-
|
|
180
|
-
await this.db.rawQuery(stmt);
|
|
181
|
-
}
|
|
230
|
+
await this.reconcileSchema();
|
|
182
231
|
}
|
|
183
232
|
// Seed the in-process counter from the persisted maximum so sequence keeps
|
|
184
233
|
// climbing monotonically across restarts.
|
|
@@ -190,6 +239,42 @@ export class LucidTelescopeStore {
|
|
|
190
239
|
const max = maxRow.length > 0 ? toInt(maxRow[0]?.sequence) : -1;
|
|
191
240
|
this.sequence = max + 1;
|
|
192
241
|
}
|
|
242
|
+
/**
|
|
243
|
+
* Fingerprint-gated table creation. Maintains the {@link SCHEMA_META_TABLE_NAME}
|
|
244
|
+
* marker, compares the stored fingerprint against one computed in memory from
|
|
245
|
+
* the DDL, and SKIPS re-issuing the (five-statement) CREATE TABLE + index DDL
|
|
246
|
+
* when they match. Only an absent/mismatched fingerprint (fresh DB, column/index
|
|
247
|
+
* change, or a {@link SCHEMA_REVISION} bump) runs the DDL, then re-caches.
|
|
248
|
+
*/
|
|
249
|
+
async reconcileSchema() {
|
|
250
|
+
// (1) Idempotent, introspection-free marker table.
|
|
251
|
+
await this.db.rawQuery(createSchemaMetaTableStatement());
|
|
252
|
+
// (2) Read the stored fingerprint + (3) compute the expected one in memory.
|
|
253
|
+
const stored = await this.readStoredFingerprint();
|
|
254
|
+
const expected = computeSchemaFingerprint(this.tableName);
|
|
255
|
+
// (4) Steady state: identical fingerprint ⇒ skip the entries-table DDL.
|
|
256
|
+
if (stored === expected)
|
|
257
|
+
return;
|
|
258
|
+
// (5) Absent/mismatch ⇒ (re)create the table + indexes, then re-cache.
|
|
259
|
+
for (const stmt of createTableStatements(this.tableName)) {
|
|
260
|
+
await this.db.rawQuery(stmt);
|
|
261
|
+
}
|
|
262
|
+
await this.writeStoredFingerprint(expected);
|
|
263
|
+
}
|
|
264
|
+
/** Reads this table's stored fingerprint, or null when the marker row is absent. */
|
|
265
|
+
async readStoredFingerprint() {
|
|
266
|
+
const row = await this.db.from(SCHEMA_META_TABLE_NAME).where('id', this.tableName).first();
|
|
267
|
+
return row && typeof row.fingerprint === 'string' ? row.fingerprint : null;
|
|
268
|
+
}
|
|
269
|
+
/** Upserts this table's marker row (delete + insert, portable across dialects). */
|
|
270
|
+
async writeStoredFingerprint(fingerprint) {
|
|
271
|
+
await this.db.from(SCHEMA_META_TABLE_NAME).where('id', this.tableName).delete();
|
|
272
|
+
await this.db.table(SCHEMA_META_TABLE_NAME).insert({
|
|
273
|
+
id: this.tableName,
|
|
274
|
+
fingerprint,
|
|
275
|
+
applied_at: Date.now(),
|
|
276
|
+
});
|
|
277
|
+
}
|
|
193
278
|
}
|
|
194
279
|
/**
|
|
195
280
|
* Stand up the telescope entries table (and its indexes) through Lucid's async
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucid.js","sourceRoot":"","sources":["../../../src/stores/lucid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"lucid.js","sourceRoot":"","sources":["../../../src/stores/lucid.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telescope_middleware.d.ts","sourceRoot":"","sources":["../../src/telescope_middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAKxD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAChC,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"telescope_middleware.d.ts","sourceRoot":"","sources":["../../src/telescope_middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAKxD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAChC,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM;CAoC5C"}
|