@opentag/dispatcher 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +6 -3
- package/dist/admission.d.ts +44 -0
- package/dist/admission.d.ts.map +1 -0
- package/dist/callbacks.d.ts +13 -0
- package/dist/callbacks.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1678 -78
- package/dist/index.js.map +1 -1
- package/dist/presentation.d.ts +27 -0
- package/dist/presentation.d.ts.map +1 -0
- package/dist/server.d.ts +33 -1
- package/dist/server.d.ts.map +1 -1
- package/package.json +11 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/callbacks.ts","../src/server.ts"],"sourcesContent":["import { parseSlackThreadKey } from \"@opentag/slack\";\nimport type { CallbackMessage, CallbackSink } from \"./server.js\";\n\nexport type FetchLike = typeof fetch;\n\nexport function createGitHubCallbackSink(input: { token?: string; fetchImpl?: FetchLike }): CallbackSink {\n const fetchImpl = input.fetchImpl ?? fetch;\n\n return {\n async deliver(message: CallbackMessage): Promise<void> {\n if (message.provider !== \"github\") return;\n if (!input.token) return;\n\n const response = await fetchImpl(message.uri, {\n method: \"POST\",\n headers: {\n accept: \"application/vnd.github+json\",\n authorization: `Bearer ${input.token}`,\n \"content-type\": \"application/json\",\n \"x-github-api-version\": \"2022-11-28\"\n },\n body: JSON.stringify({ body: message.body })\n });\n\n if (!response.ok) {\n throw new Error(`deliver GitHub callback failed: ${response.status} ${await response.text()}`);\n }\n }\n };\n}\n\nexport function createSlackCallbackSink(input: { botToken?: string; fetchImpl?: FetchLike }): CallbackSink {\n const fetchImpl = input.fetchImpl ?? fetch;\n\n return {\n async deliver(message: CallbackMessage): Promise<void> {\n if (message.provider !== \"slack\") return;\n if (!input.botToken) return;\n\n const thread = parseSlackThreadKey(message.threadKey ?? \"\");\n const response = await fetchImpl(message.uri, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${input.botToken}`,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify({\n channel: thread.channelId,\n text: message.body,\n thread_ts: thread.threadTs\n })\n });\n\n if (!response.ok) {\n throw new Error(`deliver Slack callback failed: ${response.status} ${await response.text()}`);\n }\n const body = (await response.json()) as { ok?: boolean; error?: string };\n if (body.ok === false) {\n throw new Error(`deliver Slack callback failed: ${body.error ?? \"unknown_error\"}`);\n }\n }\n };\n}\n\nexport function createCompositeCallbackSink(sinks: CallbackSink[]): CallbackSink {\n return {\n async deliver(message: CallbackMessage): Promise<void> {\n for (const sink of sinks) {\n await sink.deliver(message);\n }\n }\n };\n}\n","import { OpenTagEventSchema, OpenTagRunResultSchema } from \"@opentag/core\";\nimport { renderAcknowledgement, renderFinalResult, renderProgress } from \"@opentag/github\";\nimport { createOpenTagRepository, migrateSchema } from \"@opentag/store\";\nimport Database from \"better-sqlite3\";\nimport { drizzle } from \"drizzle-orm/better-sqlite3\";\nimport { Hono } from \"hono\";\nimport { z } from \"zod\";\n\nconst CreateRunnerSchema = z.object({\n runnerId: z.string().min(1),\n name: z.string().min(1)\n});\n\nconst CreateRepoBindingSchema = z.object({\n provider: z.string().min(1),\n owner: z.string().min(1),\n repo: z.string().min(1),\n runnerId: z.string().min(1),\n workspacePath: z.string().min(1).optional(),\n defaultExecutor: z.string().min(1).optional(),\n allowedActors: z.array(z.string().min(1)).optional()\n});\n\nconst CreateSlackChannelBindingSchema = z.object({\n teamId: z.string().min(1),\n channelId: z.string().min(1),\n owner: z.string().min(1),\n repo: z.string().min(1)\n});\n\nconst CreateRunSchema = z.object({\n runId: z.string().min(1),\n event: OpenTagEventSchema\n});\n\nconst CompleteRunSchema = z.object({\n result: OpenTagRunResultSchema\n});\n\nconst ProgressSchema = z.object({\n type: z.string().min(1).optional(),\n message: z.string().min(1),\n at: z.string().datetime().optional()\n});\n\nfunction repoKeyFromEvent(event: z.infer<typeof OpenTagEventSchema>): { provider: string; owner: string; repo: string } | null {\n const owner = event.metadata[\"owner\"];\n const repo = event.metadata[\"repo\"];\n if (typeof owner !== \"string\" || typeof repo !== \"string\") return null;\n return {\n provider: typeof event.metadata[\"repoProvider\"] === \"string\" ? (event.metadata[\"repoProvider\"] as string) : \"github\",\n owner,\n repo\n };\n}\n\nfunction isWriteCapable(event: z.infer<typeof OpenTagEventSchema>): boolean {\n return event.permissions.some((permission) => [\"repo:write\", \"pr:create\", \"pr:update\"].includes(permission.scope));\n}\n\nfunction actorIsAllowed(event: z.infer<typeof OpenTagEventSchema>, allowedActors: string[] | undefined): boolean {\n if (!allowedActors?.length) return true;\n return allowedActors.includes(event.actor.handle ?? \"\") || allowedActors.includes(event.actor.providerUserId);\n}\n\nexport type CallbackMessage = {\n runId: string;\n kind: \"acknowledgement\" | \"progress\" | \"final\";\n provider: \"github\" | \"slack\" | \"lark\" | \"webhook\";\n uri: string;\n body: string;\n threadKey?: string;\n};\n\nexport type CallbackSink = {\n deliver(message: CallbackMessage): Promise<void>;\n};\n\nconst noopCallbackSink: CallbackSink = {\n async deliver() {\n return;\n }\n};\n\nasync function deliverAndAudit(input: {\n repo: ReturnType<typeof createOpenTagRepository>;\n sink: CallbackSink;\n message: CallbackMessage;\n}): Promise<void> {\n await input.sink.deliver(input.message);\n await input.repo.appendRunEvent({\n runId: input.message.runId,\n type: `callback.${input.message.kind}.delivered`,\n payload: input.message\n });\n}\n\nfunction isAuthorized(request: Request, pairingToken: string | undefined): boolean {\n if (!pairingToken) return true;\n return request.headers.get(\"authorization\") === `Bearer ${pairingToken}`;\n}\n\nexport function createDispatcherApp(input: { databasePath: string; callbackSink?: CallbackSink; pairingToken?: string }) {\n const sqlite = new Database(input.databasePath);\n migrateSchema(sqlite);\n const repo = createOpenTagRepository(drizzle(sqlite));\n const app = new Hono();\n const callbackSink = input.callbackSink ?? noopCallbackSink;\n\n app.get(\"/healthz\", (c) => c.json({ ok: true }));\n\n app.use(\"/v1/*\", async (c, next) => {\n if (!isAuthorized(c.req.raw, input.pairingToken)) {\n return c.json({ error: \"unauthorized\" }, 401);\n }\n await next();\n });\n\n app.post(\"/v1/runners\", async (c) => {\n const parsed = CreateRunnerSchema.parse(await c.req.json());\n await repo.registerRunner(parsed);\n return c.json({ ok: true }, 201);\n });\n\n app.post(\"/v1/repo-bindings\", async (c) => {\n const parsed = CreateRepoBindingSchema.parse(await c.req.json());\n await repo.createRepoBinding({\n provider: parsed.provider,\n owner: parsed.owner,\n repo: parsed.repo,\n runnerId: parsed.runnerId,\n ...(parsed.workspacePath ? { workspacePath: parsed.workspacePath } : {}),\n ...(parsed.defaultExecutor ? { defaultExecutor: parsed.defaultExecutor } : {}),\n ...(parsed.allowedActors?.length ? { allowedActors: parsed.allowedActors } : {})\n });\n return c.json({ ok: true }, 201);\n });\n\n app.get(\"/v1/repo-bindings/:provider/:owner/:repo\", async (c) => {\n const binding = await repo.getRepoBinding({\n provider: c.req.param(\"provider\"),\n owner: c.req.param(\"owner\"),\n repo: c.req.param(\"repo\")\n });\n if (!binding) return c.json({ error: \"repo_binding_not_found\" }, 404);\n return c.json({ binding });\n });\n\n app.post(\"/v1/slack-channel-bindings\", async (c) => {\n const parsed = CreateSlackChannelBindingSchema.parse(await c.req.json());\n await repo.createSlackChannelBinding(parsed);\n return c.json({ ok: true }, 201);\n });\n\n app.get(\"/v1/slack-channel-bindings/:teamId/:channelId\", async (c) => {\n const binding = await repo.getSlackChannelBinding({\n teamId: c.req.param(\"teamId\"),\n channelId: c.req.param(\"channelId\")\n });\n if (!binding) return c.json({ error: \"slack_channel_binding_not_found\" }, 404);\n return c.json({ binding });\n });\n\n app.post(\"/v1/runs\", async (c) => {\n const parsed = CreateRunSchema.parse(await c.req.json());\n const repoKey = repoKeyFromEvent(parsed.event);\n if (!repoKey) {\n return c.json({ error: \"repo_context_missing\" }, 422);\n }\n const binding = await repo.getRepoBinding(repoKey);\n if (!binding) {\n return c.json({ error: \"repo_not_bound\" }, 403);\n }\n if (isWriteCapable(parsed.event) && !actorIsAllowed(parsed.event, binding.allowedActors)) {\n return c.json({ error: \"actor_not_allowed_for_write\" }, 403);\n }\n\n const run = await repo.createRun({ id: parsed.runId, event: parsed.event });\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n message: {\n runId: run.id,\n kind: \"acknowledgement\",\n provider: parsed.event.callback.provider,\n uri: parsed.event.callback.uri,\n body: renderAcknowledgement(run.id),\n ...(parsed.event.callback.threadKey ? { threadKey: parsed.event.callback.threadKey } : {})\n }\n });\n return c.json({ run }, 201);\n });\n\n app.post(\"/v1/runners/:runnerId/claim\", async (c) => {\n const claimed = await repo.claimNextRun({ runnerId: c.req.param(\"runnerId\"), leaseSeconds: 60 });\n if (!claimed) return c.body(null, 204);\n return c.json(claimed, 200);\n });\n\n app.post(\"/v1/runners/:runnerId/runs/:runId/heartbeat\", async (c) => {\n const ok = await repo.heartbeat({ runnerId: c.req.param(\"runnerId\"), runId: c.req.param(\"runId\") });\n if (!ok) return c.json({ error: \"run_not_claimed_by_runner\" }, 404);\n return c.json({ ok: true });\n });\n\n app.post(\"/v1/runs/:runId/running\", async (c) => {\n const body = z.object({ executor: z.string().min(1) }).parse(await c.req.json());\n await repo.markRunning({ runId: c.req.param(\"runId\"), executor: body.executor });\n return c.json({ ok: true });\n });\n\n app.post(\"/v1/runs/:runId/progress\", async (c) => {\n const runId = c.req.param(\"runId\");\n const body = ProgressSchema.parse(await c.req.json());\n const stored = await repo.getRun({ runId });\n if (!stored) return c.json({ error: \"run_not_found\" }, 404);\n\n await repo.recordProgress({\n runId,\n message: body.message,\n ...(body.type ? { type: body.type } : {}),\n ...(body.at ? { at: body.at } : {})\n });\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n message: {\n runId,\n kind: \"progress\",\n provider: stored.event.callback.provider,\n uri: stored.event.callback.uri,\n body: renderProgress({ runId, message: body.message }),\n ...(stored.event.callback.threadKey ? { threadKey: stored.event.callback.threadKey } : {})\n }\n });\n return c.json({ ok: true });\n });\n\n app.post(\"/v1/runs/:runId/complete\", async (c) => {\n const runId = c.req.param(\"runId\");\n const parsed = CompleteRunSchema.parse(await c.req.json());\n const stored = await repo.getRun({ runId });\n if (!stored) return c.json({ error: \"run_not_found\" }, 404);\n\n await repo.completeRun({ runId, result: parsed.result });\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n message: {\n runId,\n kind: \"final\",\n provider: stored.event.callback.provider,\n uri: stored.event.callback.uri,\n body: renderFinalResult(parsed.result),\n ...(stored.event.callback.threadKey ? { threadKey: stored.event.callback.threadKey } : {})\n }\n });\n return c.json({ ok: true });\n });\n\n app.get(\"/v1/runs/:runId\", async (c) => {\n const stored = await repo.getRun({ runId: c.req.param(\"runId\") });\n if (!stored) return c.json({ error: \"run_not_found\" }, 404);\n return c.json(stored);\n });\n\n app.get(\"/v1/runs/:runId/events\", async (c) => {\n const events = await repo.listRunEvents({ runId: c.req.param(\"runId\") });\n return c.json({ events });\n });\n\n return app;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/callbacks.ts","../src/presentation.ts","../src/server.ts","../src/admission.ts"],"sourcesContent":["import { createLarkReplyClient, type LarkReplyClient, parseLarkThreadKey, replyLarkMessage } from \"@opentag/lark\";\nimport { createSlackPostMessagePayload, createSlackUpdateMessagePayload, parseSlackThreadKey } from \"@opentag/slack\";\nimport { createTelegramSendMessageDraftPayload, createTelegramSendMessagePayload, parseTelegramThreadKey } from \"@opentag/telegram\";\nimport type { CallbackMessage, CallbackSink } from \"./server.js\";\n\nexport type FetchLike = typeof fetch;\n\nfunction slackUpdateUriFrom(postMessageUri: string): string {\n return postMessageUri.replace(/\\/chat\\.postMessage$/, \"/chat.update\");\n}\n\nfunction githubCommentUriFrom(input: { commentsUri: string; responseBody: { id?: number; url?: string } }): string | undefined {\n if (input.responseBody.url) return input.responseBody.url;\n if (typeof input.responseBody.id === \"number\") {\n return input.commentsUri.replace(/\\/comments$/, `/comments/${input.responseBody.id}`);\n }\n return undefined;\n}\n\nfunction slackBotTokenFor(input: {\n botToken?: string;\n botTokensByAgentId?: Record<string, string>;\n agentId?: string;\n}): string | undefined {\n if (\n input.agentId &&\n input.botTokensByAgentId &&\n Object.hasOwn(input.botTokensByAgentId, input.agentId) &&\n typeof input.botTokensByAgentId[input.agentId] === \"string\"\n ) {\n return input.botTokensByAgentId[input.agentId];\n }\n return input.botToken;\n}\n\nexport function createGitHubCallbackSink(input: { token?: string; fetchImpl?: FetchLike }): CallbackSink {\n const fetchImpl = input.fetchImpl ?? fetch;\n const commentUriByKey = new Map<string, string>();\n const deliveryByKey = new Map<string, Promise<void>>();\n\n return {\n async deliver(message: CallbackMessage): Promise<void> {\n if (message.provider !== \"github\") return;\n if (!input.token) return;\n\n const statusKey = message.statusMessageKey ?? `${message.runId}:status`;\n const previous = deliveryByKey.get(statusKey) ?? Promise.resolve();\n const current = previous.then(async () => {\n const existingCommentUri = commentUriByKey.get(statusKey);\n const response = await fetchImpl(existingCommentUri ?? message.uri, {\n method: existingCommentUri ? \"PATCH\" : \"POST\",\n headers: {\n accept: \"application/vnd.github+json\",\n authorization: `Bearer ${input.token}`,\n \"content-type\": \"application/json\",\n \"x-github-api-version\": \"2022-11-28\"\n },\n body: JSON.stringify({ body: message.body })\n });\n\n if (!response.ok) {\n throw new Error(`deliver GitHub callback failed: ${response.status} ${await response.text()}`);\n }\n if (!existingCommentUri) {\n const body = (await response.json()) as { id?: number; url?: string };\n const commentUri = githubCommentUriFrom({ commentsUri: message.uri, responseBody: body });\n if (commentUri) {\n commentUriByKey.set(statusKey, commentUri);\n }\n }\n if (message.kind === \"final\") {\n commentUriByKey.delete(statusKey);\n }\n });\n deliveryByKey.set(statusKey, current);\n await current.finally(() => {\n if (deliveryByKey.get(statusKey) === current) {\n deliveryByKey.delete(statusKey);\n }\n });\n }\n };\n}\n\nexport function createSlackCallbackSink(input: {\n botToken?: string;\n botTokensByAgentId?: Record<string, string>;\n fetchImpl?: FetchLike;\n}): CallbackSink {\n const fetchImpl = input.fetchImpl ?? fetch;\n const statusMessageTsByKey = new Map<string, string>();\n\n return {\n async deliver(message: CallbackMessage): Promise<void> {\n if (message.provider !== \"slack\") return;\n const botToken = slackBotTokenFor({\n ...(input.botToken ? { botToken: input.botToken } : {}),\n ...(input.botTokensByAgentId ? { botTokensByAgentId: input.botTokensByAgentId } : {}),\n ...(message.agentId ? { agentId: message.agentId } : {})\n });\n if (!botToken) return;\n\n const thread = parseSlackThreadKey(message.threadKey ?? \"\");\n const existingStatusTs = message.statusMessageKey ? statusMessageTsByKey.get(message.statusMessageKey) : undefined;\n const response = await fetchImpl(existingStatusTs ? slackUpdateUriFrom(message.uri) : message.uri, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${botToken}`,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify(\n existingStatusTs\n ? createSlackUpdateMessagePayload({\n channelId: thread.channelId,\n text: message.body,\n messageTs: existingStatusTs,\n ...(message.blocks?.length ? { blocks: message.blocks } : {})\n })\n : createSlackPostMessagePayload({\n channelId: thread.channelId,\n text: message.body,\n threadTs: thread.threadTs,\n ...(message.blocks?.length ? { blocks: message.blocks } : {})\n })\n )\n });\n\n if (!response.ok) {\n throw new Error(`deliver Slack callback failed: ${response.status} ${await response.text()}`);\n }\n const body = (await response.json()) as { ok?: boolean; error?: string; ts?: string };\n if (body.ok === false) {\n throw new Error(`deliver Slack callback failed: ${body.error ?? \"unknown_error\"}`);\n }\n if (message.statusMessageKey && !existingStatusTs && body.ts) {\n statusMessageTsByKey.set(message.statusMessageKey, body.ts);\n }\n if (message.kind === \"final\") {\n for (const key of statusMessageTsByKey.keys()) {\n if (key.startsWith(`${message.runId}:`)) {\n statusMessageTsByKey.delete(key);\n }\n }\n }\n }\n };\n}\n\nexport function createLarkCallbackSink(input: {\n appId?: string;\n appSecret?: string;\n domain?: \"lark\" | \"feishu\";\n client?: LarkReplyClient;\n}): CallbackSink {\n // Reject partial credentials so a misconfigured sink fails at startup, not silently.\n if (!input.client && Boolean(input.appId) !== Boolean(input.appSecret)) {\n throw new Error(\"Lark callback sink requires both appId and appSecret (or neither).\");\n }\n\n const client: LarkReplyClient | undefined =\n input.client ??\n (input.appId && input.appSecret\n ? createLarkReplyClient({ appId: input.appId, appSecret: input.appSecret, ...(input.domain ? { domain: input.domain } : {}) })\n : undefined);\n\n return {\n async deliver(message: CallbackMessage): Promise<void> {\n if (message.provider !== \"lark\") return;\n // A lark run was accepted, so a missing client/threadKey is a real failure, not a silent success.\n if (!client) {\n throw new Error(\"Lark callback sink received a lark message but has no client configured (missing appId/appSecret).\");\n }\n if (!message.threadKey) {\n throw new Error(\"Lark callback message is missing threadKey.\");\n }\n const { messageId } = parseLarkThreadKey(message.threadKey);\n await replyLarkMessage(client, { messageId, text: message.body });\n }\n };\n}\n\nexport function createTelegramCallbackSink(input: {\n botToken?: string;\n botTokensByAgentId?: Record<string, string>;\n fetchImpl?: FetchLike;\n}): CallbackSink {\n const fetchImpl = input.fetchImpl ?? fetch;\n const draftIdByKey = new Map<string, number>();\n let nextDraftId = 1;\n\n return {\n async deliver(message: CallbackMessage): Promise<void> {\n if (message.provider !== \"telegram\") return;\n const botToken = slackBotTokenFor({\n ...(input.botToken ? { botToken: input.botToken } : {}),\n ...(input.botTokensByAgentId ? { botTokensByAgentId: input.botTokensByAgentId } : {}),\n ...(message.agentId ? { agentId: message.agentId } : {})\n });\n if (!botToken) return;\n\n const thread = parseTelegramThreadKey(message.threadKey ?? \"\");\n const statusKey = message.statusMessageKey ?? `${message.runId}:status`;\n const isDraft = message.kind === \"progress\";\n const draftId = isDraft ? (draftIdByKey.get(statusKey) ?? nextDraftId++) : undefined;\n if (isDraft && draftId && !draftIdByKey.has(statusKey)) {\n draftIdByKey.set(statusKey, draftId);\n }\n\n const response = await fetchImpl(`https://api.telegram.org/bot${botToken}/${isDraft ? \"sendMessageDraft\" : \"sendMessage\"}`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify(\n isDraft\n ? createTelegramSendMessageDraftPayload({\n chatId: thread.chatId,\n text: message.body,\n draftId: draftId!,\n ...(thread.messageThreadId ? { messageThreadId: thread.messageThreadId } : {})\n })\n : createTelegramSendMessagePayload({\n chatId: thread.chatId,\n text: message.body,\n replyToMessageId: thread.replyToMessageId,\n ...(thread.messageThreadId ? { messageThreadId: thread.messageThreadId } : {})\n })\n )\n });\n\n if (!response.ok) {\n throw new Error(`deliver Telegram callback failed: ${response.status} ${await response.text()}`);\n }\n const body = (await response.json()) as { ok?: boolean; description?: string };\n if (body.ok === false) {\n throw new Error(`deliver Telegram callback failed: ${body.description ?? \"unknown_error\"}`);\n }\n if (message.kind === \"final\") {\n draftIdByKey.delete(statusKey);\n }\n }\n };\n}\n\nexport function createCompositeCallbackSink(sinks: CallbackSink[]): CallbackSink {\n return {\n async deliver(message: CallbackMessage): Promise<void> {\n for (const sink of sinks) {\n await sink.deliver(message);\n }\n }\n };\n}\n","import type { OpenTagRunResult } from \"@opentag/core\";\nimport { renderAcknowledgement, renderFinalResult, renderProgress } from \"@opentag/github\";\nimport { renderLarkAcknowledgement, renderLarkFinalResult } from \"@opentag/lark\";\nimport { createSlackFinalResultBlocks, renderSlackAcknowledgement, renderSlackFinalResult, type SlackBlock } from \"@opentag/slack\";\nimport { renderTelegramAcknowledgement, renderTelegramFinalResult, renderTelegramProgress } from \"@opentag/telegram\";\nimport type { CallbackMessage } from \"./server.js\";\n\nexport type CallbackProvider = CallbackMessage[\"provider\"];\n\nexport type PresentedCallbackBody = {\n body: string;\n blocks?: SlackBlock[];\n};\n\nexport type CallbackPresentation = {\n shouldDeliverAcknowledgement(provider: CallbackProvider): boolean;\n shouldDeliverProgress(provider: CallbackProvider): boolean;\n acknowledgement(input: { provider: CallbackProvider; runId: string }): string;\n progress(input: { provider: CallbackProvider; runId: string; message: string }): string;\n final(input: { provider: CallbackProvider; result: OpenTagRunResult }): PresentedCallbackBody;\n};\n\nexport function createDefaultCallbackPresentation(): CallbackPresentation {\n return {\n shouldDeliverAcknowledgement(provider) {\n return provider !== \"lark\";\n },\n\n shouldDeliverProgress(provider) {\n return provider !== \"slack\" && provider !== \"lark\";\n },\n\n acknowledgement(input) {\n if (input.provider === \"slack\") {\n return renderSlackAcknowledgement(input.runId);\n }\n if (input.provider === \"lark\") {\n return renderLarkAcknowledgement(input.runId);\n }\n if (input.provider === \"telegram\") {\n return renderTelegramAcknowledgement(input.runId);\n }\n return renderAcknowledgement(input.runId);\n },\n\n progress(input) {\n if (input.provider === \"telegram\") {\n return renderTelegramProgress(input.message);\n }\n return renderProgress({ runId: input.runId, message: input.message });\n },\n\n final(input) {\n if (input.provider === \"slack\") {\n return {\n body: renderSlackFinalResult(input.result),\n blocks: createSlackFinalResultBlocks(input.result)\n };\n }\n if (input.provider === \"lark\") {\n return { body: renderLarkFinalResult(input.result) };\n }\n if (input.provider === \"telegram\") {\n return { body: renderTelegramFinalResult(input.result) };\n }\n return { body: renderFinalResult(input.result) };\n }\n };\n}\n","import { createHash } from \"node:crypto\";\nimport {\n AdapterMutationMappingSchema,\n ActorIdentitySchema,\n ActionHintSchema,\n conversationKeysFromEvent,\n parseThreadActionCommand,\n projectTargetRefFromEvent,\n suggestedActionCandidatesFromSnapshots,\n type ActorIdentity,\n type ApplyIntentOutcome,\n type ApplyPlan,\n type MutationIntent,\n type OpenTagEvent,\n type OpenTagRun,\n type SuggestedChangesSnapshot,\n type SuggestedActionCandidate,\n type ThreadActionCommand,\n createAdapterMutationCompilerRegistry,\n OpenTagEventSchema,\n OpenTagRunResultSchema,\n PolicyRuleSchema,\n RunEventImportanceSchema,\n RunEventVisibilitySchema\n} from \"@opentag/core\";\nimport {\n applyGitHubIssueMutationOperation,\n createGitHubIssueMutationCompiler,\n type FetchLike as GitHubFetchLike\n} from \"@opentag/github\";\nimport type { GitHubIssueMutationOperation } from \"@opentag/github\";\nimport type { SlackBlock } from \"@opentag/slack\";\nimport { createOpenTagRepository, migrateSchema } from \"@opentag/store\";\nimport Database from \"better-sqlite3\";\nimport { drizzle } from \"drizzle-orm/better-sqlite3\";\nimport { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport { createAdmissionRuntime, type AgentAccessProfileCheck } from \"./admission.js\";\nimport { createDefaultCallbackPresentation, type CallbackPresentation } from \"./presentation.js\";\n\nconst CreateRunnerSchema = z.object({\n runnerId: z.string().min(1),\n name: z.string().min(1)\n});\n\nconst CreateRepoBindingSchema = z.object({\n provider: z.string().min(1),\n owner: z.string().min(1),\n repo: z.string().min(1),\n runnerId: z.string().min(1),\n workspacePath: z.string().min(1).optional(),\n defaultExecutor: z.string().min(1).optional(),\n allowedActors: z.array(z.string().min(1)).optional()\n});\n\nconst CreateSlackChannelBindingSchema = z.object({\n teamId: z.string().min(1),\n channelId: z.string().min(1),\n repoProvider: z.string().min(1).default(\"github\"),\n owner: z.string().min(1),\n repo: z.string().min(1)\n});\n\nconst CreateChannelBindingSchema = z.object({\n provider: z.string().min(1),\n accountId: z.string().min(1),\n conversationId: z.string().min(1),\n repoProvider: z.string().min(1),\n owner: z.string().min(1),\n repo: z.string().min(1),\n metadata: z.record(z.string(), z.unknown()).optional()\n});\n\nconst UpsertPolicyRuleSchema = z.object({\n rule: PolicyRuleSchema\n});\n\nconst UpsertMutationMappingSchema = z.object({\n mapping: AdapterMutationMappingSchema\n});\n\nconst CreateRunSchema = z.object({\n runId: z.string().min(1),\n event: OpenTagEventSchema\n});\n\nconst PromoteFollowUpRequestSchema = z.object({\n runId: z.string().min(1)\n});\n\nconst CompleteRunSchema = z.object({\n result: OpenTagRunResultSchema\n});\n\nconst ApprovalDecisionInputSchema = z.object({\n id: z.string().min(1).optional(),\n approvedIntentIds: z.array(z.string().min(1)),\n rejectedIntentIds: z.array(z.string().min(1)).optional(),\n approvedBy: ActorIdentitySchema,\n approvedAt: z.string().datetime().optional(),\n scope: z.enum([\"manual\", \"policy\"]).default(\"manual\"),\n reason: z.string().min(1).optional(),\n metadata: z.record(z.string(), z.unknown()).optional()\n}).refine((value) => {\n const rejected = new Set(value.rejectedIntentIds ?? []);\n return value.approvedIntentIds.every((intentId) => !rejected.has(intentId));\n}, {\n message: \"approvedIntentIds and rejectedIntentIds must not overlap\"\n});\n\nconst ApplyPlanInputSchema = z.object({\n id: z.string().min(1).optional(),\n approvalDecisionId: z.string().min(1),\n selectedIntentIds: z.array(z.string().min(1)).optional(),\n adapter: z.string().min(1).optional(),\n execute: z.boolean().optional()\n});\n\nconst ThreadActionInputSchema = z.object({\n id: z.string().min(1).optional(),\n rawText: z.string().min(1),\n actor: ActorIdentitySchema,\n callback: z.object({\n provider: z.string().min(1),\n uri: z.string().min(1),\n threadKey: z.string().min(1).optional()\n }),\n metadata: z.record(z.string(), z.unknown()).optional()\n});\n\nconst ChildRunInputSchema = z.object({\n runId: z.string().min(1),\n action: ActionHintSchema,\n commandText: z.string().min(1).optional(),\n sourceProposalId: z.string().min(1).optional(),\n sourceApplyPlanId: z.string().min(1).optional()\n});\n\nconst ProgressSchema = z.object({\n type: z.string().min(1).optional(),\n message: z.string().min(1),\n at: z.string().datetime().optional(),\n visibility: RunEventVisibilitySchema.optional(),\n importance: RunEventImportanceSchema.optional()\n});\n\nfunction childEventFromParent(input: {\n parentEvent: OpenTagEvent;\n childRunId: string;\n commandText?: string;\n actionKind: string;\n receivedAt: string;\n extraContext?: OpenTagEvent[\"context\"];\n metadata?: Record<string, unknown>;\n}): OpenTagEvent {\n return {\n ...input.parentEvent,\n id: `evt_${input.childRunId}`,\n sourceEventId: `${input.parentEvent.sourceEventId}:${input.childRunId}`,\n receivedAt: input.receivedAt,\n context: [...input.parentEvent.context, ...(input.extraContext ?? [])],\n command: {\n rawText: input.commandText ?? `Execute next action: ${input.actionKind}`,\n intent: \"run\",\n args: {\n parentSourceEventId: input.parentEvent.sourceEventId,\n actionKind: input.actionKind\n }\n },\n metadata: {\n ...input.parentEvent.metadata,\n ...(input.metadata ?? {})\n }\n };\n}\n\nfunction mappingsFromAdapterPlan(adapterPlan: unknown) {\n if (!adapterPlan || typeof adapterPlan !== \"object\" || Array.isArray(adapterPlan)) return [];\n const mappings = (adapterPlan as { mappings?: unknown }).mappings;\n if (!Array.isArray(mappings)) return [];\n return mappings.map((mapping) => AdapterMutationMappingSchema.parse(mapping));\n}\n\nfunction conversationKeyFromCallback(input: { provider: string; uri: string; threadKey?: string | undefined }): string {\n return `${input.provider}:${input.threadKey ?? input.uri}`;\n}\n\nfunction metadataIssueNumber(metadata: Record<string, unknown> | undefined): string | undefined {\n const value = metadata?.[\"issueNumber\"];\n if (typeof value === \"number\" && Number.isInteger(value) && value > 0) return String(value);\n if (typeof value === \"string\" && /^[1-9]\\d*$/.test(value)) return value;\n return undefined;\n}\n\nfunction metadataString(metadata: Record<string, unknown> | undefined, key: string): string | undefined {\n const value = metadata?.[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction githubIssueWorkItemExternalId(metadata: Record<string, unknown> | undefined): string | undefined {\n const owner = metadataString(metadata, \"owner\");\n const repo = metadataString(metadata, \"repo\");\n const issueNumber = metadataIssueNumber(metadata);\n if (!owner || !repo || !issueNumber) return undefined;\n return `${owner}/${repo}#${issueNumber}`;\n}\n\nfunction conversationKeysFromThreadAction(input: {\n callback: { provider: string; uri: string; threadKey?: string | undefined };\n metadata?: Record<string, unknown> | undefined;\n}): string[] {\n const primary = conversationKeyFromCallback(input.callback);\n const keys = [primary];\n const issueNumber = metadataIssueNumber(input.metadata);\n if (input.callback.provider === \"github\" && input.callback.threadKey && issueNumber) {\n const suffix = `#${issueNumber}`;\n if (input.callback.threadKey.endsWith(suffix)) {\n keys.push(`github:${input.callback.threadKey.slice(0, -suffix.length)}`);\n }\n }\n return [...new Set(keys)];\n}\n\nfunction proposalMatchesWorkItem(proposal: ActionProposal, externalId: string): boolean {\n return proposal.snapshot.workThread?.workItemReference.externalId === externalId || proposal.event.workItem?.externalId === externalId;\n}\n\nfunction stableHash(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 12);\n}\n\nfunction stableId(prefix: string, parts: unknown[]): string {\n return `${prefix}_${stableHash(JSON.stringify(parts))}`;\n}\n\nfunction actorKeys(actor: ActorIdentity): string[] {\n return [\n actor.providerUserId,\n actor.handle,\n `${actor.provider}:${actor.providerUserId}`,\n actor.handle ? `${actor.provider}:${actor.handle}` : undefined\n ].filter((value): value is string => typeof value === \"string\" && value.length > 0);\n}\n\nfunction actorAllowedByList(actor: ActorIdentity, allowedActors: string[] | undefined): boolean {\n if (!allowedActors?.length) return true;\n const keys = new Set(actorKeys(actor));\n return allowedActors.some((allowedActor) => keys.has(allowedActor));\n}\n\ntype ActionProposal = {\n runId: string;\n run: OpenTagRun;\n event: OpenTagEvent;\n snapshot: SuggestedChangesSnapshot;\n};\n\ntype ResolvedThreadAction = {\n proposal: ActionProposal;\n selectedIntentIds: string[];\n selectedCandidates: Array<SuggestedActionCandidate & { proposal: ActionProposal }>;\n};\n\ntype ResolveThreadActionResult =\n | { ok: true; resolved: ResolvedThreadAction }\n | { ok: false; reason: \"no_proposal\" | \"no_match\" | \"ambiguous\"; message: string; runId?: string | undefined };\n\nfunction actionCandidatesFor(proposals: ActionProposal[]): Array<SuggestedActionCandidate & { proposal: ActionProposal }> {\n const candidates: Array<SuggestedActionCandidate & { proposal: ActionProposal }> = [];\n let startIndex = 1;\n for (const proposal of proposals) {\n const proposalCandidates = suggestedActionCandidatesFromSnapshots([proposal.snapshot], startIndex).map((candidate) => ({\n ...candidate,\n proposal\n }));\n candidates.push(...proposalCandidates);\n startIndex += proposalCandidates.length;\n }\n return candidates;\n}\n\nfunction resolveCandidateSelection(input: {\n command: ThreadActionCommand;\n proposals: ActionProposal[];\n}): ResolveThreadActionResult {\n const candidates = actionCandidatesFor(input.proposals);\n if (candidates.length === 0) {\n return { ok: false, reason: \"no_proposal\", message: \"I could not find any suggested actions for this thread.\" };\n }\n\n let selected: Array<SuggestedActionCandidate & { proposal: ActionProposal }> = [];\n const selection = input.command.selection;\n if (selection.kind === \"all\") {\n selected = candidates;\n } else if (selection.kind === \"index\") {\n selected = candidates.filter((candidate) => candidate.index === selection.index);\n } else if (selection.kind === \"proposal\") {\n selected = candidates.filter((candidate) => candidate.proposalId === selection.proposalId);\n } else if (selection.kind === \"intent\") {\n selected = candidates.filter((candidate) => candidate.intent.intentId === selection.intentId);\n } else if (selection.kind === \"domain\") {\n selected = candidates.filter((candidate) => candidate.intent.domain === selection.domain);\n } else if (candidates.length === 1) {\n selected = candidates;\n } else {\n return {\n ok: false,\n reason: \"ambiguous\",\n runId: candidates[0]?.proposal.runId,\n message: `I found ${candidates.length} suggested actions. Please reply with ${candidates\n .map((candidate) => `\\`${input.command.verb} ${candidate.index}\\``)\n .join(\", \")} or \\`${input.command.verb} all\\`.`\n };\n }\n\n if (selected.length === 0) {\n return {\n ok: false,\n reason: \"no_match\",\n runId: candidates[0]?.proposal.runId,\n message: \"I could not match that reply to a suggested action. Please use an action number like `apply 1`.\"\n };\n }\n\n const proposalIds = new Set(selected.map((candidate) => candidate.proposalId));\n if (proposalIds.size !== 1) {\n return {\n ok: false,\n reason: \"ambiguous\",\n runId: selected[0]?.proposal.runId,\n message: \"That selection spans multiple proposals. Please apply or approve one proposal at a time using its action number.\"\n };\n }\n\n return {\n ok: true,\n resolved: {\n proposal: selected[0]!.proposal,\n selectedIntentIds: selected.map((candidate) => candidate.intent.intentId),\n selectedCandidates: selected\n }\n };\n}\n\nasync function resolveThreadAction(input: {\n repo: ReturnType<typeof createOpenTagRepository>;\n command: ThreadActionCommand;\n callback: { provider: string; uri: string; threadKey?: string | undefined };\n metadata?: Record<string, unknown> | undefined;\n}): Promise<ResolveThreadActionResult> {\n const conversationKeys = conversationKeysFromThreadAction({\n callback: input.callback,\n ...(input.metadata ? { metadata: input.metadata } : {})\n });\n const primaryConversationKey = conversationKeys[0];\n const targetWorkItemExternalId = githubIssueWorkItemExternalId(input.metadata);\n if (input.command.selection.kind === \"proposal\") {\n const stored = await input.repo.getSuggestedChanges({ proposalId: input.command.selection.proposalId });\n if (!stored) {\n return { ok: false, reason: \"no_proposal\", message: `I could not find proposal \\`${input.command.selection.proposalId}\\`.` };\n }\n const claimed = await input.repo.getRun({ runId: stored.runId });\n if (!claimed) {\n return { ok: false, reason: \"no_proposal\", message: `I found the proposal but not its source run.` };\n }\n const proposalConversationKeys = conversationKeysFromEvent(claimed.event);\n if (!proposalConversationKeys.some((key) => conversationKeys.includes(key))) {\n return { ok: false, reason: \"no_match\", runId: stored.runId, message: \"That proposal does not belong to this source thread.\" };\n }\n const proposal = { runId: stored.runId, run: claimed.run, event: claimed.event, snapshot: stored.snapshot };\n if (targetWorkItemExternalId && !proposalMatchesWorkItem(proposal, targetWorkItemExternalId)) {\n return { ok: false, reason: \"no_match\", runId: stored.runId, message: \"That proposal does not belong to this source thread.\" };\n }\n return resolveCandidateSelection({\n command: input.command,\n proposals: [proposal]\n });\n }\n\n for (const conversationKey of conversationKeys) {\n const proposals = await input.repo.listLatestSuggestedChangesForConversation({ conversationKey });\n const scopedProposals =\n conversationKey !== primaryConversationKey && targetWorkItemExternalId\n ? proposals.filter((proposal) => proposalMatchesWorkItem(proposal, targetWorkItemExternalId))\n : proposals;\n if (scopedProposals.length > 0) return resolveCandidateSelection({ command: input.command, proposals: scopedProposals });\n }\n return resolveCandidateSelection({ command: input.command, proposals: [] });\n}\n\nfunction isGitHubRepoEvent(event: OpenTagEvent): boolean {\n const repoProvider = event.metadata[\"repoProvider\"];\n return repoProvider === \"github\" || (event.source === \"github\" && repoProvider === undefined);\n}\n\nfunction hasGitHubRepoTarget(event: OpenTagEvent): boolean {\n return isGitHubRepoEvent(event) && typeof event.metadata[\"owner\"] === \"string\" && typeof event.metadata[\"repo\"] === \"string\";\n}\n\nfunction hasGitHubIssueOrPullTarget(event: OpenTagEvent): boolean {\n return typeof event.metadata[\"issueNumber\"] === \"number\" || typeof event.metadata[\"pullRequestNumber\"] === \"number\";\n}\n\nfunction isRepoLevelGitHubIntent(intent: MutationIntent): boolean {\n return intent.action === \"create_pull_request\";\n}\n\nfunction adapterForAction(input: { event: OpenTagEvent; callbackProvider: string; selectedIntents: MutationIntent[] }): string {\n return hasGitHubRepoTarget(input.event) &&\n (hasGitHubIssueOrPullTarget(input.event) ||\n (input.selectedIntents.length > 0 && input.selectedIntents.every((intent) => isRepoLevelGitHubIntent(intent))))\n ? \"github\"\n : input.callbackProvider;\n}\n\nasync function authorizeThreadAction(input: {\n repo: ReturnType<typeof createOpenTagRepository>;\n resolved: ResolvedThreadAction;\n actor: ActorIdentity;\n}): Promise<{ ok: true } | { ok: false; reason: string; message: string }> {\n const repoKey = projectTargetRefFromEvent(input.resolved.proposal.event);\n if (!repoKey) {\n return { ok: false, reason: \"repo_context_missing\", message: \"The proposal does not resolve to a repository binding.\" };\n }\n\n const binding = await input.repo.getRepoBinding(repoKey);\n if (!binding) {\n return { ok: false, reason: \"repo_binding_not_found\", message: \"No repository binding is configured for this proposal.\" };\n }\n\n if (!actorAllowedByList(input.actor, binding.allowedActors)) {\n return {\n ok: false,\n reason: \"actor_not_allowed\",\n message: \"This actor is not allowed to approve or apply actions for the bound repository.\"\n };\n }\n\n if (input.resolved.proposal.event.source === \"slack\") {\n const teamId = input.resolved.proposal.event.metadata[\"teamId\"];\n const channelId = input.resolved.proposal.event.metadata[\"channelId\"];\n if (typeof teamId === \"string\" && typeof channelId === \"string\") {\n const channelBinding = await input.repo.getChannelBinding({\n provider: \"slack\",\n accountId: teamId,\n conversationId: channelId\n });\n if (\n !channelBinding ||\n channelBinding.repoProvider !== repoKey.provider ||\n channelBinding.owner !== repoKey.owner ||\n channelBinding.repo !== repoKey.repo\n ) {\n return {\n ok: false,\n reason: \"channel_binding_mismatch\",\n message: \"The source channel binding is missing or no longer points at the proposal repository.\"\n };\n }\n }\n }\n\n return { ok: true };\n}\n\nfunction stableApprovalId(input: {\n providedId?: string;\n command: ThreadActionCommand;\n resolved: ResolvedThreadAction;\n actor: ActorIdentity;\n}): string {\n return input.providedId ?? stableId(\"approval\", [\n input.resolved.proposal.snapshot.proposalId,\n input.command.verb,\n [...input.resolved.selectedIntentIds].sort(),\n actorKeys(input.actor).sort()\n ]);\n}\n\nfunction sortedValues(values: string[] | undefined): string[] {\n return [...(values ?? [])].sort();\n}\n\nfunction sameStringSet(left: string[] | undefined, right: string[] | undefined): boolean {\n return JSON.stringify(sortedValues(left)) === JSON.stringify(sortedValues(right));\n}\n\nfunction sameActor(left: ActorIdentity, right: ActorIdentity): boolean {\n return left.provider === right.provider &&\n left.providerUserId === right.providerUserId &&\n (left.handle ?? \"\") === (right.handle ?? \"\") &&\n (left.organizationId ?? \"\") === (right.organizationId ?? \"\");\n}\n\nfunction approvalDecisionMatchesThreadAction(input: {\n decision: NonNullable<Awaited<ReturnType<ReturnType<typeof createOpenTagRepository>[\"getApprovalDecision\"]>>>;\n command: ThreadActionCommand;\n resolved: ResolvedThreadAction;\n actor: ActorIdentity;\n}): boolean {\n const approvedIntentIds = input.command.verb === \"reject\" ? [] : input.resolved.selectedIntentIds;\n const rejectedIntentIds = input.command.verb === \"reject\" ? input.resolved.selectedIntentIds : [];\n const metadata = input.decision.metadata;\n const verb = metadata && typeof metadata === \"object\" && !Array.isArray(metadata) ? metadata[\"verb\"] : undefined;\n return input.decision.proposalId === input.resolved.proposal.snapshot.proposalId &&\n sameStringSet(input.decision.approvedIntentIds, approvedIntentIds) &&\n sameStringSet(input.decision.rejectedIntentIds, rejectedIntentIds) &&\n sameActor(input.decision.approvedBy, input.actor) &&\n verb === input.command.verb;\n}\n\nfunction stableApplyPlanId(input: { resolved: ResolvedThreadAction; adapter: string }): string {\n return stableId(\"apply\", [\n input.resolved.proposal.snapshot.proposalId,\n input.adapter,\n [...input.resolved.selectedIntentIds].sort()\n ]);\n}\n\nfunction stableChildRunId(input: {\n command: ThreadActionCommand;\n resolved: ResolvedThreadAction;\n sourceApplyPlanId?: string;\n fallbackReason?: string;\n}): string {\n return stableId(\"run_child\", [\n input.resolved.proposal.runId,\n input.resolved.proposal.snapshot.proposalId,\n input.command.verb,\n [...input.resolved.selectedIntentIds].sort(),\n input.sourceApplyPlanId ?? \"\",\n input.fallbackReason ?? \"\"\n ]);\n}\n\nfunction selectedIntentsAlreadyApplied(input: { plan: ApplyPlan; selectedIntentIds: string[] }): boolean {\n return input.selectedIntentIds.every((intentId) =>\n input.plan.outcomes?.some((outcome) => outcome.intentId === intentId && outcome.outcome === \"applied\")\n );\n}\n\nfunction githubTargetFromEvent(event: OpenTagEvent):\n | {\n owner: string;\n repoName: string;\n issueNumber?: number;\n pullRequestNumber?: number;\n targetKind?: \"issue\" | \"pull_request\";\n }\n | null {\n const owner = event.metadata[\"owner\"];\n const repoName = event.metadata[\"repo\"];\n const issueNumber = event.metadata[\"issueNumber\"];\n const pullRequestNumber = event.metadata[\"pullRequestNumber\"];\n if (!hasGitHubRepoTarget(event)) return null;\n if (typeof owner !== \"string\" || typeof repoName !== \"string\") return null;\n if (typeof pullRequestNumber === \"number\") {\n return { owner, repoName, issueNumber: pullRequestNumber, pullRequestNumber, targetKind: \"pull_request\" };\n }\n if (typeof issueNumber === \"number\") {\n return { owner, repoName, issueNumber, targetKind: \"issue\" };\n }\n return { owner, repoName };\n}\n\nfunction selectedActionSummary(candidates: ResolvedThreadAction[\"selectedCandidates\"]): string {\n return candidates.map((candidate) => `${candidate.index}. ${candidate.intent.summary}`).join(\"; \");\n}\n\nfunction childRunContextLines(input: {\n resolved: ResolvedThreadAction;\n approvalDecisionId?: string;\n sourceApplyPlanId?: string;\n fallbackReason?: string;\n}): string[] {\n const previousSummary = input.resolved.proposal.run.result?.summary ?? input.resolved.proposal.snapshot.summary;\n return [\n `- Proposal: \\`${input.resolved.proposal.snapshot.proposalId}\\``,\n `- Selected intents: ${input.resolved.selectedIntentIds.map((intentId) => `\\`${intentId}\\``).join(\", \")}`,\n `- Previous run: \\`${input.resolved.proposal.runId}\\``,\n ...(input.approvalDecisionId ? [`- Approval decision: \\`${input.approvalDecisionId}\\``] : []),\n `- Previous result: ${previousSummary}`,\n ...(input.sourceApplyPlanId ? [`- Apply plan: \\`${input.sourceApplyPlanId}\\``] : []),\n ...(input.fallbackReason ? [`- Fallback reason: ${input.fallbackReason}`] : [])\n ];\n}\n\nfunction renderChildRunCreatedBody(input: {\n lead: string;\n resolved: ResolvedThreadAction;\n childRun: OpenTagRun;\n approvalDecisionId?: string;\n sourceApplyPlanId?: string;\n fallbackReason?: string;\n}): string {\n return [\n input.lead,\n \"\",\n `Child run: \\`${input.childRun.id}\\``,\n \"\",\n \"Context carried into the child run:\",\n ...childRunContextLines(input),\n \"\",\n \"The model will continue from this approved proposal instead of starting from a fresh mention.\"\n ].join(\"\\n\");\n}\n\nfunction actionContextPointer(input: {\n command: ThreadActionCommand;\n resolved: ResolvedThreadAction;\n approvalDecisionId?: string;\n applyPlanId?: string;\n fallbackReason?: string;\n}): OpenTagEvent[\"context\"][number] {\n const lines = [\n \"OpenTag thread action continuation.\",\n `User reply: ${input.command.rawText}`,\n `Action: ${input.command.verb}`,\n `Proposal: ${input.resolved.proposal.snapshot.proposalId}`,\n `Proposal summary: ${input.resolved.proposal.snapshot.summary}`,\n `Selected actions: ${selectedActionSummary(input.resolved.selectedCandidates)}`,\n `Selected intents: ${input.resolved.selectedIntentIds.join(\", \")}`,\n `Previous run: ${input.resolved.proposal.runId}`,\n `Previous summary: ${input.resolved.proposal.run.result?.summary ?? input.resolved.proposal.snapshot.summary}`\n ];\n if (input.approvalDecisionId) lines.push(`Approval decision: ${input.approvalDecisionId}`);\n if (input.applyPlanId) lines.push(`Apply plan: ${input.applyPlanId}`);\n if (input.fallbackReason) lines.push(`Fallback reason: ${input.fallbackReason}`);\n return {\n kind: \"text\",\n uri: lines.join(\"\\n\"),\n visibility: input.resolved.proposal.event.source === \"github\" ? \"public\" : \"organization\",\n title: \"OpenTag approved action context\"\n };\n}\n\nasync function createChildRunForThreadAction(input: {\n repo: ReturnType<typeof createOpenTagRepository>;\n command: ThreadActionCommand;\n resolved: ResolvedThreadAction;\n runId?: string;\n approvalDecisionId?: string;\n sourceApplyPlanId?: string;\n fallbackReason?: string;\n}): Promise<OpenTagRun> {\n const runId = input.runId ?? stableChildRunId(input);\n const action = ActionHintSchema.parse({\n kind: \"apply_suggested_changes\",\n targetId: input.resolved.proposal.snapshot.proposalId,\n selectedIntentIds: input.resolved.selectedIntentIds,\n metadata: {\n threadActionVerb: input.command.verb,\n rawText: input.command.rawText,\n ...(input.command.reason ? { reason: input.command.reason } : {}),\n ...(input.approvalDecisionId ? { approvalDecisionId: input.approvalDecisionId } : {}),\n ...(input.fallbackReason ? { fallbackReason: input.fallbackReason } : {})\n }\n });\n const previousRunSummary = input.resolved.proposal.run.result?.summary ?? input.resolved.proposal.snapshot.summary;\n const commandText =\n input.command.verb === \"continue\"\n ? `Continue approved OpenTag action: ${selectedActionSummary(input.resolved.selectedCandidates)}`\n : `Continue because OpenTag could not directly apply approved action: ${selectedActionSummary(input.resolved.selectedCandidates)}`;\n const { run } = await input.repo.createRun({\n id: runId,\n event: childEventFromParent({\n parentEvent: input.resolved.proposal.event,\n childRunId: runId,\n actionKind: action.kind,\n commandText,\n receivedAt: new Date().toISOString(),\n extraContext: [\n actionContextPointer({\n command: input.command,\n resolved: input.resolved,\n ...(input.approvalDecisionId ? { approvalDecisionId: input.approvalDecisionId } : {}),\n ...(input.sourceApplyPlanId ? { applyPlanId: input.sourceApplyPlanId } : {}),\n ...(input.fallbackReason ? { fallbackReason: input.fallbackReason } : {})\n })\n ],\n metadata: {\n parentRunId: input.resolved.proposal.runId,\n sourceProposalId: input.resolved.proposal.snapshot.proposalId,\n selectedIntentIds: input.resolved.selectedIntentIds,\n threadActionVerb: input.command.verb,\n previousRunSummary,\n ...(input.approvalDecisionId ? { approvalDecisionId: input.approvalDecisionId } : {}),\n ...(input.sourceApplyPlanId ? { sourceApplyPlanId: input.sourceApplyPlanId } : {}),\n ...(input.fallbackReason ? { fallbackReason: input.fallbackReason } : {})\n }\n }),\n parentRunId: input.resolved.proposal.runId,\n triggeredByAction: action,\n sourceProposalId: input.resolved.proposal.snapshot.proposalId,\n ...(input.sourceApplyPlanId ? { sourceApplyPlanId: input.sourceApplyPlanId } : {})\n });\n return run;\n}\n\nexport type CallbackMessage = {\n runId: string;\n kind: \"acknowledgement\" | \"progress\" | \"final\";\n provider: string;\n uri: string;\n body: string;\n agentId?: string;\n threadKey?: string;\n statusMessageKey?: string;\n blocks?: SlackBlock[];\n};\n\nexport type CallbackSink = {\n deliver(message: CallbackMessage): Promise<void>;\n};\n\nexport type CallbackRetryOptions = {\n maxAttempts?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n now?: Date;\n};\n\nexport type GitHubApplyOptions = {\n token: string;\n fetchImpl?: GitHubFetchLike;\n};\n\nasync function executeGitHubApplyPlan(input: {\n repo: ReturnType<typeof createOpenTagRepository>;\n plan: ApplyPlan;\n resolved: ResolvedThreadAction;\n githubApply?: GitHubApplyOptions;\n}): Promise<{ plan: ApplyPlan; executed: boolean; fallbackReason?: string }> {\n if (input.plan.adapter !== \"github\") {\n return { plan: input.plan, executed: false, fallbackReason: `Adapter ${input.plan.adapter ?? \"unknown\"} is not directly executable yet.` };\n }\n if (!input.githubApply) {\n return { plan: input.plan, executed: false, fallbackReason: \"GitHub apply is not configured on this dispatcher.\" };\n }\n\n const target = githubTargetFromEvent(input.resolved.proposal.event);\n if (!target) {\n return { plan: input.plan, executed: false, fallbackReason: \"The source run does not include a GitHub issue or pull request target.\" };\n }\n\n const preflightOutcomeByIntentId = new Map((input.plan.outcomes ?? []).map((outcome) => [outcome.intentId, outcome]));\n const executableIntents = input.resolved.proposal.snapshot.intents.filter((intent) => {\n if (!input.resolved.selectedIntentIds.includes(intent.intentId)) return false;\n const outcome = preflightOutcomeByIntentId.get(intent.intentId);\n return outcome?.outcome === \"skipped\" && outcome.message?.startsWith(\"Preflight passed\");\n });\n if (executableIntents.length === 0) {\n return { plan: input.plan, executed: false, fallbackReason: \"No selected intent has a direct adapter execution path.\" };\n }\n\n const executedOutcomes: ApplyIntentOutcome[] = [];\n const compilerRegistry = createAdapterMutationCompilerRegistry([\n createGitHubIssueMutationCompiler({\n mappings: mappingsFromAdapterPlan(input.plan.adapterPlan),\n ...(target.targetKind ? { targetKind: target.targetKind } : {})\n })\n ]);\n for (const compilation of compilerRegistry.compile(\"github\", executableIntents)) {\n if (!compilation.ok) {\n executedOutcomes.push(compilation.outcome);\n continue;\n }\n executedOutcomes.push(\n await applyGitHubIssueMutationOperation({\n target: {\n token: input.githubApply.token,\n owner: target.owner,\n repo: target.repoName,\n ...(typeof target.issueNumber === \"number\" ? { issueNumber: target.issueNumber } : {}),\n ...(target.pullRequestNumber ? { pullRequestNumber: target.pullRequestNumber } : {})\n },\n operation: compilation.operation as GitHubIssueMutationOperation,\n ...(input.githubApply.fetchImpl ? { fetchImpl: input.githubApply.fetchImpl } : {})\n })\n );\n }\n\n const executedOutcomeByIntentId = new Map(executedOutcomes.map((outcome) => [outcome.intentId, outcome]));\n const mergedOutcomes = (input.plan.outcomes ?? []).map((outcome) => executedOutcomeByIntentId.get(outcome.intentId) ?? outcome);\n const updated = await input.repo.updateApplyPlanOutcomes({\n id: input.plan.id,\n outcomes: mergedOutcomes,\n externalWritesExecuted: true\n });\n const plan = updated ?? input.plan;\n const allSelectedApplied = input.resolved.selectedIntentIds.every((intentId) =>\n plan.outcomes?.some((outcome) => outcome.intentId === intentId && outcome.outcome === \"applied\")\n );\n return {\n plan,\n executed: allSelectedApplied,\n ...(allSelectedApplied ? {} : { fallbackReason: \"Some selected intents were not directly applied.\" })\n };\n}\n\nconst noopCallbackSink: CallbackSink = {\n async deliver() {\n return;\n }\n};\n\nfunction nextCallbackAttemptAt(input: { attempts: number } & CallbackRetryOptions): string | undefined {\n const maxAttempts = input.maxAttempts ?? 5;\n const nextAttempt = input.attempts + 1;\n if (nextAttempt >= maxAttempts) return undefined;\n\n const baseDelayMs = input.baseDelayMs ?? 5_000;\n const maxDelayMs = input.maxDelayMs ?? 300_000;\n const delayMs = Math.min(maxDelayMs, baseDelayMs * 2 ** Math.max(0, input.attempts));\n return new Date((input.now ?? new Date()).getTime() + delayMs).toISOString();\n}\n\nasync function deliverCallbackDelivery(input: {\n repo: ReturnType<typeof createOpenTagRepository>;\n sink: CallbackSink;\n delivery: import(\"@opentag/store\").CallbackDelivery;\n retry?: CallbackRetryOptions;\n}): Promise<boolean> {\n try {\n await input.sink.deliver({\n runId: input.delivery.runId,\n kind: input.delivery.kind,\n provider: input.delivery.provider,\n uri: input.delivery.uri,\n body: input.delivery.body,\n ...(input.delivery.threadKey ? { threadKey: input.delivery.threadKey } : {}),\n ...(input.delivery.agentId ? { agentId: input.delivery.agentId } : {}),\n ...(input.delivery.statusMessageKey ? { statusMessageKey: input.delivery.statusMessageKey } : {}),\n ...(input.delivery.blocks ? { blocks: input.delivery.blocks as SlackBlock[] } : {})\n });\n await input.repo.markCallbackDelivered({ deliveryId: input.delivery.id });\n return true;\n } catch (error) {\n const nextAttemptAt = nextCallbackAttemptAt({ attempts: input.delivery.attempts, ...(input.retry ?? {}) });\n await input.repo.markCallbackFailed({\n deliveryId: input.delivery.id,\n error: error instanceof Error ? error.message : String(error),\n ...(nextAttemptAt ? { nextAttemptAt } : {})\n });\n return false;\n }\n}\n\nexport async function processPendingCallbacks(input: {\n repo: ReturnType<typeof createOpenTagRepository>;\n sink: CallbackSink;\n limit?: number;\n retry?: CallbackRetryOptions;\n}): Promise<{ processed: number; delivered: number; failed: number }> {\n const maxAttempts = input.retry?.maxAttempts ?? 5;\n const deliveries = await input.repo.claimPendingCallbackDeliveries({\n limit: input.limit ?? 20,\n ...(input.retry?.now ? { now: input.retry.now } : {}),\n maxAttempts\n });\n const result = { processed: 0, delivered: 0, failed: 0 };\n for (const delivery of deliveries) {\n result.processed += 1;\n const delivered = await deliverCallbackDelivery({\n repo: input.repo,\n sink: input.sink,\n delivery,\n ...(input.retry ? { retry: input.retry } : {})\n });\n if (delivered) {\n result.delivered += 1;\n } else {\n result.failed += 1;\n }\n }\n return result;\n}\n\nasync function deliverAndAudit(input: {\n repo: ReturnType<typeof createOpenTagRepository>;\n sink: CallbackSink;\n message: CallbackMessage;\n retry?: CallbackRetryOptions;\n}): Promise<void> {\n const delivery = await input.repo.enqueueCallbackDelivery({\n runId: input.message.runId,\n kind: input.message.kind,\n provider: input.message.provider,\n uri: input.message.uri,\n body: input.message.body,\n ...(input.message.threadKey ? { threadKey: input.message.threadKey } : {}),\n ...(input.message.agentId ? { agentId: input.message.agentId } : {}),\n ...(input.message.statusMessageKey ? { statusMessageKey: input.message.statusMessageKey } : {}),\n ...(input.message.blocks ? { blocks: input.message.blocks } : {})\n });\n await deliverCallbackDelivery({\n repo: input.repo,\n sink: input.sink,\n delivery,\n ...(input.retry ? { retry: input.retry } : {})\n });\n}\n\nfunction isAuthorized(request: Request, pairingToken: string | undefined): boolean {\n if (!pairingToken) return true;\n return request.headers.get(\"authorization\") === `Bearer ${pairingToken}`;\n}\n\nexport function createDispatcherApp(input: {\n databasePath: string;\n callbackSink?: CallbackSink;\n pairingToken?: string;\n presentation?: CallbackPresentation;\n githubApply?: GitHubApplyOptions;\n callbackRetry?: CallbackRetryOptions;\n agentAccessProfileCheck?: AgentAccessProfileCheck;\n}) {\n const sqlite = new Database(input.databasePath);\n migrateSchema(sqlite);\n const repo = createOpenTagRepository(drizzle(sqlite));\n const app = new Hono();\n const callbackSink = input.callbackSink ?? noopCallbackSink;\n const presentation = input.presentation ?? createDefaultCallbackPresentation();\n const callbackRetry = input.callbackRetry ?? {};\n const admission = createAdmissionRuntime({\n repo,\n ...(input.agentAccessProfileCheck ? { agentAccessProfileCheck: input.agentAccessProfileCheck } : {})\n });\n\n app.get(\"/healthz\", (c) => c.json({ ok: true }));\n\n app.use(\"/v1/*\", async (c, next) => {\n if (!isAuthorized(c.req.raw, input.pairingToken)) {\n return c.json({ error: \"unauthorized\" }, 401);\n }\n await next();\n });\n\n app.post(\"/v1/runners\", async (c) => {\n const parsed = CreateRunnerSchema.parse(await c.req.json());\n await repo.registerRunner(parsed);\n return c.json({ ok: true }, 201);\n });\n\n app.get(\"/v1/runners/:runnerId\", async (c) => {\n const runner = await repo.getRunner({ runnerId: c.req.param(\"runnerId\") });\n if (!runner) return c.json({ error: \"runner_not_found\" }, 404);\n return c.json({ runner });\n });\n\n app.post(\"/v1/repo-bindings\", async (c) => {\n const parsed = CreateRepoBindingSchema.parse(await c.req.json());\n await repo.createRepoBinding({\n provider: parsed.provider,\n owner: parsed.owner,\n repo: parsed.repo,\n runnerId: parsed.runnerId,\n ...(parsed.workspacePath ? { workspacePath: parsed.workspacePath } : {}),\n ...(parsed.defaultExecutor ? { defaultExecutor: parsed.defaultExecutor } : {}),\n ...(parsed.allowedActors?.length ? { allowedActors: parsed.allowedActors } : {})\n });\n return c.json({ ok: true }, 201);\n });\n\n app.get(\"/v1/repo-bindings/:provider/:owner/:repo\", async (c) => {\n const binding = await repo.getRepoBinding({\n provider: c.req.param(\"provider\"),\n owner: c.req.param(\"owner\"),\n repo: c.req.param(\"repo\")\n });\n if (!binding) return c.json({ error: \"repo_binding_not_found\" }, 404);\n return c.json({ binding });\n });\n\n app.post(\"/v1/repo-bindings/:provider/:owner/:repo/policy-rules\", async (c) => {\n const parsed = UpsertPolicyRuleSchema.parse(await c.req.json());\n const rule = await repo.upsertRepoPolicyRule({\n provider: c.req.param(\"provider\"),\n owner: c.req.param(\"owner\"),\n repo: c.req.param(\"repo\"),\n rule: parsed.rule\n });\n return c.json({ rule }, 201);\n });\n\n app.get(\"/v1/repo-bindings/:provider/:owner/:repo/policy-rules\", async (c) => {\n const rules = await repo.listRepoPolicyRules({\n provider: c.req.param(\"provider\"),\n owner: c.req.param(\"owner\"),\n repo: c.req.param(\"repo\")\n });\n return c.json({ rules });\n });\n\n app.post(\"/v1/repo-bindings/:provider/:owner/:repo/mutation-mappings\", async (c) => {\n const parsed = UpsertMutationMappingSchema.parse(await c.req.json());\n const mapping = await repo.upsertRepoMutationMapping({\n provider: c.req.param(\"provider\"),\n owner: c.req.param(\"owner\"),\n repo: c.req.param(\"repo\"),\n mapping: parsed.mapping\n });\n return c.json({ mapping }, 201);\n });\n\n app.get(\"/v1/repo-bindings/:provider/:owner/:repo/mutation-mappings\", async (c) => {\n const mappings = await repo.listRepoMutationMappings({\n provider: c.req.param(\"provider\"),\n owner: c.req.param(\"owner\"),\n repo: c.req.param(\"repo\")\n });\n return c.json({ mappings });\n });\n\n app.get(\"/v1/repo-bindings/:provider/:owner/:repo/metrics\", async (c) => {\n const metrics = await repo.getRepoMetrics({\n provider: c.req.param(\"provider\"),\n owner: c.req.param(\"owner\"),\n repo: c.req.param(\"repo\")\n });\n return c.json({ metrics });\n });\n\n app.get(\"/v1/work-thread-metrics\", async (c) => {\n const threadId = c.req.query(\"threadId\");\n if (!threadId) return c.json({ error: \"thread_id_required\" }, 422);\n const metrics = await repo.getWorkThreadMetrics({ threadId });\n return c.json({ metrics });\n });\n\n app.post(\"/v1/channel-bindings\", async (c) => {\n const parsed = CreateChannelBindingSchema.parse(await c.req.json());\n await repo.upsertChannelBinding({\n provider: parsed.provider,\n accountId: parsed.accountId,\n conversationId: parsed.conversationId,\n repoProvider: parsed.repoProvider,\n owner: parsed.owner,\n repo: parsed.repo,\n ...(parsed.metadata ? { metadata: parsed.metadata } : {})\n });\n return c.json({ ok: true }, 201);\n });\n\n app.get(\"/v1/channel-bindings/:provider/:accountId/:conversationId\", async (c) => {\n const binding = await repo.getChannelBinding({\n provider: c.req.param(\"provider\"),\n accountId: c.req.param(\"accountId\"),\n conversationId: c.req.param(\"conversationId\")\n });\n if (!binding) return c.json({ error: \"channel_binding_not_found\" }, 404);\n return c.json({ binding });\n });\n\n app.post(\"/v1/slack-channel-bindings\", async (c) => {\n const parsed = CreateSlackChannelBindingSchema.parse(await c.req.json());\n await repo.createSlackChannelBinding(parsed);\n return c.json({ ok: true }, 201);\n });\n\n app.get(\"/v1/slack-channel-bindings/:teamId/:channelId\", async (c) => {\n const binding = await repo.getSlackChannelBinding({\n teamId: c.req.param(\"teamId\"),\n channelId: c.req.param(\"channelId\")\n });\n if (!binding) return c.json({ error: \"slack_channel_binding_not_found\" }, 404);\n return c.json({ binding });\n });\n\n app.post(\"/v1/runs\", async (c) => {\n const parsed = CreateRunSchema.parse(await c.req.json());\n const admitted = await admission.admitRun({ requestId: parsed.runId, event: parsed.event });\n\n if (admitted.outcome === \"needs_human_decision\") {\n return c.json({ decision: admitted.decision }, 202);\n }\n\n if (admitted.outcome === \"drop_duplicate\") {\n await repo.appendRunEvent({\n runId: admitted.run.id,\n type: \"admission.decided\",\n payload: admitted.decision,\n visibility: \"audit\",\n importance: \"normal\",\n message: admitted.decision.reason\n });\n await repo.appendRunEvent({\n runId: admitted.run.id,\n type: \"run.create_idempotent_replay\",\n payload: { requestedRunId: parsed.runId, eventId: parsed.event.id },\n visibility: \"audit\",\n importance: \"low\"\n });\n return c.json({ decision: admitted.decision, run: admitted.run, idempotentReplay: true }, 200);\n }\n\n if (admitted.outcome === \"follow_up_queued\") {\n return c.json({ decision: admitted.decision, followUpRequest: admitted.followUpRequest }, 202);\n }\n\n const createdRun = await repo.createRun({ id: parsed.runId, event: parsed.event });\n if (!createdRun.created) {\n return c.json(\n {\n decision: {\n ...admitted.decision,\n action: \"drop_duplicate\",\n reason: \"Source event already created a run.\",\n reasonCode: \"duplicate_source_event\",\n activeRunId: createdRun.run.id\n },\n run: createdRun.run,\n idempotentReplay: true\n },\n 200\n );\n }\n const { run } = createdRun;\n if (presentation.shouldDeliverAcknowledgement(parsed.event.callback.provider)) {\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n retry: callbackRetry,\n message: {\n runId: run.id,\n kind: \"acknowledgement\",\n provider: parsed.event.callback.provider,\n uri: parsed.event.callback.uri,\n body: presentation.acknowledgement({ provider: parsed.event.callback.provider, runId: run.id }),\n ...(parsed.event.target.agentId ? { agentId: parsed.event.target.agentId } : {}),\n ...(parsed.event.callback.threadKey ? { threadKey: parsed.event.callback.threadKey } : {})\n }\n });\n }\n return c.json({ decision: admitted.decision, run }, 201);\n });\n\n app.post(\"/v1/thread-actions\", async (c) => {\n const parsed = ThreadActionInputSchema.parse(await c.req.json());\n const command = parseThreadActionCommand(parsed.rawText);\n if (!command) {\n return c.json({ outcome: \"ignored\", reason: \"not_action_command\" }, 202);\n }\n\n const resolved = await resolveThreadAction({\n repo,\n command,\n callback: parsed.callback,\n ...(parsed.metadata ? { metadata: parsed.metadata } : {})\n });\n if (!resolved.ok) {\n if (resolved.runId) {\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n retry: callbackRetry,\n message: {\n runId: resolved.runId,\n kind: \"final\",\n provider: parsed.callback.provider,\n uri: parsed.callback.uri,\n body: resolved.message,\n ...(parsed.callback.threadKey ? { threadKey: parsed.callback.threadKey } : {})\n }\n });\n }\n return c.json({ outcome: resolved.reason, message: resolved.message }, resolved.reason === \"no_proposal\" ? 404 : 409);\n }\n\n const authorization = await authorizeThreadAction({\n repo,\n resolved: resolved.resolved,\n actor: parsed.actor\n });\n if (!authorization.ok) {\n return c.json({ outcome: \"unauthorized\", reason: authorization.reason, message: authorization.message }, 403);\n }\n\n const selectionText = selectedActionSummary(resolved.resolved.selectedCandidates);\n const selectedIntents = resolved.resolved.proposal.snapshot.intents.filter((intent) =>\n resolved.resolved.selectedIntentIds.includes(intent.intentId)\n );\n const adapter = adapterForAction({\n event: resolved.resolved.proposal.event,\n callbackProvider: parsed.callback.provider,\n selectedIntents\n });\n const applyPlanId = stableApplyPlanId({ resolved: resolved.resolved, adapter });\n if (command.verb === \"apply\") {\n const existingPlan = await repo.getApplyPlan({ id: applyPlanId });\n if (existingPlan) {\n const existingDecision = await repo.getApprovalDecision({ id: existingPlan.approvalDecisionId });\n if (selectedIntentsAlreadyApplied({ plan: existingPlan, selectedIntentIds: resolved.resolved.selectedIntentIds })) {\n return c.json({ outcome: \"already_applied\", decision: existingDecision, plan: existingPlan }, 200);\n }\n const fallbackReason = \"An apply plan already exists for this selected action; OpenTag will not execute it again from a repeated thread reply.\";\n const childRun = await createChildRunForThreadAction({\n repo,\n command,\n resolved: resolved.resolved,\n runId: stableChildRunId({\n command,\n resolved: resolved.resolved,\n sourceApplyPlanId: existingPlan.id,\n fallbackReason\n }),\n approvalDecisionId: existingPlan.approvalDecisionId,\n sourceApplyPlanId: existingPlan.id,\n fallbackReason\n });\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n retry: callbackRetry,\n message: {\n runId: resolved.resolved.proposal.runId,\n kind: \"final\",\n provider: parsed.callback.provider,\n uri: parsed.callback.uri,\n body: renderChildRunCreatedBody({\n lead: \"This action was already planned, so OpenTag will not execute the external write again.\",\n resolved: resolved.resolved,\n childRun,\n approvalDecisionId: existingPlan.approvalDecisionId,\n sourceApplyPlanId: existingPlan.id,\n fallbackReason\n }),\n ...(parsed.callback.threadKey ? { threadKey: parsed.callback.threadKey } : {})\n }\n });\n return c.json({ outcome: \"already_planned\", decision: existingDecision, plan: existingPlan, run: childRun }, 200);\n }\n }\n\n const providedDecision = parsed.id ? await repo.getApprovalDecision({ id: parsed.id }) : null;\n const canReuseProvidedDecision = providedDecision\n ? approvalDecisionMatchesThreadAction({\n decision: providedDecision,\n command,\n resolved: resolved.resolved,\n actor: parsed.actor\n })\n : false;\n const approvalId = parsed.id && (!providedDecision || canReuseProvidedDecision)\n ? parsed.id\n : stableApprovalId({\n command,\n resolved: resolved.resolved,\n actor: parsed.actor\n });\n const existingDecision = canReuseProvidedDecision\n ? providedDecision\n : await repo.getApprovalDecision({ id: approvalId });\n const decision = existingDecision ?? await repo.recordApprovalDecision({\n id: approvalId,\n proposalId: resolved.resolved.proposal.snapshot.proposalId,\n approvedIntentIds: command.verb === \"reject\" ? [] : resolved.resolved.selectedIntentIds,\n ...(command.verb === \"reject\" ? { rejectedIntentIds: resolved.resolved.selectedIntentIds } : {}),\n approvedBy: parsed.actor,\n approvedAt: new Date().toISOString(),\n scope: \"manual\",\n ...(command.reason ? { reason: command.reason } : {}),\n metadata: {\n source: \"thread_action\",\n rawText: command.rawText,\n verb: command.verb,\n selection: command.selection,\n callback: parsed.callback,\n ...(parsed.metadata ? { ingressMetadata: parsed.metadata } : {})\n }\n });\n if (!decision) {\n return c.json({ error: \"proposal_not_found\" }, 404);\n }\n\n if (command.verb === \"reject\") {\n if (existingDecision) {\n return c.json({ outcome: \"already_rejected\", decision }, 200);\n }\n const body = `Rejected ${selectionText} from \\`${resolved.resolved.proposal.snapshot.proposalId}\\`.`;\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n retry: callbackRetry,\n message: {\n runId: resolved.resolved.proposal.runId,\n kind: \"final\",\n provider: parsed.callback.provider,\n uri: parsed.callback.uri,\n body,\n ...(parsed.callback.threadKey ? { threadKey: parsed.callback.threadKey } : {})\n }\n });\n return c.json({ outcome: \"rejected\", decision }, 201);\n }\n\n if (command.verb === \"approve\") {\n if (existingDecision) {\n return c.json({ outcome: \"already_approved\", decision }, 200);\n }\n const body = `Approved ${selectionText} from \\`${resolved.resolved.proposal.snapshot.proposalId}\\`.\\n\\nReply with \\`apply ${resolved.resolved.selectedCandidates[0]?.index ?? 1}\\` to apply it, or \\`continue ${resolved.resolved.selectedCandidates[0]?.index ?? 1}\\` to continue with a follow-up run.`;\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n retry: callbackRetry,\n message: {\n runId: resolved.resolved.proposal.runId,\n kind: \"final\",\n provider: parsed.callback.provider,\n uri: parsed.callback.uri,\n body,\n ...(parsed.callback.threadKey ? { threadKey: parsed.callback.threadKey } : {})\n }\n });\n return c.json({ outcome: \"approved\", decision }, 201);\n }\n\n if (command.verb === \"continue\") {\n const childRun = await createChildRunForThreadAction({\n repo,\n command,\n resolved: resolved.resolved,\n runId: stableChildRunId({ command, resolved: resolved.resolved }),\n approvalDecisionId: decision.id\n });\n const body = renderChildRunCreatedBody({\n lead: `Continuing from ${selectionText} in \\`${resolved.resolved.proposal.snapshot.proposalId}\\`.`,\n resolved: resolved.resolved,\n childRun,\n approvalDecisionId: decision.id\n });\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n retry: callbackRetry,\n message: {\n runId: resolved.resolved.proposal.runId,\n kind: \"final\",\n provider: parsed.callback.provider,\n uri: parsed.callback.uri,\n body,\n ...(parsed.callback.threadKey ? { threadKey: parsed.callback.threadKey } : {})\n }\n });\n return c.json({ outcome: \"child_run_created\", decision, run: childRun }, 201);\n }\n\n const planResult = await repo.createApplyPlanOnce({\n id: applyPlanId,\n proposalId: resolved.resolved.proposal.snapshot.proposalId,\n approvalDecisionId: decision.id,\n selectedIntentIds: resolved.resolved.selectedIntentIds,\n adapter\n });\n if (!planResult) {\n return c.json({ error: \"proposal_or_approval_not_found\" }, 404);\n }\n if (!planResult.created) {\n if (selectedIntentsAlreadyApplied({ plan: planResult.plan, selectedIntentIds: resolved.resolved.selectedIntentIds })) {\n return c.json({ outcome: \"already_applied\", decision, plan: planResult.plan }, 200);\n }\n const fallbackReason = \"An apply plan already exists for this selected action; OpenTag will not execute it again from a repeated thread reply.\";\n const childRun = await createChildRunForThreadAction({\n repo,\n command,\n resolved: resolved.resolved,\n runId: stableChildRunId({\n command,\n resolved: resolved.resolved,\n sourceApplyPlanId: planResult.plan.id,\n fallbackReason\n }),\n approvalDecisionId: decision.id,\n sourceApplyPlanId: planResult.plan.id,\n fallbackReason\n });\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n retry: callbackRetry,\n message: {\n runId: resolved.resolved.proposal.runId,\n kind: \"final\",\n provider: parsed.callback.provider,\n uri: parsed.callback.uri,\n body: renderChildRunCreatedBody({\n lead: \"This action was already planned, so OpenTag will not execute the external write again.\",\n resolved: resolved.resolved,\n childRun,\n approvalDecisionId: decision.id,\n sourceApplyPlanId: planResult.plan.id,\n fallbackReason\n }),\n ...(parsed.callback.threadKey ? { threadKey: parsed.callback.threadKey } : {})\n }\n });\n return c.json({ outcome: \"already_planned\", decision, plan: planResult.plan, run: childRun }, 200);\n }\n const plan = planResult.plan;\n\n const execution = await executeGitHubApplyPlan({\n repo,\n plan,\n resolved: resolved.resolved,\n ...(input.githubApply ? { githubApply: input.githubApply } : {})\n });\n if (execution.executed) {\n const outcomes = execution.plan.outcomes ?? [];\n const body = [\n `Applied ${selectionText} from \\`${resolved.resolved.proposal.snapshot.proposalId}\\`.`,\n \"\",\n \"Result:\",\n ...outcomes\n .filter((outcome) => resolved.resolved.selectedIntentIds.includes(outcome.intentId))\n .map((outcome) => `- \\`${outcome.intentId}\\`: ${outcome.outcome}${outcome.externalUri ? ` (${outcome.externalUri})` : \"\"}`)\n ].join(\"\\n\");\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n retry: callbackRetry,\n message: {\n runId: resolved.resolved.proposal.runId,\n kind: \"final\",\n provider: parsed.callback.provider,\n uri: parsed.callback.uri,\n body,\n ...(parsed.callback.threadKey ? { threadKey: parsed.callback.threadKey } : {})\n }\n });\n return c.json({ outcome: \"applied\", decision, plan: execution.plan }, 201);\n }\n\n const childRun = await createChildRunForThreadAction({\n repo,\n command,\n resolved: resolved.resolved,\n runId: stableChildRunId({\n command,\n resolved: resolved.resolved,\n sourceApplyPlanId: execution.plan.id,\n fallbackReason: execution.fallbackReason ?? \"OpenTag cannot directly apply this intent yet.\"\n }),\n approvalDecisionId: decision.id,\n sourceApplyPlanId: execution.plan.id,\n fallbackReason: execution.fallbackReason ?? \"OpenTag cannot directly apply this intent yet.\"\n });\n const body = renderChildRunCreatedBody({\n lead: `Action ${selectionText} was approved, but OpenTag cannot directly apply it yet.`,\n resolved: resolved.resolved,\n childRun,\n approvalDecisionId: decision.id,\n sourceApplyPlanId: execution.plan.id,\n fallbackReason: execution.fallbackReason ?? \"The adapter could not execute the selected intent.\"\n });\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n retry: callbackRetry,\n message: {\n runId: resolved.resolved.proposal.runId,\n kind: \"final\",\n provider: parsed.callback.provider,\n uri: parsed.callback.uri,\n body,\n ...(parsed.callback.threadKey ? { threadKey: parsed.callback.threadKey } : {})\n }\n });\n return c.json({ outcome: \"child_run_created\", decision, plan: execution.plan, run: childRun }, 201);\n });\n\n app.get(\"/v1/follow-up-requests/:id\", async (c) => {\n const followUpRequest = await repo.getFollowUpRequest({ id: c.req.param(\"id\") });\n if (!followUpRequest) return c.json({ error: \"follow_up_request_not_found\" }, 404);\n return c.json({ followUpRequest });\n });\n\n app.post(\"/v1/follow-up-requests/:id/create-run\", async (c) => {\n const parsed = PromoteFollowUpRequestSchema.parse(await c.req.json());\n let promoted;\n try {\n promoted = await repo.createRunFromFollowUpRequest({\n followUpRequestId: c.req.param(\"id\"),\n runId: parsed.runId\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.startsWith(\"Follow-up request not found:\")) {\n return c.json({ error: \"follow_up_request_not_found\" }, 404);\n }\n if (message.includes(\"is not queued\")) {\n return c.json({ error: \"follow_up_request_not_queued\" }, 409);\n }\n throw error;\n }\n const followUpRequest = promoted.followUpRequest;\n const event = followUpRequest.event;\n if (presentation.shouldDeliverAcknowledgement(event.callback.provider)) {\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n retry: callbackRetry,\n message: {\n runId: promoted.run.id,\n kind: \"acknowledgement\",\n provider: event.callback.provider,\n uri: event.callback.uri,\n body: presentation.acknowledgement({ provider: event.callback.provider, runId: promoted.run.id }),\n ...(event.target.agentId ? { agentId: event.target.agentId } : {}),\n ...(event.callback.threadKey ? { threadKey: event.callback.threadKey } : {})\n }\n });\n }\n return c.json({ followUpRequest, run: promoted.run }, 201);\n });\n\n app.post(\"/v1/runners/:runnerId/claim\", async (c) => {\n const claimed = await repo.claimNextRun({ runnerId: c.req.param(\"runnerId\"), leaseSeconds: 60 });\n if (!claimed) return c.body(null, 204);\n return c.json(claimed, 200);\n });\n\n app.post(\"/v1/runners/:runnerId/runs/:runId/heartbeat\", async (c) => {\n const ok = await repo.heartbeat({ runnerId: c.req.param(\"runnerId\"), runId: c.req.param(\"runId\") });\n if (!ok) return c.json({ error: \"run_not_claimed_by_runner\" }, 404);\n return c.json({ ok: true });\n });\n\n app.post(\"/v1/runs/:runId/running\", async (c) => {\n return c.json({\n error: \"runner_scoped_endpoint_required\",\n message: \"Use /v1/runners/:runnerId/runs/:runId/running, /progress, or /complete.\"\n }, 410);\n });\n\n app.post(\"/v1/runners/:runnerId/runs/:runId/running\", async (c) => {\n const body = z.object({ executor: z.string().min(1) }).parse(await c.req.json());\n const ok = await repo.markRunning({\n runId: c.req.param(\"runId\"),\n runnerId: c.req.param(\"runnerId\"),\n executor: body.executor\n });\n if (!ok) return c.json({ error: \"run_not_claimed_by_runner\" }, 404);\n return c.json({ ok: true });\n });\n\n app.post(\"/v1/runs/:runId/progress\", async () => {\n return new Response(JSON.stringify({\n error: \"runner_scoped_endpoint_required\",\n message: \"Use /v1/runners/:runnerId/runs/:runId/running, /progress, or /complete.\"\n }), { status: 410, headers: { \"content-type\": \"application/json\" } });\n });\n\n app.post(\"/v1/runners/:runnerId/runs/:runId/progress\", async (c) => {\n const runId = c.req.param(\"runId\");\n const body = ProgressSchema.parse(await c.req.json());\n const ok = await repo.recordProgress({\n runId,\n runnerId: c.req.param(\"runnerId\"),\n message: body.message,\n ...(body.type ? { type: body.type } : {}),\n ...(body.at ? { at: body.at } : {}),\n ...(body.visibility ? { visibility: body.visibility } : {}),\n ...(body.importance ? { importance: body.importance } : {})\n });\n if (!ok) return c.json({ error: \"run_not_claimed_by_runner\" }, 404);\n const stored = await repo.getRun({ runId });\n if (!stored) return c.json({ error: \"run_not_found\" }, 404);\n if (presentation.shouldDeliverProgress(stored.event.callback.provider)) {\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n retry: callbackRetry,\n message: {\n runId,\n kind: \"progress\",\n provider: stored.event.callback.provider,\n uri: stored.event.callback.uri,\n body: presentation.progress({ provider: stored.event.callback.provider, runId, message: body.message }),\n ...(stored.event.target.agentId ? { agentId: stored.event.target.agentId } : {}),\n ...(stored.event.callback.threadKey ? { threadKey: stored.event.callback.threadKey } : {}),\n statusMessageKey: `${runId}:status`\n }\n });\n }\n return c.json({ ok: true });\n });\n\n app.post(\"/v1/runs/:runId/complete\", async () => {\n return new Response(JSON.stringify({\n error: \"runner_scoped_endpoint_required\",\n message: \"Use /v1/runners/:runnerId/runs/:runId/running, /progress, or /complete.\"\n }), { status: 410, headers: { \"content-type\": \"application/json\" } });\n });\n\n app.post(\"/v1/runners/:runnerId/runs/:runId/complete\", async (c) => {\n const runId = c.req.param(\"runId\");\n const parsed = CompleteRunSchema.parse(await c.req.json());\n const ok = await repo.completeRun({ runId, runnerId: c.req.param(\"runnerId\"), result: parsed.result });\n if (!ok) return c.json({ error: \"run_not_claimed_by_runner\" }, 404);\n const stored = await repo.getRun({ runId });\n if (!stored) return c.json({ error: \"run_not_found\" }, 404);\n const finalPresentation = presentation.final({ provider: stored.event.callback.provider, result: parsed.result });\n await deliverAndAudit({\n repo,\n sink: callbackSink,\n retry: callbackRetry,\n message: {\n runId,\n kind: \"final\",\n provider: stored.event.callback.provider,\n uri: stored.event.callback.uri,\n body: finalPresentation.body,\n ...(stored.event.target.agentId ? { agentId: stored.event.target.agentId } : {}),\n ...(stored.event.callback.threadKey ? { threadKey: stored.event.callback.threadKey } : {}),\n ...(finalPresentation.blocks?.length ? { blocks: finalPresentation.blocks } : {})\n }\n });\n return c.json({ ok: true });\n });\n\n app.get(\"/v1/proposals/:proposalId\", async (c) => {\n const proposal = await repo.getSuggestedChanges({ proposalId: c.req.param(\"proposalId\") });\n if (!proposal) return c.json({ error: \"proposal_not_found\" }, 404);\n return c.json(proposal);\n });\n\n app.get(\"/v1/proposals/:proposalId/lineage\", async (c) => {\n const lineage = await repo.getProposalLineage({ proposalId: c.req.param(\"proposalId\") });\n if (!lineage) return c.json({ error: \"proposal_not_found\" }, 404);\n return c.json({ lineage });\n });\n\n app.get(\"/v1/proposals/:proposalId/current-intents\", async (c) => {\n const intents = await repo.listCurrentMutationIntents({ proposalId: c.req.param(\"proposalId\") });\n if (!intents) return c.json({ error: \"proposal_not_found\" }, 404);\n return c.json({ intents });\n });\n\n app.post(\"/v1/proposals/:proposalId/approvals\", async (c) => {\n const proposalId = c.req.param(\"proposalId\");\n const parsedBody = ApprovalDecisionInputSchema.safeParse(await c.req.json());\n if (!parsedBody.success) return c.json({ error: \"invalid_approval_decision\" }, 400);\n const body = parsedBody.data;\n const decision = await repo.recordApprovalDecision({\n id: body.id ?? `approval_${proposalId}_${Date.now()}`,\n proposalId,\n approvedIntentIds: body.approvedIntentIds,\n ...(body.rejectedIntentIds?.length ? { rejectedIntentIds: body.rejectedIntentIds } : {}),\n approvedBy: body.approvedBy,\n approvedAt: body.approvedAt ?? new Date().toISOString(),\n scope: body.scope,\n ...(body.reason ? { reason: body.reason } : {}),\n ...(body.metadata ? { metadata: body.metadata } : {})\n });\n if (!decision) return c.json({ error: \"proposal_not_found\" }, 404);\n return c.json({ decision }, 201);\n });\n\n app.get(\"/v1/approvals/:approvalDecisionId\", async (c) => {\n const decision = await repo.getApprovalDecision({ id: c.req.param(\"approvalDecisionId\") });\n if (!decision) return c.json({ error: \"approval_decision_not_found\" }, 404);\n return c.json({ decision });\n });\n\n app.post(\"/v1/proposals/:proposalId/apply-plans\", async (c) => {\n const proposalId = c.req.param(\"proposalId\");\n const body = ApplyPlanInputSchema.parse(await c.req.json());\n let executableTarget:\n | {\n proposal: NonNullable<Awaited<ReturnType<typeof repo.getSuggestedChanges>>>;\n target: NonNullable<ReturnType<typeof githubTargetFromEvent>>;\n }\n | undefined;\n\n if (body.execute) {\n if (body.adapter !== \"github\") {\n return c.json({ error: \"apply_execution_adapter_not_supported\" }, 422);\n }\n if (!input.githubApply) {\n return c.json({ error: \"github_apply_not_configured\" }, 422);\n }\n const proposal = await repo.getSuggestedChanges({ proposalId });\n if (!proposal) return c.json({ error: \"proposal_not_found\" }, 404);\n const stored = await repo.getRun({ runId: proposal.runId });\n if (!stored) return c.json({ error: \"run_not_found\" }, 404);\n const target = githubTargetFromEvent(stored.event);\n if (!target) {\n return c.json({ error: \"github_target_missing\" }, 422);\n }\n executableTarget = { proposal, target };\n }\n\n const applyPlanInput = {\n id: body.id ?? `apply_${proposalId}_${Date.now()}`,\n proposalId,\n approvalDecisionId: body.approvalDecisionId,\n ...(body.selectedIntentIds !== undefined ? { selectedIntentIds: body.selectedIntentIds } : {}),\n ...(body.adapter ? { adapter: body.adapter } : {})\n };\n let plan: ApplyPlan;\n if (body.execute) {\n const planResult = await repo.createApplyPlanOnce(applyPlanInput);\n if (!planResult) return c.json({ error: \"proposal_or_approval_not_found\" }, 404);\n plan = planResult.plan;\n if (!planResult.created) {\n return c.json({ plan, alreadyPlanned: true }, 200);\n }\n } else {\n const planResult = await repo.createApplyPlan(applyPlanInput);\n if (!planResult) return c.json({ error: \"proposal_or_approval_not_found\" }, 404);\n plan = planResult;\n }\n if (body.execute && executableTarget) {\n const githubApply = input.githubApply;\n if (!githubApply) {\n return c.json({ error: \"github_apply_not_configured\" }, 422);\n }\n const preflightOutcomeByIntentId = new Map((plan.outcomes ?? []).map((outcome) => [outcome.intentId, outcome]));\n const executableIntents = executableTarget.proposal.snapshot.intents.filter((intent) => {\n const outcome = preflightOutcomeByIntentId.get(intent.intentId);\n return outcome?.outcome === \"skipped\" && outcome.message?.startsWith(\"Preflight passed\");\n });\n const target = {\n token: githubApply.token,\n owner: executableTarget.target.owner,\n repo: executableTarget.target.repoName,\n ...(typeof executableTarget.target.issueNumber === \"number\" ? { issueNumber: executableTarget.target.issueNumber } : {}),\n ...(executableTarget.target.pullRequestNumber ? { pullRequestNumber: executableTarget.target.pullRequestNumber } : {})\n };\n const executedOutcomes = [];\n const compilerRegistry = createAdapterMutationCompilerRegistry([\n createGitHubIssueMutationCompiler({\n mappings: mappingsFromAdapterPlan(plan.adapterPlan),\n ...(executableTarget.target.targetKind ? { targetKind: executableTarget.target.targetKind } : {})\n })\n ]);\n for (const compilation of compilerRegistry.compile(\"github\", executableIntents)) {\n if (!compilation.ok) {\n executedOutcomes.push(compilation.outcome);\n continue;\n }\n executedOutcomes.push(\n await applyGitHubIssueMutationOperation({\n target,\n operation: compilation.operation as GitHubIssueMutationOperation,\n ...(githubApply.fetchImpl ? { fetchImpl: githubApply.fetchImpl } : {})\n })\n );\n }\n const executedOutcomeByIntentId = new Map(executedOutcomes.map((outcome) => [outcome.intentId, outcome]));\n const mergedOutcomes = (plan.outcomes ?? []).map((outcome) => executedOutcomeByIntentId.get(outcome.intentId) ?? outcome);\n const executedPlan = await repo.updateApplyPlanOutcomes({\n id: plan.id,\n outcomes: mergedOutcomes,\n externalWritesExecuted: true\n });\n return c.json({ plan: executedPlan ?? plan }, 201);\n }\n return c.json({ plan }, 201);\n });\n\n app.get(\"/v1/apply-plans/:applyPlanId\", async (c) => {\n const plan = await repo.getApplyPlan({ id: c.req.param(\"applyPlanId\") });\n if (!plan) return c.json({ error: \"apply_plan_not_found\" }, 404);\n return c.json({ plan });\n });\n\n app.post(\"/v1/runs/:runId/child-runs\", async (c) => {\n const parentRunId = c.req.param(\"runId\");\n const body = ChildRunInputSchema.parse(await c.req.json());\n const parent = await repo.getRun({ runId: parentRunId });\n if (!parent) return c.json({ error: \"parent_run_not_found\" }, 404);\n const receivedAt = new Date().toISOString();\n const sourceProposalId = body.sourceProposalId ?? body.action.targetId;\n const { run } = await repo.createRun({\n id: body.runId,\n event: childEventFromParent({\n parentEvent: parent.event,\n childRunId: body.runId,\n ...(body.commandText ? { commandText: body.commandText } : {}),\n actionKind: body.action.kind,\n receivedAt\n }),\n parentRunId,\n triggeredByAction: body.action,\n ...(sourceProposalId ? { sourceProposalId } : {}),\n ...(body.sourceApplyPlanId ? { sourceApplyPlanId: body.sourceApplyPlanId } : {})\n });\n return c.json({ run }, 201);\n });\n\n app.get(\"/v1/runs/:runId\", async (c) => {\n const stored = await repo.getRun({ runId: c.req.param(\"runId\") });\n if (!stored) return c.json({ error: \"run_not_found\" }, 404);\n return c.json(stored);\n });\n\n app.get(\"/v1/runs/:runId/metrics\", async (c) => {\n const runId = c.req.param(\"runId\");\n const stored = await repo.getRun({ runId });\n if (!stored) return c.json({ error: \"run_not_found\" }, 404);\n const metrics = await repo.getRunMetrics({ runId });\n return c.json({ metrics });\n });\n\n app.get(\"/v1/runs/:runId/events\", async (c) => {\n const events = await repo.listRunEvents({ runId: c.req.param(\"runId\") });\n return c.json({ events });\n });\n\n return app;\n}\n","import {\n conversationKeysFromEvent,\n projectTargetRefFromEvent,\n RunAdmissionDecisionSchema,\n type OpenTagEvent,\n type OpenTagRun,\n type RunAdmissionDecision,\n type RunAdmissionReasonCode\n} from \"@opentag/core\";\nimport { type FollowUpRequest, type RepoBinding, type createOpenTagRepository } from \"@opentag/store\";\n\ntype Repository = ReturnType<typeof createOpenTagRepository>;\n\nexport type AgentAccessProfileCheckInput = {\n event: OpenTagEvent;\n binding: RepoBinding;\n};\n\nexport type AgentAccessProfileCheckResult =\n | { allowed: true }\n | {\n allowed: false;\n reason: string;\n reasonCode?: Extract<RunAdmissionReasonCode, \"agent_access_profile_denied\" | \"policy_rejected\">;\n };\n\nexport type AgentAccessProfileCheck = (input: AgentAccessProfileCheckInput) => Promise<AgentAccessProfileCheckResult>;\n\nexport type AdmitRunInput = {\n requestId: string;\n event: OpenTagEvent;\n};\n\nexport type AdmitRunResult =\n | {\n outcome: \"start\";\n decision: RunAdmissionDecision;\n binding: RepoBinding;\n }\n | {\n outcome: \"drop_duplicate\";\n decision: RunAdmissionDecision;\n run: OpenTagRun;\n idempotentReplay: true;\n }\n | {\n outcome: \"follow_up_queued\";\n decision: RunAdmissionDecision;\n followUpRequest: FollowUpRequest;\n }\n | {\n outcome: \"needs_human_decision\";\n decision: RunAdmissionDecision;\n };\n\nfunction isWriteCapable(event: OpenTagEvent): boolean {\n return event.permissions.some((permission) => [\"repo:write\", \"pr:create\", \"pr:update\"].includes(permission.scope));\n}\n\nfunction actorIsAllowed(event: OpenTagEvent, allowedActors: string[] | undefined): boolean {\n if (!allowedActors?.length) return true;\n return allowedActors.includes(event.actor.handle ?? \"\") || allowedActors.includes(event.actor.providerUserId);\n}\n\nfunction admissionDecision(input: {\n action: RunAdmissionDecision[\"action\"];\n reason: string;\n reasonCode: RunAdmissionReasonCode;\n event: OpenTagEvent;\n activeRunId?: string;\n}): RunAdmissionDecision {\n return RunAdmissionDecisionSchema.parse({\n action: input.action,\n reason: input.reason,\n reasonCode: input.reasonCode,\n decidedAt: new Date().toISOString(),\n ...(input.activeRunId ? { activeRunId: input.activeRunId } : {}),\n eventId: input.event.id\n });\n}\n\nasync function defaultAgentAccessProfileCheck(): Promise<AgentAccessProfileCheckResult> {\n return { allowed: true };\n}\n\nexport function createAdmissionRuntime(input: {\n repo: Repository;\n agentAccessProfileCheck?: AgentAccessProfileCheck;\n}) {\n const agentAccessProfileCheck = input.agentAccessProfileCheck ?? defaultAgentAccessProfileCheck;\n\n return {\n async admitRun(request: AdmitRunInput): Promise<AdmitRunResult> {\n const existingRun = await input.repo.getRunByEventId({ eventId: request.event.id });\n if (existingRun) {\n return {\n outcome: \"drop_duplicate\",\n decision: admissionDecision({\n action: \"drop_duplicate\",\n reason: \"Source event already created a run.\",\n reasonCode: \"duplicate_source_event\",\n event: request.event,\n activeRunId: existingRun.run.id\n }),\n run: existingRun.run,\n idempotentReplay: true\n };\n }\n\n const repoKey = projectTargetRefFromEvent(request.event);\n if (!repoKey) {\n return {\n outcome: \"needs_human_decision\",\n decision: admissionDecision({\n action: \"needs_human_decision\",\n reason: \"The event did not resolve to a repository context.\",\n reasonCode: \"repo_context_missing\",\n event: request.event\n })\n };\n }\n\n const binding = await input.repo.getRepoBinding(repoKey);\n if (!binding) {\n return {\n outcome: \"needs_human_decision\",\n decision: admissionDecision({\n action: \"needs_human_decision\",\n reason: \"No repository binding is configured for this work context.\",\n reasonCode: \"repo_not_bound\",\n event: request.event\n })\n };\n }\n\n if (isWriteCapable(request.event) && !actorIsAllowed(request.event, binding.allowedActors)) {\n return {\n outcome: \"needs_human_decision\",\n decision: admissionDecision({\n action: \"needs_human_decision\",\n reason: \"The requesting actor is not allowed to start a write-capable run in this repository.\",\n reasonCode: \"actor_not_allowed_for_write\",\n event: request.event\n })\n };\n }\n\n const accessDecision = await agentAccessProfileCheck({ event: request.event, binding });\n if (!accessDecision.allowed) {\n return {\n outcome: \"needs_human_decision\",\n decision: admissionDecision({\n action: \"needs_human_decision\",\n reason: accessDecision.reason,\n reasonCode: accessDecision.reasonCode ?? \"agent_access_profile_denied\",\n event: request.event\n })\n };\n }\n\n let activeRun: { run: OpenTagRun; event: OpenTagEvent } | null = null;\n for (const conversationKey of conversationKeysFromEvent(request.event)) {\n activeRun = await input.repo.findActiveRunForConversation({ conversationKey });\n if (activeRun) break;\n }\n if (activeRun) {\n const decision = admissionDecision({\n action: \"queue_follow_up\",\n reason: \"A run is already active for this thread; queue the new request as follow-up work.\",\n reasonCode: isWriteCapable(request.event) ? \"active_write_run_same_thread\" : \"active_run_same_thread\",\n event: request.event,\n activeRunId: activeRun.run.id\n });\n const { followUpRequest, created } = await input.repo.createFollowUpRequest({\n id: request.requestId,\n event: request.event,\n decision,\n activeRunId: activeRun.run.id\n });\n if (created) {\n await input.repo.appendRunEvent({\n runId: activeRun.run.id,\n type: \"follow_up_request.queued\",\n payload: { followUpRequestId: followUpRequest.id, sourceEventId: request.event.id },\n visibility: \"audit\",\n importance: \"normal\",\n message: decision.reason\n });\n }\n return {\n outcome: \"follow_up_queued\",\n decision,\n followUpRequest\n };\n }\n\n return {\n outcome: \"start\",\n decision: admissionDecision({\n action: \"start\",\n reason: \"Source event accepted and ready to create a run.\",\n reasonCode: \"new_event\",\n event: request.event\n }),\n binding\n };\n }\n };\n}\n"],"mappings":"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","names":["conversationKeysFromEvent","projectTargetRefFromEvent","conversationKeysFromEvent","projectTargetRefFromEvent","existingDecision","childRun","body"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { OpenTagRunResult } from "@opentag/core";
|
|
2
|
+
import { type SlackBlock } from "@opentag/slack";
|
|
3
|
+
import type { CallbackMessage } from "./server.js";
|
|
4
|
+
export type CallbackProvider = CallbackMessage["provider"];
|
|
5
|
+
export type PresentedCallbackBody = {
|
|
6
|
+
body: string;
|
|
7
|
+
blocks?: SlackBlock[];
|
|
8
|
+
};
|
|
9
|
+
export type CallbackPresentation = {
|
|
10
|
+
shouldDeliverAcknowledgement(provider: CallbackProvider): boolean;
|
|
11
|
+
shouldDeliverProgress(provider: CallbackProvider): boolean;
|
|
12
|
+
acknowledgement(input: {
|
|
13
|
+
provider: CallbackProvider;
|
|
14
|
+
runId: string;
|
|
15
|
+
}): string;
|
|
16
|
+
progress(input: {
|
|
17
|
+
provider: CallbackProvider;
|
|
18
|
+
runId: string;
|
|
19
|
+
message: string;
|
|
20
|
+
}): string;
|
|
21
|
+
final(input: {
|
|
22
|
+
provider: CallbackProvider;
|
|
23
|
+
result: OpenTagRunResult;
|
|
24
|
+
}): PresentedCallbackBody;
|
|
25
|
+
};
|
|
26
|
+
export declare function createDefaultCallbackPresentation(): CallbackPresentation;
|
|
27
|
+
//# sourceMappingURL=presentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../src/presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,EAAoF,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEnI,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,MAAM,gBAAgB,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;AAE3D,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,4BAA4B,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAClE,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAC3D,eAAe,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,gBAAgB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC;IAC9E,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,gBAAgB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC;IACxF,KAAK,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAE,GAAG,qBAAqB,CAAC;CAC/F,CAAC;AAEF,wBAAgB,iCAAiC,IAAI,oBAAoB,CA8CxE"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,18 +1,50 @@
|
|
|
1
|
+
import { type FetchLike as GitHubFetchLike } from "@opentag/github";
|
|
2
|
+
import type { SlackBlock } from "@opentag/slack";
|
|
3
|
+
import { createOpenTagRepository } from "@opentag/store";
|
|
1
4
|
import { Hono } from "hono";
|
|
5
|
+
import { type AgentAccessProfileCheck } from "./admission.js";
|
|
6
|
+
import { type CallbackPresentation } from "./presentation.js";
|
|
2
7
|
export type CallbackMessage = {
|
|
3
8
|
runId: string;
|
|
4
9
|
kind: "acknowledgement" | "progress" | "final";
|
|
5
|
-
provider:
|
|
10
|
+
provider: string;
|
|
6
11
|
uri: string;
|
|
7
12
|
body: string;
|
|
13
|
+
agentId?: string;
|
|
8
14
|
threadKey?: string;
|
|
15
|
+
statusMessageKey?: string;
|
|
16
|
+
blocks?: SlackBlock[];
|
|
9
17
|
};
|
|
10
18
|
export type CallbackSink = {
|
|
11
19
|
deliver(message: CallbackMessage): Promise<void>;
|
|
12
20
|
};
|
|
21
|
+
export type CallbackRetryOptions = {
|
|
22
|
+
maxAttempts?: number;
|
|
23
|
+
baseDelayMs?: number;
|
|
24
|
+
maxDelayMs?: number;
|
|
25
|
+
now?: Date;
|
|
26
|
+
};
|
|
27
|
+
export type GitHubApplyOptions = {
|
|
28
|
+
token: string;
|
|
29
|
+
fetchImpl?: GitHubFetchLike;
|
|
30
|
+
};
|
|
31
|
+
export declare function processPendingCallbacks(input: {
|
|
32
|
+
repo: ReturnType<typeof createOpenTagRepository>;
|
|
33
|
+
sink: CallbackSink;
|
|
34
|
+
limit?: number;
|
|
35
|
+
retry?: CallbackRetryOptions;
|
|
36
|
+
}): Promise<{
|
|
37
|
+
processed: number;
|
|
38
|
+
delivered: number;
|
|
39
|
+
failed: number;
|
|
40
|
+
}>;
|
|
13
41
|
export declare function createDispatcherApp(input: {
|
|
14
42
|
databasePath: string;
|
|
15
43
|
callbackSink?: CallbackSink;
|
|
16
44
|
pairingToken?: string;
|
|
45
|
+
presentation?: CallbackPresentation;
|
|
46
|
+
githubApply?: GitHubApplyOptions;
|
|
47
|
+
callbackRetry?: CallbackRetryOptions;
|
|
48
|
+
agentAccessProfileCheck?: AgentAccessProfileCheck;
|
|
17
49
|
}): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
18
50
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAyBA,OAAO,EAGL,KAAK,SAAS,IAAI,eAAe,EAClC,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAiB,MAAM,gBAAgB,CAAC;AAGxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAA0B,KAAK,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAqC,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAqpBjG,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,iBAAiB,GAAG,UAAU,GAAG,OAAO,CAAC;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B,CAAC;AA2HF,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,IAAI,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;IACjD,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAC9B,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBpE;AAgCD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;CACnD,8EA+3BA"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opentag/dispatcher",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Embeddable OpenTag dispatcher Hono app and callback sinks.",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=20"
|
|
8
|
+
},
|
|
6
9
|
"main": "./dist/index.js",
|
|
7
10
|
"types": "./dist/index.d.ts",
|
|
8
11
|
"exports": {
|
|
@@ -26,16 +29,18 @@
|
|
|
26
29
|
"agents",
|
|
27
30
|
"webhooks"
|
|
28
31
|
],
|
|
29
|
-
"license": "
|
|
32
|
+
"license": "MIT",
|
|
30
33
|
"dependencies": {
|
|
31
34
|
"better-sqlite3": "^11.7.0",
|
|
32
35
|
"drizzle-orm": "^0.45.2",
|
|
33
36
|
"hono": "^4.6.15",
|
|
34
37
|
"zod": "^3.24.1",
|
|
35
|
-
"@opentag/core": "0.
|
|
36
|
-
"@opentag/
|
|
37
|
-
"@opentag/
|
|
38
|
-
"@opentag/
|
|
38
|
+
"@opentag/core": "0.2.0",
|
|
39
|
+
"@opentag/slack": "0.2.0",
|
|
40
|
+
"@opentag/github": "0.2.0",
|
|
41
|
+
"@opentag/lark": "0.2.0",
|
|
42
|
+
"@opentag/store": "0.2.0",
|
|
43
|
+
"@opentag/telegram": "0.2.0"
|
|
39
44
|
},
|
|
40
45
|
"devDependencies": {
|
|
41
46
|
"@types/better-sqlite3": "^7.6.12",
|