agent-composer 0.3.1 → 0.4.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/README.md +495 -180
- package/composer.config.schema.json +206 -2
- package/dist/cli/cleanup.d.ts +24 -0
- package/dist/cli/cleanup.js +151 -0
- package/dist/cli/cleanup.js.map +1 -0
- package/dist/cli/doctor.d.ts +12 -0
- package/dist/cli/doctor.js +244 -4
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/goal.d.ts +28 -0
- package/dist/cli/goal.js +251 -0
- package/dist/cli/goal.js.map +1 -0
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.js +31 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/init.d.ts +5 -0
- package/dist/cli/init.js +116 -21
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/initArgs.d.ts +16 -0
- package/dist/cli/initArgs.js +19 -0
- package/dist/cli/initArgs.js.map +1 -0
- package/dist/cli/installGitHook.d.ts +7 -0
- package/dist/cli/installGitHook.js +61 -0
- package/dist/cli/installGitHook.js.map +1 -0
- package/dist/cli/mode.d.ts +6 -0
- package/dist/cli/mode.js +25 -0
- package/dist/cli/mode.js.map +1 -0
- package/dist/cli/status.d.ts +105 -0
- package/dist/cli/status.js +400 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/config/env.d.ts +1 -1
- package/dist/config/modes.d.ts +10 -0
- package/dist/config/modes.js +26 -0
- package/dist/config/modes.js.map +1 -0
- package/dist/config/oracleRole.d.ts +10 -0
- package/dist/config/oracleRole.js +11 -0
- package/dist/config/oracleRole.js.map +1 -0
- package/dist/config/schema.d.ts +246 -0
- package/dist/config/schema.js +127 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/evolve/reflection.d.ts +9 -0
- package/dist/evolve/reflection.js +14 -0
- package/dist/evolve/reflection.js.map +1 -1
- package/dist/evolve/runner.d.ts +2 -1
- package/dist/evolve/runner.js +2 -1
- package/dist/evolve/runner.js.map +1 -1
- package/dist/index.js +115 -6
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicCompatibleProvider.d.ts +13 -1
- package/dist/providers/AnthropicCompatibleProvider.js +115 -9
- package/dist/providers/AnthropicCompatibleProvider.js.map +1 -1
- package/dist/providers/CLIProvider.d.ts +18 -0
- package/dist/providers/CLIProvider.js +265 -62
- package/dist/providers/CLIProvider.js.map +1 -1
- package/dist/providers/IProvider.d.ts +12 -0
- package/dist/providers/SpendGuardProvider.d.ts +32 -0
- package/dist/providers/SpendGuardProvider.js +98 -0
- package/dist/providers/SpendGuardProvider.js.map +1 -0
- package/dist/registry.d.ts +5 -2
- package/dist/registry.js +17 -2
- package/dist/registry.js.map +1 -1
- package/dist/server/activeRuns.d.ts +17 -0
- package/dist/server/activeRuns.js +114 -0
- package/dist/server/activeRuns.js.map +1 -0
- package/dist/server/codexLifecycleRunner.d.ts +29 -0
- package/dist/server/codexLifecycleRunner.js +188 -0
- package/dist/server/codexLifecycleRunner.js.map +1 -0
- package/dist/server/configMutation.d.ts +22 -0
- package/dist/server/configMutation.js +121 -0
- package/dist/server/configMutation.js.map +1 -0
- package/dist/server/handoffContext.d.ts +1 -0
- package/dist/server/handoffContext.js +12 -0
- package/dist/server/handoffContext.js.map +1 -0
- package/dist/server/progress.d.ts +24 -0
- package/dist/server/progress.js +109 -0
- package/dist/server/progress.js.map +1 -0
- package/dist/server/toolDescriptions.d.ts +60 -0
- package/dist/server/toolDescriptions.js +134 -0
- package/dist/server/toolDescriptions.js.map +1 -0
- package/dist/server.d.ts +19 -25
- package/dist/server.js +87 -377
- package/dist/server.js.map +1 -1
- package/dist/tools/audit.d.ts +2 -0
- package/dist/tools/audit.js +66 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/code.d.ts +2 -0
- package/dist/tools/code.js +160 -0
- package/dist/tools/code.js.map +1 -0
- package/dist/tools/codexLifecycle.d.ts +2 -0
- package/dist/tools/codexLifecycle.js +206 -0
- package/dist/tools/codexLifecycle.js.map +1 -0
- package/dist/tools/config.d.ts +2 -0
- package/dist/tools/config.js +183 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/context.d.ts +31 -0
- package/dist/tools/context.js +2 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/goal.d.ts +2 -0
- package/dist/tools/goal.js +159 -0
- package/dist/tools/goal.js.map +1 -0
- package/dist/tools/handoff.d.ts +2 -0
- package/dist/tools/handoff.js +57 -0
- package/dist/tools/handoff.js.map +1 -0
- package/dist/tools/oracle.d.ts +2 -0
- package/dist/tools/oracle.js +248 -0
- package/dist/tools/oracle.js.map +1 -0
- package/dist/tools/research.d.ts +2 -0
- package/dist/tools/research.js +51 -0
- package/dist/tools/research.js.map +1 -0
- package/dist/tools/review.d.ts +2 -0
- package/dist/tools/review.js +233 -0
- package/dist/tools/review.js.map +1 -0
- package/dist/tools/route.d.ts +2 -0
- package/dist/tools/route.js +69 -0
- package/dist/tools/route.js.map +1 -0
- package/dist/tools/session.d.ts +2 -0
- package/dist/tools/session.js +37 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/tools/status.d.ts +2 -0
- package/dist/tools/status.js +34 -0
- package/dist/tools/status.js.map +1 -0
- package/dist/tools/workflow.d.ts +2 -0
- package/dist/tools/workflow.js +27 -0
- package/dist/tools/workflow.js.map +1 -0
- package/dist/util/applyFileBlocks.d.ts +18 -0
- package/dist/util/applyFileBlocks.js +163 -0
- package/dist/util/applyFileBlocks.js.map +1 -0
- package/dist/util/asyncControl.d.ts +14 -0
- package/dist/util/asyncControl.js +106 -0
- package/dist/util/asyncControl.js.map +1 -0
- package/dist/util/auditLog.d.ts +56 -0
- package/dist/util/auditLog.js +232 -0
- package/dist/util/auditLog.js.map +1 -0
- package/dist/util/codexLifecycle.d.ts +55 -0
- package/dist/util/codexLifecycle.js +102 -0
- package/dist/util/codexLifecycle.js.map +1 -0
- package/dist/util/codexLifecycleJob.d.ts +209 -0
- package/dist/util/codexLifecycleJob.js +360 -0
- package/dist/util/codexLifecycleJob.js.map +1 -0
- package/dist/util/composerDisabled.d.ts +6 -0
- package/dist/util/composerDisabled.js +27 -0
- package/dist/util/composerDisabled.js.map +1 -0
- package/dist/util/dispatchHint.d.ts +5 -3
- package/dist/util/dispatchHint.js +62 -2
- package/dist/util/dispatchHint.js.map +1 -1
- package/dist/util/goal.d.ts +132 -0
- package/dist/util/goal.js +616 -0
- package/dist/util/goal.js.map +1 -0
- package/dist/util/goalReport.d.ts +51 -0
- package/dist/util/goalReport.js +164 -0
- package/dist/util/goalReport.js.map +1 -0
- package/dist/util/jobPolling.d.ts +9 -0
- package/dist/util/jobPolling.js +17 -0
- package/dist/util/jobPolling.js.map +1 -0
- package/dist/util/oracleJob.d.ts +66 -0
- package/dist/util/oracleJob.js +295 -0
- package/dist/util/oracleJob.js.map +1 -0
- package/dist/util/oracleLock.d.ts +38 -0
- package/dist/util/oracleLock.js +182 -0
- package/dist/util/oracleLock.js.map +1 -0
- package/dist/util/reviewDiff.d.ts +8 -0
- package/dist/util/reviewDiff.js +29 -0
- package/dist/util/reviewDiff.js.map +1 -0
- package/dist/util/reviewJob.d.ts +57 -0
- package/dist/util/reviewJob.js +207 -0
- package/dist/util/reviewJob.js.map +1 -0
- package/dist/util/workflowPlan.d.ts +24 -0
- package/dist/util/workflowPlan.js +49 -0
- package/dist/util/workflowPlan.js.map +1 -0
- package/package.json +8 -1
- package/plugin/composer-mastermind/commands/evolve.md +4 -0
- package/plugin/composer-mastermind/hooks/boundary_guard.sh +43 -2
- package/plugin/composer-mastermind/hooks/codex_warm_review.sh +161 -9
- package/plugin/composer-mastermind/hooks/learn.sh +172 -32
- package/plugin/composer-mastermind/hooks/precommit_codex_review.sh +430 -62
- package/plugin/composer-mastermind/skills/composer-mastermind/SKILL.md +184 -4
- package/scripts/composer-oracle-router-safe.sh +47 -0
- package/scripts/composer-statusline-segment.mjs +40 -0
- package/scripts/oracle-codex-handoff-safe.sh +49 -0
- package/scripts/oracle-plan-mcp.sh +66 -0
- package/scripts/oracle-pro-safe.sh +471 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type CodexLifecycleEvent } from "../config/schema.js";
|
|
3
|
+
import type { CodexLifecycleDecision } from "./codexLifecycle.js";
|
|
4
|
+
export declare const CODEX_LIFECYCLE_JOB_DIR = "codex-lifecycle";
|
|
5
|
+
export declare const CODEX_LIFECYCLE_JOB_VERSION = 1;
|
|
6
|
+
export declare const COMPOSER_STATE_DIR_ENV = "COMPOSER_STATE_DIR";
|
|
7
|
+
export declare const CodexLifecycleJobStatusSchema: z.ZodEnum<{
|
|
8
|
+
queued: "queued";
|
|
9
|
+
running: "running";
|
|
10
|
+
succeeded: "succeeded";
|
|
11
|
+
failed: "failed";
|
|
12
|
+
skipped: "skipped";
|
|
13
|
+
unavailable: "unavailable";
|
|
14
|
+
}>;
|
|
15
|
+
export type CodexLifecycleJobStatus = z.infer<typeof CodexLifecycleJobStatusSchema>;
|
|
16
|
+
export declare const CodexLifecycleUnavailableReasonSchema: z.ZodEnum<{
|
|
17
|
+
unknown: "unknown";
|
|
18
|
+
provider: "provider";
|
|
19
|
+
auth: "auth";
|
|
20
|
+
quota: "quota";
|
|
21
|
+
rate_limit: "rate_limit";
|
|
22
|
+
timeout: "timeout";
|
|
23
|
+
cancelled: "cancelled";
|
|
24
|
+
}>;
|
|
25
|
+
export type CodexLifecycleUnavailableReason = z.infer<typeof CodexLifecycleUnavailableReasonSchema>;
|
|
26
|
+
export declare const CodexLifecycleProviderAttemptSchema: z.ZodObject<{
|
|
27
|
+
role: z.ZodEnum<{
|
|
28
|
+
researcher: "researcher";
|
|
29
|
+
coder: "coder";
|
|
30
|
+
reviewer: "reviewer";
|
|
31
|
+
reviewerClaude: "reviewerClaude";
|
|
32
|
+
coderCli: "coderCli";
|
|
33
|
+
oraclePlanner: "oraclePlanner";
|
|
34
|
+
}>;
|
|
35
|
+
status: z.ZodEnum<{
|
|
36
|
+
succeeded: "succeeded";
|
|
37
|
+
unavailable: "unavailable";
|
|
38
|
+
}>;
|
|
39
|
+
startedAt: z.ZodString;
|
|
40
|
+
completedAt: z.ZodString;
|
|
41
|
+
unavailableReason: z.ZodOptional<z.ZodEnum<{
|
|
42
|
+
unknown: "unknown";
|
|
43
|
+
provider: "provider";
|
|
44
|
+
auth: "auth";
|
|
45
|
+
quota: "quota";
|
|
46
|
+
rate_limit: "rate_limit";
|
|
47
|
+
timeout: "timeout";
|
|
48
|
+
cancelled: "cancelled";
|
|
49
|
+
}>>;
|
|
50
|
+
error: z.ZodOptional<z.ZodString>;
|
|
51
|
+
}, z.core.$strict>;
|
|
52
|
+
export type CodexLifecycleProviderAttempt = z.infer<typeof CodexLifecycleProviderAttemptSchema>;
|
|
53
|
+
export declare const CodexLifecycleDecisionSnapshotSchema: z.ZodObject<{
|
|
54
|
+
event: z.ZodEnum<{
|
|
55
|
+
preCommit: "preCommit";
|
|
56
|
+
postPlan: "postPlan";
|
|
57
|
+
postResearch: "postResearch";
|
|
58
|
+
postCodeApply: "postCodeApply";
|
|
59
|
+
postTestFailure: "postTestFailure";
|
|
60
|
+
afterFailedAttempts: "afterFailedAttempts";
|
|
61
|
+
stopWarm: "stopWarm";
|
|
62
|
+
}>;
|
|
63
|
+
action: z.ZodEnum<{
|
|
64
|
+
ask: "ask";
|
|
65
|
+
skip: "skip";
|
|
66
|
+
run: "run";
|
|
67
|
+
}>;
|
|
68
|
+
score: z.ZodNumber;
|
|
69
|
+
threshold: z.ZodNumber;
|
|
70
|
+
model: z.ZodString;
|
|
71
|
+
execution: z.ZodEnum<{
|
|
72
|
+
foreground: "foreground";
|
|
73
|
+
background: "background";
|
|
74
|
+
}>;
|
|
75
|
+
reasons: z.ZodArray<z.ZodString>;
|
|
76
|
+
}, z.core.$strict>;
|
|
77
|
+
export declare const CodexLifecycleJobSchema: z.ZodObject<{
|
|
78
|
+
version: z.ZodLiteral<1>;
|
|
79
|
+
jobId: z.ZodString;
|
|
80
|
+
event: z.ZodEnum<{
|
|
81
|
+
preCommit: "preCommit";
|
|
82
|
+
postPlan: "postPlan";
|
|
83
|
+
postResearch: "postResearch";
|
|
84
|
+
postCodeApply: "postCodeApply";
|
|
85
|
+
postTestFailure: "postTestFailure";
|
|
86
|
+
afterFailedAttempts: "afterFailedAttempts";
|
|
87
|
+
stopWarm: "stopWarm";
|
|
88
|
+
}>;
|
|
89
|
+
status: z.ZodEnum<{
|
|
90
|
+
queued: "queued";
|
|
91
|
+
running: "running";
|
|
92
|
+
succeeded: "succeeded";
|
|
93
|
+
failed: "failed";
|
|
94
|
+
skipped: "skipped";
|
|
95
|
+
unavailable: "unavailable";
|
|
96
|
+
}>;
|
|
97
|
+
action: z.ZodEnum<{
|
|
98
|
+
ask: "ask";
|
|
99
|
+
skip: "skip";
|
|
100
|
+
run: "run";
|
|
101
|
+
}>;
|
|
102
|
+
execution: z.ZodEnum<{
|
|
103
|
+
foreground: "foreground";
|
|
104
|
+
background: "background";
|
|
105
|
+
}>;
|
|
106
|
+
model: z.ZodString;
|
|
107
|
+
createdAt: z.ZodString;
|
|
108
|
+
updatedAt: z.ZodString;
|
|
109
|
+
resultPath: z.ZodString;
|
|
110
|
+
pid: z.ZodOptional<z.ZodNumber>;
|
|
111
|
+
handoffPath: z.ZodOptional<z.ZodString>;
|
|
112
|
+
objective: z.ZodOptional<z.ZodString>;
|
|
113
|
+
startedAt: z.ZodOptional<z.ZodString>;
|
|
114
|
+
completedAt: z.ZodOptional<z.ZodString>;
|
|
115
|
+
resultText: z.ZodOptional<z.ZodString>;
|
|
116
|
+
error: z.ZodOptional<z.ZodString>;
|
|
117
|
+
unavailableReason: z.ZodOptional<z.ZodEnum<{
|
|
118
|
+
unknown: "unknown";
|
|
119
|
+
provider: "provider";
|
|
120
|
+
auth: "auth";
|
|
121
|
+
quota: "quota";
|
|
122
|
+
rate_limit: "rate_limit";
|
|
123
|
+
timeout: "timeout";
|
|
124
|
+
cancelled: "cancelled";
|
|
125
|
+
}>>;
|
|
126
|
+
providerRole: z.ZodOptional<z.ZodEnum<{
|
|
127
|
+
researcher: "researcher";
|
|
128
|
+
coder: "coder";
|
|
129
|
+
reviewer: "reviewer";
|
|
130
|
+
reviewerClaude: "reviewerClaude";
|
|
131
|
+
coderCli: "coderCli";
|
|
132
|
+
oraclePlanner: "oraclePlanner";
|
|
133
|
+
}>>;
|
|
134
|
+
fallbackUsed: z.ZodOptional<z.ZodEnum<{
|
|
135
|
+
researcher: "researcher";
|
|
136
|
+
coder: "coder";
|
|
137
|
+
reviewer: "reviewer";
|
|
138
|
+
reviewerClaude: "reviewerClaude";
|
|
139
|
+
coderCli: "coderCli";
|
|
140
|
+
oraclePlanner: "oraclePlanner";
|
|
141
|
+
}>>;
|
|
142
|
+
attempts: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
143
|
+
role: z.ZodEnum<{
|
|
144
|
+
researcher: "researcher";
|
|
145
|
+
coder: "coder";
|
|
146
|
+
reviewer: "reviewer";
|
|
147
|
+
reviewerClaude: "reviewerClaude";
|
|
148
|
+
coderCli: "coderCli";
|
|
149
|
+
oraclePlanner: "oraclePlanner";
|
|
150
|
+
}>;
|
|
151
|
+
status: z.ZodEnum<{
|
|
152
|
+
succeeded: "succeeded";
|
|
153
|
+
unavailable: "unavailable";
|
|
154
|
+
}>;
|
|
155
|
+
startedAt: z.ZodString;
|
|
156
|
+
completedAt: z.ZodString;
|
|
157
|
+
unavailableReason: z.ZodOptional<z.ZodEnum<{
|
|
158
|
+
unknown: "unknown";
|
|
159
|
+
provider: "provider";
|
|
160
|
+
auth: "auth";
|
|
161
|
+
quota: "quota";
|
|
162
|
+
rate_limit: "rate_limit";
|
|
163
|
+
timeout: "timeout";
|
|
164
|
+
cancelled: "cancelled";
|
|
165
|
+
}>>;
|
|
166
|
+
error: z.ZodOptional<z.ZodString>;
|
|
167
|
+
}, z.core.$strict>>>;
|
|
168
|
+
decision: z.ZodObject<{
|
|
169
|
+
event: z.ZodEnum<{
|
|
170
|
+
preCommit: "preCommit";
|
|
171
|
+
postPlan: "postPlan";
|
|
172
|
+
postResearch: "postResearch";
|
|
173
|
+
postCodeApply: "postCodeApply";
|
|
174
|
+
postTestFailure: "postTestFailure";
|
|
175
|
+
afterFailedAttempts: "afterFailedAttempts";
|
|
176
|
+
stopWarm: "stopWarm";
|
|
177
|
+
}>;
|
|
178
|
+
action: z.ZodEnum<{
|
|
179
|
+
ask: "ask";
|
|
180
|
+
skip: "skip";
|
|
181
|
+
run: "run";
|
|
182
|
+
}>;
|
|
183
|
+
score: z.ZodNumber;
|
|
184
|
+
threshold: z.ZodNumber;
|
|
185
|
+
model: z.ZodString;
|
|
186
|
+
execution: z.ZodEnum<{
|
|
187
|
+
foreground: "foreground";
|
|
188
|
+
background: "background";
|
|
189
|
+
}>;
|
|
190
|
+
reasons: z.ZodArray<z.ZodString>;
|
|
191
|
+
}, z.core.$strict>;
|
|
192
|
+
}, z.core.$strict>;
|
|
193
|
+
export type CodexLifecycleJob = z.infer<typeof CodexLifecycleJobSchema>;
|
|
194
|
+
export interface NewCodexLifecycleJobInput {
|
|
195
|
+
event: CodexLifecycleEvent;
|
|
196
|
+
decision: CodexLifecycleDecision;
|
|
197
|
+
execution: "foreground" | "background";
|
|
198
|
+
handoffPath?: string;
|
|
199
|
+
objective?: string;
|
|
200
|
+
}
|
|
201
|
+
export declare function newCodexLifecycleJob(root: string, input: NewCodexLifecycleJobInput): CodexLifecycleJob;
|
|
202
|
+
export declare function writeCodexLifecycleJob(root: string, job: CodexLifecycleJob): CodexLifecycleJob;
|
|
203
|
+
export declare function updateCodexLifecycleJob(root: string, job: CodexLifecycleJob, patch: Partial<Omit<CodexLifecycleJob, "version" | "jobId" | "createdAt" | "resultPath">>): CodexLifecycleJob;
|
|
204
|
+
export declare function readCodexLifecycleJob(root: string, jobId: string): CodexLifecycleJob | null;
|
|
205
|
+
export declare function readLatestCodexLifecycleJob(root: string): CodexLifecycleJob | null;
|
|
206
|
+
export declare function failInFlightCodexLifecycleJobs(root: string, error: string): number;
|
|
207
|
+
export declare function reconcileCodexLifecycleJob(root: string, job: CodexLifecycleJob): CodexLifecycleJob;
|
|
208
|
+
export declare function codexLifecycleJobPath(root: string, jobId: string): string;
|
|
209
|
+
export declare function classifyCodexLifecycleUnavailable(error: unknown): CodexLifecycleUnavailableReason;
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { chmodSync, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { CodexLifecycleEventSchema, CodexLifecycleExecutionSchema, RoleNameSchema, } from "../config/schema.js";
|
|
7
|
+
export const CODEX_LIFECYCLE_JOB_DIR = "codex-lifecycle";
|
|
8
|
+
export const CODEX_LIFECYCLE_JOB_VERSION = 1;
|
|
9
|
+
export const COMPOSER_STATE_DIR_ENV = "COMPOSER_STATE_DIR";
|
|
10
|
+
const LATEST_CODEX_LIFECYCLE_JOB_POINTER = ".latest";
|
|
11
|
+
export const CodexLifecycleJobStatusSchema = z.enum([
|
|
12
|
+
"queued",
|
|
13
|
+
"running",
|
|
14
|
+
"succeeded",
|
|
15
|
+
"failed",
|
|
16
|
+
"skipped",
|
|
17
|
+
"unavailable",
|
|
18
|
+
]);
|
|
19
|
+
export const CodexLifecycleUnavailableReasonSchema = z.enum([
|
|
20
|
+
"auth",
|
|
21
|
+
"quota",
|
|
22
|
+
"rate_limit",
|
|
23
|
+
"timeout",
|
|
24
|
+
"cancelled",
|
|
25
|
+
"provider",
|
|
26
|
+
"unknown",
|
|
27
|
+
]);
|
|
28
|
+
export const CodexLifecycleProviderAttemptSchema = z
|
|
29
|
+
.object({
|
|
30
|
+
role: RoleNameSchema,
|
|
31
|
+
status: z.enum(["succeeded", "unavailable"]),
|
|
32
|
+
startedAt: z.string().datetime(),
|
|
33
|
+
completedAt: z.string().datetime(),
|
|
34
|
+
unavailableReason: CodexLifecycleUnavailableReasonSchema.optional(),
|
|
35
|
+
error: z.string().optional(),
|
|
36
|
+
})
|
|
37
|
+
.strict();
|
|
38
|
+
export const CodexLifecycleDecisionSnapshotSchema = z
|
|
39
|
+
.object({
|
|
40
|
+
event: CodexLifecycleEventSchema,
|
|
41
|
+
action: z.enum(["skip", "ask", "run"]),
|
|
42
|
+
score: z.number(),
|
|
43
|
+
threshold: z.number(),
|
|
44
|
+
model: z.string().min(1),
|
|
45
|
+
execution: CodexLifecycleExecutionSchema,
|
|
46
|
+
reasons: z.array(z.string()),
|
|
47
|
+
})
|
|
48
|
+
.strict();
|
|
49
|
+
export const CodexLifecycleJobSchema = z
|
|
50
|
+
.object({
|
|
51
|
+
version: z.literal(CODEX_LIFECYCLE_JOB_VERSION),
|
|
52
|
+
jobId: z.string().uuid(),
|
|
53
|
+
event: CodexLifecycleEventSchema,
|
|
54
|
+
status: CodexLifecycleJobStatusSchema,
|
|
55
|
+
action: z.enum(["skip", "ask", "run"]),
|
|
56
|
+
execution: CodexLifecycleExecutionSchema,
|
|
57
|
+
model: z.string().min(1),
|
|
58
|
+
createdAt: z.string().datetime(),
|
|
59
|
+
updatedAt: z.string().datetime(),
|
|
60
|
+
resultPath: z.string().min(1),
|
|
61
|
+
pid: z.number().int().optional(),
|
|
62
|
+
handoffPath: z.string().min(1).optional(),
|
|
63
|
+
objective: z.string().min(1).optional(),
|
|
64
|
+
startedAt: z.string().datetime().optional(),
|
|
65
|
+
completedAt: z.string().datetime().optional(),
|
|
66
|
+
resultText: z.string().optional(),
|
|
67
|
+
error: z.string().optional(),
|
|
68
|
+
unavailableReason: CodexLifecycleUnavailableReasonSchema.optional(),
|
|
69
|
+
providerRole: RoleNameSchema.optional(),
|
|
70
|
+
fallbackUsed: RoleNameSchema.optional(),
|
|
71
|
+
attempts: z.array(CodexLifecycleProviderAttemptSchema).default([]),
|
|
72
|
+
decision: CodexLifecycleDecisionSnapshotSchema,
|
|
73
|
+
})
|
|
74
|
+
.strict();
|
|
75
|
+
export function newCodexLifecycleJob(root, input) {
|
|
76
|
+
const now = new Date().toISOString();
|
|
77
|
+
const jobId = randomUUID();
|
|
78
|
+
return CodexLifecycleJobSchema.parse({
|
|
79
|
+
version: CODEX_LIFECYCLE_JOB_VERSION,
|
|
80
|
+
jobId,
|
|
81
|
+
event: input.event,
|
|
82
|
+
status: "queued",
|
|
83
|
+
action: input.decision.action,
|
|
84
|
+
execution: input.execution,
|
|
85
|
+
model: input.decision.model,
|
|
86
|
+
createdAt: now,
|
|
87
|
+
updatedAt: now,
|
|
88
|
+
resultPath: codexLifecycleJobPath(root, jobId),
|
|
89
|
+
pid: process.pid,
|
|
90
|
+
handoffPath: input.handoffPath,
|
|
91
|
+
objective: input.objective,
|
|
92
|
+
attempts: [],
|
|
93
|
+
decision: {
|
|
94
|
+
...input.decision,
|
|
95
|
+
execution: input.execution,
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
export function writeCodexLifecycleJob(root, job) {
|
|
100
|
+
const validated = CodexLifecycleJobSchema.parse({
|
|
101
|
+
...job,
|
|
102
|
+
resultPath: codexLifecycleJobPath(root, job.jobId),
|
|
103
|
+
});
|
|
104
|
+
const dir = ensureCodexLifecycleJobDir(root);
|
|
105
|
+
const resultPath = path.join(dir, `${job.jobId}.json`);
|
|
106
|
+
const next = CodexLifecycleJobSchema.parse({
|
|
107
|
+
...validated,
|
|
108
|
+
resultPath,
|
|
109
|
+
});
|
|
110
|
+
writeJobFileAtomically(resultPath, `${JSON.stringify(next, null, 2)}\n`);
|
|
111
|
+
writePointerFileAtomically(path.join(dir, LATEST_CODEX_LIFECYCLE_JOB_POINTER), `${next.jobId}\n`);
|
|
112
|
+
return next;
|
|
113
|
+
}
|
|
114
|
+
export function updateCodexLifecycleJob(root, job, patch) {
|
|
115
|
+
return writeCodexLifecycleJob(root, CodexLifecycleJobSchema.parse({
|
|
116
|
+
...job,
|
|
117
|
+
...patch,
|
|
118
|
+
updatedAt: new Date().toISOString(),
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
export function readCodexLifecycleJob(root, jobId) {
|
|
122
|
+
const parsed = z.string().uuid().safeParse(jobId);
|
|
123
|
+
if (!parsed.success)
|
|
124
|
+
return null;
|
|
125
|
+
const dir = existingCodexLifecycleJobDir(root);
|
|
126
|
+
if (!dir)
|
|
127
|
+
return null;
|
|
128
|
+
const filePath = path.join(dir, `${parsed.data}.json`);
|
|
129
|
+
if (!existsSync(filePath))
|
|
130
|
+
return null;
|
|
131
|
+
if (lstatSync(filePath).isSymbolicLink())
|
|
132
|
+
return null;
|
|
133
|
+
const raw = readFileSync(filePath, "utf8");
|
|
134
|
+
const parsedJob = CodexLifecycleJobSchema.parse(JSON.parse(raw));
|
|
135
|
+
return reconcileCodexLifecycleJob(root, parsedJob);
|
|
136
|
+
}
|
|
137
|
+
export function readLatestCodexLifecycleJob(root) {
|
|
138
|
+
const dir = existingCodexLifecycleJobDir(root);
|
|
139
|
+
if (!dir)
|
|
140
|
+
return null;
|
|
141
|
+
const pointed = readLatestCodexLifecycleJobPointer(root, dir);
|
|
142
|
+
if (pointed)
|
|
143
|
+
return pointed;
|
|
144
|
+
const candidates = readdirSync(dir)
|
|
145
|
+
.filter((name) => name.endsWith(".json"))
|
|
146
|
+
.map((name) => path.join(dir, name))
|
|
147
|
+
.filter((filePath) => {
|
|
148
|
+
try {
|
|
149
|
+
return !lstatSync(filePath).isSymbolicLink() && statSync(filePath).isFile();
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
})
|
|
155
|
+
.sort((a, b) => statSync(b).mtimeMs - statSync(a).mtimeMs);
|
|
156
|
+
for (const filePath of candidates) {
|
|
157
|
+
try {
|
|
158
|
+
const raw = readFileSync(filePath, "utf8");
|
|
159
|
+
const job = CodexLifecycleJobSchema.parse(JSON.parse(raw));
|
|
160
|
+
return reconcileCodexLifecycleJob(root, job);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
export function failInFlightCodexLifecycleJobs(root, error) {
|
|
169
|
+
const dir = existingCodexLifecycleJobDir(root);
|
|
170
|
+
if (!dir)
|
|
171
|
+
return 0;
|
|
172
|
+
let failed = 0;
|
|
173
|
+
for (const name of readdirSync(dir)) {
|
|
174
|
+
if (!name.endsWith(".json"))
|
|
175
|
+
continue;
|
|
176
|
+
const filePath = path.join(dir, name);
|
|
177
|
+
try {
|
|
178
|
+
if (lstatSync(filePath).isSymbolicLink() || !statSync(filePath).isFile())
|
|
179
|
+
continue;
|
|
180
|
+
const job = CodexLifecycleJobSchema.parse(JSON.parse(readFileSync(filePath, "utf8")));
|
|
181
|
+
if (job.status !== "queued" && job.status !== "running")
|
|
182
|
+
continue;
|
|
183
|
+
if (typeof job.pid === "number" && job.pid !== process.pid)
|
|
184
|
+
continue;
|
|
185
|
+
const now = new Date().toISOString();
|
|
186
|
+
const next = CodexLifecycleJobSchema.parse({
|
|
187
|
+
...job,
|
|
188
|
+
status: "failed",
|
|
189
|
+
updatedAt: now,
|
|
190
|
+
completedAt: now,
|
|
191
|
+
error,
|
|
192
|
+
});
|
|
193
|
+
writeJobFileAtomically(filePath, `${JSON.stringify(next, null, 2)}\n`);
|
|
194
|
+
failed++;
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return failed;
|
|
201
|
+
}
|
|
202
|
+
function readLatestCodexLifecycleJobPointer(root, dir) {
|
|
203
|
+
const pointerPath = path.join(dir, LATEST_CODEX_LIFECYCLE_JOB_POINTER);
|
|
204
|
+
try {
|
|
205
|
+
if (!existsSync(pointerPath))
|
|
206
|
+
return null;
|
|
207
|
+
if (lstatSync(pointerPath).isSymbolicLink())
|
|
208
|
+
return null;
|
|
209
|
+
const jobId = readFileSync(pointerPath, "utf8").trim();
|
|
210
|
+
const parsed = z.string().uuid().safeParse(jobId);
|
|
211
|
+
if (!parsed.success)
|
|
212
|
+
return null;
|
|
213
|
+
const filePath = path.join(dir, `${parsed.data}.json`);
|
|
214
|
+
if (!existsSync(filePath))
|
|
215
|
+
return null;
|
|
216
|
+
if (lstatSync(filePath).isSymbolicLink())
|
|
217
|
+
return null;
|
|
218
|
+
if (!statSync(filePath).isFile())
|
|
219
|
+
return null;
|
|
220
|
+
const raw = readFileSync(filePath, "utf8");
|
|
221
|
+
const job = CodexLifecycleJobSchema.parse(JSON.parse(raw));
|
|
222
|
+
if (job.jobId !== parsed.data || path.resolve(job.resultPath) !== path.resolve(filePath)) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
return reconcileCodexLifecycleJob(root, job);
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
export function reconcileCodexLifecycleJob(root, job) {
|
|
232
|
+
const nonTerminal = job.status === "queued" || job.status === "running";
|
|
233
|
+
if (nonTerminal &&
|
|
234
|
+
typeof job.pid === "number" &&
|
|
235
|
+
job.pid !== process.pid &&
|
|
236
|
+
!isProcessAlive(job.pid)) {
|
|
237
|
+
return updateCodexLifecycleJob(root, job, {
|
|
238
|
+
status: "failed",
|
|
239
|
+
completedAt: new Date().toISOString(),
|
|
240
|
+
error: `Codex lifecycle job orphaned: the server process (pid ${job.pid}) that started it is no longer running (likely a restart).`,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
return job;
|
|
244
|
+
}
|
|
245
|
+
export function codexLifecycleJobPath(root, jobId) {
|
|
246
|
+
return path.resolve(codexLifecycleJobDir(root), `${jobId}.json`);
|
|
247
|
+
}
|
|
248
|
+
export function classifyCodexLifecycleUnavailable(error) {
|
|
249
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
250
|
+
const normalized = message.toLowerCase();
|
|
251
|
+
if (/\b(abort|aborted|cancelled|canceled)\b/.test(normalized)) {
|
|
252
|
+
return "cancelled";
|
|
253
|
+
}
|
|
254
|
+
if (/\b(timed out|timeout|etimedout)\b/.test(normalized)) {
|
|
255
|
+
return "timeout";
|
|
256
|
+
}
|
|
257
|
+
if (/\b(auth|authenticated|authentication|credential|credentials|login|logged in|unauthori[sz]ed|forbidden|access token|api key|401|403)\b/.test(normalized)) {
|
|
258
|
+
return "auth";
|
|
259
|
+
}
|
|
260
|
+
if (/\b(quota|insufficient_quota|usage limit|credit|billing|out of tokens|token budget|token limit|tokens exhausted|limit reached|monthly limit)\b/.test(normalized)) {
|
|
261
|
+
return "quota";
|
|
262
|
+
}
|
|
263
|
+
if (/\b(rate limit|rate-limit|too many requests|temporarily unavailable|overloaded|overloaded_error|econnreset|ecconnreset|econnrefused|enotfound|fetch failed|socket hang up|connection error|529|503|429)\b/.test(normalized)) {
|
|
264
|
+
return "rate_limit";
|
|
265
|
+
}
|
|
266
|
+
if (/\b(provider|codex|cli)\b/.test(normalized)) {
|
|
267
|
+
return "provider";
|
|
268
|
+
}
|
|
269
|
+
return "unknown";
|
|
270
|
+
}
|
|
271
|
+
function codexLifecycleJobDir(root) {
|
|
272
|
+
const rootReal = realpathSync(root);
|
|
273
|
+
return path.join(codexLifecycleStateRoot(), CODEX_LIFECYCLE_JOB_DIR, projectStateKey(rootReal));
|
|
274
|
+
}
|
|
275
|
+
function ensureCodexLifecycleJobDir(root) {
|
|
276
|
+
const rootReal = realpathSync(root);
|
|
277
|
+
const stateRoot = codexLifecycleStateRoot();
|
|
278
|
+
const lifecycleRoot = path.join(stateRoot, CODEX_LIFECYCLE_JOB_DIR);
|
|
279
|
+
const dir = path.join(lifecycleRoot, projectStateKey(rootReal));
|
|
280
|
+
ensureDirectory(stateRoot, "Composer state root");
|
|
281
|
+
ensureDirectory(lifecycleRoot, "Codex lifecycle state root");
|
|
282
|
+
ensureDirectory(dir, "Codex lifecycle project state");
|
|
283
|
+
return realpathSync(dir);
|
|
284
|
+
}
|
|
285
|
+
function existingCodexLifecycleJobDir(root) {
|
|
286
|
+
if (!existsSync(codexLifecycleJobDir(root)))
|
|
287
|
+
return null;
|
|
288
|
+
try {
|
|
289
|
+
const dir = codexLifecycleJobDir(root);
|
|
290
|
+
assertUsableDirectory(dir, "Codex lifecycle project state");
|
|
291
|
+
return realpathSync(dir);
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
function codexLifecycleStateRoot() {
|
|
298
|
+
const override = process.env[COMPOSER_STATE_DIR_ENV]?.trim();
|
|
299
|
+
if (override)
|
|
300
|
+
return path.resolve(override);
|
|
301
|
+
return path.join(os.homedir(), ".local", "state", "composer");
|
|
302
|
+
}
|
|
303
|
+
function projectStateKey(rootReal) {
|
|
304
|
+
const basename = path.basename(rootReal).replace(/[^A-Za-z0-9._-]+/g, "-") || "project";
|
|
305
|
+
const slug = basename.slice(0, 48);
|
|
306
|
+
const digest = createHash("sha256").update(rootReal).digest("hex").slice(0, 24);
|
|
307
|
+
return `${slug}-${digest}`;
|
|
308
|
+
}
|
|
309
|
+
function isProcessAlive(pid) {
|
|
310
|
+
try {
|
|
311
|
+
process.kill(pid, 0);
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
// EPERM = process exists but not signalable by us -> alive.
|
|
316
|
+
return error.code === "EPERM";
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
function ensureDirectory(dir, label) {
|
|
320
|
+
if (!existsSync(dir)) {
|
|
321
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
322
|
+
}
|
|
323
|
+
assertUsableDirectory(dir, label);
|
|
324
|
+
}
|
|
325
|
+
function assertUsableDirectory(dir, label) {
|
|
326
|
+
const stat = lstatSync(dir);
|
|
327
|
+
if (stat.isSymbolicLink()) {
|
|
328
|
+
throw new Error(`Codex lifecycle job directory must not be a symlink: ${label}`);
|
|
329
|
+
}
|
|
330
|
+
if (!stat.isDirectory()) {
|
|
331
|
+
throw new Error(`Codex lifecycle job path must be a directory: ${label}`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
function writeJobFileAtomically(filePath, content) {
|
|
335
|
+
const dir = path.dirname(filePath);
|
|
336
|
+
const tmp = path.join(dir, `.${path.basename(filePath)}.${process.pid}.${Date.now()}.tmp`);
|
|
337
|
+
try {
|
|
338
|
+
writeFileSync(tmp, content, { encoding: "utf8", mode: 0o600, flag: "wx" });
|
|
339
|
+
renameSync(tmp, filePath);
|
|
340
|
+
chmodSync(filePath, 0o600);
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
rmSync(tmp, { force: true });
|
|
344
|
+
throw error;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
function writePointerFileAtomically(filePath, content) {
|
|
348
|
+
const dir = path.dirname(filePath);
|
|
349
|
+
const tmp = path.join(dir, `.${path.basename(filePath)}.${process.pid}.${Date.now()}.tmp`);
|
|
350
|
+
try {
|
|
351
|
+
writeFileSync(tmp, content, { encoding: "utf8", mode: 0o600, flag: "wx" });
|
|
352
|
+
renameSync(tmp, filePath);
|
|
353
|
+
chmodSync(filePath, 0o600);
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
rmSync(tmp, { force: true });
|
|
357
|
+
throw error;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=codexLifecycleJob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexLifecycleJob.js","sourceRoot":"","sources":["../../src/util/codexLifecycleJob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,MAAM,EACN,QAAQ,EACR,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAE7B,cAAc,GACf,MAAM,qBAAqB,CAAC;AAG7B,MAAM,CAAC,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AACzD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAC3D,MAAM,kCAAkC,GAAG,SAAS,CAAC;AAErD,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,IAAI,CAAC;IAClD,QAAQ;IACR,SAAS;IACT,WAAW;IACX,QAAQ;IACR,SAAS;IACT,aAAa;CACd,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC,CAAC,IAAI,CAAC;IAC1D,MAAM;IACN,OAAO;IACP,YAAY;IACZ,SAAS;IACT,WAAW;IACX,UAAU;IACV,SAAS;CACV,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC;KACjD,MAAM,CAAC;IACN,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC5C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,iBAAiB,EAAE,qCAAqC,CAAC,QAAQ,EAAE;IACnE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC;KACD,MAAM,EAAE,CAAC;AAKZ,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC;KAClD,MAAM,CAAC;IACN,KAAK,EAAE,yBAAyB;IAChC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACtC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,SAAS,EAAE,6BAA6B;IACxC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC7B,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC;KACrC,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,2BAA2B,CAAC;IAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACxB,KAAK,EAAE,yBAAyB;IAChC,MAAM,EAAE,6BAA6B;IACrC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACtC,SAAS,EAAE,6BAA6B;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC7C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,iBAAiB,EAAE,qCAAqC,CAAC,QAAQ,EAAE;IACnE,YAAY,EAAE,cAAc,CAAC,QAAQ,EAAE;IACvC,YAAY,EAAE,cAAc,CAAC,QAAQ,EAAE;IACvC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAClE,QAAQ,EAAE,oCAAoC;CAC/C,CAAC;KACD,MAAM,EAAE,CAAC;AAYZ,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,KAAgC;IAEhC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,OAAO,uBAAuB,CAAC,KAAK,CAAC;QACnC,OAAO,EAAE,2BAA2B;QACpC,KAAK;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;QAC7B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK;QAC3B,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,UAAU,EAAE,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC;QAC9C,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE;YACR,GAAG,KAAK,CAAC,QAAQ;YACjB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,GAAsB;IAEtB,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC;QAC9C,GAAG,GAAG;QACN,UAAU,EAAE,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC;KACnD,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,OAAO,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,uBAAuB,CAAC,KAAK,CAAC;QACzC,GAAG,SAAS;QACZ,UAAU;KACX,CAAC,CAAC;IACH,sBAAsB,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACzE,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kCAAkC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAClG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,GAAsB,EACtB,KAAyF;IAEzF,OAAO,sBAAsB,CAC3B,IAAI,EACJ,uBAAuB,CAAC,KAAK,CAAC;QAC5B,GAAG,GAAG;QACN,GAAG,KAAK;QACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,KAAa;IAC/D,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,GAAG,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,OAAO,0BAA0B,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAAY;IACtD,MAAM,GAAG,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,OAAO,GAAG,kCAAkC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9D,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC;SAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;SACnC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAE7D,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,OAAO,0BAA0B,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,IAAY,EAAE,KAAa;IACxE,MAAM,GAAG,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC;IACnB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE;gBAAE,SAAS;YACnF,MAAM,GAAG,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YACtF,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;gBAAE,SAAS;YAClE,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG;gBAAE,SAAS;YACrE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,uBAAuB,CAAC,KAAK,CAAC;gBACzC,GAAG,GAAG;gBACN,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,GAAG;gBACd,WAAW,EAAE,GAAG;gBAChB,KAAK;aACN,CAAC,CAAC;YACH,sBAAsB,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACvE,MAAM,EAAE,CAAC;QACX,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kCAAkC,CAAC,IAAY,EAAE,GAAW;IACnE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kCAAkC,CAAC,CAAC;IACvE,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,SAAS,CAAC,WAAW,CAAC,CAAC,cAAc,EAAE;YAAE,OAAO,IAAI,CAAC;QACzD,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE;YAAE,OAAO,IAAI,CAAC;QACtD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,0BAA0B,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,IAAY,EACZ,GAAsB;IAEtB,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;IACxE,IACE,WAAW;QACX,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ;QAC3B,GAAG,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG;QACvB,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EACxB,CAAC;QACD,OAAO,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE;YACxC,MAAM,EAAE,QAAQ;YAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,KAAK,EAAE,yDAAyD,GAAG,CAAC,GAAG,4DAA4D;SACpI,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,KAAa;IAC/D,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,KAAc;IAEd,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEzC,IAAI,wCAAwC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,mCAAmC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACzD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IACE,uIAAuI,CAAC,IAAI,CAC1I,UAAU,CACX,EACD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IACE,+IAA+I,CAAC,IAAI,CAClJ,UAAU,CACX,EACD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IACE,0MAA0M,CAAC,IAAI,CAC7M,UAAU,CACX,EACD,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAChD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,uBAAuB,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,SAAS,0BAA0B,CAAC,IAAY;IAC9C,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;IAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChE,eAAe,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;IAClD,eAAe,CAAC,aAAa,EAAE,4BAA4B,CAAC,CAAC;IAC7D,eAAe,CAAC,GAAG,EAAE,+BAA+B,CAAC,CAAC;IACtD,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,4BAA4B,CAAC,IAAY;IAChD,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACvC,qBAAqB,CAAC,GAAG,EAAE,+BAA+B,CAAC,CAAC;QAC5D,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,IAAI,EAAE,CAAC;IAC7D,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC;IACxF,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChF,OAAO,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,4DAA4D;QAC5D,OAAQ,KAA+B,CAAC,IAAI,KAAK,OAAO,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,GAAW,EAAE,KAAa;IACjD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAW,EAAE,KAAa;IACvD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,wDAAwD,KAAK,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,iDAAiD,KAAK,EAAE,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAgB,EAAE,OAAe;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3F,IAAI,CAAC;QACH,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7B,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,QAAgB,EAAE,OAAe;IACnE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3F,IAAI,CAAC;QACH,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7B,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Mirrors the shell hooks' composer_disabled(): COMPOSER_ENABLED off-values,
|
|
2
|
+
* COMPOSER_DISABLED on-values, COMPOSER_DISABLED_FILE, <projectDir>/.composer-disabled,
|
|
3
|
+
* and ~/.claude/composer.disabled. Keep in sync with scripts/*.sh. */
|
|
4
|
+
export declare function isComposerDisabled(opts?: {
|
|
5
|
+
projectDir?: string;
|
|
6
|
+
}): boolean;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
const ENABLED_OFF = new Set(["0", "false", "FALSE", "off", "OFF", "no", "NO"]);
|
|
5
|
+
const DISABLED_ON = new Set(["1", "true", "TRUE", "on", "ON", "yes", "YES"]);
|
|
6
|
+
/** Mirrors the shell hooks' composer_disabled(): COMPOSER_ENABLED off-values,
|
|
7
|
+
* COMPOSER_DISABLED on-values, COMPOSER_DISABLED_FILE, <projectDir>/.composer-disabled,
|
|
8
|
+
* and ~/.claude/composer.disabled. Keep in sync with scripts/*.sh. */
|
|
9
|
+
export function isComposerDisabled(opts = {}) {
|
|
10
|
+
const enabled = process.env["COMPOSER_ENABLED"];
|
|
11
|
+
if (enabled !== undefined && ENABLED_OFF.has(enabled))
|
|
12
|
+
return true;
|
|
13
|
+
const disabled = process.env["COMPOSER_DISABLED"];
|
|
14
|
+
if (disabled !== undefined && DISABLED_ON.has(disabled))
|
|
15
|
+
return true;
|
|
16
|
+
const df = process.env["COMPOSER_DISABLED_FILE"];
|
|
17
|
+
if (df && existsSync(df))
|
|
18
|
+
return true;
|
|
19
|
+
const projDir = opts.projectDir ?? process.env["CLAUDE_PROJECT_DIR"];
|
|
20
|
+
if (projDir && existsSync(join(projDir, ".composer-disabled")))
|
|
21
|
+
return true;
|
|
22
|
+
const home = process.env["HOME"] && process.env["HOME"].length > 0 ? process.env["HOME"] : homedir();
|
|
23
|
+
if (home && existsSync(join(home, ".claude", "composer.disabled")))
|
|
24
|
+
return true;
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=composerDisabled.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composerDisabled.js","sourceRoot":"","sources":["../../src/util/composerDisabled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/E,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAE7E;;uEAEuE;AACvE,MAAM,UAAU,kBAAkB,CAAC,OAAgC,EAAE;IACnE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChD,IAAI,OAAO,KAAK,SAAS,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAClD,IAAI,QAAQ,KAAK,SAAS,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACrE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACjD,IAAI,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACrE,IAAI,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACvG,IAAI,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAChF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
export type Tier = "cheap" | "premium";
|
|
2
2
|
export type Reasoning = "none" | "low" | "high";
|
|
3
3
|
export type PromptSize = "lite" | "full";
|
|
4
|
-
export type TaskClass = "unknown" | "refuse" | "review-inline" | "review" | "bug-explain" | "research-first-code" | "cross-file-code" | "simple-code" | "trivial";
|
|
5
|
-
export type RouteTarget = "inline" | "refuse" | "review-inline" | "task-reviewer" | "task-researcher-coder" | "composer-code-cli" | "composer-code-chain" | "composer-review-claude";
|
|
6
|
-
export type ProviderRole = "researcher" | "coder" | "coderCli" | "reviewer" | "reviewerClaude";
|
|
4
|
+
export type TaskClass = "unknown" | "refuse" | "review-inline" | "review" | "bug-explain" | "research-first-code" | "cross-file-code" | "simple-code" | "trivial" | "oracle-plan";
|
|
5
|
+
export type RouteTarget = "inline" | "refuse" | "review-inline" | "task-reviewer" | "task-researcher-coder" | "composer-code-cli" | "composer-code-chain" | "composer-review-claude" | "composer-oracle-plan" | "composer-oracle-job-start";
|
|
6
|
+
export type ProviderRole = "researcher" | "coder" | "coderCli" | "reviewer" | "reviewerClaude" | "oraclePlanner";
|
|
7
|
+
export type ContextBudget = "inline" | "handoff" | "scoped-diff" | "full-brief" | "oracle-brief";
|
|
7
8
|
export interface DispatchSignals {
|
|
8
9
|
promptChars: number;
|
|
9
10
|
estOutputTokens: number;
|
|
@@ -28,6 +29,7 @@ export interface DispatchHint {
|
|
|
28
29
|
tier: Tier;
|
|
29
30
|
reasoning: Reasoning;
|
|
30
31
|
promptSize: PromptSize;
|
|
32
|
+
contextBudget: ContextBudget;
|
|
31
33
|
recommendDispatch: boolean;
|
|
32
34
|
route: RoutePolicy;
|
|
33
35
|
rationale: string;
|