@dsh-enhanced/plugin-control-plane 0.1.65 → 0.1.67

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.
Files changed (136) hide show
  1. package/README.md +123 -7
  2. package/lib/attestation.d.ts.map +1 -1
  3. package/lib/attestation.js +33 -1
  4. package/lib/attestation.js.map +1 -1
  5. package/lib/creation-capability-empty-handoff.d.ts +57 -0
  6. package/lib/creation-capability-empty-handoff.d.ts.map +1 -0
  7. package/lib/creation-capability-empty-handoff.js +147 -0
  8. package/lib/creation-capability-empty-handoff.js.map +1 -0
  9. package/lib/creation-capability-execution.d.ts +13 -0
  10. package/lib/creation-capability-execution.d.ts.map +1 -0
  11. package/lib/creation-capability-execution.js +112 -0
  12. package/lib/creation-capability-execution.js.map +1 -0
  13. package/lib/creation-capability-feedback.d.ts +58 -1
  14. package/lib/creation-capability-feedback.d.ts.map +1 -1
  15. package/lib/creation-capability-feedback.js +532 -50
  16. package/lib/creation-capability-feedback.js.map +1 -1
  17. package/lib/creation-capability-handoff-common.d.ts +60 -0
  18. package/lib/creation-capability-handoff-common.d.ts.map +1 -0
  19. package/lib/creation-capability-handoff-common.js +195 -0
  20. package/lib/creation-capability-handoff-common.js.map +1 -0
  21. package/lib/creation-capability-journal.d.ts +19 -0
  22. package/lib/creation-capability-journal.d.ts.map +1 -1
  23. package/lib/creation-capability-journal.js +62 -21
  24. package/lib/creation-capability-journal.js.map +1 -1
  25. package/lib/creation-capability-runtime.d.ts +65 -1
  26. package/lib/creation-capability-runtime.d.ts.map +1 -1
  27. package/lib/creation-capability-runtime.js +178 -18
  28. package/lib/creation-capability-runtime.js.map +1 -1
  29. package/lib/creation-capability-sealed-audit.d.ts +19 -0
  30. package/lib/creation-capability-sealed-audit.d.ts.map +1 -0
  31. package/lib/creation-capability-sealed-audit.js +114 -0
  32. package/lib/creation-capability-sealed-audit.js.map +1 -0
  33. package/lib/creation-capability-sealed-handoff.d.ts +160 -0
  34. package/lib/creation-capability-sealed-handoff.d.ts.map +1 -0
  35. package/lib/creation-capability-sealed-handoff.js +695 -0
  36. package/lib/creation-capability-sealed-handoff.js.map +1 -0
  37. package/lib/creation-capability-trend-snapshot.d.ts +70 -0
  38. package/lib/creation-capability-trend-snapshot.d.ts.map +1 -0
  39. package/lib/creation-capability-trend-snapshot.js +117 -0
  40. package/lib/creation-capability-trend-snapshot.js.map +1 -0
  41. package/lib/creation-capability-types.d.ts +254 -4
  42. package/lib/creation-capability-types.d.ts.map +1 -1
  43. package/lib/in-process-reload.d.ts +191 -0
  44. package/lib/in-process-reload.d.ts.map +1 -0
  45. package/lib/in-process-reload.js +284 -0
  46. package/lib/in-process-reload.js.map +1 -0
  47. package/lib/index.d.ts +15 -4
  48. package/lib/index.d.ts.map +1 -1
  49. package/lib/index.js +10 -2
  50. package/lib/index.js.map +1 -1
  51. package/lib/linux-source-build.d.ts +16 -0
  52. package/lib/linux-source-build.d.ts.map +1 -0
  53. package/lib/linux-source-build.js +268 -0
  54. package/lib/linux-source-build.js.map +1 -0
  55. package/lib/linux-source-preflight.d.ts +31 -0
  56. package/lib/linux-source-preflight.d.ts.map +1 -0
  57. package/lib/linux-source-preflight.js +101 -0
  58. package/lib/linux-source-preflight.js.map +1 -0
  59. package/lib/live-qualification-runtime.d.ts +6 -2
  60. package/lib/live-qualification-runtime.d.ts.map +1 -1
  61. package/lib/live-qualification-runtime.js +65 -11
  62. package/lib/live-qualification-runtime.js.map +1 -1
  63. package/lib/owner-task-gap-types.d.ts +23 -0
  64. package/lib/owner-task-gap-types.d.ts.map +1 -1
  65. package/lib/owner-task-gaps.d.ts +4 -0
  66. package/lib/owner-task-gaps.d.ts.map +1 -1
  67. package/lib/owner-task-gaps.js +35 -1
  68. package/lib/owner-task-gaps.js.map +1 -1
  69. package/lib/revision-capability-journal.d.ts +103 -0
  70. package/lib/revision-capability-journal.d.ts.map +1 -0
  71. package/lib/revision-capability-journal.js +872 -0
  72. package/lib/revision-capability-journal.js.map +1 -0
  73. package/lib/revision-capability-runtime.d.ts +74 -0
  74. package/lib/revision-capability-runtime.d.ts.map +1 -0
  75. package/lib/revision-capability-runtime.js +562 -0
  76. package/lib/revision-capability-runtime.js.map +1 -0
  77. package/lib/revision-capability-types.d.ts +289 -0
  78. package/lib/revision-capability-types.d.ts.map +1 -0
  79. package/lib/revision-capability-types.js +2 -0
  80. package/lib/revision-capability-types.js.map +1 -0
  81. package/lib/scanner-owner-runtime.d.ts +34 -0
  82. package/lib/scanner-owner-runtime.d.ts.map +1 -0
  83. package/lib/scanner-owner-runtime.js +99 -0
  84. package/lib/scanner-owner-runtime.js.map +1 -0
  85. package/lib/service.d.ts +107 -6
  86. package/lib/service.d.ts.map +1 -1
  87. package/lib/service.js +643 -47
  88. package/lib/service.js.map +1 -1
  89. package/lib/source-approval-authority.d.ts.map +1 -1
  90. package/lib/source-approval-authority.js +25 -7
  91. package/lib/source-approval-authority.js.map +1 -1
  92. package/lib/source-build-diagnostics.d.ts +31 -0
  93. package/lib/source-build-diagnostics.d.ts.map +1 -0
  94. package/lib/source-build-diagnostics.js +110 -0
  95. package/lib/source-build-diagnostics.js.map +1 -0
  96. package/lib/source-build.d.ts +25 -2
  97. package/lib/source-build.d.ts.map +1 -1
  98. package/lib/source-build.js +145 -26
  99. package/lib/source-build.js.map +1 -1
  100. package/lib/source-creation.d.ts +6 -2
  101. package/lib/source-creation.d.ts.map +1 -1
  102. package/lib/source-creation.js +11 -2
  103. package/lib/source-creation.js.map +1 -1
  104. package/lib/source-job-types.d.ts +3 -1
  105. package/lib/source-job-types.d.ts.map +1 -1
  106. package/lib/source-jobs.d.ts +33 -1
  107. package/lib/source-jobs.d.ts.map +1 -1
  108. package/lib/source-jobs.js +141 -29
  109. package/lib/source-jobs.js.map +1 -1
  110. package/lib/source-workspace.d.ts.map +1 -1
  111. package/lib/source-workspace.js +0 -1
  112. package/lib/source-workspace.js.map +1 -1
  113. package/lib/sqlite.d.ts +1 -1
  114. package/lib/sqlite.d.ts.map +1 -1
  115. package/lib/sqlite.js +36 -1
  116. package/lib/sqlite.js.map +1 -1
  117. package/lib/store.d.ts +22 -2
  118. package/lib/store.d.ts.map +1 -1
  119. package/lib/store.js +477 -177
  120. package/lib/store.js.map +1 -1
  121. package/lib/systemd-host-authority.d.ts.map +1 -1
  122. package/lib/systemd-host-authority.js +4 -0
  123. package/lib/systemd-host-authority.js.map +1 -1
  124. package/lib/task-observation-runtime.d.ts +6 -2
  125. package/lib/task-observation-runtime.d.ts.map +1 -1
  126. package/lib/task-observation-runtime.js +69 -11
  127. package/lib/task-observation-runtime.js.map +1 -1
  128. package/lib/types.d.ts +47 -1
  129. package/lib/types.d.ts.map +1 -1
  130. package/lib/version.d.ts +1 -1
  131. package/lib/version.js +1 -1
  132. package/lib/work-item-creation-contract.d.ts +17 -0
  133. package/lib/work-item-creation-contract.d.ts.map +1 -0
  134. package/lib/work-item-creation-contract.js +61 -0
  135. package/lib/work-item-creation-contract.js.map +1 -0
  136. package/package.json +10 -10
