@bjoernrochel/sevro 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +34 -4
- package/README.md +7 -6
- package/dist/examples/basic/graded.json +13 -0
- package/dist/examples/basic/host.js +9 -0
- package/dist/examples/basic/host.js.map +1 -0
- package/dist/examples/basic/prompt-only.json +7 -0
- package/dist/examples/recipes/candidate.js +23 -0
- package/dist/examples/recipes/candidate.js.map +1 -0
- package/dist/examples/recipes/cases/coding-change.json +21 -0
- package/dist/examples/recipes/cases/host-tools.json +21 -0
- package/dist/examples/recipes/cases/mise.json +21 -0
- package/dist/examples/recipes/cases/node.json +21 -0
- package/dist/examples/recipes/cases/python-uv.json +21 -0
- package/dist/examples/recipes/cases/semantic.json +17 -0
- package/dist/examples/recipes/coding-change/check.js +16 -0
- package/dist/examples/recipes/coding-change/check.js.map +1 -0
- package/dist/examples/recipes/executable.js +20 -0
- package/dist/examples/recipes/executable.js.map +1 -0
- package/dist/examples/recipes/extension-artifacts.js +56 -0
- package/dist/examples/recipes/extension-artifacts.js.map +1 -0
- package/dist/examples/recipes/extension-methods.js +167 -0
- package/dist/examples/recipes/extension-methods.js.map +1 -0
- package/dist/examples/recipes/extension.js +28 -0
- package/dist/examples/recipes/extension.js.map +1 -0
- package/dist/examples/recipes/modules.js +9 -0
- package/dist/examples/recipes/modules.js.map +1 -0
- package/dist/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
- package/dist/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
- package/dist/examples/recipes/repository-skill/README.md +3 -0
- package/dist/examples/recipes/run-inputs.js +144 -0
- package/dist/examples/recipes/run-inputs.js.map +1 -0
- package/dist/examples/recipes/run-options.js +103 -0
- package/dist/examples/recipes/run-options.js.map +1 -0
- package/dist/examples/recipes/run.js +62 -0
- package/dist/examples/recipes/run.js.map +1 -0
- package/dist/examples/recipes/runtime/empty.json +1 -0
- package/dist/examples/recipes/runtime/goals.json +1 -0
- package/dist/examples/recipes/runtime/mise.json +6 -0
- package/dist/examples/recipes/runtime/path.json +1 -0
- package/dist/examples/recipes/runtime/plugins.json +4 -0
- package/dist/examples/recipes/runtime/python-uv.json +10 -0
- package/dist/examples/recipes/semantic-judge.js +27 -0
- package/dist/examples/recipes/semantic-judge.js.map +1 -0
- package/dist/examples/templates/coding/adapter.js +14 -0
- package/dist/examples/templates/coding/adapter.js.map +1 -0
- package/dist/examples/templates/coding/case.json +15 -0
- package/dist/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
- package/dist/examples/templates/repository-skill/extension-data.js +61 -0
- package/dist/examples/templates/repository-skill/extension-data.js.map +1 -0
- package/dist/examples/templates/repository-skill/extension.js +29 -0
- package/dist/examples/templates/repository-skill/extension.js.map +1 -0
- package/dist/examples/templates/response/adapter.js +13 -0
- package/dist/examples/templates/response/adapter.js.map +1 -0
- package/dist/examples/templates/response/case.json +13 -0
- package/dist/src/advisory.js +86 -0
- package/dist/src/advisory.js.map +1 -0
- package/dist/src/candidate-artifacts.js +139 -0
- package/dist/src/candidate-artifacts.js.map +1 -0
- package/dist/src/candidate-codex-state.js +110 -0
- package/dist/src/candidate-codex-state.js.map +1 -0
- package/dist/src/case-validation.js +92 -0
- package/dist/src/case-validation.js.map +1 -0
- package/dist/src/cli/cancellation.js +21 -0
- package/dist/src/cli/cancellation.js.map +1 -0
- package/dist/src/cli/command.js +60 -0
- package/dist/src/cli/command.js.map +1 -0
- package/dist/src/cli/completion.js +14 -0
- package/dist/src/cli/completion.js.map +1 -0
- package/dist/src/cli/demo.js +45 -0
- package/dist/src/cli/demo.js.map +1 -0
- package/dist/src/cli/evaluation.js +40 -0
- package/dist/src/cli/evaluation.js.map +1 -0
- package/dist/src/cli/extension.js +54 -0
- package/dist/src/cli/extension.js.map +1 -0
- package/dist/src/cli/help.js +190 -0
- package/dist/src/cli/help.js.map +1 -0
- package/dist/src/cli/hosts.js +33 -0
- package/dist/src/cli/hosts.js.map +1 -0
- package/dist/src/cli/init-settings.js +29 -0
- package/dist/src/cli/init-settings.js.map +1 -0
- package/dist/src/cli/init.js +82 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/invocation.js +431 -0
- package/dist/src/cli/invocation.js.map +1 -0
- package/dist/src/cli/loading.js +110 -0
- package/dist/src/cli/loading.js.map +1 -0
- package/dist/src/cli/preparation.js +88 -0
- package/dist/src/cli/preparation.js.map +1 -0
- package/dist/src/cli/presentation.js +61 -0
- package/dist/src/cli/presentation.js.map +1 -0
- package/dist/src/cli/progress.js +5 -0
- package/dist/src/cli/progress.js.map +1 -0
- package/dist/src/cli/run-manifest.js +108 -0
- package/dist/src/cli/run-manifest.js.map +1 -0
- package/dist/src/cli/run-options.js +367 -0
- package/dist/src/cli/run-options.js.map +1 -0
- package/dist/src/cli/run-overrides.js +51 -0
- package/dist/src/cli/run-overrides.js.map +1 -0
- package/dist/src/cli/settings.js +127 -0
- package/dist/src/cli/settings.js.map +1 -0
- package/dist/src/cli/summary.js +28 -0
- package/dist/src/cli/summary.js.map +1 -0
- package/dist/src/cli.js +20 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/contract-types.js +2 -0
- package/dist/src/contract-types.js.map +1 -0
- package/dist/src/engine.js +4 -0
- package/dist/src/engine.js.map +1 -0
- package/dist/src/evaluation/advisory.js +85 -0
- package/dist/src/evaluation/advisory.js.map +1 -0
- package/dist/src/evaluation/check-plan.js +292 -0
- package/dist/src/evaluation/check-plan.js.map +1 -0
- package/dist/src/evaluation/collection.js +61 -0
- package/dist/src/evaluation/collection.js.map +1 -0
- package/dist/src/evaluation/context.js +2 -0
- package/dist/src/evaluation/context.js.map +1 -0
- package/dist/src/evaluation/grading-host.js +28 -0
- package/dist/src/evaluation/grading-host.js.map +1 -0
- package/dist/src/evaluation/grading.js +154 -0
- package/dist/src/evaluation/grading.js.map +1 -0
- package/dist/src/evaluation/invocation-plan.js +312 -0
- package/dist/src/evaluation/invocation-plan.js.map +1 -0
- package/dist/src/evaluation/plan.js +376 -0
- package/dist/src/evaluation/plan.js.map +1 -0
- package/dist/src/evaluation/progress.js +14 -0
- package/dist/src/evaluation/progress.js.map +1 -0
- package/dist/src/evaluation/resources.js +159 -0
- package/dist/src/evaluation/resources.js.map +1 -0
- package/dist/src/evaluation/run.js +148 -0
- package/dist/src/evaluation/run.js.map +1 -0
- package/dist/src/evaluation/scheduler.js +27 -0
- package/dist/src/evaluation/scheduler.js.map +1 -0
- package/dist/src/evaluation/semantic.js +183 -0
- package/dist/src/evaluation/semantic.js.map +1 -0
- package/dist/src/evaluation/trial.js +593 -0
- package/dist/src/evaluation/trial.js.map +1 -0
- package/dist/src/evaluation/types.js +20 -0
- package/dist/src/evaluation/types.js.map +1 -0
- package/dist/src/evidence/host-results.js +67 -0
- package/dist/src/evidence/host-results.js.map +1 -0
- package/dist/src/evidence/retained-artifacts.js +17 -0
- package/dist/src/evidence/retained-artifacts.js.map +1 -0
- package/dist/src/evidence/trial-writer.js +131 -0
- package/dist/src/evidence/trial-writer.js.map +1 -0
- package/dist/src/evidence/usage.js +14 -0
- package/dist/src/evidence/usage.js.map +1 -0
- package/dist/src/executable.js +20 -0
- package/dist/src/executable.js.map +1 -0
- package/dist/src/extension-client.js +212 -0
- package/dist/src/extension-client.js.map +1 -0
- package/dist/src/extension-session.js +236 -0
- package/dist/src/extension-session.js.map +1 -0
- package/dist/src/fixtures/advisory.js +206 -0
- package/dist/src/fixtures/advisory.js.map +1 -0
- package/dist/src/fixtures/bin.js +41 -0
- package/dist/src/fixtures/bin.js.map +1 -0
- package/dist/src/fixtures/cleanup.js +43 -0
- package/dist/src/fixtures/cleanup.js.map +1 -0
- package/dist/src/fixtures/create.js +94 -0
- package/dist/src/fixtures/create.js.map +1 -0
- package/dist/src/fixtures/generated.js +181 -0
- package/dist/src/fixtures/generated.js.map +1 -0
- package/dist/src/fixtures/git-hooks.js +16 -0
- package/dist/src/fixtures/git-hooks.js.map +1 -0
- package/dist/src/fixtures/preparation.js +201 -0
- package/dist/src/fixtures/preparation.js.map +1 -0
- package/dist/src/fixtures/repository.js +255 -0
- package/dist/src/fixtures/repository.js.map +1 -0
- package/dist/src/fixtures/setup.js +175 -0
- package/dist/src/fixtures/setup.js.map +1 -0
- package/dist/src/fixtures/tools.js +57 -0
- package/dist/src/fixtures/tools.js.map +1 -0
- package/dist/src/fixtures/workspace-state.js +155 -0
- package/dist/src/fixtures/workspace-state.js.map +1 -0
- package/dist/src/generated/cli-result.cjs +2 -0
- package/dist/src/generated/extension.cjs +2 -0
- package/dist/src/generated/report.cjs +2 -0
- package/dist/src/generated/run-evidence.cjs +2 -0
- package/dist/src/generated/runtime.cjs +2 -0
- package/dist/src/git.js +72 -0
- package/dist/src/git.js.map +1 -0
- package/dist/src/graders/artifact.js +68 -0
- package/dist/src/graders/artifact.js.map +1 -0
- package/dist/src/graders/git-head.js +112 -0
- package/dist/src/graders/git-head.js.map +1 -0
- package/dist/src/graders/output.js +345 -0
- package/dist/src/graders/output.js.map +1 -0
- package/dist/src/graders/semantic.js +132 -0
- package/dist/src/graders/semantic.js.map +1 -0
- package/dist/src/graders/shell.js +321 -0
- package/dist/src/graders/shell.js.map +1 -0
- package/dist/src/host-diagnostic-redaction.js +52 -0
- package/dist/src/host-diagnostic-redaction.js.map +1 -0
- package/dist/src/host-diagnostics.js +248 -0
- package/dist/src/host-diagnostics.js.map +1 -0
- package/dist/src/hosts/claude-continuation.js +89 -0
- package/dist/src/hosts/claude-continuation.js.map +1 -0
- package/dist/src/hosts/claude-credential.js +121 -0
- package/dist/src/hosts/claude-credential.js.map +1 -0
- package/dist/src/hosts/claude-events.js +136 -0
- package/dist/src/hosts/claude-events.js.map +1 -0
- package/dist/src/hosts/claude-keychain.js +100 -0
- package/dist/src/hosts/claude-keychain.js.map +1 -0
- package/dist/src/hosts/claude-login-recovery.js +67 -0
- package/dist/src/hosts/claude-login-recovery.js.map +1 -0
- package/dist/src/hosts/claude-login-refresh.js +146 -0
- package/dist/src/hosts/claude-login-refresh.js.map +1 -0
- package/dist/src/hosts/claude-login-store.js +124 -0
- package/dist/src/hosts/claude-login-store.js.map +1 -0
- package/dist/src/hosts/claude-login.js +74 -0
- package/dist/src/hosts/claude-login.js.map +1 -0
- package/dist/src/hosts/claude-native-goal.js +138 -0
- package/dist/src/hosts/claude-native-goal.js.map +1 -0
- package/dist/src/hosts/claude-process.js +10 -0
- package/dist/src/hosts/claude-process.js.map +1 -0
- package/dist/src/hosts/claude-refresh-lock.js +76 -0
- package/dist/src/hosts/claude-refresh-lock.js.map +1 -0
- package/dist/src/hosts/claude-repository-invocation.js +229 -0
- package/dist/src/hosts/claude-repository-invocation.js.map +1 -0
- package/dist/src/hosts/claude-settings.js +158 -0
- package/dist/src/hosts/claude-settings.js.map +1 -0
- package/dist/src/hosts/claude-skill-activations.js +131 -0
- package/dist/src/hosts/claude-skill-activations.js.map +1 -0
- package/dist/src/hosts/claude-state.js +237 -0
- package/dist/src/hosts/claude-state.js.map +1 -0
- package/dist/src/hosts/claude-tool-calls.js +150 -0
- package/dist/src/hosts/claude-tool-calls.js.map +1 -0
- package/dist/src/hosts/claude.js +373 -0
- package/dist/src/hosts/claude.js.map +1 -0
- package/dist/src/hosts/codex-app-server.js +764 -0
- package/dist/src/hosts/codex-app-server.js.map +1 -0
- package/dist/src/hosts/codex-configuration.js +91 -0
- package/dist/src/hosts/codex-configuration.js.map +1 -0
- package/dist/src/hosts/codex-events.js +104 -0
- package/dist/src/hosts/codex-events.js.map +1 -0
- package/dist/src/hosts/codex-exec-controls.js +434 -0
- package/dist/src/hosts/codex-exec-controls.js.map +1 -0
- package/dist/src/hosts/codex-invocation.js +54 -0
- package/dist/src/hosts/codex-invocation.js.map +1 -0
- package/dist/src/hosts/codex-marketplace.js +185 -0
- package/dist/src/hosts/codex-marketplace.js.map +1 -0
- package/dist/src/hosts/codex-native-calls.js +516 -0
- package/dist/src/hosts/codex-native-calls.js.map +1 -0
- package/dist/src/hosts/codex-process.js +10 -0
- package/dist/src/hosts/codex-process.js.map +1 -0
- package/dist/src/hosts/codex-profile.js +206 -0
- package/dist/src/hosts/codex-profile.js.map +1 -0
- package/dist/src/hosts/codex-session-files.js +89 -0
- package/dist/src/hosts/codex-session-files.js.map +1 -0
- package/dist/src/hosts/codex-state.js +310 -0
- package/dist/src/hosts/codex-state.js.map +1 -0
- package/dist/src/hosts/codex.js +527 -0
- package/dist/src/hosts/codex.js.map +1 -0
- package/dist/src/hosts/isolation-common.js +43 -0
- package/dist/src/hosts/isolation-common.js.map +1 -0
- package/dist/src/hosts/isolation-roots.js +64 -0
- package/dist/src/hosts/isolation-roots.js.map +1 -0
- package/dist/src/hosts/isolation.js +12 -0
- package/dist/src/hosts/isolation.js.map +1 -0
- package/dist/src/hosts/linux-sandbox.js +127 -0
- package/dist/src/hosts/linux-sandbox.js.map +1 -0
- package/dist/src/hosts/mac-sandbox.js +137 -0
- package/dist/src/hosts/mac-sandbox.js.map +1 -0
- package/dist/src/hosts/native-controls.js +151 -0
- package/dist/src/hosts/native-controls.js.map +1 -0
- package/dist/src/hosts/native-request.js +33 -0
- package/dist/src/hosts/native-request.js.map +1 -0
- package/dist/src/hosts/process-lifecycle.js +167 -0
- package/dist/src/hosts/process-lifecycle.js.map +1 -0
- package/dist/src/hosts/protected-worktrees.js +81 -0
- package/dist/src/hosts/protected-worktrees.js.map +1 -0
- package/dist/src/hosts/skill-hook-catalog.js +100 -0
- package/dist/src/hosts/skill-hook-catalog.js.map +1 -0
- package/dist/src/hosts/skill-hook-handler.js +228 -0
- package/dist/src/hosts/skill-hook-handler.js.map +1 -0
- package/dist/src/hosts/skill-hooks.js +423 -0
- package/dist/src/hosts/skill-hooks.js.map +1 -0
- package/dist/src/hosts/workspace-fingerprint.js +72 -0
- package/dist/src/hosts/workspace-fingerprint.js.map +1 -0
- package/dist/src/identity.js +167 -0
- package/dist/src/identity.js.map +1 -0
- package/dist/src/instrumentation.js +83 -0
- package/dist/src/instrumentation.js.map +1 -0
- package/dist/src/native-transcript-state.js +85 -0
- package/dist/src/native-transcript-state.js.map +1 -0
- package/dist/src/native-transcript-view.js +65 -0
- package/dist/src/native-transcript-view.js.map +1 -0
- package/dist/src/native-transcripts.js +208 -0
- package/dist/src/native-transcripts.js.map +1 -0
- package/dist/src/paths.js +13 -0
- package/dist/src/paths.js.map +1 -0
- package/dist/src/process-lifecycle.js +101 -0
- package/dist/src/process-lifecycle.js.map +1 -0
- package/dist/src/provenance.js +263 -0
- package/dist/src/provenance.js.map +1 -0
- package/dist/src/prune.js +228 -0
- package/dist/src/prune.js.map +1 -0
- package/dist/src/report.js +276 -0
- package/dist/src/report.js.map +1 -0
- package/dist/src/resolved-case.js +29 -0
- package/dist/src/resolved-case.js.map +1 -0
- package/dist/src/results-lock.js +40 -0
- package/dist/src/results-lock.js.map +1 -0
- package/dist/src/results.js +127 -0
- package/dist/src/results.js.map +1 -0
- package/dist/src/run-owner.js +283 -0
- package/dist/src/run-owner.js.map +1 -0
- package/dist/src/runner-paths.js +11 -0
- package/dist/src/runner-paths.js.map +1 -0
- package/dist/src/runtime/config.js +323 -0
- package/dist/src/runtime/config.js.map +1 -0
- package/dist/src/runtime/discovery-apple.js +65 -0
- package/dist/src/runtime/discovery-apple.js.map +1 -0
- package/dist/src/runtime/discovery-providers.js +37 -0
- package/dist/src/runtime/discovery-providers.js.map +1 -0
- package/dist/src/runtime/discovery.js +40 -0
- package/dist/src/runtime/discovery.js.map +1 -0
- package/dist/src/runtime/hook-processes.js +81 -0
- package/dist/src/runtime/hook-processes.js.map +1 -0
- package/dist/src/runtime/hooks.js +304 -0
- package/dist/src/runtime/hooks.js.map +1 -0
- package/dist/src/runtime/paths.js +244 -0
- package/dist/src/runtime/paths.js.map +1 -0
- package/dist/src/runtime/query.js +76 -0
- package/dist/src/runtime/query.js.map +1 -0
- package/dist/src/runtime/seeds.js +98 -0
- package/dist/src/runtime/seeds.js.map +1 -0
- package/dist/src/runtime/shared-cache.js +81 -0
- package/dist/src/runtime/shared-cache.js.map +1 -0
- package/dist/src/runtime/state.js +106 -0
- package/dist/src/runtime/state.js.map +1 -0
- package/dist/src/runtime-process.js +148 -0
- package/dist/src/runtime-process.js.map +1 -0
- package/dist/src/schema-types.js +2 -0
- package/dist/src/schema-types.js.map +1 -0
- package/dist/src/schema.js +16 -0
- package/dist/src/schema.js.map +1 -0
- package/dist/src/shell.js +5 -0
- package/dist/src/shell.js.map +1 -0
- package/dist/src/sqlite-lock.js +18 -0
- package/dist/src/sqlite-lock.js.map +1 -0
- package/dist/src/storage.js +21 -0
- package/dist/src/storage.js.map +1 -0
- package/dist/src/transcript-retention.js +109 -0
- package/dist/src/transcript-retention.js.map +1 -0
- package/dist/src/value-guards.js +26 -0
- package/dist/src/value-guards.js.map +1 -0
- package/docs/architecture.md +5 -2
- package/docs/creating-cases.md +2 -3
- package/docs/development-cli.md +12 -7
- package/docs/documentation-quality.md +4 -3
- package/docs/evaluation-workflow.md +8 -8
- package/docs/getting-started.md +7 -6
- package/docs/guide-evaluation.md +1 -1
- package/docs/identity-v1.md +4 -1
- package/docs/installing.md +31 -13
- package/docs/licensing.md +2 -2
- package/docs/native-hosts.md +1 -1
- package/docs/recipes.md +41 -40
- package/docs/releases.md +20 -4
- package/docs/run-settings-v1.md +3 -3
- package/docs/specs/repository-guide.md +1 -1
- package/docs/troubleshooting.md +1 -1
- package/docs/typescript-quality.md +18 -1
- package/examples/recipes/executable.ts +19 -0
- package/examples/recipes/extension-artifacts.ts +1 -1
- package/examples/recipes/extension.ts +2 -1
- package/examples/recipes/modules.ts +9 -0
- package/examples/recipes/run-inputs.ts +14 -19
- package/examples/recipes/run-options.ts +9 -8
- package/examples/recipes/run.ts +21 -7
- package/examples/templates/repository-skill/extension-data.ts +1 -1
- package/examples/templates/repository-skill/extension.ts +2 -1
- package/package.json +14 -6
- package/src/cli/demo.ts +3 -2
- package/src/cli/help.ts +4 -3
- package/src/cli/init-settings.ts +5 -4
- package/src/cli/init.ts +9 -8
- package/src/cli/invocation.ts +2 -1
- package/src/cli/preparation.ts +2 -2
- package/src/cli.ts +1 -1
- package/src/executable.ts +19 -0
- package/src/extension-client.ts +6 -12
- package/src/fixtures/setup.ts +3 -2
- package/src/git.ts +2 -1
- package/src/graders/git-head.ts +3 -2
- package/src/graders/shell.ts +4 -3
- package/src/hosts/claude-keychain.ts +3 -2
- package/src/hosts/claude-login-refresh.ts +3 -2
- package/src/hosts/claude-refresh-lock.ts +2 -1
- package/src/hosts/claude-settings.ts +3 -1
- package/src/hosts/claude.ts +1 -1
- package/src/hosts/isolation-roots.ts +3 -2
- package/src/hosts/process-lifecycle.ts +4 -6
- package/src/hosts/protected-worktrees.ts +2 -1
- package/src/hosts/skill-hook-handler.ts +1 -1
- package/src/hosts/skill-hooks.ts +10 -2
- package/src/provenance.ts +7 -6
- package/src/results-lock.ts +4 -4
- package/src/run-owner.ts +15 -9
- package/src/runner-paths.ts +21 -0
- package/src/runtime/hook-processes.ts +2 -1
- package/src/runtime/hooks.ts +9 -7
- package/src/runtime-process.ts +194 -0
- package/src/sqlite-lock.ts +25 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-app-server.js","sourceRoot":"","sources":["codex-app-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,wCAAqC;AACpE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,2BAAwB;AAC1D,OAAO,EAAE,KAAK,EAAuC,2BAA2B;AAChF,OAAO,EAAE,eAAe,EAAE,sBAAsB;AAChD,OAAO,EACL,sBAAsB,GAEvB,+BAA4B;AAW7B,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,aAAa,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;AAC7D,CAAC;AACD,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK;QACrC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAmCD,SAAS,kBAAkB,CAAC,KAAc;IAIxC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACjE,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;QAChC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,IAAI,QAAQ,CAAC,MAAM,GAAG,IAAI;YAChD,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE;YAC5B,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IAIzC,MAAM,GAAG,GAAG,CAAC,CAAU,EAAe,EAAE,CACtC,OAAO,CAAC,KAAK,QAAQ,IAAI,6BAA6B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjE,IAAI,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC5C,OAAO,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAkB,EAClB,GAAwC;IAExC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;IACxB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;IAC9B,OAAO,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;QACvB,KAAK,IAAI,CAAC;QACV,KAAK,IAAI,KAAK,CACf,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAAgB;IACvC,MAAM,MAAM,GACV,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QACpC,CAAC,CAAE,OAAuB,CAAC,cAAc;QACzC,CAAC,CAAC,SAAS,CAAC;IAChB,OAAO;QACL,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC;AACJ,CAAC;AAOD,oFAAoF;AACpF,MAAM,YAAY;IACP,OAAO,CAAiC;IACxC,MAAM,CAAyB;IAC/B,KAAK,GAAmB,EAAE,CAAC;IAC5B,MAAM,GAAG,CAAC,CAAC;IACX,OAAO,GAAG,IAAI,GAAG,EAOtB,CAAC;IACI,IAAI,CAAc;IAClB,OAAO,CAAS;IAChB,OAAO,GAAG,KAAK,CAAC;IAChB,aAAa,GAAG,CAAC,CAAC;IAClB,KAAK,CAAgB;IACrB,MAAM,CAAgB;IAC9B,MAAM,GAAG,EAAE,CAAC;IACH,OAAO,CAAyB;IAEzC,YACE,IAAc,EACd,GAAW,EACX,GAA2B,EAC3B,WAA4B;QAE5B,IAAI,CAAC,OAAO,GAAG,IAAI,sBAAsB,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACvD,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;YACtC,GAAG;YACH,GAAG;YACH,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS;oBAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBACnE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAC/C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACrD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACvC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACpC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACxC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACjB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YAC7B,IAAI,CAAC,IAAI,CAAC,OAAO;gBACf,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,wCAAwC,IAAI,GAAG,CAAC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,KAAc;QACjB,IAAI,CAAC,OAAO,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3E,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1E,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IAChB,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,CAAC,OAAO,CAAC;IACvC,CAAC;IAEO,IAAI,CAAC,KAAc;QACzB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACzD,CAAC;IAEO,SAAS;QACf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACnC,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,IAAI,CAAC;oBACH,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC9C,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI;wBACtC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;oBACrD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;wBAAE,OAAO;oBACzB,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACrB,IAAI,CAAC,IAAI,CAAC,OAAO;oBACf,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;gBACrE,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,OAAO,CAAC,OAAoB;QAClC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;YAChC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;aACvC,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ;YACzC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;;YACtD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACvD,CAAC;IAEO,mBAAmB,CAAC,OAAoB;QAC9C,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS;YAAE,OAAO;QAC3E,IAAI,CAAC,IAAI,CAAC;YACR,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,KAAK;gBACZ,OAAO,EAAE,mDAAmD;aAC7D;SACF,CAAC,CAAC;QACH,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IAEO,eAAe,CAAC,OAAoB,EAAE,EAAU;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/D,wEAAwE;QACxE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,OAAO,CAAC,KAAK;YACf,OAAO,CAAC,MAAM,CACZ,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAC3D,CAAC;;YACC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAEO,mBAAmB,CAAC,MAAc,EAAE,KAAc;QACxD,8EAA8E;QAC9E,IACE,CAAC;YACC,cAAc;YACd,gBAAgB;YAChB,qBAAqB;YACrB,qBAAqB;YACrB,2BAA2B;YAC3B,gBAAgB;YAChB,OAAO;SACR,CAAC,QAAQ,CAAC,MAAM,CAAC;YAElB,OAAO;QACT,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC;YAAE,OAAO;QACrD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI;YAC3B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IAChB,CAAC;IAED,mFAAmF;IACnF,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,MAAmB;QAC5C,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,CAAC,OAAO,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAClD,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,cAAc;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YAC5B,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE;YACpD,YAAY,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE;SACzC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;YACxC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,CAAC,OAAO,CAAC;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxC,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACtE,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,aAAgD,CAAC;QACrD,MAAM,SAAS,GAAG,CAAC,MAAsB,EAAE,EAAE;YAC3C,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG;oBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAChE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAK,KAA+B,CAAC,IAAI,KAAK,OAAO;oBACnD,aAAa,KAAK,KAA8B,CAAC;YACrD,CAAC;QACH,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,SAAS,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC,EAAE,IAAI,CAAC,CAAC;QACT,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,SAAS,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC,EAAE,IAAI,CAAC,CAAC;QACT,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC;YAClB,MAAM,IAAI,CAAC,KAAK,CAAC;YACjB,MAAM,IAAI,CAAC,MAAM,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,aAAa,KAAK,SAAS;YAAE,MAAM,aAAa,CAAC;IACvD,CAAC;CACF;AAED,SAAS,uBAAuB,CAAC,MAAc,EAAE,MAAmB;IAClE,OAAO,CACL,MAAM,KAAK,gBAAgB;QAC3B,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAClD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CACjC,CACF,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,SAAS,SAAS,CAAC,KAAc;IAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB;QAClC,OAAO;YACL,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;gBAC/D,SAAS,EAAE,IAAI,CAAC,QAAQ;gBACxB,iBAAiB,EAAE,IAAI,CAAC,gBAAgB;aACzC;SACF,CAAC;IACJ,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB;QACrC,OAAO;YACL,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,kBAAkB;gBACxB,IAAI,EACF,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;oBAC3B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CACf,QAAQ,EACR,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CACvC;oBACH,CAAC,CAAC,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,gBAAgB,EAAE,IAAI,CAAC,cAAc;gBACrC,mBAAmB,EAAE,IAAI,CAAC,iBAAiB;gBAC3C,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,gBAAgB,EAAE,IAAI,CAAC,eAAe;aACvC;SACF,CAAC;IACJ,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,cAAc,CAAC,MAAe,EAAE,MAAc;IAC5D,MAAM,KAAK,GAAG,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC;IAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,KAAK;SACjB,GAAG,CAAC,MAAM,CAAC;SACX,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,IAAI,KAAK,cAAc;QAC5B,IAAI,CAAC,KAAK,KAAK,cAAc;QAC7B,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAChC,CAAC;IACJ,IAAI,CAAC,MAAM,CAAC,MAAM;QAChB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAe,EAAE,MAAc;IAC7D,MAAM,KAAK,GAAY,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IACvE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;IACvB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW;QAC3E,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,aAAa,GAAG;IACpB,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,cAAc;IACd,eAAe;IACf,UAAU;CACX,CAAC;AAEF,MAAM,UAAU,mBAAmB,CACjC,KAAc,EACd,QAAgB;IAEhB,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAiB,EAAE,QAAgB;IAC9D,IACE,IAAI,CAAC,QAAQ,KAAK,QAAQ;QAC1B,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;QAC/B,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAEpC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;AACpD,CAAC;AACD,SAAS,oBAAoB,CAAC,SAAkB;IAC9C,IACE,OAAO,SAAS,KAAK,QAAQ;QAC7B,CAAC,SAAS,CAAC,MAAM;QACjB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,IAAI;QAEnC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;AACpD,CAAC;AAgBD,oFAAoF;AACpF,MAAM,gBAAgB;IAeT;IACA;IAfF,QAAQ,GAAsB;QACrC,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,CAAC;QACd,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;KACV,CAAC;IACO,GAAG,GAAa,EAAE,CAAC;IAC5B,YAAY,GAAkB,IAAI,CAAC;IAC3B,QAAQ,GAAG,EAAE,CAAC;IACd,QAAQ,GAAG,KAAK,CAAC;IACjB,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,QAAQ,CAAU;IAE1B,YACW,GAAiB,EACjB,OAA4B;QAD5B,QAAG,GAAH,GAAG,CAAc;QACjB,YAAO,GAAP,OAAO,CAAqB;QAErC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,KAAc;QACjB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACjC,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE;YAClD,GAAG,EAAE,OAAO,CAAC,OAAO;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,aAAa,EAAE,QAAQ;YACvB,MAAM,EAAE;gBACN,sBAAsB,EAAE,OAAO,CAAC,MAAM;gBACtC,mBAAmB,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB;gBACnD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW;oBAC1B,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBACxD,CAAC,CAAC,EAAE,CAAC;aACR;YACD,cAAc,EAAE,OAAO;YACvB,0BAA0B,EAAE,KAAK;YACjC,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACvD,IACE,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;YAC/B,OAAO,CAAC,eAAe,KAAK,OAAO,CAAC,MAAM;YAC1C,OAAO,CAAC,aAAa,KAAK,QAAQ;YAElC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChE,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAc;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE;YACjD,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;SAC3D,CAAC,CAAC;QACH,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;IAEO,QAAQ,CAAC,KAAc;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,WAAW,CACjB,MAAmB,EACnB,SAAsC,cAAc;QAEpD,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,WAAW,GAAG;YAClB,MAAM;YACN,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACpE,MAAM,EAAE,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;YAChE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,MAAM;SACP,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC;YAC7C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAEO,WAAW,CAAC,KAAc,EAAE,MAAe;QACjD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YACvB,EAAE;YACF,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACrC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAC7B,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,YAAY,CAClB,MAAwC,EACxC,MAAe,EACf,SAAkB,EAClB,KAAc;QAEd,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YACzB,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7E,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,EAC3B,MAAM,EACN,MAAM,GACO;QACb,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QACpD,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,OAAO;gBACV,IAAI,CAAC,YAAY,CACf,OAAO,EACP,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,KAAK,CACb,CAAC;gBACF,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI;oBAC3B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBAC5D,MAAM;YACR,KAAK,gBAAgB;gBACnB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC3B,MAAM;YACR,KAAK,qBAAqB;gBACxB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBACzB,MAAM;YACR,KAAK,qBAAqB;gBACxB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,KAAK,cAAc;gBACjB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACzC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;gBACpC,MAAM;YACR,KAAK,gBAAgB;gBACnB,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,IAAiB;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAC7B,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7D,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,CAAC;IAEO,oBAAoB,CAAC,IAAiB,EAAE,MAAc;QAC5D,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW;YAAE,OAAO;QACxC,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAc;QACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAClD,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC;QAClC,IAAI,IAAI,CAAC,QAAQ,IAAI,MAAM,KAAK,IAAI;YAClC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,IAAI,MAAM,KAAK,IAAI;YACjB,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,MAAc,EACd,MAAqB,EACrB,MAAc;QAEd,sEAAsE;QACtE,yEAAyE;QACzE,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3D,MAAM,QAAQ,GAAG,eAAe,CAC9B,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE;YACjD,kBAAkB,EAAE,IAAI,CAAC,QAAQ;YACjC,gBAAgB,EAAE,MAAM;SACzB,CAAC,CACH,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC;YACR,GAAG,QAAQ;YACX,oBAAoB,EAAE,IAAI,CAAC,QAAQ;YACnC,kBAAkB,EAAE,MAAM;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,MAAc,EACd,WAAW,GAAG,KAAK;QAEnB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE;YAClD,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,wEAAwE;QACxE,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACnD,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,KAAK,MAAM,KAAK,IAAI,KAAK;YAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE;SAC7C,CAAC,CAAC;QACH,IAAI,WAAW;YAAE,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0EAA0E;IAClE,qBAAqB,CAAC,MAAc;QAC1C,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACnC,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;YACzB,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;gBAAE,SAAS;YAChD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC;gBAAE,KAAK,GAAG,KAAK,CAAC;QAClD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,qBAAqB,CAAC,KAAmB;QAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,qBAAqB;YACpE,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,KAAK,qBAAqB;YACxC,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED,qEAAqE;IACrE,aAAa;QACX,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACtD,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAgB;QAC7D,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,MAAM,KAAK,qBAAqB;YAClC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACpE,CAAC;IAEO,2BAA2B,CACjC,MAAc,EACd,MAAmB;QAEnB,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YACpD,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1E,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACO,kBAAkB,CAAC,MAAc,EAAE,MAAmB;QAC5D,IACE,MAAM,KAAK,qBAAqB;YAChC,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ;YAE5D,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACnE,CAAC;IAEO,aAAa,CAAC,IAAiB;QACrC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;gBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC3D,oCAAoC;QACtC,CAAC;IACH,CAAC;CACF;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,QAAgB;IAC1D,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpD,IAAI,MAAM,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACpE,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,SAAS,mBAAmB,CAC1B,QAAwD,EACxD,WAA+C;IAE/C,OAAO,CACL,QAAQ,EAAE,MAAM,KAAK,WAAW,CAAC,MAAM;QACvC,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM;QACtC,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,CACvC,CAAC;AACJ,CAAC;AACD,SAAS,YAAY,CACnB,MAAwC,EACxC,QAAgB,EAChB,MAAe,EACf,SAAkB,EAClB,KAAc;IAEd,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,OAAO;QACL,MAAM;QACN,QAAQ;QACR,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QAChE,SAAS,EAAE,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;QAC5D,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC;QACpC,GAAG,mBAAmB,CAAC,KAAK,CAAC,cAAc,CAAC;KAC7C,CAAC;AACJ,CAAC;AACD,SAAS,cAAc,CAAC,QAAqB,EAAE,QAAgB;IAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,EAAE,KAAK,QAAQ;QACxB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,MAAM,KAAK,GAAY,MAAM,CAAC,KAAK,CAAC;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACzE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAkB,EAAE,CAAC;AAC/C,CAAC;AACD,SAAS,eAAe,CAAC,MAAmB,EAAE,MAAc;IAC1D,IAAI,MAAM,CAAC,EAAE,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW;QACjE,OAAO,KAAK,CAAC;IACf,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC5D,CAAC;AACD,SAAS,aAAa,CACpB,KAAmB,EACnB,MAA0B;IAE1B,OAAO,CACL,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,CACxC,CAAC;AACJ,CAAC;AACD,SAAS,mBAAmB,CAAC,OAA0B,EAAE,KAAa;IACpE,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;AACrD,CAAC;AACD,SAAS,cAAc,CAAC,OAAyB,EAAE,KAAc;IAC/D,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO;QACtB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;AACxC,CAAC;AACD,6EAA6E;AAC7E,SAAS,gBAAgB,CAAC,OAAiB;IACzC,MAAM,OAAO,GAAG,0CAA0C,CAAC;IAC3D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,aAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AAChF,CAAC;AACD,KAAK,UAAU,eAAe,CAC5B,OAAyB,EACzB,GAAiB,EACjB,OAA0B,EAC1B,KAAa;IAEb,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC;IACF,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE;QAC/B,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,EAAE,KAAK,CAAC,CAAC;IACV,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC;QACpB,OAAO,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/B,IAAI,GAAG,CAAC,CAAC;IACX,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC;AACD,KAAK,UAAU,YAAY,CACzB,OAAyB,EACzB,GAAiB,EACjB,IAAY;IAEZ,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,IAAI,KAAK,CAAC;YAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AACD,SAAS,cAAc,CAAC,OAAyB,EAAE,IAAY;IAC7D,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,CAAC,aAAa,EAAE,CAAC;QACxB,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/B,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAA4B;IAOlE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,kBAAkB,IAAI,OAAO,CAAC;IAC7D,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACjE,sFAAsF;IACtF,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS;QAC/B,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CACtB,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAC1D,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CACnC,CAAC;IACJ,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B,GAAG,EAAE,GAAG,CAAC,MAAM;QACf,IAAI,EAAE,SAAS;QACf,YAAY,EAAE,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC;QAClD,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAyB,EACzB,IAAY;IAEZ,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC","sourcesContent":["import { redactDiagnosticText } from \"../host-diagnostic-redaction\";\nimport { isRecord, requireRecord } from \"../value-guards\";\nimport { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { createInterface } from \"node:readline\";\nimport {\n HostProcessDiagnostics,\n type HostDiagnostics,\n} from \"../host-diagnostics\";\ninterface HarnessRunRequest {\n repoDir: string;\n prompt: string;\n model: string;\n effort: string;\n signal?: AbortSignal;\n control?: { followUpPrompt?: string; appServerTimeoutMs?: number };\n}\n\ntype RecordValue = Record<string, unknown>;\nfunction record(value: unknown): RecordValue {\n return requireRecord(value, \"Malformed app-server object\");\n}\nfunction identifier(value: unknown): string {\n if (typeof value !== \"string\" || !value)\n throw new Error(\"Missing app-server identifier\");\n return value;\n}\n\nfunction protocolMessage(line: string): RecordValue {\n try {\n return record(JSON.parse(line));\n } catch {\n throw new Error(\"Malformed app-server JSON message\");\n }\n}\n\ninterface AppServerErrorEvidence {\n source: \"error\" | \"turn/completed\";\n threadId: string;\n turnId: string | null;\n willRetry: boolean | null;\n message: string | null;\n messageTruncated?: boolean;\n code: string | null;\n httpStatusCode?: number;\n}\n\n/** Lifecycle and bounded public errors; normal Codex readers retain tool evidence. */\nexport interface AppServerEvidence {\n type: \"sevro.codex.app-server\";\n threadId?: string;\n model?: string;\n effort?: string;\n clientTurns: number;\n turns: { id: string; status: string; at: string }[];\n goals: {\n status: string;\n characters: number;\n turnId: string | null;\n at: string;\n source: \"notification\" | \"readback\";\n }[];\n finalTurnId?: string;\n goalStatus?: string | null;\n failure?: string;\n errors?: AppServerErrorEvidence[];\n errorsDropped?: number;\n}\n\nfunction publicErrorMessage(value: unknown): {\n message: string | null;\n messageTruncated?: boolean;\n} {\n if (typeof value !== \"string\") return { message: null };\n const redacted = redactDiagnosticText(value.slice(0, 20000), []);\n return {\n message: redacted.slice(0, 2000),\n ...(value.length > 20000 || redacted.length > 2000\n ? { messageTruncated: true }\n : {}),\n };\n}\n\nfunction errorClassification(value: unknown): {\n code: string | null;\n httpStatusCode?: number;\n} {\n const tag = (s: unknown): s is string =>\n typeof s === \"string\" && /^[A-Za-z][A-Za-z0-9]{0,79}$/.test(s);\n if (tag(value)) return { code: value };\n if (!isRecord(value)) return { code: null };\n return classifiedErrorEntry(value, tag);\n}\n\nfunction classifiedErrorEntry(\n value: RecordValue,\n tag: (value: unknown) => value is string,\n) {\n const entries = Object.entries(value);\n const [entry] = entries;\n if (entries.length !== 1 || entry === undefined || !tag(entry[0]))\n return { code: null };\n const [code, details] = entry;\n return { code, ...errorHttpStatus(details) };\n}\n\nfunction validHttpStatus(value: unknown): value is number {\n return (\n typeof value === \"number\" &&\n Number.isInteger(value) &&\n value >= 0 &&\n value <= 65535\n );\n}\n\nfunction errorHttpStatus(details: unknown): { httpStatusCode?: number } {\n const status =\n details && typeof details === \"object\"\n ? (details as RecordValue).httpStatusCode\n : undefined;\n return {\n ...(validHttpStatus(status) ? { httpStatusCode: status } : {}),\n };\n}\n\ninterface Notification {\n method: string;\n params: RecordValue;\n}\n\n/** JSON-RPC transport only: no goal mutation, retries or synthesized user turns. */\nclass AppServerRpc {\n readonly process: ChildProcessWithoutNullStreams;\n readonly exited: Promise<number | null>;\n readonly queue: Notification[] = [];\n private nextId = 1;\n private pending = new Map<\n number,\n {\n resolve: (value: RecordValue) => void;\n reject: (error: Error) => void;\n method: string;\n }\n >();\n private wake?: () => void;\n private failure?: Error;\n private closing = false;\n private receivedBytes = 0;\n private reads: Promise<void>;\n private errors: Promise<void>;\n stderr = \"\";\n readonly capture: HostProcessDiagnostics;\n\n constructor(\n argv: string[],\n cwd: string,\n env: Record<string, string>,\n diagnostics: HostDiagnostics,\n ) {\n this.capture = new HostProcessDiagnostics(diagnostics);\n this.process = spawn(identifier(argv[0]), argv.slice(1), {\n detached: process.platform !== \"win32\",\n cwd,\n env,\n stdio: \"pipe\",\n });\n this.exited = new Promise((resolve) => {\n this.process.once(\"exit\", resolve);\n this.process.once(\"error\", (error) => {\n if (this.process.pid === undefined) this.capture.recordUnstarted();\n this.fail(error);\n resolve(null);\n });\n });\n this.process.stdout.on(\"data\", (chunk: Buffer) => {\n this.capture.stdout.add(chunk);\n });\n this.reads = this.readLines().catch((error: unknown) => {\n this.fail(error);\n });\n this.process.stdin.on(\"error\", (error) => {\n this.fail(error);\n });\n this.errors = new Promise((resolve) => {\n this.process.stderr.on(\"data\", (chunk: Buffer) => {\n this.capture.stderr.add(chunk);\n this.stderr = (this.stderr + String(chunk)).slice(-16000);\n });\n this.process.stderr.on(\"end\", resolve);\n this.process.stderr.on(\"close\", resolve);\n this.process.stderr.on(\"error\", (error) => {\n this.fail(error);\n resolve();\n });\n });\n void this.exited.then((code) => {\n if (!this.closing)\n this.fail(new Error(`App-server exited before settlement (${code})`));\n });\n }\n\n fail(error: unknown): void {\n this.failure ??= error instanceof Error ? error : new Error(String(error));\n for (const pending of this.pending.values()) pending.reject(this.failure);\n this.pending.clear();\n this.wake?.();\n }\n\n assertHealthy(): void {\n if (this.failure) throw this.failure;\n }\n\n private send(value: unknown): void {\n this.process.stdin.write(JSON.stringify(value) + \"\\n\");\n }\n\n private readLines(): Promise<void> {\n return new Promise((resolve) => {\n const lines = createInterface({ input: this.process.stdout });\n this.process.stdout.on(\"close\", () => {\n lines.close();\n });\n lines.on(\"line\", (line) => {\n try {\n this.receivedBytes += Buffer.byteLength(line);\n if (this.receivedBytes > 8 * 1024 * 1024)\n throw new Error(\"App-server stream exceeds limit\");\n if (!line.trim()) return;\n this.receive(protocolMessage(line));\n } catch (error) {\n this.fail(error);\n }\n });\n lines.on(\"close\", () => {\n if (!this.closing)\n this.fail(new Error(\"App-server stdout closed before settlement\"));\n resolve();\n });\n });\n }\n\n private receive(message: RecordValue): void {\n this.refuseServerRequest(message);\n if (typeof message.id === \"number\")\n this.receiveResponse(message, message.id);\n else if (typeof message.method === \"string\")\n this.receiveNotification(message.method, message.params);\n else throw new Error(\"Malformed app-server message\");\n }\n\n private refuseServerRequest(message: RecordValue): void {\n if (typeof message.method !== \"string\" || message.id === undefined) return;\n this.send({\n id: message.id,\n error: {\n code: -32601,\n message: \"Unattended eval cannot answer this server request\",\n },\n });\n throw new Error(`Unsupported app-server request: ${message.method}`);\n }\n\n private receiveResponse(message: RecordValue, id: number): void {\n const pending = this.pending.get(id);\n if (!pending) throw new Error(\"Unmatched app-server response\");\n // Validate before removing the waiter so malformed responses reject it.\n const value = record(message.error ?? message.result);\n this.pending.delete(id);\n if (message.error)\n pending.reject(\n new Error(`App-server RPC failed (${String(value.code)})`),\n );\n else pending.resolve(value);\n }\n\n private receiveNotification(method: string, value: unknown): void {\n // Drop reasoning, account metadata, deltas and private raw events at ingress.\n if (\n ![\n \"turn/started\",\n \"turn/completed\",\n \"thread/goal/updated\",\n \"thread/goal/cleared\",\n \"thread/tokenUsage/updated\",\n \"item/completed\",\n \"error\",\n ].includes(method)\n )\n return;\n const params = record(value);\n if (!allowedNotificationItem(method, params)) return;\n if (this.queue.length >= 1024)\n throw new Error(\"App-server notification queue exceeds limit\");\n this.queue.push({ method, params });\n this.wake?.();\n }\n\n /** The session's configured time bound is the only deadline, including startup. */\n async call(method: string, params: RecordValue): Promise<RecordValue> {\n if (this.failure) throw this.failure;\n const id = this.nextId++;\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject, method });\n try {\n this.send({ id, method, params });\n } catch (error) {\n this.fail(error);\n }\n });\n }\n\n pendingMethods(): string[] {\n return Array.from(this.pending.values(), (pending) => pending.method);\n }\n\n async initialize(): Promise<void> {\n await this.call(\"initialize\", {\n clientInfo: { name: \"sevro_eval\", version: \"0.1.0\" },\n capabilities: { experimentalApi: false },\n });\n this.send({ method: \"initialized\", params: {} });\n }\n\n async next(): Promise<Notification> {\n while (!this.failure && !this.queue.length)\n await new Promise<void>((resolve) => {\n this.wake = resolve;\n });\n this.wake = undefined;\n if (this.failure) throw this.failure;\n const notification = this.queue.shift();\n if (!notification) throw new Error(\"Missing app-server notification\");\n return notification;\n }\n\n async close(): Promise<void> {\n this.closing = true;\n this.process.stdin.end();\n let shutdownError: NodeJS.ErrnoException | undefined;\n const terminate = (signal: NodeJS.Signals) => {\n try {\n if (this.process.pid) process.kill(-this.process.pid, signal);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ESRCH\")\n shutdownError ??= error as NodeJS.ErrnoException;\n }\n };\n const term = setTimeout(() => {\n terminate(\"SIGTERM\");\n }, 5000);\n const kill = setTimeout(() => {\n terminate(\"SIGKILL\");\n }, 6000);\n try {\n await this.exited;\n await this.reads;\n await this.errors;\n } finally {\n clearTimeout(term);\n clearTimeout(kill);\n }\n if (shutdownError !== undefined) throw shutdownError;\n }\n}\n\nfunction allowedNotificationItem(method: string, params: RecordValue): boolean {\n return (\n method !== \"item/completed\" ||\n [\"commandExecution\", \"collabAgentToolCall\"].includes(\n String(record(params.item).type),\n )\n );\n}\n\n/** Convert only public tool items used by the existing bounded evidence readers. */\nfunction toolEvent(value: unknown): unknown {\n const item = record(value);\n if (item.type === \"commandExecution\")\n return {\n type: \"item.completed\",\n item: {\n id: item.id,\n type: \"command_execution\",\n command: item.command,\n status: item.status === \"completed\" ? \"completed\" : item.status,\n exit_code: item.exitCode,\n aggregated_output: item.aggregatedOutput,\n },\n };\n if (item.type === \"collabAgentToolCall\")\n return {\n type: \"item.completed\",\n item: {\n id: item.id,\n type: \"collab_tool_call\",\n tool:\n typeof item.tool === \"string\"\n ? item.tool.replace(\n /[A-Z]/g,\n (letter) => `_${letter.toLowerCase()}`,\n )\n : item.tool,\n status: item.status,\n sender_thread_id: item.senderThreadId,\n receiver_thread_ids: item.receiverThreadIds,\n prompt: item.prompt,\n model: item.model,\n reasoning_effort: item.reasoningEffort,\n },\n };\n return undefined;\n}\n\n/** Require the exact terminal turn, not a previous checkpoint or child response. */\nexport function appServerFinal(thread: unknown, turnId: string): string {\n const items = completedAppServerTurn(thread, turnId).items;\n if (!Array.isArray(items))\n throw new Error(\"Completed app-server turn has no items\");\n const finals = items\n .map(record)\n .filter(\n (item) =>\n item.type === \"agentMessage\" &&\n item.phase === \"final_answer\" &&\n typeof item.text === \"string\",\n );\n if (!finals.length)\n throw new Error(\"Completed app-server turn has no final response\");\n return finals.map((item) => item.text).join(\"\\n\\n\");\n}\n\nfunction completedAppServerTurn(thread: unknown, turnId: string): RecordValue {\n const turns: unknown = record(thread).turns;\n if (!Array.isArray(turns))\n throw new Error(\"App-server thread has no retained turns\");\n const matches = turns.map(record).filter((turn) => turn.id === turnId);\n const [turn] = matches;\n if (matches.length !== 1 || turn === undefined || turn.status !== \"completed\")\n throw new Error(\"Missing completed app-server turn\");\n return turn;\n}\n\nconst GOAL_STATUSES = [\n \"active\",\n \"paused\",\n \"blocked\",\n \"usageLimited\",\n \"budgetLimited\",\n \"complete\",\n];\n\nexport function appServerGoalStatus(\n value: unknown,\n threadId: string,\n): string | null {\n if (value === null) return null;\n const goal = record(value);\n requireGoalIdentity(goal, threadId);\n requireGoalObjective(goal.objective);\n return String(goal.status);\n}\n\nfunction requireGoalIdentity(goal: RecordValue, threadId: string): void {\n if (\n goal.threadId !== threadId ||\n typeof goal.status !== \"string\" ||\n !GOAL_STATUSES.includes(goal.status)\n )\n throw new Error(\"Invalid native goal readback\");\n}\nfunction requireGoalObjective(objective: unknown): void {\n if (\n typeof objective !== \"string\" ||\n !objective.length ||\n Array.from(objective).length > 4000\n )\n throw new Error(\"Invalid native goal readback\");\n}\n\nexport interface AppServerRunOptions {\n diagnostics: HostDiagnostics;\n vettedHooks?: boolean;\n request: HarnessRunRequest;\n argv: string[];\n env: Record<string, string>;\n /** Existing observer captures the actual boundary before an explicit follow-up. */\n followUpBoundary: (\n threadId: string,\n goal: { nativeGoalObserved: boolean; nativeGoalStatus: string | null },\n ) => Promise<string>;\n permissionProfile: string;\n}\n\n/** Observe one original host thread. Capability coordination stays in its skill. */\nclass AppServerSession {\n readonly evidence: AppServerEvidence = {\n type: \"sevro.codex.app-server\",\n clientTurns: 0,\n turns: [],\n goals: [],\n };\n readonly out: string[] = [];\n finalMessage: string | null = null;\n private threadId = \"\";\n private goalSeen = false;\n private emittedItems = new Set<string>();\n private followUp?: string;\n\n constructor(\n readonly rpc: AppServerRpc,\n readonly options: AppServerRunOptions,\n ) {\n this.followUp = options.request.control?.followUpPrompt;\n }\n emit(event: unknown): void {\n this.out.push(JSON.stringify(event));\n }\n\n private async start(): Promise<void> {\n const { request } = this.options;\n await this.rpc.initialize();\n const started = await this.rpc.call(\"thread/start\", {\n cwd: request.repoDir,\n model: request.model,\n modelProvider: \"openai\",\n config: {\n model_reasoning_effort: request.effort,\n default_permissions: this.options.permissionProfile,\n ...(this.options.vettedHooks\n ? { bypass_hook_trust: true, features: { hooks: true } }\n : {}),\n },\n approvalPolicy: \"never\",\n allowProviderModelFallback: false,\n ephemeral: false,\n });\n this.threadId = identifier(record(started.thread).id);\n this.evidence.threadId = this.threadId;\n this.evidence.model = String(started.model);\n this.evidence.effort = String(started.reasoningEffort);\n if (\n started.model !== request.model ||\n started.reasoningEffort !== request.effort ||\n started.modelProvider !== \"openai\"\n )\n throw new Error(\"App-server effective root route mismatch\");\n this.emit({ type: \"thread.started\", thread_id: this.threadId });\n await this.startUserTurn(request.prompt);\n }\n\n private async startUserTurn(prompt: string): Promise<void> {\n const { request } = this.options;\n const response = await this.rpc.call(\"turn/start\", {\n threadId: this.threadId,\n model: request.model,\n effort: request.effort,\n input: [{ type: \"text\", text: prompt, text_elements: [] }],\n });\n identifier(record(response.turn).id);\n this.evidence.clientTurns++;\n }\n\n private emitItem(value: unknown): void {\n const item = record(value);\n const key = identifier(item.id);\n const event = toolEvent(item);\n if (event && !this.emittedItems.has(key)) {\n this.emittedItems.add(key);\n this.emit(event);\n }\n }\n\n private observeGoal(\n params: RecordValue,\n source: \"notification\" | \"readback\" = \"notification\",\n ): void {\n const status = requiredGoalStatus(params.goal, this.threadId);\n this.goalSeen = true;\n const observation = {\n status,\n characters: Array.from(String(record(params.goal).objective)).length,\n turnId: typeof params.turnId === \"string\" ? params.turnId : null,\n at: new Date().toISOString(),\n source,\n };\n const previous = this.evidence.goals.at(-1);\n if (!sameGoalObservation(previous, observation))\n this.evidence.goals.push(observation);\n }\n\n private observeTurn(value: unknown, status?: string): string {\n const turn = record(value);\n const id = identifier(turn.id);\n this.evidence.turns.push({\n id,\n status: status ?? String(turn.status),\n at: new Date().toISOString(),\n });\n return id;\n }\n\n private observeError(\n source: AppServerErrorEvidence[\"source\"],\n turnId: unknown,\n willRetry: unknown,\n value: unknown,\n ): void {\n const errors = (this.evidence.errors ??= []);\n if (errors.length === 32) {\n errors.shift();\n this.evidence.errorsDropped = (this.evidence.errorsDropped ?? 0) + 1;\n }\n errors.push(errorReceipt(source, this.threadId, turnId, willRetry, value));\n }\n\n private async onNotification({\n method,\n params,\n }: Notification): Promise<boolean> {\n if (params.threadId !== this.threadId) return false;\n switch (method) {\n case \"error\":\n this.observeError(\n \"error\",\n params.turnId,\n params.willRetry,\n params.error,\n );\n if (params.willRetry !== true)\n throw new Error(\"App-server reported a fatal turn error\");\n break;\n case \"item/completed\":\n this.emitItem(params.item);\n break;\n case \"thread/goal/updated\":\n this.observeGoal(params);\n break;\n case \"thread/goal/cleared\":\n throw new Error(\"Participant cleared the observed native goal\");\n case \"turn/started\":\n this.observeTurn(params.turn, \"started\");\n this.emit({ type: \"turn.started\" });\n break;\n case \"turn/completed\":\n return this.onCompletedTurn(record(params.turn));\n }\n return false;\n }\n\n private async onCompletedTurn(turn: RecordValue): Promise<boolean> {\n const turnId = this.observeTurn(turn);\n this.requireCompletedTurn(turn, turnId);\n const status = await this.completedGoal(turnId);\n this.emit({ type: \"turn.completed\" });\n if (this.followUp !== undefined)\n return this.deliverFeedback(turnId, status, this.followUp);\n return status !== \"active\" && (await this.captureFinal(turnId));\n }\n\n private requireCompletedTurn(turn: RecordValue, turnId: string): void {\n if (turn.status === \"completed\") return;\n this.observeError(\"turn/completed\", turnId, null, turn.error);\n throw new Error(`App-server turn ${String(turn.status)}`);\n }\n\n private async completedGoal(turnId: string): Promise<string | null> {\n const goal = await this.rpc.call(\"thread/goal/get\", {\n threadId: this.threadId,\n });\n const status = appServerGoalStatus(goal.goal, this.threadId);\n this.evidence.goalStatus = status;\n if (this.goalSeen && status === null)\n throw new Error(\"Observed native goal disappeared\");\n if (status !== null)\n this.observeGoal({ goal: goal.goal, turnId }, \"readback\");\n return status;\n }\n\n private async deliverFeedback(\n turnId: string,\n status: string | null,\n prompt: string,\n ): Promise<boolean> {\n // User input does not require a terminal goal. Preserve the completed\n // response and actual boundary before delivering the declared follow-up.\n if (!(await this.captureFinal(turnId, true))) return false;\n const boundary = protocolMessage(\n await this.options.followUpBoundary(this.threadId, {\n nativeGoalObserved: this.goalSeen,\n nativeGoalStatus: status,\n }),\n );\n if (!this.responseBoundaryReady(turnId)) return false;\n this.emit({\n ...boundary,\n native_goal_observed: this.goalSeen,\n native_goal_status: status,\n });\n this.followUp = undefined;\n await this.startUserTurn(prompt);\n return false;\n }\n\n private async captureFinal(\n turnId: string,\n forFeedback = false,\n ): Promise<boolean> {\n const snapshot = await this.rpc.call(\"thread/read\", {\n threadId: this.threadId,\n includeTurns: true,\n });\n const { thread, turns } = retainedThread(snapshot, this.threadId);\n const latest = record(turns.at(-1));\n // A later native turn can start while readback is pending. Wait for it.\n if (!latestTurnReady(latest, turnId)) return false;\n const final = appServerFinal(thread, turnId);\n for (const value of turns) this.backfillItems(record(value));\n this.finalMessage = final;\n this.evidence.finalTurnId = turnId;\n this.emit({\n type: \"item.completed\",\n item: { type: \"agent_message\", text: final },\n });\n if (forFeedback) return this.responseBoundaryReady(turnId);\n this.assertSettled();\n return true;\n }\n\n /** Continuation may race feedback capture; errors still stop delivery. */\n private responseBoundaryReady(turnId: string): boolean {\n this.rpc.assertHealthy();\n let ready = true;\n for (const event of this.rpc.queue) {\n const { params } = event;\n if (params.threadId !== this.threadId) continue;\n this.validateResponseEvent(event);\n if (laterRootTurn(event, turnId)) ready = false;\n }\n return ready;\n }\n\n private validateResponseEvent(event: Notification): void {\n if (event.method === \"error\" || event.method === \"thread/goal/cleared\")\n this.checkPendingSettlement(event);\n if (event.method === \"thread/goal/updated\")\n appServerGoalStatus(event.params.goal, this.threadId);\n }\n\n /** Readback and file I/O can race with a terminal protocol event. */\n assertSettled(): void {\n this.rpc.assertHealthy();\n for (const event of this.rpc.queue) {\n if (event.params.threadId !== this.threadId) continue;\n this.checkPendingSettlement(event);\n }\n }\n\n private checkPendingSettlement({ method, params }: Notification): void {\n this.requireNonfatalPendingError(method, params);\n if (method === \"thread/goal/cleared\")\n throw new Error(\"Native goal cleared during settlement\");\n this.requireSettledGoal(method, params);\n if (laterRootTurn({ method, params }, this.evidence.finalTurnId))\n throw new Error(\"Another root turn appeared during settlement\");\n }\n\n private requireNonfatalPendingError(\n method: string,\n params: RecordValue,\n ): void {\n if (method === \"error\" && params.willRetry !== true) {\n this.observeError(\"error\", params.turnId, params.willRetry, params.error);\n throw new Error(\"App-server reported a fatal error during settlement\");\n }\n }\n private requireSettledGoal(method: string, params: RecordValue): void {\n if (\n method === \"thread/goal/updated\" &&\n appServerGoalStatus(params.goal, this.threadId) === \"active\"\n )\n throw new Error(\"Native goal became active during settlement\");\n }\n\n private backfillItems(turn: RecordValue): void {\n if (Array.isArray(turn.items))\n for (const item of turn.items) this.emitItem(item);\n }\n\n async run(): Promise<void> {\n await this.start();\n while (!(await this.onNotification(await this.rpc.next()))) {\n /* Native host owns continuation. */\n }\n }\n}\n\nfunction requiredGoalStatus(value: unknown, threadId: string): string {\n const status = appServerGoalStatus(value, threadId);\n if (status === null) throw new Error(\"Malformed app-server object\");\n return status;\n}\nfunction sameGoalObservation(\n previous: AppServerEvidence[\"goals\"][number] | undefined,\n observation: AppServerEvidence[\"goals\"][number],\n): boolean {\n return (\n previous?.status === observation.status &&\n previous.turnId === observation.turnId &&\n previous.source === observation.source\n );\n}\nfunction errorReceipt(\n source: AppServerErrorEvidence[\"source\"],\n threadId: string,\n turnId: unknown,\n willRetry: unknown,\n value: unknown,\n): AppServerErrorEvidence {\n const error = isRecord(value) ? value : {};\n return {\n source,\n threadId,\n turnId: typeof turnId === \"string\" ? turnId.slice(0, 200) : null,\n willRetry: typeof willRetry === \"boolean\" ? willRetry : null,\n ...publicErrorMessage(error.message),\n ...errorClassification(error.codexErrorInfo),\n };\n}\nfunction retainedThread(snapshot: RecordValue, threadId: string) {\n const thread = record(snapshot.thread);\n if (thread.id !== threadId)\n throw new Error(\"App-server returned another thread\");\n const turns: unknown = thread.turns;\n if (!Array.isArray(turns)) throw new Error(\"Missing app-server history\");\n return { thread, turns: turns as unknown[] };\n}\nfunction latestTurnReady(latest: RecordValue, turnId: string): boolean {\n if (latest.id === turnId) return true;\n if (latest.status === \"inProgress\" || latest.status === \"completed\")\n return false;\n throw new Error(\"Later app-server turn did not complete\");\n}\nfunction laterRootTurn(\n event: Notification,\n turnId: string | undefined,\n): boolean {\n return (\n [\"turn/started\", \"turn/completed\"].includes(event.method) &&\n record(event.params.turn).id !== turnId\n );\n}\nfunction requireAppServerRun(request: HarnessRunRequest, bound: number): void {\n if (request.signal?.aborted) throw new Error(\"Codex run cancelled\");\n if (!Number.isFinite(bound) || bound <= 0)\n throw new Error(\"Invalid app-server time bound\");\n}\nfunction sessionFailure(session: AppServerSession, error: unknown): void {\n session.options.diagnostics.failure = error;\n session.evidence.failure =\n error instanceof Error ? error.message : String(error);\n session.emit({ type: \"turn.failed\" });\n}\n/** Name an unanswered request so a stalled startup stays distinguishable. */\nfunction timeBoundFailure(pending: string[]): string {\n const reached = \"App-server evaluation time bound reached\";\n return pending.length ? `${reached} awaiting ${pending.join(\", \")}` : reached;\n}\nasync function completeSession(\n session: AppServerSession,\n rpc: AppServerRpc,\n request: HarnessRunRequest,\n bound: number,\n): Promise<number> {\n const cancel = () => {\n rpc.fail(new Error(\"Codex run cancelled\"));\n };\n request.signal?.addEventListener(\"abort\", cancel, { once: true });\n const deadline = setTimeout(() => {\n rpc.fail(new Error(timeBoundFailure(rpc.pendingMethods())));\n }, bound);\n let code = 0;\n try {\n await session.run();\n session.assertSettled();\n } catch (error) {\n sessionFailure(session, error);\n code = 1;\n } finally {\n clearTimeout(deadline);\n request.signal?.removeEventListener(\"abort\", cancel);\n }\n return closeSession(session, rpc, code);\n}\nasync function closeSession(\n session: AppServerSession,\n rpc: AppServerRpc,\n code: number,\n): Promise<number> {\n try {\n await rpc.close();\n return code;\n } catch (error) {\n if (code === 0) sessionFailure(session, error);\n return 1;\n }\n}\nfunction settlementCode(session: AppServerSession, code: number): number {\n if (code !== 0) return code;\n try {\n session.assertSettled();\n return 0;\n } catch (error) {\n sessionFailure(session, error);\n return 1;\n }\n}\n\nexport async function runCodexAppServer(options: AppServerRunOptions): Promise<{\n out: string;\n err: string;\n code: number;\n finalMessage: string | null;\n evidence: AppServerEvidence;\n}> {\n const { request, argv, env } = options;\n const bound = request.control?.appServerTimeoutMs ?? 3600000;\n requireAppServerRun(request, bound);\n const rpc = new AppServerRpc(argv, request.repoDir, env, options.diagnostics);\n const session = new AppServerSession(rpc, options);\n const code = await completeSession(session, rpc, request, bound);\n // Flush stdout before accepting success, including trailing data and terminal errors.\n const finalCode = settlementCode(session, code);\n if (rpc.process.pid !== undefined)\n await rpc.capture.record(\n { exited: rpc.exited, signalCode: rpc.process.signalCode },\n finalCode === 0 ? \"exit\" : \"error\",\n );\n return {\n out: session.out.join(\"\\n\"),\n err: rpc.stderr,\n code: finalCode,\n finalMessage: completedMessage(session, finalCode),\n evidence: session.evidence,\n };\n}\n\nfunction completedMessage(\n session: AppServerSession,\n code: number,\n): string | null {\n return code === 0 ? session.finalMessage : null;\n}\n"]}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { isRecord } from "../value-guards.js";
|
|
2
|
+
import { lstat, readFile, realpath, stat } from "node:fs/promises";
|
|
3
|
+
import { dirname, isAbsolute, join } from "node:path";
|
|
4
|
+
import { insideRoot } from "../paths.js";
|
|
5
|
+
import { parse } from "smol-toml";
|
|
6
|
+
export async function configurationRoot(root) {
|
|
7
|
+
if (!isAbsolute(root))
|
|
8
|
+
throw new Error("configuration root must be absolute");
|
|
9
|
+
try {
|
|
10
|
+
const canonical = await realpath(root);
|
|
11
|
+
if (!(await stat(canonical)).isDirectory())
|
|
12
|
+
throw new Error("not a directory");
|
|
13
|
+
return canonical;
|
|
14
|
+
}
|
|
15
|
+
catch (cause) {
|
|
16
|
+
throw new Error(`configuration root is unreadable: ${root}`, { cause });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async function hasConfigurationDirectory(directory) {
|
|
20
|
+
let declared = false;
|
|
21
|
+
try {
|
|
22
|
+
await lstat(directory);
|
|
23
|
+
declared = true;
|
|
24
|
+
if (!(await stat(directory)).isDirectory())
|
|
25
|
+
throw new Error("not a directory");
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (!declared && error.code === "ENOENT")
|
|
30
|
+
return false;
|
|
31
|
+
throw new Error("configuration directory is unreadable", { cause: error });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Import one explicit setting; never inherit ambient Codex configuration. */
|
|
35
|
+
export async function codexAgentConcurrency(root) {
|
|
36
|
+
const configPath = join(root, ".codex", "config.toml");
|
|
37
|
+
const source = await readConfiguration(root, configPath);
|
|
38
|
+
if (source === null)
|
|
39
|
+
return null;
|
|
40
|
+
return parseAgentConcurrency(source, configPath);
|
|
41
|
+
}
|
|
42
|
+
async function readConfiguration(root, configPath) {
|
|
43
|
+
let source;
|
|
44
|
+
let declared = false;
|
|
45
|
+
try {
|
|
46
|
+
if (!(await hasConfigurationDirectory(dirname(configPath))))
|
|
47
|
+
return null;
|
|
48
|
+
const info = await lstat(configPath);
|
|
49
|
+
declared = true;
|
|
50
|
+
const canonical = await realpath(configPath);
|
|
51
|
+
validateConfigurationFile(info, insideRoot(root, canonical));
|
|
52
|
+
source = await readFile(configPath, "utf8");
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (!declared && error.code === "ENOENT")
|
|
56
|
+
return null;
|
|
57
|
+
throw new Error(`Cannot read Codex configuration: ${configPath}`, {
|
|
58
|
+
cause: error,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return source;
|
|
62
|
+
}
|
|
63
|
+
function parseAgentConcurrency(source, configPath) {
|
|
64
|
+
let config;
|
|
65
|
+
try {
|
|
66
|
+
config = parse(source, { integersAsBigInt: true });
|
|
67
|
+
}
|
|
68
|
+
catch (cause) {
|
|
69
|
+
throw new Error(`Invalid Codex configuration: ${configPath}`, { cause });
|
|
70
|
+
}
|
|
71
|
+
const agents = config.agents;
|
|
72
|
+
if (agents === undefined)
|
|
73
|
+
return null;
|
|
74
|
+
if (!isRecord(agents))
|
|
75
|
+
throw new Error(`Expected an agents table in ${configPath}`);
|
|
76
|
+
return concurrencyLimit(agents.max_concurrent_threads_per_session, configPath);
|
|
77
|
+
}
|
|
78
|
+
function concurrencyLimit(limit, configPath) {
|
|
79
|
+
if (limit === undefined)
|
|
80
|
+
return null;
|
|
81
|
+
if (typeof limit !== "bigint" ||
|
|
82
|
+
limit < 1n ||
|
|
83
|
+
limit > BigInt(Number.MAX_SAFE_INTEGER))
|
|
84
|
+
throw new Error(`Expected a positive integer for agents.max_concurrent_threads_per_session in ${configPath}`);
|
|
85
|
+
return Number(limit);
|
|
86
|
+
}
|
|
87
|
+
function validateConfigurationFile(info, contained) {
|
|
88
|
+
if (!info.isFile() || info.size > 64 * 1024 || !contained)
|
|
89
|
+
throw new Error("configuration must be a contained regular file up to 64 KiB");
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=codex-configuration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-configuration.js","sourceRoot":"","sources":["codex-configuration.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Stats } from \"node:fs\";\nimport { isRecord } from \"../value-guards\";\nimport { lstat, readFile, realpath, stat } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join } from \"node:path\";\nimport { insideRoot } from \"../paths\";\nimport { parse } from \"smol-toml\";\n\nexport async function configurationRoot(root: string): Promise<string> {\n if (!isAbsolute(root)) throw new Error(\"configuration root must be absolute\");\n try {\n const canonical = await realpath(root);\n if (!(await stat(canonical)).isDirectory())\n throw new Error(\"not a directory\");\n return canonical;\n } catch (cause) {\n throw new Error(`configuration root is unreadable: ${root}`, { cause });\n }\n}\n\nasync function hasConfigurationDirectory(directory: string): Promise<boolean> {\n let declared = false;\n try {\n await lstat(directory);\n declared = true;\n if (!(await stat(directory)).isDirectory())\n throw new Error(\"not a directory\");\n return true;\n } catch (error) {\n if (!declared && (error as NodeJS.ErrnoException).code === \"ENOENT\")\n return false;\n throw new Error(\"configuration directory is unreadable\", { cause: error });\n }\n}\n\n/** Import one explicit setting; never inherit ambient Codex configuration. */\nexport async function codexAgentConcurrency(\n root: string,\n): Promise<number | null> {\n const configPath = join(root, \".codex\", \"config.toml\");\n const source = await readConfiguration(root, configPath);\n if (source === null) return null;\n return parseAgentConcurrency(source, configPath);\n}\n\nasync function readConfiguration(\n root: string,\n configPath: string,\n): Promise<string | null> {\n let source: string;\n let declared = false;\n try {\n if (!(await hasConfigurationDirectory(dirname(configPath)))) return null;\n const info = await lstat(configPath);\n declared = true;\n const canonical = await realpath(configPath);\n validateConfigurationFile(info, insideRoot(root, canonical));\n source = await readFile(configPath, \"utf8\");\n } catch (error) {\n if (!declared && (error as NodeJS.ErrnoException).code === \"ENOENT\")\n return null;\n throw new Error(`Cannot read Codex configuration: ${configPath}`, {\n cause: error,\n });\n }\n return source;\n}\n\nfunction parseAgentConcurrency(\n source: string,\n configPath: string,\n): number | null {\n let config: Record<string, unknown>;\n try {\n config = parse(source, { integersAsBigInt: true });\n } catch (cause) {\n throw new Error(`Invalid Codex configuration: ${configPath}`, { cause });\n }\n const agents = config.agents;\n if (agents === undefined) return null;\n if (!isRecord(agents))\n throw new Error(`Expected an agents table in ${configPath}`);\n return concurrencyLimit(\n agents.max_concurrent_threads_per_session,\n configPath,\n );\n}\n\nfunction concurrencyLimit(limit: unknown, configPath: string): number | null {\n if (limit === undefined) return null;\n if (\n typeof limit !== \"bigint\" ||\n limit < 1n ||\n limit > BigInt(Number.MAX_SAFE_INTEGER)\n )\n throw new Error(\n `Expected a positive integer for agents.max_concurrent_threads_per_session in ${configPath}`,\n );\n return Number(limit);\n}\n\nfunction validateConfigurationFile(info: Stats, contained: boolean): void {\n if (!info.isFile() || info.size > 64 * 1024 || !contained)\n throw new Error(\n \"configuration must be a contained regular file up to 64 KiB\",\n );\n}\n"]}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { isRecord } from "../value-guards.js";
|
|
2
|
+
const MAX_EVENT_STREAM_BYTES = 8 * 1024 * 1024;
|
|
3
|
+
export class CodexEventError extends Error {
|
|
4
|
+
constructor(message, options) {
|
|
5
|
+
super(message, options);
|
|
6
|
+
this.name = "CodexEventError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function usage(value) {
|
|
10
|
+
if (!isRecord(value))
|
|
11
|
+
return null;
|
|
12
|
+
const input = value.input_tokens;
|
|
13
|
+
const output = value.output_tokens;
|
|
14
|
+
if (!nonnegativeInteger(input) || !nonnegativeInteger(output))
|
|
15
|
+
return null;
|
|
16
|
+
return { inputTokens: input, outputTokens: output };
|
|
17
|
+
}
|
|
18
|
+
function nonnegativeInteger(value) {
|
|
19
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
20
|
+
}
|
|
21
|
+
function parseEvent(line) {
|
|
22
|
+
let parsed;
|
|
23
|
+
try {
|
|
24
|
+
parsed = JSON.parse(line);
|
|
25
|
+
}
|
|
26
|
+
catch (cause) {
|
|
27
|
+
throw new CodexEventError("Codex event stream contains invalid JSONL", {
|
|
28
|
+
cause,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (!isRecord(parsed) || typeof parsed.type !== "string")
|
|
32
|
+
throw new CodexEventError("Codex event stream contains an invalid event");
|
|
33
|
+
return parsed;
|
|
34
|
+
}
|
|
35
|
+
function startThread(state, event) {
|
|
36
|
+
if (state.threadId !== null ||
|
|
37
|
+
typeof event.thread_id !== "string" ||
|
|
38
|
+
!event.thread_id)
|
|
39
|
+
throw new CodexEventError("Codex event stream has an invalid thread start");
|
|
40
|
+
state.threadId = event.thread_id;
|
|
41
|
+
}
|
|
42
|
+
function completeTurn(state, event) {
|
|
43
|
+
if (!state.threadId || state.completed || state.failed)
|
|
44
|
+
throw new CodexEventError("Codex event stream has an invalid turn completion");
|
|
45
|
+
state.completed = true;
|
|
46
|
+
state.tokenUsage = usage(event.usage);
|
|
47
|
+
}
|
|
48
|
+
function completeItem(state, item) {
|
|
49
|
+
if (!isRecord(item) || item.type !== "agent_message" || state.completed)
|
|
50
|
+
return;
|
|
51
|
+
state.finalMessage = typeof item.text === "string" ? item.text : null;
|
|
52
|
+
}
|
|
53
|
+
function applyEvent(state, event) {
|
|
54
|
+
switch (event.type) {
|
|
55
|
+
case "thread.started":
|
|
56
|
+
startThread(state, event);
|
|
57
|
+
break;
|
|
58
|
+
case "item.completed":
|
|
59
|
+
completeItem(state, event.item);
|
|
60
|
+
break;
|
|
61
|
+
case "turn.completed":
|
|
62
|
+
completeTurn(state, event);
|
|
63
|
+
break;
|
|
64
|
+
case "turn.failed":
|
|
65
|
+
state.failed = true;
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Parse one bounded `codex exec --json` turn. A partial stream is never success. */
|
|
70
|
+
export function summarizeCodexEvents(stream, exitCode) {
|
|
71
|
+
if (Buffer.byteLength(stream, "utf8") > MAX_EVENT_STREAM_BYTES)
|
|
72
|
+
throw new CodexEventError("Codex event stream exceeds 8 MiB");
|
|
73
|
+
const state = {
|
|
74
|
+
threadId: null,
|
|
75
|
+
completed: false,
|
|
76
|
+
failed: false,
|
|
77
|
+
finalMessage: null,
|
|
78
|
+
tokenUsage: null,
|
|
79
|
+
};
|
|
80
|
+
for (const line of stream.split("\n")) {
|
|
81
|
+
if (!line.trim())
|
|
82
|
+
continue;
|
|
83
|
+
applyEvent(state, parseEvent(line));
|
|
84
|
+
}
|
|
85
|
+
return summarizeTurn(state, exitCode);
|
|
86
|
+
}
|
|
87
|
+
function summarizeTurn(state, exitCode) {
|
|
88
|
+
const { threadId, completed, failed, finalMessage, tokenUsage } = state;
|
|
89
|
+
if (!threadId)
|
|
90
|
+
throw new CodexEventError("Codex event stream has no thread start");
|
|
91
|
+
const complete = exitCode === 0 && completed && !failed;
|
|
92
|
+
return {
|
|
93
|
+
threadId,
|
|
94
|
+
complete,
|
|
95
|
+
finalMessage,
|
|
96
|
+
...summarizeUsage(tokenUsage, complete),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function summarizeUsage(tokenUsage, complete) {
|
|
100
|
+
if (tokenUsage === null)
|
|
101
|
+
return { inputTokens: null, outputTokens: null, usageComplete: false };
|
|
102
|
+
return { ...tokenUsage, usageComplete: complete };
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=codex-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-events.js","sourceRoot":"","sources":["codex-events.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRecord } from \"../value-guards\";\nconst MAX_EVENT_STREAM_BYTES = 8 * 1024 * 1024;\n\nexport class CodexEventError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"CodexEventError\";\n }\n}\n\nfunction usage(\n value: unknown,\n): { inputTokens: number; outputTokens: number } | null {\n if (!isRecord(value)) return null;\n const input = value.input_tokens;\n const output = value.output_tokens;\n if (!nonnegativeInteger(input) || !nonnegativeInteger(output)) return null;\n return { inputTokens: input, outputTokens: output };\n}\n\nfunction nonnegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\ninterface TurnState {\n threadId: string | null;\n completed: boolean;\n failed: boolean;\n finalMessage: string | null;\n tokenUsage: ReturnType<typeof usage>;\n}\n\nfunction parseEvent(line: string): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch (cause) {\n throw new CodexEventError(\"Codex event stream contains invalid JSONL\", {\n cause,\n });\n }\n if (!isRecord(parsed) || typeof parsed.type !== \"string\")\n throw new CodexEventError(\"Codex event stream contains an invalid event\");\n return parsed;\n}\n\nfunction startThread(state: TurnState, event: Record<string, unknown>): void {\n if (\n state.threadId !== null ||\n typeof event.thread_id !== \"string\" ||\n !event.thread_id\n )\n throw new CodexEventError(\"Codex event stream has an invalid thread start\");\n state.threadId = event.thread_id;\n}\n\nfunction completeTurn(state: TurnState, event: Record<string, unknown>): void {\n if (!state.threadId || state.completed || state.failed)\n throw new CodexEventError(\n \"Codex event stream has an invalid turn completion\",\n );\n state.completed = true;\n state.tokenUsage = usage(event.usage);\n}\n\nfunction completeItem(state: TurnState, item: unknown): void {\n if (!isRecord(item) || item.type !== \"agent_message\" || state.completed)\n return;\n state.finalMessage = typeof item.text === \"string\" ? item.text : null;\n}\n\nfunction applyEvent(state: TurnState, event: Record<string, unknown>): void {\n switch (event.type) {\n case \"thread.started\":\n startThread(state, event);\n break;\n case \"item.completed\":\n completeItem(state, event.item);\n break;\n case \"turn.completed\":\n completeTurn(state, event);\n break;\n case \"turn.failed\":\n state.failed = true;\n break;\n }\n}\n\nexport interface CodexEventSummary {\n threadId: string;\n complete: boolean;\n finalMessage: string | null;\n inputTokens: number | null;\n outputTokens: number | null;\n usageComplete: boolean;\n}\n\n/** Parse one bounded `codex exec --json` turn. A partial stream is never success. */\nexport function summarizeCodexEvents(\n stream: string,\n exitCode: number,\n): CodexEventSummary {\n if (Buffer.byteLength(stream, \"utf8\") > MAX_EVENT_STREAM_BYTES)\n throw new CodexEventError(\"Codex event stream exceeds 8 MiB\");\n const state: TurnState = {\n threadId: null,\n completed: false,\n failed: false,\n finalMessage: null,\n tokenUsage: null,\n };\n for (const line of stream.split(\"\\n\")) {\n if (!line.trim()) continue;\n applyEvent(state, parseEvent(line));\n }\n return summarizeTurn(state, exitCode);\n}\n\nfunction summarizeTurn(state: TurnState, exitCode: number): CodexEventSummary {\n const { threadId, completed, failed, finalMessage, tokenUsage } = state;\n if (!threadId)\n throw new CodexEventError(\"Codex event stream has no thread start\");\n const complete = exitCode === 0 && completed && !failed;\n return {\n threadId,\n complete,\n finalMessage,\n ...summarizeUsage(tokenUsage, complete),\n };\n}\n\nfunction summarizeUsage(\n tokenUsage: ReturnType<typeof usage>,\n complete: boolean,\n) {\n if (tokenUsage === null)\n return { inputTokens: null, outputTokens: null, usageComplete: false };\n return { ...tokenUsage, usageComplete: complete };\n}\n"]}
|