qyl-mcp-server 7.6.1 → 8.0.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 (80) hide show
  1. package/README.md +89 -89
  2. package/dist/analysis-budget.d.ts +8 -0
  3. package/dist/analysis-budget.js +73 -0
  4. package/dist/analysis-budget.js.map +1 -0
  5. package/dist/analysis-client.d.ts +5 -0
  6. package/dist/analysis-client.js +46 -0
  7. package/dist/analysis-client.js.map +1 -0
  8. package/dist/analysis-summary.d.ts +2 -0
  9. package/dist/analysis-summary.js +54 -0
  10. package/dist/analysis-summary.js.map +1 -0
  11. package/dist/analysis-tools.d.ts +3 -0
  12. package/dist/analysis-tools.js +167 -0
  13. package/dist/analysis-tools.js.map +1 -0
  14. package/dist/authorization.d.ts +2 -0
  15. package/dist/authorization.js +8 -6
  16. package/dist/authorization.js.map +1 -1
  17. package/dist/ci.d.ts +2 -23
  18. package/dist/ci.js +7 -108
  19. package/dist/ci.js.map +1 -1
  20. package/dist/collector-resources.d.ts +17 -25
  21. package/dist/collector-resources.js +33 -147
  22. package/dist/collector-resources.js.map +1 -1
  23. package/dist/collector.d.ts +7 -43
  24. package/dist/collector.js +22 -172
  25. package/dist/collector.js.map +1 -1
  26. package/dist/config.d.ts +2 -2
  27. package/dist/config.js +2 -2
  28. package/dist/contract-handshake.js +0 -6
  29. package/dist/contract-handshake.js.map +1 -1
  30. package/dist/contract-validation.d.ts +0 -1
  31. package/dist/contract-validation.js +0 -1
  32. package/dist/contract-validation.js.map +1 -1
  33. package/dist/data.d.ts +3 -69
  34. package/dist/data.js +6 -182
  35. package/dist/data.js.map +1 -1
  36. package/dist/events-authorization.d.ts +1 -1
  37. package/dist/events.d.ts +3 -2
  38. package/dist/events.js +1 -1
  39. package/dist/events.js.map +1 -1
  40. package/dist/main.d.ts +1 -8
  41. package/dist/main.js +6 -10
  42. package/dist/main.js.map +1 -1
  43. package/dist/mcp-app.html +2 -3
  44. package/dist/mcp-dashboard.html +3 -4
  45. package/dist/mcp-home.html +1 -1
  46. package/dist/metrics-tools.d.ts +0 -14
  47. package/dist/metrics-tools.js +14 -71
  48. package/dist/metrics-tools.js.map +1 -1
  49. package/dist/request-scope.d.ts +3 -0
  50. package/dist/request-scope.js +7 -3
  51. package/dist/request-scope.js.map +1 -1
  52. package/dist/secret-redactor.js +13 -0
  53. package/dist/secret-redactor.js.map +1 -1
  54. package/dist/server.d.ts +3 -16
  55. package/dist/server.js +24 -123
  56. package/dist/server.js.map +1 -1
  57. package/dist/summaries.d.ts +2 -45
  58. package/dist/summaries.js +1 -207
  59. package/dist/summaries.js.map +1 -1
  60. package/dist/tool-scopes.js +2 -14
  61. package/dist/tool-scopes.js.map +1 -1
  62. package/dist/tools.d.ts +0 -4
  63. package/dist/tools.js +18 -170
  64. package/dist/tools.js.map +1 -1
  65. package/dist/write-tools.d.ts +12 -4
  66. package/dist/write-tools.js +21 -75
  67. package/dist/write-tools.js.map +1 -1
  68. package/package.json +13 -8
  69. package/dist/demo.d.ts +0 -41
  70. package/dist/demo.js +0 -941
  71. package/dist/demo.js.map +0 -1
  72. package/dist/metrics.d.ts +0 -35
  73. package/dist/metrics.js +0 -266
  74. package/dist/metrics.js.map +0 -1
  75. package/dist/paging.d.ts +0 -16
  76. package/dist/paging.js +0 -33
  77. package/dist/paging.js.map +0 -1
  78. package/dist/stats.d.ts +0 -18
  79. package/dist/stats.js +0 -144
  80. package/dist/stats.js.map +0 -1
