@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
package/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # NPC CLI
2
+
3
+ MCP server + CLI for the NPC project orchestration system.
4
+
5
+ ## Setup
6
+
7
+ ```bash
8
+ npm install
9
+ npm run build
10
+ ```
11
+
12
+ ## Usage
13
+
14
+ ### CLI
15
+
16
+ ```bash
17
+ # Auth
18
+ npc auth login -e user@example.com -p password
19
+ npc auth status
20
+ npc auth logout
21
+
22
+ # Projects
23
+ npc project create -n "My Project" -i MP
24
+ npc project list
25
+ npc project stats
26
+
27
+ # Tasks
28
+ npc tasks
29
+ npc pull
30
+ npc start <task-id>
31
+ npc complete <task-id> -s "Done"
32
+ npc block <task-id> -r "Waiting on API"
33
+ npc signal <task-id> -c quality -t tests_passed -v '{"passed":true}'
34
+
35
+ # Context
36
+ npc context <module-id>
37
+
38
+ # Bulk operations
39
+ npc items bulk-create <project-id> items.json
40
+ npc edge create --project <id> --from <id> --to <id>
41
+ ```
42
+
43
+ ### MCP Server
44
+
45
+ ```bash
46
+ npc mcp
47
+ ```
48
+
49
+ Add to Claude Code config:
50
+
51
+ ```json
52
+ {
53
+ "mcpServers": {
54
+ "npc": {
55
+ "command": "node",
56
+ "args": ["/path/to/npc-cli/dist/mcp.js"]
57
+ }
58
+ }
59
+ }
60
+ ```
@@ -0,0 +1,21 @@
1
+ export interface ParsedTelemetry {
2
+ session_id?: string;
3
+ model?: string;
4
+ tokens_in: number;
5
+ tokens_out: number;
6
+ cache_read_tokens: number;
7
+ cache_creation_tokens: number;
8
+ cost_usd: number;
9
+ duration_ms: number;
10
+ num_turns: number;
11
+ tool_calls: number;
12
+ tool_failures: number;
13
+ metadata: {
14
+ tool_breakdown: Record<string, number>;
15
+ errors: string[];
16
+ stop_reason?: string;
17
+ };
18
+ work_item_id?: string;
19
+ }
20
+ export declare function parseClaudeCodeTranscript(transcriptPath: string): ParsedTelemetry;
21
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE;QACR,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,yBAAyB,CAAC,cAAc,EAAE,MAAM,GAAG,eAAe,CAwFjF"}
@@ -0,0 +1,83 @@
1
+ import { readFileSync } from "fs";
2
+ export function parseClaudeCodeTranscript(transcriptPath) {
3
+ const content = readFileSync(transcriptPath, "utf-8");
4
+ const lines = content.split("\n").filter(Boolean);
5
+ const result = {
6
+ tokens_in: 0,
7
+ tokens_out: 0,
8
+ cache_read_tokens: 0,
9
+ cache_creation_tokens: 0,
10
+ cost_usd: 0,
11
+ duration_ms: 0,
12
+ num_turns: 0,
13
+ tool_calls: 0,
14
+ tool_failures: 0,
15
+ metadata: { tool_breakdown: {}, errors: [] },
16
+ };
17
+ let firstTimestamp;
18
+ let lastTimestamp;
19
+ for (const line of lines) {
20
+ try {
21
+ const entry = JSON.parse(line);
22
+ // Track timestamps for duration
23
+ if (entry.timestamp) {
24
+ const ts = new Date(entry.timestamp).getTime();
25
+ if (!firstTimestamp)
26
+ firstTimestamp = ts;
27
+ lastTimestamp = ts;
28
+ }
29
+ // Session ID
30
+ if (entry.type === "system" && entry.subtype === "init" && entry.session_id) {
31
+ result.session_id = entry.session_id;
32
+ }
33
+ // API request events (token usage)
34
+ if (entry.type === "assistant" && entry.message?.usage) {
35
+ const u = entry.message.usage;
36
+ result.tokens_in += u.input_tokens ?? 0;
37
+ result.tokens_out += u.output_tokens ?? 0;
38
+ result.cache_read_tokens += u.cache_read_input_tokens ?? 0;
39
+ result.cache_creation_tokens += u.cache_creation_input_tokens ?? 0;
40
+ result.num_turns++;
41
+ if (entry.message.model)
42
+ result.model = entry.message.model;
43
+ }
44
+ // Tool use tracking
45
+ if (entry.type === "assistant" && entry.message?.content) {
46
+ for (const block of entry.message.content) {
47
+ if (block.type === "tool_use") {
48
+ result.tool_calls++;
49
+ const name = block.name ?? "unknown";
50
+ result.metadata.tool_breakdown[name] = (result.metadata.tool_breakdown[name] ?? 0) + 1;
51
+ // Check for npc_pull_task or npc_start_task to find work item
52
+ if ((name === "npc_pull_task" || name === "npc_start_task") && block.input?.task_id) {
53
+ result.work_item_id = block.input.task_id;
54
+ }
55
+ }
56
+ }
57
+ }
58
+ // Tool results (check for errors)
59
+ if (entry.type === "tool_result" && entry.is_error) {
60
+ result.tool_failures++;
61
+ if (entry.content) {
62
+ const errText = typeof entry.content === "string" ? entry.content : JSON.stringify(entry.content);
63
+ result.metadata.errors.push(errText.slice(0, 200));
64
+ }
65
+ }
66
+ // Stop reason
67
+ if (entry.type === "result" && entry.stop_reason) {
68
+ result.metadata.stop_reason = entry.stop_reason;
69
+ if (entry.total_cost_usd)
70
+ result.cost_usd = entry.total_cost_usd;
71
+ }
72
+ }
73
+ catch {
74
+ // Skip malformed lines
75
+ }
76
+ }
77
+ // Calculate duration from timestamps
78
+ if (firstTimestamp && lastTimestamp) {
79
+ result.duration_ms = lastTimestamp - firstTimestamp;
80
+ }
81
+ return result;
82
+ }
83
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Tool adapter registry.
3
+ *
4
+ * Each adapter knows how to:
5
+ * - locate the tool's MCP config file
6
+ * - read/write the mcpServers entry
7
+ * - parse session transcripts for telemetry
8
+ *
9
+ * Adding support for a new tool (e.g. Cursor, Windsurf) means adding an entry
10
+ * here that satisfies ToolAdapter and wiring it into TOOL_ADAPTERS.
11
+ */
12
+ export interface McpEntry {
13
+ type: "stdio";
14
+ command: string;
15
+ args: string[];
16
+ }
17
+ export interface ToolAdapter {
18
+ /** Human-readable display name */
19
+ displayName: string;
20
+ /** Identifier used in --tool flags and agent_tool telemetry field */
21
+ toolId: string;
22
+ /** Absolute path to the JSON config file that holds mcpServers */
23
+ configPath: string;
24
+ /** Key inside the config that holds the mcpServers map */
25
+ mcpServersKey: string;
26
+ /** Short restart instruction shown after install */
27
+ restartHint: string;
28
+ }
29
+ export declare const TOOL_ADAPTERS: Record<string, ToolAdapter>;
30
+ /** Default tool ID used when --tool is not specified. */
31
+ export declare const DEFAULT_TOOL_ID = "claude_code";
32
+ /** @deprecated Use DEFAULT_TOOL_ID */
33
+ export declare const DEFAULT_TOOL = "claude_code";
34
+ export declare function getAdapter(toolId: string): ToolAdapter | undefined;
35
+ export declare function listSupportedTools(): string[];
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAyBrD,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAE7C,sCAAsC;AACtC,eAAO,MAAM,YAAY,gBAAkB,CAAC;AAE5C,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAElE;AAED,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Tool adapter registry.
3
+ *
4
+ * Each adapter knows how to:
5
+ * - locate the tool's MCP config file
6
+ * - read/write the mcpServers entry
7
+ * - parse session transcripts for telemetry
8
+ *
9
+ * Adding support for a new tool (e.g. Cursor, Windsurf) means adding an entry
10
+ * here that satisfies ToolAdapter and wiring it into TOOL_ADAPTERS.
11
+ */
12
+ import { join } from "node:path";
13
+ import { homedir } from "node:os";
14
+ export const TOOL_ADAPTERS = {
15
+ claude_code: {
16
+ displayName: "Claude Code",
17
+ toolId: "claude_code",
18
+ configPath: join(homedir(), ".claude.json"),
19
+ mcpServersKey: "mcpServers",
20
+ restartHint: "Restart Claude Code to activate.",
21
+ },
22
+ // Cursor: stores MCP config in ~/.cursor/mcp.json under "mcpServers"
23
+ // Uncomment when Cursor MCP support ships:
24
+ // cursor: {
25
+ // displayName: "Cursor",
26
+ // toolId: "cursor",
27
+ // configPath: join(homedir(), ".cursor", "mcp.json"),
28
+ // mcpServersKey: "mcpServers",
29
+ // restartHint: "Restart Cursor to activate.",
30
+ // },
31
+ // Windsurf: stores MCP config in ~/.codeium/windsurf/mcp_config.json
32
+ // windsurf: {
33
+ // displayName: "Windsurf",
34
+ // toolId: "windsurf",
35
+ // configPath: join(homedir(), ".codeium", "windsurf", "mcp_config.json"),
36
+ // mcpServersKey: "mcpServers",
37
+ // restartHint: "Restart Windsurf to activate.",
38
+ // },
39
+ };
40
+ /** Default tool ID used when --tool is not specified. */
41
+ export const DEFAULT_TOOL_ID = "claude_code";
42
+ /** @deprecated Use DEFAULT_TOOL_ID */
43
+ export const DEFAULT_TOOL = DEFAULT_TOOL_ID;
44
+ export function getAdapter(toolId) {
45
+ return TOOL_ADAPTERS[toolId];
46
+ }
47
+ export function listSupportedTools() {
48
+ return Object.keys(TOOL_ADAPTERS);
49
+ }
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAqBH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,CAAC,MAAM,aAAa,GAAgC;IACxD,WAAW,EAAE;QACX,WAAW,EAAE,aAAa;QAC1B,MAAM,EAAE,aAAa;QACrB,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC;QAC3C,aAAa,EAAE,YAAY;QAC3B,WAAW,EAAE,kCAAkC;KAChD;IACD,qEAAqE;IACrE,2CAA2C;IAC3C,YAAY;IACZ,2BAA2B;IAC3B,sBAAsB;IACtB,wDAAwD;IACxD,iCAAiC;IACjC,gDAAgD;IAChD,KAAK;IACL,qEAAqE;IACrE,cAAc;IACd,6BAA6B;IAC7B,wBAAwB;IACxB,4EAA4E;IAC5E,iCAAiC;IACjC,kDAAkD;IAClD,KAAK;CACN,CAAC;AAEF,yDAAyD;AACzD,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;AAE7C,sCAAsC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC;AAE5C,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { Project, Repo, CreateProjectInput, CreateRepoInput, WorkItem, WorkItemEdge, CreateEdgeInput, Signal, CreateSignalInput, BulkCreateItem, CompleteInput, BlockInput, RepoStats, ProjectStats, QueueNextResponse, WorkItemContext, SignalHealthSummary, ScheduleResult, AIModel, WorkItemReference, CreateReferenceInput, Document, TelemetryEvent, CreateTelemetryInput } from "../types.js";
2
+ /** Reset client (useful after login when token changes). */
3
+ export declare function resetClient(): void;
4
+ export declare function createProject(data: CreateProjectInput): Promise<Project>;
5
+ export declare function getProject(id: string): Promise<Project>;
6
+ export declare function listProjects(): Promise<Project[]>;
7
+ export declare function getProjectStats(): Promise<Record<string, ProjectStats>>;
8
+ export declare function getProjectRepos(projectId: string): Promise<Repo[]>;
9
+ export declare function getProjectDashboard(projectId: string): Promise<unknown>;
10
+ export declare function createRepo(data: CreateRepoInput): Promise<Repo>;
11
+ export declare function getRepo(id: string): Promise<Repo>;
12
+ export declare function listRepos(): Promise<Repo[]>;
13
+ export declare function getRepoStats(): Promise<Record<string, RepoStats>>;
14
+ export declare function getWorkItems(repoId: string, params?: Record<string, string>): Promise<WorkItem[]>;
15
+ export declare function getWorkItem(repoId: string, itemId: string): Promise<WorkItem>;
16
+ export declare function bulkCreateWorkItems(repoId: string, items: BulkCreateItem[]): Promise<WorkItem[]>;
17
+ export declare function getWorkItemDescendants(repoId: string, itemId: string): Promise<WorkItem[]>;
18
+ export declare function getWorkItemChildren(repoId: string, itemId: string): Promise<WorkItem[]>;
19
+ export declare function transitionWorkItem(itemId: string, state: string): Promise<WorkItem>;
20
+ export declare function startWorkItem(itemId: string): Promise<WorkItem>;
21
+ export declare function completeWorkItem(itemId: string, data: CompleteInput): Promise<WorkItem>;
22
+ export declare function blockWorkItem(itemId: string, data: BlockInput): Promise<WorkItem>;
23
+ export declare function getMyTasks(): Promise<WorkItem[]>;
24
+ export declare function getWorkItemContext(itemId: string): Promise<WorkItemContext>;
25
+ export declare function queueNext(repoId?: string): Promise<QueueNextResponse>;
26
+ export declare function myTasksNext(repoId?: string): Promise<QueueNextResponse>;
27
+ export declare function createEdge(repoId: string, data: CreateEdgeInput): Promise<WorkItemEdge>;
28
+ export declare function listEdges(repoId: string): Promise<WorkItemEdge[]>;
29
+ export declare function scheduleProject(projectId: string, startDate: string): Promise<ScheduleResult>;
30
+ export declare function createSignal(workItemId: string, signal: CreateSignalInput): Promise<Signal>;
31
+ export declare function listSignals(workItemId: string): Promise<Signal[]>;
32
+ export declare function getSignalHealth(workItemId: string): Promise<SignalHealthSummary>;
33
+ export declare function listAIModels(): Promise<AIModel[]>;
34
+ export declare function listAvailableModels(): Promise<AIModel[]>;
35
+ export declare function listModelsByTier(tier: number): Promise<AIModel[]>;
36
+ export declare function getMyModels(): Promise<AIModel[]>;
37
+ export declare function setMyModels(modelIds: string[]): Promise<void>;
38
+ export declare function listUsers(role?: string): Promise<unknown[]>;
39
+ export declare function listReferences(workItemId: string, inherited?: boolean): Promise<WorkItemReference[]>;
40
+ export declare function createReference(workItemId: string, data: CreateReferenceInput): Promise<WorkItemReference>;
41
+ export declare function deleteReference(workItemId: string, refId: string): Promise<void>;
42
+ export declare function listDocuments(repoId: string): Promise<Document[]>;
43
+ export declare function uploadDocument(repoId: string, filename: string, content: Buffer, contentType?: string): Promise<Document>;
44
+ export declare function getDocument(repoId: string, docId: string): Promise<Document>;
45
+ export declare function getDocumentContent(repoId: string, docId: string): Promise<string>;
46
+ export declare function deleteDocument(repoId: string, docId: string): Promise<void>;
47
+ export declare function createTelemetry(workItemId: string, input: CreateTelemetryInput): Promise<TelemetryEvent>;
48
+ export declare const reportTelemetry: typeof createTelemetry;
49
+ export declare function listTelemetry(workItemId: string): Promise<TelemetryEvent[]>;
50
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/client/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,325 @@
1
+ import axios from "axios";
2
+ import FormData from "form-data";
3
+ import { getToken, getApiUrl, getApiKey, isTokenExpired, refreshToken } from "./auth.js";
4
+ let _refreshing = null;
5
+ function createClient() {
6
+ const client = axios.create({
7
+ baseURL: getApiUrl(),
8
+ timeout: 30_000,
9
+ headers: { "Content-Type": "application/json" },
10
+ });
11
+ // Pre-flight: if token is expired, try refresh before sending the request
12
+ client.interceptors.request.use(async (config) => {
13
+ try {
14
+ if (isTokenExpired()) {
15
+ if (!_refreshing)
16
+ _refreshing = refreshToken();
17
+ const newToken = await _refreshing;
18
+ _refreshing = null;
19
+ if (newToken) {
20
+ config.headers.Authorization = `Bearer ${newToken}`;
21
+ return config;
22
+ }
23
+ }
24
+ const token = getToken();
25
+ config.headers.Authorization = `Bearer ${token}`;
26
+ // Only send agent key for queue and agent-exclusive work-item endpoints.
27
+ // Signal, comment, transition, and other role-based endpoints must NOT receive
28
+ // the agent key — it bypasses user role checks.
29
+ const agentSuffixes = ["/start", "/complete", "/block", "/heartbeat", "/escalate"];
30
+ const url = config.url ?? "";
31
+ const isQueueEndpoint = url.includes("/api/v1/queue/");
32
+ const isAgentWorkItem = url.includes("/api/v1/work-items/") &&
33
+ agentSuffixes.some((s) => url.endsWith(s));
34
+ const apiKey = getApiKey();
35
+ if (apiKey && (isQueueEndpoint || isAgentWorkItem))
36
+ config.headers["x-api-key"] = apiKey;
37
+ }
38
+ catch {
39
+ // Allow unauthenticated requests (login, etc.)
40
+ }
41
+ return config;
42
+ });
43
+ // Retry on 401: attempt refresh once, then replay the failed request
44
+ client.interceptors.response.use((res) => res, async (err) => {
45
+ const originalRequest = err.config;
46
+ if (err.response?.status === 401 &&
47
+ originalRequest &&
48
+ !originalRequest._retried) {
49
+ originalRequest._retried = true;
50
+ if (!_refreshing)
51
+ _refreshing = refreshToken();
52
+ let newToken = null;
53
+ try {
54
+ newToken = await _refreshing;
55
+ }
56
+ finally {
57
+ _refreshing = null;
58
+ }
59
+ if (newToken) {
60
+ originalRequest.headers.Authorization = `Bearer ${newToken}`;
61
+ return client(originalRequest);
62
+ }
63
+ }
64
+ const msg = err.response?.data?.error ?? err.message;
65
+ const status = err.response?.status ?? 0;
66
+ throw new Error(`API error (${status}): ${msg}`);
67
+ });
68
+ return client;
69
+ }
70
+ // Lazy singleton
71
+ let _client = null;
72
+ function client() {
73
+ if (!_client)
74
+ _client = createClient();
75
+ return _client;
76
+ }
77
+ /** Reset client (useful after login when token changes). */
78
+ export function resetClient() {
79
+ _client = null;
80
+ }
81
+ // ---------------------------------------------------------------------------
82
+ // Projects (group-level)
83
+ // ---------------------------------------------------------------------------
84
+ export async function createProject(data) {
85
+ const res = await client().post("/api/v1/projects/", data);
86
+ return res.data;
87
+ }
88
+ export async function getProject(id) {
89
+ const res = await client().get(`/api/v1/projects/${id}`);
90
+ return res.data;
91
+ }
92
+ export async function listProjects() {
93
+ const res = await client().get("/api/v1/projects/");
94
+ return res.data;
95
+ }
96
+ export async function getProjectStats() {
97
+ const res = await client().get("/api/v1/projects/stats");
98
+ return res.data;
99
+ }
100
+ export async function getProjectRepos(projectId) {
101
+ const res = await client().get(`/api/v1/projects/${projectId}/repos`);
102
+ return res.data;
103
+ }
104
+ export async function getProjectDashboard(projectId) {
105
+ const res = await client().get(`/api/v1/projects/${projectId}/dashboard`);
106
+ return res.data;
107
+ }
108
+ // ---------------------------------------------------------------------------
109
+ // Repos (individual codebases, formerly "projects")
110
+ // ---------------------------------------------------------------------------
111
+ export async function createRepo(data) {
112
+ const res = await client().post("/api/v1/repos/", data);
113
+ return res.data;
114
+ }
115
+ export async function getRepo(id) {
116
+ const res = await client().get(`/api/v1/repos/${id}`);
117
+ return res.data;
118
+ }
119
+ export async function listRepos() {
120
+ const res = await client().get("/api/v1/repos/");
121
+ return res.data;
122
+ }
123
+ export async function getRepoStats() {
124
+ const res = await client().get("/api/v1/repos/stats");
125
+ return res.data;
126
+ }
127
+ // ---------------------------------------------------------------------------
128
+ // Work Items
129
+ // ---------------------------------------------------------------------------
130
+ export async function getWorkItems(repoId, params) {
131
+ const res = await client().get(`/api/v1/repos/${repoId}/work-items/`, { params });
132
+ return res.data;
133
+ }
134
+ export async function getWorkItem(repoId, itemId) {
135
+ const res = await client().get(`/api/v1/repos/${repoId}/work-items/${itemId}`);
136
+ return res.data;
137
+ }
138
+ export async function bulkCreateWorkItems(repoId, items) {
139
+ const res = await client().post(`/api/v1/repos/${repoId}/work-items/bulk`, items);
140
+ return res.data;
141
+ }
142
+ export async function getWorkItemDescendants(repoId, itemId) {
143
+ const res = await client().get(`/api/v1/repos/${repoId}/work-items/${itemId}/descendants`);
144
+ return res.data;
145
+ }
146
+ export async function getWorkItemChildren(repoId, itemId) {
147
+ const res = await client().get(`/api/v1/repos/${repoId}/work-items/${itemId}/children`);
148
+ return res.data;
149
+ }
150
+ // ---------------------------------------------------------------------------
151
+ // Work Item Transitions (cross-repo endpoints at /api/v1/work-items/...)
152
+ // ---------------------------------------------------------------------------
153
+ export async function transitionWorkItem(itemId, state) {
154
+ const res = await client().post(`/api/v1/work-items/${itemId}/transition`, { state });
155
+ return res.data;
156
+ }
157
+ export async function startWorkItem(itemId) {
158
+ const res = await client().post(`/api/v1/work-items/${itemId}/start`);
159
+ return res.data;
160
+ }
161
+ export async function completeWorkItem(itemId, data) {
162
+ const res = await client().post(`/api/v1/work-items/${itemId}/complete`, data);
163
+ return res.data;
164
+ }
165
+ export async function blockWorkItem(itemId, data) {
166
+ const res = await client().post(`/api/v1/work-items/${itemId}/block`, data);
167
+ return res.data;
168
+ }
169
+ // ---------------------------------------------------------------------------
170
+ // My Tasks
171
+ // ---------------------------------------------------------------------------
172
+ export async function getMyTasks() {
173
+ const res = await client().get("/api/v1/work-items/mine");
174
+ return res.data;
175
+ }
176
+ // ---------------------------------------------------------------------------
177
+ // Work Item Context
178
+ // ---------------------------------------------------------------------------
179
+ export async function getWorkItemContext(itemId) {
180
+ const res = await client().get(`/api/v1/work-items/${itemId}/context`);
181
+ return res.data;
182
+ }
183
+ // ---------------------------------------------------------------------------
184
+ // Queue
185
+ // ---------------------------------------------------------------------------
186
+ export async function queueNext(repoId) {
187
+ const params = {};
188
+ if (repoId)
189
+ params.repo_id = repoId;
190
+ const res = await client().get("/api/v1/queue/next", { params });
191
+ return res.data;
192
+ }
193
+ export async function myTasksNext(repoId) {
194
+ const params = {};
195
+ if (repoId)
196
+ params.repo_id = repoId;
197
+ const res = await client().get("/api/v1/my-tasks/next", { params });
198
+ return res.data;
199
+ }
200
+ // ---------------------------------------------------------------------------
201
+ // Edges
202
+ // ---------------------------------------------------------------------------
203
+ export async function createEdge(repoId, data) {
204
+ const res = await client().post(`/api/v1/repos/${repoId}/work-item-edges/`, data);
205
+ return res.data;
206
+ }
207
+ export async function listEdges(repoId) {
208
+ const res = await client().get(`/api/v1/repos/${repoId}/work-item-edges/`);
209
+ return res.data;
210
+ }
211
+ // ---------------------------------------------------------------------------
212
+ // Schedule
213
+ // ---------------------------------------------------------------------------
214
+ export async function scheduleProject(projectId, startDate) {
215
+ const res = await client().post(`/api/v1/projects/${projectId}/schedule`, { start_date: startDate });
216
+ return res.data;
217
+ }
218
+ // ---------------------------------------------------------------------------
219
+ // Signals
220
+ // ---------------------------------------------------------------------------
221
+ export async function createSignal(workItemId, signal) {
222
+ const res = await client().post(`/api/v1/work-items/${workItemId}/signals`, signal);
223
+ return res.data;
224
+ }
225
+ export async function listSignals(workItemId) {
226
+ const res = await client().get(`/api/v1/work-items/${workItemId}/signals`);
227
+ return res.data;
228
+ }
229
+ export async function getSignalHealth(workItemId) {
230
+ const res = await client().get(`/api/v1/work-items/${workItemId}/signals/health`);
231
+ return res.data;
232
+ }
233
+ // ---------------------------------------------------------------------------
234
+ // Users
235
+ // ---------------------------------------------------------------------------
236
+ // ---------------------------------------------------------------------------
237
+ // AI Models
238
+ // ---------------------------------------------------------------------------
239
+ export async function listAIModels() {
240
+ const res = await client().get("/api/v1/ai-models");
241
+ return res.data;
242
+ }
243
+ export async function listAvailableModels() {
244
+ const res = await client().get("/api/v1/ai-models/available");
245
+ return res.data;
246
+ }
247
+ export async function listModelsByTier(tier) {
248
+ const res = await client().get(`/api/v1/ai-models/available/tier/${tier}`);
249
+ return res.data;
250
+ }
251
+ export async function getMyModels() {
252
+ const res = await client().get("/api/v1/users/me/ai-models");
253
+ return res.data;
254
+ }
255
+ export async function setMyModels(modelIds) {
256
+ await client().put("/api/v1/users/me/ai-models", { model_ids: modelIds });
257
+ }
258
+ // ---------------------------------------------------------------------------
259
+ // Users
260
+ // ---------------------------------------------------------------------------
261
+ export async function listUsers(role) {
262
+ const params = {};
263
+ if (role)
264
+ params.role = role;
265
+ const res = await client().get("/api/v1/users/", { params });
266
+ return res.data;
267
+ }
268
+ // ---------------------------------------------------------------------------
269
+ // References
270
+ // ---------------------------------------------------------------------------
271
+ export async function listReferences(workItemId, inherited) {
272
+ const path = inherited
273
+ ? `/api/v1/work-items/${workItemId}/references/inherited`
274
+ : `/api/v1/work-items/${workItemId}/references`;
275
+ const res = await client().get(path);
276
+ return res.data;
277
+ }
278
+ export async function createReference(workItemId, data) {
279
+ const res = await client().post(`/api/v1/work-items/${workItemId}/references`, data);
280
+ return res.data;
281
+ }
282
+ export async function deleteReference(workItemId, refId) {
283
+ await client().delete(`/api/v1/work-items/${workItemId}/references/${refId}`);
284
+ }
285
+ // ---------------------------------------------------------------------------
286
+ // Documents
287
+ // ---------------------------------------------------------------------------
288
+ export async function listDocuments(repoId) {
289
+ const res = await client().get(`/api/v1/repos/${repoId}/documents/`);
290
+ return res.data;
291
+ }
292
+ export async function uploadDocument(repoId, filename, content, contentType) {
293
+ const form = new FormData();
294
+ form.append("file", content, { filename, contentType: contentType ?? "text/markdown" });
295
+ const res = await client().post(`/api/v1/repos/${repoId}/documents/`, form, {
296
+ headers: form.getHeaders(),
297
+ });
298
+ return res.data;
299
+ }
300
+ export async function getDocument(repoId, docId) {
301
+ const res = await client().get(`/api/v1/repos/${repoId}/documents/${docId}`);
302
+ return res.data;
303
+ }
304
+ export async function getDocumentContent(repoId, docId) {
305
+ const res = await client().get(`/api/v1/repos/${repoId}/documents/${docId}/content`, {
306
+ responseType: "text",
307
+ });
308
+ return res.data;
309
+ }
310
+ export async function deleteDocument(repoId, docId) {
311
+ await client().delete(`/api/v1/repos/${repoId}/documents/${docId}`);
312
+ }
313
+ // ---------------------------------------------------------------------------
314
+ // Telemetry
315
+ // ---------------------------------------------------------------------------
316
+ export async function createTelemetry(workItemId, input) {
317
+ const res = await client().post(`/api/v1/work-items/${workItemId}/telemetry`, input);
318
+ return res.data;
319
+ }
320
+ export const reportTelemetry = createTelemetry;
321
+ export async function listTelemetry(workItemId) {
322
+ const res = await client().get(`/api/v1/work-items/${workItemId}/telemetry`);
323
+ return res.data;
324
+ }
325
+ //# sourceMappingURL=api.js.map