@koderlabs/tasks-mcp 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts","../src/tools/discover/whoami.ts","../src/tools/define.ts","../src/tools/discover/find-organizations.ts","../src/formatting/ticket.ts","../src/tools/discover/find-projects.ts","../src/errors.ts","../src/tools/discover/find-releases.ts","../src/tools/triage/find-issues.ts","../src/formatting/issue.ts","../src/tools/triage/find-tickets.ts","../src/tools/triage/get-issue-details.ts","../src/tools/triage/get-ticket-details.ts","../src/tools/triage/get-event-details.ts","../src/formatting/event.ts","../src/tools/triage/get-event-attachment.ts","../src/tools/widget-bug/get-bug-report.ts","../src/tools/widget-bug/get-bug-screenshot.ts","../src/tools/widget-bug/get-bug-annotations.ts","../src/tools/widget-bug/get-bug-console-logs.ts","../src/tools/widget-bug/get-bug-network-requests.ts","../src/tools/widget-bug/get-bug-metadata.ts","../src/tools/widget-bug/get-bug-breadcrumbs.ts","../src/tools/tickets/create-ticket.ts","../src/auth/scopes.ts","../src/middleware/audit.ts","../src/tools/tickets/update-ticket.ts","../src/tools/tickets/transition-ticket.ts","../src/tools/tickets/add-comment.ts","../src/tools/tickets/link-pr.ts","../src/tools/tickets/promote-issue-to-ticket.ts","../src/tools/release/pin-release.ts","../src/tools/release/symbolicate-frame.ts","../src/tools/release/find-release-artifacts.ts","../src/tools/index.ts","../src/audit-queue.ts","../src/api-client.ts","../src/auth/secret-key.ts"],"sourcesContent":["/**\n * MCP server construction — shared by both HTTP and stdio transports.\n *\n * Registers all tools from the tool registry. Applies scope filtering:\n * the tool list returned to the client is filtered to only those the\n * caller's token scopes permit.\n */\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { ALL_TOOLS, toolsForScopes } from './tools/index.js';\nimport { zodToJsonSchema } from './tools/define.js';\nimport { ApiClient } from './api-client.js';\nimport { ScopeSet } from './auth/scopes.js';\nimport { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';\n\nexport const SERVER_NAME = 'instanttasks-mcp';\nexport const SERVER_VERSION = '0.1.0';\n\nexport interface ServerContext {\n /** User-scoped client — every tool call is authenticated as the end user. */\n apiClient: ApiClient;\n /**\n * Management-key client used exclusively to ship audit records. The\n * `/audit/mcp` endpoint is gated by ManagementKeyGuard so user OAuth tokens\n * are rejected; this lets audit logging work regardless of how the caller\n * authenticated to MCP. May fall back to `apiClient` in stdio mode where\n * the caller IS a management key.\n */\n auditClient: ApiClient;\n scopes: ScopeSet;\n}\n\n/**\n * Create and configure an MCP Server instance.\n *\n * The caller provides a factory function that derives the ServerContext\n * (apiClient + scopes) from the current request. This allows both transports\n * to share the same tool registry while differing in how they authenticate.\n */\nexport function createMcpServer(getContext: () => ServerContext | Promise<ServerContext>): Server {\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n {\n capabilities: {\n // Per MCP spec 2025-06-18 §Tools: declare `listChanged` explicitly so\n // clients know whether to subscribe to `notifications/tools/list_changed`.\n // Our tool registry is static — set false to skip needless wiring.\n tools: { listChanged: false },\n },\n },\n );\n\n // ── ListTools ─────────────────────────────────────────────────────────────\n\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n const ctx = await getContext();\n const available = toolsForScopes(ctx.scopes.toArray());\n\n return {\n tools: available.map((tool) => ({\n name: tool.name,\n // Human-readable display name (Anthropic Directory requires this on\n // every tool — distinct from `name`).\n title: tool.title,\n description: tool.description,\n inputSchema: zodToJsonSchema(tool.inputSchema),\n // MCP 2025-06-18: annotations advise clients on tool behaviour\n // (readOnly / destructive / idempotent / openWorld). Optional —\n // omit when not provided so the field doesn't appear as undefined.\n ...(tool.annotations && { annotations: tool.annotations }),\n // Anthropic-specific `_meta` (e.g. `anthropic/maxResultSizeChars`)\n // surfaced at tools/list time so Claude clients can adjust per-tool\n // output thresholds before invoking.\n ...(tool.meta && { _meta: tool.meta }),\n })),\n };\n });\n\n // ── CallTool ──────────────────────────────────────────────────────────────\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: rawArgs } = request.params;\n\n const tool = ALL_TOOLS.find((t) => t.name === name);\n if (!tool) {\n throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);\n }\n\n const ctx = await getContext();\n\n // Scope check\n for (const scope of tool.requiredScopes) {\n if (!ctx.scopes.has(scope)) {\n throw new McpError(\n ErrorCode.InvalidRequest,\n `Token missing required scope '${scope}' for tool '${name}'`,\n );\n }\n }\n\n // Input validation via Zod\n const parseResult = tool.inputSchema.safeParse(rawArgs ?? {});\n if (!parseResult.success) {\n throw new McpError(\n ErrorCode.InvalidParams,\n `Invalid parameters for tool '${name}': ${parseResult.error.message}`,\n );\n }\n\n // Execute\n const result = await tool.handler(parseResult.data as Record<string, unknown>, {\n apiClient: ctx.apiClient,\n auditClient: ctx.auditClient,\n scopes: ctx.scopes,\n });\n\n return {\n content: result.content,\n isError: result.isError ?? false,\n // Forward tool-level `_meta` to the MCP response so clients can\n // surface deep-links / IDs / mimeType hints. Omit when empty so the\n // field doesn't appear as `undefined` over the wire.\n ...(result._meta && { _meta: result._meta }),\n };\n });\n\n return server;\n}\n","/**\n * whoami — discover current identity\n *\n * Returns the organization and project access attached to the current token.\n * Use this as the first tool call to orient the agent in the InstantTasks\n * workspace before running any fetch or search operations.\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You need to know which InstantTasks organization or projects are accessible\n with the current token before running any other tool.\n- The user asks \"who am I?\" or \"what can I access?\" in the context of\n InstantTasks.\n- You want to confirm token validity before a long agentic workflow.\n\nDO NOT USE:\n- To fetch a specific ticket, issue, or bug report — use get_ticket_details,\n get_issue_details, or get_bug_report for those.\n- More than once per session unless the token changes.\n\nTRIGGER PATTERNS:\n- \"what projects do I have access to\"\n- \"show my organizations\"\n- \"check my token\"\n- \"am I logged in to InstantTasks\"\n- Before calling find_organizations or find_projects as a pre-flight check.\n\n<examples>\n<example>\n<user>What projects do I have access to?</user>\n<tool>whoami</tool>\n<result>You have access to 1 organization: KoderLabs (slug: koderlabs). Projects: FE (Frontend), BE (Backend).</result>\n</example>\n</examples>\n`.trim();\n\nexport const whoamiTool = defineTool({\n name: 'whoami',\n title: 'Identify Current User',\n annotations: { readOnlyHint: true, openWorldHint: true },\n skills: ['discover'],\n requiredScopes: [SCOPE.PROJECT_READ],\n description: DESCRIPTION,\n inputSchema: z.object({}),\n async handler(_params, ctx): Promise<ToolResult> {\n const orgs = await ctx.apiClient.listOrganizations();\n if (orgs.length === 0) {\n return {\n content: [{ type: 'text', text: 'No organizations found for this token.' }],\n };\n }\n\n const lines: string[] = [];\n for (const org of orgs) {\n const projects = await ctx.apiClient.listProjects(org.id);\n lines.push(`Organization: ${org.name} (${org.slug})${org.isPersonal ? ' [personal]' : ''}`);\n if (projects.length === 0) {\n lines.push(' No projects.');\n } else {\n for (const p of projects) {\n lines.push(` Project: ${p.key} — ${p.name}`);\n }\n }\n }\n\n return {\n content: [{ type: 'text', text: lines.join('\\n') }],\n };\n },\n});\n","/**\n * defineTool() — ports the Sentry MCP pattern for tool registration.\n *\n * Each tool file exports a single `ToolDefinition` created by calling\n * `defineTool()`. The tool registry collects them and passes them to\n * the MCP server's `setRequestHandler`.\n *\n * Following the Sentry MCP pattern, tool descriptions are long-form LLM\n * prompts with USE WHEN / DO NOT USE / TRIGGER PATTERNS / EXAMPLES sections.\n * This is intentional — the description IS the prompt injected into the\n * model's context when the tool is available.\n */\nimport { type ZodSchema } from 'zod';\nimport { zodToJsonSchema as convertZodToJsonSchema } from 'zod-to-json-schema';\nimport { type ApiClient } from '../api-client.js';\nimport { type ScopeSet } from '../auth/scopes.js';\nimport type { Scope } from '@koderlabs/tasks-sdk-types';\n\nexport interface ToolContext {\n apiClient: ApiClient;\n /** Management-key client for audit shipping. See ServerContext.auditClient. */\n auditClient: ApiClient;\n scopes: ScopeSet;\n}\n\nexport type ToolHandler<TInput extends Record<string, unknown>> = (\n params: TInput,\n ctx: ToolContext,\n) => Promise<ToolResult>;\n\n/** Matches the MCP SDK content array structure. */\nexport type ToolContent =\n | { type: 'text'; text: string }\n | { type: 'image'; data: string; mimeType: string };\n\nexport interface ToolResult {\n content: ToolContent[];\n isError?: boolean;\n /**\n * MCP `_meta` passthrough. Clients (Claude Desktop, etc) surface specific\n * keys for richer UX — e.g. `ticketUrl` for deep linking, `mimeType` for\n * download hints. Keys are namespaced by convention (`instanttasks/...`).\n */\n _meta?: Record<string, unknown>;\n}\n\n/**\n * Per MCP 2025-06-18 spec — hints describing tool behavior. Clients use these\n * to decide whether to auto-run vs prompt for confirmation, batch calls, or\n * render destructive-action warnings.\n *\n * All hints are advisory; the server still enforces scopes + validation.\n */\nexport interface ToolAnnotations {\n /** Human-readable title for UI display. Falls back to `name`. */\n title?: string;\n /** True if tool does not mutate state. Default false. */\n readOnlyHint?: boolean;\n /** True if tool may delete or replace state in non-recoverable way. */\n destructiveHint?: boolean;\n /** True if repeated identical calls produce the same outcome. */\n idempotentHint?: boolean;\n /** True if tool reaches external systems beyond this MCP server. */\n openWorldHint?: boolean;\n}\n\nexport interface ToolDefinition<TInput extends Record<string, unknown> = Record<string, unknown>> {\n name: string;\n /**\n * Human-readable display name surfaced by Claude clients. Required by the\n * Anthropic Connectors Directory submission checklist — distinct from\n * `name` (the snake_case identifier used in tool calls).\n */\n title: string;\n /** Skill group(s) this tool belongs to — used for client-side filtering. */\n skills: string[];\n /** Scopes the caller's token must have for this tool to be available. */\n requiredScopes: Scope[];\n /** Long-form LLM prompt: USE WHEN / DO NOT USE / TRIGGER PATTERNS / EXAMPLES. */\n description: string;\n /** Zod schema for input validation. */\n inputSchema: ZodSchema<TInput>;\n /** MCP tool annotations (readOnly / destructive / idempotent / openWorld). */\n annotations?: ToolAnnotations;\n /**\n * Optional `_meta` passthrough surfaced in `tools/list`. Used for\n * Anthropic-specific extensions like `anthropic/maxResultSizeChars`\n * (raises Claude Code's per-tool persist-to-disk threshold up to 500k).\n */\n meta?: Record<string, unknown>;\n /** Tool handler. */\n handler: ToolHandler<TInput>;\n}\n\n/**\n * Define a tool. Returns the definition unchanged — exists for typing convenience\n * and to mirror the Sentry MCP `defineTool()` pattern.\n */\nexport function defineTool<TInput extends Record<string, unknown>>(\n definition: ToolDefinition<TInput>,\n): ToolDefinition<TInput> {\n return definition;\n}\n\n/**\n * Convert a Zod schema to the JSON Schema shape that MCP expects.\n *\n * Uses the `zod-to-json-schema` package — handles unions, records, nested\n * objects, refinements, defaults, and discriminated unions correctly.\n *\n * `target: 'openApi3'` emits the cleanest schema for LLM consumption\n * (no `$schema` URL, no `$ref` indirection — MCP clients want self-contained\n * schemas). `$refStrategy: 'none'` inlines everything so the schema travels\n * over MCP without external lookups.\n */\nexport function zodToJsonSchema(schema: ZodSchema): object {\n const out = convertZodToJsonSchema(schema, {\n target: 'openApi3',\n $refStrategy: 'none',\n }) as Record<string, unknown>;\n // OpenAPI3 target leaves a `$schema` key off; strip any remaining meta keys\n // that MCP clients don't need.\n delete out.$schema;\n delete out.definitions;\n return out;\n}\n","/**\n * find_organizations — list accessible organizations\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { formatOrganizationList } from '../../formatting/ticket.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You need a list of organizations the current token can access, e.g. before\n calling find_projects with a specific organizationId.\n- The user asks which teams, workspaces, or organizations they belong to.\n\nDO NOT USE:\n- To get project details — use find_projects instead.\n- When you already have the organizationId you need.\n\nTRIGGER PATTERNS:\n- \"list my organizations\"\n- \"show all workspaces\"\n- \"what teams / orgs do I have?\"\n- \"organization slug for <name>\"\n\n<examples>\n<example>\n<user>List all my organizations.</user>\n<tool>find_organizations</tool>\n<result>1 organization found: KoderLabs (slug: koderlabs, personal: false)</result>\n</example>\n</examples>\n`.trim();\n\nexport const findOrganizationsTool = defineTool({\n name: 'find_organizations',\n title: 'Find Organizations',\n annotations: { readOnlyHint: true, openWorldHint: true },\n skills: ['discover'],\n requiredScopes: [SCOPE.PROJECT_READ],\n description: DESCRIPTION,\n inputSchema: z.object({}),\n async handler(_params, ctx): Promise<ToolResult> {\n const orgs = await ctx.apiClient.listOrganizations();\n return {\n content: [{ type: 'text', text: formatOrganizationList(orgs) }],\n };\n },\n});\n","/**\n * Ticket formatting helpers — humanize ticket data for LLM context.\n */\nimport type { Ticket, TicketListItem, Organization } from '../api-client.js';\n\nexport function formatTicket(t: Ticket): string {\n const lines = [\n `${t.key} — ${t.title}`,\n `Status: ${t.status} | Priority: ${t.priority}`,\n t.assigneeId ? `Assignee ID: ${t.assigneeId}` : 'Assignee: unassigned',\n t.reporterId ? `Reporter ID: ${t.reporterId}` : '',\n `Created: ${t.createdAt.slice(0, 10)} | Updated: ${t.updatedAt.slice(0, 10)}`,\n ];\n\n if (t.description) {\n lines.push('', 'Description:', t.description.slice(0, 2000));\n if (t.description.length > 2000) lines.push('[description truncated]');\n }\n\n // Surface non-internal custom fields\n const cfKeys = Object.keys(t.customFields ?? {}).filter(\n (k) => !['screenshotAttachmentId', 'annotationsAttachmentId', 'sdkEventId', 'sdkMetadata'].includes(k),\n );\n if (cfKeys.length) {\n lines.push('', 'Custom fields:');\n for (const k of cfKeys) {\n lines.push(` ${k}: ${JSON.stringify(t.customFields[k])}`);\n }\n }\n\n return lines.filter(Boolean).join('\\n');\n}\n\nexport function formatTicketList(tickets: TicketListItem[]): string {\n const lines = tickets.map(\n (t) => `${t.key} — ${t.title} [${t.status}] [${t.priority}]`,\n );\n return `${tickets.length} ticket(s) found:\\n${lines.join('\\n')}`;\n}\n\nexport function formatOrganizationList(orgs: Organization[]): string {\n if (orgs.length === 0) return 'No organizations found.';\n const lines = orgs.map(\n (o) => `${o.name} (slug: ${o.slug}, personal: ${o.isPersonal})`,\n );\n return `${orgs.length} organization(s):\\n${lines.join('\\n')}`;\n}\n","/**\n * find_projects — list projects in an organization\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You need a project's key (e.g. \"FE\", \"BE\") to pass into find_tickets,\n get_ticket_details, or find_issues.\n- The user asks to list projects in a workspace or organization.\n\nDO NOT USE:\n- To fetch tickets — use find_tickets or get_ticket_details.\n- Without an organizationId — call find_organizations first.\n\nTRIGGER PATTERNS:\n- \"show projects in <org>\"\n- \"what project key is <name>?\"\n- \"list all projects\"\n\n<examples>\n<example>\n<user>What projects are in the KoderLabs organization?</user>\n<tool>find_projects { \"organizationId\": \"uuid-here\" }</tool>\n<result>3 projects: FE (Frontend), BE (Backend), MOB (Mobile)</result>\n</example>\n</examples>\n`.trim();\n\nexport const findProjectsTool = defineTool({\n name: 'find_projects',\n title: 'Find Projects',\n annotations: { readOnlyHint: true, openWorldHint: true },\n skills: ['discover'],\n requiredScopes: [SCOPE.PROJECT_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n organizationId: z.string().describe('UUID of the organization'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.organizationId) throw new UserInputError('organizationId is required');\n const projects = await ctx.apiClient.listProjects(params.organizationId);\n if (projects.length === 0) {\n return { content: [{ type: 'text', text: 'No projects found.' }] };\n }\n const lines = projects.map((p) => `${p.key} — ${p.name}${p.description ? `: ${p.description}` : ''}`);\n return { content: [{ type: 'text', text: `${projects.length} project(s):\\n${lines.join('\\n')}` }] };\n },\n});\n","/**\n * MCP error types that map to MCP protocol error codes.\n *\n * All tool handlers should throw these instead of raw Error objects so that\n * the MCP framework can serialize them correctly to the client.\n */\nimport { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';\n\n/** Raised when the caller passes invalid or missing input parameters. */\nexport class UserInputError extends McpError {\n constructor(message: string) {\n super(ErrorCode.InvalidParams, message);\n this.name = 'UserInputError';\n }\n}\n\n/** Raised when the InstantTasks API returns 404 for a resource. */\nexport class ApiNotFoundError extends McpError {\n constructor(resource: string, id: string) {\n super(ErrorCode.InvalidParams, `${resource} not found: ${id}`);\n this.name = 'ApiNotFoundError';\n }\n}\n\n/** Raised when the caller's token lacks a required scope. */\nexport class ScopeError extends McpError {\n constructor(requiredScope: string) {\n super(ErrorCode.InvalidRequest, `Token missing required scope: ${requiredScope}`);\n this.name = 'ScopeError';\n }\n}\n\n/** Raised when the InstantTasks API returns an unexpected error. */\nexport class ApiError extends McpError {\n constructor(message: string, public readonly statusCode?: number) {\n super(ErrorCode.InternalError, `InstantTasks API error: ${message}`);\n this.name = 'ApiError';\n }\n}\n\n/**\n * Raised when the caller's bearer token cannot be validated.\n * Maps to OAuth 2.0 `invalid_token` semantics — never silently grants scopes.\n */\nexport class AuthError extends McpError {\n constructor(public readonly reason: 'invalid_token' | 'expired_token' | 'missing_token' | 'config_error', detail?: string) {\n super(ErrorCode.InvalidRequest, detail ? `${reason}: ${detail}` : reason);\n this.name = 'AuthError';\n }\n}\n","/**\n * find_releases — list versions / releases for a project\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You need to know which releases or versions exist in a project, e.g. to\n filter bug reports to a specific release or answer \"what version shipped X?\".\n- The user asks for release history or version list.\n\nDO NOT USE:\n- To look up ticket-level version data — use get_ticket_details instead.\n- When you already have the version string you need.\n\nTRIGGER PATTERNS:\n- \"list releases for <project>\"\n- \"what versions exist in <project>?\"\n- \"show release history\"\n- \"when was v2.3 released?\"\n\n<examples>\n<example>\n<user>List recent releases in the FE project.</user>\n<tool>find_releases { \"projectId\": \"uuid\" }</tool>\n<result>5 releases: v2.5.0 (2026-05-01), v2.4.3 (2026-04-15), ...</result>\n</example>\n</examples>\n`.trim();\n\nexport const findReleasesTool = defineTool({\n name: 'find_releases',\n title: 'Find Releases',\n annotations: { readOnlyHint: true, openWorldHint: true },\n skills: ['discover'],\n requiredScopes: [SCOPE.PROJECT_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n projectId: z.string().describe('UUID of the project'),\n limit: z.number().optional().describe('Max releases to return (default 20)'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.projectId) throw new UserInputError('projectId is required');\n const releases = await ctx.apiClient.listReleases(params.projectId, params.limit);\n if (releases.length === 0) {\n return { content: [{ type: 'text', text: 'No releases found for this project.' }] };\n }\n const lines = releases.map(\n (r) => `${r.version}${r.releasedAt ? ` — released ${r.releasedAt.slice(0, 10)}` : ' (unreleased)'}`,\n );\n return { content: [{ type: 'text', text: `${releases.length} release(s):\\n${lines.join('\\n')}` }] };\n },\n});\n","/**\n * find_issues — search SDK error issues in a project (Phase C)\n *\n * NOTE: This tool depends on the Issues module introduced in Phase C.\n * If Phase C is not yet merged on the target API, this tool will return a\n * helpful message indicating the module is not yet available, rather than\n * throwing an error.\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\nimport { formatIssueList } from '../../formatting/issue.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You need to search for SDK-captured error issues in a project (crashes,\n exceptions, unhandled promise rejections captured by the InstantTasks SDK).\n- The user mentions \"errors\", \"crashes\", \"exceptions\", or \"issues in prod\".\n- You want to triage recent errors before diving into a specific ticket.\n\nDO NOT USE:\n- To search project management tickets — use find_tickets for those.\n- When you already have a specific issue ID — use get_issue_details instead.\n\nTRIGGER PATTERNS:\n- \"show recent errors in <project>\"\n- \"what crashes happened in prod?\"\n- \"find issues with status unresolved\"\n- \"search for TypeError in <project>\"\n\nDEPENDENCY:\n- Requires Phase C (Issues module) to be merged on the API. Returns a\n \"module not yet available\" notice if the API returns 404.\n\n<examples>\n<example>\n<user>Show unresolved errors in the FE project.</user>\n<tool>find_issues { \"projectId\": \"uuid\", \"filter\": \"status:unresolved\" }</tool>\n<result>12 unresolved issues found: TypeError in App.tsx (last seen 2h ago), ...</result>\n</example>\n</examples>\n`.trim();\n\nexport const findIssuesTool = defineTool({\n name: 'find_issues',\n title: 'Find Issues',\n annotations: { readOnlyHint: true, openWorldHint: true },\n meta: { 'anthropic/maxResultSizeChars': 300000 },\n skills: ['triage'],\n requiredScopes: [SCOPE.EVENT_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n projectId: z.string().describe('UUID of the project to search'),\n filter: z.string().optional().describe('Free-text or structured query, e.g. \"status:unresolved TypeError\"'),\n limit: z.number().optional().describe('Max issues to return (default 25)'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.projectId) throw new UserInputError('projectId is required');\n\n const issues = await ctx.apiClient.listIssues(params.projectId, params.filter, params.limit);\n\n if (issues === null) {\n return {\n content: [{\n type: 'text',\n text: 'The Issues module is not yet available on this InstantTasks instance (Phase C dependency). Use find_tickets to search project management tickets instead.',\n }],\n };\n }\n\n if (issues.length === 0) {\n return { content: [{ type: 'text', text: 'No issues found matching your filter.' }] };\n }\n\n return { content: [{ type: 'text', text: formatIssueList(issues) }] };\n },\n});\n","/**\n * Issue formatting helpers — humanize SDK error issue data for LLM context.\n */\nimport type { Issue } from '../api-client.js';\n\nexport function formatIssue(issue: Issue): string {\n const firstSeen = issue.firstSeen.slice(0, 10);\n const lastSeen = issue.lastSeen.slice(0, 10);\n return [\n `Issue: ${issue.title}`,\n `Culprit: ${issue.culprit}`,\n `Status: ${issue.status} | Level: ${issue.level}`,\n `Occurrences: ${issue.count.toLocaleString()}`,\n `First seen: ${firstSeen} | Last seen: ${lastSeen}`,\n `Project ID: ${issue.projectId}`,\n ].join('\\n');\n}\n\nexport function formatIssueList(issues: Issue[]): string {\n const lines = issues.map(\n (i) => `[${i.level.toUpperCase()}] ${i.title} — ${i.count} occurrences, last seen ${i.lastSeen.slice(0, 10)} (${i.status})`,\n );\n return `${issues.length} issue(s) found:\\n${lines.join('\\n')}`;\n}\n","/**\n * find_tickets — search project management tickets via IQL\n *\n * IQL (InstantTasks Query Language) supports fields like:\n * status = \"In Progress\" AND assignee = currentUser()\n * project = FE AND priority in (High, Critical) ORDER BY createdAt DESC\n * text ~ \"payment gateway\" AND created > -7d\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\nimport { formatTicketList } from '../../formatting/ticket.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You need to search InstantTasks project management tickets (tasks, bugs,\n stories, epics) using natural language or IQL.\n- The user references tickets, tasks, bugs in a project management context\n (not SDK-captured errors — use find_issues for those).\n- You want to list open tickets, tickets assigned to someone, or tickets\n matching a text query.\n\nDO NOT USE:\n- To find SDK-captured errors or crashes — use find_issues for those.\n- When you already have a ticket key (e.g. FE-42) — use get_ticket_details.\n\nTRIGGER PATTERNS:\n- \"find tickets assigned to <user>\"\n- \"show open bugs in <project>\"\n- \"list in-progress tickets\"\n- \"search for tickets about <topic>\"\n- \"what tickets are blocked?\"\n- \"IQL: <query>\"\n\nIQL EXAMPLES:\n- project = FE AND status = \"In Progress\"\n- assignee = currentUser() AND priority in (High, Critical)\n- text ~ \"payment\" AND created > -7d ORDER BY priority DESC\n- sprint in openSprints() AND status != Done\n\n<examples>\n<example>\n<user>Show open high-priority bugs in the FE project.</user>\n<tool>find_tickets { \"query\": \"project = FE AND status != Done AND priority = High\", \"limit\": 10 }</tool>\n<result>8 tickets found: FE-142 - Login page crash (High, In Progress), ...</result>\n</example>\n</examples>\n`.trim();\n\nexport const findTicketsTool = defineTool({\n name: 'find_tickets',\n title: 'Find Tickets',\n annotations: { readOnlyHint: true, openWorldHint: true },\n meta: { 'anthropic/maxResultSizeChars': 300000 },\n skills: ['triage'],\n requiredScopes: [SCOPE.TICKET_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n query: z.string().describe('IQL query string or natural language search'),\n projectKey: z.string().optional().describe('Project key to scope search (e.g. \"FE\")'),\n limit: z.number().optional().describe('Max tickets to return (default 25)'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.query) throw new UserInputError('query is required');\n\n const tickets = await ctx.apiClient.listTicketsByIQL(params.query, params.projectKey, params.limit);\n\n if (tickets.length === 0) {\n return { content: [{ type: 'text', text: 'No tickets found matching your query.' }] };\n }\n\n return { content: [{ type: 'text', text: formatTicketList(tickets) }] };\n },\n});\n","/**\n * get_issue_details — full detail for a single SDK error issue (Phase C)\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\nimport { formatIssue } from '../../formatting/issue.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You have an issue ID (from find_issues) and want full details: title,\n culprit, occurrence count, first/last seen, status, level.\n- The user asks to investigate or describe a specific SDK-captured error.\n\nDO NOT USE:\n- When you need event-level detail (breadcrumbs, stack trace) — use\n get_event_details for that.\n- For project management tickets — use get_ticket_details.\n\nTRIGGER PATTERNS:\n- \"tell me about issue <id>\"\n- \"describe error <id>\"\n- \"show details for this crash\"\n\nDEPENDENCY: Requires Phase C (Issues module) on the API.\n\n<examples>\n<example>\n<user>Show details for issue abc123.</user>\n<tool>get_issue_details { \"issueId\": \"abc123\" }</tool>\n<result>TypeError: Cannot read property 'x' of null | culprit: App.tsx | count: 42 | last seen: 2h ago</result>\n</example>\n</examples>\n`.trim();\n\nexport const getIssueDetailsTool = defineTool({\n name: 'get_issue_details',\n title: 'Get Issue Details',\n annotations: { readOnlyHint: true, openWorldHint: true },\n skills: ['triage'],\n requiredScopes: [SCOPE.EVENT_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n issueId: z.string().describe('Issue ID from find_issues output'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.issueId) throw new UserInputError('issueId is required');\n const issue = await ctx.apiClient.getIssue(params.issueId);\n if (!issue) {\n return {\n content: [{\n type: 'text',\n text: `Issue ${params.issueId} not found. Either the ID is incorrect or the Issues module (Phase C) is not yet deployed on this instance.`,\n }],\n };\n }\n return { content: [{ type: 'text', text: formatIssue(issue) }] };\n },\n});\n","/**\n * get_ticket_details — full detail for a project management ticket\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError, ApiNotFoundError } from '../../errors.js';\nimport { formatTicket } from '../../formatting/ticket.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You have a ticket key (e.g. \"FE-42\") and need its full details: title,\n description, status, priority, assignee, custom fields, comments count.\n- The user references a specific ticket by key and asks what it contains.\n- You want to read the full description or custom fields of a ticket before\n suggesting a fix.\n\nDO NOT USE:\n- To search for tickets — use find_tickets with an IQL query instead.\n- For SDK-captured error events — use get_event_details or get_bug_report.\n\nTRIGGER PATTERNS:\n- \"what is FE-42?\"\n- \"show ticket <key>\"\n- \"describe <KEY> ticket\"\n- \"open ticket <key>\"\n- \"ticket details for <key>\"\n\n<examples>\n<example>\n<user>What is ticket FE-142?</user>\n<tool>get_ticket_details { \"ticketKey\": \"FE-142\" }</tool>\n<result>FE-142 — Login page crashes on Safari | Status: In Progress | Priority: High | Assignee: jane@example.com</result>\n</example>\n</examples>\n`.trim();\n\nexport const getTicketDetailsTool = defineTool({\n name: 'get_ticket_details',\n title: 'Get Ticket Details',\n annotations: { readOnlyHint: true, openWorldHint: true },\n meta: { 'anthropic/maxResultSizeChars': 200000 },\n skills: ['triage'],\n requiredScopes: [SCOPE.TICKET_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n ticketKey: z.string().describe('Ticket key in PROJECT-NUMBER format, e.g. \"FE-42\"'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.ticketKey) throw new UserInputError('ticketKey is required');\n const ticket = await ctx.apiClient.getTicketByKey(params.ticketKey);\n if (!ticket) throw new ApiNotFoundError('Ticket', params.ticketKey);\n return { content: [{ type: 'text', text: formatTicket(ticket) }] };\n },\n});\n","/**\n * get_event_details — full detail for a single SDK event occurrence (Phase C)\n *\n * An \"event\" is a single occurrence within an \"issue\". One issue may have\n * thousands of events. This tool fetches the full event: message, level,\n * timestamp, breadcrumbs, tags, extra, request context.\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\nimport { formatEvent } from '../../formatting/event.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You have an event ID and want the complete event payload: message, level,\n timestamp, breadcrumbs, tags, extra context, request info.\n- The user asks to investigate a specific occurrence of an error.\n- You want breadcrumbs or stack details to understand *what the user did*\n before the crash happened.\n\nDO NOT USE:\n- To get issue-level aggregate data — use get_issue_details for that.\n- For widget bug screenshots — use get_bug_screenshot.\n- For project tickets — use get_ticket_details.\n\nTRIGGER PATTERNS:\n- \"show event <id>\"\n- \"what happened in this occurrence?\"\n- \"get breadcrumbs for event <id>\"\n- \"what was the request when this error happened?\"\n\nDEPENDENCY: Requires Phase C (Issues + Events module) on the API.\n\n<examples>\n<example>\n<user>Show me event details for event xyz789.</user>\n<tool>get_event_details { \"eventId\": \"xyz789\" }</tool>\n<result>Event xyz789 | TypeError: null pointer | Breadcrumbs: 5 entries | Tags: browser=Chrome, os=macOS</result>\n</example>\n</examples>\n`.trim();\n\nexport const getEventDetailsTool = defineTool({\n name: 'get_event_details',\n title: 'Get Event Details',\n annotations: { readOnlyHint: true, openWorldHint: true },\n skills: ['triage'],\n requiredScopes: [SCOPE.EVENT_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n eventId: z.string().describe('SDK event ID'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.eventId) throw new UserInputError('eventId is required');\n const event = await ctx.apiClient.getEvent(params.eventId);\n if (!event) {\n return {\n content: [{\n type: 'text',\n text: `Event ${params.eventId} not found. Either the ID is incorrect or the Events module (Phase C) is not yet deployed.`,\n }],\n };\n }\n return { content: [{ type: 'text', text: formatEvent(event) }] };\n },\n});\n","/**\n * Event formatting helpers — humanize SDK event data for LLM context.\n */\nimport type { SdkEvent, Breadcrumb } from '../api-client.js';\n\nexport function formatEvent(event: SdkEvent): string {\n const lines = [\n `Event: ${event.id}`,\n `Message: ${event.message}`,\n `Level: ${event.level} | Timestamp: ${event.timestamp}`,\n ];\n\n if (Object.keys(event.tags ?? {}).length) {\n lines.push('Tags: ' + Object.entries(event.tags).map(([k, v]) => `${k}=${v}`).join(', '));\n }\n\n if (event.request) {\n const req = event.request as Record<string, unknown>;\n lines.push(`Request: ${req.method ?? '?'} ${req.url ?? '?'}`);\n }\n\n if (event.breadcrumbs?.length) {\n lines.push('', `Breadcrumbs (${event.breadcrumbs.length} entries):`);\n lines.push(formatBreadcrumbs(event.breadcrumbs.slice(-10)));\n if (event.breadcrumbs.length > 10) {\n lines.push(`[${event.breadcrumbs.length - 10} earlier entries omitted]`);\n }\n }\n\n if (Object.keys(event.extra ?? {}).length) {\n lines.push('', 'Extra context:', JSON.stringify(event.extra, null, 2).slice(0, 500));\n }\n\n return lines.join('\\n');\n}\n\nexport function formatBreadcrumbs(breadcrumbs: Breadcrumb[]): string {\n return breadcrumbs.map((b) => {\n const ts = b.timestamp ? b.timestamp.slice(11, 19) : '?';\n const data = Object.keys(b.data ?? {}).length\n ? ` | ${JSON.stringify(b.data)}`\n : '';\n return `${ts} [${b.category}] ${b.message}${data}`;\n }).join('\\n');\n}\n\n/** Convert ArrayBuffer to base64 string (safe for JSON transport). */\nexport function bufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n","/**\n * get_event_attachment — download an attachment from an SDK event (Phase C)\n *\n * Returns binary attachment data as base64 — matches the Sentry MCP\n * `get_event_attachment` pattern. Common use: fetching a minidump file,\n * a serialized state snapshot, or other binary attached to a crash event.\n *\n * For widget bug screenshots specifically, use get_bug_screenshot which\n * handles the ticket → attachment resolution automatically.\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError, ApiNotFoundError } from '../../errors.js';\nimport { bufferToBase64 } from '../../formatting/event.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You need a binary file attached to an SDK event (minidump, state snapshot,\n custom attachment uploaded by the SDK).\n- You want to read or display a crash attachment in the agent's context.\n\nDO NOT USE:\n- For widget bug screenshots — use get_bug_screenshot instead (it handles\n the ticket → event → attachment chain automatically).\n- When you just need event metadata — use get_event_details.\n\nTRIGGER PATTERNS:\n- \"download attachment <id> from event <id>\"\n- \"get the minidump for event <id>\"\n- \"show the state snapshot attached to crash <id>\"\n\nDEPENDENCY: Requires Phase C (Events module) on the API.\n\n<examples>\n<example>\n<user>Get attachment abc from event xyz.</user>\n<tool>get_event_attachment { \"eventId\": \"xyz\", \"attachmentId\": \"abc\" }</tool>\n<result>{ mimeType: 'application/octet-stream', dataBase64: '...' }</result>\n</example>\n</examples>\n`.trim();\n\nexport const getEventAttachmentTool = defineTool({\n name: 'get_event_attachment',\n title: 'Get Event Attachment',\n annotations: { readOnlyHint: true, openWorldHint: true },\n skills: ['triage'],\n requiredScopes: [SCOPE.EVENT_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n eventId: z.string().describe('SDK event ID'),\n attachmentId: z.string().describe('Attachment ID from the event details'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.eventId) throw new UserInputError('eventId is required');\n if (!params.attachmentId) throw new UserInputError('attachmentId is required');\n\n const result = await ctx.apiClient.getEventAttachment(params.eventId, params.attachmentId);\n\n if (!result) {\n throw new ApiNotFoundError('Event attachment', `${params.eventId}/${params.attachmentId}`);\n }\n\n const isImage = result.mimeType.startsWith('image/');\n\n if (isImage) {\n return {\n content: [{\n type: 'image',\n data: bufferToBase64(result.buffer),\n mimeType: result.mimeType,\n }],\n };\n }\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n mimeType: result.mimeType,\n dataBase64: bufferToBase64(result.buffer),\n sizeBytes: result.buffer.byteLength,\n }),\n }],\n };\n },\n});\n","/**\n * get_bug_report — fetch the full widget bug report for a ticket\n *\n * Widget bug reports are tickets submitted via the InstantTasks browser SDK\n * widget. They contain an embedded SDK event payload in customFields plus\n * screenshot and annotation attachments. This tool returns the ticket with\n * all available bug-report metadata in a format optimized for LLM triage.\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError, ApiNotFoundError } from '../../errors.js';\nimport { formatTicket } from '../../formatting/ticket.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- A user submits a bug via the InstantTasks widget and you want to see the\n full report: title, description, URL, browser info, and all attached data.\n- You have a ticket key (e.g. \"FE-42\") and want a summary of the bug report\n including what the user was doing when they hit the bug.\n- Before calling get_bug_screenshot, get_bug_console_logs, or other\n widget_bug tools — call this first to confirm the ticket exists and\n understand what data is available.\n\nDO NOT USE:\n- For non-widget tickets (tasks, stories, epics) — use get_ticket_details\n instead (it returns the same data, but without bug-report context).\n- When you need the screenshot image specifically — use get_bug_screenshot\n which returns image bytes.\n\nTRIGGER PATTERNS:\n- \"show bug report for <ticket key>\"\n- \"what did the user report in FE-42?\"\n- \"open bug <key>\"\n- \"what happened in ticket <key>?\"\n- \"user submitted bug <key>, what does it say?\"\n\n<examples>\n<example>\n<user>Show the bug report for FE-99.</user>\n<tool>get_bug_report { \"ticketKey\": \"FE-99\" }</tool>\n<result>FE-99: \"Checkout button doesn't work\" | URL: /checkout | Browser: Chrome 124 | OS: Windows 11 | Screenshot available: yes</result>\n</example>\n</examples>\n`.trim();\n\nexport const getBugReportTool = defineTool({\n name: 'get_bug_report',\n title: 'Get Bug Report',\n annotations: { readOnlyHint: true, openWorldHint: true },\n skills: ['widget_bug'],\n requiredScopes: [SCOPE.TICKET_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n ticketKey: z.string().describe('Ticket key in PROJECT-NUMBER format, e.g. \"FE-42\"'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.ticketKey) throw new UserInputError('ticketKey is required');\n const ticket = await ctx.apiClient.getBugReport(params.ticketKey);\n if (!ticket) throw new ApiNotFoundError('Bug report ticket', params.ticketKey);\n\n const hasScreenshot = !!(ticket.customFields?.screenshotAttachmentId);\n const hasAnnotations = !!(ticket.customFields?.annotationsAttachmentId);\n const hasSdkEvent = !!(ticket.customFields?.sdkEventId);\n\n const sections = [\n formatTicket(ticket),\n '',\n '── Attached data ──',\n `Screenshot: ${hasScreenshot ? 'yes (call get_bug_screenshot to fetch image)' : 'none'}`,\n `Annotations: ${hasAnnotations ? 'yes (call get_bug_annotations)' : 'none'}`,\n `SDK event data: ${hasSdkEvent ? 'yes (console logs, network requests, breadcrumbs available)' : 'none'}`,\n ];\n\n return { content: [{ type: 'text', text: sections.join('\\n') }] };\n },\n});\n","/**\n * get_bug_screenshot — fetch the screenshot captured with a widget bug report\n *\n * Returns image bytes as base64 in an MCP image content block so that\n * multimodal models can see the screenshot directly in their context.\n * Pattern matches Sentry MCP's get_event_attachment for image attachments.\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError, ApiNotFoundError } from '../../errors.js';\nimport { bufferToBase64 } from '../../formatting/event.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You want to see the screenshot the user captured when they submitted a bug\n report via the InstantTasks widget.\n- The screenshot will help you understand what was on screen when the bug\n was reported (UI state, error messages, visual glitches).\n- You need visual evidence before suggesting a fix or asking for more info.\n\nDO NOT USE:\n- If the model context does not support images — use get_bug_report for a\n text summary instead.\n- When you haven't confirmed a screenshot exists — call get_bug_report first\n to check if screenshotAttachmentId is present.\n- For event attachments not linked to widget bugs — use get_event_attachment.\n\nTRIGGER PATTERNS:\n- \"show screenshot for <ticket key>\"\n- \"what did the screen look like when they reported <key>?\"\n- \"get the screenshot from FE-42\"\n- \"show me the bug screenshot\"\n\nRETURN FORMAT:\nReturns an MCP image content block: { type: 'image', mimeType: 'image/png', data: '<base64>' }.\nThe model renders this inline. If no screenshot is attached, returns a text explanation.\n\n<examples>\n<example>\n<user>Show me the screenshot from FE-99.</user>\n<tool>get_bug_screenshot { \"ticketKey\": \"FE-99\" }</tool>\n<result>[image/png inline — 1920x1080 screenshot of checkout page with error toast visible]</result>\n</example>\n</examples>\n`.trim();\n\nexport const getBugScreenshotTool = defineTool({\n name: 'get_bug_screenshot',\n title: 'Get Bug Screenshot',\n annotations: { readOnlyHint: true, openWorldHint: true },\n skills: ['widget_bug'],\n requiredScopes: [SCOPE.TICKET_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n ticketKey: z.string().describe('Ticket key in PROJECT-NUMBER format, e.g. \"FE-42\"'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.ticketKey) throw new UserInputError('ticketKey is required');\n\n const result = await ctx.apiClient.getBugScreenshot(params.ticketKey);\n\n if (!result) {\n return {\n content: [{\n type: 'text',\n text: `No screenshot found for ticket ${params.ticketKey}. Either the ticket does not exist, was not submitted via the widget, or no screenshot was captured. Call get_bug_report to check what data is available.`,\n }],\n };\n }\n\n return {\n content: [{\n type: 'image',\n data: bufferToBase64(result.buffer),\n mimeType: result.mimeType,\n }],\n };\n },\n});\n","/**\n * get_bug_annotations — fetch the annotation overlay from a widget bug report\n *\n * When a user submits a bug via the widget they can draw on the screenshot\n * (highlights, arrows, hide-sensitive-area boxes). This tool returns those\n * annotation commands as JSON so the model can understand what the user\n * was pointing at.\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- The bug reporter drew on the screenshot to highlight a UI element, and you\n want to understand what they were pointing at.\n- You need to know which part of the screen the user considered important.\n\nDO NOT USE:\n- As a substitute for get_bug_screenshot — annotations are overlay commands,\n not a rendered image. Use get_bug_screenshot for the visual.\n\nTRIGGER PATTERNS:\n- \"what did the user highlight in the screenshot?\"\n- \"show annotations for <ticket key>\"\n- \"what was the user pointing at?\"\n\n<examples>\n<example>\n<user>What did the user highlight in FE-99's screenshot?</user>\n<tool>get_bug_annotations { \"ticketKey\": \"FE-99\" }</tool>\n<result>[{ type: \"highlight\", x: 120, y: 340, width: 200, height: 40, comment: \"this button is broken\" }]</result>\n</example>\n</examples>\n`.trim();\n\nexport const getBugAnnotationsTool = defineTool({\n name: 'get_bug_annotations',\n title: 'Get Bug Annotations',\n annotations: { readOnlyHint: true, openWorldHint: true },\n skills: ['widget_bug'],\n requiredScopes: [SCOPE.TICKET_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n ticketKey: z.string().describe('Ticket key in PROJECT-NUMBER format, e.g. \"FE-42\"'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.ticketKey) throw new UserInputError('ticketKey is required');\n\n const annotations = await ctx.apiClient.getBugAnnotations(params.ticketKey);\n\n if (annotations === null) {\n return {\n content: [{\n type: 'text',\n text: `No annotations found for ticket ${params.ticketKey}. The reporter may not have drawn on the screenshot, or the ticket was not submitted via the widget.`,\n }],\n };\n }\n\n return {\n content: [{\n type: 'text',\n text: typeof annotations === 'string'\n ? annotations\n : JSON.stringify(annotations, null, 2),\n }],\n };\n },\n});\n","/**\n * get_bug_console_logs — fetch console output captured with a widget bug report\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You need to see what JavaScript console output (console.log, console.error,\n console.warn) was present in the browser when the user submitted the bug.\n- Useful for spotting JS errors, API response logging, or debug output that\n reveals the root cause.\n\nDO NOT USE:\n- For server-side logs — console logs here are browser-side only.\n- When the ticket was not submitted via the InstantTasks widget — the data\n won't be available.\n\nTRIGGER PATTERNS:\n- \"show console logs for <ticket key>\"\n- \"what errors appeared in the console when <key> happened?\"\n- \"console output for bug <key>\"\n\n<examples>\n<example>\n<user>Show console logs for FE-99.</user>\n<tool>get_bug_console_logs { \"ticketKey\": \"FE-99\" }</tool>\n<result>[ERROR] TypeError: Cannot read properties of null | [WARN] Slow API response 3200ms | [LOG] user clicked checkout</result>\n</example>\n</examples>\n`.trim();\n\nexport const getBugConsoleLogsTool = defineTool({\n name: 'get_bug_console_logs',\n title: 'Get Bug Console Logs',\n annotations: { readOnlyHint: true, openWorldHint: true },\n meta: { 'anthropic/maxResultSizeChars': 300000 },\n skills: ['widget_bug'],\n requiredScopes: [SCOPE.TICKET_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n ticketKey: z.string().describe('Ticket key in PROJECT-NUMBER format, e.g. \"FE-42\"'),\n level: z.enum(['error', 'warn', 'log', 'info', 'debug']).optional().describe('Filter by log level'),\n limit: z.number().optional().describe('Max entries to return (default: all)'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.ticketKey) throw new UserInputError('ticketKey is required');\n\n const logs = await ctx.apiClient.getBugConsoleLogs(params.ticketKey);\n\n if (logs === null) {\n return {\n content: [{\n type: 'text',\n text: `No console logs found for ticket ${params.ticketKey}. The ticket may not have been submitted via the widget, or console recording was disabled.`,\n }],\n };\n }\n\n // Apply optional filters\n let filtered = logs as Array<{ level?: string; message?: string; timestamp?: string }>;\n if (params.level) {\n filtered = filtered.filter((l) => l.level === params.level);\n }\n if (params.limit) {\n filtered = filtered.slice(0, params.limit);\n }\n\n if (filtered.length === 0) {\n return { content: [{ type: 'text', text: 'No console log entries match the filter.' }] };\n }\n\n const lines = filtered.map((l) => {\n const ts = l.timestamp ? `[${l.timestamp}] ` : '';\n const lvl = l.level ? `[${l.level.toUpperCase()}] ` : '';\n return `${ts}${lvl}${l.message ?? JSON.stringify(l)}`;\n });\n\n return { content: [{ type: 'text', text: lines.join('\\n') }] };\n },\n});\n","/**\n * get_bug_network_requests — fetch network request ring captured with a widget bug report\n *\n * Returns the HTTP requests the browser made (URL, method, status, timing,\n * response size) in a ring buffer up to the moment of submission.\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You need to inspect what API calls the browser made before or during the bug.\n- Useful for spotting failed API calls (4xx/5xx), slow responses, or missing\n requests that explain the bug.\n\nDO NOT USE:\n- When you need server-side request logs — this is browser-side only.\n- For tickets not submitted via the InstantTasks widget.\n\nTRIGGER PATTERNS:\n- \"what API calls were made before bug <key>?\"\n- \"show network requests for <ticket key>\"\n- \"did any request fail when <key> occurred?\"\n- \"show 4xx requests in <key>\"\n\n<examples>\n<example>\n<user>Show network requests for FE-99, filtering for failed ones.</user>\n<tool>get_bug_network_requests { \"ticketKey\": \"FE-99\", \"statusFilter\": \"4xx\" }</tool>\n<result>3 failed requests: POST /api/checkout → 422 (150ms), GET /api/cart → 401 (89ms), ...</result>\n</example>\n</examples>\n`.trim();\n\nexport const getBugNetworkRequestsTool = defineTool({\n name: 'get_bug_network_requests',\n title: 'Get Bug Network Requests',\n annotations: { readOnlyHint: true, openWorldHint: true },\n meta: { 'anthropic/maxResultSizeChars': 300000 },\n skills: ['widget_bug'],\n requiredScopes: [SCOPE.TICKET_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n ticketKey: z.string().describe('Ticket key in PROJECT-NUMBER format, e.g. \"FE-42\"'),\n statusFilter: z.string().optional().describe('Filter by status range: \"4xx\", \"5xx\", \"2xx\", or exact code like \"404\"'),\n limit: z.number().optional().describe('Max entries to return (default: all)'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.ticketKey) throw new UserInputError('ticketKey is required');\n\n const requests = await ctx.apiClient.getBugNetworkRequests(params.ticketKey);\n\n if (requests === null) {\n return {\n content: [{\n type: 'text',\n text: `No network requests found for ticket ${params.ticketKey}. The ticket may not have been submitted via the widget, or network recording was disabled.`,\n }],\n };\n }\n\n let filtered = requests as Array<{\n url?: string;\n method?: string;\n status?: number;\n duration?: number;\n responseSize?: number;\n }>;\n\n if (params.statusFilter) {\n const sf = params.statusFilter;\n if (sf === '4xx') filtered = filtered.filter((r) => (r.status ?? 0) >= 400 && (r.status ?? 0) < 500);\n else if (sf === '5xx') filtered = filtered.filter((r) => (r.status ?? 0) >= 500);\n else if (sf === '2xx') filtered = filtered.filter((r) => (r.status ?? 0) >= 200 && (r.status ?? 0) < 300);\n else {\n const code = parseInt(sf, 10);\n if (!isNaN(code)) filtered = filtered.filter((r) => r.status === code);\n }\n }\n\n if (params.limit) filtered = filtered.slice(0, params.limit);\n\n if (filtered.length === 0) {\n return { content: [{ type: 'text', text: 'No network requests match the filter.' }] };\n }\n\n const lines = filtered.map((r) => {\n const status = r.status ?? '?';\n const duration = r.duration != null ? `${r.duration}ms` : '?ms';\n const size = r.responseSize != null ? ` ${Math.round(r.responseSize / 1024)}KB` : '';\n return `${r.method ?? 'GET'} ${r.url ?? '?'} → ${status} (${duration}${size})`;\n });\n\n return { content: [{ type: 'text', text: `${filtered.length} request(s):\\n${lines.join('\\n')}` }] };\n },\n});\n","/**\n * get_bug_metadata — fetch developer-set key/value metadata from a widget bug report\n *\n * Host apps call `widget.setCustomData({ userId, plan, featureFlags })` before\n * a user submits a bug. This metadata is stored in the SDK event and surfaces\n * here so agents know the user's context at the time of the bug.\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You want to know the developer-supplied context attached to a bug report:\n userId, plan tier, feature flags, environment, custom attributes.\n- Host apps use widget.setCustomData() to inject structured context — this\n tool returns whatever was set.\n\nDO NOT USE:\n- For console logs — use get_bug_console_logs.\n- For breadcrumbs (user actions) — use get_bug_breadcrumbs.\n- For browser/OS info — use get_bug_report which includes that in the summary.\n\nTRIGGER PATTERNS:\n- \"what user submitted bug <key>?\"\n- \"show metadata for <ticket key>\"\n- \"what plan was the user on when they hit <key>?\"\n- \"custom data for bug <key>\"\n\n<examples>\n<example>\n<user>What user submitted FE-99?</user>\n<tool>get_bug_metadata { \"ticketKey\": \"FE-99\" }</tool>\n<result>userId: u_12345 | email: alice@example.com | plan: enterprise | featureFlag.newCheckout: true</result>\n</example>\n</examples>\n`.trim();\n\nexport const getBugMetadataTool = defineTool({\n name: 'get_bug_metadata',\n title: 'Get Bug Metadata',\n annotations: { readOnlyHint: true, openWorldHint: true },\n skills: ['widget_bug'],\n requiredScopes: [SCOPE.TICKET_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n ticketKey: z.string().describe('Ticket key in PROJECT-NUMBER format, e.g. \"FE-42\"'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.ticketKey) throw new UserInputError('ticketKey is required');\n\n const metadata = await ctx.apiClient.getBugMetadata(params.ticketKey);\n\n if (metadata === null) {\n return {\n content: [{\n type: 'text',\n text: `No developer metadata found for ticket ${params.ticketKey}. The host app may not have called setCustomData(), or the ticket was not submitted via the widget.`,\n }],\n };\n }\n\n const lines = Object.entries(metadata).map(([k, v]) => `${k}: ${JSON.stringify(v)}`);\n return { content: [{ type: 'text', text: lines.join('\\n') || 'Metadata object is empty.' }] };\n },\n});\n","/**\n * get_bug_breadcrumbs — fetch the breadcrumb trail from a widget bug report\n *\n * Breadcrumbs are a chronological trail of user actions and system events\n * that led up to the bug submission: clicks, navigations, XHR calls,\n * manual events from leaveBreadcrumb(), etc.\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\nimport { formatBreadcrumbs } from '../../formatting/event.js';\nimport type { Breadcrumb } from '../../api-client.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- You want to reconstruct what the user was doing before they submitted the\n bug — which pages they visited, what they clicked, what API calls fired.\n- You need to understand the reproduction steps for a bug report.\n- The breadcrumb trail often contains the smoking gun that explains WHY the\n bug happened.\n\nDO NOT USE:\n- For console output (console.log) — use get_bug_console_logs.\n- For network request details — use get_bug_network_requests.\n\nTRIGGER PATTERNS:\n- \"what was the user doing before bug <key>?\"\n- \"show breadcrumbs for <ticket key>\"\n- \"user journey for bug <key>\"\n- \"how did the user get to the error in <key>?\"\n- \"reproduce steps for <key>\"\n\n<examples>\n<example>\n<user>What was the user doing before submitting FE-99?</user>\n<tool>get_bug_breadcrumbs { \"ticketKey\": \"FE-99\" }</tool>\n<result>\n14:23:01 [navigation] Navigated to /checkout\n14:23:05 [click] Clicked \"Place Order\" button\n14:23:05 [xhr] POST /api/orders → pending\n14:23:08 [error] Unhandled rejection: Network timeout\n</result>\n</example>\n</examples>\n`.trim();\n\nexport const getBugBreadcrumbsTool = defineTool({\n name: 'get_bug_breadcrumbs',\n title: 'Get Bug Breadcrumbs',\n annotations: { readOnlyHint: true, openWorldHint: true },\n meta: { 'anthropic/maxResultSizeChars': 200000 },\n skills: ['widget_bug'],\n requiredScopes: [SCOPE.TICKET_READ],\n description: DESCRIPTION,\n inputSchema: z.object({\n ticketKey: z.string().describe('Ticket key in PROJECT-NUMBER format, e.g. \"FE-42\"'),\n limit: z.number().optional().describe('Max breadcrumbs to return, from most recent (default: all)'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n if (!params.ticketKey) throw new UserInputError('ticketKey is required');\n\n const breadcrumbs = await ctx.apiClient.getBugBreadcrumbs(params.ticketKey);\n\n if (breadcrumbs === null) {\n return {\n content: [{\n type: 'text',\n text: `No breadcrumbs found for ticket ${params.ticketKey}. The ticket may not have been submitted via the widget, or breadcrumb recording was disabled.`,\n }],\n };\n }\n\n let crumbs: Breadcrumb[] = breadcrumbs;\n if (params.limit) crumbs = crumbs.slice(-params.limit);\n\n if (crumbs.length === 0) {\n return { content: [{ type: 'text', text: 'No breadcrumbs recorded.' }] };\n }\n\n return { content: [{ type: 'text', text: formatBreadcrumbs(crumbs) }] };\n },\n});\n","/**\n * create_ticket — create a new ticket in an InstantTasks project.\n * Scope: ticket:write\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { assertScope } from '../../auth/scopes.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\nimport { withAudit } from '../../middleware/audit.js';\n\nconst DESCRIPTION = `\nUSE WHEN:\n- An agent has diagnosed a bug and needs to file a ticket.\n- The user asks to create a new task, bug report, or story.\n- A monitoring alert should become an actionable ticket.\nDO NOT USE to update an existing ticket — use update_ticket.\nREQUIRED SCOPE: ticket:write\n`.trim();\n\nexport const createTicketTool = defineTool({\n name: 'create_ticket',\n title: 'Create Ticket',\n annotations: { destructiveHint: false, idempotentHint: false, openWorldHint: true },\n skills: ['tickets'],\n requiredScopes: [SCOPE.TICKET_WRITE],\n description: DESCRIPTION,\n inputSchema: z.object({\n project: z.string().describe('Project UUID or key (e.g. \"FE\")'),\n title: z.string().describe('Ticket title / summary'),\n description: z.string().optional().describe('Ticket description (markdown)'),\n issueType: z.string().optional().describe('bug | story | task | subtask | epic'),\n priority: z.string().optional().describe('Highest | High | Medium | Low | Lowest'),\n assigneeId: z.string().optional().describe('Assignee user ID (UUID)'),\n sprintId: z.string().optional().describe('Sprint UUID'),\n labels: z.array(z.string()).optional(),\n customFields: z.record(z.unknown()).optional(),\n }),\n handler: withAudit('create_ticket', async (params, ctx): Promise<ToolResult> => {\n assertScope(ctx.scopes, SCOPE.TICKET_WRITE);\n if (!params.project) throw new UserInputError('project is required');\n if (!params.title?.trim()) throw new UserInputError('title is required');\n\n const body: Record<string, unknown> = { title: params.title };\n if (params.description !== undefined) body.description = params.description;\n if (params.issueType !== undefined) body.issueType = params.issueType;\n if (params.priority !== undefined) body.priority = params.priority;\n if (params.assigneeId !== undefined) body.assigneeId = params.assigneeId;\n if (params.sprintId !== undefined) body.sprintId = params.sprintId;\n if (params.labels !== undefined) body.labels = params.labels;\n if (params.customFields !== undefined) body.customFields = params.customFields;\n\n const ticket = await ctx.apiClient.createTicket(params.project, body);\n\n return {\n content: [{\n type: 'text',\n text: `Ticket **${ticket.key}** created: ${ticket.title}\\nStatus: ${ticket.status} | Priority: ${ticket.priority}`,\n }],\n _meta: {\n 'instanttasks/ticketId': ticket.id,\n 'instanttasks/ticketKey': ticket.key,\n },\n };\n }),\n});\n","/**\n * Scope set + assertion helpers for MCP token validation.\n *\n * Scopes come from @koderlabs/tasks-sdk-types so the vocabulary is shared\n * between the ingest SDK, the management key system, and the MCP layer.\n */\nimport { type Scope } from '@koderlabs/tasks-sdk-types';\nimport { ScopeError } from '../errors.js';\n\nexport type { Scope };\n\n/** Immutable set of scopes attached to the current request's token. */\nexport class ScopeSet {\n private readonly set: ReadonlySet<string>;\n\n constructor(scopes: string[]) {\n this.set = new Set(scopes);\n }\n\n has(scope: Scope): boolean {\n return this.set.has(scope);\n }\n\n hasAll(scopes: Scope[]): boolean {\n return scopes.every((s) => this.set.has(s));\n }\n\n toArray(): string[] {\n return [...this.set];\n }\n}\n\n/**\n * Asserts that the ScopeSet contains the required scope.\n * Throws ScopeError (which serializes to MCP InvalidRequest) if not.\n */\nexport function assertScope(scopes: ScopeSet, required: Scope): void {\n if (!scopes.has(required)) {\n throw new ScopeError(required);\n }\n}\n\n/**\n * Asserts that the ScopeSet contains ALL of the listed scopes.\n */\nexport function assertScopes(scopes: ScopeSet, required: Scope[]): void {\n for (const s of required) {\n assertScope(scopes, s);\n }\n}\n","/**\n * MCP Audit Middleware\n *\n * Provides two integration points:\n *\n * 1. `withAudit(toolName, handler)` — wraps a `defineTool` handler.\n * Before invocation: redacts sensitive args.\n * After invocation: ships a structured record to `ApiClient.shipAuditRecord`.\n * Args AND result content are passed through the key-based redactor so\n * no sensitive substring leaks into the audit log.\n *\n * 2. `redactArgs(value)` — utility used by tools that want to ship custom\n * audit records via `ctx.apiClient.shipAuditRecord`.\n *\n * 3. `redactString(s)` — heuristic string redactor that masks bearer tokens,\n * management keys, and obvious secret patterns embedded in free-form text\n * (e.g. inside `result.content[].text`).\n */\n\nimport type { ToolContext, ToolHandler, ToolResult } from '../tools/define.js';\n\n/** Fields that must never appear in the audit log payload. */\nconst REDACTED_KEYS = new Set([\n 'password',\n 'token',\n 'secret',\n 'apiKey',\n 'api_key',\n 'accessToken',\n 'access_token',\n 'refreshToken',\n 'refresh_token',\n 'privateKey',\n 'private_key',\n 'clientSecret',\n 'client_secret',\n 'authorization',\n]);\n\nconst REDACTED_SENTINEL = '[REDACTED]';\n\n/** Patterns we strip from free-form strings (result.content[].text, etc.). */\nconst SECRET_PATTERNS: ReadonlyArray<RegExp> = [\n /sk_(?:live|test)_[A-Za-z0-9_-]+/g,\n /Bearer\\s+[A-Za-z0-9._\\-+/=]+/gi,\n /eyJ[A-Za-z0-9._-]{20,}/g, // JWT-like\n];\n\n/** Strip embedded secret-looking substrings from a free-form string. */\nexport function redactString(text: string): string {\n let out = text;\n for (const re of SECRET_PATTERNS) {\n out = out.replace(re, REDACTED_SENTINEL);\n }\n return out;\n}\n\n/**\n * Recursively redacts sensitive keys from a plain object.\n * Creates a new object — does not mutate the original.\n * String leaves are passed through the secret-pattern redactor so embedded\n * tokens (e.g. inside a `details` blob) are also stripped.\n */\nexport function redactArgs(value: unknown, depth = 0): unknown {\n if (depth > 10) return '[DEEP]';\n if (value === null || value === undefined) return value;\n if (typeof value === 'string') return redactString(value);\n if (Array.isArray(value)) return value.map((v) => redactArgs(v, depth + 1));\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = REDACTED_KEYS.has(k) ? REDACTED_SENTINEL : redactArgs(v, depth + 1);\n }\n return out;\n }\n return value;\n}\n\n/** Redact a tool result's content array (text + image entries). */\nexport function redactResultContent(content: ToolResult['content']): ToolResult['content'] {\n return content.map((c) => {\n if (c.type === 'text') {\n return { type: 'text', text: redactString(c.text).slice(0, 1000) };\n }\n // Binary data — record only mimeType.\n return { type: 'image', data: REDACTED_SENTINEL, mimeType: c.mimeType };\n });\n}\n\n/**\n * Wraps a `defineTool` handler with pre/post audit logging.\n *\n * Before call: redacts sensitive args (keys + embedded secret patterns).\n * After call (success or failure): ships record via ApiClient.shipAuditRecord.\n * On failure: error message is also redacted.\n * On success: result.content is redacted via the same string sanitizer.\n * Always re-throws on failure so the MCP framework can serialize the error.\n *\n * @param toolName Stable tool name used as the discriminant in the log table.\n * @param handler The actual tool implementation.\n */\nexport function withAudit<TInput extends Record<string, unknown>>(\n toolName: string,\n handler: ToolHandler<TInput>,\n): ToolHandler<TInput> {\n return async (params: TInput, ctx: ToolContext): Promise<ToolResult> => {\n const redacted = redactArgs(params) as TInput;\n\n let result: ToolResult;\n try {\n result = await handler(params, ctx);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n void ctx.auditClient.shipAuditRecord({\n toolName,\n args: redacted,\n result: { error: redactString(message) },\n success: false,\n });\n throw err;\n }\n\n void ctx.apiClient.shipAuditRecord({\n toolName,\n args: redacted,\n result: { content: redactResultContent(result.content) },\n success: !result.isError,\n });\n\n return result;\n };\n}\n","/**\n * update_ticket — update mutable fields on an existing ticket.\n * Does NOT change status — use transition_ticket for that.\n * Scope: ticket:write\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { assertScope } from '../../auth/scopes.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\nimport { withAudit } from '../../middleware/audit.js';\n\nexport const updateTicketTool = defineTool({\n name: 'update_ticket',\n title: 'Update Ticket',\n annotations: { destructiveHint: false, idempotentHint: true, openWorldHint: true },\n skills: ['tickets'],\n requiredScopes: [SCOPE.TICKET_WRITE],\n description: 'Update fields (title, description, priority, assignee, sprint, labels, customFields) on an existing ticket. For status changes use transition_ticket. REQUIRED SCOPE: ticket:write',\n inputSchema: z.object({\n ticket: z.string().describe('Ticket UUID or key (e.g. \"FE-42\")'),\n title: z.string().optional(),\n description: z.string().optional().describe('Markdown. Empty string clears it.'),\n priority: z.string().optional().describe('Highest | High | Medium | Low | Lowest'),\n assigneeId: z.string().nullable().optional().describe('User UUID or null to unassign'),\n sprintId: z.string().nullable().optional().describe('Sprint UUID or null'),\n labels: z.array(z.string()).optional(),\n customFields: z.record(z.unknown()).optional(),\n }),\n handler: withAudit('update_ticket', async (params, ctx): Promise<ToolResult> => {\n assertScope(ctx.scopes, SCOPE.TICKET_WRITE);\n if (!params.ticket) throw new UserInputError('ticket is required');\n\n const { ticket, ...fields } = params;\n const definedFields = Object.fromEntries(Object.entries(fields).filter(([, v]) => v !== undefined));\n if (Object.keys(definedFields).length === 0) throw new UserInputError('At least one field must be provided');\n\n const updated = await ctx.apiClient.updateTicket(ticket, definedFields);\n\n return {\n content: [{ type: 'text', text: `Ticket **${updated.key}** updated. Changed: ${Object.keys(definedFields).join(', ')}` }],\n _meta: {\n 'instanttasks/ticketId': updated.id,\n 'instanttasks/ticketKey': updated.key,\n },\n };\n }),\n});\n","/**\n * transition_ticket — move a ticket to a new workflow status.\n *\n * Human-in-loop guard: if project.mcpConfig.requireAcknowledgeOnTerminal is true\n * and the target status is terminal (Done/Closed), returns an error asking the\n * agent to re-call with acknowledged: true.\n *\n * Scope: ticket:write\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { assertScope } from '../../auth/scopes.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\nimport { withAudit } from '../../middleware/audit.js';\n\nconst TERMINAL_CATEGORIES = new Set(['DONE', 'done', 'Done', 'CLOSED', 'closed', 'Closed']);\n\nexport const transitionTicketTool = defineTool({\n name: 'transition_ticket',\n title: 'Transition Ticket Status',\n annotations: { destructiveHint: false, idempotentHint: false, openWorldHint: true },\n skills: ['tickets'],\n requiredScopes: [SCOPE.TICKET_WRITE],\n description: `Move a ticket to a new workflow status (e.g. \"In Progress\", \"Done\"). Workflow rules enforced server-side.\nHUMAN-IN-LOOP GUARD: When project.mcpConfig.requireAcknowledgeOnTerminal=true, transitioning to Done/Closed requires acknowledged:true.\nIf you get an acknowledgement error, re-call with acknowledged:true after confirming with the user.\nREQUIRED SCOPE: ticket:write`,\n inputSchema: z.object({\n ticket: z.string().describe('Ticket UUID or key (e.g. \"FE-42\")'),\n targetStatus: z.string().describe('Target status name or ID (e.g. \"In Progress\", \"Done\")'),\n acknowledged: z.boolean().optional().describe('Set true to confirm terminal-status transition when project requires it'),\n comment: z.string().optional().describe('Optional comment to attach with the transition'),\n }),\n handler: withAudit('transition_ticket', async (params, ctx): Promise<ToolResult> => {\n assertScope(ctx.scopes, SCOPE.TICKET_WRITE);\n if (!params.ticket) throw new UserInputError('ticket is required');\n if (!params.targetStatus) throw new UserInputError('targetStatus is required');\n\n // 1. Fetch available transitions to detect terminal category\n const transitions = await ctx.apiClient.getTicketTransitions(params.ticket);\n const matched = transitions.find((t) => t.name === params.targetStatus || t.id === params.targetStatus);\n const isTerminal = matched ? TERMINAL_CATEGORIES.has(matched.toStatusCategory ?? '') : false;\n\n // 2. Fetch ticket to check project mcpConfig\n const ticket = await ctx.apiClient.getTicketByKey(params.ticket);\n if (!ticket) throw new UserInputError(`Ticket not found: ${params.ticket}`);\n\n const projectData = (ticket as unknown as Record<string, unknown>).project as Record<string, unknown> | undefined;\n const mcpConfig = (projectData?.['mcpConfig'] as Record<string, unknown> | undefined) ?? {};\n const requireAck = mcpConfig['requireAcknowledgeOnTerminal'] === true;\n\n if (isTerminal && requireAck && params.acknowledged !== true) {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: `transition_ticket: \"${params.targetStatus}\" is a terminal (Done/Closed) status and this project requires explicit acknowledgement. Re-call with acknowledged:true to confirm.`,\n }],\n };\n }\n\n const body: Record<string, unknown> = { targetStatus: params.targetStatus };\n if (params.comment) body.comment = params.comment;\n if (params.acknowledged !== undefined) body.acknowledged = params.acknowledged;\n\n const updated = await ctx.apiClient.transitionTicket(params.ticket, body);\n\n return {\n content: [{ type: 'text', text: `Ticket **${updated.key}** transitioned to **${updated.status}**.` }],\n _meta: {\n 'instanttasks/ticketId': updated.id,\n 'instanttasks/ticketKey': updated.key,\n 'instanttasks/newStatus': updated.status,\n },\n };\n }),\n});\n","/**\n * add_comment — add a comment to a ticket.\n * Scope: ticket:write\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { assertScope } from '../../auth/scopes.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\nimport { withAudit } from '../../middleware/audit.js';\n\nexport const addCommentTool = defineTool({\n name: 'add_comment',\n title: 'Add Comment',\n annotations: { destructiveHint: false, idempotentHint: false, openWorldHint: true },\n skills: ['tickets'],\n requiredScopes: [SCOPE.TICKET_WRITE],\n description: 'Add a comment (markdown) to a ticket. Supports internal notes. Use to document investigation findings, root-cause analysis, or agent decisions. REQUIRED SCOPE: ticket:write',\n inputSchema: z.object({\n ticket: z.string().describe('Ticket UUID or key (e.g. \"FE-42\")'),\n body: z.string().describe('Comment body (markdown)'),\n internal: z.boolean().optional().describe('Mark as internal note (default false)'),\n }),\n handler: withAudit('add_comment', async (params, ctx): Promise<ToolResult> => {\n assertScope(ctx.scopes, SCOPE.TICKET_WRITE);\n if (!params.ticket) throw new UserInputError('ticket is required');\n if (!params.body?.trim()) throw new UserInputError('body is required');\n\n const payload: Record<string, unknown> = { body: params.body };\n if (params.internal !== undefined) payload.internal = params.internal;\n\n await ctx.apiClient.addComment(params.ticket, payload);\n\n const label = params.internal ? 'Internal note' : 'Comment';\n return { content: [{ type: 'text', text: `${label} added to **${params.ticket}**.` }] };\n }),\n});\n","/**\n * link_pr — attach a GitHub or Bitbucket PR URL to a ticket.\n *\n * Delegates to existing github-integrations / bitbucket-integrations REST endpoints.\n * No integration logic is duplicated here.\n * Scope: ticket:write\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { assertScope } from '../../auth/scopes.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\nimport { withAudit } from '../../middleware/audit.js';\n\nfunction detectProvider(prUrl: string): 'github' | 'bitbucket' {\n return prUrl.includes('bitbucket.org') || prUrl.includes('bitbucket.com') ? 'bitbucket' : 'github';\n}\n\nexport const linkPrTool = defineTool({\n name: 'link_pr',\n title: 'Link Pull Request',\n annotations: { destructiveHint: false, idempotentHint: true, openWorldHint: true },\n skills: ['tickets'],\n requiredScopes: [SCOPE.TICKET_WRITE],\n description: 'Attach a GitHub or Bitbucket PR URL to a ticket. Provider auto-detected from URL. Reuses existing github-integrations/bitbucket-integrations services — no logic duplicated. REQUIRED SCOPE: ticket:write',\n inputSchema: z.object({\n ticket: z.string().describe('Ticket UUID or key (e.g. \"FE-42\")'),\n prUrl: z.string().url().describe('Full PR URL, e.g. https://github.com/org/repo/pull/123'),\n provider: z.enum(['github', 'bitbucket']).optional().describe('VCS provider (auto-detected if omitted)'),\n title: z.string().optional().describe('PR title (optional)'),\n state: z.enum(['open', 'closed', 'merged']).optional(),\n }),\n handler: withAudit('link_pr', async (params, ctx): Promise<ToolResult> => {\n assertScope(ctx.scopes, SCOPE.TICKET_WRITE);\n if (!params.ticket) throw new UserInputError('ticket is required');\n if (!params.prUrl) throw new UserInputError('prUrl is required');\n\n const provider = params.provider ?? detectProvider(params.prUrl);\n const body: Record<string, unknown> = { url: params.prUrl, refType: 'pull_request' };\n if (params.title !== undefined) body.title = params.title;\n if (params.state !== undefined) body.state = params.state;\n\n await ctx.apiClient.linkPr(params.ticket, provider, body);\n\n return { content: [{ type: 'text', text: `PR linked to **${params.ticket}** (${provider}): ${params.prUrl}` }] };\n }),\n});\n","/**\n * promote_issue_to_ticket — promote an SDK-captured error/event into a ticket.\n * Calls POST /sdk/issues/:issueId/promote (Phase C endpoint).\n * Scope: ticket:write\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { assertScope } from '../../auth/scopes.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\nimport { withAudit } from '../../middleware/audit.js';\n\nexport const promoteIssueToTicketTool = defineTool({\n name: 'promote_issue_to_ticket',\n title: 'Promote Issue to Ticket',\n annotations: { destructiveHint: true, idempotentHint: false, openWorldHint: true },\n skills: ['tickets'],\n requiredScopes: [SCOPE.TICKET_WRITE],\n description: 'Promote an SDK-captured error/event (issue) into a first-class ticket. All fields optional — API copies issue title/description if not overridden. Use after investigating an issue via find_issues / get_issue_details. REQUIRED SCOPE: ticket:write',\n inputSchema: z.object({\n issueId: z.string().describe('SDK issue ID (UUID)'),\n title: z.string().optional().describe('Override ticket title'),\n description: z.string().optional().describe('Override ticket description (markdown)'),\n priority: z.string().optional().describe('Highest | High | Medium | Low | Lowest'),\n assigneeId: z.string().optional().describe('Assignee user ID (UUID)'),\n sprintId: z.string().optional().describe('Sprint UUID'),\n labels: z.array(z.string()).optional(),\n }),\n handler: withAudit('promote_issue_to_ticket', async (params, ctx): Promise<ToolResult> => {\n assertScope(ctx.scopes, SCOPE.TICKET_WRITE);\n if (!params.issueId) throw new UserInputError('issueId is required');\n\n const body: Record<string, unknown> = {};\n if (params.title !== undefined) body.title = params.title;\n if (params.description !== undefined) body.description = params.description;\n if (params.priority !== undefined) body.priority = params.priority;\n if (params.assigneeId !== undefined) body.assigneeId = params.assigneeId;\n if (params.sprintId !== undefined) body.sprintId = params.sprintId;\n if (params.labels !== undefined) body.labels = params.labels;\n\n const ticket = await ctx.apiClient.promoteIssueToTicket(params.issueId, body);\n\n return { content: [{ type: 'text', text: `Issue **${params.issueId}** promoted to ticket **${ticket.key}**: ${ticket.title}` }] };\n }),\n});\n","/**\n * pin_release — mark a release as the current release for an environment.\n * Affects fingerprint resolution and symbolication baseline in the bug-monitoring SDK.\n * Scope: event:write\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { assertScope } from '../../auth/scopes.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\nimport { withAudit } from '../../middleware/audit.js';\n\nexport const pinReleaseTool = defineTool({\n name: 'pin_release',\n title: 'Pin Release to Environment',\n annotations: { destructiveHint: false, idempotentHint: true, openWorldHint: true },\n skills: ['release'],\n requiredScopes: [SCOPE.EVENT_WRITE],\n description: 'Mark a release (version) as the current release for an environment. Affects fingerprint resolution and symbolication baseline. REQUIRED SCOPE: event:write',\n inputSchema: z.object({\n project: z.string().describe('Project UUID or key (e.g. \"FE\")'),\n version: z.string().describe('Version UUID or name (e.g. \"v1.4.2\")'),\n environment: z.string().optional().describe('Target environment (default: \"production\")'),\n }),\n handler: withAudit('pin_release', async (params, ctx): Promise<ToolResult> => {\n assertScope(ctx.scopes, SCOPE.EVENT_WRITE);\n if (!params.project) throw new UserInputError('project is required');\n if (!params.version) throw new UserInputError('version is required');\n\n const env = params.environment ?? 'production';\n await ctx.apiClient.pinRelease(params.project, params.version, env);\n\n return { content: [{ type: 'text', text: `Release **${params.version}** pinned for **${params.project}** / **${env}**.` }] };\n }),\n});\n","/**\n * symbolicate_frame — translate minified stack frames to original source locations.\n * Scope: event:write (side-effects: caches source-map retrieval)\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { assertScope } from '../../auth/scopes.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\nimport { withAudit } from '../../middleware/audit.js';\n\nconst frameSchema = z.object({\n file: z.string().describe('Minified file path, e.g. \"/static/js/main.abc123.js\"'),\n line: z.number().int().min(1).describe('1-based line number'),\n column: z.number().int().min(1).describe('1-based column number'),\n function: z.string().optional().describe('Function name from the minified frame'),\n});\n\nexport const symbolicateFrameTool = defineTool({\n name: 'symbolicate_frame',\n title: 'Symbolicate Stack Frame',\n annotations: { readOnlyHint: true, openWorldHint: true },\n meta: { 'anthropic/maxResultSizeChars': 200000 },\n skills: ['release'],\n requiredScopes: [SCOPE.EVENT_WRITE],\n description: 'Symbolicate one or more minified stack frames using source-maps for a release. Returns original file, line, column, and function name. Use after receiving a bug report with obfuscated stack traces. REQUIRED SCOPE: event:write',\n inputSchema: z.object({\n project: z.string().describe('Project UUID or key'),\n release: z.string().optional().describe('Release UUID or version name. Omit to use pinned release.'),\n environment: z.string().optional().describe('Environment for pinned-release resolution (default: \"production\")'),\n frames: z.array(frameSchema).min(1).describe('Minified stack frames to symbolicate'),\n }),\n handler: withAudit('symbolicate_frame', async (params, ctx): Promise<ToolResult> => {\n assertScope(ctx.scopes, SCOPE.EVENT_WRITE);\n if (!params.project) throw new UserInputError('project is required');\n if (!params.frames?.length) throw new UserInputError('frames array must not be empty');\n\n const releaseRef = params.release ?? 'pinned';\n const env = params.environment ?? 'production';\n\n const result = await ctx.apiClient.symbolicateFrames(params.project, releaseRef, params.frames, env);\n\n const frames = (result['frames'] as Array<Record<string, unknown>> | undefined) ?? [];\n if (!frames.length) {\n return { content: [{ type: 'text', text: 'Symbolication returned no results. Source maps may not be uploaded for this release.' }] };\n }\n\n const lines = frames.map((f, i) => {\n const orig = `${f['originalFile'] ?? '?'}:${f['originalLine'] ?? '?'}:${f['originalColumn'] ?? '?'}`;\n const fn = f['originalFunction'] ? ` in ${f['originalFunction']}` : '';\n return `Frame ${i + 1}: ${orig}${fn}`;\n });\n\n return { content: [{ type: 'text', text: lines.join('\\n') }] };\n }),\n});\n","/**\n * find_release_artifacts — list build artifacts attached to a release.\n * Read-only. Scope: event:read\n */\nimport { z } from 'zod';\nimport { defineTool, type ToolResult } from '../define.js';\nimport { assertScope } from '../../auth/scopes.js';\nimport { SCOPE } from '@koderlabs/tasks-sdk-types';\nimport { UserInputError } from '../../errors.js';\n\nexport const findReleaseArtifactsTool = defineTool({\n name: 'find_release_artifacts',\n title: 'Find Release Artifacts',\n annotations: { readOnlyHint: true, openWorldHint: true },\n meta: { 'anthropic/maxResultSizeChars': 200000 },\n skills: ['release'],\n requiredScopes: [SCOPE.EVENT_READ],\n description: 'List build artifacts (source maps, bundles, DSYM files) attached to a release. Use to verify source maps are present before symbolication. Read-only. REQUIRED SCOPE: event:read',\n inputSchema: z.object({\n project: z.string().describe('Project UUID or key'),\n release: z.string().describe('Release UUID or version name'),\n type: z.enum(['sourcemap', 'bundle', 'dsym', 'proguard']).optional().describe('Filter by artifact type'),\n limit: z.number().int().min(1).max(200).optional().describe('Max results (default 50)'),\n }),\n async handler(params, ctx): Promise<ToolResult> {\n assertScope(ctx.scopes, SCOPE.EVENT_READ);\n if (!params.project) throw new UserInputError('project is required');\n if (!params.release) throw new UserInputError('release is required');\n\n const result = await ctx.apiClient.listReleaseArtifacts(params.project, params.release, params.type, params.limit);\n\n const items = (result['items'] as unknown[] | undefined) ?? [];\n if (!items.length) {\n return {\n content: [{\n type: 'text',\n text: `No artifacts found for **${params.project}** release **${params.release}**${params.type ? ` (type: ${params.type})` : ''}.`,\n }],\n };\n }\n\n return {\n content: [{\n type: 'text',\n text: `${items.length} artifact(s) for **${params.project}** release **${params.release}**:\\n${JSON.stringify(items, null, 2)}`,\n }],\n };\n },\n});\n","/**\n * Tool registry — 26 tools across 5 skill groups (Phase E read + Phase F write).\n *\n * Skill groups:\n * discover (4) — whoami, find_organizations, find_projects, find_releases\n * triage (6) — find_issues, find_tickets, get_issue_details,\n * get_ticket_details, get_event_details, get_event_attachment\n * widget_bug (7) — get_bug_report, get_bug_screenshot, get_bug_annotations,\n * get_bug_console_logs, get_bug_network_requests,\n * get_bug_metadata, get_bug_breadcrumbs\n * tickets (6) — create_ticket, update_ticket, transition_ticket,\n * add_comment, link_pr, promote_issue_to_ticket [Phase F]\n * release (3) — pin_release, symbolicate_frame, find_release_artifacts [Phase F]\n */\n\n// discover\nimport { whoamiTool } from './discover/whoami.js';\nimport { findOrganizationsTool } from './discover/find-organizations.js';\nimport { findProjectsTool } from './discover/find-projects.js';\nimport { findReleasesTool } from './discover/find-releases.js';\n\n// triage\nimport { findIssuesTool } from './triage/find-issues.js';\nimport { findTicketsTool } from './triage/find-tickets.js';\nimport { getIssueDetailsTool } from './triage/get-issue-details.js';\nimport { getTicketDetailsTool } from './triage/get-ticket-details.js';\nimport { getEventDetailsTool } from './triage/get-event-details.js';\nimport { getEventAttachmentTool } from './triage/get-event-attachment.js';\n\n// widget_bug\nimport { getBugReportTool } from './widget-bug/get-bug-report.js';\nimport { getBugScreenshotTool } from './widget-bug/get-bug-screenshot.js';\nimport { getBugAnnotationsTool } from './widget-bug/get-bug-annotations.js';\nimport { getBugConsoleLogsTool } from './widget-bug/get-bug-console-logs.js';\nimport { getBugNetworkRequestsTool } from './widget-bug/get-bug-network-requests.js';\nimport { getBugMetadataTool } from './widget-bug/get-bug-metadata.js';\nimport { getBugBreadcrumbsTool } from './widget-bug/get-bug-breadcrumbs.js';\n\n// tickets (Phase F — write)\nimport { createTicketTool } from './tickets/create-ticket.js';\nimport { updateTicketTool } from './tickets/update-ticket.js';\nimport { transitionTicketTool } from './tickets/transition-ticket.js';\nimport { addCommentTool } from './tickets/add-comment.js';\nimport { linkPrTool } from './tickets/link-pr.js';\nimport { promoteIssueToTicketTool } from './tickets/promote-issue-to-ticket.js';\n\n// release (Phase F — write + read)\nimport { pinReleaseTool } from './release/pin-release.js';\nimport { symbolicateFrameTool } from './release/symbolicate-frame.js';\nimport { findReleaseArtifactsTool } from './release/find-release-artifacts.js';\n\nimport type { ToolDefinition } from './define.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const ALL_TOOLS: ToolDefinition<any>[] = [\n // discover (4)\n whoamiTool,\n findOrganizationsTool,\n findProjectsTool,\n findReleasesTool,\n // triage (6)\n findIssuesTool,\n findTicketsTool,\n getIssueDetailsTool,\n getTicketDetailsTool,\n getEventDetailsTool,\n getEventAttachmentTool,\n // widget_bug (7)\n getBugReportTool,\n getBugScreenshotTool,\n getBugAnnotationsTool,\n getBugConsoleLogsTool,\n getBugNetworkRequestsTool,\n getBugMetadataTool,\n getBugBreadcrumbsTool,\n // tickets (Phase F — 6)\n createTicketTool,\n updateTicketTool,\n transitionTicketTool,\n addCommentTool,\n linkPrTool,\n promoteIssueToTicketTool,\n // release (Phase F — 3)\n pinReleaseTool,\n symbolicateFrameTool,\n findReleaseArtifactsTool,\n];\n\n/** Return tools filtered to those the given skill set covers. */\nexport function toolsForSkills(skills: string[]): typeof ALL_TOOLS {\n if (!skills.length) return ALL_TOOLS;\n return ALL_TOOLS.filter((t) => t.skills.some((s) => skills.includes(s)));\n}\n\n/** Return tools filtered to those the given scopes permit. */\nexport function toolsForScopes(scopeList: string[]): typeof ALL_TOOLS {\n const set = new Set(scopeList);\n return ALL_TOOLS.filter((t) => t.requiredScopes.every((s) => set.has(s)));\n}\n","/**\n * Durable audit-queue for `/audit/mcp` payloads that exhaust the in-process\n * retry budget. Persists failed records to a JSON-lines file so a crash or\n * restart does not lose the (already-redacted) audit trail.\n *\n * Design:\n * - Append-only `.jsonl` — one JSON record per line, easy to replay.\n * - File path comes from MCP_AUDIT_QUEUE_PATH (default ./audit-queue.jsonl).\n * - `enqueue()` is called by `shipAuditWithRetry` after final failure.\n * - `replay()` is called once at boot. It drains the file by re-shipping\n * each line through the provided send fn; on success the line is dropped,\n * on failure it is re-appended to the file and the loop stops (so order\n * is preserved and the queue back-pressures on a sustained outage).\n * - File access is serialized through an in-process Promise chain so\n * concurrent enqueue/replay don't interleave writes.\n * - Lines that fail to JSON-parse on replay are skipped + logged. Bounded\n * by MCP_AUDIT_QUEUE_MAX (default 5000) — once exceeded the oldest line\n * is dropped before the new one is appended (FIFO eviction). This is the\n * intentional trade-off: bounded disk vs perfect retention on a long\n * outage. Operator gets a warning per drop.\n */\nimport { promises as fs } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\n\nexport interface AuditQueueOptions {\n /** Filesystem path. Use `:memory:` to disable persistence (tests). */\n path?: string;\n /** Cap on stored lines. Older lines evicted FIFO past this. */\n maxLines?: number;\n logger?: Pick<Console, 'warn' | 'error'>;\n}\n\nconst DEFAULT_PATH = process.env.MCP_AUDIT_QUEUE_PATH ?? './audit-queue.jsonl';\nconst DEFAULT_MAX = parseInt(process.env.MCP_AUDIT_QUEUE_MAX ?? '5000', 10);\n\nexport class AuditQueue {\n private readonly path: string;\n private readonly maxLines: number;\n private readonly logger: Pick<Console, 'warn' | 'error'>;\n /** Serializes file access so concurrent enqueue / replay can't tear lines. */\n private chain: Promise<void> = Promise.resolve();\n /** When path is `:memory:` we keep a buffer instead of writing to disk. */\n private memory: string[] | null = null;\n\n constructor(opts: AuditQueueOptions = {}) {\n this.path = opts.path ?? DEFAULT_PATH;\n this.maxLines = opts.maxLines ?? DEFAULT_MAX;\n this.logger = opts.logger ?? console;\n if (this.path === ':memory:') this.memory = [];\n }\n\n /** Append a payload to the queue. Never throws — durability is best-effort. */\n enqueue(payload: Record<string, unknown>): Promise<void> {\n return this.run(async () => {\n const line = JSON.stringify(payload) + '\\n';\n if (this.memory) {\n this.memory.push(line);\n while (this.memory.length > this.maxLines) {\n this.logger.warn('[AuditQueue] dropping oldest record (in-memory cap exceeded)');\n this.memory.shift();\n }\n return;\n }\n try {\n await fs.mkdir(dirname(resolve(this.path)), { recursive: true });\n const existing = await this.readLines();\n let next = existing;\n while (next.length >= this.maxLines) {\n this.logger.warn('[AuditQueue] dropping oldest record (file cap exceeded)', {\n path: this.path, cap: this.maxLines,\n });\n next = next.slice(1);\n }\n next.push(line.trimEnd());\n await fs.writeFile(this.path, next.join('\\n') + '\\n', 'utf8');\n } catch (err) {\n this.logger.error('[AuditQueue] enqueue failed (audit record will be lost):', err);\n }\n });\n }\n\n /**\n * Drain the persisted queue by re-shipping each record. Returns counts so the\n * caller (boot path) can log a summary. Stops on the first failure to preserve\n * order — back-pressure during a sustained outage.\n */\n replay(send: (payload: Record<string, unknown>) => Promise<unknown>): Promise<{ shipped: number; remaining: number }> {\n return this.run(async () => {\n const lines = await this.readLines();\n if (lines.length === 0) return { shipped: 0, remaining: 0 };\n\n let shipped = 0;\n const leftover: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n let payload: Record<string, unknown>;\n try {\n payload = JSON.parse(line) as Record<string, unknown>;\n } catch {\n this.logger.warn('[AuditQueue] dropping unparseable line on replay');\n continue;\n }\n try {\n await send(payload);\n shipped += 1;\n } catch (err) {\n // Re-append this and every subsequent line; preserve FIFO order.\n this.logger.warn('[AuditQueue] replay paused — line will retry on next boot:', err);\n leftover.push(...lines.slice(i));\n break;\n }\n }\n\n if (this.memory) {\n this.memory = leftover.map((l) => l + '\\n');\n } else {\n if (leftover.length === 0) {\n await fs.rm(this.path, { force: true });\n } else {\n await fs.writeFile(this.path, leftover.join('\\n') + '\\n', 'utf8');\n }\n }\n\n return { shipped, remaining: leftover.length };\n });\n }\n\n private async readLines(): Promise<string[]> {\n if (this.memory) return this.memory.map((l) => l.trimEnd());\n try {\n const buf = await fs.readFile(this.path, 'utf8');\n return buf.split('\\n').filter(Boolean);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw err;\n }\n }\n\n /**\n * Chain async work so file access is serialized. The returned promise\n * resolves to the inner fn's result; the internal `chain` field is kept\n * pending so the next caller waits for THIS fn's completion before its\n * own fn runs. Errors in fn() do not break the chain — they propagate\n * to the returned promise while `chain` swallows them.\n */\n private run<T>(fn: () => Promise<T>): Promise<T> {\n const next = this.chain.then(fn);\n // Detach error propagation from the gate so a single failure doesn't\n // poison subsequent callers.\n this.chain = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n }\n}\n","/**\n * Typed thin wrapper around InstantTasks REST API.\n *\n * All methods call the running API (apps/api) with either:\n * - A management secret key (Bearer sk_live_*) for server-to-server calls\n * - An OAuth access token for user-delegated calls\n *\n * If an endpoint returns 404, methods return null instead of throwing so that\n * tools can render a helpful \"not yet available\" message rather than crashing.\n *\n * Phase C (Issues / Events module) endpoints are marked; they gracefully\n * degrade to null until Phase C is merged.\n */\nimport { ApiError, ApiNotFoundError } from './errors.js';\nimport { AuditQueue } from './audit-queue.js';\n\n/**\n * Process-wide durable queue for audit records that failed even after\n * in-memory retries. Lazily created so tests that don't touch audit shipping\n * never touch the filesystem.\n */\nlet _auditQueue: AuditQueue | null = null;\nfunction getAuditQueue(): AuditQueue {\n if (!_auditQueue) _auditQueue = new AuditQueue();\n return _auditQueue;\n}\n\n/**\n * Replay the on-disk audit queue using a freshly-authenticated client.\n * Called once at boot from index.ts/stdio.ts when an internal management\n * key is available. Returns a summary that the caller can log.\n */\nexport async function replayPersistedAuditQueue(send: (payload: Record<string, unknown>) => Promise<unknown>): Promise<{ shipped: number; remaining: number }> {\n return getAuditQueue().replay(send);\n}\n\n// ── Shared types ──────────────────────────────────────────────────────────────\n\nexport interface Organization {\n id: string;\n name: string;\n slug: string;\n isPersonal: boolean;\n createdAt: string;\n}\n\nexport interface Project {\n id: string;\n key: string;\n name: string;\n organizationId: string;\n description: string | null;\n createdAt: string;\n}\n\nexport interface Release {\n id: string;\n version: string;\n projectId: string;\n releasedAt: string | null;\n createdAt: string;\n}\n\nexport interface Ticket {\n id: string;\n key: string;\n title: string;\n description: string | null;\n status: string;\n priority: string;\n assigneeId: string | null;\n reporterId: string | null;\n projectId: string;\n createdAt: string;\n updatedAt: string;\n customFields: Record<string, unknown>;\n}\n\n/** Slim ticket list item (search results). */\nexport interface TicketListItem\n extends Pick<Ticket, 'id' | 'key' | 'title' | 'status' | 'priority' | 'assigneeId' | 'createdAt'> {}\n\n/** Issue = SDK event cluster (Phase C). */\nexport interface Issue {\n id: string;\n title: string;\n culprit: string;\n status: string;\n level: string;\n count: number;\n projectId: string;\n firstSeen: string;\n lastSeen: string;\n}\n\n/** Event = individual occurrence within an issue (Phase C). */\nexport interface SdkEvent {\n id: string;\n issueId: string;\n message: string;\n level: string;\n timestamp: string;\n breadcrumbs: Breadcrumb[];\n tags: Record<string, string>;\n extra: Record<string, unknown>;\n request: Record<string, unknown> | null;\n}\n\nexport interface Breadcrumb {\n type: string;\n category: string;\n message: string;\n level: string;\n timestamp: string;\n data: Record<string, unknown>;\n}\n\nexport interface Attachment {\n id: string;\n name: string;\n mimeType: string;\n size: number;\n url: string;\n}\n\n// ── Client ────────────────────────────────────────────────────────────────────\n\nexport interface ApiClientOptions {\n baseUrl: string; // e.g. http://api:11002/api/v1\n token: string; // raw Bearer token (sk_live_* or OAuth access token)\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n\n constructor(opts: ApiClientOptions) {\n this.baseUrl = opts.baseUrl.replace(/\\/$/, '');\n this.headers = {\n Authorization: `Bearer ${opts.token}`,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n }\n\n // ── helpers ──────────────────────────────────────────────────────────────\n\n /**\n * Unwrap the API's `{ success, data, meta? }` envelope.\n *\n * For list endpoints (data: T[]) we expose `{ items, meta }` to match the\n * historical call-sites that read `result.items`. Single-resource calls\n * just return the data payload directly.\n */\n private unwrap<T>(json: unknown): T {\n if (\n json && typeof json === 'object' &&\n 'success' in (json as Record<string, unknown>) &&\n 'data' in (json as Record<string, unknown>)\n ) {\n const data = (json as { data: unknown }).data;\n if (Array.isArray(data)) {\n return { items: data, meta: (json as { meta?: unknown }).meta } as unknown as T;\n }\n return data as T;\n }\n return json as T;\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n let res: Response;\n try {\n res = await fetch(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(10_000),\n });\n } catch (err) {\n throw new ApiError(`Network error: ${(err as Error).message}`);\n }\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new ApiError(`${res.status} ${res.statusText}: ${text}`, res.status);\n }\n return this.unwrap<T>(await res.json());\n }\n\n private async patch<T>(path: string, body: unknown): Promise<T> {\n let res: Response;\n try {\n res = await fetch(`${this.baseUrl}${path}`, {\n method: 'PATCH',\n headers: this.headers,\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(10_000),\n });\n } catch (err) {\n throw new ApiError(`Network error: ${(err as Error).message}`);\n }\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new ApiError(`${res.status} ${res.statusText}: ${text}`, res.status);\n }\n return this.unwrap<T>(await res.json());\n }\n\n private async get<T>(path: string, query?: Record<string, string | number | undefined>): Promise<T | null> {\n const url = new URL(`${this.baseUrl}${path}`);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n }\n\n let res: Response;\n try {\n res = await fetch(url.toString(), {\n headers: this.headers,\n signal: AbortSignal.timeout(10_000),\n });\n } catch (err) {\n throw new ApiError(`Network error reaching InstantTasks API: ${(err as Error).message}`);\n }\n\n if (res.status === 404) return null;\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new ApiError(`${res.status} ${res.statusText}: ${text}`, res.status);\n }\n return this.unwrap<T>(await res.json());\n }\n\n private async getRaw(path: string): Promise<{ buffer: ArrayBuffer; mimeType: string } | null> {\n const url = `${this.baseUrl}${path}`;\n let res: Response;\n try {\n res = await fetch(url, {\n headers: { Authorization: this.headers.Authorization },\n signal: AbortSignal.timeout(15_000),\n });\n } catch (err) {\n throw new ApiError(`Network error: ${(err as Error).message}`);\n }\n if (res.status === 404) return null;\n if (!res.ok) throw new ApiError(`${res.status} ${res.statusText}`, res.status);\n const mimeType = res.headers.get('content-type') ?? 'application/octet-stream';\n return { buffer: await res.arrayBuffer(), mimeType };\n }\n\n // ── Discover ─────────────────────────────────────────────────────────────\n\n async listOrganizations(): Promise<Organization[]> {\n const result = await this.get<{ items: Organization[] }>('/organizations');\n return result?.items ?? [];\n }\n\n async listProjects(organizationId: string): Promise<Project[]> {\n const result = await this.get<{ items: Project[] }>(`/organizations/${organizationId}/projects`);\n return result?.items ?? [];\n }\n\n async listReleases(projectId: string, limit = 20): Promise<Release[]> {\n const result = await this.get<{ items: Release[] }>(`/projects/${projectId}/versions`, { limit });\n return result?.items ?? [];\n }\n\n // ── Triage: Tickets ───────────────────────────────────────────────────────\n\n async getTicketByKey(ticketKey: string): Promise<Ticket | null> {\n return this.get<Ticket>(`/tickets/${ticketKey}`);\n }\n\n async listTicketsByIQL(query: string, projectKey?: string, limit = 25): Promise<TicketListItem[]> {\n const q: Record<string, string | number | undefined> = { q: query, limit };\n if (projectKey) q.projectKey = projectKey;\n const result = await this.get<{ items: TicketListItem[] }>('/search/tickets', q);\n return result?.items ?? [];\n }\n\n // ── Triage: Issues (Phase C — graceful 404 fallback) ────────────────────\n\n /**\n * List issues in a project.\n * Returns null if the Issues module is not yet deployed (Phase C dependency).\n */\n async listIssues(projectId: string, filter?: string, limit = 25): Promise<Issue[] | null> {\n const result = await this.get<{ items: Issue[] }>(`/projects/${projectId}/issues`, {\n q: filter,\n limit,\n });\n // null means 404 → Phase C not yet merged\n return result?.items ?? null;\n }\n\n /**\n * Get a single issue by ID.\n * Returns null if not found OR if Phase C not yet merged.\n */\n async getIssue(issueId: string): Promise<Issue | null> {\n return this.get<Issue>(`/issues/${issueId}`);\n }\n\n /**\n * Get a single SDK event.\n * Returns null if not found OR if Phase C not yet merged.\n */\n async getEvent(eventId: string): Promise<SdkEvent | null> {\n return this.get<SdkEvent>(`/events/${eventId}`);\n }\n\n /**\n * Get an attachment associated with an event.\n * Returns raw buffer + mimeType, or null if not found.\n */\n async getEventAttachment(eventId: string, attachmentId: string): Promise<{ buffer: ArrayBuffer; mimeType: string } | null> {\n return this.getRaw(`/events/${eventId}/attachments/${attachmentId}`);\n }\n\n // ── Widget Bug (ticket-level SDK data) ───────────────────────────────────\n\n /**\n * Get the full SDK event payload for a ticket (the \"bug report\").\n * Tickets created via the widget SDK have their event data in `customFields`\n * and a linked attachment. This fetches both.\n */\n async getBugReport(ticketKey: string): Promise<Ticket | null> {\n return this.getTicketByKey(ticketKey);\n }\n\n /**\n * Get the screenshot attachment for a ticket submitted via the widget.\n * The attachment id is stored in the ticket's `customFields.screenshotAttachmentId`.\n */\n async getBugScreenshot(ticketKey: string): Promise<{ buffer: ArrayBuffer; mimeType: string } | null> {\n const ticket = await this.getTicketByKey(ticketKey);\n if (!ticket) return null;\n\n const screenshotId = (ticket.customFields?.screenshotAttachmentId as string | undefined);\n if (!screenshotId) return null;\n\n return this.getRaw(`/tickets/${ticket.id}/attachments/${screenshotId}/inline`);\n }\n\n /**\n * Get the annotations overlay for a ticket screenshot.\n * Stored as a JSON attachment with mimeType application/json.\n */\n async getBugAnnotations(ticketKey: string): Promise<unknown | null> {\n const ticket = await this.getTicketByKey(ticketKey);\n if (!ticket) return null;\n const annotationsId = ticket.customFields?.annotationsAttachmentId as string | undefined;\n if (!annotationsId) return null;\n const result = await this.get<unknown>(`/tickets/${ticket.id}/attachments/${annotationsId}/data`);\n return result;\n }\n\n /**\n * Get the console logs captured with the bug report.\n */\n async getBugConsoleLogs(ticketKey: string): Promise<unknown[] | null> {\n const ticket = await this.getTicketByKey(ticketKey);\n if (!ticket) return null;\n const sdkEventId = ticket.customFields?.sdkEventId as string | undefined;\n if (!sdkEventId) return null;\n const result = await this.get<{ consoleLogs: unknown[] }>(`/sdk/events/${sdkEventId}/console-logs`);\n return result?.consoleLogs ?? null;\n }\n\n /**\n * Get the network requests captured with the bug report.\n */\n async getBugNetworkRequests(ticketKey: string): Promise<unknown[] | null> {\n const ticket = await this.getTicketByKey(ticketKey);\n if (!ticket) return null;\n const sdkEventId = ticket.customFields?.sdkEventId as string | undefined;\n if (!sdkEventId) return null;\n const result = await this.get<{ networkRequests: unknown[] }>(`/sdk/events/${sdkEventId}/network-requests`);\n return result?.networkRequests ?? null;\n }\n\n /**\n * Get metadata (custom key/value pairs) attached to the bug report.\n */\n async getBugMetadata(ticketKey: string): Promise<Record<string, unknown> | null> {\n const ticket = await this.getTicketByKey(ticketKey);\n if (!ticket) return null;\n return (ticket.customFields?.sdkMetadata as Record<string, unknown>) ?? null;\n }\n\n /**\n * Get the breadcrumb trail leading up to the bug report.\n */\n async getBugBreadcrumbs(ticketKey: string): Promise<Breadcrumb[] | null> {\n const ticket = await this.getTicketByKey(ticketKey);\n if (!ticket) return null;\n const sdkEventId = ticket.customFields?.sdkEventId as string | undefined;\n if (!sdkEventId) return null;\n const result = await this.get<{ breadcrumbs: Breadcrumb[] }>(`/sdk/events/${sdkEventId}/breadcrumbs`);\n return result?.breadcrumbs ?? null;\n }\n\n // ── Ticket write operations (Phase F) ────────────────────────────────────\n\n async createTicket(projectRef: string, body: Record<string, unknown>): Promise<Ticket> {\n const result = await this.post<{ data: Ticket }>('/tickets', { ...body, project: projectRef });\n return result.data;\n }\n\n async updateTicket(ticketRef: string, fields: Record<string, unknown>): Promise<Ticket> {\n const result = await this.patch<{ data: Ticket }>(`/tickets/${encodeURIComponent(ticketRef)}`, fields);\n return result.data;\n }\n\n async transitionTicket(ticketRef: string, body: Record<string, unknown>): Promise<Ticket> {\n const result = await this.post<{ data: Ticket }>(\n `/tickets/${encodeURIComponent(ticketRef)}/transitions`,\n body,\n );\n return result.data;\n }\n\n async getTicketTransitions(ticketRef: string): Promise<Array<{ id: string; name: string; toStatusCategory?: string }>> {\n const result = await this.get<{ data: Array<{ id: string; name: string; toStatusCategory?: string }> }>(\n `/tickets/${encodeURIComponent(ticketRef)}/transitions`,\n );\n return result?.data ?? [];\n }\n\n async addComment(ticketRef: string, body: Record<string, unknown>): Promise<Record<string, unknown>> {\n const result = await this.post<{ data: Record<string, unknown> }>(\n `/tickets/${encodeURIComponent(ticketRef)}/comments`,\n body,\n );\n return result.data;\n }\n\n async linkPr(ticketRef: string, provider: 'github' | 'bitbucket', body: Record<string, unknown>): Promise<Record<string, unknown>> {\n const path = provider === 'bitbucket'\n ? `/tickets/${encodeURIComponent(ticketRef)}/bitbucket-refs`\n : `/tickets/${encodeURIComponent(ticketRef)}/github-refs`;\n const result = await this.post<{ data: Record<string, unknown> }>(path, body);\n return result.data;\n }\n\n async promoteIssueToTicket(issueId: string, body: Record<string, unknown>): Promise<Ticket> {\n const result = await this.post<{ data: Ticket }>(\n `/sdk/issues/${encodeURIComponent(issueId)}/promote`,\n body,\n );\n return result.data;\n }\n\n // ── Release write operations (Phase F) ───────────────────────────────────\n\n async pinRelease(projectRef: string, versionRef: string, environment: string): Promise<Record<string, unknown>> {\n const result = await this.patch<{ data: Record<string, unknown> }>(\n `/projects/${encodeURIComponent(projectRef)}/versions/${encodeURIComponent(versionRef)}/pin`,\n { environment },\n );\n return result.data;\n }\n\n async symbolicateFrames(\n projectRef: string,\n releaseRef: string,\n frames: Array<{ file: string; line: number; column: number; function?: string }>,\n environment: string,\n ): Promise<Record<string, unknown>> {\n const result = await this.post<{ data: Record<string, unknown> }>(\n `/projects/${encodeURIComponent(projectRef)}/releases/${encodeURIComponent(releaseRef)}/symbolicate`,\n { frames, environment },\n );\n return result.data;\n }\n\n async listReleaseArtifacts(\n projectRef: string,\n releaseRef: string,\n type?: string,\n limit?: number,\n ): Promise<Record<string, unknown>> {\n const result = await this.get<{ data: Record<string, unknown> }>(\n `/projects/${encodeURIComponent(projectRef)}/releases/${encodeURIComponent(releaseRef)}/artifacts`,\n { type, limit },\n );\n return result?.data ?? result ?? {};\n }\n\n async shipAuditRecord(payload: Record<string, unknown>): Promise<void> {\n await shipAuditWithRetry(\n (body) => this.post<unknown>('/audit/mcp', body),\n payload,\n );\n }\n}\n\n// ── Audit retry queue ───────────────────────────────────────────────────────\n\n/**\n * Exponential-backoff retry wrapper for audit shipping.\n *\n * Retries on:\n * - Network errors thrown by the transport\n * - 5xx responses (ApiError with statusCode >= 500)\n *\n * Does NOT retry on:\n * - 4xx responses (likely permanent — malformed payload)\n *\n * Final failure logs the (already-redacted) payload at error level via the\n * provided logger so an operator has a stable correlation record.\n *\n * Exposed (and parameterized) for testing.\n */\nexport interface AuditRetryOptions {\n maxAttempts?: number;\n /** Delay schedule in ms; length should equal maxAttempts - 1. */\n delaysMs?: number[];\n /** Sleep implementation — swap in tests to avoid real timers. */\n sleep?: (ms: number) => Promise<void>;\n logger?: Pick<Console, 'error'>;\n}\n\nconst DEFAULT_AUDIT_RETRY: Required<Omit<AuditRetryOptions, 'logger'>> & { logger: Pick<Console, 'error'> } = {\n // 3 retries total => 3 attempts; pre-attempt waits are [0, 1s, 3s, 9s]-style.\n // We use 3 attempts with delays BEFORE retry #2 and retry #3 of 1s and 3s,\n // and a final 9s back-pressure pause before giving up — matching the\n // spec's 1s/3s/9s schedule.\n maxAttempts: 3,\n delaysMs: [1_000, 3_000, 9_000],\n sleep: (ms: number) => new Promise((r) => setTimeout(r, ms)),\n logger: console,\n};\n\nfunction isRetryable(err: unknown): boolean {\n if (err instanceof ApiError) {\n if (err.statusCode === undefined) return true; // network error\n return err.statusCode >= 500;\n }\n return true;\n}\n\nexport async function shipAuditWithRetry(\n send: (payload: Record<string, unknown>) => Promise<unknown>,\n payload: Record<string, unknown>,\n options: AuditRetryOptions = {},\n): Promise<void> {\n const opts = { ...DEFAULT_AUDIT_RETRY, ...options };\n const delays = opts.delaysMs;\n\n let lastErr: unknown;\n for (let attempt = 1; attempt <= opts.maxAttempts; attempt++) {\n try {\n await send(payload);\n return;\n } catch (err) {\n lastErr = err;\n if (!isRetryable(err) || attempt === opts.maxAttempts) {\n break;\n }\n // Wait BEFORE the next retry.\n const delay = delays[attempt - 1] ?? delays[delays.length - 1] ?? 1_000;\n await opts.sleep(delay);\n }\n }\n\n const correlationId = (payload['toolName'] as string | undefined) ?? 'unknown';\n opts.logger.error('[ApiClient] audit/mcp ship failed after retries:', {\n correlationId,\n payload,\n error: lastErr instanceof Error ? lastErr.message : String(lastErr),\n });\n\n // Durable fallback — write to disk so the audit record survives a crash.\n // Awaiting here would block the tool handler; fire-and-forget is fine\n // because AuditQueue.enqueue catches and logs its own failures.\n void getAuditQueue().enqueue(payload);\n}\n","/**\n * Secret key (management key) validator for server-to-server MCP access.\n *\n * Validates Bearer tokens of the form `sk_live_<random>` / `sk_test_<random>`\n * by calling the InstantTasks API's `/api/v1/sdk/keys/whoami-management`\n * endpoint. Any non-200 response (including 404) is treated as an\n * `invalid_token` auth failure — there is no permissive fallback.\n */\nimport { ApiError, AuthError } from '../errors.js';\nimport { ScopeSet } from './scopes.js';\n\nexport interface MgmtKeyIdentity {\n keyId: string;\n projectId: string;\n organizationId: string;\n scopes: ScopeSet;\n kind: 'management';\n}\n\n/** Extract raw token from \"Bearer sk_live_…\" header. */\nexport function extractBearerToken(authHeader: string | undefined): string | null {\n if (!authHeader?.startsWith('Bearer ')) return null;\n const token = authHeader.slice(7).trim();\n return token || null;\n}\n\n/**\n * Validate a management key by calling the InstantTasks API.\n *\n * @param token - Raw token string (without \"Bearer \" prefix)\n * @param apiBaseUrl - InstantTasks API base URL, e.g. http://api:11002/api/v1\n */\nexport async function validateSecretKey(\n token: string,\n apiBaseUrl: string,\n): Promise<MgmtKeyIdentity> {\n if (!token.startsWith('sk_live_') && !token.startsWith('sk_test_')) {\n throw new AuthError('invalid_token', 'expected sk_live_* or sk_test_*');\n }\n\n const url = `${apiBaseUrl}/sdk/keys/whoami-management`;\n\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'GET',\n headers: { Authorization: `Bearer ${token}` },\n signal: AbortSignal.timeout(5000),\n });\n } catch (err) {\n throw new ApiError(`Cannot reach InstantTasks API: ${(err as Error).message}`);\n }\n\n if (!res.ok) {\n // Any non-200 — including 404 (endpoint missing), 401, 403 — is fatal.\n // We never fall back to a stub identity; doing so would silently grant\n // read scopes to an unverified token.\n throw new AuthError('invalid_token', `whoami-management returned ${res.status}`);\n }\n\n let body: { id: string; projectId: string; organizationId: string; scopes: string[] };\n try {\n body = (await res.json()) as typeof body;\n } catch (err) {\n throw new ApiError(`Malformed whoami-management response: ${(err as Error).message}`);\n }\n\n if (!body.id || !body.projectId || !body.organizationId || !Array.isArray(body.scopes)) {\n throw new AuthError('invalid_token', 'whoami-management response missing required fields');\n }\n\n return {\n keyId: body.id,\n projectId: body.projectId,\n organizationId: body.organizationId,\n scopes: new ScopeSet(body.scopes),\n kind: 'management',\n };\n}\n"],"mappings":"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","names":["z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","DESCRIPTION","SCOPE","z","z","SCOPE","SCOPE","z","z","SCOPE","SCOPE","z","z","SCOPE","SCOPE","z","z","SCOPE","SCOPE","z","z","SCOPE","SCOPE","z","z","SCOPE","SCOPE","z","z","SCOPE","z","SCOPE","z","SCOPE","SCOPE","z","McpError","ErrorCode"]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }