@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,464 @@
1
+ import { access, mkdir, readdir, readFile, rm, writeFile } from "node:fs/promises";
2
+ import { execFile } from "node:child_process";
3
+ import { promisify } from "node:util";
4
+ import { join, resolve } from "node:path";
5
+ import { SkillSyncService } from "../../problem-solving-core/codex/skill-sync-service.js";
6
+ import { RepoMemoryService } from "../../problem-solving-core/codex/repo-memory-service.js";
7
+ import { createExecutionAddresses } from "../execution-addresses.js";
8
+ import { filterBusinessChangeEntries, parseGitStatusOutput, parseRepoProjectStatusReports } from "./git-change-classifier.js";
9
+ const execFileAsync = promisify(execFile);
10
+ class ExecutionContextResolutionError extends Error {
11
+ failureCategory;
12
+ constructor(message, failureCategory) {
13
+ super(message);
14
+ this.failureCategory = failureCategory;
15
+ this.name = "ExecutionContextResolutionError";
16
+ }
17
+ }
18
+ export class ExecutionContextAssembler {
19
+ store;
20
+ config;
21
+ skillSyncService;
22
+ repoMemoryService;
23
+ constructor(store, config) {
24
+ this.store = store;
25
+ this.config = config;
26
+ this.skillSyncService = new SkillSyncService(config);
27
+ this.repoMemoryService = new RepoMemoryService(config);
28
+ }
29
+ // Artifact storage is always task-scoped under Optimus runtime, regardless of whether code executes in a copied or in-place workspace.
30
+ // This keeps result paths stable and avoids writing Optimus artifacts back into the business repository.
31
+ async assemble(task, _harness, taskPackage) {
32
+ const workspacesRoot = join(this.config.storage.rootDir, "workspaces");
33
+ const taskRootDir = join(workspacesRoot, task.taskId);
34
+ const artifactDir = join(taskRootDir, ".optimus", "artifacts");
35
+ await mkdir(workspacesRoot, { recursive: true });
36
+ const repository = await this.resolveExecutionRepository(taskPackage);
37
+ const rootIsGit = await this.isGitRepository(repository.repoPath);
38
+ const resolvedExecutionMode = repository.configuredExecutionMode === "inplace" || !rootIsGit ? "inplace" : "copy";
39
+ let inplaceWorkspacePlan;
40
+ if (resolvedExecutionMode === "copy") {
41
+ await this.assertGitWorkspaceClean(repository.repoPath, "Copy execution requires a clean source repository before creating the task workspace.");
42
+ }
43
+ else {
44
+ inplaceWorkspacePlan = await this.prepareInplaceWorkspacePlan(repository.repoPath, rootIsGit);
45
+ }
46
+ const refreshedBaseRef = await this.refreshExecutionBaseline({
47
+ repoPath: repository.repoPath,
48
+ requestedBaseRef: repository.baseRef,
49
+ resolvedExecutionMode,
50
+ rootIsGit,
51
+ ...(inplaceWorkspacePlan ? { inplaceWorkspacePlan } : {})
52
+ });
53
+ const workspaceDir = resolvedExecutionMode === "copy"
54
+ ? await this.ensureTaskWorkspace({
55
+ task,
56
+ repoPath: repository.repoPath,
57
+ baseRef: refreshedBaseRef,
58
+ taskRootDir
59
+ })
60
+ : repository.repoPath;
61
+ await mkdir(taskRootDir, { recursive: true });
62
+ await mkdir(artifactDir, { recursive: true });
63
+ const cleanupSteps = [];
64
+ if (inplaceWorkspacePlan?.cleanupRequired) {
65
+ cleanupSteps.push(inplaceWorkspacePlan.cleanup);
66
+ }
67
+ const skillPlan = await this.skillSyncService.assembleWorkspaceSkills({
68
+ taskType: task.taskType,
69
+ workspaceDir,
70
+ resolvedExecutionMode
71
+ });
72
+ const repoAlias = repository.repoSelector ?? repository.repoPath;
73
+ const repoMemory = await this.repoMemoryService.load(task.taskType, repoAlias);
74
+ if (skillPlan.cleanup) {
75
+ cleanupSteps.unshift(skillPlan.cleanup);
76
+ }
77
+ const context = {
78
+ taskRootDir,
79
+ addresses: createExecutionAddresses({
80
+ mode: resolvedExecutionMode,
81
+ workspaceDir,
82
+ sourceDir: repository.repoPath,
83
+ artifactDir,
84
+ repoRef: repository.repoSelector ?? repository.repoPath
85
+ }),
86
+ configuredExecutionMode: repository.configuredExecutionMode,
87
+ cleanupRequired: cleanupSteps.length > 0,
88
+ sandboxMode: this.config.codex.sandboxMode,
89
+ approvalPolicy: this.config.codex.approvalPolicy,
90
+ repoMemory,
91
+ allowedEvolutionSkillDir: join(this.config.skills.evolutionRootDir, "task", task.taskType)
92
+ };
93
+ if (skillPlan.workspaceSkillMountDir) {
94
+ context.workspaceSkillMountDir = skillPlan.workspaceSkillMountDir;
95
+ }
96
+ if (skillPlan.mountedSkills && skillPlan.mountedSkills.length > 0) {
97
+ context.mountedSkills = skillPlan.mountedSkills;
98
+ }
99
+ if (cleanupSteps.length > 0) {
100
+ context.cleanup = async () => {
101
+ for (const step of cleanupSteps) {
102
+ await step();
103
+ }
104
+ };
105
+ }
106
+ return context;
107
+ }
108
+ async resolveExecutionRepository(taskPackage) {
109
+ const repoSelector = this.readTaskRepoSelector(taskPackage);
110
+ const baseRef = this.readTaskBaseRef(taskPackage);
111
+ const candidates = await this.listRepositoryCandidates();
112
+ if (repoSelector) {
113
+ const matched = candidates.find((candidate) => this.matchesRepositorySelector(candidate, repoSelector));
114
+ if (matched) {
115
+ return {
116
+ repoPath: matched.path,
117
+ repoSelector,
118
+ baseRef,
119
+ configuredExecutionMode: matched.executionMode
120
+ };
121
+ }
122
+ throw new ExecutionContextResolutionError(`Unable to resolve target repository for selector ${repoSelector}. Register the repository with 'optimus repo add' or provide a matching runtime.repoRoots entry.`, "input_missing");
123
+ }
124
+ if (candidates.length === 1) {
125
+ const onlyCandidate = candidates[0];
126
+ if (!onlyCandidate) {
127
+ throw new ExecutionContextResolutionError("Repository discovery failed while selecting the only configured repository.", "config_error");
128
+ }
129
+ return {
130
+ repoPath: onlyCandidate.path,
131
+ baseRef,
132
+ configuredExecutionMode: onlyCandidate.executionMode
133
+ };
134
+ }
135
+ if (candidates.length === 0) {
136
+ throw new ExecutionContextResolutionError("No executable repository is configured. Register one with 'optimus repo add <path> --alias <name>' or set runtime.repoRoots before dispatching bugfix tasks.", "config_error");
137
+ }
138
+ throw new ExecutionContextResolutionError("Task package is missing repo while multiple repositories are configured. Submit the task with --repo so runtime can select the correct repository.", "input_missing");
139
+ }
140
+ readTaskRepoSelector(taskPackage) {
141
+ return typeof taskPackage.repo === "string" && taskPackage.repo.trim().length > 0 ? taskPackage.repo.trim() : undefined;
142
+ }
143
+ readTaskBaseRef(taskPackage) {
144
+ return typeof taskPackage.branch === "string" && taskPackage.branch.trim().length > 0 ? taskPackage.branch.trim() : "HEAD";
145
+ }
146
+ async listRepositoryCandidates() {
147
+ const registered = await this.store.listRepositoryRoots();
148
+ const configured = this.config.runtime.repoRoots.map((path) => ({
149
+ path: resolve(path),
150
+ executionMode: "copy",
151
+ enabled: true,
152
+ createdAt: new Date(0).toISOString(),
153
+ updatedAt: new Date(0).toISOString()
154
+ }));
155
+ const deduped = new Map();
156
+ for (const candidate of [...registered, ...configured]) {
157
+ if (!candidate.enabled) {
158
+ continue;
159
+ }
160
+ const normalizedPath = resolve(candidate.path);
161
+ if (!(await this.pathExists(normalizedPath))) {
162
+ continue;
163
+ }
164
+ deduped.set(normalizedPath, {
165
+ ...candidate,
166
+ path: normalizedPath
167
+ });
168
+ }
169
+ return [...deduped.values()];
170
+ }
171
+ matchesRepositorySelector(candidate, repoSelector) {
172
+ const normalizedSelector = resolve(repoSelector);
173
+ if (candidate.path === normalizedSelector) {
174
+ return true;
175
+ }
176
+ if (candidate.alias === repoSelector) {
177
+ return true;
178
+ }
179
+ const pathSegments = candidate.path.split(/[\/]/).filter(Boolean);
180
+ return pathSegments[pathSegments.length - 1] === repoSelector;
181
+ }
182
+ async ensureTaskWorkspace(input) {
183
+ const workspaceDir = input.taskRootDir;
184
+ if (!(await this.pathExists(join(workspaceDir, ".git")))) {
185
+ const branchName = this.buildTaskBranchName(input.task);
186
+ await execFileAsync("git", [
187
+ "-C", input.repoPath,
188
+ "worktree", "add",
189
+ "-B", branchName,
190
+ workspaceDir,
191
+ input.baseRef
192
+ ]);
193
+ }
194
+ await this.ensureWorkspaceRuntimeExcludes(workspaceDir);
195
+ return workspaceDir;
196
+ }
197
+ // Task workspaces contain runtime-owned directories for skills and artifacts.
198
+ // Excluding them at the worktree-local git layer keeps business diffs readable without polluting the source repository.
199
+ async ensureWorkspaceRuntimeExcludes(workspaceDir) {
200
+ const { stdout } = await execFileAsync("git", ["-C", workspaceDir, "rev-parse", "--git-path", "info/exclude"]);
201
+ const excludePath = resolve(workspaceDir, stdout.trim());
202
+ const current = await readFile(excludePath, "utf8").catch(() => "");
203
+ const requiredEntries = ["/.agents/", "/.optimus/"];
204
+ const missingEntries = requiredEntries.filter((entry) => !current.includes(entry));
205
+ if (missingEntries.length === 0) {
206
+ return;
207
+ }
208
+ const nextContent = [current.trimEnd(), ...missingEntries].filter((entry) => entry.length > 0).join("\n") + "\n";
209
+ await writeFile(excludePath, nextContent, "utf8");
210
+ }
211
+ buildTaskBranchName(task) {
212
+ const normalizedTaskType = task.taskType.replace(/[^a-zA-Z0-9._-]+/g, "-");
213
+ const normalizedTaskId = task.taskId.replace(/[^a-zA-Z0-9._-]+/g, "-");
214
+ return `optimus-task--${normalizedTaskType}--${normalizedTaskId}`;
215
+ }
216
+ // In-place execution needs a deterministic cleanup strategy before the runner can touch the repo.
217
+ // We branch here because repo-managed workspaces are not safe to treat as a flat list of first-level git repos.
218
+ async prepareInplaceWorkspacePlan(repoPath, rootIsGit) {
219
+ if (await this.isRepoManagedWorkspace(repoPath)) {
220
+ await this.assertRepoWorkspaceClean(repoPath);
221
+ return {
222
+ cleanupRequired: true,
223
+ cleanup: async () => {
224
+ await this.cleanupRepoWorkspace(repoPath);
225
+ },
226
+ gitRepos: [],
227
+ workspaceKind: "repo_managed"
228
+ };
229
+ }
230
+ const gitRepos = await this.findGitRepositories(repoPath);
231
+ await this.assertInplaceWorkspaceClean(repoPath, gitRepos);
232
+ return {
233
+ cleanupRequired: true,
234
+ cleanup: async () => {
235
+ await this.cleanupInplaceWorkspace(gitRepos);
236
+ },
237
+ gitRepos,
238
+ workspaceKind: rootIsGit ? "git_root" : "plain_directory"
239
+ };
240
+ }
241
+ async refreshExecutionBaseline(input) {
242
+ if (input.resolvedExecutionMode === "copy") {
243
+ return this.refreshGitRepository(input.repoPath, input.requestedBaseRef, false);
244
+ }
245
+ if (input.inplaceWorkspacePlan?.workspaceKind === "repo_managed") {
246
+ await this.refreshRepoWorkspace(input.repoPath);
247
+ return "HEAD";
248
+ }
249
+ const gitRepos = input.inplaceWorkspacePlan?.gitRepos
250
+ ?? (input.rootIsGit ? [input.repoPath] : await this.findGitRepositories(input.repoPath));
251
+ await this.refreshNestedGitRepositories(gitRepos, input.requestedBaseRef);
252
+ return "HEAD";
253
+ }
254
+ async refreshNestedGitRepositories(gitRepos, requestedBaseRef) {
255
+ for (const gitRepo of gitRepos) {
256
+ await this.refreshGitRepository(gitRepo, requestedBaseRef, true);
257
+ }
258
+ }
259
+ async refreshGitRepository(repoPath, requestedBaseRef, mutateWorkspace) {
260
+ const fetchTarget = await this.resolveGitFetchTarget(repoPath, requestedBaseRef);
261
+ if (!fetchTarget) {
262
+ return requestedBaseRef;
263
+ }
264
+ await execFileAsync("git", ["-C", repoPath, "fetch", fetchTarget.remoteName, fetchTarget.branchName]);
265
+ const remoteTrackingRef = `refs/remotes/${fetchTarget.remoteName}/${fetchTarget.branchName}`;
266
+ if (mutateWorkspace) {
267
+ await execFileAsync("git", ["-C", repoPath, "reset", "--hard", remoteTrackingRef]);
268
+ return "HEAD";
269
+ }
270
+ return remoteTrackingRef;
271
+ }
272
+ async resolveGitFetchTarget(repoPath, requestedBaseRef) {
273
+ const explicitBranch = this.normalizeBranchName(requestedBaseRef);
274
+ if (explicitBranch) {
275
+ const configuredRemote = await this.readGitConfig(repoPath, `branch.${explicitBranch}.remote`);
276
+ const remoteName = configuredRemote ?? "origin";
277
+ if (await this.hasGitRemote(repoPath, remoteName)) {
278
+ return {
279
+ remoteName,
280
+ branchName: explicitBranch
281
+ };
282
+ }
283
+ }
284
+ const upstreamRef = await this.readGitCommand(repoPath, ["rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"]);
285
+ if (upstreamRef) {
286
+ const separator = upstreamRef.indexOf("/");
287
+ if (separator > 0 && separator < upstreamRef.length - 1) {
288
+ return {
289
+ remoteName: upstreamRef.slice(0, separator),
290
+ branchName: upstreamRef.slice(separator + 1)
291
+ };
292
+ }
293
+ }
294
+ const currentBranch = await this.readGitCommand(repoPath, ["rev-parse", "--abbrev-ref", "HEAD"]);
295
+ if (currentBranch && currentBranch !== "HEAD") {
296
+ const configuredRemote = await this.readGitConfig(repoPath, `branch.${currentBranch}.remote`);
297
+ const remoteName = configuredRemote ?? "origin";
298
+ if (await this.hasGitRemote(repoPath, remoteName)) {
299
+ return {
300
+ remoteName,
301
+ branchName: currentBranch
302
+ };
303
+ }
304
+ }
305
+ return undefined;
306
+ }
307
+ normalizeBranchName(value) {
308
+ const trimmed = value.trim();
309
+ if (!trimmed || trimmed === "HEAD") {
310
+ return undefined;
311
+ }
312
+ if (trimmed.startsWith("refs/heads/")) {
313
+ return trimmed.slice("refs/heads/".length);
314
+ }
315
+ if (trimmed.startsWith("refs/remotes/")) {
316
+ const remainder = trimmed.slice("refs/remotes/".length);
317
+ const separator = remainder.indexOf("/");
318
+ return separator >= 0 ? remainder.slice(separator + 1) : remainder;
319
+ }
320
+ return trimmed;
321
+ }
322
+ async readGitConfig(repoPath, key) {
323
+ return this.readGitCommand(repoPath, ["config", "--get", key]);
324
+ }
325
+ async hasGitRemote(repoPath, remoteName) {
326
+ return Boolean(await this.readGitCommand(repoPath, ["remote", "get-url", remoteName]));
327
+ }
328
+ async readGitCommand(repoPath, args) {
329
+ try {
330
+ const { stdout } = await execFileAsync("git", ["-C", repoPath, ...args]);
331
+ const trimmed = stdout.trim();
332
+ return trimmed.length > 0 ? trimmed : undefined;
333
+ }
334
+ catch {
335
+ return undefined;
336
+ }
337
+ }
338
+ async refreshRepoWorkspace(rootPath) {
339
+ await this.runRepoCommand(rootPath, ["sync", "-c"]);
340
+ }
341
+ async assertInplaceWorkspaceClean(_repoPath, gitRepos) {
342
+ const dirtyRepositories = [];
343
+ for (const gitRepo of gitRepos) {
344
+ const entries = await this.readGitStatusEntries(gitRepo);
345
+ const blockingEntries = filterBusinessChangeEntries(entries);
346
+ if (blockingEntries.length > 0) {
347
+ dirtyRepositories.push(`${gitRepo} (${this.formatBlockingEntries(blockingEntries)})`);
348
+ }
349
+ }
350
+ if (dirtyRepositories.length > 0) {
351
+ throw new ExecutionContextResolutionError(`In-place execution requires a clean workspace, but these repositories have blocking changes: ${dirtyRepositories.join(", ")}.`, "environment_error");
352
+ }
353
+ }
354
+ async assertGitWorkspaceClean(repoPath, errorMessage) {
355
+ const { stdout } = await execFileAsync("git", ["-C", repoPath, "status", "--porcelain"]);
356
+ if (stdout.trim().length > 0) {
357
+ throw new ExecutionContextResolutionError(errorMessage, "environment_error");
358
+ }
359
+ }
360
+ async cleanupInplaceWorkspace(gitRepos) {
361
+ for (const gitRepo of gitRepos) {
362
+ await this.cleanupGitWorkspace(gitRepo);
363
+ }
364
+ }
365
+ async isRepoManagedWorkspace(rootPath) {
366
+ return this.pathExists(join(rootPath, ".repo"));
367
+ }
368
+ async assertRepoWorkspaceClean(rootPath) {
369
+ const stdout = await this.runRepoCommand(rootPath, [
370
+ "forall",
371
+ "-pc",
372
+ "git status --porcelain=v1 --untracked-files=all"
373
+ ]);
374
+ const dirtyLines = parseRepoProjectStatusReports(stdout)
375
+ .map((report) => ({
376
+ projectPath: report.projectPath,
377
+ blockingEntries: filterBusinessChangeEntries(report.entries)
378
+ }))
379
+ .filter((report) => report.blockingEntries.length > 0)
380
+ .map((report) => `${join(rootPath, report.projectPath)} (${this.formatBlockingEntries(report.blockingEntries)})`);
381
+ if (dirtyLines.length > 0) {
382
+ throw new ExecutionContextResolutionError(`In-place execution requires a clean repo workspace, but repo reported blocking changes: ${dirtyLines.join(" | ")}.`, "environment_error");
383
+ }
384
+ }
385
+ async cleanupRepoWorkspace(rootPath) {
386
+ const stdout = await this.runRepoCommand(rootPath, [
387
+ "forall",
388
+ "-pc",
389
+ "git status --porcelain=v1 --untracked-files=all"
390
+ ]);
391
+ const reports = parseRepoProjectStatusReports(stdout);
392
+ for (const report of reports) {
393
+ await this.cleanupGitWorkspace(join(rootPath, report.projectPath));
394
+ }
395
+ }
396
+ async runRepoCommand(rootPath, args) {
397
+ try {
398
+ const { stdout } = await execFileAsync("repo", args, { cwd: rootPath });
399
+ return stdout;
400
+ }
401
+ catch (error) {
402
+ const detail = error instanceof Error ? error.message : "Unknown repo command error";
403
+ throw new ExecutionContextResolutionError(`repo workspace command failed in ${rootPath}: ${detail}`, "environment_error");
404
+ }
405
+ }
406
+ async findGitRepositories(rootPath) {
407
+ const repositories = [];
408
+ if (await this.isGitRepository(rootPath)) {
409
+ repositories.push(rootPath);
410
+ return repositories;
411
+ }
412
+ const entries = await readdir(rootPath, { withFileTypes: true });
413
+ for (const entry of entries) {
414
+ if (!entry.isDirectory() || entry.name.startsWith(".")) {
415
+ continue;
416
+ }
417
+ const candidate = join(rootPath, entry.name);
418
+ if (await this.isGitRepository(candidate)) {
419
+ repositories.push(candidate);
420
+ }
421
+ }
422
+ return repositories.sort((left, right) => left.localeCompare(right));
423
+ }
424
+ async isGitRepository(path) {
425
+ return this.pathExists(join(path, ".git"));
426
+ }
427
+ async readGitStatusEntries(repoPath) {
428
+ const { stdout } = await execFileAsync("git", ["-C", repoPath, "status", "--porcelain=v1", "--untracked-files=all"]);
429
+ return parseGitStatusOutput(stdout);
430
+ }
431
+ async cleanupGitWorkspace(repoPath) {
432
+ const entries = await this.readGitStatusEntries(repoPath);
433
+ const blockingEntries = filterBusinessChangeEntries(entries);
434
+ if (blockingEntries.length === 0) {
435
+ return;
436
+ }
437
+ const trackedBlockingEntries = blockingEntries.filter((entry) => !entry.isUntracked);
438
+ if (trackedBlockingEntries.length > 0) {
439
+ await execFileAsync("git", ["-C", repoPath, "reset", "--hard", "HEAD"]);
440
+ }
441
+ const untrackedPaths = [...new Set(blockingEntries
442
+ .filter((entry) => entry.isUntracked)
443
+ .map((entry) => join(repoPath, entry.path)))];
444
+ for (const path of untrackedPaths) {
445
+ await rm(path, { recursive: true, force: true });
446
+ }
447
+ }
448
+ formatBlockingEntries(entries) {
449
+ return entries
450
+ .slice(0, 3)
451
+ .map((entry) => entry.raw.trim())
452
+ .join(" | ");
453
+ }
454
+ async pathExists(path) {
455
+ try {
456
+ await access(path);
457
+ return true;
458
+ }
459
+ catch {
460
+ return false;
461
+ }
462
+ }
463
+ }
464
+ //# sourceMappingURL=execution-context-assembler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-context-assembler.js","sourceRoot":"","sources":["../../../src/task-environment/orchestration/execution-context-assembler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type GitChangeClassification = "business_change" | "volatile_cache" | "runtime_owned";
2
+ export interface ParsedGitStatusEntry {
3
+ raw: string;
4
+ indexStatus: string;
5
+ worktreeStatus: string;
6
+ path: string;
7
+ originalPath?: string;
8
+ classification: GitChangeClassification;
9
+ isUntracked: boolean;
10
+ }
11
+ export interface RepoProjectStatusReport {
12
+ projectPath: string;
13
+ entries: ParsedGitStatusEntry[];
14
+ }
15
+ export declare function parseGitStatusLine(line: string): ParsedGitStatusEntry | undefined;
16
+ export declare function parseGitStatusOutput(output: string): ParsedGitStatusEntry[];
17
+ export declare function parseRepoProjectStatusReports(output: string): RepoProjectStatusReport[];
18
+ export declare function filterBusinessChangeEntries(entries: ParsedGitStatusEntry[]): ParsedGitStatusEntry[];
19
+ export declare function collectBusinessChangePaths(entries: ParsedGitStatusEntry[]): string[];
@@ -0,0 +1,106 @@
1
+ const RUNTIME_OWNED_SEGMENTS = [".agents", ".optimus", ".optimus-runtime"];
2
+ const VOLATILE_CACHE_SEGMENTS = [".gradle", ".kotlin", "build", "out", ".cxx", "DerivedData"];
3
+ function normalizePathSeparators(value) {
4
+ return value.replace(/\\/g, "/").replace(/^\.\/+/, "").replace(/\/+/g, "/");
5
+ }
6
+ function isSegmentMatch(path, segment) {
7
+ return path === segment || path.startsWith(`${segment}/`) || path.includes(`/${segment}/`) || path.endsWith(`/${segment}`);
8
+ }
9
+ function decodeQuotedPath(value) {
10
+ const trimmed = value.trim();
11
+ if (!trimmed.startsWith("\"") || !trimmed.endsWith("\"")) {
12
+ return trimmed;
13
+ }
14
+ const body = trimmed.slice(1, -1);
15
+ return body
16
+ .replace(/\\\\/g, "\\")
17
+ .replace(/\\"/g, "\"")
18
+ .replace(/\\t/g, "\t")
19
+ .replace(/\\n/g, "\n");
20
+ }
21
+ function classifyPath(path, isUntracked) {
22
+ const normalized = normalizePathSeparators(path);
23
+ if (RUNTIME_OWNED_SEGMENTS.some((segment) => isSegmentMatch(normalized, segment))) {
24
+ return "runtime_owned";
25
+ }
26
+ if (isUntracked && VOLATILE_CACHE_SEGMENTS.some((segment) => isSegmentMatch(normalized, segment))) {
27
+ return "volatile_cache";
28
+ }
29
+ return "business_change";
30
+ }
31
+ export function parseGitStatusLine(line) {
32
+ if (!line || line.startsWith("project ")) {
33
+ return undefined;
34
+ }
35
+ if (line.length < 4) {
36
+ return undefined;
37
+ }
38
+ const indexStatus = line[0] ?? " ";
39
+ const worktreeStatus = line[1] ?? " ";
40
+ const rawPath = line.slice(3).trim();
41
+ if (!rawPath) {
42
+ return undefined;
43
+ }
44
+ const renameSeparator = " -> ";
45
+ const hasRename = rawPath.includes(renameSeparator) && (indexStatus === "R" || indexStatus === "C" || worktreeStatus === "R" || worktreeStatus === "C");
46
+ const [beforePath, afterPath] = hasRename ? rawPath.split(renameSeparator, 2) : [rawPath, undefined];
47
+ const path = decodeQuotedPath(afterPath ?? beforePath);
48
+ const originalPath = afterPath ? decodeQuotedPath(beforePath) : undefined;
49
+ const isUntracked = indexStatus === "?" && worktreeStatus === "?";
50
+ return {
51
+ raw: line,
52
+ indexStatus,
53
+ worktreeStatus,
54
+ path,
55
+ ...(originalPath ? { originalPath } : {}),
56
+ classification: classifyPath(path, isUntracked),
57
+ isUntracked
58
+ };
59
+ }
60
+ export function parseGitStatusOutput(output) {
61
+ return output
62
+ .split(/\r?\n/)
63
+ .map((line) => line.trimEnd())
64
+ .map((line) => parseGitStatusLine(line))
65
+ .filter((entry) => Boolean(entry));
66
+ }
67
+ export function parseRepoProjectStatusReports(output) {
68
+ const reports = [];
69
+ let current;
70
+ for (const rawLine of output.split(/\r?\n/)) {
71
+ const line = rawLine.trimEnd();
72
+ if (!line) {
73
+ continue;
74
+ }
75
+ if (line.startsWith("project ")) {
76
+ const projectPath = line.slice("project ".length).trim().replace(/\/$/, "");
77
+ current = {
78
+ projectPath,
79
+ entries: []
80
+ };
81
+ reports.push(current);
82
+ continue;
83
+ }
84
+ const entry = parseGitStatusLine(line);
85
+ if (!entry) {
86
+ continue;
87
+ }
88
+ if (!current) {
89
+ current = {
90
+ projectPath: ".",
91
+ entries: []
92
+ };
93
+ reports.push(current);
94
+ }
95
+ current.entries.push(entry);
96
+ }
97
+ return reports;
98
+ }
99
+ export function filterBusinessChangeEntries(entries) {
100
+ return entries.filter((entry) => entry.classification === "business_change");
101
+ }
102
+ export function collectBusinessChangePaths(entries) {
103
+ return [...new Set(filterBusinessChangeEntries(entries)
104
+ .flatMap((entry) => entry.originalPath ? [entry.originalPath, entry.path] : [entry.path]))].sort((left, right) => left.localeCompare(right));
105
+ }
106
+ //# sourceMappingURL=git-change-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-change-classifier.js","sourceRoot":"","sources":["../../../src/task-environment/orchestration/git-change-classifier.ts"],"names":[],"mappings":"AAiBA,MAAM,sBAAsB,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC;AAC3E,MAAM,uBAAuB,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;AAE9F,SAAS,uBAAuB,CAAC,KAAa;IAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,OAAe;IACnD,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AAC7H,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,IAAI;SACR,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;SACtB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,WAAoB;IACtD,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;QAClF,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,IAAI,WAAW,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;QAClG,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IACnC,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC;IAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,KAAK,GAAG,IAAI,WAAW,KAAK,GAAG,IAAI,cAAc,KAAK,GAAG,IAAI,cAAc,KAAK,GAAG,CAAC,CAAC;IACxJ,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACrG,MAAM,IAAI,GAAG,gBAAgB,CAAC,SAAS,IAAI,UAAU,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,MAAM,WAAW,GAAG,WAAW,KAAK,GAAG,IAAI,cAAc,KAAK,GAAG,CAAC;IAElE,OAAO;QACL,GAAG,EAAE,IAAI;QACT,WAAW;QACX,cAAc;QACd,IAAI;QACJ,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,cAAc,EAAE,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC;QAC/C,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,OAAO,MAAM;SACV,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;SAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;SACvC,MAAM,CAAC,CAAC,KAAK,EAAiC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,MAAc;IAC1D,MAAM,OAAO,GAA8B,EAAE,CAAC;IAC9C,IAAI,OAA4C,CAAC;IAEjD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5E,OAAO,GAAG;gBACR,WAAW;gBACX,OAAO,EAAE,EAAE;aACZ,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG;gBACR,WAAW,EAAE,GAAG;gBAChB,OAAO,EAAE,EAAE;aACZ,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,OAA+B;IACzE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,KAAK,iBAAiB,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAA+B;IACxE,OAAO,CAAC,GAAG,IAAI,GAAG,CAChB,2BAA2B,CAAC,OAAO,CAAC;aACjC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAC5F,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { OptimusConfig } from "../../types.js";
2
+ export interface HarnessDefinition {
3
+ taskType: string;
4
+ dir: string;
5
+ }
6
+ export interface HarnessManifest {
7
+ id: string;
8
+ triageRules: string[];
9
+ executionRules: string[];
10
+ harnessDir: string;
11
+ manifestPath: string;
12
+ }
13
+ export declare class HarnessRegistry {
14
+ private readonly definitions;
15
+ private readonly manifestsByDir;
16
+ private readonly fallbackDefinition;
17
+ constructor(config: OptimusConfig);
18
+ get(taskType: string): HarnessDefinition;
19
+ getManifest(taskType: string): HarnessManifest;
20
+ list(): HarnessDefinition[];
21
+ listTaskTypes(): string[];
22
+ private readRegistryFile;
23
+ private assertValidDefinition;
24
+ private readAndValidateHarnessManifest;
25
+ private validateManifestRuleList;
26
+ private assertUnique;
27
+ }