codex-orchestrator 0.1.47 → 0.1.48
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.
- package/CHANGELOG.md +20 -0
- package/dist/src/config/schema.d.ts +5 -1
- package/dist/src/config/schema.d.ts.map +1 -1
- package/dist/src/config/schema.js +16 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/runner/command-utils.d.ts.map +1 -1
- package/dist/src/runner/command-utils.js +1 -0
- package/dist/src/runner/command-utils.js.map +1 -1
- package/dist/src/runner/local-execution-session.d.ts.map +1 -1
- package/dist/src/runner/local-execution-session.js +5 -2
- package/dist/src/runner/local-execution-session.js.map +1 -1
- package/dist/src/runner/mission-activation.d.ts +29 -0
- package/dist/src/runner/mission-activation.d.ts.map +1 -0
- package/dist/src/runner/mission-activation.js +54 -0
- package/dist/src/runner/mission-activation.js.map +1 -0
- package/dist/src/runner/mission-agent-broker.d.ts +53 -0
- package/dist/src/runner/mission-agent-broker.d.ts.map +1 -0
- package/dist/src/runner/mission-agent-broker.js +182 -0
- package/dist/src/runner/mission-agent-broker.js.map +1 -0
- package/dist/src/runner/mission-cancellation.d.ts +77 -0
- package/dist/src/runner/mission-cancellation.d.ts.map +1 -0
- package/dist/src/runner/mission-cancellation.js +180 -0
- package/dist/src/runner/mission-cancellation.js.map +1 -0
- package/dist/src/runner/mission-canonical-path.d.ts +34 -0
- package/dist/src/runner/mission-canonical-path.d.ts.map +1 -0
- package/dist/src/runner/mission-canonical-path.js +121 -0
- package/dist/src/runner/mission-canonical-path.js.map +1 -0
- package/dist/src/runner/mission-capability-kernel.d.ts +34 -0
- package/dist/src/runner/mission-capability-kernel.d.ts.map +1 -0
- package/dist/src/runner/mission-capability-kernel.js +158 -0
- package/dist/src/runner/mission-capability-kernel.js.map +1 -0
- package/dist/src/runner/mission-check-policy.d.ts +17 -0
- package/dist/src/runner/mission-check-policy.d.ts.map +1 -0
- package/dist/src/runner/mission-check-policy.js +31 -0
- package/dist/src/runner/mission-check-policy.js.map +1 -0
- package/dist/src/runner/mission-coordinator-lock.d.ts +16 -0
- package/dist/src/runner/mission-coordinator-lock.d.ts.map +1 -0
- package/dist/src/runner/mission-coordinator-lock.js +170 -0
- package/dist/src/runner/mission-coordinator-lock.js.map +1 -0
- package/dist/src/runner/mission-deployment.d.ts +21 -0
- package/dist/src/runner/mission-deployment.d.ts.map +1 -0
- package/dist/src/runner/mission-deployment.js +108 -0
- package/dist/src/runner/mission-deployment.js.map +1 -0
- package/dist/src/runner/mission-evaluation.d.ts +61 -0
- package/dist/src/runner/mission-evaluation.d.ts.map +1 -0
- package/dist/src/runner/mission-evaluation.js +183 -0
- package/dist/src/runner/mission-evaluation.js.map +1 -0
- package/dist/src/runner/mission-executor-probe.d.ts +10 -0
- package/dist/src/runner/mission-executor-probe.d.ts.map +1 -0
- package/dist/src/runner/mission-executor-probe.js +180 -0
- package/dist/src/runner/mission-executor-probe.js.map +1 -0
- package/dist/src/runner/mission-git-contracts.d.ts +75 -0
- package/dist/src/runner/mission-git-contracts.d.ts.map +1 -0
- package/dist/src/runner/mission-git-contracts.js +201 -0
- package/dist/src/runner/mission-git-contracts.js.map +1 -0
- package/dist/src/runner/mission-git-runtime-owner-ref.d.ts +13 -0
- package/dist/src/runner/mission-git-runtime-owner-ref.d.ts.map +1 -0
- package/dist/src/runner/mission-git-runtime-owner-ref.js +111 -0
- package/dist/src/runner/mission-git-runtime-owner-ref.js.map +1 -0
- package/dist/src/runner/mission-git-transaction.d.ts +97 -0
- package/dist/src/runner/mission-git-transaction.d.ts.map +1 -0
- package/dist/src/runner/mission-git-transaction.js +1009 -0
- package/dist/src/runner/mission-git-transaction.js.map +1 -0
- package/dist/src/runner/mission-identifiers.d.ts +31 -0
- package/dist/src/runner/mission-identifiers.d.ts.map +1 -0
- package/dist/src/runner/mission-identifiers.js +75 -0
- package/dist/src/runner/mission-identifiers.js.map +1 -0
- package/dist/src/runner/mission-input-snapshot.d.ts +21 -0
- package/dist/src/runner/mission-input-snapshot.d.ts.map +1 -0
- package/dist/src/runner/mission-input-snapshot.js +63 -0
- package/dist/src/runner/mission-input-snapshot.js.map +1 -0
- package/dist/src/runner/mission-ownership.d.ts +38 -0
- package/dist/src/runner/mission-ownership.d.ts.map +1 -0
- package/dist/src/runner/mission-ownership.js +88 -0
- package/dist/src/runner/mission-ownership.js.map +1 -0
- package/dist/src/runner/mission-patch-audit.d.ts +21 -0
- package/dist/src/runner/mission-patch-audit.d.ts.map +1 -0
- package/dist/src/runner/mission-patch-audit.js +186 -0
- package/dist/src/runner/mission-patch-audit.js.map +1 -0
- package/dist/src/runner/mission-path-language.d.ts +6 -0
- package/dist/src/runner/mission-path-language.d.ts.map +1 -0
- package/dist/src/runner/mission-path-language.js +106 -0
- package/dist/src/runner/mission-path-language.js.map +1 -0
- package/dist/src/runner/mission-permit-authority.d.ts +26 -0
- package/dist/src/runner/mission-permit-authority.d.ts.map +1 -0
- package/dist/src/runner/mission-permit-authority.js +145 -0
- package/dist/src/runner/mission-permit-authority.js.map +1 -0
- package/dist/src/runner/mission-plan-parent-coordinator.d.ts +87 -0
- package/dist/src/runner/mission-plan-parent-coordinator.d.ts.map +1 -0
- package/dist/src/runner/mission-plan-parent-coordinator.js +412 -0
- package/dist/src/runner/mission-plan-parent-coordinator.js.map +1 -0
- package/dist/src/runner/mission-plan-parent.d.ts +154 -0
- package/dist/src/runner/mission-plan-parent.d.ts.map +1 -0
- package/dist/src/runner/mission-plan-parent.js +583 -0
- package/dist/src/runner/mission-plan-parent.js.map +1 -0
- package/dist/src/runner/mission-process-executor.d.ts +25 -0
- package/dist/src/runner/mission-process-executor.d.ts.map +1 -0
- package/dist/src/runner/mission-process-executor.js +182 -0
- package/dist/src/runner/mission-process-executor.js.map +1 -0
- package/dist/src/runner/mission-quarantine-patch-executor.d.ts +29 -0
- package/dist/src/runner/mission-quarantine-patch-executor.d.ts.map +1 -0
- package/dist/src/runner/mission-quarantine-patch-executor.js +121 -0
- package/dist/src/runner/mission-quarantine-patch-executor.js.map +1 -0
- package/dist/src/runner/mission-repository-executor.d.ts +54 -0
- package/dist/src/runner/mission-repository-executor.d.ts.map +1 -0
- package/dist/src/runner/mission-repository-executor.js +192 -0
- package/dist/src/runner/mission-repository-executor.js.map +1 -0
- package/dist/src/runner/mission-repository-observer.d.ts +8 -0
- package/dist/src/runner/mission-repository-observer.d.ts.map +1 -0
- package/dist/src/runner/mission-repository-observer.js +24 -0
- package/dist/src/runner/mission-repository-observer.js.map +1 -0
- package/dist/src/runner/mission-reservations.d.ts +15 -0
- package/dist/src/runner/mission-reservations.d.ts.map +1 -0
- package/dist/src/runner/mission-reservations.js +116 -0
- package/dist/src/runner/mission-reservations.js.map +1 -0
- package/dist/src/runner/mission-resolution-loop.d.ts +172 -0
- package/dist/src/runner/mission-resolution-loop.d.ts.map +1 -0
- package/dist/src/runner/mission-resolution-loop.js +318 -0
- package/dist/src/runner/mission-resolution-loop.js.map +1 -0
- package/dist/src/runner/mission-runtime-owner.d.ts +36 -0
- package/dist/src/runner/mission-runtime-owner.d.ts.map +1 -0
- package/dist/src/runner/mission-runtime-owner.js +174 -0
- package/dist/src/runner/mission-runtime-owner.js.map +1 -0
- package/dist/src/runner/mission-safe-executor.d.ts +96 -0
- package/dist/src/runner/mission-safe-executor.d.ts.map +1 -0
- package/dist/src/runner/mission-safe-executor.js +288 -0
- package/dist/src/runner/mission-safe-executor.js.map +1 -0
- package/dist/src/runner/mission-sandbox.d.ts +16 -0
- package/dist/src/runner/mission-sandbox.d.ts.map +1 -0
- package/dist/src/runner/mission-sandbox.js +91 -0
- package/dist/src/runner/mission-sandbox.js.map +1 -0
- package/dist/src/runner/mission-scheduler.d.ts +57 -0
- package/dist/src/runner/mission-scheduler.d.ts.map +1 -0
- package/dist/src/runner/mission-scheduler.js +205 -0
- package/dist/src/runner/mission-scheduler.js.map +1 -0
- package/dist/src/runner/mission-scope-expansion.d.ts +47 -0
- package/dist/src/runner/mission-scope-expansion.d.ts.map +1 -0
- package/dist/src/runner/mission-scope-expansion.js +147 -0
- package/dist/src/runner/mission-scope-expansion.js.map +1 -0
- package/dist/src/runner/mission-state-machine.d.ts +118 -0
- package/dist/src/runner/mission-state-machine.d.ts.map +1 -0
- package/dist/src/runner/mission-state-machine.js +316 -0
- package/dist/src/runner/mission-state-machine.js.map +1 -0
- package/dist/src/runner/mission-state-store.d.ts +70 -0
- package/dist/src/runner/mission-state-store.d.ts.map +1 -0
- package/dist/src/runner/mission-state-store.js +856 -0
- package/dist/src/runner/mission-state-store.js.map +1 -0
- package/dist/src/runner/rework-policy.d.ts +2 -1
- package/dist/src/runner/rework-policy.d.ts.map +1 -1
- package/dist/src/runner/rework-policy.js +3 -0
- package/dist/src/runner/rework-policy.js.map +1 -1
- package/dist/src/setup/project-config.d.ts.map +1 -1
- package/dist/src/setup/project-config.js +5 -0
- package/dist/src/setup/project-config.js.map +1 -1
- package/docs/deep-dive.md +25 -16
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mission-git-contracts.d.ts","sourceRoot":"","sources":["../../../src/runner/mission-git-contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
export function createMissionApplyPermit(input) {
|
|
3
|
+
return validateMissionApplyPermit({
|
|
4
|
+
version: 1,
|
|
5
|
+
missionId: input.missionId,
|
|
6
|
+
actionKey: input.actionKey,
|
|
7
|
+
fencingEpoch: input.fencingEpoch,
|
|
8
|
+
expiresAt: input.expiresAt,
|
|
9
|
+
targetRef: input.targetRef,
|
|
10
|
+
auditReceiptSha256: input.auditReceiptSha256,
|
|
11
|
+
patchSha256: input.candidate.patchSha256,
|
|
12
|
+
expectedOldCommit: input.candidate.baseCommit,
|
|
13
|
+
expectedOldTree: input.candidate.baseTree,
|
|
14
|
+
expectedNewCommit: input.candidate.commitSha,
|
|
15
|
+
expectedNewTree: input.candidate.treeSha,
|
|
16
|
+
manifest: input.candidate.manifest,
|
|
17
|
+
commit: input.commit,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function validateMissionApplyPermit(value) {
|
|
21
|
+
const permit = object(value, 'Mission apply permit');
|
|
22
|
+
exactKeys(permit, [
|
|
23
|
+
'version', 'missionId', 'actionKey', 'fencingEpoch', 'expiresAt', 'targetRef',
|
|
24
|
+
'auditReceiptSha256', 'patchSha256', 'expectedOldCommit', 'expectedOldTree',
|
|
25
|
+
'expectedNewCommit', 'expectedNewTree', 'manifest', 'commit',
|
|
26
|
+
], 'Mission apply permit');
|
|
27
|
+
if (permit.version !== 1)
|
|
28
|
+
fail('version must be 1');
|
|
29
|
+
nonEmpty(permit.missionId, 'missionId');
|
|
30
|
+
nonEmpty(permit.actionKey, 'actionKey');
|
|
31
|
+
if (!Number.isInteger(permit.fencingEpoch) || permit.fencingEpoch <= 0)
|
|
32
|
+
fail('fencingEpoch must be positive');
|
|
33
|
+
timestamp(permit.expiresAt, 'expiresAt');
|
|
34
|
+
if (!/^refs\/(?:heads|codex-orchestrator)\/[A-Za-z0-9._\/-]+$/u.test(permit.targetRef)
|
|
35
|
+
|| permit.targetRef.includes('..') || permit.targetRef.endsWith('/') || permit.targetRef.includes('//')
|
|
36
|
+
|| permit.targetRef.split('/').some((segment) => segment.startsWith('.') || segment.endsWith('.lock'))) {
|
|
37
|
+
fail('targetRef must be an allowed full ref');
|
|
38
|
+
}
|
|
39
|
+
digest(permit.auditReceiptSha256, 'auditReceiptSha256');
|
|
40
|
+
digest(permit.patchSha256, 'patchSha256');
|
|
41
|
+
objectId(permit.expectedOldCommit, 'expectedOldCommit');
|
|
42
|
+
objectId(permit.expectedOldTree, 'expectedOldTree');
|
|
43
|
+
objectId(permit.expectedNewCommit, 'expectedNewCommit');
|
|
44
|
+
objectId(permit.expectedNewTree, 'expectedNewTree');
|
|
45
|
+
if (!Array.isArray(permit.manifest) || permit.manifest.length === 0)
|
|
46
|
+
fail('manifest must be non-empty');
|
|
47
|
+
const paths = new Set();
|
|
48
|
+
for (const [index, entry] of permit.manifest.entries()) {
|
|
49
|
+
validateManifestEntry(entry, `manifest[${index}]`);
|
|
50
|
+
if (paths.has(entry.path))
|
|
51
|
+
fail(`manifest contains duplicate path ${entry.path}`);
|
|
52
|
+
paths.add(entry.path);
|
|
53
|
+
}
|
|
54
|
+
validateCommitIdentity(permit.commit);
|
|
55
|
+
return structuredClone(permit);
|
|
56
|
+
}
|
|
57
|
+
export function missionApplyPermitFingerprint(permit) {
|
|
58
|
+
const valid = validateMissionApplyPermit(permit);
|
|
59
|
+
return `sha256:${createHash('sha256').update(canonicalJson(valid), 'utf8').digest('hex')}`;
|
|
60
|
+
}
|
|
61
|
+
export function validateMissionGitCommitIdentity(value) {
|
|
62
|
+
validateCommitIdentity(value);
|
|
63
|
+
return structuredClone(value);
|
|
64
|
+
}
|
|
65
|
+
export function assertMissionApplyIntent(value) {
|
|
66
|
+
const intent = object(value, 'Mission apply intent');
|
|
67
|
+
exactKeys(intent, ['version', 'permitFingerprint', 'permit', 'preparedAt'], 'Mission apply intent');
|
|
68
|
+
if (intent.version !== 1)
|
|
69
|
+
fail('apply intent version must be 1');
|
|
70
|
+
digest(intent.permitFingerprint, 'apply intent permitFingerprint');
|
|
71
|
+
const permit = validateMissionApplyPermit(intent.permit);
|
|
72
|
+
if (intent.permitFingerprint !== missionApplyPermitFingerprint(permit))
|
|
73
|
+
fail('apply intent fingerprint does not match permit');
|
|
74
|
+
timestamp(intent.preparedAt, 'apply intent preparedAt');
|
|
75
|
+
}
|
|
76
|
+
export function assertMissionApplyReceipt(value) {
|
|
77
|
+
const receipt = object(value, 'Mission apply receipt');
|
|
78
|
+
exactKeys(receipt, [
|
|
79
|
+
'version', 'permitFingerprint', 'targetRef', 'oldCommitSha', 'commitSha',
|
|
80
|
+
'treeSha', 'recovered', 'appliedAt',
|
|
81
|
+
], 'Mission apply receipt');
|
|
82
|
+
if (receipt.version !== 1)
|
|
83
|
+
fail('apply receipt version must be 1');
|
|
84
|
+
digest(receipt.permitFingerprint, 'apply receipt permitFingerprint');
|
|
85
|
+
nonEmpty(receipt.targetRef, 'apply receipt targetRef');
|
|
86
|
+
objectId(receipt.oldCommitSha, 'apply receipt oldCommitSha');
|
|
87
|
+
objectId(receipt.commitSha, 'apply receipt commitSha');
|
|
88
|
+
objectId(receipt.treeSha, 'apply receipt treeSha');
|
|
89
|
+
if (typeof receipt.recovered !== 'boolean')
|
|
90
|
+
fail('apply receipt recovered must be boolean');
|
|
91
|
+
timestamp(receipt.appliedAt, 'apply receipt appliedAt');
|
|
92
|
+
}
|
|
93
|
+
function validateManifestEntry(entry, path) {
|
|
94
|
+
const record = object(entry, path);
|
|
95
|
+
exactKeys(record, [
|
|
96
|
+
'path', 'operation', 'oldMode', 'newMode', 'beforeBlob', 'afterBlob',
|
|
97
|
+
'beforeSha256', 'afterSha256',
|
|
98
|
+
], path);
|
|
99
|
+
nonEmpty(entry.path, `${path}.path`);
|
|
100
|
+
if (entry.path.startsWith('/') || entry.path.split('/').includes('..') || entry.path === '.git' || entry.path.startsWith('.git/')) {
|
|
101
|
+
fail(`${path}.path is not a repository-relative path`);
|
|
102
|
+
}
|
|
103
|
+
if (/[\0\r\n\\]/u.test(entry.path))
|
|
104
|
+
fail(`${path}.path contains forbidden characters`);
|
|
105
|
+
if (!['add', 'delete', 'modify'].includes(entry.operation))
|
|
106
|
+
fail(`${path}.operation is invalid`);
|
|
107
|
+
nullableMode(entry.oldMode, `${path}.oldMode`);
|
|
108
|
+
nullableMode(entry.newMode, `${path}.newMode`);
|
|
109
|
+
nullableObjectId(entry.beforeBlob, `${path}.beforeBlob`);
|
|
110
|
+
nullableObjectId(entry.afterBlob, `${path}.afterBlob`);
|
|
111
|
+
nullableDigest(entry.beforeSha256, `${path}.beforeSha256`);
|
|
112
|
+
nullableDigest(entry.afterSha256, `${path}.afterSha256`);
|
|
113
|
+
if (entry.operation === 'add' && (entry.oldMode !== null || entry.beforeBlob !== null || entry.beforeSha256 !== null
|
|
114
|
+
|| entry.newMode === null || entry.afterBlob === null || entry.afterSha256 === null))
|
|
115
|
+
fail(`${path} add must have only a complete new side`);
|
|
116
|
+
if (entry.operation === 'delete' && (entry.newMode !== null || entry.afterBlob !== null || entry.afterSha256 !== null
|
|
117
|
+
|| entry.oldMode === null || entry.beforeBlob === null || entry.beforeSha256 === null))
|
|
118
|
+
fail(`${path} delete must have only a complete old side`);
|
|
119
|
+
if (entry.operation === 'modify' && (entry.oldMode === null || entry.newMode === null
|
|
120
|
+
|| entry.beforeBlob === null || entry.afterBlob === null
|
|
121
|
+
|| entry.beforeSha256 === null || entry.afterSha256 === null))
|
|
122
|
+
fail(`${path} modify must have both complete sides`);
|
|
123
|
+
}
|
|
124
|
+
function validateCommitIdentity(value) {
|
|
125
|
+
const identity = object(value, 'Mission commit identity');
|
|
126
|
+
exactKeys(identity, [
|
|
127
|
+
'message', 'authorName', 'authorEmail', 'authoredAt', 'committerName',
|
|
128
|
+
'committerEmail', 'committedAt',
|
|
129
|
+
], 'Mission commit identity');
|
|
130
|
+
for (const field of ['message', 'authorName', 'authorEmail', 'committerName', 'committerEmail']) {
|
|
131
|
+
nonEmpty(value[field], `commit.${field}`);
|
|
132
|
+
if (value[field].includes('\0') || value[field].includes('\r'))
|
|
133
|
+
fail(`commit.${field} contains forbidden characters`);
|
|
134
|
+
}
|
|
135
|
+
for (const field of ['authorName', 'authorEmail', 'committerName', 'committerEmail']) {
|
|
136
|
+
if (value[field].includes('\n'))
|
|
137
|
+
fail(`commit.${field} contains forbidden characters`);
|
|
138
|
+
}
|
|
139
|
+
timestamp(value.authoredAt, 'commit.authoredAt');
|
|
140
|
+
timestamp(value.committedAt, 'commit.committedAt');
|
|
141
|
+
}
|
|
142
|
+
function canonicalJson(value) {
|
|
143
|
+
return JSON.stringify(canonicalValue(value));
|
|
144
|
+
}
|
|
145
|
+
function canonicalValue(value) {
|
|
146
|
+
if (Array.isArray(value))
|
|
147
|
+
return value.map(canonicalValue);
|
|
148
|
+
if (typeof value === 'object' && value !== null) {
|
|
149
|
+
return Object.fromEntries(Object.entries(value)
|
|
150
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
151
|
+
.map(([key, child]) => [key, canonicalValue(child)]));
|
|
152
|
+
}
|
|
153
|
+
return value;
|
|
154
|
+
}
|
|
155
|
+
function object(value, label) {
|
|
156
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
157
|
+
throw new Error(`${label} must be an object.`);
|
|
158
|
+
return value;
|
|
159
|
+
}
|
|
160
|
+
function exactKeys(value, allowed, label) {
|
|
161
|
+
const allowedSet = new Set(allowed);
|
|
162
|
+
for (const key of Object.keys(value))
|
|
163
|
+
if (!allowedSet.has(key))
|
|
164
|
+
throw new Error(`${label} has unexpected field ${key}.`);
|
|
165
|
+
for (const key of allowed)
|
|
166
|
+
if (!(key in value))
|
|
167
|
+
throw new Error(`${label} is missing field ${key}.`);
|
|
168
|
+
}
|
|
169
|
+
function nonEmpty(value, label) {
|
|
170
|
+
if (typeof value !== 'string' || value.length === 0)
|
|
171
|
+
fail(`${label} must be non-empty`);
|
|
172
|
+
}
|
|
173
|
+
function timestamp(value, label) {
|
|
174
|
+
nonEmpty(value, label);
|
|
175
|
+
if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/u.test(value) || Number.isNaN(Date.parse(value)))
|
|
176
|
+
fail(`${label} must be an ISO timestamp`);
|
|
177
|
+
}
|
|
178
|
+
function digest(value, label) {
|
|
179
|
+
if (typeof value !== 'string' || !/^sha256:[a-f0-9]{64}$/u.test(value))
|
|
180
|
+
fail(`${label} must be sha256 hex`);
|
|
181
|
+
}
|
|
182
|
+
function nullableDigest(value, label) {
|
|
183
|
+
if (value !== null)
|
|
184
|
+
digest(value, label);
|
|
185
|
+
}
|
|
186
|
+
function objectId(value, label) {
|
|
187
|
+
if (typeof value !== 'string' || !/^[a-f0-9]{40}(?:[a-f0-9]{24})?$/u.test(value))
|
|
188
|
+
fail(`${label} must be a Git object ID`);
|
|
189
|
+
}
|
|
190
|
+
function nullableObjectId(value, label) {
|
|
191
|
+
if (value !== null)
|
|
192
|
+
objectId(value, label);
|
|
193
|
+
}
|
|
194
|
+
function nullableMode(value, label) {
|
|
195
|
+
if (value !== null && value !== '100644')
|
|
196
|
+
fail(`${label} must be 100644 or null`);
|
|
197
|
+
}
|
|
198
|
+
function fail(message) {
|
|
199
|
+
throw new Error(`Invalid Mission apply contract: ${message}.`);
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=mission-git-contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mission-git-contracts.js","sourceRoot":"","sources":["../../../src/runner/mission-git-contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ProcessExecutor } from '../process/command.js';
|
|
2
|
+
import { type RuntimeOwnerObservation, type RuntimeOwnerRecord, type RuntimeOwnerRefAdapter } from './mission-runtime-owner.js';
|
|
3
|
+
export declare class GitRuntimeOwnerRefAdapter implements RuntimeOwnerRefAdapter {
|
|
4
|
+
private readonly targetRoot;
|
|
5
|
+
private readonly execute;
|
|
6
|
+
private readonly remote;
|
|
7
|
+
private readonly ownerRef;
|
|
8
|
+
constructor(targetRoot: string, execute?: ProcessExecutor, remote?: string, ownerRef?: string);
|
|
9
|
+
read(): Promise<RuntimeOwnerObservation | undefined>;
|
|
10
|
+
compareAndSwap(expectedSha: string | undefined, record: RuntimeOwnerRecord): Promise<RuntimeOwnerObservation>;
|
|
11
|
+
private git;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=mission-git-runtime-owner-ref.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mission-git-runtime-owner-ref.d.ts","sourceRoot":"","sources":["../../../src/runner/mission-git-runtime-owner-ref.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAIL,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC5B,MAAM,4BAA4B,CAAC;AAKpC,qBAAa,yBAA0B,YAAW,sBAAsB;IAEpE,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAHR,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,eAAwC,EACjD,MAAM,SAAW,EACjB,QAAQ,SAAkB;IAGhC,IAAI,IAAI,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAiCpD,cAAc,CACzB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,uBAAuB,CAAC;YAyCrB,GAAG;CAelB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { defaultProcessExecutor } from '../process/command.js';
|
|
3
|
+
import { canonicalRuntimeOwnerRecord, parseRuntimeOwnerRecord, RuntimeOwnerConflictError, } from './mission-runtime-owner.js';
|
|
4
|
+
const defaultOwnerRef = 'refs/codex-orchestrator/runtime-owner-v1';
|
|
5
|
+
const ownerFile = 'codex-orchestrator-runtime-owner-v1.json';
|
|
6
|
+
export class GitRuntimeOwnerRefAdapter {
|
|
7
|
+
targetRoot;
|
|
8
|
+
execute;
|
|
9
|
+
remote;
|
|
10
|
+
ownerRef;
|
|
11
|
+
constructor(targetRoot, execute = defaultProcessExecutor, remote = 'origin', ownerRef = defaultOwnerRef) {
|
|
12
|
+
this.targetRoot = targetRoot;
|
|
13
|
+
this.execute = execute;
|
|
14
|
+
this.remote = remote;
|
|
15
|
+
this.ownerRef = ownerRef;
|
|
16
|
+
}
|
|
17
|
+
async read() {
|
|
18
|
+
const listed = await this.git(['ls-remote', '--refs', this.remote, this.ownerRef]);
|
|
19
|
+
const lines = listed.stdout.trim().length === 0
|
|
20
|
+
? []
|
|
21
|
+
: listed.stdout.trim().split(/\r?\n/u);
|
|
22
|
+
if (lines.length === 0) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
if (lines.length !== 1) {
|
|
26
|
+
throw new RuntimeOwnerConflictError('remote owner ref is ambiguous');
|
|
27
|
+
}
|
|
28
|
+
const match = /^([a-f0-9]{40}(?:[a-f0-9]{24})?)\s+(.+)$/u.exec(lines[0] ?? '');
|
|
29
|
+
if (!match || match[2] !== this.ownerRef) {
|
|
30
|
+
throw new RuntimeOwnerConflictError('remote owner ref response is malformed');
|
|
31
|
+
}
|
|
32
|
+
const sha = match[1];
|
|
33
|
+
const observedRef = `refs/codex-orchestrator/observed/${process.pid}-${randomUUID()}`;
|
|
34
|
+
await this.git(['fetch', '--no-tags', this.remote, `+${this.ownerRef}:${observedRef}`]);
|
|
35
|
+
try {
|
|
36
|
+
const fetchedSha = objectId(await this.git(['rev-parse', observedRef]), 'observed owner');
|
|
37
|
+
if (fetchedSha !== sha) {
|
|
38
|
+
throw new RuntimeOwnerConflictError('owner ref moved between listing and fetch');
|
|
39
|
+
}
|
|
40
|
+
const shown = await this.git(['show', `${observedRef}:${ownerFile}`]);
|
|
41
|
+
return {
|
|
42
|
+
sha,
|
|
43
|
+
record: parseRuntimeOwnerRecord(shown.stdout.replace(/\r?\n$/u, '')),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
await this.git(['update-ref', '-d', observedRef]);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async compareAndSwap(expectedSha, record) {
|
|
51
|
+
const canonical = canonicalRuntimeOwnerRecord(record);
|
|
52
|
+
const blob = objectId(await this.git(['hash-object', '-w', '--stdin'], canonical), 'blob');
|
|
53
|
+
const tree = objectId(await this.git(['mktree'], `100644 blob ${blob}\t${ownerFile}\n`), 'tree');
|
|
54
|
+
const commit = objectId(await this.git(['commit-tree', tree, '-m', `codex-orchestrator runtime owner epoch ${record.fencingEpoch}`], undefined, fixedGitIdentityEnv()), 'commit');
|
|
55
|
+
const lease = `--force-with-lease=${this.ownerRef}:${expectedSha ?? ''}`;
|
|
56
|
+
const pushed = await this.execute('git', [
|
|
57
|
+
'push',
|
|
58
|
+
lease,
|
|
59
|
+
this.remote,
|
|
60
|
+
`${commit}:${this.ownerRef}`,
|
|
61
|
+
], { cwd: this.targetRoot });
|
|
62
|
+
if (pushed.exitCode !== 0) {
|
|
63
|
+
try {
|
|
64
|
+
const reconciled = await this.read();
|
|
65
|
+
if (reconciled?.sha === commit
|
|
66
|
+
&& canonicalRuntimeOwnerRecord(reconciled.record) === canonical) {
|
|
67
|
+
return reconciled;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Preserve the compare-and-swap failure below when reconciliation is unavailable.
|
|
72
|
+
}
|
|
73
|
+
throw new RuntimeOwnerConflictError(`compare-and-swap failed${pushed.stderr.trim() ? `: ${pushed.stderr.trim()}` : ''}`);
|
|
74
|
+
}
|
|
75
|
+
const observed = await this.read();
|
|
76
|
+
if (!observed || observed.sha !== commit
|
|
77
|
+
|| canonicalRuntimeOwnerRecord(observed.record) !== canonical) {
|
|
78
|
+
throw new RuntimeOwnerConflictError('post-push owner ref does not match the requested record');
|
|
79
|
+
}
|
|
80
|
+
return observed;
|
|
81
|
+
}
|
|
82
|
+
async git(args, stdin, env) {
|
|
83
|
+
const result = await this.execute('git', args, {
|
|
84
|
+
cwd: this.targetRoot,
|
|
85
|
+
...(stdin === undefined ? {} : { stdin }),
|
|
86
|
+
...(env === undefined ? {} : { env }),
|
|
87
|
+
});
|
|
88
|
+
if (result.exitCode !== 0) {
|
|
89
|
+
throw new Error(`Git runtime-owner command failed: git ${args.join(' ')}: ${result.stderr.trim()}`);
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function objectId(result, kind) {
|
|
95
|
+
const id = result.stdout.trim();
|
|
96
|
+
if (!/^[a-f0-9]{40}(?:[a-f0-9]{24})?$/u.test(id)) {
|
|
97
|
+
throw new Error(`Git runtime-owner ${kind} command returned an invalid object ID.`);
|
|
98
|
+
}
|
|
99
|
+
return id;
|
|
100
|
+
}
|
|
101
|
+
function fixedGitIdentityEnv() {
|
|
102
|
+
return {
|
|
103
|
+
...(process.env.PATH ? { PATH: process.env.PATH } : {}),
|
|
104
|
+
...(process.env.HOME ? { HOME: process.env.HOME } : {}),
|
|
105
|
+
GIT_AUTHOR_NAME: 'codex-orchestrator',
|
|
106
|
+
GIT_AUTHOR_EMAIL: 'codex-orchestrator@localhost',
|
|
107
|
+
GIT_COMMITTER_NAME: 'codex-orchestrator',
|
|
108
|
+
GIT_COMMITTER_EMAIL: 'codex-orchestrator@localhost',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=mission-git-runtime-owner-ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mission-git-runtime-owner-ref.js","sourceRoot":"","sources":["../../../src/runner/mission-git-runtime-owner-ref.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { ProcessExecutor } from '../process/command.js';
|
|
2
|
+
import type { MissionPatchFile } from './mission-patch-audit.js';
|
|
3
|
+
import { type MissionApplyPermit, type MissionApplyReceipt, type MissionGitCommitIdentity, type MissionGitManifestEntry, type MissionPatchCandidate } from './mission-git-contracts.js';
|
|
4
|
+
import { MissionStateStore } from './mission-state-store.js';
|
|
5
|
+
export { createMissionApplyPermit, missionApplyPermitFingerprint, type MissionApplyPermit, type MissionApplyReceipt, type MissionGitCommitIdentity, type MissionGitManifestEntry, type MissionPatchCandidate, } from './mission-git-contracts.js';
|
|
6
|
+
export declare const missionGitBoundaries: readonly ["base-verified", "isolated-index-created", "patch-applied", "tree-written", "manifest-proved", "commit-created", "intent-persisted", "ref-updated", "receipt-persisted"];
|
|
7
|
+
export type MissionGitBoundary = (typeof missionGitBoundaries)[number];
|
|
8
|
+
export interface MissionBinaryProcessResult {
|
|
9
|
+
stdout: Buffer;
|
|
10
|
+
stderr: Buffer;
|
|
11
|
+
exitCode: number;
|
|
12
|
+
}
|
|
13
|
+
export type MissionBinaryProcessExecutor = (file: string, args: string[], options: {
|
|
14
|
+
cwd: string;
|
|
15
|
+
env: Record<string, string>;
|
|
16
|
+
timeoutMs: number;
|
|
17
|
+
maxOutputBytes: number;
|
|
18
|
+
}) => Promise<MissionBinaryProcessResult>;
|
|
19
|
+
export declare const defaultMissionBinaryProcessExecutor: MissionBinaryProcessExecutor;
|
|
20
|
+
export declare class MissionGitSafetyStopError extends Error {
|
|
21
|
+
readonly code: string;
|
|
22
|
+
constructor(code: string, message: string);
|
|
23
|
+
}
|
|
24
|
+
export declare class MissionGitIntegrationConflictError extends Error {
|
|
25
|
+
readonly paths: string[];
|
|
26
|
+
constructor(paths: string[]);
|
|
27
|
+
}
|
|
28
|
+
export declare class MissionGitReauthorizationRequiredError extends Error {
|
|
29
|
+
readonly code: string;
|
|
30
|
+
constructor(code: string, message: string);
|
|
31
|
+
}
|
|
32
|
+
export interface MissionTreeIntegrationCandidate {
|
|
33
|
+
baseCommit: string;
|
|
34
|
+
parentCommit: string;
|
|
35
|
+
childCommit: string;
|
|
36
|
+
parentTree: string;
|
|
37
|
+
treeSha: string;
|
|
38
|
+
commitSha: string;
|
|
39
|
+
manifest: MissionGitManifestEntry[];
|
|
40
|
+
}
|
|
41
|
+
export interface BuildMissionPatchCandidateInput {
|
|
42
|
+
targetRoot: string;
|
|
43
|
+
baseCommit: string;
|
|
44
|
+
patch: string;
|
|
45
|
+
auditedFiles: MissionPatchFile[];
|
|
46
|
+
commit: MissionGitCommitIdentity;
|
|
47
|
+
execute?: ProcessExecutor;
|
|
48
|
+
executeBinary?: MissionBinaryProcessExecutor;
|
|
49
|
+
onBoundary?: (boundary: MissionGitBoundary) => void | Promise<void>;
|
|
50
|
+
temporaryRoot?: string;
|
|
51
|
+
}
|
|
52
|
+
export declare function buildMissionPatchCandidate(input: BuildMissionPatchCandidateInput): Promise<MissionPatchCandidate>;
|
|
53
|
+
export declare function buildMissionTreeIntegrationCandidate(input: {
|
|
54
|
+
targetRoot: string;
|
|
55
|
+
baseCommit: string;
|
|
56
|
+
parentCommit: string;
|
|
57
|
+
childCommit: string;
|
|
58
|
+
commit: MissionGitCommitIdentity;
|
|
59
|
+
execute?: ProcessExecutor;
|
|
60
|
+
executeBinary?: MissionBinaryProcessExecutor;
|
|
61
|
+
}): Promise<MissionTreeIntegrationCandidate>;
|
|
62
|
+
export declare function applyMissionTreeIntegration(input: {
|
|
63
|
+
targetRoot: string;
|
|
64
|
+
targetRef: string;
|
|
65
|
+
baseCommit: string;
|
|
66
|
+
parentCommit: string;
|
|
67
|
+
childCommit: string;
|
|
68
|
+
commit: MissionGitCommitIdentity;
|
|
69
|
+
fencingEpoch: number;
|
|
70
|
+
assertOwnership: (fencingEpoch: number) => void | Promise<void>;
|
|
71
|
+
execute?: ProcessExecutor;
|
|
72
|
+
executeBinary?: MissionBinaryProcessExecutor;
|
|
73
|
+
}): Promise<MissionTreeIntegrationCandidate>;
|
|
74
|
+
export interface MissionGitTransactionOptions {
|
|
75
|
+
targetRoot: string;
|
|
76
|
+
stateStore: MissionStateStore;
|
|
77
|
+
assertOwnership: (fencingEpoch: number) => void | Promise<void>;
|
|
78
|
+
execute?: ProcessExecutor;
|
|
79
|
+
executeBinary?: MissionBinaryProcessExecutor;
|
|
80
|
+
now?: () => Date;
|
|
81
|
+
onBoundary?: (boundary: MissionGitBoundary) => void | Promise<void>;
|
|
82
|
+
}
|
|
83
|
+
export declare class MissionGitTransaction {
|
|
84
|
+
private readonly options;
|
|
85
|
+
private readonly execute;
|
|
86
|
+
private readonly now;
|
|
87
|
+
constructor(options: MissionGitTransactionOptions);
|
|
88
|
+
apply(permitValue: MissionApplyPermit, patch: string): Promise<MissionApplyReceipt>;
|
|
89
|
+
recover(permitValue: MissionApplyPermit): Promise<MissionApplyReceipt>;
|
|
90
|
+
private prepareIntent;
|
|
91
|
+
private persistReceipt;
|
|
92
|
+
private readTargetIdentity;
|
|
93
|
+
private isOldIdentity;
|
|
94
|
+
private persistReauthorization;
|
|
95
|
+
private persistSafetyStop;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=mission-git-transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mission-git-transaction.d.ts","sourceRoot":"","sources":["../../../src/runner/mission-git-transaction.ts"],"names":[],"mappings":"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"}
|