@younndai/lyt 0.13.4 → 0.20.0
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/README.md +27 -19
- package/dist/automator-run.d.ts +1 -0
- package/dist/automator-run.d.ts.map +1 -1
- package/dist/automator-run.js +5 -3
- package/dist/automator-run.js.map +1 -1
- package/dist/bench/pod-harness.d.ts.map +1 -1
- package/dist/bench/pod-harness.js +49 -1
- package/dist/bench/pod-harness.js.map +1 -1
- package/dist/build-program.d.ts +10 -1
- package/dist/build-program.d.ts.map +1 -1
- package/dist/build-program.js +23 -3
- package/dist/build-program.js.map +1 -1
- package/dist/cli.js +10 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +1 -2
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +406 -224
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts +4 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +107 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/outdated.d.ts.map +1 -1
- package/dist/commands/outdated.js +19 -5
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/update.d.ts +90 -2
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +883 -48
- package/dist/commands/update.js.map +1 -1
- package/dist/flows/init-bootstrap.d.ts +8 -1
- package/dist/flows/init-bootstrap.d.ts.map +1 -1
- package/dist/flows/init-bootstrap.js +244 -74
- package/dist/flows/init-bootstrap.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/install/doctor-health.d.ts +16 -0
- package/dist/install/doctor-health.d.ts.map +1 -0
- package/dist/install/doctor-health.js +575 -0
- package/dist/install/doctor-health.js.map +1 -0
- package/dist/install/provider-inventory.d.ts +40 -0
- package/dist/install/provider-inventory.d.ts.map +1 -0
- package/dist/install/provider-inventory.js +73 -0
- package/dist/install/provider-inventory.js.map +1 -0
- package/dist/install/reconcile-engine.d.ts +87 -0
- package/dist/install/reconcile-engine.d.ts.map +1 -0
- package/dist/install/reconcile-engine.js +771 -0
- package/dist/install/reconcile-engine.js.map +1 -0
- package/dist/install/target-artifacts.d.ts +91 -0
- package/dist/install/target-artifacts.d.ts.map +1 -0
- package/dist/install/target-artifacts.js +597 -0
- package/dist/install/target-artifacts.js.map +1 -0
- package/dist/install/update-operation.d.ts +47 -0
- package/dist/install/update-operation.d.ts.map +1 -0
- package/dist/install/update-operation.js +318 -0
- package/dist/install/update-operation.js.map +1 -0
- package/dist/install/update-plan.d.ts +132 -0
- package/dist/install/update-plan.d.ts.map +1 -0
- package/dist/install/update-plan.js +418 -0
- package/dist/install/update-plan.js.map +1 -0
- package/package.json +16 -6
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { openReceiptAttempt, inspectReceiptAttempt, reopenReceiptAttempt } from "@younndai/lyt-vault";
|
|
2
|
+
import { type UpdatePlanV1 } from "./update-plan.js";
|
|
3
|
+
export interface UpdateOperationJournalV1 {
|
|
4
|
+
readonly schema_id: "lyt.update-operation";
|
|
5
|
+
readonly schema_version: Readonly<{
|
|
6
|
+
major: 1;
|
|
7
|
+
minor: 0;
|
|
8
|
+
}>;
|
|
9
|
+
readonly plan: UpdatePlanV1;
|
|
10
|
+
readonly status: "pending" | "completed";
|
|
11
|
+
readonly completed_boundaries: readonly Readonly<{
|
|
12
|
+
boundary_id: string;
|
|
13
|
+
receipt_digest: string;
|
|
14
|
+
}>[];
|
|
15
|
+
readonly active_attempt_id: string | null;
|
|
16
|
+
readonly started_at: string;
|
|
17
|
+
}
|
|
18
|
+
export type UpdateOperationJournalInspectionV1 = Readonly<{
|
|
19
|
+
valid: true;
|
|
20
|
+
status: "pending" | "completed";
|
|
21
|
+
journal: UpdateOperationJournalV1;
|
|
22
|
+
}> | Readonly<{
|
|
23
|
+
valid: false;
|
|
24
|
+
status: "invalid" | "missing";
|
|
25
|
+
journal: null;
|
|
26
|
+
error_code: string;
|
|
27
|
+
}>;
|
|
28
|
+
export interface UpdateOperationHandleV1 {
|
|
29
|
+
readonly plan: UpdatePlanV1;
|
|
30
|
+
readonly alreadyCompleted: boolean;
|
|
31
|
+
isBoundaryCompleted(boundaryId: string): boolean;
|
|
32
|
+
finalizeCompleted(): Promise<boolean>;
|
|
33
|
+
recordReconciled(receiptDigest: string): Promise<boolean>;
|
|
34
|
+
}
|
|
35
|
+
export interface UpdateOperationOptions {
|
|
36
|
+
readonly root?: string;
|
|
37
|
+
readonly now?: () => Date;
|
|
38
|
+
readonly newAttemptId?: () => string;
|
|
39
|
+
readonly receiptOpen?: typeof openReceiptAttempt;
|
|
40
|
+
readonly receiptReopen?: typeof reopenReceiptAttempt;
|
|
41
|
+
readonly receiptInspect?: typeof inspectReceiptAttempt;
|
|
42
|
+
}
|
|
43
|
+
export declare function defaultUpdateOperationRoot(home?: string): string;
|
|
44
|
+
export declare function readUpdateOperationPlanV1(operationId: string, root?: string): UpdatePlanV1;
|
|
45
|
+
export declare function inspectUpdateOperationJournalV1(operationId: string, root?: string): UpdateOperationJournalInspectionV1;
|
|
46
|
+
export declare function beginUpdateOperationV1(value: unknown, options?: UpdateOperationOptions): Promise<UpdateOperationHandleV1 | null>;
|
|
47
|
+
//# sourceMappingURL=update-operation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-operation.d.ts","sourceRoot":"","sources":["../../src/install/update-operation.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,kBAAkB,EAClB,qBAAqB,EAErB,oBAAoB,EAIrB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IACzC,QAAQ,CAAC,oBAAoB,EAAE,SAAS,QAAQ,CAAC;QAC/C,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC,EAAE,CAAC;IACL,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,kCAAkC,GAC1C,QAAQ,CAAC;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,wBAAwB,CAAA;CAAE,CAAC,GAC7F,QAAQ,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAajG,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IACjD,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,kBAAkB,CAAC;IACjD,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,oBAAoB,CAAC;IACrD,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,qBAAqB,CAAC;CACxD;AAED,wBAAgB,0BAA0B,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAE3E;AAED,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,MAAqC,GAC1C,YAAY,CAEd;AAED,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,MAAqC,GAC1C,kCAAkC,CAapC;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAqEzC"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 MARLINK TRADING SRL (YounndAI)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
17
|
+
import { homedir } from "node:os";
|
|
18
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
19
|
+
import { newUuidv7Bytes, openReceiptAttempt, inspectReceiptAttempt, parseReceiptV1ForEmission, reopenReceiptAttempt, uuid7BytesToDashedString, } from "@younndai/lyt-vault";
|
|
20
|
+
import { assertPathChainHasNoLinks } from "./reconcile-engine.js";
|
|
21
|
+
import { canonicalJson, digestCanonical, parseUpdatePlanV1, } from "./update-plan.js";
|
|
22
|
+
const UUID_V7_DASHED = /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
|
|
23
|
+
const JOURNAL_KEYS = [
|
|
24
|
+
"active_attempt_id",
|
|
25
|
+
"completed_boundaries",
|
|
26
|
+
"plan",
|
|
27
|
+
"schema_id",
|
|
28
|
+
"schema_version",
|
|
29
|
+
"started_at",
|
|
30
|
+
"status",
|
|
31
|
+
];
|
|
32
|
+
export function defaultUpdateOperationRoot(home = homedir()) {
|
|
33
|
+
return join(home, "lyt", ".update-operations");
|
|
34
|
+
}
|
|
35
|
+
export function readUpdateOperationPlanV1(operationId, root = defaultUpdateOperationRoot()) {
|
|
36
|
+
return readJournal(root, operationId).plan;
|
|
37
|
+
}
|
|
38
|
+
export function inspectUpdateOperationJournalV1(operationId, root = defaultUpdateOperationRoot()) {
|
|
39
|
+
try {
|
|
40
|
+
const journal = readJournal(root, operationId);
|
|
41
|
+
return Object.freeze({ valid: true, status: journal.status, journal });
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
const missing = error.code === "ENOENT";
|
|
45
|
+
return Object.freeze({
|
|
46
|
+
valid: false,
|
|
47
|
+
status: missing ? "missing" : "invalid",
|
|
48
|
+
journal: null,
|
|
49
|
+
error_code: missing ? "update-operation-journal-missing" : "update-operation-journal-invalid",
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export async function beginUpdateOperationV1(value, options = {}) {
|
|
54
|
+
const plan = parseUpdatePlanV1(value);
|
|
55
|
+
const root = resolve(options.root ?? defaultUpdateOperationRoot());
|
|
56
|
+
assertPathChainHasNoLinks(root, true);
|
|
57
|
+
const path = journalPath(root, plan.operation_id);
|
|
58
|
+
let existing = null;
|
|
59
|
+
if (existsSync(path)) {
|
|
60
|
+
existing = readJournal(root, plan.operation_id);
|
|
61
|
+
if (canonicalJson(existing.plan) !== canonicalJson(plan)) {
|
|
62
|
+
throw new Error("update-operation-plan-mismatch");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (existing?.status === "completed") {
|
|
66
|
+
return journalHandle(existing, root);
|
|
67
|
+
}
|
|
68
|
+
if (existing !== null && existing.active_attempt_id === null) {
|
|
69
|
+
return journalHandle(existing, root);
|
|
70
|
+
}
|
|
71
|
+
if (existing !== null && existing.active_attempt_id !== null) {
|
|
72
|
+
const inspect = options.receiptInspect ??
|
|
73
|
+
(options.receiptReopen === undefined ? inspectReceiptAttempt : undefined);
|
|
74
|
+
if (inspect !== undefined) {
|
|
75
|
+
const state = await inspect(existing.active_attempt_id);
|
|
76
|
+
if (state.kind === "terminal") {
|
|
77
|
+
const evidence = completedBoundaryEvidence(state.receipt, existing);
|
|
78
|
+
for (const boundary of evidence) {
|
|
79
|
+
existing = recordBoundary(existing, boundary.boundary_id, boundary.receipt_digest);
|
|
80
|
+
}
|
|
81
|
+
existing = Object.freeze({ ...existing, active_attempt_id: null, status: "completed" });
|
|
82
|
+
writeJournal(root, existing);
|
|
83
|
+
return journalHandle(existing, root);
|
|
84
|
+
}
|
|
85
|
+
if (state.kind === "absent")
|
|
86
|
+
throw new Error("update-operation-receipt-absent");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const now = options.now ?? (() => new Date());
|
|
90
|
+
const attemptId = existing?.active_attempt_id ??
|
|
91
|
+
options.newAttemptId?.() ??
|
|
92
|
+
uuid7BytesToDashedString(newUuidv7Bytes());
|
|
93
|
+
const startedAt = existing?.started_at ?? now().toISOString();
|
|
94
|
+
const disposition = existing === null ? "new" : "resumed";
|
|
95
|
+
const pendingReceipt = updateReceipt(plan, attemptId, startedAt, startedAt, "failed", "update-interrupted", disposition, []);
|
|
96
|
+
const opened = existing === null
|
|
97
|
+
? await (options.receiptOpen ?? openReceiptAttempt)(pendingReceipt)
|
|
98
|
+
: await (options.receiptReopen ?? reopenReceiptAttempt)(pendingReceipt);
|
|
99
|
+
if (opened.kind !== "ready")
|
|
100
|
+
return null;
|
|
101
|
+
const journal = Object.freeze({
|
|
102
|
+
schema_id: "lyt.update-operation",
|
|
103
|
+
schema_version: Object.freeze({ major: 1, minor: 0 }),
|
|
104
|
+
plan,
|
|
105
|
+
status: "pending",
|
|
106
|
+
completed_boundaries: Object.freeze([]),
|
|
107
|
+
active_attempt_id: attemptId,
|
|
108
|
+
started_at: startedAt,
|
|
109
|
+
});
|
|
110
|
+
writeJournal(root, journal);
|
|
111
|
+
return handleFor(journal, root, opened.session, now, disposition);
|
|
112
|
+
}
|
|
113
|
+
function completedBoundaryEvidence(receipt, journal) {
|
|
114
|
+
if (receipt.operation_id !== journal.plan.operation_id ||
|
|
115
|
+
receipt.attempt_id !== journal.active_attempt_id ||
|
|
116
|
+
receipt.operation !== "update" ||
|
|
117
|
+
receipt.status !== "success" ||
|
|
118
|
+
receipt.replay.key_digest !== journal.plan.plan_digest) {
|
|
119
|
+
throw new Error("update-operation-terminal-receipt-mismatch");
|
|
120
|
+
}
|
|
121
|
+
const evidence = receipt.evidence.after.map((entry) => ({
|
|
122
|
+
boundary_id: entry.subject.replace(/^boundary:/, ""),
|
|
123
|
+
receipt_digest: entry.digest ?? "",
|
|
124
|
+
kind: entry.kind,
|
|
125
|
+
}));
|
|
126
|
+
if (evidence.length !== journal.plan.boundaries.length ||
|
|
127
|
+
evidence.some((entry, index) => entry.kind !== "update-boundary" ||
|
|
128
|
+
entry.boundary_id !== journal.plan.boundaries[index]?.boundary_id ||
|
|
129
|
+
!/^[a-f0-9]{64}$/.test(entry.receipt_digest))) {
|
|
130
|
+
throw new Error("update-operation-terminal-boundary-evidence-mismatch");
|
|
131
|
+
}
|
|
132
|
+
for (const [index, completed] of journal.completed_boundaries.entries()) {
|
|
133
|
+
if (evidence[index]?.boundary_id !== completed.boundary_id ||
|
|
134
|
+
evidence[index]?.receipt_digest !== completed.receipt_digest) {
|
|
135
|
+
throw new Error("update-operation-terminal-boundary-evidence-mismatch");
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return Object.freeze(evidence.map(({ boundary_id, receipt_digest }) => Object.freeze({ boundary_id, receipt_digest })));
|
|
139
|
+
}
|
|
140
|
+
function handleFor(journal, root, session, now, disposition) {
|
|
141
|
+
let current = journal;
|
|
142
|
+
return Object.freeze({
|
|
143
|
+
plan: journal.plan,
|
|
144
|
+
alreadyCompleted: false,
|
|
145
|
+
isBoundaryCompleted(boundaryId) {
|
|
146
|
+
return current.completed_boundaries.some((entry) => entry.boundary_id === boundaryId);
|
|
147
|
+
},
|
|
148
|
+
async finalizeCompleted() {
|
|
149
|
+
current = recordBoundary(current, "npm-self-replacement", digestCanonical({
|
|
150
|
+
plan_digest: current.plan.plan_digest,
|
|
151
|
+
boundary_id: "npm-self-replacement",
|
|
152
|
+
artifacts: current.plan.target_artifacts.map((artifact) => ({
|
|
153
|
+
package: artifact.package,
|
|
154
|
+
payload_digest: artifact.payload_digest,
|
|
155
|
+
})),
|
|
156
|
+
}));
|
|
157
|
+
writeJournal(root, current);
|
|
158
|
+
return true;
|
|
159
|
+
},
|
|
160
|
+
async recordReconciled(receiptDigest) {
|
|
161
|
+
if (!/^[a-f0-9]{64}$/.test(receiptDigest))
|
|
162
|
+
return false;
|
|
163
|
+
let completed = current;
|
|
164
|
+
for (const boundary of current.plan.boundaries) {
|
|
165
|
+
if (boundary.kind !== "npm-self-replacement") {
|
|
166
|
+
completed = recordBoundary(completed, boundary.boundary_id, receiptDigest);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const terminalReceipt = updateReceipt(journal.plan, session.attemptId, journal.started_at, now().toISOString(), "success", null, disposition, completed.completed_boundaries);
|
|
170
|
+
const warnings = await session.finalize(terminalReceipt);
|
|
171
|
+
if (warnings.length > 0)
|
|
172
|
+
return false;
|
|
173
|
+
current = Object.freeze({ ...completed, active_attempt_id: null, status: "completed" });
|
|
174
|
+
writeJournal(root, current);
|
|
175
|
+
return true;
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function journalHandle(journal, root) {
|
|
180
|
+
let current = journal;
|
|
181
|
+
return Object.freeze({
|
|
182
|
+
plan: journal.plan,
|
|
183
|
+
alreadyCompleted: journal.status === "completed",
|
|
184
|
+
isBoundaryCompleted(boundaryId) {
|
|
185
|
+
return current.completed_boundaries.some((entry) => entry.boundary_id === boundaryId);
|
|
186
|
+
},
|
|
187
|
+
async finalizeCompleted() {
|
|
188
|
+
return current.completed_boundaries.some((entry) => entry.boundary_id === "npm-self-replacement");
|
|
189
|
+
},
|
|
190
|
+
async recordReconciled(receiptDigest) {
|
|
191
|
+
if (!/^[a-f0-9]{64}$/.test(receiptDigest))
|
|
192
|
+
return false;
|
|
193
|
+
if (current.status === "completed")
|
|
194
|
+
return true;
|
|
195
|
+
for (const boundary of current.plan.boundaries) {
|
|
196
|
+
if (boundary.kind !== "npm-self-replacement") {
|
|
197
|
+
current = recordBoundary(current, boundary.boundary_id, receiptDigest);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
writeJournal(root, current);
|
|
201
|
+
return true;
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
function recordBoundary(journal, boundaryId, receiptDigest) {
|
|
206
|
+
const recorded = journal.completed_boundaries.find((entry) => entry.boundary_id === boundaryId);
|
|
207
|
+
if (recorded !== undefined) {
|
|
208
|
+
if (recorded.receipt_digest !== receiptDigest) {
|
|
209
|
+
throw new Error("update-operation-boundary-evidence-mismatch");
|
|
210
|
+
}
|
|
211
|
+
return journal;
|
|
212
|
+
}
|
|
213
|
+
const boundary = journal.plan.boundaries.find((entry) => entry.boundary_id === boundaryId);
|
|
214
|
+
const nextBoundary = journal.plan.boundaries[journal.completed_boundaries.length];
|
|
215
|
+
if (boundary === undefined ||
|
|
216
|
+
nextBoundary?.boundary_id !== boundaryId ||
|
|
217
|
+
!/^[a-f0-9]{64}$/.test(receiptDigest)) {
|
|
218
|
+
throw new Error("update-operation-invalid-boundary-evidence");
|
|
219
|
+
}
|
|
220
|
+
const completed = Object.freeze([
|
|
221
|
+
...journal.completed_boundaries,
|
|
222
|
+
Object.freeze({ boundary_id: boundaryId, receipt_digest: receiptDigest }),
|
|
223
|
+
]);
|
|
224
|
+
return Object.freeze({
|
|
225
|
+
...journal,
|
|
226
|
+
completed_boundaries: completed,
|
|
227
|
+
status: "pending",
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
function updateReceipt(plan, attemptId, startedAt, finishedAt, status, errorCode, disposition, completedBoundaries) {
|
|
231
|
+
return parseReceiptV1ForEmission({
|
|
232
|
+
schema_id: "lyt.receipt",
|
|
233
|
+
schema_version: { major: 1, minor: 0 },
|
|
234
|
+
operation_id: plan.operation_id,
|
|
235
|
+
attempt_id: attemptId,
|
|
236
|
+
operation: "update",
|
|
237
|
+
scope: { kind: "system" },
|
|
238
|
+
timestamps: { started_at: startedAt, finished_at: finishedAt },
|
|
239
|
+
replay: { disposition, key_digest: plan.plan_digest },
|
|
240
|
+
status,
|
|
241
|
+
exit_code: status === "success" ? 0 : 1,
|
|
242
|
+
mutations: { local: status === "success" ? 1 : 0, remote: 0 },
|
|
243
|
+
evidence: {
|
|
244
|
+
before: [{ kind: "update-plan", subject: "sealed update plan", digest: plan.plan_digest }],
|
|
245
|
+
after: completedBoundaries.map((boundary) => ({
|
|
246
|
+
kind: "update-boundary",
|
|
247
|
+
subject: `boundary:${boundary.boundary_id}`,
|
|
248
|
+
digest: boundary.receipt_digest,
|
|
249
|
+
})),
|
|
250
|
+
},
|
|
251
|
+
next_action: status === "success"
|
|
252
|
+
? null
|
|
253
|
+
: { code: "resume-update", summary: `Resume update operation ${plan.operation_id}.` },
|
|
254
|
+
error: errorCode === null
|
|
255
|
+
? null
|
|
256
|
+
: { code: errorCode, summary: "The exact update is incomplete.", retryable: true },
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
function journalPath(root, operationId) {
|
|
260
|
+
return join(root, "operations", operationId, "journal.json");
|
|
261
|
+
}
|
|
262
|
+
function readJournal(root, operationId) {
|
|
263
|
+
if (!UUID_V7_DASHED.test(operationId)) {
|
|
264
|
+
throw new Error("update-operation-invalid-id");
|
|
265
|
+
}
|
|
266
|
+
const path = journalPath(resolve(root), operationId);
|
|
267
|
+
assertPathChainHasNoLinks(dirname(path), true);
|
|
268
|
+
assertPathChainHasNoLinks(path, true);
|
|
269
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
270
|
+
if (parsed.schema_id !== "lyt.update-operation" ||
|
|
271
|
+
parsed.schema_version?.major !== 1 ||
|
|
272
|
+
parsed.schema_version?.minor !== 0 ||
|
|
273
|
+
JSON.stringify(Object.keys(parsed).sort()) !== JSON.stringify([...JOURNAL_KEYS].sort()) ||
|
|
274
|
+
parsed.plan?.operation_id !== operationId ||
|
|
275
|
+
(parsed.status !== "pending" && parsed.status !== "completed") ||
|
|
276
|
+
(parsed.active_attempt_id !== null && !UUID_V7_DASHED.test(parsed.active_attempt_id)) ||
|
|
277
|
+
typeof parsed.started_at !== "string" ||
|
|
278
|
+
!isCanonicalIso(parsed.started_at))
|
|
279
|
+
throw new Error("update-operation-journal-tampered");
|
|
280
|
+
const plan = parseUpdatePlanV1(parsed.plan);
|
|
281
|
+
const completed = parsed.completed_boundaries;
|
|
282
|
+
if (!Array.isArray(completed))
|
|
283
|
+
throw new Error("update-operation-journal-tampered");
|
|
284
|
+
const expectedPrefix = plan.boundaries
|
|
285
|
+
.slice(0, completed.length)
|
|
286
|
+
.map((entry) => entry.boundary_id);
|
|
287
|
+
if (completed.some((entry, index) => entry?.boundary_id !== expectedPrefix[index] ||
|
|
288
|
+
typeof entry.receipt_digest !== "string" ||
|
|
289
|
+
!/^[a-f0-9]{64}$/.test(entry.receipt_digest)) ||
|
|
290
|
+
(parsed.status === "completed" && completed.length !== plan.boundaries.length) ||
|
|
291
|
+
(parsed.active_attempt_id === null) !== (parsed.status === "completed")) {
|
|
292
|
+
throw new Error("update-operation-journal-tampered");
|
|
293
|
+
}
|
|
294
|
+
return parsed;
|
|
295
|
+
}
|
|
296
|
+
function isCanonicalIso(value) {
|
|
297
|
+
try {
|
|
298
|
+
return new Date(value).toISOString() === value;
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
function writeJournal(root, journal) {
|
|
305
|
+
const path = journalPath(root, journal.plan.operation_id);
|
|
306
|
+
assertPathChainHasNoLinks(root, true);
|
|
307
|
+
assertPathChainHasNoLinks(dirname(path), true);
|
|
308
|
+
assertPathChainHasNoLinks(path, true);
|
|
309
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
310
|
+
const temporary = join(dirname(path), `.${basename(path)}.${process.pid}.tmp`);
|
|
311
|
+
assertPathChainHasNoLinks(temporary, true);
|
|
312
|
+
writeFileSync(temporary, `${JSON.stringify(journal, null, 2)}\n`, {
|
|
313
|
+
encoding: "utf8",
|
|
314
|
+
flag: "w",
|
|
315
|
+
});
|
|
316
|
+
renameSync(temporary, path);
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=update-operation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-operation.js","sourceRoot":"","sources":["../../src/install/update-operation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
export declare const UPDATE_PLAN_SCHEMA_ID = "lyt.update-plan";
|
|
2
|
+
export declare const UPDATE_PLAN_PACKAGES: readonly ["@younndai/lyt-vault", "@younndai/lyt-llm", "@younndai/lyt-mesh", "@younndai/lyt-skills", "@younndai/lyt-runner", "@younndai/lyt-mcp", "@younndai/lyt"];
|
|
3
|
+
export type UpdatePackageName = (typeof UPDATE_PLAN_PACKAGES)[number];
|
|
4
|
+
export type UpdateChannel = "alpha" | "latest";
|
|
5
|
+
export type UpdateBoundaryKind = "npm-self-replacement" | "package-provider-content" | "skill-leaves" | "agent-manuals";
|
|
6
|
+
export type ManagedDestinationKind = "package" | "bin" | "skill" | "manual";
|
|
7
|
+
export type ManagedDestinationEvidenceKind = "registry-version-sri" | "provider-content-digest" | "bounded-target-identity";
|
|
8
|
+
export interface RegistryPackageFactV1 {
|
|
9
|
+
readonly name: UpdatePackageName;
|
|
10
|
+
readonly version: string;
|
|
11
|
+
readonly integrity: string;
|
|
12
|
+
readonly dependencies: readonly UpdatePackageName[];
|
|
13
|
+
readonly tarball_url: string;
|
|
14
|
+
}
|
|
15
|
+
export interface TargetPayloadFileV1 {
|
|
16
|
+
readonly path: string;
|
|
17
|
+
readonly digest: string;
|
|
18
|
+
readonly size: number;
|
|
19
|
+
}
|
|
20
|
+
export interface TargetArtifactV1 {
|
|
21
|
+
readonly package: UpdatePackageName;
|
|
22
|
+
readonly version: string;
|
|
23
|
+
readonly integrity: string;
|
|
24
|
+
readonly tarball_url: string;
|
|
25
|
+
readonly payload_digest: string;
|
|
26
|
+
readonly files: readonly TargetPayloadFileV1[];
|
|
27
|
+
}
|
|
28
|
+
export type TargetProviderObjectV1 = Readonly<{
|
|
29
|
+
object_id: string;
|
|
30
|
+
kind: "directory-link" | "marker-file";
|
|
31
|
+
provider_package: UpdatePackageName;
|
|
32
|
+
provider_version: string;
|
|
33
|
+
target_path: string;
|
|
34
|
+
source_relative_path: string | null;
|
|
35
|
+
content: string | null;
|
|
36
|
+
expected_digest: string;
|
|
37
|
+
expected_applied_digest: string;
|
|
38
|
+
marker_begin: string | null;
|
|
39
|
+
marker_end: string | null;
|
|
40
|
+
}>;
|
|
41
|
+
export interface InstalledPackageFactV1 {
|
|
42
|
+
readonly name: UpdatePackageName;
|
|
43
|
+
readonly version: string | null;
|
|
44
|
+
readonly integrity: string | null;
|
|
45
|
+
}
|
|
46
|
+
export interface InstalledBinFactV1 {
|
|
47
|
+
readonly path: string;
|
|
48
|
+
readonly digest: string | null;
|
|
49
|
+
}
|
|
50
|
+
export interface ManagedDestinationV1 {
|
|
51
|
+
readonly object_id: string;
|
|
52
|
+
readonly kind: ManagedDestinationKind;
|
|
53
|
+
readonly path: string;
|
|
54
|
+
readonly source_package: UpdatePackageName;
|
|
55
|
+
readonly evidence_kind: ManagedDestinationEvidenceKind;
|
|
56
|
+
readonly expected_before_digest: string | null;
|
|
57
|
+
readonly expected_after_digest: string;
|
|
58
|
+
}
|
|
59
|
+
export interface UpdateBoundaryV1 {
|
|
60
|
+
readonly ordinal: number;
|
|
61
|
+
readonly boundary_id: string;
|
|
62
|
+
readonly kind: UpdateBoundaryKind;
|
|
63
|
+
readonly object_ids: readonly string[];
|
|
64
|
+
}
|
|
65
|
+
export interface UpdatePlanPayloadV1 {
|
|
66
|
+
readonly schema_id: typeof UPDATE_PLAN_SCHEMA_ID;
|
|
67
|
+
readonly schema_version: Readonly<{
|
|
68
|
+
major: 1;
|
|
69
|
+
minor: 0;
|
|
70
|
+
}>;
|
|
71
|
+
readonly registry_url: string;
|
|
72
|
+
readonly package: "@younndai/lyt";
|
|
73
|
+
readonly channel: UpdateChannel;
|
|
74
|
+
readonly target_version: string;
|
|
75
|
+
readonly dist_integrity: string;
|
|
76
|
+
readonly package_graph: readonly RegistryPackageFactV1[];
|
|
77
|
+
readonly target_artifacts: readonly TargetArtifactV1[];
|
|
78
|
+
readonly target_provider_objects: readonly TargetProviderObjectV1[];
|
|
79
|
+
readonly before_state: Readonly<{
|
|
80
|
+
packages: readonly InstalledPackageFactV1[];
|
|
81
|
+
bins: readonly InstalledBinFactV1[];
|
|
82
|
+
}>;
|
|
83
|
+
readonly destinations: readonly ManagedDestinationV1[];
|
|
84
|
+
readonly logical_replay_key: string;
|
|
85
|
+
readonly operation_id: string;
|
|
86
|
+
readonly boundaries: readonly UpdateBoundaryV1[];
|
|
87
|
+
readonly expected_evidence: readonly string[];
|
|
88
|
+
}
|
|
89
|
+
export interface UpdatePlanV1 extends UpdatePlanPayloadV1 {
|
|
90
|
+
readonly plan_digest: string;
|
|
91
|
+
}
|
|
92
|
+
export interface PrepareUpdatePlanV1Input {
|
|
93
|
+
readonly registryUrl: string;
|
|
94
|
+
readonly channel: UpdateChannel;
|
|
95
|
+
readonly targetVersion: string;
|
|
96
|
+
readonly distIntegrity: string;
|
|
97
|
+
readonly packageGraph: readonly RegistryPackageFactV1[];
|
|
98
|
+
readonly targetArtifacts: readonly TargetArtifactV1[];
|
|
99
|
+
readonly targetProviderObjects: readonly TargetProviderObjectV1[];
|
|
100
|
+
readonly beforeState: Readonly<{
|
|
101
|
+
packages: readonly InstalledPackageFactV1[];
|
|
102
|
+
bins: readonly InstalledBinFactV1[];
|
|
103
|
+
}>;
|
|
104
|
+
readonly destinations: readonly ManagedDestinationV1[];
|
|
105
|
+
readonly boundaries: readonly Omit<UpdateBoundaryV1, "ordinal">[];
|
|
106
|
+
readonly expectedEvidence: readonly string[];
|
|
107
|
+
}
|
|
108
|
+
export type UpdateApplyObjectState = Readonly<{
|
|
109
|
+
boundary_id: string;
|
|
110
|
+
status: "completed" | "pending";
|
|
111
|
+
receipt_digest: string | null;
|
|
112
|
+
}>;
|
|
113
|
+
export interface ExactUpdateApplyResultV1 {
|
|
114
|
+
readonly operation_id: string;
|
|
115
|
+
readonly plan_digest: string;
|
|
116
|
+
readonly completed: readonly string[];
|
|
117
|
+
readonly pending: readonly string[];
|
|
118
|
+
readonly objects: readonly UpdateApplyObjectState[];
|
|
119
|
+
readonly next_action: string | null;
|
|
120
|
+
}
|
|
121
|
+
export interface ExactUpdateApplyEffects {
|
|
122
|
+
revalidate(boundary: UpdateBoundaryV1, plan: UpdatePlanV1): Promise<boolean>;
|
|
123
|
+
apply(boundary: UpdateBoundaryV1, plan: UpdatePlanV1): Promise<void>;
|
|
124
|
+
alreadyCompleted(boundary: UpdateBoundaryV1, plan: UpdatePlanV1): Promise<boolean>;
|
|
125
|
+
recordCompleted?(boundary: UpdateBoundaryV1, plan: UpdatePlanV1): Promise<string>;
|
|
126
|
+
}
|
|
127
|
+
export declare function prepareUpdatePlanV1(input: PrepareUpdatePlanV1Input): UpdatePlanV1;
|
|
128
|
+
export declare function parseUpdatePlanV1(value: unknown): UpdatePlanV1;
|
|
129
|
+
export declare function applyExactUpdatePlanV1(value: unknown, effects: ExactUpdateApplyEffects): Promise<ExactUpdateApplyResultV1>;
|
|
130
|
+
export declare function digestCanonical(value: unknown): string;
|
|
131
|
+
export declare function canonicalJson(value: unknown): string;
|
|
132
|
+
//# sourceMappingURL=update-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-plan.d.ts","sourceRoot":"","sources":["../../src/install/update-plan.ts"],"names":[],"mappings":"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"}
|