@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,351 @@
1
+ // Jira submit orchestration keeps the connector logic outside runtime.
2
+ // It normalizes Jira issues into the existing submit CLI contract: title + description + sourceRef.
3
+ import { execFile } from "node:child_process";
4
+ import { promisify } from "node:util";
5
+ const execFileAsync = promisify(execFile);
6
+ const DEFAULT_SEARCH_FIELDS = ["summary", "status", "priority", "assignee", "issuetype", "labels", "updated"];
7
+ const DEFAULT_DETAIL_FIELDS = ["summary", "description", "status", "priority", "assignee", "issuetype", "labels", "updated", "reporter", "environment", "comment"];
8
+ export function buildAssignedOpenJql(assignee) {
9
+ const assigneeClause = assignee && assignee.trim().length > 0
10
+ ? `assignee = ${assignee.trim()}`
11
+ : "assignee = currentUser()";
12
+ return `${assigneeClause} AND status in (OPEN, Reopened, \"In Progress\")`;
13
+ }
14
+ export function buildJiraSubmitTitle(issue) {
15
+ const summary = issue.summary?.trim() || issue.issueKey;
16
+ return `Jira ${issue.issueKey} ${summary}`.trim();
17
+ }
18
+ export function buildJiraSubmitDescription(issue) {
19
+ const lines = [
20
+ "Issue synced from Jira.",
21
+ `Issue Key: ${issue.issueKey}`,
22
+ issue.status ? `Status: ${issue.status}` : undefined,
23
+ issue.priority ? `Priority: ${issue.priority}` : undefined,
24
+ issue.assignee ? `Assignee: ${issue.assignee}` : undefined,
25
+ issue.reporter ? `Reporter: ${issue.reporter}` : undefined,
26
+ issue.updated ? `Updated: ${issue.updated}` : undefined,
27
+ issue.labels.length > 0 ? `Labels: ${issue.labels.join(", ")}` : undefined,
28
+ issue.environment ? `Environment: ${issue.environment}` : undefined,
29
+ issue.description ? "" : undefined,
30
+ issue.description ? "Issue Description:" : undefined,
31
+ issue.description,
32
+ issue.comments.length > 0 ? "" : undefined,
33
+ issue.comments.length > 0 ? "Recent Comments:" : undefined,
34
+ ...issue.comments.map((comment, index) => formatCommentLine(comment, index + 1))
35
+ ].filter((line) => typeof line === "string" && line.trim().length > 0);
36
+ return lines.join("\n").trim();
37
+ }
38
+ export function buildJiraSubmitArgs(issue, options, assigneeIdentity) {
39
+ const args = [
40
+ "submit",
41
+ "--title",
42
+ buildJiraSubmitTitle(issue),
43
+ "--description",
44
+ buildJiraSubmitDescription(issue),
45
+ "--sourceRef",
46
+ issue.issueKey,
47
+ "--task-type",
48
+ options.taskType ?? "bugfix"
49
+ ];
50
+ if (options.repo?.trim()) {
51
+ args.push("--repo", options.repo.trim());
52
+ }
53
+ if (options.branch?.trim()) {
54
+ args.push("--branch", options.branch.trim());
55
+ }
56
+ if (options.allowDuplicate === true) {
57
+ args.push("--allow-duplicate");
58
+ }
59
+ if (assigneeIdentity?.displayName) {
60
+ args.push("--q-assignee-display-name", assigneeIdentity.displayName);
61
+ }
62
+ if (assigneeIdentity?.login) {
63
+ args.push("--q-assignee-login", assigneeIdentity.login);
64
+ }
65
+ if (assigneeIdentity?.email) {
66
+ args.push("--q-assignee-email", assigneeIdentity.email);
67
+ }
68
+ if (assigneeIdentity?.openId) {
69
+ args.push("--q-assignee-open-id", assigneeIdentity.openId);
70
+ }
71
+ if (assigneeIdentity?.resolvedBy) {
72
+ args.push("--q-assignee-resolved-by", assigneeIdentity.resolvedBy);
73
+ }
74
+ return args;
75
+ }
76
+ export async function submitAssignedOpenIssues(dependencies, options = {}) {
77
+ const jql = buildAssignedOpenJql(options.assignee);
78
+ const searchInput = {
79
+ jql,
80
+ limit: options.limit ?? 50,
81
+ fields: DEFAULT_SEARCH_FIELDS
82
+ };
83
+ if (options.projectsFilter && options.projectsFilter.length > 0) {
84
+ searchInput.projectsFilter = options.projectsFilter;
85
+ }
86
+ const searchResult = await dependencies.client.searchIssues(searchInput);
87
+ const issues = await loadIssueDetails(dependencies.client, searchResult.items.map((item) => item.issueKey), options.commentLimit);
88
+ return submitResolvedIssues(issues, jql, dependencies, options);
89
+ }
90
+ export async function submitSingleIssue(dependencies, issueKey, options = {}) {
91
+ const issues = await loadIssueDetails(dependencies.client, [issueKey], options.commentLimit);
92
+ return submitResolvedIssues(issues, `issuekey = ${issueKey}`, dependencies, options);
93
+ }
94
+ async function loadIssueDetails(client, issueKeys, commentLimit) {
95
+ const details = [];
96
+ for (const issueKey of issueKeys) {
97
+ const issueInput = {
98
+ issueKey,
99
+ fields: DEFAULT_DETAIL_FIELDS,
100
+ commentLimit: commentLimit ?? 3
101
+ };
102
+ details.push(await client.getIssue(issueInput));
103
+ }
104
+ return details;
105
+ }
106
+ async function submitResolvedIssues(issues, jql, dependencies, options) {
107
+ const items = [];
108
+ let submittedCount = 0;
109
+ for (const issue of issues) {
110
+ const assigneeIdentity = await dependencies.resolveAssigneeIdentity?.(issue);
111
+ const submitArgs = buildJiraSubmitArgs(issue, options, assigneeIdentity);
112
+ const title = submitArgs[2] ?? buildJiraSubmitTitle(issue);
113
+ if (options.dryRun) {
114
+ items.push({
115
+ issueKey: issue.issueKey,
116
+ title,
117
+ ...(issue.status ? { status: issue.status } : {}),
118
+ submitted: false,
119
+ submitOutput: JSON.stringify({ preview: buildPreview(issue, submitArgs) })
120
+ });
121
+ continue;
122
+ }
123
+ const submitOutput = await dependencies.submitIssue(issue, submitArgs);
124
+ submittedCount += 1;
125
+ items.push({
126
+ issueKey: issue.issueKey,
127
+ title,
128
+ ...(issue.status ? { status: issue.status } : {}),
129
+ submitted: true,
130
+ submitOutput
131
+ });
132
+ }
133
+ return {
134
+ jql,
135
+ matchedCount: issues.length,
136
+ submittedCount,
137
+ dryRun: Boolean(options.dryRun),
138
+ items
139
+ };
140
+ }
141
+ export async function resolveJiraAssigneeIdentity(issue, options = {}) {
142
+ const base = normalizeIssueAssignee(issue);
143
+ if (!base) {
144
+ await options.logger?.warn?.("jira.assignee_identity.skipped", {
145
+ issueKey: issue.issueKey
146
+ });
147
+ return undefined;
148
+ }
149
+ const mapping = resolveMappedAssignee(base, options.userMappings);
150
+ if (mapping) {
151
+ await options.logger?.info?.("jira.assignee_identity.resolved", {
152
+ issueKey: issue.issueKey,
153
+ assignee: mapping.login ?? mapping.displayName ?? mapping.email ?? issue.assignee ?? "unknown",
154
+ resolvedBy: mapping.resolvedBy,
155
+ hasOpenId: true
156
+ });
157
+ return mapping;
158
+ }
159
+ const identifier = base.email ?? base.displayName;
160
+ if (!identifier) {
161
+ await options.logger?.warn?.("jira.assignee_identity.degraded", {
162
+ issueKey: issue.issueKey,
163
+ assignee: base.login ?? base.displayName ?? base.email ?? issue.assignee ?? "unknown",
164
+ reason: "missing_lookup_identifier",
165
+ hasOpenId: false
166
+ });
167
+ return base;
168
+ }
169
+ const execImpl = options.execFileImpl ?? (async (file, args) => {
170
+ const result = await execFileAsync(file, args, { encoding: "utf8" });
171
+ return {
172
+ stdout: typeof result.stdout === "string" ? result.stdout : String(result.stdout),
173
+ stderr: typeof result.stderr === "string" ? result.stderr : String(result.stderr)
174
+ };
175
+ });
176
+ try {
177
+ const { stdout } = await execImpl("feishu", ["user", "resolve", identifier]);
178
+ const resolved = parseResolvedOpenId(stdout);
179
+ if (resolved) {
180
+ const resolvedIdentity = {
181
+ ...base,
182
+ openId: resolved,
183
+ resolvedBy: base.email ? "feishu_user_resolve_email" : "feishu_user_resolve_name"
184
+ };
185
+ await options.logger?.info?.("jira.assignee_identity.resolved", {
186
+ issueKey: issue.issueKey,
187
+ assignee: resolvedIdentity.login ?? resolvedIdentity.displayName ?? resolvedIdentity.email ?? issue.assignee ?? "unknown",
188
+ resolvedBy: resolvedIdentity.resolvedBy,
189
+ hasOpenId: true
190
+ });
191
+ return resolvedIdentity;
192
+ }
193
+ await options.logger?.warn?.("jira.assignee_identity.degraded", {
194
+ issueKey: issue.issueKey,
195
+ assignee: base.login ?? base.displayName ?? base.email ?? issue.assignee ?? "unknown",
196
+ identifier,
197
+ reason: "open_id_not_found",
198
+ hasOpenId: false
199
+ });
200
+ return base;
201
+ }
202
+ catch (error) {
203
+ await options.logger?.warn?.("jira.assignee_identity.resolve_failed", {
204
+ issueKey: issue.issueKey,
205
+ assignee: base.login ?? base.displayName ?? base.email ?? issue.assignee ?? "unknown",
206
+ identifier,
207
+ hasOpenId: false,
208
+ error: error instanceof Error ? error.message : String(error)
209
+ });
210
+ return base;
211
+ }
212
+ }
213
+ function normalizeIssueAssignee(issue) {
214
+ const rawAssignee = issue.assignee?.trim();
215
+ const rawEmail = issue.assigneeEmail?.trim();
216
+ const email = normalizeCorporateEmail(rawEmail ?? rawAssignee);
217
+ const login = rawAssignee && /^[a-zA-Z0-9._-]+$/u.test(rawAssignee) && !rawAssignee.includes("@")
218
+ ? rawAssignee
219
+ : (email ? email.slice(0, email.indexOf("@")) : undefined);
220
+ const displayName = rawAssignee && rawAssignee !== login && rawAssignee !== email ? rawAssignee : undefined;
221
+ const normalized = {
222
+ ...(displayName ? { displayName } : {}),
223
+ ...(login ? { login } : {}),
224
+ ...(email ? { email } : {})
225
+ };
226
+ return Object.keys(normalized).length > 0 ? normalized : undefined;
227
+ }
228
+ function normalizeCorporateEmail(value) {
229
+ const normalized = value?.trim();
230
+ if (!normalized) {
231
+ return undefined;
232
+ }
233
+ if (normalized.includes("@")) {
234
+ return normalized.toLowerCase();
235
+ }
236
+ if (/^[a-zA-Z0-9._-]+$/u.test(normalized)) {
237
+ return `${normalized.toLowerCase()}@xiaomi.com`;
238
+ }
239
+ return undefined;
240
+ }
241
+ function resolveMappedAssignee(base, mappings) {
242
+ if (!mappings) {
243
+ return undefined;
244
+ }
245
+ const candidates = [base.email, base.login, base.displayName]
246
+ .filter((value) => Boolean(value))
247
+ .map((value) => value.toLowerCase());
248
+ for (const candidate of candidates) {
249
+ for (const [key, mapping] of Object.entries(mappings)) {
250
+ if (key.toLowerCase() !== candidate || !mapping?.openId) {
251
+ continue;
252
+ }
253
+ return {
254
+ ...base,
255
+ ...(mapping.displayName ? { displayName: mapping.displayName } : {}),
256
+ ...(mapping.email ? { email: mapping.email } : {}),
257
+ openId: mapping.openId,
258
+ resolvedBy: "feishu_mapping"
259
+ };
260
+ }
261
+ }
262
+ return undefined;
263
+ }
264
+ function parseResolvedOpenId(stdout) {
265
+ const trimmed = stdout.trim();
266
+ if (!trimmed) {
267
+ return undefined;
268
+ }
269
+ try {
270
+ const parsed = JSON.parse(trimmed);
271
+ return extractOpenId(parsed);
272
+ }
273
+ catch {
274
+ return undefined;
275
+ }
276
+ }
277
+ function extractOpenId(value) {
278
+ if (!value) {
279
+ return undefined;
280
+ }
281
+ if (typeof value === "string") {
282
+ return /^ou_[a-zA-Z0-9_-]+$/u.test(value) ? value : undefined;
283
+ }
284
+ if (Array.isArray(value)) {
285
+ for (const item of value) {
286
+ const openId = extractOpenId(item);
287
+ if (openId) {
288
+ return openId;
289
+ }
290
+ }
291
+ return undefined;
292
+ }
293
+ if (typeof value !== "object") {
294
+ return undefined;
295
+ }
296
+ const record = value;
297
+ return extractOpenId(record.open_id)
298
+ ?? extractOpenId(record.openId)
299
+ ?? extractOpenId(record.id)
300
+ ?? extractOpenId(record.user)
301
+ ?? extractOpenId(record.data)
302
+ ?? extractOpenId(record.items)
303
+ ?? extractOpenId(record.users)
304
+ ?? extractOpenId(record.results);
305
+ }
306
+ function buildPreview(issue, submitArgs) {
307
+ return {
308
+ issueKey: issue.issueKey,
309
+ title: buildJiraSubmitTitle(issue),
310
+ description: buildJiraSubmitDescription(issue),
311
+ submitArgs,
312
+ ...(issue.status ? { status: issue.status } : {})
313
+ };
314
+ }
315
+ function formatCommentLine(comment, index) {
316
+ const author = comment.author ? `${comment.author}: ` : "";
317
+ const body = comment.body?.trim() || "(empty)";
318
+ return `${index}. ${author}${body}`;
319
+ }
320
+ export function startAssignedOpenPolling(dependencies, options) {
321
+ let stopped = false;
322
+ let timer;
323
+ const logger = options.logger ?? console;
324
+ const done = (async () => {
325
+ while (!stopped) {
326
+ try {
327
+ const result = await submitAssignedOpenIssues(dependencies, options);
328
+ logger.info?.(`[jira-poll-daemon] jql=${result.jql} matched=${result.matchedCount} submitted=${result.submittedCount} dryRun=${String(result.dryRun)}`);
329
+ }
330
+ catch (error) {
331
+ logger.error?.(`[jira-poll-daemon] ${error instanceof Error ? error.message : String(error)}`);
332
+ }
333
+ if (stopped) {
334
+ return;
335
+ }
336
+ await new Promise((resolve) => {
337
+ timer = setTimeout(() => resolve(), options.intervalMs);
338
+ });
339
+ }
340
+ })();
341
+ return {
342
+ stop() {
343
+ stopped = true;
344
+ if (timer) {
345
+ clearTimeout(timer);
346
+ }
347
+ },
348
+ done
349
+ };
350
+ }
351
+ //# sourceMappingURL=jira-submit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-submit.js","sourceRoot":"","sources":["../../../src/integrations/jira/jira-submit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { CodexAuthDiagnostics, OptimusConfig } from "../../types.js";
2
+ export interface ResolvedCodexAuth {
3
+ apiKey?: string;
4
+ baseUrl?: string;
5
+ env: Record<string, string>;
6
+ diagnostics: CodexAuthDiagnostics;
7
+ }
8
+ interface CodexAuthResolverOptions {
9
+ shellEnvFiles?: string[];
10
+ }
11
+ export declare class CodexAuthResolver {
12
+ private readonly config;
13
+ private readonly processEnv;
14
+ private readonly options;
15
+ constructor(config: OptimusConfig, processEnv?: NodeJS.ProcessEnv, options?: CodexAuthResolverOptions);
16
+ resolve(): ResolvedCodexAuth;
17
+ private collectStringEnv;
18
+ private injectShellEnvFallback;
19
+ private getDefaultShellEnvFiles;
20
+ private parseShellAssignment;
21
+ private normalizeShellValue;
22
+ }
23
+ export {};
@@ -0,0 +1,136 @@
1
+ // Codex auth resolution centralizes how Optimus finds credentials and base routing for SDK calls.
2
+ // It merges process env, optional shell env files, and provider-aware config so runner code can depend on one resolved auth contract.
3
+ // This module only resolves auth inputs and diagnostics; it does not start SDK threads or classify execution failures.
4
+ import { readFileSync } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ import { join } from "node:path";
7
+ import { resolveCodexAuthMode, resolveCodexSdkBaseUrl, resolveConfiguredCodexProvider } from "./codex-provider-profile.js";
8
+ import { resolvePrimaryCodexApiKeyEnvName, resolveRequiredCodexEnvVars } from "./codex-required-env.js";
9
+ export class CodexAuthResolver {
10
+ config;
11
+ processEnv;
12
+ options;
13
+ constructor(config, processEnv = process.env, options = {}) {
14
+ this.config = config;
15
+ this.processEnv = processEnv;
16
+ this.options = options;
17
+ }
18
+ // Auth resolution centralizes how SDK credentials are discovered and how much is exposed to diagnostics.
19
+ // Besides inherited process env, it can recover static exports from common shell rc files.
20
+ resolve() {
21
+ const authMode = resolveCodexAuthMode(this.config);
22
+ const env = this.collectStringEnv(this.processEnv);
23
+ const resolvedEnv = this.injectShellEnvFallback(env);
24
+ const configuredApiKey = this.config.codex.apiKey?.trim();
25
+ const apiKeyEnvName = resolvePrimaryCodexApiKeyEnvName(this.config, this.processEnv);
26
+ const envApiKey = apiKeyEnvName ? resolvedEnv[apiKeyEnvName]?.trim() : undefined;
27
+ const requiredEnvVars = resolveRequiredCodexEnvVars(this.config, this.processEnv);
28
+ const presentEnvVars = requiredEnvVars.filter((name) => {
29
+ const value = resolvedEnv[name];
30
+ return typeof value === "string" && value.trim().length > 0;
31
+ });
32
+ const missingEnvVars = requiredEnvVars.filter((name) => !presentEnvVars.includes(name));
33
+ const resolvedBaseUrl = resolveCodexSdkBaseUrl(this.config);
34
+ const provider = resolveConfiguredCodexProvider(this.config);
35
+ const apiKey = authMode === "codex_cli_login" ? undefined : configuredApiKey || envApiKey;
36
+ const source = authMode === "codex_cli_login"
37
+ ? "cli_login"
38
+ : configuredApiKey ? "config" : envApiKey ? "env" : "unknown";
39
+ const authenticated = authMode === "codex_cli_login"
40
+ ? true
41
+ : Boolean(apiKey) && missingEnvVars.length === 0;
42
+ const verification = authMode === "codex_cli_login" ? "runtime_required" : "static";
43
+ return {
44
+ ...(apiKey ? { apiKey } : {}),
45
+ ...(resolvedBaseUrl ? { baseUrl: resolvedBaseUrl } : {}),
46
+ env: resolvedEnv,
47
+ diagnostics: {
48
+ mode: authMode,
49
+ authenticated,
50
+ source,
51
+ ...(apiKeyEnvName ? { apiKeyEnvName } : {}),
52
+ requiredEnvVars,
53
+ presentEnvVars,
54
+ missingEnvVars,
55
+ verification,
56
+ ...(provider?.providerId ? { providerId: provider.providerId } : {}),
57
+ ...(provider?.displayName ? { providerDisplayName: provider.displayName } : {}),
58
+ ...(resolvedBaseUrl ? { baseUrl: resolvedBaseUrl } : {})
59
+ }
60
+ };
61
+ }
62
+ // SDK env only accepts string values, so process env is filtered here before any injection.
63
+ collectStringEnv(env) {
64
+ const result = {};
65
+ for (const [key, value] of Object.entries(env)) {
66
+ if (typeof value === "string") {
67
+ result[key] = value;
68
+ }
69
+ }
70
+ return result;
71
+ }
72
+ // The runtime often starts from a non-interactive shell, so rc-file exports are not inherited automatically.
73
+ // This fallback only parses plain KEY=value or export KEY=value assignments for required auth variables.
74
+ injectShellEnvFallback(env) {
75
+ const requiredKeys = resolveRequiredCodexEnvVars(this.config, this.processEnv);
76
+ const unresolvedKeys = requiredKeys.filter((name) => !env[name]?.trim());
77
+ if (unresolvedKeys.length === 0) {
78
+ return env;
79
+ }
80
+ const resolved = { ...env };
81
+ for (const file of this.options.shellEnvFiles ?? this.getDefaultShellEnvFiles()) {
82
+ let raw = "";
83
+ try {
84
+ raw = readFileSync(file, "utf8");
85
+ }
86
+ catch {
87
+ continue;
88
+ }
89
+ for (const line of raw.split(/\r?\n/)) {
90
+ const assignment = this.parseShellAssignment(line);
91
+ if (!assignment || !unresolvedKeys.includes(assignment.name) || resolved[assignment.name]?.trim()) {
92
+ continue;
93
+ }
94
+ resolved[assignment.name] = assignment.value;
95
+ }
96
+ if (requiredKeys.every((name) => resolved[name]?.trim())) {
97
+ return resolved;
98
+ }
99
+ }
100
+ return resolved;
101
+ }
102
+ // Shell env fallback should respect the current process HOME so isolated runtimes and tests can override it.
103
+ getDefaultShellEnvFiles() {
104
+ const homeDir = this.processEnv.HOME?.trim() || homedir();
105
+ return [".zshrc", ".zprofile", ".bashrc", ".bash_profile", ".profile"].map((name) => join(homeDir, name));
106
+ }
107
+ parseShellAssignment(line) {
108
+ const match = line.match(/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)=(.*)\s*$/);
109
+ if (!match) {
110
+ return undefined;
111
+ }
112
+ const name = match[1];
113
+ const rawValue = match[2];
114
+ if (name === undefined || rawValue === undefined) {
115
+ return undefined;
116
+ }
117
+ const value = this.normalizeShellValue(rawValue);
118
+ if (value.length === 0) {
119
+ return undefined;
120
+ }
121
+ return { name, value };
122
+ }
123
+ normalizeShellValue(rawValue) {
124
+ const trimmed = rawValue.trim();
125
+ if ((trimmed.startsWith("\"") && trimmed.endsWith("\"")) || (trimmed.startsWith(String.fromCharCode(39)) && trimmed.endsWith(String.fromCharCode(39)))) {
126
+ return trimmed.slice(1, -1).trim();
127
+ }
128
+ const commentIndex = trimmed.indexOf(" #");
129
+ const withoutComment = commentIndex >= 0 ? trimmed.slice(0, commentIndex).trim() : trimmed;
130
+ if (withoutComment.includes("$(") || withoutComment.includes("`")) {
131
+ return "";
132
+ }
133
+ return withoutComment;
134
+ }
135
+ }
136
+ //# sourceMappingURL=codex-auth-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-auth-resolver.js","sourceRoot":"","sources":["../../../src/problem-solving-core/codex/codex-auth-resolver.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,sIAAsI;AACtI,uHAAuH;AAEvH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,8BAA8B,EAC/B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gCAAgC,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAaxG,MAAM,OAAO,iBAAiB;IAET;IACA;IACA;IAHnB,YACmB,MAAqB,EACrB,aAAgC,OAAO,CAAC,GAAG,EAC3C,UAAoC,EAAE;QAFtC,WAAM,GAAN,MAAM,CAAe;QACrB,eAAU,GAAV,UAAU,CAAiC;QAC3C,YAAO,GAAP,OAAO,CAA+B;IACtD,CAAC;IAEJ,yGAAyG;IACzG,2FAA2F;IACpF,OAAO;QACZ,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1D,MAAM,aAAa,GAAG,gCAAgC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACrF,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACjF,MAAM,eAAe,GAAG,2BAA2B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAClF,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACrD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACxF,MAAM,eAAe,GAAG,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,8BAA8B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,QAAQ,KAAK,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,IAAI,SAAS,CAAC;QAC1F,MAAM,MAAM,GAAG,QAAQ,KAAK,iBAAiB;YAC3C,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,MAAM,aAAa,GAAG,QAAQ,KAAK,iBAAiB;YAClD,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC;QACnD,MAAM,YAAY,GAAG,QAAQ,KAAK,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC;QAEpF,OAAO;YACL,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,GAAG,EAAE,WAAW;YAChB,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,aAAa;gBACb,MAAM;gBACN,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,eAAe;gBACf,cAAc;gBACd,cAAc;gBACd,YAAY;gBACZ,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpE,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/E,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzD;SACF,CAAC;IACJ,CAAC;IAED,4FAA4F;IACpF,gBAAgB,CAAC,GAAsB;QAC7C,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,6GAA6G;IAC7G,yGAAyG;IACjG,sBAAsB,CAAC,GAA2B;QACxD,MAAM,YAAY,GAAG,2BAA2B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/E,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;YAChF,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;gBACnD,IAAI,CAAC,UAAU,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;oBAClG,SAAS;gBACX,CAAC;gBAED,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;YAC/C,CAAC;YAED,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;gBACzD,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,6GAA6G;IACrG,uBAAuB;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;QAC1D,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5G,CAAC;IAEO,oBAAoB,CAAC,IAAY;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAChF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAEO,mBAAmB,CAAC,QAAgB;QAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvJ,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,cAAc,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3F,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAClE,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { CodexConnectivityCheck, FailureCategory, OptimusConfig } from "../../types.js";
2
+ export declare function buildCodexConnectivityChecks(input: {
3
+ config: OptimusConfig;
4
+ failureMessage?: string;
5
+ failureCategory: FailureCategory | undefined;
6
+ }): CodexConnectivityCheck[];
@@ -0,0 +1,81 @@
1
+ // Connectivity checks translate Codex and provider failures into scheduler-facing diagnostics.
2
+ // The checks are lightweight and descriptive: they summarize sandbox network policy, Codex auxiliary reachability, and provider host reachability.
3
+ // This module does not perform active network probes; it derives structured signals from config plus observed failure context.
4
+ import { resolveConfiguredCodexProvider } from "./codex-provider-profile.js";
5
+ const CODEX_AUXILIARY_HOST = "chatgpt.com";
6
+ function resolveProviderHost(config) {
7
+ const profile = resolveConfiguredCodexProvider(config);
8
+ const configuredBaseUrl = config.codex.baseUrl?.trim();
9
+ const candidate = profile?.baseUrl ?? configuredBaseUrl;
10
+ if (!candidate) {
11
+ return undefined;
12
+ }
13
+ try {
14
+ return new URL(candidate).host;
15
+ }
16
+ catch {
17
+ return undefined;
18
+ }
19
+ }
20
+ function buildSandboxNetworkCheck(config) {
21
+ if (config.runtime.networkAccessEnabled) {
22
+ return {
23
+ name: "sandbox_network",
24
+ ok: true,
25
+ detail: "Sandbox command network access is enabled for agent execution."
26
+ };
27
+ }
28
+ return {
29
+ name: "sandbox_network",
30
+ ok: false,
31
+ detail: "runtime.networkAccessEnabled=false, so agent-run commands inside the sandbox cannot access the network.",
32
+ failureCategory: "environment_error"
33
+ };
34
+ }
35
+ function buildAuxiliaryConnectivityCheck(message) {
36
+ if (message?.includes(CODEX_AUXILIARY_HOST)) {
37
+ return {
38
+ name: "codex_auxiliary_connectivity",
39
+ ok: false,
40
+ host: CODEX_AUXILIARY_HOST,
41
+ detail: "Codex auxiliary control-plane connectivity failed while accessing chatgpt.com.",
42
+ failureCategory: "network_error"
43
+ };
44
+ }
45
+ return {
46
+ name: "codex_auxiliary_connectivity",
47
+ ok: true,
48
+ host: CODEX_AUXILIARY_HOST,
49
+ detail: "No Codex auxiliary control-plane connectivity failure was observed in this health-check."
50
+ };
51
+ }
52
+ function buildProviderConnectivityCheck(config, message, failureCategory) {
53
+ const providerHost = resolveProviderHost(config);
54
+ if (providerHost && message?.includes(providerHost)) {
55
+ return {
56
+ name: "provider_connectivity",
57
+ ok: false,
58
+ host: providerHost,
59
+ detail: `Provider connectivity failed while accessing ${providerHost}.`,
60
+ failureCategory: failureCategory ?? "network_error"
61
+ };
62
+ }
63
+ return {
64
+ name: "provider_connectivity",
65
+ ok: true,
66
+ ...(providerHost ? { host: providerHost } : {}),
67
+ detail: providerHost
68
+ ? `No provider connectivity failure was observed for ${providerHost} in this health-check.`
69
+ : "No explicit provider host is configured for connectivity diagnostics."
70
+ };
71
+ }
72
+ // Health-check connectivity is reported as scheduler-facing diagnostics rather than hard preflight gates.
73
+ // This keeps auth/config validation deterministic while still surfacing where network failures actually happen.
74
+ export function buildCodexConnectivityChecks(input) {
75
+ return [
76
+ buildSandboxNetworkCheck(input.config),
77
+ buildAuxiliaryConnectivityCheck(input.failureMessage),
78
+ buildProviderConnectivityCheck(input.config, input.failureMessage, input.failureCategory)
79
+ ];
80
+ }
81
+ //# sourceMappingURL=codex-connectivity-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-connectivity-checks.js","sourceRoot":"","sources":["../../../src/problem-solving-core/codex/codex-connectivity-checks.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,mJAAmJ;AACnJ,+HAA+H;AAG/H,OAAO,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAE7E,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAE3C,SAAS,mBAAmB,CAAC,MAAqB;IAChD,MAAM,OAAO,GAAG,8BAA8B,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;IACvD,MAAM,SAAS,GAAG,OAAO,EAAE,OAAO,IAAI,iBAAiB,CAAC;IACxD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAqB;IACrD,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;QACxC,OAAO;YACL,IAAI,EAAE,iBAAiB;YACvB,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,gEAAgE;SACzE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,yGAAyG;QACjH,eAAe,EAAE,mBAAmB;KACrC,CAAC;AACJ,CAAC;AAED,SAAS,+BAA+B,CAAC,OAA2B;IAClE,IAAI,OAAO,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC5C,OAAO;YACL,IAAI,EAAE,8BAA8B;YACpC,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,gFAAgF;YACxF,eAAe,EAAE,eAAe;SACjC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,8BAA8B;QACpC,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,0FAA0F;KACnG,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CACrC,MAAqB,EACrB,OAA2B,EAC3B,eAA4C;IAE5C,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,YAAY,IAAI,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACpD,OAAO;YACL,IAAI,EAAE,uBAAuB;YAC7B,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,gDAAgD,YAAY,GAAG;YACvE,eAAe,EAAE,eAAe,IAAI,eAAe;SACpD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,EAAE,EAAE,IAAI;QACR,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,MAAM,EAAE,YAAY;YAClB,CAAC,CAAC,qDAAqD,YAAY,wBAAwB;YAC3F,CAAC,CAAC,uEAAuE;KAC5E,CAAC;AACJ,CAAC;AAED,0GAA0G;AAC1G,gHAAgH;AAChH,MAAM,UAAU,4BAA4B,CAAC,KAI5C;IACC,OAAO;QACL,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC;QACtC,+BAA+B,CAAC,KAAK,CAAC,cAAc,CAAC;QACrD,8BAA8B,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,eAAe,CAAC;KAC1F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { FailureCategory } from "../../types.js";
2
+ export declare function classifyCodexFailureCategory(message: string): FailureCategory;