codex-orchestrator 0.1.47 → 0.1.49

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 (180) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/src/config/schema.d.ts +5 -1
  3. package/dist/src/config/schema.d.ts.map +1 -1
  4. package/dist/src/config/schema.js +16 -0
  5. package/dist/src/config/schema.js.map +1 -1
  6. package/dist/src/github/gh-issue-adapter.d.ts +3 -1
  7. package/dist/src/github/gh-issue-adapter.d.ts.map +1 -1
  8. package/dist/src/github/gh-issue-adapter.js +44 -6
  9. package/dist/src/github/gh-issue-adapter.js.map +1 -1
  10. package/dist/src/github/gh-pull-request-adapter.d.ts +3 -1
  11. package/dist/src/github/gh-pull-request-adapter.d.ts.map +1 -1
  12. package/dist/src/github/gh-pull-request-adapter.js +74 -0
  13. package/dist/src/github/gh-pull-request-adapter.js.map +1 -1
  14. package/dist/src/github/issues.d.ts +4 -0
  15. package/dist/src/github/issues.d.ts.map +1 -1
  16. package/dist/src/github/issues.js +6 -0
  17. package/dist/src/github/issues.js.map +1 -1
  18. package/dist/src/github/pull-requests.d.ts +9 -0
  19. package/dist/src/github/pull-requests.d.ts.map +1 -1
  20. package/dist/src/github/pull-requests.js +13 -0
  21. package/dist/src/github/pull-requests.js.map +1 -1
  22. package/dist/src/runner/command-utils.d.ts.map +1 -1
  23. package/dist/src/runner/command-utils.js +1 -0
  24. package/dist/src/runner/command-utils.js.map +1 -1
  25. package/dist/src/runner/local-execution-session.d.ts.map +1 -1
  26. package/dist/src/runner/local-execution-session.js +5 -2
  27. package/dist/src/runner/local-execution-session.js.map +1 -1
  28. package/dist/src/runner/mission-activation.d.ts +29 -0
  29. package/dist/src/runner/mission-activation.d.ts.map +1 -0
  30. package/dist/src/runner/mission-activation.js +54 -0
  31. package/dist/src/runner/mission-activation.js.map +1 -0
  32. package/dist/src/runner/mission-agent-broker.d.ts +53 -0
  33. package/dist/src/runner/mission-agent-broker.d.ts.map +1 -0
  34. package/dist/src/runner/mission-agent-broker.js +182 -0
  35. package/dist/src/runner/mission-agent-broker.js.map +1 -0
  36. package/dist/src/runner/mission-cancellation.d.ts +77 -0
  37. package/dist/src/runner/mission-cancellation.d.ts.map +1 -0
  38. package/dist/src/runner/mission-cancellation.js +180 -0
  39. package/dist/src/runner/mission-cancellation.js.map +1 -0
  40. package/dist/src/runner/mission-canonical-path.d.ts +34 -0
  41. package/dist/src/runner/mission-canonical-path.d.ts.map +1 -0
  42. package/dist/src/runner/mission-canonical-path.js +121 -0
  43. package/dist/src/runner/mission-canonical-path.js.map +1 -0
  44. package/dist/src/runner/mission-capability-kernel.d.ts +34 -0
  45. package/dist/src/runner/mission-capability-kernel.d.ts.map +1 -0
  46. package/dist/src/runner/mission-capability-kernel.js +158 -0
  47. package/dist/src/runner/mission-capability-kernel.js.map +1 -0
  48. package/dist/src/runner/mission-check-policy.d.ts +17 -0
  49. package/dist/src/runner/mission-check-policy.d.ts.map +1 -0
  50. package/dist/src/runner/mission-check-policy.js +31 -0
  51. package/dist/src/runner/mission-check-policy.js.map +1 -0
  52. package/dist/src/runner/mission-coordinator-lock.d.ts +16 -0
  53. package/dist/src/runner/mission-coordinator-lock.d.ts.map +1 -0
  54. package/dist/src/runner/mission-coordinator-lock.js +170 -0
  55. package/dist/src/runner/mission-coordinator-lock.js.map +1 -0
  56. package/dist/src/runner/mission-deployment.d.ts +21 -0
  57. package/dist/src/runner/mission-deployment.d.ts.map +1 -0
  58. package/dist/src/runner/mission-deployment.js +108 -0
  59. package/dist/src/runner/mission-deployment.js.map +1 -0
  60. package/dist/src/runner/mission-evaluation.d.ts +61 -0
  61. package/dist/src/runner/mission-evaluation.d.ts.map +1 -0
  62. package/dist/src/runner/mission-evaluation.js +183 -0
  63. package/dist/src/runner/mission-evaluation.js.map +1 -0
  64. package/dist/src/runner/mission-executor-probe.d.ts +10 -0
  65. package/dist/src/runner/mission-executor-probe.d.ts.map +1 -0
  66. package/dist/src/runner/mission-executor-probe.js +180 -0
  67. package/dist/src/runner/mission-executor-probe.js.map +1 -0
  68. package/dist/src/runner/mission-git-contracts.d.ts +75 -0
  69. package/dist/src/runner/mission-git-contracts.d.ts.map +1 -0
  70. package/dist/src/runner/mission-git-contracts.js +201 -0
  71. package/dist/src/runner/mission-git-contracts.js.map +1 -0
  72. package/dist/src/runner/mission-git-runtime-owner-ref.d.ts +13 -0
  73. package/dist/src/runner/mission-git-runtime-owner-ref.d.ts.map +1 -0
  74. package/dist/src/runner/mission-git-runtime-owner-ref.js +111 -0
  75. package/dist/src/runner/mission-git-runtime-owner-ref.js.map +1 -0
  76. package/dist/src/runner/mission-git-transaction.d.ts +97 -0
  77. package/dist/src/runner/mission-git-transaction.d.ts.map +1 -0
  78. package/dist/src/runner/mission-git-transaction.js +1009 -0
  79. package/dist/src/runner/mission-git-transaction.js.map +1 -0
  80. package/dist/src/runner/mission-identifiers.d.ts +31 -0
  81. package/dist/src/runner/mission-identifiers.d.ts.map +1 -0
  82. package/dist/src/runner/mission-identifiers.js +75 -0
  83. package/dist/src/runner/mission-identifiers.js.map +1 -0
  84. package/dist/src/runner/mission-input-snapshot.d.ts +21 -0
  85. package/dist/src/runner/mission-input-snapshot.d.ts.map +1 -0
  86. package/dist/src/runner/mission-input-snapshot.js +63 -0
  87. package/dist/src/runner/mission-input-snapshot.js.map +1 -0
  88. package/dist/src/runner/mission-ownership.d.ts +38 -0
  89. package/dist/src/runner/mission-ownership.d.ts.map +1 -0
  90. package/dist/src/runner/mission-ownership.js +88 -0
  91. package/dist/src/runner/mission-ownership.js.map +1 -0
  92. package/dist/src/runner/mission-patch-audit.d.ts +21 -0
  93. package/dist/src/runner/mission-patch-audit.d.ts.map +1 -0
  94. package/dist/src/runner/mission-patch-audit.js +186 -0
  95. package/dist/src/runner/mission-patch-audit.js.map +1 -0
  96. package/dist/src/runner/mission-path-language.d.ts +6 -0
  97. package/dist/src/runner/mission-path-language.d.ts.map +1 -0
  98. package/dist/src/runner/mission-path-language.js +106 -0
  99. package/dist/src/runner/mission-path-language.js.map +1 -0
  100. package/dist/src/runner/mission-permit-authority.d.ts +26 -0
  101. package/dist/src/runner/mission-permit-authority.d.ts.map +1 -0
  102. package/dist/src/runner/mission-permit-authority.js +145 -0
  103. package/dist/src/runner/mission-permit-authority.js.map +1 -0
  104. package/dist/src/runner/mission-plan-parent-coordinator.d.ts +87 -0
  105. package/dist/src/runner/mission-plan-parent-coordinator.d.ts.map +1 -0
  106. package/dist/src/runner/mission-plan-parent-coordinator.js +441 -0
  107. package/dist/src/runner/mission-plan-parent-coordinator.js.map +1 -0
  108. package/dist/src/runner/mission-plan-parent.d.ts +156 -0
  109. package/dist/src/runner/mission-plan-parent.d.ts.map +1 -0
  110. package/dist/src/runner/mission-plan-parent.js +589 -0
  111. package/dist/src/runner/mission-plan-parent.js.map +1 -0
  112. package/dist/src/runner/mission-process-executor.d.ts +25 -0
  113. package/dist/src/runner/mission-process-executor.d.ts.map +1 -0
  114. package/dist/src/runner/mission-process-executor.js +182 -0
  115. package/dist/src/runner/mission-process-executor.js.map +1 -0
  116. package/dist/src/runner/mission-publication-git.d.ts +21 -0
  117. package/dist/src/runner/mission-publication-git.d.ts.map +1 -0
  118. package/dist/src/runner/mission-publication-git.js +61 -0
  119. package/dist/src/runner/mission-publication-git.js.map +1 -0
  120. package/dist/src/runner/mission-publication.d.ts +192 -0
  121. package/dist/src/runner/mission-publication.d.ts.map +1 -0
  122. package/dist/src/runner/mission-publication.js +1001 -0
  123. package/dist/src/runner/mission-publication.js.map +1 -0
  124. package/dist/src/runner/mission-quarantine-patch-executor.d.ts +29 -0
  125. package/dist/src/runner/mission-quarantine-patch-executor.d.ts.map +1 -0
  126. package/dist/src/runner/mission-quarantine-patch-executor.js +121 -0
  127. package/dist/src/runner/mission-quarantine-patch-executor.js.map +1 -0
  128. package/dist/src/runner/mission-repository-executor.d.ts +54 -0
  129. package/dist/src/runner/mission-repository-executor.d.ts.map +1 -0
  130. package/dist/src/runner/mission-repository-executor.js +192 -0
  131. package/dist/src/runner/mission-repository-executor.js.map +1 -0
  132. package/dist/src/runner/mission-repository-observer.d.ts +8 -0
  133. package/dist/src/runner/mission-repository-observer.d.ts.map +1 -0
  134. package/dist/src/runner/mission-repository-observer.js +24 -0
  135. package/dist/src/runner/mission-repository-observer.js.map +1 -0
  136. package/dist/src/runner/mission-reservations.d.ts +15 -0
  137. package/dist/src/runner/mission-reservations.d.ts.map +1 -0
  138. package/dist/src/runner/mission-reservations.js +116 -0
  139. package/dist/src/runner/mission-reservations.js.map +1 -0
  140. package/dist/src/runner/mission-resolution-loop.d.ts +172 -0
  141. package/dist/src/runner/mission-resolution-loop.d.ts.map +1 -0
  142. package/dist/src/runner/mission-resolution-loop.js +318 -0
  143. package/dist/src/runner/mission-resolution-loop.js.map +1 -0
  144. package/dist/src/runner/mission-runtime-owner.d.ts +36 -0
  145. package/dist/src/runner/mission-runtime-owner.d.ts.map +1 -0
  146. package/dist/src/runner/mission-runtime-owner.js +174 -0
  147. package/dist/src/runner/mission-runtime-owner.js.map +1 -0
  148. package/dist/src/runner/mission-safe-executor.d.ts +96 -0
  149. package/dist/src/runner/mission-safe-executor.d.ts.map +1 -0
  150. package/dist/src/runner/mission-safe-executor.js +288 -0
  151. package/dist/src/runner/mission-safe-executor.js.map +1 -0
  152. package/dist/src/runner/mission-sandbox.d.ts +16 -0
  153. package/dist/src/runner/mission-sandbox.d.ts.map +1 -0
  154. package/dist/src/runner/mission-sandbox.js +91 -0
  155. package/dist/src/runner/mission-sandbox.js.map +1 -0
  156. package/dist/src/runner/mission-scheduler.d.ts +57 -0
  157. package/dist/src/runner/mission-scheduler.d.ts.map +1 -0
  158. package/dist/src/runner/mission-scheduler.js +205 -0
  159. package/dist/src/runner/mission-scheduler.js.map +1 -0
  160. package/dist/src/runner/mission-scope-expansion.d.ts +47 -0
  161. package/dist/src/runner/mission-scope-expansion.d.ts.map +1 -0
  162. package/dist/src/runner/mission-scope-expansion.js +147 -0
  163. package/dist/src/runner/mission-scope-expansion.js.map +1 -0
  164. package/dist/src/runner/mission-state-machine.d.ts +118 -0
  165. package/dist/src/runner/mission-state-machine.d.ts.map +1 -0
  166. package/dist/src/runner/mission-state-machine.js +316 -0
  167. package/dist/src/runner/mission-state-machine.js.map +1 -0
  168. package/dist/src/runner/mission-state-store.d.ts +70 -0
  169. package/dist/src/runner/mission-state-store.d.ts.map +1 -0
  170. package/dist/src/runner/mission-state-store.js +916 -0
  171. package/dist/src/runner/mission-state-store.js.map +1 -0
  172. package/dist/src/runner/rework-policy.d.ts +2 -1
  173. package/dist/src/runner/rework-policy.d.ts.map +1 -1
  174. package/dist/src/runner/rework-policy.js +3 -0
  175. package/dist/src/runner/rework-policy.js.map +1 -1
  176. package/dist/src/setup/project-config.d.ts.map +1 -1
  177. package/dist/src/setup/project-config.js +5 -0
  178. package/dist/src/setup/project-config.js.map +1 -1
  179. package/docs/deep-dive.md +25 -16
  180. package/package.json +1 -1
