qyl-mcp-server 7.3.1 → 7.4.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.
Files changed (44) hide show
  1. package/README.md +44 -5
  2. package/dist/ci.js +1 -1
  3. package/dist/ci.js.map +1 -1
  4. package/dist/collector.d.ts +9 -6
  5. package/dist/collector.js +4 -1
  6. package/dist/collector.js.map +1 -1
  7. package/dist/contract-validation.d.ts +17 -0
  8. package/dist/contract-validation.js +65 -0
  9. package/dist/contract-validation.js.map +1 -1
  10. package/dist/data.d.ts +36 -13
  11. package/dist/data.js +74 -23
  12. package/dist/data.js.map +1 -1
  13. package/dist/events.js +1 -1
  14. package/dist/events.js.map +1 -1
  15. package/dist/http-security.d.ts +1 -0
  16. package/dist/http-security.js +1 -1
  17. package/dist/http-security.js.map +1 -1
  18. package/dist/main.js +1 -4
  19. package/dist/main.js.map +1 -1
  20. package/dist/mcp-app.html +1 -1
  21. package/dist/mcp-dashboard.html +1 -1
  22. package/dist/mcp-home.html +1 -1
  23. package/dist/metrics-tools.d.ts +4 -11
  24. package/dist/metrics-tools.js +43 -44
  25. package/dist/metrics-tools.js.map +1 -1
  26. package/dist/metrics.d.ts +21 -39
  27. package/dist/metrics.js +58 -53
  28. package/dist/metrics.js.map +1 -1
  29. package/dist/paging.d.ts +16 -0
  30. package/dist/paging.js +33 -0
  31. package/dist/paging.js.map +1 -0
  32. package/dist/server.js +44 -38
  33. package/dist/server.js.map +1 -1
  34. package/dist/summaries.d.ts +13 -2
  35. package/dist/summaries.js +20 -4
  36. package/dist/summaries.js.map +1 -1
  37. package/dist/telemetry.js +7 -0
  38. package/dist/telemetry.js.map +1 -1
  39. package/dist/tools.js +66 -16
  40. package/dist/tools.js.map +1 -1
  41. package/package.json +2 -2
  42. package/dist/contract-operations.d.ts +0 -37
  43. package/dist/contract-operations.js +0 -124
  44. package/dist/contract-operations.js.map +0 -1
@@ -6,7 +6,7 @@
6
6
  <meta name="color-scheme" content="dark">
7
7
  <meta name="description" content="Bring qyl traces, logs, and MCP telemetry into your coding agent.">
8
8
  <title>qyl · MCP telemetry for coding agents</title>
