@opentag/dispatcher 0.1.0 → 0.3.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 +21 -1
- 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 +1934 -85
- 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 +49 -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 {\n createSlackPostMessagePayload,\n createSlackReactionPayload,\n createSlackUpdateMessagePayload,\n parseSlackThreadKey,\n slackSourceReceiptReactionName\n} from \"@opentag/slack\";\nimport { createTelegramSendMessageDraftPayload, createTelegramSendMessagePayload, parseTelegramThreadKey } from \"@opentag/telegram\";\nimport type { CallbackMessage, CallbackSink, SourceReceipt, SourceReceiptSink } from \"./server.js\";\n\nexport type FetchLike = typeof fetch;\n\nconst DEFAULT_SLACK_SOURCE_RECEIPT_TIMEOUT_MS = 5_000;\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 | undefined;\n botTokensByAgentId?: Record<string, string> | undefined;\n agentId?: string | undefined;\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\nfunction metadataString(metadata: Record<string, unknown>, key: string): string | undefined {\n const value = metadata[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction slackSourceMessageTarget(receipt: SourceReceipt): { channelId: string; messageTs: string } | null {\n if (receipt.provider !== \"slack\") return null;\n const channelId = metadataString(receipt.event.metadata, \"channelId\");\n const messageTs = metadataString(receipt.event.metadata, \"messageTs\");\n return channelId && messageTs ? { channelId, messageTs } : null;\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nasync function fetchWithTimeout(input: {\n fetchImpl: FetchLike;\n uri: string;\n init: RequestInit;\n timeoutMs: number;\n}): Promise<Response | null> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), input.timeoutMs);\n try {\n return await input.fetchImpl(input.uri, { ...input.init, signal: controller.signal });\n } catch (error) {\n if (isAbortError(error)) return null;\n throw error;\n } finally {\n clearTimeout(timeout);\n }\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 botToken: input.botToken,\n botTokensByAgentId: input.botTokensByAgentId,\n 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 createSlackSourceReceiptSink(input: {\n botToken?: string;\n botTokensByAgentId?: Record<string, string>;\n fetchImpl?: FetchLike;\n reactionsAddUri?: string;\n timeoutMs?: number;\n}): SourceReceiptSink {\n const fetchImpl = input.fetchImpl ?? fetch;\n const reactionsAddUri = input.reactionsAddUri ?? \"https://slack.com/api/reactions.add\";\n const timeoutMs = input.timeoutMs ?? DEFAULT_SLACK_SOURCE_RECEIPT_TIMEOUT_MS;\n\n return {\n async deliver(receipt: SourceReceipt) {\n const target = slackSourceMessageTarget(receipt);\n if (!target) return { delivered: false };\n\n const botToken = slackBotTokenFor({\n botToken: input.botToken,\n botTokensByAgentId: input.botTokensByAgentId,\n agentId: receipt.agentId\n });\n if (!botToken) return { delivered: false };\n\n const response = await fetchWithTimeout({\n fetchImpl,\n uri: reactionsAddUri,\n timeoutMs,\n init: {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${botToken}`,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify(\n createSlackReactionPayload({\n channelId: target.channelId,\n messageTs: target.messageTs,\n name: slackSourceReceiptReactionName(receipt.state)\n })\n )\n }\n });\n if (!response) return { delivered: false };\n\n if (!response.ok) {\n throw new Error(`deliver Slack source receipt failed: ${response.status} ${await response.text()}`);\n }\n const body = (await response.json().catch(() => ({}))) as { ok?: boolean; error?: string } | null;\n if (body?.ok === false && body.error !== \"already_reacted\") {\n throw new Error(`deliver Slack source receipt failed: ${body?.error ?? \"unknown_error\"}`);\n }\n return { delivered: true };\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 botToken: input.botToken,\n botTokensByAgentId: input.botTokensByAgentId,\n 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\" && provider !== \"slack\";\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 PermissionGrant,\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 type { Context } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { z } from \"zod\";\n\n/**\n * Parse and validate a request body, mapping ONLY request-body parse failures to\n * HTTP 400. Malformed JSON (SyntaxError from c.req.json()) and request-schema\n * validation failures (ZodError from schema.parse()) are tagged as HTTPException\n * with status 400 so the global onError handler can return them as client errors\n * without masking unrelated internal ZodError/SyntaxError as 400s. Any other\n * error is rethrown unchanged and falls through to a 500.\n */\nasync function parseBody<S extends z.ZodTypeAny>(c: Context, schema: S): Promise<z.infer<S>> {\n let json: unknown;\n try {\n json = await c.req.json();\n } catch (err) {\n if (err instanceof SyntaxError) {\n throw new HTTPException(400, {\n res: c.json({ error: \"invalid_json_body\" }, 400)\n });\n }\n throw err;\n }\n\n const result = schema.safeParse(json);\n if (!result.success) {\n throw new HTTPException(400, {\n res: c.json({ error: \"invalid_request_body\", issues: result.error.issues }, 400)\n });\n }\n return result.data;\n}\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 permissions?: PermissionGrant[];\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 permissions: input.permissions ?? input.parentEvent.permissions\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 addPermissionGrant(permissions: PermissionGrant[], grant: PermissionGrant): PermissionGrant[] {\n if (permissions.some((permission) => permission.scope === grant.scope)) return permissions;\n return [...permissions, grant];\n}\n\nfunction childRunPermissionsForThreadAction(input: { resolved: ResolvedThreadAction; command: ThreadActionCommand }): PermissionGrant[] {\n let permissions = [...(input.resolved.proposal.event.permissions ?? [])];\n if (input.command.verb === \"apply\" || input.command.verb === \"continue\") {\n permissions = addPermissionGrant(permissions, {\n scope: \"repo:read\",\n reason: \"inspect the repository while continuing an approved source-thread action\"\n });\n permissions = addPermissionGrant(permissions, {\n scope: \"repo:write\",\n reason: \"apply an approved source-thread mutation on a run branch\"\n });\n }\n if (input.resolved.selectedCandidates.some((candidate) => candidate.intent.action === \"create_pull_request\")) {\n permissions = addPermissionGrant(permissions, {\n scope: \"pr:create\",\n reason: \"create the pull request approved in the source thread\"\n });\n }\n return permissions;\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 provider?: string;\n approvalDecisionId?: string;\n sourceApplyPlanId?: string;\n fallbackReason?: string;\n}): string {\n if (input.provider === \"slack\") {\n return [\n \"Approved. OpenTag will continue from this proposal in a follow-up run.\",\n ...(input.fallbackReason ? [`Reason: ${input.fallbackReason}`] : [])\n ].join(\"\\n\");\n }\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 renderAppliedThreadActionBody(input: {\n provider: string;\n selectionText: string;\n proposalId: string;\n selectedIntentIds: string[];\n outcomes: ApplyIntentOutcome[];\n}): string {\n const selectedOutcomes = input.outcomes.filter((outcome) => input.selectedIntentIds.includes(outcome.intentId));\n if (input.provider === \"slack\") {\n const lines = [`Applied ${input.selectionText}.`];\n for (const outcome of selectedOutcomes) {\n if (outcome.externalUri) {\n lines.push(`Result: ${outcome.externalUri}`);\n } else if (outcome.message) {\n lines.push(`Result: ${outcome.outcome}. ${outcome.message}`);\n } else {\n lines.push(`Result: ${outcome.outcome}.`);\n }\n }\n return lines.join(\"\\n\");\n }\n\n return [\n `Applied ${input.selectionText} from \\`${input.proposalId}\\`.`,\n \"\",\n \"Result:\",\n ...selectedOutcomes.map((outcome) => `- \\`${outcome.intentId}\\`: ${outcome.outcome}${outcome.externalUri ? ` (${outcome.externalUri})` : \"\"}`)\n ].join(\"\\n\");\n}\n\nfunction renderThreadActionRecordedBody(input: {\n provider: string;\n verb: \"approve\" | \"reject\";\n selectionText: string;\n proposalId: string;\n applyIndex?: number;\n}): string {\n const pastTense = input.verb === \"approve\" ? \"Approved\" : \"Rejected\";\n if (input.provider === \"slack\") {\n if (input.verb === \"approve\") {\n return `${pastTense} ${input.selectionText}.\\nNext: use Apply ${input.applyIndex ?? 1} when you want OpenTag to perform it.`;\n }\n return `${pastTense} ${input.selectionText}.`;\n }\n if (input.verb === \"approve\") {\n return `${pastTense} ${input.selectionText} from \\`${input.proposalId}\\`.\\n\\nReply with \\`apply ${input.applyIndex ?? 1}\\` to apply it, or \\`continue ${input.applyIndex ?? 1}\\` to continue with a follow-up run.`;\n }\n return `${pastTense} ${input.selectionText} from \\`${input.proposalId}\\`.`;\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 permissions: childRunPermissionsForThreadAction({ resolved: input.resolved, command: input.command })\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 SourceReceiptState = \"received\";\n\nexport type SourceReceiptDelivery = {\n delivered: boolean;\n};\n\nexport type SourceReceipt = {\n runId: string;\n provider: string;\n state: SourceReceiptState;\n event: OpenTagEvent;\n agentId?: string;\n};\n\nexport type SourceReceiptSink = {\n deliver(receipt: SourceReceipt): Promise<SourceReceiptDelivery>;\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\nconst noopSourceReceiptSink: SourceReceiptSink = {\n async deliver() {\n return { delivered: false };\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\nasync function deliverSourceReceiptBestEffort(input: {\n repo: ReturnType<typeof createOpenTagRepository>;\n sink: SourceReceiptSink;\n receipt: SourceReceipt;\n}): Promise<SourceReceiptDelivery> {\n try {\n const result = await input.sink.deliver(input.receipt);\n if (!result.delivered) return result;\n await input.repo.appendRunEvent({\n runId: input.receipt.runId,\n type: \"source_receipt.delivered\",\n payload: {\n provider: input.receipt.provider,\n state: input.receipt.state\n },\n visibility: \"audit\",\n importance: \"low\",\n message: `Source ${input.receipt.state} receipt delivered.`\n });\n return result;\n } catch (error) {\n await input.repo.appendRunEvent({\n runId: input.receipt.runId,\n type: \"source_receipt.failed\",\n payload: {\n provider: input.receipt.provider,\n state: input.receipt.state,\n error: error instanceof Error ? error.message : String(error)\n },\n visibility: \"audit\",\n importance: \"low\",\n message: `Source ${input.receipt.state} receipt failed.`\n });\n return { delivered: false };\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 sourceReceiptSink?: SourceReceiptSink;\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 sourceReceiptSink = input.sourceReceiptSink ?? noopSourceReceiptSink;\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 = await parseBody(c, CreateRunnerSchema);\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 = await parseBody(c, CreateRepoBindingSchema);\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 = await parseBody(c, UpsertPolicyRuleSchema);\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 = await parseBody(c, UpsertMutationMappingSchema);\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 = await parseBody(c, CreateChannelBindingSchema);\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 = await parseBody(c, CreateSlackChannelBindingSchema);\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 = await parseBody(c, CreateRunSchema);\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 const sourceReceiptDelivery = await deliverSourceReceiptBestEffort({\n repo,\n sink: sourceReceiptSink,\n receipt: {\n runId: run.id,\n provider: parsed.event.callback.provider,\n state: \"received\",\n event: parsed.event,\n ...(parsed.event.target.agentId ? { agentId: parsed.event.target.agentId } : {})\n }\n });\n const shouldDeliverAcknowledgement =\n presentation.shouldDeliverAcknowledgement(parsed.event.callback.provider) ||\n (parsed.event.callback.provider === \"slack\" && !sourceReceiptDelivery.delivered);\n if (shouldDeliverAcknowledgement) {\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 = await parseBody(c, ThreadActionInputSchema);\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 provider: parsed.callback.provider,\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 = renderThreadActionRecordedBody({\n provider: parsed.callback.provider,\n verb: \"reject\",\n selectionText,\n proposalId: resolved.resolved.proposal.snapshot.proposalId\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: \"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 = renderThreadActionRecordedBody({\n provider: parsed.callback.provider,\n verb: \"approve\",\n selectionText,\n proposalId: resolved.resolved.proposal.snapshot.proposalId,\n applyIndex: resolved.resolved.selectedCandidates[0]?.index ?? 1\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: \"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 provider: parsed.callback.provider,\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 provider: parsed.callback.provider,\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 = renderAppliedThreadActionBody({\n provider: parsed.callback.provider,\n selectionText,\n proposalId: resolved.resolved.proposal.snapshot.proposalId,\n selectedIntentIds: resolved.resolved.selectedIntentIds,\n outcomes\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 provider: parsed.callback.provider,\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 = await parseBody(c, PromoteFollowUpRequestSchema);\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 = await parseBody(c, z.object({ executor: z.string().min(1) }));\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 = await parseBody(c, ProgressSchema);\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 = await parseBody(c, CompleteRunSchema);\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 let rawBody: unknown;\n try {\n rawBody = await c.req.json();\n } catch (err) {\n if (err instanceof SyntaxError) {\n return c.json({ error: \"invalid_json_body\" }, 400);\n }\n throw err;\n }\n const parsedBody = ApprovalDecisionInputSchema.safeParse(rawBody);\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 = await parseBody(c, ApplyPlanInputSchema);\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 = await parseBody(c, ChildRunInputSchema);\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 app.onError((err, c) => {\n // Preserve explicit HTTP errors raised by handlers/middleware. Request-body\n // parse failures are surfaced as tagged HTTPException(400) by parseBody(),\n // so they are returned to the client here. Crucially, we no longer map raw\n // ZodError/SyntaxError to 400 globally: an internal ZodError (e.g. a store\n // repository validating a DB row) or a SyntaxError from an internal\n // JSON.parse must remain a 500 so monitoring still alerts on it.\n if (err instanceof HTTPException) {\n return err.getResponse();\n }\n // Unknown errors (including internal ZodError/SyntaxError) remain 500 so\n // monitoring still alerts on genuine server faults.\n console.error(\"dispatcher unhandled error\", err);\n return c.json({ error: \"internal_server_error\" }, 500);\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","metadataString","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,66 @@
|
|
|
1
|
+
import { type OpenTagEvent } from "@opentag/core";
|
|
2
|
+
import { type FetchLike as GitHubFetchLike } from "@opentag/github";
|
|
3
|
+
import type { SlackBlock } from "@opentag/slack";
|
|
4
|
+
import { createOpenTagRepository } from "@opentag/store";
|
|
1
5
|
import { Hono } from "hono";
|
|
6
|
+
import { type AgentAccessProfileCheck } from "./admission.js";
|
|
7
|
+
import { type CallbackPresentation } from "./presentation.js";
|
|
2
8
|
export type CallbackMessage = {
|
|
3
9
|
runId: string;
|
|
4
10
|
kind: "acknowledgement" | "progress" | "final";
|
|
5
|
-
provider:
|
|
11
|
+
provider: string;
|
|
6
12
|
uri: string;
|
|
7
13
|
body: string;
|
|
14
|
+
agentId?: string;
|
|
8
15
|
threadKey?: string;
|
|
16
|
+
statusMessageKey?: string;
|
|
17
|
+
blocks?: SlackBlock[];
|
|
9
18
|
};
|
|
10
19
|
export type CallbackSink = {
|
|
11
20
|
deliver(message: CallbackMessage): Promise<void>;
|
|
12
21
|
};
|
|
22
|
+
export type SourceReceiptState = "received";
|
|
23
|
+
export type SourceReceiptDelivery = {
|
|
24
|
+
delivered: boolean;
|
|
25
|
+
};
|
|
26
|
+
export type SourceReceipt = {
|
|
27
|
+
runId: string;
|
|
28
|
+
provider: string;
|
|
29
|
+
state: SourceReceiptState;
|
|
30
|
+
event: OpenTagEvent;
|
|
31
|
+
agentId?: string;
|
|
32
|
+
};
|
|
33
|
+
export type SourceReceiptSink = {
|
|
34
|
+
deliver(receipt: SourceReceipt): Promise<SourceReceiptDelivery>;
|
|
35
|
+
};
|
|
36
|
+
export type CallbackRetryOptions = {
|
|
37
|
+
maxAttempts?: number;
|
|
38
|
+
baseDelayMs?: number;
|
|
39
|
+
maxDelayMs?: number;
|
|
40
|
+
now?: Date;
|
|
41
|
+
};
|
|
42
|
+
export type GitHubApplyOptions = {
|
|
43
|
+
token: string;
|
|
44
|
+
fetchImpl?: GitHubFetchLike;
|
|
45
|
+
};
|
|
46
|
+
export declare function processPendingCallbacks(input: {
|
|
47
|
+
repo: ReturnType<typeof createOpenTagRepository>;
|
|
48
|
+
sink: CallbackSink;
|
|
49
|
+
limit?: number;
|
|
50
|
+
retry?: CallbackRetryOptions;
|
|
51
|
+
}): Promise<{
|
|
52
|
+
processed: number;
|
|
53
|
+
delivered: number;
|
|
54
|
+
failed: number;
|
|
55
|
+
}>;
|
|
13
56
|
export declare function createDispatcherApp(input: {
|
|
14
57
|
databasePath: string;
|
|
15
58
|
callbackSink?: CallbackSink;
|
|
59
|
+
sourceReceiptSink?: SourceReceiptSink;
|
|
16
60
|
pairingToken?: string;
|
|
61
|
+
presentation?: CallbackPresentation;
|
|
62
|
+
githubApply?: GitHubApplyOptions;
|
|
63
|
+
callbackRetry?: CallbackRetryOptions;
|
|
64
|
+
agentAccessProfileCheck?: AgentAccessProfileCheck;
|
|
17
65
|
}): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
18
66
|
//# 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":"AACA,OAAO,EAYL,KAAK,YAAY,EAYlB,MAAM,eAAe,CAAC;AACvB,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;AAkC5B,OAAO,EAA0B,KAAK,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAqC,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AA2uBjG,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,kBAAkB,GAAG,UAAU,CAAC;AAE5C,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACjE,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;AAiIF,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;AAqED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,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,8EAq7BA"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opentag/dispatcher",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.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/slack": "0.
|
|
38
|
-
"@opentag/
|
|
38
|
+
"@opentag/core": "0.3.0",
|
|
39
|
+
"@opentag/github": "0.3.0",
|
|
40
|
+
"@opentag/slack": "0.3.0",
|
|
41
|
+
"@opentag/telegram": "0.3.0",
|
|
42
|
+
"@opentag/lark": "0.3.0",
|
|
43
|
+
"@opentag/store": "0.3.0"
|
|
39
44
|
},
|
|
40
45
|
"devDependencies": {
|
|
41
46
|
"@types/better-sqlite3": "^7.6.12",
|