harnery 0.36.0 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commander.d.ts +9 -0
- package/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +10 -1
- package/dist/commands/admission.d.ts +21 -0
- package/dist/commands/admission.d.ts.map +1 -0
- package/dist/commands/admission.js +565 -0
- package/dist/commands/agents.d.ts +7 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +148 -47
- package/dist/commands/artifacts.d.ts.map +1 -1
- package/dist/commands/artifacts.js +73 -2
- package/dist/commands/browse-ai.d.ts +2 -2
- package/dist/commands/browse-ai.d.ts.map +1 -1
- package/dist/commands/browse-ai.js +6 -4
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +360 -21
- package/dist/commands/diagnostics.d.ts +4 -0
- package/dist/commands/diagnostics.d.ts.map +1 -0
- package/dist/commands/diagnostics.js +229 -0
- package/dist/commands/fetch.js +1 -0
- package/dist/commands/files.d.ts +12 -0
- package/dist/commands/files.d.ts.map +1 -1
- package/dist/commands/files.js +54 -1
- package/dist/commands/governor.d.ts.map +1 -1
- package/dist/commands/governor.js +4 -0
- package/dist/commands/ledger-v3.d.ts.map +1 -1
- package/dist/commands/ledger-v3.js +71 -2
- package/dist/commands/qa-record.d.ts +144 -0
- package/dist/commands/qa-record.d.ts.map +1 -0
- package/dist/commands/qa-record.js +0 -0
- package/dist/commands/qa-run.d.ts +8 -0
- package/dist/commands/qa-run.d.ts.map +1 -0
- package/dist/commands/qa-run.js +396 -0
- package/dist/commands/qa-status.d.ts +71 -0
- package/dist/commands/qa-status.d.ts.map +1 -0
- package/dist/commands/qa-status.js +490 -0
- package/dist/commands/qa-verify.d.ts +40 -0
- package/dist/commands/qa-verify.d.ts.map +1 -0
- package/dist/commands/qa-verify.js +180 -0
- package/dist/commands/resources.d.ts +4 -0
- package/dist/commands/resources.d.ts.map +1 -0
- package/dist/commands/resources.js +29 -0
- package/dist/commands/review-pack.d.ts +4 -0
- package/dist/commands/review-pack.d.ts.map +1 -0
- package/dist/commands/review-pack.js +1001 -0
- package/dist/commands/supervisor.d.ts +4 -0
- package/dist/commands/supervisor.d.ts.map +1 -0
- package/dist/commands/supervisor.js +101 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +17 -0
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +4 -0
- package/dist/core/agents/cli.js +7 -3
- package/dist/core/agents/health.d.ts +17 -0
- package/dist/core/agents/health.d.ts.map +1 -0
- package/dist/core/agents/health.js +109 -0
- package/dist/core/agents/mailbox.d.ts +92 -0
- package/dist/core/agents/mailbox.d.ts.map +1 -0
- package/dist/core/agents/mailbox.js +325 -0
- package/dist/core/agents/qa-signal.d.ts +111 -0
- package/dist/core/agents/qa-signal.d.ts.map +1 -0
- package/dist/core/agents/qa-signal.js +231 -0
- package/dist/core/agents/reconcile-coordination-v3.d.ts +44 -0
- package/dist/core/agents/reconcile-coordination-v3.d.ts.map +1 -0
- package/dist/core/agents/reconcile-coordination-v3.js +58 -0
- package/dist/core/agents/render/prompt-context.d.ts +5 -0
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +34 -13
- package/dist/core/agents/render/session-context.d.ts +8 -0
- package/dist/core/agents/render/session-context.d.ts.map +1 -1
- package/dist/core/agents/render/session-context.js +34 -3
- package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/commit-conflict.js +50 -1
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +6 -10
- package/dist/core/agents/session-finalizer-v3.js +4 -1
- package/dist/core/agents/session-name-display.d.ts +20 -5
- package/dist/core/agents/session-name-display.d.ts.map +1 -1
- package/dist/core/agents/session-name-display.js +67 -7
- package/dist/core/agents/state/heartbeat-reader.d.ts +7 -0
- package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.d.ts +11 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +17 -0
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +1 -0
- package/dist/core/agents/state/live-coordination-writer.js +5 -0
- package/dist/core/artifacts/constants.d.ts +1 -1
- package/dist/core/artifacts/constants.js +1 -1
- package/dist/core/artifacts/index.d.ts +82 -6
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +410 -15
- package/dist/core/config.d.ts +20 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +59 -0
- package/dist/core/diagnostics/advice.d.ts +9 -0
- package/dist/core/diagnostics/advice.d.ts.map +1 -0
- package/dist/core/diagnostics/advice.js +112 -0
- package/dist/core/diagnostics/bundle.d.ts +51 -0
- package/dist/core/diagnostics/bundle.d.ts.map +1 -0
- package/dist/core/diagnostics/bundle.js +968 -0
- package/dist/core/diagnostics/comparison.d.ts +5 -0
- package/dist/core/diagnostics/comparison.d.ts.map +1 -0
- package/dist/core/diagnostics/comparison.js +444 -0
- package/dist/core/diagnostics/contract.d.ts +245 -0
- package/dist/core/diagnostics/contract.d.ts.map +1 -0
- package/dist/core/diagnostics/contract.js +18 -0
- package/dist/core/diagnostics/identity.d.ts +3 -0
- package/dist/core/diagnostics/identity.d.ts.map +1 -0
- package/dist/core/diagnostics/identity.js +10 -0
- package/dist/core/diagnostics/index.d.ts +8 -0
- package/dist/core/diagnostics/index.d.ts.map +1 -0
- package/dist/core/diagnostics/index.js +7 -0
- package/dist/core/diagnostics/replay.d.ts +8 -0
- package/dist/core/diagnostics/replay.d.ts.map +1 -0
- package/dist/core/diagnostics/replay.js +213 -0
- package/dist/core/diagnostics/sanitize.d.ts +9 -0
- package/dist/core/diagnostics/sanitize.d.ts.map +1 -0
- package/dist/core/diagnostics/sanitize.js +84 -0
- package/dist/core/events/legacy-storage/compression.d.ts +13 -0
- package/dist/core/events/legacy-storage/compression.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/compression.js +107 -0
- package/dist/core/events/legacy-storage/index.d.ts +1 -0
- package/dist/core/events/legacy-storage/index.d.ts.map +1 -1
- package/dist/core/events/legacy-storage/index.js +1 -0
- package/dist/core/events/v3/archive-retention.d.ts +33 -0
- package/dist/core/events/v3/archive-retention.d.ts.map +1 -0
- package/dist/core/events/v3/archive-retention.js +195 -0
- package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
- package/dist/core/events/v3/bootstrap.js +10 -0
- package/dist/core/events/v3/capabilities.d.ts +1 -1
- package/dist/core/events/v3/capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/capabilities.js +1 -0
- package/dist/core/events/v3/coordination-view.d.ts +3 -0
- package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
- package/dist/core/events/v3/coordination-view.js +69 -8
- package/dist/core/events/v3/index.d.ts +1 -0
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +1 -0
- package/dist/core/events/v3/live-routing.d.ts.map +1 -1
- package/dist/core/events/v3/live-routing.js +1 -0
- package/dist/core/events/v3/producers/hook-base.d.ts +1 -1
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook-base.js +13 -2
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
- package/dist/core/events/v3/producers/intake.js +10 -2
- package/dist/core/events/v3/producers/recorder.d.ts +39 -0
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +350 -17
- package/dist/core/hooks/adapter/output.d.ts +8 -0
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/output.js +11 -1
- package/dist/core/hooks/cli.js +303 -219
- package/dist/core/hooks/health.d.ts +59 -0
- package/dist/core/hooks/health.d.ts.map +1 -0
- package/dist/core/hooks/health.js +84 -0
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
- package/dist/core/hooks/resolve/transcript.js +10 -3
- package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
- package/dist/core/hooks/session-name-presence.js +4 -1
- package/dist/core/qa-artifacts.d.ts +20 -0
- package/dist/core/qa-artifacts.d.ts.map +1 -0
- package/dist/core/qa-artifacts.js +110 -0
- package/dist/core/resources/contract.d.ts +96 -0
- package/dist/core/resources/contract.d.ts.map +1 -0
- package/dist/core/resources/contract.js +2 -0
- package/dist/core/resources/index.d.ts +6 -0
- package/dist/core/resources/index.d.ts.map +1 -0
- package/dist/core/resources/index.js +5 -0
- package/dist/core/resources/sampler.d.ts +34 -0
- package/dist/core/resources/sampler.d.ts.map +1 -0
- package/dist/core/resources/sampler.js +458 -0
- package/dist/core/resources/service-status.d.ts +3 -0
- package/dist/core/resources/service-status.d.ts.map +1 -0
- package/dist/core/resources/service-status.js +48 -0
- package/dist/core/resources/service.d.ts +26 -0
- package/dist/core/resources/service.d.ts.map +1 -0
- package/dist/core/resources/service.js +292 -0
- package/dist/core/resources/storage.d.ts +13 -0
- package/dist/core/resources/storage.d.ts.map +1 -0
- package/dist/core/resources/storage.js +30 -0
- package/dist/core/storage/atomic-json.d.ts +3 -0
- package/dist/core/storage/atomic-json.d.ts.map +1 -0
- package/dist/core/storage/atomic-json.js +15 -0
- package/dist/core/storage/builtins.d.ts.map +1 -1
- package/dist/core/storage/builtins.js +45 -6
- package/dist/core/storage/logger.d.ts +2 -0
- package/dist/core/storage/logger.d.ts.map +1 -1
- package/dist/core/storage/logger.js +2 -0
- package/dist/core/storage/query.d.ts +14 -0
- package/dist/core/storage/query.d.ts.map +1 -1
- package/dist/core/storage/query.js +51 -0
- package/dist/core/supervisor/activity.d.ts +4 -0
- package/dist/core/supervisor/activity.d.ts.map +1 -0
- package/dist/core/supervisor/activity.js +141 -0
- package/dist/core/supervisor/contract.d.ts +268 -0
- package/dist/core/supervisor/contract.d.ts.map +1 -0
- package/dist/core/supervisor/contract.js +35 -0
- package/dist/core/supervisor/explanations.d.ts +4 -0
- package/dist/core/supervisor/explanations.d.ts.map +1 -0
- package/dist/core/supervisor/explanations.js +71 -0
- package/dist/core/supervisor/findings.d.ts +20 -0
- package/dist/core/supervisor/findings.d.ts.map +1 -0
- package/dist/core/supervisor/findings.js +399 -0
- package/dist/core/supervisor/history.d.ts +9 -0
- package/dist/core/supervisor/history.d.ts.map +1 -0
- package/dist/core/supervisor/history.js +46 -0
- package/dist/core/supervisor/hook-health-alerts.d.ts +14 -0
- package/dist/core/supervisor/hook-health-alerts.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health-alerts.js +70 -0
- package/dist/core/supervisor/hook-health-storage.d.ts +5 -0
- package/dist/core/supervisor/hook-health-storage.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health-storage.js +24 -0
- package/dist/core/supervisor/hook-health.d.ts +72 -0
- package/dist/core/supervisor/hook-health.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health.js +203 -0
- package/dist/core/supervisor/hooks.d.ts +10 -0
- package/dist/core/supervisor/hooks.d.ts.map +1 -0
- package/dist/core/supervisor/hooks.js +28 -0
- package/dist/core/supervisor/index.d.ts +15 -0
- package/dist/core/supervisor/index.d.ts.map +1 -0
- package/dist/core/supervisor/index.js +14 -0
- package/dist/core/supervisor/log-feed.d.ts +9 -0
- package/dist/core/supervisor/log-feed.d.ts.map +1 -0
- package/dist/core/supervisor/log-feed.js +103 -0
- package/dist/core/supervisor/service.d.ts +29 -0
- package/dist/core/supervisor/service.d.ts.map +1 -0
- package/dist/core/supervisor/service.js +450 -0
- package/dist/core/supervisor/services.d.ts +11 -0
- package/dist/core/supervisor/services.d.ts.map +1 -0
- package/dist/core/supervisor/services.js +155 -0
- package/dist/core/supervisor/status.d.ts +3 -0
- package/dist/core/supervisor/status.d.ts.map +1 -0
- package/dist/core/supervisor/status.js +48 -0
- package/dist/core/supervisor/storage.d.ts +30 -0
- package/dist/core/supervisor/storage.d.ts.map +1 -0
- package/dist/core/supervisor/storage.js +73 -0
- package/dist/core/supervisor/timeline.d.ts +3 -0
- package/dist/core/supervisor/timeline.d.ts.map +1 -0
- package/dist/core/supervisor/timeline.js +87 -0
- package/dist/core/workflow/admission.d.ts +23 -0
- package/dist/core/workflow/admission.d.ts.map +1 -0
- package/dist/core/workflow/admission.js +136 -0
- package/dist/core/workflow/engine.d.ts.map +1 -1
- package/dist/core/workflow/engine.js +77 -2
- package/dist/core/workflow/index.d.ts +3 -2
- package/dist/core/workflow/index.d.ts.map +1 -1
- package/dist/core/workflow/index.js +2 -1
- package/dist/core/workflow/proof.d.ts +2 -1
- package/dist/core/workflow/proof.d.ts.map +1 -1
- package/dist/core/workflow/proof.js +39 -1
- package/dist/core/workflow/run-state.d.ts +3 -2
- package/dist/core/workflow/run-state.d.ts.map +1 -1
- package/dist/core/workflow/run-state.js +8 -1
- package/dist/core/workflow/types.d.ts +33 -1
- package/dist/core/workflow/types.d.ts.map +1 -1
- package/dist/core/workflow/types.js +2 -1
- package/dist/lib/admission.d.ts +71 -0
- package/dist/lib/admission.d.ts.map +1 -0
- package/dist/lib/admission.js +264 -0
- package/dist/lib/agent-browser/client.d.ts +1 -1
- package/dist/lib/agent-browser/client.d.ts.map +1 -1
- package/dist/lib/agent-browser/client.js +1 -5
- package/dist/lib/browser/capture-fidelity.d.ts +39 -0
- package/dist/lib/browser/capture-fidelity.d.ts.map +1 -0
- package/dist/lib/browser/capture-fidelity.js +84 -0
- package/dist/lib/browser/client.d.ts +46 -1
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +168 -9
- package/dist/lib/browser/critique.d.ts +38 -1
- package/dist/lib/browser/critique.d.ts.map +1 -1
- package/dist/lib/browser/critique.js +34 -6
- package/dist/lib/browser/index.d.ts +5 -1
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +4 -0
- package/dist/lib/browser/page-review-judge.d.ts +64 -0
- package/dist/lib/browser/page-review-judge.d.ts.map +1 -0
- package/dist/lib/browser/page-review-judge.js +270 -0
- package/dist/lib/browser/page-review-pack.d.ts +613 -0
- package/dist/lib/browser/page-review-pack.d.ts.map +1 -0
- package/dist/lib/browser/page-review-pack.js +1751 -0
- package/dist/lib/browser/qa-run-contracts.d.ts +377 -0
- package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -0
- package/dist/lib/browser/qa-run-contracts.js +361 -0
- package/dist/lib/browser/qa-run.d.ts +141 -0
- package/dist/lib/browser/qa-run.d.ts.map +1 -0
- package/dist/lib/browser/qa-run.js +1283 -0
- package/dist/lib/browser/request-diagnostics.d.ts +13 -0
- package/dist/lib/browser/request-diagnostics.d.ts.map +1 -0
- package/dist/lib/browser/request-diagnostics.js +18 -0
- package/dist/lib/browser/tiling.d.ts +19 -0
- package/dist/lib/browser/tiling.d.ts.map +1 -1
- package/dist/lib/browser/tiling.js +28 -0
- package/dist/lib/cookies/client.d.ts +9 -0
- package/dist/lib/cookies/client.d.ts.map +1 -1
- package/dist/lib/cookies/client.js +197 -44
- package/dist/lib/cookies/extra.d.ts +18 -0
- package/dist/lib/cookies/extra.d.ts.map +1 -0
- package/dist/lib/cookies/extra.js +14 -0
- package/dist/lib/cookies/index.d.ts +2 -1
- package/dist/lib/cookies/index.d.ts.map +1 -1
- package/dist/lib/cookies/index.js +2 -1
- package/dist/lib/coord-root-id.d.ts +9 -0
- package/dist/lib/coord-root-id.d.ts.map +1 -0
- package/dist/lib/coord-root-id.js +17 -0
- package/dist/lib/durable-job.d.ts +124 -0
- package/dist/lib/durable-job.d.ts.map +1 -0
- package/dist/lib/durable-job.js +296 -0
- package/dist/lib/http/client.d.ts +7 -1
- package/dist/lib/http/client.d.ts.map +1 -1
- package/dist/lib/http/client.js +2 -0
- package/dist/lib/instructions/apply.d.ts +3 -1
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +74 -3
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +11 -2
- package/package.json +19 -2
- package/src/commander.ts +75 -1
- package/src/commands/admission.ts +699 -0
- package/src/commands/agents.ts +189 -50
- package/src/commands/artifacts.ts +132 -18
- package/src/commands/browse-ai.ts +10 -5
- package/src/commands/browse.ts +496 -20
- package/src/commands/diagnostics.ts +271 -0
- package/src/commands/fetch.ts +1 -0
- package/src/commands/files.ts +102 -2
- package/src/commands/governor.ts +8 -0
- package/src/commands/ledger-v3.ts +82 -0
- package/src/commands/qa-record.ts +682 -0
- package/src/commands/qa-run.ts +503 -0
- package/src/commands/qa-status.ts +608 -0
- package/src/commands/qa-verify.ts +238 -0
- package/src/commands/resources.ts +38 -0
- package/src/commands/review-pack.ts +1281 -0
- package/src/commands/supervisor.ts +141 -0
- package/src/commands/web.ts +19 -0
- package/src/commands/workflow.ts +8 -0
- package/src/core/agents/cli.ts +7 -3
- package/src/core/agents/health.ts +142 -0
- package/src/core/agents/mailbox.ts +373 -0
- package/src/core/agents/qa-signal.ts +261 -0
- package/src/core/agents/reconcile-coordination-v3.ts +77 -0
- package/src/core/agents/render/prompt-context.ts +42 -12
- package/src/core/agents/render/session-context.ts +37 -3
- package/src/core/agents/rules/commit-conflict.ts +58 -1
- package/src/core/agents/rules/stop-hook.ts +6 -12
- package/src/core/agents/session-finalizer-v3.ts +4 -1
- package/src/core/agents/session-name-display.ts +78 -7
- package/src/core/agents/state/heartbeat-reader.ts +7 -0
- package/src/core/agents/state/heartbeat-writer.ts +23 -0
- package/src/core/agents/state/live-coordination-view.ts +1 -0
- package/src/core/agents/state/live-coordination-writer.ts +5 -0
- package/src/core/artifacts/constants.ts +1 -1
- package/src/core/artifacts/index.ts +565 -30
- package/src/core/config.ts +134 -2
- package/src/core/diagnostics/advice.ts +147 -0
- package/src/core/diagnostics/bundle.ts +1250 -0
- package/src/core/diagnostics/comparison.ts +565 -0
- package/src/core/diagnostics/contract.ts +311 -0
- package/src/core/diagnostics/identity.ts +11 -0
- package/src/core/diagnostics/index.ts +7 -0
- package/src/core/diagnostics/replay.ts +314 -0
- package/src/core/diagnostics/sanitize.ts +97 -0
- package/src/core/events/legacy-storage/compression.ts +130 -0
- package/src/core/events/legacy-storage/index.ts +1 -0
- package/src/core/events/v3/archive-retention.ts +251 -0
- package/src/core/events/v3/bootstrap.ts +10 -0
- package/src/core/events/v3/capabilities.ts +2 -0
- package/src/core/events/v3/coordination-view.ts +100 -11
- package/src/core/events/v3/index.ts +9 -0
- package/src/core/events/v3/live-routing.ts +1 -0
- package/src/core/events/v3/producers/hook-base.ts +14 -2
- package/src/core/events/v3/producers/intake.ts +10 -2
- package/src/core/events/v3/producers/recorder.ts +420 -17
- package/src/core/hooks/adapter/output.ts +12 -1
- package/src/core/hooks/cli.ts +332 -247
- package/src/core/hooks/health.ts +146 -0
- package/src/core/hooks/resolve/transcript.ts +10 -3
- package/src/core/hooks/session-name-presence.ts +6 -1
- package/src/core/qa-artifacts.ts +126 -0
- package/src/core/resources/contract.ts +105 -0
- package/src/core/resources/index.ts +5 -0
- package/src/core/resources/sampler.ts +590 -0
- package/src/core/resources/service-status.ts +62 -0
- package/src/core/resources/service.ts +337 -0
- package/src/core/resources/storage.ts +44 -0
- package/src/core/storage/atomic-json.ts +15 -0
- package/src/core/storage/builtins.ts +62 -6
- package/src/core/storage/logger.ts +2 -0
- package/src/core/storage/query.ts +58 -0
- package/src/core/supervisor/activity.ts +193 -0
- package/src/core/supervisor/contract.ts +312 -0
- package/src/core/supervisor/explanations.ts +104 -0
- package/src/core/supervisor/findings.ts +788 -0
- package/src/core/supervisor/history.ts +61 -0
- package/src/core/supervisor/hook-health-alerts.ts +108 -0
- package/src/core/supervisor/hook-health-storage.ts +25 -0
- package/src/core/supervisor/hook-health.ts +301 -0
- package/src/core/supervisor/hooks.ts +35 -0
- package/src/core/supervisor/index.ts +14 -0
- package/src/core/supervisor/log-feed.ts +131 -0
- package/src/core/supervisor/service.ts +511 -0
- package/src/core/supervisor/services.ts +203 -0
- package/src/core/supervisor/status.ts +59 -0
- package/src/core/supervisor/storage.ts +126 -0
- package/src/core/supervisor/timeline.ts +133 -0
- package/src/core/workflow/admission.ts +215 -0
- package/src/core/workflow/engine.ts +93 -1
- package/src/core/workflow/index.ts +10 -0
- package/src/core/workflow/proof.ts +54 -1
- package/src/core/workflow/run-state.ts +13 -1
- package/src/core/workflow/types.ts +39 -1
- package/src/lib/admission.ts +347 -0
- package/src/lib/agent-browser/client.ts +2 -10
- package/src/lib/browser/capture-fidelity.ts +98 -0
- package/src/lib/browser/client.ts +212 -10
- package/src/lib/browser/critique.ts +62 -7
- package/src/lib/browser/index.ts +65 -0
- package/src/lib/browser/page-review-judge.ts +360 -0
- package/src/lib/browser/page-review-pack.ts +2384 -0
- package/src/lib/browser/qa-run-contracts.ts +743 -0
- package/src/lib/browser/qa-run.ts +1462 -0
- package/src/lib/browser/request-diagnostics.ts +27 -0
- package/src/lib/browser/tiling.ts +32 -0
- package/src/lib/cookies/client.ts +228 -42
- package/src/lib/cookies/extra.ts +28 -0
- package/src/lib/cookies/index.ts +2 -0
- package/src/lib/coord-root-id.ts +23 -0
- package/src/lib/durable-job.ts +407 -0
- package/src/lib/http/client.ts +13 -1
- package/src/lib/instructions/apply.ts +81 -2
- package/src/lib/instructions/templates.ts +11 -2
package/dist/core/config.js
CHANGED
|
@@ -473,6 +473,20 @@ export function eventLedgerRotateActiveBytes(coordRoot) {
|
|
|
473
473
|
const root = coordRoot ?? findCoordRoot();
|
|
474
474
|
return resolveEventLedgerRotateActiveBytesV3(root);
|
|
475
475
|
}
|
|
476
|
+
const DEFAULT_EVENT_ARCHIVE_MAX_BYTES = 1024 * 1024 * 1024;
|
|
477
|
+
const DEFAULT_EVENT_ARCHIVE_MAX_AGE_DAYS = 7;
|
|
478
|
+
const DEFAULT_EVENT_ARCHIVE_KEEP_MIN = 2;
|
|
479
|
+
/** Bounded retention for closed V3 epochs under `ledgers/v3-archives`. */
|
|
480
|
+
export function eventLedgerArchivePolicy(coordRoot) {
|
|
481
|
+
const root = coordRoot ?? findCoordRoot();
|
|
482
|
+
const configured = root ? readConfig(root).events : undefined;
|
|
483
|
+
return {
|
|
484
|
+
maxBytes: integerSetting(coordEnv("EVENT_V3_ARCHIVE_MAX_BYTES"), configured?.archive_max_bytes, 64 * 1024 * 1024, 1024 * 1024 * 1024 * 1024, DEFAULT_EVENT_ARCHIVE_MAX_BYTES),
|
|
485
|
+
maxAgeDays: integerSetting(coordEnv("EVENT_V3_ARCHIVE_MAX_AGE_DAYS"), configured?.archive_max_age_days, 1, 3650, DEFAULT_EVENT_ARCHIVE_MAX_AGE_DAYS),
|
|
486
|
+
keepMin: integerSetting(coordEnv("EVENT_V3_ARCHIVE_KEEP_MIN"), configured?.archive_keep_min, 1, 1000, DEFAULT_EVENT_ARCHIVE_KEEP_MIN),
|
|
487
|
+
autoClean: booleanSetting(coordEnv("EVENT_V3_ARCHIVE_AUTO_CLEAN"), configured?.archive_auto_clean, true),
|
|
488
|
+
};
|
|
489
|
+
}
|
|
476
490
|
function parseWebPort(value, source) {
|
|
477
491
|
const port = typeof value === "number" ? value : Number(value);
|
|
478
492
|
if (!Number.isInteger(port) || port < 1024 || port > 65535) {
|
|
@@ -540,6 +554,18 @@ export function artifactDefaultRetentionDays(coordRoot) {
|
|
|
540
554
|
? configured
|
|
541
555
|
: 3;
|
|
542
556
|
}
|
|
557
|
+
const DEFAULT_ARTIFACT_MAX_BYTES = 20 * 1024 * 1024 * 1024;
|
|
558
|
+
const DEFAULT_ARTIFACT_MAX_UNIT_BYTES = 1024 * 1024 * 1024;
|
|
559
|
+
/** Soft repository budget for managed working artifacts. */
|
|
560
|
+
export function artifactMaxBytes(coordRoot) {
|
|
561
|
+
const root = coordRoot ?? findCoordRoot();
|
|
562
|
+
return integerSetting(coordEnv("ARTIFACT_MAX_BYTES"), root ? readConfig(root).artifacts?.max_bytes : undefined, 64 * 1024 * 1024, 1024 * 1024 * 1024 * 1024, DEFAULT_ARTIFACT_MAX_BYTES);
|
|
563
|
+
}
|
|
564
|
+
/** Size at which one bundle requires an explicit `artifacts create --big` acknowledgement. */
|
|
565
|
+
export function artifactMaxUnitBytes(coordRoot) {
|
|
566
|
+
const root = coordRoot ?? findCoordRoot();
|
|
567
|
+
return integerSetting(coordEnv("ARTIFACT_MAX_UNIT_BYTES"), root ? readConfig(root).artifacts?.max_unit_bytes : undefined, 16 * 1024 * 1024, 1024 * 1024 * 1024 * 1024, DEFAULT_ARTIFACT_MAX_UNIT_BYTES);
|
|
568
|
+
}
|
|
543
569
|
/**
|
|
544
570
|
* Whether the daily SessionStart sweep of expired artifact workspaces runs.
|
|
545
571
|
* Precedence: `HARNERY_ARTIFACT_AUTO_CLEAN` (0/false disables) ->
|
|
@@ -556,6 +582,22 @@ export function artifactAutoCleanEnabled(coordRoot) {
|
|
|
556
582
|
return true;
|
|
557
583
|
return readConfig(root).artifacts?.auto_clean !== false;
|
|
558
584
|
}
|
|
585
|
+
/**
|
|
586
|
+
* Whether `qa-run` and `review-pack create` sweep expired page review packs
|
|
587
|
+
* out of the artifact store before starting. Precedence:
|
|
588
|
+
* `HARNERY_REVIEW_PACK_AUTO_CLEAN` (1/true enables, 0/false disables) ->
|
|
589
|
+
* `review_pack.auto_clean` -> disabled. The sweep deletes only packs whose
|
|
590
|
+
* manifest says `managed: true` with `retention.expires_at` in the past.
|
|
591
|
+
*/
|
|
592
|
+
export function reviewPackAutoCleanEnabled(coordRoot) {
|
|
593
|
+
const env = coordEnv("REVIEW_PACK_AUTO_CLEAN");
|
|
594
|
+
if (env !== undefined)
|
|
595
|
+
return env === "1" || env.toLowerCase() === "true";
|
|
596
|
+
const root = coordRoot ?? findCoordRoot();
|
|
597
|
+
if (!root)
|
|
598
|
+
return false;
|
|
599
|
+
return readConfig(root).review_pack?.auto_clean === true;
|
|
600
|
+
}
|
|
559
601
|
/**
|
|
560
602
|
* Sweep cadence in hours. Env-only (`HARNERY_ARTIFACT_AUTO_CLEAN_INTERVAL_HOURS`,
|
|
561
603
|
* mainly for tests): the cadence is an implementation detail, not policy, and
|
|
@@ -571,6 +613,23 @@ export function artifactAutoCleanIntervalHours() {
|
|
|
571
613
|
}
|
|
572
614
|
return 24;
|
|
573
615
|
}
|
|
616
|
+
function integerSetting(envValue, configured, minimum, maximum, fallback) {
|
|
617
|
+
for (const value of [envValue, configured]) {
|
|
618
|
+
const parsed = typeof value === "number" ? value : Number(value);
|
|
619
|
+
if (Number.isSafeInteger(parsed) && parsed >= minimum && parsed <= maximum)
|
|
620
|
+
return parsed;
|
|
621
|
+
}
|
|
622
|
+
return fallback;
|
|
623
|
+
}
|
|
624
|
+
function booleanSetting(envValue, configured, fallback) {
|
|
625
|
+
if (envValue !== undefined) {
|
|
626
|
+
if (envValue === "1" || envValue.toLowerCase() === "true")
|
|
627
|
+
return true;
|
|
628
|
+
if (envValue === "0" || envValue.toLowerCase() === "false")
|
|
629
|
+
return false;
|
|
630
|
+
}
|
|
631
|
+
return typeof configured === "boolean" ? configured : fallback;
|
|
632
|
+
}
|
|
574
633
|
/**
|
|
575
634
|
* `harn backup` (restic) defaults. Per field, precedence is env → config → built-in:
|
|
576
635
|
* repo: `HARNERY_RESTIC_REPO` → `backup.repo` → `~/.cache/harnery/restic-repo`
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SupervisorCapability, SupervisorFinding } from "../supervisor/contract.js";
|
|
2
|
+
import { type DiagnosticAdvice } from "./contract.js";
|
|
3
|
+
export interface BuildDiagnosticAdviceInput {
|
|
4
|
+
findings: readonly SupervisorFinding[];
|
|
5
|
+
sourceCapability: SupervisorCapability;
|
|
6
|
+
evaluatedAt: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function buildDiagnosticAdvice(input: BuildDiagnosticAdviceInput): DiagnosticAdvice;
|
|
9
|
+
//# sourceMappingURL=advice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advice.d.ts","sourceRoot":"","sources":["../../../src/core/diagnostics/advice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAGL,KAAK,gBAAgB,EAGtB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACvC,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC;CACrB;AAQD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,gBAAgB,CA4CzF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { DIAGNOSTIC_ADVICE_LIMITS, DIAGNOSTIC_ADVICE_SCHEMA_VERSION, } from "./contract.js";
|
|
2
|
+
const SEVERITY_RANK = {
|
|
3
|
+
info: 0,
|
|
4
|
+
warning: 1,
|
|
5
|
+
critical: 2,
|
|
6
|
+
};
|
|
7
|
+
export function buildDiagnosticAdvice(input) {
|
|
8
|
+
const sourceAvailable = input.sourceCapability.state === "supported";
|
|
9
|
+
const active = sourceAvailable
|
|
10
|
+
? input.findings.filter((finding) => finding.state === "opened").sort(compareFindings)
|
|
11
|
+
: [];
|
|
12
|
+
const pressureFindings = active.filter((finding) => finding.severity === "warning" || finding.severity === "critical");
|
|
13
|
+
const critical = pressureFindings.filter((finding) => finding.severity === "critical");
|
|
14
|
+
const warning = pressureFindings.filter((finding) => finding.severity === "warning");
|
|
15
|
+
const pressure = critical.length
|
|
16
|
+
? "critical"
|
|
17
|
+
: warning.length
|
|
18
|
+
? "elevated"
|
|
19
|
+
: sourceAvailable
|
|
20
|
+
? "normal"
|
|
21
|
+
: "unknown";
|
|
22
|
+
const fanOutRecommendation = pressure === "critical"
|
|
23
|
+
? "avoid-new-fan-out"
|
|
24
|
+
: pressure === "elevated"
|
|
25
|
+
? "use-caution"
|
|
26
|
+
: pressure === "normal"
|
|
27
|
+
? "proceed"
|
|
28
|
+
: "unknown";
|
|
29
|
+
const contributing = pressureFindings.slice(0, DIAGNOSTIC_ADVICE_LIMITS.max_contributing_findings);
|
|
30
|
+
return {
|
|
31
|
+
schema_version: DIAGNOSTIC_ADVICE_SCHEMA_VERSION,
|
|
32
|
+
evaluated_at: input.evaluatedAt,
|
|
33
|
+
pressure,
|
|
34
|
+
fan_out_recommendation: fanOutRecommendation,
|
|
35
|
+
observer_only: true,
|
|
36
|
+
summary: summaryFor(pressure),
|
|
37
|
+
source_capability: input.sourceCapability,
|
|
38
|
+
active_finding_count: active.length,
|
|
39
|
+
contributing_finding_count: pressureFindings.length,
|
|
40
|
+
omitted_contributing_finding_count: Math.max(0, pressureFindings.length - contributing.length),
|
|
41
|
+
contributing_findings: contributing.map(adviceFinding),
|
|
42
|
+
reasons: reasonsFor(critical, warning, input.sourceCapability),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function adviceFinding(finding) {
|
|
46
|
+
return {
|
|
47
|
+
finding_id: finding.id,
|
|
48
|
+
finding_kind: finding.finding_kind,
|
|
49
|
+
severity: finding.severity,
|
|
50
|
+
summary: finding.summary,
|
|
51
|
+
scope_kind: finding.scope_kind,
|
|
52
|
+
scope_id: finding.scope_id,
|
|
53
|
+
occurrence_count: finding.occurrence_count,
|
|
54
|
+
owner_kind: finding.attribution?.owner_kind,
|
|
55
|
+
owner_id: finding.attribution?.owner_id,
|
|
56
|
+
workload_relationship: finding.workload_context?.relationship,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function reasonsFor(critical, warning, capability) {
|
|
60
|
+
const reasons = [];
|
|
61
|
+
if (critical.length) {
|
|
62
|
+
reasons.push({
|
|
63
|
+
code: "critical_findings_active",
|
|
64
|
+
summary: `${critical.length} active critical finding${critical.length === 1 ? "" : "s"} ${critical.length === 1 ? "requires" : "require"} attention.`,
|
|
65
|
+
finding_ids: boundedIds(critical),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
if (warning.length) {
|
|
69
|
+
reasons.push({
|
|
70
|
+
code: "warning_findings_active",
|
|
71
|
+
summary: `${warning.length} active warning finding${warning.length === 1 ? "" : "s"} ${warning.length === 1 ? "indicates" : "indicate"} elevated pressure.`,
|
|
72
|
+
finding_ids: boundedIds(warning),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (capability.state !== "supported") {
|
|
76
|
+
reasons.push({
|
|
77
|
+
code: "findings_source_unavailable",
|
|
78
|
+
summary: `The findings source is ${capability.state}${capability.reason_code ? ` (${capability.reason_code})` : ""}.`,
|
|
79
|
+
finding_ids: [],
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (!critical.length && !warning.length && capability.state === "supported") {
|
|
83
|
+
reasons.push({
|
|
84
|
+
code: "no_active_pressure_findings",
|
|
85
|
+
summary: "No active warning or critical findings were observed.",
|
|
86
|
+
finding_ids: [],
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return reasons.slice(0, DIAGNOSTIC_ADVICE_LIMITS.max_reasons);
|
|
90
|
+
}
|
|
91
|
+
function boundedIds(findings) {
|
|
92
|
+
return findings
|
|
93
|
+
.slice(0, DIAGNOSTIC_ADVICE_LIMITS.max_contributing_findings)
|
|
94
|
+
.map((finding) => finding.id);
|
|
95
|
+
}
|
|
96
|
+
function summaryFor(pressure) {
|
|
97
|
+
switch (pressure) {
|
|
98
|
+
case "critical":
|
|
99
|
+
return "Critical local pressure is active. Avoid starting additional agent work until the findings change.";
|
|
100
|
+
case "elevated":
|
|
101
|
+
return "Elevated local pressure is active. Limit new fan-out and inspect the contributing findings.";
|
|
102
|
+
case "normal":
|
|
103
|
+
return "No active warning or critical findings were observed. Diagnostics do not restrict new fan-out.";
|
|
104
|
+
case "unknown":
|
|
105
|
+
return "Local pressure cannot be determined because the findings source is unavailable.";
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function compareFindings(left, right) {
|
|
109
|
+
return (SEVERITY_RANK[right.severity] - SEVERITY_RANK[left.severity] ||
|
|
110
|
+
right.observed_at.localeCompare(left.observed_at) ||
|
|
111
|
+
left.id.localeCompare(right.id));
|
|
112
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { ArtifactActor, ArtifactInventoryEntry } from "../artifacts/index.js";
|
|
2
|
+
import { type DiagnosticBundleManifest, type DiagnosticReplayResult, type DiagnosticSummary, type ValidatedDiagnosticBundle } from "./contract.js";
|
|
3
|
+
export interface CaptureDiagnosticBundleInput {
|
|
4
|
+
findingId?: string;
|
|
5
|
+
startAt?: string;
|
|
6
|
+
endAt?: string;
|
|
7
|
+
actor?: ArtifactActor;
|
|
8
|
+
retentionDays?: number;
|
|
9
|
+
now?: Date;
|
|
10
|
+
machineLabel?: string;
|
|
11
|
+
engineVersion?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface CapturedDiagnosticBundle {
|
|
14
|
+
path: string;
|
|
15
|
+
manifest: DiagnosticBundleManifest;
|
|
16
|
+
summary: DiagnosticSummary;
|
|
17
|
+
}
|
|
18
|
+
export interface DiagnosticBundleListRow {
|
|
19
|
+
artifact_id: string;
|
|
20
|
+
created_at: string;
|
|
21
|
+
expires_at: string | null;
|
|
22
|
+
classification: ArtifactInventoryEntry["classification"];
|
|
23
|
+
valid: boolean;
|
|
24
|
+
captured_at?: string;
|
|
25
|
+
finding_id?: string;
|
|
26
|
+
error?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface DiagnosticBundleCandidateRow {
|
|
29
|
+
artifact_id: string;
|
|
30
|
+
created_at: string;
|
|
31
|
+
expires_at: string | null;
|
|
32
|
+
classification: ArtifactInventoryEntry["classification"];
|
|
33
|
+
selectable: boolean;
|
|
34
|
+
captured_at?: string;
|
|
35
|
+
finding_id?: string;
|
|
36
|
+
error?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare function captureDiagnosticBundle(repoRootRaw: string, input?: CaptureDiagnosticBundleInput): CapturedDiagnosticBundle;
|
|
39
|
+
export declare function validateDiagnosticBundle(repoRootRaw: string, ref: string): ValidatedDiagnosticBundle;
|
|
40
|
+
/** Frozen web readers accept an opaque artifact id, never a filesystem path. */
|
|
41
|
+
export declare function readFrozenDiagnosticBundle(repoRoot: string, artifactId: string): ValidatedDiagnosticBundle;
|
|
42
|
+
export declare function showDiagnosticBundle(repoRoot: string, ref: string): ValidatedDiagnosticBundle;
|
|
43
|
+
export declare function listDiagnosticBundles(repoRoot: string): DiagnosticBundleListRow[];
|
|
44
|
+
/**
|
|
45
|
+
* Lists managed bundle candidates without opening their bounded payloads.
|
|
46
|
+
* Selection is not authority: every show, replay, and comparison operation
|
|
47
|
+
* still performs complete digest and schema validation before returning data.
|
|
48
|
+
*/
|
|
49
|
+
export declare function listDiagnosticBundleCandidates(repoRoot: string): DiagnosticBundleCandidateRow[];
|
|
50
|
+
export declare function replayDiagnosticBundle(repoRoot: string, ref: string, now?: Date): DiagnosticReplayResult;
|
|
51
|
+
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../../src/core/diagnostics/bundle.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,aAAa,EACb,sBAAsB,EAEvB,MAAM,uBAAuB,CAAC;AAwB/B,OAAO,EAUL,KAAK,wBAAwB,EAG7B,KAAK,sBAAsB,EAE3B,KAAK,iBAAiB,EAEtB,KAAK,yBAAyB,EAC/B,MAAM,eAAe,CAAC;AA0BvB,MAAM,WAAW,4BAA4B;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,wBAAwB,CAAC;IACnC,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;IACzD,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;IACzD,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,KAAK,GAAE,4BAAiC,GACvC,wBAAwB,CAqG1B;AAkCD,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,GACV,yBAAyB,CAsB3B;AAED,gFAAgF;AAChF,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,yBAAyB,CAK3B;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,yBAAyB,CAE7F;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,uBAAuB,EAAE,CA0BjF;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG,4BAA4B,EAAE,CA4C/F;AAqCD,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,GAAG,OAAa,GACf,sBAAsB,CAgBxB"}
|