create-principles-disciple 1.146.4 → 1.146.6
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/_release/product-identity.json +1 -1
- package/package.json +3 -3
- package/release-manager/package.json +3 -3
- package/console/dist/ui/App.d.ts +0 -1
- package/console/dist/ui/App.js +0 -172
- package/console/dist/ui/api.d.ts +0 -611
- package/console/dist/ui/api.js +0 -1094
- package/console/dist/ui/components/auth/login-form.d.ts +0 -4
- package/console/dist/ui/components/auth/login-form.js +0 -142
- package/console/dist/ui/components/auth/splash-screen.d.ts +0 -9
- package/console/dist/ui/components/auth/splash-screen.js +0 -22
- package/console/dist/ui/components/error-boundary.d.ts +0 -15
- package/console/dist/ui/components/error-boundary.js +0 -30
- package/console/dist/ui/components/focus/daily-thought-card.d.ts +0 -1
- package/console/dist/ui/components/focus/daily-thought-card.js +0 -41
- package/console/dist/ui/components/language-switcher.d.ts +0 -2
- package/console/dist/ui/components/language-switcher.js +0 -17
- package/console/dist/ui/components/layout/app-sidebar.d.ts +0 -27
- package/console/dist/ui/components/layout/app-sidebar.js +0 -128
- package/console/dist/ui/components/layout/page-loading.d.ts +0 -13
- package/console/dist/ui/components/layout/page-loading.js +0 -14
- package/console/dist/ui/components/layout/page-shell.d.ts +0 -12
- package/console/dist/ui/components/layout/page-shell.js +0 -11
- package/console/dist/ui/components/layout/section-title.d.ts +0 -10
- package/console/dist/ui/components/layout/section-title.js +0 -9
- package/console/dist/ui/components/notifications/NotificationProvider.d.ts +0 -14
- package/console/dist/ui/components/notifications/NotificationProvider.js +0 -136
- package/console/dist/ui/components/notifications/favicon-badge.d.ts +0 -3
- package/console/dist/ui/components/notifications/favicon-badge.js +0 -68
- package/console/dist/ui/components/notifications/notification-reducer.d.ts +0 -9
- package/console/dist/ui/components/notifications/notification-reducer.js +0 -9
- package/console/dist/ui/components/notifications/sound-storage.d.ts +0 -3
- package/console/dist/ui/components/notifications/sound-storage.js +0 -37
- package/console/dist/ui/components/notifications/useNotifications.d.ts +0 -1
- package/console/dist/ui/components/notifications/useNotifications.js +0 -9
- package/console/dist/ui/components/onboarding/CircuitDiagram.d.ts +0 -8
- package/console/dist/ui/components/onboarding/CircuitDiagram.js +0 -18
- package/console/dist/ui/components/onboarding/DemoResultView.d.ts +0 -22
- package/console/dist/ui/components/onboarding/DemoResultView.js +0 -33
- package/console/dist/ui/components/onboarding/SlashCommandsCard.d.ts +0 -16
- package/console/dist/ui/components/onboarding/SlashCommandsCard.js +0 -20
- package/console/dist/ui/components/onboarding/slashCommands.d.ts +0 -20
- package/console/dist/ui/components/onboarding/slashCommands.js +0 -22
- package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.d.ts +0 -6
- package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.js +0 -66
- package/console/dist/ui/components/theme-provider.d.ts +0 -14
- package/console/dist/ui/components/theme-provider.js +0 -40
- package/console/dist/ui/components/theme-toggle.d.ts +0 -2
- package/console/dist/ui/components/theme-toggle.js +0 -11
- package/console/dist/ui/components/ui/alert-dialog.d.ts +0 -20
- package/console/dist/ui/components/ui/alert-dialog.js +0 -26
- package/console/dist/ui/components/ui/badge.d.ts +0 -9
- package/console/dist/ui/components/ui/badge.js +0 -22
- package/console/dist/ui/components/ui/button.d.ts +0 -11
- package/console/dist/ui/components/ui/button.js +0 -34
- package/console/dist/ui/components/ui/card.d.ts +0 -8
- package/console/dist/ui/components/ui/card.js +0 -16
- package/console/dist/ui/components/ui/charts.d.ts +0 -51
- package/console/dist/ui/components/ui/charts.js +0 -72
- package/console/dist/ui/components/ui/dialog.d.ts +0 -19
- package/console/dist/ui/components/ui/dialog.js +0 -22
- package/console/dist/ui/components/ui/input.d.ts +0 -3
- package/console/dist/ui/components/ui/input.js +0 -8
- package/console/dist/ui/components/ui/markdown.d.ts +0 -24
- package/console/dist/ui/components/ui/markdown.js +0 -119
- package/console/dist/ui/components/ui/progress-bar.d.ts +0 -20
- package/console/dist/ui/components/ui/progress-bar.js +0 -38
- package/console/dist/ui/components/ui/select.d.ts +0 -13
- package/console/dist/ui/components/ui/select.js +0 -26
- package/console/dist/ui/components/ui/separator.d.ts +0 -3
- package/console/dist/ui/components/ui/separator.js +0 -6
- package/console/dist/ui/components/ui/sheet.d.ts +0 -25
- package/console/dist/ui/components/ui/sheet.js +0 -37
- package/console/dist/ui/components/ui/shiny-text.d.ts +0 -28
- package/console/dist/ui/components/ui/shiny-text.js +0 -46
- package/console/dist/ui/components/ui/skeleton.d.ts +0 -3
- package/console/dist/ui/components/ui/skeleton.js +0 -6
- package/console/dist/ui/components/ui/sonner.d.ts +0 -3
- package/console/dist/ui/components/ui/sonner.js +0 -13
- package/console/dist/ui/components/ui/tooltip.d.ts +0 -7
- package/console/dist/ui/components/ui/tooltip.js +0 -10
- package/console/dist/ui/data/daily-thoughts.d.ts +0 -15
- package/console/dist/ui/data/daily-thoughts.js +0 -164
- package/console/dist/ui/hooks/useNotificationSound.d.ts +0 -12
- package/console/dist/ui/hooks/useNotificationSound.js +0 -74
- package/console/dist/ui/i18n/en.json +0 -2399
- package/console/dist/ui/i18n/index.d.ts +0 -2
- package/console/dist/ui/i18n/index.js +0 -32
- package/console/dist/ui/i18n/zh-CN.json +0 -2399
- package/console/dist/ui/main.d.ts +0 -1
- package/console/dist/ui/main.js +0 -9
- package/console/dist/ui/pages/ReportProblemValidators.d.ts +0 -144
- package/console/dist/ui/pages/ReportProblemValidators.js +0 -418
- package/console/dist/ui/pages/activation/ActivationPage.d.ts +0 -1
- package/console/dist/ui/pages/activation/ActivationPage.js +0 -512
- package/console/dist/ui/pages/activation/ActivationValidators.d.ts +0 -20
- package/console/dist/ui/pages/activation/ActivationValidators.js +0 -160
- package/console/dist/ui/pages/control-center/AgentCard.d.ts +0 -31
- package/console/dist/ui/pages/control-center/AgentCard.js +0 -212
- package/console/dist/ui/pages/control-center/AgentGroup.d.ts +0 -26
- package/console/dist/ui/pages/control-center/AgentGroup.js +0 -38
- package/console/dist/ui/pages/control-center/ControlCenterPage.d.ts +0 -1
- package/console/dist/ui/pages/control-center/ControlCenterPage.js +0 -509
- package/console/dist/ui/pages/control-center/DesignGatePanel.d.ts +0 -1
- package/console/dist/ui/pages/control-center/DesignGatePanel.js +0 -137
- package/console/dist/ui/pages/control-center/RuntimeProfileManager.d.ts +0 -31
- package/console/dist/ui/pages/control-center/RuntimeProfileManager.js +0 -199
- package/console/dist/ui/pages/control-center/WorkflowDiagram.d.ts +0 -17
- package/console/dist/ui/pages/control-center/WorkflowDiagram.js +0 -55
- package/console/dist/ui/pages/debt/DebtPage.d.ts +0 -2
- package/console/dist/ui/pages/debt/DebtPage.js +0 -222
- package/console/dist/ui/pages/design-system/DesignSystemPage.d.ts +0 -2
- package/console/dist/ui/pages/design-system/DesignSystemPage.js +0 -30
- package/console/dist/ui/pages/examiner/ExaminerPage.d.ts +0 -15
- package/console/dist/ui/pages/examiner/ExaminerPage.js +0 -158
- package/console/dist/ui/pages/failed-tasks/FailedTasksPage.d.ts +0 -1
- package/console/dist/ui/pages/failed-tasks/FailedTasksPage.js +0 -421
- package/console/dist/ui/pages/focus/ApprovalSubjectReading.d.ts +0 -24
- package/console/dist/ui/pages/focus/ApprovalSubjectReading.js +0 -133
- package/console/dist/ui/pages/focus/FocusPage.d.ts +0 -123
- package/console/dist/ui/pages/focus/FocusPage.js +0 -567
- package/console/dist/ui/pages/focus/OwnerDecisionCard.d.ts +0 -9
- package/console/dist/ui/pages/focus/OwnerDecisionCard.js +0 -111
- package/console/dist/ui/pages/focus/OwnerWorkbench.d.ts +0 -19
- package/console/dist/ui/pages/focus/OwnerWorkbench.js +0 -75
- package/console/dist/ui/pages/focus/RuleCandidateBindingPanel.d.ts +0 -34
- package/console/dist/ui/pages/focus/RuleCandidateBindingPanel.js +0 -298
- package/console/dist/ui/pages/focus/focus-validation.d.ts +0 -40
- package/console/dist/ui/pages/focus/focus-validation.js +0 -211
- package/console/dist/ui/pages/intent/IntentOnboarding.d.ts +0 -67
- package/console/dist/ui/pages/intent/IntentOnboarding.js +0 -289
- package/console/dist/ui/pages/intent/IntentPage.d.ts +0 -1
- package/console/dist/ui/pages/intent/IntentPage.js +0 -252
- package/console/dist/ui/pages/pain/PainEvidenceValidators.d.ts +0 -59
- package/console/dist/ui/pages/pain/PainEvidenceValidators.js +0 -125
- package/console/dist/ui/pages/pain/PainPage.d.ts +0 -1
- package/console/dist/ui/pages/pain/PainPage.js +0 -420
- package/console/dist/ui/pages/pain/pain-card-helpers.d.ts +0 -175
- package/console/dist/ui/pages/pain/pain-card-helpers.js +0 -181
- package/console/dist/ui/pages/principles/CorePrinciplesPage.d.ts +0 -10
- package/console/dist/ui/pages/principles/CorePrinciplesPage.js +0 -59
- package/console/dist/ui/pages/principles/PrincipleDetailPage.d.ts +0 -60
- package/console/dist/ui/pages/principles/PrincipleDetailPage.js +0 -602
- package/console/dist/ui/pages/principles/PrinciplesPage.d.ts +0 -1
- package/console/dist/ui/pages/principles/PrinciplesPage.js +0 -327
- package/console/dist/ui/pages/principles/PrinciplesViewNav.d.ts +0 -8
- package/console/dist/ui/pages/principles/PrinciplesViewNav.js +0 -15
- package/console/dist/ui/pages/report-problem/ReportProblemPage.d.ts +0 -1
- package/console/dist/ui/pages/report-problem/ReportProblemPage.js +0 -467
- package/console/dist/ui/pages/settings/SettingsPage.d.ts +0 -4
- package/console/dist/ui/pages/settings/SettingsPage.js +0 -457
- package/console/dist/ui/pages/settings/UpdatePage.d.ts +0 -1
- package/console/dist/ui/pages/settings/UpdatePage.js +0 -215
- package/console/dist/ui/pages/welcome/WelcomePage.d.ts +0 -5
- package/console/dist/ui/pages/welcome/WelcomePage.js +0 -187
- package/console/dist/ui/utils/agent-metadata.d.ts +0 -71
- package/console/dist/ui/utils/agent-metadata.js +0 -284
- package/console/dist/ui/utils/approval-review.d.ts +0 -30
- package/console/dist/ui/utils/approval-review.js +0 -50
- package/console/dist/ui/utils/approval-warning-localization.d.ts +0 -34
- package/console/dist/ui/utils/approval-warning-localization.js +0 -148
- package/console/dist/ui/utils/attention-presentation.d.ts +0 -35
- package/console/dist/ui/utils/attention-presentation.js +0 -46
- package/console/dist/ui/utils/blocker-localization.d.ts +0 -23
- package/console/dist/ui/utils/blocker-localization.js +0 -36
- package/console/dist/ui/utils/control-center-helpers.d.ts +0 -79
- package/console/dist/ui/utils/control-center-helpers.js +0 -189
- package/console/dist/ui/utils/enum-labels.d.ts +0 -50
- package/console/dist/ui/utils/enum-labels.js +0 -171
- package/console/dist/ui/utils/format-date.d.ts +0 -11
- package/console/dist/ui/utils/format-date.js +0 -17
- package/console/dist/ui/utils/onboarding-state.d.ts +0 -25
- package/console/dist/ui/utils/onboarding-state.js +0 -77
- package/console/dist/ui/utils/reading-layout.d.ts +0 -20
- package/console/dist/ui/utils/reading-layout.js +0 -46
- package/console/dist/ui/utils/rule-binding-validators.d.ts +0 -13
- package/console/dist/ui/utils/rule-binding-validators.js +0 -188
- package/console/dist/ui/utils/runtime-mode.d.ts +0 -11
- package/console/dist/ui/utils/runtime-mode.js +0 -11
- package/console/dist/ui/utils/token-storage.d.ts +0 -22
- package/console/dist/ui/utils/token-storage.js +0 -47
- package/console/dist/ui/utils/validators.d.ts +0 -1178
- package/console/dist/ui/utils/validators.js +0 -3297
- package/release-manager/dist/bootstrap-entry.d.ts +0 -2
- package/release-manager/dist/bootstrap-entry.d.ts.map +0 -1
- package/release-manager/dist/bootstrap-entry.js.map +0 -1
- package/release-manager/dist/i18n.d.ts +0 -6
- package/release-manager/dist/i18n.d.ts.map +0 -1
- package/release-manager/dist/i18n.js.map +0 -1
- package/release-manager/dist/index.d.ts +0 -7
- package/release-manager/dist/index.d.ts.map +0 -1
- package/release-manager/dist/index.js +0 -656
- package/release-manager/dist/index.js.map +0 -1
- package/release-manager/dist/installer.d.ts +0 -629
- package/release-manager/dist/installer.d.ts.map +0 -1
- package/release-manager/dist/installer.js.map +0 -1
- package/release-manager/dist/installers/codex-host-installer.d.ts +0 -39
- package/release-manager/dist/installers/codex-host-installer.d.ts.map +0 -1
- package/release-manager/dist/installers/codex-host-installer.js.map +0 -1
- package/release-manager/dist/installers/index.d.ts +0 -51
- package/release-manager/dist/installers/index.d.ts.map +0 -1
- package/release-manager/dist/installers/index.js.map +0 -1
- package/release-manager/dist/installers/openclaw-host-installer.d.ts +0 -14
- package/release-manager/dist/installers/openclaw-host-installer.d.ts.map +0 -1
- package/release-manager/dist/installers/openclaw-host-installer.js.map +0 -1
- package/release-manager/dist/installers/workbuddy-host-installer.d.ts +0 -335
- package/release-manager/dist/installers/workbuddy-host-installer.d.ts.map +0 -1
- package/release-manager/dist/installers/workbuddy-host-installer.js.map +0 -1
- package/release-manager/dist/mvp-config.d.ts +0 -233
- package/release-manager/dist/mvp-config.d.ts.map +0 -1
- package/release-manager/dist/mvp-config.js.map +0 -1
- package/release-manager/dist/prompts.d.ts +0 -43
- package/release-manager/dist/prompts.d.ts.map +0 -1
- package/release-manager/dist/prompts.js +0 -268
- package/release-manager/dist/prompts.js.map +0 -1
- package/release-manager/dist/skill-language.d.ts +0 -32
- package/release-manager/dist/skill-language.d.ts.map +0 -1
- package/release-manager/dist/skill-language.js.map +0 -1
- package/release-manager/dist/uninstaller.d.ts +0 -68
- package/release-manager/dist/uninstaller.d.ts.map +0 -1
- package/release-manager/dist/uninstaller.js +0 -746
- package/release-manager/dist/uninstaller.js.map +0 -1
- package/release-manager/dist/update/apply-payload.d.ts +0 -143
- package/release-manager/dist/update/apply-payload.d.ts.map +0 -1
- package/release-manager/dist/update/apply-payload.js.map +0 -1
- package/release-manager/dist/update/atomic-file.d.ts +0 -35
- package/release-manager/dist/update/atomic-file.d.ts.map +0 -1
- package/release-manager/dist/update/atomic-file.js.map +0 -1
- package/release-manager/dist/update/bootstrap-executor.d.ts +0 -21
- package/release-manager/dist/update/bootstrap-executor.d.ts.map +0 -1
- package/release-manager/dist/update/bootstrap-executor.js.map +0 -1
- package/release-manager/dist/update/bootstrap-protocol.d.ts +0 -56
- package/release-manager/dist/update/bootstrap-protocol.d.ts.map +0 -1
- package/release-manager/dist/update/bootstrap-protocol.js.map +0 -1
- package/release-manager/dist/update/channel-metadata.d.ts +0 -28
- package/release-manager/dist/update/channel-metadata.d.ts.map +0 -1
- package/release-manager/dist/update/channel-metadata.js.map +0 -1
- package/release-manager/dist/update/channel-promotion.d.ts +0 -39
- package/release-manager/dist/update/channel-promotion.d.ts.map +0 -1
- package/release-manager/dist/update/channel-promotion.js +0 -55
- package/release-manager/dist/update/channel-promotion.js.map +0 -1
- package/release-manager/dist/update/console-surface.d.ts +0 -19
- package/release-manager/dist/update/console-surface.d.ts.map +0 -1
- package/release-manager/dist/update/console-surface.js.map +0 -1
- package/release-manager/dist/update/data-compatibility.d.ts +0 -35
- package/release-manager/dist/update/data-compatibility.d.ts.map +0 -1
- package/release-manager/dist/update/data-compatibility.js +0 -45
- package/release-manager/dist/update/data-compatibility.js.map +0 -1
- package/release-manager/dist/update/install-layout.d.ts +0 -105
- package/release-manager/dist/update/install-layout.d.ts.map +0 -1
- package/release-manager/dist/update/install-layout.js.map +0 -1
- package/release-manager/dist/update/product-identity.d.ts +0 -70
- package/release-manager/dist/update/product-identity.d.ts.map +0 -1
- package/release-manager/dist/update/product-identity.js.map +0 -1
- package/release-manager/dist/update/release-asset-manifest.d.ts +0 -31
- package/release-manager/dist/update/release-asset-manifest.d.ts.map +0 -1
- package/release-manager/dist/update/release-asset-manifest.js.map +0 -1
- package/release-manager/dist/update/release-identity.d.ts +0 -33
- package/release-manager/dist/update/release-identity.d.ts.map +0 -1
- package/release-manager/dist/update/release-identity.js.map +0 -1
- package/release-manager/dist/update/release-manager-authority.d.ts +0 -39
- package/release-manager/dist/update/release-manager-authority.d.ts.map +0 -1
- package/release-manager/dist/update/release-manager-authority.js.map +0 -1
- package/release-manager/dist/update/release-manager.d.ts +0 -156
- package/release-manager/dist/update/release-manager.d.ts.map +0 -1
- package/release-manager/dist/update/release-manager.js.map +0 -1
- package/release-manager/dist/update/release-metadata-publisher.d.ts +0 -199
- package/release-manager/dist/update/release-metadata-publisher.d.ts.map +0 -1
- package/release-manager/dist/update/release-metadata-publisher.js +0 -478
- package/release-manager/dist/update/release-metadata-publisher.js.map +0 -1
- package/release-manager/dist/update/release-metadata-source.d.ts +0 -85
- package/release-manager/dist/update/release-metadata-source.d.ts.map +0 -1
- package/release-manager/dist/update/release-metadata-source.js.map +0 -1
- package/release-manager/dist/update/release-metadata.d.ts +0 -60
- package/release-manager/dist/update/release-metadata.d.ts.map +0 -1
- package/release-manager/dist/update/release-metadata.js.map +0 -1
- package/release-manager/dist/update/release-policy.d.ts +0 -51
- package/release-manager/dist/update/release-policy.d.ts.map +0 -1
- package/release-manager/dist/update/release-policy.js.map +0 -1
- package/release-manager/dist/update/rollback-policy.d.ts +0 -56
- package/release-manager/dist/update/rollback-policy.d.ts.map +0 -1
- package/release-manager/dist/update/rollback-policy.js +0 -61
- package/release-manager/dist/update/rollback-policy.js.map +0 -1
- package/release-manager/dist/update/transaction-journal.d.ts +0 -212
- package/release-manager/dist/update/transaction-journal.d.ts.map +0 -1
- package/release-manager/dist/update/transaction-journal.js.map +0 -1
- package/release-manager/dist/update/trust-metadata.d.ts +0 -55
- package/release-manager/dist/update/trust-metadata.d.ts.map +0 -1
- package/release-manager/dist/update/trust-metadata.js.map +0 -1
- package/release-manager/dist/update/trust-root-provisioning.d.ts +0 -99
- package/release-manager/dist/update/trust-root-provisioning.d.ts.map +0 -1
- package/release-manager/dist/update/trust-root-provisioning.js.map +0 -1
- package/release-manager/dist/update/update-history.d.ts +0 -46
- package/release-manager/dist/update/update-history.d.ts.map +0 -1
- package/release-manager/dist/update/update-history.js +0 -123
- package/release-manager/dist/update/update-history.js.map +0 -1
- package/release-manager/dist/utils/config-file-io.d.ts +0 -34
- package/release-manager/dist/utils/config-file-io.d.ts.map +0 -1
- package/release-manager/dist/utils/config-file-io.js.map +0 -1
- package/release-manager/dist/utils/env.d.ts +0 -94
- package/release-manager/dist/utils/env.d.ts.map +0 -1
- package/release-manager/dist/utils/env.js.map +0 -1
- package/release-manager/dist/utils/logger.d.ts +0 -15
- package/release-manager/dist/utils/logger.d.ts.map +0 -1
- package/release-manager/dist/utils/logger.js.map +0 -1
- package/release-manager/dist/utils/workspace-divergence.d.ts +0 -36
- package/release-manager/dist/utils/workspace-divergence.d.ts.map +0 -1
- package/release-manager/dist/utils/workspace-divergence.js.map +0 -1
|
@@ -1,478 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Release metadata publisher (PRI-727) — the production supply side of the
|
|
3
|
-
* read contracts in release-metadata-source.ts / trust-metadata.ts.
|
|
4
|
-
*
|
|
5
|
-
* For one release this module emits EXACTLY the byte set ReleaseManager
|
|
6
|
-
* already consumes (see apply-payload.ts and release-manager.ts):
|
|
7
|
-
*
|
|
8
|
-
* root.json / timestamp.json / snapshot.json / targets.json TUF chain
|
|
9
|
-
* targets/channels/<channel>.json signed channel pointer payload
|
|
10
|
-
* targets/releases/<releaseId>/metadata.json release metadata payload
|
|
11
|
-
* targets/releases/<releaseId>/release-asset-<platform>-<arch>.tar.gz
|
|
12
|
-
*
|
|
13
|
-
* No second release identity: releaseId and the canonical digests come from
|
|
14
|
-
* deriveReleaseId/buildReleaseMetadata, and both produced documents are
|
|
15
|
-
* re-validated with the SAME strict parsers the ReleaseManager uses, so a
|
|
16
|
-
* publisher-side defect fails here instead of at an install. Publication is
|
|
17
|
-
* byte-deterministic: the same identity inputs, the same signing key and the
|
|
18
|
-
* same previous-state TUF versions re-emit identical files (idempotent
|
|
19
|
-
* re-publish of one release is a no-op, not a mutation).
|
|
20
|
-
*
|
|
21
|
-
* Advance discipline: the channel pointer is only produced together with the
|
|
22
|
-
* artifact target whose sha256 is bound into the release metadata — there is
|
|
23
|
-
* no API shape that advances the pointer without the verifiable artifact
|
|
24
|
-
* existing in the same file set. Monotonicity against the currently
|
|
25
|
-
* published channel pointer (`previous`) is enforced here, fail-loud, before
|
|
26
|
-
* any bytes are emitted.
|
|
27
|
-
*
|
|
28
|
-
* Trust material: one ed25519 key signs all four TUF roles — the same
|
|
29
|
-
* single-key shape the ReleaseManager test suite verifies against. The
|
|
30
|
-
* install side pins root.json at install time, so this module never rotates
|
|
31
|
-
* the root (root version stays 1; rotation is separate governance work).
|
|
32
|
-
*/
|
|
33
|
-
import { createHash, createPrivateKey, createPublicKey, generateKeyPairSync, sign as cryptoSign } from 'node:crypto';
|
|
34
|
-
import { gzipSync } from 'node:zlib';
|
|
35
|
-
import { Key, Metadata, MetadataKind, MetaFile, Root, Signature, Snapshot, TargetFile, Targets, Timestamp, } from '@tufjs/models';
|
|
36
|
-
import { parseChannelMetadata } from './channel-metadata.js';
|
|
37
|
-
import { buildReleaseMetadata, } from './release-metadata.js';
|
|
38
|
-
import { isReleaseChannelName, } from './product-identity.js';
|
|
39
|
-
import { canonicalJson } from './release-identity.js';
|
|
40
|
-
export const RELEASE_PUBLICATION_TUF_SPEC_VERSION = '1.0.31';
|
|
41
|
-
export class ReleasePublicationError extends Error {
|
|
42
|
-
code;
|
|
43
|
-
field;
|
|
44
|
-
nextAction;
|
|
45
|
-
// eslint-disable-next-line @typescript-eslint/max-params -- (code, field, message, nextAction) mirrors the four fields of the consumer refusal contract (same shape as ReleaseManagerError / ReleaseTrustError)
|
|
46
|
-
constructor(code, field, message, nextAction) {
|
|
47
|
-
super(message);
|
|
48
|
-
this.name = 'ReleasePublicationError';
|
|
49
|
-
this.code = code;
|
|
50
|
-
this.field = field;
|
|
51
|
-
this.nextAction = nextAction;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
const RFC3339_UTC_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$/;
|
|
55
|
-
function isPlainObject(value) {
|
|
56
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
57
|
-
}
|
|
58
|
-
function requirePositiveInteger(value, field) {
|
|
59
|
-
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0) {
|
|
60
|
-
throw new ReleasePublicationError('invalid_input', field, `${field} must be a positive safe integer, got: ${JSON.stringify(value)}`, 'Pass an explicit monotonic value and retry the publication.');
|
|
61
|
-
}
|
|
62
|
-
return value;
|
|
63
|
-
}
|
|
64
|
-
function requireExpiresAt(value) {
|
|
65
|
-
if (typeof value !== 'string' || !RFC3339_UTC_PATTERN.test(value) || Number.isNaN(Date.parse(value))) {
|
|
66
|
-
throw new ReleasePublicationError('invalid_input', 'expiresAt', `expiresAt must be an RFC3339 UTC timestamp ending in Z, got: ${JSON.stringify(value)}`, 'Pass an explicit expiry (for example 2026-12-01T00:00:00Z); implicit defaults would break reproducible re-publication.');
|
|
67
|
-
}
|
|
68
|
-
if (Date.parse(value) <= Date.now()) {
|
|
69
|
-
throw new ReleasePublicationError('expires_not_future', 'expiresAt', `expiresAt must be in the future, got: ${value}`, 'Publish with an expiry ahead of the release window; clients refuse expired metadata.');
|
|
70
|
-
}
|
|
71
|
-
return value;
|
|
72
|
-
}
|
|
73
|
-
function requireSigner(signingKeyPem) {
|
|
74
|
-
if (typeof signingKeyPem !== 'string' || signingKeyPem.trim().length === 0) {
|
|
75
|
-
throw new ReleasePublicationError('signing_key_invalid', 'signingKeyPem', 'The release signing key is empty.', 'Provide the ed25519 private key PEM (CI secret) that matches the pinned trust root.');
|
|
76
|
-
}
|
|
77
|
-
let privateKey;
|
|
78
|
-
try {
|
|
79
|
-
privateKey = createPrivateKey(signingKeyPem);
|
|
80
|
-
}
|
|
81
|
-
catch (error) {
|
|
82
|
-
throw new ReleasePublicationError('signing_key_invalid', 'signingKeyPem', `The release signing key is not a parseable private key: ${error instanceof Error ? error.message : String(error)}`, 'Provide a PEM-encoded ed25519 private key.');
|
|
83
|
-
}
|
|
84
|
-
if (privateKey.asymmetricKeyType !== 'ed25519') {
|
|
85
|
-
throw new ReleasePublicationError('signing_key_invalid', 'signingKeyPem', `The release signing key must be an ed25519 key, got: ${String(privateKey.asymmetricKeyType)}`, 'Generate an ed25519 key for the release trust material.');
|
|
86
|
-
}
|
|
87
|
-
const publicKeyPem = createPublicKey(privateKey).export({ type: 'spki', format: 'pem' }).toString();
|
|
88
|
-
// Deterministic key id derived from the public key material, so the same
|
|
89
|
-
// key always produces the same root.json bytes (reproducibility).
|
|
90
|
-
const keyId = createHash('sha256').update(publicKeyPem).digest('hex');
|
|
91
|
-
return { keyId, privateKey };
|
|
92
|
-
}
|
|
93
|
-
function signedTufMetadata(signed, signer) {
|
|
94
|
-
const metadata = new Metadata(signed);
|
|
95
|
-
metadata.sign((data) => new Signature({ keyID: signer.keyId, sig: cryptoSign(null, data, signer.privateKey).toString('hex') }), false);
|
|
96
|
-
return Buffer.from(JSON.stringify(metadata.toJSON()), 'utf8');
|
|
97
|
-
}
|
|
98
|
-
function deterministicJsonBytes(value) {
|
|
99
|
-
return Buffer.from(`${JSON.stringify(value, null, 2)}\n`, 'utf8');
|
|
100
|
-
}
|
|
101
|
-
function sha256Hex(bytes) {
|
|
102
|
-
return createHash('sha256').update(bytes).digest('hex');
|
|
103
|
-
}
|
|
104
|
-
function withFileDigests(files) {
|
|
105
|
-
return files.map((file) => ({ path: file.path, sha256: sha256Hex(file.bytes), sizeBytes: file.bytes.length }));
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Gzip wrapper for a built release archive. Node's zlib emits a deterministic
|
|
109
|
-
* gzip header (no embedded mtime or file name), so the same archive bytes
|
|
110
|
-
* always produce the same published artifact bytes — the CLI `gzip` would not
|
|
111
|
-
* (it stores name + mtime in the header).
|
|
112
|
-
*/
|
|
113
|
-
export function gzipReleaseArchive(archiveBytes) {
|
|
114
|
-
return gzipSync(archiveBytes);
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Parses a `sha256sum`-style digest file (`<hex>` or `<hex> <name>`) into
|
|
118
|
-
* the lowercase hex digest, failing loud on anything else.
|
|
119
|
-
*/
|
|
120
|
-
export function parseSha256DigestFile(content) {
|
|
121
|
-
const firstToken = content.trim().split(/\s+/, 1)[0] ?? '';
|
|
122
|
-
if (!/^[a-f0-9]{64}$/i.test(firstToken)) {
|
|
123
|
-
throw new ReleasePublicationError('invalid_input', 'digestFile', `The release archive digest file does not contain a sha256 hex digest: ${JSON.stringify(firstToken.slice(0, 72))}`, 'Regenerate the release asset so its .sha256 sidecar exists, then retry.');
|
|
124
|
-
}
|
|
125
|
-
return firstToken.toLowerCase();
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* True when the input is a syntactically valid RFC3339 UTC timestamp
|
|
129
|
-
* (`...Z`). Exported for CLI argument validation before any IO happens.
|
|
130
|
-
*/
|
|
131
|
-
export function isRfc3339UtcTimestamp(value) {
|
|
132
|
-
return typeof value === 'string' && RFC3339_UTC_PATTERN.test(value) && !Number.isNaN(Date.parse(value));
|
|
133
|
-
}
|
|
134
|
-
function resolvePreviousState(input, channelPayload) {
|
|
135
|
-
const { previous } = input;
|
|
136
|
-
if (previous === undefined || previous === null) {
|
|
137
|
-
return { previousChannel: null, versions: { root: 1, timestamp: 1, snapshot: 1, targets: 1 } };
|
|
138
|
-
}
|
|
139
|
-
if (previous.channelPayload !== undefined && previous.channelPayload !== null) {
|
|
140
|
-
if (!isPlainObject(previous.channelPayload)) {
|
|
141
|
-
throw new ReleasePublicationError('invalid_input', 'previous.channelPayload', 'The previously published channel payload is not a JSON object.', 'Inspect the published metadata repository; a corrupt pointer must be repaired before publishing.');
|
|
142
|
-
}
|
|
143
|
-
// A published pointer without its TUF versions would let this publication
|
|
144
|
-
// emit metadata versions the published repository already superseded —
|
|
145
|
-
// a rollback clients must reject. Require the full previous state.
|
|
146
|
-
const versions = previous.tufVersions;
|
|
147
|
-
if (versions === undefined || versions.root === undefined || versions.timestamp === undefined
|
|
148
|
-
|| versions.snapshot === undefined || versions.targets === undefined) {
|
|
149
|
-
throw new ReleasePublicationError('invalid_input', 'previous.tufVersions', 'Publishing over an existing metadata repository requires the published TUF metadata versions (root/timestamp/snapshot/targets).', 'Read the versions from the currently published repository and pass them as the previous state.');
|
|
150
|
-
}
|
|
151
|
-
// Strict parse: a corrupt previous pointer fails the publication instead
|
|
152
|
-
// of being silently treated as absent (rc-3).
|
|
153
|
-
const previousChannel = parseChannelMetadata(previous.channelPayload);
|
|
154
|
-
if (previousChannel.channel !== input.channel) {
|
|
155
|
-
throw new ReleasePublicationError('invalid_input', 'previous.channelPayload', `The previously published pointer is for channel "${previousChannel.channel}", not "${input.channel}".`, 'Read the previous state of the channel being published.');
|
|
156
|
-
}
|
|
157
|
-
const sameRelease = previousChannel.releaseId === channelPayload.releaseId;
|
|
158
|
-
if (sameRelease) {
|
|
159
|
-
// Re-publishing one release is only legitimate as an exact no-op: any
|
|
160
|
-
// content change (sequence, pointer version, expiry) would mutate an
|
|
161
|
-
// immutable release identity. Equality is checked on the canonical
|
|
162
|
-
// channel payload so formatting cannot fake or break it.
|
|
163
|
-
if (canonicalJson(previous.channelPayload) !== canonicalJson(channelPayload)) {
|
|
164
|
-
throw new ReleasePublicationError('publication_conflict', 'releaseId', `Release ${channelPayload.releaseId.slice(0, 12)} is already published with different pointer content (publicationSequence ${previousChannel.publicationSequence} vs ${channelPayload.publicationSequence}, pointer version ${previousChannel.version} vs ${channelPayload.version}).`, 'Re-publish with the identical inputs that produced the published release, or publish a NEW release with a strictly higher publication sequence.');
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
if (channelPayload.publicationSequence <= previousChannel.publicationSequence) {
|
|
169
|
-
throw new ReleasePublicationError('publication_not_monotonic', 'publicationSequence', `The new publicationSequence (${channelPayload.publicationSequence}) must be strictly greater than the published one (${previousChannel.publicationSequence}).`, 'Advance the publication sequence; the channel pointer must never move backwards.');
|
|
170
|
-
}
|
|
171
|
-
if (channelPayload.version <= previousChannel.version) {
|
|
172
|
-
throw new ReleasePublicationError('publication_not_monotonic', 'channelVersion', `The new channel pointer version (${channelPayload.version}) must be strictly greater than the published one (${previousChannel.version}).`, 'Advance the channel pointer version; signed pointer versions must never repeat or regress.');
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
return {
|
|
176
|
-
previousChannel,
|
|
177
|
-
versions: {
|
|
178
|
-
root: versions.root,
|
|
179
|
-
// An identical re-publish keeps the SAME TUF metadata versions (the
|
|
180
|
-
// emitted bytes must stay identical); an advance bumps every
|
|
181
|
-
// non-root role so clients see fresh metadata.
|
|
182
|
-
timestamp: sameRelease ? versions.timestamp : versions.timestamp + 1,
|
|
183
|
-
snapshot: sameRelease ? versions.snapshot : versions.snapshot + 1,
|
|
184
|
-
targets: sameRelease ? versions.targets : versions.targets + 1,
|
|
185
|
-
},
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
const versions = previous.tufVersions ?? {};
|
|
189
|
-
return {
|
|
190
|
-
previousChannel: null,
|
|
191
|
-
versions: { root: versions.root ?? 1, timestamp: (versions.timestamp ?? 0) + 1, snapshot: (versions.snapshot ?? 0) + 1, targets: (versions.targets ?? 0) + 1 },
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* PRI-854: the content-addressed asset file name shared by the metadata url
|
|
196
|
-
* stamping and the upload manifest (single naming truth — review P3).
|
|
197
|
-
*/
|
|
198
|
-
export function contentAddressedAssetName(input) {
|
|
199
|
-
return `release-asset-${input.platform}-${input.arch}-abi${input.nodeAbi}-${input.digestHex.slice(0, 12)}.tar.gz`;
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Builds the complete signed release publication. Pure: no filesystem or
|
|
203
|
-
* network IO — callers (the publish script / CI) own byte transport.
|
|
204
|
-
*/
|
|
205
|
-
export function buildReleasePublication(input) {
|
|
206
|
-
if (!isReleaseChannelName(input.channel)) {
|
|
207
|
-
throw new ReleasePublicationError('invalid_input', 'channel', `channel must be "stable" or "candidate", got: ${JSON.stringify(input.channel)}`, 'Publish to a configured release channel.');
|
|
208
|
-
}
|
|
209
|
-
requirePositiveInteger(input.channelVersion, 'channelVersion');
|
|
210
|
-
requirePositiveInteger(input.publicationSequence, 'publicationSequence');
|
|
211
|
-
requireExpiresAt(input.expiresAt);
|
|
212
|
-
if (!Array.isArray(input.archives) || input.archives.length === 0) {
|
|
213
|
-
throw new ReleasePublicationError('invalid_input', 'archives', 'The release publication must declare at least one platform archive.', 'Build the self-contained release asset first; nothing is published without the artifact bytes.');
|
|
214
|
-
}
|
|
215
|
-
const PLATFORM_ARCH_PATTERN = /^[a-z0-9-]+$/;
|
|
216
|
-
const sortedArchives = [...input.archives].sort((a, b) => {
|
|
217
|
-
const keyA = `${a.platform}/${a.arch}/abi${a.nodeAbi}`;
|
|
218
|
-
const keyB = `${b.platform}/${b.arch}/abi${b.nodeAbi}`;
|
|
219
|
-
return keyA < keyB ? -1 : keyA > keyB ? 1 : 0;
|
|
220
|
-
});
|
|
221
|
-
// PRI-852 review fix: the duplicate key is the FULL asset identity —
|
|
222
|
-
// platform + arch + Node ABI. Two runtimes on one platform are DISTINCT
|
|
223
|
-
// assets with distinct target paths; only a true triple collision
|
|
224
|
-
// (same platform/arch/ABI twice) is a publication error.
|
|
225
|
-
const seenAssetTargets = new Set();
|
|
226
|
-
for (const [index, archive] of sortedArchives.entries()) {
|
|
227
|
-
for (const [field, value] of [['platform', archive.platform], ['arch', archive.arch]]) {
|
|
228
|
-
if (typeof value !== 'string' || value.length === 0 || !PLATFORM_ARCH_PATTERN.test(value)) {
|
|
229
|
-
throw new ReleasePublicationError('invalid_input', `archives[${index}].${field}`, `archives[${index}].${field} must be a non-empty lowercase identifier, got: ${JSON.stringify(value)}`, 'Pass the platform/arch triple the CI matrix job built the archive for.');
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
if (typeof archive.nodeAbi !== 'string' || !/^\d+$/.test(archive.nodeAbi)) {
|
|
233
|
-
throw new ReleasePublicationError('invalid_input', `archives[${index}].nodeAbi`, `archives[${index}].nodeAbi must be a numeric Node ABI string (e.g. "137"), got: ${JSON.stringify(archive.nodeAbi)}`, 'Pass the Node ABI the archive was built against.');
|
|
234
|
-
}
|
|
235
|
-
if (!Buffer.isBuffer(archive.bytes) || archive.bytes.length === 0) {
|
|
236
|
-
throw new ReleasePublicationError('invalid_input', `archives[${index}].bytes`, 'The release archive is empty or missing.', 'Build the self-contained release asset first; nothing is published without the artifact bytes.');
|
|
237
|
-
}
|
|
238
|
-
const assetTarget = `${archive.platform}/${archive.arch}/abi${archive.nodeAbi}`;
|
|
239
|
-
if (seenAssetTargets.has(assetTarget)) {
|
|
240
|
-
throw new ReleasePublicationError('invalid_input', `archives[${index}]`, `Duplicate asset identity: ${assetTarget} — two archives claim the same platform, architecture and Node ABI.`, 'Pass exactly one archive per platform/arch/ABI triple; different runtimes must publish their own ABI-qualified assets.');
|
|
241
|
-
}
|
|
242
|
-
seenAssetTargets.add(assetTarget);
|
|
243
|
-
}
|
|
244
|
-
const signer = requireSigner(input.signingKeyPem);
|
|
245
|
-
// Artifact bytes are finalized FIRST: the release metadata binds their
|
|
246
|
-
// digests, the channel binds the metadata digest. By construction the
|
|
247
|
-
// emitted channel pointer can never reference an artifact that is not part
|
|
248
|
-
// of the same publication.
|
|
249
|
-
const artifacts = sortedArchives.map((archive) => ({
|
|
250
|
-
platform: archive.platform,
|
|
251
|
-
arch: archive.arch,
|
|
252
|
-
nodeAbi: archive.nodeAbi,
|
|
253
|
-
bytes: archive.bytes,
|
|
254
|
-
sha256: sha256Hex(archive.bytes),
|
|
255
|
-
...(archive.url !== undefined ? { url: archive.url } : {}),
|
|
256
|
-
}));
|
|
257
|
-
const releaseMetadata = buildReleaseMetadata({
|
|
258
|
-
productVersion: input.productVersion,
|
|
259
|
-
sourceCommit: input.sourceCommit,
|
|
260
|
-
minBootstrapVersion: input.minBootstrapVersion,
|
|
261
|
-
publicationSequence: input.publicationSequence,
|
|
262
|
-
expiresAt: input.expiresAt,
|
|
263
|
-
assets: artifacts.map((artifact) => ({
|
|
264
|
-
platform: artifact.platform,
|
|
265
|
-
arch: artifact.arch,
|
|
266
|
-
nodeAbi: artifact.nodeAbi,
|
|
267
|
-
archiveSha256: artifact.sha256,
|
|
268
|
-
archiveSizeBytes: artifact.bytes.length,
|
|
269
|
-
...(artifact.url !== undefined ? { url: artifact.url } : {}),
|
|
270
|
-
})),
|
|
271
|
-
dataSchemaForwardReadableFrom: input.dataSchemaForwardReadableFrom,
|
|
272
|
-
});
|
|
273
|
-
const channelPayload = {
|
|
274
|
-
schemaVersion: 1,
|
|
275
|
-
channel: input.channel,
|
|
276
|
-
version: input.channelVersion,
|
|
277
|
-
expiresAt: input.expiresAt,
|
|
278
|
-
releaseMetadataDigest: releaseMetadata.metadataDigest,
|
|
279
|
-
releaseId: releaseMetadata.releaseId,
|
|
280
|
-
productVersion: releaseMetadata.productVersion,
|
|
281
|
-
publicationSequence: releaseMetadata.publicationSequence,
|
|
282
|
-
};
|
|
283
|
-
// Consume-side strict re-validation: if the publisher ever produces a
|
|
284
|
-
// document the ReleaseManager would refuse, refuse here instead.
|
|
285
|
-
parseChannelMetadata(channelPayload);
|
|
286
|
-
const { versions } = resolvePreviousState(input, channelPayload);
|
|
287
|
-
const channelTargetPath = `channels/${input.channel}.json`;
|
|
288
|
-
const metadataTargetPath = `releases/${releaseMetadata.releaseId}/metadata.json`;
|
|
289
|
-
const channelPayloadBytes = deterministicJsonBytes(channelPayload);
|
|
290
|
-
const releaseMetadataBytes = deterministicJsonBytes(releaseMetadata);
|
|
291
|
-
const artifactTargets = {};
|
|
292
|
-
const artifactFiles = [];
|
|
293
|
-
const manifestArtifacts = artifacts.map((artifact) => {
|
|
294
|
-
// PRI-854 (option A): when the archive carries a delivery url, the bytes
|
|
295
|
-
// are served from that location (GitHub Release attachment) and are NOT
|
|
296
|
-
// written into the metadata repository — only their signed digest travels
|
|
297
|
-
// with the metadata. artifactTargetPath stays the conventional relative
|
|
298
|
-
// path shape in BOTH modes (single semantic, review P2); the actual byte
|
|
299
|
-
// carrier is artifactUrl when present. Without a url, the legacy in-repo
|
|
300
|
-
// target is used.
|
|
301
|
-
const conventionalPath = `releases/${releaseMetadata.releaseId}/release-asset-${artifact.platform}-${artifact.arch}-abi${artifact.nodeAbi}.tar.gz`;
|
|
302
|
-
if (artifact.url !== undefined) {
|
|
303
|
-
return {
|
|
304
|
-
platform: artifact.platform,
|
|
305
|
-
arch: artifact.arch,
|
|
306
|
-
nodeAbi: artifact.nodeAbi,
|
|
307
|
-
artifactSha256: artifact.sha256,
|
|
308
|
-
artifactSizeBytes: artifact.bytes.length,
|
|
309
|
-
artifactTargetPath: conventionalPath,
|
|
310
|
-
artifactUrl: artifact.url,
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
artifactTargets[conventionalPath] = new TargetFile({
|
|
314
|
-
path: conventionalPath,
|
|
315
|
-
length: artifact.bytes.length,
|
|
316
|
-
hashes: { sha256: artifact.sha256 },
|
|
317
|
-
unrecognizedFields: {
|
|
318
|
-
custom: { releaseId: releaseMetadata.releaseId, channel: input.channel, platform: artifact.platform },
|
|
319
|
-
},
|
|
320
|
-
});
|
|
321
|
-
artifactFiles.push({ path: `targets/${conventionalPath}`, bytes: artifact.bytes });
|
|
322
|
-
return {
|
|
323
|
-
platform: artifact.platform,
|
|
324
|
-
arch: artifact.arch,
|
|
325
|
-
nodeAbi: artifact.nodeAbi,
|
|
326
|
-
artifactSha256: artifact.sha256,
|
|
327
|
-
artifactSizeBytes: artifact.bytes.length,
|
|
328
|
-
artifactTargetPath: conventionalPath,
|
|
329
|
-
};
|
|
330
|
-
});
|
|
331
|
-
const targets = new Targets({
|
|
332
|
-
version: versions.targets,
|
|
333
|
-
specVersion: RELEASE_PUBLICATION_TUF_SPEC_VERSION,
|
|
334
|
-
expires: input.expiresAt,
|
|
335
|
-
targets: {
|
|
336
|
-
[channelTargetPath]: new TargetFile({
|
|
337
|
-
path: channelTargetPath,
|
|
338
|
-
length: channelPayloadBytes.length,
|
|
339
|
-
hashes: { sha256: sha256Hex(channelPayloadBytes) },
|
|
340
|
-
unrecognizedFields: {
|
|
341
|
-
custom: { releaseId: releaseMetadata.releaseId, channel: input.channel, platform: 'metadata' },
|
|
342
|
-
},
|
|
343
|
-
}),
|
|
344
|
-
[metadataTargetPath]: new TargetFile({
|
|
345
|
-
path: metadataTargetPath,
|
|
346
|
-
length: releaseMetadataBytes.length,
|
|
347
|
-
hashes: { sha256: sha256Hex(releaseMetadataBytes) },
|
|
348
|
-
unrecognizedFields: {
|
|
349
|
-
custom: { releaseId: releaseMetadata.releaseId, channel: input.channel, platform: 'metadata' },
|
|
350
|
-
},
|
|
351
|
-
}),
|
|
352
|
-
...artifactTargets,
|
|
353
|
-
},
|
|
354
|
-
});
|
|
355
|
-
const root = new Root({
|
|
356
|
-
version: versions.root,
|
|
357
|
-
specVersion: RELEASE_PUBLICATION_TUF_SPEC_VERSION,
|
|
358
|
-
expires: input.expiresAt,
|
|
359
|
-
consistentSnapshot: false,
|
|
360
|
-
});
|
|
361
|
-
const signingKey = new Key({
|
|
362
|
-
keyID: signer.keyId,
|
|
363
|
-
keyType: 'ed25519',
|
|
364
|
-
scheme: 'ed25519',
|
|
365
|
-
keyVal: { public: createPublicKey(signer.privateKey).export({ type: 'spki', format: 'pem' }).toString() },
|
|
366
|
-
});
|
|
367
|
-
for (const role of ['root', 'timestamp', 'snapshot', 'targets'])
|
|
368
|
-
root.addKey(signingKey, role);
|
|
369
|
-
const files = [
|
|
370
|
-
{ path: 'root.json', bytes: signedTufMetadata(root, signer) },
|
|
371
|
-
{ path: 'timestamp.json', bytes: signedTufMetadata(new Timestamp({
|
|
372
|
-
version: versions.timestamp,
|
|
373
|
-
specVersion: RELEASE_PUBLICATION_TUF_SPEC_VERSION,
|
|
374
|
-
expires: input.expiresAt,
|
|
375
|
-
snapshotMeta: new MetaFile({ version: versions.snapshot }),
|
|
376
|
-
}), signer) },
|
|
377
|
-
{ path: 'snapshot.json', bytes: signedTufMetadata(new Snapshot({
|
|
378
|
-
version: versions.snapshot,
|
|
379
|
-
specVersion: RELEASE_PUBLICATION_TUF_SPEC_VERSION,
|
|
380
|
-
expires: input.expiresAt,
|
|
381
|
-
meta: { 'targets.json': new MetaFile({ version: versions.targets }) },
|
|
382
|
-
}), signer) },
|
|
383
|
-
{ path: 'targets.json', bytes: signedTufMetadata(targets, signer) },
|
|
384
|
-
{ path: `targets/${channelTargetPath}`, bytes: channelPayloadBytes },
|
|
385
|
-
{ path: `targets/${metadataTargetPath}`, bytes: releaseMetadataBytes },
|
|
386
|
-
...artifactFiles,
|
|
387
|
-
];
|
|
388
|
-
const manifest = {
|
|
389
|
-
releaseId: releaseMetadata.releaseId,
|
|
390
|
-
productVersion: releaseMetadata.productVersion,
|
|
391
|
-
channel: input.channel,
|
|
392
|
-
artifacts: manifestArtifacts,
|
|
393
|
-
sourceCommit: input.sourceCommit,
|
|
394
|
-
keyId: signer.keyId,
|
|
395
|
-
signingScheme: 'ed25519',
|
|
396
|
-
publicationSequence: input.publicationSequence,
|
|
397
|
-
channelVersion: input.channelVersion,
|
|
398
|
-
expiresAt: input.expiresAt,
|
|
399
|
-
files: withFileDigests(files),
|
|
400
|
-
};
|
|
401
|
-
// PRI-854 (option A): archives with a delivery url are uploaded to the
|
|
402
|
-
// release host by the workflow — the publisher hands the exact gzipped
|
|
403
|
-
// bytes back under their content-addressed names.
|
|
404
|
-
const assetUploads = artifacts
|
|
405
|
-
.filter((artifact) => artifact.url !== undefined)
|
|
406
|
-
.map((artifact) => ({
|
|
407
|
-
name: contentAddressedAssetName({ platform: artifact.platform, arch: artifact.arch, nodeAbi: artifact.nodeAbi, digestHex: artifact.sha256 }),
|
|
408
|
-
bytes: artifact.bytes,
|
|
409
|
-
}));
|
|
410
|
-
return { manifest, releaseMetadata, channelPayload, files, assetUploads };
|
|
411
|
-
}
|
|
412
|
-
/** Ephemeral ed25519 key PEM for dry-run pipelines without configured trust material. */
|
|
413
|
-
export function generateEphemeralSigningKeyPem() {
|
|
414
|
-
return generateKeyPairSync('ed25519')
|
|
415
|
-
.privateKey
|
|
416
|
-
.export({ type: 'pkcs8', format: 'pem' })
|
|
417
|
-
.toString();
|
|
418
|
-
}
|
|
419
|
-
/**
|
|
420
|
-
* PRI-732 publish-side guard: a REAL publication must be verifiable by the
|
|
421
|
-
* pinned trust root installs actually carry. The current publisher signs
|
|
422
|
-
* root, timestamp, snapshot AND targets with the single signing key and emits
|
|
423
|
-
* one signature per role, so the key must be authorized for ALL FOUR roles
|
|
424
|
-
* under the current threshold-1 publishing contract — a key that can merely
|
|
425
|
-
* sign root would produce timestamp/snapshot/targets metadata no existing
|
|
426
|
-
* install can verify.
|
|
427
|
-
* (Dry-run/ephemeral pipelines simply do not call this.)
|
|
428
|
-
*/
|
|
429
|
-
export function verifySigningKeyMatchesPinnedRoot(signingKeyPem, pinnedRootJson) {
|
|
430
|
-
const signer = requireSigner(signingKeyPem);
|
|
431
|
-
const requiredRoles = ['root', 'timestamp', 'snapshot', 'targets'];
|
|
432
|
-
const missingRoleError = (roleName) => new ReleasePublicationError('signing_key_invalid', 'pinnedTrustRoot', `The pinned trust root carries no ${roleName} role — the publisher cannot produce ${roleName} metadata any pinned install can verify.`, 'Repair packages/create-principles-disciple/trust/root.json (re-run the trust root ceremony only as an explicit governance decision).');
|
|
433
|
-
// @tufjs/metadata refuses to deserialize a root that lacks any required
|
|
434
|
-
// top-level role, which would mask the precise diagnosis behind a generic
|
|
435
|
-
// parse refusal. Pre-scan the raw document so a missing role is reported
|
|
436
|
-
// as itself; everything else still goes through the full parse below.
|
|
437
|
-
const rawSignedRoles = (() => {
|
|
438
|
-
try {
|
|
439
|
-
const { signed } = JSON.parse(pinnedRootJson);
|
|
440
|
-
if (signed === null || typeof signed !== 'object' || !Object.hasOwn(signed, 'roles'))
|
|
441
|
-
return undefined;
|
|
442
|
-
const { roles } = signed;
|
|
443
|
-
return roles !== null && typeof roles === 'object' ? roles : undefined;
|
|
444
|
-
}
|
|
445
|
-
catch {
|
|
446
|
-
return undefined; // malformed JSON — the canonical parse error surfaces below
|
|
447
|
-
}
|
|
448
|
-
})();
|
|
449
|
-
if (rawSignedRoles !== undefined) {
|
|
450
|
-
for (const roleName of requiredRoles) {
|
|
451
|
-
if (!Object.hasOwn(rawSignedRoles, roleName))
|
|
452
|
-
throw missingRoleError(roleName);
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
let pinnedRoot;
|
|
456
|
-
try {
|
|
457
|
-
pinnedRoot = (Metadata.fromJSON(MetadataKind.Root, JSON.parse(pinnedRootJson))).signed;
|
|
458
|
-
}
|
|
459
|
-
catch {
|
|
460
|
-
throw new ReleasePublicationError('signing_key_invalid', 'pinnedTrustRoot', 'The pinned trust root is not a parseable TUF Root document.', 'Repair packages/create-principles-disciple/trust/root.json (re-run the trust root ceremony only as an explicit governance decision).');
|
|
461
|
-
}
|
|
462
|
-
for (const roleName of requiredRoles) {
|
|
463
|
-
const role = pinnedRoot.roles[roleName];
|
|
464
|
-
if (role === undefined)
|
|
465
|
-
throw missingRoleError(roleName);
|
|
466
|
-
if (role.threshold !== 1) {
|
|
467
|
-
throw new ReleasePublicationError('signing_key_invalid', 'pinnedTrustRoot', `The pinned trust root ${roleName} role has threshold ${role.threshold}; the current publisher emits a single signature per role and can only satisfy the threshold-1 publishing contract.`, 'Repair packages/create-principles-disciple/trust/root.json (re-run the trust root ceremony only as an explicit governance decision).');
|
|
468
|
-
}
|
|
469
|
-
if (!role.keyIDs.includes(signer.keyId)) {
|
|
470
|
-
throw new ReleasePublicationError('signing_key_invalid', 'signingKeyPem', `The signing key (${signer.keyId.slice(0, 16)}…) is not authorized for the pinned trust root ${roleName} role (authorized: ${role.keyIDs.map((keyId) => keyId.slice(0, 16)).join(', ')}…). The single publisher key must be authorized for root, timestamp, snapshot and targets alike.`, 'Set PD_RELEASE_SIGNING_KEY to the private key matching the pinned trust root (packages/create-principles-disciple/trust/root.json).');
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
const rootRole = pinnedRoot.roles.root;
|
|
474
|
-
if (rootRole === undefined)
|
|
475
|
-
throw missingRoleError('root'); // rc-3: fail loud (defensive; the loop above already enforces this for every required role)
|
|
476
|
-
return { keyId: signer.keyId, pinnedRootKeyIds: rootRole.keyIDs };
|
|
477
|
-
}
|
|
478
|
-
//# sourceMappingURL=release-metadata-publisher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"release-metadata-publisher.js","sourceRoot":"","sources":["../../src/update/release-metadata-publisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Release metadata source contract (PRI-709 P0-1).
|
|
3
|
-
*
|
|
4
|
-
* PRI-698 Phase 0 Audit finding F-4: `PD_RELEASE_METADATA_URL` had no supply
|
|
5
|
-
* side anywhere in the repository — every consumer read the process env
|
|
6
|
-
* directly, so a ReleaseManager install could only ever become ready inside
|
|
7
|
-
* the single shell that exported the variable. There was no durable,
|
|
8
|
-
* installer-owned answer to "where does signed release metadata come from?".
|
|
9
|
-
*
|
|
10
|
-
* This module is that answer. It is a READ-SIDE contract only: it resolves
|
|
11
|
-
* the base URL of the signed release metadata repository and refuses to guess
|
|
12
|
-
* one. It does not publish, sign, mirror or cache metadata (scope boundary —
|
|
13
|
-
* the publishing pipeline is out of scope for PRI-709).
|
|
14
|
-
*
|
|
15
|
-
* Resolution order (highest precedence first):
|
|
16
|
-
*
|
|
17
|
-
* 1. `explicit` — caller-supplied override. The Console passes the
|
|
18
|
-
* operator's process-level env value here, so an
|
|
19
|
-
* operator override always wins over install state.
|
|
20
|
-
* 2. `env` — `PD_RELEASE_METADATA_URL` read by this module.
|
|
21
|
-
* 3. `install_config` — `~/.pd/install.json` → `releaseMetadataUrl`,
|
|
22
|
-
* written by the installer at install time. This is
|
|
23
|
-
* the durable tier: it survives new shells, new
|
|
24
|
-
* processes and Console restarts.
|
|
25
|
-
* 4. `unconfigured` — no source exists. `metadataBaseUrl` is `undefined`
|
|
26
|
-
* and the caller's fallback semantics are UNCHANGED
|
|
27
|
-
* (ADR-0024 §2.4 — refusal with a stable reason, never
|
|
28
|
-
* a guessed endpoint).
|
|
29
|
-
*
|
|
30
|
-
* `invalid` short-circuits: a candidate source that exists but is not a usable
|
|
31
|
-
* http(s) base URL is reported, never silently skipped in favour of a lower
|
|
32
|
-
* tier. An operator who misconfigures the override must see the
|
|
33
|
-
* misconfiguration, not a surprising fallback to install state.
|
|
34
|
-
*
|
|
35
|
-
* This module deliberately imports nothing from `install-layout.js`: callers
|
|
36
|
-
* pass the already-read install config in. That keeps the layering one-way
|
|
37
|
-
* (install-layout → this module) with no cycle.
|
|
38
|
-
*/
|
|
39
|
-
/** Operator override environment variable for the metadata repository base URL. */
|
|
40
|
-
export declare const RELEASE_METADATA_URL_ENV = "PD_RELEASE_METADATA_URL";
|
|
41
|
-
export type ReleaseMetadataSourceKind =
|
|
42
|
-
/** Caller-supplied override (Console passes the process-level env value). */
|
|
43
|
-
'explicit'
|
|
44
|
-
/** `PD_RELEASE_METADATA_URL` resolved by this module. */
|
|
45
|
-
| 'env'
|
|
46
|
-
/** Durable install-time source: `~/.pd/install.json` → `releaseMetadataUrl`. */
|
|
47
|
-
| 'install_config'
|
|
48
|
-
/** A candidate source exists but is not a usable http(s) base URL. */
|
|
49
|
-
| 'invalid'
|
|
50
|
-
/** No source configured; fallback semantics unchanged. */
|
|
51
|
-
| 'unconfigured';
|
|
52
|
-
export interface ReleaseMetadataSource {
|
|
53
|
-
readonly kind: ReleaseMetadataSourceKind;
|
|
54
|
-
/** `undefined` for `invalid` and `unconfigured` — never a guessed URL. */
|
|
55
|
-
readonly metadataBaseUrl: string | undefined;
|
|
56
|
-
/** Stable machine-readable detail for `invalid`; null otherwise. */
|
|
57
|
-
readonly detail: string | null;
|
|
58
|
-
}
|
|
59
|
-
export interface ResolveReleaseMetadataSourceOptions {
|
|
60
|
-
/** Caller-supplied override; empty string is treated as absent. */
|
|
61
|
-
readonly explicit?: string | undefined;
|
|
62
|
-
/** Defaults to `process.env.PD_RELEASE_METADATA_URL`. */
|
|
63
|
-
readonly env?: string | undefined;
|
|
64
|
-
/** Already-read install config; null when install state is corrupt. */
|
|
65
|
-
readonly installConfig?: {
|
|
66
|
-
readonly releaseMetadataUrl?: string;
|
|
67
|
-
} | null;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Strict validator for a metadata repository base URL.
|
|
71
|
-
*
|
|
72
|
-
* Returns the trimmed URL, or `null` when the value is not a non-empty
|
|
73
|
-
* `http(s)` URL. Whitespace-only input is absent, not valid — the ReleaseManager
|
|
74
|
-
* must never be handed a URL it would have to repair.
|
|
75
|
-
*/
|
|
76
|
-
export declare function normalizeReleaseMetadataUrl(raw: unknown): string | null;
|
|
77
|
-
/** True when the value is a usable metadata repository base URL. */
|
|
78
|
-
export declare function isReleaseMetadataUrl(raw: unknown): raw is string;
|
|
79
|
-
/**
|
|
80
|
-
* Resolve the release metadata source. Never throws: an unusable source is a
|
|
81
|
-
* reported outcome (`invalid` / `unconfigured`), so readiness probing stays
|
|
82
|
-
* side-effect free and observable.
|
|
83
|
-
*/
|
|
84
|
-
export declare function resolveReleaseMetadataSource(options?: ResolveReleaseMetadataSourceOptions): ReleaseMetadataSource;
|
|
85
|
-
//# sourceMappingURL=release-metadata-source.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"release-metadata-source.d.ts","sourceRoot":"","sources":["../../src/update/release-metadata-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,4BAA4B,CAAC;AAElE,MAAM,MAAM,yBAAyB;AACnC,6EAA6E;AAC3E,UAAU;AACZ,yDAAyD;GACvD,KAAK;AACP,gFAAgF;GAC9E,gBAAgB;AAClB,sEAAsE;GACpE,SAAS;AACX,0DAA0D;GACxD,cAAc,CAAC;AAEnB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,0EAA0E;IAC1E,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,mCAAmC;IAClD,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,yDAAyD;IACzD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,uEAAuE;IACvE,QAAQ,CAAC,aAAa,CAAC,EAAE;QAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC1E;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAYvE;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,GAAE,mCAAwC,GAChD,qBAAqB,CA4BvB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"release-metadata-source.js","sourceRoot":"","sources":["../../src/update/release-metadata-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,mFAAmF;AACnF,MAAM,CAAC,MAAM,wBAAwB,GAAG,yBAAyB,CAAC;AA+BlE;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CAAC,GAAY;IACtD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,OAAO,2BAA2B,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAO,GAAwC,EAAE;IAEjD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,KAAK,SAAS;QACnC,CAAC,CAAC,OAAO,CAAC,GAAG;QACb,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAE1C,MAAM,UAAU,GAA+F;QAC7G,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE;QAC3C,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE;QACzB,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,OAAO,CAAC,aAAa,EAAE,kBAAkB,EAAE;KAC3E,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,GAAG,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,KAAK,IAAI;YAAE,SAAS;QACpE,IAAI,OAAO,SAAS,CAAC,GAAG,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACrF,MAAM,UAAU,GAAG,2BAA2B,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,uEAAuE;YACvE,gDAAgD;YAChD,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,eAAe,EAAE,SAAS;gBAC1B,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,cAAc;aACxC,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC5E,CAAC"}
|