blun-king-cli 9.1.587 → 9.1.588
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/CHANGELOG.md +11 -185
- package/LIESMICH.txt +51 -13
- package/README.md +44 -47
- package/agent-spine-plugin/.codex-plugin/plugin.json +16 -4
- package/agent-spine-plugin/CHANGELOG.md +37 -5
- package/agent-spine-plugin/README.md +3 -3
- package/agent-spine-plugin/blun.plugin.json +45 -10
- package/agent-spine-plugin/docs/artifact-evaluation.md +93 -0
- package/agent-spine-plugin/docs/host-integration.md +42 -27
- package/agent-spine-plugin/docs/preflight-recall.md +4 -2
- package/agent-spine-plugin/docs/session-timeline.md +97 -236
- package/agent-spine-plugin/docs/world-model.md +25 -0
- package/agent-spine-plugin/hooks/codex.json +1 -1
- package/agent-spine-plugin/hooks/hooks.json +1 -1
- package/agent-spine-plugin/package.json +1 -3
- package/agent-spine-plugin/scripts/check-hosts.js +3 -3
- package/agent-spine-plugin/scripts/release-check.js +10 -5
- package/agent-spine-plugin/scripts/run-checks.js +4 -1
- package/agent-spine-plugin/scripts/run-tests-hermetic.js +32 -6
- package/agent-spine-plugin/src/cli-learning.js +15 -0
- package/agent-spine-plugin/src/cli.js +2 -0
- package/agent-spine-plugin/src/hook.js +32 -32
- package/agent-spine-plugin/src/lib/action-lesson-recall.js +73 -8
- package/agent-spine-plugin/src/lib/briefing.js +146 -36
- package/agent-spine-plugin/src/lib/channel-continuity.js +19 -0
- package/agent-spine-plugin/src/lib/delivery-agent-usage.js +14 -7
- package/agent-spine-plugin/src/lib/gateway-group-response.js +128 -0
- package/agent-spine-plugin/src/lib/gateway-runs.js +24 -15
- package/agent-spine-plugin/src/lib/hook-briefing-use.js +13 -3
- package/agent-spine-plugin/src/lib/hook-context.js +16 -3
- package/agent-spine-plugin/src/lib/hook-output.js +129 -5
- package/agent-spine-plugin/src/lib/hook-timeline.js +5 -3
- package/agent-spine-plugin/src/lib/indexed-memory.js +2 -2
- package/agent-spine-plugin/src/lib/learning-artifact-evaluator.js +114 -0
- package/agent-spine-plugin/src/lib/learning-context.js +11 -4
- package/agent-spine-plugin/src/lib/learning-measurements.js +2 -2
- package/agent-spine-plugin/src/lib/mcp-runtime.js +89 -3
- package/agent-spine-plugin/src/lib/mcp-source-context.js +12 -2
- package/agent-spine-plugin/src/lib/mcp-timeline-tools.js +91 -8
- package/agent-spine-plugin/src/lib/mcp-world-tools.js +2 -2
- package/agent-spine-plugin/src/lib/owned-file-lock.js +20 -1
- package/agent-spine-plugin/src/lib/persona-runtime.js +2 -2
- package/agent-spine-plugin/src/lib/preflight-delivery-id.js +27 -0
- package/agent-spine-plugin/src/lib/preflight.js +4 -4
- package/agent-spine-plugin/src/lib/session-timeline-codex.js +15 -0
- package/agent-spine-plugin/src/lib/session-timeline-contract.js +12 -4
- package/agent-spine-plugin/src/lib/session-timeline-event-extract.js +36 -7
- package/agent-spine-plugin/src/lib/session-timeline-host-origin.js +13 -10
- package/agent-spine-plugin/src/lib/session-timeline-invocation.js +1 -1
- package/agent-spine-plugin/src/lib/session-timeline-king.js +14 -0
- package/agent-spine-plugin/src/lib/session-timeline-prior.js +18 -12
- package/agent-spine-plugin/src/lib/session-timeline-provider.js +5 -0
- package/agent-spine-plugin/src/lib/session-timeline-query.js +2 -0
- package/agent-spine-plugin/src/lib/session-timeline-results.js +35 -10
- package/agent-spine-plugin/src/lib/session-timeline-source-open.js +30 -0
- package/agent-spine-plugin/src/lib/session-timeline.js +122 -75
- package/agent-spine-plugin/src/lib/source-roots.js +3 -2
- package/agent-spine-plugin/src/lib/task-knowledge-context.js +22 -1
- package/agent-spine-plugin/src/lib/timeline-continuation-update.js +100 -0
- package/agent-spine-plugin/src/lib/timeline-tool-guard.js +30 -7
- package/agent-spine-plugin/src/lib/timeline-user-feedback.js +217 -0
- package/agent-spine-plugin/src/lib/timeline-world-capture.js +233 -0
- package/agent-spine-plugin/src/lib/world-knowledge.js +59 -2
- package/agent-spine-plugin/src/lib/world-model.js +64 -9
- package/agent-spine-plugin/src/worker.js +13 -1
- package/bin/blun.js +43 -28
- package/bin/core-bootstrap.js +5 -4
- package/bin/king.js +43 -28
- package/bin/launcher-mode.js +1 -10
- package/bin/launcher-runtime.js +128 -295
- package/bin/managed-node.js +0 -0
- package/bin/managed-plugin-selection.cjs +0 -1
- package/bin/native-module-repair.js +0 -0
- package/bin/node-runtime.js +0 -0
- package/bin/node-version.js +0 -0
- package/bin/plugin-bootstrap.js +56 -120
- package/bin/private-paths.js +11 -34
- package/bin/standard-tools-bootstrap.js +34 -114
- package/bin/turn-thinking-policy.cjs +3 -11
- package/bin/update-copy.js +200 -0
- package/bin/update-lease.js +0 -0
- package/bin/update-notice.js +136 -289
- package/bin/verify-agent-behavior.cjs +122 -0
- package/bin/verify-agent-components.cjs +104 -0
- package/bin/verify-bundled-agent-sources.cjs +57 -0
- package/blun.mjs +143076 -135288
- package/bundled-agent-sources.json +701 -0
- package/package.json +12 -15
- package/standard-skills/translate-native/README.md +1293 -0
- package/standard-skills/translate-native/SKILL.md +172 -22
- package/standard-skills/translate-native/VERSION +1 -1
- package/standard-skills/translate-native/agents/openai.yaml +18 -0
- package/standard-skills/translate-native/assets/icon.svg +8 -0
- package/standard-skills/translate-native/docs/BLUN_CODE_INTEGRATION.md +76 -0
- package/standard-skills/translate-native/docs/PREMORTEM.md +489 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION.md +2035 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_API.md +1302 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_EVIDENCE_HTTP.md +136 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_HEALTH_HTTP.md +130 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_HTTP_PROVIDER.md +175 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_RECEIPT_VERIFIER_HTTP.md +86 -0
- package/standard-skills/translate-native/integrations/AGENT_RULES.md +32 -0
- package/standard-skills/translate-native/integrations/adapters/blun-code-language-guard.js +514 -0
- package/standard-skills/translate-native/integrations/adapters/node-language-guard.js +230 -0
- package/standard-skills/translate-native/integrations/audit_log.py +327 -0
- package/standard-skills/translate-native/integrations/claude_language_hook.js +1536 -0
- package/standard-skills/translate-native/integrations/commercial_localization_profile.py +42 -0
- package/standard-skills/translate-native/integrations/delivery-policy.example.json +28 -0
- package/standard-skills/translate-native/integrations/enforced_delivery.py +543 -0
- package/standard-skills/translate-native/integrations/guard_service.py +435 -0
- package/standard-skills/translate-native/integrations/language_gateway.py +67 -0
- package/standard-skills/translate-native/integrations/mcp_auth_headers.py +198 -0
- package/standard-skills/translate-native/integrations/mcp_http_gateway.py +429 -0
- package/standard-skills/translate-native/integrations/non_language_html_entities.js +1485 -0
- package/standard-skills/translate-native/integrations/pre_output_guard.py +65 -0
- package/standard-skills/translate-native/integrations/task_router.py +101 -0
- package/standard-skills/translate-native/integrations/website_localization.py +401 -0
- package/standard-skills/translate-native/integrations/website_localization_api.py +581 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark.py +1885 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_campaign.py +1772 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_candidate.py +506 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_http.py +400 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_review_store.py +781 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_reviewer_http.py +500 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_runtime.py +1107 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_suite.py +463 -0
- package/standard-skills/translate-native/integrations/website_localization_cms.py +2835 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_client.py +875 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_dispatch.py +805 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_http.py +588 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_lifecycle_monitor.py +991 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_receiver.py +1441 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_receiver_runtime.py +414 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_receiver_store.py +1073 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_removal_dispatch.py +865 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_client.py +583 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_delivery.py +964 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_delivery_runtime.py +665 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_http.py +1153 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_runtime.py +675 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_service.py +1125 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification.py +674 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_http.py +444 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_receiver.py +1469 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_receiver_runtime.py +1142 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_processing_monitor.py +634 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_receiver_client.py +804 -0
- package/standard-skills/translate-native/integrations/website_localization_deepl_baseline.py +922 -0
- package/standard-skills/translate-native/integrations/website_localization_evidence_http.py +482 -0
- package/standard-skills/translate-native/integrations/website_localization_health.py +1541 -0
- package/standard-skills/translate-native/integrations/website_localization_health_http.py +372 -0
- package/standard-skills/translate-native/integrations/website_localization_http_provider.py +297 -0
- package/standard-skills/translate-native/integrations/website_localization_native_reference_http.py +479 -0
- package/standard-skills/translate-native/integrations/website_localization_native_reference_intake.py +363 -0
- package/standard-skills/translate-native/integrations/website_localization_native_reference_queue.py +1449 -0
- package/standard-skills/translate-native/integrations/website_localization_native_reference_store.py +420 -0
- package/standard-skills/translate-native/integrations/website_localization_quality_profiles.py +235 -0
- package/standard-skills/translate-native/integrations/website_localization_queue.py +671 -0
- package/standard-skills/translate-native/integrations/website_localization_receipt_verifier_http.py +516 -0
- package/standard-skills/translate-native/integrations/website_localization_release.py +928 -0
- package/standard-skills/translate-native/integrations/website_localization_release_coordinator.py +1008 -0
- package/standard-skills/translate-native/integrations/website_localization_runner.py +276 -0
- package/standard-skills/translate-native/integrations/website_localization_runtime.py +862 -0
- package/standard-skills/translate-native/integrations/website_localization_service.py +350 -0
- package/standard-skills/translate-native/integrations/website_localization_supervisor.py +511 -0
- package/standard-skills/translate-native/integrations/website_localization_worker.py +663 -0
- package/standard-skills/translate-native/provenance.json +3 -4
- package/standard-skills/translate-native/references/commercial-localization.md +177 -0
- package/standard-skills/translate-native/scripts/blun_language_guard.py +7 -1
- package/standard-skills/translate-native/scripts/check_commercial_review.py +80 -0
- package/standard-skills/translate-native/scripts/commercial_localization_profile.py +333 -0
- package/standard-tools/language-guard/LICENSE +21 -0
- package/standard-tools/language-guard/VERSION +1 -0
- package/standard-tools/language-guard/blun_language_guard.py +7 -1
- package/standard-tools/language-guard/check_commercial_review.py +80 -0
- package/standard-tools/language-guard/commercial_localization_profile.py +333 -0
- package/standard-tools/language-guard/language_gateway.py +62 -0
- package/standard-tools/language-guard/pre_output_guard.py +64 -0
- package/standard-tools/language-guard/provenance.json +4 -11
- package/standard-tools/manifest.json +34 -11
- package/telegram-plugin/commands/access.md +2 -10
- package/telegram-plugin/dist/bridge.mjs +64041 -687
- package/telegram-plugin/dist/mcp-server.mjs +72810 -9027
- package/telegram-plugin/dist/noise.mjs +28 -63511
- package/agent-spine-plugin/CONTRIBUTING.md +0 -52
- package/agent-spine-plugin/SECURITY.md +0 -47
- package/agent-spine-plugin/docs/assignment-continuation.md +0 -48
- package/agent-spine-plugin/docs/releasing.md +0 -85
- package/agent-spine-plugin/docs/structured-completion.md +0 -67
- package/bin/abort-listener-policy.cjs +0 -43
- package/bin/active-steer-priority-policy.cjs +0 -24
- package/bin/agent-api-http-adapter.mjs +0 -446
- package/bin/agent-api-private-http-server.mjs +0 -288
- package/bin/agent-api-runtime.mjs +0 -252
- package/bin/agent-api-service-environment.mjs +0 -236
- package/bin/agent-api-service-host.mjs +0 -209
- package/bin/agent-api-service-process.mjs +0 -171
- package/bin/agent-api-session-registry.mjs +0 -428
- package/bin/agent-api-tool-broker.cjs +0 -248
- package/bin/agent-api-turn-controller.mjs +0 -461
- package/bin/agent-api-usage-journal.cjs +0 -259
- package/bin/agent-resume-snapshot.cjs +0 -241
- package/bin/agentspine-king-goal-inbox.mjs +0 -111
- package/bin/agentspine-king-goal-intake.mjs +0 -106
- package/bin/approval-rejection-stop.cjs +0 -15
- package/bin/assistant-message-offload-policy.cjs +0 -284
- package/bin/baseline-skill-performance-policy.cjs +0 -39
- package/bin/bash-search-scope-policy.cjs +0 -49
- package/bin/codebase-search-runtime.cjs +0 -23
- package/bin/cognitive-action-checkpoint.cjs +0 -1104
- package/bin/cognitive-attention-delivery.cjs +0 -76
- package/bin/cognitive-attention-policy.cjs +0 -143
- package/bin/cognitive-attention-runtime.cjs +0 -91
- package/bin/cognitive-context-projection.cjs +0 -73
- package/bin/cognitive-cross-portal-acceptance.cjs +0 -443
- package/bin/cognitive-effective-view.cjs +0 -77
- package/bin/cognitive-focus-projection.cjs +0 -206
- package/bin/cognitive-focus-scope.cjs +0 -37
- package/bin/cognitive-goal-autostart-policy.cjs +0 -72
- package/bin/cognitive-goal-time-trigger-controller.cjs +0 -146
- package/bin/cognitive-memory-adapter.cjs +0 -282
- package/bin/cognitive-memory-command.cjs +0 -293
- package/bin/cognitive-memory-provider.cjs +0 -92
- package/bin/cognitive-salience-policy.cjs +0 -159
- package/bin/cognitive-state-store.cjs +0 -508
- package/bin/cognitive-turn-lifecycle.cjs +0 -624
- package/bin/cognitive-work-focus.cjs +0 -180
- package/bin/compaction-history-archive.cjs +0 -166
- package/bin/compaction-history-startup.cjs +0 -50
- package/bin/compaction-model-policy.cjs +0 -31
- package/bin/compaction-stage-policy.cjs +0 -21
- package/bin/compaction-transaction-policy.cjs +0 -122
- package/bin/config-write-dedup-policy.cjs +0 -27
- package/bin/context-budget-ledger.cjs +0 -31
- package/bin/context-doctor-policy.cjs +0 -70
- package/bin/context-insight-policy.cjs +0 -36
- package/bin/context-performance-policy.cjs +0 -19
- package/bin/context-pressure-policy.cjs +0 -20
- package/bin/cron-run-output.cjs +0 -45
- package/bin/cron-run-store.cjs +0 -145
- package/bin/curiosity-scout-policy.cjs +0 -49
- package/bin/default-model-output-budget-policy.cjs +0 -28
- package/bin/durable-task-resume-policy.cjs +0 -130
- package/bin/durable-task-resume-runtime.cjs +0 -117
- package/bin/durable-task-resume-store.cjs +0 -88
- package/bin/editable-tool-approval-policy.cjs +0 -540
- package/bin/editable-tool-approval-runtime.cjs +0 -99
- package/bin/effective-system-prompt-cache-policy.cjs +0 -33
- package/bin/error-memory-performance-policy.cjs +0 -113
- package/bin/file-observation-policy.cjs +0 -133
- package/bin/foreground-output-capture-policy.cjs +0 -41
- package/bin/generated-source-health.cjs +0 -142
- package/bin/glob-pattern-policy.cjs +0 -13
- package/bin/goal-completion-evidence-policy.cjs +0 -120
- package/bin/grep-output-limit-policy.cjs +0 -39
- package/bin/historical-media-projection-policy.cjs +0 -48
- package/bin/history-offload-pressure-policy.cjs +0 -33
- package/bin/html-to-research-markdown.cjs +0 -147
- package/bin/identity-context-policy.cjs +0 -764
- package/bin/identity-journal-policy.cjs +0 -107
- package/bin/input-draft-persistence.cjs +0 -77
- package/bin/king-tui-function-contract.json +0 -33
- package/bin/launcher-restart-policy.cjs +0 -150
- package/bin/live-response-repetition-guard.cjs +0 -196
- package/bin/llm-config-log-dedup-policy.cjs +0 -76
- package/bin/loop-event-record-policy.cjs +0 -174
- package/bin/managed-context-startup-policy.cjs +0 -27
- package/bin/media-activity-layout-policy.cjs +0 -34
- package/bin/media-auto-retrieval-policy.cjs +0 -90
- package/bin/media-result-policy.cjs +0 -59
- package/bin/micro-compaction-policy.cjs +0 -145
- package/bin/mistake-relevance-policy.cjs +0 -319
- package/bin/model-retry-progress-policy.cjs +0 -46
- package/bin/native-large-file-io.cjs +0 -42
- package/bin/native-runtime-cache.cjs +0 -76
- package/bin/natural-presence-policy.cjs +0 -28
- package/bin/noninteractive-shell-env-policy.cjs +0 -19
- package/bin/observer-hooks.cjs +0 -14
- package/bin/outbound-claim-provenance.cjs +0 -150
- package/bin/oversized-context-offload-policy.cjs +0 -86
- package/bin/pending-media-policy.cjs +0 -182
- package/bin/pending-token-estimate-policy.cjs +0 -41
- package/bin/personal-memory-consent-policy.cjs +0 -72
- package/bin/personal-memory-performance-policy.cjs +0 -12
- package/bin/personality-choice-policy.cjs +0 -101
- package/bin/personality-memory-adapter.cjs +0 -379
- package/bin/personality-mode.cjs +0 -46
- package/bin/personality-setup-policy.cjs +0 -197
- package/bin/proactive-compaction-policy.cjs +0 -25
- package/bin/profile-identity-resolution.cjs +0 -136
- package/bin/profile-runtime.cjs +0 -318
- package/bin/profile-tool-exclusion-policy.cjs +0 -37
- package/bin/programmatic-context-isolation.cjs +0 -25
- package/bin/programmatic-tool-runtime.mjs +0 -627
- package/bin/provider-idle-timeout-policy.cjs +0 -14
- package/bin/provider-model-refresh-deadline.cjs +0 -53
- package/bin/provider-model-refresh-policy.cjs +0 -107
- package/bin/rate-limit-recovery-policy.cjs +0 -47
- package/bin/read-batch-policy.cjs +0 -32
- package/bin/read-continuation-policy.cjs +0 -59
- package/bin/recurring-cron-history-policy.cjs +0 -124
- package/bin/relationship-continuity-policy.cjs +0 -143
- package/bin/relationship-curiosity-policy.cjs +0 -107
- package/bin/relationship-learning-policy.cjs +0 -168
- package/bin/release-artifact-freeze-policy.cjs +0 -30
- package/bin/reload-plugin-bootstrap.cjs +0 -18
- package/bin/reload-queue-policy.cjs +0 -38
- package/bin/repeated-assistant-response-policy.cjs +0 -232
- package/bin/repeated-injection-projection.cjs +0 -107
- package/bin/repeated-user-message-projection.cjs +0 -8
- package/bin/research-page-result.cjs +0 -74
- package/bin/retry-checkpoint-policy.cjs +0 -13
- package/bin/runtime-exit-ledger.cjs +0 -144
- package/bin/scoped-cron-run-policy.cjs +0 -358
- package/bin/session-checkpoint-policy.cjs +0 -25
- package/bin/session-compaction-policy.cjs +0 -84
- package/bin/session-replay-policy.cjs +0 -20
- package/bin/session-replay-window-policy.cjs +0 -40
- package/bin/session-resume-checkpoint.cjs +0 -254
- package/bin/session-scrollback-archive.cjs +0 -229
- package/bin/skill-activation-performance-policy.cjs +0 -69
- package/bin/skill-listing-performance-policy.cjs +0 -92
- package/bin/soul-organization-policy.cjs +0 -78
- package/bin/soul-preservation-policy.cjs +0 -20
- package/bin/startup-preferences.cjs +0 -131
- package/bin/streaming-flush-performance-policy.cjs +0 -28
- package/bin/structured-agent-swarm-output.cjs +0 -325
- package/bin/structured-subagent-output.cjs +0 -252
- package/bin/subagent-context-fork-policy.cjs +0 -155
- package/bin/subagent-max-tokens-handoff-policy.cjs +0 -69
- package/bin/subagent-parent-responsiveness.cjs +0 -19
- package/bin/subagent-skill-policy.cjs +0 -206
- package/bin/subagent-timeout-policy.cjs +0 -182
- package/bin/subagent-tool-policy.cjs +0 -60
- package/bin/subagent-usage-rollup-policy.cjs +0 -29
- package/bin/system-prompt-context-policy.cjs +0 -124
- package/bin/system-prompt-token-cache-policy.cjs +0 -60
- package/bin/telegram-addressed-focus.cjs +0 -55
- package/bin/telegram-addressed-priority.cjs +0 -12
- package/bin/telegram-approval-relay.cjs +0 -290
- package/bin/telegram-bot-priority.cjs +0 -17
- package/bin/telegram-console-status-policy.cjs +0 -174
- package/bin/telegram-context-projection-policy.cjs +0 -141
- package/bin/telegram-delivery-lifecycle.cjs +0 -125
- package/bin/telegram-direct-focus-policy.cjs +0 -273
- package/bin/telegram-mcp-compatibility.cjs +0 -49
- package/bin/telegram-media-delivery-policy.cjs +0 -42
- package/bin/telegram-private-conversation-policy.cjs +0 -185
- package/bin/telegram-queue-handoff-policy.cjs +0 -73
- package/bin/telegram-remote-status-policy.cjs +0 -120
- package/bin/telegram-session-queue-runtime.mjs +0 -306
- package/bin/telegram-text-chunk-policy.cjs +0 -63
- package/bin/telegram-truncated-reply-policy.cjs +0 -37
- package/bin/telegram-urgent-policy.cjs +0 -45
- package/bin/telemetry-spool-policy.cjs +0 -57
- package/bin/thinking-activity-status-policy.cjs +0 -132
- package/bin/thinking-only-guard.cjs +0 -80
- package/bin/todo-list-turn-policy.cjs +0 -131
- package/bin/tool-call-loop-policy.cjs +0 -51
- package/bin/tool-file-persistence.cjs +0 -141
- package/bin/tool-result-offload-policy.cjs +0 -359
- package/bin/tool-result-offload-telemetry.cjs +0 -12
- package/bin/tool-schema-token-cache-policy.cjs +0 -41
- package/bin/tool-stream-preview-policy.cjs +0 -9
- package/bin/tui-functional-contract.cjs +0 -55
- package/bin/turn-tool-performance-policy.cjs +0 -486
- package/bin/usage-cache-efficiency-policy.cjs +0 -26
- package/bin/user-home-path-policy.cjs +0 -13
- package/bin/user-message-offload-policy.cjs +0 -103
- package/bin/user-prompt-hook-origin-policy.cjs +0 -34
- package/bin/user-tool-record-policy.cjs +0 -7
- package/bin/validated-learning-insight-policy.cjs +0 -58
- package/bin/validated-learning-outcome-trace.cjs +0 -107
- package/bin/validated-learning-performance-policy.cjs +0 -53
- package/bin/validated-learning-signal.cjs +0 -463
- package/bin/windows-bash-dialect-policy.cjs +0 -25
- package/bin/windows-node-crash-dump.cjs +0 -110
- package/bin/write-continuation-policy.cjs +0 -69
- package/codebase-index/README.md +0 -82
- package/codebase-index/codebase_index.py +0 -470
- package/standard-skills/agent-browser/SKILL.md +0 -19
- package/standard-skills/agent-browser/references/runtime.md +0 -8
- package/standard-skills/blun-session-inspector/SKILL.md +0 -41
- package/standard-skills/blun-session-inspector/scripts/inspect-session.cjs +0 -437
- package/standard-skills/design-taste-frontend/SKILL.md +0 -1206
- package/standard-skills/full-output-enforcement/SKILL.md +0 -49
- package/standard-skills/high-end-visual-design/SKILL.md +0 -98
- package/standard-skills/image-to-code/SKILL.md +0 -1228
- package/standard-skills/industrial-brutalist-ui/SKILL.md +0 -92
- package/standard-skills/minimalist-ui/SKILL.md +0 -85
- package/standard-skills/motion-design-taste/SKILL.md +0 -74
- package/standard-skills/playwright-testing/SKILL.md +0 -19
- package/standard-skills/playwright-testing/references/runtime.md +0 -7
- package/standard-skills/premortem/SKILL.md +0 -148
- package/standard-skills/redesign-existing-projects/SKILL.md +0 -178
- package/standard-skills/research-evidence/SKILL.md +0 -39
- package/standard-skills/research-evidence/references/evidence-format.md +0 -104
- package/standard-skills/research-evidence/scripts/evidence-collection.cjs +0 -260
- package/standard-skills/research-evidence/scripts/score-report.cjs +0 -130
- package/standard-skills/screenshot-lesen/SKILL.md +0 -52
- package/standard-skills/stitch-design-taste/DESIGN.md +0 -121
- package/standard-skills/stitch-design-taste/SKILL.md +0 -184
- package/standard-skills/telegram-channel/SKILL.md +0 -18
- package/standard-skills/telegram-channel/references/runtime.md +0 -7
- package/standard-skills/venture-flywheel/SKILL.md +0 -32
- package/standard-skills/venture-flywheel/identity/project-identity.cjs +0 -146
- package/standard-skills/venture-flywheel/policy/capability-engine.cjs +0 -114
- package/standard-skills/venture-flywheel/policy/repository-trust.cjs +0 -229
- package/standard-skills/venture-flywheel/references/BEISPIELE-phase0.md +0 -146
- package/standard-skills/venture-flywheel/references/CAPABILITY-MAP.md +0 -34
- package/standard-skills/venture-flywheel/references/SPEC-phase0-identity-trust.md +0 -77
- package/standard-skills/venture-flywheel/references/SPEC-phase0-state-events.md +0 -93
- package/standard-skills/venture-flywheel/schemas/capability-decision.schema.json +0 -13
- package/standard-skills/venture-flywheel/schemas/execution-event.schema.json +0 -44
- package/standard-skills/venture-flywheel/schemas/project-identity.schema.json +0 -32
- package/standard-skills/venture-flywheel/schemas/repository-trust.schema.json +0 -57
- package/standard-skills/venture-flywheel/schemas/run-transition.schema.json +0 -59
- package/standard-skills/venture-flywheel/state/execution-event.cjs +0 -191
- package/standard-skills/venture-flywheel/state/task-state-machine.cjs +0 -190
- package/standard-skills/web-lesen/SKILL.md +0 -73
- package/standard-skills/web-lesen/scripts/crawl_public.py +0 -379
- package/standard-skills/windows-mcp/SKILL.md +0 -19
- package/standard-skills/windows-mcp/references/runtime.md +0 -9
- package/telegram-plugin/DELIVERY.md +0 -36
- package/telegram-plugin/bin/telegram-approval-relay.cjs +0 -290
- package/telegram-plugin/bin/telegram-console-status-policy.cjs +0 -175
- package/telegram-plugin/bin/telegram-delivery-lifecycle.cjs +0 -125
- package/telegram-plugin/bin/telegram-direct-reply-policy.cjs +0 -48
- package/telegram-plugin/bin/telegram-launcher-status-queue.cjs +0 -122
- package/telegram-plugin/bin/telegram-private-conversation-policy.cjs +0 -186
- package/telegram-plugin/bin/telegram-remote-status-policy.cjs +0 -121
- package/telegram-plugin/bin/telegram-reply-parts.cjs +0 -149
- package/telegram-plugin/bin/telegram-text-chunk-policy.cjs +0 -63
- package/telegram-plugin/bin/telegram-typing-keepalive.cjs +0 -89
- package/telegram-plugin/compat/mcp-server-fa511cd1.mjs +0 -73825
- /package/{bin → scripts}/fix-node-pty-perms.js +0 -0
|
@@ -0,0 +1,862 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Provider-neutral composition root for the website-localization service.
|
|
3
|
+
|
|
4
|
+
The host owns distinct SQLite connections and every external capability.
|
|
5
|
+
This module validates those inputs before constructing the durable queue,
|
|
6
|
+
release, CMS, evidence, supervisor, and read-only health components.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import importlib.util
|
|
12
|
+
import math
|
|
13
|
+
import re
|
|
14
|
+
import sqlite3
|
|
15
|
+
import sys
|
|
16
|
+
import time
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from types import MappingProxyType
|
|
19
|
+
from typing import Any, Callable, Mapping
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
SCHEMA = "blun.website-localization-runtime.v1"
|
|
23
|
+
TOKEN = re.compile(r"^[A-Za-z0-9_.:-]{1,256}$")
|
|
24
|
+
REQUIRED_TICK_KEYS = frozenset({
|
|
25
|
+
"provider_resolver", "assets_resolver", "evidence_provider",
|
|
26
|
+
"quality_verifier", "event_verifier", "approval_authority",
|
|
27
|
+
"publication_authority", "publisher", "translation_worker_id",
|
|
28
|
+
"evidence_worker_id", "delivery_worker_id", "evidence_revision",
|
|
29
|
+
})
|
|
30
|
+
OPTIONAL_TICK_KEYS = frozenset({
|
|
31
|
+
"translation_lease_seconds", "translation_retry_base_seconds",
|
|
32
|
+
"translation_retry_max_seconds", "evidence_lease_seconds",
|
|
33
|
+
"evidence_max_attempts", "approval_ttl_seconds",
|
|
34
|
+
"delivery_lease_seconds", "delivery_max_attempts",
|
|
35
|
+
"human_review_verifier", "independent_model_review_verifier", "result_cache",
|
|
36
|
+
})
|
|
37
|
+
OPERATION_LEASE_DEFAULTS = {
|
|
38
|
+
"translation_lease_seconds": 300.0,
|
|
39
|
+
"evidence_lease_seconds": 300.0,
|
|
40
|
+
"delivery_lease_seconds": 300.0,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _load_module(name: str, path: Path):
|
|
45
|
+
spec = importlib.util.spec_from_file_location(name, path)
|
|
46
|
+
if spec is None or spec.loader is None:
|
|
47
|
+
raise RuntimeError(f"cannot load required runtime dependency: {path.name}")
|
|
48
|
+
module = importlib.util.module_from_spec(spec)
|
|
49
|
+
sys.modules[spec.name] = module
|
|
50
|
+
spec.loader.exec_module(module)
|
|
51
|
+
return module
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
_ROOT = Path(__file__).resolve().parents[1]
|
|
55
|
+
_SERVICE = _load_module(
|
|
56
|
+
"blun_website_localization_runtime_service",
|
|
57
|
+
_ROOT / "integrations" / "website_localization_service.py",
|
|
58
|
+
)
|
|
59
|
+
_SUPERVISOR = _load_module(
|
|
60
|
+
"blun_website_localization_runtime_supervisor",
|
|
61
|
+
_ROOT / "integrations" / "website_localization_supervisor.py",
|
|
62
|
+
)
|
|
63
|
+
_HEALTH = _load_module(
|
|
64
|
+
"blun_website_localization_runtime_health",
|
|
65
|
+
_ROOT / "integrations" / "website_localization_health.py",
|
|
66
|
+
)
|
|
67
|
+
_HEALTH_HTTP = _load_module(
|
|
68
|
+
"blun_website_localization_runtime_health_http",
|
|
69
|
+
_ROOT / "integrations" / "website_localization_health_http.py",
|
|
70
|
+
)
|
|
71
|
+
_BENCHMARK_RUNTIME = _load_module(
|
|
72
|
+
"blun_website_localization_runtime_benchmark_execution",
|
|
73
|
+
_ROOT / "integrations" / "website_localization_benchmark_runtime.py",
|
|
74
|
+
)
|
|
75
|
+
_API = _load_module(
|
|
76
|
+
"blun_website_localization_runtime_api",
|
|
77
|
+
_ROOT / "integrations" / "website_localization_api.py",
|
|
78
|
+
)
|
|
79
|
+
_CMS = _SERVICE._CMS
|
|
80
|
+
_QUEUE = _CMS._QUEUE
|
|
81
|
+
_RELEASE = _CMS._RELEASE
|
|
82
|
+
_COORDINATOR = _SERVICE._COORDINATOR
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class LocalizationRuntimeBlocked(RuntimeError):
|
|
86
|
+
"""Stable host-composition failure without customer or secret values."""
|
|
87
|
+
|
|
88
|
+
def __init__(self, code: str):
|
|
89
|
+
super().__init__(code)
|
|
90
|
+
self.code = code
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _identifier(value: Any, code: str) -> str:
|
|
94
|
+
if not isinstance(value, str) or TOKEN.fullmatch(value) is None:
|
|
95
|
+
raise LocalizationRuntimeBlocked(code)
|
|
96
|
+
return value
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _number(
|
|
100
|
+
value: Any,
|
|
101
|
+
code: str,
|
|
102
|
+
*,
|
|
103
|
+
maximum: float | None = None,
|
|
104
|
+
allow_zero: bool = False,
|
|
105
|
+
) -> float:
|
|
106
|
+
if isinstance(value, bool) or not isinstance(value, (int, float)):
|
|
107
|
+
raise LocalizationRuntimeBlocked(code)
|
|
108
|
+
number = float(value)
|
|
109
|
+
if (
|
|
110
|
+
not math.isfinite(number)
|
|
111
|
+
or (number < 0 if allow_zero else number <= 0)
|
|
112
|
+
or (maximum is not None and number > maximum)
|
|
113
|
+
):
|
|
114
|
+
raise LocalizationRuntimeBlocked(code)
|
|
115
|
+
return number
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _capability(value: Any, method: str, code: str) -> None:
|
|
119
|
+
if not callable(getattr(value, method, None)):
|
|
120
|
+
raise LocalizationRuntimeBlocked(code)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _validate_dependencies(values: Mapping[str, Any]) -> MappingProxyType:
|
|
124
|
+
if not isinstance(values, Mapping):
|
|
125
|
+
raise LocalizationRuntimeBlocked("runtime.dependencies.invalid")
|
|
126
|
+
copied = dict(values)
|
|
127
|
+
keys = set(copied)
|
|
128
|
+
if keys - REQUIRED_TICK_KEYS - OPTIONAL_TICK_KEYS or REQUIRED_TICK_KEYS - keys:
|
|
129
|
+
raise LocalizationRuntimeBlocked("runtime.dependencies.invalid")
|
|
130
|
+
if "result_cache" in copied:
|
|
131
|
+
raise LocalizationRuntimeBlocked("runtime.result_cache.external_forbidden")
|
|
132
|
+
if not callable(copied["provider_resolver"]):
|
|
133
|
+
raise LocalizationRuntimeBlocked("runtime.provider_resolver.invalid")
|
|
134
|
+
if not callable(copied["assets_resolver"]):
|
|
135
|
+
raise LocalizationRuntimeBlocked("runtime.assets_resolver.invalid")
|
|
136
|
+
for name, method in (
|
|
137
|
+
("evidence_provider", "obtain"),
|
|
138
|
+
("quality_verifier", "verify"),
|
|
139
|
+
("event_verifier", "verify"),
|
|
140
|
+
("approval_authority", "sign"),
|
|
141
|
+
("approval_authority", "verify"),
|
|
142
|
+
("publication_authority", "sign"),
|
|
143
|
+
("publication_authority", "verify"),
|
|
144
|
+
("publisher", "publish"),
|
|
145
|
+
):
|
|
146
|
+
_capability(copied[name], method, f"runtime.{name}.invalid")
|
|
147
|
+
for name in (
|
|
148
|
+
"translation_worker_id", "evidence_worker_id", "delivery_worker_id",
|
|
149
|
+
"evidence_revision",
|
|
150
|
+
):
|
|
151
|
+
_identifier(copied[name], f"runtime.{name}.invalid")
|
|
152
|
+
human = copied.get("human_review_verifier")
|
|
153
|
+
if human is not None:
|
|
154
|
+
_capability(human, "verify", "runtime.human_review_verifier.invalid")
|
|
155
|
+
independent = copied.get("independent_model_review_verifier")
|
|
156
|
+
if independent is not None:
|
|
157
|
+
_capability(
|
|
158
|
+
independent, "verify", "runtime.independent_model_review_verifier.invalid",
|
|
159
|
+
)
|
|
160
|
+
bounds = {
|
|
161
|
+
"translation_lease_seconds": (86_400.0, False),
|
|
162
|
+
"translation_retry_base_seconds": (86_400.0, True),
|
|
163
|
+
"translation_retry_max_seconds": (86_400.0, True),
|
|
164
|
+
"evidence_lease_seconds": (3_600.0, False),
|
|
165
|
+
"approval_ttl_seconds": (31_536_000.0, False),
|
|
166
|
+
"delivery_lease_seconds": (86_400.0, False),
|
|
167
|
+
}
|
|
168
|
+
for name, (maximum, allow_zero) in bounds.items():
|
|
169
|
+
if name in copied:
|
|
170
|
+
_number(
|
|
171
|
+
copied[name], f"runtime.{name}.invalid",
|
|
172
|
+
maximum=maximum, allow_zero=allow_zero,
|
|
173
|
+
)
|
|
174
|
+
for name in ("evidence_max_attempts", "delivery_max_attempts"):
|
|
175
|
+
if name in copied and (
|
|
176
|
+
isinstance(copied[name], bool)
|
|
177
|
+
or not isinstance(copied[name], int)
|
|
178
|
+
or not 1 <= copied[name] <= 20
|
|
179
|
+
):
|
|
180
|
+
raise LocalizationRuntimeBlocked(f"runtime.{name}.invalid")
|
|
181
|
+
if (
|
|
182
|
+
"translation_retry_base_seconds" in copied
|
|
183
|
+
and "translation_retry_max_seconds" in copied
|
|
184
|
+
and float(copied["translation_retry_base_seconds"])
|
|
185
|
+
> float(copied["translation_retry_max_seconds"])
|
|
186
|
+
):
|
|
187
|
+
raise LocalizationRuntimeBlocked("runtime.translation_retry_policy.invalid")
|
|
188
|
+
return MappingProxyType(copied)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def _validate_connections(connections: tuple[Any, ...]) -> None:
|
|
192
|
+
if len(connections) not in {5, 6, 10} or any(
|
|
193
|
+
not isinstance(connection, sqlite3.Connection) for connection in connections
|
|
194
|
+
):
|
|
195
|
+
raise LocalizationRuntimeBlocked("runtime.connections.invalid")
|
|
196
|
+
if len({id(connection) for connection in connections}) != len(connections):
|
|
197
|
+
raise LocalizationRuntimeBlocked("runtime.connections.not_distinct")
|
|
198
|
+
if any(connection.in_transaction for connection in connections):
|
|
199
|
+
raise LocalizationRuntimeBlocked("runtime.connections.transaction_active")
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def _supervisor_policy(value: Any):
|
|
203
|
+
if value is None:
|
|
204
|
+
return _SUPERVISOR.SupervisorPolicy(lease_seconds=360.0)
|
|
205
|
+
if not isinstance(value, Mapping):
|
|
206
|
+
raise LocalizationRuntimeBlocked("runtime.supervisor_policy.invalid")
|
|
207
|
+
expected = {
|
|
208
|
+
"lease_seconds", "active_delay_seconds", "idle_delay_seconds",
|
|
209
|
+
"blocked_base_seconds", "blocked_max_seconds", "stop_poll_seconds",
|
|
210
|
+
}
|
|
211
|
+
if set(value) != expected:
|
|
212
|
+
raise LocalizationRuntimeBlocked("runtime.supervisor_policy.invalid")
|
|
213
|
+
try:
|
|
214
|
+
return _SUPERVISOR.SupervisorPolicy(**dict(value)).validated()
|
|
215
|
+
except Exception:
|
|
216
|
+
raise LocalizationRuntimeBlocked("runtime.supervisor_policy.invalid") from None
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _validate_lease_hierarchy(
|
|
220
|
+
dependencies: Mapping[str, Any],
|
|
221
|
+
supervisor_policy: Any,
|
|
222
|
+
*,
|
|
223
|
+
benchmark_lease_seconds: float | None = None,
|
|
224
|
+
) -> None:
|
|
225
|
+
leases = [
|
|
226
|
+
float(dependencies.get(name, default))
|
|
227
|
+
for name, default in OPERATION_LEASE_DEFAULTS.items()
|
|
228
|
+
]
|
|
229
|
+
if benchmark_lease_seconds is not None:
|
|
230
|
+
leases.append(benchmark_lease_seconds)
|
|
231
|
+
longest_operation_lease = max(leases)
|
|
232
|
+
if float(supervisor_policy.lease_seconds) <= longest_operation_lease:
|
|
233
|
+
raise LocalizationRuntimeBlocked("runtime.lease_hierarchy.invalid")
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
BENCHMARK_EXECUTION_KEYS = frozenset({
|
|
237
|
+
"candidate_connection", "baseline_connection",
|
|
238
|
+
"native_reference_connection", "review_connection", "candidate_route_id",
|
|
239
|
+
"baseline_route_id", "native_reference_route_id", "reviewer_route_id",
|
|
240
|
+
"assets_resolver",
|
|
241
|
+
"candidate_provider_resolver", "baseline_acquirer",
|
|
242
|
+
"native_reference_loader", "reviewer", "native_reference_verifier",
|
|
243
|
+
"blinding_key", "worker_id", "max_attempts", "lease_seconds",
|
|
244
|
+
"retry_base_seconds", "retry_max_seconds",
|
|
245
|
+
})
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def _benchmark_execution(value: Any) -> MappingProxyType | None:
|
|
249
|
+
if value is None:
|
|
250
|
+
return None
|
|
251
|
+
if not isinstance(value, Mapping) or set(value) != BENCHMARK_EXECUTION_KEYS:
|
|
252
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.execution.invalid")
|
|
253
|
+
copied = dict(value)
|
|
254
|
+
try:
|
|
255
|
+
for name in (
|
|
256
|
+
"candidate_connection", "baseline_connection",
|
|
257
|
+
"native_reference_connection", "review_connection",
|
|
258
|
+
):
|
|
259
|
+
_BENCHMARK_RUNTIME._connection(copied[name])
|
|
260
|
+
for name in (
|
|
261
|
+
"candidate_route_id", "baseline_route_id",
|
|
262
|
+
"native_reference_route_id", "reviewer_route_id",
|
|
263
|
+
):
|
|
264
|
+
_BENCHMARK_RUNTIME._route(
|
|
265
|
+
copied[name], "benchmark.runtime.route_invalid",
|
|
266
|
+
)
|
|
267
|
+
for name in (
|
|
268
|
+
"assets_resolver", "candidate_provider_resolver",
|
|
269
|
+
"baseline_acquirer", "native_reference_loader",
|
|
270
|
+
):
|
|
271
|
+
_BENCHMARK_RUNTIME._callable(
|
|
272
|
+
copied[name], "benchmark.runtime.resolver_invalid",
|
|
273
|
+
)
|
|
274
|
+
_BENCHMARK_RUNTIME._adapter(
|
|
275
|
+
copied["reviewer"], "review", "benchmark.runtime.reviewer_invalid",
|
|
276
|
+
)
|
|
277
|
+
_BENCHMARK_RUNTIME._adapter(
|
|
278
|
+
copied["native_reference_verifier"],
|
|
279
|
+
"verify",
|
|
280
|
+
"benchmark.runtime.reference_verifier_invalid",
|
|
281
|
+
)
|
|
282
|
+
if (
|
|
283
|
+
not isinstance(copied["blinding_key"], bytes)
|
|
284
|
+
or len(copied["blinding_key"]) < 32
|
|
285
|
+
):
|
|
286
|
+
raise ValueError
|
|
287
|
+
_BENCHMARK_RUNTIME._CAMPAIGN._identifier(copied["worker_id"])
|
|
288
|
+
if (
|
|
289
|
+
isinstance(copied["max_attempts"], bool)
|
|
290
|
+
or not isinstance(copied["max_attempts"], int)
|
|
291
|
+
or not 1 <= copied["max_attempts"] <= (
|
|
292
|
+
_BENCHMARK_RUNTIME._CAMPAIGN.MAX_ATTEMPTS
|
|
293
|
+
)
|
|
294
|
+
):
|
|
295
|
+
raise ValueError
|
|
296
|
+
except Exception as error:
|
|
297
|
+
code = getattr(error, "code", "runtime.benchmark.execution.invalid")
|
|
298
|
+
if not isinstance(code, str) or re.fullmatch(
|
|
299
|
+
r"[a-z][a-z0-9_.-]{0,127}", code,
|
|
300
|
+
) is None:
|
|
301
|
+
code = "runtime.benchmark.execution.invalid"
|
|
302
|
+
raise LocalizationRuntimeBlocked(code) from None
|
|
303
|
+
try:
|
|
304
|
+
copied["lease_seconds"] = _BENCHMARK_RUNTIME._CAMPAIGN._duration(
|
|
305
|
+
copied["lease_seconds"],
|
|
306
|
+
)
|
|
307
|
+
copied["retry_base_seconds"] = (
|
|
308
|
+
_BENCHMARK_RUNTIME._CAMPAIGN._duration(
|
|
309
|
+
copied["retry_base_seconds"], allow_zero=True,
|
|
310
|
+
)
|
|
311
|
+
)
|
|
312
|
+
copied["retry_max_seconds"] = (
|
|
313
|
+
_BENCHMARK_RUNTIME._CAMPAIGN._duration(
|
|
314
|
+
copied["retry_max_seconds"], allow_zero=True,
|
|
315
|
+
)
|
|
316
|
+
)
|
|
317
|
+
except Exception:
|
|
318
|
+
raise LocalizationRuntimeBlocked(
|
|
319
|
+
"runtime.benchmark.execution.retry_policy.invalid",
|
|
320
|
+
) from None
|
|
321
|
+
if copied["retry_base_seconds"] > copied["retry_max_seconds"]:
|
|
322
|
+
raise LocalizationRuntimeBlocked(
|
|
323
|
+
"runtime.benchmark.execution.retry_policy.invalid",
|
|
324
|
+
)
|
|
325
|
+
return MappingProxyType(copied)
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
class WebsiteLocalizationRuntime:
|
|
329
|
+
"""Compose one host-owned localization runtime from validated capabilities."""
|
|
330
|
+
|
|
331
|
+
def __init__(
|
|
332
|
+
self,
|
|
333
|
+
*,
|
|
334
|
+
queue_connection: sqlite3.Connection,
|
|
335
|
+
release_connection: sqlite3.Connection,
|
|
336
|
+
cms_connection: sqlite3.Connection,
|
|
337
|
+
evidence_connection: sqlite3.Connection,
|
|
338
|
+
supervisor_connection: sqlite3.Connection,
|
|
339
|
+
dependencies: Mapping[str, Any],
|
|
340
|
+
supervisor_worker_id: str,
|
|
341
|
+
cms_api_max_attempts: int = 3,
|
|
342
|
+
health_http_authenticator: Callable[[dict[str, Any]], Any] | None = None,
|
|
343
|
+
health_provider_probe: Any | None = None,
|
|
344
|
+
health_publisher_probe: Any | None = None,
|
|
345
|
+
supervisor_policy: Any = None,
|
|
346
|
+
supervisor_stale_after_seconds: float | int = 30,
|
|
347
|
+
benchmark_connection: sqlite3.Connection | None = None,
|
|
348
|
+
benchmark_policy: Any | None = None,
|
|
349
|
+
benchmark_campaign_id: str | None = None,
|
|
350
|
+
benchmark_evidence_authority: Any | None = None,
|
|
351
|
+
benchmark_stale_after_seconds: float | int = 3600,
|
|
352
|
+
benchmark_execution: Mapping[str, Any] | None = None,
|
|
353
|
+
clock: Callable[[], float] = time.time,
|
|
354
|
+
token_factory: Callable[[], str] | None = None,
|
|
355
|
+
):
|
|
356
|
+
benchmark_values = (
|
|
357
|
+
benchmark_connection, benchmark_policy, benchmark_campaign_id,
|
|
358
|
+
benchmark_evidence_authority,
|
|
359
|
+
)
|
|
360
|
+
benchmark_enabled = any(value is not None for value in benchmark_values)
|
|
361
|
+
if benchmark_enabled and any(value is None for value in benchmark_values):
|
|
362
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.incomplete")
|
|
363
|
+
if benchmark_execution is not None and not benchmark_enabled:
|
|
364
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.incomplete")
|
|
365
|
+
benchmark_execution = _benchmark_execution(benchmark_execution)
|
|
366
|
+
if benchmark_enabled:
|
|
367
|
+
if not isinstance(benchmark_campaign_id, str) or re.fullmatch(
|
|
368
|
+
r"benchmark-campaign-[0-9a-f]{64}", benchmark_campaign_id,
|
|
369
|
+
) is None:
|
|
370
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.campaign_id.invalid")
|
|
371
|
+
_capability(
|
|
372
|
+
benchmark_evidence_authority,
|
|
373
|
+
"verify",
|
|
374
|
+
"runtime.benchmark.authority.invalid",
|
|
375
|
+
)
|
|
376
|
+
try:
|
|
377
|
+
benchmark_policy = (
|
|
378
|
+
_HEALTH._CAMPAIGN._BENCHMARK._validate_policy(benchmark_policy)
|
|
379
|
+
)
|
|
380
|
+
expected_campaign_id = _HEALTH._CAMPAIGN._campaign_identity(
|
|
381
|
+
benchmark_policy,
|
|
382
|
+
)[0]
|
|
383
|
+
except Exception:
|
|
384
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.policy.invalid") from None
|
|
385
|
+
if expected_campaign_id != benchmark_campaign_id:
|
|
386
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.binding.invalid")
|
|
387
|
+
if benchmark_execution is not None:
|
|
388
|
+
_capability(
|
|
389
|
+
benchmark_evidence_authority,
|
|
390
|
+
"sign",
|
|
391
|
+
"runtime.benchmark.authority.invalid",
|
|
392
|
+
)
|
|
393
|
+
_number(
|
|
394
|
+
benchmark_stale_after_seconds,
|
|
395
|
+
"runtime.benchmark.stale_after_seconds.invalid",
|
|
396
|
+
maximum=_HEALTH._CAMPAIGN.MAX_STALE_SECONDS,
|
|
397
|
+
)
|
|
398
|
+
if (
|
|
399
|
+
isinstance(cms_api_max_attempts, bool)
|
|
400
|
+
or not isinstance(cms_api_max_attempts, int)
|
|
401
|
+
or not 1 <= cms_api_max_attempts <= 20
|
|
402
|
+
):
|
|
403
|
+
raise LocalizationRuntimeBlocked("runtime.cms_api.max_attempts.invalid")
|
|
404
|
+
if health_http_authenticator is not None and not callable(
|
|
405
|
+
health_http_authenticator
|
|
406
|
+
):
|
|
407
|
+
raise LocalizationRuntimeBlocked(
|
|
408
|
+
"runtime.health_http.authenticator.invalid",
|
|
409
|
+
)
|
|
410
|
+
if health_provider_probe is not None:
|
|
411
|
+
if health_http_authenticator is None:
|
|
412
|
+
raise LocalizationRuntimeBlocked("runtime.health_http.incomplete")
|
|
413
|
+
_capability(
|
|
414
|
+
health_provider_probe,
|
|
415
|
+
"check",
|
|
416
|
+
"runtime.health_http.provider_probe.invalid",
|
|
417
|
+
)
|
|
418
|
+
if health_publisher_probe is not None:
|
|
419
|
+
if health_http_authenticator is None:
|
|
420
|
+
raise LocalizationRuntimeBlocked("runtime.health_http.incomplete")
|
|
421
|
+
_capability(
|
|
422
|
+
health_publisher_probe,
|
|
423
|
+
"check",
|
|
424
|
+
"runtime.health_http.publisher_probe.invalid",
|
|
425
|
+
)
|
|
426
|
+
connections = (
|
|
427
|
+
queue_connection, release_connection, cms_connection,
|
|
428
|
+
evidence_connection, supervisor_connection,
|
|
429
|
+
) + ((benchmark_connection,) if benchmark_enabled else ()) + (
|
|
430
|
+
(
|
|
431
|
+
benchmark_execution["candidate_connection"],
|
|
432
|
+
benchmark_execution["baseline_connection"],
|
|
433
|
+
benchmark_execution["native_reference_connection"],
|
|
434
|
+
benchmark_execution["review_connection"],
|
|
435
|
+
) if benchmark_execution is not None else ()
|
|
436
|
+
)
|
|
437
|
+
_validate_connections(connections)
|
|
438
|
+
validated = _validate_dependencies(dependencies)
|
|
439
|
+
if (
|
|
440
|
+
health_publisher_probe is not None
|
|
441
|
+
and health_publisher_probe is not validated["publisher"]
|
|
442
|
+
):
|
|
443
|
+
raise LocalizationRuntimeBlocked(
|
|
444
|
+
"runtime.health_http.publisher_binding.invalid",
|
|
445
|
+
)
|
|
446
|
+
supervisor_worker_id = _identifier(
|
|
447
|
+
supervisor_worker_id, "runtime.supervisor_worker_id.invalid",
|
|
448
|
+
)
|
|
449
|
+
if not callable(clock):
|
|
450
|
+
raise LocalizationRuntimeBlocked("runtime.clock.invalid")
|
|
451
|
+
if benchmark_execution is not None:
|
|
452
|
+
try:
|
|
453
|
+
benchmark_now = _BENCHMARK_RUNTIME._CAMPAIGN._timestamp(clock())
|
|
454
|
+
except Exception:
|
|
455
|
+
raise LocalizationRuntimeBlocked("runtime.clock.invalid") from None
|
|
456
|
+
if benchmark_now > benchmark_policy.valid_until:
|
|
457
|
+
raise LocalizationRuntimeBlocked(
|
|
458
|
+
"runtime.benchmark.validity_expired",
|
|
459
|
+
)
|
|
460
|
+
if token_factory is not None and not callable(token_factory):
|
|
461
|
+
raise LocalizationRuntimeBlocked("runtime.token_factory.invalid")
|
|
462
|
+
supervisor_policy = _supervisor_policy(supervisor_policy)
|
|
463
|
+
_validate_lease_hierarchy(
|
|
464
|
+
validated,
|
|
465
|
+
supervisor_policy,
|
|
466
|
+
benchmark_lease_seconds=(
|
|
467
|
+
benchmark_execution["lease_seconds"]
|
|
468
|
+
if benchmark_execution is not None else None
|
|
469
|
+
),
|
|
470
|
+
)
|
|
471
|
+
_number(
|
|
472
|
+
supervisor_stale_after_seconds,
|
|
473
|
+
"runtime.supervisor_stale_after_seconds.invalid",
|
|
474
|
+
)
|
|
475
|
+
|
|
476
|
+
self._clock = clock
|
|
477
|
+
self.queue = _QUEUE.LocalizationQueue(queue_connection)
|
|
478
|
+
self.release_store = _RELEASE.LocalizationReleaseStore(
|
|
479
|
+
release_connection, self.queue,
|
|
480
|
+
)
|
|
481
|
+
runtime_dependencies = dict(validated)
|
|
482
|
+
runtime_dependencies["result_cache"] = (
|
|
483
|
+
self.release_store.verified_result_cache(
|
|
484
|
+
validated["approval_authority"],
|
|
485
|
+
)
|
|
486
|
+
)
|
|
487
|
+
runtime_dependencies["ingress_max_attempts"] = cms_api_max_attempts
|
|
488
|
+
self._dependencies = MappingProxyType(runtime_dependencies)
|
|
489
|
+
self.bridge = _CMS.WebsiteLocalizationCMSBridge(
|
|
490
|
+
cms_connection, self.queue, self.release_store,
|
|
491
|
+
)
|
|
492
|
+
self.cms_api = _API.WebsiteLocalizationAPI(
|
|
493
|
+
self.bridge,
|
|
494
|
+
validated["event_verifier"],
|
|
495
|
+
clock=self._clock,
|
|
496
|
+
max_attempts=cms_api_max_attempts,
|
|
497
|
+
approval_authority=validated["approval_authority"],
|
|
498
|
+
publication_authority=validated["publication_authority"],
|
|
499
|
+
)
|
|
500
|
+
self.evidence_state = _COORDINATOR.QualityEvidenceStateStore(
|
|
501
|
+
evidence_connection,
|
|
502
|
+
)
|
|
503
|
+
self.benchmark_runtime = None
|
|
504
|
+
self._benchmark_execution = benchmark_execution
|
|
505
|
+
if benchmark_execution is not None:
|
|
506
|
+
try:
|
|
507
|
+
self.benchmark_runtime = (
|
|
508
|
+
_BENCHMARK_RUNTIME.WebsiteLocalizationBenchmarkRuntime(
|
|
509
|
+
campaign_connection=benchmark_connection,
|
|
510
|
+
candidate_connection=(
|
|
511
|
+
benchmark_execution["candidate_connection"]
|
|
512
|
+
),
|
|
513
|
+
baseline_connection=(
|
|
514
|
+
benchmark_execution["baseline_connection"]
|
|
515
|
+
),
|
|
516
|
+
native_reference_connection=(
|
|
517
|
+
benchmark_execution["native_reference_connection"]
|
|
518
|
+
),
|
|
519
|
+
review_connection=benchmark_execution["review_connection"],
|
|
520
|
+
policy=benchmark_policy,
|
|
521
|
+
candidate_route_id=(
|
|
522
|
+
benchmark_execution["candidate_route_id"]
|
|
523
|
+
),
|
|
524
|
+
baseline_route_id=benchmark_execution["baseline_route_id"],
|
|
525
|
+
native_reference_route_id=(
|
|
526
|
+
benchmark_execution["native_reference_route_id"]
|
|
527
|
+
),
|
|
528
|
+
reviewer_route_id=(
|
|
529
|
+
benchmark_execution["reviewer_route_id"]
|
|
530
|
+
),
|
|
531
|
+
assets_resolver=benchmark_execution["assets_resolver"],
|
|
532
|
+
candidate_provider_resolver=(
|
|
533
|
+
benchmark_execution["candidate_provider_resolver"]
|
|
534
|
+
),
|
|
535
|
+
baseline_acquirer=(
|
|
536
|
+
benchmark_execution["baseline_acquirer"]
|
|
537
|
+
),
|
|
538
|
+
native_reference_loader=(
|
|
539
|
+
benchmark_execution["native_reference_loader"]
|
|
540
|
+
),
|
|
541
|
+
reviewer=benchmark_execution["reviewer"],
|
|
542
|
+
native_reference_verifier=(
|
|
543
|
+
benchmark_execution["native_reference_verifier"]
|
|
544
|
+
),
|
|
545
|
+
evidence_authority=benchmark_evidence_authority,
|
|
546
|
+
blinding_key=benchmark_execution["blinding_key"],
|
|
547
|
+
worker_id=benchmark_execution["worker_id"],
|
|
548
|
+
max_attempts=benchmark_execution["max_attempts"],
|
|
549
|
+
clock=self._clock,
|
|
550
|
+
)
|
|
551
|
+
)
|
|
552
|
+
except Exception as error:
|
|
553
|
+
code = getattr(error, "code", None)
|
|
554
|
+
if not isinstance(code, str) or re.fullmatch(
|
|
555
|
+
r"[a-z][a-z0-9_.-]{0,127}", code,
|
|
556
|
+
) is None:
|
|
557
|
+
code = "runtime.benchmark.execution.invalid"
|
|
558
|
+
raise LocalizationRuntimeBlocked(code) from None
|
|
559
|
+
if self.benchmark_runtime.campaign_id != benchmark_campaign_id:
|
|
560
|
+
raise LocalizationRuntimeBlocked(
|
|
561
|
+
"runtime.benchmark.execution.binding.invalid",
|
|
562
|
+
)
|
|
563
|
+
self.benchmark_store = (
|
|
564
|
+
_HEALTH._CAMPAIGN.BenchmarkCampaignStore(benchmark_connection)
|
|
565
|
+
if benchmark_enabled else None
|
|
566
|
+
)
|
|
567
|
+
self._benchmark_policy = benchmark_policy
|
|
568
|
+
self._benchmark_campaign_id = benchmark_campaign_id
|
|
569
|
+
self._benchmark_evidence_authority = benchmark_evidence_authority
|
|
570
|
+
|
|
571
|
+
def tick():
|
|
572
|
+
service_tick = _SERVICE.run_service_tick(
|
|
573
|
+
self.bridge,
|
|
574
|
+
self.evidence_state,
|
|
575
|
+
clock=self._clock,
|
|
576
|
+
operation_guard=self.supervisor.renew_active_lease,
|
|
577
|
+
**self._dependencies,
|
|
578
|
+
)
|
|
579
|
+
if (
|
|
580
|
+
service_tick.phase != "idle"
|
|
581
|
+
or service_tick.status != "idle"
|
|
582
|
+
or self.benchmark_runtime is None
|
|
583
|
+
):
|
|
584
|
+
return service_tick
|
|
585
|
+
try:
|
|
586
|
+
benchmark_tick = self.benchmark_runtime.run_once(
|
|
587
|
+
operation_guard=self.supervisor.renew_active_lease,
|
|
588
|
+
lease_seconds=self._benchmark_execution["lease_seconds"],
|
|
589
|
+
retry_base_seconds=(
|
|
590
|
+
self._benchmark_execution["retry_base_seconds"]
|
|
591
|
+
),
|
|
592
|
+
retry_max_seconds=(
|
|
593
|
+
self._benchmark_execution["retry_max_seconds"]
|
|
594
|
+
),
|
|
595
|
+
)
|
|
596
|
+
except Exception as error:
|
|
597
|
+
return _SERVICE._runtime_error("benchmark", error)
|
|
598
|
+
if benchmark_tick is None:
|
|
599
|
+
return service_tick
|
|
600
|
+
return _SERVICE._outcome(
|
|
601
|
+
"benchmark",
|
|
602
|
+
benchmark_tick.status,
|
|
603
|
+
job_id=getattr(benchmark_tick, "work_id", None),
|
|
604
|
+
target_locale=getattr(benchmark_tick, "target_locale", None),
|
|
605
|
+
attempt=getattr(benchmark_tick, "attempt", None),
|
|
606
|
+
error_code=getattr(benchmark_tick, "error_code", None),
|
|
607
|
+
)
|
|
608
|
+
|
|
609
|
+
self.supervisor = _SUPERVISOR.LocalizationServiceSupervisor(
|
|
610
|
+
supervisor_connection,
|
|
611
|
+
tick,
|
|
612
|
+
worker_id=supervisor_worker_id,
|
|
613
|
+
policy=supervisor_policy,
|
|
614
|
+
clock=self._clock,
|
|
615
|
+
token_factory=token_factory,
|
|
616
|
+
)
|
|
617
|
+
self.health_monitor = _HEALTH.LocalizationHealthMonitor(
|
|
618
|
+
self.bridge,
|
|
619
|
+
self.evidence_state,
|
|
620
|
+
self.supervisor,
|
|
621
|
+
supervisor_stale_after_seconds=supervisor_stale_after_seconds,
|
|
622
|
+
benchmark_store=self.benchmark_store,
|
|
623
|
+
benchmark_policy=benchmark_policy,
|
|
624
|
+
benchmark_campaign_id=benchmark_campaign_id,
|
|
625
|
+
benchmark_evidence_authority=benchmark_evidence_authority,
|
|
626
|
+
benchmark_stale_after_seconds=benchmark_stale_after_seconds,
|
|
627
|
+
benchmark_review_store=(
|
|
628
|
+
self.benchmark_runtime.review_store
|
|
629
|
+
if self.benchmark_runtime is not None else None
|
|
630
|
+
),
|
|
631
|
+
benchmark_reviewer_route_id=(
|
|
632
|
+
self.benchmark_runtime.reviewer_route_id
|
|
633
|
+
if self.benchmark_runtime is not None else None
|
|
634
|
+
),
|
|
635
|
+
benchmark_reference_queue=(
|
|
636
|
+
self.benchmark_runtime
|
|
637
|
+
if self.benchmark_runtime is not None
|
|
638
|
+
and "native_reference_queue" in getattr(
|
|
639
|
+
self.benchmark_runtime, "__dict__", {},
|
|
640
|
+
)
|
|
641
|
+
else None
|
|
642
|
+
),
|
|
643
|
+
)
|
|
644
|
+
self.health_http = None
|
|
645
|
+
if health_http_authenticator is not None:
|
|
646
|
+
self.health_http = (
|
|
647
|
+
_HEALTH_HTTP.WebsiteLocalizationHealthHTTPApplication(
|
|
648
|
+
lambda *, now: self.health(
|
|
649
|
+
provider_probe=health_provider_probe,
|
|
650
|
+
publisher_probe=health_publisher_probe,
|
|
651
|
+
now=now,
|
|
652
|
+
),
|
|
653
|
+
health_http_authenticator,
|
|
654
|
+
clock=self._clock,
|
|
655
|
+
)
|
|
656
|
+
)
|
|
657
|
+
|
|
658
|
+
def __repr__(self) -> str:
|
|
659
|
+
return f"<{type(self).__name__} schema={SCHEMA}>"
|
|
660
|
+
|
|
661
|
+
def run_once(self, *, now: float | int | None = None):
|
|
662
|
+
"""Run or safely skip one supervised service tick."""
|
|
663
|
+
return self.supervisor.run_once(now=now)
|
|
664
|
+
|
|
665
|
+
def run_forever(
|
|
666
|
+
self,
|
|
667
|
+
*,
|
|
668
|
+
stop_requested: Callable[[], bool],
|
|
669
|
+
sleeper: Callable[[float], Any] = time.sleep,
|
|
670
|
+
):
|
|
671
|
+
"""Run until the host requests a stop between service ticks."""
|
|
672
|
+
return self.supervisor.run_forever(
|
|
673
|
+
stop_requested=stop_requested,
|
|
674
|
+
sleeper=sleeper,
|
|
675
|
+
)
|
|
676
|
+
|
|
677
|
+
def health(
|
|
678
|
+
self,
|
|
679
|
+
*,
|
|
680
|
+
provider_probe: Any = None,
|
|
681
|
+
publisher_probe: Any = None,
|
|
682
|
+
now: float | int | None = None,
|
|
683
|
+
):
|
|
684
|
+
"""Return the existing content-free, read-only health report."""
|
|
685
|
+
checked_at = self._clock() if now is None else now
|
|
686
|
+
return self.health_monitor.check(
|
|
687
|
+
event_verifier=self._dependencies["event_verifier"],
|
|
688
|
+
approval_authority=self._dependencies["approval_authority"],
|
|
689
|
+
publication_authority=self._dependencies["publication_authority"],
|
|
690
|
+
provider_probe=provider_probe,
|
|
691
|
+
publisher_probe=publisher_probe,
|
|
692
|
+
now=checked_at,
|
|
693
|
+
)
|
|
694
|
+
|
|
695
|
+
def load_benchmark_report(
|
|
696
|
+
self, *, now: float | int | None = None,
|
|
697
|
+
) -> dict[str, Any]:
|
|
698
|
+
"""Return the stored, verified benchmark report without mutating it."""
|
|
699
|
+
if self.benchmark_store is None:
|
|
700
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.unavailable")
|
|
701
|
+
checked_at = self._clock() if now is None else now
|
|
702
|
+
try:
|
|
703
|
+
return self.benchmark_store.load_report(
|
|
704
|
+
self._benchmark_policy,
|
|
705
|
+
self._benchmark_campaign_id,
|
|
706
|
+
self._benchmark_evidence_authority,
|
|
707
|
+
now=checked_at,
|
|
708
|
+
)
|
|
709
|
+
except Exception as error:
|
|
710
|
+
code = getattr(error, "code", None)
|
|
711
|
+
if not isinstance(code, str) or re.fullmatch(
|
|
712
|
+
r"[a-z][a-z0-9_.-]{0,127}", code,
|
|
713
|
+
) is None:
|
|
714
|
+
code = "runtime.benchmark.report.invalid"
|
|
715
|
+
raise LocalizationRuntimeBlocked(code) from None
|
|
716
|
+
|
|
717
|
+
def benchmark_campaign_status(self) -> dict[str, Any]:
|
|
718
|
+
"""Return content-free progress for the configured benchmark campaign."""
|
|
719
|
+
if self.benchmark_store is None:
|
|
720
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.unavailable")
|
|
721
|
+
try:
|
|
722
|
+
return self.benchmark_store.status(
|
|
723
|
+
self._benchmark_policy,
|
|
724
|
+
self._benchmark_campaign_id,
|
|
725
|
+
)
|
|
726
|
+
except Exception as error:
|
|
727
|
+
code = getattr(error, "code", None)
|
|
728
|
+
if not isinstance(code, str) or re.fullmatch(
|
|
729
|
+
r"[a-z][a-z0-9_.-]{0,127}", code,
|
|
730
|
+
) is None:
|
|
731
|
+
code = "runtime.benchmark.status.invalid"
|
|
732
|
+
raise LocalizationRuntimeBlocked(code) from None
|
|
733
|
+
|
|
734
|
+
def claim_native_reference_work_order(
|
|
735
|
+
self,
|
|
736
|
+
editor_id: Any,
|
|
737
|
+
**options: Any,
|
|
738
|
+
):
|
|
739
|
+
"""Lease one exact benchmark source to a qualified native editor."""
|
|
740
|
+
if self.benchmark_runtime is None:
|
|
741
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.unavailable")
|
|
742
|
+
try:
|
|
743
|
+
return self.benchmark_runtime.claim_native_reference_work_order(
|
|
744
|
+
editor_id, **options,
|
|
745
|
+
)
|
|
746
|
+
except Exception as error:
|
|
747
|
+
code = getattr(error, "code", None)
|
|
748
|
+
if not isinstance(code, str) or re.fullmatch(
|
|
749
|
+
r"[a-z][a-z0-9_.-]{0,127}", code,
|
|
750
|
+
) is None:
|
|
751
|
+
code = "runtime.benchmark.reference_queue.invalid"
|
|
752
|
+
raise LocalizationRuntimeBlocked(code) from None
|
|
753
|
+
|
|
754
|
+
def renew_native_reference_work_order(self, lease: Any, **options: Any):
|
|
755
|
+
"""Renew one exact live native-editor lease."""
|
|
756
|
+
if self.benchmark_runtime is None:
|
|
757
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.unavailable")
|
|
758
|
+
try:
|
|
759
|
+
return self.benchmark_runtime.renew_native_reference_work_order(
|
|
760
|
+
lease, **options,
|
|
761
|
+
)
|
|
762
|
+
except Exception as error:
|
|
763
|
+
code = getattr(error, "code", None)
|
|
764
|
+
if not isinstance(code, str) or re.fullmatch(
|
|
765
|
+
r"[a-z][a-z0-9_.-]{0,127}", code,
|
|
766
|
+
) is None:
|
|
767
|
+
code = "runtime.benchmark.reference_queue.invalid"
|
|
768
|
+
raise LocalizationRuntimeBlocked(code) from None
|
|
769
|
+
|
|
770
|
+
def native_reference_lease_from_payload(
|
|
771
|
+
self, payload: Any, *, editor_id: Any, target_locale: Any,
|
|
772
|
+
):
|
|
773
|
+
"""Reconstruct one authenticated editor lease without trusting input."""
|
|
774
|
+
if self.benchmark_runtime is None:
|
|
775
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.unavailable")
|
|
776
|
+
try:
|
|
777
|
+
return self.benchmark_runtime.native_reference_lease_from_payload(
|
|
778
|
+
payload,
|
|
779
|
+
editor_id=editor_id,
|
|
780
|
+
target_locale=target_locale,
|
|
781
|
+
)
|
|
782
|
+
except Exception as error:
|
|
783
|
+
code = getattr(error, "code", None)
|
|
784
|
+
if not isinstance(code, str) or re.fullmatch(
|
|
785
|
+
r"[a-z][a-z0-9_.-]{0,127}", code,
|
|
786
|
+
) is None:
|
|
787
|
+
code = "runtime.benchmark.reference_queue.invalid"
|
|
788
|
+
raise LocalizationRuntimeBlocked(code) from None
|
|
789
|
+
|
|
790
|
+
def native_reference_http_request_replay(self, **options: Any):
|
|
791
|
+
"""Return one exact completed private mutation for safe HTTP retry."""
|
|
792
|
+
if self.benchmark_runtime is None:
|
|
793
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.unavailable")
|
|
794
|
+
try:
|
|
795
|
+
return self.benchmark_runtime.native_reference_http_request_replay(
|
|
796
|
+
**options,
|
|
797
|
+
)
|
|
798
|
+
except Exception as error:
|
|
799
|
+
code = getattr(error, "code", None)
|
|
800
|
+
if not isinstance(code, str) or re.fullmatch(
|
|
801
|
+
r"[a-z][a-z0-9_.-]{0,127}", code,
|
|
802
|
+
) is None:
|
|
803
|
+
code = "runtime.benchmark.reference_queue.invalid"
|
|
804
|
+
raise LocalizationRuntimeBlocked(code) from None
|
|
805
|
+
|
|
806
|
+
def accept_native_reference_submission(
|
|
807
|
+
self,
|
|
808
|
+
lease: Any,
|
|
809
|
+
submission: Any,
|
|
810
|
+
**options: Any,
|
|
811
|
+
):
|
|
812
|
+
"""Verify and persist one exact leased qualified-native submission."""
|
|
813
|
+
if self.benchmark_runtime is None:
|
|
814
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.unavailable")
|
|
815
|
+
try:
|
|
816
|
+
return self.benchmark_runtime.accept_leased_native_reference_submission(
|
|
817
|
+
lease, submission, **options,
|
|
818
|
+
)
|
|
819
|
+
except Exception as error:
|
|
820
|
+
code = getattr(error, "code", None)
|
|
821
|
+
if not isinstance(code, str) or re.fullmatch(
|
|
822
|
+
r"[a-z][a-z0-9_.-]{0,127}", code,
|
|
823
|
+
) is None:
|
|
824
|
+
code = "runtime.benchmark.reference_queue.invalid"
|
|
825
|
+
raise LocalizationRuntimeBlocked(code) from None
|
|
826
|
+
|
|
827
|
+
def native_reference_queue_status(self):
|
|
828
|
+
"""Return content-free editorial progress for the active benchmark."""
|
|
829
|
+
if self.benchmark_runtime is None:
|
|
830
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.unavailable")
|
|
831
|
+
try:
|
|
832
|
+
return self.benchmark_runtime.native_reference_queue_status()
|
|
833
|
+
except Exception as error:
|
|
834
|
+
code = getattr(error, "code", None)
|
|
835
|
+
if not isinstance(code, str) or re.fullmatch(
|
|
836
|
+
r"[a-z][a-z0-9_.-]{0,127}", code,
|
|
837
|
+
) is None:
|
|
838
|
+
code = "runtime.benchmark.reference_queue.invalid"
|
|
839
|
+
raise LocalizationRuntimeBlocked(code) from None
|
|
840
|
+
|
|
841
|
+
def native_reference_queue_health(
|
|
842
|
+
self,
|
|
843
|
+
*,
|
|
844
|
+
now: float | int | None = None,
|
|
845
|
+
stale_after_seconds: Any = 3600,
|
|
846
|
+
):
|
|
847
|
+
"""Return a read-only, content-free native-reference queue check."""
|
|
848
|
+
if self.benchmark_runtime is None:
|
|
849
|
+
raise LocalizationRuntimeBlocked("runtime.benchmark.unavailable")
|
|
850
|
+
checked_at = self._clock() if now is None else now
|
|
851
|
+
try:
|
|
852
|
+
return self.benchmark_runtime.native_reference_queue_health(
|
|
853
|
+
now=checked_at,
|
|
854
|
+
stale_after_seconds=stale_after_seconds,
|
|
855
|
+
)
|
|
856
|
+
except Exception as error:
|
|
857
|
+
code = getattr(error, "code", None)
|
|
858
|
+
if not isinstance(code, str) or re.fullmatch(
|
|
859
|
+
r"[a-z][a-z0-9_.-]{0,127}", code,
|
|
860
|
+
) is None:
|
|
861
|
+
code = "runtime.benchmark.reference_queue.invalid"
|
|
862
|
+
raise LocalizationRuntimeBlocked(code) from None
|