@@ -0,0 +1,167 @@
1
+ import { compactOutputSchema, contractSchema } from "./contract-validation.js";
2
+ import { runTool } from "./request-scope.js";
3
+ import { READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS, TELEMETRY_TOOL_AUTH_META } from "./tools.js";
4
+ import { queryAnalysis } from "./analysis-client.js";
5
+ import { collectorPatch, parseCollectorBody } from "./collector.js";
6
+ import { ifMatch, refusals, changeRefusals } from "./collector-resources.js";
7
+ import { assertToolScopes, toolScopeChallenge } from "./tool-scopes.js";
8
+ import { WRITE_SCOPES, UPDATE_TOOL_ANNOTATIONS, securityMeta } from "./write-tools.js";
9
+ import { CollectorError } from "./collector.js";
10
+ import { telemetryToolResult } from "./telemetry-redaction.js";
11
+ const TriageInputSchema = contractSchema("Mcp.Tools.TriageInput");
12
+ const TriageOutputSchema = contractSchema("Mcp.Tools.TriageOutput");
13
+ const ListFailuresInputSchema = contractSchema("Mcp.Tools.ListFailuresInput");
14
+ const ListFailuresOutputSchema = contractSchema("Mcp.Tools.ListFailuresOutput");
15
+ const GetFailureContextInputSchema = contractSchema("Mcp.Tools.GetFailureContextInput");
16
+ const GetFailureContextOutputSchema = contractSchema("Mcp.Tools.GetFailureContextOutput");
17
+ const CompareGroupsInputSchema = contractSchema("Mcp.Tools.CompareGroupsInput");
18
+ const CompareGroupsOutputSchema = contractSchema("Mcp.Tools.CompareGroupsOutput");
19
+ const CompareTracesInputSchema = contractSchema("Mcp.Tools.CompareTracesInput");
20
+ const CompareTracesOutputSchema = contractSchema("Mcp.Tools.CompareTracesOutput");
21
+ const VerifyFixInputSchema = contractSchema("Mcp.Tools.VerifyFixInput");
22
+ const VerifyFixOutputSchema = contractSchema("Mcp.Tools.VerifyFixOutput");
23
+ const AggregateTelemetryInputSchema = contractSchema("Mcp.Tools.AggregateTelemetryInput");
24
+ const AggregateTelemetryOutputSchema = contractSchema("Mcp.Tools.AggregateTelemetryOutput");
25
+ const DiscoverAttributesInputSchema = contractSchema("Mcp.Tools.DiscoverAttributesInput");
26
+ const DiscoverAttributesOutputSchema = contractSchema("Mcp.Tools.DiscoverAttributesOutput");
27
+ const GetAgentRunInputSchema = contractSchema("Mcp.Tools.GetAgentRunInput");
28
+ const GetAgentRunOutputSchema = contractSchema("Mcp.Tools.GetAgentRunOutput");
29
+ const ListReleasesInputSchema = contractSchema("Mcp.Tools.ListReleasesInput");
30
+ const ListReleasesOutputSchema = contractSchema("Mcp.Tools.ListReleasesOutput");
31
+ const GetServiceMapInputSchema = contractSchema("Mcp.Tools.GetServiceMapInput");
32
+ const GetServiceMapOutputSchema = contractSchema("Mcp.Tools.GetServiceMapOutput");
33
+ const CheckTelemetryHealthInputSchema = contractSchema("Mcp.Tools.CheckTelemetryHealthInput");
34
+ const CheckTelemetryHealthOutputSchema = contractSchema("Mcp.Tools.CheckTelemetryHealthOutput");
35
+ const GetMcpStatsInputSchema = contractSchema("Mcp.Tools.GetMcpStatsInput");
36
+ const GetMcpStatsOutputSchema = contractSchema("Mcp.Tools.GetMcpStatsOutput");
37
+ const UpdateFailureStatusInputSchema = contractSchema("Mcp.Tools.UpdateFailureStatusInput");
38
+ const UpdateFailureStatusOutputSchema = contractSchema("Mcp.Tools.UpdateFailureStatusOutput");
39
+ export function registerAnalysisTools(server) {
40
+ server.registerTool("triage", {
41
+ title: "Triage",
42
+ description: "Rank new or worsening failures, performance regressions, releases and silent services when investigating what changed.",
43
+ inputSchema: TriageInputSchema,
44
+ outputSchema: compactOutputSchema(TriageOutputSchema),
45
+ annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
46
+ _meta: TELEMETRY_TOOL_AUTH_META,
47
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => queryAnalysis("triage", args, TriageOutputSchema, scope)));
48
+ server.registerTool("list_failures", {
49
+ title: "List Failures",
50
+ description: "List failures grouped by stable fingerprints when investigating recurring errors or their recorded status.",
51
+ inputSchema: ListFailuresInputSchema,
52
+ outputSchema: compactOutputSchema(ListFailuresOutputSchema),
53
+ annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
54
+ _meta: TELEMETRY_TOOL_AUTH_META,
55
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => queryAnalysis("list_failures", args, ListFailuresOutputSchema, scope)));
56
+ server.registerTool("get_failure_context", {
57
+ title: "Get Failure Context",
58
+ description: "Return the recorded failure path, correlated logs and comparison evidence when investigating a failed execution.",
59
+ inputSchema: GetFailureContextInputSchema,
60
+ outputSchema: compactOutputSchema(GetFailureContextOutputSchema),
61
+ annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
62
+ _meta: TELEMETRY_TOOL_AUTH_META,
63
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => queryAnalysis("get_failure_context", args, GetFailureContextOutputSchema, scope)));
64
+ server.registerTool("compare_groups", {
65
+ title: "Compare Groups",
66
+ description: "Compare attribute distributions and durations between two telemetry groups when identifying associations with a failure.",
67
+ inputSchema: CompareGroupsInputSchema,
68
+ outputSchema: compactOutputSchema(CompareGroupsOutputSchema),
69
+ annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
70
+ _meta: TELEMETRY_TOOL_AUTH_META,
71
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => queryAnalysis("compare_groups", args, CompareGroupsOutputSchema, scope)));
72
+ server.registerTool("compare_traces", {
73
+ title: "Compare Traces",
74
+ description: "Align two executions and locate their first divergence when comparing a failing path with another execution.",
75
+ inputSchema: CompareTracesInputSchema,
76
+ outputSchema: compactOutputSchema(CompareTracesOutputSchema),
77
+ annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
78
+ _meta: TELEMETRY_TOOL_AUTH_META,
79
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => queryAnalysis("compare_traces", args, CompareTracesOutputSchema, scope)));
80
+ server.registerTool("verify_fix", {
81
+ title: "Verify Fix",
82
+ description: "Measure failure recurrence and traffic after a change when checking whether enough evidence supports a fix.",
83
+ inputSchema: VerifyFixInputSchema,
84
+ outputSchema: compactOutputSchema(VerifyFixOutputSchema),
85
+ annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
86
+ _meta: TELEMETRY_TOOL_AUTH_META,
87
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => queryAnalysis("verify_fix", args, VerifyFixOutputSchema, scope)));
88
+ server.registerTool("aggregate_telemetry", {
89
+ title: "Aggregate Telemetry",
90
+ description: "Group spans or logs and calculate counts, error rates and durations when comparing operations or attributes.",
91
+ inputSchema: AggregateTelemetryInputSchema,
92
+ outputSchema: compactOutputSchema(AggregateTelemetryOutputSchema),
93
+ annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
94
+ _meta: TELEMETRY_TOOL_AUTH_META,
95
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => queryAnalysis("aggregate_telemetry", args, AggregateTelemetryOutputSchema, scope)));
96
+ server.registerTool("discover_attributes", {
97
+ title: "Discover Attributes",
98
+ description: "List recorded attribute keys, value distributions and convention descriptions when choosing telemetry filters.",
99
+ inputSchema: DiscoverAttributesInputSchema,
100
+ outputSchema: compactOutputSchema(DiscoverAttributesOutputSchema),
101
+ annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
102
+ _meta: TELEMETRY_TOOL_AUTH_META,
103
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => queryAnalysis("discover_attributes", args, DiscoverAttributesOutputSchema, scope)));
104
+ server.registerTool("get_agent_run", {
105
+ title: "Get Agent Run",
106
+ description: "Reconstruct agent and tool execution steps, token usage and repeated calls when investigating an agent run.",
107
+ inputSchema: GetAgentRunInputSchema,
108
+ outputSchema: compactOutputSchema(GetAgentRunOutputSchema),
109
+ annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
110
+ _meta: TELEMETRY_TOOL_AUTH_META,
111
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => queryAnalysis("get_agent_run", args, GetAgentRunOutputSchema, scope)));
112
+ server.registerTool("list_releases", {
113
+ title: "List Releases",
114
+ description: "List observed service versions and their before-and-after impact when investigating a release.",
115
+ inputSchema: ListReleasesInputSchema,
116
+ outputSchema: compactOutputSchema(ListReleasesOutputSchema),
117
+ annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
118
+ _meta: TELEMETRY_TOOL_AUTH_META,
119
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => queryAnalysis("list_releases", args, ListReleasesOutputSchema, scope)));
120
+ server.registerTool("get_service_map", {
121
+ title: "Get Service Map",
122
+ description: "Return service dependencies and their traffic, error rates and latency when investigating calls between services.",
123
+ inputSchema: GetServiceMapInputSchema,
124
+ outputSchema: compactOutputSchema(GetServiceMapOutputSchema),
125
+ annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
126
+ _meta: TELEMETRY_TOOL_AUTH_META,
127
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => queryAnalysis("get_service_map", args, GetServiceMapOutputSchema, scope)));
128
+ server.registerTool("check_telemetry_health", {
129
+ title: "Check Telemetry Health",
130
+ description: "Report silent services, orphan spans and missing convention attributes when checking telemetry coverage.",
131
+ inputSchema: CheckTelemetryHealthInputSchema,
132
+ outputSchema: compactOutputSchema(CheckTelemetryHealthOutputSchema),
133
+ annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
134
+ _meta: TELEMETRY_TOOL_AUTH_META,
135
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => queryAnalysis("check_telemetry_health", args, CheckTelemetryHealthOutputSchema, scope)));
136
+ server.registerTool("get_mcp_stats", {
137
+ title: "Get MCP Stats",
138
+ description: "Return MCP request totals, failure classes and latency aggregates when investigating MCP tool health.",
139
+ inputSchema: GetMcpStatsInputSchema,
140
+ outputSchema: compactOutputSchema(GetMcpStatsOutputSchema),
141
+ annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
142
+ _meta: TELEMETRY_TOOL_AUTH_META,
143
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => queryAnalysis("get_mcp_stats", args, GetMcpStatsOutputSchema, scope)));
144
+ server.registerTool("update_failure_status", {
145
+ title: "Update Failure Status",
146
+ description: "Set a failure's status or assignee when recording triage decisions, returning the stored failure available through list_failures.",
147
+ inputSchema: UpdateFailureStatusInputSchema,
148
+ outputSchema: compactOutputSchema(UpdateFailureStatusOutputSchema),
149
+ annotations: UPDATE_TOOL_ANNOTATIONS,
150
+ scopeChallenge: toolScopeChallenge("update_failure_status", WRITE_SCOPES),
151
+ _meta: securityMeta(WRITE_SCOPES),
152
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => {
153
+ assertToolScopes("update_failure_status", WRITE_SCOPES, ctx.http?.authInfo);
154
+ if (args.ignore_until !== undefined && args.status !== "ignored")
155
+ throw new CollectorError("ignore_until is valid only with status=ignored", false, 400, "invalid_argument");
156
+ const { failure_id, etag, ...changes } = args;
157
+ const path = `/api/v1/failures/${encodeURIComponent(failure_id)}`;
158
+ const response = await refusals(changeRefusals("failure", failure_id, "write"), () => collectorPatch(path, changes, {
159
+ ...scope.collector,
160
+ headers: { ...scope.collector.headers, ...ifMatch(etag) },
161
+ }));
162
+ const output = parseCollectorBody(response, path, UpdateFailureStatusOutputSchema);
163
+ await scope.step("Failure status saved");
164
+ return telemetryToolResult("Failure status saved; list_failures returns the current failure.", output);
165
+ }));
166
+ }
167
+ //# sourceMappingURL=analysis-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis-tools.js","sourceRoot":"","sources":["../src/analysis-tools.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,8 @@ export interface ResourceAuthorizationOptions {
3
3
  readonly verifier: OAuthTokenVerifier;
