@dudousxd/nestjs-telescope-ui 2.0.0 → 2.0.1
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 +748 -0
- package/README.md +31 -0
- package/dist/client/console-url.d.ts +11 -0
- package/dist/client/console-url.d.ts.map +1 -0
- package/dist/client/console-url.js +21 -0
- package/dist/client/console-url.js.map +1 -0
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/telescope-client.d.ts +64 -11
- package/dist/client/telescope-client.d.ts.map +1 -1
- package/dist/client/telescope-client.js +59 -54
- package/dist/client/telescope-client.js.map +1 -1
- package/dist/client/types.d.ts +431 -30
- package/dist/client/types.d.ts.map +1 -1
- package/dist/react/components/batch-timeline.js +2 -2
- package/dist/react/components/batch-timeline.js.map +1 -1
- package/dist/react/components/cache-badge.d.ts +14 -6
- package/dist/react/components/cache-badge.d.ts.map +1 -1
- package/dist/react/components/cache-badge.js +26 -12
- package/dist/react/components/cache-badge.js.map +1 -1
- package/dist/react/components/charts/area-chart-card.d.ts +11 -3
- package/dist/react/components/charts/area-chart-card.d.ts.map +1 -1
- package/dist/react/components/charts/area-chart-card.js +33 -6
- package/dist/react/components/charts/area-chart-card.js.map +1 -1
- package/dist/react/components/charts/bar-chart-card.d.ts +18 -7
- package/dist/react/components/charts/bar-chart-card.d.ts.map +1 -1
- package/dist/react/components/charts/bar-chart-card.js +18 -9
- package/dist/react/components/charts/bar-chart-card.js.map +1 -1
- package/dist/react/components/charts/breakdown-card.d.ts +17 -0
- package/dist/react/components/charts/breakdown-card.d.ts.map +1 -0
- package/dist/react/components/charts/breakdown-card.js +43 -0
- package/dist/react/components/charts/breakdown-card.js.map +1 -0
- package/dist/react/components/charts/chart-card.d.ts +7 -0
- package/dist/react/components/charts/chart-card.d.ts.map +1 -1
- package/dist/react/components/charts/chart-card.js +10 -3
- package/dist/react/components/charts/chart-card.js.map +1 -1
- package/dist/react/components/charts/chart-selection.d.ts +44 -0
- package/dist/react/components/charts/chart-selection.d.ts.map +1 -0
- package/dist/react/components/charts/chart-selection.js +36 -0
- package/dist/react/components/charts/chart-selection.js.map +1 -0
- package/dist/react/components/charts/chart-theme.d.ts +62 -19
- package/dist/react/components/charts/chart-theme.d.ts.map +1 -1
- package/dist/react/components/charts/chart-theme.js +72 -13
- package/dist/react/components/charts/chart-theme.js.map +1 -1
- package/dist/react/components/charts/distribution-chart-card.d.ts +17 -0
- package/dist/react/components/charts/distribution-chart-card.d.ts.map +1 -0
- package/dist/react/components/charts/distribution-chart-card.js +46 -0
- package/dist/react/components/charts/distribution-chart-card.js.map +1 -0
- package/dist/react/components/charts/gauge-card.d.ts +12 -0
- package/dist/react/components/charts/gauge-card.d.ts.map +1 -0
- package/dist/react/components/charts/gauge-card.js +17 -0
- package/dist/react/components/charts/gauge-card.js.map +1 -0
- package/dist/react/components/charts/index.d.ts +1 -0
- package/dist/react/components/charts/index.d.ts.map +1 -1
- package/dist/react/components/charts/index.js +1 -0
- package/dist/react/components/charts/index.js.map +1 -1
- package/dist/react/components/charts/stacked-area-chart-card.d.ts +17 -3
- package/dist/react/components/charts/stacked-area-chart-card.d.ts.map +1 -1
- package/dist/react/components/charts/stacked-area-chart-card.js +31 -8
- package/dist/react/components/charts/stacked-area-chart-card.js.map +1 -1
- package/dist/react/components/entries-table.d.ts.map +1 -1
- package/dist/react/components/entries-table.js +17 -3
- package/dist/react/components/entries-table.js.map +1 -1
- package/dist/react/components/entry-detail.d.ts +2 -0
- package/dist/react/components/entry-detail.d.ts.map +1 -1
- package/dist/react/components/entry-detail.js +186 -20
- package/dist/react/components/entry-detail.js.map +1 -1
- package/dist/react/components/entry-insights.d.ts.map +1 -1
- package/dist/react/components/entry-insights.js +28 -17
- package/dist/react/components/entry-insights.js.map +1 -1
- package/dist/react/components/entry-types.d.ts +29 -0
- package/dist/react/components/entry-types.d.ts.map +1 -1
- package/dist/react/components/entry-types.js +60 -0
- package/dist/react/components/entry-types.js.map +1 -1
- package/dist/react/components/export-json-toolbar.js +2 -2
- package/dist/react/components/export-json-toolbar.js.map +1 -1
- package/dist/react/components/extensions/panel-column-menu.d.ts +19 -0
- package/dist/react/components/extensions/panel-column-menu.d.ts.map +1 -0
- package/dist/react/components/extensions/panel-column-menu.js +47 -0
- package/dist/react/components/extensions/panel-column-menu.js.map +1 -0
- package/dist/react/components/extensions/panel-renderer.d.ts +46 -0
- package/dist/react/components/extensions/panel-renderer.d.ts.map +1 -0
- package/dist/react/components/extensions/panel-renderer.js +122 -0
- package/dist/react/components/extensions/panel-renderer.js.map +1 -0
- package/dist/react/components/extensions/panel-table-header.d.ts +18 -0
- package/dist/react/components/extensions/panel-table-header.d.ts.map +1 -0
- package/dist/react/components/extensions/panel-table-header.js +82 -0
- package/dist/react/components/extensions/panel-table-header.js.map +1 -0
- package/dist/react/components/extensions/panel-table.d.ts +27 -0
- package/dist/react/components/extensions/panel-table.d.ts.map +1 -0
- package/dist/react/components/extensions/panel-table.js +87 -0
- package/dist/react/components/extensions/panel-table.js.map +1 -0
- package/dist/react/components/extensions/stat-card.d.ts +18 -0
- package/dist/react/components/extensions/stat-card.d.ts.map +1 -0
- package/dist/react/components/extensions/stat-card.js +44 -0
- package/dist/react/components/extensions/stat-card.js.map +1 -0
- package/dist/react/components/extensions/table-columns.d.ts +32 -0
- package/dist/react/components/extensions/table-columns.d.ts.map +1 -0
- package/dist/react/components/extensions/table-columns.js +51 -0
- package/dist/react/components/extensions/table-columns.js.map +1 -0
- package/dist/react/components/extensions/table-features.d.ts +47 -0
- package/dist/react/components/extensions/table-features.d.ts.map +1 -0
- package/dist/react/components/extensions/table-features.js +45 -0
- package/dist/react/components/extensions/table-features.js.map +1 -0
- package/dist/react/components/extensions/table-query.d.ts +53 -0
- package/dist/react/components/extensions/table-query.d.ts.map +1 -0
- package/dist/react/components/extensions/table-query.js +51 -0
- package/dist/react/components/extensions/table-query.js.map +1 -0
- package/dist/react/components/flamegraph-view.d.ts +18 -0
- package/dist/react/components/flamegraph-view.d.ts.map +1 -0
- package/dist/react/components/flamegraph-view.js +48 -0
- package/dist/react/components/flamegraph-view.js.map +1 -0
- package/dist/react/components/flamegraph.d.ts +34 -0
- package/dist/react/components/flamegraph.d.ts.map +1 -0
- package/dist/react/components/flamegraph.js +54 -0
- package/dist/react/components/flamegraph.js.map +1 -0
- package/dist/react/components/inertia-badge.d.ts +33 -0
- package/dist/react/components/inertia-badge.d.ts.map +1 -0
- package/dist/react/components/inertia-badge.js +72 -0
- package/dist/react/components/inertia-badge.js.map +1 -0
- package/dist/react/components/inertia-body.d.ts +11 -0
- package/dist/react/components/inertia-body.d.ts.map +1 -0
- package/dist/react/components/inertia-body.js +127 -0
- package/dist/react/components/inertia-body.js.map +1 -0
- package/dist/react/components/official-event.d.ts +16 -0
- package/dist/react/components/official-event.d.ts.map +1 -0
- package/dist/react/components/official-event.js +88 -0
- package/dist/react/components/official-event.js.map +1 -0
- package/dist/react/components/pulse-panel.d.ts.map +1 -1
- package/dist/react/components/pulse-panel.js +6 -6
- package/dist/react/components/pulse-panel.js.map +1 -1
- package/dist/react/components/queues/EnqueueJobForm.d.ts.map +1 -1
- package/dist/react/components/queues/EnqueueJobForm.js +2 -1
- package/dist/react/components/queues/EnqueueJobForm.js.map +1 -1
- package/dist/react/components/queues/JobActions.d.ts.map +1 -1
- package/dist/react/components/queues/JobActions.js +11 -9
- package/dist/react/components/queues/JobActions.js.map +1 -1
- package/dist/react/components/queues/JobDetailDrawer.d.ts.map +1 -1
- package/dist/react/components/queues/JobDetailDrawer.js +8 -13
- package/dist/react/components/queues/JobDetailDrawer.js.map +1 -1
- package/dist/react/components/queues/JobTable.d.ts.map +1 -1
- package/dist/react/components/queues/JobTable.js +0 -0
- package/dist/react/components/queues/JobTable.js.map +1 -1
- package/dist/react/components/queues/QueueList.d.ts.map +1 -1
- package/dist/react/components/queues/QueueList.js +6 -6
- package/dist/react/components/queues/QueueList.js.map +1 -1
- package/dist/react/components/queues/QueueStateTabs.d.ts.map +1 -1
- package/dist/react/components/queues/QueueStateTabs.js +9 -7
- package/dist/react/components/queues/QueueStateTabs.js.map +1 -1
- package/dist/react/components/queues/queue-format.d.ts +5 -1
- package/dist/react/components/queues/queue-format.d.ts.map +1 -1
- package/dist/react/components/queues/queue-format.js +11 -7
- package/dist/react/components/queues/queue-format.js.map +1 -1
- package/dist/react/components/queues-panel.js +1 -1
- package/dist/react/components/queues-panel.js.map +1 -1
- package/dist/react/components/request-timeline.d.ts.map +1 -1
- package/dist/react/components/request-timeline.js +2 -2
- package/dist/react/components/request-timeline.js.map +1 -1
- package/dist/react/components/retention-indicator.d.ts.map +1 -1
- package/dist/react/components/retention-indicator.js +1 -1
- package/dist/react/components/retention-indicator.js.map +1 -1
- package/dist/react/components/sparkline.d.ts.map +1 -1
- package/dist/react/components/sparkline.js +1 -1
- package/dist/react/components/sparkline.js.map +1 -1
- package/dist/react/components/tag-autocomplete.d.ts +21 -4
- package/dist/react/components/tag-autocomplete.d.ts.map +1 -1
- package/dist/react/components/tag-autocomplete.js +57 -29
- package/dist/react/components/tag-autocomplete.js.map +1 -1
- package/dist/react/components/to-csv.d.ts +25 -0
- package/dist/react/components/to-csv.d.ts.map +1 -0
- package/dist/react/components/to-csv.js +78 -0
- package/dist/react/components/to-csv.js.map +1 -0
- package/dist/react/components/user-tag.d.ts +15 -0
- package/dist/react/components/user-tag.d.ts.map +1 -1
- package/dist/react/components/user-tag.js +19 -0
- package/dist/react/components/user-tag.js.map +1 -1
- package/dist/react/components/waterfall-view.d.ts +13 -0
- package/dist/react/components/waterfall-view.d.ts.map +1 -0
- package/dist/react/components/waterfall-view.js +58 -0
- package/dist/react/components/waterfall-view.js.map +1 -0
- package/dist/react/components/window-select.d.ts.map +1 -1
- package/dist/react/components/window-select.js +6 -2
- package/dist/react/components/window-select.js.map +1 -1
- package/dist/react/index.d.ts +7 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +11 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/ui/badge.d.ts +16 -0
- package/dist/react/ui/badge.d.ts.map +1 -0
- package/dist/react/ui/badge.js +28 -0
- package/dist/react/ui/badge.js.map +1 -0
- package/dist/react/ui/button.d.ts +17 -0
- package/dist/react/ui/button.d.ts.map +1 -0
- package/dist/react/ui/button.js +35 -0
- package/dist/react/ui/button.js.map +1 -0
- package/dist/react/ui/chart.d.ts +116 -0
- package/dist/react/ui/chart.d.ts.map +1 -0
- package/dist/react/ui/chart.js +191 -0
- package/dist/react/ui/chart.js.map +1 -0
- package/dist/react/ui/cn.d.ts +8 -0
- package/dist/react/ui/cn.d.ts.map +1 -0
- package/dist/react/ui/cn.js +11 -0
- package/dist/react/ui/cn.js.map +1 -0
- package/dist/react/ui/dialog.d.ts +26 -0
- package/dist/react/ui/dialog.d.ts.map +1 -0
- package/dist/react/ui/dialog.js +40 -0
- package/dist/react/ui/dialog.js.map +1 -0
- package/dist/react/ui/index.d.ts +24 -0
- package/dist/react/ui/index.d.ts.map +1 -0
- package/dist/react/ui/index.js +24 -0
- package/dist/react/ui/index.js.map +1 -0
- package/dist/react/ui/input.d.ts +3 -0
- package/dist/react/ui/input.d.ts.map +1 -0
- package/dist/react/ui/input.js +8 -0
- package/dist/react/ui/input.js.map +1 -0
- package/dist/react/ui/select.d.ts +20 -0
- package/dist/react/ui/select.d.ts.map +1 -0
- package/dist/react/ui/select.js +27 -0
- package/dist/react/ui/select.js.map +1 -0
- package/dist/react/ui/table.d.ts +27 -0
- package/dist/react/ui/table.d.ts.map +1 -0
- package/dist/react/ui/table.js +22 -0
- package/dist/react/ui/table.js.map +1 -0
- package/dist/react/ui/tabs.d.ts +12 -0
- package/dist/react/ui/tabs.d.ts.map +1 -0
- package/dist/react/ui/tabs.js +20 -0
- package/dist/react/ui/tabs.js.map +1 -0
- package/dist/react/ui/tooltip.d.ts +10 -0
- package/dist/react/ui/tooltip.d.ts.map +1 -0
- package/dist/react/ui/tooltip.js +12 -0
- package/dist/react/ui/tooltip.js.map +1 -0
- package/dist/react/use-telescope-queries.d.ts +129 -130
- package/dist/react/use-telescope-queries.d.ts.map +1 -1
- package/dist/react/use-telescope-queries.js +146 -1
- package/dist/react/use-telescope-queries.js.map +1 -1
- package/dist/react/use-telescope-stream.d.ts +10 -0
- package/dist/react/use-telescope-stream.d.ts.map +1 -0
- package/dist/react/use-telescope-stream.js +40 -0
- package/dist/react/use-telescope-stream.js.map +1 -0
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/telescope-ui.module.d.ts +28 -1
- package/dist/server/telescope-ui.module.d.ts.map +1 -1
- package/dist/server/telescope-ui.module.js +42 -4
- package/dist/server/telescope-ui.module.js.map +1 -1
- package/dist/server/telescope-ui.options.d.ts +47 -0
- package/dist/server/telescope-ui.options.d.ts.map +1 -1
- package/dist/server/telescope-ui.options.js.map +1 -1
- package/dist/spa/assets/index-BPSlup7m.js +159 -0
- package/dist/spa/assets/index-DmsmJrlA.css +1 -0
- package/dist/spa/index.html +2 -2
- package/package.json +75 -36
- package/skills/telescope-ui-dashboard/SKILL.md +198 -0
- package/dist/react/components/type-tabs.d.ts +0 -5
- package/dist/react/components/type-tabs.d.ts.map +0 -1
- package/dist/react/components/type-tabs.js +0 -8
- package/dist/react/components/type-tabs.js.map +0 -1
- package/dist/spa/assets/index-CCzTpxj3.css +0 -1
- package/dist/spa/assets/index-w0XTI5OM.js +0 -135
package/README.md
CHANGED
|
@@ -22,6 +22,37 @@ Open `/telescope`. The dashboard polls `/telescope/api/*` and shows captured
|
|
|
22
22
|
entries (type tabs + live polling) and, on an entry, the correlated batch — the
|
|
23
23
|
request and everything it caused.
|
|
24
24
|
|
|
25
|
+
### Protecting the page
|
|
26
|
+
|
|
27
|
+
The page is protected with NestJS's own tools, like the API. Two ways:
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
// 1. decorators on the mounted controller (forRootAsync: a static top-level option)
|
|
31
|
+
TelescopeUiModule.forRoot({
|
|
32
|
+
decorators: [UseGuards(AuthenticationGuard), Can(ConsolePolicy, 'view')],
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// 2. mount it yourself: routes: false + your own subclass (it carries no guard of its own)
|
|
36
|
+
@Controller('ops/telescope')
|
|
37
|
+
@UseGuards(AuthenticationGuard)
|
|
38
|
+
@Can(ConsolePolicy, 'view')
|
|
39
|
+
class ConsolePage extends TelescopeUiController {}
|
|
40
|
+
// imports: [TelescopeUiModule.forRoot({ path: 'ops/telescope', routes: false })]
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
A full-page navigation carries your cookies, not an `Authorization` header, so
|
|
44
|
+
the authentication strategy here must read a cookie session. Set `path` to the
|
|
45
|
+
mount: the page rebases its asset URLs on it. Give `TelescopeModule` the same
|
|
46
|
+
protection for the API.
|
|
47
|
+
|
|
48
|
+
With `NODE_ENV === 'production'`, mounting the page with no `decorators` (an
|
|
49
|
+
empty array counts as none) fails the boot; `routes: false` always boots.
|
|
50
|
+
Outside production an undecorated page mounts open. See
|
|
51
|
+
[Protecting the routes](../../README.md#protecting-the-routes).
|
|
52
|
+
|
|
53
|
+
To link to the console from your app, `telescopeConsoleUrl(basePath)` (from
|
|
54
|
+
`@dudousxd/nestjs-telescope-ui/client`) gives its URL.
|
|
55
|
+
|
|
25
56
|
## Build your own (composable)
|
|
26
57
|
|
|
27
58
|
The same pieces are exported so you can drop them into your own admin:
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where the console SPA is served, for a link from YOUR app (e.g. an admin
|
|
3
|
+
* page's "Open Telescope" anchor).
|
|
4
|
+
*
|
|
5
|
+
* Telescope's mount is configured as `path` (no leading slash, e.g. `'telescope'`); this accepts either
|
|
6
|
+
* form and normalizes it. Access is whatever your `decorators` (or your own controllers) decide:
|
|
7
|
+
* a plain navigation carries your app's cookies, so a cookie-session authentication strategy covers it.
|
|
8
|
+
*/
|
|
9
|
+
/** Where the console SPA itself is served. */
|
|
10
|
+
export declare function telescopeConsoleUrl(basePath?: string): string;
|
|
11
|
+
//# sourceMappingURL=console-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-url.d.ts","sourceRoot":"","sources":["../../src/client/console-url.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,8CAA8C;AAC9C,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,MAA0B,GAAG,MAAM,CAEhF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where the console SPA is served, for a link from YOUR app (e.g. an admin
|
|
3
|
+
* page's "Open Telescope" anchor).
|
|
4
|
+
*
|
|
5
|
+
* Telescope's mount is configured as `path` (no leading slash, e.g. `'telescope'`); this accepts either
|
|
6
|
+
* form and normalizes it. Access is whatever your `decorators` (or your own controllers) decide:
|
|
7
|
+
* a plain navigation carries your app's cookies, so a cookie-session authentication strategy covers it.
|
|
8
|
+
*/
|
|
9
|
+
/** The mount default; matches `TelescopeUiModule.forRoot()`'s own default. */
|
|
10
|
+
const DEFAULT_BASE_PATH = '/telescope';
|
|
11
|
+
function normalizeBasePath(basePath) {
|
|
12
|
+
const trimmed = basePath.trim().replace(/\/+$/, '');
|
|
13
|
+
if (trimmed === '')
|
|
14
|
+
return '';
|
|
15
|
+
return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
|
|
16
|
+
}
|
|
17
|
+
/** Where the console SPA itself is served. */
|
|
18
|
+
export function telescopeConsoleUrl(basePath = DEFAULT_BASE_PATH) {
|
|
19
|
+
return normalizeBasePath(basePath) || '/';
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=console-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-url.js","sourceRoot":"","sources":["../../src/client/console-url.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,8EAA8E;AAC9E,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAEvC,SAAS,iBAAiB,CAAC,QAAgB;IACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC9B,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;AAC3D,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,mBAAmB,CAAC,WAAmB,iBAAiB;IACtE,OAAO,iBAAiB,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;AAC5C,CAAC"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
+
export { telescopeConsoleUrl } from './console-url.js';
|
|
1
2
|
export { createTelescopeClient } from './telescope-client.js';
|
|
2
|
-
export type { BulkActionName, JobActionName, TelescopeClient, TelescopeClientOptions, } from './telescope-client.js';
|
|
3
|
+
export type { BulkActionName, JobActionName, TagPageOptions, TelescopeClient, TelescopeClientOptions, } from './telescope-client.js';
|
|
3
4
|
export type * from './types.js';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,YAAY,EACV,cAAc,EACd,aAAa,EACb,cAAc,EACd,eAAe,EACf,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,mBAAmB,YAAY,CAAC"}
|
package/dist/client/index.js
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
|
+
// The console's URL for a link from the host app. Re-exported here because `./client` resolves to
|
|
2
|
+
// this file — see the package's `exports` map.
|
|
3
|
+
export { telescopeConsoleUrl } from './console-url.js';
|
|
1
4
|
export { createTelescopeClient } from './telescope-client.js';
|
|
2
5
|
//# sourceMappingURL=index.js.map
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,+CAA+C;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AiUsageReport, CachedDiagnosis, CpuProfileContent, DiagnoseResult, EntriesQuery, Entry, EntryWithBatch, ExplainResult, JobPage, Page, ProfilerStatus, PrunesInfo, PulseReport, QueueCapabilities, QueueCounts, QueueJobDetail, QueueMetricsReport, QueueState, QueueSummary, RetentionInfo, ScheduledTask, ServerStats, ServerStatsHistory, StatsResult, TagCount, TelescopeHealth, TelescopeMeta, TimeseriesQuery, TimeseriesReport, TracesResult, Waterfall } from './types.js';
|
|
2
2
|
declare global {
|
|
3
3
|
interface Window {
|
|
4
4
|
/**
|
|
@@ -18,20 +18,53 @@ export interface TelescopeClientOptions {
|
|
|
18
18
|
}
|
|
19
19
|
export type JobActionName = 'retry' | 'remove' | 'promote';
|
|
20
20
|
export type BulkActionName = 'retry-all' | 'redrive';
|
|
21
|
+
/** One page of a tag picker's list. See {@link TelescopeClient.tags}. */
|
|
22
|
+
export interface TagPageOptions {
|
|
23
|
+
search?: string;
|
|
24
|
+
limit?: number;
|
|
25
|
+
offset?: number;
|
|
26
|
+
}
|
|
21
27
|
export interface TelescopeClient {
|
|
28
|
+
/** The resolved API base URL (e.g. `/telescope/api`). Used by hooks that need to construct URLs directly (e.g. SSE EventSource). */
|
|
29
|
+
readonly baseUrl: string;
|
|
22
30
|
entries(query?: EntriesQuery): Promise<Page<Entry>>;
|
|
23
31
|
entry(id: string): Promise<EntryWithBatch>;
|
|
24
32
|
pulse(window?: string): Promise<PulseReport>;
|
|
25
33
|
queues(window?: string): Promise<QueueMetricsReport>;
|
|
26
34
|
timeseries(query?: TimeseriesQuery): Promise<TimeseriesReport>;
|
|
27
35
|
traces(window?: string, limit?: number): Promise<TracesResult>;
|
|
36
|
+
/** Nested span waterfall for one trace (`GET traces/:traceId/waterfall`). */
|
|
37
|
+
waterfall(traceId: string): Promise<Waterfall>;
|
|
28
38
|
stats(type: string, window: string): Promise<StatsResult>;
|
|
29
|
-
|
|
39
|
+
/** The AI screen: spend, agent runs and unpriced calls over a window (`GET ai`). */
|
|
40
|
+
ai(window?: string, opts?: {
|
|
41
|
+
buckets?: number;
|
|
42
|
+
top?: number;
|
|
43
|
+
limit?: number;
|
|
44
|
+
}): Promise<AiUsageReport>;
|
|
45
|
+
/**
|
|
46
|
+
* Tag counts, most-used first. `prefix` is the control's fixed scope (`user:`); `search` is what
|
|
47
|
+
* was typed into it and matches anywhere in the tag. Both the search and the page happen on the
|
|
48
|
+
* SERVER — a picker that narrowed its own fetched page could only ever find what the bound
|
|
49
|
+
* already let through.
|
|
50
|
+
*/
|
|
51
|
+
tags(prefix?: string, opts?: TagPageOptions): Promise<TagCount[]>;
|
|
30
52
|
meta(): Promise<TelescopeMeta>;
|
|
53
|
+
/**
|
|
54
|
+
* Fetches data for an extension dashboard panel from a registered provider:
|
|
55
|
+
* `GET ext/:ext/data/:provider`. The optional `query` is serialized to the
|
|
56
|
+
* query string (panel `data.query`). Returns the raw provider payload as
|
|
57
|
+
* `unknown` — the panel renderer (Task 8) narrows it per panel `kind`.
|
|
58
|
+
*/
|
|
59
|
+
extData(ext: string, provider: string, query?: Record<string, unknown>): Promise<unknown>;
|
|
31
60
|
serverStats(): Promise<ServerStats>;
|
|
61
|
+
/** CPU/mem history ring buffer for the resource-history card. */
|
|
62
|
+
serverStatsHistory(): Promise<ServerStatsHistory>;
|
|
32
63
|
health(): Promise<TelescopeHealth>;
|
|
33
64
|
/** Retention/prune status for the Overview retention card. */
|
|
34
65
|
retention(): Promise<RetentionInfo>;
|
|
66
|
+
/** Prune-run activity + retention config for the Prunes screen (`GET /prunes`). */
|
|
67
|
+
prunes(): Promise<PrunesInfo>;
|
|
35
68
|
/** Runs on-demand prune (gated server-side by the default-deny mutation guard). */
|
|
36
69
|
prune(): Promise<{
|
|
37
70
|
pruned: number;
|
|
@@ -41,6 +74,35 @@ export interface TelescopeClient {
|
|
|
41
74
|
* threw) are EXPECTED outcomes surfaced as `{ ok: false }`, not thrown.
|
|
42
75
|
*/
|
|
43
76
|
explain(entryId: string): Promise<ExplainResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Diagnoses a captured exception (or client_exception) entry with AI. 404 (AI
|
|
79
|
+
* off / bad entry) and 502 (diagnoser failed) are EXPECTED outcomes surfaced as
|
|
80
|
+
* `{ ok: false }`, not thrown. `force` bypasses the per-family cache.
|
|
81
|
+
*/
|
|
82
|
+
diagnose(entryId: string, force?: boolean): Promise<DiagnoseResult>;
|
|
83
|
+
/**
|
|
84
|
+
* Reads the ALREADY-cached AI diagnosis for an exception entry's family, if any
|
|
85
|
+
* (the read-only `GET /exceptions/:id/diagnosis`). NEVER triggers a diagnosis —
|
|
86
|
+
* a cache miss (204) or 404 (AI off / bad entry) both resolve to `null`, so the
|
|
87
|
+
* detail page can show an auto-mode result on open without paying for a model
|
|
88
|
+
* call. Never throws on those expected outcomes.
|
|
89
|
+
*/
|
|
90
|
+
cachedDiagnosis(entryId: string): Promise<CachedDiagnosis>;
|
|
91
|
+
/** CPU profiler runtime status (`GET /profiles/status`). */
|
|
92
|
+
profilerStatus(): Promise<ProfilerStatus>;
|
|
93
|
+
/** List captured CPU profiles, newest-first, WITHOUT their frame trees (`GET /profiles`). */
|
|
94
|
+
profiles(limit?: number): Promise<Page<Entry>>;
|
|
95
|
+
/** Fetch one profile's full frame tree (`GET /profiles/:id`). */
|
|
96
|
+
profile(id: string): Promise<Entry & {
|
|
97
|
+
content: CpuProfileContent;
|
|
98
|
+
}>;
|
|
99
|
+
/**
|
|
100
|
+
* Arm an on-demand capture of the next `count` requests (optionally only those
|
|
101
|
+
* matching `label`). Gated server-side by the default-deny mutation guard.
|
|
102
|
+
*/
|
|
103
|
+
armProfile(count: number, label?: string): Promise<{
|
|
104
|
+
pendingManual: number;
|
|
105
|
+
}>;
|
|
44
106
|
liveQueues(): Promise<{
|
|
45
107
|
queues: QueueSummary[];
|
|
46
108
|
capabilities: QueueCapabilities;
|
|
@@ -69,15 +131,6 @@ export interface TelescopeClient {
|
|
|
69
131
|
}): Promise<{
|
|
70
132
|
id: string | null;
|
|
71
133
|
}>;
|
|
72
|
-
/** Dashboard auth: cookie-backed session, gated behind `dashboardAuth`. */
|
|
73
|
-
auth: {
|
|
74
|
-
/** `GET /auth/me`: 200 user / 401-with-modes / 404 (auth disabled). */
|
|
75
|
-
me(): Promise<AuthMeResult>;
|
|
76
|
-
/** `POST /auth/login`: 204 ok / 401 invalid credentials. */
|
|
77
|
-
login(username: string, password: string): Promise<LoginResult>;
|
|
78
|
-
/** `POST /auth/logout`: clears the session cookie. */
|
|
79
|
-
logout(): Promise<void>;
|
|
80
|
-
};
|
|
81
134
|
}
|
|
82
135
|
export declare function createTelescopeClient(options?: TelescopeClientOptions): TelescopeClient;
|
|
83
136
|
//# sourceMappingURL=telescope-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telescope-client.d.ts","sourceRoot":"","sources":["../../src/client/telescope-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"telescope-client.d.ts","sourceRoot":"","sources":["../../src/client/telescope-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
function isAuthMode(value) {
|
|
2
|
-
return value === 'session' || value === 'login';
|
|
3
|
-
}
|
|
4
1
|
/** Derives the API base from the server-injected mount base, falling back to the default. */
|
|
5
2
|
function defaultBaseUrl() {
|
|
6
3
|
const base = (typeof window !== 'undefined' && window.__TELESCOPE_BASE__) || '/telescope';
|
|
@@ -47,9 +44,9 @@ export function createTelescopeClient(options = {}) {
|
|
|
47
44
|
throw new Error(`Telescope API ${path} failed: ${response.status}`);
|
|
48
45
|
return (await response.json());
|
|
49
46
|
}
|
|
50
|
-
// Status-aware variants for
|
|
51
|
-
// outcomes (
|
|
52
|
-
//
|
|
47
|
+
// Status-aware variants for endpoints whose error statuses are expected
|
|
48
|
+
// outcomes (e.g. explain's 404 = feature off) rather than errors — so they
|
|
49
|
+
// must NOT throw the way `get`/`post` do.
|
|
53
50
|
async function rawGet(path) {
|
|
54
51
|
return doFetch(`${baseUrl}${path}`);
|
|
55
52
|
}
|
|
@@ -60,43 +57,16 @@ export function createTelescopeClient(options = {}) {
|
|
|
60
57
|
...(body !== undefined ? { body: JSON.stringify(body) } : {}),
|
|
61
58
|
});
|
|
62
59
|
}
|
|
63
|
-
async function
|
|
64
|
-
const response = await
|
|
60
|
+
async function explain(entryId) {
|
|
61
|
+
const response = await rawPost('/queries/explain', { entryId });
|
|
65
62
|
if (response.ok) {
|
|
66
63
|
const body = (await response.json());
|
|
67
|
-
return {
|
|
68
|
-
}
|
|
69
|
-
// 404 => dashboardAuth not configured: proceed as today (no auth screens).
|
|
70
|
-
if (response.status === 404)
|
|
71
|
-
return { status: 'disabled' };
|
|
72
|
-
// 401 (or anything else) => unauthenticated; read the offered modes.
|
|
73
|
-
const body = await readModesBody(response);
|
|
74
|
-
return { status: 'unauthenticated', modes: body };
|
|
75
|
-
}
|
|
76
|
-
async function readModesBody(response) {
|
|
77
|
-
const parsed = await response
|
|
78
|
-
.json()
|
|
79
|
-
.then((value) => value)
|
|
80
|
-
.catch(() => null);
|
|
81
|
-
if (parsed !== null &&
|
|
82
|
-
typeof parsed === 'object' &&
|
|
83
|
-
'auth' in parsed &&
|
|
84
|
-
parsed.auth !== null &&
|
|
85
|
-
typeof parsed.auth === 'object' &&
|
|
86
|
-
'modes' in parsed.auth &&
|
|
87
|
-
Array.isArray(parsed.auth.modes)) {
|
|
88
|
-
return parsed.auth.modes.filter(isAuthMode);
|
|
64
|
+
return { ok: true, plan: body.plan };
|
|
89
65
|
}
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
async function authLogin(username, password) {
|
|
93
|
-
const response = await rawPost('/auth/login', { username, password });
|
|
94
|
-
if (response.ok)
|
|
95
|
-
return { ok: true };
|
|
96
|
-
const message = await readLoginMessage(response);
|
|
66
|
+
const message = await readExplainMessage(response);
|
|
97
67
|
return { ok: false, message };
|
|
98
68
|
}
|
|
99
|
-
async function
|
|
69
|
+
async function readExplainMessage(response) {
|
|
100
70
|
const parsed = await response
|
|
101
71
|
.json()
|
|
102
72
|
.then((value) => value)
|
|
@@ -107,21 +77,31 @@ export function createTelescopeClient(options = {}) {
|
|
|
107
77
|
typeof parsed.message === 'string') {
|
|
108
78
|
return parsed.message;
|
|
109
79
|
}
|
|
110
|
-
return
|
|
111
|
-
}
|
|
112
|
-
async function authLogout() {
|
|
113
|
-
await rawPost('/auth/logout');
|
|
80
|
+
return `EXPLAIN failed (${response.status})`;
|
|
114
81
|
}
|
|
115
|
-
async function
|
|
116
|
-
const
|
|
82
|
+
async function diagnose(entryId, force = false) {
|
|
83
|
+
const query = force ? '?force=true' : '';
|
|
84
|
+
const response = await rawPost(`/exceptions/${encodeURIComponent(entryId)}/diagnose${query}`);
|
|
117
85
|
if (response.ok) {
|
|
118
86
|
const body = (await response.json());
|
|
119
|
-
return { ok: true,
|
|
87
|
+
return { ok: true, markdown: body.markdown, cached: body.cached };
|
|
120
88
|
}
|
|
121
|
-
const message = await
|
|
89
|
+
const message = await readDiagnoseMessage(response);
|
|
122
90
|
return { ok: false, message };
|
|
123
91
|
}
|
|
124
|
-
async function
|
|
92
|
+
async function cachedDiagnosis(entryId) {
|
|
93
|
+
const response = await rawGet(`/exceptions/${encodeURIComponent(entryId)}/diagnosis`);
|
|
94
|
+
// 204 (nothing cached) and 404 (AI off / bad entry) are EXPECTED "nothing to
|
|
95
|
+
// show" outcomes — resolve to null rather than throwing. A 204 has no JSON
|
|
96
|
+
// body, so guard on status before parsing.
|
|
97
|
+
if (response.status === 204 || response.status === 404)
|
|
98
|
+
return null;
|
|
99
|
+
if (!response.ok)
|
|
100
|
+
return null;
|
|
101
|
+
const body = (await response.json());
|
|
102
|
+
return { markdown: body.markdown, cached: true };
|
|
103
|
+
}
|
|
104
|
+
async function readDiagnoseMessage(response) {
|
|
125
105
|
const parsed = await response
|
|
126
106
|
.json()
|
|
127
107
|
.then((value) => value)
|
|
@@ -132,9 +112,10 @@ export function createTelescopeClient(options = {}) {
|
|
|
132
112
|
typeof parsed.message === 'string') {
|
|
133
113
|
return parsed.message;
|
|
134
114
|
}
|
|
135
|
-
return `
|
|
115
|
+
return `Diagnosis failed (${response.status})`;
|
|
136
116
|
}
|
|
137
117
|
return {
|
|
118
|
+
baseUrl,
|
|
138
119
|
entries: (query = {}) => get('/entries', {
|
|
139
120
|
type: query.type,
|
|
140
121
|
tag: query.tag,
|
|
@@ -155,14 +136,43 @@ export function createTelescopeClient(options = {}) {
|
|
|
155
136
|
tag: query.tag,
|
|
156
137
|
}),
|
|
157
138
|
traces: (window, limit) => get('/traces', { window, limit }),
|
|
139
|
+
waterfall: (traceId) => get(`/traces/${encodeURIComponent(traceId)}/waterfall`),
|
|
158
140
|
stats: (type, window) => get('/stats', { type, window }),
|
|
159
|
-
|
|
141
|
+
ai: (window, opts) => get('/ai', {
|
|
142
|
+
window,
|
|
143
|
+
buckets: opts?.buckets,
|
|
144
|
+
top: opts?.top,
|
|
145
|
+
limit: opts?.limit,
|
|
146
|
+
}),
|
|
147
|
+
tags: (prefix, opts) => get('/tags', {
|
|
148
|
+
prefix,
|
|
149
|
+
search: opts?.search?.trim() || undefined,
|
|
150
|
+
limit: opts?.limit,
|
|
151
|
+
offset: opts?.offset,
|
|
152
|
+
}),
|
|
160
153
|
meta: () => get('/meta'),
|
|
154
|
+
extData: (ext, provider, query) => {
|
|
155
|
+
const qs = query && Object.keys(query).length
|
|
156
|
+
? `?${new URLSearchParams(query).toString()}`
|
|
157
|
+
: '';
|
|
158
|
+
return get(`/ext/${encodeURIComponent(ext)}/data/${encodeURIComponent(provider)}${qs}`);
|
|
159
|
+
},
|
|
161
160
|
serverStats: () => get('/server-stats'),
|
|
161
|
+
serverStatsHistory: () => get('/server-stats/history'),
|
|
162
162
|
health: () => get('/health'),
|
|
163
163
|
retention: () => get('/retention'),
|
|
164
|
+
prunes: () => get('/prunes'),
|
|
164
165
|
prune: () => post('/retention/prune'),
|
|
165
166
|
explain,
|
|
167
|
+
diagnose,
|
|
168
|
+
cachedDiagnosis,
|
|
169
|
+
profilerStatus: () => get('/profiles/status'),
|
|
170
|
+
profiles: (limit) => get('/profiles', { limit }),
|
|
171
|
+
profile: (id) => get(`/profiles/${encodeURIComponent(id)}`),
|
|
172
|
+
armProfile: (count, label) => post('/profiles/arm', undefined, {
|
|
173
|
+
count,
|
|
174
|
+
...(label ? { label } : {}),
|
|
175
|
+
}),
|
|
166
176
|
liveQueues: () => get('/queues/live'),
|
|
167
177
|
schedulesLive: () => get('/schedules/live'),
|
|
168
178
|
queueCounts: (driver, queue) => get(`/queues/live/${encodeURIComponent(driver)}/${encodeURIComponent(queue)}/counts`),
|
|
@@ -175,11 +185,6 @@ export function createTelescopeClient(options = {}) {
|
|
|
175
185
|
queueJobAction: (driver, queue, id, action) => post(`/queues/live/${encodeURIComponent(driver)}/${encodeURIComponent(queue)}/jobs/${encodeURIComponent(id)}/${encodeURIComponent(action)}`),
|
|
176
186
|
queueAction: (driver, queue, action, opts = {}) => post(`/queues/live/${encodeURIComponent(driver)}/${encodeURIComponent(queue)}/actions/${encodeURIComponent(action)}`, { state: opts.state }),
|
|
177
187
|
queueEnqueue: (driver, queue, body) => post(`/queues/live/${encodeURIComponent(driver)}/${encodeURIComponent(queue)}/enqueue`, undefined, body),
|
|
178
|
-
auth: {
|
|
179
|
-
me: authMe,
|
|
180
|
-
login: authLogin,
|
|
181
|
-
logout: authLogout,
|
|
182
|
-
},
|
|
183
188
|
};
|
|
184
189
|
}
|
|
185
190
|
//# sourceMappingURL=telescope-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telescope-client.js","sourceRoot":"","sources":["../../src/client/telescope-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"telescope-client.js","sourceRoot":"","sources":["../../src/client/telescope-client.ts"],"names":[],"mappings":"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"}
|