@opentag/lark 0.3.1 → 0.3.3

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/dist/inbound.d.ts CHANGED
@@ -74,6 +74,7 @@ export type LarkMessageHandlerConfig = {
74
74
  text: string;
75
75
  card?: LarkCard;
76
76
  }): Promise<void>;
77
+ suppressRunCreatedReply?: boolean;
77
78
  now?(): number;
78
79
  };
79
80
  export type LarkSelfServiceReply = {
@@ -1 +1 @@
1
- {"version":3,"file":"inbound.d.ts","sourceRoot":"","sources":["../src/inbound.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inbound.d.ts","sourceRoot":"","sources":["../src/inbound.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -869,7 +869,7 @@ function createLarkMessageHandler(config) {
869
869
  }
870
870
  const result = await config.createRun(event);
871
871
  if (result.outcome === "run_created") {
872
- if (!result.idempotentReplay) {
872
+ if (!result.idempotentReplay && !config.suppressRunCreatedReply) {
873
873
  await config.reply?.({ messageId, text: formatRunReceivedText(result.run.id) });
874
874
  }
875
875
  return { status: "created", runId: result.run.id, tenantKey, chatId };
@@ -972,6 +972,18 @@ async function updateLarkTextMessage(client, input) {
972
972
  }
973
973
  });
974
974
  }
975
+ async function addLarkMessageReaction(client, input) {
976
+ if (!client.request) throw new Error("Lark client does not support request.");
977
+ await client.request({
978
+ method: "POST",
979
+ url: `/open-apis/im/v1/messages/${encodeURIComponent(input.messageId)}/reactions`,
980
+ data: {
981
+ reaction_type: {
982
+ emoji_type: input.emojiType
983
+ }
984
+ }
985
+ });
986
+ }
975
987
 
976
988
  // src/ingress.ts
977
989
  var DEFAULT_AGENT_ID = "opentag";
@@ -1186,6 +1198,7 @@ function startLarkIngress(config, dependencies = {}) {
1186
1198
  });
1187
1199
  const handler = createLarkMessageHandler({
1188
1200
  agentId: config.agentId,
1201
+ suppressRunCreatedReply: true,
1189
1202
  ...config.botOpenId ? { botOpenId: config.botOpenId } : {},
1190
1203
  ...config.defaultRepoBinding ? { defaultRepoBinding: config.defaultRepoBinding } : {},
1191
1204
  async resolveChannelBinding(input) {
@@ -1484,6 +1497,7 @@ async function registerLarkPersonalAgent(input, dependencies = {}) {
1484
1497
  }
1485
1498
  export {
1486
1499
  DEFAULT_AGENT_ID,
1500
+ addLarkMessageReaction,
1487
1501
  createLarkActionReceiptCard,
1488
1502
  createLarkDoctorSummaryCard,
1489
1503
  createLarkFinalSummaryCard,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/normalize.ts","../src/inbound.ts","../src/render.ts","../src/ingress.ts","../src/outbound.ts","../src/registration.ts"],"sourcesContent":["import { commandFromRawText, type ContextPointer, type OpenTagCommand, type OpenTagEvent, type PermissionGrant } from \"@opentag/core\";\n\nexport type LarkChannelBinding = {\n tenantKey: string;\n chatId: string;\n repoProvider?: string;\n owner: string;\n repo: string;\n};\n\nexport type LarkMessageInput = {\n tenantKey: string;\n chatId: string;\n chatType: string;\n senderOpenId: string;\n text: string;\n messageId: string;\n rootId?: string;\n eventId: string;\n eventTimeMs: number;\n agentId?: string;\n botOpenId?: string;\n callbackUri?: string;\n binding: LarkChannelBinding;\n};\n\n// Strip `@_user_N` mention placeholders (whole \\d+ index) and collapse whitespace.\nexport function stripLarkMention(text: string): string {\n return text\n .replace(/@_user_\\d+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nexport function encodeLarkThreadKey(input: { tenantKey: string; chatId: string; messageId: string }): string {\n return `${input.tenantKey}|${input.chatId}|${input.messageId}`;\n}\n\nexport function parseLarkThreadKey(threadKey: string): { tenantKey: string; chatId: string; messageId: string } {\n const [tenantKey, chatId, messageId] = threadKey.split(\"|\");\n if (!tenantKey || !chatId || !messageId) {\n throw new Error(`Invalid Lark thread key: ${threadKey}`);\n }\n return { tenantKey, chatId, messageId };\n}\n\nfunction permissionsForIntent(intent: OpenTagCommand[\"intent\"]): PermissionGrant[] {\n const permissions: PermissionGrant[] = [\n {\n scope: \"chat:postMessage\",\n reason: \"reply in the originating Lark thread\"\n },\n {\n scope: \"runner:local\",\n reason: \"execute the run on a paired local daemon\"\n }\n ];\n\n if (intent === \"fix\" || intent === \"run\") {\n permissions.push(\n {\n scope: \"repo:read\",\n reason: \"inspect the repository in the paired local checkout\"\n },\n {\n scope: \"repo:write\",\n reason: \"commit code changes on an isolated run branch\"\n },\n {\n scope: \"pr:create\",\n reason: \"open a pull request for completed code changes\"\n }\n );\n }\n\n return permissions;\n}\n\nfunction contextPointersForCommand(command: OpenTagCommand): ContextPointer[] {\n const context: ContextPointer[] = [];\n\n for (const reference of command.parsed?.references ?? []) {\n if (reference.kind === \"url\") {\n context.push({\n kind: \"url\",\n uri: reference.uri,\n visibility: \"organization\",\n title: reference.title ?? \"Command URL reference\"\n });\n continue;\n }\n\n if (reference.kind === \"file\" || reference.kind === \"path\") {\n context.push({\n kind: \"file\",\n uri: reference.uri,\n ...(reference.line ? { line: reference.line } : {}),\n ...(reference.startLine ? { startLine: reference.startLine } : {}),\n ...(reference.endLine ? { endLine: reference.endLine } : {}),\n visibility: \"organization\",\n title: referenceTitle(reference)\n });\n }\n }\n\n return context;\n}\n\nfunction referenceTitle(reference: NonNullable<OpenTagCommand[\"parsed\"]>[\"references\"][number]): string {\n return reference.title ?? \"Command file reference\";\n}\n\nfunction commandMetadata(command: OpenTagCommand): Record<string, unknown> {\n if (!command.parsed) return {};\n return {\n commandParser: command.parsed.version,\n commandDiagnostics: command.parsed.diagnostics,\n ...(command.parsed.approval ? { approval: command.parsed.approval } : {}),\n ...(command.parsed.network ? { network: command.parsed.network } : {})\n };\n}\n\nexport function normalizeLarkMessage(input: LarkMessageInput): OpenTagEvent | null {\n const rawText = stripLarkMention(input.text);\n if (!rawText) return null;\n\n const command = commandFromRawText(rawText);\n const agentId = input.agentId ?? \"opentag\";\n\n return {\n id: `evt_lark_message_${input.eventId}`,\n source: \"lark\",\n sourceEventId: input.eventId,\n receivedAt: new Date(input.eventTimeMs).toISOString(),\n actor: {\n provider: \"lark\",\n providerUserId: input.senderOpenId,\n handle: input.senderOpenId,\n organizationId: input.tenantKey\n },\n target: {\n mention: input.botOpenId ? `@${input.botOpenId}` : \"@app\",\n agentId,\n ...(command.parsed?.executorHint ? { executorHint: command.parsed.executorHint } : {})\n },\n command,\n context: [\n {\n provider: \"lark\",\n kind: \"message\",\n uri: `lark://tenant/${input.tenantKey}/chat/${input.chatId}/message/${input.messageId}`,\n visibility: \"organization\",\n title: \"Lark message\"\n },\n {\n kind: \"text\",\n uri: input.text,\n visibility: \"organization\",\n title: \"Lark message text\"\n },\n ...contextPointersForCommand(command)\n ],\n permissions: permissionsForIntent(command.intent),\n callback: {\n provider: \"lark\",\n uri: input.callbackUri ?? \"lark://im/v1/messages\",\n threadKey: encodeLarkThreadKey({\n tenantKey: input.tenantKey,\n chatId: input.chatId,\n messageId: input.messageId\n })\n },\n metadata: {\n tenantKey: input.tenantKey,\n chatId: input.chatId,\n messageId: input.messageId,\n chatType: input.chatType,\n sourceDeliveryId: input.eventId,\n larkEventId: input.eventId,\n ...(input.rootId ? { rootId: input.rootId } : {}),\n ...(input.botOpenId ? { larkBotOpenId: input.botOpenId } : {}),\n ...commandMetadata(command),\n repoProvider: input.binding.repoProvider ?? \"github\",\n owner: input.binding.owner,\n repo: input.binding.repo\n }\n };\n}\n","import {\n createDoctorSummaryPresentation,\n createSourceThreadStatusPresentation,\n parseProjectTargetRef,\n renderOpenTagPresentationPlainText,\n type OpenTagDoctorSummaryPresentation,\n type OpenTagEvent,\n type OpenTagSourceThreadStatusPresentation\n} from \"@opentag/core\";\nimport type { CreateRunResult } from \"@opentag/client\";\nimport { type LarkChannelBinding, normalizeLarkMessage, stripLarkMention } from \"./normalize.js\";\nimport { createLarkDoctorSummaryCard, createLarkSourceThreadStatusCard, type LarkCard } from \"./render.js\";\n\nexport type LarkMention = { key?: string; id?: { open_id?: string }; name?: string };\n\n// Flattened `im.message.receive_v1` payload as delivered by the SDK EventDispatcher (header fields + message/sender on the top level). All optional (external input).\nexport type LarkInboundMessageEvent = {\n event_id?: string;\n event_type?: string;\n create_time?: string;\n tenant_key?: string;\n app_id?: string;\n sender?: {\n sender_id?: { open_id?: string; user_id?: string; union_id?: string };\n sender_type?: string;\n tenant_key?: string;\n };\n message?: {\n message_id?: string;\n root_id?: string;\n parent_id?: string;\n chat_id?: string;\n chat_type?: string;\n message_type?: string;\n content?: string;\n mentions?: LarkMention[];\n };\n};\n\nexport type LarkMessageHandlerConfig = {\n agentId: string;\n botOpenId?: string;\n callbackUri?: string;\n defaultRepoBinding?: { repoProvider: string; owner: string; repo: string };\n resolveChannelBinding(input: { tenantKey: string; chatId: string }): Promise<LarkChannelBinding | null>;\n createRun(event: OpenTagEvent): Promise<CreateRunResult>;\n // Self-service binding from within Lark (`/bind owner/repo`); optional so tests can omit it.\n bindChannel?(input: { tenantKey: string; chatId: string; repoProvider: string; owner: string; repo: string }): Promise<void>;\n // Explicit self-service unbinding; callers should keep any admin checks at the hosting boundary.\n unbindChannel?(input: { tenantKey: string; chatId: string }): Promise<void>;\n canManageBinding?(input: LarkBindingManagementContext): Promise<boolean> | boolean;\n // Explicit cancellation from within Lark. No runId means cancel the active run for this chat's Project Target.\n stopRun?(input: { tenantKey: string; chatId: string; runId?: string; requestedBy: string }): Promise<LarkStopRunResult>;\n // Optional redacted status/doctor renderers for hosting apps that can inspect richer runtime state.\n status?(input: LarkSelfServiceContext): Promise<LarkSelfServiceReply | string>;\n doctor?(input: LarkSelfServiceContext): Promise<LarkSelfServiceReply | string>;\n // Reply into the originating thread (onboarding hints, bind confirmations); optional.\n reply?(input: { messageId: string; text: string; card?: LarkCard }): Promise<void>;\n now?(): number;\n};\n\nexport type LarkSelfServiceReply = {\n text: string;\n card?: LarkCard;\n};\n\nexport type LarkSelfServiceContext = {\n tenantKey: string;\n chatId: string;\n messageId: string;\n binding: LarkChannelBinding | null;\n};\n\nexport type LarkBindingManagementContext = {\n action: \"bind\" | \"unbind\";\n tenantKey: string;\n chatId: string;\n chatType: string;\n senderOpenId: string;\n senderUserId?: string;\n senderUnionId?: string;\n messageId: string;\n eventId: string;\n};\n\nexport type LarkStopRunResult =\n | { outcome: \"cancelled\"; runId: string }\n | { outcome: \"not_found\"; runId?: string }\n | { outcome: \"already_terminal\"; runId: string };\n\nexport type LarkMessageHandlerOutcome = {\n status:\n | \"created\"\n | \"bound\"\n | \"unbound\"\n | \"self_service_help\"\n | \"self_service_status\"\n | \"self_service_doctor\"\n | \"self_service_stop\"\n | \"self_service_stop_unavailable\"\n | \"ignored_non_text\"\n | \"ignored_invalid_payload\"\n | \"ignored_group_requires_bot_open_id\"\n | \"ignored_not_addressed\"\n | \"ignored_bind_usage\"\n | \"ignored_bind_unavailable\"\n | \"ignored_bind_unauthorized\"\n | \"ignored_unbind_usage\"\n | \"ignored_unbind_unavailable\"\n | \"ignored_unbind_unauthorized\"\n | \"ignored_unbound_chat\"\n | \"ignored_empty_command\"\n | \"follow_up_queued\"\n | \"needs_human_decision\";\n runId?: string;\n followUpRequestId?: string;\n reason?: string;\n tenantKey?: string;\n chatId?: string;\n};\n\nconst BIND_USAGE =\n \"Usage: /bind <owner>/<repo> — e.g. /bind amplifthq/opentag (or /bind github:amplifthq/opentag).\";\nconst UNBIND_USAGE =\n \"Usage: /unbind confirm — disconnects this chat from its current Project Target. This does not remove local checkout allowlists or repository bindings.\";\nconst UNBOUND_HINT =\n \"This chat isn't connected to a Project Target yet. @-mention me with `/bind <owner>/<repo>` to connect it — e.g. /bind amplifthq/opentag.\";\nconst HELP_TEXT = [\n \"OpenTag commands:\",\n \"- /bind <owner>/<repo> or /bind <provider>:<owner>/<repo> connects this chat to a Project Target.\",\n \"- /unbind confirm disconnects this chat from its current Project Target; it never deletes local checkout config.\",\n \"- /status shows the current Project Target, active-run guidance, queued follow-ups, and the next safe action.\",\n \"- /doctor shows a redacted readiness summary for this source container.\",\n \"- /stop [run_id] requests cancellation for the active chat run or the specified run; this connector will not treat stop as a successful completion.\",\n \"Project Targets never use absolute local paths. Keep local checkout paths in runner config and allowlists.\",\n \"Group chats must @-mention the bot before commands or runs.\"\n].join(\"\\n\");\nconst STOP_UNAVAILABLE_TEXT = [\n \"Run cancellation from this Lark ingress is not configured.\",\n \"OpenTag will not treat a stop request as a successful completion. Use `opentag status --run <run_id>` for audit detail, or `opentag service stop` if you need to stop the local background service.\"\n].join(\"\\n\");\nconst BINDING_AUTH_DENIED_TEXT =\n \"Only an authorized Lark binding manager can change this chat's Project Target. Ask an admin to run the command or update local OpenTag channel bindings.\";\n\ntype DefaultRepoBinding = NonNullable<LarkMessageHandlerConfig[\"defaultRepoBinding\"]>;\n\nfunction bindingFromDefault(input: { tenantKey: string; chatId: string; binding: DefaultRepoBinding }): LarkChannelBinding {\n return {\n tenantKey: input.tenantKey,\n chatId: input.chatId,\n repoProvider: input.binding.repoProvider,\n owner: input.binding.owner,\n repo: input.binding.repo\n };\n}\n\nfunction shouldMigrateLegacyLocalBinding(input: {\n existing: LarkChannelBinding;\n defaultBinding: DefaultRepoBinding;\n}): boolean {\n return (\n input.defaultBinding.repoProvider === \"local\" &&\n input.defaultBinding.owner.startsWith(\"path_\") &&\n input.existing.repoProvider === \"local\" &&\n input.existing.owner === \"local\" &&\n input.existing.repo === input.defaultBinding.repo\n );\n}\n\nfunction extractText(content: string | undefined): string {\n if (!content) return \"\";\n try {\n const parsed = JSON.parse(content) as { text?: unknown };\n return typeof parsed.text === \"string\" ? parsed.text : \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction mentionsBot(mentions: LarkMention[] | undefined, botOpenId: string): boolean {\n return (mentions ?? []).some((mention) => mention.id?.open_id === botOpenId);\n}\n\nfunction formatProjectTarget(binding: LarkChannelBinding): string {\n return `${binding.repoProvider}:${binding.owner}/${binding.repo}`;\n}\n\nfunction normalizeSelfServiceReply(reply: LarkSelfServiceReply | string): LarkSelfServiceReply {\n return typeof reply === \"string\" ? { text: reply } : reply;\n}\n\nfunction parseSelfServiceCommand(command: string): \"help\" | \"status\" | \"doctor\" | null {\n const trimmed = command.trim();\n if (/^\\/help(\\s|$)/.test(trimmed)) return \"help\";\n if (/^\\/status(\\s|$)/.test(trimmed)) return \"status\";\n if (/^\\/doctor(\\s|$)/.test(trimmed)) return \"doctor\";\n return null;\n}\n\nfunction statusPresentation(input: {\n tenantKey: string;\n chatId: string;\n binding: LarkChannelBinding | null;\n}): OpenTagSourceThreadStatusPresentation {\n if (!input.binding) {\n return createSourceThreadStatusPresentation({\n title: \"OpenTag status:\",\n sourceContainer: `lark:${input.tenantKey}/${input.chatId}`,\n bindingState: \"unbound\",\n nextAction: UNBOUND_HINT,\n detailHint: \"active run and queued follow-up status are unavailable until this chat is bound.\"\n });\n }\n return createSourceThreadStatusPresentation({\n title: \"OpenTag status:\",\n sourceContainer: `lark:${input.tenantKey}/${input.chatId}`,\n projectTarget: formatProjectTarget(input.binding),\n bindingState: \"bound\",\n nextAction: \"send a follow-up in this thread, or check `opentag status --run <run_id>` locally for audit detail.\",\n stopHint: \"cancellation is explicit and is not reported as successful completion; timeout policy is surfaced in status/audit.\",\n detailHint: \"at most one run is active per Project Target + source thread; new same-thread requests queue behind it.\"\n });\n}\n\nfunction statusReply(input: { tenantKey: string; chatId: string; binding: LarkChannelBinding | null }): LarkSelfServiceReply {\n const presentation = statusPresentation(input);\n return {\n text: renderOpenTagPresentationPlainText(presentation),\n card: createLarkSourceThreadStatusCard(presentation)\n };\n}\n\nfunction doctorPresentation(input: {\n tenantKey: string;\n chatId: string;\n binding: LarkChannelBinding | null;\n}): OpenTagDoctorSummaryPresentation {\n return createDoctorSummaryPresentation({\n title: \"OpenTag doctor (redacted):\",\n checks: [\n { status: \"ok\", name: \"Source container\", message: `lark:${input.tenantKey}/${input.chatId}` },\n {\n status: input.binding ? \"ok\" : \"warn\",\n name: \"Project Target\",\n message: input.binding ? formatProjectTarget(input.binding) : \"not bound\"\n },\n { status: \"ok\", name: \"Secrets\", message: \"redacted. Use env/file/keychain SecretRef entries in local config instead of sharing secrets in chat.\" },\n {\n status: \"warn\",\n name: \"Runtime readiness\",\n message: \"check `opentag service status` locally; launchd running is not the same as connector ready.\"\n },\n { status: \"ok\", name: \"Source-thread output\", message: \"concise final replies by default; detailed process stays in audit/status.\" }\n ]\n });\n}\n\nfunction doctorReply(input: { tenantKey: string; chatId: string; binding: LarkChannelBinding | null }): LarkSelfServiceReply {\n const presentation = doctorPresentation(input);\n return {\n text: renderOpenTagPresentationPlainText(presentation),\n card: createLarkDoctorSummaryCard(presentation)\n };\n}\n\nfunction formatFollowUpQueuedText(input: { activeRunId?: string; followUpRequestId: string; reason?: string }): string {\n return [\n \"Queued as a follow-up.\",\n input.activeRunId ? `- Active run: ${input.activeRunId}` : \"- Active run: currently in this source thread.\",\n `- Follow-up request: ${input.followUpRequestId}`,\n input.reason ? `- Reason: ${input.reason}` : \"- Reason: another run is already active for this thread.\",\n \"- Next action: wait for the active run final reply, or inspect locally with `opentag status --run <run_id>`.\",\n \"- Stop/timeout: cancellation is explicit and will not be treated as successful completion; timeout details are recorded in audit/status.\"\n ].join(\"\\n\");\n}\n\nfunction formatRunReceivedText(runId: string): string {\n return [\n `Received. Run: ${runId}.`,\n \"- Use `/status` in this chat for active-run and queue state.\",\n `- Use \\`opentag status --run ${runId}\\` locally for audit detail.`\n ].join(\"\\n\");\n}\n\nfunction parseStopCommand(command: string): { runId?: string } | null {\n const match = command.trim().match(/^\\/stop(?:\\s+(\\S+))?\\s*$/);\n if (!match) return null;\n return match[1] ? { runId: match[1] } : {};\n}\n\nfunction formatStopResultText(result: LarkStopRunResult): string {\n if (result.outcome === \"cancelled\") {\n return [\n `Cancellation requested for run ${result.runId}.`,\n \"- OpenTag will not treat this stop request as a successful completion.\",\n \"- The local executor may need a moment to observe the cancellation; further nonessential completion writes are suppressed.\"\n ].join(\"\\n\");\n }\n if (result.outcome === \"already_terminal\") {\n return `Run ${result.runId} is already finished. OpenTag will not change its final result.`;\n }\n return result.runId\n ? `Run ${result.runId} was not found or is no longer cancelable.`\n : \"No active run was found for this chat and Project Target.\";\n}\n\n// Parse `/bind owner/repo` (or `/bind provider:owner/repo`). null = not a bind command; {ok:false} = malformed.\nfunction parseBindCommand(\n command: string\n): { ok: true; repoProvider: string; owner: string; repo: string } | { ok: false } | null {\n if (!/^\\/bind(\\s|$)/.test(command)) return null;\n const match = command.match(/^\\/bind\\s+(\\S+)\\s*$/);\n if (!match) return { ok: false };\n try {\n const ref = parseProjectTargetRef(match[1] as string);\n return { ok: true, repoProvider: ref.provider, owner: ref.owner, repo: ref.repo };\n } catch {\n return { ok: false };\n }\n}\n\nfunction parseUnbindCommand(command: string): { ok: true } | { ok: false } | null {\n if (!/^\\/unbind(\\s|$)/.test(command)) return null;\n return /^\\/unbind\\s+confirm\\s*$/.test(command) ? { ok: true } : { ok: false };\n}\n\nasync function canManageLarkBinding(\n config: LarkMessageHandlerConfig,\n context: LarkBindingManagementContext\n): Promise<boolean> {\n if (config.canManageBinding) return config.canManageBinding(context);\n return context.chatType === \"p2p\";\n}\n\n// Handle one inbound Lark message: group messages must @-mention the bot, then handle /bind, resolve binding, normalize, create a run.\nexport function createLarkMessageHandler(config: LarkMessageHandlerConfig) {\n return async function handleLarkMessage(data: LarkInboundMessageEvent): Promise<LarkMessageHandlerOutcome> {\n const message = data.message;\n if (!message || message.message_type !== \"text\") {\n return { status: \"ignored_non_text\" };\n }\n\n const tenantKey = data.tenant_key ?? data.sender?.tenant_key;\n const chatId = message.chat_id;\n const messageId = message.message_id;\n const eventId = data.event_id;\n const senderOpenId = data.sender?.sender_id?.open_id;\n if (!tenantKey || !chatId || !messageId || !eventId || !senderOpenId) {\n return { status: \"ignored_invalid_payload\" };\n }\n\n // Group messages must @-mention the bot before triggering a (write-capable) run; p2p is exempt.\n const chatType = message.chat_type ?? \"group\";\n const isDirect = chatType === \"p2p\";\n if (!isDirect) {\n if (!config.botOpenId) {\n return { status: \"ignored_group_requires_bot_open_id\", tenantKey, chatId };\n }\n if (!mentionsBot(message.mentions, config.botOpenId)) {\n return { status: \"ignored_not_addressed\", tenantKey, chatId };\n }\n }\n\n const command = stripLarkMention(extractText(message.content));\n\n // Self-service binding: connect this chat to a Project Target without leaving Lark.\n const bindRequest = parseBindCommand(command);\n if (bindRequest && !config.bindChannel) {\n return { status: \"ignored_bind_unavailable\", tenantKey, chatId };\n }\n if (bindRequest && config.bindChannel) {\n if (!bindRequest.ok) {\n await config.reply?.({ messageId, text: BIND_USAGE });\n return { status: \"ignored_bind_usage\", tenantKey, chatId };\n }\n const authorized = await canManageLarkBinding(config, {\n action: \"bind\",\n tenantKey,\n chatId,\n chatType,\n senderOpenId,\n ...(data.sender?.sender_id?.user_id ? { senderUserId: data.sender.sender_id.user_id } : {}),\n ...(data.sender?.sender_id?.union_id ? { senderUnionId: data.sender.sender_id.union_id } : {}),\n messageId,\n eventId\n });\n if (!authorized) {\n await config.reply?.({ messageId, text: BINDING_AUTH_DENIED_TEXT });\n return { status: \"ignored_bind_unauthorized\", tenantKey, chatId };\n }\n await config.bindChannel({\n tenantKey,\n chatId,\n repoProvider: bindRequest.repoProvider,\n owner: bindRequest.owner,\n repo: bindRequest.repo\n });\n await config.reply?.({\n messageId,\n text: `Connected this chat to Project Target ${bindRequest.repoProvider}:${bindRequest.owner}/${bindRequest.repo}. @-mention me with a task to start a run.`\n });\n return { status: \"bound\", tenantKey, chatId };\n }\n\n const unbindRequest = parseUnbindCommand(command);\n if (unbindRequest && !config.unbindChannel) {\n return { status: \"ignored_unbind_unavailable\", tenantKey, chatId };\n }\n if (unbindRequest && config.unbindChannel) {\n if (!unbindRequest.ok) {\n await config.reply?.({ messageId, text: UNBIND_USAGE });\n return { status: \"ignored_unbind_usage\", tenantKey, chatId };\n }\n const authorized = await canManageLarkBinding(config, {\n action: \"unbind\",\n tenantKey,\n chatId,\n chatType,\n senderOpenId,\n ...(data.sender?.sender_id?.user_id ? { senderUserId: data.sender.sender_id.user_id } : {}),\n ...(data.sender?.sender_id?.union_id ? { senderUnionId: data.sender.sender_id.union_id } : {}),\n messageId,\n eventId\n });\n if (!authorized) {\n await config.reply?.({ messageId, text: BINDING_AUTH_DENIED_TEXT });\n return { status: \"ignored_unbind_unauthorized\", tenantKey, chatId };\n }\n const binding = await config.resolveChannelBinding({ tenantKey, chatId });\n if (!binding) {\n await config.reply?.({ messageId, text: UNBOUND_HINT });\n return { status: \"ignored_unbound_chat\", tenantKey, chatId };\n }\n await config.unbindChannel({ tenantKey, chatId });\n await config.reply?.({\n messageId,\n text: `Disconnected this chat from Project Target ${formatProjectTarget(binding)}. @-mention me with \\`/bind <owner>/<repo>\\` to connect a new target.`\n });\n return { status: \"unbound\", tenantKey, chatId };\n }\n\n if (command.trim().length === 0) {\n return { status: \"ignored_empty_command\", tenantKey, chatId };\n }\n\n const stopRequest = parseStopCommand(command);\n if (stopRequest) {\n if (!config.stopRun) {\n await config.reply?.({ messageId, text: STOP_UNAVAILABLE_TEXT });\n return { status: \"self_service_stop_unavailable\", tenantKey, chatId };\n }\n const result = await config.stopRun({\n tenantKey,\n chatId,\n ...(stopRequest.runId ? { runId: stopRequest.runId } : {}),\n requestedBy: `lark:${senderOpenId}`\n });\n await config.reply?.({ messageId, text: formatStopResultText(result) });\n return { status: \"self_service_stop\", ...(result.runId ? { runId: result.runId } : {}), tenantKey, chatId };\n }\n\n const selfServiceCommand = parseSelfServiceCommand(command);\n if (selfServiceCommand === \"help\") {\n await config.reply?.({ messageId, text: HELP_TEXT });\n return { status: \"self_service_help\", tenantKey, chatId };\n }\n if (selfServiceCommand === \"status\" || selfServiceCommand === \"doctor\") {\n const binding = await config.resolveChannelBinding({ tenantKey, chatId });\n const context: LarkSelfServiceContext = { tenantKey, chatId, messageId, binding };\n const reply =\n selfServiceCommand === \"status\"\n ? normalizeSelfServiceReply(await (config.status?.(context) ?? Promise.resolve(statusReply({ tenantKey, chatId, binding }))))\n : normalizeSelfServiceReply(await (config.doctor?.(context) ?? Promise.resolve(doctorReply({ tenantKey, chatId, binding }))));\n await config.reply?.({ messageId, text: reply.text, ...(reply.card ? { card: reply.card } : {}) });\n return { status: selfServiceCommand === \"status\" ? \"self_service_status\" : \"self_service_doctor\", tenantKey, chatId };\n }\n\n let binding = await config.resolveChannelBinding({ tenantKey, chatId });\n if (binding && config.defaultRepoBinding && config.bindChannel) {\n if (shouldMigrateLegacyLocalBinding({ existing: binding, defaultBinding: config.defaultRepoBinding })) {\n await config.bindChannel({\n tenantKey,\n chatId,\n repoProvider: config.defaultRepoBinding.repoProvider,\n owner: config.defaultRepoBinding.owner,\n repo: config.defaultRepoBinding.repo\n });\n binding = bindingFromDefault({ tenantKey, chatId, binding: config.defaultRepoBinding });\n }\n }\n if (!binding) {\n if (config.defaultRepoBinding && config.bindChannel) {\n await config.bindChannel({\n tenantKey,\n chatId,\n repoProvider: config.defaultRepoBinding.repoProvider,\n owner: config.defaultRepoBinding.owner,\n repo: config.defaultRepoBinding.repo\n });\n binding = bindingFromDefault({ tenantKey, chatId, binding: config.defaultRepoBinding });\n } else {\n await config.reply?.({ messageId, text: UNBOUND_HINT });\n return { status: \"ignored_unbound_chat\", tenantKey, chatId };\n }\n }\n\n const parsedTime = data.create_time ? Number(data.create_time) : Number.NaN;\n const eventTimeMs = Number.isFinite(parsedTime) ? parsedTime : (config.now?.() ?? Date.now());\n\n const event = normalizeLarkMessage({\n tenantKey,\n chatId,\n chatType: message.chat_type ?? \"group\",\n senderOpenId,\n text: extractText(message.content),\n messageId,\n ...(message.root_id ? { rootId: message.root_id } : {}),\n eventId,\n eventTimeMs,\n agentId: config.agentId,\n ...(config.botOpenId ? { botOpenId: config.botOpenId } : {}),\n ...(config.callbackUri ? { callbackUri: config.callbackUri } : {}),\n binding\n });\n if (!event) {\n return { status: \"ignored_empty_command\" };\n }\n\n const result = await config.createRun(event);\n if (result.outcome === \"run_created\") {\n if (!result.idempotentReplay) {\n await config.reply?.({ messageId, text: formatRunReceivedText(result.run.id) });\n }\n return { status: \"created\", runId: result.run.id, tenantKey, chatId };\n }\n if (result.outcome === \"follow_up_queued\") {\n await config.reply?.({\n messageId,\n text: formatFollowUpQueuedText({\n followUpRequestId: result.followUpRequest.id,\n ...(result.decision.activeRunId ? { activeRunId: result.decision.activeRunId } : {}),\n reason: result.decision.reason\n })\n });\n return {\n status: \"follow_up_queued\",\n followUpRequestId: result.followUpRequest.id,\n ...(result.decision.activeRunId ? { runId: result.decision.activeRunId } : {}),\n reason: result.decision.reason,\n tenantKey,\n chatId\n };\n }\n return {\n status: \"needs_human_decision\",\n reason: result.decision.reason,\n tenantKey,\n chatId\n };\n };\n}\n","import {\n createFinalSummaryPresentation,\n type OpenTagActionReceiptPresentation,\n type OpenTagDoctorCheckPresentation,\n type OpenTagDoctorSummaryPresentation,\n type OpenTagFinalSummaryPresentation,\n type OpenTagPresentationAction,\n type OpenTagRunStatusPresentation,\n type OpenTagRunResult,\n type OpenTagSourceThreadStatusPresentation\n} from \"@opentag/core\";\n\nexport type LarkCardText = {\n tag: \"plain_text\" | \"lark_md\";\n content: string;\n};\n\nexport type LarkCardElement =\n | {\n tag: \"div\";\n text: LarkCardText;\n }\n | {\n tag: \"hr\";\n }\n | {\n tag: \"note\";\n elements: LarkCardText[];\n };\n\nexport type LarkCard = {\n config: {\n wide_screen_mode: boolean;\n update_multi?: boolean;\n };\n header: {\n template: \"green\" | \"red\" | \"yellow\" | \"blue\" | \"grey\";\n title: {\n tag: \"plain_text\";\n content: string;\n };\n };\n elements: LarkCardElement[];\n};\n\nexport type LarkRenderOptions = {\n auditRunId?: string;\n};\n\nfunction larkPlain(value: string): string {\n return value.replace(/`/g, \"\");\n}\n\nfunction auditCommand(runId: string): string {\n return `opentag status --run ${runId}`;\n}\n\nexport function renderLarkAcknowledgement(runId: string): string {\n return [\"Received. OpenTag is working.\", `Run: ${runId}`, `Use /status here for queue state; audit locally with ${auditCommand(runId)}.`].join(\"\\n\");\n}\n\nexport function renderLarkRunStatusPresentation(presentation: OpenTagRunStatusPresentation): string {\n if (presentation.state === \"received\") {\n return renderLarkAcknowledgement(presentation.runId);\n }\n if (presentation.state === \"queued\") {\n return [\"Queued behind an active run.\", `Run: ${presentation.runId}`, \"Use /status here for queue details.\"].join(\"\\n\");\n }\n if (presentation.state === \"waiting_for_approval\") {\n return [\"Waiting for your review.\", `Run: ${presentation.runId}`, \"Review the action receipt in this thread, or use /status here for details.\"].join(\"\\n\");\n }\n if (presentation.state === \"running\") {\n return [\"OpenTag is working.\", `Run: ${presentation.runId}`, \"Use /status here for details.\"].join(\"\\n\");\n }\n return [\n `OpenTag run ${presentation.state}.`,\n `Run: ${presentation.runId}`,\n ...(presentation.nextAction ? [presentation.nextAction] : [`Audit locally with ${auditCommand(presentation.runId)}.`])\n ].join(\"\\n\");\n}\n\nfunction larkRunStatusHeaderTemplate(state: OpenTagRunStatusPresentation[\"state\"]): LarkCard[\"header\"][\"template\"] {\n if (state === \"received\" || state === \"queued\" || state === \"running\") return \"blue\";\n if (state === \"waiting_for_approval\") return \"yellow\";\n if (state === \"completed\") return \"green\";\n if (state === \"failed\" || state === \"timed_out\") return \"red\";\n if (state === \"cancelled\" || state === \"interrupted\") return \"grey\";\n return \"blue\";\n}\n\nfunction larkRunStatusTitle(state: OpenTagRunStatusPresentation[\"state\"]): string {\n if (state === \"received\") return \"OpenTag received this\";\n if (state === \"queued\") return \"OpenTag queued this\";\n if (state === \"running\") return \"OpenTag is working\";\n if (state === \"waiting_for_approval\") return \"OpenTag is waiting for review\";\n return `OpenTag ${state}`;\n}\n\nexport function createLarkRunStatusCard(presentation: OpenTagRunStatusPresentation): LarkCard {\n const statusText = renderLarkRunStatusPresentation(presentation);\n return {\n config: {\n wide_screen_mode: true,\n update_multi: true\n },\n header: {\n template: larkRunStatusHeaderTemplate(presentation.state),\n title: {\n tag: \"plain_text\",\n content: larkRunStatusTitle(presentation.state)\n }\n },\n elements: [\n {\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: statusText\n }\n }\n ]\n };\n}\n\nexport function renderLarkFinalResult(result: OpenTagRunResult, options: LarkRenderOptions = {}): string {\n return renderLarkFinalSummaryPresentation(\n createFinalSummaryPresentation({\n result,\n ...(options.auditRunId ? { auditRunId: options.auditRunId } : {})\n })\n );\n}\n\nexport function renderLarkFinalSummaryPresentation(presentation: OpenTagFinalSummaryPresentation): string {\n const lines = [`Finished with ${presentation.outcome}.`, \"\", presentation.summary];\n\n if (presentation.verification?.length) {\n lines.push(\"\", \"Verification\");\n for (const check of presentation.verification) {\n lines.push(`- ${check.command}: ${check.outcome}`);\n }\n }\n\n if (presentation.nextActions?.length) {\n lines.push(\"\", `Next action: ${presentation.nextActions[0]}`);\n }\n if (presentation.auditRunId) {\n lines.push(\"\", `Audit: opentag status --run ${presentation.auditRunId}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction larkHeaderTemplate(outcome: string): LarkCard[\"header\"][\"template\"] {\n if (outcome === \"success\") return \"green\";\n if (outcome === \"failure\") return \"red\";\n if (outcome === \"cancelled\") return \"grey\";\n if (outcome === \"needs_human\") return \"blue\";\n return \"yellow\";\n}\n\nfunction compactCardText(text: string, maxLength: number): string {\n const compact = text.replace(/\\s+/g, \" \").trim();\n if (compact.length <= maxLength) return compact;\n return `${compact.slice(0, Math.max(0, maxLength - 1)).trimEnd()}...`;\n}\n\nfunction larkMarkdownList(items: string[]): string {\n return items.map((item) => `- ${item}`).join(\"\\n\");\n}\n\nfunction larkActionDecisionLabel(decision: OpenTagPresentationAction[\"visibleDecisions\"][number], index: number): string {\n if (decision === \"apply\") return `Apply now: apply ${index}`;\n if (decision === \"approve\") return `Approve only: approve ${index}`;\n if (decision === \"continue\") return `Continue: continue ${index}`;\n return `Reject: reject ${index}`;\n}\n\nfunction larkActionDetails(action: OpenTagPresentationAction): string[] {\n const rowDetails = action.detailRows?.map((row) => `${row.label}: ${larkPlain(row.value)}`) ?? [];\n if (rowDetails.length > 0) return rowDetails.map((detail) => compactCardText(detail, 180));\n\n const details = [`Target: ${action.targetLabel}`];\n if (action.setupReason) details.push(`Status: ${action.setupReason}`);\n if (action.details?.length) details.push(...action.details.slice(0, 3));\n return details.map((detail) => compactCardText(larkPlain(detail), 180));\n}\n\nfunction larkActionReceiptMarkdown(input: { title: string; actions: OpenTagPresentationAction[] }, options: { includeTitle?: boolean } = {}): string | undefined {\n if (input.actions.length === 0) return undefined;\n const visibleActions = input.actions.slice(0, 5);\n const lines = [\n ...(options.includeTitle === false ? [] : [`**${input.title}**`]),\n \"Choose a command in this source thread. Details stay in OpenTag audit/status.\"\n ];\n for (const action of visibleActions) {\n lines.push(\"\", `**${action.index}. ${compactCardText(action.title, 180)}**`);\n lines.push(...larkMarkdownList(larkActionDetails(action)).split(\"\\n\"));\n lines.push(...larkMarkdownList(action.visibleDecisions.map((decision) => larkActionDecisionLabel(decision, action.index))).split(\"\\n\"));\n }\n const remaining = input.actions.length - visibleActions.length;\n if (remaining > 0) {\n lines.push(\"\", `Showing first ${visibleActions.length} of ${input.actions.length} actions. Use opentag status locally for full detail.`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction larkFinalSummaryActionReceiptMarkdown(presentation: OpenTagFinalSummaryPresentation): string | undefined {\n const actions = presentation.actions ?? [];\n if (!presentation.actionReceiptTitle || actions.length === 0) return undefined;\n return larkActionReceiptMarkdown({ title: presentation.actionReceiptTitle, actions });\n}\n\nfunction larkActionReceiptHeaderTemplate(actions: OpenTagPresentationAction[]): LarkCard[\"header\"][\"template\"] {\n if (actions.some((action) => action.state === \"needs_setup\" || action.state === \"unsupported\")) return \"yellow\";\n if (actions.some((action) => action.state === \"ready_to_apply\" || action.state === \"needs_approval\")) return \"blue\";\n return \"grey\";\n}\n\nexport function createLarkFinalSummaryCard(presentation: OpenTagFinalSummaryPresentation): LarkCard {\n const elements: LarkCardElement[] = [\n {\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: compactCardText(presentation.summary, 900)\n }\n }\n ];\n\n if (presentation.verification?.length) {\n elements.push({ tag: \"hr\" });\n elements.push({\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: [\"**Verification**\", larkMarkdownList(presentation.verification.slice(0, 5).map((check) => `${larkPlain(check.command)}: ${check.outcome}`))].join(\n \"\\n\"\n )\n }\n });\n }\n\n if (presentation.changedFiles?.length) {\n elements.push({\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: [\"**Changed files**\", larkMarkdownList(presentation.changedFiles.slice(0, 8).map(larkPlain))].join(\"\\n\")\n }\n });\n }\n\n if (presentation.nextActions?.length) {\n elements.push({\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: [\"**Next action**\", larkMarkdownList(presentation.nextActions.map((action) => compactCardText(action, 240)))].join(\"\\n\")\n }\n });\n }\n\n const actionReceipt = larkFinalSummaryActionReceiptMarkdown(presentation);\n if (actionReceipt) {\n elements.push({ tag: \"hr\" });\n elements.push({\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: actionReceipt\n }\n });\n }\n\n if (presentation.auditRunId) {\n elements.push({\n tag: \"note\",\n elements: [\n {\n tag: \"plain_text\",\n content: `Audit: opentag status --run ${presentation.auditRunId}`\n }\n ]\n });\n }\n\n return {\n config: {\n wide_screen_mode: true,\n update_multi: true\n },\n header: {\n template: larkHeaderTemplate(presentation.outcome),\n title: {\n tag: \"plain_text\",\n content: `Finished: ${presentation.outcome}`\n }\n },\n elements\n };\n}\n\nexport function renderLarkActionReceiptPresentation(presentation: OpenTagActionReceiptPresentation): string {\n return [\n presentation.title,\n \"\",\n larkActionReceiptMarkdown({ title: presentation.title, actions: presentation.actions }, { includeTitle: false }) ?? \"No source-thread actions.\",\n ...(presentation.auditRunId ? [\"\", `Audit: opentag status --run ${presentation.auditRunId}`] : [])\n ].join(\"\\n\");\n}\n\nexport function createLarkActionReceiptCard(presentation: OpenTagActionReceiptPresentation): LarkCard {\n const elements: LarkCardElement[] = [\n {\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: larkActionReceiptMarkdown({ title: presentation.title, actions: presentation.actions }, { includeTitle: false }) ?? \"No source-thread actions.\"\n }\n }\n ];\n\n if (presentation.auditRunId) {\n elements.push({\n tag: \"note\",\n elements: [\n {\n tag: \"plain_text\",\n content: `Audit: opentag status --run ${presentation.auditRunId}`\n }\n ]\n });\n }\n\n return {\n config: {\n wide_screen_mode: true\n },\n header: {\n template: larkActionReceiptHeaderTemplate(presentation.actions),\n title: {\n tag: \"plain_text\",\n content: presentation.title.replace(/:$/, \"\")\n }\n },\n elements\n };\n}\n\nfunction larkDoctorHeaderTemplate(checks: OpenTagDoctorCheckPresentation[]): LarkCard[\"header\"][\"template\"] {\n if (checks.some((check) => check.status === \"fail\")) return \"red\";\n if (checks.some((check) => check.status === \"warn\" || check.status === \"unknown\")) return \"yellow\";\n return \"green\";\n}\n\nfunction larkStatusHeaderTemplate(presentation: OpenTagSourceThreadStatusPresentation): LarkCard[\"header\"][\"template\"] {\n if (presentation.bindingState === \"unbound\") return \"yellow\";\n if (presentation.activeRun) return \"blue\";\n return \"green\";\n}\n\nfunction checkStatusLabel(status: OpenTagDoctorCheckPresentation[\"status\"]): string {\n return status.toUpperCase();\n}\n\nexport function createLarkDoctorSummaryCard(presentation: OpenTagDoctorSummaryPresentation): LarkCard {\n return {\n config: {\n wide_screen_mode: true\n },\n header: {\n template: larkDoctorHeaderTemplate(presentation.checks),\n title: {\n tag: \"plain_text\",\n content: presentation.title.replace(/:$/, \"\")\n }\n },\n elements: presentation.checks.map((check) => ({\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: `**${checkStatusLabel(check.status)} ${check.name}**${check.message ? `\\n${compactCardText(check.message, 500)}` : \"\"}`\n }\n }))\n };\n}\n\nexport function createLarkSourceThreadStatusCard(presentation: OpenTagSourceThreadStatusPresentation): LarkCard {\n const elements: LarkCardElement[] = [\n {\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: [\n presentation.sourceContainer ? `**Source container**\\n${presentation.sourceContainer}` : undefined,\n `**Project Target**\\n${presentation.projectTarget ?? \"not bound\"}`,\n `**Active run**\\n${\n presentation.activeRun\n ? `${presentation.activeRun.id} (${presentation.activeRun.status})${\n presentation.activeRun.updatedAt ? `, updated ${presentation.activeRun.updatedAt}` : \"\"\n }`\n : \"none\"\n }`,\n presentation.currentCommand ? `**Command**\\n${compactCardText(presentation.currentCommand, 240)}` : undefined\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\\n\")\n }\n }\n ];\n\n const queuedTotal = presentation.queuedFollowUpsTotal ?? presentation.queuedFollowUps.length;\n const queuedIds = presentation.queuedFollowUps.map((followUp) => {\n const status = followUp.status ? ` (${followUp.status})` : \"\";\n const command = followUp.command ? `: ${compactCardText(followUp.command, 120)}` : \"\";\n return `${followUp.id}${status}${command}`;\n });\n const queuedOverflow = Math.max(queuedTotal - queuedIds.length, 0);\n const queuedSummary =\n queuedTotal === 0\n ? \"none\"\n : `${queuedTotal}${queuedIds.length ? ` (${queuedIds.join(\", \")}${queuedOverflow > 0 ? `, +${queuedOverflow} more` : \"\"})` : \"\"}`;\n\n elements.push({\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: [\"**Queued follow-ups**\", queuedSummary, \"\", \"**Next action**\", compactCardText(presentation.nextAction, 360)].join(\"\\n\")\n }\n });\n\n if (presentation.stopHint || presentation.detailHint) {\n elements.push({\n tag: \"note\",\n elements: [\n {\n tag: \"plain_text\",\n content: [presentation.stopHint ? `Stop/timeout: ${presentation.stopHint}` : undefined, presentation.detailHint ? `Details: ${presentation.detailHint}` : undefined]\n .filter((line): line is string => Boolean(line))\n .join(\" \")\n }\n ]\n });\n }\n\n return {\n config: {\n wide_screen_mode: true\n },\n header: {\n template: larkStatusHeaderTemplate(presentation),\n title: {\n tag: \"plain_text\",\n content: presentation.title.replace(/:$/, \"\")\n }\n },\n elements\n };\n}\n\n// Lark text message content is a JSON-encoded `{ \"text\": \"...\" }` string.\nexport function createLarkTextMessageContent(text: string): string {\n return JSON.stringify({ text });\n}\n\n// Lark interactive message content is a JSON-encoded card object.\nexport function createLarkInteractiveMessageContent(card: LarkCard): string {\n return JSON.stringify(card);\n}\n","import { randomUUID } from \"node:crypto\";\nimport * as lark from \"@larksuiteoapi/node-sdk\";\nimport { createOpenTagClient, type ChannelRuntimeStatus } from \"@opentag/client\";\nimport {\n createDoctorSummaryPresentation,\n createSourceThreadStatusPresentation,\n parseProjectTargetRef,\n renderOpenTagPresentationPlainText,\n type OpenTagDoctorSummaryPresentation,\n type OpenTagEvent,\n type OpenTagSourceThreadStatusPresentation\n} from \"@opentag/core\";\nimport { createLarkReplyClient, replyLarkMessage } from \"./outbound.js\";\nimport { createLarkMessageHandler, type LarkInboundMessageEvent, type LarkMessageHandlerOutcome, type LarkSelfServiceReply } from \"./inbound.js\";\nimport { createLarkDoctorSummaryCard, createLarkSourceThreadStatusCard, type LarkCard } from \"./render.js\";\n\nexport const DEFAULT_AGENT_ID = \"opentag\";\n\nexport type LarkIngressConfig = {\n appId: string;\n appSecret: string;\n dispatcherUrl: string;\n dispatcherToken?: string;\n domain: \"lark\" | \"feishu\";\n agentId: string;\n botOpenId?: string;\n bindingAdminOpenIds?: string[];\n bindingAdminUserIds?: string[];\n bindingAdminUnionIds?: string[];\n runTimeoutMs?: number;\n defaultRepoBinding?: { repoProvider: string; owner: string; repo: string };\n};\n\nexport type LarkWsClient = {\n start(input: { eventDispatcher: unknown }): Promise<void>;\n close?(input?: { force?: boolean }): void | Promise<void>;\n};\n\nexport type LarkIngressDependencies = {\n createWsClient?(config: LarkIngressConfig): LarkWsClient;\n createEventDispatcher?(handler: (data: LarkInboundMessageEvent) => Promise<void>): unknown;\n reply?(input: { messageId: string; text: string; card?: LarkCard }): Promise<void>;\n logIgnored?(outcome: LarkMessageHandlerOutcome): void;\n};\n\nexport type LarkIngressHandle = {\n startPromise: Promise<void>;\n close(): Promise<void>;\n};\n\nfunction defaultRepoBindingFromEnv(value: string | undefined): LarkIngressConfig[\"defaultRepoBinding\"] {\n if (!value) return undefined;\n try {\n const ref = parseProjectTargetRef(value);\n return {\n repoProvider: ref.provider,\n owner: ref.owner,\n repo: ref.repo\n };\n } catch {\n throw new Error(\"OPENTAG_LARK_DEFAULT_REPO must be formatted as owner/repo or provider:owner/repo\");\n }\n}\n\nfunction domainFromEnv(value: string | undefined): LarkIngressConfig[\"domain\"] {\n const domain = value ?? \"lark\";\n if (domain !== \"lark\" && domain !== \"feishu\") {\n throw new Error(\"LARK_DOMAIN must be either lark or feishu\");\n }\n return domain;\n}\n\nfunction positiveIntegerFromEnv(name: string, value: string | undefined): number | undefined {\n if (!value) return undefined;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`${name} must be a positive integer`);\n }\n return parsed;\n}\n\nfunction csvList(value: string | undefined): string[] | undefined {\n const items = value\n ?.split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n return items?.length ? items : undefined;\n}\n\nexport function larkIngressConfigFromEnv(env: NodeJS.ProcessEnv): LarkIngressConfig {\n const appId = env.LARK_APP_ID;\n const appSecret = env.LARK_APP_SECRET;\n const dispatcherUrl = env.OPENTAG_DISPATCHER_URL;\n if (!appId || !appSecret) {\n throw new Error(\"LARK_APP_ID and LARK_APP_SECRET are required\");\n }\n if (!dispatcherUrl) {\n throw new Error(\"OPENTAG_DISPATCHER_URL is required\");\n }\n\n const defaultRepoBinding = defaultRepoBindingFromEnv(env.OPENTAG_LARK_DEFAULT_REPO);\n const runTimeoutMs = positiveIntegerFromEnv(\"OPENTAG_RUN_TIMEOUT_MS\", env.OPENTAG_RUN_TIMEOUT_MS);\n const bindingAdminOpenIds = csvList(env.OPENTAG_LARK_BINDING_ADMIN_OPEN_IDS);\n const bindingAdminUserIds = csvList(env.OPENTAG_LARK_BINDING_ADMIN_USER_IDS);\n const bindingAdminUnionIds = csvList(env.OPENTAG_LARK_BINDING_ADMIN_UNION_IDS);\n\n return {\n appId,\n appSecret,\n dispatcherUrl,\n domain: domainFromEnv(env.LARK_DOMAIN),\n agentId: env.OPENTAG_LARK_AGENT_ID ?? DEFAULT_AGENT_ID,\n ...(env.OPENTAG_DISPATCHER_TOKEN ? { dispatcherToken: env.OPENTAG_DISPATCHER_TOKEN } : {}),\n ...(env.LARK_BOT_OPEN_ID ? { botOpenId: env.LARK_BOT_OPEN_ID } : {}),\n ...(bindingAdminOpenIds ? { bindingAdminOpenIds } : {}),\n ...(bindingAdminUserIds ? { bindingAdminUserIds } : {}),\n ...(bindingAdminUnionIds ? { bindingAdminUnionIds } : {}),\n ...(runTimeoutMs ? { runTimeoutMs } : {}),\n ...(defaultRepoBinding ? { defaultRepoBinding } : {})\n };\n}\n\nfunction createDefaultWsClient(config: LarkIngressConfig): LarkWsClient {\n return new lark.WSClient({\n appId: config.appId,\n appSecret: config.appSecret,\n domain: config.domain === \"feishu\" ? lark.Domain.Feishu : lark.Domain.Lark\n });\n}\n\nfunction createDefaultEventDispatcher(handler: (data: LarkInboundMessageEvent) => Promise<void>): unknown {\n return new lark.EventDispatcher({}).register({\n \"im.message.receive_v1\": (data) => handler(data as unknown as LarkInboundMessageEvent)\n });\n}\n\nfunction logIgnored(outcome: LarkMessageHandlerOutcome): void {\n if (\n outcome.status === \"created\" ||\n outcome.status === \"bound\" ||\n outcome.status === \"unbound\" ||\n outcome.status === \"self_service_help\" ||\n outcome.status === \"self_service_status\" ||\n outcome.status === \"self_service_doctor\" ||\n outcome.status === \"self_service_stop\" ||\n outcome.status === \"self_service_stop_unavailable\"\n ) {\n return;\n }\n if (outcome.status === \"follow_up_queued\") {\n console.log(\n `[lark] queued follow-up${outcome.followUpRequestId ? ` follow_up_request_id=${outcome.followUpRequestId}` : \"\"}${outcome.runId ? ` active_run_id=${outcome.runId}` : \"\"}`\n );\n return;\n }\n if (outcome.status === \"needs_human_decision\") {\n console.log(`[lark] needs human decision${outcome.reason ? `: ${outcome.reason}` : \"\"}`);\n return;\n }\n if (outcome.status === \"ignored_unbound_chat\") {\n console.log(\n `[lark] ignored unbound chat - bind it: provider=lark accountId(tenant_key)=${outcome.tenantKey} conversationId(chat_id)=${outcome.chatId} (reply '/bind owner/repo' with a Project Target ref, or POST /v1/channel-bindings)`\n );\n return;\n }\n console.log(`[lark] ignored event: ${outcome.status}${outcome.chatId ? ` chat_id=${outcome.chatId}` : \"\"}`);\n}\n\nfunction formatProjectTarget(input: { repoProvider: string; owner: string; repo: string }): string {\n return `${input.repoProvider}:${input.owner}/${input.repo}`;\n}\n\nfunction queuedFollowUpsSummary(status: ChannelRuntimeStatus): string {\n if (status.queuedFollowUps.length === 0) return \"none.\";\n const visible = status.queuedFollowUps.slice(0, 3).map((followUp) => followUp.id);\n const suffix = status.queuedFollowUps.length > visible.length ? `, +${status.queuedFollowUps.length - visible.length} more` : \"\";\n return `${status.queuedFollowUps.length} (${visible.join(\", \")}${suffix}).`;\n}\n\nfunction formatDurationMs(ms: number): string {\n if (ms % 60_000 === 0) return `${ms / 60_000} minute(s)`;\n if (ms % 1_000 === 0) return `${ms / 1_000} second(s)`;\n return `${ms}ms`;\n}\n\nfunction runTimeoutPolicy(input: { runTimeoutMs?: number; status?: ChannelRuntimeStatus }): string {\n const hardTimeoutMs = input.status?.runTimeoutPolicy?.hardTimeoutMs ?? input.runTimeoutMs;\n return hardTimeoutMs ? `hard timeout after ${formatDurationMs(hardTimeoutMs)}` : \"disabled\";\n}\n\nfunction larkRuntimeStatusPresentation(status: ChannelRuntimeStatus, input: { runTimeoutMs?: number } = {}): OpenTagSourceThreadStatusPresentation {\n return createSourceThreadStatusPresentation({\n title: \"OpenTag status:\",\n sourceContainer: `${status.binding.provider}:${status.binding.accountId}/${status.binding.conversationId}`,\n projectTarget: formatProjectTarget(status.binding),\n bindingState: \"bound\",\n ...(status.activeRun\n ? {\n activeRun: {\n id: status.activeRun.id,\n status: status.activeRun.status,\n updatedAt: status.activeRun.updatedAt\n }\n }\n : {}),\n ...(status.activeEvent?.command.rawText ? { currentCommand: status.activeEvent.command.rawText } : {}),\n queuedFollowUps: status.queuedFollowUps.slice(0, 3).map((followUp) => ({\n id: followUp.id,\n status: followUp.status,\n command: followUp.event.command.rawText\n })),\n queuedFollowUpsTotal: status.queuedFollowUps.length,\n nextAction: status.activeRun\n ? \"wait for the final reply, send a follow-up to queue more context, or use `/stop` to request cancellation.\"\n : \"@-mention me with a task to start a run.\",\n stopHint: `cancellation is explicit and is not reported as successful completion; timeout policy: ${runTimeoutPolicy({ ...input, status })}.`,\n detailHint: \"use `opentag status --run <run_id>` locally for audit events and executor detail.\"\n });\n}\n\nfunction larkRuntimeStatusReply(status: ChannelRuntimeStatus, input: { runTimeoutMs?: number } = {}): LarkSelfServiceReply {\n const presentation = larkRuntimeStatusPresentation(status, input);\n return {\n text: renderOpenTagPresentationPlainText(presentation),\n card: createLarkSourceThreadStatusCard(presentation)\n };\n}\n\nfunction larkRuntimeDoctorPresentation(input: {\n tenantKey: string;\n chatId: string;\n status: ChannelRuntimeStatus;\n runTimeoutMs?: number;\n}): OpenTagDoctorSummaryPresentation {\n return createDoctorSummaryPresentation({\n title: \"OpenTag doctor (redacted):\",\n checks: [\n { status: \"ok\", name: \"Source container\", message: `lark:${input.tenantKey}/${input.chatId}` },\n { status: \"ok\", name: \"Project Target\", message: formatProjectTarget(input.status.binding) },\n { status: \"ok\", name: \"Dispatcher\", message: \"reachable for this source container.\" },\n {\n status: \"ok\",\n name: \"Active run\",\n message: input.status.activeRun\n ? `${input.status.activeRun.id} (${input.status.activeRun.status}), updated ${input.status.activeRun.updatedAt}.`\n : \"none.\"\n },\n { status: \"ok\", name: \"Queued follow-ups\", message: queuedFollowUpsSummary(input.status) },\n { status: \"ok\", name: \"Timeout policy\", message: runTimeoutPolicy({ ...input, status: input.status }) },\n {\n status: \"ok\",\n name: \"Runtime readiness\",\n message: \"source-container status is reachable; run `opentag service status` locally to confirm launchd, connector, executor, and heartbeat health.\"\n },\n { status: \"ok\", name: \"Secrets\", message: \"redacted. Use env/file/keychain SecretRef config and never paste app secrets into this chat.\" },\n { status: \"ok\", name: \"Source-thread output\", message: \"concise final replies by default; detailed process belongs in audit/status.\" }\n ]\n });\n}\n\nfunction larkRuntimeDoctorReply(input: { tenantKey: string; chatId: string; status: ChannelRuntimeStatus; runTimeoutMs?: number }): LarkSelfServiceReply {\n const presentation = larkRuntimeDoctorPresentation(input);\n return {\n text: renderOpenTagPresentationPlainText(presentation),\n card: createLarkDoctorSummaryCard(presentation)\n };\n}\n\nfunction formatStatusUnavailable(input: { binding?: { repoProvider?: string; owner: string; repo: string }; error: unknown }): string {\n const message = input.error instanceof Error ? input.error.message : String(input.error);\n return [\n \"OpenTag status:\",\n input.binding ? `- Project Target: ${formatProjectTarget({ repoProvider: input.binding.repoProvider ?? \"github\", owner: input.binding.owner, repo: input.binding.repo })}` : \"- Project Target: not bound.\",\n \"- Runtime status: unavailable from dispatcher.\",\n `- Reason: ${message}`,\n \"- Next action: check `opentag service status` and `opentag status` locally.\"\n ].join(\"\\n\");\n}\n\nfunction formatDoctorUnavailable(input: {\n tenantKey: string;\n chatId: string;\n binding?: { repoProvider?: string; owner: string; repo: string };\n error: unknown;\n}): string {\n const message = input.error instanceof Error ? input.error.message : String(input.error);\n return [\n \"OpenTag doctor (redacted):\",\n `- Source container: lark:${input.tenantKey}/${input.chatId}`,\n input.binding\n ? `- Project Target: ${formatProjectTarget({ repoProvider: input.binding.repoProvider ?? \"github\", owner: input.binding.owner, repo: input.binding.repo })}`\n : \"- Project Target: not bound.\",\n \"- Dispatcher: source-container status unavailable.\",\n `- Reason: ${message}`,\n \"- Runtime readiness: run `opentag service status` and `opentag status --channel lark:<tenant>/<chat>` locally.\",\n \"- Secrets: redacted; do not share local config or app secrets in this chat.\"\n ].join(\"\\n\");\n}\n\nexport function startLarkIngress(config: LarkIngressConfig, dependencies: LarkIngressDependencies = {}): LarkIngressHandle {\n const dispatcherClient = createOpenTagClient({\n dispatcherUrl: config.dispatcherUrl,\n ...(config.dispatcherToken ? { pairingToken: config.dispatcherToken } : {})\n });\n let replyClient: ReturnType<typeof createLarkReplyClient> | undefined;\n const reply =\n dependencies.reply ??\n ((input: { messageId: string; text: string; card?: LarkCard }) => {\n replyClient ??= createLarkReplyClient({ appId: config.appId, appSecret: config.appSecret, domain: config.domain });\n return replyLarkMessage(replyClient, input);\n });\n\n const handler = createLarkMessageHandler({\n agentId: config.agentId,\n ...(config.botOpenId ? { botOpenId: config.botOpenId } : {}),\n ...(config.defaultRepoBinding ? { defaultRepoBinding: config.defaultRepoBinding } : {}),\n async resolveChannelBinding(input) {\n try {\n const { binding } = await dispatcherClient.getChannelBinding({\n provider: \"lark\",\n accountId: input.tenantKey,\n conversationId: input.chatId\n });\n return {\n tenantKey: binding.accountId,\n chatId: binding.conversationId,\n repoProvider: binding.repoProvider,\n owner: binding.owner,\n repo: binding.repo\n };\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"channel_binding_not_found\")) {\n return null;\n }\n throw error;\n }\n },\n async bindChannel(input) {\n await dispatcherClient.bindChannel({\n provider: \"lark\",\n accountId: input.tenantKey,\n conversationId: input.chatId,\n repoProvider: input.repoProvider,\n owner: input.owner,\n repo: input.repo\n });\n },\n async unbindChannel(input) {\n await dispatcherClient.unbindChannel({\n provider: \"lark\",\n accountId: input.tenantKey,\n conversationId: input.chatId\n });\n },\n canManageBinding(input) {\n if (input.chatType === \"p2p\") return true;\n return Boolean(\n config.bindingAdminOpenIds?.includes(input.senderOpenId) ||\n (input.senderUserId && config.bindingAdminUserIds?.includes(input.senderUserId)) ||\n (input.senderUnionId && config.bindingAdminUnionIds?.includes(input.senderUnionId))\n );\n },\n async stopRun(input) {\n try {\n const result = input.runId\n ? await dispatcherClient.cancelRun({\n runId: input.runId,\n reason: \"Stop requested from Lark.\",\n requestedBy: input.requestedBy\n })\n : await dispatcherClient.cancelActiveChannelRun({\n provider: \"lark\",\n accountId: input.tenantKey,\n conversationId: input.chatId,\n reason: \"Stop requested from Lark.\",\n requestedBy: input.requestedBy\n });\n return { outcome: \"cancelled\", runId: result.run.id };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"run_already_terminal\")) {\n return { outcome: \"already_terminal\", runId: input.runId ?? \"active run\" };\n }\n if (\n message.includes(\"run_not_found\") ||\n message.includes(\"active_run_not_found\") ||\n message.includes(\"channel_binding_not_found\")\n ) {\n return input.runId ? { outcome: \"not_found\", runId: input.runId } : { outcome: \"not_found\" };\n }\n throw error;\n }\n },\n async status(input) {\n if (!input.binding) {\n const presentation = createSourceThreadStatusPresentation({\n title: \"OpenTag status:\",\n sourceContainer: `lark:${input.tenantKey}/${input.chatId}`,\n bindingState: \"unbound\",\n nextAction: \"@-mention me with `/bind <owner>/<repo>` to connect a Project Target.\",\n detailHint: \"active run and queued follow-up status are unavailable until this chat is bound.\"\n });\n return {\n text: renderOpenTagPresentationPlainText(presentation),\n card: createLarkSourceThreadStatusCard(presentation)\n };\n }\n try {\n return larkRuntimeStatusReply(\n await dispatcherClient.getChannelRuntimeStatus({\n provider: \"lark\",\n accountId: input.tenantKey,\n conversationId: input.chatId\n }),\n { ...(config.runTimeoutMs ? { runTimeoutMs: config.runTimeoutMs } : {}) }\n );\n } catch (error) {\n return formatStatusUnavailable({ binding: input.binding, error });\n }\n },\n async doctor(input) {\n if (!input.binding) {\n const presentation = createDoctorSummaryPresentation({\n title: \"OpenTag doctor (redacted):\",\n checks: [\n { status: \"ok\", name: \"Source container\", message: `lark:${input.tenantKey}/${input.chatId}` },\n { status: \"warn\", name: \"Project Target\", message: \"not bound.\" },\n { status: \"warn\", name: \"Dispatcher\", message: \"binding not found for this source container.\" },\n { status: \"ok\", name: \"Next action\", message: \"@-mention me with `/bind <owner>/<repo>` to connect a Project Target.\" },\n { status: \"ok\", name: \"Secrets\", message: \"redacted; do not share local config or app secrets in this chat.\" }\n ]\n });\n return {\n text: renderOpenTagPresentationPlainText(presentation),\n card: createLarkDoctorSummaryCard(presentation)\n };\n }\n try {\n return larkRuntimeDoctorReply({\n tenantKey: input.tenantKey,\n chatId: input.chatId,\n status: await dispatcherClient.getChannelRuntimeStatus({\n provider: \"lark\",\n accountId: input.tenantKey,\n conversationId: input.chatId\n }),\n ...(config.runTimeoutMs ? { runTimeoutMs: config.runTimeoutMs } : {})\n });\n } catch (error) {\n return formatDoctorUnavailable({ tenantKey: input.tenantKey, chatId: input.chatId, binding: input.binding, error });\n }\n },\n async reply(input) {\n await reply(input);\n },\n async createRun(event: OpenTagEvent) {\n const runId = `run_${randomUUID()}`;\n return dispatcherClient.createRun({ runId, event });\n }\n });\n\n const eventDispatcher = (dependencies.createEventDispatcher ?? createDefaultEventDispatcher)(async (data) => {\n try {\n (dependencies.logIgnored ?? logIgnored)(await handler(data));\n } catch (error) {\n console.error(\"[lark] failed to handle inbound message:\", error);\n }\n });\n const wsClient = (dependencies.createWsClient ?? createDefaultWsClient)(config);\n\n return {\n startPromise: wsClient.start({ eventDispatcher }),\n async close() {\n await wsClient.close?.({ force: true });\n }\n };\n}\n","import * as lark from \"@larksuiteoapi/node-sdk\";\nimport { createLarkInteractiveMessageContent, createLarkTextMessageContent, type LarkCard } from \"./render.js\";\n\ntype LarkReplyPayload = {\n path: { message_id: string };\n data: { content: string; msg_type: string; reply_in_thread?: boolean; uuid?: string };\n};\n\ntype LarkPatchPayload = {\n path: { message_id: string };\n data: { content: string };\n};\n\ntype LarkUpdatePayload = {\n path: { message_id: string };\n data: { content: string; msg_type: string };\n};\n\ntype LarkMessageMethod = \"reply\" | \"patch\" | \"update\";\n\ntype LarkMessageApi = {\n reply?: (payload?: LarkReplyPayload) => Promise<unknown>;\n patch?: (payload?: LarkPatchPayload) => Promise<unknown>;\n update?: (payload?: LarkUpdatePayload) => Promise<unknown>;\n};\n\nexport type LarkReplyResult = {\n messageId?: string;\n};\n\n// Minimal client surface OpenTag uses; lark.Client satisfies it structurally.\nexport type LarkReplyClient = {\n im: {\n message?: LarkMessageApi;\n v1?: {\n message?: LarkMessageApi;\n };\n };\n};\n\nexport function createLarkReplyClient(input: { appId: string; appSecret: string; domain?: \"lark\" | \"feishu\" }): LarkReplyClient {\n return new lark.Client({\n appId: input.appId,\n appSecret: input.appSecret,\n domain: input.domain === \"feishu\" ? lark.Domain.Feishu : lark.Domain.Lark\n });\n}\n\nfunction larkMessageApi(client: LarkReplyClient, method: LarkMessageMethod): LarkMessageApi {\n const legacyApi = client.im.message;\n if (legacyApi?.[method]) return legacyApi;\n const v1Api = client.im.v1?.message;\n if (v1Api?.[method]) return v1Api;\n throw new Error(`Lark client does not support message.${method}.`);\n}\n\nfunction larkReplyMessageId(response: unknown): string | undefined {\n if (!response || typeof response !== \"object\") return undefined;\n const data = \"data\" in response ? (response as { data?: unknown }).data : undefined;\n if (data && typeof data === \"object\" && \"message_id\" in data) {\n const value = (data as { message_id?: unknown }).message_id;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n if (\"message_id\" in response) {\n const value = (response as { message_id?: unknown }).message_id;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\nexport async function replyLarkMessage(client: LarkReplyClient, input: { messageId: string; text: string; card?: LarkCard }): Promise<LarkReplyResult> {\n const reply = larkMessageApi(client, \"reply\").reply;\n if (!reply) throw new Error(\"Lark client does not support message.reply.\");\n const response = await reply({\n path: { message_id: input.messageId },\n data: input.card\n ? { content: createLarkInteractiveMessageContent(input.card), msg_type: \"interactive\", reply_in_thread: true }\n : { content: createLarkTextMessageContent(input.text), msg_type: \"text\", reply_in_thread: true }\n });\n const messageId = larkReplyMessageId(response);\n return messageId ? { messageId } : {};\n}\n\nexport async function patchLarkMessageCard(client: LarkReplyClient, input: { messageId: string; card: LarkCard }): Promise<void> {\n const patch = larkMessageApi(client, \"patch\").patch;\n if (!patch) throw new Error(\"Lark client does not support message.patch.\");\n await patch({\n path: { message_id: input.messageId },\n data: {\n content: createLarkInteractiveMessageContent(input.card)\n }\n });\n}\n\nexport async function updateLarkTextMessage(client: LarkReplyClient, input: { messageId: string; text: string }): Promise<void> {\n const update = larkMessageApi(client, \"update\").update;\n if (!update) throw new Error(\"Lark client does not support message.update.\");\n await update({\n path: { message_id: input.messageId },\n data: {\n msg_type: \"text\",\n content: createLarkTextMessageContent(input.text)\n }\n });\n}\n","import * as lark from \"@larksuiteoapi/node-sdk\";\n\nconst REGISTRATION_SOURCE = \"opentag\";\nconst BOT_INFO_RETRIES = 6;\nconst BOT_INFO_RETRY_DELAY_MS = 2000;\n\nexport type LarkDomain = \"lark\" | \"feishu\";\n\nexport type LarkRegistrationQrCodeInfo = {\n url: string;\n expireIn: number;\n};\n\nexport type LarkRegistrationStatusInfo = {\n status: string;\n interval?: number;\n};\n\nexport type RegisteredLarkPersonalAgent = {\n appId: string;\n appSecret: string;\n domain: LarkDomain;\n operatorOpenId?: string;\n botOpenId?: string;\n botName?: string;\n};\n\nexport type LarkCredentialValidationResult = {\n botOpenId: string;\n botName: string;\n};\n\ntype LarkRegisterAppResult = {\n client_id: string;\n client_secret: string;\n user_info?: {\n open_id?: string;\n tenant_brand?: \"feishu\" | \"lark\";\n };\n};\n\ntype LarkRegisterApp = (options: {\n domain?: string;\n larkDomain?: string;\n source?: string;\n signal?: AbortSignal;\n onQRCodeReady: (info: LarkRegistrationQrCodeInfo) => void;\n onStatusChange?: (info: LarkRegistrationStatusInfo) => void;\n appPreset?: { name?: string; desc?: string };\n addons?: {\n scopes?: { tenant?: string[] };\n events?: { items?: { tenant?: string[] } };\n };\n createOnly?: boolean;\n}) => Promise<LarkRegisterAppResult>;\n\ntype BotInfoClient = {\n request(input: { url: string; method: \"GET\" }): Promise<unknown>;\n};\n\nexport type LarkPersonalAgentRegistrationDependencies = {\n registerApp?: LarkRegisterApp;\n createBotInfoClient?(input: { appId: string; appSecret: string; domain: LarkDomain }): BotInfoClient;\n sleep?(ms: number): Promise<void>;\n};\n\nexport type LarkCredentialValidationDependencies = {\n createBotInfoClient?(input: { appId: string; appSecret: string; domain: LarkDomain }): BotInfoClient;\n};\n\nexport type RegisterLarkPersonalAgentInput = {\n signal?: AbortSignal;\n onQrCode(info: LarkRegistrationQrCodeInfo): void;\n onStatus?(info: LarkRegistrationStatusInfo): void;\n onWarning?(message: string): void;\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction accountDomainFor(domain: LarkDomain): string {\n return domain === \"feishu\" ? \"accounts.feishu.cn\" : \"accounts.larksuite.com\";\n}\n\nfunction sdkDomainFor(domain: LarkDomain): lark.Domain {\n return domain === \"feishu\" ? lark.Domain.Feishu : lark.Domain.Lark;\n}\n\nfunction registrationDomainFromUserInfo(userInfo: LarkRegisterAppResult[\"user_info\"]): LarkDomain {\n if (userInfo?.tenant_brand === \"lark\") return \"lark\";\n if (userInfo?.tenant_brand === \"feishu\") return \"feishu\";\n return \"feishu\";\n}\n\nfunction createDefaultBotInfoClient(input: { appId: string; appSecret: string; domain: LarkDomain }): BotInfoClient {\n return new lark.Client({\n appId: input.appId,\n appSecret: input.appSecret,\n domain: sdkDomainFor(input.domain)\n });\n}\n\nfunction botInfoFromResponse(response: unknown): { botOpenId: string; botName: string } | undefined {\n const value = response as { bot?: { open_id?: string; app_name?: string; name?: string }; data?: { bot?: { open_id?: string; app_name?: string; name?: string } } };\n const bot = value.bot ?? value.data?.bot;\n if (!bot?.open_id) {\n return undefined;\n }\n return {\n botOpenId: bot.open_id,\n botName: bot.app_name || bot.name || \"OpenTag\"\n };\n}\n\nexport async function validateLarkCredentials(\n input: { appId: string; appSecret: string; domain: LarkDomain },\n dependencies: LarkCredentialValidationDependencies = {}\n): Promise<LarkCredentialValidationResult> {\n const client = (dependencies.createBotInfoClient ?? createDefaultBotInfoClient)(input);\n let response: unknown;\n try {\n response = await client.request({\n url: \"/open-apis/bot/v3/info\",\n method: \"GET\"\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`Lark credentials could not be verified: ${reason}`);\n }\n\n const botIdentity = botInfoFromResponse(response);\n if (!botIdentity) {\n throw new Error(\"Lark credentials could not be verified: bot/v3/info response did not include bot.open_id.\");\n }\n return botIdentity;\n}\n\nasync function fetchBotIdentity(\n input: { appId: string; appSecret: string; domain: LarkDomain },\n options: {\n createBotInfoClient: NonNullable<LarkPersonalAgentRegistrationDependencies[\"createBotInfoClient\"]>;\n sleep: (ms: number) => Promise<void>;\n onWarning?: (message: string) => void;\n }\n): Promise<Pick<RegisteredLarkPersonalAgent, \"botOpenId\" | \"botName\">> {\n const client = options.createBotInfoClient(input);\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= BOT_INFO_RETRIES; attempt += 1) {\n try {\n const botIdentity = botInfoFromResponse(\n await client.request({\n url: \"/open-apis/bot/v3/info\",\n method: \"GET\"\n })\n );\n if (botIdentity) {\n return botIdentity;\n }\n lastError = new Error(\"bot/v3/info response did not include bot.open_id.\");\n } catch (error) {\n lastError = error;\n }\n\n if (attempt < BOT_INFO_RETRIES) {\n await options.sleep(BOT_INFO_RETRY_DELAY_MS);\n }\n }\n\n const reason = lastError instanceof Error ? lastError.message : String(lastError);\n options.onWarning?.(\n `OpenTag could not fetch the Lark bot open_id automatically. Direct chat still works. For group chat, enter the bot open_id manually. Reason: ${reason}`\n );\n return {};\n}\n\nexport async function registerLarkPersonalAgent(\n input: RegisterLarkPersonalAgentInput,\n dependencies: LarkPersonalAgentRegistrationDependencies = {}\n): Promise<RegisteredLarkPersonalAgent> {\n let detectedDomain: LarkDomain | undefined;\n\n const registerApp = dependencies.registerApp ?? lark.registerApp;\n const registrationOptions = {\n // QR registration does not preselect a tenant. The SDK starts on the Feishu\n // bootstrap host and can switch polling to Lark when it detects an\n // international tenant; the created app's actual tenant is persisted below.\n domain: accountDomainFor(\"feishu\"),\n larkDomain: accountDomainFor(\"lark\"),\n source: REGISTRATION_SOURCE,\n createOnly: true,\n appPreset: {\n name: \"OpenTag {user}\",\n desc: \"Wake your local OpenTag agent from Lark.\"\n },\n addons: {\n scopes: {\n tenant: [\"im:message:send_as_bot\", \"im:message.p2p_msg:readonly\", \"im:message.group_msg:readonly\", \"im:chat:readonly\"]\n },\n events: {\n items: {\n tenant: [\"im.message.receive_v1\"]\n }\n }\n },\n onQRCodeReady: input.onQrCode,\n onStatusChange(info) {\n if (info.status === \"domain_switched\") {\n detectedDomain = \"lark\";\n }\n input.onStatus?.(info);\n }\n } satisfies Parameters<LarkRegisterApp>[0];\n\n const registration = await registerApp({\n ...registrationOptions,\n ...(input.signal ? { signal: input.signal } : {})\n });\n\n const domain = detectedDomain ?? registrationDomainFromUserInfo(registration.user_info);\n const botIdentity = await fetchBotIdentity(\n {\n appId: registration.client_id,\n appSecret: registration.client_secret,\n domain\n },\n {\n createBotInfoClient: dependencies.createBotInfoClient ?? createDefaultBotInfoClient,\n sleep: dependencies.sleep ?? sleep,\n ...(input.onWarning ? { onWarning: input.onWarning } : {})\n }\n );\n\n return {\n appId: registration.client_id,\n appSecret: registration.client_secret,\n domain,\n ...(registration.user_info?.open_id ? { operatorOpenId: registration.user_info.open_id } : {}),\n ...(botIdentity.botOpenId ? { botOpenId: botIdentity.botOpenId } : {}),\n ...(botIdentity.botName ? { botName: botIdentity.botName } : {})\n };\n}\n"],"mappings":"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","names":["binding","result","lark","createDoctorSummaryPresentation","createSourceThreadStatusPresentation","parseProjectTargetRef","renderOpenTagPresentationPlainText","parseProjectTargetRef","formatProjectTarget","createSourceThreadStatusPresentation","renderOpenTagPresentationPlainText","createDoctorSummaryPresentation","lark","registerApp"]}
1
+ {"version":3,"sources":["../src/normalize.ts","../src/inbound.ts","../src/render.ts","../src/ingress.ts","../src/outbound.ts","../src/registration.ts"],"sourcesContent":["import { commandFromRawText, type ContextPointer, type OpenTagCommand, type OpenTagEvent, type PermissionGrant } from \"@opentag/core\";\n\nexport type LarkChannelBinding = {\n tenantKey: string;\n chatId: string;\n repoProvider?: string;\n owner: string;\n repo: string;\n};\n\nexport type LarkMessageInput = {\n tenantKey: string;\n chatId: string;\n chatType: string;\n senderOpenId: string;\n text: string;\n messageId: string;\n rootId?: string;\n eventId: string;\n eventTimeMs: number;\n agentId?: string;\n botOpenId?: string;\n callbackUri?: string;\n binding: LarkChannelBinding;\n};\n\n// Strip `@_user_N` mention placeholders (whole \\d+ index) and collapse whitespace.\nexport function stripLarkMention(text: string): string {\n return text\n .replace(/@_user_\\d+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nexport function encodeLarkThreadKey(input: { tenantKey: string; chatId: string; messageId: string }): string {\n return `${input.tenantKey}|${input.chatId}|${input.messageId}`;\n}\n\nexport function parseLarkThreadKey(threadKey: string): { tenantKey: string; chatId: string; messageId: string } {\n const [tenantKey, chatId, messageId] = threadKey.split(\"|\");\n if (!tenantKey || !chatId || !messageId) {\n throw new Error(`Invalid Lark thread key: ${threadKey}`);\n }\n return { tenantKey, chatId, messageId };\n}\n\nfunction permissionsForIntent(intent: OpenTagCommand[\"intent\"]): PermissionGrant[] {\n const permissions: PermissionGrant[] = [\n {\n scope: \"chat:postMessage\",\n reason: \"reply in the originating Lark thread\"\n },\n {\n scope: \"runner:local\",\n reason: \"execute the run on a paired local daemon\"\n }\n ];\n\n if (intent === \"fix\" || intent === \"run\") {\n permissions.push(\n {\n scope: \"repo:read\",\n reason: \"inspect the repository in the paired local checkout\"\n },\n {\n scope: \"repo:write\",\n reason: \"commit code changes on an isolated run branch\"\n },\n {\n scope: \"pr:create\",\n reason: \"open a pull request for completed code changes\"\n }\n );\n }\n\n return permissions;\n}\n\nfunction contextPointersForCommand(command: OpenTagCommand): ContextPointer[] {\n const context: ContextPointer[] = [];\n\n for (const reference of command.parsed?.references ?? []) {\n if (reference.kind === \"url\") {\n context.push({\n kind: \"url\",\n uri: reference.uri,\n visibility: \"organization\",\n title: reference.title ?? \"Command URL reference\"\n });\n continue;\n }\n\n if (reference.kind === \"file\" || reference.kind === \"path\") {\n context.push({\n kind: \"file\",\n uri: reference.uri,\n ...(reference.line ? { line: reference.line } : {}),\n ...(reference.startLine ? { startLine: reference.startLine } : {}),\n ...(reference.endLine ? { endLine: reference.endLine } : {}),\n visibility: \"organization\",\n title: referenceTitle(reference)\n });\n }\n }\n\n return context;\n}\n\nfunction referenceTitle(reference: NonNullable<OpenTagCommand[\"parsed\"]>[\"references\"][number]): string {\n return reference.title ?? \"Command file reference\";\n}\n\nfunction commandMetadata(command: OpenTagCommand): Record<string, unknown> {\n if (!command.parsed) return {};\n return {\n commandParser: command.parsed.version,\n commandDiagnostics: command.parsed.diagnostics,\n ...(command.parsed.approval ? { approval: command.parsed.approval } : {}),\n ...(command.parsed.network ? { network: command.parsed.network } : {})\n };\n}\n\nexport function normalizeLarkMessage(input: LarkMessageInput): OpenTagEvent | null {\n const rawText = stripLarkMention(input.text);\n if (!rawText) return null;\n\n const command = commandFromRawText(rawText);\n const agentId = input.agentId ?? \"opentag\";\n\n return {\n id: `evt_lark_message_${input.eventId}`,\n source: \"lark\",\n sourceEventId: input.eventId,\n receivedAt: new Date(input.eventTimeMs).toISOString(),\n actor: {\n provider: \"lark\",\n providerUserId: input.senderOpenId,\n handle: input.senderOpenId,\n organizationId: input.tenantKey\n },\n target: {\n mention: input.botOpenId ? `@${input.botOpenId}` : \"@app\",\n agentId,\n ...(command.parsed?.executorHint ? { executorHint: command.parsed.executorHint } : {})\n },\n command,\n context: [\n {\n provider: \"lark\",\n kind: \"message\",\n uri: `lark://tenant/${input.tenantKey}/chat/${input.chatId}/message/${input.messageId}`,\n visibility: \"organization\",\n title: \"Lark message\"\n },\n {\n kind: \"text\",\n uri: input.text,\n visibility: \"organization\",\n title: \"Lark message text\"\n },\n ...contextPointersForCommand(command)\n ],\n permissions: permissionsForIntent(command.intent),\n callback: {\n provider: \"lark\",\n uri: input.callbackUri ?? \"lark://im/v1/messages\",\n threadKey: encodeLarkThreadKey({\n tenantKey: input.tenantKey,\n chatId: input.chatId,\n messageId: input.messageId\n })\n },\n metadata: {\n tenantKey: input.tenantKey,\n chatId: input.chatId,\n messageId: input.messageId,\n chatType: input.chatType,\n sourceDeliveryId: input.eventId,\n larkEventId: input.eventId,\n ...(input.rootId ? { rootId: input.rootId } : {}),\n ...(input.botOpenId ? { larkBotOpenId: input.botOpenId } : {}),\n ...commandMetadata(command),\n repoProvider: input.binding.repoProvider ?? \"github\",\n owner: input.binding.owner,\n repo: input.binding.repo\n }\n };\n}\n","import {\n createDoctorSummaryPresentation,\n createSourceThreadStatusPresentation,\n parseProjectTargetRef,\n renderOpenTagPresentationPlainText,\n type OpenTagDoctorSummaryPresentation,\n type OpenTagEvent,\n type OpenTagSourceThreadStatusPresentation\n} from \"@opentag/core\";\nimport type { CreateRunResult } from \"@opentag/client\";\nimport { type LarkChannelBinding, normalizeLarkMessage, stripLarkMention } from \"./normalize.js\";\nimport { createLarkDoctorSummaryCard, createLarkSourceThreadStatusCard, type LarkCard } from \"./render.js\";\n\nexport type LarkMention = { key?: string; id?: { open_id?: string }; name?: string };\n\n// Flattened `im.message.receive_v1` payload as delivered by the SDK EventDispatcher (header fields + message/sender on the top level). All optional (external input).\nexport type LarkInboundMessageEvent = {\n event_id?: string;\n event_type?: string;\n create_time?: string;\n tenant_key?: string;\n app_id?: string;\n sender?: {\n sender_id?: { open_id?: string; user_id?: string; union_id?: string };\n sender_type?: string;\n tenant_key?: string;\n };\n message?: {\n message_id?: string;\n root_id?: string;\n parent_id?: string;\n chat_id?: string;\n chat_type?: string;\n message_type?: string;\n content?: string;\n mentions?: LarkMention[];\n };\n};\n\nexport type LarkMessageHandlerConfig = {\n agentId: string;\n botOpenId?: string;\n callbackUri?: string;\n defaultRepoBinding?: { repoProvider: string; owner: string; repo: string };\n resolveChannelBinding(input: { tenantKey: string; chatId: string }): Promise<LarkChannelBinding | null>;\n createRun(event: OpenTagEvent): Promise<CreateRunResult>;\n // Self-service binding from within Lark (`/bind owner/repo`); optional so tests can omit it.\n bindChannel?(input: { tenantKey: string; chatId: string; repoProvider: string; owner: string; repo: string }): Promise<void>;\n // Explicit self-service unbinding; callers should keep any admin checks at the hosting boundary.\n unbindChannel?(input: { tenantKey: string; chatId: string }): Promise<void>;\n canManageBinding?(input: LarkBindingManagementContext): Promise<boolean> | boolean;\n // Explicit cancellation from within Lark. No runId means cancel the active run for this chat's Project Target.\n stopRun?(input: { tenantKey: string; chatId: string; runId?: string; requestedBy: string }): Promise<LarkStopRunResult>;\n // Optional redacted status/doctor renderers for hosting apps that can inspect richer runtime state.\n status?(input: LarkSelfServiceContext): Promise<LarkSelfServiceReply | string>;\n doctor?(input: LarkSelfServiceContext): Promise<LarkSelfServiceReply | string>;\n // Reply into the originating thread (onboarding hints, bind confirmations); optional.\n reply?(input: { messageId: string; text: string; card?: LarkCard }): Promise<void>;\n // OpenTag dispatcher callbacks can render the accepted-run status as an updateable card.\n // When that lifecycle callback is enabled, avoid also posting the legacy ingress text acknowledgement.\n suppressRunCreatedReply?: boolean;\n now?(): number;\n};\n\nexport type LarkSelfServiceReply = {\n text: string;\n card?: LarkCard;\n};\n\nexport type LarkSelfServiceContext = {\n tenantKey: string;\n chatId: string;\n messageId: string;\n binding: LarkChannelBinding | null;\n};\n\nexport type LarkBindingManagementContext = {\n action: \"bind\" | \"unbind\";\n tenantKey: string;\n chatId: string;\n chatType: string;\n senderOpenId: string;\n senderUserId?: string;\n senderUnionId?: string;\n messageId: string;\n eventId: string;\n};\n\nexport type LarkStopRunResult =\n | { outcome: \"cancelled\"; runId: string }\n | { outcome: \"not_found\"; runId?: string }\n | { outcome: \"already_terminal\"; runId: string };\n\nexport type LarkMessageHandlerOutcome = {\n status:\n | \"created\"\n | \"bound\"\n | \"unbound\"\n | \"self_service_help\"\n | \"self_service_status\"\n | \"self_service_doctor\"\n | \"self_service_stop\"\n | \"self_service_stop_unavailable\"\n | \"ignored_non_text\"\n | \"ignored_invalid_payload\"\n | \"ignored_group_requires_bot_open_id\"\n | \"ignored_not_addressed\"\n | \"ignored_bind_usage\"\n | \"ignored_bind_unavailable\"\n | \"ignored_bind_unauthorized\"\n | \"ignored_unbind_usage\"\n | \"ignored_unbind_unavailable\"\n | \"ignored_unbind_unauthorized\"\n | \"ignored_unbound_chat\"\n | \"ignored_empty_command\"\n | \"follow_up_queued\"\n | \"needs_human_decision\";\n runId?: string;\n followUpRequestId?: string;\n reason?: string;\n tenantKey?: string;\n chatId?: string;\n};\n\nconst BIND_USAGE =\n \"Usage: /bind <owner>/<repo> — e.g. /bind amplifthq/opentag (or /bind github:amplifthq/opentag).\";\nconst UNBIND_USAGE =\n \"Usage: /unbind confirm — disconnects this chat from its current Project Target. This does not remove local checkout allowlists or repository bindings.\";\nconst UNBOUND_HINT =\n \"This chat isn't connected to a Project Target yet. @-mention me with `/bind <owner>/<repo>` to connect it — e.g. /bind amplifthq/opentag.\";\nconst HELP_TEXT = [\n \"OpenTag commands:\",\n \"- /bind <owner>/<repo> or /bind <provider>:<owner>/<repo> connects this chat to a Project Target.\",\n \"- /unbind confirm disconnects this chat from its current Project Target; it never deletes local checkout config.\",\n \"- /status shows the current Project Target, active-run guidance, queued follow-ups, and the next safe action.\",\n \"- /doctor shows a redacted readiness summary for this source container.\",\n \"- /stop [run_id] requests cancellation for the active chat run or the specified run; this connector will not treat stop as a successful completion.\",\n \"Project Targets never use absolute local paths. Keep local checkout paths in runner config and allowlists.\",\n \"Group chats must @-mention the bot before commands or runs.\"\n].join(\"\\n\");\nconst STOP_UNAVAILABLE_TEXT = [\n \"Run cancellation from this Lark ingress is not configured.\",\n \"OpenTag will not treat a stop request as a successful completion. Use `opentag status --run <run_id>` for audit detail, or `opentag service stop` if you need to stop the local background service.\"\n].join(\"\\n\");\nconst BINDING_AUTH_DENIED_TEXT =\n \"Only an authorized Lark binding manager can change this chat's Project Target. Ask an admin to run the command or update local OpenTag channel bindings.\";\n\ntype DefaultRepoBinding = NonNullable<LarkMessageHandlerConfig[\"defaultRepoBinding\"]>;\n\nfunction bindingFromDefault(input: { tenantKey: string; chatId: string; binding: DefaultRepoBinding }): LarkChannelBinding {\n return {\n tenantKey: input.tenantKey,\n chatId: input.chatId,\n repoProvider: input.binding.repoProvider,\n owner: input.binding.owner,\n repo: input.binding.repo\n };\n}\n\nfunction shouldMigrateLegacyLocalBinding(input: {\n existing: LarkChannelBinding;\n defaultBinding: DefaultRepoBinding;\n}): boolean {\n return (\n input.defaultBinding.repoProvider === \"local\" &&\n input.defaultBinding.owner.startsWith(\"path_\") &&\n input.existing.repoProvider === \"local\" &&\n input.existing.owner === \"local\" &&\n input.existing.repo === input.defaultBinding.repo\n );\n}\n\nfunction extractText(content: string | undefined): string {\n if (!content) return \"\";\n try {\n const parsed = JSON.parse(content) as { text?: unknown };\n return typeof parsed.text === \"string\" ? parsed.text : \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction mentionsBot(mentions: LarkMention[] | undefined, botOpenId: string): boolean {\n return (mentions ?? []).some((mention) => mention.id?.open_id === botOpenId);\n}\n\nfunction formatProjectTarget(binding: LarkChannelBinding): string {\n return `${binding.repoProvider}:${binding.owner}/${binding.repo}`;\n}\n\nfunction normalizeSelfServiceReply(reply: LarkSelfServiceReply | string): LarkSelfServiceReply {\n return typeof reply === \"string\" ? { text: reply } : reply;\n}\n\nfunction parseSelfServiceCommand(command: string): \"help\" | \"status\" | \"doctor\" | null {\n const trimmed = command.trim();\n if (/^\\/help(\\s|$)/.test(trimmed)) return \"help\";\n if (/^\\/status(\\s|$)/.test(trimmed)) return \"status\";\n if (/^\\/doctor(\\s|$)/.test(trimmed)) return \"doctor\";\n return null;\n}\n\nfunction statusPresentation(input: {\n tenantKey: string;\n chatId: string;\n binding: LarkChannelBinding | null;\n}): OpenTagSourceThreadStatusPresentation {\n if (!input.binding) {\n return createSourceThreadStatusPresentation({\n title: \"OpenTag status:\",\n sourceContainer: `lark:${input.tenantKey}/${input.chatId}`,\n bindingState: \"unbound\",\n nextAction: UNBOUND_HINT,\n detailHint: \"active run and queued follow-up status are unavailable until this chat is bound.\"\n });\n }\n return createSourceThreadStatusPresentation({\n title: \"OpenTag status:\",\n sourceContainer: `lark:${input.tenantKey}/${input.chatId}`,\n projectTarget: formatProjectTarget(input.binding),\n bindingState: \"bound\",\n nextAction: \"send a follow-up in this thread, or check `opentag status --run <run_id>` locally for audit detail.\",\n stopHint: \"cancellation is explicit and is not reported as successful completion; timeout policy is surfaced in status/audit.\",\n detailHint: \"at most one run is active per Project Target + source thread; new same-thread requests queue behind it.\"\n });\n}\n\nfunction statusReply(input: { tenantKey: string; chatId: string; binding: LarkChannelBinding | null }): LarkSelfServiceReply {\n const presentation = statusPresentation(input);\n return {\n text: renderOpenTagPresentationPlainText(presentation),\n card: createLarkSourceThreadStatusCard(presentation)\n };\n}\n\nfunction doctorPresentation(input: {\n tenantKey: string;\n chatId: string;\n binding: LarkChannelBinding | null;\n}): OpenTagDoctorSummaryPresentation {\n return createDoctorSummaryPresentation({\n title: \"OpenTag doctor (redacted):\",\n checks: [\n { status: \"ok\", name: \"Source container\", message: `lark:${input.tenantKey}/${input.chatId}` },\n {\n status: input.binding ? \"ok\" : \"warn\",\n name: \"Project Target\",\n message: input.binding ? formatProjectTarget(input.binding) : \"not bound\"\n },\n { status: \"ok\", name: \"Secrets\", message: \"redacted. Use env/file/keychain SecretRef entries in local config instead of sharing secrets in chat.\" },\n {\n status: \"warn\",\n name: \"Runtime readiness\",\n message: \"check `opentag service status` locally; launchd running is not the same as connector ready.\"\n },\n { status: \"ok\", name: \"Source-thread output\", message: \"concise final replies by default; detailed process stays in audit/status.\" }\n ]\n });\n}\n\nfunction doctorReply(input: { tenantKey: string; chatId: string; binding: LarkChannelBinding | null }): LarkSelfServiceReply {\n const presentation = doctorPresentation(input);\n return {\n text: renderOpenTagPresentationPlainText(presentation),\n card: createLarkDoctorSummaryCard(presentation)\n };\n}\n\nfunction formatFollowUpQueuedText(input: { activeRunId?: string; followUpRequestId: string; reason?: string }): string {\n return [\n \"Queued as a follow-up.\",\n input.activeRunId ? `- Active run: ${input.activeRunId}` : \"- Active run: currently in this source thread.\",\n `- Follow-up request: ${input.followUpRequestId}`,\n input.reason ? `- Reason: ${input.reason}` : \"- Reason: another run is already active for this thread.\",\n \"- Next action: wait for the active run final reply, or inspect locally with `opentag status --run <run_id>`.\",\n \"- Stop/timeout: cancellation is explicit and will not be treated as successful completion; timeout details are recorded in audit/status.\"\n ].join(\"\\n\");\n}\n\nfunction formatRunReceivedText(runId: string): string {\n return [\n `Received. Run: ${runId}.`,\n \"- Use `/status` in this chat for active-run and queue state.\",\n `- Use \\`opentag status --run ${runId}\\` locally for audit detail.`\n ].join(\"\\n\");\n}\n\nfunction parseStopCommand(command: string): { runId?: string } | null {\n const match = command.trim().match(/^\\/stop(?:\\s+(\\S+))?\\s*$/);\n if (!match) return null;\n return match[1] ? { runId: match[1] } : {};\n}\n\nfunction formatStopResultText(result: LarkStopRunResult): string {\n if (result.outcome === \"cancelled\") {\n return [\n `Cancellation requested for run ${result.runId}.`,\n \"- OpenTag will not treat this stop request as a successful completion.\",\n \"- The local executor may need a moment to observe the cancellation; further nonessential completion writes are suppressed.\"\n ].join(\"\\n\");\n }\n if (result.outcome === \"already_terminal\") {\n return `Run ${result.runId} is already finished. OpenTag will not change its final result.`;\n }\n return result.runId\n ? `Run ${result.runId} was not found or is no longer cancelable.`\n : \"No active run was found for this chat and Project Target.\";\n}\n\n// Parse `/bind owner/repo` (or `/bind provider:owner/repo`). null = not a bind command; {ok:false} = malformed.\nfunction parseBindCommand(\n command: string\n): { ok: true; repoProvider: string; owner: string; repo: string } | { ok: false } | null {\n if (!/^\\/bind(\\s|$)/.test(command)) return null;\n const match = command.match(/^\\/bind\\s+(\\S+)\\s*$/);\n if (!match) return { ok: false };\n try {\n const ref = parseProjectTargetRef(match[1] as string);\n return { ok: true, repoProvider: ref.provider, owner: ref.owner, repo: ref.repo };\n } catch {\n return { ok: false };\n }\n}\n\nfunction parseUnbindCommand(command: string): { ok: true } | { ok: false } | null {\n if (!/^\\/unbind(\\s|$)/.test(command)) return null;\n return /^\\/unbind\\s+confirm\\s*$/.test(command) ? { ok: true } : { ok: false };\n}\n\nasync function canManageLarkBinding(\n config: LarkMessageHandlerConfig,\n context: LarkBindingManagementContext\n): Promise<boolean> {\n if (config.canManageBinding) return config.canManageBinding(context);\n return context.chatType === \"p2p\";\n}\n\n// Handle one inbound Lark message: group messages must @-mention the bot, then handle /bind, resolve binding, normalize, create a run.\nexport function createLarkMessageHandler(config: LarkMessageHandlerConfig) {\n return async function handleLarkMessage(data: LarkInboundMessageEvent): Promise<LarkMessageHandlerOutcome> {\n const message = data.message;\n if (!message || message.message_type !== \"text\") {\n return { status: \"ignored_non_text\" };\n }\n\n const tenantKey = data.tenant_key ?? data.sender?.tenant_key;\n const chatId = message.chat_id;\n const messageId = message.message_id;\n const eventId = data.event_id;\n const senderOpenId = data.sender?.sender_id?.open_id;\n if (!tenantKey || !chatId || !messageId || !eventId || !senderOpenId) {\n return { status: \"ignored_invalid_payload\" };\n }\n\n // Group messages must @-mention the bot before triggering a (write-capable) run; p2p is exempt.\n const chatType = message.chat_type ?? \"group\";\n const isDirect = chatType === \"p2p\";\n if (!isDirect) {\n if (!config.botOpenId) {\n return { status: \"ignored_group_requires_bot_open_id\", tenantKey, chatId };\n }\n if (!mentionsBot(message.mentions, config.botOpenId)) {\n return { status: \"ignored_not_addressed\", tenantKey, chatId };\n }\n }\n\n const command = stripLarkMention(extractText(message.content));\n\n // Self-service binding: connect this chat to a Project Target without leaving Lark.\n const bindRequest = parseBindCommand(command);\n if (bindRequest && !config.bindChannel) {\n return { status: \"ignored_bind_unavailable\", tenantKey, chatId };\n }\n if (bindRequest && config.bindChannel) {\n if (!bindRequest.ok) {\n await config.reply?.({ messageId, text: BIND_USAGE });\n return { status: \"ignored_bind_usage\", tenantKey, chatId };\n }\n const authorized = await canManageLarkBinding(config, {\n action: \"bind\",\n tenantKey,\n chatId,\n chatType,\n senderOpenId,\n ...(data.sender?.sender_id?.user_id ? { senderUserId: data.sender.sender_id.user_id } : {}),\n ...(data.sender?.sender_id?.union_id ? { senderUnionId: data.sender.sender_id.union_id } : {}),\n messageId,\n eventId\n });\n if (!authorized) {\n await config.reply?.({ messageId, text: BINDING_AUTH_DENIED_TEXT });\n return { status: \"ignored_bind_unauthorized\", tenantKey, chatId };\n }\n await config.bindChannel({\n tenantKey,\n chatId,\n repoProvider: bindRequest.repoProvider,\n owner: bindRequest.owner,\n repo: bindRequest.repo\n });\n await config.reply?.({\n messageId,\n text: `Connected this chat to Project Target ${bindRequest.repoProvider}:${bindRequest.owner}/${bindRequest.repo}. @-mention me with a task to start a run.`\n });\n return { status: \"bound\", tenantKey, chatId };\n }\n\n const unbindRequest = parseUnbindCommand(command);\n if (unbindRequest && !config.unbindChannel) {\n return { status: \"ignored_unbind_unavailable\", tenantKey, chatId };\n }\n if (unbindRequest && config.unbindChannel) {\n if (!unbindRequest.ok) {\n await config.reply?.({ messageId, text: UNBIND_USAGE });\n return { status: \"ignored_unbind_usage\", tenantKey, chatId };\n }\n const authorized = await canManageLarkBinding(config, {\n action: \"unbind\",\n tenantKey,\n chatId,\n chatType,\n senderOpenId,\n ...(data.sender?.sender_id?.user_id ? { senderUserId: data.sender.sender_id.user_id } : {}),\n ...(data.sender?.sender_id?.union_id ? { senderUnionId: data.sender.sender_id.union_id } : {}),\n messageId,\n eventId\n });\n if (!authorized) {\n await config.reply?.({ messageId, text: BINDING_AUTH_DENIED_TEXT });\n return { status: \"ignored_unbind_unauthorized\", tenantKey, chatId };\n }\n const binding = await config.resolveChannelBinding({ tenantKey, chatId });\n if (!binding) {\n await config.reply?.({ messageId, text: UNBOUND_HINT });\n return { status: \"ignored_unbound_chat\", tenantKey, chatId };\n }\n await config.unbindChannel({ tenantKey, chatId });\n await config.reply?.({\n messageId,\n text: `Disconnected this chat from Project Target ${formatProjectTarget(binding)}. @-mention me with \\`/bind <owner>/<repo>\\` to connect a new target.`\n });\n return { status: \"unbound\", tenantKey, chatId };\n }\n\n if (command.trim().length === 0) {\n return { status: \"ignored_empty_command\", tenantKey, chatId };\n }\n\n const stopRequest = parseStopCommand(command);\n if (stopRequest) {\n if (!config.stopRun) {\n await config.reply?.({ messageId, text: STOP_UNAVAILABLE_TEXT });\n return { status: \"self_service_stop_unavailable\", tenantKey, chatId };\n }\n const result = await config.stopRun({\n tenantKey,\n chatId,\n ...(stopRequest.runId ? { runId: stopRequest.runId } : {}),\n requestedBy: `lark:${senderOpenId}`\n });\n await config.reply?.({ messageId, text: formatStopResultText(result) });\n return { status: \"self_service_stop\", ...(result.runId ? { runId: result.runId } : {}), tenantKey, chatId };\n }\n\n const selfServiceCommand = parseSelfServiceCommand(command);\n if (selfServiceCommand === \"help\") {\n await config.reply?.({ messageId, text: HELP_TEXT });\n return { status: \"self_service_help\", tenantKey, chatId };\n }\n if (selfServiceCommand === \"status\" || selfServiceCommand === \"doctor\") {\n const binding = await config.resolveChannelBinding({ tenantKey, chatId });\n const context: LarkSelfServiceContext = { tenantKey, chatId, messageId, binding };\n const reply =\n selfServiceCommand === \"status\"\n ? normalizeSelfServiceReply(await (config.status?.(context) ?? Promise.resolve(statusReply({ tenantKey, chatId, binding }))))\n : normalizeSelfServiceReply(await (config.doctor?.(context) ?? Promise.resolve(doctorReply({ tenantKey, chatId, binding }))));\n await config.reply?.({ messageId, text: reply.text, ...(reply.card ? { card: reply.card } : {}) });\n return { status: selfServiceCommand === \"status\" ? \"self_service_status\" : \"self_service_doctor\", tenantKey, chatId };\n }\n\n let binding = await config.resolveChannelBinding({ tenantKey, chatId });\n if (binding && config.defaultRepoBinding && config.bindChannel) {\n if (shouldMigrateLegacyLocalBinding({ existing: binding, defaultBinding: config.defaultRepoBinding })) {\n await config.bindChannel({\n tenantKey,\n chatId,\n repoProvider: config.defaultRepoBinding.repoProvider,\n owner: config.defaultRepoBinding.owner,\n repo: config.defaultRepoBinding.repo\n });\n binding = bindingFromDefault({ tenantKey, chatId, binding: config.defaultRepoBinding });\n }\n }\n if (!binding) {\n if (config.defaultRepoBinding && config.bindChannel) {\n await config.bindChannel({\n tenantKey,\n chatId,\n repoProvider: config.defaultRepoBinding.repoProvider,\n owner: config.defaultRepoBinding.owner,\n repo: config.defaultRepoBinding.repo\n });\n binding = bindingFromDefault({ tenantKey, chatId, binding: config.defaultRepoBinding });\n } else {\n await config.reply?.({ messageId, text: UNBOUND_HINT });\n return { status: \"ignored_unbound_chat\", tenantKey, chatId };\n }\n }\n\n const parsedTime = data.create_time ? Number(data.create_time) : Number.NaN;\n const eventTimeMs = Number.isFinite(parsedTime) ? parsedTime : (config.now?.() ?? Date.now());\n\n const event = normalizeLarkMessage({\n tenantKey,\n chatId,\n chatType: message.chat_type ?? \"group\",\n senderOpenId,\n text: extractText(message.content),\n messageId,\n ...(message.root_id ? { rootId: message.root_id } : {}),\n eventId,\n eventTimeMs,\n agentId: config.agentId,\n ...(config.botOpenId ? { botOpenId: config.botOpenId } : {}),\n ...(config.callbackUri ? { callbackUri: config.callbackUri } : {}),\n binding\n });\n if (!event) {\n return { status: \"ignored_empty_command\" };\n }\n\n const result = await config.createRun(event);\n if (result.outcome === \"run_created\") {\n if (!result.idempotentReplay && !config.suppressRunCreatedReply) {\n await config.reply?.({ messageId, text: formatRunReceivedText(result.run.id) });\n }\n return { status: \"created\", runId: result.run.id, tenantKey, chatId };\n }\n if (result.outcome === \"follow_up_queued\") {\n await config.reply?.({\n messageId,\n text: formatFollowUpQueuedText({\n followUpRequestId: result.followUpRequest.id,\n ...(result.decision.activeRunId ? { activeRunId: result.decision.activeRunId } : {}),\n reason: result.decision.reason\n })\n });\n return {\n status: \"follow_up_queued\",\n followUpRequestId: result.followUpRequest.id,\n ...(result.decision.activeRunId ? { runId: result.decision.activeRunId } : {}),\n reason: result.decision.reason,\n tenantKey,\n chatId\n };\n }\n return {\n status: \"needs_human_decision\",\n reason: result.decision.reason,\n tenantKey,\n chatId\n };\n };\n}\n","import {\n createFinalSummaryPresentation,\n type OpenTagActionReceiptPresentation,\n type OpenTagDoctorCheckPresentation,\n type OpenTagDoctorSummaryPresentation,\n type OpenTagFinalSummaryPresentation,\n type OpenTagPresentationAction,\n type OpenTagRunStatusPresentation,\n type OpenTagRunResult,\n type OpenTagSourceThreadStatusPresentation\n} from \"@opentag/core\";\n\nexport type LarkCardText = {\n tag: \"plain_text\" | \"lark_md\";\n content: string;\n};\n\nexport type LarkCardElement =\n | {\n tag: \"div\";\n text: LarkCardText;\n }\n | {\n tag: \"hr\";\n }\n | {\n tag: \"note\";\n elements: LarkCardText[];\n };\n\nexport type LarkCard = {\n config: {\n wide_screen_mode: boolean;\n update_multi?: boolean;\n };\n header: {\n template: \"green\" | \"red\" | \"yellow\" | \"blue\" | \"grey\";\n title: {\n tag: \"plain_text\";\n content: string;\n };\n };\n elements: LarkCardElement[];\n};\n\nexport type LarkRenderOptions = {\n auditRunId?: string;\n};\n\nfunction larkPlain(value: string): string {\n return value.replace(/`/g, \"\");\n}\n\nfunction auditCommand(runId: string): string {\n return `opentag status --run ${runId}`;\n}\n\nexport function renderLarkAcknowledgement(runId: string): string {\n return [\"Received. OpenTag is working.\", `Run: ${runId}`, `Use /status here for queue state; audit locally with ${auditCommand(runId)}.`].join(\"\\n\");\n}\n\nexport function renderLarkRunStatusPresentation(presentation: OpenTagRunStatusPresentation): string {\n if (presentation.state === \"received\") {\n return renderLarkAcknowledgement(presentation.runId);\n }\n if (presentation.state === \"queued\") {\n return [\"Queued behind an active run.\", `Run: ${presentation.runId}`, \"Use /status here for queue details.\"].join(\"\\n\");\n }\n if (presentation.state === \"waiting_for_approval\") {\n return [\"Waiting for your review.\", `Run: ${presentation.runId}`, \"Review the action receipt in this thread, or use /status here for details.\"].join(\"\\n\");\n }\n if (presentation.state === \"running\") {\n return [\"OpenTag is working.\", `Run: ${presentation.runId}`, \"Use /status here for details.\"].join(\"\\n\");\n }\n return [\n `OpenTag run ${presentation.state}.`,\n `Run: ${presentation.runId}`,\n ...(presentation.nextAction ? [presentation.nextAction] : [`Audit locally with ${auditCommand(presentation.runId)}.`])\n ].join(\"\\n\");\n}\n\nfunction larkRunStatusHeaderTemplate(state: OpenTagRunStatusPresentation[\"state\"]): LarkCard[\"header\"][\"template\"] {\n if (state === \"received\" || state === \"queued\" || state === \"running\") return \"blue\";\n if (state === \"waiting_for_approval\") return \"yellow\";\n if (state === \"completed\") return \"green\";\n if (state === \"failed\" || state === \"timed_out\") return \"red\";\n if (state === \"cancelled\" || state === \"interrupted\") return \"grey\";\n return \"blue\";\n}\n\nfunction larkRunStatusTitle(state: OpenTagRunStatusPresentation[\"state\"]): string {\n if (state === \"received\") return \"OpenTag received this\";\n if (state === \"queued\") return \"OpenTag queued this\";\n if (state === \"running\") return \"OpenTag is working\";\n if (state === \"waiting_for_approval\") return \"OpenTag is waiting for review\";\n return `OpenTag ${state}`;\n}\n\nexport function createLarkRunStatusCard(presentation: OpenTagRunStatusPresentation): LarkCard {\n const statusText = renderLarkRunStatusPresentation(presentation);\n return {\n config: {\n wide_screen_mode: true,\n update_multi: true\n },\n header: {\n template: larkRunStatusHeaderTemplate(presentation.state),\n title: {\n tag: \"plain_text\",\n content: larkRunStatusTitle(presentation.state)\n }\n },\n elements: [\n {\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: statusText\n }\n }\n ]\n };\n}\n\nexport function renderLarkFinalResult(result: OpenTagRunResult, options: LarkRenderOptions = {}): string {\n return renderLarkFinalSummaryPresentation(\n createFinalSummaryPresentation({\n result,\n ...(options.auditRunId ? { auditRunId: options.auditRunId } : {})\n })\n );\n}\n\nexport function renderLarkFinalSummaryPresentation(presentation: OpenTagFinalSummaryPresentation): string {\n const lines = [`Finished with ${presentation.outcome}.`, \"\", presentation.summary];\n\n if (presentation.verification?.length) {\n lines.push(\"\", \"Verification\");\n for (const check of presentation.verification) {\n lines.push(`- ${check.command}: ${check.outcome}`);\n }\n }\n\n if (presentation.nextActions?.length) {\n lines.push(\"\", `Next action: ${presentation.nextActions[0]}`);\n }\n if (presentation.auditRunId) {\n lines.push(\"\", `Audit: opentag status --run ${presentation.auditRunId}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction larkHeaderTemplate(outcome: string): LarkCard[\"header\"][\"template\"] {\n if (outcome === \"success\") return \"green\";\n if (outcome === \"failure\") return \"red\";\n if (outcome === \"cancelled\") return \"grey\";\n if (outcome === \"needs_human\") return \"blue\";\n return \"yellow\";\n}\n\nfunction compactCardText(text: string, maxLength: number): string {\n const compact = text.replace(/\\s+/g, \" \").trim();\n if (compact.length <= maxLength) return compact;\n return `${compact.slice(0, Math.max(0, maxLength - 1)).trimEnd()}...`;\n}\n\nfunction larkMarkdownList(items: string[]): string {\n return items.map((item) => `- ${item}`).join(\"\\n\");\n}\n\nfunction larkActionDecisionLabel(decision: OpenTagPresentationAction[\"visibleDecisions\"][number], index: number): string {\n if (decision === \"apply\") return `Apply now: apply ${index}`;\n if (decision === \"approve\") return `Approve only: approve ${index}`;\n if (decision === \"continue\") return `Continue: continue ${index}`;\n return `Reject: reject ${index}`;\n}\n\nfunction larkActionDetails(action: OpenTagPresentationAction): string[] {\n const rowDetails = action.detailRows?.map((row) => `${row.label}: ${larkPlain(row.value)}`) ?? [];\n if (rowDetails.length > 0) return rowDetails.map((detail) => compactCardText(detail, 180));\n\n const details = [`Target: ${action.targetLabel}`];\n if (action.setupReason) details.push(`Status: ${action.setupReason}`);\n if (action.details?.length) details.push(...action.details.slice(0, 3));\n return details.map((detail) => compactCardText(larkPlain(detail), 180));\n}\n\nfunction larkActionReceiptMarkdown(input: { title: string; actions: OpenTagPresentationAction[] }, options: { includeTitle?: boolean } = {}): string | undefined {\n if (input.actions.length === 0) return undefined;\n const visibleActions = input.actions.slice(0, 5);\n const lines = [\n ...(options.includeTitle === false ? [] : [`**${input.title}**`]),\n \"Choose a command in this source thread. Details stay in OpenTag audit/status.\"\n ];\n for (const action of visibleActions) {\n lines.push(\"\", `**${action.index}. ${compactCardText(action.title, 180)}**`);\n lines.push(...larkMarkdownList(larkActionDetails(action)).split(\"\\n\"));\n lines.push(...larkMarkdownList(action.visibleDecisions.map((decision) => larkActionDecisionLabel(decision, action.index))).split(\"\\n\"));\n }\n const remaining = input.actions.length - visibleActions.length;\n if (remaining > 0) {\n lines.push(\"\", `Showing first ${visibleActions.length} of ${input.actions.length} actions. Use opentag status locally for full detail.`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction larkFinalSummaryActionReceiptMarkdown(presentation: OpenTagFinalSummaryPresentation): string | undefined {\n const actions = presentation.actions ?? [];\n if (!presentation.actionReceiptTitle || actions.length === 0) return undefined;\n return larkActionReceiptMarkdown({ title: presentation.actionReceiptTitle, actions });\n}\n\nfunction larkActionReceiptHeaderTemplate(actions: OpenTagPresentationAction[]): LarkCard[\"header\"][\"template\"] {\n if (actions.some((action) => action.state === \"needs_setup\" || action.state === \"unsupported\")) return \"yellow\";\n if (actions.some((action) => action.state === \"ready_to_apply\" || action.state === \"needs_approval\")) return \"blue\";\n return \"grey\";\n}\n\nexport function createLarkFinalSummaryCard(presentation: OpenTagFinalSummaryPresentation): LarkCard {\n const elements: LarkCardElement[] = [\n {\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: compactCardText(presentation.summary, 900)\n }\n }\n ];\n\n if (presentation.verification?.length) {\n elements.push({ tag: \"hr\" });\n elements.push({\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: [\"**Verification**\", larkMarkdownList(presentation.verification.slice(0, 5).map((check) => `${larkPlain(check.command)}: ${check.outcome}`))].join(\n \"\\n\"\n )\n }\n });\n }\n\n if (presentation.changedFiles?.length) {\n elements.push({\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: [\"**Changed files**\", larkMarkdownList(presentation.changedFiles.slice(0, 8).map(larkPlain))].join(\"\\n\")\n }\n });\n }\n\n if (presentation.nextActions?.length) {\n elements.push({\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: [\"**Next action**\", larkMarkdownList(presentation.nextActions.map((action) => compactCardText(action, 240)))].join(\"\\n\")\n }\n });\n }\n\n const actionReceipt = larkFinalSummaryActionReceiptMarkdown(presentation);\n if (actionReceipt) {\n elements.push({ tag: \"hr\" });\n elements.push({\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: actionReceipt\n }\n });\n }\n\n if (presentation.auditRunId) {\n elements.push({\n tag: \"note\",\n elements: [\n {\n tag: \"plain_text\",\n content: `Audit: opentag status --run ${presentation.auditRunId}`\n }\n ]\n });\n }\n\n return {\n config: {\n wide_screen_mode: true,\n update_multi: true\n },\n header: {\n template: larkHeaderTemplate(presentation.outcome),\n title: {\n tag: \"plain_text\",\n content: `Finished: ${presentation.outcome}`\n }\n },\n elements\n };\n}\n\nexport function renderLarkActionReceiptPresentation(presentation: OpenTagActionReceiptPresentation): string {\n return [\n presentation.title,\n \"\",\n larkActionReceiptMarkdown({ title: presentation.title, actions: presentation.actions }, { includeTitle: false }) ?? \"No source-thread actions.\",\n ...(presentation.auditRunId ? [\"\", `Audit: opentag status --run ${presentation.auditRunId}`] : [])\n ].join(\"\\n\");\n}\n\nexport function createLarkActionReceiptCard(presentation: OpenTagActionReceiptPresentation): LarkCard {\n const elements: LarkCardElement[] = [\n {\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: larkActionReceiptMarkdown({ title: presentation.title, actions: presentation.actions }, { includeTitle: false }) ?? \"No source-thread actions.\"\n }\n }\n ];\n\n if (presentation.auditRunId) {\n elements.push({\n tag: \"note\",\n elements: [\n {\n tag: \"plain_text\",\n content: `Audit: opentag status --run ${presentation.auditRunId}`\n }\n ]\n });\n }\n\n return {\n config: {\n wide_screen_mode: true\n },\n header: {\n template: larkActionReceiptHeaderTemplate(presentation.actions),\n title: {\n tag: \"plain_text\",\n content: presentation.title.replace(/:$/, \"\")\n }\n },\n elements\n };\n}\n\nfunction larkDoctorHeaderTemplate(checks: OpenTagDoctorCheckPresentation[]): LarkCard[\"header\"][\"template\"] {\n if (checks.some((check) => check.status === \"fail\")) return \"red\";\n if (checks.some((check) => check.status === \"warn\" || check.status === \"unknown\")) return \"yellow\";\n return \"green\";\n}\n\nfunction larkStatusHeaderTemplate(presentation: OpenTagSourceThreadStatusPresentation): LarkCard[\"header\"][\"template\"] {\n if (presentation.bindingState === \"unbound\") return \"yellow\";\n if (presentation.activeRun) return \"blue\";\n return \"green\";\n}\n\nfunction checkStatusLabel(status: OpenTagDoctorCheckPresentation[\"status\"]): string {\n return status.toUpperCase();\n}\n\nexport function createLarkDoctorSummaryCard(presentation: OpenTagDoctorSummaryPresentation): LarkCard {\n return {\n config: {\n wide_screen_mode: true\n },\n header: {\n template: larkDoctorHeaderTemplate(presentation.checks),\n title: {\n tag: \"plain_text\",\n content: presentation.title.replace(/:$/, \"\")\n }\n },\n elements: presentation.checks.map((check) => ({\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: `**${checkStatusLabel(check.status)} ${check.name}**${check.message ? `\\n${compactCardText(check.message, 500)}` : \"\"}`\n }\n }))\n };\n}\n\nexport function createLarkSourceThreadStatusCard(presentation: OpenTagSourceThreadStatusPresentation): LarkCard {\n const elements: LarkCardElement[] = [\n {\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: [\n presentation.sourceContainer ? `**Source container**\\n${presentation.sourceContainer}` : undefined,\n `**Project Target**\\n${presentation.projectTarget ?? \"not bound\"}`,\n `**Active run**\\n${\n presentation.activeRun\n ? `${presentation.activeRun.id} (${presentation.activeRun.status})${\n presentation.activeRun.updatedAt ? `, updated ${presentation.activeRun.updatedAt}` : \"\"\n }`\n : \"none\"\n }`,\n presentation.currentCommand ? `**Command**\\n${compactCardText(presentation.currentCommand, 240)}` : undefined\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\\n\")\n }\n }\n ];\n\n const queuedTotal = presentation.queuedFollowUpsTotal ?? presentation.queuedFollowUps.length;\n const queuedIds = presentation.queuedFollowUps.map((followUp) => {\n const status = followUp.status ? ` (${followUp.status})` : \"\";\n const command = followUp.command ? `: ${compactCardText(followUp.command, 120)}` : \"\";\n return `${followUp.id}${status}${command}`;\n });\n const queuedOverflow = Math.max(queuedTotal - queuedIds.length, 0);\n const queuedSummary =\n queuedTotal === 0\n ? \"none\"\n : `${queuedTotal}${queuedIds.length ? ` (${queuedIds.join(\", \")}${queuedOverflow > 0 ? `, +${queuedOverflow} more` : \"\"})` : \"\"}`;\n\n elements.push({\n tag: \"div\",\n text: {\n tag: \"lark_md\",\n content: [\"**Queued follow-ups**\", queuedSummary, \"\", \"**Next action**\", compactCardText(presentation.nextAction, 360)].join(\"\\n\")\n }\n });\n\n if (presentation.stopHint || presentation.detailHint) {\n elements.push({\n tag: \"note\",\n elements: [\n {\n tag: \"plain_text\",\n content: [presentation.stopHint ? `Stop/timeout: ${presentation.stopHint}` : undefined, presentation.detailHint ? `Details: ${presentation.detailHint}` : undefined]\n .filter((line): line is string => Boolean(line))\n .join(\" \")\n }\n ]\n });\n }\n\n return {\n config: {\n wide_screen_mode: true\n },\n header: {\n template: larkStatusHeaderTemplate(presentation),\n title: {\n tag: \"plain_text\",\n content: presentation.title.replace(/:$/, \"\")\n }\n },\n elements\n };\n}\n\n// Lark text message content is a JSON-encoded `{ \"text\": \"...\" }` string.\nexport function createLarkTextMessageContent(text: string): string {\n return JSON.stringify({ text });\n}\n\n// Lark interactive message content is a JSON-encoded card object.\nexport function createLarkInteractiveMessageContent(card: LarkCard): string {\n return JSON.stringify(card);\n}\n","import { randomUUID } from \"node:crypto\";\nimport * as lark from \"@larksuiteoapi/node-sdk\";\nimport { createOpenTagClient, type ChannelRuntimeStatus } from \"@opentag/client\";\nimport {\n createDoctorSummaryPresentation,\n createSourceThreadStatusPresentation,\n parseProjectTargetRef,\n renderOpenTagPresentationPlainText,\n type OpenTagDoctorSummaryPresentation,\n type OpenTagEvent,\n type OpenTagSourceThreadStatusPresentation\n} from \"@opentag/core\";\nimport { createLarkReplyClient, replyLarkMessage } from \"./outbound.js\";\nimport { createLarkMessageHandler, type LarkInboundMessageEvent, type LarkMessageHandlerOutcome, type LarkSelfServiceReply } from \"./inbound.js\";\nimport { createLarkDoctorSummaryCard, createLarkSourceThreadStatusCard, type LarkCard } from \"./render.js\";\n\nexport const DEFAULT_AGENT_ID = \"opentag\";\n\nexport type LarkIngressConfig = {\n appId: string;\n appSecret: string;\n dispatcherUrl: string;\n dispatcherToken?: string;\n domain: \"lark\" | \"feishu\";\n agentId: string;\n botOpenId?: string;\n bindingAdminOpenIds?: string[];\n bindingAdminUserIds?: string[];\n bindingAdminUnionIds?: string[];\n runTimeoutMs?: number;\n defaultRepoBinding?: { repoProvider: string; owner: string; repo: string };\n};\n\nexport type LarkWsClient = {\n start(input: { eventDispatcher: unknown }): Promise<void>;\n close?(input?: { force?: boolean }): void | Promise<void>;\n};\n\nexport type LarkIngressDependencies = {\n createWsClient?(config: LarkIngressConfig): LarkWsClient;\n createEventDispatcher?(handler: (data: LarkInboundMessageEvent) => Promise<void>): unknown;\n reply?(input: { messageId: string; text: string; card?: LarkCard }): Promise<void>;\n logIgnored?(outcome: LarkMessageHandlerOutcome): void;\n};\n\nexport type LarkIngressHandle = {\n startPromise: Promise<void>;\n close(): Promise<void>;\n};\n\nfunction defaultRepoBindingFromEnv(value: string | undefined): LarkIngressConfig[\"defaultRepoBinding\"] {\n if (!value) return undefined;\n try {\n const ref = parseProjectTargetRef(value);\n return {\n repoProvider: ref.provider,\n owner: ref.owner,\n repo: ref.repo\n };\n } catch {\n throw new Error(\"OPENTAG_LARK_DEFAULT_REPO must be formatted as owner/repo or provider:owner/repo\");\n }\n}\n\nfunction domainFromEnv(value: string | undefined): LarkIngressConfig[\"domain\"] {\n const domain = value ?? \"lark\";\n if (domain !== \"lark\" && domain !== \"feishu\") {\n throw new Error(\"LARK_DOMAIN must be either lark or feishu\");\n }\n return domain;\n}\n\nfunction positiveIntegerFromEnv(name: string, value: string | undefined): number | undefined {\n if (!value) return undefined;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`${name} must be a positive integer`);\n }\n return parsed;\n}\n\nfunction csvList(value: string | undefined): string[] | undefined {\n const items = value\n ?.split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n return items?.length ? items : undefined;\n}\n\nexport function larkIngressConfigFromEnv(env: NodeJS.ProcessEnv): LarkIngressConfig {\n const appId = env.LARK_APP_ID;\n const appSecret = env.LARK_APP_SECRET;\n const dispatcherUrl = env.OPENTAG_DISPATCHER_URL;\n if (!appId || !appSecret) {\n throw new Error(\"LARK_APP_ID and LARK_APP_SECRET are required\");\n }\n if (!dispatcherUrl) {\n throw new Error(\"OPENTAG_DISPATCHER_URL is required\");\n }\n\n const defaultRepoBinding = defaultRepoBindingFromEnv(env.OPENTAG_LARK_DEFAULT_REPO);\n const runTimeoutMs = positiveIntegerFromEnv(\"OPENTAG_RUN_TIMEOUT_MS\", env.OPENTAG_RUN_TIMEOUT_MS);\n const bindingAdminOpenIds = csvList(env.OPENTAG_LARK_BINDING_ADMIN_OPEN_IDS);\n const bindingAdminUserIds = csvList(env.OPENTAG_LARK_BINDING_ADMIN_USER_IDS);\n const bindingAdminUnionIds = csvList(env.OPENTAG_LARK_BINDING_ADMIN_UNION_IDS);\n\n return {\n appId,\n appSecret,\n dispatcherUrl,\n domain: domainFromEnv(env.LARK_DOMAIN),\n agentId: env.OPENTAG_LARK_AGENT_ID ?? DEFAULT_AGENT_ID,\n ...(env.OPENTAG_DISPATCHER_TOKEN ? { dispatcherToken: env.OPENTAG_DISPATCHER_TOKEN } : {}),\n ...(env.LARK_BOT_OPEN_ID ? { botOpenId: env.LARK_BOT_OPEN_ID } : {}),\n ...(bindingAdminOpenIds ? { bindingAdminOpenIds } : {}),\n ...(bindingAdminUserIds ? { bindingAdminUserIds } : {}),\n ...(bindingAdminUnionIds ? { bindingAdminUnionIds } : {}),\n ...(runTimeoutMs ? { runTimeoutMs } : {}),\n ...(defaultRepoBinding ? { defaultRepoBinding } : {})\n };\n}\n\nfunction createDefaultWsClient(config: LarkIngressConfig): LarkWsClient {\n return new lark.WSClient({\n appId: config.appId,\n appSecret: config.appSecret,\n domain: config.domain === \"feishu\" ? lark.Domain.Feishu : lark.Domain.Lark\n });\n}\n\nfunction createDefaultEventDispatcher(handler: (data: LarkInboundMessageEvent) => Promise<void>): unknown {\n return new lark.EventDispatcher({}).register({\n \"im.message.receive_v1\": (data) => handler(data as unknown as LarkInboundMessageEvent)\n });\n}\n\nfunction logIgnored(outcome: LarkMessageHandlerOutcome): void {\n if (\n outcome.status === \"created\" ||\n outcome.status === \"bound\" ||\n outcome.status === \"unbound\" ||\n outcome.status === \"self_service_help\" ||\n outcome.status === \"self_service_status\" ||\n outcome.status === \"self_service_doctor\" ||\n outcome.status === \"self_service_stop\" ||\n outcome.status === \"self_service_stop_unavailable\"\n ) {\n return;\n }\n if (outcome.status === \"follow_up_queued\") {\n console.log(\n `[lark] queued follow-up${outcome.followUpRequestId ? ` follow_up_request_id=${outcome.followUpRequestId}` : \"\"}${outcome.runId ? ` active_run_id=${outcome.runId}` : \"\"}`\n );\n return;\n }\n if (outcome.status === \"needs_human_decision\") {\n console.log(`[lark] needs human decision${outcome.reason ? `: ${outcome.reason}` : \"\"}`);\n return;\n }\n if (outcome.status === \"ignored_unbound_chat\") {\n console.log(\n `[lark] ignored unbound chat - bind it: provider=lark accountId(tenant_key)=${outcome.tenantKey} conversationId(chat_id)=${outcome.chatId} (reply '/bind owner/repo' with a Project Target ref, or POST /v1/channel-bindings)`\n );\n return;\n }\n console.log(`[lark] ignored event: ${outcome.status}${outcome.chatId ? ` chat_id=${outcome.chatId}` : \"\"}`);\n}\n\nfunction formatProjectTarget(input: { repoProvider: string; owner: string; repo: string }): string {\n return `${input.repoProvider}:${input.owner}/${input.repo}`;\n}\n\nfunction queuedFollowUpsSummary(status: ChannelRuntimeStatus): string {\n if (status.queuedFollowUps.length === 0) return \"none.\";\n const visible = status.queuedFollowUps.slice(0, 3).map((followUp) => followUp.id);\n const suffix = status.queuedFollowUps.length > visible.length ? `, +${status.queuedFollowUps.length - visible.length} more` : \"\";\n return `${status.queuedFollowUps.length} (${visible.join(\", \")}${suffix}).`;\n}\n\nfunction formatDurationMs(ms: number): string {\n if (ms % 60_000 === 0) return `${ms / 60_000} minute(s)`;\n if (ms % 1_000 === 0) return `${ms / 1_000} second(s)`;\n return `${ms}ms`;\n}\n\nfunction runTimeoutPolicy(input: { runTimeoutMs?: number; status?: ChannelRuntimeStatus }): string {\n const hardTimeoutMs = input.status?.runTimeoutPolicy?.hardTimeoutMs ?? input.runTimeoutMs;\n return hardTimeoutMs ? `hard timeout after ${formatDurationMs(hardTimeoutMs)}` : \"disabled\";\n}\n\nfunction larkRuntimeStatusPresentation(status: ChannelRuntimeStatus, input: { runTimeoutMs?: number } = {}): OpenTagSourceThreadStatusPresentation {\n return createSourceThreadStatusPresentation({\n title: \"OpenTag status:\",\n sourceContainer: `${status.binding.provider}:${status.binding.accountId}/${status.binding.conversationId}`,\n projectTarget: formatProjectTarget(status.binding),\n bindingState: \"bound\",\n ...(status.activeRun\n ? {\n activeRun: {\n id: status.activeRun.id,\n status: status.activeRun.status,\n updatedAt: status.activeRun.updatedAt\n }\n }\n : {}),\n ...(status.activeEvent?.command.rawText ? { currentCommand: status.activeEvent.command.rawText } : {}),\n queuedFollowUps: status.queuedFollowUps.slice(0, 3).map((followUp) => ({\n id: followUp.id,\n status: followUp.status,\n command: followUp.event.command.rawText\n })),\n queuedFollowUpsTotal: status.queuedFollowUps.length,\n nextAction: status.activeRun\n ? \"wait for the final reply, send a follow-up to queue more context, or use `/stop` to request cancellation.\"\n : \"@-mention me with a task to start a run.\",\n stopHint: `cancellation is explicit and is not reported as successful completion; timeout policy: ${runTimeoutPolicy({ ...input, status })}.`,\n detailHint: \"use `opentag status --run <run_id>` locally for audit events and executor detail.\"\n });\n}\n\nfunction larkRuntimeStatusReply(status: ChannelRuntimeStatus, input: { runTimeoutMs?: number } = {}): LarkSelfServiceReply {\n const presentation = larkRuntimeStatusPresentation(status, input);\n return {\n text: renderOpenTagPresentationPlainText(presentation),\n card: createLarkSourceThreadStatusCard(presentation)\n };\n}\n\nfunction larkRuntimeDoctorPresentation(input: {\n tenantKey: string;\n chatId: string;\n status: ChannelRuntimeStatus;\n runTimeoutMs?: number;\n}): OpenTagDoctorSummaryPresentation {\n return createDoctorSummaryPresentation({\n title: \"OpenTag doctor (redacted):\",\n checks: [\n { status: \"ok\", name: \"Source container\", message: `lark:${input.tenantKey}/${input.chatId}` },\n { status: \"ok\", name: \"Project Target\", message: formatProjectTarget(input.status.binding) },\n { status: \"ok\", name: \"Dispatcher\", message: \"reachable for this source container.\" },\n {\n status: \"ok\",\n name: \"Active run\",\n message: input.status.activeRun\n ? `${input.status.activeRun.id} (${input.status.activeRun.status}), updated ${input.status.activeRun.updatedAt}.`\n : \"none.\"\n },\n { status: \"ok\", name: \"Queued follow-ups\", message: queuedFollowUpsSummary(input.status) },\n { status: \"ok\", name: \"Timeout policy\", message: runTimeoutPolicy({ ...input, status: input.status }) },\n {\n status: \"ok\",\n name: \"Runtime readiness\",\n message: \"source-container status is reachable; run `opentag service status` locally to confirm launchd, connector, executor, and heartbeat health.\"\n },\n { status: \"ok\", name: \"Secrets\", message: \"redacted. Use env/file/keychain SecretRef config and never paste app secrets into this chat.\" },\n { status: \"ok\", name: \"Source-thread output\", message: \"concise final replies by default; detailed process belongs in audit/status.\" }\n ]\n });\n}\n\nfunction larkRuntimeDoctorReply(input: { tenantKey: string; chatId: string; status: ChannelRuntimeStatus; runTimeoutMs?: number }): LarkSelfServiceReply {\n const presentation = larkRuntimeDoctorPresentation(input);\n return {\n text: renderOpenTagPresentationPlainText(presentation),\n card: createLarkDoctorSummaryCard(presentation)\n };\n}\n\nfunction formatStatusUnavailable(input: { binding?: { repoProvider?: string; owner: string; repo: string }; error: unknown }): string {\n const message = input.error instanceof Error ? input.error.message : String(input.error);\n return [\n \"OpenTag status:\",\n input.binding ? `- Project Target: ${formatProjectTarget({ repoProvider: input.binding.repoProvider ?? \"github\", owner: input.binding.owner, repo: input.binding.repo })}` : \"- Project Target: not bound.\",\n \"- Runtime status: unavailable from dispatcher.\",\n `- Reason: ${message}`,\n \"- Next action: check `opentag service status` and `opentag status` locally.\"\n ].join(\"\\n\");\n}\n\nfunction formatDoctorUnavailable(input: {\n tenantKey: string;\n chatId: string;\n binding?: { repoProvider?: string; owner: string; repo: string };\n error: unknown;\n}): string {\n const message = input.error instanceof Error ? input.error.message : String(input.error);\n return [\n \"OpenTag doctor (redacted):\",\n `- Source container: lark:${input.tenantKey}/${input.chatId}`,\n input.binding\n ? `- Project Target: ${formatProjectTarget({ repoProvider: input.binding.repoProvider ?? \"github\", owner: input.binding.owner, repo: input.binding.repo })}`\n : \"- Project Target: not bound.\",\n \"- Dispatcher: source-container status unavailable.\",\n `- Reason: ${message}`,\n \"- Runtime readiness: run `opentag service status` and `opentag status --channel lark:<tenant>/<chat>` locally.\",\n \"- Secrets: redacted; do not share local config or app secrets in this chat.\"\n ].join(\"\\n\");\n}\n\nexport function startLarkIngress(config: LarkIngressConfig, dependencies: LarkIngressDependencies = {}): LarkIngressHandle {\n const dispatcherClient = createOpenTagClient({\n dispatcherUrl: config.dispatcherUrl,\n ...(config.dispatcherToken ? { pairingToken: config.dispatcherToken } : {})\n });\n let replyClient: ReturnType<typeof createLarkReplyClient> | undefined;\n const reply =\n dependencies.reply ??\n ((input: { messageId: string; text: string; card?: LarkCard }) => {\n replyClient ??= createLarkReplyClient({ appId: config.appId, appSecret: config.appSecret, domain: config.domain });\n return replyLarkMessage(replyClient, input);\n });\n\n const handler = createLarkMessageHandler({\n agentId: config.agentId,\n suppressRunCreatedReply: true,\n ...(config.botOpenId ? { botOpenId: config.botOpenId } : {}),\n ...(config.defaultRepoBinding ? { defaultRepoBinding: config.defaultRepoBinding } : {}),\n async resolveChannelBinding(input) {\n try {\n const { binding } = await dispatcherClient.getChannelBinding({\n provider: \"lark\",\n accountId: input.tenantKey,\n conversationId: input.chatId\n });\n return {\n tenantKey: binding.accountId,\n chatId: binding.conversationId,\n repoProvider: binding.repoProvider,\n owner: binding.owner,\n repo: binding.repo\n };\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"channel_binding_not_found\")) {\n return null;\n }\n throw error;\n }\n },\n async bindChannel(input) {\n await dispatcherClient.bindChannel({\n provider: \"lark\",\n accountId: input.tenantKey,\n conversationId: input.chatId,\n repoProvider: input.repoProvider,\n owner: input.owner,\n repo: input.repo\n });\n },\n async unbindChannel(input) {\n await dispatcherClient.unbindChannel({\n provider: \"lark\",\n accountId: input.tenantKey,\n conversationId: input.chatId\n });\n },\n canManageBinding(input) {\n if (input.chatType === \"p2p\") return true;\n return Boolean(\n config.bindingAdminOpenIds?.includes(input.senderOpenId) ||\n (input.senderUserId && config.bindingAdminUserIds?.includes(input.senderUserId)) ||\n (input.senderUnionId && config.bindingAdminUnionIds?.includes(input.senderUnionId))\n );\n },\n async stopRun(input) {\n try {\n const result = input.runId\n ? await dispatcherClient.cancelRun({\n runId: input.runId,\n reason: \"Stop requested from Lark.\",\n requestedBy: input.requestedBy\n })\n : await dispatcherClient.cancelActiveChannelRun({\n provider: \"lark\",\n accountId: input.tenantKey,\n conversationId: input.chatId,\n reason: \"Stop requested from Lark.\",\n requestedBy: input.requestedBy\n });\n return { outcome: \"cancelled\", runId: result.run.id };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"run_already_terminal\")) {\n return { outcome: \"already_terminal\", runId: input.runId ?? \"active run\" };\n }\n if (\n message.includes(\"run_not_found\") ||\n message.includes(\"active_run_not_found\") ||\n message.includes(\"channel_binding_not_found\")\n ) {\n return input.runId ? { outcome: \"not_found\", runId: input.runId } : { outcome: \"not_found\" };\n }\n throw error;\n }\n },\n async status(input) {\n if (!input.binding) {\n const presentation = createSourceThreadStatusPresentation({\n title: \"OpenTag status:\",\n sourceContainer: `lark:${input.tenantKey}/${input.chatId}`,\n bindingState: \"unbound\",\n nextAction: \"@-mention me with `/bind <owner>/<repo>` to connect a Project Target.\",\n detailHint: \"active run and queued follow-up status are unavailable until this chat is bound.\"\n });\n return {\n text: renderOpenTagPresentationPlainText(presentation),\n card: createLarkSourceThreadStatusCard(presentation)\n };\n }\n try {\n return larkRuntimeStatusReply(\n await dispatcherClient.getChannelRuntimeStatus({\n provider: \"lark\",\n accountId: input.tenantKey,\n conversationId: input.chatId\n }),\n { ...(config.runTimeoutMs ? { runTimeoutMs: config.runTimeoutMs } : {}) }\n );\n } catch (error) {\n return formatStatusUnavailable({ binding: input.binding, error });\n }\n },\n async doctor(input) {\n if (!input.binding) {\n const presentation = createDoctorSummaryPresentation({\n title: \"OpenTag doctor (redacted):\",\n checks: [\n { status: \"ok\", name: \"Source container\", message: `lark:${input.tenantKey}/${input.chatId}` },\n { status: \"warn\", name: \"Project Target\", message: \"not bound.\" },\n { status: \"warn\", name: \"Dispatcher\", message: \"binding not found for this source container.\" },\n { status: \"ok\", name: \"Next action\", message: \"@-mention me with `/bind <owner>/<repo>` to connect a Project Target.\" },\n { status: \"ok\", name: \"Secrets\", message: \"redacted; do not share local config or app secrets in this chat.\" }\n ]\n });\n return {\n text: renderOpenTagPresentationPlainText(presentation),\n card: createLarkDoctorSummaryCard(presentation)\n };\n }\n try {\n return larkRuntimeDoctorReply({\n tenantKey: input.tenantKey,\n chatId: input.chatId,\n status: await dispatcherClient.getChannelRuntimeStatus({\n provider: \"lark\",\n accountId: input.tenantKey,\n conversationId: input.chatId\n }),\n ...(config.runTimeoutMs ? { runTimeoutMs: config.runTimeoutMs } : {})\n });\n } catch (error) {\n return formatDoctorUnavailable({ tenantKey: input.tenantKey, chatId: input.chatId, binding: input.binding, error });\n }\n },\n async reply(input) {\n await reply(input);\n },\n async createRun(event: OpenTagEvent) {\n const runId = `run_${randomUUID()}`;\n return dispatcherClient.createRun({ runId, event });\n }\n });\n\n const eventDispatcher = (dependencies.createEventDispatcher ?? createDefaultEventDispatcher)(async (data) => {\n try {\n (dependencies.logIgnored ?? logIgnored)(await handler(data));\n } catch (error) {\n console.error(\"[lark] failed to handle inbound message:\", error);\n }\n });\n const wsClient = (dependencies.createWsClient ?? createDefaultWsClient)(config);\n\n return {\n startPromise: wsClient.start({ eventDispatcher }),\n async close() {\n await wsClient.close?.({ force: true });\n }\n };\n}\n","import * as lark from \"@larksuiteoapi/node-sdk\";\nimport { createLarkInteractiveMessageContent, createLarkTextMessageContent, type LarkCard } from \"./render.js\";\n\ntype LarkReplyPayload = {\n path: { message_id: string };\n data: { content: string; msg_type: string; reply_in_thread?: boolean; uuid?: string };\n};\n\ntype LarkPatchPayload = {\n path: { message_id: string };\n data: { content: string };\n};\n\ntype LarkUpdatePayload = {\n path: { message_id: string };\n data: { content: string; msg_type: string };\n};\n\ntype LarkMessageMethod = \"reply\" | \"patch\" | \"update\";\n\ntype LarkMessageApi = {\n reply?: (payload?: LarkReplyPayload) => Promise<unknown>;\n patch?: (payload?: LarkPatchPayload) => Promise<unknown>;\n update?: (payload?: LarkUpdatePayload) => Promise<unknown>;\n};\n\ntype LarkRequestPayload = {\n method: string;\n url: string;\n data?: unknown;\n};\n\nexport type LarkReplyResult = {\n messageId?: string;\n};\n\n// Minimal client surface OpenTag uses; lark.Client satisfies it structurally.\nexport type LarkReplyClient = {\n request?: (payload: LarkRequestPayload) => Promise<unknown>;\n im: {\n message?: LarkMessageApi;\n v1?: {\n message?: LarkMessageApi;\n };\n };\n};\n\nexport function createLarkReplyClient(input: { appId: string; appSecret: string; domain?: \"lark\" | \"feishu\" }): LarkReplyClient {\n return new lark.Client({\n appId: input.appId,\n appSecret: input.appSecret,\n domain: input.domain === \"feishu\" ? lark.Domain.Feishu : lark.Domain.Lark\n });\n}\n\nfunction larkMessageApi(client: LarkReplyClient, method: LarkMessageMethod): LarkMessageApi {\n const legacyApi = client.im.message;\n if (legacyApi?.[method]) return legacyApi;\n const v1Api = client.im.v1?.message;\n if (v1Api?.[method]) return v1Api;\n throw new Error(`Lark client does not support message.${method}.`);\n}\n\nfunction larkReplyMessageId(response: unknown): string | undefined {\n if (!response || typeof response !== \"object\") return undefined;\n const data = \"data\" in response ? (response as { data?: unknown }).data : undefined;\n if (data && typeof data === \"object\" && \"message_id\" in data) {\n const value = (data as { message_id?: unknown }).message_id;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n if (\"message_id\" in response) {\n const value = (response as { message_id?: unknown }).message_id;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\nexport async function replyLarkMessage(client: LarkReplyClient, input: { messageId: string; text: string; card?: LarkCard }): Promise<LarkReplyResult> {\n const reply = larkMessageApi(client, \"reply\").reply;\n if (!reply) throw new Error(\"Lark client does not support message.reply.\");\n const response = await reply({\n path: { message_id: input.messageId },\n data: input.card\n ? { content: createLarkInteractiveMessageContent(input.card), msg_type: \"interactive\", reply_in_thread: true }\n : { content: createLarkTextMessageContent(input.text), msg_type: \"text\", reply_in_thread: true }\n });\n const messageId = larkReplyMessageId(response);\n return messageId ? { messageId } : {};\n}\n\nexport async function patchLarkMessageCard(client: LarkReplyClient, input: { messageId: string; card: LarkCard }): Promise<void> {\n const patch = larkMessageApi(client, \"patch\").patch;\n if (!patch) throw new Error(\"Lark client does not support message.patch.\");\n await patch({\n path: { message_id: input.messageId },\n data: {\n content: createLarkInteractiveMessageContent(input.card)\n }\n });\n}\n\nexport async function updateLarkTextMessage(client: LarkReplyClient, input: { messageId: string; text: string }): Promise<void> {\n const update = larkMessageApi(client, \"update\").update;\n if (!update) throw new Error(\"Lark client does not support message.update.\");\n await update({\n path: { message_id: input.messageId },\n data: {\n msg_type: \"text\",\n content: createLarkTextMessageContent(input.text)\n }\n });\n}\n\nexport async function addLarkMessageReaction(client: LarkReplyClient, input: { messageId: string; emojiType: string }): Promise<void> {\n if (!client.request) throw new Error(\"Lark client does not support request.\");\n await client.request({\n method: \"POST\",\n url: `/open-apis/im/v1/messages/${encodeURIComponent(input.messageId)}/reactions`,\n data: {\n reaction_type: {\n emoji_type: input.emojiType\n }\n }\n });\n}\n","import * as lark from \"@larksuiteoapi/node-sdk\";\n\nconst REGISTRATION_SOURCE = \"opentag\";\nconst BOT_INFO_RETRIES = 6;\nconst BOT_INFO_RETRY_DELAY_MS = 2000;\n\nexport type LarkDomain = \"lark\" | \"feishu\";\n\nexport type LarkRegistrationQrCodeInfo = {\n url: string;\n expireIn: number;\n};\n\nexport type LarkRegistrationStatusInfo = {\n status: string;\n interval?: number;\n};\n\nexport type RegisteredLarkPersonalAgent = {\n appId: string;\n appSecret: string;\n domain: LarkDomain;\n operatorOpenId?: string;\n botOpenId?: string;\n botName?: string;\n};\n\nexport type LarkCredentialValidationResult = {\n botOpenId: string;\n botName: string;\n};\n\ntype LarkRegisterAppResult = {\n client_id: string;\n client_secret: string;\n user_info?: {\n open_id?: string;\n tenant_brand?: \"feishu\" | \"lark\";\n };\n};\n\ntype LarkRegisterApp = (options: {\n domain?: string;\n larkDomain?: string;\n source?: string;\n signal?: AbortSignal;\n onQRCodeReady: (info: LarkRegistrationQrCodeInfo) => void;\n onStatusChange?: (info: LarkRegistrationStatusInfo) => void;\n appPreset?: { name?: string; desc?: string };\n addons?: {\n scopes?: { tenant?: string[] };\n events?: { items?: { tenant?: string[] } };\n };\n createOnly?: boolean;\n}) => Promise<LarkRegisterAppResult>;\n\ntype BotInfoClient = {\n request(input: { url: string; method: \"GET\" }): Promise<unknown>;\n};\n\nexport type LarkPersonalAgentRegistrationDependencies = {\n registerApp?: LarkRegisterApp;\n createBotInfoClient?(input: { appId: string; appSecret: string; domain: LarkDomain }): BotInfoClient;\n sleep?(ms: number): Promise<void>;\n};\n\nexport type LarkCredentialValidationDependencies = {\n createBotInfoClient?(input: { appId: string; appSecret: string; domain: LarkDomain }): BotInfoClient;\n};\n\nexport type RegisterLarkPersonalAgentInput = {\n signal?: AbortSignal;\n onQrCode(info: LarkRegistrationQrCodeInfo): void;\n onStatus?(info: LarkRegistrationStatusInfo): void;\n onWarning?(message: string): void;\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction accountDomainFor(domain: LarkDomain): string {\n return domain === \"feishu\" ? \"accounts.feishu.cn\" : \"accounts.larksuite.com\";\n}\n\nfunction sdkDomainFor(domain: LarkDomain): lark.Domain {\n return domain === \"feishu\" ? lark.Domain.Feishu : lark.Domain.Lark;\n}\n\nfunction registrationDomainFromUserInfo(userInfo: LarkRegisterAppResult[\"user_info\"]): LarkDomain {\n if (userInfo?.tenant_brand === \"lark\") return \"lark\";\n if (userInfo?.tenant_brand === \"feishu\") return \"feishu\";\n return \"feishu\";\n}\n\nfunction createDefaultBotInfoClient(input: { appId: string; appSecret: string; domain: LarkDomain }): BotInfoClient {\n return new lark.Client({\n appId: input.appId,\n appSecret: input.appSecret,\n domain: sdkDomainFor(input.domain)\n });\n}\n\nfunction botInfoFromResponse(response: unknown): { botOpenId: string; botName: string } | undefined {\n const value = response as { bot?: { open_id?: string; app_name?: string; name?: string }; data?: { bot?: { open_id?: string; app_name?: string; name?: string } } };\n const bot = value.bot ?? value.data?.bot;\n if (!bot?.open_id) {\n return undefined;\n }\n return {\n botOpenId: bot.open_id,\n botName: bot.app_name || bot.name || \"OpenTag\"\n };\n}\n\nexport async function validateLarkCredentials(\n input: { appId: string; appSecret: string; domain: LarkDomain },\n dependencies: LarkCredentialValidationDependencies = {}\n): Promise<LarkCredentialValidationResult> {\n const client = (dependencies.createBotInfoClient ?? createDefaultBotInfoClient)(input);\n let response: unknown;\n try {\n response = await client.request({\n url: \"/open-apis/bot/v3/info\",\n method: \"GET\"\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`Lark credentials could not be verified: ${reason}`);\n }\n\n const botIdentity = botInfoFromResponse(response);\n if (!botIdentity) {\n throw new Error(\"Lark credentials could not be verified: bot/v3/info response did not include bot.open_id.\");\n }\n return botIdentity;\n}\n\nasync function fetchBotIdentity(\n input: { appId: string; appSecret: string; domain: LarkDomain },\n options: {\n createBotInfoClient: NonNullable<LarkPersonalAgentRegistrationDependencies[\"createBotInfoClient\"]>;\n sleep: (ms: number) => Promise<void>;\n onWarning?: (message: string) => void;\n }\n): Promise<Pick<RegisteredLarkPersonalAgent, \"botOpenId\" | \"botName\">> {\n const client = options.createBotInfoClient(input);\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= BOT_INFO_RETRIES; attempt += 1) {\n try {\n const botIdentity = botInfoFromResponse(\n await client.request({\n url: \"/open-apis/bot/v3/info\",\n method: \"GET\"\n })\n );\n if (botIdentity) {\n return botIdentity;\n }\n lastError = new Error(\"bot/v3/info response did not include bot.open_id.\");\n } catch (error) {\n lastError = error;\n }\n\n if (attempt < BOT_INFO_RETRIES) {\n await options.sleep(BOT_INFO_RETRY_DELAY_MS);\n }\n }\n\n const reason = lastError instanceof Error ? lastError.message : String(lastError);\n options.onWarning?.(\n `OpenTag could not fetch the Lark bot open_id automatically. Direct chat still works. For group chat, enter the bot open_id manually. Reason: ${reason}`\n );\n return {};\n}\n\nexport async function registerLarkPersonalAgent(\n input: RegisterLarkPersonalAgentInput,\n dependencies: LarkPersonalAgentRegistrationDependencies = {}\n): Promise<RegisteredLarkPersonalAgent> {\n let detectedDomain: LarkDomain | undefined;\n\n const registerApp = dependencies.registerApp ?? lark.registerApp;\n const registrationOptions = {\n // QR registration does not preselect a tenant. The SDK starts on the Feishu\n // bootstrap host and can switch polling to Lark when it detects an\n // international tenant; the created app's actual tenant is persisted below.\n domain: accountDomainFor(\"feishu\"),\n larkDomain: accountDomainFor(\"lark\"),\n source: REGISTRATION_SOURCE,\n createOnly: true,\n appPreset: {\n name: \"OpenTag {user}\",\n desc: \"Wake your local OpenTag agent from Lark.\"\n },\n addons: {\n scopes: {\n tenant: [\"im:message:send_as_bot\", \"im:message.p2p_msg:readonly\", \"im:message.group_msg:readonly\", \"im:chat:readonly\"]\n },\n events: {\n items: {\n tenant: [\"im.message.receive_v1\"]\n }\n }\n },\n onQRCodeReady: input.onQrCode,\n onStatusChange(info) {\n if (info.status === \"domain_switched\") {\n detectedDomain = \"lark\";\n }\n input.onStatus?.(info);\n }\n } satisfies Parameters<LarkRegisterApp>[0];\n\n const registration = await registerApp({\n ...registrationOptions,\n ...(input.signal ? { signal: input.signal } : {})\n });\n\n const domain = detectedDomain ?? registrationDomainFromUserInfo(registration.user_info);\n const botIdentity = await fetchBotIdentity(\n {\n appId: registration.client_id,\n appSecret: registration.client_secret,\n domain\n },\n {\n createBotInfoClient: dependencies.createBotInfoClient ?? createDefaultBotInfoClient,\n sleep: dependencies.sleep ?? sleep,\n ...(input.onWarning ? { onWarning: input.onWarning } : {})\n }\n );\n\n return {\n appId: registration.client_id,\n appSecret: registration.client_secret,\n domain,\n ...(registration.user_info?.open_id ? { operatorOpenId: registration.user_info.open_id } : {}),\n ...(botIdentity.botOpenId ? { botOpenId: botIdentity.botOpenId } : {}),\n ...(botIdentity.botName ? { botName: botIdentity.botName } : {})\n };\n}\n"],"mappings":"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","names":["binding","result","lark","createDoctorSummaryPresentation","createSourceThreadStatusPresentation","parseProjectTargetRef","renderOpenTagPresentationPlainText","parseProjectTargetRef","formatProjectTarget","createSourceThreadStatusPresentation","renderOpenTagPresentationPlainText","createDoctorSummaryPresentation","lark","registerApp"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ingress.d.ts","sourceRoot":"","sources":["../src/ingress.ts"],"names":[],"mappings":"AAaA,OAAO,EAA4B,KAAK,uBAAuB,EAAE,KAAK,yBAAyB,EAA6B,MAAM,cAAc,CAAC;AACjJ,OAAO,EAAiE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE3G,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAE1C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5E,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,KAAK,EAAE;QAAE,eAAe,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,cAAc,CAAC,CAAC,MAAM,EAAE,iBAAiB,GAAG,YAAY,CAAC;IACzD,qBAAqB,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,uBAAuB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;IAC3F,KAAK,CAAC,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,UAAU,CAAC,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAyCF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,iBAAiB,CA+BlF;AAmLD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,EAAE,YAAY,GAAE,uBAA4B,GAAG,iBAAiB,CAiLzH"}
1
+ {"version":3,"file":"ingress.d.ts","sourceRoot":"","sources":["../src/ingress.ts"],"names":[],"mappings":"AAaA,OAAO,EAA4B,KAAK,uBAAuB,EAAE,KAAK,yBAAyB,EAA6B,MAAM,cAAc,CAAC;AACjJ,OAAO,EAAiE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE3G,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAE1C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5E,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,KAAK,EAAE;QAAE,eAAe,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,cAAc,CAAC,CAAC,MAAM,EAAE,iBAAiB,GAAG,YAAY,CAAC;IACzD,qBAAqB,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,uBAAuB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;IAC3F,KAAK,CAAC,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,UAAU,CAAC,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAyCF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,iBAAiB,CA+BlF;AAmLD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,EAAE,YAAY,GAAE,uBAA4B,GAAG,iBAAiB,CAkLzH"}
@@ -32,10 +32,16 @@ type LarkMessageApi = {
32
32
  patch?: (payload?: LarkPatchPayload) => Promise<unknown>;
33
33
  update?: (payload?: LarkUpdatePayload) => Promise<unknown>;
34
34
  };
35
+ type LarkRequestPayload = {
36
+ method: string;
37
+ url: string;
38
+ data?: unknown;
39
+ };
35
40
  export type LarkReplyResult = {
36
41
  messageId?: string;
37
42
  };
38
43
  export type LarkReplyClient = {
44
+ request?: (payload: LarkRequestPayload) => Promise<unknown>;
39
45
  im: {
40
46
  message?: LarkMessageApi;
41
47
  v1?: {
@@ -61,5 +67,9 @@ export declare function updateLarkTextMessage(client: LarkReplyClient, input: {
61
67
  messageId: string;
62
68
  text: string;
63
69
  }): Promise<void>;
70
+ export declare function addLarkMessageReaction(client: LarkReplyClient, input: {
71
+ messageId: string;
72
+ emojiType: string;
73
+ }): Promise<void>;
64
74
  export {};
65
75
  //# sourceMappingURL=outbound.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbound.d.ts","sourceRoot":"","sources":["../src/outbound.ts"],"names":[],"mappings":"AACA,OAAO,EAAqE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE/G,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvF,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3B,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C,CAAC;AAIF,KAAK,cAAc,GAAG;IACpB,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAGF,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE;QACF,OAAO,CAAC,EAAE,cAAc,CAAC;QACzB,EAAE,CAAC,EAAE;YACH,OAAO,CAAC,EAAE,cAAc,CAAC;SAC1B,CAAC;KACH,CAAC;CACH,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,GAAG,eAAe,CAM9H;AAwBD,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAWrJ;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/H;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAU9H"}
1
+ {"version":3,"file":"outbound.d.ts","sourceRoot":"","sources":["../src/outbound.ts"],"names":[],"mappings":"AACA,OAAO,EAAqE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE/G,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvF,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3B,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C,CAAC;AAIF,KAAK,cAAc,GAAG;IACpB,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5D,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAGF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,EAAE,EAAE;QACF,OAAO,CAAC,EAAE,cAAc,CAAC;QACzB,EAAE,CAAC,EAAE;YACH,OAAO,CAAC,EAAE,cAAc,CAAC;SAC1B,CAAC;KACH,CAAC;CACH,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,GAAG,eAAe,CAM9H;AAwBD,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAWrJ;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/H;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAU9H;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAWpI"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentag/lark",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "Lark/Feishu message normalization and callback helpers for OpenTag.",
5
5
  "type": "module",
6
6
  "engines": {
@@ -32,8 +32,8 @@
32
32
  "license": "MIT",
33
33
  "dependencies": {
34
34
  "@larksuiteoapi/node-sdk": "^1.68.0",
35
- "@opentag/client": "0.3.1",
36
- "@opentag/core": "0.3.1"
35
+ "@opentag/client": "0.3.3",
36
+ "@opentag/core": "0.3.3"
37
37
  },
38
38
  "devDependencies": {
39
39
  "tsup": "^8.5.1",