@@ -0,0 +1,25 @@
1
+ export interface MissionProcessInput {
2
+ file: string;
3
+ args: string[];
4
+ cwd?: string;
5
+ timeoutMs: number;
6
+ sourceEnv: NodeJS.ProcessEnv;
7
+ allowedEnvKeys: string[];
8
+ stdin?: string;
9
+ maxOutputBytes?: number;
10
+ signal?: AbortSignal;
11
+ onSpawn?: (pid: number | undefined) => void;
12
+ }
13
+ export interface MissionProcessResult {
14
+ stdout: string;
15
+ stderr: string;
16
+ exitCode: number;
17
+ timedOut: boolean;
18
+ termination: 'exited' | 'timeout' | 'output-limit' | 'stdin-error' | 'cancelled';
19
+ }
20
+ export interface MissionProcessDependencies {
21
+ terminateProcessGroup?: (pid: number | undefined, signal: NodeJS.Signals) => void;
22
+ terminateChild?: (signal: NodeJS.Signals) => void;
23
+ }
24
+ export declare function runMissionProcess(input: MissionProcessInput, dependencies?: MissionProcessDependencies): Promise<MissionProcessResult>;
25
+ //# sourceMappingURL=mission-process-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-process-executor.d.ts","sourceRoot":"","sources":["../../../src/runner/mission-process-executor.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,QAAQ,GAAG,SAAS,GAAG,cAAc,GAAG,aAAa,GAAG,WAAW,CAAC;CAClF;AAED,MAAM,WAAW,0BAA0B;IACzC,qBAAqB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;IAClF,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;CACnD;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,mBAAmB,EAC1B,YAAY,GAAE,0BAA+B,GAC5C,OAAO,CAAC,oBAAoB,CAAC,CAoJ/B"}
@@ -0,0 +1,182 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { scrubMissionExecutorEnv } from './mission-capability-kernel.js';
3
+ export function runMissionProcess(input, dependencies = {}) {
4
+ if (!Number.isSafeInteger(input.timeoutMs) || input.timeoutMs <= 0) {
5
+ throw new Error('Mission process timeoutMs must be a positive integer.');
6
+ }
7
+ if (input.file.trim().length === 0 || input.args.some((arg) => arg.includes('\0'))) {
8
+ throw new Error('Mission process requires a valid argv command.');
9
+ }
10
+ const maxOutputBytes = input.maxOutputBytes ?? 4 * 1024 * 1024;
11
+ if (!Number.isSafeInteger(maxOutputBytes) || maxOutputBytes <= 0) {
12
+ throw new Error('Mission process maxOutputBytes must be a positive integer.');
13
+ }
14
+ if (input.signal?.aborted) {
15
+ return Promise.resolve({
16
+ stdout: '',
17
+ stderr: '',
18
+ exitCode: 130,
19
+ timedOut: false,
20
+ termination: 'cancelled',
21
+ });
22
+ }
23
+ return new Promise((resolve, reject) => {
24
+ let stdout = '';
25
+ let stderr = '';
26
+ let termination;
27
+ let outputBytes = 0;
28
+ let settled = false;
29
+ let terminationError;
30
+ let inputError;
31
+ let closeExitCode;
32
+ let escalationComplete = false;
33
+ let settlementTimeout;
34
+ const child = spawn(input.file, input.args, {
35
+ cwd: input.cwd,
36
+ env: scrubMissionExecutorEnv(input.sourceEnv, input.allowedEnvKeys),
37
+ shell: false,
38
+ detached: process.platform !== 'win32',
39
+ stdio: ['pipe', 'pipe', 'pipe'],
40
+ });
41
+ const onAbort = () => beginTermination('cancelled');
42
+ input.signal?.addEventListener('abort', onAbort, { once: true });
43
+ child.stdout.on('data', (chunk) => { collectOutput('stdout', chunk); });
44
+ child.stderr.on('data', (chunk) => { collectOutput('stderr', chunk); });
45
+ const timeout = setTimeout(() => {
46
+ beginTermination('timeout');
47
+ }, input.timeoutMs);
48
+ timeout.unref();
49
+ try {
50
+ input.onSpawn?.(child.pid);
51
+ }
52
+ catch (error) {
53
+ inputError = error instanceof Error ? error : new Error(String(error));
54
+ beginTermination('stdin-error');
55
+ }
56
+ if (input.signal?.aborted)
57
+ beginTermination('cancelled');
58
+ function beginTermination(reason) {
59
+ if (termination || settled)
60
+ return;
61
+ termination = reason;
62
+ clearTimeout(timeout);
63
+ requestTermination(child.pid, 'SIGTERM');
64
+ setTimeout(() => {
65
+ if (settled)
66
+ return;
67
+ requestTermination(child.pid, 'SIGKILL');
68
+ escalationComplete = true;
69
+ if (closeExitCode !== undefined) {
70
+ finishClose(closeExitCode);
71
+ }
72
+ else {
73
+ settlementTimeout = setTimeout(() => {
74
+ if (settled)
75
+ return;
76
+ settled = true;
77
+ input.signal?.removeEventListener('abort', onAbort);
78
+ reject(terminationError ?? inputError
79
+ ?? new Error('Mission process did not terminate after SIGKILL reconciliation.'));
80
+ }, 500);
81
+ }
82
+ }, 250);
83
+ }
84
+ child.on('error', (error) => {
85
+ if (settled)
86
+ return;
87
+ settled = true;
88
+ clearTimeout(timeout);
89
+ input.signal?.removeEventListener('abort', onAbort);
90
+ if (settlementTimeout)
91
+ clearTimeout(settlementTimeout);
92
+ reject(error);
93
+ });
94
+ child.on('close', (exitCode) => {
95
+ if (settled)
96
+ return;
97
+ clearTimeout(timeout);
98
+ closeExitCode = exitCode;
99
+ if (termination && !escalationComplete)
100
+ return;
101
+ finishClose(exitCode);
102
+ });
103
+ child.stdin.on('error', (error) => {
104
+ if (settled)
105
+ return;
106
+ inputError ??= new Error(`Mission process stdin failed: ${error.message}`, { cause: error });
107
+ beginTermination('stdin-error');
108
+ });
109
+ child.stdin.end(input.stdin);
110
+ function finishClose(exitCode) {
111
+ if (settled)
112
+ return;
113
+ settled = true;
114
+ input.signal?.removeEventListener('abort', onAbort);
115
+ if (settlementTimeout)
116
+ clearTimeout(settlementTimeout);
117
+ if (terminationError) {
118
+ reject(terminationError);
119
+ return;
120
+ }
121
+ if (inputError) {
122
+ reject(inputError);
123
+ return;
124
+ }
125
+ resolve({
126
+ stdout,
127
+ stderr,
128
+ exitCode: termination === 'timeout' ? 124
129
+ : termination === 'output-limit' ? 125
130
+ : termination === 'cancelled' ? 130 : (exitCode ?? 1),
131
+ timedOut: termination === 'timeout',
132
+ termination: termination ?? 'exited',
133
+ });
134
+ }
135
+ function collectOutput(target, chunk) {
136
+ const remaining = Math.max(0, maxOutputBytes - outputBytes);
137
+ const accepted = chunk.subarray(0, remaining);
138
+ if (accepted.byteLength > 0) {
139
+ if (target === 'stdout')
140
+ stdout += accepted.toString('utf8');
141
+ else
142
+ stderr += accepted.toString('utf8');
143
+ outputBytes += accepted.byteLength;
144
+ }
145
+ if (chunk.byteLength > remaining)
146
+ beginTermination('output-limit');
147
+ }
148
+ function requestTermination(pid, signal) {
149
+ try {
150
+ (dependencies.terminateProcessGroup ?? terminateProcessGroup)(pid, signal);
151
+ }
152
+ catch (error) {
153
+ const message = error instanceof Error ? error.message : String(error);
154
+ terminationError ??= new Error(`Mission process failed to terminate process group: ${message}`);
155
+ try {
156
+ (dependencies.terminateChild ?? ((childSignal) => { child.kill(childSignal); }))(signal);
157
+ }
158
+ catch {
159
+ // The stored termination error is reported when the child closes.
160
+ }
161
+ }
162
+ }
163
+ });
164
+ }
165
+ function terminateProcessGroup(pid, signal) {
166
+ if (pid === undefined)
167
+ return;
168
+ try {
169
+ if (process.platform === 'win32') {
170
+ process.kill(pid, signal);
171
+ }
172
+ else {
173
+ process.kill(-pid, signal);
174
+ }
175
+ }
176
+ catch (error) {
177
+ if (!(error instanceof Error && 'code' in error && error.code === 'ESRCH')) {
178
+ throw error;
179
+ }
180
+ }
181
+ }
182
+ //# sourceMappingURL=mission-process-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-process-executor.js","sourceRoot":"","sources":["../../../src/runner/mission-process-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AA4BzE,MAAM,UAAU,iBAAiB,CAC/B,KAA0B,EAC1B,eAA2C,EAAE;IAE7C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,GAAG;YACb,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,WAAW;SACzB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,WAAiF,CAAC;QACtF,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,gBAAmC,CAAC;QACxC,IAAI,UAA6B,CAAC;QAClC,IAAI,aAAwC,CAAC;QAC7C,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,IAAI,iBAA6C,CAAC;QAClD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;YAC1C,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,GAAG,EAAE,uBAAuB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC;YACnE,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;YACtC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACpD,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACpB,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACvE,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO;YAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAEzD,SAAS,gBAAgB,CAAC,MAAgE;YACxF,IAAI,WAAW,IAAI,OAAO;gBAAE,OAAO;YACnC,WAAW,GAAG,MAAM,CAAC;YACrB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACzC,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,OAAO;oBAAE,OAAO;gBACpB,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBACzC,kBAAkB,GAAG,IAAI,CAAC;gBAC1B,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;oBAChC,WAAW,CAAC,aAAa,CAAC,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE;wBAClC,IAAI,OAAO;4BAAE,OAAO;wBACpB,OAAO,GAAG,IAAI,CAAC;wBACf,KAAK,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBACpD,MAAM,CAAC,gBAAgB,IAAI,UAAU;+BAChC,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC,CAAC;oBACrF,CAAC,EAAE,GAAG,CAAC,CAAC;gBACV,CAAC;YACH,CAAC,EAAE,GAAG,CAAC,CAAC;QACV,CAAC;QACD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,KAAK,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,iBAAiB;gBAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC7B,IAAI,OAAO;gBAAE,OAAO;YACpB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,aAAa,GAAG,QAAQ,CAAC;YACzB,IAAI,WAAW,IAAI,CAAC,kBAAkB;gBAAE,OAAO;YAC/C,WAAW,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAChC,IAAI,OAAO;gBAAE,OAAO;YACpB,UAAU,KAAK,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7F,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE7B,SAAS,WAAW,CAAC,QAAuB;YAC1C,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,iBAAiB;gBAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC;YACvD,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,CAAC,gBAAgB,CAAC,CAAC;gBACzB,OAAO;YACT,CAAC;YACD,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,CAAC,UAAU,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,OAAO,CAAC;gBACN,MAAM;gBACN,MAAM;gBACN,QAAQ,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG;oBACvC,CAAC,CAAC,WAAW,KAAK,cAAc,CAAC,CAAC,CAAC,GAAG;wBACpC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;gBACzD,QAAQ,EAAE,WAAW,KAAK,SAAS;gBACnC,WAAW,EAAE,WAAW,IAAI,QAAQ;aACrC,CAAC,CAAC;QACL,CAAC;QAED,SAAS,aAAa,CAAC,MAA2B,EAAE,KAAa;YAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,WAAW,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC9C,IAAI,QAAQ,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC5B,IAAI,MAAM,KAAK,QAAQ;oBAAE,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;;oBACxD,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzC,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC;YACrC,CAAC;YACD,IAAI,KAAK,CAAC,UAAU,GAAG,SAAS;gBAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACrE,CAAC;QAED,SAAS,kBAAkB,CAAC,GAAuB,EAAE,MAAsB;YACzE,IAAI,CAAC;gBACH,CAAC,YAAY,CAAC,qBAAqB,IAAI,qBAAqB,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC7E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,gBAAgB,KAAK,IAAI,KAAK,CAAC,sDAAsD,OAAO,EAAE,CAAC,CAAC;gBAChG,IAAI,CAAC;oBACH,CAAC,YAAY,CAAC,cAAc,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC3F,CAAC;gBAAC,MAAM,CAAC;oBACP,kEAAkE;gBACpE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAuB,EAAE,MAAsB;IAC5E,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO;IAC9B,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;YAC3E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { ProcessExecutor } from '../process/command.js';
2
+ import type { MissionPublicationBranchAdapter } from './mission-publication.js';
3
+ export declare class GitMissionPublicationBranchAdapter implements MissionPublicationBranchAdapter {
4
+ private readonly targetRoot;
5
+ private readonly execute;
6
+ private readonly remote;
7
+ constructor(targetRoot: string, execute?: ProcessExecutor, remote?: string);
8
+ observe(branch: string): Promise<{
9
+ kind: 'absent';
10
+ } | {
11
+ kind: 'present';
12
+ commitSha: string;
13
+ }>;
14
+ observeBase(branch: string): Promise<string | undefined>;
15
+ push(input: {
16
+ branch: string;
17
+ candidateCommit: string;
18
+ }): Promise<void>;
19
+ private observeRef;
20
+ }
21
+ //# sourceMappingURL=mission-publication-git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-publication-git.d.ts","sourceRoot":"","sources":["../../../src/runner/mission-publication-git.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAC;AAEhF,qBAAa,kCAAmC,YAAW,+BAA+B;IAEtF,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,eAAwC,EACjD,MAAM,SAAW;IAGvB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAC3C;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAC5D;IAKM,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIlD,IAAI,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAYtE,UAAU;CAezB"}
@@ -0,0 +1,61 @@
1
+ import { defaultProcessExecutor } from '../process/command.js';
2
+ export class GitMissionPublicationBranchAdapter {
3
+ targetRoot;
4
+ execute;
5
+ remote;
6
+ constructor(targetRoot, execute = defaultProcessExecutor, remote = 'origin') {
7
+ this.targetRoot = targetRoot;
8
+ this.execute = execute;
9
+ this.remote = remote;
10
+ }
11
+ async observe(branch) {
12
+ const commitSha = await this.observeRef(branch);
13
+ return commitSha === undefined ? { kind: 'absent' } : { kind: 'present', commitSha };
14
+ }
15
+ observeBase(branch) {
16
+ return this.observeRef(branch);
17
+ }
18
+ async push(input) {
19
+ const ref = branchRef(input.branch);
20
+ objectId(input.candidateCommit, 'candidateCommit');
21
+ const result = await this.execute('git', [
22
+ 'push', '--no-verify', `--force-with-lease=${ref}:`, this.remote,
23
+ `${input.candidateCommit}:${ref}`,
24
+ ], { cwd: this.targetRoot });
25
+ if (result.exitCode !== 0) {
26
+ throw new Error(`Mission publication push failed: ${result.stderr.trim()}`);
27
+ }
28
+ }
29
+ async observeRef(branch) {
30
+ const ref = branchRef(branch);
31
+ const result = await this.execute('git', ['ls-remote', '--refs', this.remote, ref], {
32
+ cwd: this.targetRoot,
33
+ });
34
+ if (result.exitCode !== 0) {
35
+ throw new Error(`Mission publication ref observation failed: ${result.stderr.trim()}`);
36
+ }
37
+ const lines = result.stdout.trim().length === 0 ? [] : result.stdout.trim().split(/\r?\n/u);
38
+ if (lines.length === 0)
39
+ return undefined;
40
+ if (lines.length !== 1)
41
+ throw new Error(`Mission publication ref ${ref} is ambiguous.`);
42
+ const match = /^([a-f0-9]{40}(?:[a-f0-9]{24})?)\s+(.+)$/u.exec(lines[0] ?? '');
43
+ if (!match || match[2] !== ref)
44
+ throw new Error(`Mission publication ref ${ref} response is malformed.`);
45
+ return match[1];
46
+ }
47
+ }
48
+ function branchRef(branch) {
49
+ if (branch.length === 0 || branch.startsWith('-') || branch.startsWith('/') || branch.endsWith('/')
50
+ || branch.endsWith('.') || branch.includes('..') || branch.includes('//') || branch.includes('@{')
51
+ || /[\s~^:?*[\\]/u.test(branch)) {
52
+ throw new Error(`Mission publication branch is invalid: ${branch}.`);
53
+ }
54
+ return `refs/heads/${branch}`;
55
+ }
56
+ function objectId(value, field) {
57
+ if (!/^[a-f0-9]{40}(?:[a-f0-9]{24})?$/u.test(value)) {
58
+ throw new Error(`Mission publication ${field} must be a full Git object ID.`);
59
+ }
60
+ }
61
+ //# sourceMappingURL=mission-publication-git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-publication-git.js","sourceRoot":"","sources":["../../../src/runner/mission-publication-git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ import type { GitHubIssueAdapter } from '../github/issues.js';
2
+ import type { GitHubPullRequestAdapter, GitHubPullRequestDetails } from '../github/pull-requests.js';
3
+ import type { MissionStateSnapshot, MissionStateStore } from './mission-state-store.js';
4
+ export declare const publicationStates: readonly ["prepared", "push-intent", "pushed", "pr-create-intent", "pr-confirmed", "labels-intent", "labels-confirmed", "comment-intent", "resumable", "review-ready", "external-input-required", "safety-stop", "cancelled"];
5
+ export type MissionPublicationState = (typeof publicationStates)[number];
6
+ export type MissionPublicationPullRequest = GitHubPullRequestDetails;
7
+ export type MissionPublicationMutationKind = 'push' | 'create-pr' | 'add-labels' | 'remove-labels' | 'post-comment';
8
+ export interface MissionPublicationMutationAttempt {
9
+ kind: MissionPublicationMutationKind;
10
+ actionKey: string;
11
+ stage: 'prepared' | 'dispatched';
12
+ observationAttempts: number;
13
+ labels?: string[];
14
+ }
15
+ export interface MissionPublicationFenceInput {
16
+ publicationId: string;
17
+ ownerId: string;
18
+ repository: string;
19
+ fencingEpoch: number;
20
+ actionKey: string;
21
+ }
22
+ export interface MissionPublicationRecord {
23
+ id: string;
24
+ revision: number;
25
+ state: MissionPublicationState;
26
+ ownerId: string;
27
+ repository: string;
28
+ issueNumber: number;
29
+ fencingEpoch: number;
30
+ candidateCommit: string;
31
+ candidateTree: string;
32
+ baseSha: string;
33
+ validationSnapshot: string;
34
+ validationReceiptIds: string[];
35
+ configHash: string;
36
+ branch: string;
37
+ baseBranch: string;
38
+ marker: string;
39
+ title: string;
40
+ titleHash: string;
41
+ body: string;
42
+ bodyHash: string;
43
+ managedLabels: string[];
44
+ desiredLabels: string[];
45
+ terminalComment: string;
46
+ commentHash: string;
47
+ baseObservedSha?: string;
48
+ warnings: string[];
49
+ pullRequest?: MissionPublicationPullRequest;
50
+ labelMutation?: {
51
+ add: string[];
52
+ remove: string[];
53
+ preserve: string[];
54
+ };
55
+ mutationAttempt?: MissionPublicationMutationAttempt;
56
+ resumeTarget?: Exclude<MissionPublicationState, 'resumable'>;
57
+ nextEligibleAt?: string;
58
+ actionKey?: string;
59
+ }
60
+ export interface MissionPublicationBranchAdapter {
61
+ observe(branch: string): Promise<{
62
+ kind: 'absent';
63
+ } | {
64
+ kind: 'present';
65
+ commitSha: string;
66
+ }>;
67
+ push(input: {
68
+ branch: string;
69
+ candidateCommit: string;
70
+ }): Promise<void>;
71
+ observeBase(branch: string): Promise<string | undefined>;
72
+ }
73
+ export type MissionPublicationPullRequestAdapter = Pick<GitHubPullRequestAdapter, 'listAllByHeadBranch' | 'createDraftPullRequest'>;
74
+ export type MissionPublicationIssueAdapter = Pick<GitHubIssueAdapter, 'getLabels' | 'addLabels' | 'removeLabels' | 'listAllComments' | 'postComment'>;
75
+ export interface MissionPublicationSagaDependencies {
76
+ branches: MissionPublicationBranchAdapter;
77
+ pullRequests: MissionPublicationPullRequestAdapter;
78
+ issues: MissionPublicationIssueAdapter;
79
+ assertMutationFence(input: MissionPublicationFenceInput): Promise<void>;
80
+ now?(): string;
81
+ retryDelayMs?: number;
82
+ classifyRemoteError?(error: unknown): 'transient' | 'authority';
83
+ }
84
+ export type MissionPublicationEvent = {
85
+ type: 'branch-observed';
86
+ observation: {
87
+ kind: 'absent';
88
+ } | {
89
+ kind: 'expected';
90
+ commitSha: string;
91
+ } | {
92
+ kind: 'other';
93
+ commitSha: string;
94
+ };
95
+ } | {
96
+ type: 'base-observed';
97
+ observation: {
98
+ kind: 'absent';
99
+ } | {
100
+ kind: 'present';
101
+ commitSha: string;
102
+ };
103
+ } | {
104
+ type: 'pull-requests-observed';
105
+ pullRequests: MissionPublicationPullRequest[];
106
+ } | {
107
+ type: 'labels-observed';
108
+ labels: string[];
109
+ } | {
110
+ type: 'comments-observed';
111
+ comments: Array<{
112
+ id: string;
113
+ body: string;
114
+ }>;
115
+ } | {
116
+ type: 'mutation-attempted';
117
+ attempt: Omit<MissionPublicationMutationAttempt, 'stage' | 'observationAttempts'>;
118
+ } | {
119
+ type: 'mutation-dispatched';
120
+ actionKey: string;
121
+ } | {
122
+ type: 'remote-safety-conflict';
123
+ } | {
124
+ type: 'remote-external-change';
125
+ } | {
126
+ type: 'transient-failure';
127
+ nextEligibleAt: string;
128
+ actionKey: string;
129
+ postconditionObserved?: boolean;
130
+ } | {
131
+ type: 'resume-eligible';
132
+ now: string;
133
+ } | {
134
+ type: 'authority-missing';
135
+ } | {
136
+ type: 'cancel-requested';
137
+ };
138
+ export declare class MissionPublicationCoordinator {
139
+ private readonly store;
140
+ constructor(store: MissionStateStore);
141
+ prepare(input: {
142
+ expectedGeneration: number;
143
+ missionId: string;
144
+ expectedRevision: number;
145
+ fencingEpoch: number;
146
+ publication: MissionPublicationRecord;
147
+ }): Promise<MissionStateSnapshot>;
148
+ }
149
+ export declare class MissionPublicationSaga {
150
+ private readonly store;
151
+ private readonly adapters;
152
+ constructor(store: MissionStateStore, adapters: MissionPublicationSagaDependencies);
153
+ run(publicationId: string): Promise<MissionStateSnapshot>;
154
+ defer(input: {
155
+ publicationId: string;
156
+ nextEligibleAt: string;
157
+ actionKey: string;
158
+ }): Promise<MissionStateSnapshot>;
159
+ resume(input: {
160
+ publicationId: string;
161
+ now: string;
162
+ }): Promise<MissionStateSnapshot>;
163
+ cancel(publicationId: string): Promise<MissionStateSnapshot>;
164
+ private runFromBranch;
165
+ reconcileBranch(publicationId: string): Promise<MissionStateSnapshot>;
166
+ private reconcileBranchOnce;
167
+ reconcilePullRequest(publicationId: string): Promise<MissionStateSnapshot>;
168
+ private reconcilePullRequestOnce;
169
+ private verifyBranchAndBase;
170
+ private verifyConfirmedRemote;
171
+ reconcileLabels(publicationId: string): Promise<MissionStateSnapshot>;
172
+ private reconcileLabelsOnce;
173
+ reconcileComment(publicationId: string): Promise<MissionStateSnapshot>;
174
+ private reconcileCommentOnce;
175
+ private withRecovery;
176
+ private remote;
177
+ private fence;
178
+ private load;
179
+ private persist;
180
+ }
181
+ export declare function createMissionPublication(input: Omit<MissionPublicationRecord, 'id' | 'revision' | 'state' | 'titleHash' | 'bodyHash' | 'commentHash' | 'pullRequest' | 'labelMutation' | 'mutationAttempt' | 'resumeTarget' | 'nextEligibleAt' | 'actionKey' | 'baseObservedSha' | 'warnings'>): MissionPublicationRecord;
182
+ export declare function publicationScheduleKey(publicationId: string): string;
183
+ export declare function listEligiblePublications(snapshot: MissionStateSnapshot, now: string, limit?: number): Array<{
184
+ publicationId: string;
185
+ revision: number;
186
+ nextEligibleAt: string;
187
+ actionKey: string;
188
+ }>;
189
+ export declare function hasScheduledPublicationRecovery(record: MissionPublicationRecord): boolean;
190
+ export declare function assertMissionPublicationRecord(value: unknown, path?: string): asserts value is MissionPublicationRecord;
191
+ export declare function transitionMissionPublication(record: MissionPublicationRecord, event: MissionPublicationEvent): MissionPublicationRecord;
192
+ //# sourceMappingURL=mission-publication.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-publication.d.ts","sourceRoot":"","sources":["../../../src/runner/mission-publication.ts"],"names":[],"mappings":"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"}