@sireai/optimus 0.1.1

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 (204) hide show
  1. package/.env.example +16 -0
  2. package/LICENSE +21 -0
  3. package/README.md +104 -0
  4. package/dist/cli/optimus.d.ts +2 -0
  5. package/dist/cli/optimus.js +2951 -0
  6. package/dist/cli/optimus.js.map +1 -0
  7. package/dist/cli/self-update.d.ts +49 -0
  8. package/dist/cli/self-update.js +264 -0
  9. package/dist/cli/self-update.js.map +1 -0
  10. package/dist/config/load-config.d.ts +3 -0
  11. package/dist/config/load-config.js +321 -0
  12. package/dist/config/load-config.js.map +1 -0
  13. package/dist/config/optimus-paths.d.ts +13 -0
  14. package/dist/config/optimus-paths.js +44 -0
  15. package/dist/config/optimus-paths.js.map +1 -0
  16. package/dist/index.d.ts +25 -0
  17. package/dist/index.js +27 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/integrations/jira/jira-cli.d.ts +1 -0
  20. package/dist/integrations/jira/jira-cli.js +278 -0
  21. package/dist/integrations/jira/jira-cli.js.map +1 -0
  22. package/dist/integrations/jira/jira-client.d.ts +99 -0
  23. package/dist/integrations/jira/jira-client.js +521 -0
  24. package/dist/integrations/jira/jira-client.js.map +1 -0
  25. package/dist/integrations/jira/jira-submit.d.ts +71 -0
  26. package/dist/integrations/jira/jira-submit.js +351 -0
  27. package/dist/integrations/jira/jira-submit.js.map +1 -0
  28. package/dist/problem-solving-core/codex/codex-auth-resolver.d.ts +23 -0
  29. package/dist/problem-solving-core/codex/codex-auth-resolver.js +136 -0
  30. package/dist/problem-solving-core/codex/codex-auth-resolver.js.map +1 -0
  31. package/dist/problem-solving-core/codex/codex-connectivity-checks.d.ts +6 -0
  32. package/dist/problem-solving-core/codex/codex-connectivity-checks.js +81 -0
  33. package/dist/problem-solving-core/codex/codex-connectivity-checks.js.map +1 -0
  34. package/dist/problem-solving-core/codex/codex-failure-classifier.d.ts +2 -0
  35. package/dist/problem-solving-core/codex/codex-failure-classifier.js +49 -0
  36. package/dist/problem-solving-core/codex/codex-failure-classifier.js.map +1 -0
  37. package/dist/problem-solving-core/codex/codex-global-config.d.ts +17 -0
  38. package/dist/problem-solving-core/codex/codex-global-config.js +100 -0
  39. package/dist/problem-solving-core/codex/codex-global-config.js.map +1 -0
  40. package/dist/problem-solving-core/codex/codex-preflight.d.ts +13 -0
  41. package/dist/problem-solving-core/codex/codex-preflight.js +142 -0
  42. package/dist/problem-solving-core/codex/codex-preflight.js.map +1 -0
  43. package/dist/problem-solving-core/codex/codex-provider-profile.d.ts +14 -0
  44. package/dist/problem-solving-core/codex/codex-provider-profile.js +68 -0
  45. package/dist/problem-solving-core/codex/codex-provider-profile.js.map +1 -0
  46. package/dist/problem-solving-core/codex/codex-required-env.d.ts +3 -0
  47. package/dist/problem-solving-core/codex/codex-required-env.js +21 -0
  48. package/dist/problem-solving-core/codex/codex-required-env.js.map +1 -0
  49. package/dist/problem-solving-core/codex/codex-runner.d.ts +37 -0
  50. package/dist/problem-solving-core/codex/codex-runner.js +926 -0
  51. package/dist/problem-solving-core/codex/codex-runner.js.map +1 -0
  52. package/dist/problem-solving-core/codex/evolution-skill-guard.d.ts +36 -0
  53. package/dist/problem-solving-core/codex/evolution-skill-guard.js +143 -0
  54. package/dist/problem-solving-core/codex/evolution-skill-guard.js.map +1 -0
  55. package/dist/problem-solving-core/codex/repo-memory-service.d.ts +24 -0
  56. package/dist/problem-solving-core/codex/repo-memory-service.js +114 -0
  57. package/dist/problem-solving-core/codex/repo-memory-service.js.map +1 -0
  58. package/dist/problem-solving-core/codex/skill-sync-service.d.ts +35 -0
  59. package/dist/problem-solving-core/codex/skill-sync-service.js +280 -0
  60. package/dist/problem-solving-core/codex/skill-sync-service.js.map +1 -0
  61. package/dist/task-environment/cancellation/task-abort-registry.d.ts +17 -0
  62. package/dist/task-environment/cancellation/task-abort-registry.js +51 -0
  63. package/dist/task-environment/cancellation/task-abort-registry.js.map +1 -0
  64. package/dist/task-environment/cancellation/task-cancellation-service.d.ts +25 -0
  65. package/dist/task-environment/cancellation/task-cancellation-service.js +54 -0
  66. package/dist/task-environment/cancellation/task-cancellation-service.js.map +1 -0
  67. package/dist/task-environment/cancellation/task-cleanup-service.d.ts +22 -0
  68. package/dist/task-environment/cancellation/task-cleanup-service.js +67 -0
  69. package/dist/task-environment/cancellation/task-cleanup-service.js.map +1 -0
  70. package/dist/task-environment/delivery/commit-message/bugfix-commit-message-template.d.ts +13 -0
  71. package/dist/task-environment/delivery/commit-message/bugfix-commit-message-template.js +83 -0
  72. package/dist/task-environment/delivery/commit-message/bugfix-commit-message-template.js.map +1 -0
  73. package/dist/task-environment/delivery/commit-message/commit-message-builder.d.ts +6 -0
  74. package/dist/task-environment/delivery/commit-message/commit-message-builder.js +15 -0
  75. package/dist/task-environment/delivery/commit-message/commit-message-builder.js.map +1 -0
  76. package/dist/task-environment/delivery/commit-message/commit-message-template-types.d.ts +16 -0
  77. package/dist/task-environment/delivery/commit-message/commit-message-template-types.js +2 -0
  78. package/dist/task-environment/delivery/commit-message/commit-message-template-types.js.map +1 -0
  79. package/dist/task-environment/delivery/feishu-analysis-doc-service.d.ts +50 -0
  80. package/dist/task-environment/delivery/feishu-analysis-doc-service.js +454 -0
  81. package/dist/task-environment/delivery/feishu-analysis-doc-service.js.map +1 -0
  82. package/dist/task-environment/delivery/feishu-card-renderer.d.ts +38 -0
  83. package/dist/task-environment/delivery/feishu-card-renderer.js +449 -0
  84. package/dist/task-environment/delivery/feishu-card-renderer.js.map +1 -0
  85. package/dist/task-environment/delivery/feishu-content/feishu-content-renderer.d.ts +34 -0
  86. package/dist/task-environment/delivery/feishu-content/feishu-content-renderer.js +201 -0
  87. package/dist/task-environment/delivery/feishu-content/feishu-content-renderer.js.map +1 -0
  88. package/dist/task-environment/delivery/feishu-content/feishu-copy-config.d.ts +27 -0
  89. package/dist/task-environment/delivery/feishu-content/feishu-copy-config.js +74 -0
  90. package/dist/task-environment/delivery/feishu-content/feishu-copy-config.js.map +1 -0
  91. package/dist/task-environment/delivery/feishu-notifier.d.ts +45 -0
  92. package/dist/task-environment/delivery/feishu-notifier.js +250 -0
  93. package/dist/task-environment/delivery/feishu-notifier.js.map +1 -0
  94. package/dist/task-environment/delivery/feishu-templates/analysis-message-template.d.ts +6 -0
  95. package/dist/task-environment/delivery/feishu-templates/analysis-message-template.js +39 -0
  96. package/dist/task-environment/delivery/feishu-templates/analysis-message-template.js.map +1 -0
  97. package/dist/task-environment/delivery/feishu-templates/bugfix-message-template.d.ts +6 -0
  98. package/dist/task-environment/delivery/feishu-templates/bugfix-message-template.js +40 -0
  99. package/dist/task-environment/delivery/feishu-templates/bugfix-message-template.js.map +1 -0
  100. package/dist/task-environment/delivery/feishu-templates/default-message-template.d.ts +6 -0
  101. package/dist/task-environment/delivery/feishu-templates/default-message-template.js +33 -0
  102. package/dist/task-environment/delivery/feishu-templates/default-message-template.js.map +1 -0
  103. package/dist/task-environment/delivery/feishu-templates/patch-message-template.d.ts +6 -0
  104. package/dist/task-environment/delivery/feishu-templates/patch-message-template.js +40 -0
  105. package/dist/task-environment/delivery/feishu-templates/patch-message-template.js.map +1 -0
  106. package/dist/task-environment/delivery/feishu-templates/template-registry.d.ts +2 -0
  107. package/dist/task-environment/delivery/feishu-templates/template-registry.js +11 -0
  108. package/dist/task-environment/delivery/feishu-templates/template-registry.js.map +1 -0
  109. package/dist/task-environment/delivery/feishu-templates/template-types.d.ts +20 -0
  110. package/dist/task-environment/delivery/feishu-templates/template-types.js +2 -0
  111. package/dist/task-environment/delivery/feishu-templates/template-types.js.map +1 -0
  112. package/dist/task-environment/delivery/task-delivery-dispatcher.d.ts +14 -0
  113. package/dist/task-environment/delivery/task-delivery-dispatcher.js +109 -0
  114. package/dist/task-environment/delivery/task-delivery-dispatcher.js.map +1 -0
  115. package/dist/task-environment/delivery/task-delivery-service.d.ts +33 -0
  116. package/dist/task-environment/delivery/task-delivery-service.js +432 -0
  117. package/dist/task-environment/delivery/task-delivery-service.js.map +1 -0
  118. package/dist/task-environment/delivery/task-publication-service.d.ts +97 -0
  119. package/dist/task-environment/delivery/task-publication-service.js +1369 -0
  120. package/dist/task-environment/delivery/task-publication-service.js.map +1 -0
  121. package/dist/task-environment/execution-addresses.d.ts +40 -0
  122. package/dist/task-environment/execution-addresses.js +63 -0
  123. package/dist/task-environment/execution-addresses.js.map +1 -0
  124. package/dist/task-environment/intake/cli-file-intake.d.ts +12 -0
  125. package/dist/task-environment/intake/cli-file-intake.js +56 -0
  126. package/dist/task-environment/intake/cli-file-intake.js.map +1 -0
  127. package/dist/task-environment/intake/manual-problem-intake.d.ts +3 -0
  128. package/dist/task-environment/intake/manual-problem-intake.js +57 -0
  129. package/dist/task-environment/intake/manual-problem-intake.js.map +1 -0
  130. package/dist/task-environment/intake/polling-problem-intake.d.ts +14 -0
  131. package/dist/task-environment/intake/polling-problem-intake.js +232 -0
  132. package/dist/task-environment/intake/polling-problem-intake.js.map +1 -0
  133. package/dist/task-environment/observability/logger.d.ts +76 -0
  134. package/dist/task-environment/observability/logger.js +604 -0
  135. package/dist/task-environment/observability/logger.js.map +1 -0
  136. package/dist/task-environment/observability/runtime-panel.d.ts +82 -0
  137. package/dist/task-environment/observability/runtime-panel.js +1008 -0
  138. package/dist/task-environment/observability/runtime-panel.js.map +1 -0
  139. package/dist/task-environment/observability/sound-notifier.d.ts +18 -0
  140. package/dist/task-environment/observability/sound-notifier.js +71 -0
  141. package/dist/task-environment/observability/sound-notifier.js.map +1 -0
  142. package/dist/task-environment/orchestration/execution-context-assembler.d.ts +41 -0
  143. package/dist/task-environment/orchestration/execution-context-assembler.js +464 -0
  144. package/dist/task-environment/orchestration/execution-context-assembler.js.map +1 -0
  145. package/dist/task-environment/orchestration/git-change-classifier.d.ts +19 -0
  146. package/dist/task-environment/orchestration/git-change-classifier.js +106 -0
  147. package/dist/task-environment/orchestration/git-change-classifier.js.map +1 -0
  148. package/dist/task-environment/orchestration/harness-registry.d.ts +27 -0
  149. package/dist/task-environment/orchestration/harness-registry.js +116 -0
  150. package/dist/task-environment/orchestration/harness-registry.js.map +1 -0
  151. package/dist/task-environment/orchestration/harness-resolver.d.ts +8 -0
  152. package/dist/task-environment/orchestration/harness-resolver.js +39 -0
  153. package/dist/task-environment/orchestration/harness-resolver.js.map +1 -0
  154. package/dist/task-environment/orchestration/task-orchestrator.d.ts +45 -0
  155. package/dist/task-environment/orchestration/task-orchestrator.js +1122 -0
  156. package/dist/task-environment/orchestration/task-orchestrator.js.map +1 -0
  157. package/dist/task-environment/orchestration/task-package-assembler.d.ts +4 -0
  158. package/dist/task-environment/orchestration/task-package-assembler.js +10 -0
  159. package/dist/task-environment/orchestration/task-package-assembler.js.map +1 -0
  160. package/dist/task-environment/orchestration/triage-agent.d.ts +54 -0
  161. package/dist/task-environment/orchestration/triage-agent.js +636 -0
  162. package/dist/task-environment/orchestration/triage-agent.js.map +1 -0
  163. package/dist/task-environment/orchestration/triage-runner.d.ts +65 -0
  164. package/dist/task-environment/orchestration/triage-runner.js +655 -0
  165. package/dist/task-environment/orchestration/triage-runner.js.map +1 -0
  166. package/dist/task-environment/publication-target.d.ts +12 -0
  167. package/dist/task-environment/publication-target.js +174 -0
  168. package/dist/task-environment/publication-target.js.map +1 -0
  169. package/dist/task-environment/runtime/blocking-event-queue.d.ts +7 -0
  170. package/dist/task-environment/runtime/blocking-event-queue.js +27 -0
  171. package/dist/task-environment/runtime/blocking-event-queue.js.map +1 -0
  172. package/dist/task-environment/runtime/optimus-runtime.d.ts +69 -0
  173. package/dist/task-environment/runtime/optimus-runtime.js +751 -0
  174. package/dist/task-environment/runtime/optimus-runtime.js.map +1 -0
  175. package/dist/task-environment/storage/sqlite-event-store.d.ts +52 -0
  176. package/dist/task-environment/storage/sqlite-event-store.js +288 -0
  177. package/dist/task-environment/storage/sqlite-event-store.js.map +1 -0
  178. package/dist/task-environment/storage/sqlite-task-store.d.ts +122 -0
  179. package/dist/task-environment/storage/sqlite-task-store.js +1182 -0
  180. package/dist/task-environment/storage/sqlite-task-store.js.map +1 -0
  181. package/dist/types.d.ts +629 -0
  182. package/dist/types.js +2 -0
  183. package/dist/types.js.map +1 -0
  184. package/embedded-skills/shared/repo-inspection/SKILL.md +9 -0
  185. package/embedded-skills/shared/repo-inspection/skill.json +5 -0
  186. package/embedded-skills/task/bugfix/android-debug-protocol/SKILL.md +10 -0
  187. package/embedded-skills/task/bugfix/android-debug-protocol/skill.json +6 -0
  188. package/harness/AGENTS.md +30 -0
  189. package/harness/CHECKLIST.md +44 -0
  190. package/harness/CONSTRAINTS.md +60 -0
  191. package/harness/FRAMEWORK.md +28 -0
  192. package/harness/GOAL.md +28 -0
  193. package/harness/HANDOFF.md +45 -0
  194. package/harness/TASK_PLAN.md +79 -0
  195. package/optimus.config.template.json +34 -0
  196. package/package.json +109 -0
  197. package/task-harnesses/bugfix/ACCEPT.md +47 -0
  198. package/task-harnesses/bugfix/CONSTRAINTS.md +46 -0
  199. package/task-harnesses/bugfix/CONTEXT.md +29 -0
  200. package/task-harnesses/bugfix/EVOLUTION.md +82 -0
  201. package/task-harnesses/bugfix/ROLE.md +29 -0
  202. package/task-harnesses/bugfix/STANDARD.md +250 -0
  203. package/task-harnesses/bugfix/manifest.json +13 -0
  204. package/task-harnesses/registry.json +8 -0
