@shakecodeslikecray/npc-cli 0.1.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 (54) hide show
  1. package/README.md +60 -0
  2. package/dist/adapters/claude-code.d.ts +21 -0
  3. package/dist/adapters/claude-code.d.ts.map +1 -0
  4. package/dist/adapters/claude-code.js +83 -0
  5. package/dist/adapters/claude-code.js.map +1 -0
  6. package/dist/adapters/index.d.ts +36 -0
  7. package/dist/adapters/index.d.ts.map +1 -0
  8. package/dist/adapters/index.js +50 -0
  9. package/dist/adapters/index.js.map +1 -0
  10. package/dist/client/api.d.ts +50 -0
  11. package/dist/client/api.d.ts.map +1 -0
  12. package/dist/client/api.js +325 -0
  13. package/dist/client/api.js.map +1 -0
  14. package/dist/client/auth.d.ts +47 -0
  15. package/dist/client/auth.d.ts.map +1 -0
  16. package/dist/client/auth.js +129 -0
  17. package/dist/client/auth.js.map +1 -0
  18. package/dist/config.d.ts +9 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +11 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +1055 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/mcp.d.ts +3 -0
  27. package/dist/mcp.d.ts.map +1 -0
  28. package/dist/mcp.js +22 -0
  29. package/dist/mcp.js.map +1 -0
  30. package/dist/tools/execution.d.ts +3 -0
  31. package/dist/tools/execution.d.ts.map +1 -0
  32. package/dist/tools/execution.js +255 -0
  33. package/dist/tools/execution.js.map +1 -0
  34. package/dist/tools/ingestion.d.ts +3 -0
  35. package/dist/tools/ingestion.d.ts.map +1 -0
  36. package/dist/tools/ingestion.js +131 -0
  37. package/dist/tools/ingestion.js.map +1 -0
  38. package/dist/tools/references.d.ts +3 -0
  39. package/dist/tools/references.d.ts.map +1 -0
  40. package/dist/tools/references.js +101 -0
  41. package/dist/tools/references.js.map +1 -0
  42. package/dist/tools/reporting.d.ts +3 -0
  43. package/dist/tools/reporting.d.ts.map +1 -0
  44. package/dist/tools/reporting.js +285 -0
  45. package/dist/tools/reporting.js.map +1 -0
  46. package/dist/tools/telemetry.d.ts +3 -0
  47. package/dist/tools/telemetry.d.ts.map +1 -0
  48. package/dist/tools/telemetry.js +73 -0
  49. package/dist/tools/telemetry.js.map +1 -0
  50. package/dist/types.d.ts +266 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +3 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +36 -0