@@ -0,0 +1,160 @@
1
+ import { type AdoptionAuthorityIdentity, type FileIdentity, type FileSnapshot } from './creation-capability-handoff-common.js';
2
+ import { SEALED_ADOPTION_HANDOFF_PROTOCOL as PROTOCOL } from './creation-capability-sealed-audit.js';
3
+ import type { EmptyAdoptionScope } from './creation-capability-empty-handoff.js';
4
+ declare const ADOPTION_STATUSES: readonly ["claimed", "authorized", "active", "closed", "unknown", "rejected"];
5
+ export type SealedAdoptionStatus = 'active' | 'closed' | 'rejected' | 'unknown';
6
+ /** Facts read from raw TEXT bytes. claimed/authorized/unknown adoptions and claimed/unknown calls
7
+ * cannot be reconciled after the Docker runner retires, so they are sealed as `unknown`. */
8
+ export interface SealedAdoptionRow {
9
+ planId: string;
10
+ status: SealedAdoptionStatus;
11
+ originalStatus: typeof ADOPTION_STATUSES[number];
12
+ reason: string | null;
13
+ certificate: {
14
+ protocol: string;
15
+ digest: string;
16
+ };
17
+ artifactSha256: string;
18
+ receiptDigest: string | null;
19
+ callCount: number;
20
+ completedCalls: number;
21
+ unknownCalls: number;
22
+ sourceArchiveDigest: string | null;
23
+ }
24
+ export interface SealedAdoptionHistory {
25
+ counts: {
26
+ adoptions: number;
27
+ calls: number;
28
+ sourceArchives: number;
29
+ };
30
+ byStatus: Record<SealedAdoptionStatus, number>;
31
+ rows: SealedAdoptionRow[];
32
+ rowsDigest: string;
33
+ }
34
+ /** Active Docker adoptions the next authority must independently re-verify before any reuse. */
35
+ export interface SealedPendingReverification {
36
+ planId: string;
37
+ certificateDigest: string;
38
+ receiptDigest: string;
39
+ artifactSha256: string;
40
+ toolsDigest: string;
41
+ }
42
+ export interface SealedAdoptionScope extends EmptyAdoptionScope {
43
+ archiveLogicalPath: string;
44
+ archivePhysicalPath: string;
45
+ }
46
+ export interface SealedAdoptionPlan {
47
+ protocol: typeof PROTOCOL;
48
+ transactionId: string;
49
+ hostAnchor: string;
50
+ physicalPath: string;
51
+ oldIdentity: AdoptionAuthorityIdentity;
52
+ nextIdentity: AdoptionAuthorityIdentity;
53
+ snapshot: FileSnapshot;
54
+ archive: {
55
+ logicalPath: string;
56
+ physicalPath: string;
57
+ };
58
+ history: SealedAdoptionHistory;
59
+ pendingReverification: SealedPendingReverification[];
60
+ inheritedUsage: {
61
+ adoptions: number;
62
+ calls: number;
63
+ };
64
+ createdAt: number;
65
+ expiresAt: number;
66
+ digest: string;
67
+ }
68
+ export interface SealedAdoptionProof {
69
+ protocol: typeof PROTOCOL;
70
+ plan: SealedAdoptionPlan;
71
+ fileIdentity: FileIdentity;
72
+ archive: {
73
+ logicalPath: string;
74
+ fileIdentity: FileIdentity;
75
+ bytes: number;
76
+ digest: string;
77
+ mode: 0o400;
78
+ };
79
+ liveBusiness: {
80
+ adoptions: 0;
81
+ calls: 0;
82
+ sourceArchives: 0;
83
+ };
84
+ inheritedUsage: {
85
+ adoptions: number;
86
+ calls: number;
87
+ };
88
+ digest: string;
89
+ }
90
+ /** Plan sealing a stopped staged Docker journal whose history is non-empty. Same caller duties as the
91
+ * empty handoff: independently verify the source copy and both configurations, bind them in hostAnchor
92
+ * and freeze the plan digest outside this file. */
93
+ export declare function planSealedAdoptionHandoff(scope: SealedAdoptionScope): Readonly<SealedAdoptionPlan>;
94
+ export declare function applySealedAdoptionHandoff(plan: SealedAdoptionPlan, input: {
95
+ now: number;
96
+ expectedPlanDigest: string;
97
+ expectedHostAnchor: string;
98
+ }): Readonly<SealedAdoptionProof>;
99
+ /** Read-only Host cross-check of a possibly live journal (WAL sidecars allowed). Returns the stored
100
+ * sealed proof digest after the same audit validation the journal performs, or null when no audit
101
+ * object exists. The journal alone cannot detect a wholly dropped audit; the caller compares this
102
+ * result with its signed proof digest and refuses on any difference. */
103
+ export declare function readSealedAdoptionHandoffDigest(input: {
104
+ physicalPath: string;
105
+ }): string | null;
106
+ /** Stopped-stage / post-cutover BEFORE START acceptance only. The live file may have been renamed on
107
+ * the same inode; the archive must sit in the same relative placement and keep its exact identity. */
108
+ export declare function verifySealedAdoptionHandoff(input: {
109
+ physicalPath: string;
110
+ archivePhysicalPath: string;
111
+ plan: SealedAdoptionPlan;
112
+ expectedProofDigest: string;
113
+ }): Readonly<SealedAdoptionProof>;
114
+ /** Provenance of one sealed Docker-era tool's archived source, re-rooted relative to `plugins/<name>/`. */
115
+ export interface SealedReverificationSource {
116
+ planId: string;
117
+ name: string;
118
+ /** Candidate-authority files only (README.md, src/**, tests/**); Host-generated metadata is omitted. */
119
+ files: {
120
+ path: string;
121
+ content: string;
122
+ }[];
123
+ /** sha256 of the stored source-archive JSON, equal to the sealed history row's sourceArchiveDigest. */
124
+ archiveRowDigest: string;
125
+ filesDigest: string;
126
+ oldAuthorityDigest: string;
127
+ }
128
+ /** Proof that a new replay plan id is isolated from the sealed handoff's history. */
129
+ export interface SealedReplayPlanIdIsolation {
130
+ protocol: 'dsh-sealed-replay-plan-id-isolation/v1';
131
+ planId: string;
132
+ proofDigest: string;
133
+ sealedRows: number;
134
+ }
135
+ /** S2 naming isolation for sealed tool replay (check and refuse only; nothing adopts with it yet).
136
+ *
137
+ * A replayed sealed tool must return under a NEW plan id. Bound to the caller's signed proof digest, this
138
+ * refuses `planId` when it names any sealed history row (every status, not only pending reverification),
139
+ * equals one ignoring case, or equals ignoring case any `adoptions` row of the live ledger, whatever its
140
+ * authority (stricter than the next authority alone, intentionally fail-closed).
141
+ * It reads the journal only and grants nothing: passing it is necessary for a replay plan, never sufficient.
142
+ * It runs in its own read-only snapshot and reserves nothing, and `CreationCapabilityJournal.claim` compares
143
+ * plan ids exactly without case folding, so whoever wires it must re-run this case-folded check inside the
144
+ * claim writer transaction; otherwise a concurrent `FRESH`/`fresh` pair both pass. */
145
+ export declare function assertSealedReplayPlanIdIsolated(input: {
146
+ physicalPath: string;
147
+ expectedProofDigest: string;
148
+ planId: string;
149
+ }): Readonly<SealedReplayPlanIdIsolation>;
150
+ /** Read-only provenance reader for re-verifying one sealed `pendingReverification` tool. It binds the live
151
+ * or stopped journal's immutable proof to the caller's signed proof digest, reads the exact sealed 0400
152
+ * archive under the OLD authority and returns only candidate source files. It grants nothing: no
153
+ * certificate, artifact, receipt or tools leave this function, and re-verification itself is the caller's. */
154
+ export declare function readSealedReverificationSource(input: {
155
+ physicalPath: string;
156
+ expectedProofDigest: string;
157
+ planId: string;
158
+ }): Readonly<SealedReverificationSource>;
159
+ export {};
160
+ //# sourceMappingURL=creation-capability-sealed-handoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creation-capability-sealed-handoff.d.ts","sourceRoot":"","sources":["../src/creation-capability-sealed-handoff.ts"],"names":[],"mappings":"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"}