@evalops/maestro 0.10.37 → 0.10.39

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.
@@ -53,7 +53,7 @@ export class RpcClient extends EventEmitter {
53
53
  ...process.env,
54
54
  ...this.options.env,
55
55
  };
56
- this.process = spawn(this.options.cliPath, ["--rpc"], {
56
+ this.process = spawn(this.options.cliPath, ["--mode", "rpc"], {
57
57
  cwd: this.options.cwd,
58
58
  env,
59
59
  stdio: ["pipe", "pipe", "pipe"],
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../src/rpc/rpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC Client for Maestro Agent\n *\n * Provides a typed TypeScript client for interacting with Maestro\n * over JSON-over-stdio RPC.\n *\n * @module rpc/rpc-client\n */\n\nimport { type ChildProcess, spawn } from \"node:child_process\";\nimport { EventEmitter } from \"node:events\";\nimport { type Interface, createInterface } from \"node:readline\";\nimport type { AgentEvent, Message } from \"../agent/types.js\";\nimport type {\n\tRpcCommand,\n\tRpcErrorResponse,\n\tRpcMessagesResponse,\n\tRpcResponse,\n\tRpcStateResponse,\n} from \"./rpc-types.js\";\nimport { isAgentEvent, isErrorResponse } from \"./rpc-types.js\";\n\n/**\n * Options for creating an RPC client.\n */\nexport interface RpcClientOptions {\n\t/** Path to the Maestro CLI executable */\n\tcliPath?: string;\n\t/** Working directory for the agent */\n\tcwd?: string;\n\t/** Additional environment variables */\n\tenv?: Record<string, string>;\n\t/** Timeout for requests in milliseconds (default: 30000) */\n\ttimeout?: number;\n}\n\n/**\n * Typed RPC client for Maestro Agent.\n *\n * @example\n * ```ts\n * const client = new RpcClient();\n * await client.start();\n *\n * client.on(\"message_update\", (event) => {\n * console.log(\"Streaming:\", event.message.content);\n * });\n *\n * await client.promptAndWait(\"Hello, world!\");\n * const messages = await client.getMessages();\n *\n * client.stop();\n * ```\n */\nexport class RpcClient extends EventEmitter {\n\tprivate process: ChildProcess | null = null;\n\tprivate readline: Interface | null = null;\n\tprivate pending: Map<\n\t\tstring,\n\t\t{\n\t\t\tresolve: (value: RpcResponse) => void;\n\t\t\treject: (error: Error) => void;\n\t\t\ttimeout: NodeJS.Timeout;\n\t\t}\n\t> = new Map();\n\tprivate requestId = 0;\n\tprivate options: Required<RpcClientOptions>;\n\n\tconstructor(options: RpcClientOptions = {}) {\n\t\tsuper();\n\t\tthis.options = {\n\t\t\tcliPath: options.cliPath ?? \"maestro\",\n\t\t\tcwd: options.cwd ?? process.cwd(),\n\t\t\tenv: options.env ?? {},\n\t\t\ttimeout: options.timeout ?? 30000,\n\t\t};\n\t}\n\n\t/**\n\t * Start the Maestro agent process.\n\t */\n\tasync start(): Promise<void> {\n\t\tif (this.process) {\n\t\t\tthrow new Error(\"Client already started\");\n\t\t}\n\n\t\tconst env = {\n\t\t\t...process.env,\n\t\t\t...this.options.env,\n\t\t};\n\n\t\tthis.process = spawn(this.options.cliPath, [\"--rpc\"], {\n\t\t\tcwd: this.options.cwd,\n\t\t\tenv,\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tif (!this.process.stdin || !this.process.stdout) {\n\t\t\tthrow new Error(\"Failed to create stdio pipes\");\n\t\t}\n\n\t\t// Set up readline for response parsing\n\t\tthis.readline = createInterface({\n\t\t\tinput: this.process.stdout,\n\t\t\tterminal: false,\n\t\t});\n\n\t\t// Handle incoming responses\n\t\tthis.readline.on(\"line\", (line) => {\n\t\t\ttry {\n\t\t\t\tconst response = JSON.parse(line) as RpcResponse;\n\t\t\t\tthis.handleResponse(response);\n\t\t\t} catch (error) {\n\t\t\t\tthis.emit(\"error\", new Error(`Failed to parse response: ${line}`));\n\t\t\t}\n\t\t});\n\n\t\t// Handle process errors\n\t\tthis.process.on(\"error\", (error) => {\n\t\t\tthis.emit(\"error\", error);\n\t\t});\n\n\t\tthis.process.on(\"exit\", (code) => {\n\t\t\tthis.emit(\"exit\", code);\n\t\t\tthis.cleanup();\n\t\t});\n\n\t\t// Forward stderr for debugging\n\t\tthis.process.stderr?.on(\"data\", (data) => {\n\t\t\tthis.emit(\"stderr\", data.toString());\n\t\t});\n\n\t\t// Wait for process to be ready\n\t\tawait new Promise<void>((resolve) => {\n\t\t\t// Give the process a moment to start\n\t\t\tsetTimeout(resolve, 100);\n\t\t});\n\t}\n\n\t/**\n\t * Stop the Maestro agent process.\n\t */\n\tstop(): void {\n\t\tthis.cleanup();\n\t\tif (this.process) {\n\t\t\tthis.process.kill();\n\t\t\tthis.process = null;\n\t\t}\n\t}\n\n\tprivate cleanup(): void {\n\t\tif (this.readline) {\n\t\t\tthis.readline.close();\n\t\t\tthis.readline = null;\n\t\t}\n\n\t\t// Reject all pending requests\n\t\tfor (const [id, pending] of this.pending) {\n\t\t\tclearTimeout(pending.timeout);\n\t\t\tpending.reject(new Error(\"Client stopped\"));\n\t\t}\n\t\tthis.pending.clear();\n\t}\n\n\tprivate handleResponse(response: RpcResponse): void {\n\t\t// Check if this is a response to a pending request\n\t\tconst id = (response as { id?: string }).id;\n\t\tif (id) {\n\t\t\tconst pending = this.pending.get(id);\n\t\t\tif (pending) {\n\t\t\t\tclearTimeout(pending.timeout);\n\t\t\t\tthis.pending.delete(id);\n\t\t\t\tpending.resolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Emit agent events\n\t\tif (isAgentEvent(response)) {\n\t\t\tthis.emit(response.type, response);\n\t\t\tthis.emit(\"event\", response);\n\t\t} else if (isErrorResponse(response)) {\n\t\t\tthis.emit(\"error\", new Error(response.error));\n\t\t} else {\n\t\t\t// Other responses without IDs\n\t\t\tthis.emit(\"response\", response);\n\t\t}\n\t}\n\n\t/**\n\t * Send a command to the agent.\n\t */\n\tprivate send(command: RpcCommand): void {\n\t\tif (!this.process?.stdin) {\n\t\t\tthrow new Error(\"Client not started\");\n\t\t}\n\t\tthis.process.stdin.write(`${JSON.stringify(command)}\\n`);\n\t}\n\n\t/**\n\t * Send a command and wait for a specific response type.\n\t */\n\tprivate async request<T extends RpcResponse>(\n\t\tcommand: RpcCommand,\n\t\texpectedType?: string,\n\t): Promise<T> {\n\t\tconst id = `req_${++this.requestId}`;\n\t\tconst commandWithId = { ...command, id };\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.pending.delete(id);\n\t\t\t\treject(new Error(`Request timeout: ${command.type}`));\n\t\t\t}, this.options.timeout);\n\n\t\t\tthis.pending.set(id, {\n\t\t\t\tresolve: resolve as (value: RpcResponse) => void,\n\t\t\t\treject,\n\t\t\t\ttimeout,\n\t\t\t});\n\n\t\t\tthis.send(commandWithId);\n\t\t});\n\t}\n\n\t/**\n\t * Send a prompt to the agent (fire and forget).\n\t * Use promptAndWait() if you need to wait for completion.\n\t */\n\tprompt(message: string): void {\n\t\tthis.send({ type: \"prompt\", message });\n\t}\n\n\t/**\n\t * Send a prompt and wait for the agent to finish.\n\t * Returns when agent_end event is received.\n\t */\n\tasync promptAndWait(message: string): Promise<AgentEvent> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst cleanup = () => {\n\t\t\t\tthis.off(\"agent_end\", onEnd);\n\t\t\t\tthis.off(\"error\", onError);\n\t\t\t};\n\n\t\t\tconst onEnd = (event: AgentEvent) => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(event);\n\t\t\t};\n\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\tcleanup();\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\tthis.once(\"agent_end\", onEnd);\n\t\t\tthis.once(\"error\", onError);\n\n\t\t\tthis.prompt(message);\n\t\t});\n\t}\n\n\t/**\n\t * Abort the current operation.\n\t */\n\tabort(): void {\n\t\tthis.send({ type: \"abort\" });\n\t}\n\n\t/**\n\t * Get the current conversation messages.\n\t */\n\tasync getMessages(): Promise<Message[]> {\n\t\tconst response = await this.request<RpcMessagesResponse>({\n\t\t\ttype: \"get_messages\",\n\t\t});\n\t\treturn response.messages;\n\t}\n\n\t/**\n\t * Get the full agent state.\n\t */\n\tasync getState(): Promise<RpcStateResponse[\"state\"]> {\n\t\tconst response = await this.request<RpcStateResponse>({\n\t\t\ttype: \"get_state\",\n\t\t});\n\t\treturn response.state;\n\t}\n\n\t/**\n\t * Continue the conversation without a new user message.\n\t */\n\tcontinue(options?: { systemPromptOverride?: string }): void {\n\t\tthis.send({ type: \"continue\", options });\n\t}\n\n\t/**\n\t * Continue and wait for the agent to finish.\n\t */\n\tasync continueAndWait(options?: {\n\t\tsystemPromptOverride?: string;\n\t}): Promise<AgentEvent> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst cleanup = () => {\n\t\t\t\tthis.off(\"agent_end\", onEnd);\n\t\t\t\tthis.off(\"error\", onError);\n\t\t\t};\n\n\t\t\tconst onEnd = (event: AgentEvent) => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(event);\n\t\t\t};\n\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\tcleanup();\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\tthis.once(\"agent_end\", onEnd);\n\t\t\tthis.once(\"error\", onError);\n\n\t\t\tthis.continue(options);\n\t\t});\n\t}\n\n\t/**\n\t * Trigger context compaction.\n\t */\n\tcompact(customInstructions?: string): void {\n\t\tthis.send({ type: \"compact\", customInstructions });\n\t}\n\n\t/**\n\t * Wait for the agent to become idle.\n\t */\n\tasync waitForIdle(): Promise<void> {\n\t\tconst state = await this.getState();\n\t\tif (!state.isStreaming) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tconst onEnd = () => {\n\t\t\t\tthis.off(\"agent_end\", onEnd);\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tthis.once(\"agent_end\", onEnd);\n\t\t});\n\t}\n\n\t/**\n\t * Check if the agent is currently streaming.\n\t */\n\tasync isStreaming(): Promise<boolean> {\n\t\tconst state = await this.getState();\n\t\treturn state.isStreaming;\n\t}\n}\n"]}
1
+ {"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../src/rpc/rpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC Client for Maestro Agent\n *\n * Provides a typed TypeScript client for interacting with Maestro\n * over JSON-over-stdio RPC.\n *\n * @module rpc/rpc-client\n */\n\nimport { type ChildProcess, spawn } from \"node:child_process\";\nimport { EventEmitter } from \"node:events\";\nimport { type Interface, createInterface } from \"node:readline\";\nimport type { AgentEvent, Message } from \"../agent/types.js\";\nimport type {\n\tRpcCommand,\n\tRpcErrorResponse,\n\tRpcMessagesResponse,\n\tRpcResponse,\n\tRpcStateResponse,\n} from \"./rpc-types.js\";\nimport { isAgentEvent, isErrorResponse } from \"./rpc-types.js\";\n\n/**\n * Options for creating an RPC client.\n */\nexport interface RpcClientOptions {\n\t/** Path to the Maestro CLI executable */\n\tcliPath?: string;\n\t/** Working directory for the agent */\n\tcwd?: string;\n\t/** Additional environment variables */\n\tenv?: Record<string, string>;\n\t/** Timeout for requests in milliseconds (default: 30000) */\n\ttimeout?: number;\n}\n\n/**\n * Typed RPC client for Maestro Agent.\n *\n * @example\n * ```ts\n * const client = new RpcClient();\n * await client.start();\n *\n * client.on(\"message_update\", (event) => {\n * console.log(\"Streaming:\", event.message.content);\n * });\n *\n * await client.promptAndWait(\"Hello, world!\");\n * const messages = await client.getMessages();\n *\n * client.stop();\n * ```\n */\nexport class RpcClient extends EventEmitter {\n\tprivate process: ChildProcess | null = null;\n\tprivate readline: Interface | null = null;\n\tprivate pending: Map<\n\t\tstring,\n\t\t{\n\t\t\tresolve: (value: RpcResponse) => void;\n\t\t\treject: (error: Error) => void;\n\t\t\ttimeout: NodeJS.Timeout;\n\t\t}\n\t> = new Map();\n\tprivate requestId = 0;\n\tprivate options: Required<RpcClientOptions>;\n\n\tconstructor(options: RpcClientOptions = {}) {\n\t\tsuper();\n\t\tthis.options = {\n\t\t\tcliPath: options.cliPath ?? \"maestro\",\n\t\t\tcwd: options.cwd ?? process.cwd(),\n\t\t\tenv: options.env ?? {},\n\t\t\ttimeout: options.timeout ?? 30000,\n\t\t};\n\t}\n\n\t/**\n\t * Start the Maestro agent process.\n\t */\n\tasync start(): Promise<void> {\n\t\tif (this.process) {\n\t\t\tthrow new Error(\"Client already started\");\n\t\t}\n\n\t\tconst env = {\n\t\t\t...process.env,\n\t\t\t...this.options.env,\n\t\t};\n\n\t\tthis.process = spawn(this.options.cliPath, [\"--mode\", \"rpc\"], {\n\t\t\tcwd: this.options.cwd,\n\t\t\tenv,\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tif (!this.process.stdin || !this.process.stdout) {\n\t\t\tthrow new Error(\"Failed to create stdio pipes\");\n\t\t}\n\n\t\t// Set up readline for response parsing\n\t\tthis.readline = createInterface({\n\t\t\tinput: this.process.stdout,\n\t\t\tterminal: false,\n\t\t});\n\n\t\t// Handle incoming responses\n\t\tthis.readline.on(\"line\", (line) => {\n\t\t\ttry {\n\t\t\t\tconst response = JSON.parse(line) as RpcResponse;\n\t\t\t\tthis.handleResponse(response);\n\t\t\t} catch (error) {\n\t\t\t\tthis.emit(\"error\", new Error(`Failed to parse response: ${line}`));\n\t\t\t}\n\t\t});\n\n\t\t// Handle process errors\n\t\tthis.process.on(\"error\", (error) => {\n\t\t\tthis.emit(\"error\", error);\n\t\t});\n\n\t\tthis.process.on(\"exit\", (code) => {\n\t\t\tthis.emit(\"exit\", code);\n\t\t\tthis.cleanup();\n\t\t});\n\n\t\t// Forward stderr for debugging\n\t\tthis.process.stderr?.on(\"data\", (data) => {\n\t\t\tthis.emit(\"stderr\", data.toString());\n\t\t});\n\n\t\t// Wait for process to be ready\n\t\tawait new Promise<void>((resolve) => {\n\t\t\t// Give the process a moment to start\n\t\t\tsetTimeout(resolve, 100);\n\t\t});\n\t}\n\n\t/**\n\t * Stop the Maestro agent process.\n\t */\n\tstop(): void {\n\t\tthis.cleanup();\n\t\tif (this.process) {\n\t\t\tthis.process.kill();\n\t\t\tthis.process = null;\n\t\t}\n\t}\n\n\tprivate cleanup(): void {\n\t\tif (this.readline) {\n\t\t\tthis.readline.close();\n\t\t\tthis.readline = null;\n\t\t}\n\n\t\t// Reject all pending requests\n\t\tfor (const [id, pending] of this.pending) {\n\t\t\tclearTimeout(pending.timeout);\n\t\t\tpending.reject(new Error(\"Client stopped\"));\n\t\t}\n\t\tthis.pending.clear();\n\t}\n\n\tprivate handleResponse(response: RpcResponse): void {\n\t\t// Check if this is a response to a pending request\n\t\tconst id = (response as { id?: string }).id;\n\t\tif (id) {\n\t\t\tconst pending = this.pending.get(id);\n\t\t\tif (pending) {\n\t\t\t\tclearTimeout(pending.timeout);\n\t\t\t\tthis.pending.delete(id);\n\t\t\t\tpending.resolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Emit agent events\n\t\tif (isAgentEvent(response)) {\n\t\t\tthis.emit(response.type, response);\n\t\t\tthis.emit(\"event\", response);\n\t\t} else if (isErrorResponse(response)) {\n\t\t\tthis.emit(\"error\", new Error(response.error));\n\t\t} else {\n\t\t\t// Other responses without IDs\n\t\t\tthis.emit(\"response\", response);\n\t\t}\n\t}\n\n\t/**\n\t * Send a command to the agent.\n\t */\n\tprivate send(command: RpcCommand): void {\n\t\tif (!this.process?.stdin) {\n\t\t\tthrow new Error(\"Client not started\");\n\t\t}\n\t\tthis.process.stdin.write(`${JSON.stringify(command)}\\n`);\n\t}\n\n\t/**\n\t * Send a command and wait for a specific response type.\n\t */\n\tprivate async request<T extends RpcResponse>(\n\t\tcommand: RpcCommand,\n\t\texpectedType?: string,\n\t): Promise<T> {\n\t\tconst id = `req_${++this.requestId}`;\n\t\tconst commandWithId = { ...command, id };\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.pending.delete(id);\n\t\t\t\treject(new Error(`Request timeout: ${command.type}`));\n\t\t\t}, this.options.timeout);\n\n\t\t\tthis.pending.set(id, {\n\t\t\t\tresolve: resolve as (value: RpcResponse) => void,\n\t\t\t\treject,\n\t\t\t\ttimeout,\n\t\t\t});\n\n\t\t\tthis.send(commandWithId);\n\t\t});\n\t}\n\n\t/**\n\t * Send a prompt to the agent (fire and forget).\n\t * Use promptAndWait() if you need to wait for completion.\n\t */\n\tprompt(message: string): void {\n\t\tthis.send({ type: \"prompt\", message });\n\t}\n\n\t/**\n\t * Send a prompt and wait for the agent to finish.\n\t * Returns when agent_end event is received.\n\t */\n\tasync promptAndWait(message: string): Promise<AgentEvent> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst cleanup = () => {\n\t\t\t\tthis.off(\"agent_end\", onEnd);\n\t\t\t\tthis.off(\"error\", onError);\n\t\t\t};\n\n\t\t\tconst onEnd = (event: AgentEvent) => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(event);\n\t\t\t};\n\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\tcleanup();\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\tthis.once(\"agent_end\", onEnd);\n\t\t\tthis.once(\"error\", onError);\n\n\t\t\tthis.prompt(message);\n\t\t});\n\t}\n\n\t/**\n\t * Abort the current operation.\n\t */\n\tabort(): void {\n\t\tthis.send({ type: \"abort\" });\n\t}\n\n\t/**\n\t * Get the current conversation messages.\n\t */\n\tasync getMessages(): Promise<Message[]> {\n\t\tconst response = await this.request<RpcMessagesResponse>({\n\t\t\ttype: \"get_messages\",\n\t\t});\n\t\treturn response.messages;\n\t}\n\n\t/**\n\t * Get the full agent state.\n\t */\n\tasync getState(): Promise<RpcStateResponse[\"state\"]> {\n\t\tconst response = await this.request<RpcStateResponse>({\n\t\t\ttype: \"get_state\",\n\t\t});\n\t\treturn response.state;\n\t}\n\n\t/**\n\t * Continue the conversation without a new user message.\n\t */\n\tcontinue(options?: { systemPromptOverride?: string }): void {\n\t\tthis.send({ type: \"continue\", options });\n\t}\n\n\t/**\n\t * Continue and wait for the agent to finish.\n\t */\n\tasync continueAndWait(options?: {\n\t\tsystemPromptOverride?: string;\n\t}): Promise<AgentEvent> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst cleanup = () => {\n\t\t\t\tthis.off(\"agent_end\", onEnd);\n\t\t\t\tthis.off(\"error\", onError);\n\t\t\t};\n\n\t\t\tconst onEnd = (event: AgentEvent) => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(event);\n\t\t\t};\n\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\tcleanup();\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\tthis.once(\"agent_end\", onEnd);\n\t\t\tthis.once(\"error\", onError);\n\n\t\t\tthis.continue(options);\n\t\t});\n\t}\n\n\t/**\n\t * Trigger context compaction.\n\t */\n\tcompact(customInstructions?: string): void {\n\t\tthis.send({ type: \"compact\", customInstructions });\n\t}\n\n\t/**\n\t * Wait for the agent to become idle.\n\t */\n\tasync waitForIdle(): Promise<void> {\n\t\tconst state = await this.getState();\n\t\tif (!state.isStreaming) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tconst onEnd = () => {\n\t\t\t\tthis.off(\"agent_end\", onEnd);\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tthis.once(\"agent_end\", onEnd);\n\t\t});\n\t}\n\n\t/**\n\t * Check if the agent is currently streaming.\n\t */\n\tasync isStreaming(): Promise<boolean> {\n\t\tconst state = await this.getState();\n\t\treturn state.isStreaming;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"network-policy-validator.d.ts","sourceRoot":"","sources":["../../../src/safety/validators/network-policy-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAY5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACtB;AAsBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAc1E;AAED;;GAEG;AACH,wBAAsB,gCAAgC,CACrD,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,GAC/C,OAAO,CAAC,uBAAuB,CAAC,CAwGlC;AAED,wBAAsB,wBAAwB,CAC7C,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,GAC/C,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAKhD;AAED,wBAAsB,kBAAkB,CACvC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,GAC/C,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAShD"}
1
+ {"version":3,"file":"network-policy-validator.d.ts","sourceRoot":"","sources":["../../../src/safety/validators/network-policy-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAY5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACtB;AAsBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAc1E;AAED;;GAEG;AACH,wBAAsB,gCAAgC,CACrD,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,GAC/C,OAAO,CAAC,uBAAuB,CAAC,CAyGlC;AAED,wBAAsB,wBAAwB,CAC7C,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,GAC/C,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAKhD;AAED,wBAAsB,kBAAkB,CACvC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,GAC/C,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAShD"}
@@ -39,6 +39,44 @@ export async function checkNetworkRestrictionsDetailed(url, network) {
39
39
  const parsed = new URL(url);
40
40
  const host = parsed.hostname.toLowerCase();
41
41
  const normalizedHost = host.replace(/^\[|\]$/g, "");
42
+ if (network.blockedHosts?.length) {
43
+ for (const blockedHost of network.blockedHosts) {
44
+ const lowerBlocked = blockedHost.toLowerCase();
45
+ if (host === lowerBlocked || host.endsWith(`.${lowerBlocked}`)) {
46
+ return {
47
+ allowed: false,
48
+ reason: `Host "${host}" is blocked by enterprise policy.`,
49
+ host,
50
+ normalizedHost,
51
+ resolvedIPs: [],
52
+ };
53
+ }
54
+ }
55
+ }
56
+ if (network.allowedHosts) {
57
+ if (network.allowedHosts.length === 0) {
58
+ return {
59
+ allowed: false,
60
+ reason: `Host "${host}" is not in the allowed hosts list.`,
61
+ host,
62
+ normalizedHost,
63
+ resolvedIPs: [],
64
+ };
65
+ }
66
+ const isAllowed = network.allowedHosts.some((allowedHost) => {
67
+ const lowerAllowed = allowedHost.toLowerCase();
68
+ return host === lowerAllowed || host.endsWith(`.${lowerAllowed}`);
69
+ });
70
+ if (!isAllowed) {
71
+ return {
72
+ allowed: false,
73
+ reason: `Host "${host}" is not in the allowed hosts list.`,
74
+ host,
75
+ normalizedHost,
76
+ resolvedIPs: [],
77
+ };
78
+ }
79
+ }
42
80
  const resolvedIPs = [];
43
81
  const isIP = parseIPv4(normalizedHost) !== null ||
44
82
  parseIPv4MappedHex(normalizedHost) !== null ||
@@ -85,44 +123,6 @@ export async function checkNetworkRestrictionsDetailed(url, network) {
85
123
  };
86
124
  }
87
125
  }
88
- if (network.blockedHosts?.length) {
89
- for (const blockedHost of network.blockedHosts) {
90
- const lowerBlocked = blockedHost.toLowerCase();
91
- if (host === lowerBlocked || host.endsWith(`.${lowerBlocked}`)) {
92
- return {
93
- allowed: false,
94
- reason: `Host "${host}" is blocked by enterprise policy.`,
95
- host,
96
- normalizedHost,
97
- resolvedIPs,
98
- };
99
- }
100
- }
101
- }
102
- if (network.allowedHosts) {
103
- if (network.allowedHosts.length === 0) {
104
- return {
105
- allowed: false,
106
- reason: `Host "${host}" is not in the allowed hosts list.`,
107
- host,
108
- normalizedHost,
109
- resolvedIPs,
110
- };
111
- }
112
- const isAllowed = network.allowedHosts.some((allowedHost) => {
113
- const lowerAllowed = allowedHost.toLowerCase();
114
- return host === lowerAllowed || host.endsWith(`.${lowerAllowed}`);
115
- });
116
- if (!isAllowed) {
117
- return {
118
- allowed: false,
119
- reason: `Host "${host}" is not in the allowed hosts list.`,
120
- host,
121
- normalizedHost,
122
- resolvedIPs,
123
- };
124
- }
125
- }
126
126
  return { allowed: true, host, normalizedHost, resolvedIPs };
127
127
  }
128
128
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"network-policy-validator.js","sourceRoot":"","sources":["../../../src/safety/validators/network-policy-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import { lookup } from \"node:dns/promises\";\nimport type { ActionApprovalContext } from \"../../agent/action-approval.js\";\nimport {\n\tisLocalhostAlias,\n\tisLoopbackIP,\n\tisPrivateIP,\n\tparseIPv4,\n\tparseIPv4MappedHex,\n} from \"../../utils/ip-address-parser.js\";\nimport {\n\textractUrlsFromShellCommand,\n\textractUrlsFromValue,\n} from \"../../utils/url-extractor.js\";\nimport type { EnterprisePolicy } from \"../policy.js\";\n\nexport interface NetworkRestrictionCheck {\n\tallowed: boolean;\n\treason?: string;\n\thost?: string;\n\tnormalizedHost?: string;\n\tresolvedIPs: string[];\n}\n\nfunction getArgsObject(\n\tcontext: ActionApprovalContext,\n): Record<string, unknown> | null {\n\treturn context.args && typeof context.args === \"object\"\n\t\t? (context.args as Record<string, unknown>)\n\t\t: null;\n}\n\nfunction getStringArg(\n\tcontext: ActionApprovalContext,\n\tkey: string,\n): string | null {\n\tconst args = getArgsObject(context);\n\tif (!args) {\n\t\treturn null;\n\t}\n\tconst value = args[key];\n\treturn typeof value === \"string\" ? value : null;\n}\n\n/**\n * Extract URLs from tool arguments (recursively checks nested objects)\n * Also extracts URLs from curl/wget commands in bash.\n */\nexport function extractPolicyUrls(context: ActionApprovalContext): string[] {\n\tconst args = getArgsObject(context);\n\tif (!args) return [];\n\n\tconst urls = extractUrlsFromValue(args);\n\n\tif (context.toolName === \"bash\" || context.toolName === \"background_tasks\") {\n\t\tconst command = getStringArg(context, \"command\");\n\t\tif (command) {\n\t\t\turls.push(...extractUrlsFromShellCommand(command));\n\t\t}\n\t}\n\n\treturn urls;\n}\n\n/**\n * Check if a URL/host matches network restrictions.\n */\nexport async function checkNetworkRestrictionsDetailed(\n\turl: string,\n\tnetwork: NonNullable<EnterprisePolicy[\"network\"]>,\n): Promise<NetworkRestrictionCheck> {\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\tconst host = parsed.hostname.toLowerCase();\n\n\t\tconst normalizedHost = host.replace(/^\\[|\\]$/g, \"\");\n\n\t\tconst resolvedIPs: string[] = [];\n\t\tconst isIP =\n\t\t\tparseIPv4(normalizedHost) !== null ||\n\t\t\tparseIPv4MappedHex(normalizedHost) !== null ||\n\t\t\tnormalizedHost.includes(\":\");\n\n\t\tif (!isIP) {\n\t\t\ttry {\n\t\t\t\tconst addresses = await lookup(normalizedHost, { all: true });\n\t\t\t\tresolvedIPs.push(...addresses.map(({ address }) => address));\n\t\t\t} catch {\n\t\t\t\tif (network.blockPrivateIPs || network.blockLocalhost) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tallowed: false,\n\t\t\t\t\t\treason: `DNS resolution failed for \"${host}\" and network policy requires IP validation (blockPrivateIPs/blockLocalhost enabled). Access blocked.`,\n\t\t\t\t\t\thost,\n\t\t\t\t\t\tnormalizedHost,\n\t\t\t\t\t\tresolvedIPs,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tresolvedIPs.push(normalizedHost);\n\t\t}\n\n\t\tif (network.blockLocalhost) {\n\t\t\tif (isLocalhostAlias(normalizedHost) || resolvedIPs.some(isLoopbackIP)) {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\treason: \"Access to localhost is blocked by enterprise policy.\",\n\t\t\t\t\thost,\n\t\t\t\t\tnormalizedHost,\n\t\t\t\t\tresolvedIPs,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (network.blockPrivateIPs) {\n\t\t\tif (resolvedIPs.some(isPrivateIP)) {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\treason:\n\t\t\t\t\t\t\"Access to private IP addresses is blocked by enterprise policy.\",\n\t\t\t\t\thost,\n\t\t\t\t\tnormalizedHost,\n\t\t\t\t\tresolvedIPs,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (network.blockedHosts?.length) {\n\t\t\tfor (const blockedHost of network.blockedHosts) {\n\t\t\t\tconst lowerBlocked = blockedHost.toLowerCase();\n\t\t\t\tif (host === lowerBlocked || host.endsWith(`.${lowerBlocked}`)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tallowed: false,\n\t\t\t\t\t\treason: `Host \"${host}\" is blocked by enterprise policy.`,\n\t\t\t\t\t\thost,\n\t\t\t\t\t\tnormalizedHost,\n\t\t\t\t\t\tresolvedIPs,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (network.allowedHosts) {\n\t\t\tif (network.allowedHosts.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\treason: `Host \"${host}\" is not in the allowed hosts list.`,\n\t\t\t\t\thost,\n\t\t\t\t\tnormalizedHost,\n\t\t\t\t\tresolvedIPs,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst isAllowed = network.allowedHosts.some((allowedHost) => {\n\t\t\t\tconst lowerAllowed = allowedHost.toLowerCase();\n\t\t\t\treturn host === lowerAllowed || host.endsWith(`.${lowerAllowed}`);\n\t\t\t});\n\t\t\tif (!isAllowed) {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\treason: `Host \"${host}\" is not in the allowed hosts list.`,\n\t\t\t\t\thost,\n\t\t\t\t\tnormalizedHost,\n\t\t\t\t\tresolvedIPs,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn { allowed: true, host, normalizedHost, resolvedIPs };\n\t} catch {\n\t\treturn {\n\t\t\tallowed: false,\n\t\t\treason: \"Invalid URL format - cannot validate against network policy.\",\n\t\t\tresolvedIPs: [],\n\t\t};\n\t}\n}\n\nexport async function checkNetworkRestrictions(\n\turl: string,\n\tnetwork: NonNullable<EnterprisePolicy[\"network\"]>,\n): Promise<{ allowed: boolean; reason?: string }> {\n\tconst check = await checkNetworkRestrictionsDetailed(url, network);\n\treturn check.reason\n\t\t? { allowed: check.allowed, reason: check.reason }\n\t\t: { allowed: check.allowed };\n}\n\nexport async function checkNetworkPolicy(\n\tcontext: ActionApprovalContext,\n\tnetwork: NonNullable<EnterprisePolicy[\"network\"]>,\n): Promise<{ allowed: boolean; reason?: string }> {\n\tconst urls = extractPolicyUrls(context);\n\tfor (const url of urls) {\n\t\tconst check = await checkNetworkRestrictions(url, network);\n\t\tif (!check.allowed) {\n\t\t\treturn check;\n\t\t}\n\t}\n\treturn { allowed: true };\n}\n"]}
1
+ {"version":3,"file":"network-policy-validator.js","sourceRoot":"","sources":["../../../src/safety/validators/network-policy-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import { lookup } from \"node:dns/promises\";\nimport type { ActionApprovalContext } from \"../../agent/action-approval.js\";\nimport {\n\tisLocalhostAlias,\n\tisLoopbackIP,\n\tisPrivateIP,\n\tparseIPv4,\n\tparseIPv4MappedHex,\n} from \"../../utils/ip-address-parser.js\";\nimport {\n\textractUrlsFromShellCommand,\n\textractUrlsFromValue,\n} from \"../../utils/url-extractor.js\";\nimport type { EnterprisePolicy } from \"../policy.js\";\n\nexport interface NetworkRestrictionCheck {\n\tallowed: boolean;\n\treason?: string;\n\thost?: string;\n\tnormalizedHost?: string;\n\tresolvedIPs: string[];\n}\n\nfunction getArgsObject(\n\tcontext: ActionApprovalContext,\n): Record<string, unknown> | null {\n\treturn context.args && typeof context.args === \"object\"\n\t\t? (context.args as Record<string, unknown>)\n\t\t: null;\n}\n\nfunction getStringArg(\n\tcontext: ActionApprovalContext,\n\tkey: string,\n): string | null {\n\tconst args = getArgsObject(context);\n\tif (!args) {\n\t\treturn null;\n\t}\n\tconst value = args[key];\n\treturn typeof value === \"string\" ? value : null;\n}\n\n/**\n * Extract URLs from tool arguments (recursively checks nested objects)\n * Also extracts URLs from curl/wget commands in bash.\n */\nexport function extractPolicyUrls(context: ActionApprovalContext): string[] {\n\tconst args = getArgsObject(context);\n\tif (!args) return [];\n\n\tconst urls = extractUrlsFromValue(args);\n\n\tif (context.toolName === \"bash\" || context.toolName === \"background_tasks\") {\n\t\tconst command = getStringArg(context, \"command\");\n\t\tif (command) {\n\t\t\turls.push(...extractUrlsFromShellCommand(command));\n\t\t}\n\t}\n\n\treturn urls;\n}\n\n/**\n * Check if a URL/host matches network restrictions.\n */\nexport async function checkNetworkRestrictionsDetailed(\n\turl: string,\n\tnetwork: NonNullable<EnterprisePolicy[\"network\"]>,\n): Promise<NetworkRestrictionCheck> {\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\tconst host = parsed.hostname.toLowerCase();\n\n\t\tconst normalizedHost = host.replace(/^\\[|\\]$/g, \"\");\n\n\t\tif (network.blockedHosts?.length) {\n\t\t\tfor (const blockedHost of network.blockedHosts) {\n\t\t\t\tconst lowerBlocked = blockedHost.toLowerCase();\n\t\t\t\tif (host === lowerBlocked || host.endsWith(`.${lowerBlocked}`)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tallowed: false,\n\t\t\t\t\t\treason: `Host \"${host}\" is blocked by enterprise policy.`,\n\t\t\t\t\t\thost,\n\t\t\t\t\t\tnormalizedHost,\n\t\t\t\t\t\tresolvedIPs: [],\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (network.allowedHosts) {\n\t\t\tif (network.allowedHosts.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\treason: `Host \"${host}\" is not in the allowed hosts list.`,\n\t\t\t\t\thost,\n\t\t\t\t\tnormalizedHost,\n\t\t\t\t\tresolvedIPs: [],\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst isAllowed = network.allowedHosts.some((allowedHost) => {\n\t\t\t\tconst lowerAllowed = allowedHost.toLowerCase();\n\t\t\t\treturn host === lowerAllowed || host.endsWith(`.${lowerAllowed}`);\n\t\t\t});\n\t\t\tif (!isAllowed) {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\treason: `Host \"${host}\" is not in the allowed hosts list.`,\n\t\t\t\t\thost,\n\t\t\t\t\tnormalizedHost,\n\t\t\t\t\tresolvedIPs: [],\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst resolvedIPs: string[] = [];\n\t\tconst isIP =\n\t\t\tparseIPv4(normalizedHost) !== null ||\n\t\t\tparseIPv4MappedHex(normalizedHost) !== null ||\n\t\t\tnormalizedHost.includes(\":\");\n\n\t\tif (!isIP) {\n\t\t\ttry {\n\t\t\t\tconst addresses = await lookup(normalizedHost, { all: true });\n\t\t\t\tresolvedIPs.push(...addresses.map(({ address }) => address));\n\t\t\t} catch {\n\t\t\t\tif (network.blockPrivateIPs || network.blockLocalhost) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tallowed: false,\n\t\t\t\t\t\treason: `DNS resolution failed for \"${host}\" and network policy requires IP validation (blockPrivateIPs/blockLocalhost enabled). Access blocked.`,\n\t\t\t\t\t\thost,\n\t\t\t\t\t\tnormalizedHost,\n\t\t\t\t\t\tresolvedIPs,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tresolvedIPs.push(normalizedHost);\n\t\t}\n\n\t\tif (network.blockLocalhost) {\n\t\t\tif (isLocalhostAlias(normalizedHost) || resolvedIPs.some(isLoopbackIP)) {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\treason: \"Access to localhost is blocked by enterprise policy.\",\n\t\t\t\t\thost,\n\t\t\t\t\tnormalizedHost,\n\t\t\t\t\tresolvedIPs,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (network.blockPrivateIPs) {\n\t\t\tif (resolvedIPs.some(isPrivateIP)) {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\treason:\n\t\t\t\t\t\t\"Access to private IP addresses is blocked by enterprise policy.\",\n\t\t\t\t\thost,\n\t\t\t\t\tnormalizedHost,\n\t\t\t\t\tresolvedIPs,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn { allowed: true, host, normalizedHost, resolvedIPs };\n\t} catch {\n\t\treturn {\n\t\t\tallowed: false,\n\t\t\treason: \"Invalid URL format - cannot validate against network policy.\",\n\t\t\tresolvedIPs: [],\n\t\t};\n\t}\n}\n\nexport async function checkNetworkRestrictions(\n\turl: string,\n\tnetwork: NonNullable<EnterprisePolicy[\"network\"]>,\n): Promise<{ allowed: boolean; reason?: string }> {\n\tconst check = await checkNetworkRestrictionsDetailed(url, network);\n\treturn check.reason\n\t\t? { allowed: check.allowed, reason: check.reason }\n\t\t: { allowed: check.allowed };\n}\n\nexport async function checkNetworkPolicy(\n\tcontext: ActionApprovalContext,\n\tnetwork: NonNullable<EnterprisePolicy[\"network\"]>,\n): Promise<{ allowed: boolean; reason?: string }> {\n\tconst urls = extractPolicyUrls(context);\n\tfor (const url of urls) {\n\t\tconst check = await checkNetworkRestrictions(url, network);\n\t\tif (!check.allowed) {\n\t\t\treturn check;\n\t\t}\n\t}\n\treturn { allowed: true };\n}\n"]}
@@ -75,7 +75,7 @@ export type MaestroReleaseGateEventCategory = (typeof MAESTRO_RELEASE_GATE_EVENT
75
75
  export declare const MAESTRO_RELEASE_GATE_EVENT_SUBJECTS_BY_CATEGORY: {
76
76
  readonly install: readonly [MaestroBusEventType.InstallCheckCompleted];
77
77
  readonly session: readonly [MaestroBusEventType.SessionClosed];
78
- readonly tool: readonly [MaestroBusEventType.ToolCallCompleted, MaestroBusEventType.ToolCallFailed];
78
+ readonly tool: readonly [MaestroBusEventType.ToolCallAttempted, MaestroBusEventType.ToolCallCompleted, MaestroBusEventType.ToolCallFailed];
79
79
  readonly approval: readonly [MaestroBusEventType.ApprovalHit];
80
80
  readonly error: readonly [MaestroBusEventType.ErrorCaptured];
81
81
  readonly artifact: readonly [MaestroBusEventType.ArtifactCreated];
@@ -1 +1 @@
1
- {"version":3,"file":"maestro-event-catalog.d.ts","sourceRoot":"","sources":["../../src/telemetry/maestro-event-catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"maestro-event-catalog.d.ts","sourceRoot":"","sources":["../../src/telemetry/maestro-event-catalog.ts"],"names":[],"mappings":"AAAA,oBAAY,mBAAmB;IAC9B,cAAc,qCAAqC;IACnD,gBAAgB,uCAAuC;IACvD,cAAc,qCAAqC;IACnD,aAAa,oCAAoC;IACjD,qBAAqB,2CAA2C;IAChE,WAAW,gCAAgC;IAC3C,gBAAgB,qCAAqC;IACrD,aAAa,kCAAkC;IAC/C,iBAAiB,uCAAuC;IACxD,iBAAiB,uCAAuC;IACxD,cAAc,oCAAoC;IAClD,aAAa,kCAAkC;IAC/C,eAAe,oCAAoC;IACnD,mBAAmB,yCAAyC;IAC5D,qBAAqB,2CAA2C;IAChE,cAAc,mCAAmC;IACjD,YAAY,iCAAiC;IAC7C,cAAc,mCAAmC;IACjD,WAAW,gCAAgC;IAC3C,kBAAkB,uCAAuC;IACzD,eAAe,qCAAqC;IACpD,iBAAiB,uCAAuC;IACxD,eAAe,qCAAqC;IACpD,gBAAgB,sCAAsC;IACtD,aAAa,mCAAmC;IAChD,gBAAgB,sCAAsC;IACtD,eAAe,qCAAqC;IACpD,oBAAoB,0CAA0C;IAC9D,UAAU,+BAA+B;CACzC;AAED,MAAM,MAAM,uBAAuB,GAChC,SAAS,GACT,SAAS,GACT,OAAO,GACP,UAAU,GACV,QAAQ,GACR,MAAM,GACN,OAAO,GACP,UAAU,GACV,cAAc,GACd,QAAQ,GACR,WAAW,GACX,OAAO,GACP,KAAK,GACL,MAAM,CAAC;AAEV,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,EAAE,uBAAuB,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,IAAI,EAAE,mBAAmB,CAAC;CAC1B;AAoBD,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwNuC,CAAC;AAE9E,eAAO,MAAM,uBAAuB,uBAAqC,CAAC;AAE1E,eAAO,MAAM,qCAAqC,0FAQK,CAAC;AAExD,MAAM,MAAM,+BAA+B,GAC1C,CAAC,OAAO,qCAAqC,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,eAAO,MAAM,+CAA+C;;;;;;;;CAc3D,CAAC;AAEF,eAAO,MAAM,mCAAmC,EAEpC,SAAS,mBAAmB,EAAE,CAAC;AAE3C,MAAM,WAAW,4BAA4B;IAC5C,UAAU,EAAE,SAAS,+BAA+B,EAAE,CAAC;IACvD,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACzC,kBAAkB,EAAE,QAAQ,CAC3B,MAAM,CAAC,+BAA+B,EAAE,SAAS,mBAAmB,EAAE,CAAC,CACvE,CAAC;CACF;AAED,MAAM,WAAW,8CAA8C;IAC9D,cAAc,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC/C,QAAQ,EAAE,+BAA+B,CAAC;IAC1C,gBAAgB,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACjD,eAAe,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAChD,kBAAkB,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACnD;AAED,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,MAAM,GACX,KAAK,IAAI,mBAAmB,CAE9B;AAED,wBAAgB,8BAA8B,CAC7C,IAAI,EAAE,mBAAmB,GACvB,2BAA2B,CAE7B;AAED,wBAAgB,0BAA0B,IAAI,SAAS,2BAA2B,EAAE,CAEnF;AAED,wBAAgB,oCAAoC,CACnD,QAAQ,EAAE,uBAAuB,GAC/B,SAAS,2BAA2B,EAAE,CAIxC;AAED,wBAAgB,kCAAkC,CACjD,OAAO,GAAE,SAAS,2BAA2B,EAAiC,GAC5E,SAAS,2BAA2B,EAAE,CAWxC;AAED,wBAAgB,2CAA2C,CAC1D,OAAO,GAAE,SAAS,2BAA2B,EAAiC,GAC5E,SAAS,+BAA+B,EAAE,CAK5C;AAED,wBAAgB,8CAA8C,CAC7D,OAAO,GAAE,SAAS,2BAA2B,EAAiC,GAC5E,SAAS,+BAA+B,EAAE,CAW5C;AAED,wBAAgB,4CAA4C,CAC3D,OAAO,GAAE,SAAS,2BAA2B,EAAiC,GAC5E,SAAS,mBAAmB,EAAE,CAOhC;AAED,wBAAgB,qDAAqD,CACpE,OAAO,GAAE,SAAS,2BAA2B,EAAiC,GAC5E,SAAS,8CAA8C,EAAE,CA8B3D;AAMD,wBAAgB,iCAAiC,CAChD,OAAO,GAAE,SAAS,2BAA2B,EAAiC,GAC5E,4BAA4B,CAwB9B"}
@@ -63,7 +63,7 @@ export const MAESTRO_BUS_EVENT_CATALOG = {
63
63
  [MaestroBusEventType.ApprovalHit]: entry(MaestroBusEventType.ApprovalHit, "approval", "ApprovalHit", ["governance.maestro-approval-hit", "release.maestro-approval-gates"]),
64
64
  [MaestroBusEventType.SandboxViolation]: entry(MaestroBusEventType.SandboxViolation, "safety", "SandboxViolation", ["governance.maestro-sandbox-violation"]),
65
65
  [MaestroBusEventType.FirewallBlock]: entry(MaestroBusEventType.FirewallBlock, "safety", "FirewallBlock", ["governance.maestro-firewall-block"]),
66
- [MaestroBusEventType.ToolCallAttempted]: entry(MaestroBusEventType.ToolCallAttempted, "tool", "ToolCallAttempt", ["meter.maestro-tool-call-events"]),
66
+ [MaestroBusEventType.ToolCallAttempted]: entry(MaestroBusEventType.ToolCallAttempted, "tool", "ToolCallAttempt", ["meter.maestro-tool-call-events", "release.maestro-tool-attempt-gates"]),
67
67
  [MaestroBusEventType.ToolCallCompleted]: entry(MaestroBusEventType.ToolCallCompleted, "tool", "ToolCallResult", [
68
68
  "meter.maestro-tool-call-events",
69
69
  "release.maestro-tool-success-gates",
@@ -127,6 +127,7 @@ export const MAESTRO_RELEASE_GATE_EVENT_SUBJECTS_BY_CATEGORY = {
127
127
  install: [MaestroBusEventType.InstallCheckCompleted],
128
128
  session: [MaestroBusEventType.SessionClosed],
129
129
  tool: [
130
+ MaestroBusEventType.ToolCallAttempted,
130
131
  MaestroBusEventType.ToolCallCompleted,
131
132
  MaestroBusEventType.ToolCallFailed,
132
133
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"maestro-event-catalog.js","sourceRoot":"","sources":["../../src/telemetry/maestro-event-catalog.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,mBA8BX;AA9BD,WAAY,mBAAmB;IAC9B,0EAAmD,CAAA;IACnD,8EAAuD,CAAA;IACvD,0EAAmD,CAAA;IACnD,wEAAiD,CAAA;IACjD,uFAAgE,CAAA;IAChE,kEAA2C,CAAA;IAC3C,4EAAqD,CAAA;IACrD,sEAA+C,CAAA;IAC/C,+EAAwD,CAAA;IACxD,+EAAwD,CAAA;IACxD,yEAAkD,CAAA;IAClD,sEAA+C,CAAA;IAC/C,0EAAmD,CAAA;IACnD,mFAA4D,CAAA;IAC5D,uFAAgE,CAAA;IAChE,wEAAiD,CAAA;IACjD,oEAA6C,CAAA;IAC7C,wEAAiD,CAAA;IACjD,kEAA2C,CAAA;IAC3C,gFAAyD,CAAA;IACzD,2EAAoD,CAAA;IACpD,+EAAwD,CAAA;IACxD,2EAAoD,CAAA;IACpD,6EAAsD,CAAA;IACtD,uEAAgD,CAAA;IAChD,6EAAsD,CAAA;IACtD,2EAAoD,CAAA;IACpD,qFAA8D,CAAA;IAC9D,gEAAyC,CAAA;AAC1C,CAAC,EA9BW,mBAAmB,KAAnB,mBAAmB,QA8B9B;AA2BD,MAAM,aAAa,GAAG,sBAAsB,CAAC;AAE7C,SAAS,KAAK,CACb,IAAyB,EACzB,QAAiC,EACjC,YAAoB,EACpB,iBAAoC;IAEpC,OAAO;QACN,QAAQ;QACR,UAAU,EAAE,sCAAsC,YAAY,EAAE;QAChE,iBAAiB,EAAE,CAAC,aAAa,EAAE,GAAG,iBAAiB,CAAC,CAAC,IAAI,EAAE;QAC/D,YAAY,EAAE,kCAAkC,YAAY,EAAE;QAC9D,OAAO,EAAE,IAAI;QACb,IAAI;KACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACxC,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE,KAAK,CAC1C,mBAAmB,CAAC,cAAc,EAClC,SAAS,EACT,gBAAgB,EAChB;QACC,wCAAwC;QACxC,iCAAiC;KACjC,CACD;IACD,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAC5C,mBAAmB,CAAC,gBAAgB,EACpC,SAAS,EACT,gBAAgB,EAChB;QACC,wCAAwC;QACxC,iCAAiC;KACjC,CACD;IACD,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE,KAAK,CAC1C,mBAAmB,CAAC,cAAc,EAClC,SAAS,EACT,gBAAgB,EAChB;QACC,wCAAwC;QACxC,iCAAiC;KACjC,CACD;IACD,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAE,KAAK,CACzC,mBAAmB,CAAC,aAAa,EACjC,SAAS,EACT,gBAAgB,EAChB;QACC,wCAAwC;QACxC,iCAAiC;QACjC,qCAAqC;KACrC,CACD;IACD,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,EAAE,KAAK,CACjD,mBAAmB,CAAC,qBAAqB,EACzC,SAAS,EACT,qBAAqB,EACrB,CAAC,8BAA8B,EAAE,+BAA+B,CAAC,CACjE;IACD,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,KAAK,CACvC,mBAAmB,CAAC,WAAW,EAC/B,UAAU,EACV,aAAa,EACb,CAAC,iCAAiC,EAAE,gCAAgC,CAAC,CACrE;IACD,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAC5C,mBAAmB,CAAC,gBAAgB,EACpC,QAAQ,EACR,kBAAkB,EAClB,CAAC,sCAAsC,CAAC,CACxC;IACD,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAE,KAAK,CACzC,mBAAmB,CAAC,aAAa,EACjC,QAAQ,EACR,eAAe,EACf,CAAC,mCAAmC,CAAC,CACrC;IACD,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAC7C,mBAAmB,CAAC,iBAAiB,EACrC,MAAM,EACN,iBAAiB,EACjB,CAAC,gCAAgC,CAAC,CAClC;IACD,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAC7C,mBAAmB,CAAC,iBAAiB,EACrC,MAAM,EACN,gBAAgB,EAChB;QACC,gCAAgC;QAChC,oCAAoC;QACpC,oCAAoC;KACpC,CACD;IACD,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE,KAAK,CAC1C,mBAAmB,CAAC,cAAc,EAClC,MAAM,EACN,gBAAgB,EAChB;QACC,gCAAgC;QAChC,oCAAoC;QACpC,iCAAiC;KACjC,CACD;IACD,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAE,KAAK,CACzC,mBAAmB,CAAC,aAAa,EACjC,OAAO,EACP,cAAc,EACd;QACC,sBAAsB;QACtB,sBAAsB;QACtB,6BAA6B;KAC7B,CACD;IACD,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,KAAK,CAC3C,mBAAmB,CAAC,eAAe,EACnC,UAAU,EACV,iBAAiB,EACjB;QACC,2BAA2B;QAC3B,yBAAyB;QACzB,gCAAgC;KAChC,CACD;IACD,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAC/C,mBAAmB,CAAC,mBAAmB,EACvC,cAAc,EACd,oBAAoB,EACpB;QACC,8BAA8B;QAC9B,4BAA4B;QAC5B,oCAAoC;KACpC,CACD;IACD,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,EAAE,KAAK,CACjD,mBAAmB,CAAC,qBAAqB,EACzC,QAAQ,EACR,uBAAuB,EACvB,CAAC,yCAAyC,CAAC,CAC3C;IACD,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE,KAAK,CAC1C,mBAAmB,CAAC,cAAc,EAClC,WAAW,EACX,uBAAuB,EACvB,CAAC,iCAAiC,CAAC,CACnC;IACD,CAAC,mBAAmB,CAAC,YAAY,CAAC,EAAE,KAAK,CACxC,mBAAmB,CAAC,YAAY,EAChC,OAAO,EACP,iBAAiB,EACjB,CAAC,6BAA6B,CAAC,CAC/B;IACD,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE,KAAK,CAC1C,mBAAmB,CAAC,cAAc,EAClC,OAAO,EACP,cAAc,EACd,CAAC,6BAA6B,CAAC,CAC/B;IACD,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,KAAK,CACvC,mBAAmB,CAAC,WAAW,EAC/B,OAAO,EACP,cAAc,EACd,CAAC,6BAA6B,CAAC,CAC/B;IACD,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAC9C,mBAAmB,CAAC,kBAAkB,EACtC,OAAO,EACP,kBAAkB,EAClB,CAAC,oCAAoC,EAAE,mCAAmC,CAAC,CAC3E;IACD,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,KAAK,CAC3C,mBAAmB,CAAC,eAAe,EACnC,KAAK,EACL,2BAA2B,EAC3B,CAAC,+BAA+B,EAAE,+BAA+B,CAAC,CAClE;IACD,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAC7C,mBAAmB,CAAC,iBAAiB,EACrC,KAAK,EACL,2BAA2B,EAC3B,CAAC,+BAA+B,EAAE,+BAA+B,CAAC,CAClE;IACD,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,KAAK,CAC3C,mBAAmB,CAAC,eAAe,EACnC,KAAK,EACL,2BAA2B,EAC3B,CAAC,+BAA+B,EAAE,+BAA+B,CAAC,CAClE;IACD,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAC5C,mBAAmB,CAAC,gBAAgB,EACpC,KAAK,EACL,2BAA2B,EAC3B,CAAC,+BAA+B,EAAE,+BAA+B,CAAC,CAClE;IACD,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAE,KAAK,CACzC,mBAAmB,CAAC,aAAa,EACjC,KAAK,EACL,2BAA2B,EAC3B;QACC,+BAA+B;QAC/B,+BAA+B;QAC/B,mCAAmC;KACnC,CACD;IACD,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAC5C,mBAAmB,CAAC,gBAAgB,EACpC,KAAK,EACL,2BAA2B,EAC3B,CAAC,+BAA+B,EAAE,+BAA+B,CAAC,CAClE;IACD,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,KAAK,CAC3C,mBAAmB,CAAC,eAAe,EACnC,KAAK,EACL,2BAA2B,EAC3B,CAAC,+BAA+B,EAAE,+BAA+B,CAAC,CAClE;IACD,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,EAAE,KAAK,CAChD,mBAAmB,CAAC,oBAAoB,EACxC,KAAK,EACL,2BAA2B,EAC3B;QACC,+BAA+B;QAC/B,+BAA+B;QAC/B,oCAAoC;KACpC,CACD;IACD,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,KAAK,CACtC,mBAAmB,CAAC,UAAU,EAC9B,MAAM,EACN,kBAAkB,EAClB,CAAC,6BAA6B,EAAE,6BAA6B,CAAC,CAC9D;CAC2E,CAAC;AAE9E,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,qCAAqC,GAAG;IACpD,SAAS;IACT,SAAS;IACT,MAAM;IACN,UAAU;IACV,OAAO;IACP,UAAU;IACV,cAAc;CACwC,CAAC;AAKxD,MAAM,CAAC,MAAM,+CAA+C,GAAG;IAC9D,OAAO,EAAE,CAAC,mBAAmB,CAAC,qBAAqB,CAAC;IACpD,OAAO,EAAE,CAAC,mBAAmB,CAAC,aAAa,CAAC;IAC5C,IAAI,EAAE;QACL,mBAAmB,CAAC,iBAAiB;QACrC,mBAAmB,CAAC,cAAc;KAClC;IACD,QAAQ,EAAE,CAAC,mBAAmB,CAAC,WAAW,CAAC;IAC3C,KAAK,EAAE,CAAC,mBAAmB,CAAC,aAAa,CAAC;IAC1C,QAAQ,EAAE,CAAC,mBAAmB,CAAC,eAAe,CAAC;IAC/C,cAAc,EAAE,CAAC,mBAAmB,CAAC,mBAAmB,CAAC;CAGzD,CAAC;AAEF,MAAM,CAAC,MAAM,mCAAmC,GAAG,MAAM,CAAC,MAAM,CAC/D,+CAA+C,CAC/C,CAAC,IAAI,EAAoC,CAAC;AAqB3C,MAAM,UAAU,qBAAqB,CACpC,KAAa;IAEb,OAAO,uBAAuB,CAAC,QAAQ,CAAC,KAA4B,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC7C,IAAyB;IAEzB,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,0BAA0B;IACzC,OAAO,uBAAuB,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,oCAAoC,CACnD,QAAiC;IAEjC,OAAO,0BAA0B,EAAE,CAAC,MAAM,CACzC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CACtC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kCAAkC,CACjD,UAAkD,0BAA0B,EAAE;IAE9E,MAAM,qBAAqB,GAAG,IAAI,GAAG,CACpC,qCAAqC,CACrC,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,CACpB,CAAC,KAAK,EAAE,EAAE,CACT,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACzC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CACzC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAC/B,CACF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2CAA2C,CAC1D,UAAkD,0BAA0B,EAAE;IAE9E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1E,OAAO,qCAAqC,CAAC,MAAM,CAClD,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAC9C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8CAA8C,CAC7D,UAAkD,0BAA0B,EAAE;IAE9E,OAAO,qCAAqC,CAAC,MAAM,CAClD,CAAC,QAAQ,EAAE,EAAE,CACZ,CAAC,OAAO;SACN,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC;SAC9C,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACf,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CACzC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAC/B,CACD,CACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4CAA4C,CAC3D,UAAkD,0BAA0B,EAAE;IAE9E,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC/B,mCAAmC,CACnC,CAAC;IACF,OAAO,iCAAiC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAChE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAC3C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qDAAqD,CACpE,UAAkD,0BAA0B,EAAE;IAE9E,MAAM,KAAK,GAAG,iCAAiC,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO,qCAAqC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QACjE,MAAM,cAAc,GAA0B;YAC7C,GAAG,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC;SACrC,CAAC,IAAI,EAAE,CAAC;QACT,MAAM,gBAAgB,GAA0B;YAC/C,GAAG,+CAA+C,CAAC,QAAQ,CAAC;SAC5D,CAAC,IAAI,EAAE,CAAC;QACT,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACrD,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAC9C,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAC3C,CAAC;QACF,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAC/C,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAC7C,CAAC;QACF,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,OAAO,EAAE,CAAC;QACX,CAAC;QACD,OAAO;YACN;gBACC,cAAc;gBACd,QAAQ;gBACR,gBAAgB;gBAChB,eAAe;gBACf,kBAAkB;aAClB;SACD,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,MAAwB;IAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,iCAAiC,CAChD,UAAkD,0BAA0B,EAAE;IAE9E,MAAM,cAAc,GAAG,kCAAkC,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,kBAAkB,GAAG,EAG1B,CAAC;IACF,KAAK,MAAM,QAAQ,IAAI,qCAAqC,EAAE,CAAC;QAC9D,kBAAkB,CAAC,QAAQ,CAAC,GAAG,cAAc;aAC3C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC;aAC9C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO;QACN,UAAU,EAAE,qCAAqC;QACjD,WAAW,EAAE,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1E,iBAAiB,EAAE,YAAY,CAC9B,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAC1D;QACD,aAAa,EAAE,YAAY,CAC1B,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CACjD;QACD,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;QACtD,kBAAkB;KAClB,CAAC;AACH,CAAC","sourcesContent":["export enum MaestroBusEventType {\n\tSessionStarted = \"maestro.sessions.session.started\",\n\tSessionSuspended = \"maestro.sessions.session.suspended\",\n\tSessionResumed = \"maestro.sessions.session.resumed\",\n\tSessionClosed = \"maestro.sessions.session.closed\",\n\tInstallCheckCompleted = \"maestro.events.install_check.completed\",\n\tApprovalHit = \"maestro.events.approval_hit\",\n\tSandboxViolation = \"maestro.events.sandbox_violation\",\n\tFirewallBlock = \"maestro.events.firewall_block\",\n\tToolCallAttempted = \"maestro.events.tool_call.attempted\",\n\tToolCallCompleted = \"maestro.events.tool_call.completed\",\n\tToolCallFailed = \"maestro.events.tool_call.failed\",\n\tErrorCaptured = \"maestro.events.error.captured\",\n\tArtifactCreated = \"maestro.events.artifact.created\",\n\tFinalStatusReported = \"maestro.events.final_status.reported\",\n\tPromptVariantSelected = \"maestro.events.prompt_variant.selected\",\n\tContextLearned = \"maestro.events.context.learned\",\n\tSkillInvoked = \"maestro.events.skill.invoked\",\n\tSkillSucceeded = \"maestro.events.skill.succeeded\",\n\tSkillFailed = \"maestro.events.skill.failed\",\n\tSubagentDispatched = \"maestro.events.subagent.dispatched\",\n\tA2APeerSelected = \"maestro.events.a2a.peer.selected\",\n\tA2ATaskDispatched = \"maestro.events.a2a.task.dispatched\",\n\tA2ATaskProgress = \"maestro.events.a2a.task.progress\",\n\tA2ATaskCompleted = \"maestro.events.a2a.task.completed\",\n\tA2ATaskFailed = \"maestro.events.a2a.task.failed\",\n\tA2ATaskCancelled = \"maestro.events.a2a.task.cancelled\",\n\tA2APushReceived = \"maestro.events.a2a.push.received\",\n\tA2AEvidenceCompleted = \"maestro.events.a2a.evidence.completed\",\n\tEvalScored = \"maestro.events.eval.scored\",\n}\n\nexport type MaestroBusEventCategory =\n\t| \"session\"\n\t| \"install\"\n\t| \"agent\"\n\t| \"approval\"\n\t| \"safety\"\n\t| \"tool\"\n\t| \"error\"\n\t| \"artifact\"\n\t| \"final-status\"\n\t| \"prompt\"\n\t| \"knowledge\"\n\t| \"skill\"\n\t| \"a2a\"\n\t| \"eval\";\n\nexport interface MaestroBusEventCatalogEntry {\n\tcategory: MaestroBusEventCategory;\n\tdataSchema: string;\n\tplatformConsumers: readonly string[];\n\tprotoAnyType: string;\n\tsubject: MaestroBusEventType;\n\ttype: MaestroBusEventType;\n}\n\nconst auditConsumer = \"audit.maestro-events\";\n\nfunction entry(\n\ttype: MaestroBusEventType,\n\tcategory: MaestroBusEventCategory,\n\tprotoMessage: string,\n\tplatformConsumers: readonly string[],\n): MaestroBusEventCatalogEntry {\n\treturn {\n\t\tcategory,\n\t\tdataSchema: `buf.build/evalops/proto/maestro.v1.${protoMessage}`,\n\t\tplatformConsumers: [auditConsumer, ...platformConsumers].sort(),\n\t\tprotoAnyType: `type.googleapis.com/maestro.v1.${protoMessage}`,\n\t\tsubject: type,\n\t\ttype,\n\t};\n}\n\nexport const MAESTRO_BUS_EVENT_CATALOG = {\n\t[MaestroBusEventType.SessionStarted]: entry(\n\t\tMaestroBusEventType.SessionStarted,\n\t\t\"session\",\n\t\t\"MaestroSession\",\n\t\t[\n\t\t\t\"fermata.maestro-session-replay-context\",\n\t\t\t\"meter.maestro-session-lifecycle\",\n\t\t],\n\t),\n\t[MaestroBusEventType.SessionSuspended]: entry(\n\t\tMaestroBusEventType.SessionSuspended,\n\t\t\"session\",\n\t\t\"MaestroSession\",\n\t\t[\n\t\t\t\"fermata.maestro-session-replay-context\",\n\t\t\t\"meter.maestro-session-lifecycle\",\n\t\t],\n\t),\n\t[MaestroBusEventType.SessionResumed]: entry(\n\t\tMaestroBusEventType.SessionResumed,\n\t\t\"session\",\n\t\t\"MaestroSession\",\n\t\t[\n\t\t\t\"fermata.maestro-session-replay-context\",\n\t\t\t\"meter.maestro-session-lifecycle\",\n\t\t],\n\t),\n\t[MaestroBusEventType.SessionClosed]: entry(\n\t\tMaestroBusEventType.SessionClosed,\n\t\t\"session\",\n\t\t\"MaestroSession\",\n\t\t[\n\t\t\t\"fermata.maestro-session-replay-context\",\n\t\t\t\"meter.maestro-session-lifecycle\",\n\t\t\t\"release.maestro-session-final-state\",\n\t\t],\n\t),\n\t[MaestroBusEventType.InstallCheckCompleted]: entry(\n\t\tMaestroBusEventType.InstallCheckCompleted,\n\t\t\"install\",\n\t\t\"PackageInstallCheck\",\n\t\t[\"meter.maestro-install-checks\", \"release.maestro-install-smoke\"],\n\t),\n\t[MaestroBusEventType.ApprovalHit]: entry(\n\t\tMaestroBusEventType.ApprovalHit,\n\t\t\"approval\",\n\t\t\"ApprovalHit\",\n\t\t[\"governance.maestro-approval-hit\", \"release.maestro-approval-gates\"],\n\t),\n\t[MaestroBusEventType.SandboxViolation]: entry(\n\t\tMaestroBusEventType.SandboxViolation,\n\t\t\"safety\",\n\t\t\"SandboxViolation\",\n\t\t[\"governance.maestro-sandbox-violation\"],\n\t),\n\t[MaestroBusEventType.FirewallBlock]: entry(\n\t\tMaestroBusEventType.FirewallBlock,\n\t\t\"safety\",\n\t\t\"FirewallBlock\",\n\t\t[\"governance.maestro-firewall-block\"],\n\t),\n\t[MaestroBusEventType.ToolCallAttempted]: entry(\n\t\tMaestroBusEventType.ToolCallAttempted,\n\t\t\"tool\",\n\t\t\"ToolCallAttempt\",\n\t\t[\"meter.maestro-tool-call-events\"],\n\t),\n\t[MaestroBusEventType.ToolCallCompleted]: entry(\n\t\tMaestroBusEventType.ToolCallCompleted,\n\t\t\"tool\",\n\t\t\"ToolCallResult\",\n\t\t[\n\t\t\t\"meter.maestro-tool-call-events\",\n\t\t\t\"release.maestro-tool-success-gates\",\n\t\t\t\"skills.maestro-tool-call-completed\",\n\t\t],\n\t),\n\t[MaestroBusEventType.ToolCallFailed]: entry(\n\t\tMaestroBusEventType.ToolCallFailed,\n\t\t\"tool\",\n\t\t\"ToolCallResult\",\n\t\t[\n\t\t\t\"meter.maestro-tool-call-events\",\n\t\t\t\"release.maestro-tool-failure-gates\",\n\t\t\t\"skills.maestro-tool-call-failed\",\n\t\t],\n\t),\n\t[MaestroBusEventType.ErrorCaptured]: entry(\n\t\tMaestroBusEventType.ErrorCaptured,\n\t\t\"error\",\n\t\t\"MaestroError\",\n\t\t[\n\t\t\t\"audit.maestro-errors\",\n\t\t\t\"meter.maestro-errors\",\n\t\t\t\"release.maestro-error-gates\",\n\t\t],\n\t),\n\t[MaestroBusEventType.ArtifactCreated]: entry(\n\t\tMaestroBusEventType.ArtifactCreated,\n\t\t\"artifact\",\n\t\t\"MaestroArtifact\",\n\t\t[\n\t\t\t\"fermata.maestro-artifacts\",\n\t\t\t\"meter.maestro-artifacts\",\n\t\t\t\"release.maestro-artifact-gates\",\n\t\t],\n\t),\n\t[MaestroBusEventType.FinalStatusReported]: entry(\n\t\tMaestroBusEventType.FinalStatusReported,\n\t\t\"final-status\",\n\t\t\"MaestroFinalStatus\",\n\t\t[\n\t\t\t\"fermata.maestro-final-status\",\n\t\t\t\"meter.maestro-final-status\",\n\t\t\t\"release.maestro-final-status-gates\",\n\t\t],\n\t),\n\t[MaestroBusEventType.PromptVariantSelected]: entry(\n\t\tMaestroBusEventType.PromptVariantSelected,\n\t\t\"prompt\",\n\t\t\"PromptVariantSelected\",\n\t\t[\"prompts.maestro-prompt-variant-selected\"],\n\t),\n\t[MaestroBusEventType.ContextLearned]: entry(\n\t\tMaestroBusEventType.ContextLearned,\n\t\t\"knowledge\",\n\t\t\"MaestroLearnedContext\",\n\t\t[\"cerebro.maestro-learned-context\"],\n\t),\n\t[MaestroBusEventType.SkillInvoked]: entry(\n\t\tMaestroBusEventType.SkillInvoked,\n\t\t\"skill\",\n\t\t\"SkillInvocation\",\n\t\t[\"skills.maestro-skill-events\"],\n\t),\n\t[MaestroBusEventType.SkillSucceeded]: entry(\n\t\tMaestroBusEventType.SkillSucceeded,\n\t\t\"skill\",\n\t\t\"SkillOutcome\",\n\t\t[\"skills.maestro-skill-events\"],\n\t),\n\t[MaestroBusEventType.SkillFailed]: entry(\n\t\tMaestroBusEventType.SkillFailed,\n\t\t\"skill\",\n\t\t\"SkillOutcome\",\n\t\t[\"skills.maestro-skill-events\"],\n\t),\n\t[MaestroBusEventType.SubagentDispatched]: entry(\n\t\tMaestroBusEventType.SubagentDispatched,\n\t\t\"agent\",\n\t\t\"SubagentDispatch\",\n\t\t[\"agents.maestro-subagent-dispatches\", \"meter.maestro-subagent-dispatches\"],\n\t),\n\t[MaestroBusEventType.A2APeerSelected]: entry(\n\t\tMaestroBusEventType.A2APeerSelected,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\"a2a.maestro-delegation-events\", \"meter.maestro-a2a-delegations\"],\n\t),\n\t[MaestroBusEventType.A2ATaskDispatched]: entry(\n\t\tMaestroBusEventType.A2ATaskDispatched,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\"a2a.maestro-delegation-events\", \"meter.maestro-a2a-delegations\"],\n\t),\n\t[MaestroBusEventType.A2ATaskProgress]: entry(\n\t\tMaestroBusEventType.A2ATaskProgress,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\"a2a.maestro-delegation-events\", \"meter.maestro-a2a-delegations\"],\n\t),\n\t[MaestroBusEventType.A2ATaskCompleted]: entry(\n\t\tMaestroBusEventType.A2ATaskCompleted,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\"a2a.maestro-delegation-events\", \"meter.maestro-a2a-delegations\"],\n\t),\n\t[MaestroBusEventType.A2ATaskFailed]: entry(\n\t\tMaestroBusEventType.A2ATaskFailed,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\n\t\t\t\"a2a.maestro-delegation-events\",\n\t\t\t\"meter.maestro-a2a-delegations\",\n\t\t\t\"release.maestro-a2a-failure-gates\",\n\t\t],\n\t),\n\t[MaestroBusEventType.A2ATaskCancelled]: entry(\n\t\tMaestroBusEventType.A2ATaskCancelled,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\"a2a.maestro-delegation-events\", \"meter.maestro-a2a-delegations\"],\n\t),\n\t[MaestroBusEventType.A2APushReceived]: entry(\n\t\tMaestroBusEventType.A2APushReceived,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\"a2a.maestro-delegation-events\", \"meter.maestro-a2a-delegations\"],\n\t),\n\t[MaestroBusEventType.A2AEvidenceCompleted]: entry(\n\t\tMaestroBusEventType.A2AEvidenceCompleted,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\n\t\t\t\"a2a.maestro-delegation-events\",\n\t\t\t\"meter.maestro-a2a-delegations\",\n\t\t\t\"release.maestro-a2a-evidence-gates\",\n\t\t],\n\t),\n\t[MaestroBusEventType.EvalScored]: entry(\n\t\tMaestroBusEventType.EvalScored,\n\t\t\"eval\",\n\t\t\"MaestroEvalScore\",\n\t\t[\"fermata.maestro-eval-scored\", \"prompts.maestro-eval-scored\"],\n\t),\n} as const satisfies Record<MaestroBusEventType, MaestroBusEventCatalogEntry>;\n\nexport const MAESTRO_BUS_EVENT_TYPES = Object.values(MaestroBusEventType);\n\nexport const MAESTRO_RELEASE_GATE_EVENT_CATEGORIES = [\n\t\"install\",\n\t\"session\",\n\t\"tool\",\n\t\"approval\",\n\t\"error\",\n\t\"artifact\",\n\t\"final-status\",\n] as const satisfies readonly MaestroBusEventCategory[];\n\nexport type MaestroReleaseGateEventCategory =\n\t(typeof MAESTRO_RELEASE_GATE_EVENT_CATEGORIES)[number];\n\nexport const MAESTRO_RELEASE_GATE_EVENT_SUBJECTS_BY_CATEGORY = {\n\tinstall: [MaestroBusEventType.InstallCheckCompleted],\n\tsession: [MaestroBusEventType.SessionClosed],\n\ttool: [\n\t\tMaestroBusEventType.ToolCallCompleted,\n\t\tMaestroBusEventType.ToolCallFailed,\n\t],\n\tapproval: [MaestroBusEventType.ApprovalHit],\n\terror: [MaestroBusEventType.ErrorCaptured],\n\tartifact: [MaestroBusEventType.ArtifactCreated],\n\t\"final-status\": [MaestroBusEventType.FinalStatusReported],\n} as const satisfies Readonly<\n\tRecord<MaestroReleaseGateEventCategory, readonly MaestroBusEventType[]>\n>;\n\nexport const MAESTRO_RELEASE_GATE_EVENT_SUBJECTS = Object.values(\n\tMAESTRO_RELEASE_GATE_EVENT_SUBJECTS_BY_CATEGORY,\n).flat() as readonly MaestroBusEventType[];\n\nexport interface MaestroReleaseGateEventQuery {\n\tcategories: readonly MaestroReleaseGateEventCategory[];\n\tdataSchemas: readonly string[];\n\tplatformConsumers: readonly string[];\n\tprotoAnyTypes: readonly string[];\n\tsubjects: readonly MaestroBusEventType[];\n\tsubjectsByCategory: Readonly<\n\t\tRecord<MaestroReleaseGateEventCategory, readonly MaestroBusEventType[]>\n\t>;\n}\n\nexport interface MaestroReleaseGateEventSubjectCategoryMismatch {\n\tactualSubjects: readonly MaestroBusEventType[];\n\tcategory: MaestroReleaseGateEventCategory;\n\texpectedSubjects: readonly MaestroBusEventType[];\n\tmissingSubjects: readonly MaestroBusEventType[];\n\tunexpectedSubjects: readonly MaestroBusEventType[];\n}\n\nexport function isMaestroBusEventType(\n\tvalue: string,\n): value is MaestroBusEventType {\n\treturn MAESTRO_BUS_EVENT_TYPES.includes(value as MaestroBusEventType);\n}\n\nexport function getMaestroBusEventCatalogEntry(\n\ttype: MaestroBusEventType,\n): MaestroBusEventCatalogEntry {\n\treturn MAESTRO_BUS_EVENT_CATALOG[type];\n}\n\nexport function listMaestroBusEventCatalog(): readonly MaestroBusEventCatalogEntry[] {\n\treturn MAESTRO_BUS_EVENT_TYPES.map(getMaestroBusEventCatalogEntry);\n}\n\nexport function listMaestroBusEventCatalogByCategory(\n\tcategory: MaestroBusEventCategory,\n): readonly MaestroBusEventCatalogEntry[] {\n\treturn listMaestroBusEventCatalog().filter(\n\t\t(entry) => entry.category === category,\n\t);\n}\n\nexport function listMaestroReleaseGateEventCatalog(\n\tcatalog: readonly MaestroBusEventCatalogEntry[] = listMaestroBusEventCatalog(),\n): readonly MaestroBusEventCatalogEntry[] {\n\tconst releaseGateCategories = new Set<MaestroBusEventCategory>(\n\t\tMAESTRO_RELEASE_GATE_EVENT_CATEGORIES,\n\t);\n\treturn catalog.filter(\n\t\t(entry) =>\n\t\t\treleaseGateCategories.has(entry.category) &&\n\t\t\tentry.platformConsumers.some((consumer) =>\n\t\t\t\tconsumer.startsWith(\"release.\"),\n\t\t\t),\n\t);\n}\n\nexport function getMissingMaestroReleaseGateEventCategories(\n\tcatalog: readonly MaestroBusEventCatalogEntry[] = listMaestroBusEventCatalog(),\n): readonly MaestroReleaseGateEventCategory[] {\n\tconst coveredCategories = new Set(catalog.map((entry) => entry.category));\n\treturn MAESTRO_RELEASE_GATE_EVENT_CATEGORIES.filter(\n\t\t(category) => !coveredCategories.has(category),\n\t);\n}\n\nexport function getMissingMaestroReleaseGateConsumerCategories(\n\tcatalog: readonly MaestroBusEventCatalogEntry[] = listMaestroBusEventCatalog(),\n): readonly MaestroReleaseGateEventCategory[] {\n\treturn MAESTRO_RELEASE_GATE_EVENT_CATEGORIES.filter(\n\t\t(category) =>\n\t\t\t!catalog\n\t\t\t\t.filter((entry) => entry.category === category)\n\t\t\t\t.some((entry) =>\n\t\t\t\t\tentry.platformConsumers.some((consumer) =>\n\t\t\t\t\t\tconsumer.startsWith(\"release.\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t);\n}\n\nexport function getUnexpectedMaestroReleaseGateEventSubjects(\n\tcatalog: readonly MaestroBusEventCatalogEntry[] = listMaestroBusEventCatalog(),\n): readonly MaestroBusEventType[] {\n\tconst expectedSubjects = new Set<MaestroBusEventType>(\n\t\tMAESTRO_RELEASE_GATE_EVENT_SUBJECTS,\n\t);\n\treturn buildMaestroReleaseGateEventQuery(catalog).subjects.filter(\n\t\t(subject) => !expectedSubjects.has(subject),\n\t);\n}\n\nexport function getMismatchedMaestroReleaseGateEventSubjectCategories(\n\tcatalog: readonly MaestroBusEventCatalogEntry[] = listMaestroBusEventCatalog(),\n): readonly MaestroReleaseGateEventSubjectCategoryMismatch[] {\n\tconst query = buildMaestroReleaseGateEventQuery(catalog);\n\treturn MAESTRO_RELEASE_GATE_EVENT_CATEGORIES.flatMap((category) => {\n\t\tconst actualSubjects: MaestroBusEventType[] = [\n\t\t\t...query.subjectsByCategory[category],\n\t\t].sort();\n\t\tconst expectedSubjects: MaestroBusEventType[] = [\n\t\t\t...MAESTRO_RELEASE_GATE_EVENT_SUBJECTS_BY_CATEGORY[category],\n\t\t].sort();\n\t\tconst actualSubjectSet = new Set(actualSubjects);\n\t\tconst expectedSubjectSet = new Set(expectedSubjects);\n\t\tconst missingSubjects = expectedSubjects.filter(\n\t\t\t(subject) => !actualSubjectSet.has(subject),\n\t\t);\n\t\tconst unexpectedSubjects = actualSubjects.filter(\n\t\t\t(subject) => !expectedSubjectSet.has(subject),\n\t\t);\n\t\tif (missingSubjects.length === 0 && unexpectedSubjects.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\treturn [\n\t\t\t{\n\t\t\t\tactualSubjects,\n\t\t\t\tcategory,\n\t\t\t\texpectedSubjects,\n\t\t\t\tmissingSubjects,\n\t\t\t\tunexpectedSubjects,\n\t\t\t},\n\t\t];\n\t});\n}\n\nfunction uniqueSorted(values: Iterable<string>): readonly string[] {\n\treturn Array.from(new Set(values)).sort();\n}\n\nexport function buildMaestroReleaseGateEventQuery(\n\tcatalog: readonly MaestroBusEventCatalogEntry[] = listMaestroBusEventCatalog(),\n): MaestroReleaseGateEventQuery {\n\tconst releaseCatalog = listMaestroReleaseGateEventCatalog(catalog);\n\tconst subjectsByCategory = {} as Record<\n\t\tMaestroReleaseGateEventCategory,\n\t\treadonly MaestroBusEventType[]\n\t>;\n\tfor (const category of MAESTRO_RELEASE_GATE_EVENT_CATEGORIES) {\n\t\tsubjectsByCategory[category] = releaseCatalog\n\t\t\t.filter((entry) => entry.category === category)\n\t\t\t.map((entry) => entry.type);\n\t}\n\n\treturn {\n\t\tcategories: MAESTRO_RELEASE_GATE_EVENT_CATEGORIES,\n\t\tdataSchemas: uniqueSorted(releaseCatalog.map((entry) => entry.dataSchema)),\n\t\tplatformConsumers: uniqueSorted(\n\t\t\treleaseCatalog.flatMap((entry) => entry.platformConsumers),\n\t\t),\n\t\tprotoAnyTypes: uniqueSorted(\n\t\t\treleaseCatalog.map((entry) => entry.protoAnyType),\n\t\t),\n\t\tsubjects: releaseCatalog.map((entry) => entry.subject),\n\t\tsubjectsByCategory,\n\t};\n}\n"]}
1
+ {"version":3,"file":"maestro-event-catalog.js","sourceRoot":"","sources":["../../src/telemetry/maestro-event-catalog.ts"],"names":[],"mappings":"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","sourcesContent":["export enum MaestroBusEventType {\n\tSessionStarted = \"maestro.sessions.session.started\",\n\tSessionSuspended = \"maestro.sessions.session.suspended\",\n\tSessionResumed = \"maestro.sessions.session.resumed\",\n\tSessionClosed = \"maestro.sessions.session.closed\",\n\tInstallCheckCompleted = \"maestro.events.install_check.completed\",\n\tApprovalHit = \"maestro.events.approval_hit\",\n\tSandboxViolation = \"maestro.events.sandbox_violation\",\n\tFirewallBlock = \"maestro.events.firewall_block\",\n\tToolCallAttempted = \"maestro.events.tool_call.attempted\",\n\tToolCallCompleted = \"maestro.events.tool_call.completed\",\n\tToolCallFailed = \"maestro.events.tool_call.failed\",\n\tErrorCaptured = \"maestro.events.error.captured\",\n\tArtifactCreated = \"maestro.events.artifact.created\",\n\tFinalStatusReported = \"maestro.events.final_status.reported\",\n\tPromptVariantSelected = \"maestro.events.prompt_variant.selected\",\n\tContextLearned = \"maestro.events.context.learned\",\n\tSkillInvoked = \"maestro.events.skill.invoked\",\n\tSkillSucceeded = \"maestro.events.skill.succeeded\",\n\tSkillFailed = \"maestro.events.skill.failed\",\n\tSubagentDispatched = \"maestro.events.subagent.dispatched\",\n\tA2APeerSelected = \"maestro.events.a2a.peer.selected\",\n\tA2ATaskDispatched = \"maestro.events.a2a.task.dispatched\",\n\tA2ATaskProgress = \"maestro.events.a2a.task.progress\",\n\tA2ATaskCompleted = \"maestro.events.a2a.task.completed\",\n\tA2ATaskFailed = \"maestro.events.a2a.task.failed\",\n\tA2ATaskCancelled = \"maestro.events.a2a.task.cancelled\",\n\tA2APushReceived = \"maestro.events.a2a.push.received\",\n\tA2AEvidenceCompleted = \"maestro.events.a2a.evidence.completed\",\n\tEvalScored = \"maestro.events.eval.scored\",\n}\n\nexport type MaestroBusEventCategory =\n\t| \"session\"\n\t| \"install\"\n\t| \"agent\"\n\t| \"approval\"\n\t| \"safety\"\n\t| \"tool\"\n\t| \"error\"\n\t| \"artifact\"\n\t| \"final-status\"\n\t| \"prompt\"\n\t| \"knowledge\"\n\t| \"skill\"\n\t| \"a2a\"\n\t| \"eval\";\n\nexport interface MaestroBusEventCatalogEntry {\n\tcategory: MaestroBusEventCategory;\n\tdataSchema: string;\n\tplatformConsumers: readonly string[];\n\tprotoAnyType: string;\n\tsubject: MaestroBusEventType;\n\ttype: MaestroBusEventType;\n}\n\nconst auditConsumer = \"audit.maestro-events\";\n\nfunction entry(\n\ttype: MaestroBusEventType,\n\tcategory: MaestroBusEventCategory,\n\tprotoMessage: string,\n\tplatformConsumers: readonly string[],\n): MaestroBusEventCatalogEntry {\n\treturn {\n\t\tcategory,\n\t\tdataSchema: `buf.build/evalops/proto/maestro.v1.${protoMessage}`,\n\t\tplatformConsumers: [auditConsumer, ...platformConsumers].sort(),\n\t\tprotoAnyType: `type.googleapis.com/maestro.v1.${protoMessage}`,\n\t\tsubject: type,\n\t\ttype,\n\t};\n}\n\nexport const MAESTRO_BUS_EVENT_CATALOG = {\n\t[MaestroBusEventType.SessionStarted]: entry(\n\t\tMaestroBusEventType.SessionStarted,\n\t\t\"session\",\n\t\t\"MaestroSession\",\n\t\t[\n\t\t\t\"fermata.maestro-session-replay-context\",\n\t\t\t\"meter.maestro-session-lifecycle\",\n\t\t],\n\t),\n\t[MaestroBusEventType.SessionSuspended]: entry(\n\t\tMaestroBusEventType.SessionSuspended,\n\t\t\"session\",\n\t\t\"MaestroSession\",\n\t\t[\n\t\t\t\"fermata.maestro-session-replay-context\",\n\t\t\t\"meter.maestro-session-lifecycle\",\n\t\t],\n\t),\n\t[MaestroBusEventType.SessionResumed]: entry(\n\t\tMaestroBusEventType.SessionResumed,\n\t\t\"session\",\n\t\t\"MaestroSession\",\n\t\t[\n\t\t\t\"fermata.maestro-session-replay-context\",\n\t\t\t\"meter.maestro-session-lifecycle\",\n\t\t],\n\t),\n\t[MaestroBusEventType.SessionClosed]: entry(\n\t\tMaestroBusEventType.SessionClosed,\n\t\t\"session\",\n\t\t\"MaestroSession\",\n\t\t[\n\t\t\t\"fermata.maestro-session-replay-context\",\n\t\t\t\"meter.maestro-session-lifecycle\",\n\t\t\t\"release.maestro-session-final-state\",\n\t\t],\n\t),\n\t[MaestroBusEventType.InstallCheckCompleted]: entry(\n\t\tMaestroBusEventType.InstallCheckCompleted,\n\t\t\"install\",\n\t\t\"PackageInstallCheck\",\n\t\t[\"meter.maestro-install-checks\", \"release.maestro-install-smoke\"],\n\t),\n\t[MaestroBusEventType.ApprovalHit]: entry(\n\t\tMaestroBusEventType.ApprovalHit,\n\t\t\"approval\",\n\t\t\"ApprovalHit\",\n\t\t[\"governance.maestro-approval-hit\", \"release.maestro-approval-gates\"],\n\t),\n\t[MaestroBusEventType.SandboxViolation]: entry(\n\t\tMaestroBusEventType.SandboxViolation,\n\t\t\"safety\",\n\t\t\"SandboxViolation\",\n\t\t[\"governance.maestro-sandbox-violation\"],\n\t),\n\t[MaestroBusEventType.FirewallBlock]: entry(\n\t\tMaestroBusEventType.FirewallBlock,\n\t\t\"safety\",\n\t\t\"FirewallBlock\",\n\t\t[\"governance.maestro-firewall-block\"],\n\t),\n\t[MaestroBusEventType.ToolCallAttempted]: entry(\n\t\tMaestroBusEventType.ToolCallAttempted,\n\t\t\"tool\",\n\t\t\"ToolCallAttempt\",\n\t\t[\"meter.maestro-tool-call-events\", \"release.maestro-tool-attempt-gates\"],\n\t),\n\t[MaestroBusEventType.ToolCallCompleted]: entry(\n\t\tMaestroBusEventType.ToolCallCompleted,\n\t\t\"tool\",\n\t\t\"ToolCallResult\",\n\t\t[\n\t\t\t\"meter.maestro-tool-call-events\",\n\t\t\t\"release.maestro-tool-success-gates\",\n\t\t\t\"skills.maestro-tool-call-completed\",\n\t\t],\n\t),\n\t[MaestroBusEventType.ToolCallFailed]: entry(\n\t\tMaestroBusEventType.ToolCallFailed,\n\t\t\"tool\",\n\t\t\"ToolCallResult\",\n\t\t[\n\t\t\t\"meter.maestro-tool-call-events\",\n\t\t\t\"release.maestro-tool-failure-gates\",\n\t\t\t\"skills.maestro-tool-call-failed\",\n\t\t],\n\t),\n\t[MaestroBusEventType.ErrorCaptured]: entry(\n\t\tMaestroBusEventType.ErrorCaptured,\n\t\t\"error\",\n\t\t\"MaestroError\",\n\t\t[\n\t\t\t\"audit.maestro-errors\",\n\t\t\t\"meter.maestro-errors\",\n\t\t\t\"release.maestro-error-gates\",\n\t\t],\n\t),\n\t[MaestroBusEventType.ArtifactCreated]: entry(\n\t\tMaestroBusEventType.ArtifactCreated,\n\t\t\"artifact\",\n\t\t\"MaestroArtifact\",\n\t\t[\n\t\t\t\"fermata.maestro-artifacts\",\n\t\t\t\"meter.maestro-artifacts\",\n\t\t\t\"release.maestro-artifact-gates\",\n\t\t],\n\t),\n\t[MaestroBusEventType.FinalStatusReported]: entry(\n\t\tMaestroBusEventType.FinalStatusReported,\n\t\t\"final-status\",\n\t\t\"MaestroFinalStatus\",\n\t\t[\n\t\t\t\"fermata.maestro-final-status\",\n\t\t\t\"meter.maestro-final-status\",\n\t\t\t\"release.maestro-final-status-gates\",\n\t\t],\n\t),\n\t[MaestroBusEventType.PromptVariantSelected]: entry(\n\t\tMaestroBusEventType.PromptVariantSelected,\n\t\t\"prompt\",\n\t\t\"PromptVariantSelected\",\n\t\t[\"prompts.maestro-prompt-variant-selected\"],\n\t),\n\t[MaestroBusEventType.ContextLearned]: entry(\n\t\tMaestroBusEventType.ContextLearned,\n\t\t\"knowledge\",\n\t\t\"MaestroLearnedContext\",\n\t\t[\"cerebro.maestro-learned-context\"],\n\t),\n\t[MaestroBusEventType.SkillInvoked]: entry(\n\t\tMaestroBusEventType.SkillInvoked,\n\t\t\"skill\",\n\t\t\"SkillInvocation\",\n\t\t[\"skills.maestro-skill-events\"],\n\t),\n\t[MaestroBusEventType.SkillSucceeded]: entry(\n\t\tMaestroBusEventType.SkillSucceeded,\n\t\t\"skill\",\n\t\t\"SkillOutcome\",\n\t\t[\"skills.maestro-skill-events\"],\n\t),\n\t[MaestroBusEventType.SkillFailed]: entry(\n\t\tMaestroBusEventType.SkillFailed,\n\t\t\"skill\",\n\t\t\"SkillOutcome\",\n\t\t[\"skills.maestro-skill-events\"],\n\t),\n\t[MaestroBusEventType.SubagentDispatched]: entry(\n\t\tMaestroBusEventType.SubagentDispatched,\n\t\t\"agent\",\n\t\t\"SubagentDispatch\",\n\t\t[\"agents.maestro-subagent-dispatches\", \"meter.maestro-subagent-dispatches\"],\n\t),\n\t[MaestroBusEventType.A2APeerSelected]: entry(\n\t\tMaestroBusEventType.A2APeerSelected,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\"a2a.maestro-delegation-events\", \"meter.maestro-a2a-delegations\"],\n\t),\n\t[MaestroBusEventType.A2ATaskDispatched]: entry(\n\t\tMaestroBusEventType.A2ATaskDispatched,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\"a2a.maestro-delegation-events\", \"meter.maestro-a2a-delegations\"],\n\t),\n\t[MaestroBusEventType.A2ATaskProgress]: entry(\n\t\tMaestroBusEventType.A2ATaskProgress,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\"a2a.maestro-delegation-events\", \"meter.maestro-a2a-delegations\"],\n\t),\n\t[MaestroBusEventType.A2ATaskCompleted]: entry(\n\t\tMaestroBusEventType.A2ATaskCompleted,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\"a2a.maestro-delegation-events\", \"meter.maestro-a2a-delegations\"],\n\t),\n\t[MaestroBusEventType.A2ATaskFailed]: entry(\n\t\tMaestroBusEventType.A2ATaskFailed,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\n\t\t\t\"a2a.maestro-delegation-events\",\n\t\t\t\"meter.maestro-a2a-delegations\",\n\t\t\t\"release.maestro-a2a-failure-gates\",\n\t\t],\n\t),\n\t[MaestroBusEventType.A2ATaskCancelled]: entry(\n\t\tMaestroBusEventType.A2ATaskCancelled,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\"a2a.maestro-delegation-events\", \"meter.maestro-a2a-delegations\"],\n\t),\n\t[MaestroBusEventType.A2APushReceived]: entry(\n\t\tMaestroBusEventType.A2APushReceived,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\"a2a.maestro-delegation-events\", \"meter.maestro-a2a-delegations\"],\n\t),\n\t[MaestroBusEventType.A2AEvidenceCompleted]: entry(\n\t\tMaestroBusEventType.A2AEvidenceCompleted,\n\t\t\"a2a\",\n\t\t\"MaestroA2ADelegationEvent\",\n\t\t[\n\t\t\t\"a2a.maestro-delegation-events\",\n\t\t\t\"meter.maestro-a2a-delegations\",\n\t\t\t\"release.maestro-a2a-evidence-gates\",\n\t\t],\n\t),\n\t[MaestroBusEventType.EvalScored]: entry(\n\t\tMaestroBusEventType.EvalScored,\n\t\t\"eval\",\n\t\t\"MaestroEvalScore\",\n\t\t[\"fermata.maestro-eval-scored\", \"prompts.maestro-eval-scored\"],\n\t),\n} as const satisfies Record<MaestroBusEventType, MaestroBusEventCatalogEntry>;\n\nexport const MAESTRO_BUS_EVENT_TYPES = Object.values(MaestroBusEventType);\n\nexport const MAESTRO_RELEASE_GATE_EVENT_CATEGORIES = [\n\t\"install\",\n\t\"session\",\n\t\"tool\",\n\t\"approval\",\n\t\"error\",\n\t\"artifact\",\n\t\"final-status\",\n] as const satisfies readonly MaestroBusEventCategory[];\n\nexport type MaestroReleaseGateEventCategory =\n\t(typeof MAESTRO_RELEASE_GATE_EVENT_CATEGORIES)[number];\n\nexport const MAESTRO_RELEASE_GATE_EVENT_SUBJECTS_BY_CATEGORY = {\n\tinstall: [MaestroBusEventType.InstallCheckCompleted],\n\tsession: [MaestroBusEventType.SessionClosed],\n\ttool: [\n\t\tMaestroBusEventType.ToolCallAttempted,\n\t\tMaestroBusEventType.ToolCallCompleted,\n\t\tMaestroBusEventType.ToolCallFailed,\n\t],\n\tapproval: [MaestroBusEventType.ApprovalHit],\n\terror: [MaestroBusEventType.ErrorCaptured],\n\tartifact: [MaestroBusEventType.ArtifactCreated],\n\t\"final-status\": [MaestroBusEventType.FinalStatusReported],\n} as const satisfies Readonly<\n\tRecord<MaestroReleaseGateEventCategory, readonly MaestroBusEventType[]>\n>;\n\nexport const MAESTRO_RELEASE_GATE_EVENT_SUBJECTS = Object.values(\n\tMAESTRO_RELEASE_GATE_EVENT_SUBJECTS_BY_CATEGORY,\n).flat() as readonly MaestroBusEventType[];\n\nexport interface MaestroReleaseGateEventQuery {\n\tcategories: readonly MaestroReleaseGateEventCategory[];\n\tdataSchemas: readonly string[];\n\tplatformConsumers: readonly string[];\n\tprotoAnyTypes: readonly string[];\n\tsubjects: readonly MaestroBusEventType[];\n\tsubjectsByCategory: Readonly<\n\t\tRecord<MaestroReleaseGateEventCategory, readonly MaestroBusEventType[]>\n\t>;\n}\n\nexport interface MaestroReleaseGateEventSubjectCategoryMismatch {\n\tactualSubjects: readonly MaestroBusEventType[];\n\tcategory: MaestroReleaseGateEventCategory;\n\texpectedSubjects: readonly MaestroBusEventType[];\n\tmissingSubjects: readonly MaestroBusEventType[];\n\tunexpectedSubjects: readonly MaestroBusEventType[];\n}\n\nexport function isMaestroBusEventType(\n\tvalue: string,\n): value is MaestroBusEventType {\n\treturn MAESTRO_BUS_EVENT_TYPES.includes(value as MaestroBusEventType);\n}\n\nexport function getMaestroBusEventCatalogEntry(\n\ttype: MaestroBusEventType,\n): MaestroBusEventCatalogEntry {\n\treturn MAESTRO_BUS_EVENT_CATALOG[type];\n}\n\nexport function listMaestroBusEventCatalog(): readonly MaestroBusEventCatalogEntry[] {\n\treturn MAESTRO_BUS_EVENT_TYPES.map(getMaestroBusEventCatalogEntry);\n}\n\nexport function listMaestroBusEventCatalogByCategory(\n\tcategory: MaestroBusEventCategory,\n): readonly MaestroBusEventCatalogEntry[] {\n\treturn listMaestroBusEventCatalog().filter(\n\t\t(entry) => entry.category === category,\n\t);\n}\n\nexport function listMaestroReleaseGateEventCatalog(\n\tcatalog: readonly MaestroBusEventCatalogEntry[] = listMaestroBusEventCatalog(),\n): readonly MaestroBusEventCatalogEntry[] {\n\tconst releaseGateCategories = new Set<MaestroBusEventCategory>(\n\t\tMAESTRO_RELEASE_GATE_EVENT_CATEGORIES,\n\t);\n\treturn catalog.filter(\n\t\t(entry) =>\n\t\t\treleaseGateCategories.has(entry.category) &&\n\t\t\tentry.platformConsumers.some((consumer) =>\n\t\t\t\tconsumer.startsWith(\"release.\"),\n\t\t\t),\n\t);\n}\n\nexport function getMissingMaestroReleaseGateEventCategories(\n\tcatalog: readonly MaestroBusEventCatalogEntry[] = listMaestroBusEventCatalog(),\n): readonly MaestroReleaseGateEventCategory[] {\n\tconst coveredCategories = new Set(catalog.map((entry) => entry.category));\n\treturn MAESTRO_RELEASE_GATE_EVENT_CATEGORIES.filter(\n\t\t(category) => !coveredCategories.has(category),\n\t);\n}\n\nexport function getMissingMaestroReleaseGateConsumerCategories(\n\tcatalog: readonly MaestroBusEventCatalogEntry[] = listMaestroBusEventCatalog(),\n): readonly MaestroReleaseGateEventCategory[] {\n\treturn MAESTRO_RELEASE_GATE_EVENT_CATEGORIES.filter(\n\t\t(category) =>\n\t\t\t!catalog\n\t\t\t\t.filter((entry) => entry.category === category)\n\t\t\t\t.some((entry) =>\n\t\t\t\t\tentry.platformConsumers.some((consumer) =>\n\t\t\t\t\t\tconsumer.startsWith(\"release.\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t);\n}\n\nexport function getUnexpectedMaestroReleaseGateEventSubjects(\n\tcatalog: readonly MaestroBusEventCatalogEntry[] = listMaestroBusEventCatalog(),\n): readonly MaestroBusEventType[] {\n\tconst expectedSubjects = new Set<MaestroBusEventType>(\n\t\tMAESTRO_RELEASE_GATE_EVENT_SUBJECTS,\n\t);\n\treturn buildMaestroReleaseGateEventQuery(catalog).subjects.filter(\n\t\t(subject) => !expectedSubjects.has(subject),\n\t);\n}\n\nexport function getMismatchedMaestroReleaseGateEventSubjectCategories(\n\tcatalog: readonly MaestroBusEventCatalogEntry[] = listMaestroBusEventCatalog(),\n): readonly MaestroReleaseGateEventSubjectCategoryMismatch[] {\n\tconst query = buildMaestroReleaseGateEventQuery(catalog);\n\treturn MAESTRO_RELEASE_GATE_EVENT_CATEGORIES.flatMap((category) => {\n\t\tconst actualSubjects: MaestroBusEventType[] = [\n\t\t\t...query.subjectsByCategory[category],\n\t\t].sort();\n\t\tconst expectedSubjects: MaestroBusEventType[] = [\n\t\t\t...MAESTRO_RELEASE_GATE_EVENT_SUBJECTS_BY_CATEGORY[category],\n\t\t].sort();\n\t\tconst actualSubjectSet = new Set(actualSubjects);\n\t\tconst expectedSubjectSet = new Set(expectedSubjects);\n\t\tconst missingSubjects = expectedSubjects.filter(\n\t\t\t(subject) => !actualSubjectSet.has(subject),\n\t\t);\n\t\tconst unexpectedSubjects = actualSubjects.filter(\n\t\t\t(subject) => !expectedSubjectSet.has(subject),\n\t\t);\n\t\tif (missingSubjects.length === 0 && unexpectedSubjects.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\treturn [\n\t\t\t{\n\t\t\t\tactualSubjects,\n\t\t\t\tcategory,\n\t\t\t\texpectedSubjects,\n\t\t\t\tmissingSubjects,\n\t\t\t\tunexpectedSubjects,\n\t\t\t},\n\t\t];\n\t});\n}\n\nfunction uniqueSorted(values: Iterable<string>): readonly string[] {\n\treturn Array.from(new Set(values)).sort();\n}\n\nexport function buildMaestroReleaseGateEventQuery(\n\tcatalog: readonly MaestroBusEventCatalogEntry[] = listMaestroBusEventCatalog(),\n): MaestroReleaseGateEventQuery {\n\tconst releaseCatalog = listMaestroReleaseGateEventCatalog(catalog);\n\tconst subjectsByCategory = {} as Record<\n\t\tMaestroReleaseGateEventCategory,\n\t\treadonly MaestroBusEventType[]\n\t>;\n\tfor (const category of MAESTRO_RELEASE_GATE_EVENT_CATEGORIES) {\n\t\tsubjectsByCategory[category] = releaseCatalog\n\t\t\t.filter((entry) => entry.category === category)\n\t\t\t.map((entry) => entry.type);\n\t}\n\n\treturn {\n\t\tcategories: MAESTRO_RELEASE_GATE_EVENT_CATEGORIES,\n\t\tdataSchemas: uniqueSorted(releaseCatalog.map((entry) => entry.dataSchema)),\n\t\tplatformConsumers: uniqueSorted(\n\t\t\treleaseCatalog.flatMap((entry) => entry.platformConsumers),\n\t\t),\n\t\tprotoAnyTypes: uniqueSorted(\n\t\t\treleaseCatalog.map((entry) => entry.protoAnyType),\n\t\t),\n\t\tsubjects: releaseCatalog.map((entry) => entry.subject),\n\t\tsubjectsByCategory,\n\t};\n}\n"]}
@@ -308,7 +308,7 @@ export const findTool = createTool({
308
308
  throw new Error("Operation aborted");
309
309
  }
310
310
  const { pattern, path: searchDir, limit, includeHidden = true } = params;
311
- const fdPath = await ensureTool("fd", true);
311
+ const fdPath = await ensureTool("fd", true, signal);
312
312
  if (!fdPath) {
313
313
  return respond
314
314
  .error("fd is not available and could not be downloaded")
@@ -1 +1 @@
1
- {"version":3,"file":"find.js","sourceRoot":"","sources":["../../src/tools/find.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Find Tool - Fast File Discovery with fd\n *\n * This module provides a file search tool that uses `fd` (a fast alternative\n * to `find`) for discovering files by glob pattern. It respects .gitignore\n * files and falls back to glob when fd returns no results.\n *\n * ## Features\n *\n * - **Fast search**: Uses fd for performance on large codebases\n * - **Glob patterns**: Standard glob syntax (*.ts, **\\/*.json, etc.)\n * - **Git-aware**: Automatically respects .gitignore files\n * - **Hidden files**: Optional inclusion of dotfiles\n * - **Path handling**: Supports nested patterns with path separators\n * - **Auto-download**: Automatically downloads fd if not available\n *\n * ## Pattern Examples\n *\n * | Pattern | Matches |\n * |-------------------|----------------------------------|\n * | `*.ts` | TypeScript files in current dir |\n * | `**\\/*.spec.ts` | Test files anywhere |\n * | `src/**\\/*.json` | JSON files under src/ |\n *\n * ## Fallback Behavior\n *\n * If fd returns no results (which can happen with certain patterns on\n * some platforms), the tool falls back to Node.js glob matching to\n * ensure results are returned.\n *\n * ## Limits\n *\n * - Default limit: 1000 results\n * - Maximum buffer: 10MB\n * - Truncation indicator when limit is reached\n *\n * ## Example\n *\n * ```typescript\n * // Find all TypeScript test files\n * findTool.execute('call-id', {\n * pattern: '**\\/*.spec.ts',\n * path: 'src',\n * limit: 100,\n * });\n * ```\n *\n * @module tools/find\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport {\n\tdirname,\n\tisAbsolute,\n\trelative,\n\tresolve as resolvePath,\n\tsep,\n} from \"node:path\";\nimport { Type } from \"@sinclair/typebox\";\nimport { globSync } from \"glob\";\nimport { minimatch } from \"minimatch\";\nimport { getGitRoot } from \"../utils/git.js\";\nimport { expandTildePath } from \"../utils/path-expansion.js\";\nimport { createTool } from \"./tool-dsl.js\";\nimport { ensureTool } from \"./tools-manager.js\";\n\nconst findSchema = Type.Object({\n\tpattern: Type.String({\n\t\tdescription:\n\t\t\t\"Glob pattern to match files, e.g. '*.ts', '**/*.json', or 'src/**/*.spec.ts'\",\n\t}),\n\tpath: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Directory to search in (default: current directory)\",\n\t\t}),\n\t),\n\tlimit: Type.Optional(\n\t\tType.Number({\n\t\t\tdescription: \"Maximum number of results (default: 1000)\",\n\t\t}),\n\t),\n\tincludeHidden: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Include hidden files (default: true)\",\n\t\t}),\n\t),\n});\n\nconst DEFAULT_LIMIT = 1000;\nconst FD_IGNORE_FILE_NAMES = [\".gitignore\", \".ignore\", \".fdignore\"] as const;\n\ntype FindToolDetails = {\n\tcommand: string;\n\tcwd: string;\n\tfileCount: number;\n\ttruncated: boolean;\n};\n\n/** @internal */\nexport type GitignoreRule = {\n\tpattern: string;\n\tnegated: boolean;\n\tdirectoryOnly: boolean;\n\tmatchPrefix?: string;\n};\n\nfunction collectGitignoreFiles(searchPath: string): string[] {\n\tconst gitignoreFiles = new Set<string>();\n\tconst ancestorDirs: string[] = [];\n\tlet currentDir = searchPath;\n\twhile (true) {\n\t\tancestorDirs.push(currentDir);\n\t\tconst parentDir = dirname(currentDir);\n\t\tif (parentDir === currentDir) {\n\t\t\tbreak;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n\n\tfor (const dir of ancestorDirs.reverse()) {\n\t\tfor (const fileName of FD_IGNORE_FILE_NAMES) {\n\t\t\tconst ignoreFile = resolvePath(dir, fileName);\n\t\t\tif (existsSync(ignoreFile)) {\n\t\t\t\tgitignoreFiles.add(ignoreFile);\n\t\t\t}\n\t\t}\n\t}\n\n\ttry {\n\t\tfor (const fileName of FD_IGNORE_FILE_NAMES) {\n\t\t\tconst nestedGitignores = globSync(`**/${fileName}`, {\n\t\t\t\tcwd: searchPath,\n\t\t\t\tdot: true,\n\t\t\t\tabsolute: true,\n\t\t\t\tignore: [\"**/node_modules/**\", \"**/.git/**\"],\n\t\t\t});\n\t\t\tfor (const file of nestedGitignores) {\n\t\t\t\tgitignoreFiles.add(file);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Ignore glob errors\n\t}\n\n\treturn [...gitignoreFiles];\n}\n\nfunction toGlobPath(path: string): string {\n\treturn path.split(sep).join(\"/\");\n}\n\nfunction relativePathStaysInside(path: string): boolean {\n\treturn (\n\t\tpath === \"\" ||\n\t\t(path !== \"..\" && !path.startsWith(`..${sep}`) && !isAbsolute(path))\n\t);\n}\n\nfunction scopeGitignorePattern(\n\tsearchPath: string,\n\tignoreDir: string,\n\tpattern: string,\n\tanchored: boolean,\n): { matchPrefix?: string; pattern: string } | undefined {\n\tconst ignoreDirFromSearch = relative(searchPath, ignoreDir);\n\tif (relativePathStaysInside(ignoreDirFromSearch)) {\n\t\tconst relativeDir = toGlobPath(ignoreDirFromSearch);\n\t\tconst prefix = relativeDir && relativeDir !== \".\" ? `${relativeDir}/` : \"\";\n\t\treturn { pattern: `${prefix}${pattern}` };\n\t}\n\n\tconst searchPathFromIgnoreDir = relative(ignoreDir, searchPath);\n\tif (!relativePathStaysInside(searchPathFromIgnoreDir)) {\n\t\treturn undefined;\n\t}\n\n\tif (!anchored && !pattern.includes(\"/\")) {\n\t\treturn { pattern: `**/${pattern}` };\n\t}\n\tif (!anchored && pattern.startsWith(\"**/\")) {\n\t\treturn { pattern };\n\t}\n\n\tconst searchPrefix = toGlobPath(searchPathFromIgnoreDir);\n\tif (!searchPrefix || searchPrefix === \".\") {\n\t\treturn { pattern };\n\t}\n\tconst prefix = `${searchPrefix}/`;\n\treturn pattern.startsWith(prefix)\n\t\t? { pattern: pattern.slice(prefix.length) }\n\t\t: { matchPrefix: searchPrefix, pattern };\n}\n\nfunction stripUnescapedTrailingWhitespace(line: string): string {\n\tlet end = line.length;\n\twhile (end > 0 && /\\s/.test(line[end - 1] ?? \"\")) {\n\t\tlet slashCount = 0;\n\t\tfor (let index = end - 2; index >= 0 && line[index] === \"\\\\\"; index -= 1) {\n\t\t\tslashCount += 1;\n\t\t}\n\t\tif (slashCount % 2 === 1) {\n\t\t\tbreak;\n\t\t}\n\t\tend -= 1;\n\t}\n\treturn line.slice(0, end);\n}\n\nfunction unescapeGitignorePattern(pattern: string): string {\n\treturn pattern.replace(/\\\\([#!\\t ])/g, \"$1\");\n}\n\nfunction collectGitignoreRules(\n\tsearchPath: string,\n\tgitignoreFiles: string[],\n): GitignoreRule[] {\n\tconst rules: GitignoreRule[] = [];\n\n\tfor (const gitignorePath of gitignoreFiles) {\n\t\tconst ignoreDir = dirname(gitignorePath);\n\n\t\tlet contents: string;\n\t\ttry {\n\t\t\tcontents = readFileSync(gitignorePath, \"utf8\");\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const rawLine of contents.split(/\\r?\\n/)) {\n\t\t\tlet line = stripUnescapedTrailingWhitespace(rawLine);\n\t\t\tif (!line || line.startsWith(\"#\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst negated = line.startsWith(\"!\");\n\t\t\tif (negated) {\n\t\t\t\tline = line.slice(1);\n\t\t\t\tif (!line) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst anchored = line.startsWith(\"/\");\n\t\t\tconst directoryOnly = line.endsWith(\"/\");\n\t\t\tlet pattern = unescapeGitignorePattern(\n\t\t\t\tline.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\"),\n\t\t\t);\n\t\t\tif (!pattern) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!anchored && !pattern.includes(\"/\")) {\n\t\t\t\tpattern = `**/${pattern}`;\n\t\t\t}\n\n\t\t\tconst scopedPattern = scopeGitignorePattern(\n\t\t\t\tsearchPath,\n\t\t\t\tignoreDir,\n\t\t\t\tpattern,\n\t\t\t\tanchored,\n\t\t\t);\n\t\t\tif (!scopedPattern) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\trules.push({\n\t\t\t\tpattern: scopedPattern.pattern,\n\t\t\t\tmatchPrefix: scopedPattern.matchPrefix,\n\t\t\t\tnegated,\n\t\t\t\tdirectoryOnly,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn rules;\n}\n\nfunction pathIsDirectory(path: string): boolean {\n\ttry {\n\t\treturn statSync(path).isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction pathAncestors(path: string): string[] {\n\tconst parts = path.split(\"/\").filter(Boolean);\n\tconst ancestors: string[] = [];\n\tfor (let index = 1; index < parts.length; index += 1) {\n\t\tancestors.push(parts.slice(0, index).join(\"/\"));\n\t}\n\treturn ancestors;\n}\n\nfunction gitignoreRuleMatchPath(path: string, rule: GitignoreRule): string {\n\treturn rule.matchPrefix\n\t\t? path === \".\"\n\t\t\t? rule.matchPrefix\n\t\t\t: `${rule.matchPrefix}/${path}`\n\t\t: path;\n}\n\nfunction matchesGitignoreSubject(\n\tpath: string,\n\trule: GitignoreRule,\n\tisDirectory: boolean,\n): boolean {\n\tconst matchPath = gitignoreRuleMatchPath(path, rule);\n\tconst options = { dot: true, nonegate: true };\n\tif (rule.directoryOnly) {\n\t\treturn isDirectory && minimatch(matchPath, rule.pattern, options);\n\t}\n\treturn minimatch(matchPath, rule.pattern, options);\n}\n\nfunction evaluateGitignoreSubject(\n\tpath: string,\n\trules: GitignoreRule[],\n\tisDirectory: boolean,\n): boolean {\n\tlet ignored = false;\n\tfor (const rule of rules) {\n\t\tif (matchesGitignoreSubject(path, rule, isDirectory)) {\n\t\t\tignored = !rule.negated;\n\t\t}\n\t}\n\treturn ignored;\n}\n\n/** @internal */\nexport function isIgnoredByGitignoreRules(\n\trelativePath: string,\n\trules: GitignoreRule[],\n\tisDirectory = false,\n): boolean {\n\tconst normalizedPath = toGlobPath(relativePath);\n\tfor (const ancestor of pathAncestors(normalizedPath)) {\n\t\tif (evaluateGitignoreSubject(ancestor, rules, true)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn evaluateGitignoreSubject(normalizedPath, rules, isDirectory);\n}\n\nfunction constrainGlobMatches(\n\tmatches: string[],\n\tsearchPath: string,\n\trules: GitignoreRule[],\n): string[] {\n\tconst searchRoot = searchPath.endsWith(sep)\n\t\t? searchPath\n\t\t: `${searchPath}${sep}`;\n\tconst constrained: string[] = [];\n\tfor (const match of matches) {\n\t\tconst resolved = resolvePath(match);\n\t\tif (resolved !== searchPath && !resolved.startsWith(searchRoot)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst relativeMatch = relative(searchPath, resolved) || \".\";\n\t\tif (\n\t\t\tisIgnoredByGitignoreRules(relativeMatch, rules, pathIsDirectory(resolved))\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tconstrained.push(resolved);\n\t}\n\treturn constrained;\n}\n\n/** @internal */\nexport function getFindGlobPatterns(pattern: string): string[] {\n\tconst patterns = [pattern];\n\tconst rootEquivalent = pattern.match(/^\\*\\*[\\\\/](.+)$/u)?.[1];\n\tif (rootEquivalent && rootEquivalent !== pattern) {\n\t\tpatterns.push(rootEquivalent);\n\t}\n\treturn patterns;\n}\n\nfunction findGlobMatches(\n\tpattern: string,\n\tsearchPath: string,\n\tincludeHidden: boolean,\n): string[] {\n\tconst matches = new Set<string>();\n\tfor (const globPattern of getFindGlobPatterns(pattern)) {\n\t\tfor (const match of globSync(globPattern, {\n\t\t\tcwd: searchPath,\n\t\t\tdot: includeHidden,\n\t\t\tnodir: false,\n\t\t\tabsolute: true,\n\t\t})) {\n\t\t\tmatches.add(resolvePath(match));\n\t\t}\n\t}\n\treturn [...matches];\n}\n\nexport const findTool = createTool<typeof findSchema, FindToolDetails>({\n\tname: \"find\",\n\tlabel: \"find\",\n\tdescription:\n\t\t\"Search for files by glob pattern using fd. Returns matching file paths relative to the search directory. Respects .gitignore. Use this for fast file discovery across large codebases.\",\n\tschema: findSchema,\n\tasync run(params, { signal, respond }) {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new Error(\"Operation aborted\");\n\t\t}\n\n\t\tconst { pattern, path: searchDir, limit, includeHidden = true } = params;\n\n\t\tconst fdPath = await ensureTool(\"fd\", true);\n\t\tif (!fdPath) {\n\t\t\treturn respond\n\t\t\t\t.error(\"fd is not available and could not be downloaded\")\n\t\t\t\t.detail({\n\t\t\t\t\tcommand: \"fd\",\n\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\tfileCount: 0,\n\t\t\t\t\ttruncated: false,\n\t\t\t\t});\n\t\t}\n\n\t\tconst searchPath = resolvePath(expandTildePath(searchDir || \".\"));\n\t\tconst effectiveLimit = limit ?? DEFAULT_LIMIT;\n\n\t\tconst args: string[] = [\n\t\t\t\"--glob\",\n\t\t\t\"--color=never\",\n\t\t\t\"--max-results\",\n\t\t\tString(effectiveLimit),\n\t\t];\n\n\t\t// If pattern includes path separators, match against the full path so nested globs work.\n\t\tif (pattern.includes(\"/\") || pattern.includes(\"\\\\\")) {\n\t\t\targs.push(\"--full-path\");\n\t\t}\n\n\t\tif (includeHidden) {\n\t\t\targs.push(\"--hidden\");\n\t\t}\n\n\t\tconst gitRoot = getGitRoot(searchPath);\n\t\tconst gitignoreFiles = gitRoot ? [] : collectGitignoreFiles(searchPath);\n\t\tconst gitignoreRules = collectGitignoreRules(searchPath, gitignoreFiles);\n\t\tif (gitRoot) {\n\t\t\t// Force fd to honor repo-native ignore rules even if user config disables\n\t\t\t// VCS ignores, while keeping anchored patterns scoped to the repo root.\n\t\t\targs.push(\"--ignore-vcs\");\n\t\t} else {\n\t\t\t// Let fd discover .gitignore files in their native directories instead of\n\t\t\t// re-scoping them as current-directory --ignore-file inputs.\n\t\t\targs.push(\"--no-require-git\");\n\t\t}\n\n\t\targs.push(pattern);\n\n\t\tconst command = [fdPath, ...args].join(\" \");\n\n\t\tconst result = spawnSync(fdPath, args, {\n\t\t\tencoding: \"utf-8\",\n\t\t\tmaxBuffer: 10 * 1024 * 1024,\n\t\t\tcwd: searchPath,\n\t\t});\n\n\t\tif (signal?.aborted) {\n\t\t\tthrow new Error(\"Operation aborted\");\n\t\t}\n\n\t\tif (result.error) {\n\t\t\treturn respond\n\t\t\t\t.error(`Failed to run fd: ${result.error.message}`)\n\t\t\t\t.detail({ command, cwd: searchPath, fileCount: 0, truncated: false });\n\t\t}\n\n\t\tlet output = result.stdout ?? \"\";\n\n\t\tif (result.status !== 0 && !output) {\n\t\t\tconst errorMsg =\n\t\t\t\tresult.stderr?.trim() || `fd exited with code ${result.status}`;\n\t\t\treturn respond\n\t\t\t\t.error(errorMsg)\n\t\t\t\t.detail({ command, cwd: searchPath, fileCount: 0, truncated: false });\n\t\t}\n\n\t\tif (!output) {\n\t\t\t// Fallback to globbing when fd returns nothing (handles patterns with subdirectories on some platforms)\n\t\t\tconst globMatches = findGlobMatches(pattern, searchPath, includeHidden);\n\t\t\tconst constrained = constrainGlobMatches(\n\t\t\t\tglobMatches,\n\t\t\t\tsearchPath,\n\t\t\t\tgitignoreRules,\n\t\t\t);\n\n\t\t\tif (constrained.length > 0) {\n\t\t\t\tconst limited = constrained.slice(0, effectiveLimit);\n\t\t\t\tconst truncated = constrained.length > effectiveLimit;\n\t\t\t\tconst text = limited\n\t\t\t\t\t.map((abs) => relative(searchPath, abs) || \".\")\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\treturn respond\n\t\t\t\t\t.text(\n\t\t\t\t\t\ttruncated\n\t\t\t\t\t\t\t? `${text}\\n\\n(truncated, ${effectiveLimit} results shown)`\n\t\t\t\t\t\t\t: text,\n\t\t\t\t\t)\n\t\t\t\t\t.detail({\n\t\t\t\t\t\tcommand,\n\t\t\t\t\t\tcwd: searchPath,\n\t\t\t\t\t\tfileCount: constrained.length,\n\t\t\t\t\t\ttruncated,\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn respond\n\t\t\t\t.text(\"No files found matching pattern\")\n\t\t\t\t.detail({ command, cwd: searchPath, fileCount: 0, truncated: false });\n\t\t}\n\n\t\tconst lines = output.split(\"\\n\");\n\t\tconst relativized: string[] = [];\n\n\t\tfor (const rawLine of lines) {\n\t\t\tconst line = rawLine.replace(/\\r$/, \"\");\n\t\t\tif (!line) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet relativePath = line;\n\t\t\tif (line.endsWith(\"\\\\\")) {\n\t\t\t\t// Normalize Windows-style trailing backslash to a single forward slash\n\t\t\t\trelativePath = `${line.slice(0, -1)}/`;\n\t\t\t}\n\n\t\t\tif (relativePath) {\n\t\t\t\tif (\n\t\t\t\t\t!gitRoot &&\n\t\t\t\t\tisIgnoredByGitignoreRules(\n\t\t\t\t\t\trelativePath,\n\t\t\t\t\t\tgitignoreRules,\n\t\t\t\t\t\tpathIsDirectory(resolvePath(searchPath, relativePath)),\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\trelativized.push(relativePath);\n\t\t\t}\n\t\t}\n\n\t\tif (!gitRoot && pattern.includes(\"**/\")) {\n\t\t\tconst searchRoot = searchPath.endsWith(sep)\n\t\t\t\t? searchPath\n\t\t\t\t: `${searchPath}${sep}`;\n\t\t\tconst seen = new Set(relativized);\n\t\t\tfor (const match of findGlobMatches(pattern, searchPath, includeHidden)) {\n\t\t\t\tconst resolved = resolvePath(match);\n\t\t\t\tif (resolved !== searchPath && !resolved.startsWith(searchRoot)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst relativeMatch = relative(searchPath, resolved) || \".\";\n\t\t\t\tif (\n\t\t\t\t\tisIgnoredByGitignoreRules(\n\t\t\t\t\t\trelativeMatch,\n\t\t\t\t\t\tgitignoreRules,\n\t\t\t\t\t\tpathIsDirectory(resolved),\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!seen.has(relativeMatch)) {\n\t\t\t\t\tseen.add(relativeMatch);\n\t\t\t\t\trelativized.push(relativeMatch);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\trelativized.sort();\n\t\toutput = relativized.slice(0, effectiveLimit).join(\"\\n\");\n\t\tconst count = relativized.length;\n\t\tconst truncated = count >= effectiveLimit;\n\t\tif (truncated) {\n\t\t\toutput += `\\n\\n(truncated, ${effectiveLimit} results shown)`;\n\t\t}\n\n\t\treturn respond\n\t\t\t.text(output)\n\t\t\t.detail({ command, cwd: searchPath, fileCount: count, truncated });\n\t},\n});\n"]}
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../../src/tools/find.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Find Tool - Fast File Discovery with fd\n *\n * This module provides a file search tool that uses `fd` (a fast alternative\n * to `find`) for discovering files by glob pattern. It respects .gitignore\n * files and falls back to glob when fd returns no results.\n *\n * ## Features\n *\n * - **Fast search**: Uses fd for performance on large codebases\n * - **Glob patterns**: Standard glob syntax (*.ts, **\\/*.json, etc.)\n * - **Git-aware**: Automatically respects .gitignore files\n * - **Hidden files**: Optional inclusion of dotfiles\n * - **Path handling**: Supports nested patterns with path separators\n * - **Auto-download**: Automatically downloads fd if not available\n *\n * ## Pattern Examples\n *\n * | Pattern | Matches |\n * |-------------------|----------------------------------|\n * | `*.ts` | TypeScript files in current dir |\n * | `**\\/*.spec.ts` | Test files anywhere |\n * | `src/**\\/*.json` | JSON files under src/ |\n *\n * ## Fallback Behavior\n *\n * If fd returns no results (which can happen with certain patterns on\n * some platforms), the tool falls back to Node.js glob matching to\n * ensure results are returned.\n *\n * ## Limits\n *\n * - Default limit: 1000 results\n * - Maximum buffer: 10MB\n * - Truncation indicator when limit is reached\n *\n * ## Example\n *\n * ```typescript\n * // Find all TypeScript test files\n * findTool.execute('call-id', {\n * pattern: '**\\/*.spec.ts',\n * path: 'src',\n * limit: 100,\n * });\n * ```\n *\n * @module tools/find\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport {\n\tdirname,\n\tisAbsolute,\n\trelative,\n\tresolve as resolvePath,\n\tsep,\n} from \"node:path\";\nimport { Type } from \"@sinclair/typebox\";\nimport { globSync } from \"glob\";\nimport { minimatch } from \"minimatch\";\nimport { getGitRoot } from \"../utils/git.js\";\nimport { expandTildePath } from \"../utils/path-expansion.js\";\nimport { createTool } from \"./tool-dsl.js\";\nimport { ensureTool } from \"./tools-manager.js\";\n\nconst findSchema = Type.Object({\n\tpattern: Type.String({\n\t\tdescription:\n\t\t\t\"Glob pattern to match files, e.g. '*.ts', '**/*.json', or 'src/**/*.spec.ts'\",\n\t}),\n\tpath: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Directory to search in (default: current directory)\",\n\t\t}),\n\t),\n\tlimit: Type.Optional(\n\t\tType.Number({\n\t\t\tdescription: \"Maximum number of results (default: 1000)\",\n\t\t}),\n\t),\n\tincludeHidden: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Include hidden files (default: true)\",\n\t\t}),\n\t),\n});\n\nconst DEFAULT_LIMIT = 1000;\nconst FD_IGNORE_FILE_NAMES = [\".gitignore\", \".ignore\", \".fdignore\"] as const;\n\ntype FindToolDetails = {\n\tcommand: string;\n\tcwd: string;\n\tfileCount: number;\n\ttruncated: boolean;\n};\n\n/** @internal */\nexport type GitignoreRule = {\n\tpattern: string;\n\tnegated: boolean;\n\tdirectoryOnly: boolean;\n\tmatchPrefix?: string;\n};\n\nfunction collectGitignoreFiles(searchPath: string): string[] {\n\tconst gitignoreFiles = new Set<string>();\n\tconst ancestorDirs: string[] = [];\n\tlet currentDir = searchPath;\n\twhile (true) {\n\t\tancestorDirs.push(currentDir);\n\t\tconst parentDir = dirname(currentDir);\n\t\tif (parentDir === currentDir) {\n\t\t\tbreak;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n\n\tfor (const dir of ancestorDirs.reverse()) {\n\t\tfor (const fileName of FD_IGNORE_FILE_NAMES) {\n\t\t\tconst ignoreFile = resolvePath(dir, fileName);\n\t\t\tif (existsSync(ignoreFile)) {\n\t\t\t\tgitignoreFiles.add(ignoreFile);\n\t\t\t}\n\t\t}\n\t}\n\n\ttry {\n\t\tfor (const fileName of FD_IGNORE_FILE_NAMES) {\n\t\t\tconst nestedGitignores = globSync(`**/${fileName}`, {\n\t\t\t\tcwd: searchPath,\n\t\t\t\tdot: true,\n\t\t\t\tabsolute: true,\n\t\t\t\tignore: [\"**/node_modules/**\", \"**/.git/**\"],\n\t\t\t});\n\t\t\tfor (const file of nestedGitignores) {\n\t\t\t\tgitignoreFiles.add(file);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Ignore glob errors\n\t}\n\n\treturn [...gitignoreFiles];\n}\n\nfunction toGlobPath(path: string): string {\n\treturn path.split(sep).join(\"/\");\n}\n\nfunction relativePathStaysInside(path: string): boolean {\n\treturn (\n\t\tpath === \"\" ||\n\t\t(path !== \"..\" && !path.startsWith(`..${sep}`) && !isAbsolute(path))\n\t);\n}\n\nfunction scopeGitignorePattern(\n\tsearchPath: string,\n\tignoreDir: string,\n\tpattern: string,\n\tanchored: boolean,\n): { matchPrefix?: string; pattern: string } | undefined {\n\tconst ignoreDirFromSearch = relative(searchPath, ignoreDir);\n\tif (relativePathStaysInside(ignoreDirFromSearch)) {\n\t\tconst relativeDir = toGlobPath(ignoreDirFromSearch);\n\t\tconst prefix = relativeDir && relativeDir !== \".\" ? `${relativeDir}/` : \"\";\n\t\treturn { pattern: `${prefix}${pattern}` };\n\t}\n\n\tconst searchPathFromIgnoreDir = relative(ignoreDir, searchPath);\n\tif (!relativePathStaysInside(searchPathFromIgnoreDir)) {\n\t\treturn undefined;\n\t}\n\n\tif (!anchored && !pattern.includes(\"/\")) {\n\t\treturn { pattern: `**/${pattern}` };\n\t}\n\tif (!anchored && pattern.startsWith(\"**/\")) {\n\t\treturn { pattern };\n\t}\n\n\tconst searchPrefix = toGlobPath(searchPathFromIgnoreDir);\n\tif (!searchPrefix || searchPrefix === \".\") {\n\t\treturn { pattern };\n\t}\n\tconst prefix = `${searchPrefix}/`;\n\treturn pattern.startsWith(prefix)\n\t\t? { pattern: pattern.slice(prefix.length) }\n\t\t: { matchPrefix: searchPrefix, pattern };\n}\n\nfunction stripUnescapedTrailingWhitespace(line: string): string {\n\tlet end = line.length;\n\twhile (end > 0 && /\\s/.test(line[end - 1] ?? \"\")) {\n\t\tlet slashCount = 0;\n\t\tfor (let index = end - 2; index >= 0 && line[index] === \"\\\\\"; index -= 1) {\n\t\t\tslashCount += 1;\n\t\t}\n\t\tif (slashCount % 2 === 1) {\n\t\t\tbreak;\n\t\t}\n\t\tend -= 1;\n\t}\n\treturn line.slice(0, end);\n}\n\nfunction unescapeGitignorePattern(pattern: string): string {\n\treturn pattern.replace(/\\\\([#!\\t ])/g, \"$1\");\n}\n\nfunction collectGitignoreRules(\n\tsearchPath: string,\n\tgitignoreFiles: string[],\n): GitignoreRule[] {\n\tconst rules: GitignoreRule[] = [];\n\n\tfor (const gitignorePath of gitignoreFiles) {\n\t\tconst ignoreDir = dirname(gitignorePath);\n\n\t\tlet contents: string;\n\t\ttry {\n\t\t\tcontents = readFileSync(gitignorePath, \"utf8\");\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const rawLine of contents.split(/\\r?\\n/)) {\n\t\t\tlet line = stripUnescapedTrailingWhitespace(rawLine);\n\t\t\tif (!line || line.startsWith(\"#\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst negated = line.startsWith(\"!\");\n\t\t\tif (negated) {\n\t\t\t\tline = line.slice(1);\n\t\t\t\tif (!line) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst anchored = line.startsWith(\"/\");\n\t\t\tconst directoryOnly = line.endsWith(\"/\");\n\t\t\tlet pattern = unescapeGitignorePattern(\n\t\t\t\tline.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\"),\n\t\t\t);\n\t\t\tif (!pattern) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!anchored && !pattern.includes(\"/\")) {\n\t\t\t\tpattern = `**/${pattern}`;\n\t\t\t}\n\n\t\t\tconst scopedPattern = scopeGitignorePattern(\n\t\t\t\tsearchPath,\n\t\t\t\tignoreDir,\n\t\t\t\tpattern,\n\t\t\t\tanchored,\n\t\t\t);\n\t\t\tif (!scopedPattern) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\trules.push({\n\t\t\t\tpattern: scopedPattern.pattern,\n\t\t\t\tmatchPrefix: scopedPattern.matchPrefix,\n\t\t\t\tnegated,\n\t\t\t\tdirectoryOnly,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn rules;\n}\n\nfunction pathIsDirectory(path: string): boolean {\n\ttry {\n\t\treturn statSync(path).isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction pathAncestors(path: string): string[] {\n\tconst parts = path.split(\"/\").filter(Boolean);\n\tconst ancestors: string[] = [];\n\tfor (let index = 1; index < parts.length; index += 1) {\n\t\tancestors.push(parts.slice(0, index).join(\"/\"));\n\t}\n\treturn ancestors;\n}\n\nfunction gitignoreRuleMatchPath(path: string, rule: GitignoreRule): string {\n\treturn rule.matchPrefix\n\t\t? path === \".\"\n\t\t\t? rule.matchPrefix\n\t\t\t: `${rule.matchPrefix}/${path}`\n\t\t: path;\n}\n\nfunction matchesGitignoreSubject(\n\tpath: string,\n\trule: GitignoreRule,\n\tisDirectory: boolean,\n): boolean {\n\tconst matchPath = gitignoreRuleMatchPath(path, rule);\n\tconst options = { dot: true, nonegate: true };\n\tif (rule.directoryOnly) {\n\t\treturn isDirectory && minimatch(matchPath, rule.pattern, options);\n\t}\n\treturn minimatch(matchPath, rule.pattern, options);\n}\n\nfunction evaluateGitignoreSubject(\n\tpath: string,\n\trules: GitignoreRule[],\n\tisDirectory: boolean,\n): boolean {\n\tlet ignored = false;\n\tfor (const rule of rules) {\n\t\tif (matchesGitignoreSubject(path, rule, isDirectory)) {\n\t\t\tignored = !rule.negated;\n\t\t}\n\t}\n\treturn ignored;\n}\n\n/** @internal */\nexport function isIgnoredByGitignoreRules(\n\trelativePath: string,\n\trules: GitignoreRule[],\n\tisDirectory = false,\n): boolean {\n\tconst normalizedPath = toGlobPath(relativePath);\n\tfor (const ancestor of pathAncestors(normalizedPath)) {\n\t\tif (evaluateGitignoreSubject(ancestor, rules, true)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn evaluateGitignoreSubject(normalizedPath, rules, isDirectory);\n}\n\nfunction constrainGlobMatches(\n\tmatches: string[],\n\tsearchPath: string,\n\trules: GitignoreRule[],\n): string[] {\n\tconst searchRoot = searchPath.endsWith(sep)\n\t\t? searchPath\n\t\t: `${searchPath}${sep}`;\n\tconst constrained: string[] = [];\n\tfor (const match of matches) {\n\t\tconst resolved = resolvePath(match);\n\t\tif (resolved !== searchPath && !resolved.startsWith(searchRoot)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst relativeMatch = relative(searchPath, resolved) || \".\";\n\t\tif (\n\t\t\tisIgnoredByGitignoreRules(relativeMatch, rules, pathIsDirectory(resolved))\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tconstrained.push(resolved);\n\t}\n\treturn constrained;\n}\n\n/** @internal */\nexport function getFindGlobPatterns(pattern: string): string[] {\n\tconst patterns = [pattern];\n\tconst rootEquivalent = pattern.match(/^\\*\\*[\\\\/](.+)$/u)?.[1];\n\tif (rootEquivalent && rootEquivalent !== pattern) {\n\t\tpatterns.push(rootEquivalent);\n\t}\n\treturn patterns;\n}\n\nfunction findGlobMatches(\n\tpattern: string,\n\tsearchPath: string,\n\tincludeHidden: boolean,\n): string[] {\n\tconst matches = new Set<string>();\n\tfor (const globPattern of getFindGlobPatterns(pattern)) {\n\t\tfor (const match of globSync(globPattern, {\n\t\t\tcwd: searchPath,\n\t\t\tdot: includeHidden,\n\t\t\tnodir: false,\n\t\t\tabsolute: true,\n\t\t})) {\n\t\t\tmatches.add(resolvePath(match));\n\t\t}\n\t}\n\treturn [...matches];\n}\n\nexport const findTool = createTool<typeof findSchema, FindToolDetails>({\n\tname: \"find\",\n\tlabel: \"find\",\n\tdescription:\n\t\t\"Search for files by glob pattern using fd. Returns matching file paths relative to the search directory. Respects .gitignore. Use this for fast file discovery across large codebases.\",\n\tschema: findSchema,\n\tasync run(params, { signal, respond }) {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new Error(\"Operation aborted\");\n\t\t}\n\n\t\tconst { pattern, path: searchDir, limit, includeHidden = true } = params;\n\n\t\tconst fdPath = await ensureTool(\"fd\", true, signal);\n\t\tif (!fdPath) {\n\t\t\treturn respond\n\t\t\t\t.error(\"fd is not available and could not be downloaded\")\n\t\t\t\t.detail({\n\t\t\t\t\tcommand: \"fd\",\n\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\tfileCount: 0,\n\t\t\t\t\ttruncated: false,\n\t\t\t\t});\n\t\t}\n\n\t\tconst searchPath = resolvePath(expandTildePath(searchDir || \".\"));\n\t\tconst effectiveLimit = limit ?? DEFAULT_LIMIT;\n\n\t\tconst args: string[] = [\n\t\t\t\"--glob\",\n\t\t\t\"--color=never\",\n\t\t\t\"--max-results\",\n\t\t\tString(effectiveLimit),\n\t\t];\n\n\t\t// If pattern includes path separators, match against the full path so nested globs work.\n\t\tif (pattern.includes(\"/\") || pattern.includes(\"\\\\\")) {\n\t\t\targs.push(\"--full-path\");\n\t\t}\n\n\t\tif (includeHidden) {\n\t\t\targs.push(\"--hidden\");\n\t\t}\n\n\t\tconst gitRoot = getGitRoot(searchPath);\n\t\tconst gitignoreFiles = gitRoot ? [] : collectGitignoreFiles(searchPath);\n\t\tconst gitignoreRules = collectGitignoreRules(searchPath, gitignoreFiles);\n\t\tif (gitRoot) {\n\t\t\t// Force fd to honor repo-native ignore rules even if user config disables\n\t\t\t// VCS ignores, while keeping anchored patterns scoped to the repo root.\n\t\t\targs.push(\"--ignore-vcs\");\n\t\t} else {\n\t\t\t// Let fd discover .gitignore files in their native directories instead of\n\t\t\t// re-scoping them as current-directory --ignore-file inputs.\n\t\t\targs.push(\"--no-require-git\");\n\t\t}\n\n\t\targs.push(pattern);\n\n\t\tconst command = [fdPath, ...args].join(\" \");\n\n\t\tconst result = spawnSync(fdPath, args, {\n\t\t\tencoding: \"utf-8\",\n\t\t\tmaxBuffer: 10 * 1024 * 1024,\n\t\t\tcwd: searchPath,\n\t\t});\n\n\t\tif (signal?.aborted) {\n\t\t\tthrow new Error(\"Operation aborted\");\n\t\t}\n\n\t\tif (result.error) {\n\t\t\treturn respond\n\t\t\t\t.error(`Failed to run fd: ${result.error.message}`)\n\t\t\t\t.detail({ command, cwd: searchPath, fileCount: 0, truncated: false });\n\t\t}\n\n\t\tlet output = result.stdout ?? \"\";\n\n\t\tif (result.status !== 0 && !output) {\n\t\t\tconst errorMsg =\n\t\t\t\tresult.stderr?.trim() || `fd exited with code ${result.status}`;\n\t\t\treturn respond\n\t\t\t\t.error(errorMsg)\n\t\t\t\t.detail({ command, cwd: searchPath, fileCount: 0, truncated: false });\n\t\t}\n\n\t\tif (!output) {\n\t\t\t// Fallback to globbing when fd returns nothing (handles patterns with subdirectories on some platforms)\n\t\t\tconst globMatches = findGlobMatches(pattern, searchPath, includeHidden);\n\t\t\tconst constrained = constrainGlobMatches(\n\t\t\t\tglobMatches,\n\t\t\t\tsearchPath,\n\t\t\t\tgitignoreRules,\n\t\t\t);\n\n\t\t\tif (constrained.length > 0) {\n\t\t\t\tconst limited = constrained.slice(0, effectiveLimit);\n\t\t\t\tconst truncated = constrained.length > effectiveLimit;\n\t\t\t\tconst text = limited\n\t\t\t\t\t.map((abs) => relative(searchPath, abs) || \".\")\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\treturn respond\n\t\t\t\t\t.text(\n\t\t\t\t\t\ttruncated\n\t\t\t\t\t\t\t? `${text}\\n\\n(truncated, ${effectiveLimit} results shown)`\n\t\t\t\t\t\t\t: text,\n\t\t\t\t\t)\n\t\t\t\t\t.detail({\n\t\t\t\t\t\tcommand,\n\t\t\t\t\t\tcwd: searchPath,\n\t\t\t\t\t\tfileCount: constrained.length,\n\t\t\t\t\t\ttruncated,\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn respond\n\t\t\t\t.text(\"No files found matching pattern\")\n\t\t\t\t.detail({ command, cwd: searchPath, fileCount: 0, truncated: false });\n\t\t}\n\n\t\tconst lines = output.split(\"\\n\");\n\t\tconst relativized: string[] = [];\n\n\t\tfor (const rawLine of lines) {\n\t\t\tconst line = rawLine.replace(/\\r$/, \"\");\n\t\t\tif (!line) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet relativePath = line;\n\t\t\tif (line.endsWith(\"\\\\\")) {\n\t\t\t\t// Normalize Windows-style trailing backslash to a single forward slash\n\t\t\t\trelativePath = `${line.slice(0, -1)}/`;\n\t\t\t}\n\n\t\t\tif (relativePath) {\n\t\t\t\tif (\n\t\t\t\t\t!gitRoot &&\n\t\t\t\t\tisIgnoredByGitignoreRules(\n\t\t\t\t\t\trelativePath,\n\t\t\t\t\t\tgitignoreRules,\n\t\t\t\t\t\tpathIsDirectory(resolvePath(searchPath, relativePath)),\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\trelativized.push(relativePath);\n\t\t\t}\n\t\t}\n\n\t\tif (!gitRoot && pattern.includes(\"**/\")) {\n\t\t\tconst searchRoot = searchPath.endsWith(sep)\n\t\t\t\t? searchPath\n\t\t\t\t: `${searchPath}${sep}`;\n\t\t\tconst seen = new Set(relativized);\n\t\t\tfor (const match of findGlobMatches(pattern, searchPath, includeHidden)) {\n\t\t\t\tconst resolved = resolvePath(match);\n\t\t\t\tif (resolved !== searchPath && !resolved.startsWith(searchRoot)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst relativeMatch = relative(searchPath, resolved) || \".\";\n\t\t\t\tif (\n\t\t\t\t\tisIgnoredByGitignoreRules(\n\t\t\t\t\t\trelativeMatch,\n\t\t\t\t\t\tgitignoreRules,\n\t\t\t\t\t\tpathIsDirectory(resolved),\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!seen.has(relativeMatch)) {\n\t\t\t\t\tseen.add(relativeMatch);\n\t\t\t\t\trelativized.push(relativeMatch);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\trelativized.sort();\n\t\toutput = relativized.slice(0, effectiveLimit).join(\"\\n\");\n\t\tconst count = relativized.length;\n\t\tconst truncated = count >= effectiveLimit;\n\t\tif (truncated) {\n\t\t\toutput += `\\n\\n(truncated, ${effectiveLimit} results shown)`;\n\t\t}\n\n\t\treturn respond\n\t\t\t.text(output)\n\t\t\t.detail({ command, cwd: searchPath, fileCount: count, truncated });\n\t},\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ripgrep-utils.d.ts","sourceRoot":"","sources":["../../src/tools/ripgrep-utils.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,2LActB,CAAC;AAEF,eAAO,MAAM,UAAU,2LActB,CAAC;AAEF,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,GAAG,CAAC,EAAE,CAK1D;AAWD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAE3D;AAED,wBAAsB,UAAU,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,CAAC,EAAE,WAAW,EACpB,GAAG,CAAC,EAAE,MAAM,GACV,OAAO,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACnB,CAAC,CAkDD;AAED,MAAM,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAmC/D"}
1
+ {"version":3,"file":"ripgrep-utils.d.ts","sourceRoot":"","sources":["../../src/tools/ripgrep-utils.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU,2LActB,CAAC;AAEF,eAAO,MAAM,UAAU,2LActB,CAAC;AAEF,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,GAAG,CAAC,EAAE,CAK1D;AAgHD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAE3D;AAED,wBAAsB,UAAU,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,CAAC,EAAE,WAAW,EACpB,GAAG,CAAC,EAAE,MAAM,GACV,OAAO,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACnB,CAAC,CAoDD;AAED,MAAM,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAmC/D"}