@@ -0,0 +1,201 @@
1
+ import { DECISION_LABELS, NEXT_ACTION_LABELS, OUTCOME_LABELS, PUBLICATION_ACTION_LABELS, PUBLICATION_ATTEMPT_STATUS_LABELS, PUBLICATION_REASON_LABELS, PUBLICATION_SUMMARY_REPLACEMENTS, REVIEW_LINK_COUNT_LABEL, REVIEW_LINK_LABEL, REVIEW_SYSTEM_LABELS, TASK_TYPE_LABELS, VALIDATION_REPLACEMENTS, VERIFIED_FIX_OUTCOME_LABELS } from "./feishu-copy-config.js";
2
+ export class FeishuContentRenderer {
3
+ renderTitleLine(bundle) {
4
+ return `[${this.translateTaskType(bundle.taskType)}] ${this.renderCardTitle(bundle)}`;
5
+ }
6
+ renderCardTitle(bundle) {
7
+ return this.truncateTitle(this.sanitizeTitle(bundle.summary.title, bundle.summary.sourceRef));
8
+ }
9
+ renderTaskType(taskType) {
10
+ return this.translateTaskType(taskType);
11
+ }
12
+ renderIssueLine(bundle) {
13
+ const sourceRef = bundle.summary.sourceRef?.trim();
14
+ if (!sourceRef) {
15
+ return undefined;
16
+ }
17
+ return `问题:${sourceRef}`;
18
+ }
19
+ renderQAssigneeLine(bundle) {
20
+ const qAssignee = bundle.summary.qAssignee;
21
+ if (!qAssignee) {
22
+ return undefined;
23
+ }
24
+ const value = qAssignee.displayName ?? qAssignee.login ?? qAssignee.email;
25
+ return value ? `负责人:${value}` : undefined;
26
+ }
27
+ renderRepositoryLines(bundle) {
28
+ const publicationGit = bundle.publication?.git;
29
+ const repoLabel = bundle.summary.repo ? this.compact(bundle.summary.repo) : undefined;
30
+ if (!publicationGit) {
31
+ return repoLabel ? [`仓库:${repoLabel}`] : [];
32
+ }
33
+ if (publicationGit.workspaceKind === "repo_managed") {
34
+ const repoManagedBranch = this.resolveDisplayBranch(publicationGit);
35
+ return repoLabel && repoManagedBranch
36
+ ? [`仓库:${repoLabel} @ ${repoManagedBranch}`]
37
+ : repoLabel
38
+ ? [`仓库:${repoLabel}`]
39
+ : repoManagedBranch
40
+ ? [`仓库:@ ${repoManagedBranch}`]
41
+ : [];
42
+ }
43
+ const repoProjects = publicationGit.repoProjects ?? [];
44
+ if (repoProjects.length > 1) {
45
+ return repoProjects.map((project, index) => {
46
+ const branch = this.resolveProjectDisplayBranch(project) ?? "unknown";
47
+ const projectLabel = project.projectName ?? project.projectPath;
48
+ return index === 0 && repoLabel
49
+ ? `仓库:${repoLabel} / ${projectLabel} @ ${branch}`
50
+ : `仓库:${projectLabel} @ ${branch}`;
51
+ });
52
+ }
53
+ const singleBranch = this.resolveDisplayBranch(publicationGit);
54
+ if (repoLabel && singleBranch) {
55
+ return [`仓库:${repoLabel} @ ${singleBranch}`];
56
+ }
57
+ if (repoLabel) {
58
+ return [`仓库:${repoLabel}`];
59
+ }
60
+ if (singleBranch) {
61
+ return [`仓库:@ ${singleBranch}`];
62
+ }
63
+ return [];
64
+ }
65
+ renderOutcome(bundle, publicationAttempts) {
66
+ if (bundle.outcome === "verified_fix") {
67
+ return publicationAttempts.some((attempt) => attempt.mode === "review_submit" && attempt.status === "submitted")
68
+ ? VERIFIED_FIX_OUTCOME_LABELS.submitted
69
+ : VERIFIED_FIX_OUTCOME_LABELS.completed;
70
+ }
71
+ const outcomeLabel = OUTCOME_LABELS[bundle.outcome];
72
+ return outcomeLabel ?? OUTCOME_LABELS.failed;
73
+ }
74
+ renderPublication(bundle, options = {}) {
75
+ const publication = bundle.publication;
76
+ if (!publication) {
77
+ return "无";
78
+ }
79
+ const includeBranch = options.includeBranch ?? true;
80
+ const reviewSystem = publication.git?.reviewSystem;
81
+ const branch = this.resolveDisplayBranch(publication.git);
82
+ const parts = [this.translatePublicationAction(publication.action)];
83
+ if (reviewSystem) {
84
+ parts.push(this.translateReviewSystem(reviewSystem.type, reviewSystem.strategy));
85
+ }
86
+ if (includeBranch && branch) {
87
+ parts.push(branch);
88
+ }
89
+ if (publication.reason) {
90
+ parts.push(this.translatePublicationReason(publication.reason));
91
+ }
92
+ return parts.join(" · ");
93
+ }
94
+ renderPublicationReview(publicationAttempts) {
95
+ const latestAttempt = [...publicationAttempts].reverse().find((attempt) => attempt.mode === "review_submit");
96
+ if (!latestAttempt) {
97
+ return undefined;
98
+ }
99
+ const reviewUrls = latestAttempt.reviewUrls ?? [];
100
+ const parts = [
101
+ this.translatePublicationAttemptStatus(latestAttempt.status),
102
+ this.translatePublicationSummary(latestAttempt.summary)
103
+ ];
104
+ const primaryReviewUrl = latestAttempt.reviewUrl?.trim() || reviewUrls[0];
105
+ if (primaryReviewUrl) {
106
+ parts.push(`${REVIEW_LINK_LABEL}:${primaryReviewUrl}`);
107
+ }
108
+ else if (reviewUrls.length > 0) {
109
+ parts.push(`${REVIEW_LINK_COUNT_LABEL}:${reviewUrls.length} 个`);
110
+ }
111
+ return parts.join(" · ");
112
+ }
113
+ translateDecision(decision) {
114
+ const normalized = this.compact(decision);
115
+ return DECISION_LABELS[normalized] ?? normalized;
116
+ }
117
+ translateValidation(validation) {
118
+ const normalized = this.compact(validation);
119
+ return this.applyReplacements(normalized, VALIDATION_REPLACEMENTS);
120
+ }
121
+ translateNextAction(nextAction) {
122
+ const normalized = this.compact(nextAction);
123
+ return NEXT_ACTION_LABELS[normalized] ?? normalized;
124
+ }
125
+ renderAnalysisSummary(summary) {
126
+ return this.compact(summary);
127
+ }
128
+ renderKeyEvidence(evidence) {
129
+ return this.compact(evidence);
130
+ }
131
+ renderRecommendedAction(action) {
132
+ return this.compact(action);
133
+ }
134
+ resolveDisplayBranch(git) {
135
+ if (!git) {
136
+ return undefined;
137
+ }
138
+ const value = git.targetBranch ?? git.upstreamBranch ?? git.branch ?? git.manifestRevision;
139
+ return this.normalizeBranchName(value);
140
+ }
141
+ resolveProjectDisplayBranch(project) {
142
+ return this.normalizeBranchName(project.targetBranch ?? project.upstreamBranch ?? project.manifestRevision);
143
+ }
144
+ normalizeBranchName(value) {
145
+ if (!value) {
146
+ return undefined;
147
+ }
148
+ return value.replace(/^refs\/heads\//, "").trim() || undefined;
149
+ }
150
+ translateTaskType(taskType) {
151
+ return TASK_TYPE_LABELS[taskType] ?? taskType;
152
+ }
153
+ translatePublicationAction(action) {
154
+ return PUBLICATION_ACTION_LABELS[action] ?? action;
155
+ }
156
+ translateReviewSystem(type, strategy) {
157
+ const key = `${type}:${strategy}`;
158
+ if (REVIEW_SYSTEM_LABELS[key]) {
159
+ return REVIEW_SYSTEM_LABELS[key];
160
+ }
161
+ if (strategy === "manual" && REVIEW_SYSTEM_LABELS["unknown:manual"]) {
162
+ return REVIEW_SYSTEM_LABELS["unknown:manual"];
163
+ }
164
+ return `${type}/${strategy}`;
165
+ }
166
+ translatePublicationReason(reason) {
167
+ return PUBLICATION_REASON_LABELS[reason] ?? reason;
168
+ }
169
+ translatePublicationAttemptStatus(status) {
170
+ return PUBLICATION_ATTEMPT_STATUS_LABELS[status] ?? status;
171
+ }
172
+ translatePublicationSummary(summary) {
173
+ return this.applyReplacements(this.compact(summary), PUBLICATION_SUMMARY_REPLACEMENTS);
174
+ }
175
+ applyReplacements(value, replacements) {
176
+ return replacements.reduce((current, replacement) => current.replace(replacement.pattern, replacement.value), value);
177
+ }
178
+ sanitizeTitle(title, sourceRef) {
179
+ const compacted = this.compact(title);
180
+ if (!sourceRef) {
181
+ return compacted;
182
+ }
183
+ const jiraPrefix = `Jira ${sourceRef} `;
184
+ if (compacted.toLowerCase().startsWith(jiraPrefix.toLowerCase())) {
185
+ return compacted.slice(jiraPrefix.length).trim();
186
+ }
187
+ const directPrefix = `${sourceRef} `;
188
+ if (compacted.toLowerCase().startsWith(directPrefix.toLowerCase())) {
189
+ return compacted.slice(directPrefix.length).trim();
190
+ }
191
+ return compacted;
192
+ }
193
+ truncateTitle(title) {
194
+ const compacted = this.compact(title);
195
+ return compacted.length > 48 ? `${compacted.slice(0, 45)}...` : compacted;
196
+ }
197
+ compact(value) {
198
+ return value.replace(/\s+/g, " ").trim();
199
+ }
200
+ }
201
+ //# sourceMappingURL=feishu-content-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feishu-content-renderer.js","sourceRoot":"","sources":["../../../../src/task-environment/delivery/feishu-content/feishu-content-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export declare const TASK_TYPE_LABELS: Record<string, string>;
2
+ export declare const OUTCOME_LABELS: {
3
+ readonly repair_candidate: "补丁已生成";
4
+ readonly analysis_only: "分析已完成";
5
+ readonly canceled: "已取消";
6
+ readonly failed: "执行失败";
7
+ };
8
+ export declare const VERIFIED_FIX_OUTCOME_LABELS: {
9
+ readonly submitted: "修复已提交";
10
+ readonly completed: "修复已完成";
11
+ };
12
+ export declare const REVIEW_SYSTEM_LABELS: Record<string, string>;
13
+ export declare const REVIEW_LINK_LABEL = "\u94FE\u63A5";
14
+ export declare const REVIEW_LINK_COUNT_LABEL = "\u8BC4\u5BA1\u94FE\u63A5";
15
+ export declare const PUBLICATION_ACTION_LABELS: Record<string, string>;
16
+ export declare const PUBLICATION_REASON_LABELS: Record<string, string>;
17
+ export declare const PUBLICATION_ATTEMPT_STATUS_LABELS: Record<string, string>;
18
+ export declare const DECISION_LABELS: Record<string, string>;
19
+ export declare const NEXT_ACTION_LABELS: Record<string, string>;
20
+ export declare const VALIDATION_REPLACEMENTS: Array<{
21
+ pattern: RegExp;
22
+ value: string;
23
+ }>;
24
+ export declare const PUBLICATION_SUMMARY_REPLACEMENTS: Array<{
25
+ pattern: RegExp;
26
+ value: string;
27
+ }>;
@@ -0,0 +1,74 @@
1
+ export const TASK_TYPE_LABELS = {
2
+ bugfix: "缺陷修复",
3
+ analysis: "问题分析",
4
+ research: "问题分析",
5
+ investigation: "问题分析",
6
+ incident: "故障处置",
7
+ task: "任务处理"
8
+ };
9
+ export const OUTCOME_LABELS = {
10
+ repair_candidate: "补丁已生成",
11
+ analysis_only: "分析已完成",
12
+ canceled: "已取消",
13
+ failed: "执行失败"
14
+ };
15
+ export const VERIFIED_FIX_OUTCOME_LABELS = {
16
+ submitted: "修复已提交",
17
+ completed: "修复已完成"
18
+ };
19
+ export const REVIEW_SYSTEM_LABELS = {
20
+ "github:github_pr": "GitHub PR",
21
+ "gerrit:gerrit_change": "Gerrit 评审",
22
+ "unknown:manual": "人工交付"
23
+ };
24
+ export const REVIEW_LINK_LABEL = "链接";
25
+ export const REVIEW_LINK_COUNT_LABEL = "评审链接";
26
+ export const PUBLICATION_ACTION_LABELS = {
27
+ none: "无需交付",
28
+ ready_for_publish: "可提交评审",
29
+ published: "已完成提交"
30
+ };
31
+ export const PUBLICATION_REASON_LABELS = {
32
+ publication_not_applicable: "当前任务无需代码交付",
33
+ workspace_missing: "缺少可交付仓库上下文",
34
+ patch_missing: "未生成补丁",
35
+ upstream_missing: "未识别到目标分支"
36
+ };
37
+ export const PUBLICATION_ATTEMPT_STATUS_LABELS = {
38
+ submitted: "已提交",
39
+ planned: "已生成计划",
40
+ skipped: "已跳过",
41
+ failed: "提交失败"
42
+ };
43
+ export const DECISION_LABELS = {
44
+ "Analysis delivered.": "问题分析已输出。",
45
+ "Patch generated as repair candidate.": "已生成候选补丁。",
46
+ "Verified fix delivered.": "修复已完成,可进入评审。",
47
+ "Task canceled before delivery completion.": "任务已取消,未完成交付。",
48
+ "Task failed before trustworthy delivery.": "任务执行失败,未形成可信交付。"
49
+ };
50
+ export const NEXT_ACTION_LABELS = {
51
+ "Review analysis artifact.": "查看分析结论",
52
+ "Review patch and publication readiness.": "审阅 PR 并确认提交流程",
53
+ "Review cancellation reason and retained artifacts if any.": "查看取消原因与保留产物",
54
+ "Inspect failure and retry conditions.": "检查失败原因后重试"
55
+ };
56
+ export const VALIDATION_REPLACEMENTS = [
57
+ { pattern: /^device_verified$/i, value: "真机验证通过" },
58
+ { pattern: /^simulator_verified$/i, value: "模拟器验证通过" },
59
+ { pattern: /^scenario_verified$/i, value: "场景验证通过" },
60
+ { pattern: /^unit_tests_passed$/i, value: "单测通过" },
61
+ { pattern: /^targeted_tests_passed$/i, value: "定向测试通过" },
62
+ { pattern: /^regression_tests_passed$/i, value: "回归测试通过" },
63
+ { pattern: /^compile_passed$/i, value: "编译通过" },
64
+ { pattern: /^module_build_passed$/i, value: "模块编译通过" },
65
+ { pattern: /^code_reviewed$/i, value: "代码检查完成" },
66
+ { pattern: /^validation_completed$/i, value: "已完成验证" }
67
+ ];
68
+ export const PUBLICATION_SUMMARY_REPLACEMENTS = [
69
+ { pattern: /Review submission completed for (\d+)\/(\d+) target\(s\) via github_pr\./i, value: "已完成 $1/$2 个目标的 GitHub PR 提交。" },
70
+ { pattern: /Review submission completed for (\d+)\/(\d+) target\(s\) via gerrit_change\./i, value: "已完成 $1/$2 个目标的 Gerrit 评审提交。" },
71
+ { pattern: /Publication dry-run plan generated for (.+)\./i, value: "已生成交付预览:$1。" },
72
+ { pattern: /Publication skipped because no patch artifact was produced\./i, value: "未生成补丁,已跳过代码交付。" }
73
+ ];
74
+ //# sourceMappingURL=feishu-copy-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feishu-copy-config.js","sourceRoot":"","sources":["../../../../src/task-environment/delivery/feishu-content/feishu-copy-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { TaskDeliveryAttempt, TaskDeliveryBundle, TaskPublicationAttempt } from "../../types.js";
2
+ import type { OptimusConfig } from "../../types.js";
3
+ export interface FeishuNotifierOptions {
4
+ env?: NodeJS.ProcessEnv;
5
+ config?: Pick<OptimusConfig, "delivery">;
6
+ fetchImpl?: typeof globalThis.fetch;
7
+ publicationAttempts?: TaskPublicationAttempt[];
8
+ retryPolicy?: {
9
+ enabled: boolean;
10
+ maxAttempts: number;
11
+ backoffMs: number;
12
+ };
13
+ format?: "text" | "card";
14
+ sleepImpl?: (ms: number) => Promise<void>;
15
+ }
16
+ export declare class FeishuNotifier {
17
+ private readonly env;
18
+ private readonly config;
19
+ private readonly fetchImpl;
20
+ private readonly publicationAttempts;
21
+ private readonly retryPolicy;
22
+ private readonly sleepImpl;
23
+ private readonly format;
24
+ private readonly templates;
25
+ private readonly contentRenderer;
26
+ constructor(options?: FeishuNotifierOptions);
27
+ previewMessage(bundle: TaskDeliveryBundle): string;
28
+ dispatch(bundle: TaskDeliveryBundle): Promise<TaskDeliveryAttempt[]>;
29
+ private dispatchTarget;
30
+ private shouldRetry;
31
+ private shouldRetryHttpStatus;
32
+ private shouldRetryNetworkError;
33
+ private retryDelayForAttempt;
34
+ private buildAttempt;
35
+ private resolveTargets;
36
+ private splitTargets;
37
+ private readSecret;
38
+ private buildPayload;
39
+ private renderContent;
40
+ private renderMessage;
41
+ private createTemplateContext;
42
+ private truncateTitle;
43
+ private compact;
44
+ private normalizeError;
45
+ }
@@ -0,0 +1,250 @@
1
+ import { createHmac } from "node:crypto";
2
+ import { FeishuContentRenderer } from "./feishu-content/feishu-content-renderer.js";
3
+ import { FeishuCardRenderer } from "./feishu-card-renderer.js";
4
+ import { createDefaultFeishuTemplates } from "./feishu-templates/template-registry.js";
5
+ export class FeishuNotifier {
6
+ env;
7
+ config;
8
+ fetchImpl;
9
+ publicationAttempts;
10
+ retryPolicy;
11
+ sleepImpl;
12
+ format;
13
+ templates = createDefaultFeishuTemplates();
14
+ contentRenderer = new FeishuContentRenderer();
15
+ constructor(options = {}) {
16
+ this.env = options.env ?? process.env;
17
+ this.config = options.config;
18
+ this.fetchImpl = options.fetchImpl ?? globalThis.fetch?.bind(globalThis);
19
+ this.publicationAttempts = options.publicationAttempts ?? [];
20
+ this.retryPolicy = {
21
+ enabled: options.retryPolicy?.enabled ?? false,
22
+ maxAttempts: Math.max(1, options.retryPolicy?.maxAttempts ?? 1),
23
+ backoffMs: Math.max(0, options.retryPolicy?.backoffMs ?? 0)
24
+ };
25
+ this.sleepImpl = options.sleepImpl ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
26
+ this.format = options.format ?? "text";
27
+ }
28
+ previewMessage(bundle) {
29
+ if (this.format === "card") {
30
+ return JSON.stringify(this.renderContent(bundle).card, null, 2);
31
+ }
32
+ return this.renderMessage(bundle);
33
+ }
34
+ async dispatch(bundle) {
35
+ const createdAt = new Date().toISOString();
36
+ const targets = this.resolveTargets();
37
+ if (targets.length === 0) {
38
+ return [this.buildAttempt(bundle, {
39
+ channel: "feishu",
40
+ status: "skipped",
41
+ summary: "Feishu webhook not configured. Set delivery.feishu.webhook/webhooks in config or OPTIMUS_FEISHU_WEBHOOK / OPTIMUS_FEISHU_WEBHOOKS.",
42
+ createdAt
43
+ })];
44
+ }
45
+ if (!this.fetchImpl) {
46
+ return [this.buildAttempt(bundle, {
47
+ channel: "feishu",
48
+ status: "failed",
49
+ summary: "Feishu delivery unavailable because fetch is not present.",
50
+ createdAt,
51
+ error: "fetch_missing"
52
+ })];
53
+ }
54
+ const content = this.renderContent(bundle);
55
+ const secret = this.readSecret();
56
+ const attempts = [];
57
+ for (const target of targets) {
58
+ attempts.push(await this.dispatchTarget(bundle, target, content, secret));
59
+ }
60
+ return attempts;
61
+ }
62
+ async dispatchTarget(bundle, target, content, secret) {
63
+ const attemptCreatedAt = new Date().toISOString();
64
+ const maxAttempts = this.retryPolicy.enabled ? this.retryPolicy.maxAttempts : 1;
65
+ let lastError;
66
+ for (let attemptIndex = 0; attemptIndex < maxAttempts; attemptIndex += 1) {
67
+ try {
68
+ const payload = this.buildPayload(content, secret);
69
+ const response = await this.fetchImpl(target.url, {
70
+ method: "POST",
71
+ headers: {
72
+ "content-type": "application/json"
73
+ },
74
+ body: JSON.stringify(payload)
75
+ });
76
+ const responseText = await response.text();
77
+ if (response.ok) {
78
+ const summary = attemptIndex === 0
79
+ ? `Feishu group notification delivered to ${target.label}.`
80
+ : `Feishu group notification delivered to ${target.label} after ${attemptIndex + 1} attempt(s).`;
81
+ return this.buildAttempt(bundle, {
82
+ channel: "feishu",
83
+ status: "dispatched",
84
+ summary,
85
+ createdAt: attemptCreatedAt,
86
+ deliveredAt: new Date().toISOString()
87
+ });
88
+ }
89
+ lastError = this.normalizeError(`HTTP ${response.status}${responseText ? ` ${this.compact(responseText)}` : ""}`);
90
+ if (!this.shouldRetry(attemptIndex, maxAttempts) || !this.shouldRetryHttpStatus(response.status)) {
91
+ break;
92
+ }
93
+ }
94
+ catch (error) {
95
+ lastError = this.normalizeError(error instanceof Error ? error.message : String(error));
96
+ if (!this.shouldRetry(attemptIndex, maxAttempts) || !this.shouldRetryNetworkError(lastError)) {
97
+ break;
98
+ }
99
+ }
100
+ await this.sleepImpl(this.retryDelayForAttempt(attemptIndex));
101
+ }
102
+ const retrySuffix = maxAttempts > 1 ? ` after ${maxAttempts} attempt(s)` : "";
103
+ return this.buildAttempt(bundle, {
104
+ channel: "feishu",
105
+ status: "failed",
106
+ summary: `Feishu group notification failed for ${target.label}${retrySuffix}.`,
107
+ createdAt: attemptCreatedAt,
108
+ ...(lastError ? { error: lastError } : {})
109
+ });
110
+ }
111
+ shouldRetry(attemptIndex, maxAttempts) {
112
+ return attemptIndex + 1 < maxAttempts;
113
+ }
114
+ shouldRetryHttpStatus(status) {
115
+ return status === 429 || status >= 500;
116
+ }
117
+ shouldRetryNetworkError(message) {
118
+ if (!message) {
119
+ return false;
120
+ }
121
+ const normalized = message.toLowerCase();
122
+ return [
123
+ "fetch failed",
124
+ "network",
125
+ "econnreset",
126
+ "econnrefused",
127
+ "enotfound",
128
+ "etimedout",
129
+ "timed out",
130
+ "timeout",
131
+ "socket hang up",
132
+ "temporary failure"
133
+ ].some((token) => normalized.includes(token));
134
+ }
135
+ retryDelayForAttempt(attemptIndex) {
136
+ if (!this.retryPolicy.enabled || this.retryPolicy.backoffMs <= 0) {
137
+ return 0;
138
+ }
139
+ return this.retryPolicy.backoffMs * (attemptIndex + 1);
140
+ }
141
+ buildAttempt(bundle, attempt) {
142
+ return {
143
+ taskId: bundle.taskId,
144
+ ...(bundle.runId ? { runId: bundle.runId } : {}),
145
+ ...attempt
146
+ };
147
+ }
148
+ resolveTargets() {
149
+ const seen = new Set();
150
+ const rawEntries = [
151
+ ...this.splitTargets(this.config?.delivery.feishu.webhook),
152
+ ...(this.config?.delivery.feishu.webhooks ?? []),
153
+ ...this.splitTargets(this.env.OPTIMUS_FEISHU_WEBHOOK),
154
+ ...this.splitTargets(this.env.OPTIMUS_FEISHU_WEBHOOKS)
155
+ ];
156
+ const targets = [];
157
+ for (const entry of rawEntries) {
158
+ const url = entry.trim();
159
+ if (!url || seen.has(url)) {
160
+ continue;
161
+ }
162
+ seen.add(url);
163
+ targets.push({
164
+ label: `webhook#${targets.length + 1}`,
165
+ url
166
+ });
167
+ }
168
+ return targets;
169
+ }
170
+ splitTargets(rawValue) {
171
+ if (!rawValue) {
172
+ return [];
173
+ }
174
+ return rawValue
175
+ .split(/[\n,]/)
176
+ .map((entry) => entry.trim())
177
+ .filter((entry) => entry.length > 0);
178
+ }
179
+ readSecret() {
180
+ const configured = this.config?.delivery.feishu.secret?.trim();
181
+ if (configured) {
182
+ return configured;
183
+ }
184
+ const value = this.env.OPTIMUS_FEISHU_SECRET?.trim();
185
+ return value ? value : undefined;
186
+ }
187
+ buildPayload(content, secret) {
188
+ const payload = content.card
189
+ ? { msg_type: "interactive", card: content.card }
190
+ : { msg_type: "text", content: { text: content.text ?? "" } };
191
+ if (!secret) {
192
+ return payload;
193
+ }
194
+ const timestamp = Math.floor(Date.now() / 1000).toString();
195
+ const sign = createHmac("sha256", secret)
196
+ .update(`${timestamp}\n${secret}`)
197
+ .digest("base64");
198
+ return {
199
+ timestamp,
200
+ sign,
201
+ ...payload
202
+ };
203
+ }
204
+ renderContent(bundle) {
205
+ if (this.format === "card") {
206
+ return {
207
+ card: new FeishuCardRenderer(this.publicationAttempts).render(bundle)
208
+ };
209
+ }
210
+ return {
211
+ text: this.renderMessage(bundle)
212
+ };
213
+ }
214
+ renderMessage(bundle) {
215
+ const template = this.templates.find((candidate) => candidate.supports(bundle));
216
+ if (!template) {
217
+ throw new Error(`No Feishu message template available for task type ${bundle.taskType}.`);
218
+ }
219
+ return template.render(this.createTemplateContext(), bundle);
220
+ }
221
+ createTemplateContext() {
222
+ return {
223
+ renderTitleLine: (bundle) => this.contentRenderer.renderTitleLine(bundle),
224
+ renderIssueLine: (bundle) => this.contentRenderer.renderIssueLine(bundle),
225
+ renderQAssigneeLine: (bundle) => this.contentRenderer.renderQAssigneeLine(bundle),
226
+ renderRepositoryLines: (bundle) => this.contentRenderer.renderRepositoryLines(bundle),
227
+ renderOutcome: (bundle) => this.contentRenderer.renderOutcome(bundle, this.publicationAttempts),
228
+ renderPublication: (bundle) => this.contentRenderer.renderPublication(bundle),
229
+ renderPublicationReview: () => this.contentRenderer.renderPublicationReview(this.publicationAttempts),
230
+ renderDecision: (decision) => this.contentRenderer.translateDecision(decision),
231
+ renderValidation: (validation) => this.contentRenderer.translateValidation(validation),
232
+ renderNextAction: (nextAction) => this.contentRenderer.translateNextAction(nextAction),
233
+ renderAnalysisSummary: (summary) => this.contentRenderer.renderAnalysisSummary(summary),
234
+ renderKeyEvidence: (evidence) => this.contentRenderer.renderKeyEvidence(evidence),
235
+ renderRecommendedAction: (action) => this.contentRenderer.renderRecommendedAction(action)
236
+ };
237
+ }
238
+ truncateTitle(title) {
239
+ const compacted = this.compact(title);
240
+ return compacted.length > 48 ? `${compacted.slice(0, 45)}...` : compacted;
241
+ }
242
+ compact(value) {
243
+ return value.replace(/\s+/g, " ").trim();
244
+ }
245
+ normalizeError(value) {
246
+ const compacted = this.compact(value);
247
+ return compacted.length > 300 ? `${compacted.slice(0, 297)}...` : compacted;
248
+ }
249
+ }
250
+ //# sourceMappingURL=feishu-notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feishu-notifier.js","sourceRoot":"","sources":["../../../src/task-environment/delivery/feishu-notifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { TaskDeliveryBundle } from "../../../types.js";
2
+ import type { FeishuMessageTemplate, FeishuTemplateContext } from "./template-types.js";
3
+ export declare class AnalysisFeishuMessageTemplate implements FeishuMessageTemplate {
4
+ supports(bundle: TaskDeliveryBundle): boolean;
5
+ render(context: FeishuTemplateContext, bundle: TaskDeliveryBundle): string;
6
+ }