4
4
  readonly resourceMetadataUrl: string;
5
5
  readonly requiredScopes: readonly string[];
6
+ /** Scopes requested at initial sign-in; individual operations still enforce their own requirements. */
7
+ readonly authorizationScopes?: readonly string[];
6
8
  /** Explicit implications only; a wildcard-looking string grants nothing by itself. */
7
9
  readonly scopeImplications?: Readonly<Record<string, readonly string[]>>;
8
10
  }
@@ -27,6 +27,8 @@ export function scopeClosure(granted, implications) {
27
27
  export function createResourceAuthorization(options) {
28
28
  const requiredScopes = [...new Set(options.requiredScopes)].sort();
29
29
  validateScopes(requiredScopes);
30
+ const authorizationScopes = [...new Set(options.authorizationScopes ?? requiredScopes)];
31
+ validateScopes(authorizationScopes);
30
32
  const implications = new Map(Object.entries(options.scopeImplications ?? {})
31
33
  .map(([scope, implied]) => {
32
34
  validateScopes([scope, ...implied]);
@@ -42,10 +44,10 @@ export function createResourceAuthorization(options) {
42
44
  verifier: options.verifier,
43
45
  resourceMetadataUrl: metadataUrl.href,
44
46
  });
45
- const challenge = (status, error) => {
47
+ const challenge = (status, error, scopes = requiredScopes) => {
46
48
  const parameters = [
47
49
  ...(error === undefined ? [] : [`error="${error}"`]),
48
- ...(requiredScopes.length === 0 ? [] : [`scope="${requiredScopes.join(" ")}"`]),
50
+ ...(scopes.length === 0 ? [] : [`scope="${scopes.join(" ")}"`]),
49
51
  `resource_metadata="${metadataUrl.href}"`,
50
52
  ];
51
53
  return Response.json({ error: error ?? "unauthorized" }, {
@@ -66,15 +68,15 @@ export function createResourceAuthorization(options) {
66
68
  headers: { authorization: `Bearer ${bearer[1]}` },
67
69
  }));
68
70
  if (auth instanceof Response) {
69
- // Keep authentication failures distinct from authorization failures and
70
- // include the complete operation scope set on every challenge.
71
+ // Hosts use this scope list for sign-in. Request the complete product
72
+ // grant here without requiring every scope for a read-only request.
71
73
  if (auth.status === 401)
72
- return challenge(401, authorization === null ? undefined : "invalid_token");
74
+ return challenge(401, authorization === null ? undefined : "invalid_token", authorizationScopes);
73
75
  return auth;
74
76
  }
75
77
  const effectiveScopes = scopeClosure(auth.scopes, implications);
76
78
  if (!requiredScopes.every((scope) => effectiveScopes.has(scope))) {
77
- return challenge(403, "insufficient_scope");
79
+ return challenge(403, "insufficient_scope", requiredScopes.filter((scope) => !effectiveScopes.has(scope)));
78
80
  }
79
81
  return auth;
80
82
  };
@@ -1 +1 @@
1
- {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../src/authorization.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../src/authorization.ts"],"names":[],"mappings":"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"}
package/dist/ci.d.ts CHANGED
@@ -1,25 +1,4 @@
1
- /**
2
- * Qyl's CI dogfooding block (the fourth tool block next to traces, sessions,
3
- * and logs): answers "which CI leg hung on what" from qyl's OWN telemetry
4
- * instead of wrapping the GitHub API.
5
- *
6
- * Emitter convention (what CI runs must send to appear here):
7
- * - resource `service.name` starts with "qyl-ci" (e.g. "qyl-ci-smoke"),
8
- * - `session.id` identifies one workflow run (e.g. "nuget-publish-<run_id>"),
9
- * - one span per phase, named after the phase, carrying a `ci.leg` string
10
- * attribute (e.g. "macos-latest"); a failed phase sets span status error.
11
- *
12
- */
13
- import type { CiPhase, CiRunSummary } from "@ancplua/qyl-api-schema/types";
1
+ /** CI evidence is computed by the Collector from recorded pipeline tasks. */
14
2
  import type { McpServer } from "@modelcontextprotocol/server";
15
- import type { Mode, QylSession, QylTrace } from "./wire.js";
16
- /** Resource service-name prefix that marks telemetry as CI-emitted. */
17
- export declare const CI_SERVICE_PREFIX = "qyl-ci";
18
- /** CI sessions carry at least one service matching the requested prefix. */
19
- export declare function filterCiSessions(sessions: QylSession[], servicePrefix?: string): QylSession[];
20
- /** Flatten a run's traces into per-leg phases, failures first. */
21
- export declare function collectCiPhases(traces: QylTrace[], servicePrefix?: string): CiPhase[];
22
- export declare function summarizeCiRuns(runs: CiRunSummary[], mode: Mode, servicePrefix?: string): string;
23
- export declare function summarizeCiRun(runId: string, phases: CiPhase[], mode: Mode, servicePrefix?: string): string;
24
- /** Register the CI dogfooding block. */
3
+ /** Query all matching CI telemetry before pagination. */
25
4
  export declare function registerCiTools(server: McpServer): void;
package/dist/ci.js CHANGED
@@ -1,117 +1,16 @@
1
- import { CiLogInputSchema, CiLogOutputSchema, compactOutputSchema, } from "./contract-validation.js";
2
- import { fetchSessions, fetchSessionTraces } from "./data.js";
1
+ import { compactOutputSchema, contractSchema } from "./contract-validation.js";
2
+ import { queryAnalysis } from "./analysis-client.js";
3
3
  import { runTool } from "./request-scope.js";
4
- import { telemetryToolResult } from "./telemetry-redaction.js";
5
4
  import { READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS, TELEMETRY_TOOL_AUTH_META } from "./tools.js";
6
- /** Resource service-name prefix that marks telemetry as CI-emitted. */
7
- export const CI_SERVICE_PREFIX = "qyl-ci";
8
- /** CI sessions carry at least one service matching the requested prefix. */
9
- export function filterCiSessions(sessions, servicePrefix = CI_SERVICE_PREFIX) {
10
- return sessions.filter((session) => session.services.some((service) => service.startsWith(servicePrefix)));
11
- }
12
- function spanLeg(span) {
13
- const attribute = span.attributes?.find((entry) => entry.key === "ci.leg");
14
- return typeof attribute?.value === "string"
15
- ? attribute.value
16
- : span.resource.service_name;
17
- }
18
- /** Flatten a run's traces into per-leg phases, failures first. */
19
- export function collectCiPhases(traces, servicePrefix = CI_SERVICE_PREFIX) {
20
- const phases = traces.flatMap((trace) => trace.spans.filter((span) => span.resource.service_name.startsWith(servicePrefix)).map((span) => ({
21
- leg: spanLeg(span),
22
- phase: span.name,
23
- status: span.status.code === 2 ? "error" : span.status.code === 1 ? "ok" : "unset",
24
- duration_ms: Math.max(0, Math.round(Number(BigInt(span.end_time_unix_nano) - BigInt(span.start_time_unix_nano)) / 1_000_000)),
25
- ...(span.status.message ? { message: span.status.message } : {}),
26
- })));
27
- return phases.sort((a, b) => a.status === b.status
28
- ? a.leg.localeCompare(b.leg) || a.phase.localeCompare(b.phase)
29
- : a.status === "error"
30
- ? -1
31
- : b.status === "error"
32
- ? 1
33
- : 0);
34
- }
35
- export function summarizeCiRuns(runs, mode, servicePrefix = CI_SERVICE_PREFIX) {
36
- if (runs.length === 0) {
37
- return `No CI runs found (${mode} mode). CI telemetry appears once runs emit ` +
38
- `spans with a '${servicePrefix}*' service.name.`;
39
- }
40
- const lines = runs.map((run) => {
41
- const failure = run.error_count > 0 ? `${run.error_count} error(s)` : "clean";
42
- const duration = run.duration_ms === undefined ? "?" : `${Math.round(run.duration_ms / 1000)}s`;
43
- return `- ${run.run_id} [${run.state}] ${run.start_time} ${duration} — ${failure}`;
44
- });
45
- return `${runs.length} CI run(s) (${mode} mode), pass a run_id for the per-leg breakdown:\n${lines.join("\n")}`;
46
- }
47
- export function summarizeCiRun(runId, phases, mode, servicePrefix = CI_SERVICE_PREFIX) {
48
- if (phases.length === 0) {
49
- return `CI run ${runId} has no phase spans matching '${servicePrefix}*' (${mode} mode).`;
50
- }
51
- const legs = new Map();
52
- for (const phase of phases) {
53
- const existing = legs.get(phase.leg);
54
- if (existing)
55
- existing.push(phase);
56
- else
57
- legs.set(phase.leg, [phase]);
58
- }
59
- const lines = [];
60
- for (const [leg, legPhases] of legs) {
61
- const failed = legPhases.filter((phase) => phase.status === "error");
62
- lines.push(`${failed.length > 0 ? "✗" : "✓"} ${leg}`);
63
- for (const phase of failed.length > 0 ? failed : legPhases) {
64
- const detail = phase.message ? ` — ${phase.message}` : "";
65
- lines.push(` ${phase.status === "error" ? "✗" : "·"} ${phase.phase} (${phase.duration_ms}ms)${detail}`);
66
- }
67
- }
68
- return `CI run ${runId} (${mode} mode):\n${lines.join("\n")}`;
69
- }
70
- /** Register the CI dogfooding block. */
5
+ /** Query all matching CI telemetry before pagination. */
71
6
  export function registerCiTools(server) {
72
7
  server.registerTool("ci_log", {
73
8
  title: "CI Log",
74
- description: "Read CI telemetry from qyl when the user wants recent runs or a per-leg " +
75
- "phase breakdown with failures first. Any CI can emit this convention: " +
76
- `resource service.name starts with service_prefix (default '${CI_SERVICE_PREFIX}'), session.id identifies ` +
77
- "the run, and one span per phase carries a ci.leg attribute; failed phases " +
78
- "set span status to error. Without run_id, filters the 50 most recent " +
79
- "sessions and returns up to limit matching runs (default 10). With run_id, " +
80
- "reads up to 100 traces for that session and returns only phases matching " +
81
- "the same case-sensitive service prefix; phase output can be large.",
82
- inputSchema: CiLogInputSchema,
83
- outputSchema: compactOutputSchema(CiLogOutputSchema),
9
+ description: "List or compare CI runs and phase failures when investigating a build or test regression.",
10
+ inputSchema: contractSchema("Mcp.Tools.CiLogInput"),
11
+ outputSchema: compactOutputSchema(contractSchema("Mcp.Tools.CiLogOutput")),
84
12
  annotations: READ_ONLY_TELEMETRY_TOOL_ANNOTATIONS,
85
13
  _meta: TELEMETRY_TOOL_AUTH_META,
86
- }, (args, ctx) =>
87
- // A run breakdown is two units a client can watch: the collector round
88
- // trip for the run's traces, then the flatten into per-leg phases. The
89
- // run list is one round trip.
90
- runTool(ctx, args.run_id ? 2 : 1, async (scope) => {
91
- const servicePrefix = args.service_prefix ?? CI_SERVICE_PREFIX;
92
- if (args.run_id) {
93
- const { traces, mode } = await fetchSessionTraces(args.run_id, 100, scope.collector);
94
- await scope.step(`Fetched ${traces.length} trace(s) of CI run ${args.run_id}`);
95
- const phases = collectCiPhases(traces, servicePrefix);
96
- const legs = new Set(phases.map((phase) => phase.leg)).size;
97
- await scope.step(`Collected ${phases.length} phase(s) across ${legs} leg(s)`);
98
- const output = { run_id: args.run_id, phases, mode };
99
- return telemetryToolResult(summarizeCiRun(args.run_id, phases, mode, servicePrefix), output);
100
- }
101
- const { sessions, mode } = await fetchSessions({ limit: 50 }, scope.collector);
102
- const runs = filterCiSessions(sessions, servicePrefix)
103
- .slice(0, args.limit ?? 10)
104
- .map((session) => ({
105
- run_id: session["session_id"],
106
- state: session.state,
107
- start_time: session.start_time,
108
- ...(session.duration_ms === undefined ? {} : { duration_ms: session.duration_ms }),
109
- error_count: session.error_count,
110
- services: session.services,
111
- }));
112
- await scope.step(`Found ${runs.length} CI run(s) among ${sessions.length} session(s)`);
113
- const output = { runs, mode };
114
- return telemetryToolResult(summarizeCiRuns(runs, mode, servicePrefix), output);
115
- }));
14
+ }, (args, ctx) => runTool(ctx, 1, async (scope) => queryAnalysis("ci_log", args, contractSchema("Mcp.Tools.CiLogOutput"), scope)));
116
15
  }
117
16
  //# sourceMappingURL=ci.js.map
package/dist/ci.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ci.js","sourceRoot":"","sources":["../src/ci.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ci.js","sourceRoot":"","sources":["../src/ci.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,oCAAoC,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAC5F,yDAAyD;AACzD,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,YAAY,CACjB,QAAQ,EACR;QACE,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,2FAA2F;QACxG,WAAW,EAAE,cAAc,CAAC,sBAAsB,CAAC;QACnD,YAAY,EAAE,mBAAmB,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;QAC1E,WAAW,EAAE,oCAAoC;QACjD,KAAK,EAAE,wBAAwB;KAChC,EACD,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAC7C,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,cAAc,CAAC,uBAAuB,CAAC,EAAE,KAAK,CAAC,CAAC,CACjF,CAAC;AACJ,CAAC"}
@@ -7,39 +7,31 @@
7
7
  * subject; no argument names a project or a credential. Nothing here changes
8
8
  * telemetry: an annotation points at a trace, span or session and leaves it
9
9
  * as recorded, and the one delete operation removes only these objects.
10
- *
11
- * Demo mode has no Collector and therefore no such objects. A call there is
12
- * refused rather than answered from an invented store.
13
10
  */
14
- import type { Annotation, CreateAnnotationInput, CreateSavedQueryInput, DeletableKind, ListSavedQueriesInput, RunSavedQueryInput, SavedQuery, SavedQueryRunResult, SessionId, TraceId, UpdateAnnotationInput, UpdateSavedQueryInput } from "@ancplua/qyl-api-schema/types";
11
+ import type { Annotation, CreateAnnotationInput, CreateSavedQueryInput, DeletableKind, SavedQuery, UpdateAnnotationInput, UpdateSavedQueryInput } from "@ancplua/qyl-api-schema/types";
15
12
  import { type CollectorRequestOptions } from "./collector.js";
16
- import { type ToolScope } from "./request-scope.js";
13
+ /**
14
+ * The If-Match value for a change. An etag is opaque, but it travels as an
15
+ * HTTP field value, so one that could not be sent is refused here instead of
16
+ * failing inside fetch as if the Collector were unreachable.
17
+ */
18
+ export declare function ifMatch(etag: string): Readonly<Record<string, string>>;
19
+ /**
20
+ * Runs one Collector call and names its refusals for what the caller tried:
21
+ * a status listed in `messages` becomes that message, keeping the code the
22
+ * status decides (`not_found`, `conflict`, `precondition_failed`,
23
+ * `collector_unauthorized`). A body that breaks the contract stays a
24
+ * contract mismatch, and every other failure passes through unchanged.
25
+ */
26
+ export declare function refusals<T>(messages: Readonly<Partial<Record<number, string>>>, request: () => Promise<T>): Promise<T>;
27
+ /** The refusals every change to an existing object shares. */
28
+ export declare function changeRefusals(kind: string, id: string, role: "write" | "delete"): Partial<Record<number, string>>;
17
29
  export declare function createAnnotation(input: CreateAnnotationInput, options: CollectorRequestOptions): Promise<Annotation>;
18
30
  export declare function updateAnnotation(input: UpdateAnnotationInput, options: CollectorRequestOptions): Promise<Annotation>;
19
31
  export declare function createSavedQuery(input: CreateSavedQueryInput, options: CollectorRequestOptions): Promise<SavedQuery>;
20
32
  export declare function updateSavedQuery(input: UpdateSavedQueryInput, options: CollectorRequestOptions): Promise<SavedQuery>;
21
- export interface SavedQueryPage {
22
- savedQueries: SavedQuery[];
23
- hasMore: boolean;
24
- nextCursor?: string;
25
- }
26
- export declare function listSavedQueries(input: ListSavedQueriesInput, options: CollectorRequestOptions): Promise<SavedQueryPage>;
27
- export declare function runSavedQuery(input: RunSavedQueryInput, options: CollectorRequestOptions): Promise<SavedQueryRunResult>;
28
33
  export declare function deleteResource(kind: DeletableKind, id: string, etag: string, options: CollectorRequestOptions): Promise<void>;
29
- /** What a read tool adds to its result: the annotations and one text line. */
30
- export interface AnnotationReadBack {
31
- /** Present when the read succeeded; absent in demo mode and when it failed. */
32
- annotations?: Annotation[];
33
- /** Appended to the tool's text summary; empty when there is nothing to say. */
34
- text: string;
35
- }
36
34
  /** The telemetry object an annotation names, in full. */
37
35
  export declare function describeTarget(target: Annotation["target"]): string;
38
36
  /** One text line per annotation: what it is on, how to change it, and the note. */
39
37
  export declare function annotationLine(annotation: Annotation): string;
40
- /** The text block for a list of annotations, newest first. */
41
- export declare function summarizeAnnotations(annotations: readonly Annotation[], truncated: boolean): string;
42
- /** The annotations on one trace and its spans, for get_trace. */
43
- export declare function readTraceAnnotations(traceId: TraceId, scope: ToolScope): Promise<AnnotationReadBack>;
44
- /** The annotations on the listed sessions, newest first, for list_sessions. */
45
- export declare function readSessionAnnotations(sessionIds: readonly SessionId[], scope: ToolScope): Promise<AnnotationReadBack>;