9
- <script type="module" crossorigin>(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=`7.3.1`,t=`https://mcp.qyl.at/mcp`,n={codex:{title:`terminal`,value:`codex mcp add qyl --url ${t}`},claude:{title:`terminal`,value:`claude mcp add --transport http qyl ${t}`},cursor:{title:`mcp.json`,value:`{
9
+ <script type="module" crossorigin>(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=`7.4.0`,t=`https://mcp.qyl.at/mcp`,n={codex:{title:`terminal`,value:`codex mcp add qyl --url ${t}`},claude:{title:`terminal`,value:`claude mcp add --transport http qyl ${t}`},cursor:{title:`mcp.json`,value:`{
10
10
  "mcpServers": {
11
11
  "qyl": {
12
12
  "url": "${t}"
@@ -7,17 +7,10 @@
7
7
  * single tool with a mode argument would make every call carry the arguments of
8
8
  * the other two.
9
9
  *
10
- * Output shapes are the operations' own 200 bodies from contract-validation.ts.
11
- * Input shapes are derived from the same operations' published parameters (see
12
- * contract-operations.ts): the metrics API landed in @ancplua/qyl-api-schema
13
- * 8.0.0 with responses but without `Mcp.Tools.*Metric*` input models, and
14
- * generating them from the OpenAPI document keeps gate G10a honest instead of
15
- * exempting three hand-written objects from it.
10
+ * Input and output shapes are the contract's `Mcp.Tools.*Metric*` models from
11
+ * contract-validation.ts, like every other tool. The two list tools page: the
12
+ * page's own `has_more` and `next_cursor` travel with the items, and the same
13
+ * `cursor` input continues the list.
16
14
  */
17
15
  import type { McpServer } from "@modelcontextprotocol/server";
18
- /**
19
- * The list operations page, and their pages are the tool's output. `has_more`
20
- * is the page's own flag, so a reader can tell a complete catalog from a first
21
- * page; the cursor does not travel yet, because these tools take no cursor.
22
- */
23
16
  export declare function registerMetricsTools(server: McpServer): void;
@@ -7,83 +7,82 @@
7
7
  * single tool with a mode argument would make every call carry the arguments of
8
8
  * the other two.
9
9
  *
10
- * Output shapes are the operations' own 200 bodies from contract-validation.ts.
11
- * Input shapes are derived from the same operations' published parameters (see
12
- * contract-operations.ts): the metrics API landed in @ancplua/qyl-api-schema
13
- * 8.0.0 with responses but without `Mcp.Tools.*Metric*` input models, and
14
- * generating them from the OpenAPI document keeps gate G10a honest instead of
15
- * exempting three hand-written objects from it.
10
+ * Input and output shapes are the contract's `Mcp.Tools.*Metric*` models from
11
+ * contract-validation.ts, like every other tool. The two list tools page: the
12
+ * page's own `has_more` and `next_cursor` travel with the items, and the same
13
+ * `cursor` input continues the list.
16
14
  */
17
- import { operationInputSchema } from "./contract-operations.js";
18
- import { MetricQueryResultSchema, MetricsListResponseSchema, MetricSeriesListResponseSchema, compactOutputSchema, } from "./contract-validation.js";
15
+ import { GetMetricSeriesInputSchema, GetMetricSeriesOutputSchema, ListMetricsInputSchema, ListMetricsOutputSchema, QueryMetricInputSchema, QueryMetricOutputSchema, compactOutputSchema, } from "./contract-validation.js";
19
16
  import { listMetricSeries, listMetrics, queryMetric, } from "./metrics.js";
20
- import { summarizeMetricCatalog, summarizeMetricQuery, summarizeMetricSeries, } from "./summaries.js";
17
+ import { pageNote, summarizeMetricCatalog, summarizeMetricQuery, summarizeMetricSeries, } from "./summaries.js";
21
18
  import { runTool } from "./request-scope.js";
22
19
  import { telemetryToolResult } from "./telemetry-redaction.js";
23
20
  import { READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS, TELEMETRY_TOOL_AUTH_META } from "./tools.js";
24
- const METRICS_PATH = "/api/v1/metrics";
25
- const SERIES_PATH = "/api/v1/metrics/{metric_name}/series";
26
- const QUERY_PATH = "/api/v1/metrics/{metric_name}/query";
27
- /**
28
- * The list operations page, and their pages are the tool's output. `has_more`
29
- * is the page's own flag, so a reader can tell a complete catalog from a first
30
- * page; the cursor does not travel yet, because these tools take no cursor.
31
- */
32
21
  export function registerMetricsTools(server) {
33
22
  server.registerTool("list_metrics", {
34
23
  title: "List Metrics",
35
24
  description: "List the metric instruments recorded for this project: name, kind " +
36
25
  "(gauge/sum/histogram), unit, how many attribute streams exist under each " +
37
26
  "name, and when it was last written. Useful when the user wants to discover " +
38
- "instrument names before querying a metric by its exact name.",
39
- inputSchema: operationInputSchema(METRICS_PATH),
40
- outputSchema: compactOutputSchema(MetricsListResponseSchema),
27
+ "instrument names before querying a metric by its exact name. name_prefix " +
28
+ "narrows the catalog; when has_more is true, pass next_cursor as cursor with " +
29
+ "the same prefix for the next page.",
30
+ inputSchema: ListMetricsInputSchema,
31
+ outputSchema: compactOutputSchema(ListMetricsOutputSchema),
41
32
  annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
42
33
  _meta: TELEMETRY_TOOL_AUTH_META,
43
34
  }, (args, ctx) => runTool(ctx, 1, async (scope) => {
44
- const { metrics, hasMore, mode } = await listMetrics(args, scope.collector);
45
- await scope.step(`Fetched ${metrics.length} metric instrument(s)`);
46
- return telemetryToolResult(summarizeMetricCatalog(metrics, mode), {
47
- items: metrics,
48
- has_more: hasMore,
49
- });
35
+ const page = await listMetrics(args, scope.collector);
36
+ await scope.step(`Fetched ${page.items.length} metric instrument(s)`);
37
+ const output = {
38
+ items: page.items,
39
+ has_more: page.hasMore,
40
+ ...(page.nextCursor === undefined ? {} : { next_cursor: page.nextCursor }),
41
+ };
42
+ return telemetryToolResult(summarizeMetricCatalog(page.items, page.mode) + pageNote(page), output);
50
43
  }));
51
44
  server.registerTool("get_metric_series", {
52
45
  title: "Get Metric Series",
53
46
  description: "List the distinct attribute streams recorded under one metric name, with " +
54
47
  "each stream's attributes, service, and first/last seen. Useful when the user " +
55
- "wants to discover group_by keys or attr filters for query_metric before " +
56
- "choosing the groups in a range query.",
57
- inputSchema: operationInputSchema(SERIES_PATH),
58
- outputSchema: compactOutputSchema(MetricSeriesListResponseSchema),
48
+ "wants to discover group_by keys or matchers for query_metric before " +
49
+ "choosing the groups in a range query. matchers narrow the streams: each is " +
50
+ "{key, op, value} with op eq (exact) or prefix. When has_more is true, pass " +
51
+ "next_cursor as cursor with the same matchers for the next page.",
52
+ inputSchema: GetMetricSeriesInputSchema,
53
+ outputSchema: compactOutputSchema(GetMetricSeriesOutputSchema),
59
54
  annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
60
55
  _meta: TELEMETRY_TOOL_AUTH_META,
61
56
  }, (args, ctx) => runTool(ctx, 1, async (scope) => {
62
- const { series, hasMore, mode } = await listMetricSeries(args, scope.collector);
63
- await scope.step(`Fetched ${series.length} series of ${args.metric_name}`);
64
- return telemetryToolResult(summarizeMetricSeries(series, mode), {
65
- items: series,
66
- has_more: hasMore,
67
- });
57
+ const page = await listMetricSeries(args, scope.collector);
58
+ await scope.step(`Fetched ${page.items.length} series of ${args.metric_name}`);
59
+ const output = {
60
+ items: page.items,
61
+ has_more: page.hasMore,
62
+ ...(page.nextCursor === undefined ? {} : { next_cursor: page.nextCursor }),
63
+ };
64
+ return telemetryToolResult(summarizeMetricSeries(page.items, page.mode) + pageNote(page), output);
68
65
  }));
69
66
  server.registerTool("query_metric", {
70
67
  title: "Query Metric",
71
68
  description: "Run a time-bucketed range query when the user wants to compare a metric " +
72
69
  "over time or across groups: a window (start_time, " +
73
- "end_time), a bucket width (step_ms), a reducer (aggregation: avg, min, max, " +
74
- "sum, count, last, p50, p90, p95, p99), optional group_by attribute keys, and " +
75
- "optional attr/attr_prefix matchers written 'key=value'. Returns one stream " +
76
- "per grouping with its buckets. With step_ms equal to the window duration, " +
77
- "each grouping yields one bucket: one number per series.",
78
- inputSchema: operationInputSchema(QUERY_PATH),
79
- outputSchema: compactOutputSchema(MetricQueryResultSchema),
70
+ "end_time), a bucket width in whole milliseconds (step_ms), a reducer " +
71
+ "(aggregation: avg, min, max, sum, count, last, p50, p90, p95, p99), optional " +
72
+ "group_by attribute keys, and optional matchers, each {key, op, value} with op " +
73
+ "eq (exact) or prefix. Returns one stream per grouping with its buckets. With " +
74
+ "step_ms equal to the window duration, each grouping yields one bucket: one " +
75
+ "number per series.",
76
+ inputSchema: QueryMetricInputSchema,
77
+ outputSchema: compactOutputSchema(QueryMetricOutputSchema),
80
78
  annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
81
79
  _meta: TELEMETRY_TOOL_AUTH_META,
82
80
  }, (args, ctx) => runTool(ctx, 1, async (scope) => {
83
81
  const { result, mode } = await queryMetric(args, scope.collector);
84
82
  await scope.step(`Queried ${args.metric_name}: ${result.series.length} series, ` +
85
83
  `${result.series[0]?.buckets.length ?? 0} bucket(s) each`);
86
- return telemetryToolResult(summarizeMetricQuery(result, mode), result);
84
+ const output = result;
85
+ return telemetryToolResult(summarizeMetricQuery(result, mode), output);
87
86
  }));
88
87
  }
89
88
  //# sourceMappingURL=metrics-tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics-tools.js","sourceRoot":"","sources":["../src/metrics-tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metrics-tools.js","sourceRoot":"","sources":["../src/metrics-tools.ts"],"names":[],"mappings":"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"}
package/dist/metrics.d.ts CHANGED
@@ -1,52 +1,34 @@
1
1
  /**
2
- * Metric reading over the contract 8.0.0 metrics API, live and demo.
2
+ * Metric reading over the contract metrics API, live and demo.
3
3
  *
4
4
  * Live mode forwards to the collector's three published operations and revalidates
5
5
  * the answer against the operation's own 200 body. Demo mode holds stored points
6
6
  * and runs the same bucketing and reducer the collector would, so a demo answer
7
- * honors step_ms, aggregation, group_by and the attribute matchers rather than
8
- * pretending they were applied — the invariant the rest of the demo dataset keeps.
7
+ * honors step_ms, aggregation, group_by, the attribute matchers and the cursor
8
+ * rather than pretending they were applied — the invariant the rest of the demo
9
+ * dataset keeps.
10
+ *
11
+ * The tool inputs are the contract's `Mcp.Tools.*Metric*` models (11.6.0). A
12
+ * matcher is structured, `{ key, op, value }`; the wire keeps the collector's
13
+ * `attr` / `attr_prefix` strings, so the tool layer serializes `eq` and `prefix`
14
+ * to them and nothing else.
9
15
  */
10
- import type { MetricAggregation, MetricDescriptor, MetricQueryResult, MetricSeries } from "@ancplua/qyl-api-schema/types";
16
+ import type { GetMetricSeriesInput, ListMetricsInput, MetricDescriptor, MetricQueryResult, MetricSeries, QueryMetricInput } from "@ancplua/qyl-api-schema/types";
11
17
  import { type CollectorRequestOptions } from "./collector.js";
12
18
  import type { Mode } from "./wire.js";
13
- /** Tool arguments, mirroring the published operation parameters that shape them. */
14
- export interface ListMetricsArgs {
15
- name_prefix?: string;
16
- limit?: number;
17
- }
18
- export interface MetricSeriesArgs {
19
- metric_name: string;
20
- attr?: readonly string[];
21
- attr_prefix?: readonly string[];
22
- limit?: number;
23
- }
24
- export interface QueryMetricArgs {
25
- metric_name: string;
26
- start_time: string;
27
- end_time: string;
28
- step_ms?: number;
29
- aggregation?: MetricAggregation;
30
- group_by?: readonly string[];
31
- attr?: readonly string[];
32
- attr_prefix?: readonly string[];
33
- series_limit?: number;
34
- }
35
- /**
36
- * `hasMore` is the page's own flag: the collector's `has_more` live, and
37
- * "more matched than `limit`" in demo mode. The tools pass it through so a
38
- * truncated catalog never reads as a complete one.
39
- */
40
- export declare function listMetrics(args: ListMetricsArgs, options?: CollectorRequestOptions): Promise<{
41
- metrics: MetricDescriptor[];
19
+ /** Tool arguments are the published tool input models. */
20
+ export type ListMetricsArgs = ListMetricsInput;
21
+ export type MetricSeriesArgs = GetMetricSeriesInput;
22
+ export type QueryMetricArgs = QueryMetricInput;
23
+ /** A page of metric items with the mode it came from; the cursor is added after redaction. */
24
+ export interface MetricPage<T> {
25
+ items: T[];
42
26
  hasMore: boolean;
27
+ nextCursor?: string;
43
28
  mode: Mode;
44
- }>;
45
- export declare function listMetricSeries(args: MetricSeriesArgs, options?: CollectorRequestOptions): Promise<{
46
- series: MetricSeries[];
47
- hasMore: boolean;
48
- mode: Mode;
49
- }>;
29
+ }
30
+ export declare function listMetrics(args: ListMetricsArgs, options?: CollectorRequestOptions): Promise<MetricPage<MetricDescriptor>>;
31
+ export declare function listMetricSeries(args: MetricSeriesArgs, options?: CollectorRequestOptions): Promise<MetricPage<MetricSeries>>;
50
32
  export declare function queryMetric(args: QueryMetricArgs, options?: CollectorRequestOptions): Promise<{
51
33
  result: MetricQueryResult;
52
34
  mode: Mode;
package/dist/metrics.js CHANGED
@@ -1,41 +1,58 @@
1
1
  /**
2
- * Metric reading over the contract 8.0.0 metrics API, live and demo.
2
+ * Metric reading over the contract metrics API, live and demo.
3
3
  *
4
4
  * Live mode forwards to the collector's three published operations and revalidates
5
5
  * the answer against the operation's own 200 body. Demo mode holds stored points
6
6
  * and runs the same bucketing and reducer the collector would, so a demo answer
7
- * honors step_ms, aggregation, group_by and the attribute matchers rather than
8
- * pretending they were applied — the invariant the rest of the demo dataset keeps.
7
+ * honors step_ms, aggregation, group_by, the attribute matchers and the cursor
8
+ * rather than pretending they were applied — the invariant the rest of the demo
9
+ * dataset keeps.
10
+ *
11
+ * The tool inputs are the contract's `Mcp.Tools.*Metric*` models (11.6.0). A
12
+ * matcher is structured, `{ key, op, value }`; the wire keeps the collector's
13
+ * `attr` / `attr_prefix` strings, so the tool layer serializes `eq` and `prefix`
14
+ * to them and nothing else.
9
15
  */
10
16
  import { attributeIdentity, formatAttributeValue } from "@ancplua/qyl-api-schema/runtime";
11
17
  import { CollectorError, collectorGet, parseCollectorMetricDescriptor, parseCollectorMetricQueryResult, parseCollectorMetricSeries, parseCollectorPage, resolveMode, } from "./collector.js";
12
18
  import { MetricsListResponseSchema, MetricSeriesListResponseSchema, } from "./contract-validation.js";
13
19
  import { getDemoMetrics } from "./demo.js";
20
+ import { demoPage } from "./paging.js";
14
21
  import { redactTelemetry } from "./telemetry-redaction.js";
15
22
  const METRICS_PATH = "/api/v1/metrics";
23
+ function metricPage(page, mode) {
24
+ return {
25
+ ...redactTelemetry({ items: page.items, mode }),
26
+ hasMore: page.hasMore,
27
+ ...(page.nextCursor === undefined ? {} : { nextCursor: page.nextCursor }),
28
+ };
29
+ }
16
30
  /**
17
- * `key=value` and `key=prefix` are the published spellings of both matcher
18
- * lists. A matcher without `=` is the model's mistake, not the collector's, so
19
- * it fails here with the offending text rather than reaching the wire as a
20
- * silently ignored filter.
31
+ * The collector's published spellings of the two matcher lists: `eq` becomes
32
+ * `attr=key=value`, `prefix` becomes `attr_prefix=key=value`. The collector
33
+ * splits on the first `=`, so a value containing `=` survives.
21
34
  */
22
- function parseMatchers(raw, parameter) {
23
- return (raw ?? []).map((entry) => {
24
- const separator = entry.indexOf("=");
25
- if (separator <= 0) {
26
- throw new CollectorError(`${parameter} entries are written 'key=value'; received ${JSON.stringify(entry)}`);
27
- }
28
- return { key: entry.slice(0, separator), value: entry.slice(separator + 1) };
29
- });
35
+ function wireMatchers(matchers) {
36
+ const attr = [];
37
+ const attr_prefix = [];
38
+ for (const matcher of matchers ?? []) {
39
+ (matcher.op === "eq" ? attr : attr_prefix).push(`${matcher.key}=${matcher.value}`);
40
+ }
41
+ return {
42
+ attr: attr.length === 0 ? undefined : attr,
43
+ attr_prefix: attr_prefix.length === 0 ? undefined : attr_prefix,
44
+ };
30
45
  }
31
46
  function attributeFormatted(attributes, key) {
32
47
  const found = attributes.find((attribute) => attribute.key === key);
33
48
  return found === undefined ? undefined : formatAttributeValue(found.value);
34
49
  }
35
- function matchesStream(stream, exact, prefixes) {
50
+ function matchesStream(stream, matchers) {
36
51
  const read = (key) => key === "service.name" ? stream.serviceName : attributeFormatted(stream.attributes, key);
37
- return (exact.every((matcher) => read(matcher.key) === matcher.value) &&
38
- prefixes.every((matcher) => read(matcher.key)?.startsWith(matcher.value) === true));
52
+ return (matchers ?? []).every((matcher) => {
53
+ const value = read(matcher.key);
54
+ return matcher.op === "eq" ? value === matcher.value : value?.startsWith(matcher.value) === true;
55
+ });
39
56
  }
40
57
  /** Stable across rebuilds because it is derived from identity, not from order. */
41
58
  function demoSeriesId(stream) {
@@ -52,11 +69,9 @@ function demoSeriesId(stream) {
52
69
  }
53
70
  return hash.toString(16).padStart(8, "0");
54
71
  }
55
- /**
56
- * `hasMore` is the page's own flag: the collector's `has_more` live, and
57
- * "more matched than `limit`" in demo mode. The tools pass it through so a
58
- * truncated catalog never reads as a complete one.
59
- */
72
+ function demoNotFound(metricName) {
73
+ return new CollectorError(`metric not found: ${metricName}`, false, undefined, "not_found");
74
+ }
60
75
  export async function listMetrics(args, options = {}) {
61
76
  const mode = await resolveMode();
62
77
  const limit = args.limit ?? 200;
@@ -71,14 +86,13 @@ export async function listMetrics(args, options = {}) {
71
86
  else
72
87
  byName.set(stream.name, [stream]);
73
88
  }
74
- const sorted = [...byName.entries()]
75
- .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0));
76
- const metrics = sorted
77
- .slice(0, limit)
89
+ const metrics = [...byName.entries()]
90
+ .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
78
91
  .map(([name, streams]) => {
79
92
  const [first] = streams;
80
- if (first === undefined)
93
+ if (first === undefined) {
81
94
  throw new CollectorError(`demo metric ${name} has no streams`, false, undefined, "internal");
95
+ }
82
96
  const lastSeen = Math.max(...streams.map((stream) => stream.points.at(-1)?.atMs ?? 0));
83
97
  return {
84
98
  name,
@@ -91,23 +105,20 @@ export async function listMetrics(args, options = {}) {
91
105
  last_seen: new Date(lastSeen).toISOString(),
92
106
  };
93
107
  });
94
- return redactTelemetry({ metrics, hasMore: sorted.length > limit, mode });
108
+ return metricPage(demoPage(metrics, limit, args.cursor), mode);
95
109
  }
96
- const body = await collectorGet(METRICS_PATH, { name_prefix: args.name_prefix, limit }, options);
97
- const page = parseCollectorPage(body, METRICS_PATH, MetricsListResponseSchema, parseCollectorMetricDescriptor);
98
- return redactTelemetry({ metrics: page.items, hasMore: page.hasMore, mode });
110
+ const body = await collectorGet(METRICS_PATH, { name_prefix: args.name_prefix, limit, cursor: args.cursor }, options);
111
+ return metricPage(parseCollectorPage(body, METRICS_PATH, MetricsListResponseSchema, parseCollectorMetricDescriptor), mode);
99
112
  }
100
113
  export async function listMetricSeries(args, options = {}) {
101
114
  const mode = await resolveMode();
102
115
  const limit = args.limit ?? 200;
103
- const exact = parseMatchers(args.attr, "attr");
104
- const prefixes = parseMatchers(args.attr_prefix, "attr_prefix");
105
116
  if (mode === "demo") {
106
- const streams = getDemoMetrics().filter((stream) => stream.name === args.metric_name && matchesStream(stream, exact, prefixes));
117
+ const streams = getDemoMetrics().filter((stream) => stream.name === args.metric_name && matchesStream(stream, args.matchers));
107
118
  if (streams.length === 0 && !getDemoMetrics().some((s) => s.name === args.metric_name)) {
108
- throw new CollectorError(`metric not found: ${args.metric_name}`, false, undefined, "not_found");
119
+ throw demoNotFound(args.metric_name);
109
120
  }
110
- const series = streams.slice(0, limit).map((stream) => ({
121
+ const series = streams.map((stream) => ({
111
122
  series_id: demoSeriesId(stream),
112
123
  name: stream.name,
113
124
  kind: stream.kind,
@@ -117,18 +128,16 @@ export async function listMetricSeries(args, options = {}) {
117
128
  first_seen: new Date(stream.points[0]?.atMs ?? 0).toISOString(),
118
129
  last_seen: new Date(stream.points.at(-1)?.atMs ?? 0).toISOString(),
119
130
  }));
120
- return redactTelemetry({ series, hasMore: streams.length > limit, mode });
131
+ return metricPage(demoPage(series, limit, args.cursor), mode);
121
132
  }
122
133
  const path = `${METRICS_PATH}/${encodeURIComponent(args.metric_name)}/series`;
123
134
  try {
124
- const body = await collectorGet(path, { attr: args.attr, attr_prefix: args.attr_prefix, limit }, options);
125
- const page = parseCollectorPage(body, path, MetricSeriesListResponseSchema, parseCollectorMetricSeries);
126
- return redactTelemetry({ series: page.items, hasMore: page.hasMore, mode });
135
+ const body = await collectorGet(path, { ...wireMatchers(args.matchers), limit, cursor: args.cursor }, options);
136
+ return metricPage(parseCollectorPage(body, path, MetricSeriesListResponseSchema, parseCollectorMetricSeries), mode);
127
137
  }
128
138
  catch (error) {
129
- if (error instanceof CollectorError && error.status === 404) {
130
- throw new CollectorError(`metric not found: ${args.metric_name}`, false, undefined, "not_found");
131
- }
139
+ if (error instanceof CollectorError && error.status === 404)
140
+ throw demoNotFound(args.metric_name);
132
141
  throw error;
133
142
  }
134
143
  }
@@ -180,12 +189,10 @@ export async function queryMetric(args, options = {}) {
180
189
  const stepMs = args.step_ms ?? 60_000;
181
190
  const aggregation = args.aggregation ?? "avg";
182
191
  const seriesLimit = args.series_limit ?? 50;
183
- const exact = parseMatchers(args.attr, "attr");
184
- const prefixes = parseMatchers(args.attr_prefix, "attr_prefix");
185
192
  if (mode === "demo") {
186
- const streams = getDemoMetrics().filter((stream) => stream.name === args.metric_name && matchesStream(stream, exact, prefixes));
193
+ const streams = getDemoMetrics().filter((stream) => stream.name === args.metric_name && matchesStream(stream, args.matchers));
187
194
  if (!getDemoMetrics().some((stream) => stream.name === args.metric_name)) {
188
- throw new CollectorError(`metric not found: ${args.metric_name}`, false, undefined, "not_found");
195
+ throw demoNotFound(args.metric_name);
189
196
  }
190
197
  const startMs = Date.parse(args.start_time);
191
198
  const endMs = Date.parse(args.end_time);
@@ -245,16 +252,14 @@ export async function queryMetric(args, options = {}) {
245
252
  step_ms: stepMs,
246
253
  aggregation,
247
254
  group_by: args.group_by,
248
- attr: args.attr,
249
- attr_prefix: args.attr_prefix,
255
+ ...wireMatchers(args.matchers),
250
256
  series_limit: seriesLimit,
251
257
  }, options);
252
258
  return redactTelemetry({ result: parseCollectorMetricQueryResult(body, path), mode });
253
259
  }
254
260
  catch (error) {
255
- if (error instanceof CollectorError && error.status === 404) {
256
- throw new CollectorError(`metric not found: ${args.metric_name}`, false, undefined, "not_found");
257
- }
261
+ if (error instanceof CollectorError && error.status === 404)
262
+ throw demoNotFound(args.metric_name);
258
263
  throw error;
259
264
  }
260
265
  }
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EACL,cAAc,EAEd,YAAY,EACZ,8BAA8B,EAC9B,+BAA+B,EAC/B,0BAA0B,EAC1B,kBAAkB,EAClB,WAAW,GACZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,cAAc,EAAyB,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAG3D,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAgCvC;;;;;GAKG;AACH,SAAS,aAAa,CAAC,GAAkC,EAAE,SAAiB;IAC1E,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,cAAc,CACtB,GAAG,SAAS,8CAA8C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAClF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;IAC/E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAgC,EAAE,GAAW;IACvE,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IACpE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,aAAa,CACpB,MAAwB,EACxB,KAAyB,EACzB,QAA4B;IAE5B,MAAM,IAAI,GAAG,CAAC,GAAW,EAAsB,EAAE,CAC/C,GAAG,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC3F,OAAO,CACL,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC;QAC7D,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CACnF,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,SAAS,YAAY,CAAC,MAAwB;IAC5C,MAAM,QAAQ,GAAG;QACf,MAAM,CAAC,IAAI;QACX,MAAM,CAAC,WAAW;QAClB,6EAA6E;QAC7E,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,GAAG,IAAI,iBAAiB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;KAClG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACxD,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAqB,EACrB,OAAO,GAA4B,EAAE;IAErC,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;IAEhC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;QACrD,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;gBAAE,SAAS;YAC1F,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;gBAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;aACjC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,MAAM;aACnB,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;aACf,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAoB,EAAE;YACzC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;YACxB,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,IAAI,cAAc,CAAC,eAAe,IAAI,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YACtH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACvB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAC5D,CAAC;YACF,OAAO;gBACL,IAAI;gBACJ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,YAAY,EAAE,OAAO,CAAC,MAAM;gBAC5B,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;aAC5C,CAAC;QACJ,CAAC,CAAC,CAAC;QACL,OAAO,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,YAAY,CAC7B,YAAY,EACZ,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,EACxC,OAAO,CACR,CAAC;IACF,MAAM,IAAI,GAAG,kBAAkB,CAC7B,IAAI,EACJ,YAAY,EACZ,yBAAyB,EACzB,8BAA8B,CAC/B,CAAC;IACF,OAAO,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAsB,EACtB,OAAO,GAA4B,EAAE;IAErC,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;IAChC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAEhE,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC,MAAM,CACrC,CAAC,MAAM,EAAE,EAAE,CACT,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,IAAI,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAC7E,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACvF,MAAM,IAAI,cAAc,CAAC,qBAAqB,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACnG,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAgB,EAAE,CAAC,CAAC;YACpE,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC;YAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,YAAY,EAAE,MAAM,CAAC,WAAW;YAChC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;YAC/D,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;SACnE,CAAC,CAAC,CAAC;QACJ,OAAO,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,YAAY,IAAI,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;IAC9E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,YAAY,CAC7B,IAAI,EACJ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,EACzD,OAAO,CACR,CAAC;QACF,MAAM,IAAI,GAAG,kBAAkB,CAC7B,IAAI,EACJ,IAAI,EACJ,8BAA8B,EAC9B,0BAA0B,CAC3B,CAAC;QACF,OAAO,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,cAAc,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5D,MAAM,IAAI,cAAc,CAAC,qBAAqB,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACnG,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,SAAS,MAAM,CAAC,MAAgB,EAAE,WAA8B;IAC9D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAU,EAAE;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAChF,OAAO,MAAM,CAAC,KAAK,CAAW,CAAC;IACjC,CAAC,CAAC;IACF,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QAC3E,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,CAAC,CAAW,CAAC;QAC7B,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAW,CAAC;QAC7C,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3D,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAW,CAAC;QAC7C,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAClB,MAAwB,EACxB,OAA0B;IAE1B,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,GAAG,KAAK,cAAc;YAClC,CAAC,CAAC,MAAM,CAAC,WAAW;YACpB,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS;YAAE,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC;AAC3G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAqB,EACrB,OAAO,GAA4B,EAAE;IAErC,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC;IAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAEhE,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC,MAAM,CACrC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,IAAI,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CACvF,CAAC;QACF,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,cAAc,CAAC,qBAAqB,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACnG,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7E,MAAM,IAAI,cAAc,CAAC,qDAAqD,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoE,CAAC;QAC3F,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,QAAQ;gBAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;gBACvC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACvE,MAAM,MAAM,GAAyB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/E,MAAM,OAAO,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1E,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClC,IAAI,KAAK,CAAC,IAAI,GAAG,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK;wBAAE,SAAS;oBAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;oBACpF,OAAO,CAAC,KAAK,CAAc,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;YACD,OAAO;gBACL,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBACvC,YAAY,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE;oBAC9D,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;oBAClC,WAAW,EAAE,MAAM,CAAC,MAAM;iBAC3B,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,MAAM,GAAsB;YAChC,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,OAAO;YAC5B,IAAI,EAAE,KAAK,EAAE,IAAI;YACjB,WAAW;YACX,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;YAC3C,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;YACvC,MAAM;YACN,SAAS;SACV,CAAC;QACF,OAAO,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,YAAY,IAAI,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IAC7E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,YAAY,CAC7B,IAAI,EACJ;YACE,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,MAAM;YACf,WAAW;YACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,WAAW;SAC1B,EACD,OAAO,CACR,CAAC;QACF,OAAO,eAAe,CAAC,EAAE,MAAM,EAAE,+BAA+B,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACxF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,cAAc,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5D,MAAM,IAAI,cAAc,CAAC,qBAAqB,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACnG,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Demo-mode paging.
3
+ *
4
+ * Live pages come from the Collector with its own opaque cursor. The demo
5
+ * dataset has no Collector, so it pages itself the same way a caller sees it:
6
+ * an opaque cursor, `has_more` taken from the data, and a cursor that does not
7
+ * decode is the caller's mistake, never a silent first page again — the
8
+ * invariant that demo honors every filter the live endpoints support.
9
+ */
10
+ /** One page of a list, in the shape every list tool returns. */
11
+ export interface Page<T> {
12
+ items: T[];
13
+ hasMore: boolean;
14
+ nextCursor?: string;
15
+ }
16
+ export declare function demoPage<T>(items: readonly T[], limit: number, cursor: string | undefined): Page<T>;
package/dist/paging.js ADDED
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Demo-mode paging.
3
+ *
4
+ * Live pages come from the Collector with its own opaque cursor. The demo
5
+ * dataset has no Collector, so it pages itself the same way a caller sees it:
6
+ * an opaque cursor, `has_more` taken from the data, and a cursor that does not
7
+ * decode is the caller's mistake, never a silent first page again — the
8
+ * invariant that demo honors every filter the live endpoints support.
9
+ */
10
+ import { CollectorError } from "./collector.js";
11
+ const DEMO_CURSOR_PREFIX = "demo:";
12
+ export function demoPage(items, limit, cursor) {
13
+ const offset = cursor === undefined ? 0 : decodeDemoCursor(cursor);
14
+ const end = offset + limit;
15
+ const hasMore = end < items.length;
16
+ return {
17
+ items: items.slice(offset, end),
18
+ hasMore,
19
+ ...(hasMore ? { nextCursor: encodeDemoCursor(end) } : {}),
20
+ };
21
+ }
22
+ function encodeDemoCursor(offset) {
23
+ return Buffer.from(`${DEMO_CURSOR_PREFIX}${offset}`).toString("base64url");
24
+ }
25
+ function decodeDemoCursor(cursor) {
26
+ const decoded = Buffer.from(cursor, "base64url").toString();
27
+ const digits = decoded.startsWith(DEMO_CURSOR_PREFIX) ? decoded.slice(DEMO_CURSOR_PREFIX.length) : "";
28
+ if (!/^\d{1,9}$/u.test(digits)) {
29
+ throw new CollectorError("cursor is not a qyl cursor; pass the previous page's next_cursor unchanged, with the same filters", false, undefined, "invalid_argument");
30
+ }
31
+ return Number(digits);
32
+ }
33
+ //# sourceMappingURL=paging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paging.js","sourceRoot":"","sources":["../src/paging.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAShD,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEnC,MAAM,UAAU,QAAQ,CAAI,KAAmB,EAAE,KAAa,EAAE,MAA0B;IACxF,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,MAAM,GAAG,KAAK,CAAC;IAC3B,MAAM,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACnC,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC;QAC/B,OAAO;QACP,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAkB,GAAG,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,cAAc,CACtB,mGAAmG,EACnG,KAAK,EACL,SAAS,EACT,kBAAkB,CACnB,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC"}