@telora/daemon 0.12.33
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/.env.example +64 -0
- package/README.md +229 -0
- package/build-info.json +4 -0
- package/dist/activity-tracker.d.ts +13 -0
- package/dist/activity-tracker.d.ts.map +1 -0
- package/dist/activity-tracker.js +19 -0
- package/dist/activity-tracker.js.map +1 -0
- package/dist/agent-state.d.ts +45 -0
- package/dist/agent-state.d.ts.map +1 -0
- package/dist/agent-state.js +61 -0
- package/dist/agent-state.js.map +1 -0
- package/dist/audit-hooks.d.ts +12 -0
- package/dist/audit-hooks.d.ts.map +1 -0
- package/dist/audit-hooks.js +45 -0
- package/dist/audit-hooks.js.map +1 -0
- package/dist/auto-update.d.ts +42 -0
- package/dist/auto-update.d.ts.map +1 -0
- package/dist/auto-update.js +96 -0
- package/dist/auto-update.js.map +1 -0
- package/dist/branch-status.d.ts +40 -0
- package/dist/branch-status.d.ts.map +1 -0
- package/dist/branch-status.js +107 -0
- package/dist/branch-status.js.map +1 -0
- package/dist/completion-detector.d.ts +87 -0
- package/dist/completion-detector.d.ts.map +1 -0
- package/dist/completion-detector.js +160 -0
- package/dist/completion-detector.js.map +1 -0
- package/dist/completion-handler.d.ts +48 -0
- package/dist/completion-handler.d.ts.map +1 -0
- package/dist/completion-handler.js +200 -0
- package/dist/completion-handler.js.map +1 -0
- package/dist/condition-evaluators.d.ts +31 -0
- package/dist/condition-evaluators.d.ts.map +1 -0
- package/dist/condition-evaluators.js +416 -0
- package/dist/condition-evaluators.js.map +1 -0
- package/dist/config.d.ts +55 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +311 -0
- package/dist/config.js.map +1 -0
- package/dist/control-state.d.ts +41 -0
- package/dist/control-state.d.ts.map +1 -0
- package/dist/control-state.js +204 -0
- package/dist/control-state.js.map +1 -0
- package/dist/crash-recovery-cleanup.d.ts +21 -0
- package/dist/crash-recovery-cleanup.d.ts.map +1 -0
- package/dist/crash-recovery-cleanup.js +198 -0
- package/dist/crash-recovery-cleanup.js.map +1 -0
- package/dist/crash-recovery-scan.d.ts +19 -0
- package/dist/crash-recovery-scan.d.ts.map +1 -0
- package/dist/crash-recovery-scan.js +145 -0
- package/dist/crash-recovery-scan.js.map +1 -0
- package/dist/crash-recovery-types.d.ts +54 -0
- package/dist/crash-recovery-types.d.ts.map +1 -0
- package/dist/crash-recovery-types.js +13 -0
- package/dist/crash-recovery-types.js.map +1 -0
- package/dist/crash-recovery.d.ts +88 -0
- package/dist/crash-recovery.d.ts.map +1 -0
- package/dist/crash-recovery.js +448 -0
- package/dist/crash-recovery.js.map +1 -0
- package/dist/daemon-logs.d.ts +19 -0
- package/dist/daemon-logs.d.ts.map +1 -0
- package/dist/daemon-logs.js +81 -0
- package/dist/daemon-logs.js.map +1 -0
- package/dist/daemon-process.d.ts +154 -0
- package/dist/daemon-process.d.ts.map +1 -0
- package/dist/daemon-process.js +427 -0
- package/dist/daemon-process.js.map +1 -0
- package/dist/dag-validator.d.ts +52 -0
- package/dist/dag-validator.d.ts.map +1 -0
- package/dist/dag-validator.js +199 -0
- package/dist/dag-validator.js.map +1 -0
- package/dist/delivery-guards.d.ts +41 -0
- package/dist/delivery-guards.d.ts.map +1 -0
- package/dist/delivery-guards.js +195 -0
- package/dist/delivery-guards.js.map +1 -0
- package/dist/delivery-lifecycle.d.ts +110 -0
- package/dist/delivery-lifecycle.d.ts.map +1 -0
- package/dist/delivery-lifecycle.js +353 -0
- package/dist/delivery-lifecycle.js.map +1 -0
- package/dist/delivery-merge.d.ts +17 -0
- package/dist/delivery-merge.d.ts.map +1 -0
- package/dist/delivery-merge.js +89 -0
- package/dist/delivery-merge.js.map +1 -0
- package/dist/dependency-resolver.d.ts +77 -0
- package/dist/dependency-resolver.d.ts.map +1 -0
- package/dist/dependency-resolver.js +337 -0
- package/dist/dependency-resolver.js.map +1 -0
- package/dist/evaluation-context.d.ts +49 -0
- package/dist/evaluation-context.d.ts.map +1 -0
- package/dist/evaluation-context.js +98 -0
- package/dist/evaluation-context.js.map +1 -0
- package/dist/git-activity.d.ts +24 -0
- package/dist/git-activity.d.ts.map +1 -0
- package/dist/git-activity.js +97 -0
- package/dist/git-activity.js.map +1 -0
- package/dist/git-branch.d.ts +33 -0
- package/dist/git-branch.d.ts.map +1 -0
- package/dist/git-branch.js +88 -0
- package/dist/git-branch.js.map +1 -0
- package/dist/git-integration.d.ts +27 -0
- package/dist/git-integration.d.ts.map +1 -0
- package/dist/git-integration.js +82 -0
- package/dist/git-integration.js.map +1 -0
- package/dist/git-merge-helpers.d.ts +48 -0
- package/dist/git-merge-helpers.d.ts.map +1 -0
- package/dist/git-merge-helpers.js +105 -0
- package/dist/git-merge-helpers.js.map +1 -0
- package/dist/git-merge-lock.d.ts +67 -0
- package/dist/git-merge-lock.d.ts.map +1 -0
- package/dist/git-merge-lock.js +157 -0
- package/dist/git-merge-lock.js.map +1 -0
- package/dist/git-merge-strategies.d.ts +39 -0
- package/dist/git-merge-strategies.d.ts.map +1 -0
- package/dist/git-merge-strategies.js +127 -0
- package/dist/git-merge-strategies.js.map +1 -0
- package/dist/git-merge.d.ts +80 -0
- package/dist/git-merge.d.ts.map +1 -0
- package/dist/git-merge.js +373 -0
- package/dist/git-merge.js.map +1 -0
- package/dist/git-state-detector.d.ts +24 -0
- package/dist/git-state-detector.d.ts.map +1 -0
- package/dist/git-state-detector.js +122 -0
- package/dist/git-state-detector.js.map +1 -0
- package/dist/git-types.d.ts +40 -0
- package/dist/git-types.d.ts.map +1 -0
- package/dist/git-types.js +23 -0
- package/dist/git-types.js.map +1 -0
- package/dist/git-utils.d.ts +28 -0
- package/dist/git-utils.d.ts.map +1 -0
- package/dist/git-utils.js +57 -0
- package/dist/git-utils.js.map +1 -0
- package/dist/git.d.ts +24 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +64 -0
- package/dist/git.js.map +1 -0
- package/dist/guard-engine.d.ts +19 -0
- package/dist/guard-engine.d.ts.map +1 -0
- package/dist/guard-engine.js +21 -0
- package/dist/guard-engine.js.map +1 -0
- package/dist/guard-evaluator.d.ts +47 -0
- package/dist/guard-evaluator.d.ts.map +1 -0
- package/dist/guard-evaluator.js +193 -0
- package/dist/guard-evaluator.js.map +1 -0
- package/dist/heartbeat.d.ts +73 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +306 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +493 -0
- package/dist/index.js.map +1 -0
- package/dist/listener-auto-advance.d.ts +29 -0
- package/dist/listener-auto-advance.d.ts.map +1 -0
- package/dist/listener-auto-advance.js +172 -0
- package/dist/listener-auto-advance.js.map +1 -0
- package/dist/listener-review.d.ts +37 -0
- package/dist/listener-review.d.ts.map +1 -0
- package/dist/listener-review.js +217 -0
- package/dist/listener-review.js.map +1 -0
- package/dist/listener.d.ts +57 -0
- package/dist/listener.d.ts.map +1 -0
- package/dist/listener.js +361 -0
- package/dist/listener.js.map +1 -0
- package/dist/log-manager.d.ts +18 -0
- package/dist/log-manager.d.ts.map +1 -0
- package/dist/log-manager.js +18 -0
- package/dist/log-manager.js.map +1 -0
- package/dist/otlp-log-parser.d.ts +21 -0
- package/dist/otlp-log-parser.d.ts.map +1 -0
- package/dist/otlp-log-parser.js +143 -0
- package/dist/otlp-log-parser.js.map +1 -0
- package/dist/otlp-metric-parser.d.ts +20 -0
- package/dist/otlp-metric-parser.d.ts.map +1 -0
- package/dist/otlp-metric-parser.js +113 -0
- package/dist/otlp-metric-parser.js.map +1 -0
- package/dist/otlp-port-manager.d.ts +26 -0
- package/dist/otlp-port-manager.d.ts.map +1 -0
- package/dist/otlp-port-manager.js +130 -0
- package/dist/otlp-port-manager.js.map +1 -0
- package/dist/otlp-receiver.d.ts +51 -0
- package/dist/otlp-receiver.d.ts.map +1 -0
- package/dist/otlp-receiver.js +663 -0
- package/dist/otlp-receiver.js.map +1 -0
- package/dist/otlp-types.d.ts +92 -0
- package/dist/otlp-types.d.ts.map +1 -0
- package/dist/otlp-types.js +133 -0
- package/dist/otlp-types.js.map +1 -0
- package/dist/output-monitor.d.ts +33 -0
- package/dist/output-monitor.d.ts.map +1 -0
- package/dist/output-monitor.js +67 -0
- package/dist/output-monitor.js.map +1 -0
- package/dist/planning-prompt-builder.d.ts +67 -0
- package/dist/planning-prompt-builder.d.ts.map +1 -0
- package/dist/planning-prompt-builder.js +515 -0
- package/dist/planning-prompt-builder.js.map +1 -0
- package/dist/prompt-builder.d.ts +14 -0
- package/dist/prompt-builder.d.ts.map +1 -0
- package/dist/prompt-builder.js +174 -0
- package/dist/prompt-builder.js.map +1 -0
- package/dist/qa-crash-recovery.d.ts +77 -0
- package/dist/qa-crash-recovery.d.ts.map +1 -0
- package/dist/qa-crash-recovery.js +243 -0
- package/dist/qa-crash-recovery.js.map +1 -0
- package/dist/qa-dev-server.d.ts +73 -0
- package/dist/qa-dev-server.d.ts.map +1 -0
- package/dist/qa-dev-server.js +279 -0
- package/dist/qa-dev-server.js.map +1 -0
- package/dist/qa-orchestrator.d.ts +79 -0
- package/dist/qa-orchestrator.d.ts.map +1 -0
- package/dist/qa-orchestrator.js +349 -0
- package/dist/qa-orchestrator.js.map +1 -0
- package/dist/qa-port-allocator.d.ts +34 -0
- package/dist/qa-port-allocator.d.ts.map +1 -0
- package/dist/qa-port-allocator.js +75 -0
- package/dist/qa-port-allocator.js.map +1 -0
- package/dist/qa-provisioner.d.ts +33 -0
- package/dist/qa-provisioner.d.ts.map +1 -0
- package/dist/qa-provisioner.js +141 -0
- package/dist/qa-provisioner.js.map +1 -0
- package/dist/qa-state.d.ts +93 -0
- package/dist/qa-state.d.ts.map +1 -0
- package/dist/qa-state.js +74 -0
- package/dist/qa-state.js.map +1 -0
- package/dist/queries/control-state.d.ts +25 -0
- package/dist/queries/control-state.d.ts.map +1 -0
- package/dist/queries/control-state.js +34 -0
- package/dist/queries/control-state.js.map +1 -0
- package/dist/queries/daemon-connection.d.ts +25 -0
- package/dist/queries/daemon-connection.d.ts.map +1 -0
- package/dist/queries/daemon-connection.js +28 -0
- package/dist/queries/daemon-connection.js.map +1 -0
- package/dist/queries/deliveries.d.ts +100 -0
- package/dist/queries/deliveries.d.ts.map +1 -0
- package/dist/queries/deliveries.js +184 -0
- package/dist/queries/deliveries.js.map +1 -0
- package/dist/queries/git-activity.d.ts +20 -0
- package/dist/queries/git-activity.d.ts.map +1 -0
- package/dist/queries/git-activity.js +22 -0
- package/dist/queries/git-activity.js.map +1 -0
- package/dist/queries/guards.d.ts +47 -0
- package/dist/queries/guards.d.ts.map +1 -0
- package/dist/queries/guards.js +138 -0
- package/dist/queries/guards.js.map +1 -0
- package/dist/queries/index.d.ts +19 -0
- package/dist/queries/index.d.ts.map +1 -0
- package/dist/queries/index.js +17 -0
- package/dist/queries/index.js.map +1 -0
- package/dist/queries/issues.d.ts +41 -0
- package/dist/queries/issues.d.ts.map +1 -0
- package/dist/queries/issues.js +67 -0
- package/dist/queries/issues.js.map +1 -0
- package/dist/queries/qa.d.ts +79 -0
- package/dist/queries/qa.d.ts.map +1 -0
- package/dist/queries/qa.js +85 -0
- package/dist/queries/qa.js.map +1 -0
- package/dist/queries/roles.d.ts +13 -0
- package/dist/queries/roles.d.ts.map +1 -0
- package/dist/queries/roles.js +39 -0
- package/dist/queries/roles.js.map +1 -0
- package/dist/queries/schemas.d.ts +777 -0
- package/dist/queries/schemas.d.ts.map +1 -0
- package/dist/queries/schemas.js +391 -0
- package/dist/queries/schemas.js.map +1 -0
- package/dist/queries/sessions.d.ts +64 -0
- package/dist/queries/sessions.d.ts.map +1 -0
- package/dist/queries/sessions.js +100 -0
- package/dist/queries/sessions.js.map +1 -0
- package/dist/queries/shared.d.ts +61 -0
- package/dist/queries/shared.d.ts.map +1 -0
- package/dist/queries/shared.js +187 -0
- package/dist/queries/shared.js.map +1 -0
- package/dist/queries/strategies.d.ts +69 -0
- package/dist/queries/strategies.d.ts.map +1 -0
- package/dist/queries/strategies.js +80 -0
- package/dist/queries/strategies.js.map +1 -0
- package/dist/queries/workflows.d.ts +17 -0
- package/dist/queries/workflows.d.ts.map +1 -0
- package/dist/queries/workflows.js +49 -0
- package/dist/queries/workflows.js.map +1 -0
- package/dist/queries/worktrees.d.ts +38 -0
- package/dist/queries/worktrees.d.ts.map +1 -0
- package/dist/queries/worktrees.js +37 -0
- package/dist/queries/worktrees.js.map +1 -0
- package/dist/self-update.d.ts +94 -0
- package/dist/self-update.d.ts.map +1 -0
- package/dist/self-update.js +438 -0
- package/dist/self-update.js.map +1 -0
- package/dist/session-lifecycle.d.ts +77 -0
- package/dist/session-lifecycle.d.ts.map +1 -0
- package/dist/session-lifecycle.js +379 -0
- package/dist/session-lifecycle.js.map +1 -0
- package/dist/shutdown-state.d.ts +17 -0
- package/dist/shutdown-state.d.ts.map +1 -0
- package/dist/shutdown-state.js +22 -0
- package/dist/shutdown-state.js.map +1 -0
- package/dist/spawn-cooldown.d.ts +14 -0
- package/dist/spawn-cooldown.d.ts.map +1 -0
- package/dist/spawn-cooldown.js +34 -0
- package/dist/spawn-cooldown.js.map +1 -0
- package/dist/spawn-environment.d.ts +35 -0
- package/dist/spawn-environment.d.ts.map +1 -0
- package/dist/spawn-environment.js +48 -0
- package/dist/spawn-environment.js.map +1 -0
- package/dist/spawner-liveness.d.ts +23 -0
- package/dist/spawner-liveness.d.ts.map +1 -0
- package/dist/spawner-liveness.js +99 -0
- package/dist/spawner-liveness.js.map +1 -0
- package/dist/spawner-resolution.d.ts +27 -0
- package/dist/spawner-resolution.d.ts.map +1 -0
- package/dist/spawner-resolution.js +99 -0
- package/dist/spawner-resolution.js.map +1 -0
- package/dist/spawner-timeout.d.ts +32 -0
- package/dist/spawner-timeout.d.ts.map +1 -0
- package/dist/spawner-timeout.js +124 -0
- package/dist/spawner-timeout.js.map +1 -0
- package/dist/spawner.d.ts +77 -0
- package/dist/spawner.d.ts.map +1 -0
- package/dist/spawner.js +734 -0
- package/dist/spawner.js.map +1 -0
- package/dist/strategy-completion.d.ts +110 -0
- package/dist/strategy-completion.d.ts.map +1 -0
- package/dist/strategy-completion.js +434 -0
- package/dist/strategy-completion.js.map +1 -0
- package/dist/strategy-engine.d.ts +47 -0
- package/dist/strategy-engine.d.ts.map +1 -0
- package/dist/strategy-engine.js +419 -0
- package/dist/strategy-engine.js.map +1 -0
- package/dist/strategy-executor.d.ts +93 -0
- package/dist/strategy-executor.d.ts.map +1 -0
- package/dist/strategy-executor.js +775 -0
- package/dist/strategy-executor.js.map +1 -0
- package/dist/strategy-lifecycle.d.ts +61 -0
- package/dist/strategy-lifecycle.d.ts.map +1 -0
- package/dist/strategy-lifecycle.js +516 -0
- package/dist/strategy-lifecycle.js.map +1 -0
- package/dist/strategy-merge.d.ts +72 -0
- package/dist/strategy-merge.d.ts.map +1 -0
- package/dist/strategy-merge.js +371 -0
- package/dist/strategy-merge.js.map +1 -0
- package/dist/strategy-prompt-builder.d.ts +62 -0
- package/dist/strategy-prompt-builder.d.ts.map +1 -0
- package/dist/strategy-prompt-builder.js +538 -0
- package/dist/strategy-prompt-builder.js.map +1 -0
- package/dist/strategy-provisioning.d.ts +16 -0
- package/dist/strategy-provisioning.d.ts.map +1 -0
- package/dist/strategy-provisioning.js +119 -0
- package/dist/strategy-provisioning.js.map +1 -0
- package/dist/strategy-team-state.d.ts +24 -0
- package/dist/strategy-team-state.d.ts.map +1 -0
- package/dist/strategy-team-state.js +43 -0
- package/dist/strategy-team-state.js.map +1 -0
- package/dist/strategy-teardown.d.ts +24 -0
- package/dist/strategy-teardown.d.ts.map +1 -0
- package/dist/strategy-teardown.js +158 -0
- package/dist/strategy-teardown.js.map +1 -0
- package/dist/strategy-worktree-state.d.ts +47 -0
- package/dist/strategy-worktree-state.d.ts.map +1 -0
- package/dist/strategy-worktree-state.js +104 -0
- package/dist/strategy-worktree-state.js.map +1 -0
- package/dist/supabase.d.ts +36 -0
- package/dist/supabase.d.ts.map +1 -0
- package/dist/supabase.js +50 -0
- package/dist/supabase.js.map +1 -0
- package/dist/task-converter.d.ts +61 -0
- package/dist/task-converter.d.ts.map +1 -0
- package/dist/task-converter.js +286 -0
- package/dist/task-converter.js.map +1 -0
- package/dist/task-dag-builder.d.ts +14 -0
- package/dist/task-dag-builder.d.ts.map +1 -0
- package/dist/task-dag-builder.js +17 -0
- package/dist/task-dag-builder.js.map +1 -0
- package/dist/team-prompt-base.d.ts +114 -0
- package/dist/team-prompt-base.d.ts.map +1 -0
- package/dist/team-prompt-base.js +531 -0
- package/dist/team-prompt-base.js.map +1 -0
- package/dist/team-prompt-variants.d.ts +27 -0
- package/dist/team-prompt-variants.d.ts.map +1 -0
- package/dist/team-prompt-variants.js +134 -0
- package/dist/team-prompt-variants.js.map +1 -0
- package/dist/team-spawner.d.ts +50 -0
- package/dist/team-spawner.d.ts.map +1 -0
- package/dist/team-spawner.js +410 -0
- package/dist/team-spawner.js.map +1 -0
- package/dist/telemetry-writer.d.ts +66 -0
- package/dist/telemetry-writer.d.ts.map +1 -0
- package/dist/telemetry-writer.js +96 -0
- package/dist/telemetry-writer.js.map +1 -0
- package/dist/trigger-executor.d.ts +56 -0
- package/dist/trigger-executor.d.ts.map +1 -0
- package/dist/trigger-executor.js +313 -0
- package/dist/trigger-executor.js.map +1 -0
- package/dist/types/config.d.ts +60 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/dag.d.ts +53 -0
- package/dist/types/dag.d.ts.map +1 -0
- package/dist/types/dag.js +5 -0
- package/dist/types/dag.js.map +1 -0
- package/dist/types/delivery.d.ts +71 -0
- package/dist/types/delivery.d.ts.map +1 -0
- package/dist/types/delivery.js +5 -0
- package/dist/types/delivery.js.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +15 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/issue.d.ts +22 -0
- package/dist/types/issue.d.ts.map +1 -0
- package/dist/types/issue.js +5 -0
- package/dist/types/issue.js.map +1 -0
- package/dist/types/merge.d.ts +28 -0
- package/dist/types/merge.d.ts.map +1 -0
- package/dist/types/merge.js +5 -0
- package/dist/types/merge.js.map +1 -0
- package/dist/types/session.d.ts +98 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +5 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/strategy.d.ts +175 -0
- package/dist/types/strategy.d.ts.map +1 -0
- package/dist/types/strategy.js +5 -0
- package/dist/types/strategy.js.map +1 -0
- package/dist/types/workflow.d.ts +34 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +9 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/unified-init.d.ts +16 -0
- package/dist/unified-init.d.ts.map +1 -0
- package/dist/unified-init.js +183 -0
- package/dist/unified-init.js.map +1 -0
- package/dist/unified-shell-config.d.ts +34 -0
- package/dist/unified-shell-config.d.ts.map +1 -0
- package/dist/unified-shell-config.js +238 -0
- package/dist/unified-shell-config.js.map +1 -0
- package/dist/unified-shell-status.d.ts +15 -0
- package/dist/unified-shell-status.d.ts.map +1 -0
- package/dist/unified-shell-status.js +100 -0
- package/dist/unified-shell-status.js.map +1 -0
- package/dist/unified-shell.d.ts +50 -0
- package/dist/unified-shell.d.ts.map +1 -0
- package/dist/unified-shell.js +682 -0
- package/dist/unified-shell.js.map +1 -0
- package/dist/version-check.d.ts +19 -0
- package/dist/version-check.d.ts.map +1 -0
- package/dist/version-check.js +67 -0
- package/dist/version-check.js.map +1 -0
- package/dist/workflow-engine.d.ts +95 -0
- package/dist/workflow-engine.d.ts.map +1 -0
- package/dist/workflow-engine.js +165 -0
- package/dist/workflow-engine.js.map +1 -0
- package/dist/worktree-merge.d.ts +23 -0
- package/dist/worktree-merge.d.ts.map +1 -0
- package/dist/worktree-merge.js +57 -0
- package/dist/worktree-merge.js.map +1 -0
- package/dist/worktree-safety.d.ts +48 -0
- package/dist/worktree-safety.d.ts.map +1 -0
- package/dist/worktree-safety.js +113 -0
- package/dist/worktree-safety.js.map +1 -0
- package/dist/worktree-strategy.d.ts +69 -0
- package/dist/worktree-strategy.d.ts.map +1 -0
- package/dist/worktree-strategy.js +214 -0
- package/dist/worktree-strategy.js.map +1 -0
- package/dist/worktree.d.ts +159 -0
- package/dist/worktree.d.ts.map +1 -0
- package/dist/worktree.js +512 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +76 -0
- package/scripts/telora-daemon-wrapper.sh +31 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types and dependency injection for crash recovery.
|
|
3
|
+
*/
|
|
4
|
+
import type { AgentSession } from './types.js';
|
|
5
|
+
export interface OrphanedWorktree {
|
|
6
|
+
/** Absolute path to the worktree directory. */
|
|
7
|
+
worktreePath: string;
|
|
8
|
+
/** Git branch name (e.g. agent/developer/my-delivery). */
|
|
9
|
+
branchName: string;
|
|
10
|
+
/** DB session that was still marked active, if any. */
|
|
11
|
+
session: AgentSession | null;
|
|
12
|
+
}
|
|
13
|
+
export interface CleanupAction {
|
|
14
|
+
worktreePath: string;
|
|
15
|
+
branchName: string;
|
|
16
|
+
action: 'removed' | 'preserved' | 'safety-committed' | 'safety-committed-and-removed';
|
|
17
|
+
/** Set when a safety commit was created. */
|
|
18
|
+
commitHash?: string;
|
|
19
|
+
/** Set when the orphan was preserved due to unmerged commits. */
|
|
20
|
+
unmergedCommitCount?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface RecoveryResult {
|
|
23
|
+
orphansDetected: number;
|
|
24
|
+
orphansCleaned: number;
|
|
25
|
+
orphansPreserved: number;
|
|
26
|
+
branchesPruned: number;
|
|
27
|
+
branchesPreserved: number;
|
|
28
|
+
actions: CleanupAction[];
|
|
29
|
+
errors: string[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Injectable dependencies for testing.
|
|
33
|
+
* Production code uses the defaults (real DB queries).
|
|
34
|
+
*/
|
|
35
|
+
export interface RecoveryDeps {
|
|
36
|
+
getActiveSessions: () => Promise<AgentSession[]>;
|
|
37
|
+
getActiveStrategies: (organizationId: string, productId?: string) => Promise<Array<{
|
|
38
|
+
strategy_id: string;
|
|
39
|
+
strategy_name: string;
|
|
40
|
+
assigned_agent_role_id: string | null;
|
|
41
|
+
}>>;
|
|
42
|
+
updateSession: (sessionId: string, updates: Record<string, unknown>) => Promise<unknown>;
|
|
43
|
+
createEscalation: (params: {
|
|
44
|
+
organizationId: string;
|
|
45
|
+
sessionId: string;
|
|
46
|
+
issueId: string | null;
|
|
47
|
+
reasonType: string;
|
|
48
|
+
description: string;
|
|
49
|
+
whatWasTried?: string;
|
|
50
|
+
helpNeeded?: string;
|
|
51
|
+
}) => Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
export declare const defaultDeps: RecoveryDeps;
|
|
54
|
+
//# sourceMappingURL=crash-recovery-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash-recovery-types.d.ts","sourceRoot":"","sources":["../src/crash-recovery-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,kBAAkB,GAAG,8BAA8B,CAAC;IACtF,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACjD,mBAAmB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC,CAAC;IAC3K,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzF,gBAAgB,EAAE,CAAC,MAAM,EAAE;QACzB,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAED,eAAO,MAAM,WAAW,EAAE,YAKzB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types and dependency injection for crash recovery.
|
|
3
|
+
*/
|
|
4
|
+
import { getActiveSessions, updateSession } from './queries/sessions.js';
|
|
5
|
+
import { createEscalation } from './queries/issues.js';
|
|
6
|
+
import { getActiveStrategies } from './queries/deliveries.js';
|
|
7
|
+
export const defaultDeps = {
|
|
8
|
+
getActiveSessions,
|
|
9
|
+
getActiveStrategies,
|
|
10
|
+
updateSession: (id, updates) => updateSession(id, updates),
|
|
11
|
+
createEscalation,
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=crash-recovery-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash-recovery-types.js","sourceRoot":"","sources":["../src/crash-recovery-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAoD9D,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,iBAAiB;IACjB,mBAAmB;IACnB,aAAa,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,OAA8C,CAAC;IACjG,gBAAgB;CACjB,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crash recovery: orphaned worktree cleanup and stale branch pruning.
|
|
3
|
+
*
|
|
4
|
+
* When the daemon crashes (SIGKILL, OOM, power loss), worktrees and branches
|
|
5
|
+
* persist on disk with no in-memory tracking. On restart this module scans
|
|
6
|
+
* the filesystem, reconciles against DB session state, and cleans up.
|
|
7
|
+
*
|
|
8
|
+
* Runs after initGit() and before startListeners() so the daemon starts clean.
|
|
9
|
+
*/
|
|
10
|
+
import type { DaemonConfig, AgentSession } from './types.js';
|
|
11
|
+
export interface OrphanedWorktree {
|
|
12
|
+
/** Absolute path to the worktree directory. */
|
|
13
|
+
worktreePath: string;
|
|
14
|
+
/** Git branch name (e.g. agent/developer/my-delivery). */
|
|
15
|
+
branchName: string;
|
|
16
|
+
/** DB session that was still marked active, if any. */
|
|
17
|
+
session: AgentSession | null;
|
|
18
|
+
}
|
|
19
|
+
export interface CleanupAction {
|
|
20
|
+
worktreePath: string;
|
|
21
|
+
branchName: string;
|
|
22
|
+
action: 'removed' | 'preserved' | 'safety-committed' | 'safety-committed-and-removed';
|
|
23
|
+
/** Set when a safety commit was created. */
|
|
24
|
+
commitHash?: string;
|
|
25
|
+
/** Set when the orphan was preserved due to unmerged commits. */
|
|
26
|
+
unmergedCommitCount?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface RecoveryResult {
|
|
29
|
+
orphansDetected: number;
|
|
30
|
+
orphansCleaned: number;
|
|
31
|
+
orphansPreserved: number;
|
|
32
|
+
branchesPruned: number;
|
|
33
|
+
branchesPreserved: number;
|
|
34
|
+
actions: CleanupAction[];
|
|
35
|
+
errors: string[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Injectable dependencies for testing.
|
|
39
|
+
* Production code uses the defaults (real DB queries).
|
|
40
|
+
*/
|
|
41
|
+
export interface RecoveryDeps {
|
|
42
|
+
getActiveSessions: () => Promise<AgentSession[]>;
|
|
43
|
+
getActiveStrategies: (organizationId: string, productId?: string) => Promise<Array<{
|
|
44
|
+
strategy_id: string;
|
|
45
|
+
strategy_name: string;
|
|
46
|
+
assigned_agent_role_id: string | null;
|
|
47
|
+
}>>;
|
|
48
|
+
updateSession: (sessionId: string, updates: Record<string, unknown>) => Promise<unknown>;
|
|
49
|
+
createEscalation: (params: {
|
|
50
|
+
organizationId: string;
|
|
51
|
+
sessionId: string;
|
|
52
|
+
issueId: string | null;
|
|
53
|
+
reasonType: string;
|
|
54
|
+
description: string;
|
|
55
|
+
whatWasTried?: string;
|
|
56
|
+
helpNeeded?: string;
|
|
57
|
+
}) => Promise<void>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Parse `git worktree list --porcelain` to build a map of
|
|
61
|
+
* worktree path -> branch name for all registered worktrees.
|
|
62
|
+
*/
|
|
63
|
+
export declare function parseWorktreeList(repoPath: string): Map<string, string>;
|
|
64
|
+
/**
|
|
65
|
+
* Scan the worktree directory and reconcile against active DB sessions
|
|
66
|
+
* to classify each worktree as active or orphaned.
|
|
67
|
+
*/
|
|
68
|
+
export declare function detectOrphanedWorktrees(config: DaemonConfig, deps?: RecoveryDeps): Promise<OrphanedWorktree[]>;
|
|
69
|
+
/**
|
|
70
|
+
* Clean up all orphaned worktrees. Returns actions taken and
|
|
71
|
+
* any preserved orphans that need escalation.
|
|
72
|
+
*/
|
|
73
|
+
export declare function cleanupOrphanedWorktrees(orphans: OrphanedWorktree[], config: DaemonConfig, deps?: RecoveryDeps): Promise<CleanupAction[]>;
|
|
74
|
+
/**
|
|
75
|
+
* Prune stale agent branches that have no worktree and no unmerged commits.
|
|
76
|
+
*/
|
|
77
|
+
export declare function pruneStaleAgentBranches(config: DaemonConfig): {
|
|
78
|
+
pruned: string[];
|
|
79
|
+
preserved: string[];
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Run full crash recovery: detect orphans, clean up, prune branches.
|
|
83
|
+
*
|
|
84
|
+
* Safe to call multiple times — idempotent by design. A second run
|
|
85
|
+
* with no new crashes finds nothing to clean.
|
|
86
|
+
*/
|
|
87
|
+
export declare function recoverFromCrash(config: DaemonConfig, deps?: RecoveryDeps): Promise<RecoveryResult>;
|
|
88
|
+
//# sourceMappingURL=crash-recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash-recovery.d.ts","sourceRoot":"","sources":["../src/crash-recovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAe7D,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,kBAAkB,GAAG,8BAA8B,CAAC;IACtF,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACjD,mBAAmB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC,CAAC;IAC3K,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzF,gBAAgB,EAAE,CAAC,MAAM,EAAE;QACzB,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAsBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBvE;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,YAA0B,GAC/B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA+G7B;AA+FD;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,gBAAgB,EAAE,EAC3B,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,YAA0B,GAC/B,OAAO,CAAC,aAAa,EAAE,CAAC,CAoE1B;AAgBD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,GACnB;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAwC3C;AAID;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,YAA0B,GAC/B,OAAO,CAAC,cAAc,CAAC,CAuHzB"}
|
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crash recovery: orphaned worktree cleanup and stale branch pruning.
|
|
3
|
+
*
|
|
4
|
+
* When the daemon crashes (SIGKILL, OOM, power loss), worktrees and branches
|
|
5
|
+
* persist on disk with no in-memory tracking. On restart this module scans
|
|
6
|
+
* the filesystem, reconciles against DB session state, and cleans up.
|
|
7
|
+
*
|
|
8
|
+
* Runs after initGit() and before startListeners() so the daemon starts clean.
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
11
|
+
import { join, resolve } from 'node:path';
|
|
12
|
+
import { runGitSync } from './git.js';
|
|
13
|
+
import { worktreeHasUncommittedChanges, branchHasUnmergedCommits, safetyCommitWorktree, removeWorktree, } from './worktree.js';
|
|
14
|
+
import { getActiveSessions, updateSession } from './queries/sessions.js';
|
|
15
|
+
import { createEscalation } from './queries/issues.js';
|
|
16
|
+
import { getActiveStrategies } from './queries/deliveries.js';
|
|
17
|
+
import { ESCALATION_REASONS } from '@telora/daemon-core';
|
|
18
|
+
const defaultDeps = {
|
|
19
|
+
getActiveSessions,
|
|
20
|
+
getActiveStrategies,
|
|
21
|
+
updateSession: (id, updates) => updateSession(id, updates),
|
|
22
|
+
createEscalation,
|
|
23
|
+
};
|
|
24
|
+
// ── Helpers ──────────────────────────────────────────────────────
|
|
25
|
+
/**
|
|
26
|
+
* Extract the strategy ID prefix (last 8 hex chars) from a worktree directory name.
|
|
27
|
+
* Strategy worktree directories follow: agent-{role}-{name}-{8-char-id}
|
|
28
|
+
*/
|
|
29
|
+
function extractStrategyIdPrefix(dirName) {
|
|
30
|
+
const match = dirName.match(/-([0-9a-f]{8})$/);
|
|
31
|
+
return match ? match[1] : null;
|
|
32
|
+
}
|
|
33
|
+
// ── Worktree scanning ────────────────────────────────────────────
|
|
34
|
+
/**
|
|
35
|
+
* Parse `git worktree list --porcelain` to build a map of
|
|
36
|
+
* worktree path -> branch name for all registered worktrees.
|
|
37
|
+
*/
|
|
38
|
+
export function parseWorktreeList(repoPath) {
|
|
39
|
+
const result = runGitSync(['worktree', 'list', '--porcelain'], repoPath);
|
|
40
|
+
const map = new Map();
|
|
41
|
+
if (!result.success)
|
|
42
|
+
return map;
|
|
43
|
+
let currentPath = null;
|
|
44
|
+
for (const line of result.output.split('\n')) {
|
|
45
|
+
if (line.startsWith('worktree ')) {
|
|
46
|
+
currentPath = line.slice('worktree '.length);
|
|
47
|
+
}
|
|
48
|
+
else if (line.startsWith('branch refs/heads/') && currentPath) {
|
|
49
|
+
map.set(currentPath, line.slice('branch refs/heads/'.length));
|
|
50
|
+
currentPath = null;
|
|
51
|
+
}
|
|
52
|
+
else if (line === '') {
|
|
53
|
+
currentPath = null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return map;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Scan the worktree directory and reconcile against active DB sessions
|
|
60
|
+
* to classify each worktree as active or orphaned.
|
|
61
|
+
*/
|
|
62
|
+
export async function detectOrphanedWorktrees(config, deps = defaultDeps) {
|
|
63
|
+
const { worktreeDir, repoPath } = config;
|
|
64
|
+
// 1. Read all subdirectories in worktreeDir
|
|
65
|
+
if (!existsSync(worktreeDir))
|
|
66
|
+
return [];
|
|
67
|
+
const entries = readdirSync(worktreeDir);
|
|
68
|
+
const subdirs = entries.filter((entry) => {
|
|
69
|
+
const fullPath = join(worktreeDir, entry);
|
|
70
|
+
try {
|
|
71
|
+
return statSync(fullPath).isDirectory();
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
console.debug(`[crash-recovery] Failed to stat ${fullPath} (may have been deleted):`, e.message);
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
if (subdirs.length === 0)
|
|
79
|
+
return [];
|
|
80
|
+
// 2. Parse git worktree list to map paths -> branch names
|
|
81
|
+
const worktreeMap = parseWorktreeList(repoPath);
|
|
82
|
+
// Build a reverse lookup: resolve worktree paths so we can match
|
|
83
|
+
const pathToBranch = new Map();
|
|
84
|
+
for (const [wtPath, branch] of worktreeMap) {
|
|
85
|
+
pathToBranch.set(resolve(wtPath), branch);
|
|
86
|
+
}
|
|
87
|
+
// 3. Query active sessions from DB
|
|
88
|
+
let activeSessions = [];
|
|
89
|
+
try {
|
|
90
|
+
activeSessions = await deps.getActiveSessions();
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
console.warn(`[crash-recovery] Failed to query active sessions from DB: ${err instanceof Error ? err.message : String(err)}. ` +
|
|
94
|
+
`Treating all worktrees as orphaned.`);
|
|
95
|
+
}
|
|
96
|
+
// Build set of branch names with active sessions
|
|
97
|
+
const activeBranches = new Set(activeSessions.map((s) => s.branch_name));
|
|
98
|
+
// Build map of branch -> session for linking
|
|
99
|
+
const branchToSession = new Map();
|
|
100
|
+
for (const session of activeSessions) {
|
|
101
|
+
branchToSession.set(session.branch_name, session);
|
|
102
|
+
}
|
|
103
|
+
// 3b. Query active strategies to preserve persistent worktrees
|
|
104
|
+
const activeStrategyIdPrefixes = new Set();
|
|
105
|
+
try {
|
|
106
|
+
const activeStrategies = await deps.getActiveStrategies(config.organizationId, config.productId);
|
|
107
|
+
for (const s of activeStrategies) {
|
|
108
|
+
activeStrategyIdPrefixes.add(s.strategy_id.slice(0, 8));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
console.warn(`[crash-recovery] Failed to query active strategies: ${err instanceof Error ? err.message : String(err)}. ` +
|
|
113
|
+
`Persistent strategy worktrees may be incorrectly classified as orphaned.`);
|
|
114
|
+
}
|
|
115
|
+
// 4. Classify each worktree subdirectory
|
|
116
|
+
const orphans = [];
|
|
117
|
+
for (const subdir of subdirs) {
|
|
118
|
+
const fullPath = resolve(join(worktreeDir, subdir));
|
|
119
|
+
const branchName = pathToBranch.get(fullPath);
|
|
120
|
+
if (!branchName) {
|
|
121
|
+
// Directory exists but no git worktree entry — likely a stale directory.
|
|
122
|
+
// Check if it belongs to an active strategy before classifying as orphan.
|
|
123
|
+
const idPrefix = extractStrategyIdPrefix(subdir);
|
|
124
|
+
if (idPrefix && activeStrategyIdPrefixes.has(idPrefix)) {
|
|
125
|
+
console.log(`[crash-recovery] Worktree belongs to active strategy (persistent, no git entry): ${fullPath}`);
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
// Try to infer branch from directory name (agent-role-delivery pattern).
|
|
129
|
+
console.log(`[crash-recovery] Worktree directory has no git entry: ${fullPath}`);
|
|
130
|
+
orphans.push({
|
|
131
|
+
worktreePath: fullPath,
|
|
132
|
+
branchName: subdir.replace(/-/g, '/').replace(/^agent\//, 'agent/'),
|
|
133
|
+
session: null,
|
|
134
|
+
});
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (activeBranches.has(branchName)) {
|
|
138
|
+
// Active session exists — leave alone
|
|
139
|
+
console.log(`[crash-recovery] Worktree is active (has DB session): ${fullPath} [${branchName}]`);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
// Check if this worktree belongs to an active strategy (persistent worktree)
|
|
143
|
+
const idPrefix = extractStrategyIdPrefix(subdir);
|
|
144
|
+
if (idPrefix && activeStrategyIdPrefixes.has(idPrefix)) {
|
|
145
|
+
console.log(`[crash-recovery] Worktree belongs to active strategy (persistent): ${fullPath} [${branchName}]`);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
// No active session and no active strategy — orphaned
|
|
149
|
+
const session = branchToSession.get(branchName) ?? null;
|
|
150
|
+
orphans.push({
|
|
151
|
+
worktreePath: fullPath,
|
|
152
|
+
branchName,
|
|
153
|
+
session,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
return orphans;
|
|
157
|
+
}
|
|
158
|
+
// ── Orphan cleanup ───────────────────────────────────────────────
|
|
159
|
+
/**
|
|
160
|
+
* Count unmerged commits on a branch relative to integration.
|
|
161
|
+
*/
|
|
162
|
+
function countUnmergedCommits(branchName, integrationBranch, repoPath) {
|
|
163
|
+
const result = runGitSync(['log', '--oneline', `${integrationBranch}..${branchName}`, '--'], repoPath);
|
|
164
|
+
if (!result.success)
|
|
165
|
+
return 0;
|
|
166
|
+
const lines = result.output.trim();
|
|
167
|
+
if (lines.length === 0)
|
|
168
|
+
return 0;
|
|
169
|
+
return lines.split('\n').length;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Process a single orphaned worktree: safety-commit if dirty,
|
|
173
|
+
* then remove if merged or preserve if unmerged.
|
|
174
|
+
*
|
|
175
|
+
* Returns the action taken.
|
|
176
|
+
*/
|
|
177
|
+
function cleanupSingleOrphan(orphan, config) {
|
|
178
|
+
const { worktreePath, branchName } = orphan;
|
|
179
|
+
const { repoPath, integrationBranch } = config;
|
|
180
|
+
let commitHash;
|
|
181
|
+
// Step 1: Safety-commit if dirty
|
|
182
|
+
if (existsSync(worktreePath) && worktreeHasUncommittedChanges(worktreePath)) {
|
|
183
|
+
const deliveryName = branchName.split('/').slice(2).join('/') || 'unknown';
|
|
184
|
+
console.log(`[crash-recovery] Safety-committing dirty worktree: ${worktreePath}`);
|
|
185
|
+
const hash = safetyCommitWorktree(worktreePath, deliveryName);
|
|
186
|
+
if (hash) {
|
|
187
|
+
commitHash = hash.trim();
|
|
188
|
+
console.log(`[crash-recovery] Safety commit created: ${commitHash.slice(0, 8)} on ${branchName}`);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
console.warn(`[crash-recovery] Safety commit failed for ${worktreePath}, preserving as-is`);
|
|
192
|
+
return {
|
|
193
|
+
worktreePath,
|
|
194
|
+
branchName,
|
|
195
|
+
action: 'preserved',
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Step 2: Check if branch is already merged to integration
|
|
200
|
+
const hasUnmerged = branchHasUnmergedCommits(branchName, integrationBranch, repoPath);
|
|
201
|
+
if (!hasUnmerged) {
|
|
202
|
+
// Fully merged — safe to remove
|
|
203
|
+
console.log(`[crash-recovery] Removing merged orphan: ${worktreePath} [${branchName}]`);
|
|
204
|
+
removeWorktree(repoPath, worktreePath, {
|
|
205
|
+
branchName,
|
|
206
|
+
integrationBranch,
|
|
207
|
+
mergeSucceeded: true,
|
|
208
|
+
});
|
|
209
|
+
// Also delete the branch since it's merged
|
|
210
|
+
const deleteResult = runGitSync(['branch', '-d', branchName], repoPath);
|
|
211
|
+
if (deleteResult.success) {
|
|
212
|
+
console.log(`[crash-recovery] Deleted merged branch: ${branchName}`);
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
worktreePath,
|
|
216
|
+
branchName,
|
|
217
|
+
action: commitHash ? 'safety-committed-and-removed' : 'removed',
|
|
218
|
+
commitHash,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
// Step 3: Unmerged commits — preserve
|
|
222
|
+
const unmergedCount = countUnmergedCommits(branchName, integrationBranch, repoPath);
|
|
223
|
+
console.log(`[crash-recovery] Preserving orphan with ${unmergedCount} unmerged commit(s): ${worktreePath} [${branchName}]`);
|
|
224
|
+
return {
|
|
225
|
+
worktreePath,
|
|
226
|
+
branchName,
|
|
227
|
+
action: commitHash ? 'safety-committed' : 'preserved',
|
|
228
|
+
commitHash,
|
|
229
|
+
unmergedCommitCount: unmergedCount,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Clean up all orphaned worktrees. Returns actions taken and
|
|
234
|
+
* any preserved orphans that need escalation.
|
|
235
|
+
*/
|
|
236
|
+
export async function cleanupOrphanedWorktrees(orphans, config, deps = defaultDeps) {
|
|
237
|
+
const actions = [];
|
|
238
|
+
// Mark orphaned sessions as failed in DB
|
|
239
|
+
for (const orphan of orphans) {
|
|
240
|
+
if (orphan.session) {
|
|
241
|
+
try {
|
|
242
|
+
await deps.updateSession(orphan.session.id, {
|
|
243
|
+
status: 'failed',
|
|
244
|
+
exit_reason: 'Daemon crash recovery: session was active when daemon restarted',
|
|
245
|
+
ended_at: new Date().toISOString(),
|
|
246
|
+
});
|
|
247
|
+
console.log(`[crash-recovery] Marked session ${orphan.session.id} as failed (crash recovery)`);
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
console.warn(`[crash-recovery] Failed to update session ${orphan.session.id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Process each orphan
|
|
255
|
+
for (const orphan of orphans) {
|
|
256
|
+
try {
|
|
257
|
+
const action = cleanupSingleOrphan(orphan, config);
|
|
258
|
+
actions.push(action);
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
console.error(`[crash-recovery] Error cleaning up orphan ${orphan.worktreePath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Escalate preserved orphans
|
|
265
|
+
const preserved = actions.filter((a) => a.action === 'preserved' || a.action === 'safety-committed');
|
|
266
|
+
if (preserved.length > 0) {
|
|
267
|
+
const lines = preserved.map((a) => `- ${a.branchName} (${a.worktreePath})` +
|
|
268
|
+
(a.unmergedCommitCount ? ` — ${a.unmergedCommitCount} unmerged commit(s)` : '') +
|
|
269
|
+
(a.commitHash ? ` — safety commit: ${a.commitHash.slice(0, 8)}` : ''));
|
|
270
|
+
const description = `Daemon crash recovery found ${preserved.length} orphaned worktree(s) with unmerged work:\n\n` +
|
|
271
|
+
lines.join('\n') +
|
|
272
|
+
'\n\nThese worktrees have been preserved for manual inspection.';
|
|
273
|
+
try {
|
|
274
|
+
await deps.createEscalation({
|
|
275
|
+
organizationId: config.organizationId,
|
|
276
|
+
sessionId: preserved[0].branchName, // No session available, use branch as context
|
|
277
|
+
issueId: null,
|
|
278
|
+
reasonType: ESCALATION_REASONS.NEEDS_CLARIFICATION,
|
|
279
|
+
description,
|
|
280
|
+
whatWasTried: 'Daemon crash recovery scanned for orphaned worktrees and preserved those with unmerged commits.',
|
|
281
|
+
helpNeeded: 'Inspect the preserved branches and either merge them to integration or delete them.',
|
|
282
|
+
});
|
|
283
|
+
console.log(`[crash-recovery] Created escalation for ${preserved.length} preserved orphan(s)`);
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
console.warn(`[crash-recovery] Failed to create escalation: ${err instanceof Error ? err.message : String(err)}`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return actions;
|
|
290
|
+
}
|
|
291
|
+
// ── Stale branch pruning ─────────────────────────────────────────
|
|
292
|
+
/**
|
|
293
|
+
* List all local branches matching the agent/* pattern.
|
|
294
|
+
*/
|
|
295
|
+
function listAgentBranches(repoPath) {
|
|
296
|
+
const result = runGitSync(['branch', '--list', 'agent/*'], repoPath);
|
|
297
|
+
if (!result.success)
|
|
298
|
+
return [];
|
|
299
|
+
return result.output
|
|
300
|
+
.split('\n')
|
|
301
|
+
.map((line) => line.replace(/^[*+]?\s+/, '').trim())
|
|
302
|
+
.filter(Boolean);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Prune stale agent branches that have no worktree and no unmerged commits.
|
|
306
|
+
*/
|
|
307
|
+
export function pruneStaleAgentBranches(config) {
|
|
308
|
+
const { repoPath, integrationBranch } = config;
|
|
309
|
+
const branches = listAgentBranches(repoPath);
|
|
310
|
+
const pruned = [];
|
|
311
|
+
const preserved = [];
|
|
312
|
+
if (branches.length === 0) {
|
|
313
|
+
console.log('[crash-recovery] No stale agent branches found');
|
|
314
|
+
return { pruned, preserved };
|
|
315
|
+
}
|
|
316
|
+
// Get set of branches that have active worktrees
|
|
317
|
+
const worktreeMap = parseWorktreeList(repoPath);
|
|
318
|
+
const worktreeBranches = new Set(worktreeMap.values());
|
|
319
|
+
for (const branch of branches) {
|
|
320
|
+
// Skip branches with active worktrees
|
|
321
|
+
if (worktreeBranches.has(branch))
|
|
322
|
+
continue;
|
|
323
|
+
// Check for unmerged commits
|
|
324
|
+
if (branchHasUnmergedCommits(branch, integrationBranch, repoPath)) {
|
|
325
|
+
console.log(`[crash-recovery] Preserving stale branch with unmerged commits: ${branch}`);
|
|
326
|
+
preserved.push(branch);
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
// Safe to delete
|
|
330
|
+
const deleteResult = runGitSync(['branch', '-D', branch], repoPath);
|
|
331
|
+
if (deleteResult.success) {
|
|
332
|
+
console.log(`[crash-recovery] Pruned stale branch: ${branch}`);
|
|
333
|
+
pruned.push(branch);
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
console.warn(`[crash-recovery] Failed to prune branch ${branch}: ${deleteResult.error}`);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
console.log(`[crash-recovery] Branch pruning: ${pruned.length} pruned, ${preserved.length} preserved with unmerged work`);
|
|
340
|
+
return { pruned, preserved };
|
|
341
|
+
}
|
|
342
|
+
// ── Main recovery orchestrator ───────────────────────────────────
|
|
343
|
+
/**
|
|
344
|
+
* Run full crash recovery: detect orphans, clean up, prune branches.
|
|
345
|
+
*
|
|
346
|
+
* Safe to call multiple times — idempotent by design. A second run
|
|
347
|
+
* with no new crashes finds nothing to clean.
|
|
348
|
+
*/
|
|
349
|
+
export async function recoverFromCrash(config, deps = defaultDeps) {
|
|
350
|
+
console.log('[crash-recovery] Starting crash recovery scan...');
|
|
351
|
+
const result = {
|
|
352
|
+
orphansDetected: 0,
|
|
353
|
+
orphansCleaned: 0,
|
|
354
|
+
orphansPreserved: 0,
|
|
355
|
+
branchesPruned: 0,
|
|
356
|
+
branchesPreserved: 0,
|
|
357
|
+
actions: [],
|
|
358
|
+
errors: [],
|
|
359
|
+
};
|
|
360
|
+
// Step 1: Detect orphaned worktrees
|
|
361
|
+
let orphans;
|
|
362
|
+
try {
|
|
363
|
+
orphans = await detectOrphanedWorktrees(config, deps);
|
|
364
|
+
result.orphansDetected = orphans.length;
|
|
365
|
+
}
|
|
366
|
+
catch (err) {
|
|
367
|
+
const msg = `Failed to detect orphaned worktrees: ${err instanceof Error ? err.message : String(err)}`;
|
|
368
|
+
console.error(`[crash-recovery] ${msg}`);
|
|
369
|
+
result.errors.push(msg);
|
|
370
|
+
orphans = [];
|
|
371
|
+
}
|
|
372
|
+
if (orphans.length === 0) {
|
|
373
|
+
console.log('[crash-recovery] No orphaned worktrees found');
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
console.log(`[crash-recovery] Found ${orphans.length} orphaned worktree(s)`);
|
|
377
|
+
}
|
|
378
|
+
// Step 2: Clean up orphans
|
|
379
|
+
if (orphans.length > 0) {
|
|
380
|
+
try {
|
|
381
|
+
const actions = await cleanupOrphanedWorktrees(orphans, config, deps);
|
|
382
|
+
result.actions = actions;
|
|
383
|
+
result.orphansCleaned = actions.filter((a) => a.action === 'removed' || a.action === 'safety-committed-and-removed').length;
|
|
384
|
+
result.orphansPreserved = actions.filter((a) => a.action === 'preserved' || a.action === 'safety-committed').length;
|
|
385
|
+
}
|
|
386
|
+
catch (err) {
|
|
387
|
+
const msg = `Failed during orphan cleanup: ${err instanceof Error ? err.message : String(err)}`;
|
|
388
|
+
console.error(`[crash-recovery] ${msg}`);
|
|
389
|
+
result.errors.push(msg);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// Step 3: Prune stale agent branches
|
|
393
|
+
try {
|
|
394
|
+
const { pruned, preserved } = pruneStaleAgentBranches(config);
|
|
395
|
+
result.branchesPruned = pruned.length;
|
|
396
|
+
result.branchesPreserved = preserved.length;
|
|
397
|
+
}
|
|
398
|
+
catch (err) {
|
|
399
|
+
const msg = `Failed during branch pruning: ${err instanceof Error ? err.message : String(err)}`;
|
|
400
|
+
console.error(`[crash-recovery] ${msg}`);
|
|
401
|
+
result.errors.push(msg);
|
|
402
|
+
}
|
|
403
|
+
// Step 4: Mark any remaining active sessions as failed (DB-driven reconciliation)
|
|
404
|
+
// This catches sessions not tied to any worktree (e.g., worktree already cleaned,
|
|
405
|
+
// never created, or on a different machine).
|
|
406
|
+
try {
|
|
407
|
+
const activeSessions = await deps.getActiveSessions();
|
|
408
|
+
// Filter out sessions already handled during worktree cleanup
|
|
409
|
+
const alreadyHandledSessionIds = new Set(orphans
|
|
410
|
+
.filter(o => o.session !== null)
|
|
411
|
+
.map(o => o.session.id));
|
|
412
|
+
const remainingSessions = activeSessions.filter(s => !alreadyHandledSessionIds.has(s.id));
|
|
413
|
+
if (remainingSessions.length > 0) {
|
|
414
|
+
console.log(`[crash-recovery] Found ${remainingSessions.length} orphaned session(s) without worktrees, marking as failed`);
|
|
415
|
+
const sessionResults = await Promise.allSettled(remainingSessions.map(session => deps.updateSession(session.id, {
|
|
416
|
+
status: 'failed',
|
|
417
|
+
exit_reason: 'Daemon crash recovery: session was active when daemon restarted',
|
|
418
|
+
ended_at: new Date().toISOString(),
|
|
419
|
+
})));
|
|
420
|
+
const succeeded = sessionResults.filter(r => r.status === 'fulfilled').length;
|
|
421
|
+
const failed = sessionResults.filter(r => r.status === 'rejected').length;
|
|
422
|
+
if (failed > 0) {
|
|
423
|
+
console.warn(`[crash-recovery] ${failed} session update(s) failed during DB reconciliation`);
|
|
424
|
+
}
|
|
425
|
+
console.log(`[crash-recovery] Marked ${succeeded} orphaned session(s) as failed (DB reconciliation)`);
|
|
426
|
+
}
|
|
427
|
+
else if (activeSessions.length > 0) {
|
|
428
|
+
console.log(`[crash-recovery] All ${activeSessions.length} active session(s) were already handled during worktree cleanup`);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
catch (err) {
|
|
432
|
+
const msg = `Failed during DB session reconciliation: ${err instanceof Error ? err.message : String(err)}`;
|
|
433
|
+
console.error(`[crash-recovery] ${msg}`);
|
|
434
|
+
result.errors.push(msg);
|
|
435
|
+
}
|
|
436
|
+
// Summary
|
|
437
|
+
console.log(`[crash-recovery] Recovery complete: ` +
|
|
438
|
+
`${result.orphansDetected} orphan(s) detected, ` +
|
|
439
|
+
`${result.orphansCleaned} cleaned, ` +
|
|
440
|
+
`${result.orphansPreserved} preserved, ` +
|
|
441
|
+
`${result.branchesPruned} branch(es) pruned, ` +
|
|
442
|
+
`${result.branchesPreserved} branch(es) preserved`);
|
|
443
|
+
if (result.errors.length > 0) {
|
|
444
|
+
console.warn(`[crash-recovery] ${result.errors.length} error(s) during recovery (non-fatal)`);
|
|
445
|
+
}
|
|
446
|
+
return result;
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=crash-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash-recovery.js","sourceRoot":"","sources":["../src/crash-recovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,EACxB,oBAAoB,EACpB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAoDzD,MAAM,WAAW,GAAiB;IAChC,iBAAiB;IACjB,mBAAmB;IACnB,aAAa,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,OAA8C,CAAC;IACjG,gBAAgB;CACjB,CAAC;AAEF,oEAAoE;AAEpE;;;GAGG;AACH,SAAS,uBAAuB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,oEAAoE;AAEpE;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,GAAG,CAAC;IAEhC,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,WAAW,EAAE,CAAC;YAChE,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9D,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YACvB,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAoB,EACpB,OAAqB,WAAW;IAEhC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAEzC,4CAA4C;IAC5C,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,mCAAmC,QAAQ,2BAA2B,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;YAC5G,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,0DAA0D;IAC1D,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAEhD,iEAAiE;IACjE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC3C,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,mCAAmC;IACnC,IAAI,cAAc,GAAmB,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,cAAc,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,6DAA6D,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI;YACjH,qCAAqC,CACtC,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CACzC,CAAC;IAEF,6CAA6C;IAC7C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAwB,CAAC;IACxD,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,+DAA+D;IAC/D,MAAM,wBAAwB,GAAG,IAAI,GAAG,EAAU,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACjG,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;YACjC,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,uDAAuD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI;YAC3G,0EAA0E,CAC3E,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE9C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,yEAAyE;YACzE,0EAA0E;YAC1E,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,QAAQ,IAAI,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,oFAAoF,QAAQ,EAAE,CAAC,CAAC;gBAC5G,SAAS;YACX,CAAC;YACD,yEAAyE;YACzE,OAAO,CAAC,GAAG,CAAC,yDAAyD,QAAQ,EAAE,CAAC,CAAC;YACjF,OAAO,CAAC,IAAI,CAAC;gBACX,YAAY,EAAE,QAAQ;gBACtB,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC;gBACnE,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,yDAAyD,QAAQ,KAAK,UAAU,GAAG,CAAC,CAAC;YACjG,SAAS;QACX,CAAC;QAED,6EAA6E;QAC7E,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,QAAQ,IAAI,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,sEAAsE,QAAQ,KAAK,UAAU,GAAG,CAAC,CAAC;YAC9G,SAAS;QACX,CAAC;QAED,sDAAsD;QACtD,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC;YACX,YAAY,EAAE,QAAQ;YACtB,UAAU;YACV,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,oEAAoE;AAEpE;;GAEG;AACH,SAAS,oBAAoB,CAC3B,UAAkB,EAClB,iBAAyB,EACzB,QAAgB;IAEhB,MAAM,MAAM,GAAG,UAAU,CACvB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,iBAAiB,KAAK,UAAU,EAAE,EAAE,IAAI,CAAC,EACjE,QAAQ,CACT,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAC1B,MAAwB,EACxB,MAAoB;IAEpB,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAC5C,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAAC;IAC/C,IAAI,UAA8B,CAAC;IAEnC,iCAAiC;IACjC,IAAI,UAAU,CAAC,YAAY,CAAC,IAAI,6BAA6B,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5E,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,sDAAsD,YAAY,EAAE,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,oBAAoB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAC9D,IAAI,IAAI,EAAE,CAAC;YACT,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,2CAA2C,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,UAAU,EAAE,CAAC,CAAC;QACpG,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,6CAA6C,YAAY,oBAAoB,CAAC,CAAC;YAC5F,OAAO;gBACL,YAAY;gBACZ,UAAU;gBACV,MAAM,EAAE,WAAW;aACpB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,MAAM,WAAW,GAAG,wBAAwB,CAAC,UAAU,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAEtF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,gCAAgC;QAChC,OAAO,CAAC,GAAG,CAAC,4CAA4C,YAAY,KAAK,UAAU,GAAG,CAAC,CAAC;QACxF,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE;YACrC,UAAU;YACV,iBAAiB;YACjB,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QAEH,2CAA2C;QAC3C,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;QACxE,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,OAAO;YACL,YAAY;YACZ,UAAU;YACV,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,SAAS;YAC/D,UAAU;SACX,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,MAAM,aAAa,GAAG,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CACT,2CAA2C,aAAa,wBAAwB,YAAY,KAAK,UAAU,GAAG,CAC/G,CAAC;IAEF,OAAO;QACL,YAAY;QACZ,UAAU;QACV,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAW;QACrD,UAAU;QACV,mBAAmB,EAAE,aAAa;KACnC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAA2B,EAC3B,MAAoB,EACpB,OAAqB,WAAW;IAEhC,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,yCAAyC;IACzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE;oBAC1C,MAAM,EAAE,QAAQ;oBAChB,WAAW,EAAE,iEAAiE;oBAC9E,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACnC,CAAC,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,mCAAmC,MAAM,CAAC,OAAO,CAAC,EAAE,6BAA6B,CAAC,CAAC;YACjG,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CACV,6CAA6C,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACtH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,6CAA6C,MAAM,CAAC,YAAY,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACxH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,MAAM,KAAK,kBAAkB,CACnE,CAAC;IACF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CACzB,CAAC,CAAC,EAAE,EAAE,CACJ,KAAK,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,YAAY,GAAG;YACvC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,mBAAmB,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACxE,CAAC;QACF,MAAM,WAAW,GACf,+BAA+B,SAAS,CAAC,MAAM,+CAA+C;YAC9F,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAChB,gEAAgE,CAAC;QAEnE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,gBAAgB,CAAC;gBAC1B,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,8CAA8C;gBAClF,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,kBAAkB,CAAC,mBAAmB;gBAClD,WAAW;gBACX,YAAY,EAAE,iGAAiG;gBAC/G,UAAU,EAAE,qFAAqF;aAClG,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,2CAA2C,SAAS,CAAC,MAAM,sBAAsB,CAAC,CAAC;QACjG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CACV,iDAAiD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACpG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,oEAAoE;AAEpE;;GAEG;AACH,SAAS,iBAAiB,CAAC,QAAgB;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAC/B,OAAO,MAAM,CAAC,MAAM;SACjB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SACnD,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAoB;IAEpB,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAAC;IAC/C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC9D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED,iDAAiD;IACjD,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAEvD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,sCAAsC;QACtC,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,SAAS;QAE3C,6BAA6B;QAC7B,IAAI,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,mEAAmE,MAAM,EAAE,CAAC,CAAC;YACzF,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QAED,iBAAiB;QACjB,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;QACpE,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,yCAAyC,MAAM,EAAE,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,2CAA2C,MAAM,KAAK,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CACT,oCAAoC,MAAM,CAAC,MAAM,YAAY,SAAS,CAAC,MAAM,+BAA+B,CAC7G,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC;AAED,oEAAoE;AAEpE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAoB,EACpB,OAAqB,WAAW;IAEhC,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAmB;QAC7B,eAAe,EAAE,CAAC;QAClB,cAAc,EAAE,CAAC;QACjB,gBAAgB,EAAE,CAAC;QACnB,cAAc,EAAE,CAAC;QACjB,iBAAiB,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,oCAAoC;IACpC,IAAI,OAA2B,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,wCAAwC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACvG,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,GAAG,EAAE,CAAC;IACf,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,CAAC,MAAM,uBAAuB,CAAC,CAAC;IAC/E,CAAC;IAED,2BAA2B;IAC3B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YACtE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;YACzB,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,MAAM,CACpC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,8BAA8B,CAC7E,CAAC,MAAM,CAAC;YACT,MAAM,CAAC,gBAAgB,GAAG,OAAO,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,MAAM,KAAK,kBAAkB,CACnE,CAAC,MAAM,CAAC;QACX,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAChG,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QACtC,MAAM,CAAC,iBAAiB,GAAG,SAAS,CAAC,MAAM,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAChG,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,kFAAkF;IAClF,kFAAkF;IAClF,6CAA6C;IAC7C,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEtD,8DAA8D;QAC9D,MAAM,wBAAwB,GAAG,IAAI,GAAG,CACtC,OAAO;aACJ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAQ,CAAC,EAAE,CAAC,CAC3B,CAAC;QACF,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAC7C,CAAC,CAAC,EAAE,CAAC,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACzC,CAAC;QAEF,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,0BAA0B,iBAAiB,CAAC,MAAM,2DAA2D,CAAC,CAAC;YAE3H,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,UAAU,CAC7C,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAC9B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE;gBAC7B,MAAM,EAAE,QAAQ;gBAChB,WAAW,EAAE,iEAAiE;gBAC9E,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACnC,CAAC,CACH,CACF,CAAC;YAEF,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;YAC9E,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;YAC1E,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,oBAAoB,MAAM,oDAAoD,CAAC,CAAC;YAC/F,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,2BAA2B,SAAS,oDAAoD,CAAC,CAAC;QACxG,CAAC;aAAM,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,wBAAwB,cAAc,CAAC,MAAM,iEAAiE,CAAC,CAAC;QAC9H,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,4CAA4C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3G,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,UAAU;IACV,OAAO,CAAC,GAAG,CACT,sCAAsC;QACtC,GAAG,MAAM,CAAC,eAAe,uBAAuB;QAChD,GAAG,MAAM,CAAC,cAAc,YAAY;QACpC,GAAG,MAAM,CAAC,gBAAgB,cAAc;QACxC,GAAG,MAAM,CAAC,cAAc,sBAAsB;QAC9C,GAAG,MAAM,CAAC,iBAAiB,uBAAuB,CACnD,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,MAAM,CAAC,MAAM,uCAAuC,CAAC,CAAC;IAChG,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|