codex-orchestrator 0.1.0
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/LICENSE +21 -0
- package/README.md +94 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +253 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/codex/command-adapter.d.ts +27 -0
- package/dist/src/codex/command-adapter.d.ts.map +1 -0
- package/dist/src/codex/command-adapter.js +49 -0
- package/dist/src/codex/command-adapter.js.map +1 -0
- package/dist/src/config/constants.d.ts +6 -0
- package/dist/src/config/constants.d.ts.map +1 -0
- package/dist/src/config/constants.js +13 -0
- package/dist/src/config/constants.js.map +1 -0
- package/dist/src/config/schema.d.ts +87 -0
- package/dist/src/config/schema.d.ts.map +1 -0
- package/dist/src/config/schema.js +180 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/git/worktree.d.ts +50 -0
- package/dist/src/git/worktree.d.ts.map +1 -0
- package/dist/src/git/worktree.js +139 -0
- package/dist/src/git/worktree.js.map +1 -0
- package/dist/src/github/gh-cli.d.ts +11 -0
- package/dist/src/github/gh-cli.d.ts.map +1 -0
- package/dist/src/github/gh-cli.js +28 -0
- package/dist/src/github/gh-cli.js.map +1 -0
- package/dist/src/github/gh-issue-adapter.d.ts +15 -0
- package/dist/src/github/gh-issue-adapter.d.ts.map +1 -0
- package/dist/src/github/gh-issue-adapter.js +193 -0
- package/dist/src/github/gh-issue-adapter.js.map +1 -0
- package/dist/src/github/gh-pull-request-adapter.d.ts +9 -0
- package/dist/src/github/gh-pull-request-adapter.d.ts.map +1 -0
- package/dist/src/github/gh-pull-request-adapter.js +39 -0
- package/dist/src/github/gh-pull-request-adapter.js.map +1 -0
- package/dist/src/github/issues.d.ts +80 -0
- package/dist/src/github/issues.d.ts.map +1 -0
- package/dist/src/github/issues.js +122 -0
- package/dist/src/github/issues.js.map +1 -0
- package/dist/src/github/pull-requests.d.ts +24 -0
- package/dist/src/github/pull-requests.d.ts.map +1 -0
- package/dist/src/github/pull-requests.js +21 -0
- package/dist/src/github/pull-requests.js.map +1 -0
- package/dist/src/index.d.ts +31 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +17 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/package-info.d.ts +6 -0
- package/dist/src/package-info.d.ts.map +1 -0
- package/dist/src/package-info.js +13 -0
- package/dist/src/package-info.js.map +1 -0
- package/dist/src/process/command.d.ts +15 -0
- package/dist/src/process/command.d.ts.map +1 -0
- package/dist/src/process/command.js +34 -0
- package/dist/src/process/command.js.map +1 -0
- package/dist/src/runner/command-utils.d.ts +5 -0
- package/dist/src/runner/command-utils.d.ts.map +1 -0
- package/dist/src/runner/command-utils.js +19 -0
- package/dist/src/runner/command-utils.js.map +1 -0
- package/dist/src/runner/issue-state-machine.d.ts +39 -0
- package/dist/src/runner/issue-state-machine.d.ts.map +1 -0
- package/dist/src/runner/issue-state-machine.js +119 -0
- package/dist/src/runner/issue-state-machine.js.map +1 -0
- package/dist/src/runner/issue-tree.d.ts +62 -0
- package/dist/src/runner/issue-tree.d.ts.map +1 -0
- package/dist/src/runner/issue-tree.js +376 -0
- package/dist/src/runner/issue-tree.js.map +1 -0
- package/dist/src/runner/local-state.d.ts +31 -0
- package/dist/src/runner/local-state.d.ts.map +1 -0
- package/dist/src/runner/local-state.js +125 -0
- package/dist/src/runner/local-state.js.map +1 -0
- package/dist/src/runner/plan-auto-command.d.ts +30 -0
- package/dist/src/runner/plan-auto-command.d.ts.map +1 -0
- package/dist/src/runner/plan-auto-command.js +611 -0
- package/dist/src/runner/plan-auto-command.js.map +1 -0
- package/dist/src/runner/prompt.d.ts +108 -0
- package/dist/src/runner/prompt.d.ts.map +1 -0
- package/dist/src/runner/prompt.js +322 -0
- package/dist/src/runner/prompt.js.map +1 -0
- package/dist/src/runner/recovery.d.ts +24 -0
- package/dist/src/runner/recovery.d.ts.map +1 -0
- package/dist/src/runner/recovery.js +62 -0
- package/dist/src/runner/recovery.js.map +1 -0
- package/dist/src/runner/safety.d.ts +14 -0
- package/dist/src/runner/safety.d.ts.map +1 -0
- package/dist/src/runner/safety.js +46 -0
- package/dist/src/runner/safety.js.map +1 -0
- package/dist/src/runner/scoped-auto-command.d.ts +29 -0
- package/dist/src/runner/scoped-auto-command.d.ts.map +1 -0
- package/dist/src/runner/scoped-auto-command.js +262 -0
- package/dist/src/runner/scoped-auto-command.js.map +1 -0
- package/dist/src/runner/status-command.d.ts +17 -0
- package/dist/src/runner/status-command.d.ts.map +1 -0
- package/dist/src/runner/status-command.js +72 -0
- package/dist/src/runner/status-command.js.map +1 -0
- package/dist/src/setup/github-label-adapter.d.ts +13 -0
- package/dist/src/setup/github-label-adapter.d.ts.map +1 -0
- package/dist/src/setup/github-label-adapter.js +28 -0
- package/dist/src/setup/github-label-adapter.js.map +1 -0
- package/dist/src/setup/labels.d.ts +27 -0
- package/dist/src/setup/labels.d.ts.map +1 -0
- package/dist/src/setup/labels.js +42 -0
- package/dist/src/setup/labels.js.map +1 -0
- package/dist/src/setup/project-config.d.ts +15 -0
- package/dist/src/setup/project-config.d.ts.map +1 -0
- package/dist/src/setup/project-config.js +124 -0
- package/dist/src/setup/project-config.js.map +1 -0
- package/dist/src/setup/setup-command.d.ts +22 -0
- package/dist/src/setup/setup-command.d.ts.map +1 -0
- package/dist/src/setup/setup-command.js +104 -0
- package/dist/src/setup/setup-command.js.map +1 -0
- package/dist/src/setup/workflows.d.ts +11 -0
- package/dist/src/setup/workflows.d.ts.map +1 -0
- package/dist/src/setup/workflows.js +60 -0
- package/dist/src/setup/workflows.js.map +1 -0
- package/package.json +45 -0
- package/prompts/setup-skill.md +11 -0
- package/prompts/workflows/breakdown-review.md +4 -0
- package/prompts/workflows/issue-breakdown.md +4 -0
- package/prompts/workflows/issue-tree-orchestration.md +4 -0
- package/prompts/workflows/prd.md +4 -0
- package/prompts/workflows/scoped-implementation.md +4 -0
- package/prompts/workflows/triage.md +4 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
const reasonStrings = {
|
|
2
|
+
eligibleScoped: 'has configured auto label and no blocking state labels',
|
|
3
|
+
eligiblePlan: 'has configured plan-auto label and no blocking state labels',
|
|
4
|
+
manual: 'manual label is present',
|
|
5
|
+
blocked: 'blocked label is present',
|
|
6
|
+
conflictingAuthorization: 'auto and plan-auto labels are both present',
|
|
7
|
+
conflictingState: 'multiple state labels are present',
|
|
8
|
+
running: 'running label is present',
|
|
9
|
+
review: 'review label is present',
|
|
10
|
+
missingAuthorization: 'no configured auto or plan-auto label is present',
|
|
11
|
+
closed: 'issue is closed',
|
|
12
|
+
};
|
|
13
|
+
export function discoverIssueWork(issues, config) {
|
|
14
|
+
return [...issues]
|
|
15
|
+
.sort((left, right) => left.number - right.number)
|
|
16
|
+
.map((issue) => decideIssueWork(issue, config));
|
|
17
|
+
}
|
|
18
|
+
export async function claimIssue(adapter, config, issueNumber, mode, now) {
|
|
19
|
+
await adapter.addLabels(issueNumber, [config.github.labels.running.name]);
|
|
20
|
+
await adapter.postComment(issueNumber, `codex-orchestrator: claimed #${issueNumber} for ${mode} autonomous work at ${now.toISOString()}.`);
|
|
21
|
+
}
|
|
22
|
+
export async function applyClarificationGate(adapter, config, issueNumber, questions, _now) {
|
|
23
|
+
validateClarificationQuestions(questions);
|
|
24
|
+
await adapter.removeLabels(issueNumber, [config.github.labels.running.name]);
|
|
25
|
+
await adapter.addLabels(issueNumber, [config.github.labels.blocked.name]);
|
|
26
|
+
await adapter.postComment(issueNumber, formatClarificationComment(issueNumber, questions));
|
|
27
|
+
}
|
|
28
|
+
export async function applyCodexSessionResult(adapter, config, issueNumber, result, now) {
|
|
29
|
+
if (result.status === 'ready') {
|
|
30
|
+
return { action: 'none' };
|
|
31
|
+
}
|
|
32
|
+
await applyClarificationGate(adapter, config, issueNumber, result.questions, now);
|
|
33
|
+
return { action: 'blocked-for-clarification' };
|
|
34
|
+
}
|
|
35
|
+
export function hasMaintainerResponseAfterLatestClarification(issue) {
|
|
36
|
+
const latestClarification = issue.comments
|
|
37
|
+
.filter((comment) => comment.body.startsWith(`codex-orchestrator clarification questions for #${issue.number}`))
|
|
38
|
+
.sort((left, right) => right.createdAt.localeCompare(left.createdAt))[0];
|
|
39
|
+
if (!latestClarification) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const maintainerAssociations = new Set(['OWNER', 'MEMBER', 'COLLABORATOR']);
|
|
43
|
+
return issue.comments.some((comment) => comment.createdAt > latestClarification.createdAt && maintainerAssociations.has(comment.authorAssociation));
|
|
44
|
+
}
|
|
45
|
+
export async function clearClarificationGate(adapter, config, issueNumber, now) {
|
|
46
|
+
await adapter.removeLabels(issueNumber, [config.github.labels.blocked.name]);
|
|
47
|
+
await adapter.addLabels(issueNumber, [config.github.labels.running.name]);
|
|
48
|
+
await adapter.postComment(issueNumber, `codex-orchestrator: maintainer clarification detected for #${issueNumber}; resuming at ${now.toISOString()}.`);
|
|
49
|
+
}
|
|
50
|
+
function decideIssueWork(issue, config) {
|
|
51
|
+
const labels = new Set(issue.labels.map((label) => label.name));
|
|
52
|
+
const auto = config.github.labels.auto.name;
|
|
53
|
+
const planAuto = config.github.labels.planAuto.name;
|
|
54
|
+
const manual = config.github.labels.manual.name;
|
|
55
|
+
const blocked = config.github.labels.blocked.name;
|
|
56
|
+
const running = config.github.labels.running.name;
|
|
57
|
+
const review = config.github.labels.review.name;
|
|
58
|
+
const authCount = [auto, planAuto].filter((label) => labels.has(label)).length;
|
|
59
|
+
const stateCount = [running, blocked, review].filter((label) => labels.has(label)).length;
|
|
60
|
+
if (stateCount > 1) {
|
|
61
|
+
return skipped(issue, 'conflicting-state-labels', reasonStrings.conflictingState);
|
|
62
|
+
}
|
|
63
|
+
if (authCount > 1) {
|
|
64
|
+
return skipped(issue, 'conflicting-authorization-labels', reasonStrings.conflictingAuthorization);
|
|
65
|
+
}
|
|
66
|
+
if (labels.has(manual)) {
|
|
67
|
+
return skipped(issue, 'manual-label', reasonStrings.manual);
|
|
68
|
+
}
|
|
69
|
+
if (labels.has(blocked)) {
|
|
70
|
+
return skipped(issue, 'blocked-label', reasonStrings.blocked);
|
|
71
|
+
}
|
|
72
|
+
if (labels.has(running)) {
|
|
73
|
+
return skipped(issue, 'already-running', reasonStrings.running);
|
|
74
|
+
}
|
|
75
|
+
if (labels.has(review)) {
|
|
76
|
+
return skipped(issue, 'ready-for-review', reasonStrings.review);
|
|
77
|
+
}
|
|
78
|
+
if (issue.state === 'CLOSED') {
|
|
79
|
+
return skipped(issue, 'closed', reasonStrings.closed);
|
|
80
|
+
}
|
|
81
|
+
if (authCount === 0) {
|
|
82
|
+
return skipped(issue, 'missing-authorization-label', reasonStrings.missingAuthorization);
|
|
83
|
+
}
|
|
84
|
+
if (labels.has(auto)) {
|
|
85
|
+
return eligible(issue, 'scoped-issue', reasonStrings.eligibleScoped);
|
|
86
|
+
}
|
|
87
|
+
return eligible(issue, 'plan-parent', reasonStrings.eligiblePlan);
|
|
88
|
+
}
|
|
89
|
+
function eligible(issue, mode, reason) {
|
|
90
|
+
return {
|
|
91
|
+
kind: 'eligible',
|
|
92
|
+
issueNumber: issue.number,
|
|
93
|
+
title: issue.title,
|
|
94
|
+
mode,
|
|
95
|
+
reason,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function skipped(issue, reasonCode, reason) {
|
|
99
|
+
return {
|
|
100
|
+
kind: 'skipped',
|
|
101
|
+
issueNumber: issue.number,
|
|
102
|
+
title: issue.title,
|
|
103
|
+
reasonCode,
|
|
104
|
+
reason,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function validateClarificationQuestions(questions) {
|
|
108
|
+
if (questions.length === 0 ||
|
|
109
|
+
questions.some((question) => question.question.trim().length === 0 || question.blocks.trim().length === 0)) {
|
|
110
|
+
throw new Error('needs-clarification requires at least one question with non-empty question and blocks');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function formatClarificationComment(issueNumber, questions) {
|
|
114
|
+
return [
|
|
115
|
+
`codex-orchestrator clarification questions for #${issueNumber}`,
|
|
116
|
+
...questions.map((question, index) => `${index + 1}. ${question.question.trim()} Blocks: ${question.blocks.trim()}`),
|
|
117
|
+
].join('\n');
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=issue-state-machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-state-machine.js","sourceRoot":"","sources":["../../../src/runner/issue-state-machine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { CodexOrchestratorConfig } from '../config/schema.js';
|
|
2
|
+
import type { GitHubIssue } from '../github/issues.js';
|
|
3
|
+
export interface PlanChildNode {
|
|
4
|
+
stableId: string;
|
|
5
|
+
issueNumber?: number;
|
|
6
|
+
title: string;
|
|
7
|
+
body: string;
|
|
8
|
+
afkHitl: 'afk' | 'hitl';
|
|
9
|
+
ownershipScope: string[];
|
|
10
|
+
dependsOn: string[];
|
|
11
|
+
verification: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface PlanDependencyEdge {
|
|
14
|
+
from: string;
|
|
15
|
+
to: string;
|
|
16
|
+
reason: string;
|
|
17
|
+
}
|
|
18
|
+
export interface PlanGraph {
|
|
19
|
+
nodes: PlanChildNode[];
|
|
20
|
+
edges: PlanDependencyEdge[];
|
|
21
|
+
specGate: 'wave-level';
|
|
22
|
+
}
|
|
23
|
+
export type PlanGraphValidationResult = {
|
|
24
|
+
ok: true;
|
|
25
|
+
} | {
|
|
26
|
+
ok: false;
|
|
27
|
+
errors: string[];
|
|
28
|
+
};
|
|
29
|
+
export interface AutonomousChildMetadata {
|
|
30
|
+
stableId: string;
|
|
31
|
+
afkHitl: 'afk' | 'hitl';
|
|
32
|
+
dependsOn: string[];
|
|
33
|
+
ownershipScope: string[];
|
|
34
|
+
verification: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface AutonomousChildNode {
|
|
37
|
+
issue: GitHubIssue;
|
|
38
|
+
metadata: AutonomousChildMetadata;
|
|
39
|
+
}
|
|
40
|
+
export type AutonomousChildMetadataParseResult = {
|
|
41
|
+
ok: true;
|
|
42
|
+
node: AutonomousChildNode;
|
|
43
|
+
} | {
|
|
44
|
+
ok: false;
|
|
45
|
+
errors: string[];
|
|
46
|
+
};
|
|
47
|
+
export type AutonomousChildBatchResult = {
|
|
48
|
+
ok: true;
|
|
49
|
+
batches: AutonomousChildNode[][];
|
|
50
|
+
} | {
|
|
51
|
+
ok: false;
|
|
52
|
+
errors: string[];
|
|
53
|
+
};
|
|
54
|
+
export declare function renderAutonomousChildMarker(parentIssueNumber: number): string;
|
|
55
|
+
export declare function ensureAutonomousChildBody(body: string, parentIssueNumber: number): string;
|
|
56
|
+
export declare function isAutonomousChildOfParent(issue: GitHubIssue, config: CodexOrchestratorConfig, parentIssueNumber: number): boolean;
|
|
57
|
+
export declare function validatePlanGraph(graph: PlanGraph): PlanGraphValidationResult;
|
|
58
|
+
export declare function validatePlanGraphStructure(graph: PlanGraph): PlanGraphValidationResult;
|
|
59
|
+
export declare function parseAutonomousChildMetadata(issue: GitHubIssue, config: CodexOrchestratorConfig, parentIssueNumber: number): AutonomousChildMetadataParseResult;
|
|
60
|
+
export declare function collectExecutableChildBatches(nodes: AutonomousChildNode[], config: CodexOrchestratorConfig): AutonomousChildBatchResult;
|
|
61
|
+
export declare function topologicalPlanNodes(graph: PlanGraph): PlanChildNode[];
|
|
62
|
+
//# sourceMappingURL=issue-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-tree.d.ts","sourceRoot":"","sources":["../../../src/runner/issue-tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,MAAM,yBAAyB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEvF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,uBAAuB,CAAC;CACnC;AAED,MAAM,MAAM,kCAAkC,GAC1C;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEpC,MAAM,MAAM,0BAA0B,GAClC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAA;CAAE,GAC9C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAIpC,wBAAgB,2BAA2B,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAIzF;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,uBAAuB,EAC/B,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAGT;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,yBAAyB,CAiC7E;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,GAAG,yBAAyB,CAuEtF;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,uBAAuB,EAC/B,iBAAiB,EAAE,MAAM,GACxB,kCAAkC,CAwDpC;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,mBAAmB,EAAE,EAC5B,MAAM,EAAE,uBAAuB,GAC9B,0BAA0B,CAgD5B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,aAAa,EAAE,CAiBtE"}
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
const markerPattern = /^<!-- codex-orchestrator:autonomous-child parent=#\d+ -->$/;
|
|
2
|
+
export function renderAutonomousChildMarker(parentIssueNumber) {
|
|
3
|
+
return `<!-- codex-orchestrator:autonomous-child parent=#${parentIssueNumber} -->`;
|
|
4
|
+
}
|
|
5
|
+
export function ensureAutonomousChildBody(body, parentIssueNumber) {
|
|
6
|
+
const marker = renderAutonomousChildMarker(parentIssueNumber);
|
|
7
|
+
const lines = body.split(/\r?\n/).filter((line) => !markerPattern.test(line.trim()));
|
|
8
|
+
return [marker, ...lines].join('\n').trimEnd();
|
|
9
|
+
}
|
|
10
|
+
export function isAutonomousChildOfParent(issue, config, parentIssueNumber) {
|
|
11
|
+
const labels = new Set(issue.labels.map((label) => label.name));
|
|
12
|
+
return labels.has(config.github.labels.child.name) && issue.body.includes(renderAutonomousChildMarker(parentIssueNumber));
|
|
13
|
+
}
|
|
14
|
+
export function validatePlanGraph(graph) {
|
|
15
|
+
const structural = validatePlanGraphStructure(graph);
|
|
16
|
+
if (!structural.ok) {
|
|
17
|
+
return structural;
|
|
18
|
+
}
|
|
19
|
+
const errors = [];
|
|
20
|
+
const nodesById = new Map(graph.nodes.map((node) => [node.stableId.trim(), node]));
|
|
21
|
+
const dependencies = graphDependencies(graph);
|
|
22
|
+
const waves = computeTopologicalWaves(dependencies);
|
|
23
|
+
if (!waves.ok) {
|
|
24
|
+
errors.push(waves.error);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
for (const wave of waves.waves) {
|
|
28
|
+
const seenScopes = new Map();
|
|
29
|
+
for (const nodeId of wave) {
|
|
30
|
+
const node = nodesById.get(nodeId);
|
|
31
|
+
if (!node) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
for (const scope of normalizedItems(node.ownershipScope)) {
|
|
35
|
+
const previous = seenScopes.get(scope);
|
|
36
|
+
if (previous) {
|
|
37
|
+
errors.push(`same-wave ownership overlap: ${previous} and ${nodeId} both own ${scope}`);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
seenScopes.set(scope, nodeId);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return errors.length === 0 ? { ok: true } : { ok: false, errors };
|
|
47
|
+
}
|
|
48
|
+
export function validatePlanGraphStructure(graph) {
|
|
49
|
+
const errors = [];
|
|
50
|
+
if (!Array.isArray(graph.nodes) || graph.nodes.length === 0) {
|
|
51
|
+
errors.push('graph.nodes must contain at least one child node');
|
|
52
|
+
}
|
|
53
|
+
if (!Array.isArray(graph.edges)) {
|
|
54
|
+
errors.push('graph.edges must be an array');
|
|
55
|
+
}
|
|
56
|
+
if (graph.specGate !== 'wave-level') {
|
|
57
|
+
errors.push('graph.specGate must be wave-level');
|
|
58
|
+
}
|
|
59
|
+
const nodesById = new Map();
|
|
60
|
+
for (const node of graph.nodes ?? []) {
|
|
61
|
+
const id = node.stableId.trim();
|
|
62
|
+
if (id.length === 0) {
|
|
63
|
+
errors.push('node.stableId must be non-empty');
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (nodesById.has(id)) {
|
|
67
|
+
errors.push(`duplicate node stableId: ${id}`);
|
|
68
|
+
}
|
|
69
|
+
nodesById.set(id, node);
|
|
70
|
+
if (normalizedItems(node.ownershipScope).length === 0) {
|
|
71
|
+
errors.push(`node ${id} must include at least one ownershipScope`);
|
|
72
|
+
}
|
|
73
|
+
if (normalizedItems(node.verification).length === 0) {
|
|
74
|
+
errors.push(`node ${id} must include at least one verification expectation`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const dependencies = graphDependencies(graph);
|
|
78
|
+
for (const node of graph.nodes ?? []) {
|
|
79
|
+
const id = node.stableId.trim();
|
|
80
|
+
for (const dependency of node.dependsOn) {
|
|
81
|
+
const dep = dependency.trim();
|
|
82
|
+
if (!nodesById.has(dep)) {
|
|
83
|
+
errors.push(`node ${id} depends on unknown node ${dep}`);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (dep === id) {
|
|
87
|
+
errors.push(`node ${id} cannot depend on itself`);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
for (const edge of graph.edges ?? []) {
|
|
93
|
+
const from = edge.from.trim();
|
|
94
|
+
const to = edge.to.trim();
|
|
95
|
+
if (!nodesById.has(from)) {
|
|
96
|
+
errors.push(`edge references unknown from node ${from}`);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (!nodesById.has(to)) {
|
|
100
|
+
errors.push(`edge references unknown to node ${to}`);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (from === to) {
|
|
104
|
+
errors.push(`edge ${from} -> ${to} cannot reference the same node`);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const waves = computeTopologicalWaves(dependencies);
|
|
109
|
+
if (!waves.ok) {
|
|
110
|
+
errors.push(waves.error);
|
|
111
|
+
}
|
|
112
|
+
return errors.length === 0 ? { ok: true } : { ok: false, errors };
|
|
113
|
+
}
|
|
114
|
+
export function parseAutonomousChildMetadata(issue, config, parentIssueNumber) {
|
|
115
|
+
if (!isAutonomousChildOfParent(issue, config, parentIssueNumber)) {
|
|
116
|
+
return { ok: false, errors: [`Issue #${issue.number} is not an autonomous child of #${parentIssueNumber}`] };
|
|
117
|
+
}
|
|
118
|
+
const metadataLines = readMetadataSection(issue.body);
|
|
119
|
+
if (metadataLines.length === 0) {
|
|
120
|
+
return { ok: false, errors: [`Issue #${issue.number} missing codex-orchestrator metadata section`] };
|
|
121
|
+
}
|
|
122
|
+
const stableId = readSingleValue(metadataLines, 'Stable ID');
|
|
123
|
+
const afkHitl = readSingleValue(metadataLines, 'AFK/HITL');
|
|
124
|
+
const dependsOn = parseDependsOn(readSingleValue(metadataLines, 'Depends on'));
|
|
125
|
+
const ownershipScope = readBulletBlock(metadataLines, 'Ownership');
|
|
126
|
+
const specGate = readSingleValue(metadataLines, 'Spec gate');
|
|
127
|
+
const verification = readBulletBlock(metadataLines, 'Verification');
|
|
128
|
+
const errors = [];
|
|
129
|
+
if (!stableId) {
|
|
130
|
+
errors.push(`Issue #${issue.number} Stable ID is required`);
|
|
131
|
+
}
|
|
132
|
+
const parsedAfkHitl = afkHitl === 'afk' || afkHitl === 'hitl' ? afkHitl : undefined;
|
|
133
|
+
if (!parsedAfkHitl) {
|
|
134
|
+
errors.push(`Issue #${issue.number} AFK/HITL must be afk or hitl`);
|
|
135
|
+
}
|
|
136
|
+
if (ownershipScope.length === 0) {
|
|
137
|
+
errors.push(`Issue #${issue.number} Ownership must include at least one entry`);
|
|
138
|
+
}
|
|
139
|
+
if (specGate !== 'wave-level') {
|
|
140
|
+
errors.push(`Issue #${issue.number} Spec gate must be wave-level`);
|
|
141
|
+
}
|
|
142
|
+
if (verification.length === 0) {
|
|
143
|
+
errors.push(`Issue #${issue.number} Verification must include at least one entry`);
|
|
144
|
+
}
|
|
145
|
+
if (errors.length > 0) {
|
|
146
|
+
return { ok: false, errors };
|
|
147
|
+
}
|
|
148
|
+
const safeAfkHitl = parsedAfkHitl;
|
|
149
|
+
if (!safeAfkHitl) {
|
|
150
|
+
return { ok: false, errors: [`Issue #${issue.number} AFK/HITL must be afk or hitl`] };
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
ok: true,
|
|
154
|
+
node: {
|
|
155
|
+
issue,
|
|
156
|
+
metadata: {
|
|
157
|
+
stableId,
|
|
158
|
+
afkHitl: safeAfkHitl,
|
|
159
|
+
dependsOn,
|
|
160
|
+
ownershipScope,
|
|
161
|
+
verification,
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export function collectExecutableChildBatches(nodes, config) {
|
|
167
|
+
const errors = [];
|
|
168
|
+
const autoLabel = config.github.labels.auto.name;
|
|
169
|
+
const manualLabel = config.github.labels.manual.name;
|
|
170
|
+
const blockedLabel = config.github.labels.blocked.name;
|
|
171
|
+
const runningLabel = config.github.labels.running.name;
|
|
172
|
+
const reviewLabel = config.github.labels.review.name;
|
|
173
|
+
const nodesById = new Map();
|
|
174
|
+
for (const node of nodes) {
|
|
175
|
+
const id = node.metadata.stableId.trim();
|
|
176
|
+
if (nodesById.has(id)) {
|
|
177
|
+
errors.push(`duplicate child stableId: ${id}`);
|
|
178
|
+
}
|
|
179
|
+
nodesById.set(id, node);
|
|
180
|
+
const labels = new Set(node.issue.labels.map((label) => label.name));
|
|
181
|
+
if (node.issue.state === 'CLOSED') {
|
|
182
|
+
errors.push(`Issue #${node.issue.number} is closed`);
|
|
183
|
+
}
|
|
184
|
+
if (!labels.has(autoLabel)) {
|
|
185
|
+
errors.push(`Issue #${node.issue.number} missing ${autoLabel}`);
|
|
186
|
+
}
|
|
187
|
+
if (node.metadata.afkHitl !== 'afk') {
|
|
188
|
+
errors.push(`Issue #${node.issue.number} is ${node.metadata.afkHitl}`);
|
|
189
|
+
}
|
|
190
|
+
for (const [label, reason] of [
|
|
191
|
+
[manualLabel, 'manual'],
|
|
192
|
+
[blockedLabel, 'blocked'],
|
|
193
|
+
[runningLabel, 'running'],
|
|
194
|
+
[reviewLabel, 'review'],
|
|
195
|
+
]) {
|
|
196
|
+
if (labels.has(label)) {
|
|
197
|
+
errors.push(`Issue #${node.issue.number} is ${reason}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const graph = graphFromAutonomousNodes(nodes);
|
|
202
|
+
const validation = validatePlanGraphStructure(graph);
|
|
203
|
+
if (!validation.ok) {
|
|
204
|
+
errors.push(...validation.errors);
|
|
205
|
+
}
|
|
206
|
+
if (errors.length > 0) {
|
|
207
|
+
return { ok: false, errors };
|
|
208
|
+
}
|
|
209
|
+
const batches = scheduleExecutableBatches(nodes, Math.min(config.runner.maxParallelChildren, 3));
|
|
210
|
+
return { ok: true, batches };
|
|
211
|
+
}
|
|
212
|
+
export function topologicalPlanNodes(graph) {
|
|
213
|
+
const nodesById = new Map(graph.nodes.map((node) => [node.stableId, node]));
|
|
214
|
+
const dependencies = new Map();
|
|
215
|
+
for (const node of graph.nodes) {
|
|
216
|
+
dependencies.set(node.stableId, new Set(node.dependsOn));
|
|
217
|
+
}
|
|
218
|
+
for (const edge of graph.edges) {
|
|
219
|
+
dependencies.get(edge.to)?.add(edge.from);
|
|
220
|
+
}
|
|
221
|
+
const waves = computeTopologicalWaves(dependencies);
|
|
222
|
+
if (!waves.ok) {
|
|
223
|
+
return graph.nodes;
|
|
224
|
+
}
|
|
225
|
+
return waves.waves.flatMap((wave) => wave.flatMap((id) => {
|
|
226
|
+
const node = nodesById.get(id);
|
|
227
|
+
return node ? [node] : [];
|
|
228
|
+
}));
|
|
229
|
+
}
|
|
230
|
+
function computeTopologicalWaves(dependencies) {
|
|
231
|
+
const remaining = new Map(Array.from(dependencies, ([id, deps]) => [id, new Set(deps)]));
|
|
232
|
+
const waves = [];
|
|
233
|
+
while (remaining.size > 0) {
|
|
234
|
+
const ready = Array.from(remaining)
|
|
235
|
+
.filter(([, deps]) => deps.size === 0)
|
|
236
|
+
.map(([id]) => id)
|
|
237
|
+
.sort();
|
|
238
|
+
if (ready.length === 0) {
|
|
239
|
+
return { ok: false, error: 'graph contains a dependency cycle' };
|
|
240
|
+
}
|
|
241
|
+
waves.push(ready);
|
|
242
|
+
for (const id of ready) {
|
|
243
|
+
remaining.delete(id);
|
|
244
|
+
}
|
|
245
|
+
for (const deps of remaining.values()) {
|
|
246
|
+
for (const id of ready) {
|
|
247
|
+
deps.delete(id);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return { ok: true, waves };
|
|
252
|
+
}
|
|
253
|
+
function graphDependencies(graph) {
|
|
254
|
+
const dependencies = new Map();
|
|
255
|
+
const nodeIds = new Set((graph.nodes ?? []).map((node) => node.stableId.trim()).filter(Boolean));
|
|
256
|
+
for (const id of nodeIds) {
|
|
257
|
+
dependencies.set(id, new Set());
|
|
258
|
+
}
|
|
259
|
+
for (const node of graph.nodes ?? []) {
|
|
260
|
+
const id = node.stableId.trim();
|
|
261
|
+
const deps = dependencies.get(id);
|
|
262
|
+
if (!deps) {
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
for (const dependency of node.dependsOn) {
|
|
266
|
+
const dep = dependency.trim();
|
|
267
|
+
if (nodeIds.has(dep) && dep !== id) {
|
|
268
|
+
deps.add(dep);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
for (const edge of graph.edges ?? []) {
|
|
273
|
+
const from = edge.from.trim();
|
|
274
|
+
const to = edge.to.trim();
|
|
275
|
+
if (nodeIds.has(from) && nodeIds.has(to) && from !== to) {
|
|
276
|
+
dependencies.get(to)?.add(from);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return dependencies;
|
|
280
|
+
}
|
|
281
|
+
function graphFromAutonomousNodes(nodes) {
|
|
282
|
+
return {
|
|
283
|
+
nodes: nodes.map((node) => ({
|
|
284
|
+
stableId: node.metadata.stableId,
|
|
285
|
+
title: node.issue.title,
|
|
286
|
+
body: node.issue.body,
|
|
287
|
+
afkHitl: node.metadata.afkHitl,
|
|
288
|
+
ownershipScope: node.metadata.ownershipScope,
|
|
289
|
+
dependsOn: node.metadata.dependsOn,
|
|
290
|
+
verification: node.metadata.verification,
|
|
291
|
+
})),
|
|
292
|
+
edges: [],
|
|
293
|
+
specGate: 'wave-level',
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
function scheduleExecutableBatches(nodes, limit) {
|
|
297
|
+
const remaining = new Map(nodes.map((node) => [node.metadata.stableId, node]));
|
|
298
|
+
const completed = new Set();
|
|
299
|
+
const batches = [];
|
|
300
|
+
while (remaining.size > 0) {
|
|
301
|
+
const ready = Array.from(remaining.values())
|
|
302
|
+
.filter((node) => node.metadata.dependsOn.every((dependency) => completed.has(dependency)))
|
|
303
|
+
.sort((left, right) => left.issue.number - right.issue.number);
|
|
304
|
+
const batch = [];
|
|
305
|
+
const scopes = new Set();
|
|
306
|
+
for (const node of ready) {
|
|
307
|
+
if (batch.length >= limit) {
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
const nodeScopes = normalizedItems(node.metadata.ownershipScope);
|
|
311
|
+
if (nodeScopes.some((scope) => scopes.has(scope))) {
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
batch.push(node);
|
|
315
|
+
for (const scope of nodeScopes) {
|
|
316
|
+
scopes.add(scope);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
if (batch.length === 0 && ready[0]) {
|
|
320
|
+
batch.push(ready[0]);
|
|
321
|
+
}
|
|
322
|
+
for (const node of batch) {
|
|
323
|
+
remaining.delete(node.metadata.stableId);
|
|
324
|
+
completed.add(node.metadata.stableId);
|
|
325
|
+
}
|
|
326
|
+
batches.push(batch);
|
|
327
|
+
}
|
|
328
|
+
return batches;
|
|
329
|
+
}
|
|
330
|
+
function readMetadataSection(body) {
|
|
331
|
+
const lines = body.split(/\r?\n/);
|
|
332
|
+
const start = lines.findIndex((line) => line.trim() === '## codex-orchestrator metadata');
|
|
333
|
+
if (start < 0) {
|
|
334
|
+
return [];
|
|
335
|
+
}
|
|
336
|
+
const section = [];
|
|
337
|
+
for (const line of lines.slice(start + 1)) {
|
|
338
|
+
if (line.startsWith('## ')) {
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
341
|
+
section.push(line);
|
|
342
|
+
}
|
|
343
|
+
return section;
|
|
344
|
+
}
|
|
345
|
+
function readSingleValue(lines, key) {
|
|
346
|
+
const prefix = `${key}:`;
|
|
347
|
+
const line = lines.find((item) => item.trim().startsWith(prefix));
|
|
348
|
+
return line ? line.trim().slice(prefix.length).trim() : '';
|
|
349
|
+
}
|
|
350
|
+
function readBulletBlock(lines, key) {
|
|
351
|
+
const start = lines.findIndex((line) => line.trim() === `${key}:`);
|
|
352
|
+
if (start < 0) {
|
|
353
|
+
return [];
|
|
354
|
+
}
|
|
355
|
+
const values = [];
|
|
356
|
+
for (const line of lines.slice(start + 1)) {
|
|
357
|
+
const trimmed = line.trim();
|
|
358
|
+
if (/^[A-Za-z][A-Za-z /-]*:/.test(trimmed)) {
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
if (trimmed.startsWith('- ')) {
|
|
362
|
+
values.push(trimmed.slice(2).trim());
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return normalizedItems(values);
|
|
366
|
+
}
|
|
367
|
+
function parseDependsOn(value) {
|
|
368
|
+
if (!value || value === 'none') {
|
|
369
|
+
return [];
|
|
370
|
+
}
|
|
371
|
+
return normalizedItems(value.split(','));
|
|
372
|
+
}
|
|
373
|
+
function normalizedItems(items) {
|
|
374
|
+
return items.map((item) => item.trim()).filter(Boolean);
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=issue-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-tree.js","sourceRoot":"","sources":["../../../src/runner/issue-tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CodexOrchestratorConfig } from '../config/schema.js';
|
|
2
|
+
import type { RunnerMode } from './issue-state-machine.js';
|
|
3
|
+
export interface RunnerProcessMetadata {
|
|
4
|
+
issueNumber: number;
|
|
5
|
+
mode: RunnerMode;
|
|
6
|
+
parentIssueNumber?: number;
|
|
7
|
+
workspacePath: string;
|
|
8
|
+
sessionId: string;
|
|
9
|
+
retryCount: number;
|
|
10
|
+
createdAt: string;
|
|
11
|
+
updatedAt: string;
|
|
12
|
+
lastRecoveredAt?: string;
|
|
13
|
+
branchName?: string;
|
|
14
|
+
promptPath?: string;
|
|
15
|
+
reportPath?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface RunnerStateFile {
|
|
18
|
+
version: 1;
|
|
19
|
+
runs: RunnerProcessMetadata[];
|
|
20
|
+
}
|
|
21
|
+
export declare class RunnerStateStore {
|
|
22
|
+
private readonly targetRoot;
|
|
23
|
+
private readonly config;
|
|
24
|
+
constructor(targetRoot: string, config: CodexOrchestratorConfig);
|
|
25
|
+
statePath(): string;
|
|
26
|
+
load(): Promise<RunnerStateFile>;
|
|
27
|
+
save(state: RunnerStateFile): Promise<void>;
|
|
28
|
+
upsertRun(metadata: RunnerProcessMetadata): Promise<void>;
|
|
29
|
+
removeRun(issueNumber: number): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=local-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-state.d.ts","sourceRoot":"","sources":["../../../src/runner/local-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,qBAAqB,EAAE,CAAC;CAC/B;AAED,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,uBAAuB;IAG3C,SAAS,IAAI,MAAM;IAIb,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC;IAchC,IAAI,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3C,SAAS,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAazD,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAO3D"}
|