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
package/bin/update-notice.js
CHANGED
|
@@ -9,6 +9,7 @@ const { StringDecoder } = require('node:string_decoder');
|
|
|
9
9
|
const { types } = require('node:util');
|
|
10
10
|
|
|
11
11
|
const { tryAcquireUpdateLease } = require('./update-lease');
|
|
12
|
+
const { resolveUpdateLocale, updateText } = require('./update-copy');
|
|
12
13
|
|
|
13
14
|
const {
|
|
14
15
|
ensurePrivateDirectory,
|
|
@@ -22,7 +23,6 @@ const INSTALL_REGISTRY_URL = 'https://registry.npmjs.org/';
|
|
|
22
23
|
const FALLBACK_MANIFEST_URL = 'https://chat.blun.ai/blun-code-version.json';
|
|
23
24
|
const SNOOZE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
24
25
|
const REQUEST_TIMEOUT_MS = 2_500;
|
|
25
|
-
const UPDATE_SOURCE_RETRY_DELAYS_MS = Object.freeze([250, 750]);
|
|
26
26
|
const STATE_FILE = 'update-notice.json';
|
|
27
27
|
const UPDATE_SKIP_FILE = 'update-skip-version.json';
|
|
28
28
|
const PENDING_UPDATE_FILE = 'update-pending.json';
|
|
@@ -35,7 +35,6 @@ const UPDATE_SIGNAL_EXIT_CODES = Object.freeze({
|
|
|
35
35
|
SIGTERM: 143,
|
|
36
36
|
});
|
|
37
37
|
const INTERACTIVE_START_MODE_FLAGS = new Set([
|
|
38
|
-
'-c',
|
|
39
38
|
'-y',
|
|
40
39
|
'--auto',
|
|
41
40
|
'--auto-approve',
|
|
@@ -48,49 +47,19 @@ const SEMVER_PATTERN = new RegExp(
|
|
|
48
47
|
+ `(?:-(${SEMVER_IDENTIFIER}(?:\\.${SEMVER_IDENTIFIER})*))?`
|
|
49
48
|
+ '(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$',
|
|
50
49
|
);
|
|
51
|
-
const LEGACY_MANIFEST_KEYS = Object.freeze([
|
|
52
|
-
'install',
|
|
53
|
-
'latest',
|
|
54
|
-
'minSupported',
|
|
55
|
-
'name',
|
|
56
|
-
'notesUrl',
|
|
57
|
-
'releasedAt',
|
|
58
|
-
]);
|
|
59
|
-
const RELEASE_NOTES_MANIFEST_KEYS = Object.freeze([
|
|
60
|
-
'install',
|
|
61
|
-
'latest',
|
|
62
|
-
'minSupported',
|
|
63
|
-
'name',
|
|
64
|
-
'notesUrl',
|
|
65
|
-
'releaseNotes',
|
|
66
|
-
'releasedAt',
|
|
67
|
-
]);
|
|
68
50
|
const MANIFEST_KEYS = Object.freeze([
|
|
69
51
|
'install',
|
|
70
|
-
'integrity',
|
|
71
52
|
'latest',
|
|
72
53
|
'minSupported',
|
|
73
54
|
'name',
|
|
74
55
|
'notesUrl',
|
|
75
|
-
'releaseNotes',
|
|
76
56
|
'releasedAt',
|
|
77
57
|
]);
|
|
78
|
-
const RELEASE_NOTES_MAX_COUNT = 8;
|
|
79
|
-
const RELEASE_NOTE_MAX_BYTES = 240;
|
|
80
58
|
const ENDPOINT_LIMITS = new Map([
|
|
81
59
|
[REGISTRY_URL, 1024 * 1024],
|
|
82
60
|
[FALLBACK_MANIFEST_URL, 64 * 1024],
|
|
83
61
|
]);
|
|
84
62
|
|
|
85
|
-
function isInternalPackagePinned(packageRoot) {
|
|
86
|
-
try {
|
|
87
|
-
const manifest = JSON.parse(fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
|
|
88
|
-
return manifest?.blunUpdateChannel === 'internal';
|
|
89
|
-
} catch {
|
|
90
|
-
return false;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
63
|
function parseSemver(value) {
|
|
95
64
|
if (typeof value !== 'string' || value.length > 128) return undefined;
|
|
96
65
|
const match = SEMVER_PATTERN.exec(value);
|
|
@@ -210,7 +179,7 @@ function canonicalOfficialNotesUrl(value) {
|
|
|
210
179
|
|
|
211
180
|
function isIsoTimestamp(value) {
|
|
212
181
|
if (typeof value !== 'string') return false;
|
|
213
|
-
const match = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d{1,
|
|
182
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d{1,3})?Z$/.exec(value);
|
|
214
183
|
if (!match) {
|
|
215
184
|
return false;
|
|
216
185
|
}
|
|
@@ -225,35 +194,9 @@ function isIsoTimestamp(value) {
|
|
|
225
194
|
&& date.getUTCSeconds() === Number(match[6]);
|
|
226
195
|
}
|
|
227
196
|
|
|
228
|
-
function parseReleaseNotes(value) {
|
|
229
|
-
if (!Array.isArray(value) || value.length > RELEASE_NOTES_MAX_COUNT) return undefined;
|
|
230
|
-
const notes = [];
|
|
231
|
-
for (const note of value) {
|
|
232
|
-
if (!isBoundedText(note, RELEASE_NOTE_MAX_BYTES)) return undefined;
|
|
233
|
-
notes.push(note);
|
|
234
|
-
}
|
|
235
|
-
return Object.freeze(notes);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
function validIntegrity(value) {
|
|
239
|
-
if (typeof value !== 'string') return false;
|
|
240
|
-
const match = /^sha512-([A-Za-z0-9+/]+={0,2})$/u.exec(value);
|
|
241
|
-
if (!match) return false;
|
|
242
|
-
try {
|
|
243
|
-
return Buffer.from(match[1], 'base64').length === 64;
|
|
244
|
-
} catch {
|
|
245
|
-
return false;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
197
|
function parseFallbackManifest(value) {
|
|
250
|
-
const record = exactDataRecord(value, MANIFEST_KEYS)
|
|
251
|
-
|| exactDataRecord(value, RELEASE_NOTES_MANIFEST_KEYS)
|
|
252
|
-
|| exactDataRecord(value, LEGACY_MANIFEST_KEYS);
|
|
198
|
+
const record = exactDataRecord(value, MANIFEST_KEYS);
|
|
253
199
|
const notesUrl = record ? canonicalOfficialNotesUrl(record.notesUrl) : undefined;
|
|
254
|
-
const releaseNotes = record && Object.hasOwn(record, 'releaseNotes')
|
|
255
|
-
? parseReleaseNotes(record.releaseNotes)
|
|
256
|
-
: undefined;
|
|
257
200
|
if (!record
|
|
258
201
|
|| record.name !== PACKAGE_NAME
|
|
259
202
|
|| !parseSemver(record.latest)
|
|
@@ -261,8 +204,6 @@ function parseFallbackManifest(value) {
|
|
|
261
204
|
|| compareSemver(record.minSupported, record.latest) === 1
|
|
262
205
|
|| !isIsoTimestamp(record.releasedAt)
|
|
263
206
|
|| !notesUrl
|
|
264
|
-
|| (Object.hasOwn(record, 'integrity') && !validIntegrity(record.integrity))
|
|
265
|
-
|| (Object.hasOwn(record, 'releaseNotes') && releaseNotes === undefined)
|
|
266
207
|
|| !isBoundedText(record.install, 256)) {
|
|
267
208
|
return undefined;
|
|
268
209
|
}
|
|
@@ -272,8 +213,6 @@ function parseFallbackManifest(value) {
|
|
|
272
213
|
minSupported: record.minSupported,
|
|
273
214
|
releasedAt: record.releasedAt,
|
|
274
215
|
notesUrl,
|
|
275
|
-
...(Object.hasOwn(record, 'integrity') ? { integrity: record.integrity } : {}),
|
|
276
|
-
...(releaseNotes === undefined ? {} : { releaseNotes }),
|
|
277
216
|
install: record.install,
|
|
278
217
|
});
|
|
279
218
|
}
|
|
@@ -306,14 +245,7 @@ function resolveEffectiveRelease(currentVersion, registryTags, fallbackManifest)
|
|
|
306
245
|
if (compareSemver(version, currentVersion) <= 0) return undefined;
|
|
307
246
|
|
|
308
247
|
if (validFallback && compareSemver(validFallback.latest, version) === 0) {
|
|
309
|
-
return {
|
|
310
|
-
channel: 'stable',
|
|
311
|
-
version,
|
|
312
|
-
notesUrl: validFallback.notesUrl,
|
|
313
|
-
...(validFallback.releaseNotes === undefined
|
|
314
|
-
? {}
|
|
315
|
-
: { releaseNotes: validFallback.releaseNotes }),
|
|
316
|
-
};
|
|
248
|
+
return { channel: 'stable', version, notesUrl: validFallback.notesUrl };
|
|
317
249
|
}
|
|
318
250
|
return { channel: 'stable', version };
|
|
319
251
|
}
|
|
@@ -396,54 +328,10 @@ function requestTrustedJson(url, options = {}) {
|
|
|
396
328
|
});
|
|
397
329
|
}
|
|
398
330
|
|
|
399
|
-
function
|
|
400
|
-
const message = error instanceof Error ? error.message : String(error || '');
|
|
401
|
-
if (message === 'UPDATE_REQUEST_TIMEOUT') return true;
|
|
402
|
-
const statusMatch = /^UPDATE_HTTP_STATUS_(\d{3})$/u.exec(message);
|
|
403
|
-
if (statusMatch) {
|
|
404
|
-
const status = Number(statusMatch[1]);
|
|
405
|
-
return status === 408 || status === 425 || status === 429 || status >= 500;
|
|
406
|
-
}
|
|
407
|
-
return new Set([
|
|
408
|
-
'EAI_AGAIN',
|
|
409
|
-
'ECONNREFUSED',
|
|
410
|
-
'ECONNRESET',
|
|
411
|
-
'ENETDOWN',
|
|
412
|
-
'ENETUNREACH',
|
|
413
|
-
'ENOTFOUND',
|
|
414
|
-
'EPIPE',
|
|
415
|
-
'ETIMEDOUT',
|
|
416
|
-
]).has(error?.code);
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
function sleepForUpdateRetry(delayMs) {
|
|
420
|
-
return new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
async function requestTrustedJsonWithRetry(url, options = {}) {
|
|
424
|
-
const request = options.request || requestTrustedJson;
|
|
425
|
-
const sleep = options.sleep || sleepForUpdateRetry;
|
|
426
|
-
const configuredDelays = Array.isArray(options.retryDelaysMs)
|
|
427
|
-
? options.retryDelaysMs
|
|
428
|
-
: UPDATE_SOURCE_RETRY_DELAYS_MS;
|
|
429
|
-
const retryDelaysMs = configuredDelays
|
|
430
|
-
.slice(0, UPDATE_SOURCE_RETRY_DELAYS_MS.length)
|
|
431
|
-
.map((value) => (Number.isFinite(value) && value >= 0 ? Math.min(value, 2_000) : 0));
|
|
432
|
-
|
|
433
|
-
for (let attempt = 0; ; attempt += 1) {
|
|
434
|
-
try {
|
|
435
|
-
return await request(url, options);
|
|
436
|
-
} catch (error) {
|
|
437
|
-
if (attempt >= retryDelaysMs.length || !retryableUpdateSourceError(error)) throw error;
|
|
438
|
-
await sleep(retryDelaysMs[attempt]);
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
async function loadReleaseSources(options = {}) {
|
|
331
|
+
async function loadReleaseSources() {
|
|
444
332
|
const [registry, fallback] = await Promise.allSettled([
|
|
445
|
-
|
|
446
|
-
|
|
333
|
+
requestTrustedJson(REGISTRY_URL),
|
|
334
|
+
requestTrustedJson(FALLBACK_MANIFEST_URL),
|
|
447
335
|
]);
|
|
448
336
|
return {
|
|
449
337
|
registryDocument: registry.status === 'fulfilled' ? registry.value : undefined,
|
|
@@ -455,9 +343,8 @@ function statePath(blunDir) {
|
|
|
455
343
|
return path.join(blunDir, STATE_FILE);
|
|
456
344
|
}
|
|
457
345
|
|
|
458
|
-
function readSnoozeState(blunDir,
|
|
346
|
+
function readSnoozeState(blunDir, now = Date.now()) {
|
|
459
347
|
try {
|
|
460
|
-
if (!parseSemver(targetVersion)) return false;
|
|
461
348
|
const filePath = statePath(blunDir);
|
|
462
349
|
if (!fs.existsSync(filePath)) return false;
|
|
463
350
|
securePrivateFile(filePath);
|
|
@@ -465,13 +352,10 @@ function readSnoozeState(blunDir, targetVersion, now = Date.now()) {
|
|
|
465
352
|
if (!stat.isFile() || stat.isSymbolicLink() || stat.size > 1_024) return false;
|
|
466
353
|
const record = exactDataRecord(JSON.parse(fs.readFileSync(filePath, 'utf8')), [
|
|
467
354
|
'snoozedUntil',
|
|
468
|
-
'targetVersion',
|
|
469
355
|
'version',
|
|
470
356
|
]);
|
|
471
357
|
if (!record
|
|
472
|
-
|| record.version !==
|
|
473
|
-
|| record.targetVersion !== targetVersion
|
|
474
|
-
|| !parseSemver(record.targetVersion)
|
|
358
|
+
|| record.version !== 1
|
|
475
359
|
|| !Number.isSafeInteger(record.snoozedUntil)
|
|
476
360
|
|| record.snoozedUntil <= now
|
|
477
361
|
|| record.snoozedUntil > now + SNOOZE_MS) {
|
|
@@ -483,8 +367,7 @@ function readSnoozeState(blunDir, targetVersion, now = Date.now()) {
|
|
|
483
367
|
}
|
|
484
368
|
}
|
|
485
369
|
|
|
486
|
-
function writeSnoozeState(blunDir,
|
|
487
|
-
if (!parseSemver(targetVersion)) throw new Error('INVALID_UPDATE_VERSION');
|
|
370
|
+
function writeSnoozeState(blunDir, now = Date.now()) {
|
|
488
371
|
ensurePrivateDirectory(blunDir);
|
|
489
372
|
const filePath = statePath(blunDir);
|
|
490
373
|
const temporaryPath = path.join(
|
|
@@ -493,8 +376,7 @@ function writeSnoozeState(blunDir, targetVersion, now = Date.now()) {
|
|
|
493
376
|
);
|
|
494
377
|
try {
|
|
495
378
|
writePrivateFile(temporaryPath, `${JSON.stringify({
|
|
496
|
-
version:
|
|
497
|
-
targetVersion,
|
|
379
|
+
version: 1,
|
|
498
380
|
snoozedUntil: now + SNOOZE_MS,
|
|
499
381
|
})}\n`);
|
|
500
382
|
const handle = fs.openSync(temporaryPath, 'r+');
|
|
@@ -566,18 +448,56 @@ function pendingUpdatePath(blunDir) {
|
|
|
566
448
|
return path.join(blunDir, PENDING_UPDATE_FILE);
|
|
567
449
|
}
|
|
568
450
|
|
|
451
|
+
function readPendingUpdate(blunDir) {
|
|
452
|
+
try {
|
|
453
|
+
const filePath = pendingUpdatePath(blunDir);
|
|
454
|
+
if (!fs.existsSync(filePath)) return undefined;
|
|
455
|
+
securePrivateFile(filePath);
|
|
456
|
+
const stat = fs.lstatSync(filePath);
|
|
457
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.size > 1_024) return undefined;
|
|
458
|
+
const record = exactDataRecord(JSON.parse(fs.readFileSync(filePath, 'utf8')), [
|
|
459
|
+
'targetVersion',
|
|
460
|
+
'version',
|
|
461
|
+
]);
|
|
462
|
+
if (!record || record.version !== 1 || !parseSemver(record.targetVersion)) return undefined;
|
|
463
|
+
return record.targetVersion;
|
|
464
|
+
} catch {
|
|
465
|
+
return undefined;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
function writePendingUpdate(blunDir, targetVersion) {
|
|
470
|
+
if (!parseSemver(targetVersion)) throw new Error('INVALID_UPDATE_VERSION');
|
|
471
|
+
ensurePrivateDirectory(blunDir);
|
|
472
|
+
const filePath = pendingUpdatePath(blunDir);
|
|
473
|
+
const temporaryPath = path.join(
|
|
474
|
+
blunDir,
|
|
475
|
+
`.${PENDING_UPDATE_FILE}.${process.pid}.${randomUUID()}.tmp`,
|
|
476
|
+
);
|
|
477
|
+
try {
|
|
478
|
+
writePrivateFile(temporaryPath, `${JSON.stringify({
|
|
479
|
+
version: 1,
|
|
480
|
+
targetVersion,
|
|
481
|
+
})}\n`);
|
|
482
|
+
const handle = fs.openSync(temporaryPath, 'r+');
|
|
483
|
+
try {
|
|
484
|
+
fs.fsyncSync(handle);
|
|
485
|
+
} finally {
|
|
486
|
+
fs.closeSync(handle);
|
|
487
|
+
}
|
|
488
|
+
fs.renameSync(temporaryPath, filePath);
|
|
489
|
+
securePrivateFile(filePath);
|
|
490
|
+
} catch (error) {
|
|
491
|
+
fs.rmSync(temporaryPath, { force: true });
|
|
492
|
+
throw error;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
569
496
|
function clearPendingUpdate(blunDir) {
|
|
570
497
|
fs.rmSync(pendingUpdatePath(blunDir), { force: true });
|
|
571
498
|
}
|
|
572
499
|
|
|
573
|
-
function writeCoreInstallSuccess(
|
|
574
|
-
blunDir,
|
|
575
|
-
fromVersion,
|
|
576
|
-
version,
|
|
577
|
-
releaseNotes,
|
|
578
|
-
initiatedBy,
|
|
579
|
-
now = Date.now(),
|
|
580
|
-
) {
|
|
500
|
+
function writeCoreInstallSuccess(blunDir, fromVersion, version, now = Date.now()) {
|
|
581
501
|
if (!parseSemver(fromVersion) || !parseSemver(version)) {
|
|
582
502
|
throw new Error('INVALID_UPDATE_VERSION');
|
|
583
503
|
}
|
|
@@ -596,8 +516,6 @@ function writeCoreInstallSuccess(
|
|
|
596
516
|
lastSuccess: {
|
|
597
517
|
version,
|
|
598
518
|
fromVersion,
|
|
599
|
-
...(releaseNotes === undefined ? {} : { releaseNotes }),
|
|
600
|
-
initiatedBy,
|
|
601
519
|
installedAt: new Date(now).toISOString(),
|
|
602
520
|
notifiedAt: null,
|
|
603
521
|
},
|
|
@@ -630,64 +548,6 @@ function installCommandText(version) {
|
|
|
630
548
|
return `npm i -g ${PACKAGE_NAME}@${version}`;
|
|
631
549
|
}
|
|
632
550
|
|
|
633
|
-
function updateCopy(uiLocale) {
|
|
634
|
-
const german = String(uiLocale || '').toLowerCase().startsWith('de');
|
|
635
|
-
if (german) {
|
|
636
|
-
return {
|
|
637
|
-
available: (current, next) => `BLUN Code-Update verfügbar: ${current} -> ${next}`,
|
|
638
|
-
current: (version) => `Kein Update verfügbar. Installiert: ${version} · Aktuell: ${version}.`,
|
|
639
|
-
enter: 'Enter drücken, um fortzufahren',
|
|
640
|
-
failed: (code) => `Update fehlgeschlagen (Code ${code}).`,
|
|
641
|
-
invalidCurrentVersion: 'Die installierte Versionsnummer ist ungültig. Das Update wurde nicht gestartet.',
|
|
642
|
-
updateBusy: 'Update gesperrt. Beende laufende King-Sitzungen nach Abschluss ihrer Arbeit regulär und warte, bis andere Updates fertig sind. Bleibt die Sperre bestehen, muss ihr Zustand geprüft werden.',
|
|
643
|
-
leaseUnavailable: 'Die Updatesperre konnte nicht geprüft werden. Das Update wurde nicht gestartet.',
|
|
644
|
-
privateHomeUnavailable: 'Das private BLUN-Verzeichnis konnte nicht abgesichert werden. Das Update wurde nicht gestartet.',
|
|
645
|
-
installerUnavailable: 'Der geschützte Installer konnte nicht vorbereitet werden.',
|
|
646
|
-
install: (version) => `Jetzt aktualisieren (führt \`${installCommandText(version)}\` aus)`,
|
|
647
|
-
installFailed: (code) => `Update fehlgeschlagen (Code ${code}). Die vorhandene Version wird gestartet.`,
|
|
648
|
-
installed: 'Installation geprüft',
|
|
649
|
-
installedContinue: (current, next) => `Update ${current} -> ${next} erfolgreich installiert. Die letzte Sitzung wird mit der neuen Version fortgesetzt.`,
|
|
650
|
-
installedRestart: (current, next) => `Update ${current} -> ${next} erfolgreich installiert. Starte BLUN Code neu, um die neue Version zu verwenden.`,
|
|
651
|
-
installerReady: 'Installer bereit',
|
|
652
|
-
installing: 'Paket wird installiert',
|
|
653
|
-
invalidTarget: (version) => `Kein sicherer Update-Zielstand verfügbar. Installiert: ${version}.`,
|
|
654
|
-
nextRelease: 'Auf den nächsten Release warten',
|
|
655
|
-
notes: 'Versionshinweise',
|
|
656
|
-
skip: 'Überspringen',
|
|
657
|
-
startupNoticeFailed: (version) => `Update ${version} wurde installiert, aber die Startmeldung konnte nicht gespeichert werden.`,
|
|
658
|
-
updateChecked: 'Update geprüft',
|
|
659
|
-
verificationFailed: 'Das Update konnte nicht verifiziert werden.',
|
|
660
|
-
verificationRestart: 'Update konnte nicht verifiziert werden. Starte BLUN Code neu.',
|
|
661
|
-
};
|
|
662
|
-
}
|
|
663
|
-
return {
|
|
664
|
-
available: (current, next) => `BLUN Code update available: ${current} -> ${next}`,
|
|
665
|
-
current: (version) => `No update available. Installed: ${version} · Current: ${version}.`,
|
|
666
|
-
enter: 'Press Enter to continue',
|
|
667
|
-
failed: (code) => `Update failed (code ${code}).`,
|
|
668
|
-
invalidCurrentVersion: 'The installed version number is invalid. The update has not started.',
|
|
669
|
-
updateBusy: 'Update blocked. Finish and close running King sessions normally, and wait for other updates to finish. If it remains blocked, the lock state needs to be checked.',
|
|
670
|
-
leaseUnavailable: 'The update lock could not be checked. The update has not started.',
|
|
671
|
-
privateHomeUnavailable: 'The private BLUN directory could not be secured. The update has not started.',
|
|
672
|
-
installerUnavailable: 'The protected installer could not be prepared.',
|
|
673
|
-
install: (version) => `Update now (runs \`${installCommandText(version)}\`)`,
|
|
674
|
-
installFailed: (code) => `Update failed (code ${code}). The installed version will start.`,
|
|
675
|
-
installed: 'Installation verified',
|
|
676
|
-
installedContinue: (current, next) => `Update ${current} -> ${next} installed successfully. The last session will continue with the new version.`,
|
|
677
|
-
installedRestart: (current, next) => `Update ${current} -> ${next} installed successfully. Restart BLUN Code to use the new version.`,
|
|
678
|
-
installerReady: 'Installer ready',
|
|
679
|
-
installing: 'Installing package',
|
|
680
|
-
invalidTarget: (version) => `No safe update target is available. Installed: ${version}.`,
|
|
681
|
-
nextRelease: 'Wait for the next release',
|
|
682
|
-
notes: 'Release notes',
|
|
683
|
-
skip: 'Skip',
|
|
684
|
-
startupNoticeFailed: (version) => `Update ${version} was installed, but the startup notice could not be saved.`,
|
|
685
|
-
updateChecked: 'Update checked',
|
|
686
|
-
verificationFailed: 'The update could not be verified.',
|
|
687
|
-
verificationRestart: 'The update could not be verified. Restart BLUN Code.',
|
|
688
|
-
};
|
|
689
|
-
}
|
|
690
|
-
|
|
691
551
|
function createUpdateProgress(output) {
|
|
692
552
|
const enabled = output?.isTTY === true;
|
|
693
553
|
const phaseCount = 4;
|
|
@@ -713,14 +573,7 @@ function createUpdateProgress(output) {
|
|
|
713
573
|
return update;
|
|
714
574
|
}
|
|
715
575
|
|
|
716
|
-
function promptUpdateAction({
|
|
717
|
-
currentVersion,
|
|
718
|
-
release,
|
|
719
|
-
input,
|
|
720
|
-
output,
|
|
721
|
-
processRef = process,
|
|
722
|
-
uiLocale = 'en',
|
|
723
|
-
}) {
|
|
576
|
+
function promptUpdateAction({ currentVersion, release, input, output, locale = 'en', processRef = process }) {
|
|
724
577
|
return new Promise((resolve, reject) => {
|
|
725
578
|
let selected = 0;
|
|
726
579
|
let settled = false;
|
|
@@ -733,14 +586,13 @@ function promptUpdateAction({
|
|
|
733
586
|
const dim = '\u001B[2m';
|
|
734
587
|
const underline = '\u001B[4m';
|
|
735
588
|
const reset = '\u001B[0m';
|
|
736
|
-
const copy = updateCopy(uiLocale);
|
|
737
589
|
const actions = [
|
|
738
590
|
{
|
|
739
591
|
choice: 'install',
|
|
740
|
-
label:
|
|
592
|
+
label: updateText(locale, 'install', { command: installCommandText(release.version) }),
|
|
741
593
|
},
|
|
742
|
-
{ choice: 'skip-once', label:
|
|
743
|
-
{ choice: 'skip-version', label:
|
|
594
|
+
{ choice: 'skip-once', label: updateText(locale, 'skipOnce') },
|
|
595
|
+
{ choice: 'skip-version', label: updateText(locale, 'skipVersion') },
|
|
744
596
|
];
|
|
745
597
|
const signalHandlers = new Map();
|
|
746
598
|
|
|
@@ -750,7 +602,7 @@ function promptUpdateAction({
|
|
|
750
602
|
const line = `${selected === index ? '›' : ' '} ${index + 1}. ${actions[index].label}`;
|
|
751
603
|
output.write(`\r\u001B[2K${selected === index ? cyan : ''}${line}${selected === index ? reset : ''}\n`);
|
|
752
604
|
}
|
|
753
|
-
output.write(`\r\u001B[2K${dim}${
|
|
605
|
+
output.write(`\r\u001B[2K${dim}${updateText(locale, 'confirm')}${reset}\n`);
|
|
754
606
|
};
|
|
755
607
|
const cleanup = () => {
|
|
756
608
|
if (escapeTimer !== undefined) clearTimeout(escapeTimer);
|
|
@@ -905,9 +757,9 @@ function promptUpdateAction({
|
|
|
905
757
|
signalHandlers.set(signal, handler);
|
|
906
758
|
processRef.once(signal, handler);
|
|
907
759
|
}
|
|
908
|
-
output.write(`\n${
|
|
760
|
+
output.write(`\n${updateText(locale, 'available', { currentVersion, targetVersion: release.version })}\n`);
|
|
909
761
|
if (release.notesUrl) {
|
|
910
|
-
output.write(`${dim}${
|
|
762
|
+
output.write(`${dim}${updateText(locale, 'releaseNotes')}${reset} ${underline}${release.notesUrl}${reset}\n`);
|
|
911
763
|
}
|
|
912
764
|
output.write('\n');
|
|
913
765
|
cursorHidden = true;
|
|
@@ -1365,28 +1217,17 @@ function noReleaseReason(currentVersion, registryTags, fallbackManifest) {
|
|
|
1365
1217
|
return parseSemver(latest) || fallbackManifest ? 'current' : 'unavailable';
|
|
1366
1218
|
}
|
|
1367
1219
|
|
|
1368
|
-
function explicitNoTarget(stdout, reason, currentVersion,
|
|
1369
|
-
|
|
1370
|
-
stdout.write(reason === 'current'
|
|
1371
|
-
? `${copy.current(currentVersion)}\n`
|
|
1372
|
-
: `${copy.invalidTarget(currentVersion)}\n`);
|
|
1220
|
+
function explicitNoTarget(stdout, reason, currentVersion, locale) {
|
|
1221
|
+
stdout.write(`${updateText(locale, reason === 'current' ? 'noUpdate' : 'noTarget', { currentVersion })}\n`);
|
|
1373
1222
|
return { kind: 'current', reason };
|
|
1374
1223
|
}
|
|
1375
1224
|
|
|
1376
|
-
function explicitFailure(stderr, reason, exitCode,
|
|
1377
|
-
const copy = updateCopy(uiLocale);
|
|
1225
|
+
function explicitFailure(stderr, reason, exitCode, locale) {
|
|
1378
1226
|
const hasExitCode = Number.isInteger(exitCode) && exitCode !== 0;
|
|
1379
1227
|
if (hasExitCode) {
|
|
1380
|
-
stderr.write(`${
|
|
1228
|
+
stderr.write(`${updateText(locale, 'failedCode', { exitCode })}\n`);
|
|
1381
1229
|
} else {
|
|
1382
|
-
|
|
1383
|
-
['invalid_current_version', copy.invalidCurrentVersion],
|
|
1384
|
-
['update_in_progress', copy.updateBusy],
|
|
1385
|
-
['lease_unavailable', copy.leaseUnavailable],
|
|
1386
|
-
['private_home_unavailable', copy.privateHomeUnavailable],
|
|
1387
|
-
['installer_unavailable', copy.installerUnavailable],
|
|
1388
|
-
]);
|
|
1389
|
-
stderr.write(`${messages.get(reason) || copy.verificationFailed}\n`);
|
|
1230
|
+
stderr.write(`${updateText(locale, 'verifyFailed')}\n`);
|
|
1390
1231
|
}
|
|
1391
1232
|
return {
|
|
1392
1233
|
kind: 'failed',
|
|
@@ -1395,6 +1236,19 @@ function explicitFailure(stderr, reason, exitCode, uiLocale) {
|
|
|
1395
1236
|
};
|
|
1396
1237
|
}
|
|
1397
1238
|
|
|
1239
|
+
function queueExplicitUpdate(blunDir, release, stdout, stderr, locale) {
|
|
1240
|
+
try {
|
|
1241
|
+
ensurePrivateDirectory(blunDir);
|
|
1242
|
+
writePendingUpdate(blunDir, release.version);
|
|
1243
|
+
} catch {
|
|
1244
|
+
return explicitFailure(stderr, 'private_home_unavailable', undefined, locale);
|
|
1245
|
+
}
|
|
1246
|
+
stdout.write(
|
|
1247
|
+
`${updateText(locale, 'queued', { targetVersion: release.version })}\n`,
|
|
1248
|
+
);
|
|
1249
|
+
return { kind: 'queued', version: release.version };
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1398
1252
|
async function runUpdateFlow(options, explicitUpdate) {
|
|
1399
1253
|
const {
|
|
1400
1254
|
currentVersion,
|
|
@@ -1405,26 +1259,27 @@ async function runUpdateFlow(options, explicitUpdate) {
|
|
|
1405
1259
|
stderr,
|
|
1406
1260
|
blunDir,
|
|
1407
1261
|
} = options;
|
|
1408
|
-
const
|
|
1409
|
-
const copy = updateCopy(uiLocale);
|
|
1262
|
+
const locale = resolveUpdateLocale(options);
|
|
1410
1263
|
if (!explicitUpdate && !isInteractiveUpdateStart({ argv, env, stdin, stdout })) {
|
|
1411
1264
|
return { kind: 'continue', reason: 'not_interactive' };
|
|
1412
1265
|
}
|
|
1413
1266
|
if (!parseSemver(currentVersion)) {
|
|
1414
1267
|
return explicitUpdate
|
|
1415
|
-
? explicitFailure(stderr, 'invalid_current_version', undefined,
|
|
1268
|
+
? explicitFailure(stderr, 'invalid_current_version', undefined, locale)
|
|
1416
1269
|
: { kind: 'continue', reason: 'invalid_current_version' };
|
|
1417
1270
|
}
|
|
1418
1271
|
|
|
1272
|
+
let pendingVersion = readPendingUpdate(blunDir);
|
|
1273
|
+
if (pendingVersion !== undefined && compareSemver(currentVersion, pendingVersion) >= 0) {
|
|
1274
|
+
clearPendingUpdate(blunDir);
|
|
1275
|
+
pendingVersion = undefined;
|
|
1276
|
+
}
|
|
1419
1277
|
const now = (options.now || Date.now)();
|
|
1278
|
+
if (!explicitUpdate && pendingVersion === undefined && readSnoozeState(blunDir, now)) {
|
|
1279
|
+
return { kind: 'continue', reason: 'snoozed' };
|
|
1280
|
+
}
|
|
1420
1281
|
|
|
1421
1282
|
const packageRoot = path.resolve(options.packageRoot || path.resolve(__dirname, '..'));
|
|
1422
|
-
if (isInternalPackagePinned(packageRoot)) {
|
|
1423
|
-
if (explicitUpdate) explicitNoTarget(stdout, 'current', currentVersion, uiLocale);
|
|
1424
|
-
return explicitUpdate
|
|
1425
|
-
? { kind: 'current', reason: 'internal_channel' }
|
|
1426
|
-
: { kind: 'continue', reason: 'internal_channel' };
|
|
1427
|
-
}
|
|
1428
1283
|
let leaseResult;
|
|
1429
1284
|
const ownsNoticeLease = options.noticeLease === undefined;
|
|
1430
1285
|
if (ownsNoticeLease) {
|
|
@@ -1432,7 +1287,7 @@ async function runUpdateFlow(options, explicitUpdate) {
|
|
|
1432
1287
|
leaseResult = await (options.acquireLease || tryAcquireUpdateLease)({ packageRoot });
|
|
1433
1288
|
} catch {
|
|
1434
1289
|
return explicitUpdate
|
|
1435
|
-
? explicitFailure(stderr, 'lease_unavailable', undefined,
|
|
1290
|
+
? explicitFailure(stderr, 'lease_unavailable', undefined, locale)
|
|
1436
1291
|
: { kind: 'continue', reason: 'lease_unavailable' };
|
|
1437
1292
|
}
|
|
1438
1293
|
} else {
|
|
@@ -1444,7 +1299,7 @@ async function runUpdateFlow(options, explicitUpdate) {
|
|
|
1444
1299
|
stderr,
|
|
1445
1300
|
leaseResult?.reason === 'busy' ? 'update_in_progress' : 'lease_unavailable',
|
|
1446
1301
|
undefined,
|
|
1447
|
-
|
|
1302
|
+
locale,
|
|
1448
1303
|
);
|
|
1449
1304
|
}
|
|
1450
1305
|
return leaseResult?.reason === 'busy'
|
|
@@ -1455,12 +1310,17 @@ async function runUpdateFlow(options, explicitUpdate) {
|
|
|
1455
1310
|
let installerSession;
|
|
1456
1311
|
|
|
1457
1312
|
try {
|
|
1313
|
+
if (!explicitUpdate
|
|
1314
|
+
&& pendingVersion === undefined
|
|
1315
|
+
&& readSnoozeState(blunDir, (options.now || Date.now)())) {
|
|
1316
|
+
return { kind: 'continue', reason: 'snoozed' };
|
|
1317
|
+
}
|
|
1458
1318
|
let sources;
|
|
1459
1319
|
try {
|
|
1460
1320
|
sources = await (options.loadReleaseSources || loadReleaseSources)();
|
|
1461
1321
|
} catch {
|
|
1462
1322
|
return explicitUpdate
|
|
1463
|
-
? explicitNoTarget(stdout, 'unavailable', currentVersion,
|
|
1323
|
+
? explicitNoTarget(stdout, 'unavailable', currentVersion, locale)
|
|
1464
1324
|
: { kind: 'continue', reason: 'unavailable' };
|
|
1465
1325
|
}
|
|
1466
1326
|
const registryTags = parseRegistryDocument(sources?.registryDocument);
|
|
@@ -1469,51 +1329,47 @@ async function runUpdateFlow(options, explicitUpdate) {
|
|
|
1469
1329
|
if (!release) {
|
|
1470
1330
|
const reason = noReleaseReason(currentVersion, registryTags, fallbackManifest);
|
|
1471
1331
|
return explicitUpdate
|
|
1472
|
-
? explicitNoTarget(stdout, reason, currentVersion,
|
|
1332
|
+
? explicitNoTarget(stdout, reason, currentVersion, locale)
|
|
1473
1333
|
: { kind: 'continue', reason };
|
|
1474
1334
|
}
|
|
1475
|
-
|
|
1476
|
-
&& readSnoozeState(blunDir, release.version, now)) {
|
|
1477
|
-
return { kind: 'continue', reason: 'snoozed' };
|
|
1478
|
-
}
|
|
1335
|
+
const queuedForRelease = pendingVersion === release.version;
|
|
1479
1336
|
const initialInstallLease = await probeInstallLease(options, packageRoot);
|
|
1480
1337
|
if (initialInstallLease === 'busy') {
|
|
1481
1338
|
return explicitUpdate
|
|
1482
|
-
?
|
|
1339
|
+
? queueExplicitUpdate(blunDir, release, stdout, stderr, locale)
|
|
1483
1340
|
: { kind: 'update_in_progress' };
|
|
1484
1341
|
}
|
|
1485
1342
|
if (initialInstallLease !== 'clear') {
|
|
1486
1343
|
return explicitUpdate
|
|
1487
|
-
? explicitFailure(stderr, 'lease_unavailable', undefined,
|
|
1344
|
+
? explicitFailure(stderr, 'lease_unavailable', undefined, locale)
|
|
1488
1345
|
: { kind: 'continue', reason: 'lease_unavailable' };
|
|
1489
1346
|
}
|
|
1490
|
-
if (!explicitUpdate
|
|
1491
|
-
&& readSkippedVersion(blunDir) === release.version) {
|
|
1347
|
+
if (!explicitUpdate && !queuedForRelease && readSkippedVersion(blunDir) === release.version) {
|
|
1492
1348
|
return { kind: 'continue', reason: 'skipped_version' };
|
|
1493
1349
|
}
|
|
1494
|
-
if (explicitUpdate) {
|
|
1350
|
+
if (explicitUpdate || queuedForRelease) {
|
|
1495
1351
|
try {
|
|
1496
1352
|
ensurePrivateDirectory(blunDir);
|
|
1497
1353
|
} catch {
|
|
1498
|
-
return explicitFailure(stderr, 'private_home_unavailable', undefined,
|
|
1354
|
+
return explicitFailure(stderr, 'private_home_unavailable', undefined, locale);
|
|
1499
1355
|
}
|
|
1500
1356
|
}
|
|
1501
1357
|
try {
|
|
1502
1358
|
lease.assertOwned();
|
|
1503
1359
|
} catch {
|
|
1504
1360
|
return explicitUpdate
|
|
1505
|
-
? explicitFailure(stderr, 'update_in_progress', undefined,
|
|
1361
|
+
? explicitFailure(stderr, 'update_in_progress', undefined, locale)
|
|
1506
1362
|
: { kind: 'update_in_progress' };
|
|
1507
1363
|
}
|
|
1508
1364
|
const prePromptInstallLease = await probeInstallLease(options, packageRoot);
|
|
1509
1365
|
if (prePromptInstallLease === 'busy') {
|
|
1510
1366
|
return explicitUpdate
|
|
1511
|
-
?
|
|
1367
|
+
? queueExplicitUpdate(blunDir, release, stdout, stderr, locale)
|
|
1512
1368
|
: { kind: 'update_in_progress' };
|
|
1513
1369
|
}
|
|
1514
1370
|
if (prePromptInstallLease !== 'clear') {
|
|
1515
1371
|
return explicitUpdate
|
|
1516
|
-
? explicitFailure(stderr, 'lease_unavailable', undefined,
|
|
1372
|
+
? explicitFailure(stderr, 'lease_unavailable', undefined, locale)
|
|
1517
1373
|
: { kind: 'continue', reason: 'lease_unavailable' };
|
|
1518
1374
|
}
|
|
1519
1375
|
if (!options.installVersion) {
|
|
@@ -1523,7 +1379,7 @@ async function runUpdateFlow(options, explicitUpdate) {
|
|
|
1523
1379
|
);
|
|
1524
1380
|
if (!installerSession?.ready) {
|
|
1525
1381
|
if (explicitUpdate) {
|
|
1526
|
-
return explicitFailure(stderr, 'installer_unavailable', undefined,
|
|
1382
|
+
return explicitFailure(stderr, 'installer_unavailable', undefined, locale);
|
|
1527
1383
|
}
|
|
1528
1384
|
return installerSession?.reason === 'failed'
|
|
1529
1385
|
? { kind: 'continue', reason: 'installer_unavailable' }
|
|
@@ -1531,7 +1387,7 @@ async function runUpdateFlow(options, explicitUpdate) {
|
|
|
1531
1387
|
}
|
|
1532
1388
|
}
|
|
1533
1389
|
let action;
|
|
1534
|
-
if (explicitUpdate ||
|
|
1390
|
+
if (explicitUpdate || queuedForRelease) {
|
|
1535
1391
|
action = 'install';
|
|
1536
1392
|
} else {
|
|
1537
1393
|
try {
|
|
@@ -1540,17 +1396,14 @@ async function runUpdateFlow(options, explicitUpdate) {
|
|
|
1540
1396
|
release,
|
|
1541
1397
|
input: stdin,
|
|
1542
1398
|
output: stdout,
|
|
1543
|
-
|
|
1399
|
+
locale,
|
|
1544
1400
|
});
|
|
1545
1401
|
} catch {
|
|
1546
1402
|
return { kind: 'continue', reason: 'prompt_failed' };
|
|
1547
1403
|
}
|
|
1548
1404
|
}
|
|
1549
1405
|
if (action !== 'install') {
|
|
1550
|
-
if (installerSession?.ready)
|
|
1551
|
-
await installerSession.cancel();
|
|
1552
|
-
installerSession = undefined;
|
|
1553
|
-
}
|
|
1406
|
+
if (installerSession?.ready) await installerSession.cancel();
|
|
1554
1407
|
if (action === 'skip-once') {
|
|
1555
1408
|
return { kind: 'continue', reason: 'skipped_once' };
|
|
1556
1409
|
}
|
|
@@ -1563,7 +1416,7 @@ async function runUpdateFlow(options, explicitUpdate) {
|
|
|
1563
1416
|
return { kind: 'continue', reason: 'skipped_version' };
|
|
1564
1417
|
}
|
|
1565
1418
|
try {
|
|
1566
|
-
writeSnoozeState(blunDir,
|
|
1419
|
+
writeSnoozeState(blunDir, (options.now || Date.now)());
|
|
1567
1420
|
} catch {
|
|
1568
1421
|
// A failed preference write must not block the existing console.
|
|
1569
1422
|
}
|
|
@@ -1571,18 +1424,18 @@ async function runUpdateFlow(options, explicitUpdate) {
|
|
|
1571
1424
|
}
|
|
1572
1425
|
|
|
1573
1426
|
const updateProgress = createUpdateProgress(stdout);
|
|
1574
|
-
updateProgress(1,
|
|
1575
|
-
updateProgress(2,
|
|
1427
|
+
updateProgress(1, updateText(locale, 'progressChecked'));
|
|
1428
|
+
updateProgress(2, updateText(locale, 'installerReady'));
|
|
1576
1429
|
|
|
1577
1430
|
try {
|
|
1578
1431
|
lease.assertOwned();
|
|
1579
1432
|
} catch {
|
|
1580
1433
|
return explicitUpdate
|
|
1581
|
-
? explicitFailure(stderr, 'update_in_progress', undefined,
|
|
1434
|
+
? explicitFailure(stderr, 'update_in_progress', undefined, locale)
|
|
1582
1435
|
: { kind: 'update_in_progress' };
|
|
1583
1436
|
}
|
|
1584
1437
|
let installResult;
|
|
1585
|
-
updateProgress(3,
|
|
1438
|
+
updateProgress(3, updateText(locale, 'installing'));
|
|
1586
1439
|
try {
|
|
1587
1440
|
installResult = options.installVersion
|
|
1588
1441
|
? await options.installVersion(release.version)
|
|
@@ -1595,48 +1448,42 @@ async function runUpdateFlow(options, explicitUpdate) {
|
|
|
1595
1448
|
|| installResult?.unknownState === true) {
|
|
1596
1449
|
updateProgress.finish();
|
|
1597
1450
|
return explicitUpdate
|
|
1598
|
-
? explicitFailure(stderr, 'update_in_progress', undefined,
|
|
1451
|
+
? explicitFailure(stderr, 'update_in_progress', undefined, locale)
|
|
1599
1452
|
: { kind: 'update_in_progress' };
|
|
1600
1453
|
}
|
|
1601
1454
|
if (installResult?.code === 0 && installResult?.verified === true) {
|
|
1602
|
-
updateProgress(4,
|
|
1455
|
+
updateProgress(4, updateText(locale, 'installVerified'));
|
|
1603
1456
|
clearPendingUpdate(blunDir);
|
|
1604
1457
|
try {
|
|
1605
1458
|
writeCoreInstallSuccess(
|
|
1606
1459
|
blunDir,
|
|
1607
1460
|
currentVersion,
|
|
1608
1461
|
release.version,
|
|
1609
|
-
release.releaseNotes,
|
|
1610
|
-
explicitUpdate ? 'manual' : options.autoInstall === true ? 'startup_auto' : 'startup_prompt',
|
|
1611
1462
|
(options.now || Date.now)(),
|
|
1612
1463
|
);
|
|
1613
1464
|
} catch {
|
|
1614
|
-
stderr.write(
|
|
1465
|
+
stderr.write(
|
|
1466
|
+
`${updateText(locale, 'stateWarning', { targetVersion: release.version })}\n`,
|
|
1467
|
+
);
|
|
1615
1468
|
}
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
stdout.write(`${
|
|
1620
|
-
|
|
1621
|
-
: copy.installedRestart(currentVersion, release.version)}\n`);
|
|
1622
|
-
if (release.notesUrl) stdout.write(`${copy.notes}: ${release.notesUrl}\n`);
|
|
1623
|
-
return {
|
|
1624
|
-
kind: 'installed',
|
|
1625
|
-
version: release.version,
|
|
1626
|
-
};
|
|
1469
|
+
stdout.write(
|
|
1470
|
+
`${updateText(locale, 'success', { currentVersion, targetVersion: release.version })}\n`,
|
|
1471
|
+
);
|
|
1472
|
+
if (release.notesUrl) stdout.write(`${updateText(locale, 'releaseNotes')} ${release.notesUrl}\n`);
|
|
1473
|
+
return { kind: 'installed', version: release.version };
|
|
1627
1474
|
}
|
|
1628
1475
|
|
|
1629
1476
|
if (Number.isInteger(installResult?.code) && installResult.code !== 0) {
|
|
1630
1477
|
updateProgress.finish();
|
|
1631
1478
|
if (explicitUpdate) {
|
|
1632
|
-
return explicitFailure(stderr, 'install_failed', installResult.code,
|
|
1479
|
+
return explicitFailure(stderr, 'install_failed', installResult.code, locale);
|
|
1633
1480
|
}
|
|
1634
|
-
stderr.write(`${
|
|
1481
|
+
stderr.write(`${updateText(locale, 'failedContinue', { exitCode: installResult.code })}\n`);
|
|
1635
1482
|
return { kind: 'continue', reason: 'install_failed', exitCode: installResult.code };
|
|
1636
1483
|
}
|
|
1637
1484
|
updateProgress.finish();
|
|
1638
|
-
if (explicitUpdate) return explicitFailure(stderr, 'verification_failed', undefined,
|
|
1639
|
-
stderr.write(`${
|
|
1485
|
+
if (explicitUpdate) return explicitFailure(stderr, 'verification_failed', undefined, locale);
|
|
1486
|
+
stderr.write(`${updateText(locale, 'verifyRestart')}\n`);
|
|
1640
1487
|
return { kind: 'update_in_progress' };
|
|
1641
1488
|
} finally {
|
|
1642
1489
|
if (installerSession?.ready) {
|
|
@@ -1652,7 +1499,7 @@ async function runUpdateFlow(options, explicitUpdate) {
|
|
|
1652
1499
|
}
|
|
1653
1500
|
}
|
|
1654
1501
|
|
|
1655
|
-
|
|
1502
|
+
function runExplicitUpdate(options) {
|
|
1656
1503
|
return runUpdateFlow(options, true);
|
|
1657
1504
|
}
|
|
1658
1505
|
|
|
@@ -1668,7 +1515,6 @@ module.exports = {
|
|
|
1668
1515
|
compareSemver,
|
|
1669
1516
|
createInstallInvocation,
|
|
1670
1517
|
installPinnedVersion,
|
|
1671
|
-
isInternalPackagePinned,
|
|
1672
1518
|
preparePinnedInstaller,
|
|
1673
1519
|
isInteractiveUpdateStart,
|
|
1674
1520
|
loadReleaseSources,
|
|
@@ -1678,10 +1524,11 @@ module.exports = {
|
|
|
1678
1524
|
readSkippedVersion,
|
|
1679
1525
|
readSnoozeState,
|
|
1680
1526
|
requestTrustedJson,
|
|
1681
|
-
requestTrustedJsonWithRetry,
|
|
1682
1527
|
resolveEffectiveRelease,
|
|
1528
|
+
resolveUpdateLocale,
|
|
1683
1529
|
runExplicitUpdate,
|
|
1684
1530
|
runUpdateNotice,
|
|
1531
|
+
updateText,
|
|
1685
1532
|
writeSkippedVersion,
|
|
1686
1533
|
writeSnoozeState,
|
|
1687
1534
|
};
|