engineering-platform 2.3.76__tar.gz → 2.3.78__tar.gz
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.
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/PKG-INFO +1 -1
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/pyproject.toml +1 -1
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json +1 -1
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json +4 -4
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/dashboard.css +1 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/dashboard.js +291 -72
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/dashboard_locales.mjs +16 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/codex_observability.py +8 -2
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_executor.py +31 -12
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_host.py +2 -1
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_reporting.py +110 -40
- engineering_platform-2.3.78/src/engineering_platform/execution_timing.py +668 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/platform_version.py +1 -1
- engineering_platform-2.3.78/src/engineering_platform/provider_usage.py +894 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/server.py +308 -19
- engineering_platform-2.3.78/src/engineering_platform/telemetry_contract.py +346 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/templates/workspace-config.json +1 -1
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform.egg-info/PKG-INFO +1 -1
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform.egg-info/SOURCES.txt +1 -0
- engineering_platform-2.3.76/src/engineering_platform/execution_timing.py +0 -442
- engineering_platform-2.3.76/src/engineering_platform/provider_usage.py +0 -497
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/README.md +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/setup.cfg +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/__init__.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/__main__.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/agent_state.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/agent_trust.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/dashboard_status_store.mjs +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/dashboard_translation.mjs +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/operations-console/apple-touch-icon-dark.png +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/operations-console/apple-touch-icon-light.png +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/operations-console/icon-dark.png +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/operations-console/icon-light.png +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/operations-console/icon-transparent.png +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/operations-console/manifest.webmanifest +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/capability_preflight.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/capability_review.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/central_data_transfer.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/central_database.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/central_store_migration.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/codex_capacity.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/codex_chat.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/component_lock.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/component_logging.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/console_presentation.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/console_route_ownership.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/contracts/__init__.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/contracts/ep_consumer.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/contracts/models.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/contracts/projection.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/dashboard_browser_validation.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/dashboard_state.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/dashboard_supervisor.swift +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/dashboard_translation.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/dependabot_producer.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/development_profile.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/drift_diagnostics.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/emergency_recovery.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/engineering_memory.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/ep_consumer_credentials.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/evidence_projection.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_activity.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_context.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_errors.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_evidence.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_finalization.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_host_evidence.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_lease.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_lifecycle.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_models.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_readiness.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_repository.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_timeout_policy.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_transaction.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/external_producer_binding.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/file_inbox.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/forensic_attribution.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/forensic_attribution_v2.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/forensic_delta.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/golden_scenario.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/historical_dashboard_configuration.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/host_admin.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/host_preflight.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_relocation.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_activation.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_admission.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_backup.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_composition.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_executor.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_migration.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_operation.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_plan.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_preparation.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/investigation_ledger.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/legacy_inbox_migration.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/legacy_installation_adoption.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/lifecycle_worker.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/live_status.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/local_api.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/local_api_keychain.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/local_repository_binding.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/managed_autonomy.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/managed_codex_runtime.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/operational_installation.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/operational_installation_lock.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/operational_installation_record.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/owner_credential_recovery.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/parity_context.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/parity_lifecycle_dispatcher.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/platform_admin.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/platform_api.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/platform_bootstrap.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/platform_components.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/pr_check_repair.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/pr_evidence_backfill.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/producer.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/product_installation_readback.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/project_agent.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/project_agent_service.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/project_topology.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/prompt_history.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/provider_context.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/provider_context_benchmark.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/provider_context_scope.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/provider_interruption.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/provider_process_identity.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/provider_readiness.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/provider_recovery.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/providers.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/qualification.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/qualification_runtime.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/recommendation_handoff.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/reconciliation_adoption.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/release_operation.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/report_analysis.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/repository_attachment.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/repository_handoff.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/resources.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/reviewer_evidence.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/revision_binding.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/schemas/producer-readback-v1.2.schema.json +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/schemas/producer-readback-v1.schema.json +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/schemas/repository-attachment.schema.json +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/server_console_services.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/server_relay.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/server_service.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/status_model.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/status_reconciliation.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/storage.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/submission_cli.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/submission_intake.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/submission_service.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/system_installation_topology.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/system_server_service.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/telemetry.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/terminal_evidence_reconciliation.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/validation_identity.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/validation_profile.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/version_preparation_delivery.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/workspace_preflight.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/worktree_provenance.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/worktree_tooling.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform.egg-info/dependency_links.txt +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform.egg-info/entry_points.txt +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform.egg-info/top_level.txt +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/tests/test_adaptive_action_sizing_design.py +0 -0
- {engineering_platform-2.3.76 → engineering_platform-2.3.78}/tests/test_role_task_model_policy_design.py +0 -0
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"bootstrap_contract": "2026.12",
|
|
3
3
|
"checkpoint_format": 1,
|
|
4
|
-
"dashboard_version": "2.3.
|
|
4
|
+
"dashboard_version": "2.3.78",
|
|
5
5
|
"handoff_protocol": 1,
|
|
6
6
|
"memory_format": 2,
|
|
7
7
|
"minimum_codex_cli": "0.146.0",
|
|
8
8
|
"inbox_protocol": 1,
|
|
9
|
-
"platform_version": "2.3.
|
|
9
|
+
"platform_version": "2.3.78",
|
|
10
10
|
"report_format": 2,
|
|
11
|
-
"runner_version": "2.3.
|
|
11
|
+
"runner_version": "2.3.78",
|
|
12
12
|
"status_model": 1,
|
|
13
13
|
"storage_schema": 45,
|
|
14
|
-
"watcher_version": "2.3.
|
|
14
|
+
"watcher_version": "2.3.78"
|
|
15
15
|
}
|
|
@@ -1328,3 +1328,4 @@ button:where(:not(.theme-toggle,.section-state-toggle,.local-folder-link,.teleme
|
|
|
1328
1328
|
html[data-theme="light"] :is(.dashboard-status-banner--provider-auth_required .provider-readiness-banner__action,.configuration-provider-status__row[data-provider-state="AUTH_REQUIRED"] .configuration-provider-status__repair){
|
|
1329
1329
|
background-color:color-mix(in srgb,#b89025 14%,#fff)!important;
|
|
1330
1330
|
}
|
|
1331
|
+
.telemetry-note{color:var(--dashboard-muted,#b9b6c0);font-size:12px;line-height:1.45;margin:0 0 10px}.telemetry-run-detail{border-top:1px solid color-mix(in srgb,var(--category-color,#fb7185) 45%,transparent);display:grid;gap:16px;margin-top:16px;padding-top:16px}.telemetry-run-detail h4{color:var(--category-color,#fb7185);font-size:14px;margin:14px 0 8px}.telemetry-scope-switcher{display:flex;flex-wrap:wrap;gap:8px}.telemetry-scope-switcher button{background:var(--dashboard-expanded-content-surface,#24242d);border:1px solid color-mix(in srgb,var(--category-color,#fb7185) 72%,transparent);border-radius:7px;color:inherit;cursor:pointer;font:400 12px/1.2 system-ui;min-height:32px;padding:5px 9px}.telemetry-scope-switcher button:hover{background:color-mix(in srgb,var(--category-color,#fb7185) 14%,var(--dashboard-expanded-content-surface,#24242d));border-color:var(--category-color,#fb7185)}.telemetry-scope-switcher button[aria-selected="true"]{background:color-mix(in srgb,var(--category-color,#fb7185) 24%,var(--dashboard-expanded-content-surface,#24242d));border-color:var(--category-color,#fb7185);box-shadow:inset 3px 0 0 var(--category-color,#fb7185)}.telemetry-scope-switcher button:focus:not(:focus-visible){box-shadow:none!important;outline:0!important}.telemetry-scope-switcher button[aria-selected="true"]:focus:not(:focus-visible){box-shadow:inset 3px 0 0 var(--category-color,#fb7185)!important}.telemetry-timeline{display:grid;gap:5px;list-style:none;margin:0;padding:0}.telemetry-timeline li{border-left:2px solid color-mix(in srgb,var(--category-color,#fb7185) 60%,transparent);margin-left:calc(var(--timeline-depth,0) * 14px);padding:6px 8px;word-break:break-word}@media(max-width:620px){.telemetry-detail-modal__content .technical-grid{grid-template-columns:minmax(0,1fr)}.telemetry-scope-switcher{position:sticky;top:0;background:var(--dashboard-expanded-content-surface,#24242d);padding-block:6px;z-index:2}.telemetry-timeline li{margin-left:min(calc(var(--timeline-depth,0) * 9px),45px)}}
|
|
@@ -4337,6 +4337,7 @@ function renderLegacyExecutionTelemetry(rows) {
|
|
|
4337
4337
|
}
|
|
4338
4338
|
function telemetryDuration(seconds) {
|
|
4339
4339
|
if (typeof seconds !== "number" || seconds < 0) return "—";
|
|
4340
|
+
if (seconds > 0 && seconds < 1) return t("telemetry.less_than_one_second");
|
|
4340
4341
|
const minutes = Math.floor(seconds / 60),
|
|
4341
4342
|
remaining = Math.round(seconds % 60);
|
|
4342
4343
|
return (minutes ? minutes + " min " : "") + remaining + " sec";
|
|
@@ -4619,6 +4620,23 @@ function executionTelemetry(rows) {
|
|
|
4619
4620
|
}
|
|
4620
4621
|
let telemetryDetailTrigger = null, telemetryDetailPayload = null, telemetryDetailDate = null, telemetryDetailRequestId = 0;
|
|
4621
4622
|
function telemetryMs(value) { return typeof value === "number" && value >= 0 ? telemetryDuration(value / 1000) : t("format.unavailable"); }
|
|
4623
|
+
function telemetryNumber(value) {
|
|
4624
|
+
return typeof value === "number" && Number.isFinite(value)
|
|
4625
|
+
? locale.number(value, { maximumFractionDigits: 3 })
|
|
4626
|
+
: t("format.unavailable");
|
|
4627
|
+
}
|
|
4628
|
+
function telemetryCoverage(metric) {
|
|
4629
|
+
if (!metric || typeof metric !== "object") return t("format.unavailable");
|
|
4630
|
+
const state = t("telemetry.coverage." + String(metric.coverage || metric.state || "UNAVAILABLE").toLowerCase(), {}, metric.coverage || metric.state || "UNAVAILABLE");
|
|
4631
|
+
const observed = metric.observed_observations, expected = metric.expected_observations;
|
|
4632
|
+
return Number.isFinite(observed) && Number.isFinite(expected) ? `${state} (${observed}/${expected})` : state;
|
|
4633
|
+
}
|
|
4634
|
+
function telemetryMetricValue(metric) {
|
|
4635
|
+
if (!metric || typeof metric !== "object" || metric.value == null) {
|
|
4636
|
+
return metric?.missing_reason ? `${t("format.unavailable")} — ${metric.missing_reason}` : t("format.unavailable");
|
|
4637
|
+
}
|
|
4638
|
+
return `${telemetryNumber(metric.value)} · ${telemetryCoverage(metric)}`;
|
|
4639
|
+
}
|
|
4622
4640
|
function telemetryPercent(value) {
|
|
4623
4641
|
const percent = Number(value);
|
|
4624
4642
|
return Number.isFinite(percent)
|
|
@@ -4708,39 +4726,71 @@ function telemetryMarkdownTable(headings, rows) {
|
|
|
4708
4726
|
].join("\n");
|
|
4709
4727
|
}
|
|
4710
4728
|
function telemetryDetailMarkdown(detail, date) {
|
|
4711
|
-
const summary = detail?.summary || {}, phases = Array.isArray(detail?.phases) ? detail.phases : [];
|
|
4729
|
+
const summary = detail?.summary || {}, phases = Array.isArray(detail?.inclusive_phases) ? detail.inclusive_phases : Array.isArray(detail?.phases) ? detail.phases : [];
|
|
4730
|
+
const exclusive = Array.isArray(detail?.exclusive_distribution) ? detail.exclusive_distribution : [];
|
|
4712
4731
|
const runs = Array.isArray(detail?.runs) ? detail.runs : [], bottlenecks = detail?.bottlenecks || {};
|
|
4732
|
+
const usage = summary.usage || {};
|
|
4713
4733
|
const summaryRows = [
|
|
4714
4734
|
[t("telemetry.executions"), summary.executions ?? 0], [t("telemetry.complete"), summary.completed ?? 0],
|
|
4715
4735
|
[t("telemetry.blocked"), summary.blocked ?? 0], [t("telemetry.failed"), summary.failed ?? 0],
|
|
4716
|
-
[t("telemetry.
|
|
4717
|
-
[t("telemetry.
|
|
4718
|
-
[t("telemetry.
|
|
4719
|
-
[t("telemetry.
|
|
4720
|
-
[t("telemetry.provider"), telemetryMs(summary.provider_execution?.average_ms)],
|
|
4721
|
-
[t("telemetry.validation"), telemetryMs(summary.validation?.average_ms)],
|
|
4736
|
+
[t("telemetry.population"), `N=${summary.population ?? summary.executions ?? 0}`],
|
|
4737
|
+
[t("telemetry.elapsed"), telemetryMs(summary.total_wall_time?.average_ms)],
|
|
4738
|
+
[t("telemetry.provider_unique_coverage"), telemetryMs(summary.provider_unique_coverage?.average_ms)],
|
|
4739
|
+
[t("telemetry.provider_cumulative_process"), telemetryMs(summary.provider_cumulative_process?.average_ms)],
|
|
4722
4740
|
[t("telemetry.external_wait"), telemetryMs(summary.external_wait?.average_ms)],
|
|
4723
|
-
[t("telemetry.
|
|
4741
|
+
[t("telemetry.unassigned"), telemetryMs(summary.unassigned?.average_ms)],
|
|
4742
|
+
[t("telemetry.observed_input"), telemetryMetricValue(usage.input_tokens)],
|
|
4743
|
+
[t("telemetry.observed_output"), telemetryMetricValue(usage.output_tokens)],
|
|
4744
|
+
[t("telemetry.cache_ratio"), telemetryPercent(summary.cache_ratio_percent)],
|
|
4745
|
+
[t("telemetry.contract_version"), detail?.contract_version || t("format.unavailable")],
|
|
4724
4746
|
];
|
|
4725
4747
|
const phaseRows = phases.map((phase) => [telemetryLabel(phase.phase), telemetryMs(phase.average_ms), telemetryMs(phase.median_ms), telemetryMs(phase.total_ms), telemetryPercent(phase.share_percent), phase.runs]);
|
|
4748
|
+
const exclusiveRows = exclusive.map((row) => [telemetryLabel(row.category), telemetryMs(row.duration_ms), telemetryPercent(row.share_percent)]);
|
|
4726
4749
|
const runRows = runs.map((run) => [
|
|
4727
4750
|
run.run_id, run.started_at ? locale.dateTime(new Date(run.started_at)) : t("format.unavailable"), translate(run.status),
|
|
4728
|
-
telemetryMs(run.total_duration_ms), telemetryRunMetric(run.
|
|
4729
|
-
telemetryRunMetric(run.
|
|
4751
|
+
telemetryMs(run.total_duration_ms), telemetryRunMetric(run.provider_duration_ms, run.phase_telemetry),
|
|
4752
|
+
telemetryRunMetric(run.external_wait_ms, run.phase_telemetry), telemetryRunMetric(run.unassigned_ms, run.phase_telemetry),
|
|
4753
|
+
telemetryNumber(run.input_tokens), telemetryNumber(run.output_tokens), telemetryPercent(run.cache_ratio_percent),
|
|
4730
4754
|
run.largest_phase ? telemetryLabel(run.largest_phase) : telemetryRunMetric(null, run.phase_telemetry), run.producer_type,
|
|
4731
4755
|
run.repository, run.model,
|
|
4732
4756
|
]);
|
|
4733
4757
|
const bottleneckLines = [
|
|
4734
4758
|
`${t("telemetry.longest_average_phase")}: ${bottlenecks.longest_average_phase ? telemetryLabel(bottlenecks.longest_average_phase.phase) : t("format.unavailable")}`,
|
|
4735
4759
|
`${t("telemetry.largest_accumulated_phase")}: ${bottlenecks.largest_accumulated_phase ? telemetryLabel(bottlenecks.largest_accumulated_phase.phase) : t("format.unavailable")}`,
|
|
4760
|
+
`${t("telemetry.longest_individual_span")}: ${bottlenecks.longest_individual_span ? bottlenecks.longest_individual_span.label || telemetryLabel(bottlenecks.longest_individual_span.phase) : t("format.unavailable")}`,
|
|
4736
4761
|
...(Array.isArray(bottlenecks.top_time_consumers) ? bottlenecks.top_time_consumers.map((item) => `${telemetryLabel(item.phase)} — ${telemetryPercent(item.share_percent)}`) : []),
|
|
4737
4762
|
];
|
|
4763
|
+
const runDetails = [];
|
|
4764
|
+
for (const run of runs) {
|
|
4765
|
+
const snapshot = run.telemetry_snapshot || {}, attempt = snapshot.attempt || {}, chain = snapshot.chain || {};
|
|
4766
|
+
const invocations = Array.isArray(attempt.usage?.invocations) ? attempt.usage.invocations : [];
|
|
4767
|
+
runDetails.push(`## ${t("telemetry.scope_attempt")} — ${run.run_id}`, "",
|
|
4768
|
+
`${t("telemetry.measurement_coverage")}: ${attempt.timing?.coverage?.state || t("format.unavailable")}`, "",
|
|
4769
|
+
invocations.length ? telemetryMarkdownTable(
|
|
4770
|
+
[t("telemetry.phase"), t("telemetry.role"), t("telemetry.model"), t("telemetry.duration"), t("telemetry.input"), t("telemetry.cached_input"), t("telemetry.uncached_input"), t("telemetry.output"), t("telemetry.usage_coverage"), t("telemetry.invocation_id")],
|
|
4771
|
+
invocations.map((item) => [telemetryLabel(item.phase), item.role, `${item.model || t("format.unavailable")} (${item.model_provenance || t("format.unavailable")})`, telemetryMs(item.duration_ms), telemetryNumber(item.input_tokens), telemetryNumber(item.cached_input_tokens), telemetryNumber(item.uncached_input_tokens), telemetryNumber(item.output_tokens), item.usage_coverage, item.invocation_id]),
|
|
4772
|
+
) : t("format.unavailable"), "",
|
|
4773
|
+
`### ${t("telemetry.scope_chain")}`, "",
|
|
4774
|
+
telemetryMarkdownTable([t("table.details"), t("history.markdown_value")], [
|
|
4775
|
+
[t("telemetry.chain_coverage"), chain.coverage || t("format.unavailable")],
|
|
4776
|
+
[t("telemetry.chain_attempts"), chain.attempt_count ?? t("format.unavailable")],
|
|
4777
|
+
[t("telemetry.original_attempts"), chain.original_attempt_count ?? t("format.unavailable")],
|
|
4778
|
+
[t("telemetry.retries"), chain.retry_count ?? t("format.unavailable")],
|
|
4779
|
+
[t("telemetry.resumes"), chain.resume_count ?? t("format.unavailable")],
|
|
4780
|
+
[t("telemetry.chain_elapsed"), telemetryMs(chain.elapsed_ms)],
|
|
4781
|
+
[t("telemetry.chain_processing"), telemetryMs(chain.processing_time_ms)],
|
|
4782
|
+
[t("telemetry.inter_attempt_gaps"), telemetryMs(chain.inter_attempt_gap_ms)],
|
|
4783
|
+
[t("telemetry.outside_window"), chain.outside_selected_window_count ?? 0],
|
|
4784
|
+
]), "");
|
|
4785
|
+
}
|
|
4738
4786
|
return [
|
|
4739
4787
|
`# ${t("telemetry.detail_title", { date: telemetryDate(date) })}`, "", t("telemetry.detail_description"), "",
|
|
4740
4788
|
`## ${t("telemetry.summary")}`, "", telemetryMarkdownTable([t("table.details"), t("history.markdown_value")], summaryRows), "",
|
|
4741
|
-
`## ${t("telemetry.
|
|
4789
|
+
`## ${t("telemetry.inclusive_title")}`, "", t("telemetry.inclusive_help"), "", phaseRows.length ? telemetryMarkdownTable([t("telemetry.phase"), t("telemetry.average"), t("telemetry.median"), t("telemetry.accumulated"), t("telemetry.share"), t("telemetry.runs")], phaseRows) : t("telemetry.not_recorded"), "",
|
|
4790
|
+
`## ${t("telemetry.exclusive_title")}`, "", t("telemetry.exclusive_help"), "", exclusiveRows.length ? telemetryMarkdownTable([t("telemetry.category"), t("telemetry.duration"), t("telemetry.share")], exclusiveRows) : t("telemetry.not_recorded"), "",
|
|
4742
4791
|
`## ${t("telemetry.bottlenecks")}`, "", ...bottleneckLines.map((line) => `- ${line}`), "",
|
|
4743
|
-
`## ${t("telemetry.runs")}`, "", runRows.length ? telemetryMarkdownTable([t("telemetry.run_id"), t("telemetry.start_time"), t("telemetry.status"), t("telemetry.
|
|
4792
|
+
`## ${t("telemetry.runs")}`, "", runRows.length ? telemetryMarkdownTable([t("telemetry.run_id"), t("telemetry.start_time"), t("telemetry.status"), t("telemetry.duration"), t("telemetry.provider_unique_coverage"), t("telemetry.external_wait"), t("telemetry.unassigned"), t("telemetry.input"), t("telemetry.output"), t("telemetry.cache_ratio"), t("telemetry.largest_phase"), t("telemetry.producer_type"), t("telemetry.target_repository"), t("telemetry.model")], runRows) : t("format.unavailable"), "",
|
|
4793
|
+
...runDetails,
|
|
4744
4794
|
].join("\n");
|
|
4745
4795
|
}
|
|
4746
4796
|
function downloadTelemetryDetail(format) {
|
|
@@ -4790,77 +4840,190 @@ function openTelemetryDetail(date, trigger) {
|
|
|
4790
4840
|
})
|
|
4791
4841
|
.catch(() => { if (requestId === telemetryDetailRequestId) content.textContent = t("telemetry.details_unavailable"); });
|
|
4792
4842
|
}
|
|
4793
|
-
function
|
|
4794
|
-
|
|
4795
|
-
const
|
|
4796
|
-
|
|
4797
|
-
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
|
|
4801
|
-
|
|
4802
|
-
const
|
|
4803
|
-
|
|
4804
|
-
|
|
4805
|
-
|
|
4806
|
-
|
|
4807
|
-
|
|
4808
|
-
|
|
4809
|
-
|
|
4843
|
+
function telemetryTextField(label, value, title) {
|
|
4844
|
+
const field = document.createElement("div"); field.className = "field";
|
|
4845
|
+
const name = document.createElement("span"); name.className = "label"; name.textContent = label;
|
|
4846
|
+
const strong = document.createElement("strong"); strong.textContent = value == null ? t("format.unavailable") : String(value);
|
|
4847
|
+
if (title) { strong.title = title; strong.tabIndex = 0; }
|
|
4848
|
+
field.append(name, strong); return field;
|
|
4849
|
+
}
|
|
4850
|
+
function renderCanonicalRunDetail(run, host) {
|
|
4851
|
+
host.replaceChildren();
|
|
4852
|
+
const snapshot = run?.telemetry_snapshot || {}, attempt = snapshot.attempt || {}, chain = snapshot.chain || {};
|
|
4853
|
+
const timing = attempt.timing || {}, usage = attempt.usage || {}, invocations = Array.isArray(usage.invocations) ? usage.invocations : [];
|
|
4854
|
+
const attemptPanel = document.createElement("div"), chainPanel = document.createElement("div"), switcher = document.createElement("div");
|
|
4855
|
+
switcher.className = "telemetry-scope-switcher"; switcher.setAttribute("role", "tablist");
|
|
4856
|
+
const attemptButton = Object.assign(document.createElement("button"), { type: "button", textContent: t("telemetry.scope_attempt") });
|
|
4857
|
+
const chainButton = Object.assign(document.createElement("button"), { type: "button", textContent: t("telemetry.scope_chain") });
|
|
4858
|
+
attemptButton.setAttribute("role", "tab"); chainButton.setAttribute("role", "tab");
|
|
4859
|
+
const select = (showChain) => {
|
|
4860
|
+
attemptPanel.hidden = showChain; chainPanel.hidden = !showChain;
|
|
4861
|
+
attemptButton.setAttribute("aria-selected", String(!showChain)); chainButton.setAttribute("aria-selected", String(showChain));
|
|
4862
|
+
};
|
|
4863
|
+
attemptButton.addEventListener("click", () => select(false)); chainButton.addEventListener("click", () => select(true));
|
|
4864
|
+
switcher.append(attemptButton, chainButton); select(false); host.append(switcher);
|
|
4865
|
+
|
|
4866
|
+
const attemptGrid = document.createElement("div"); attemptGrid.className = "technical-grid";
|
|
4867
|
+
const metric = (name) => usage.metrics?.[name];
|
|
4868
|
+
attemptGrid.append(
|
|
4869
|
+
telemetryTextField(t("telemetry.duration"), telemetryMs(timing.total_wall_time_ms)),
|
|
4870
|
+
telemetryTextField(t("telemetry.provider_unique_coverage"), telemetryMs(timing.provider_unique_coverage_ms)),
|
|
4871
|
+
telemetryTextField(t("telemetry.provider_cumulative_process"), telemetryMs(timing.provider_cumulative_process_duration_ms)),
|
|
4872
|
+
telemetryTextField(t("telemetry.external_wait"), telemetryMs(timing.external_wait_time_ms)),
|
|
4873
|
+
telemetryTextField(t("telemetry.unassigned"), telemetryMs(timing.unassigned_time_ms)),
|
|
4874
|
+
telemetryTextField(t("telemetry.observed_input"), telemetryMetricValue(metric("input_tokens")), metric("input_tokens")?.missing_reason),
|
|
4875
|
+
telemetryTextField(t("telemetry.observed_output"), telemetryMetricValue(metric("output_tokens")), metric("output_tokens")?.missing_reason),
|
|
4876
|
+
telemetryTextField(t("telemetry.cache_ratio"), telemetryPercent(usage.cache_ratio_percent), telemetryCoverage(usage.cache_ratio_population)),
|
|
4877
|
+
telemetryTextField(t("telemetry.measurement_coverage"), timing.coverage?.state || t("format.unavailable"), timing.coverage?.reason),
|
|
4878
|
+
telemetryTextField(t("telemetry.technical_completion"), translate(run.status)),
|
|
4879
|
+
telemetryTextField(t("telemetry.qualification_status"), run.qualification_status || t("format.unavailable")),
|
|
4880
|
+
telemetryTextField(t("telemetry.autonomy_acceptance"), run.autonomy_acceptance || t("format.unavailable")),
|
|
4881
|
+
telemetryTextField(t("telemetry.producer_type"), run.producer_type || t("format.unavailable")),
|
|
4882
|
+
telemetryTextField(t("telemetry.target_repository"), run.repository || t("format.unavailable")),
|
|
4883
|
+
);
|
|
4884
|
+
attemptPanel.append(attemptGrid);
|
|
4885
|
+
|
|
4886
|
+
const timeline = Array.isArray(timing.timeline) ? timing.timeline : [];
|
|
4887
|
+
const timelineSection = document.createElement("section");
|
|
4888
|
+
timelineSection.append(Object.assign(document.createElement("h4"), { textContent: t("telemetry.timeline") }));
|
|
4889
|
+
if (timeline.length) {
|
|
4890
|
+
const byId = new Map(timeline.map((span) => [span.phase_id, span]));
|
|
4891
|
+
const depth = (span) => { let value = 0, parent = span.parent_phase_id, seen = new Set(); while (parent && byId.has(parent) && !seen.has(parent)) { seen.add(parent); value += 1; parent = byId.get(parent).parent_phase_id; } return value; };
|
|
4892
|
+
const list = document.createElement("ol"); list.className = "telemetry-timeline";
|
|
4893
|
+
timeline.forEach((span) => {
|
|
4894
|
+
const item = document.createElement("li"); item.style.setProperty("--timeline-depth", String(depth(span)));
|
|
4895
|
+
item.textContent = `${telemetryLabel(span.phase_name)} · ${telemetryMs(span.duration_ms)} · ${translate(span.outcome)}`;
|
|
4896
|
+
item.title = String(span.phase_id || ""); list.append(item);
|
|
4897
|
+
});
|
|
4898
|
+
timelineSection.append(list);
|
|
4899
|
+
if (timing.timeline_truncated) timelineSection.append(Object.assign(document.createElement("p"), { className: "telemetry-note", textContent: t("telemetry.timeline_truncated", { count: timing.timeline_limit }) }));
|
|
4900
|
+
} else timelineSection.append(Object.assign(document.createElement("p"), { textContent: t("telemetry.not_recorded") }));
|
|
4901
|
+
attemptPanel.append(timelineSection);
|
|
4902
|
+
|
|
4903
|
+
const invocationSection = document.createElement("section");
|
|
4904
|
+
invocationSection.append(Object.assign(document.createElement("h4"), { textContent: `${t("telemetry.invocations")} (${invocations.length})` }));
|
|
4905
|
+
if (invocations.length) {
|
|
4906
|
+
const columns = [
|
|
4907
|
+
["phase", "telemetry.phase"], ["role", "telemetry.role"], ["model", "telemetry.model"], ["duration_ms", "telemetry.duration", "desc"],
|
|
4908
|
+
["input_tokens", "telemetry.input", "desc"], ["cached_input_tokens", "telemetry.cached_input"], ["uncached_input_tokens", "telemetry.uncached_input"],
|
|
4909
|
+
["output_tokens", "telemetry.output"], ["usage_coverage", "telemetry.usage_coverage"], ["invocation_id", "telemetry.invocation_id"], ["retry_ordinal", "telemetry.retry_identity"],
|
|
4910
|
+
].map(([key, label, defaultDirection]) => ({ key, label, defaultDirection, value: (item) => key === "phase" ? telemetryLabel(item.phase) : Number.isFinite(Number(item[key])) ? Number(item[key]) : String(item[key] || "") }));
|
|
4911
|
+
const table = telemetryDetailSortableTable(columns, invocations, { key: "input_tokens", direction: "desc" }, (item, body) => {
|
|
4810
4912
|
const row = document.createElement("tr");
|
|
4811
|
-
|
|
4913
|
+
const model = item.model ? `${item.model} (${item.model_provenance || t("format.unavailable")})` : t("format.unavailable");
|
|
4914
|
+
[telemetryLabel(item.phase), item.role || t("format.unavailable"), model, telemetryMs(item.duration_ms), telemetryNumber(item.input_tokens), telemetryNumber(item.cached_input_tokens), telemetryNumber(item.uncached_input_tokens), telemetryNumber(item.output_tokens), item.usage_coverage || t("format.unavailable"), item.invocation_id || t("format.unavailable"), item.retry_ordinal ?? t("format.unavailable")]
|
|
4812
4915
|
.forEach((value) => row.append(Object.assign(document.createElement("td"), { textContent: String(value) })));
|
|
4813
4916
|
body.append(row);
|
|
4814
4917
|
});
|
|
4815
|
-
|
|
4816
|
-
|
|
4918
|
+
invocationSection.append(telemetryDetailTableScroll(table, t("telemetry.invocations")));
|
|
4919
|
+
} else invocationSection.append(Object.assign(document.createElement("p"), { textContent: t("telemetry.not_recorded") }));
|
|
4920
|
+
attemptPanel.append(invocationSection);
|
|
4921
|
+
|
|
4922
|
+
const chainGrid = document.createElement("div"); chainGrid.className = "technical-grid";
|
|
4923
|
+
chainGrid.append(
|
|
4924
|
+
telemetryTextField(t("telemetry.chain_coverage"), chain.coverage, Array.isArray(chain.reasons) ? chain.reasons.join("; ") : chain.reason),
|
|
4925
|
+
telemetryTextField(t("telemetry.chain_attempts"), chain.attempt_count),
|
|
4926
|
+
telemetryTextField(t("telemetry.original_attempts"), chain.original_attempt_count),
|
|
4927
|
+
telemetryTextField(t("telemetry.retries"), chain.retry_count),
|
|
4928
|
+
telemetryTextField(t("telemetry.resumes"), chain.resume_count),
|
|
4929
|
+
telemetryTextField(t("telemetry.chain_elapsed"), telemetryMs(chain.elapsed_ms)),
|
|
4930
|
+
telemetryTextField(t("telemetry.chain_processing"), telemetryMs(chain.processing_time_ms)),
|
|
4931
|
+
telemetryTextField(t("telemetry.inter_attempt_gaps"), telemetryMs(chain.inter_attempt_gap_ms)),
|
|
4932
|
+
telemetryTextField(t("telemetry.outside_window"), chain.outside_selected_window_count ?? 0),
|
|
4933
|
+
telemetryTextField(t("telemetry.mission_scope"), chain.mission_scope_label || t("format.unavailable")),
|
|
4934
|
+
);
|
|
4935
|
+
chainPanel.append(chainGrid);
|
|
4936
|
+
const chainRuns = Array.isArray(chain.runs) ? chain.runs : [];
|
|
4937
|
+
if (chainRuns.length) {
|
|
4938
|
+
const table = document.createElement("table"); table.className = "telemetry-table";
|
|
4939
|
+
const head = document.createElement("thead"), headRow = document.createElement("tr"), body = document.createElement("tbody");
|
|
4940
|
+
["telemetry.run_id", "telemetry.relation", "telemetry.status", "telemetry.start_time", "telemetry.invocations"].forEach((key) => headRow.append(Object.assign(document.createElement("th"), { scope: "col", textContent: t(key) })));
|
|
4941
|
+
for (const item of chainRuns) {
|
|
4942
|
+
const row = document.createElement("tr");
|
|
4943
|
+
[item.run_id, item.relation, translate(item.state), item.started_at ? locale.dateTime(new Date(item.started_at)) : t("format.unavailable"), item.provider_invocation_count]
|
|
4944
|
+
.forEach((value) => row.append(Object.assign(document.createElement("td"), { textContent: String(value ?? t("format.unavailable")) })));
|
|
4945
|
+
body.append(row);
|
|
4946
|
+
}
|
|
4947
|
+
head.append(headRow); table.append(head, body); chainPanel.append(telemetryDetailTableScroll(table, t("telemetry.scope_chain")));
|
|
4817
4948
|
}
|
|
4818
|
-
|
|
4819
|
-
|
|
4820
|
-
|
|
4949
|
+
host.append(attemptPanel, chainPanel);
|
|
4950
|
+
}
|
|
4951
|
+
function renderTelemetryDetail(detail, content) {
|
|
4952
|
+
content.replaceChildren(); const summary = detail?.summary || {}, usage = summary.usage || {};
|
|
4953
|
+
const metrics = document.createElement("section"); metrics.className = "telemetry-detail-metrics";
|
|
4954
|
+
metrics.append(Object.assign(document.createElement("h3"), { textContent: t("telemetry.summary") }));
|
|
4955
|
+
const grid = document.createElement("div"); grid.className = "technical-grid";
|
|
4956
|
+
grid.append(
|
|
4957
|
+
telemetryTextField(t("telemetry.population"), `N=${summary.population ?? summary.executions ?? 0}`),
|
|
4958
|
+
telemetryTextField(t("telemetry.elapsed"), telemetryMs(summary.total_wall_time?.average_ms)),
|
|
4959
|
+
telemetryTextField(t("telemetry.external_wait"), telemetryMs(summary.external_wait?.average_ms)),
|
|
4960
|
+
telemetryTextField(t("telemetry.provider_unique_coverage"), telemetryMs(summary.provider_unique_coverage?.average_ms)),
|
|
4961
|
+
telemetryTextField(t("telemetry.unassigned"), telemetryMs(summary.unassigned?.average_ms)),
|
|
4962
|
+
telemetryTextField(t("telemetry.observed_input"), telemetryMetricValue(usage.input_tokens), usage.input_tokens?.missing_reason),
|
|
4963
|
+
telemetryTextField(t("telemetry.observed_output"), telemetryMetricValue(usage.output_tokens), usage.output_tokens?.missing_reason),
|
|
4964
|
+
telemetryTextField(t("telemetry.cache_ratio"), telemetryPercent(summary.cache_ratio_percent)),
|
|
4965
|
+
);
|
|
4966
|
+
metrics.append(grid); content.append(metrics);
|
|
4967
|
+
|
|
4968
|
+
const addDistribution = (titleKey, helpKey, values, categoryKey, durationKey, columns) => {
|
|
4969
|
+
const section = document.createElement("section");
|
|
4970
|
+
section.append(Object.assign(document.createElement("h3"), { textContent: t(titleKey) }), Object.assign(document.createElement("p"), { className: "telemetry-note", textContent: t(helpKey) }));
|
|
4971
|
+
if (!values.length) section.append(Object.assign(document.createElement("p"), { textContent: t("telemetry.not_recorded") }));
|
|
4972
|
+
else {
|
|
4973
|
+
const columnKeys = durationKey === "total_ms"
|
|
4974
|
+
? [categoryKey, "average_ms", "median_ms", "total_ms", "share_percent", "runs"]
|
|
4975
|
+
: [categoryKey, "duration_ms", "share_percent"];
|
|
4976
|
+
const table = telemetryDetailSortableTable(columns.map((label, index) => ({
|
|
4977
|
+
key: columnKeys[index], label,
|
|
4978
|
+
value: (item) => index === 0 ? telemetryLabel(item[categoryKey]) : Number(item[columnKeys[index]]) || 0,
|
|
4979
|
+
})), values, { key: categoryKey, direction: "asc" }, (item, body) => {
|
|
4980
|
+
const row = document.createElement("tr"), category = telemetryLabel(item[categoryKey]);
|
|
4981
|
+
const rendered = durationKey === "total_ms"
|
|
4982
|
+
? [category, telemetryMs(item.average_ms), telemetryMs(item.median_ms), telemetryMs(item.total_ms), telemetryPercent(item.share_percent), item.runs]
|
|
4983
|
+
: [category, telemetryMs(item.duration_ms), telemetryPercent(item.share_percent)];
|
|
4984
|
+
rendered.forEach((value) => row.append(Object.assign(document.createElement("td"), { textContent: String(value) }))); body.append(row);
|
|
4985
|
+
});
|
|
4986
|
+
table.classList.add("telemetry-phase-table"); section.append(telemetryDetailTableScroll(table, t(titleKey)));
|
|
4987
|
+
}
|
|
4988
|
+
content.append(section);
|
|
4989
|
+
};
|
|
4990
|
+
addDistribution("telemetry.inclusive_title", "telemetry.inclusive_help", Array.isArray(detail?.inclusive_phases) ? detail.inclusive_phases : Array.isArray(detail?.phases) ? detail.phases : [], "phase", "total_ms", ["telemetry.phase", "telemetry.average", "telemetry.median", "telemetry.accumulated", "telemetry.share", "telemetry.runs"]);
|
|
4991
|
+
addDistribution("telemetry.exclusive_title", "telemetry.exclusive_help", Array.isArray(detail?.exclusive_distribution) ? detail.exclusive_distribution : [], "category", "duration_ms", ["telemetry.category", "telemetry.duration", "telemetry.share"]);
|
|
4992
|
+
|
|
4993
|
+
const bottlenecks = document.createElement("section"); bottlenecks.append(Object.assign(document.createElement("h3"), { textContent: t("telemetry.bottlenecks") }));
|
|
4821
4994
|
const fields = document.createElement("div"); fields.className = "technical-grid";
|
|
4822
|
-
|
|
4823
|
-
|
|
4995
|
+
const longest = detail?.bottlenecks?.longest_individual_span;
|
|
4996
|
+
fields.append(
|
|
4997
|
+
telemetryTextField(t("telemetry.longest_average_phase"), detail?.bottlenecks?.longest_average_phase ? telemetryLabel(detail.bottlenecks.longest_average_phase.phase) : t("format.unavailable")),
|
|
4998
|
+
telemetryTextField(t("telemetry.largest_accumulated_phase"), detail?.bottlenecks?.largest_accumulated_phase ? telemetryLabel(detail.bottlenecks.largest_accumulated_phase.phase) : t("format.unavailable")),
|
|
4999
|
+
telemetryTextField(t("telemetry.longest_individual_span"), longest ? `${longest.label || telemetryLabel(longest.phase)} · ${telemetryMs(longest.duration_ms)}` : t("format.unavailable")),
|
|
5000
|
+
);
|
|
5001
|
+
for (const [label, value] of Object.entries(detail?.bottlenecks?.shares || {})) fields.append(telemetryTextField(t("telemetry.share." + label), telemetryPercent(value)));
|
|
4824
5002
|
bottlenecks.append(fields);
|
|
4825
|
-
const
|
|
4826
|
-
const
|
|
5003
|
+
const top = Array.isArray(detail?.bottlenecks?.top_time_consumers) ? detail.bottlenecks.top_time_consumers : [];
|
|
5004
|
+
if (top.length) { const list = document.createElement("ol"); top.forEach((item) => list.append(Object.assign(document.createElement("li"), { textContent: `${telemetryLabel(item.phase)} — ${telemetryPercent(item.share_percent)}` }))); bottlenecks.append(list); }
|
|
5005
|
+
content.append(bottlenecks);
|
|
5006
|
+
|
|
5007
|
+
const runSection = document.createElement("section"), runs = Array.isArray(detail?.runs) ? detail.runs : [], runDetailHost = document.createElement("div");
|
|
5008
|
+
runDetailHost.className = "telemetry-run-detail";
|
|
4827
5009
|
runSection.append(Object.assign(document.createElement("h3"), { textContent: t("telemetry.runs") }));
|
|
4828
5010
|
const runColumns = [
|
|
4829
|
-
["run_id", "telemetry.run_id"], ["started_at", "telemetry.start_time", "desc"], ["status", "telemetry.status"],
|
|
4830
|
-
["
|
|
4831
|
-
["
|
|
4832
|
-
["
|
|
5011
|
+
["run_id", "telemetry.run_id"], ["started_at", "telemetry.start_time", "desc"], ["status", "telemetry.status"], ["total_duration_ms", "telemetry.duration"],
|
|
5012
|
+
["provider_duration_ms", "telemetry.provider_unique_coverage"], ["external_wait_ms", "telemetry.external_wait"], ["unassigned_ms", "telemetry.unassigned"],
|
|
5013
|
+
["input_tokens", "telemetry.input"], ["output_tokens", "telemetry.output"], ["cache_ratio_percent", "telemetry.cache_ratio"], ["largest_phase", "telemetry.largest_phase"],
|
|
5014
|
+
["model", "telemetry.model"],
|
|
4833
5015
|
].map(([key, label, defaultDirection]) => ({ key, label, defaultDirection, value: (run) => key === "largest_phase" ? telemetryLabel(run[key]) : key === "started_at" ? Date.parse(run[key]) || 0 : Number.isFinite(Number(run[key])) ? Number(run[key]) : String(run[key] || "") }));
|
|
4834
5016
|
const runTable = telemetryDetailSortableTable(runColumns, runs, { key: "started_at", direction: "desc" }, (run, runBody) => {
|
|
4835
|
-
const row = document.createElement("tr"), id = document.createElement("button");
|
|
4836
|
-
row.className = "telemetry-
|
|
4837
|
-
row.
|
|
4838
|
-
row.
|
|
4839
|
-
|
|
4840
|
-
id.
|
|
4841
|
-
id.className = "telemetry-run-link";
|
|
4842
|
-
id.textContent = run.run_id;
|
|
4843
|
-
const open = () => {
|
|
4844
|
-
runBody.querySelectorAll('.telemetry-row[data-selected="true"]')
|
|
4845
|
-
.forEach((candidate) => { candidate.dataset.selected = "false"; });
|
|
4846
|
-
row.dataset.selected = "true";
|
|
4847
|
-
openPromptHistoryDetail({ run_id: run.run_id, title: run.run_id });
|
|
4848
|
-
};
|
|
4849
|
-
row.addEventListener("click", open);
|
|
4850
|
-
row.addEventListener("keydown", (event) => {
|
|
4851
|
-
if (event.key === "Enter" || event.key === " ") { event.preventDefault(); open(); }
|
|
4852
|
-
});
|
|
4853
|
-
id.addEventListener("click", (event) => { event.stopPropagation(); open(); });
|
|
4854
|
-
const phaseTelemetry = run.phase_telemetry;
|
|
4855
|
-
const values = [id, run.started_at ? locale.dateTime(new Date(run.started_at)) : t("format.unavailable"), translate(run.status), telemetryMs(run.total_duration_ms), telemetryRunMetric(run.queue_wait_ms, phaseTelemetry), telemetryRunMetric(run.provider_duration_ms, phaseTelemetry), telemetryRunMetric(run.validation_duration_ms, phaseTelemetry), telemetryRunMetric(run.external_wait_ms, phaseTelemetry), run.largest_phase ? telemetryLabel(run.largest_phase) : (phaseTelemetry === "RECORDED" ? t("telemetry.not_executed") : t("telemetry.not_recorded_short")), run.producer_type || t("format.unavailable"), run.repository || t("format.unavailable"), run.model || t("format.unavailable")];
|
|
4856
|
-
values.forEach((value) => {
|
|
4857
|
-
const cell = document.createElement("td");
|
|
4858
|
-
if (value instanceof Element) cell.append(value); else cell.textContent = String(value);
|
|
4859
|
-
row.append(cell);
|
|
4860
|
-
});
|
|
5017
|
+
const row = document.createElement("tr"), id = document.createElement("button"); row.className = "telemetry-row"; row.tabIndex = 0; row.setAttribute("role", "button");
|
|
5018
|
+
row.setAttribute("aria-label", String(run.run_id || t("format.unavailable"))); id.type = "button"; id.className = "telemetry-run-link"; id.textContent = run.run_id;
|
|
5019
|
+
const selectRun = () => { runBody.querySelectorAll('.telemetry-row[data-selected="true"]').forEach((candidate) => { candidate.dataset.selected = "false"; }); row.dataset.selected = "true"; renderCanonicalRunDetail(run, runDetailHost); };
|
|
5020
|
+
row.addEventListener("click", selectRun); row.addEventListener("keydown", (event) => { if (event.key === "Enter" || event.key === " ") { event.preventDefault(); selectRun(); } });
|
|
5021
|
+
id.addEventListener("click", (event) => { event.stopPropagation(); selectRun(); openPromptHistoryDetail({ run_id: run.run_id, title: run.run_id }); });
|
|
5022
|
+
[id, run.started_at ? locale.dateTime(new Date(run.started_at)) : t("format.unavailable"), translate(run.status), telemetryMs(run.total_duration_ms), telemetryMs(run.provider_duration_ms), telemetryMs(run.external_wait_ms), telemetryMs(run.unassigned_ms), telemetryNumber(run.input_tokens), telemetryNumber(run.output_tokens), telemetryPercent(run.cache_ratio_percent), run.largest_phase ? telemetryLabel(run.largest_phase) : t("format.unavailable"), run.model || t("format.unavailable")].forEach((value) => { const cell = document.createElement("td"); if (value instanceof Element) cell.append(value); else cell.textContent = String(value); row.append(cell); });
|
|
4861
5023
|
runBody.append(row);
|
|
4862
5024
|
});
|
|
4863
|
-
runSection.append(telemetryDetailTableScroll(runTable, t("telemetry.runs"))); content.append(runSection);
|
|
5025
|
+
runSection.append(telemetryDetailTableScroll(runTable, t("telemetry.runs")), runDetailHost); content.append(runSection);
|
|
5026
|
+
if (runs.length) renderCanonicalRunDetail(runs[0], runDetailHost);
|
|
4864
5027
|
}
|
|
4865
5028
|
$("telemetryDetailClose").addEventListener("click", closeTelemetryDetail);
|
|
4866
5029
|
$("telemetryDetailDownloadMarkdown").addEventListener("click", () => downloadTelemetryDetail("markdown"));
|
|
@@ -6156,11 +6319,29 @@ function updateLocalePicker() {
|
|
|
6156
6319
|
option.setAttribute("aria-selected", String(selected));
|
|
6157
6320
|
});
|
|
6158
6321
|
}
|
|
6322
|
+
let lastOpenModalFocus = null;
|
|
6323
|
+
document.addEventListener("focusin", (event) => {
|
|
6324
|
+
if (event.target instanceof HTMLElement && event.target.closest("dialog[open]"))
|
|
6325
|
+
lastOpenModalFocus = event.target;
|
|
6326
|
+
});
|
|
6159
6327
|
function changeDashboardLocale(value) {
|
|
6160
|
-
const
|
|
6328
|
+
const active = document.activeElement;
|
|
6329
|
+
const priorModalFocus = lastOpenModalFocus instanceof HTMLElement
|
|
6330
|
+
&& lastOpenModalFocus.isConnected
|
|
6331
|
+
&& lastOpenModalFocus.closest("dialog[open]")
|
|
6332
|
+
? lastOpenModalFocus
|
|
6333
|
+
: null;
|
|
6334
|
+
const focused = active?.closest?.("dialog[open]") ? active : priorModalFocus || active;
|
|
6335
|
+
const scroll = { x: window.scrollX, y: window.scrollY };
|
|
6161
6336
|
const focusable = "button:not(:disabled), a[href], input:not(:disabled), select:not(:disabled), textarea:not(:disabled), summary, [tabindex='0']";
|
|
6162
6337
|
const focusedModal = focused?.closest("dialog[open]");
|
|
6163
6338
|
const focusedIndex = focusedModal ? [...focusedModal.querySelectorAll(focusable)].indexOf(focused) : -1;
|
|
6339
|
+
const focusedIdentity = focusedModal && focused instanceof HTMLElement ? {
|
|
6340
|
+
tag: focused.localName,
|
|
6341
|
+
testId: focused.getAttribute("data-testid"),
|
|
6342
|
+
name: focused.getAttribute("name"),
|
|
6343
|
+
classes: [...focused.classList],
|
|
6344
|
+
} : null;
|
|
6164
6345
|
const controls = [...document.querySelectorAll("input[id], textarea[id], select[id]")]
|
|
6165
6346
|
.filter((element) => element.id !== "dashboardLocale" && element.type !== "file")
|
|
6166
6347
|
.map((element) => ({ id: element.id, value: element.value, checked: element.checked }));
|
|
@@ -6211,8 +6392,17 @@ function changeDashboardLocale(value) {
|
|
|
6211
6392
|
if (focused?.isConnected) focused.focus({ preventScroll: true });
|
|
6212
6393
|
else {
|
|
6213
6394
|
// Rebuilt modal content needs an equivalent focus target, not the removed
|
|
6214
|
-
// node.
|
|
6395
|
+
// node. Prefer semantic control identity over DOM position so adding a
|
|
6396
|
+
// translated field cannot move keyboard focus to a different control.
|
|
6397
|
+
const semanticSelector = focusedIdentity?.testId
|
|
6398
|
+
? `[data-testid="${CSS.escape(focusedIdentity.testId)}"]`
|
|
6399
|
+
: focusedIdentity?.name
|
|
6400
|
+
? `${focusedIdentity.tag}[name="${CSS.escape(focusedIdentity.name)}"]`
|
|
6401
|
+
: focusedIdentity?.classes.length
|
|
6402
|
+
? `${focusedIdentity.tag}.${focusedIdentity.classes.map((value) => CSS.escape(value)).join(".")}`
|
|
6403
|
+
: null;
|
|
6215
6404
|
const replacement = (focused?.id && $(focused.id))
|
|
6405
|
+
|| (semanticSelector && focusedModal?.querySelector(semanticSelector))
|
|
6216
6406
|
|| (focusedIndex >= 0 && focusedModal?.querySelectorAll(focusable)[focusedIndex])
|
|
6217
6407
|
|| focusedModal?.querySelector(focusable);
|
|
6218
6408
|
replacement?.focus({ preventScroll: true });
|
|
@@ -8209,6 +8399,29 @@ function promptDetailReviewersSection(reviewers, { wide = true } = {}) {
|
|
|
8209
8399
|
);
|
|
8210
8400
|
return promptDetailCard(t("detail.specialist_reviews"), fields, wide, "prompt-detail-card--reviewers");
|
|
8211
8401
|
}
|
|
8402
|
+
function promptDetailAssuranceReviewsSection(reviews) {
|
|
8403
|
+
if (!reviews.length) return null;
|
|
8404
|
+
const fields = reviews.map((review) => {
|
|
8405
|
+
const findings = Array.isArray(review.findings) ? review.findings : [];
|
|
8406
|
+
const candidate = String(review.candidate_sha || "").trim();
|
|
8407
|
+
const lines = [
|
|
8408
|
+
assuranceStatusLabel(review.status || "UNRESOLVED"),
|
|
8409
|
+
candidate ? t("detail.candidate_sha") + ": " + candidate : null,
|
|
8410
|
+
...(findings.length
|
|
8411
|
+
? findings.map((finding) => String(finding?.observation || "").trim()).filter(Boolean)
|
|
8412
|
+
: [t("lifecycle.assurance_no_findings")]),
|
|
8413
|
+
].filter(Boolean);
|
|
8414
|
+
return detailField(
|
|
8415
|
+
reviewerLabel(review.reviewer, t("detail.specialist_review")),
|
|
8416
|
+
lines.join("\n"),
|
|
8417
|
+
true,
|
|
8418
|
+
);
|
|
8419
|
+
});
|
|
8420
|
+
return promptDetailCard(
|
|
8421
|
+
t("lifecycle.detail_assurance"), fields, true,
|
|
8422
|
+
"prompt-detail-card--assurance-reviews",
|
|
8423
|
+
);
|
|
8424
|
+
}
|
|
8212
8425
|
function promptDetailProviderReviewSections(usage, reviewers, commitTimeline) {
|
|
8213
8426
|
const usageCard = promptDetailUsageSection(usage);
|
|
8214
8427
|
const reviewerCard = promptDetailReviewersSection(reviewers, { wide: false });
|
|
@@ -8242,6 +8455,11 @@ function renderPromptHistoryDetail(payload) {
|
|
|
8242
8455
|
commitTimeline = payload?.commit_timeline || [],
|
|
8243
8456
|
evidence = Array.isArray(payload?.evidence) ? payload.evidence : [],
|
|
8244
8457
|
reviewers = Array.isArray(payload?.reviewers) ? payload.reviewers : [],
|
|
8458
|
+
assuranceReviews = Array.isArray(payload?.assurance_reviews)
|
|
8459
|
+
? payload.assurance_reviews
|
|
8460
|
+
: (Array.isArray(payload?.lifecycle?.steps)
|
|
8461
|
+
? payload.lifecycle.steps.find((step) => step?.id === "QUALITY_CONTROL_AGENT")?.assurance_reviews || []
|
|
8462
|
+
: []),
|
|
8245
8463
|
activity = history.execution_activity_summary,
|
|
8246
8464
|
recommendationHandoff = payload?.recommendation_handoff;
|
|
8247
8465
|
const [executionSummary, executionContext] = promptDetailExecutionSections(history);
|
|
@@ -8266,6 +8484,7 @@ function renderPromptHistoryDetail(payload) {
|
|
|
8266
8484
|
lifecycleFlow(payload?.lifecycle, { historical: true }),
|
|
8267
8485
|
statusReconciliationCard(payload?.lifecycle?.recovery),
|
|
8268
8486
|
promptDetailProviderReviewSections(usage, reviewers, commitTimeline),
|
|
8487
|
+
promptDetailAssuranceReviewsSection(assuranceReviews),
|
|
8269
8488
|
promptDetailRecommendationHandoff(recommendationHandoff),
|
|
8270
8489
|
].filter(Boolean),
|
|
8271
8490
|
);
|
|
@@ -4212,3 +4212,19 @@ Object.assign(DASHBOARD_MESSAGES.nl, {"translation.source_unavailable":"Originee
|
|
|
4212
4212
|
Object.assign(DASHBOARD_MESSAGES.de, {"translation.source_unavailable":"Originalnachweis wird angezeigt; die Übersetzung ist vorübergehend nicht verfügbar."});
|
|
4213
4213
|
Object.assign(DASHBOARD_MESSAGES.fr, {"translation.source_unavailable":"La preuve originale est affichée ; la traduction est temporairement indisponible."});
|
|
4214
4214
|
Object.assign(DASHBOARD_MESSAGES.es, {"translation.source_unavailable":"Se muestra la evidencia original; la traducción no está disponible temporalmente."});
|
|
4215
|
+
|
|
4216
|
+
Object.assign(DASHBOARD_MESSAGES.en, {
|
|
4217
|
+
"telemetry.less_than_one_second":"<1 sec","telemetry.population":"Measured population","telemetry.elapsed":"Elapsed time","telemetry.provider_unique_coverage":"Provider coverage in elapsed time","telemetry.provider_cumulative_process":"Cumulative provider process duration","telemetry.unassigned":"Unassigned time","telemetry.observed_input":"Observed input","telemetry.observed_output":"Observed output","telemetry.cache_ratio":"Cache ratio","telemetry.measurement_coverage":"Measurement coverage","telemetry.contract_version":"Calculation contract","telemetry.inclusive_title":"Inclusive phase workload","telemetry.inclusive_help":"Inclusive phase times may overlap and their shares are not additive.","telemetry.exclusive_title":"Exclusive elapsed-time distribution","telemetry.exclusive_help":"Non-overlapping partition of measured elapsed time; concurrent independent work is shown as parallel/overlap.","telemetry.category":"Category","telemetry.duration":"Duration","telemetry.longest_individual_span":"Longest individual span","telemetry.scope_attempt":"This attempt","telemetry.scope_chain":"Full execution chain","telemetry.chain_coverage":"Chain coverage","telemetry.chain_attempts":"Attempts in chain","telemetry.original_attempts":"Original attempts","telemetry.retries":"Retries","telemetry.resumes":"Resumes","telemetry.chain_elapsed":"Chain elapsed time","telemetry.chain_processing":"Measured processing time","telemetry.inter_attempt_gaps":"Gaps between attempts","telemetry.outside_window":"Related attempts outside selected date","telemetry.mission_scope":"Mission scope","telemetry.timeline":"Timing timeline","telemetry.timeline_truncated":"Timeline limited to {count} observations.","telemetry.invocations":"Provider invocations","telemetry.role":"Role","telemetry.cached_input":"Cached input","telemetry.uncached_input":"Uncached input","telemetry.usage_coverage":"Usage coverage","telemetry.invocation_id":"Invocation ID","telemetry.retry_identity":"Retry ordinal","telemetry.relation":"Relation","telemetry.technical_completion":"Technical completion","telemetry.qualification_status":"Qualification","telemetry.autonomy_acceptance":"Autonomy acceptance","telemetry.coverage.complete":"Complete","telemetry.coverage.partial":"Partial","telemetry.coverage.unavailable":"Unavailable","telemetry.coverage.conflict":"Conflicting","telemetry.phase.parallel_overlap":"Parallel / overlap","telemetry.phase.unassigned":"Unassigned"
|
|
4218
|
+
});
|
|
4219
|
+
Object.assign(DASHBOARD_MESSAGES.nl, {
|
|
4220
|
+
"telemetry.less_than_one_second":"<1 sec","telemetry.population":"Gemeten populatie","telemetry.elapsed":"Doorlooptijd","telemetry.provider_unique_coverage":"Providerdekking in doorlooptijd","telemetry.provider_cumulative_process":"Cumulatieve providerprocesduur","telemetry.unassigned":"Niet-toegewezen tijd","telemetry.observed_input":"Waargenomen input","telemetry.observed_output":"Waargenomen output","telemetry.cache_ratio":"Cacheratio","telemetry.measurement_coverage":"Meetdekking","telemetry.contract_version":"Rekencontract","telemetry.inclusive_title":"Inclusieve fasewerklast","telemetry.inclusive_help":"Inclusieve fasetijden mogen overlappen; de aandelen zijn niet optelbaar.","telemetry.exclusive_title":"Exclusieve doorlooptijdverdeling","telemetry.exclusive_help":"Niet-overlappende verdeling van de gemeten doorlooptijd; gelijktijdig onafhankelijk werk staat als parallel/overlap.","telemetry.category":"Categorie","telemetry.duration":"Duur","telemetry.longest_individual_span":"Langste individuele span","telemetry.scope_attempt":"Deze poging","telemetry.scope_chain":"Hele uitvoeringsketen","telemetry.chain_coverage":"Ketendekking","telemetry.chain_attempts":"Pogingen in keten","telemetry.original_attempts":"Oorspronkelijke pogingen","telemetry.retries":"Retries","telemetry.resumes":"Hervattingen","telemetry.chain_elapsed":"Doorlooptijd keten","telemetry.chain_processing":"Gemeten verwerkingstijd","telemetry.inter_attempt_gaps":"Gaten tussen pogingen","telemetry.outside_window":"Bijbehorende pogingen buiten gekozen datum","telemetry.mission_scope":"Missionscope","telemetry.timeline":"Tijdlijn","telemetry.timeline_truncated":"Tijdlijn begrensd op {count} observaties.","telemetry.invocations":"Providerinvocations","telemetry.role":"Rol","telemetry.cached_input":"Cached input","telemetry.uncached_input":"Uncached input","telemetry.usage_coverage":"Usagedekking","telemetry.invocation_id":"Invocation-ID","telemetry.retry_identity":"Retryvolgnummer","telemetry.relation":"Relatie","telemetry.technical_completion":"Technische completion","telemetry.qualification_status":"Kwalificatie","telemetry.autonomy_acceptance":"Autonomieacceptatie","telemetry.coverage.complete":"Volledig","telemetry.coverage.partial":"Gedeeltelijk","telemetry.coverage.unavailable":"Niet beschikbaar","telemetry.coverage.conflict":"Tegenstrijdig","telemetry.phase.parallel_overlap":"Parallel / overlap","telemetry.phase.unassigned":"Niet toegewezen"
|
|
4221
|
+
});
|
|
4222
|
+
Object.assign(DASHBOARD_MESSAGES.de, {
|
|
4223
|
+
"telemetry.less_than_one_second":"<1 Sek.","telemetry.population":"Gemessene Population","telemetry.elapsed":"Durchlaufzeit","telemetry.provider_unique_coverage":"Provider-Abdeckung in der Durchlaufzeit","telemetry.provider_cumulative_process":"Kumulierte Provider-Prozessdauer","telemetry.unassigned":"Nicht zugeordnete Zeit","telemetry.observed_input":"Beobachtete Eingabe","telemetry.observed_output":"Beobachtete Ausgabe","telemetry.cache_ratio":"Cache-Anteil","telemetry.measurement_coverage":"Messabdeckung","telemetry.contract_version":"Berechnungsvertrag","telemetry.inclusive_title":"Inklusive Phasenarbeitslast","telemetry.inclusive_help":"Inklusive Phasenzeiten können sich überschneiden; die Anteile sind nicht addierbar.","telemetry.exclusive_title":"Exklusive Durchlaufzeitverteilung","telemetry.exclusive_help":"Nicht überlappende Verteilung der gemessenen Durchlaufzeit; parallele unabhängige Arbeit erscheint als Parallel/Überlappung.","telemetry.category":"Kategorie","telemetry.duration":"Dauer","telemetry.longest_individual_span":"Längste einzelne Zeitspanne","telemetry.scope_attempt":"Dieser Versuch","telemetry.scope_chain":"Gesamte Ausführungskette","telemetry.chain_coverage":"Kettenabdeckung","telemetry.chain_attempts":"Versuche in der Kette","telemetry.original_attempts":"Ursprüngliche Versuche","telemetry.retries":"Wiederholungen","telemetry.resumes":"Fortsetzungen","telemetry.chain_elapsed":"Durchlaufzeit der Kette","telemetry.chain_processing":"Gemessene Verarbeitungszeit","telemetry.inter_attempt_gaps":"Lücken zwischen Versuchen","telemetry.outside_window":"Zugehörige Versuche außerhalb des Datums","telemetry.mission_scope":"Mission-Umfang","telemetry.timeline":"Zeitachse","telemetry.timeline_truncated":"Zeitachse auf {count} Beobachtungen begrenzt.","telemetry.invocations":"Provider-Aufrufe","telemetry.role":"Rolle","telemetry.cached_input":"Gecachte Eingabe","telemetry.uncached_input":"Nicht gecachte Eingabe","telemetry.usage_coverage":"Nutzungsabdeckung","telemetry.invocation_id":"Aufruf-ID","telemetry.retry_identity":"Wiederholungsnummer","telemetry.relation":"Beziehung","telemetry.technical_completion":"Technischer Abschluss","telemetry.qualification_status":"Qualifizierung","telemetry.autonomy_acceptance":"Autonomieabnahme","telemetry.coverage.complete":"Vollständig","telemetry.coverage.partial":"Teilweise","telemetry.coverage.unavailable":"Nicht verfügbar","telemetry.coverage.conflict":"Widersprüchlich","telemetry.phase.parallel_overlap":"Parallel / Überlappung","telemetry.phase.unassigned":"Nicht zugeordnet"
|
|
4224
|
+
});
|
|
4225
|
+
Object.assign(DASHBOARD_MESSAGES.fr, {
|
|
4226
|
+
"telemetry.less_than_one_second":"<1 s","telemetry.population":"Population mesurée","telemetry.elapsed":"Durée écoulée","telemetry.provider_unique_coverage":"Couverture fournisseur dans le temps écoulé","telemetry.provider_cumulative_process":"Durée cumulée du processus fournisseur","telemetry.unassigned":"Temps non attribué","telemetry.observed_input":"Entrée observée","telemetry.observed_output":"Sortie observée","telemetry.cache_ratio":"Taux de cache","telemetry.measurement_coverage":"Couverture de mesure","telemetry.contract_version":"Contrat de calcul","telemetry.inclusive_title":"Charge de phase inclusive","telemetry.inclusive_help":"Les durées inclusives peuvent se chevaucher ; leurs parts ne sont pas additives.","telemetry.exclusive_title":"Répartition exclusive du temps écoulé","telemetry.exclusive_help":"Répartition sans chevauchement du temps mesuré ; le travail indépendant simultané apparaît comme parallèle/chevauchement.","telemetry.category":"Catégorie","telemetry.duration":"Durée","telemetry.longest_individual_span":"Intervalle individuel le plus long","telemetry.scope_attempt":"Cette tentative","telemetry.scope_chain":"Chaîne d’exécution complète","telemetry.chain_coverage":"Couverture de la chaîne","telemetry.chain_attempts":"Tentatives dans la chaîne","telemetry.original_attempts":"Tentatives initiales","telemetry.retries":"Nouvelles tentatives","telemetry.resumes":"Reprises","telemetry.chain_elapsed":"Temps écoulé de la chaîne","telemetry.chain_processing":"Temps de traitement mesuré","telemetry.inter_attempt_gaps":"Intervalles entre tentatives","telemetry.outside_window":"Tentatives liées hors date sélectionnée","telemetry.mission_scope":"Périmètre de Mission","telemetry.timeline":"Chronologie","telemetry.timeline_truncated":"Chronologie limitée à {count} observations.","telemetry.invocations":"Invocations fournisseur","telemetry.role":"Rôle","telemetry.cached_input":"Entrée en cache","telemetry.uncached_input":"Entrée hors cache","telemetry.usage_coverage":"Couverture d’usage","telemetry.invocation_id":"ID d’invocation","telemetry.retry_identity":"Numéro de nouvelle tentative","telemetry.relation":"Relation","telemetry.technical_completion":"Achèvement technique","telemetry.qualification_status":"Qualification","telemetry.autonomy_acceptance":"Acceptation de l’autonomie","telemetry.coverage.complete":"Complète","telemetry.coverage.partial":"Partielle","telemetry.coverage.unavailable":"Indisponible","telemetry.coverage.conflict":"Contradictoire","telemetry.phase.parallel_overlap":"Parallèle / chevauchement","telemetry.phase.unassigned":"Non attribué"
|
|
4227
|
+
});
|
|
4228
|
+
Object.assign(DASHBOARD_MESSAGES.es, {
|
|
4229
|
+
"telemetry.less_than_one_second":"<1 s","telemetry.population":"Población medida","telemetry.elapsed":"Tiempo transcurrido","telemetry.provider_unique_coverage":"Cobertura del proveedor en el tiempo transcurrido","telemetry.provider_cumulative_process":"Duración acumulada del proceso proveedor","telemetry.unassigned":"Tiempo no asignado","telemetry.observed_input":"Entrada observada","telemetry.observed_output":"Salida observada","telemetry.cache_ratio":"Proporción de caché","telemetry.measurement_coverage":"Cobertura de medición","telemetry.contract_version":"Contrato de cálculo","telemetry.inclusive_title":"Carga de fase inclusiva","telemetry.inclusive_help":"Los tiempos inclusivos pueden solaparse; sus porcentajes no son aditivos.","telemetry.exclusive_title":"Distribución exclusiva del tiempo transcurrido","telemetry.exclusive_help":"Distribución sin solapamiento del tiempo medido; el trabajo independiente simultáneo aparece como paralelo/solapamiento.","telemetry.category":"Categoría","telemetry.duration":"Duración","telemetry.longest_individual_span":"Tramo individual más largo","telemetry.scope_attempt":"Este intento","telemetry.scope_chain":"Cadena de ejecución completa","telemetry.chain_coverage":"Cobertura de la cadena","telemetry.chain_attempts":"Intentos en la cadena","telemetry.original_attempts":"Intentos originales","telemetry.retries":"Reintentos","telemetry.resumes":"Reanudaciones","telemetry.chain_elapsed":"Tiempo transcurrido de la cadena","telemetry.chain_processing":"Tiempo de procesamiento medido","telemetry.inter_attempt_gaps":"Intervalos entre intentos","telemetry.outside_window":"Intentos relacionados fuera de la fecha","telemetry.mission_scope":"Ámbito de Mission","telemetry.timeline":"Cronología","telemetry.timeline_truncated":"Cronología limitada a {count} observaciones.","telemetry.invocations":"Invocaciones del proveedor","telemetry.role":"Rol","telemetry.cached_input":"Entrada en caché","telemetry.uncached_input":"Entrada sin caché","telemetry.usage_coverage":"Cobertura de uso","telemetry.invocation_id":"ID de invocación","telemetry.retry_identity":"Número de reintento","telemetry.relation":"Relación","telemetry.technical_completion":"Finalización técnica","telemetry.qualification_status":"Calificación","telemetry.autonomy_acceptance":"Aceptación de autonomía","telemetry.coverage.complete":"Completa","telemetry.coverage.partial":"Parcial","telemetry.coverage.unavailable":"No disponible","telemetry.coverage.conflict":"En conflicto","telemetry.phase.parallel_overlap":"Paralelo / solapamiento","telemetry.phase.unassigned":"No asignado"
|
|
4230
|
+
});
|