botmux 3.9.0 → 3.9.2

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.
Files changed (112) hide show
  1. package/dist/.runtime-build-id +1 -1
  2. package/dist/adapters/backend/tmux-pipe-backend.d.ts +7 -0
  3. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  4. package/dist/adapters/backend/tmux-pipe-backend.js +20 -0
  5. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  6. package/dist/adapters/backend/types.d.ts +12 -0
  7. package/dist/adapters/backend/types.d.ts.map +1 -1
  8. package/dist/adapters/backend/types.js.map +1 -1
  9. package/dist/adapters/cli/codex.d.ts.map +1 -1
  10. package/dist/adapters/cli/codex.js +40 -7
  11. package/dist/adapters/cli/codex.js.map +1 -1
  12. package/dist/adapters/cli/traex.d.ts.map +1 -1
  13. package/dist/adapters/cli/traex.js +87 -87
  14. package/dist/adapters/cli/traex.js.map +1 -1
  15. package/dist/cli/deferred-topic-send.d.ts +11 -0
  16. package/dist/cli/deferred-topic-send.d.ts.map +1 -1
  17. package/dist/cli/deferred-topic-send.js +21 -4
  18. package/dist/cli/deferred-topic-send.js.map +1 -1
  19. package/dist/cli.d.ts.map +1 -1
  20. package/dist/cli.js +177 -38
  21. package/dist/cli.js.map +1 -1
  22. package/dist/core/command-handler.d.ts.map +1 -1
  23. package/dist/core/command-handler.js +40 -1
  24. package/dist/core/command-handler.js.map +1 -1
  25. package/dist/core/dispatch.d.ts +43 -5
  26. package/dist/core/dispatch.d.ts.map +1 -1
  27. package/dist/core/dispatch.js +104 -6
  28. package/dist/core/dispatch.js.map +1 -1
  29. package/dist/core/passthrough-commands.d.ts.map +1 -1
  30. package/dist/core/passthrough-commands.js +1 -1
  31. package/dist/core/passthrough-commands.js.map +1 -1
  32. package/dist/daemon.d.ts +11 -1
  33. package/dist/daemon.d.ts.map +1 -1
  34. package/dist/daemon.js +32 -3
  35. package/dist/daemon.js.map +1 -1
  36. package/dist/i18n/en.d.ts.map +1 -1
  37. package/dist/i18n/en.js +2 -0
  38. package/dist/i18n/en.js.map +1 -1
  39. package/dist/i18n/zh.d.ts.map +1 -1
  40. package/dist/i18n/zh.js +2 -0
  41. package/dist/i18n/zh.js.map +1 -1
  42. package/dist/im/lark/card-handler.d.ts.map +1 -1
  43. package/dist/im/lark/card-handler.js +9 -0
  44. package/dist/im/lark/card-handler.js.map +1 -1
  45. package/dist/im/lark/issue-card.d.ts +223 -0
  46. package/dist/im/lark/issue-card.d.ts.map +1 -0
  47. package/dist/im/lark/issue-card.js +542 -0
  48. package/dist/im/lark/issue-card.js.map +1 -0
  49. package/dist/im/lark/issue-command-deps.d.ts +41 -0
  50. package/dist/im/lark/issue-command-deps.d.ts.map +1 -0
  51. package/dist/im/lark/issue-command-deps.js +195 -0
  52. package/dist/im/lark/issue-command-deps.js.map +1 -0
  53. package/dist/im/lark/issue-command.d.ts +137 -0
  54. package/dist/im/lark/issue-command.d.ts.map +1 -0
  55. package/dist/im/lark/issue-command.js +335 -0
  56. package/dist/im/lark/issue-command.js.map +1 -0
  57. package/dist/platform/issue-client.d.ts +201 -0
  58. package/dist/platform/issue-client.d.ts.map +1 -0
  59. package/dist/platform/issue-client.js +142 -0
  60. package/dist/platform/issue-client.js.map +1 -0
  61. package/dist/platform/platform-http.d.ts +4 -0
  62. package/dist/platform/platform-http.d.ts.map +1 -1
  63. package/dist/platform/platform-http.js +38 -2
  64. package/dist/platform/platform-http.js.map +1 -1
  65. package/dist/services/codex-composer-state.d.ts +27 -0
  66. package/dist/services/codex-composer-state.d.ts.map +1 -0
  67. package/dist/services/codex-composer-state.js +53 -0
  68. package/dist/services/codex-composer-state.js.map +1 -0
  69. package/dist/services/codex-transcript.d.ts +33 -12
  70. package/dist/services/codex-transcript.d.ts.map +1 -1
  71. package/dist/services/codex-transcript.js +82 -20
  72. package/dist/services/codex-transcript.js.map +1 -1
  73. package/dist/services/issue-board-store.d.ts +214 -0
  74. package/dist/services/issue-board-store.d.ts.map +1 -0
  75. package/dist/services/issue-board-store.js +472 -0
  76. package/dist/services/issue-board-store.js.map +1 -0
  77. package/dist/services/issue-claim-flow.d.ts +160 -0
  78. package/dist/services/issue-claim-flow.d.ts.map +1 -0
  79. package/dist/services/issue-claim-flow.js +222 -0
  80. package/dist/services/issue-claim-flow.js.map +1 -0
  81. package/dist/services/issue-outbox-pump.d.ts +25 -0
  82. package/dist/services/issue-outbox-pump.d.ts.map +1 -0
  83. package/dist/services/issue-outbox-pump.js +102 -0
  84. package/dist/services/issue-outbox-pump.js.map +1 -0
  85. package/dist/services/issue-release.d.ts +78 -0
  86. package/dist/services/issue-release.d.ts.map +1 -0
  87. package/dist/services/issue-release.js +89 -0
  88. package/dist/services/issue-release.js.map +1 -0
  89. package/dist/services/issue-report.d.ts +72 -0
  90. package/dist/services/issue-report.d.ts.map +1 -0
  91. package/dist/services/issue-report.js +84 -0
  92. package/dist/services/issue-report.js.map +1 -0
  93. package/dist/services/issue-status-view.d.ts +52 -0
  94. package/dist/services/issue-status-view.d.ts.map +1 -0
  95. package/dist/services/issue-status-view.js +42 -0
  96. package/dist/services/issue-status-view.js.map +1 -0
  97. package/dist/services/issue-status-writer.d.ts +98 -0
  98. package/dist/services/issue-status-writer.d.ts.map +1 -0
  99. package/dist/services/issue-status-writer.js +123 -0
  100. package/dist/services/issue-status-writer.js.map +1 -0
  101. package/dist/services/traex-paths.d.ts +14 -2
  102. package/dist/services/traex-paths.d.ts.map +1 -1
  103. package/dist/services/traex-paths.js +16 -2
  104. package/dist/services/traex-paths.js.map +1 -1
  105. package/dist/services/traex-transcript.d.ts +33 -0
  106. package/dist/services/traex-transcript.d.ts.map +1 -1
  107. package/dist/services/traex-transcript.js +135 -28
  108. package/dist/services/traex-transcript.js.map +1 -1
  109. package/dist/setup/lark-scopes.json +0 -2
  110. package/dist/worker.js +269 -7
  111. package/dist/worker.js.map +1 -1
  112. package/package.json +1 -1
