@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 @@
1
+ {"version":3,"file":"polling-problem-intake.js","sourceRoot":"","sources":["../../../src/task-environment/intake/polling-problem-intake.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { CodexHealthCheckResult, OptimusConfig } from "../../types.js";
2
+ export type LogLevel = "error" | "warn" | "info" | "debug";
3
+ export interface LogContext {
4
+ taskId?: string;
5
+ taskType?: string;
6
+ addressesResolvedExecutionMode?: string;
7
+ status?: string;
8
+ durationMs?: number;
9
+ reason?: string;
10
+ stage?: string;
11
+ [key: string]: unknown;
12
+ }
13
+ export interface LogRecord {
14
+ timestampIso: string;
15
+ timestampShort: string;
16
+ level: LogLevel;
17
+ event: string;
18
+ context: LogContext;
19
+ }
20
+ export declare class OptimusLogger {
21
+ private static readonly subscribers;
22
+ private static consoleSink;
23
+ private readonly config;
24
+ private readonly logsDir;
25
+ private initialized;
26
+ private readonly lastWarnByKey;
27
+ private readonly streams;
28
+ private readonly lastSummaryFingerprintByEvent;
29
+ private writeQueue;
30
+ static subscribe(listener: (record: LogRecord) => void): () => void;
31
+ static setConsoleSink(sink: ((summaryText: string, record: LogRecord) => void) | undefined): void;
32
+ constructor(config: OptimusConfig);
33
+ info(event: string, context?: LogContext): Promise<void>;
34
+ warn(event: string, context?: LogContext): Promise<void>;
35
+ error(event: string, context?: LogContext): Promise<void>;
36
+ debug(event: string, context?: LogContext): Promise<void>;
37
+ writeHealthCheckSnapshot(result: CodexHealthCheckResult): Promise<void>;
38
+ readHealthCheckSnapshot(): Promise<CodexHealthCheckResult | undefined>;
39
+ writeTriageStatusSnapshot(snapshot: Record<string, unknown>): Promise<void>;
40
+ readTriageStatusSnapshot(): Promise<Record<string, unknown> | undefined>;
41
+ writeSkillSyncSnapshot(snapshot: Record<string, unknown>): Promise<void>;
42
+ writeRepoMemorySnapshot(snapshot: Record<string, unknown>): Promise<void>;
43
+ readRepoMemorySnapshot(): Promise<Record<string, unknown> | undefined>;
44
+ writeEvolutionSnapshot(snapshot: Record<string, unknown>): Promise<void>;
45
+ readEvolutionSnapshot(): Promise<Record<string, unknown> | undefined>;
46
+ readSkillSyncSnapshot(): Promise<Record<string, unknown> | undefined>;
47
+ private log;
48
+ private shouldWriteSummary;
49
+ private shouldEmitEvent;
50
+ private shouldWriteTrace;
51
+ private shouldLog;
52
+ private createRecord;
53
+ private createFingerprint;
54
+ private formatShortTimestamp;
55
+ private formatSummaryRecord;
56
+ private normalizeSummaryContext;
57
+ private normalizeSummaryValue;
58
+ private sanitizeSummaryReason;
59
+ private shortenIdentifier;
60
+ private shortenTail;
61
+ private sortSummaryKeys;
62
+ private formatSummaryField;
63
+ private formatBlock;
64
+ private tryPrettyJson;
65
+ private formatTraceRecord;
66
+ private normalizeTraceValue;
67
+ private normalizeTraceString;
68
+ private detectTraceStringFormat;
69
+ private enqueueWrite;
70
+ private getStream;
71
+ private ensureInitialized;
72
+ private getRuntimeLogPath;
73
+ private getTraceLogPath;
74
+ private getCurrentDate;
75
+ private cleanupOldRuntimeLogs;
76
+ }
@@ -0,0 +1,604 @@
1
+ import { createWriteStream } from "node:fs";
2
+ import { mkdir, readdir, rm } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { readFile, writeFile } from "node:fs/promises";
5
+ const LOG_LEVEL_WEIGHT = {
6
+ error: 0,
7
+ warn: 1,
8
+ info: 2,
9
+ debug: 3
10
+ };
11
+ const RELEASE_IMPORTANT_EVENTS = new Set([
12
+ "runtime.started",
13
+ "runtime.stopped",
14
+ "runtime.health",
15
+ "runtime.recovery.requeued",
16
+ "event.received",
17
+ "triage.accepted",
18
+ "triage.rejected",
19
+ "triage.failed",
20
+ "task.received",
21
+ "task.dispatched",
22
+ "task.execution.started",
23
+ "repo.inplace.precheck.temp_branch_cleanup_started",
24
+ "repo.inplace.precheck.temp_branch_cleanup_completed",
25
+ "repo.inplace.precheck.temp_branch_removed",
26
+ "task.completed",
27
+ "task.failed",
28
+ "task.canceled",
29
+ "task.cancel_forced",
30
+ "task.cancel_cleanup_completed",
31
+ "task.cancel_cleanup_failed",
32
+ "jira.assignee_identity.resolved",
33
+ "jira.assignee_identity.degraded",
34
+ "jira.assignee_identity.resolve_failed",
35
+ "task.delivery_retry.executed",
36
+ "task.delivery_retry.skipped",
37
+ "task.delivery_bundle.warning",
38
+ "task.publication.review_submit.started",
39
+ "task.publication.review_submit.completed",
40
+ "task.publication.repo_managed.submit_started",
41
+ "task.publication.repo_managed.submit_completed",
42
+ "task.timed_out",
43
+ "task.fallback",
44
+ "task.needs_human",
45
+ "task.retry_enqueued",
46
+ "task.cancel_requested",
47
+ "task.cancel_forced",
48
+ "task.cancel_cleanup_completed",
49
+ "task.cancel_cleanup_failed",
50
+ "task.idempotent_duplicate_ignored",
51
+ "skills.evolution.prepare",
52
+ "skills.evolution.checked",
53
+ "skills.evolution.applied",
54
+ "skills.evolution.noop",
55
+ "skills.evolution.rejected",
56
+ "optimus.health_check",
57
+ "optimus.runner.turn_completed",
58
+ "optimus.runner.turn_failed",
59
+ "optimus.runner.result_parsed"
60
+ ]);
61
+ const SUMMARY_SUPPRESSED_EVENTS = new Set([
62
+ "optimus.runner.execution_prompt",
63
+ "optimus.runner.prepared",
64
+ "optimus.runner.stream_event",
65
+ "optimus.runner.raw_response",
66
+ "optimus.runner.parsed_response",
67
+ "optimus.runner.result_document",
68
+ "optimus.triage.init_prompt",
69
+ "optimus.triage.init_response",
70
+ "optimus.triage.raw_response",
71
+ "optimus.triage.parsed_response"
72
+ ]);
73
+ const MAIN_CONTEXT_KEY_ORDER = [
74
+ "task",
75
+ "run",
76
+ "event",
77
+ "sourceEvent",
78
+ "thread",
79
+ "previousThread",
80
+ "taskPackage",
81
+ "taskType",
82
+ "status",
83
+ "stage",
84
+ "failureCategory",
85
+ "addressesWorkspaceDir",
86
+ "addressesVisibleRepoDir",
87
+ "addressesConfiguredExecutionMode",
88
+ "addressesResolvedExecutionMode",
89
+ "decision",
90
+ "summary",
91
+ "reason"
92
+ ];
93
+ const MAIN_KEY_ALIASES = {
94
+ taskId: "task",
95
+ runId: "run",
96
+ eventId: "event",
97
+ sourceEventId: "sourceEvent",
98
+ sdkThreadId: "thread",
99
+ addressesWorkspaceDir: "workspace",
100
+ addressesVisibleRepoDir: "visibleRepo",
101
+ addressesConfiguredExecutionMode: "configuredMode",
102
+ addressesResolvedExecutionMode: "resolvedMode",
103
+ threadId: "thread",
104
+ previousThreadId: "previousThread",
105
+ taskPackageId: "taskPackage"
106
+ };
107
+ const TRACE_WORTHY_EVENT_PREFIXES = ["optimus.runner.", "optimus.triage."];
108
+ const TRACE_WORTHY_EVENTS = new Set([
109
+ "task.failed",
110
+ "task.completed",
111
+ "task.canceled",
112
+ "task.cancel_forced",
113
+ "task.cancel_cleanup_completed",
114
+ "task.cancel_cleanup_failed",
115
+ "task.timed_out",
116
+ "triage.failed",
117
+ "triage.rejected",
118
+ "skills.evolution.prepare",
119
+ "skills.evolution.checked",
120
+ "skills.evolution.applied",
121
+ "skills.evolution.noop",
122
+ "skills.evolution.rejected",
123
+ "task.delivery_retry.executed",
124
+ "task.delivery_retry.skipped",
125
+ "task.publication.review_submit.targets_resolved",
126
+ "task.publication.review_submit.review_metadata",
127
+ "task.publication.repo_managed.temp_branch_prepared",
128
+ "task.publication.repo_managed.temp_branch_restored"
129
+ ]);
130
+ const TRACE_BLOCK_STRING_KEYS = new Set([
131
+ "prompt",
132
+ "response",
133
+ "parsedResponse",
134
+ "resultDocument",
135
+ "event",
136
+ "content"
137
+ ]);
138
+ export class OptimusLogger {
139
+ static subscribers = new Set();
140
+ static consoleSink;
141
+ config;
142
+ logsDir;
143
+ initialized = false;
144
+ lastWarnByKey = new Map();
145
+ streams = new Map();
146
+ lastSummaryFingerprintByEvent = new Map();
147
+ writeQueue = Promise.resolve();
148
+ static subscribe(listener) {
149
+ OptimusLogger.subscribers.add(listener);
150
+ return () => {
151
+ OptimusLogger.subscribers.delete(listener);
152
+ };
153
+ }
154
+ static setConsoleSink(sink) {
155
+ OptimusLogger.consoleSink = sink;
156
+ }
157
+ // Logger state is intentionally shared via append-only streams so high-frequency runtime logging stays cheap.
158
+ constructor(config) {
159
+ this.config = config;
160
+ this.logsDir = join(config.storage.rootDir, "logs");
161
+ }
162
+ async info(event, context = {}) {
163
+ await this.log("info", event, context);
164
+ }
165
+ async warn(event, context = {}) {
166
+ await this.log("warn", event, context);
167
+ }
168
+ async error(event, context = {}) {
169
+ await this.log("error", event, context);
170
+ }
171
+ async debug(event, context = {}) {
172
+ await this.log("debug", event, context);
173
+ }
174
+ async writeHealthCheckSnapshot(result) {
175
+ await this.ensureInitialized();
176
+ const snapshotPath = join(this.logsDir, "codex-health-check.json");
177
+ await writeFile(snapshotPath, JSON.stringify(result, null, 2), "utf8");
178
+ }
179
+ async readHealthCheckSnapshot() {
180
+ try {
181
+ await this.ensureInitialized();
182
+ const snapshotPath = join(this.logsDir, "codex-health-check.json");
183
+ const raw = await readFile(snapshotPath, "utf8");
184
+ return JSON.parse(raw);
185
+ }
186
+ catch {
187
+ return undefined;
188
+ }
189
+ }
190
+ // Triage readiness is persisted separately so doctor can report whether resident runtime started with a usable triage agent.
191
+ async writeTriageStatusSnapshot(snapshot) {
192
+ await this.ensureInitialized();
193
+ const snapshotPath = join(this.logsDir, "triage-status.json");
194
+ await writeFile(snapshotPath, JSON.stringify(snapshot, null, 2), "utf8");
195
+ }
196
+ async readTriageStatusSnapshot() {
197
+ try {
198
+ await this.ensureInitialized();
199
+ const snapshotPath = join(this.logsDir, "triage-status.json");
200
+ const raw = await readFile(snapshotPath, "utf8");
201
+ return JSON.parse(raw);
202
+ }
203
+ catch {
204
+ return undefined;
205
+ }
206
+ }
207
+ async writeSkillSyncSnapshot(snapshot) {
208
+ await this.ensureInitialized();
209
+ const snapshotPath = join(this.logsDir, "skills-sync.json");
210
+ await writeFile(snapshotPath, JSON.stringify(snapshot, null, 2), "utf8");
211
+ }
212
+ async writeRepoMemorySnapshot(snapshot) {
213
+ await this.ensureInitialized();
214
+ const snapshotPath = join(this.logsDir, "repo-memory.json");
215
+ await writeFile(snapshotPath, JSON.stringify(snapshot, null, 2), "utf8");
216
+ }
217
+ async readRepoMemorySnapshot() {
218
+ try {
219
+ await this.ensureInitialized();
220
+ const snapshotPath = join(this.logsDir, "repo-memory.json");
221
+ const raw = await readFile(snapshotPath, "utf8");
222
+ return JSON.parse(raw);
223
+ }
224
+ catch {
225
+ return undefined;
226
+ }
227
+ }
228
+ async writeEvolutionSnapshot(snapshot) {
229
+ await this.ensureInitialized();
230
+ const snapshotPath = join(this.logsDir, "skills-evolution.json");
231
+ await writeFile(snapshotPath, JSON.stringify(snapshot, null, 2), "utf8");
232
+ }
233
+ async readEvolutionSnapshot() {
234
+ try {
235
+ await this.ensureInitialized();
236
+ const snapshotPath = join(this.logsDir, "skills-evolution.json");
237
+ const raw = await readFile(snapshotPath, "utf8");
238
+ return JSON.parse(raw);
239
+ }
240
+ catch {
241
+ return undefined;
242
+ }
243
+ }
244
+ async readSkillSyncSnapshot() {
245
+ try {
246
+ await this.ensureInitialized();
247
+ const snapshotPath = join(this.logsDir, "skills-sync.json");
248
+ const raw = await readFile(snapshotPath, "utf8");
249
+ return JSON.parse(raw);
250
+ }
251
+ catch {
252
+ return undefined;
253
+ }
254
+ }
255
+ // Summary logs are tuned for operators scanning runtime state.
256
+ // Trace logs keep the raw Codex and triage payloads needed for later replay and diagnosis.
257
+ async log(level, event, context) {
258
+ if (!this.config.observability.enabled) {
259
+ return;
260
+ }
261
+ await this.ensureInitialized();
262
+ const record = this.createRecord(level, event, context);
263
+ const shouldWriteSummary = this.shouldWriteSummary(record);
264
+ const shouldWriteTrace = this.shouldWriteTrace(record);
265
+ if (!shouldWriteSummary && !shouldWriteTrace) {
266
+ return;
267
+ }
268
+ const writes = [];
269
+ for (const subscriber of OptimusLogger.subscribers) {
270
+ subscriber(record);
271
+ }
272
+ if (shouldWriteSummary) {
273
+ const summaryText = this.formatSummaryRecord(record);
274
+ if (this.shouldLog(level, this.config.observability.consoleLevel)) {
275
+ if (OptimusLogger.consoleSink) {
276
+ OptimusLogger.consoleSink(summaryText, record);
277
+ }
278
+ else {
279
+ console.log(summaryText);
280
+ }
281
+ }
282
+ if (this.shouldLog(level, this.config.observability.fileLevel)) {
283
+ writes.push(this.enqueueWrite(this.getRuntimeLogPath(), `${summaryText}\n\n`));
284
+ }
285
+ }
286
+ if (shouldWriteTrace && this.shouldLog(level, this.config.observability.fileLevel)) {
287
+ writes.push(this.enqueueWrite(this.getTraceLogPath(), `${this.formatTraceRecord(record)}\n`));
288
+ }
289
+ await Promise.all(writes);
290
+ }
291
+ // Summary logs keep operator-facing milestones only.
292
+ // High-frequency runner/triage payloads stay available to realtime subscribers and trace logs.
293
+ shouldWriteSummary(record) {
294
+ if (!this.shouldEmitEvent(record.level, record.event, record.context)) {
295
+ return false;
296
+ }
297
+ if (SUMMARY_SUPPRESSED_EVENTS.has(record.event)) {
298
+ return false;
299
+ }
300
+ if (record.event === "runtime.health") {
301
+ const fingerprint = this.createFingerprint(record.context);
302
+ const previous = this.lastSummaryFingerprintByEvent.get(record.event);
303
+ if (previous === fingerprint) {
304
+ return false;
305
+ }
306
+ this.lastSummaryFingerprintByEvent.set(record.event, fingerprint);
307
+ }
308
+ return true;
309
+ }
310
+ shouldEmitEvent(level, event, context) {
311
+ void context;
312
+ if (this.config.observability.mode === "release") {
313
+ if (!RELEASE_IMPORTANT_EVENTS.has(event) && (level === "debug" || level === "info")) {
314
+ return false;
315
+ }
316
+ }
317
+ if (level !== "warn" || event !== "task.fallback") {
318
+ return true;
319
+ }
320
+ const key = `${event}:${String(context.taskType ?? "unknown")}:${String(context.reason ?? "unknown")}`;
321
+ const now = Date.now();
322
+ const lastAt = this.lastWarnByKey.get(key) ?? 0;
323
+ if (now - lastAt < this.config.observability.repeatFallbackCooldownMs) {
324
+ return false;
325
+ }
326
+ this.lastWarnByKey.set(key, now);
327
+ return true;
328
+ }
329
+ shouldWriteTrace(record) {
330
+ if (TRACE_WORTHY_EVENTS.has(record.event)) {
331
+ return true;
332
+ }
333
+ if (record.level === "debug") {
334
+ return true;
335
+ }
336
+ return TRACE_WORTHY_EVENT_PREFIXES.some((prefix) => record.event.startsWith(prefix));
337
+ }
338
+ shouldLog(level, threshold) {
339
+ return LOG_LEVEL_WEIGHT[level] <= LOG_LEVEL_WEIGHT[threshold];
340
+ }
341
+ createRecord(level, event, context) {
342
+ const timestampIso = new Date().toISOString();
343
+ return {
344
+ timestampIso,
345
+ timestampShort: this.formatShortTimestamp(timestampIso),
346
+ level,
347
+ event,
348
+ context
349
+ };
350
+ }
351
+ createFingerprint(context) {
352
+ return JSON.stringify(context, Object.keys(context).sort());
353
+ }
354
+ formatShortTimestamp(timestampIso) {
355
+ return `${timestampIso.slice(5, 10)} ${timestampIso.slice(11, 23)}`;
356
+ }
357
+ formatSummaryRecord(record) {
358
+ const header = `${record.timestampShort} ${record.level.toUpperCase().padEnd(5, " ")} ${record.event}`;
359
+ const normalizedContext = this.normalizeSummaryContext(record.context);
360
+ const orderedKeys = this.sortSummaryKeys(Object.keys(normalizedContext));
361
+ if (orderedKeys.length === 0) {
362
+ return header;
363
+ }
364
+ const lines = [header];
365
+ for (const key of orderedKeys) {
366
+ lines.push(...this.formatSummaryField(key, normalizedContext[key]));
367
+ }
368
+ return lines.join("\n");
369
+ }
370
+ normalizeSummaryContext(context) {
371
+ const normalized = {};
372
+ for (const [rawKey, rawValue] of Object.entries(context)) {
373
+ if (rawValue === undefined) {
374
+ continue;
375
+ }
376
+ const key = MAIN_KEY_ALIASES[rawKey] ?? rawKey;
377
+ normalized[key] = this.normalizeSummaryValue(rawKey, rawValue);
378
+ }
379
+ return normalized;
380
+ }
381
+ normalizeSummaryValue(key, value) {
382
+ if (typeof value !== "string") {
383
+ return value;
384
+ }
385
+ if (key === "taskId") {
386
+ return this.shortenIdentifier(value, "task#");
387
+ }
388
+ if (key === "runId") {
389
+ return this.shortenIdentifier(value, "run#");
390
+ }
391
+ if (key === "eventId" || key === "sourceEventId") {
392
+ return this.shortenIdentifier(value, "evt#");
393
+ }
394
+ if (key === "taskPackageId") {
395
+ return this.shortenIdentifier(value, "pkg#");
396
+ }
397
+ if (key === "sdkThreadId" || key === "threadId" || key === "previousThreadId") {
398
+ return this.shortenTail(value, "thread#", 6);
399
+ }
400
+ if (key === "reason") {
401
+ return this.sanitizeSummaryReason(value);
402
+ }
403
+ return value;
404
+ }
405
+ sanitizeSummaryReason(value) {
406
+ const lines = value
407
+ .split("\n")
408
+ .map((line) => line.trim())
409
+ .filter(Boolean);
410
+ const reconnectProgressPattern = /^reconnecting\.\.\.\s*\d+\/\d+\b/i;
411
+ if (!lines.some((line) => reconnectProgressPattern.test(line))) {
412
+ return value;
413
+ }
414
+ return [...lines].reverse().find((line) => !reconnectProgressPattern.test(line)) ?? value;
415
+ }
416
+ shortenIdentifier(value, prefix) {
417
+ const parts = value.split("-").filter(Boolean);
418
+ const tail = parts[parts.length - 1] ?? value;
419
+ return `${prefix}${tail}`;
420
+ }
421
+ shortenTail(value, prefix, width) {
422
+ return `${prefix}${value.slice(-width)}`;
423
+ }
424
+ sortSummaryKeys(keys) {
425
+ const ranked = new Map(MAIN_CONTEXT_KEY_ORDER.map((key, index) => [key, index]));
426
+ return [...keys].sort((left, right) => {
427
+ const leftRank = ranked.get(left) ?? Number.MAX_SAFE_INTEGER;
428
+ const rightRank = ranked.get(right) ?? Number.MAX_SAFE_INTEGER;
429
+ if (leftRank !== rightRank) {
430
+ return leftRank - rightRank;
431
+ }
432
+ return left.localeCompare(right);
433
+ });
434
+ }
435
+ formatSummaryField(key, value) {
436
+ if (value === null) {
437
+ return [` ${key}: null`];
438
+ }
439
+ if (typeof value === "string") {
440
+ const prettyJson = this.tryPrettyJson(value);
441
+ if (prettyJson) {
442
+ return this.formatBlock(key, prettyJson);
443
+ }
444
+ if (value.includes("\n") || value.length > 160) {
445
+ return this.formatBlock(key, value);
446
+ }
447
+ return [` ${key}: ${value}`];
448
+ }
449
+ if (typeof value === "number" || typeof value === "boolean") {
450
+ return [` ${key}: ${String(value)}`];
451
+ }
452
+ if (Array.isArray(value) || typeof value === "object") {
453
+ return this.formatBlock(key, JSON.stringify(value, null, 2));
454
+ }
455
+ return [` ${key}: ${String(value)}`];
456
+ }
457
+ formatBlock(key, content) {
458
+ const lines = content.split("\n");
459
+ return [` ${key}:`, ...lines.map((line) => ` ${line}`)];
460
+ }
461
+ tryPrettyJson(value) {
462
+ const trimmed = value.trim();
463
+ if (!(trimmed.startsWith("{") || trimmed.startsWith("["))) {
464
+ return undefined;
465
+ }
466
+ try {
467
+ return JSON.stringify(JSON.parse(trimmed), null, 2);
468
+ }
469
+ catch {
470
+ return undefined;
471
+ }
472
+ }
473
+ // Trace logs stay complete, but long JSON or Markdown strings are expanded into readable structures.
474
+ // This keeps prompt and response payloads inspectable without losing machine-usable content.
475
+ formatTraceRecord(record) {
476
+ return JSON.stringify({
477
+ timestamp: record.timestampIso,
478
+ level: record.level,
479
+ event: record.event,
480
+ context: this.normalizeTraceValue(record.context)
481
+ }, null, 2);
482
+ }
483
+ normalizeTraceValue(value, key) {
484
+ if (value === undefined) {
485
+ return null;
486
+ }
487
+ if (value === null || typeof value === "number" || typeof value === "boolean") {
488
+ return value;
489
+ }
490
+ if (typeof value === "string") {
491
+ return this.normalizeTraceString(value, key);
492
+ }
493
+ if (Array.isArray(value)) {
494
+ return value.map((item) => this.normalizeTraceValue(item));
495
+ }
496
+ if (typeof value === "object") {
497
+ const normalized = {};
498
+ for (const [entryKey, entryValue] of Object.entries(value)) {
499
+ if (entryValue === undefined) {
500
+ continue;
501
+ }
502
+ normalized[entryKey] = this.normalizeTraceValue(entryValue, entryKey);
503
+ }
504
+ return normalized;
505
+ }
506
+ return String(value);
507
+ }
508
+ normalizeTraceString(value, key) {
509
+ const prettyJson = this.tryPrettyJson(value);
510
+ if (prettyJson) {
511
+ return JSON.parse(prettyJson);
512
+ }
513
+ const shouldExpandBlock = value.includes("\n") || TRACE_BLOCK_STRING_KEYS.has(key ?? "") || value.length > 200;
514
+ if (!shouldExpandBlock) {
515
+ return value;
516
+ }
517
+ return {
518
+ format: this.detectTraceStringFormat(value, key),
519
+ lines: value.split("\n")
520
+ };
521
+ }
522
+ detectTraceStringFormat(value, key) {
523
+ if (key === "prompt" || key === "resultDocument") {
524
+ return "markdown";
525
+ }
526
+ const trimmed = value.trimStart();
527
+ if (trimmed.startsWith("#") || trimmed.startsWith("-") || /^\d+\.\s/.test(trimmed)) {
528
+ return "markdown";
529
+ }
530
+ return "text";
531
+ }
532
+ // Writes are serialized through one queue per logger so ordering stays stable without reopening files for every event.
533
+ enqueueWrite(path, content) {
534
+ this.writeQueue = this.writeQueue.then(() => new Promise((resolve, reject) => {
535
+ const stream = this.getStream(path);
536
+ stream.write(content, "utf8", (error) => {
537
+ if (error) {
538
+ reject(error);
539
+ return;
540
+ }
541
+ resolve();
542
+ });
543
+ }));
544
+ return this.writeQueue;
545
+ }
546
+ getStream(path) {
547
+ let stream = this.streams.get(path);
548
+ if (stream) {
549
+ return stream;
550
+ }
551
+ stream = createWriteStream(path, {
552
+ flags: "a",
553
+ encoding: "utf8"
554
+ });
555
+ this.streams.set(path, stream);
556
+ return stream;
557
+ }
558
+ // Lazy initialization lets short-lived commands reuse the logger without eager filesystem work.
559
+ // The runtime only pays log directory setup cost when something is actually emitted.
560
+ async ensureInitialized() {
561
+ if (this.initialized) {
562
+ return;
563
+ }
564
+ await mkdir(this.logsDir, { recursive: true });
565
+ await this.cleanupOldRuntimeLogs();
566
+ this.initialized = true;
567
+ }
568
+ getRuntimeLogPath() {
569
+ return join(this.logsDir, `runtime-${this.getCurrentDate()}.log`);
570
+ }
571
+ getTraceLogPath() {
572
+ return join(this.logsDir, `runtime-trace-${this.getCurrentDate()}.log`);
573
+ }
574
+ getCurrentDate() {
575
+ return new Date().toISOString().slice(0, 10);
576
+ }
577
+ // File retention is enforced here so summary and trace logs do not grow without bound.
578
+ async cleanupOldRuntimeLogs() {
579
+ const files = await readdir(this.logsDir, { withFileTypes: true });
580
+ const retentionMs = this.config.observability.retentionDays * 24 * 60 * 60 * 1000;
581
+ const now = Date.now();
582
+ for (const file of files) {
583
+ if (!file.isFile()) {
584
+ continue;
585
+ }
586
+ const isSummaryLog = file.name.startsWith("runtime-") && file.name.endsWith(".log");
587
+ const isTraceLog = file.name.startsWith("runtime-trace-") && file.name.endsWith(".log");
588
+ if (!isSummaryLog && !isTraceLog) {
589
+ continue;
590
+ }
591
+ const datePart = isTraceLog
592
+ ? file.name.slice("runtime-trace-".length, -".log".length)
593
+ : file.name.slice("runtime-".length, -".log".length);
594
+ const parsedAt = Date.parse(`${datePart}T00:00:00.000Z`);
595
+ if (Number.isNaN(parsedAt)) {
596
+ continue;
597
+ }
598
+ if (now - parsedAt > retentionMs) {
599
+ await rm(join(this.logsDir, file.name), { force: true });
600
+ }
601
+ }
602
+ }
603
+ }
604
+ //# sourceMappingURL=logger.js.map