@@ -0,0 +1,101 @@
1
+ import { z } from "zod";
2
+ import * as api from "../client/api.js";
3
+ import { getApiUrl } from "../client/auth.js";
4
+ function errorResult(err) {
5
+ const msg = err instanceof Error ? err.message : String(err);
6
+ return { content: [{ type: "text", text: `Error: ${msg}` }], isError: true };
7
+ }
8
+ export function registerReferenceTools(server) {
9
+ server.tool("npc_add_reference", "Add a typed URL reference to a work item (PRD, design, screenshot, client doc, external link). References are inherited by all descendants.", {
10
+ work_item_id: z.string().describe("Work item UUID to attach the reference to"),
11
+ url: z.string().describe("URL of the reference (can be an NPC document URL or external URL)"),
12
+ label: z.string().describe("Human-readable label (e.g., 'Module PRD: Authentication')"),
13
+ ref_type: z.enum(["prd", "design", "screenshot", "client_doc", "external", "user_flow"]).describe("Type of reference"),
14
+ }, async ({ work_item_id, url, label, ref_type }) => {
15
+ try {
16
+ const ref = await api.createReference(work_item_id, { url, label, ref_type });
17
+ return { content: [{ type: "text", text: JSON.stringify(ref, null, 2) }] };
18
+ }
19
+ catch (err) {
20
+ return errorResult(err);
21
+ }
22
+ });
23
+ server.tool("npc_list_references", "List references for a work item. Use inherited=true to include references from all ancestors (L4 sees L3+L2+L1 refs).", {
24
+ work_item_id: z.string().describe("Work item UUID"),
25
+ inherited: z.boolean().optional().describe("Include ancestor references (default: false)"),
26
+ }, async ({ work_item_id, inherited }) => {
27
+ try {
28
+ const refs = await api.listReferences(work_item_id, inherited ?? false);
29
+ if (refs.length === 0) {
30
+ return { content: [{ type: "text", text: "No references found." }] };
31
+ }
32
+ const lines = refs.map((r) => `[${r.ref_type}] ${r.label} — ${r.url}${r.from_level ? ` (from ${r.from_level})` : ""}`);
33
+ return { content: [{ type: "text", text: lines.join("\n") }] };
34
+ }
35
+ catch (err) {
36
+ return errorResult(err);
37
+ }
38
+ });
39
+ server.tool("npc_delete_reference", "Remove a reference from a work item", {
40
+ work_item_id: z.string().describe("Work item UUID"),
41
+ reference_id: z.string().describe("Reference UUID to delete"),
42
+ }, async ({ work_item_id, reference_id }) => {
43
+ try {
44
+ await api.deleteReference(work_item_id, reference_id);
45
+ return { content: [{ type: "text", text: "Reference deleted." }] };
46
+ }
47
+ catch (err) {
48
+ return errorResult(err);
49
+ }
50
+ });
51
+ server.tool("npc_upload_document", "Upload a document (PRD, design doc, etc.) to a repo. Returns the document metadata including its URL for use in references.", {
52
+ repo_id: z.string().describe("Repo UUID to store the document under"),
53
+ filename: z.string().describe("Filename (e.g., 'DT-WEB-authentication-prd.md')"),
54
+ content: z.string().describe("Document content (text for markdown, base64 for binary)"),
55
+ content_type: z.string().optional().describe("MIME type (default: text/markdown)"),
56
+ }, async ({ repo_id, filename, content, content_type }) => {
57
+ try {
58
+ const buf = Buffer.from(content, content_type?.startsWith("text/") !== false ? "utf-8" : "base64");
59
+ const doc = await api.uploadDocument(repo_id, filename, buf, content_type);
60
+ const baseUrl = getApiUrl().replace(/\/$/, "");
61
+ const contentUrl = `${baseUrl}/api/v1/repos/${repo_id}/documents/${doc.id}/content`;
62
+ return {
63
+ content: [{
64
+ type: "text",
65
+ text: JSON.stringify({ ...doc, content_url: contentUrl }, null, 2),
66
+ }],
67
+ };
68
+ }
69
+ catch (err) {
70
+ return errorResult(err);
71
+ }
72
+ });
73
+ server.tool("npc_list_documents", "List all documents stored for a repo", {
74
+ repo_id: z.string().describe("Repo UUID"),
75
+ }, async ({ repo_id }) => {
76
+ try {
77
+ const docs = await api.listDocuments(repo_id);
78
+ if (docs.length === 0) {
79
+ return { content: [{ type: "text", text: "No documents found." }] };
80
+ }
81
+ const lines = docs.map((d) => `${d.filename.padEnd(40)} ${(d.size_bytes / 1024).toFixed(1)}KB ${d.id}`);
82
+ return { content: [{ type: "text", text: lines.join("\n") }] };
83
+ }
84
+ catch (err) {
85
+ return errorResult(err);
86
+ }
87
+ });
88
+ server.tool("npc_get_document_content", "Fetch the content of a document by ID. Use this to read PRDs, design docs, etc. on demand.", {
89
+ repo_id: z.string().describe("Repo UUID"),
90
+ document_id: z.string().describe("Document UUID"),
91
+ }, async ({ repo_id, document_id }) => {
92
+ try {
93
+ const content = await api.getDocumentContent(repo_id, document_id);
94
+ return { content: [{ type: "text", text: content }] };
95
+ }
96
+ catch (err) {
97
+ return errorResult(err);
98
+ }
99
+ });
100
+ }
101
+ //# sourceMappingURL=references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"references.js","sourceRoot":"","sources":["../../src/tools/references.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerReportingTools(server: McpServer): void;
3
+ //# sourceMappingURL=reporting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporting.d.ts","sourceRoot":"","sources":["../../src/tools/reporting.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsX9D"}
@@ -0,0 +1,285 @@
1
+ import { z } from "zod";
2
+ import * as api from "../client/api.js";
3
+ function errorResult(err) {
4
+ const msg = err instanceof Error ? err.message : String(err);
5
+ return { content: [{ type: "text", text: `Error: ${msg}` }], isError: true };
6
+ }
7
+ export function registerReportingTools(server) {
8
+ server.tool("npc_list_projects", "List all project groups in your tenant", {}, async () => {
9
+ try {
10
+ const projects = await api.listProjects();
11
+ if (projects.length === 0) {
12
+ return { content: [{ type: "text", text: "No project groups found." }] };
13
+ }
14
+ const lines = projects.map((p) => `${p.identifier.padEnd(8)} ${p.name.padEnd(30)} ${p.id}`);
15
+ return { content: [{ type: "text", text: lines.join("\n") }] };
16
+ }
17
+ catch (err) {
18
+ return errorResult(err);
19
+ }
20
+ });
21
+ server.tool("npc_get_project", "Get details for a specific project group", {
22
+ project_id: z.string().describe("Project group UUID"),
23
+ }, async ({ project_id }) => {
24
+ try {
25
+ const project = await api.getProject(project_id);
26
+ return { content: [{ type: "text", text: JSON.stringify(project, null, 2) }] };
27
+ }
28
+ catch (err) {
29
+ return errorResult(err);
30
+ }
31
+ });
32
+ server.tool("npc_list_repos", "List all repos in your tenant", {}, async () => {
33
+ try {
34
+ const repos = await api.listRepos();
35
+ if (repos.length === 0) {
36
+ return { content: [{ type: "text", text: "No repos found." }] };
37
+ }
38
+ const lines = repos.map((r) => `${r.identifier.padEnd(8)} ${r.name.padEnd(30)} ${r.id}`);
39
+ return { content: [{ type: "text", text: lines.join("\n") }] };
40
+ }
41
+ catch (err) {
42
+ return errorResult(err);
43
+ }
44
+ });
45
+ server.tool("npc_get_repo", "Get details for a specific repo", {
46
+ repo_id: z.string().describe("Repo UUID"),
47
+ }, async ({ repo_id }) => {
48
+ try {
49
+ const repo = await api.getRepo(repo_id);
50
+ return { content: [{ type: "text", text: JSON.stringify(repo, null, 2) }] };
51
+ }
52
+ catch (err) {
53
+ return errorResult(err);
54
+ }
55
+ });
56
+ server.tool("npc_list_work_items", "List work items in a repo with optional filters", {
57
+ repo_id: z.string().describe("Repo UUID"),
58
+ state: z.string().optional().describe("Filter by state: not_started, in_progress, dev_complete, qa_testing, blocked, done, cancelled"),
59
+ priority: z.string().optional().describe("Filter by priority: urgent, high, medium, low"),
60
+ parent_id: z.string().optional().describe("Filter by parent work item UUID"),
61
+ }, async ({ repo_id, state, priority, parent_id }) => {
62
+ try {
63
+ const params = {};
64
+ if (state)
65
+ params.state = state;
66
+ if (priority)
67
+ params.priority = priority;
68
+ if (parent_id)
69
+ params.parent_id = parent_id;
70
+ const items = await api.getWorkItems(repo_id, params);
71
+ if (items.length === 0) {
72
+ return { content: [{ type: "text", text: "No work items found." }] };
73
+ }
74
+ const lines = items.map((wi) => `[${wi.state.padEnd(12)}] ${wi.title} (${wi.priority}) ${wi.id}`);
75
+ return { content: [{ type: "text", text: `${items.length} items:\n${lines.join("\n")}` }] };
76
+ }
77
+ catch (err) {
78
+ return errorResult(err);
79
+ }
80
+ });
81
+ server.tool("npc_get_work_item", "Get a specific work item by ID", {
82
+ repo_id: z.string().describe("Repo UUID"),
83
+ item_id: z.string().describe("Work item UUID"),
84
+ }, async ({ repo_id, item_id }) => {
85
+ try {
86
+ const wi = await api.getWorkItem(repo_id, item_id);
87
+ return { content: [{ type: "text", text: JSON.stringify(wi, null, 2) }] };
88
+ }
89
+ catch (err) {
90
+ return errorResult(err);
91
+ }
92
+ });
93
+ server.tool("npc_list_edges", "List all DAG edges (dependencies) in a repo", {
94
+ repo_id: z.string().describe("Repo UUID"),
95
+ }, async ({ repo_id }) => {
96
+ try {
97
+ const edges = await api.listEdges(repo_id);
98
+ if (edges.length === 0) {
99
+ return { content: [{ type: "text", text: "No edges found." }] };
100
+ }
101
+ const lines = edges.map((e) => `${e.from_id} --${e.edge_type}--> ${e.to_id}`);
102
+ return { content: [{ type: "text", text: `${edges.length} edges:\n${lines.join("\n")}` }] };
103
+ }
104
+ catch (err) {
105
+ return errorResult(err);
106
+ }
107
+ });
108
+ server.tool("npc_list_signals", "List all signals for a work item", {
109
+ task_id: z.string().describe("Work item UUID"),
110
+ }, async ({ task_id }) => {
111
+ try {
112
+ const signals = await api.listSignals(task_id);
113
+ if (signals.length === 0) {
114
+ return { content: [{ type: "text", text: "No signals found." }] };
115
+ }
116
+ const lines = signals.map((s) => `[${s.category}] ${s.signal_type}: ${JSON.stringify(s.value)} (${s.created_at})`);
117
+ return { content: [{ type: "text", text: `${signals.length} signals:\n${lines.join("\n")}` }] };
118
+ }
119
+ catch (err) {
120
+ return errorResult(err);
121
+ }
122
+ });
123
+ server.tool("npc_signal_health", "Check signal health for a work item — shows required signals, which are present, and which are missing", {
124
+ task_id: z.string().describe("Work item UUID"),
125
+ }, async ({ task_id }) => {
126
+ try {
127
+ const health = await api.getSignalHealth(task_id);
128
+ const lines = [
129
+ `Work Item: ${health.work_item_id}`,
130
+ `Status: ${health.all_green ? "ALL GREEN" : "MISSING SIGNALS"}`,
131
+ `Required: ${health.required_signals.join(", ") || "none"}`,
132
+ `Present: ${health.signals.map((s) => s.signal_type).join(", ") || "none"}`,
133
+ health.missing.length > 0 ? `Missing: ${health.missing.join(", ")}` : null,
134
+ ];
135
+ return { content: [{ type: "text", text: lines.filter(Boolean).join("\n") }] };
136
+ }
137
+ catch (err) {
138
+ return errorResult(err);
139
+ }
140
+ });
141
+ server.tool("npc_project_stats", "Get aggregate stats for all project groups in your tenant", {}, async () => {
142
+ try {
143
+ const stats = await api.getProjectStats();
144
+ const lines = Object.entries(stats).map(([projectId, s]) => {
145
+ return [
146
+ `Project: ${projectId}`,
147
+ ` Repos: ${s.total_repos} | Items: ${s.total_items} | Done: ${s.done} | In Progress: ${s.in_progress}`,
148
+ ` Not Started: ${s.not_started} | Blocked: ${s.blocked}`,
149
+ ].join("\n");
150
+ });
151
+ return {
152
+ content: [
153
+ {
154
+ type: "text",
155
+ text: lines.length === 0 ? "No project groups found." : lines.join("\n\n"),
156
+ },
157
+ ],
158
+ };
159
+ }
160
+ catch (err) {
161
+ return errorResult(err);
162
+ }
163
+ });
164
+ server.tool("npc_repo_stats", "Get aggregate stats for all repos in your tenant (total items, done, in_progress, blocked, etc.)", {}, async () => {
165
+ try {
166
+ const stats = await api.getRepoStats();
167
+ const lines = Object.entries(stats).map(([repoId, s]) => {
168
+ const pct = s.total > 0 ? Math.round((s.done / s.total) * 100) : 0;
169
+ return [
170
+ `Repo: ${repoId}`,
171
+ ` Total: ${s.total} | Done: ${s.done} (${pct}%) | In Progress: ${s.in_progress} | Not Started: ${s.not_started}`,
172
+ ` Blocked: ${s.blocked} | Cancelled: ${s.cancelled} | High Priority Pending: ${s.high_priority_pending}`,
173
+ ` Members: ${s.member_count} | Last Activity: ${s.last_activity ?? "never"}`,
174
+ ].join("\n");
175
+ });
176
+ return {
177
+ content: [
178
+ {
179
+ type: "text",
180
+ text: lines.length === 0 ? "No repos found." : lines.join("\n\n"),
181
+ },
182
+ ],
183
+ };
184
+ }
185
+ catch (err) {
186
+ return errorResult(err);
187
+ }
188
+ });
189
+ server.tool("npc_list_ai_models", "List all coding AI models in the global registry. Returns provider, model name, model ID, capability tier (1=senior, 2=standard, 3=quick), and context window for each model.", {}, async () => {
190
+ try {
191
+ const models = await api.listAIModels();
192
+ if (models.length === 0) {
193
+ return { content: [{ type: "text", text: "No AI models found." }] };
194
+ }
195
+ const lines = models.map((m) => `[T${m.capability_tier}] ${m.provider.padEnd(12)} ${m.model_name.padEnd(30)} ${m.model_id} (ctx: ${m.context_window ?? "unknown"})`);
196
+ return { content: [{ type: "text", text: `${models.length} models:\n${lines.join("\n")}` }] };
197
+ }
198
+ catch (err) {
199
+ return errorResult(err);
200
+ }
201
+ });
202
+ server.tool("npc_list_available_models", "List AI models available to the current organization. This is the pool of models that can be assigned to tasks. The pool is the union of all team members' models.", {}, async () => {
203
+ try {
204
+ const models = await api.listAvailableModels();
205
+ if (models.length === 0) {
206
+ return { content: [{ type: "text", text: "No available models found." }] };
207
+ }
208
+ const lines = models.map((m) => `[T${m.capability_tier}] ${m.provider.padEnd(12)} ${m.model_name.padEnd(30)} ${m.model_id}`);
209
+ return { content: [{ type: "text", text: `${models.length} available models:\n${lines.join("\n")}` }] };
210
+ }
211
+ catch (err) {
212
+ return errorResult(err);
213
+ }
214
+ });
215
+ server.tool("npc_list_models_by_tier", "List available AI models filtered by capability tier. Tier 1 = senior (architecture, complex). Tier 2 = standard (implementation). Tier 3 = quick (boilerplate). Use this to find the right model for a task's complexity level.", {
216
+ tier: z.number().min(1).max(3).describe("Capability tier: 1=senior, 2=standard, 3=quick"),
217
+ }, async ({ tier }) => {
218
+ try {
219
+ const models = await api.listModelsByTier(tier);
220
+ if (models.length === 0) {
221
+ return { content: [{ type: "text", text: `No tier ${tier} models available.` }] };
222
+ }
223
+ const lines = models.map((m) => `${m.provider.padEnd(12)} ${m.model_name.padEnd(30)} ${m.model_id}`);
224
+ return { content: [{ type: "text", text: `Tier ${tier} models (${models.length}):\n${lines.join("\n")}` }] };
225
+ }
226
+ catch (err) {
227
+ return errorResult(err);
228
+ }
229
+ });
230
+ server.tool("npc_module_progress", "Get completion breakdown for a module (feature-level work item) by examining its children's states", {
231
+ module_id: z.string().describe("Work item UUID of the module/feature"),
232
+ }, async ({ module_id }) => {
233
+ try {
234
+ const ctx = await api.getWorkItemContext(module_id);
235
+ const children = ctx.children;
236
+ if (children.length === 0) {
237
+ return {
238
+ content: [
239
+ {
240
+ type: "text",
241
+ text: `Module "${ctx.work_item.title}" has no children.`,
242
+ },
243
+ ],
244
+ };
245
+ }
246
+ // Count by state
247
+ const counts = {};
248
+ let totalHours = 0;
249
+ let doneHours = 0;
250
+ for (const c of children) {
251
+ counts[c.state] = (counts[c.state] ?? 0) + 1;
252
+ if (c.estimated_hours) {
253
+ totalHours += c.estimated_hours;
254
+ if (c.state === "done")
255
+ doneHours += c.estimated_hours;
256
+ }
257
+ }
258
+ const total = children.length;
259
+ const done = counts["done"] ?? 0;
260
+ const pct = Math.round((done / total) * 100);
261
+ const lines = [
262
+ `Module: ${ctx.work_item.title}`,
263
+ `Progress: ${done}/${total} items (${pct}%)`,
264
+ totalHours > 0
265
+ ? `Hours: ${doneHours}/${totalHours}h (${Math.round((doneHours / totalHours) * 100)}%)`
266
+ : null,
267
+ "",
268
+ "Breakdown:",
269
+ ...Object.entries(counts).map(([state, count]) => ` ${state}: ${count}`),
270
+ ];
271
+ return {
272
+ content: [
273
+ {
274
+ type: "text",
275
+ text: lines.filter(Boolean).join("\n"),
276
+ },
277
+ ],
278
+ };
279
+ }
280
+ catch (err) {
281
+ return errorResult(err);
282
+ }
283
+ });
284
+ }
285
+ //# sourceMappingURL=reporting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporting.js","sourceRoot":"","sources":["../../src/tools/reporting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerTelemetryTools(server: McpServer): void;
3
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/tools/telemetry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6E9D"}
@@ -0,0 +1,73 @@
1
+ import { z } from "zod";
2
+ import * as api from "../client/api.js";
3
+ function errorResult(err) {
4
+ const msg = err instanceof Error ? err.message : String(err);
5
+ return { content: [{ type: "text", text: `Error: ${msg}` }], isError: true };
6
+ }
7
+ export function registerTelemetryTools(server) {
8
+ server.tool("npc_report_telemetry", "Report session telemetry (tokens, cost, duration, tool stats) for a work item. Call this when finishing work on a task to track resource usage. Works with any agent tool.", {
9
+ work_item_id: z.string().describe("Work item UUID this telemetry is for"),
10
+ session_id: z.string().optional().describe("Agent tool's session ID (for deduplication)"),
11
+ agent_tool: z.string().optional().describe("Which tool generated this: claude_code, gemini_cli, opencode, aider, cursor, custom"),
12
+ model: z.string().optional().describe("Primary model used (e.g., claude-sonnet-4-20250514)"),
13
+ tokens_in: z.number().optional().describe("Total input tokens (including cache reads)"),
14
+ tokens_out: z.number().optional().describe("Total output tokens"),
15
+ cache_read_tokens: z.number().optional().describe("Tokens read from cache"),
16
+ cache_creation_tokens: z.number().optional().describe("Tokens written to cache"),
17
+ cost_usd: z.number().optional().describe("Session cost in USD"),
18
+ duration_ms: z.number().optional().describe("Wall clock duration in milliseconds"),
19
+ num_turns: z.number().optional().describe("Number of agentic turns/exchanges"),
20
+ tool_calls: z.number().optional().describe("Total tool invocations"),
21
+ tool_failures: z.number().optional().describe("Failed tool invocations"),
22
+ metadata: z.record(z.unknown()).optional().describe("Additional metrics: tool_breakdown, errors, stop_reason, etc."),
23
+ }, async (input) => {
24
+ try {
25
+ const { work_item_id, ...rest } = input;
26
+ const ev = await api.createTelemetry(work_item_id, rest);
27
+ const cost = ev.cost_usd > 0 ? `$${ev.cost_usd.toFixed(4)}` : "n/a";
28
+ const tokens = ev.tokens_in + ev.tokens_out > 0
29
+ ? `${(ev.tokens_in / 1000).toFixed(1)}K in / ${(ev.tokens_out / 1000).toFixed(1)}K out`
30
+ : "n/a";
31
+ return {
32
+ content: [{
33
+ type: "text",
34
+ text: `Telemetry recorded for ${work_item_id.slice(0, 8)}:\n Cost: ${cost}\n Tokens: ${tokens}\n Duration: ${ev.duration_ms > 0 ? `${(ev.duration_ms / 1000).toFixed(0)}s` : "n/a"}\n Tool calls: ${ev.tool_calls} (${ev.tool_failures} failures)`,
35
+ }],
36
+ };
37
+ }
38
+ catch (err) {
39
+ return errorResult(err);
40
+ }
41
+ });
42
+ server.tool("npc_get_telemetry", "Get telemetry summary for a work item — total cost, tokens, duration across all sessions", {
43
+ work_item_id: z.string().describe("Work item UUID"),
44
+ }, async ({ work_item_id }) => {
45
+ try {
46
+ const events = await api.listTelemetry(work_item_id);
47
+ if (events.length === 0) {
48
+ return { content: [{ type: "text", text: "No telemetry recorded for this work item." }] };
49
+ }
50
+ const totalCost = events.reduce((sum, e) => sum + e.cost_usd, 0);
51
+ const totalIn = events.reduce((sum, e) => sum + e.tokens_in, 0);
52
+ const totalOut = events.reduce((sum, e) => sum + e.tokens_out, 0);
53
+ const totalDuration = events.reduce((sum, e) => sum + e.duration_ms, 0);
54
+ const totalTools = events.reduce((sum, e) => sum + e.tool_calls, 0);
55
+ const totalFailures = events.reduce((sum, e) => sum + e.tool_failures, 0);
56
+ const lines = [
57
+ `Telemetry for ${work_item_id.slice(0, 8)} (${events.length} sessions):`,
58
+ ` Total cost: $${totalCost.toFixed(4)}`,
59
+ ` Tokens: ${(totalIn / 1000).toFixed(1)}K in / ${(totalOut / 1000).toFixed(1)}K out`,
60
+ ` Duration: ${(totalDuration / 1000 / 60).toFixed(1)} minutes`,
61
+ ` Tool calls: ${totalTools} (${totalFailures} failures)`,
62
+ "",
63
+ "Sessions:",
64
+ ...events.map((e) => ` [${e.agent_tool}] ${e.model ?? "unknown"} — $${e.cost_usd.toFixed(4)} — ${(e.duration_ms / 1000).toFixed(0)}s — ${e.created_at}`),
65
+ ];
66
+ return { content: [{ type: "text", text: lines.join("\n") }] };
67
+ }
68
+ catch (err) {
69
+ return errorResult(err);
70
+ }
71
+ });
72
+ }
73
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/tools/telemetry.ts"],"names":[],"mappings":"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"}