@@ -0,0 +1,195 @@
1
+ /**
2
+ * 把 [[issue-command]] 声明的依赖接到真实实现上。
3
+ *
4
+ * 单独一个文件是为了让 issue-command 保持可测:那边只认接口,真实的平台客户端、建群服务、
5
+ * bot 注册表都在这里装配。card-handler 与 command-handler 都从这里取。
6
+ */
7
+ import { config } from '../../config.js';
8
+ import { effectiveBotDisplayName, getBot } from '../../bot-registry.js';
9
+ import { logger } from '../../utils/logger.js';
10
+ import { readPlatformBinding } from '../../platform/binding.js';
11
+ import { bindIssue, claimIssue, fetchIssues, fetchTeams, findIssueById, writeIssueStatus, } from '../../platform/issue-client.js';
12
+ import { claimIssueIntoGroup, issueDetailUrl } from '../../services/issue-claim-flow.js';
13
+ import { completeIssue, releaseIssue } from '../../services/issue-release.js';
14
+ import { describeIssue } from '../../services/issue-status-view.js';
15
+ import { createGroupWithBots } from '../../services/group-creator.js';
16
+ import { buildIssueStatusCard } from './issue-card.js';
17
+ import { sendMessage } from './client.js';
18
+ /**
19
+ * kickoff 正文。写给 agent 看,所以要把它开工需要的一切都说全:干什么、在哪干、
20
+ * 做完怎么交付。
21
+ *
22
+ * 最后那句 `botmux report` 不是客套:它是**本机唯一**会把 issue 推到 in_review 的信号
23
+ * (见 [[issue-status-projector]] 的计划)。不写进 kickoff,agent 干完了平台也不知道。
24
+ */
25
+ export function buildKickoffPrompt(args) {
26
+ return [
27
+ `请接手这个任务:**${args.title}**`,
28
+ '',
29
+ args.body?.trim() ? args.body.trim() : '_(这条任务没有填写详细描述)_',
30
+ '',
31
+ `工作目录:\`${args.workingDir}\``,
32
+ `平台任务 ID:\`${args.issueId}\``,
33
+ '',
34
+ '完成后执行 `botmux report` 交付,我会据此把任务状态推到「待验收」。',
35
+ ].join('\n');
36
+ }
37
+ /**
38
+ * daemon 在启动时把内部建会话入口注册进来。
39
+ *
40
+ * 用模块级注册而不是让 card-handler 直接 import daemon:daemon 是顶层编排,反向依赖它
41
+ * 会成环。注册前领取会干净地停在 activate 阶段(见 ActivateSession 的注释)。
42
+ */
43
+ let registeredActivate;
44
+ export function setIssueActivate(fn) {
45
+ registeredActivate = fn;
46
+ }
47
+ export function buildIssueCommandDeps(activate = registeredActivate) {
48
+ return {
49
+ fetchTeams: () => fetchTeams(),
50
+ fetchIssues: (teamId) => fetchIssues(teamId),
51
+ allowedUsers: (larkAppId) => {
52
+ try {
53
+ return getBot(larkAppId).resolvedAllowedUsers ?? [];
54
+ }
55
+ catch {
56
+ // bot 不在注册表里就当没有管理员——权限门 fail-closed,拒绝好过放行。
57
+ return [];
58
+ }
59
+ },
60
+ workingDirs: (larkAppId) => {
61
+ try {
62
+ const cfg = getBot(larkAppId).config;
63
+ return [
64
+ ...(cfg.workingDir ? [cfg.workingDir] : []),
65
+ ...(cfg.workingDirs ?? []),
66
+ ];
67
+ }
68
+ catch {
69
+ return [];
70
+ }
71
+ },
72
+ runClaim: async ({ issue, teamId, larkAppId, workingDir, invokerOpenId }) => {
73
+ const binding = readPlatformBinding();
74
+ if (!binding)
75
+ return { ok: false, stage: 'claim', reason: 'unbound' };
76
+ // 建群拿到的 chatId 之后要用来发 kickoff,先接住。
77
+ let shareLink;
78
+ let chatName = '';
79
+ // bot 不在注册表里就回落到 appId——展示名拿不到不该让领取失败。
80
+ let agentLabel;
81
+ try {
82
+ agentLabel = effectiveBotDisplayName(getBot(larkAppId));
83
+ }
84
+ catch {
85
+ agentLabel = undefined;
86
+ }
87
+ const r = await claimIssueIntoGroup({
88
+ dataDir: config.session.dataDir,
89
+ platformBaseUrl: binding.platformUrl,
90
+ claim: (issueId, args) => claimIssue(issueId, args),
91
+ bind: (issueId, args) => bindIssue(issueId, args),
92
+ createGroup: async (opts) => {
93
+ const res = await createGroupWithBots({
94
+ ...opts,
95
+ // 领取人要在群里,否则建出来的群他自己进不去。用 open_id 而不是 union_id:
96
+ // 这里的 invoker 来自同一个 bot 的卡片回调,本来就是 app-scoped 的。
97
+ userOpenIds: [invokerOpenId],
98
+ });
99
+ chatName = opts.name ?? '';
100
+ shareLink = res.shareLink ?? undefined;
101
+ return res;
102
+ },
103
+ announce: async (chatId, card) => {
104
+ await sendMessage(larkAppId, chatId, card, 'interactive');
105
+ },
106
+ onAnnounceError: (reason) => logger.warn(`[issue] 开工播报失败(不影响领取):${reason}`),
107
+ activate: async (chatId, botLarkAppId, prompt) => {
108
+ if (!activate)
109
+ throw new Error('activate_not_wired');
110
+ return activate({ chatId, larkAppId: botLarkAppId, prompt, workingDir });
111
+ },
112
+ writeStatus: (issueId, args) => writeIssueStatus(issueId, args),
113
+ fetchIssue: (teamId, issueId) => findIssueById(teamId, issueId),
114
+ onStatusError: (reason) => logger.warn(`[issue] in_progress 回写失败(领取仍成功,pump 会重投):${reason}`),
115
+ }, {
116
+ issue,
117
+ teamId,
118
+ larkAppId,
119
+ creatorLarkAppId: larkAppId,
120
+ ownerUnionIds: [],
121
+ workingDir,
122
+ // 平台详情页直接渲染这个值,给它人能认的名字而不是 appId。
123
+ ...(agentLabel ? { agentLabel } : {}),
124
+ kickoffPrompt: buildKickoffPrompt({
125
+ title: issue.title,
126
+ ...(issue.body ? { body: issue.body } : {}),
127
+ workingDir,
128
+ issueId: issue._id,
129
+ }),
130
+ });
131
+ if (r.ok) {
132
+ logger.info(`[issue] 领取完成 issue=${issue._id} chat=${r.chatId} dir=${workingDir}`);
133
+ return {
134
+ ok: true,
135
+ chatId: r.chatId,
136
+ chatName: chatName || r.chatId,
137
+ ...(shareLink ? { shareLink } : {}),
138
+ };
139
+ }
140
+ return { ok: false, stage: r.stage, reason: r.reason };
141
+ },
142
+ runRelease: (anchorId) => settle(releaseIssue, anchorId),
143
+ runDone: (anchorId) => settle(completeIssue, anchorId),
144
+ runStatus: async (anchorId) => {
145
+ const r = await describeIssue({ dataDir: config.session.dataDir, fetchIssue: (teamId, issueId) => findIssueById(teamId, issueId) }, anchorId);
146
+ if (!r.ok)
147
+ return { ok: false, reason: r.reason };
148
+ const { binding, issue, pendingWrites, failedWrites, lastFailure, claimMine } = r.view;
149
+ const url = issueDetailUrl(binding.platformBaseUrl, binding.issueId);
150
+ return {
151
+ ok: true,
152
+ card: buildIssueStatusCard({
153
+ issueId: binding.issueId,
154
+ bindState: binding.bindState,
155
+ pendingWrites,
156
+ ...(failedWrites > 0 ? { failedWrites } : {}),
157
+ ...(lastFailure ? { lastFailure } : {}),
158
+ ...(binding.lastSyncedStatus ? { lastSyncedStatus: binding.lastSyncedStatus } : {}),
159
+ ...(claimMine !== undefined ? { claimMine } : {}),
160
+ ...(issue
161
+ ? {
162
+ platform: {
163
+ title: issue.title,
164
+ status: issue.status,
165
+ ...(issue.attentionReason ? { attentionReason: issue.attentionReason } : {}),
166
+ ...(issue.claim?.agent ? { claimAgent: issue.claim.agent } : {}),
167
+ ...(issue.claim?.localTaskLabel ? { claimLabel: issue.claim.localTaskLabel } : {}),
168
+ },
169
+ }
170
+ : {}),
171
+ ...(url ? { issueUrl: url } : {}),
172
+ }),
173
+ };
174
+ },
175
+ };
176
+ }
177
+ /** 释放与验收完成只差目标态,出参形状一致,装配也就共用一份。 */
178
+ async function settle(run, anchorId) {
179
+ const r = await run({
180
+ dataDir: config.session.dataDir,
181
+ writeStatus: (issueId, args) => writeIssueStatus(issueId, args),
182
+ fetchIssue: (teamId, issueId) => findIssueById(teamId, issueId),
183
+ }, anchorId);
184
+ if (r.ok) {
185
+ return { ok: true, issueId: r.issueId, alreadyReleasedOnPlatform: r.alreadyReleasedOnPlatform };
186
+ }
187
+ return {
188
+ ok: false,
189
+ reason: r.reason,
190
+ ...(r.reason === 'platform' ? { detail: r.detail, ...(r.permanent ? { permanent: true } : {}) } : {}),
191
+ // 终态是哪一种决定了给人的说法(作废 / 已释放 / 已完成)。
192
+ ...(r.reason === 'already_released' ? { bindState: r.binding.bindState } : {}),
193
+ };
194
+ }
195
+ //# sourceMappingURL=issue-command-deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-command-deps.js","sourceRoot":"","sources":["../../../src/im/lark/issue-command-deps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ import { type RepoChoice } from './issue-card.js';
2
+ import type { CardActionData } from './card-handler.js';
3
+ import type { PlatformIssue, PlatformIssueSections } from '../../platform/issue-client.js';
4
+ export interface IssueCommandDeps {
5
+ fetchTeams: () => Promise<{
6
+ ok: boolean;
7
+ value?: Array<{
8
+ teamId: string;
9
+ teamName: string;
10
+ }>;
11
+ reason?: string;
12
+ }>;
13
+ fetchIssues: (teamId: string) => Promise<{
14
+ ok: boolean;
15
+ value?: PlatformIssueSections;
16
+ reason?: string;
17
+ }>;
18
+ /** 跑 [[issue-claim-flow]]。返回值直接喂给结果卡。 */
19
+ runClaim: (args: {
20
+ issue: PlatformIssue;
21
+ teamId: string;
22
+ larkAppId: string;
23
+ workingDir: string;
24
+ invokerOpenId: string;
25
+ }) => Promise<{
26
+ ok: true;
27
+ chatId: string;
28
+ chatName: string;
29
+ shareLink?: string;
30
+ } | {
31
+ ok: false;
32
+ stage: string;
33
+ reason: string;
34
+ }>;
35
+ /** 该 bot 的管理员 open_id 名单(`resolvedAllowedUsers`)。 */
36
+ allowedUsers: (larkAppId: string) => string[];
37
+ /** 该 bot 配置的工作目录(未展开 `~`)。 */
38
+ workingDirs: (larkAppId: string) => string[];
39
+ /** 跑 [[issue-release]] 的 `releaseIssue`。按锚点释放,锚点由调用方从当前会话推出来。 */
40
+ runRelease: (anchorId: string) => Promise<TerminalResult>;
41
+ /** 跑 [[issue-release]] 的 `completeIssue`(验收完成)。与释放同形,只是目标态不同。 */
42
+ runDone: (anchorId: string) => Promise<TerminalResult>;
43
+ /** 跑 [[issue-status-view]]。只读,用来渲染 `/issue status` 卡片。 */
44
+ runStatus: (anchorId: string) => Promise<{
45
+ ok: true;
46
+ card: string;
47
+ } | {
48
+ ok: false;
49
+ reason: 'no_binding';
50
+ }>;
51
+ }
52
+ /**
53
+ * 释放 / 验收完成的共同返回形状。
54
+ *
55
+ * `bindState` 只在 `already_released` 时有意义:三个终态(void / released / done)要说的话
56
+ * 完全不同——"作废了"、"早就释放过了"、"已经验收完成了"——糊成一句人会以为自己记错了。
57
+ */
58
+ export type TerminalResult = {
59
+ ok: true;
60
+ issueId: string;
61
+ alreadyReleasedOnPlatform: boolean;
62
+ } | {
63
+ ok: false;
64
+ reason: 'no_binding' | 'already_released' | 'platform';
65
+ detail?: string;
66
+ bindState?: string;
67
+ /** 平台明确拒绝且重试无意义(凭证失效 / issue 被删或归档)。措辞必须换掉"稍后再试"。 */
68
+ permanent?: boolean;
69
+ };
70
+ /** 命令入口的返回:card 是卡片 JSON 字符串,直接喂 `sessionReply(..., 'interactive')`。 */
71
+ export type IssueCardResult = {
72
+ card: string;
73
+ } | {
74
+ toast: {
75
+ type: 'error' | 'info';
76
+ content: string;
77
+ };
78
+ };
79
+ /**
80
+ * 卡片回调的返回。**结构与命令入口不同**:Lark 的 callback 响应要求
81
+ * `card: { type: 'raw', data: <对象> }`,直接回一个 JSON 字符串会被判非法,
82
+ * 客户端报 `code 200672`(实测踩过:卡片能发出来,但一点按钮就报错)。
83
+ */
84
+ export type IssueCardCallbackResult = {
85
+ card: {
86
+ type: 'raw';
87
+ data: Record<string, unknown>;
88
+ };
89
+ } | {
90
+ toast: {
91
+ type: 'error' | 'info';
92
+ content: string;
93
+ };
94
+ };
95
+ /**
96
+ * 扫出该 bot 可选的仓库。
97
+ *
98
+ * 不能直接用 `workingDirs`:它常常配的是一个工作区父目录(`~/claude-code-workspace`),
99
+ * 直接当候选,选中的会是工作区根目录。扫一层才拿得到真正的仓库和 worktree。
100
+ */
101
+ export declare function reposFor(larkAppId: string, deps: IssueCommandDeps): RepoChoice[];
102
+ /** `/issue`(裸)→ 看板卡片。 */
103
+ export declare function handleIssueCommand(larkAppId: string, senderOpenId: string | undefined, deps: IssueCommandDeps): Promise<IssueCardResult>;
104
+ type Toast = {
105
+ toast: {
106
+ type: 'error' | 'info';
107
+ content: string;
108
+ };
109
+ };
110
+ /**
111
+ * `/issue release` → 释放当前会话领取的那个 issue,退回平台「待领取」。
112
+ *
113
+ * 在**领取时建出来的那个群里**发。返回文本而不是卡片:这是个一次性动作,结果就一句话,
114
+ * 发张卡反而重。
115
+ */
116
+ export declare function handleIssueRelease(larkAppId: string, senderOpenId: string | undefined, anchorCandidates: Array<string | undefined>, deps: IssueCommandDeps): Promise<Toast>;
117
+ /**
118
+ * `/issue done` → 验收通过,把任务推到平台的终态。
119
+ *
120
+ * 这一步是**人的决策**,不是 agent 能自己走的:agent 交付只到「待验收」([[issue-report]]),
121
+ * 之后由人看过产出再决定完成还是打回。所以入口是群里的管理员命令,而不是 `botmux` 的某个
122
+ * 子命令——放在 CLI 里 agent 就能自己盖章验收,那这个状态就没有意义了。
123
+ *
124
+ * 平台侧 `done` 会清掉 claim(`clearsClaim`),这条领取就此终结、不能再释放。
125
+ */
126
+ export declare function handleIssueDone(larkAppId: string, senderOpenId: string | undefined, anchorCandidates: Array<string | undefined>, deps: IssueCommandDeps): Promise<Toast>;
127
+ /**
128
+ * `/issue status` → 摊开本机与平台两边的现状。
129
+ *
130
+ * 只读,所以**不设终态门**:这个命令的用处恰恰是在「这个群是不是已经结束了」存疑的时候
131
+ * 回答它,把终态 binding 当成"没有绑定"是把唯一的答案藏起来。
132
+ */
133
+ export declare function handleIssueStatus(larkAppId: string, senderOpenId: string | undefined, anchorCandidates: Array<string | undefined>, deps: IssueCommandDeps): Promise<IssueCardResult>;
134
+ /** 卡片回调。所有 `issue_*` action 都走这里。 */
135
+ export declare function handleIssueCardAction(data: CardActionData, larkAppId: string, deps: IssueCommandDeps): Promise<IssueCardCallbackResult>;
136
+ export {};
137
+ //# sourceMappingURL=issue-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-command.d.ts","sourceRoot":"","sources":["../../../src/im/lark/issue-command.ts"],"names":[],"mappings":"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"}