import { type RepoChoice } from './issue-card.js'; import type { CardActionData } from './card-handler.js'; import type { PlatformIssue, PlatformIssueSections } from '../../platform/issue-client.js'; export interface IssueCommandDeps { fetchTeams: () => Promise<{ ok: boolean; value?: Array<{ teamId: string; teamName: string; }>; reason?: string; }>; fetchIssues: (teamId: string) => Promise<{ ok: boolean; value?: PlatformIssueSections; reason?: string; }>; /** 跑 [[issue-claim-flow]]。返回值直接喂给结果卡。 */ runClaim: (args: { issue: PlatformIssue; teamId: string; larkAppId: string; workingDir: string; invokerOpenId: string; }) => Promise<{ ok: true; chatId: string; chatName: string; shareLink?: string; } | { ok: false; stage: string; reason: string; }>; /** 该 bot 的管理员 open_id 名单(`resolvedAllowedUsers`)。 */ allowedUsers: (larkAppId: string) => string[]; /** 该 bot 配置的工作目录(未展开 `~`)。 */ workingDirs: (larkAppId: string) => string[]; /** 跑 [[issue-release]] 的 `releaseIssue`。按锚点释放,锚点由调用方从当前会话推出来。 */ runRelease: (anchorId: string) => Promise; /** 跑 [[issue-release]] 的 `completeIssue`(验收完成)。与释放同形,只是目标态不同。 */ runDone: (anchorId: string) => Promise; /** 跑 [[issue-status-view]]。只读,用来渲染 `/issue status` 卡片。 */ runStatus: (anchorId: string) => Promise<{ ok: true; card: string; } | { ok: false; reason: 'no_binding'; }>; } /** * 释放 / 验收完成的共同返回形状。 * * `bindState` 只在 `already_released` 时有意义:三个终态(void / released / done)要说的话 * 完全不同——"作废了"、"早就释放过了"、"已经验收完成了"——糊成一句人会以为自己记错了。 */ export type TerminalResult = { ok: true; issueId: string; alreadyReleasedOnPlatform: boolean; } | { ok: false; reason: 'no_binding' | 'already_released' | 'platform'; detail?: string; bindState?: string; /** 平台明确拒绝且重试无意义(凭证失效 / issue 被删或归档)。措辞必须换掉"稍后再试"。 */ permanent?: boolean; }; /** 命令入口的返回:card 是卡片 JSON 字符串,直接喂 `sessionReply(..., 'interactive')`。 */ export type IssueCardResult = { card: string; } | { toast: { type: 'error' | 'info'; content: string; }; }; /** * 卡片回调的返回。**结构与命令入口不同**:Lark 的 callback 响应要求 * `card: { type: 'raw', data: <对象> }`,直接回一个 JSON 字符串会被判非法, * 客户端报 `code 200672`(实测踩过:卡片能发出来,但一点按钮就报错)。 */ export type IssueCardCallbackResult = { card: { type: 'raw'; data: Record; }; } | { toast: { type: 'error' | 'info'; content: string; }; }; /** * 扫出该 bot 可选的仓库。 * * 不能直接用 `workingDirs`:它常常配的是一个工作区父目录(`~/claude-code-workspace`), * 直接当候选,选中的会是工作区根目录。扫一层才拿得到真正的仓库和 worktree。 */ export declare function reposFor(larkAppId: string, deps: IssueCommandDeps): RepoChoice[]; /** `/issue`(裸)→ 看板卡片。 */ export declare function handleIssueCommand(larkAppId: string, senderOpenId: string | undefined, deps: IssueCommandDeps): Promise; type Toast = { toast: { type: 'error' | 'info'; content: string; }; }; /** * `/issue release` → 释放当前会话领取的那个 issue,退回平台「待领取」。 * * 在**领取时建出来的那个群里**发。返回文本而不是卡片:这是个一次性动作,结果就一句话, * 发张卡反而重。 */ export declare function handleIssueRelease(larkAppId: string, senderOpenId: string | undefined, anchorCandidates: Array, deps: IssueCommandDeps): Promise; /** * `/issue done` → 验收通过,把任务推到平台的终态。 * * 这一步是**人的决策**,不是 agent 能自己走的:agent 交付只到「待验收」([[issue-report]]), * 之后由人看过产出再决定完成还是打回。所以入口是群里的管理员命令,而不是 `botmux` 的某个 * 子命令——放在 CLI 里 agent 就能自己盖章验收,那这个状态就没有意义了。 * * 平台侧 `done` 会清掉 claim(`clearsClaim`),这条领取就此终结、不能再释放。 */ export declare function handleIssueDone(larkAppId: string, senderOpenId: string | undefined, anchorCandidates: Array, deps: IssueCommandDeps): Promise; /** * `/issue status` → 摊开本机与平台两边的现状。 * * 只读,所以**不设终态门**:这个命令的用处恰恰是在「这个群是不是已经结束了」存疑的时候 * 回答它,把终态 binding 当成"没有绑定"是把唯一的答案藏起来。 */ export declare function handleIssueStatus(larkAppId: string, senderOpenId: string | undefined, anchorCandidates: Array, deps: IssueCommandDeps): Promise; /** 卡片回调。所有 `issue_*` action 都走这里。 */ export declare function handleIssueCardAction(data: CardActionData, larkAppId: string, deps: IssueCommandDeps): Promise; export {}; //# sourceMappingURL=issue-command.d.ts.map