@songsid/agend 2.3.2-beta.14 → 2.3.2-beta.16
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/dist/backend/codex-session-lookup.d.ts +15 -0
- package/dist/backend/codex-session-lookup.js +58 -0
- package/dist/backend/codex-session-lookup.js.map +1 -1
- package/dist/backend/codex.js +15 -4
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/kiro-classic-archive.d.ts +5 -0
- package/dist/backend/kiro-classic-archive.js +132 -7
- package/dist/backend/kiro-classic-archive.js.map +1 -1
- package/dist/backend/kiro-identity.d.ts +2 -0
- package/dist/backend/kiro-identity.js +4 -0
- package/dist/backend/kiro-identity.js.map +1 -1
- package/dist/backend/kiro-reconcile-store.d.ts +27 -0
- package/dist/backend/kiro-reconcile-store.js +344 -0
- package/dist/backend/kiro-reconcile-store.js.map +1 -0
- package/dist/backend/kiro-v2-store-worker.js +12 -3
- package/dist/backend/kiro-v2-store-worker.js.map +1 -1
- package/dist/backend/kiro-v2-store.d.ts +11 -0
- package/dist/backend/kiro-v2-store.js.map +1 -1
- package/dist/cache-service.d.ts +13 -1
- package/dist/cache-service.js +45 -2
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/mcp-tools.js +5 -3
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/cli.js +17 -4
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +4 -1
- package/dist/config-validator.js.map +1 -1
- package/dist/fleet-manager.d.ts +23 -1
- package/dist/fleet-manager.js +127 -9
- package/dist/fleet-manager.js.map +1 -1
- package/dist/general-instance.d.ts +24 -0
- package/dist/general-instance.js +53 -0
- package/dist/general-instance.js.map +1 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +2 -0
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +2 -0
- package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +16 -9
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +16 -9
- package/dist/instance-config-impact.js +1 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/kiro-reconcile.d.ts +21 -0
- package/dist/kiro-reconcile.js +80 -0
- package/dist/kiro-reconcile.js.map +1 -0
- package/dist/kiro-tui-forensic.d.ts +7 -0
- package/dist/kiro-tui-forensic.js +17 -3
- package/dist/kiro-tui-forensic.js.map +1 -1
- package/dist/locale.js +20 -0
- package/dist/locale.js.map +1 -1
- package/dist/log-service.js +1 -1
- package/dist/log-service.js.map +1 -1
- package/dist/office-levels.d.ts +64 -0
- package/dist/office-levels.js +66 -0
- package/dist/office-levels.js.map +1 -0
- package/dist/office-share-page.d.ts +3 -1
- package/dist/office-share-page.js +8 -3
- package/dist/office-share-page.js.map +1 -1
- package/dist/office-share-service.d.ts +4 -3
- package/dist/office-share-service.js +6 -6
- package/dist/office-share-service.js.map +1 -1
- package/dist/office-share.d.ts +35 -8
- package/dist/office-share.js +50 -15
- package/dist/office-share.js.map +1 -1
- package/dist/outbound-handlers.js +20 -1
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +6 -0
- package/dist/outbound-schemas.js +6 -0
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +1 -1
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/quickstart-api.d.ts +25 -1
- package/dist/quickstart-api.js +53 -6
- package/dist/quickstart-api.js.map +1 -1
- package/dist/scheduler/task-board.d.ts +28 -6
- package/dist/scheduler/task-board.js +66 -11
- package/dist/scheduler/task-board.js.map +1 -1
- package/dist/service-installer.d.ts +13 -0
- package/dist/service-installer.js +15 -0
- package/dist/service-installer.js.map +1 -1
- package/dist/service-owner.d.ts +25 -0
- package/dist/service-owner.js +43 -2
- package/dist/service-owner.js.map +1 -1
- package/dist/settings-api.js +4 -0
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +2 -0
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.js +2 -0
- package/dist/settings-effect.js.map +1 -1
- package/dist/setup-form.js +17 -3
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-i18n.js +2 -0
- package/dist/setup-i18n.js.map +1 -1
- package/dist/task-board-waker.js +7 -2
- package/dist/task-board-waker.js.map +1 -1
- package/dist/tool-permissions.js +1 -0
- package/dist/tool-permissions.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/ui/fleet-office-card.js +114 -0
- package/dist/ui/fleet-office-editor.js +27 -7
- package/dist/ui/fleet-office-layout.js +14 -6
- package/dist/ui/fleet-office-levels.js +105 -0
- package/dist/ui/fleet-office-model.js +9 -1
- package/dist/ui/fleet-office-pack.d.ts +6 -0
- package/dist/ui/fleet-office-pack.js +62 -6
- package/dist/ui/fleet-office-skin.js +39 -3
- package/dist/ui/fleet-office-store.js +31 -3
- package/dist/ui/fleet-office-view.js +8 -0
- package/dist/ui/fleet-office-zones.js +10 -2
- package/dist/ui/fleet-office.js +208 -30
- package/dist/ui/fleet-org.js +2 -0
- package/dist/ui/fleet-task-card.js +2 -2
- package/dist/ui/fleet-task-common.js +30 -7
- package/dist/ui/fleet-task-work.js +2 -2
- package/dist/ui/fleet-tasks.js +10 -11
- package/dist/ui/office-share-dialog.js +31 -7
- package/dist/ui/office-share-page.js +1 -0
- package/dist/ui/panel-log.js +2 -2
- package/dist/ui/panel-settings.js +7 -1
- package/dist/ui/settings-registry.js +1 -0
- package/dist/ui/settings-strings.js +4 -0
- package/dist/ui/settings-wizard.js +15 -4
- package/dist/ui/shared/app.css +50 -0
- package/dist/ui/shared/setup-host-text.js +2 -0
- package/dist/usage-rollup.d.ts +34 -3
- package/dist/usage-rollup.js +56 -3
- package/dist/usage-rollup.js.map +1 -1
- package/dist/web-api.d.ts +5 -0
- package/dist/web-api.js +116 -14
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.js +1 -1
- package/dist/web-auth.js.map +1 -1
- package/dist/web-office-acts.d.ts +5 -2
- package/dist/web-office-acts.js +7 -2
- package/dist/web-office-acts.js.map +1 -1
- package/dist/web-office-pack-tools.d.ts +10 -1
- package/dist/web-office-pack-tools.js +36 -5
- package/dist/web-office-pack-tools.js.map +1 -1
- package/dist/web-office-skins.js +6 -0
- package/dist/web-office-skins.js.map +1 -1
- package/dist/web-office-store.d.ts +28 -4
- package/dist/web-office-store.js +49 -8
- package/dist/web-office-store.js.map +1 -1
- package/dist/web-settings-patch.d.ts +3 -1
- package/dist/web-settings-patch.js +4 -1
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/workflow-templates/default.md +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/** Explicit option-A reconciliation. Native V2 files are read/copied, never moved, rewritten or deleted. */
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { closeSync, constants, existsSync, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readSync, readdirSync, unlinkSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { atomicWriteFileSync } from "../atomic-write.js";
|
|
6
|
+
import { kiroCanonicalDirectory, kiroCarryCandidate, kiroOwnedConversation, kiroEngineFloor, isConsistentKiroIdentityRecord } from "./kiro-identity.js";
|
|
7
|
+
const hash = (v) => createHash("sha256").update(v).digest("hex");
|
|
8
|
+
const idPattern = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,199}$/;
|
|
9
|
+
const receiptPattern = /^[a-f0-9]{64}$/;
|
|
10
|
+
const equal = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
11
|
+
function syncDir(path) { const fd = openSync(path, constants.O_RDONLY); try {
|
|
12
|
+
fsyncSync(fd);
|
|
13
|
+
}
|
|
14
|
+
finally {
|
|
15
|
+
closeSync(fd);
|
|
16
|
+
} }
|
|
17
|
+
function privateDir(path) {
|
|
18
|
+
if (!existsSync(path))
|
|
19
|
+
mkdirSync(path, { mode: 0o700 });
|
|
20
|
+
const s = lstatSync(path);
|
|
21
|
+
if (!s.isDirectory() || s.mode & 0o077 || process.getuid && s.uid !== process.getuid())
|
|
22
|
+
throw new Error("Reconciliation directory is not private and owned");
|
|
23
|
+
syncDir(path);
|
|
24
|
+
syncDir(dirname(path));
|
|
25
|
+
}
|
|
26
|
+
function checkPrivateDir(path) {
|
|
27
|
+
const s = lstatSync(path);
|
|
28
|
+
if (!s.isDirectory() || s.mode & 0o077 || process.getuid && s.uid !== process.getuid())
|
|
29
|
+
throw new Error("Reconciliation directory is not private and owned");
|
|
30
|
+
}
|
|
31
|
+
function read(path, limit, privateFile = false) {
|
|
32
|
+
const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
33
|
+
try {
|
|
34
|
+
const s = fstatSync(fd);
|
|
35
|
+
if (!s.isFile() || s.size > limit || process.getuid && s.uid !== process.getuid() || privateFile && s.mode & 0o077)
|
|
36
|
+
throw new Error("Reconciliation file is unsafe or oversized");
|
|
37
|
+
const bytes = Buffer.alloc(s.size);
|
|
38
|
+
let offset = 0;
|
|
39
|
+
while (offset < bytes.length) {
|
|
40
|
+
const n = readSync(fd, bytes, offset, bytes.length - offset, offset);
|
|
41
|
+
if (!n)
|
|
42
|
+
throw new Error("Reconciliation file was truncated");
|
|
43
|
+
offset += n;
|
|
44
|
+
}
|
|
45
|
+
const after = fstatSync(fd), atPath = lstatSync(path);
|
|
46
|
+
if (bytes.length !== s.size || after.size !== s.size || after.mtimeMs !== s.mtimeMs || after.ctimeMs !== s.ctimeMs
|
|
47
|
+
|| atPath.dev !== s.dev || atPath.ino !== s.ino)
|
|
48
|
+
throw new Error("Reconciliation file changed while reading");
|
|
49
|
+
return { bytes, fingerprint: { hash: hash(bytes), size: s.size, dev: s.dev, ino: s.ino, mtime: s.mtimeMs, ctime: s.ctimeMs } };
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
closeSync(fd);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function optional(path, limit, privateFile = false) {
|
|
56
|
+
try {
|
|
57
|
+
return read(path, limit, privateFile);
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
if (e.code === "ENOENT")
|
|
61
|
+
return null;
|
|
62
|
+
throw e;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function atomic(path, text) {
|
|
66
|
+
atomicWriteFileSync(path, text, { mode: 0o600 });
|
|
67
|
+
syncDir(dirname(path));
|
|
68
|
+
}
|
|
69
|
+
function writeNew(path, bytes) {
|
|
70
|
+
if (!existsSync(path)) {
|
|
71
|
+
const fd = openSync(path, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY, 0o600);
|
|
72
|
+
try {
|
|
73
|
+
writeFileSync(fd, bytes);
|
|
74
|
+
fsyncSync(fd);
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
closeSync(fd);
|
|
78
|
+
}
|
|
79
|
+
syncDir(dirname(path));
|
|
80
|
+
}
|
|
81
|
+
if (!read(path, bytes.length, true).bytes.equals(bytes))
|
|
82
|
+
throw new Error("Reconciliation archive read-back failed");
|
|
83
|
+
// A prior attempt may have left a visible file after fsync failed. Retry must
|
|
84
|
+
// establish durability too, before publishing any authority to re-pin.
|
|
85
|
+
const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
86
|
+
try {
|
|
87
|
+
fsyncSync(fd);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
closeSync(fd);
|
|
91
|
+
}
|
|
92
|
+
syncDir(dirname(path));
|
|
93
|
+
}
|
|
94
|
+
function scope(input) {
|
|
95
|
+
if (!idPattern.test(input.sessionId) || !idPattern.test(input.archiveId) || input.sessionId === input.archiveId
|
|
96
|
+
|| !/^[^\r\n\0]{1,512}$/.test(input.instance) || !input.model)
|
|
97
|
+
throw new Error("Invalid explicit reconciliation selection");
|
|
98
|
+
}
|
|
99
|
+
function paths(input) {
|
|
100
|
+
const ownerHash = hash(input.instance).slice(0, 32), root = join(input.agendHome, "kiro-reconciliations", ownerHash);
|
|
101
|
+
return { root, active: join(root, "active.json"), identity: join(input.agendHome, "kiro-identity", "instances", ownerHash + ".json"),
|
|
102
|
+
classicClaim: join(input.agendHome, "kiro-identity", "claims", "v1", input.sessionId),
|
|
103
|
+
keepClaim: join(input.agendHome, "kiro-identity", "claims", "v2", input.sessionId),
|
|
104
|
+
archiveClaim: join(input.agendHome, "kiro-identity", "claims", "v2", input.archiveId) };
|
|
105
|
+
}
|
|
106
|
+
function fileNames(input) { return [input.sessionId, input.archiveId].flatMap(id => [id + ".json", id + ".jsonl", id + ".history"]); }
|
|
107
|
+
function limit(name) { return name.endsWith(".jsonl") ? 64 * 1024 * 1024 : name.endsWith(".json") ? 8 * 1024 * 1024 : 16 * 1024 * 1024; }
|
|
108
|
+
function files(input) {
|
|
109
|
+
return Object.fromEntries(fileNames(input).map(name => [name, name.endsWith(".history")
|
|
110
|
+
? optional(join(input.sessionsDir, name), limit(name)) : read(join(input.sessionsDir, name), limit(name))]));
|
|
111
|
+
}
|
|
112
|
+
function state(input) {
|
|
113
|
+
const p = paths(input);
|
|
114
|
+
return { identity: read(p.identity, 1024 * 1024).bytes.toString("utf8"),
|
|
115
|
+
classicClaim: read(p.classicClaim, 1024).bytes.toString("utf8"),
|
|
116
|
+
keepClaim: read(p.keepClaim, 1024).bytes.toString("utf8"), archiveClaim: optional(p.archiveClaim, 1024)?.bytes.toString("utf8") ?? null };
|
|
117
|
+
}
|
|
118
|
+
function peerProof(input) {
|
|
119
|
+
const dir = dirname(paths(input).identity), names = readdirSync(dir);
|
|
120
|
+
if (names.length > 4096)
|
|
121
|
+
throw new Error("Too many Kiro identities to prove ownership");
|
|
122
|
+
for (const name of names) {
|
|
123
|
+
if (!name.endsWith(".json") || name === hash(input.instance).slice(0, 32) + ".json")
|
|
124
|
+
continue;
|
|
125
|
+
const other = JSON.parse(read(join(dir, name), 1024 * 1024).bytes.toString("utf8"));
|
|
126
|
+
if (name.endsWith(".adopting.json")) {
|
|
127
|
+
if (!other || typeof other !== "object" || Array.isArray(other))
|
|
128
|
+
throw new Error("Alternative adoption ownership is not exclusive");
|
|
129
|
+
for (const [key, id] of Object.entries(other)) {
|
|
130
|
+
const tuple = JSON.parse(key);
|
|
131
|
+
if (!Array.isArray(tuple) || tuple.length !== 3 || !["v1", "v2", "v3"].includes(tuple[0]) || typeof tuple[1] !== "string"
|
|
132
|
+
|| tuple[2] !== null && typeof tuple[2] !== "string" || typeof id !== "string" || !idPattern.test(id) || id === input.archiveId)
|
|
133
|
+
throw new Error("Alternative adoption ownership is not exclusive");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
if (other.version !== 2 || typeof other.instance !== "string" || !other.keys || Object.entries(other.keys).some(([k, r]) => !isConsistentKiroIdentityRecord(k, r))
|
|
138
|
+
|| Object.values(other.keys).some((r) => r.engine === "v2" && (r.id === input.archiveId
|
|
139
|
+
|| r.id === null && kiroCanonicalDirectory(r.workingDirectory) === kiroCanonicalDirectory(input.workingDirectory))))
|
|
140
|
+
throw new Error("Alternative session may belong to another instance");
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/** Planning is read-only; only hashes/metadata leave the worker. */
|
|
145
|
+
export function inspectKiroReconciliation(input, classicHash) {
|
|
146
|
+
scope(input);
|
|
147
|
+
if (kiroEngineFloor(input.agendHome, input.instance) !== "v2")
|
|
148
|
+
throw new Error("Only the original V2 carry can be reconciled");
|
|
149
|
+
const candidate = kiroCarryCandidate(input);
|
|
150
|
+
if (!candidate?.repair || candidate.id !== input.sessionId)
|
|
151
|
+
throw new Error("Reconciliation requires the original abandoned carry");
|
|
152
|
+
const snapshots = files(input), keep = JSON.parse(snapshots[input.sessionId + ".json"].bytes.toString("utf8")), other = JSON.parse(snapshots[input.archiveId + ".json"].bytes.toString("utf8"));
|
|
153
|
+
for (const [id, meta] of [[input.sessionId, keep], [input.archiveId, other]]) {
|
|
154
|
+
if (meta.session_id !== id || meta.session_state?.version !== "v1" || meta.session_state?.rts_model_state?.conversation_id !== id
|
|
155
|
+
|| typeof meta.cwd !== "string" || kiroCanonicalDirectory(meta.cwd) !== kiroCanonicalDirectory(input.workingDirectory)
|
|
156
|
+
|| !Number.isFinite(Date.parse(meta.created_at)))
|
|
157
|
+
throw new Error("Reconciliation session/cwd is not proven");
|
|
158
|
+
}
|
|
159
|
+
if (Date.parse(other.created_at) <= Date.parse(keep.created_at) || !snapshots[input.archiveId + ".jsonl"].bytes.length)
|
|
160
|
+
throw new Error("The named alternative is not newer work");
|
|
161
|
+
const before = state(input);
|
|
162
|
+
if (before.classicClaim !== input.instance + "\n" || before.keepClaim !== input.instance + "\nabandoned\n"
|
|
163
|
+
|| before.archiveClaim !== null && before.archiveClaim !== input.instance + "\n")
|
|
164
|
+
throw new Error("Reconciliation claims are not exclusively owned");
|
|
165
|
+
peerProof(input);
|
|
166
|
+
const digest = hash(JSON.stringify({ input, classicHash, before, active: optional(paths(input).active, 4096, true)?.fingerprint ?? null,
|
|
167
|
+
files: Object.fromEntries(Object.entries(snapshots).map(([n, f]) => [n, f?.fingerprint ?? null])) }));
|
|
168
|
+
return { digest };
|
|
169
|
+
}
|
|
170
|
+
function manifestAt(input, receipt) {
|
|
171
|
+
scope(input);
|
|
172
|
+
if (!receiptPattern.test(receipt))
|
|
173
|
+
throw new Error("Invalid reconciliation receipt");
|
|
174
|
+
const root = join(paths(input).root, receipt);
|
|
175
|
+
for (const dir of [join(input.agendHome, "kiro-reconciliations"), paths(input).root, root])
|
|
176
|
+
checkPrivateDir(dir);
|
|
177
|
+
const manifest = JSON.parse(read(join(root, "manifest.json"), 2 * 1024 * 1024, true).bytes.toString("utf8"));
|
|
178
|
+
if (hash(JSON.stringify(manifest)) !== receipt || manifest.version !== 1 || !equal(manifest.input, input)
|
|
179
|
+
|| !equal(Object.keys(manifest.files).sort(), fileNames(input).sort()))
|
|
180
|
+
throw new Error("Reconciliation receipt scope/checksum differs");
|
|
181
|
+
for (const [name, f] of Object.entries(manifest.files))
|
|
182
|
+
if (f) {
|
|
183
|
+
const copy = read(join(root, name), limit(name), true);
|
|
184
|
+
if (copy.fingerprint.hash !== f.hash || copy.fingerprint.size !== f.size)
|
|
185
|
+
throw new Error("Reconciliation archive checksum differs");
|
|
186
|
+
}
|
|
187
|
+
return { manifest, root };
|
|
188
|
+
}
|
|
189
|
+
function journal(input) {
|
|
190
|
+
const file = optional(paths(input).active, 4096, true);
|
|
191
|
+
if (!file)
|
|
192
|
+
return null;
|
|
193
|
+
const value = JSON.parse(file.bytes.toString("utf8"));
|
|
194
|
+
if (!receiptPattern.test(value.receipt) || !["prepared", "selected", "rollback_pending", "rolled_back"].includes(value.phase))
|
|
195
|
+
throw new Error("Reconciliation journal is invalid");
|
|
196
|
+
return value;
|
|
197
|
+
}
|
|
198
|
+
function setPhase(input, receipt, phase) { atomic(paths(input).active, JSON.stringify({ receipt, phase }) + "\n"); }
|
|
199
|
+
export function preserveKiroReconciliation(input, plan, classicHash, actor) {
|
|
200
|
+
if (inspectKiroReconciliation(input, classicHash).digest !== plan.digest || !actor || actor.length > 512)
|
|
201
|
+
throw new Error("Reconciliation confirmation is stale");
|
|
202
|
+
const snapshots = files(input), before = state(input);
|
|
203
|
+
const manifest = { version: 1, input, actor, classicHash, files: Object.fromEntries(Object.entries(snapshots).map(([n, f]) => [n, f?.fingerprint ?? null])),
|
|
204
|
+
identityBefore: before.identity, classicClaimBefore: before.classicClaim, keepClaimBefore: before.keepClaim, archiveClaimBefore: before.archiveClaim };
|
|
205
|
+
const receipt = hash(JSON.stringify(manifest)), base = join(input.agendHome, "kiro-reconciliations");
|
|
206
|
+
privateDir(base);
|
|
207
|
+
privateDir(paths(input).root);
|
|
208
|
+
const root = join(paths(input).root, receipt);
|
|
209
|
+
privateDir(root);
|
|
210
|
+
for (const [name, f] of Object.entries(snapshots))
|
|
211
|
+
if (f)
|
|
212
|
+
writeNew(join(root, name), f.bytes);
|
|
213
|
+
writeNew(join(root, "manifest.json"), Buffer.from(JSON.stringify(manifest)));
|
|
214
|
+
manifestAt(input, receipt);
|
|
215
|
+
if (inspectKiroReconciliation(input, classicHash).digest !== plan.digest)
|
|
216
|
+
throw new Error("Reconciliation sources changed while preserving");
|
|
217
|
+
setPhase(input, receipt, "prepared");
|
|
218
|
+
return receipt;
|
|
219
|
+
}
|
|
220
|
+
/** An active/rolled-back intent is never interpreted as permission for a fresh conversation. */
|
|
221
|
+
export function assertKiroReconciliationLaunch(input) {
|
|
222
|
+
const j = journal({ ...input, archiveId: "unused", model: "unused" });
|
|
223
|
+
if (!j)
|
|
224
|
+
return null;
|
|
225
|
+
if (j.phase === "rollback_pending" || j.phase === "rolled_back")
|
|
226
|
+
throw new Error("Kiro reconciliation was rolled back; explicit confirmation is required before starting");
|
|
227
|
+
if (!receiptPattern.test(j.receipt))
|
|
228
|
+
throw new Error("Invalid reconciliation receipt");
|
|
229
|
+
const path = join(paths({ ...input, archiveId: "unused", model: "unused" }).root, j.receipt, "manifest.json");
|
|
230
|
+
const m = JSON.parse(read(path, 2 * 1024 * 1024, true).bytes.toString("utf8"));
|
|
231
|
+
if (!archivedKiroAlternative({ ...input, sessionId: m.input.sessionId }, m.input.archiveId))
|
|
232
|
+
throw new Error("Reconciliation selection is not proven");
|
|
233
|
+
if (j.phase === "prepared")
|
|
234
|
+
inspectKiroReconciliationRollback(m.input, j.receipt);
|
|
235
|
+
return j.phase === "prepared" ? { input: m.input, classicHash: m.classicHash } : null;
|
|
236
|
+
}
|
|
237
|
+
export function archivedKiroAlternative(input, alternative) {
|
|
238
|
+
const j = journal({ ...input, archiveId: alternative, model: "unused" });
|
|
239
|
+
if (!j)
|
|
240
|
+
return null;
|
|
241
|
+
if (j.phase !== "prepared" && j.phase !== "selected")
|
|
242
|
+
return null;
|
|
243
|
+
// The receipt supplies the model; every storage/root/selection field still has to match this launch.
|
|
244
|
+
if (!receiptPattern.test(j.receipt))
|
|
245
|
+
throw new Error("Invalid reconciliation receipt");
|
|
246
|
+
const path = join(paths({ ...input, archiveId: alternative, model: "unused" }).root, j.receipt, "manifest.json");
|
|
247
|
+
const m = JSON.parse(read(path, 2 * 1024 * 1024, true).bytes.toString("utf8"));
|
|
248
|
+
if (m.input.archiveId !== alternative)
|
|
249
|
+
return null;
|
|
250
|
+
const scoped = { ...input, archiveId: alternative, model: m.input.model };
|
|
251
|
+
const { manifest } = manifestAt(scoped, j.receipt);
|
|
252
|
+
peerProof(scoped);
|
|
253
|
+
const claim = state(scoped).archiveClaim;
|
|
254
|
+
if (claim !== manifest.archiveClaimBefore && claim !== input.instance + "\nabandoned\n")
|
|
255
|
+
throw new Error("Archived alternative ownership changed");
|
|
256
|
+
const unchanged = () => {
|
|
257
|
+
const now = files(scoped);
|
|
258
|
+
const names = j.phase === "prepared" ? fileNames(scoped) : [alternative + ".json", alternative + ".jsonl", alternative + ".history"];
|
|
259
|
+
return names.every(name => equal(now[name]?.fingerprint ?? null, manifest.files[name]));
|
|
260
|
+
};
|
|
261
|
+
if (!unchanged())
|
|
262
|
+
throw new Error("Archived alternative changed; reconciliation held");
|
|
263
|
+
return unchanged;
|
|
264
|
+
}
|
|
265
|
+
export function completeKiroSelection(input, receipt) {
|
|
266
|
+
manifestAt(input, receipt);
|
|
267
|
+
const p = paths(input), current = state(input), value = JSON.parse(current.identity), key = JSON.stringify(["v2", kiroCanonicalDirectory(input.workingDirectory), input.credentialProfile]);
|
|
268
|
+
if (kiroOwnedConversation({ ...input, engine: "v2" }) !== input.sessionId || current.keepClaim !== input.instance + "\n")
|
|
269
|
+
throw new Error("Original selection is no longer owned");
|
|
270
|
+
if (current.archiveClaim !== null && current.archiveClaim !== input.instance + "\n" && current.archiveClaim !== input.instance + "\nabandoned\n")
|
|
271
|
+
throw new Error("Archived alternative acquired another owner");
|
|
272
|
+
value.keys[key].abandoned = [...new Set([...value.keys[key].abandoned, input.archiveId])];
|
|
273
|
+
if (current.archiveClaim === null) {
|
|
274
|
+
const fd = openSync(p.archiveClaim, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY, 0o600);
|
|
275
|
+
try {
|
|
276
|
+
writeFileSync(fd, input.instance + "\nabandoned\n");
|
|
277
|
+
fsyncSync(fd);
|
|
278
|
+
}
|
|
279
|
+
finally {
|
|
280
|
+
closeSync(fd);
|
|
281
|
+
}
|
|
282
|
+
syncDir(dirname(p.archiveClaim));
|
|
283
|
+
}
|
|
284
|
+
else
|
|
285
|
+
atomic(p.archiveClaim, input.instance + "\nabandoned\n");
|
|
286
|
+
atomic(p.identity, JSON.stringify(value) + "\n");
|
|
287
|
+
setPhase(input, receipt, "selected");
|
|
288
|
+
}
|
|
289
|
+
/** Finish a confirmed intent after a worker/process interruption, before publishing a resumed CLI. */
|
|
290
|
+
export function finishKiroReconciliationLaunch(input) {
|
|
291
|
+
const j = journal({ ...input, archiveId: "unused", model: "unused" });
|
|
292
|
+
if (j?.phase !== "prepared")
|
|
293
|
+
return;
|
|
294
|
+
const path = join(paths({ ...input, archiveId: "unused", model: "unused" }).root, j.receipt, "manifest.json");
|
|
295
|
+
const m = JSON.parse(read(path, 2 * 1024 * 1024, true).bytes.toString("utf8"));
|
|
296
|
+
const scoped = { ...input, archiveId: m.input.archiveId, model: m.input.model };
|
|
297
|
+
manifestAt(scoped, j.receipt);
|
|
298
|
+
completeKiroSelection(scoped, j.receipt);
|
|
299
|
+
}
|
|
300
|
+
export function inspectKiroReconciliationRollback(input, receipt) {
|
|
301
|
+
const { manifest } = manifestAt(input, receipt), j = journal(input);
|
|
302
|
+
if (j?.receipt !== receipt || j.phase === "rolled_back")
|
|
303
|
+
throw new Error("Receipt is not the active reconciliation");
|
|
304
|
+
const current = state(input), before = JSON.parse(manifest.identityBefore), now = JSON.parse(current.identity);
|
|
305
|
+
const key = JSON.stringify(["v2", kiroCanonicalDirectory(input.workingDirectory), input.credentialProfile]);
|
|
306
|
+
const old = before.keys[key], live = now.keys[key];
|
|
307
|
+
const selected = { ...old, id: input.sessionId, abandoned: old.abandoned.filter((id) => id !== input.sessionId), agentConfirmed: live?.agentConfirmed };
|
|
308
|
+
const retired = { ...selected, abandoned: [...new Set([...selected.abandoned, input.archiveId])] };
|
|
309
|
+
if (!live || typeof live.agentConfirmed !== "boolean" || ![old, selected, retired].some(expected => equal(live, expected)))
|
|
310
|
+
throw new Error("A newer selection supersedes rollback");
|
|
311
|
+
delete before.keys[key];
|
|
312
|
+
delete now.keys[key];
|
|
313
|
+
if (!equal(before, now) || current.classicClaim !== manifest.classicClaimBefore || ![manifest.keepClaimBefore, input.instance + "\n"].includes(current.keepClaim)
|
|
314
|
+
|| ![manifest.archiveClaimBefore, input.instance + "\nabandoned\n"].includes(current.archiveClaim))
|
|
315
|
+
throw new Error("Identity or claims changed; rollback refused");
|
|
316
|
+
return { digest: hash(JSON.stringify({ receipt, current, phase: j.phase })), rollbackReceipt: receipt };
|
|
317
|
+
}
|
|
318
|
+
export function rollbackKiroSelection(input, plan) {
|
|
319
|
+
const receipt = plan.rollbackReceipt;
|
|
320
|
+
if (inspectKiroReconciliationRollback(input, receipt).digest !== plan.digest)
|
|
321
|
+
throw new Error("Rollback confirmation is stale");
|
|
322
|
+
const { manifest } = manifestAt(input, receipt), p = paths(input);
|
|
323
|
+
setPhase(input, receipt, "rollback_pending");
|
|
324
|
+
atomic(p.keepClaim, manifest.keepClaimBefore);
|
|
325
|
+
if (manifest.archiveClaimBefore === null) {
|
|
326
|
+
if (existsSync(p.archiveClaim))
|
|
327
|
+
unlinkSync(p.archiveClaim);
|
|
328
|
+
syncDir(dirname(p.archiveClaim));
|
|
329
|
+
}
|
|
330
|
+
else
|
|
331
|
+
atomic(p.archiveClaim, manifest.archiveClaimBefore);
|
|
332
|
+
atomic(p.identity, manifest.identityBefore);
|
|
333
|
+
setPhase(input, receipt, "rolled_back");
|
|
334
|
+
return receipt;
|
|
335
|
+
}
|
|
336
|
+
export function beginKiroReconciliationRollback(input, plan) {
|
|
337
|
+
const receipt = plan.rollbackReceipt;
|
|
338
|
+
if (inspectKiroReconciliationRollback(input, receipt).digest !== plan.digest)
|
|
339
|
+
throw new Error("Rollback confirmation is stale");
|
|
340
|
+
const { manifest } = manifestAt(input, receipt);
|
|
341
|
+
setPhase(input, receipt, "rollback_pending");
|
|
342
|
+
return { plan: inspectKiroReconciliationRollback(input, receipt), classicHash: manifest.classicHash };
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=kiro-reconcile-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kiro-reconcile-store.js","sourceRoot":"","sources":["../../src/backend/kiro-reconcile-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { parentPort } from "node:worker_threads";
|
|
|
3
3
|
import { performance } from "node:perf_hooks";
|
|
4
4
|
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
5
5
|
import { join } from "node:path";
|
|
6
|
-
import { prepareKiroCarryForLaunch } from "./kiro-classic-archive.js";
|
|
6
|
+
import { prepareKiroCarryForLaunch, planKiroCarryReconciliation, applyKiroCarryReconciliation } from "./kiro-classic-archive.js";
|
|
7
7
|
import { computeKiroClassicLinks } from "./kiro-classic-links.js";
|
|
8
8
|
const CACHE_LIMIT = 4096;
|
|
9
9
|
const CACHE_BYTES = 4 * 1024 * 1024;
|
|
@@ -86,7 +86,16 @@ function scan({ keys, sessionsDir }, deadlineAt) {
|
|
|
86
86
|
parentPort?.on("message", ({ id, input, deadlineAt }) => {
|
|
87
87
|
let reply;
|
|
88
88
|
try {
|
|
89
|
-
if (input.
|
|
89
|
+
if (input.reconciliation) {
|
|
90
|
+
const checkpoint = () => { if (performance.now() >= deadlineAt)
|
|
91
|
+
throw new Error("Kiro reconciliation timed out"); };
|
|
92
|
+
checkpoint();
|
|
93
|
+
const r = input.reconciliation;
|
|
94
|
+
reply = { kind: "ok", sessions: [], diagnostics: { reads: 0, hits: 0 }, reconciliation: r.plan
|
|
95
|
+
? { receipt: applyKiroCarryReconciliation(r.input, r.plan, r.actor ?? "", checkpoint) }
|
|
96
|
+
: { plan: planKiroCarryReconciliation(r.input, r.rollbackReceipt) } };
|
|
97
|
+
}
|
|
98
|
+
else if (input.classicLinks) {
|
|
90
99
|
reply = { kind: "ok", sessions: [], diagnostics: { reads: 0, hits: 0 },
|
|
91
100
|
classicLinks: computeKiroClassicLinks(input.classicLinks, () => performance.now() >= deadlineAt) };
|
|
92
101
|
}
|
|
@@ -105,7 +114,7 @@ parentPort?.on("message", ({ id, input, deadlineAt }) => {
|
|
|
105
114
|
reply = scan(input, deadlineAt);
|
|
106
115
|
}
|
|
107
116
|
catch (err) {
|
|
108
|
-
reply = { kind: "unreadable", detail: err.message };
|
|
117
|
+
reply = { kind: "unreadable", detail: input.reconciliation && err instanceof SyntaxError ? "Malformed reconciliation data" : err.message };
|
|
109
118
|
}
|
|
110
119
|
parentPort?.postMessage({ id, reply });
|
|
111
120
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kiro-v2-store-worker.js","sourceRoot":"","sources":["../../src/backend/kiro-v2-store-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAc,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"kiro-v2-store-worker.js","sourceRoot":"","sources":["../../src/backend/kiro-v2-store-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { KiroMigrationVerificationInput } from "./kiro-migration-verify.js";
|
|
2
2
|
import type { KiroClassicArchiveInput, KiroCarryPreparation } from "./kiro-classic-archive.js";
|
|
3
3
|
import type { KiroClassicLinks, KiroClassicLinksInput } from "./kiro-classic-links.js";
|
|
4
|
+
import type { KiroReconcileInput, KiroReconcilePlan } from "./kiro-reconcile-store.js";
|
|
4
5
|
export declare const KIRO_V2_STORE_BUDGET_MS = 15000;
|
|
5
6
|
/** #2738: a classic store's compaction links read every transcript of the instance's key — its own lane, its own budget. */
|
|
6
7
|
export declare const KIRO_CLASSIC_LINKS_BUDGET_MS = 30000;
|
|
@@ -11,6 +12,12 @@ export interface KiroV2StoreInput {
|
|
|
11
12
|
carry?: Omit<KiroClassicArchiveInput, "sessionId">;
|
|
12
13
|
migration?: KiroMigrationVerificationInput;
|
|
13
14
|
classicLinks?: KiroClassicLinksInput;
|
|
15
|
+
reconciliation?: {
|
|
16
|
+
input: KiroReconcileInput;
|
|
17
|
+
plan?: KiroReconcilePlan;
|
|
18
|
+
actor?: string;
|
|
19
|
+
rollbackReceipt?: string;
|
|
20
|
+
};
|
|
14
21
|
}
|
|
15
22
|
export type KiroV2StoreReply = {
|
|
16
23
|
kind: "ok";
|
|
@@ -28,6 +35,10 @@ export type KiroV2StoreReply = {
|
|
|
28
35
|
forensic: string;
|
|
29
36
|
};
|
|
30
37
|
classicLinks?: KiroClassicLinks;
|
|
38
|
+
reconciliation?: {
|
|
39
|
+
plan?: KiroReconcilePlan;
|
|
40
|
+
receipt?: string;
|
|
41
|
+
};
|
|
31
42
|
} | {
|
|
32
43
|
kind: "unreadable";
|
|
33
44
|
detail: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kiro-v2-store.js","sourceRoot":"","sources":["../../src/backend/kiro-v2-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"kiro-v2-store.js","sourceRoot":"","sources":["../../src/backend/kiro-v2-store.ts"],"names":[],"mappings":"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"}
|
package/dist/cache-service.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type Ledger } from "./cache-ledger.js";
|
|
2
2
|
import { type InstanceAnalysis } from "./cache-analysis.js";
|
|
3
|
-
import { type UsageDays } from "./usage-rollup.js";
|
|
3
|
+
import { type UsageDays, type UsageLifetime } from "./usage-rollup.js";
|
|
4
|
+
import { type OfficeLevel } from "./office-levels.js";
|
|
4
5
|
import type { KiroScanInput, KiroScanOutput } from "./kiro-usage-scan.js";
|
|
5
6
|
import type { OpencodeScanInput, OpencodeScanOutput } from "./opencode-usage-scan.js";
|
|
6
7
|
import { type AntigravityScanInput, type AntigravityScanOutput } from "./antigravity-usage-scan.js";
|
|
@@ -113,6 +114,8 @@ export declare class CacheService {
|
|
|
113
114
|
private readonly ledgers;
|
|
114
115
|
/** #2122: each instance's daily rollup (usage-rollup.ts), beside its ledger. */
|
|
115
116
|
private readonly rollups;
|
|
117
|
+
/** #2661: each instance's carried lifetime total (usage-rollup.ts UsageLifetime), beside its rollup. */
|
|
118
|
+
private readonly lifetimes;
|
|
116
119
|
private readonly dirty;
|
|
117
120
|
/** Rollout path → the inode its session_meta was read from, and the cwd it names (null: not a session_meta). */
|
|
118
121
|
private meta;
|
|
@@ -156,6 +159,9 @@ export declare class CacheService {
|
|
|
156
159
|
private reads;
|
|
157
160
|
private zone;
|
|
158
161
|
private daysPath;
|
|
162
|
+
private lifetimePath;
|
|
163
|
+
/** #2661: an instance's carried lifetime total, read once. */
|
|
164
|
+
lifetimeFor(inst: CacheInstance): Promise<UsageLifetime>;
|
|
159
165
|
/** #2122: an instance's rollup, read once. */
|
|
160
166
|
rollupFor(inst: CacheInstance): Promise<UsageDays>;
|
|
161
167
|
/**
|
|
@@ -247,6 +253,12 @@ export declare class CacheService {
|
|
|
247
253
|
days: UsageDays;
|
|
248
254
|
}>;
|
|
249
255
|
}>;
|
|
256
|
+
/**
|
|
257
|
+
* #2661: every instance's Office level (office-levels.ts), from its ledger, rollup and lifetime file as they are now —
|
|
258
|
+
* read in place, one instance at a time with no await between its reads (as usageData copies them), never copied or changed.
|
|
259
|
+
* Never reads a transcript (a catch-up is started, not waited for).
|
|
260
|
+
*/
|
|
261
|
+
officeLevels(now: number): Promise<Record<string, OfficeLevel>>;
|
|
250
262
|
/** The analysis for a window, from the ledgers as they are now (a catch-up is started, not waited for). */
|
|
251
263
|
report(window: CacheWindow): Promise<CacheReport>;
|
|
252
264
|
}
|
package/dist/cache-service.js
CHANGED
|
@@ -22,7 +22,8 @@ import { scanJsonl } from "./cache-scan.js";
|
|
|
22
22
|
import { addTurn, claudeLine, codexLine, emptyLedger, grokLine, museLine, KEEP_DAYS, pruneLedger, reviveLedger } from "./cache-ledger.js";
|
|
23
23
|
import { analyzeLedger } from "./cache-analysis.js";
|
|
24
24
|
import { PRICES_CHECKED, PRICE_SOURCES } from "./cache-prices.js";
|
|
25
|
-
import { addCoverage, foldHours, pruneDays, readDays, writeDays } from "./usage-rollup.js";
|
|
25
|
+
import { addCoverage, carryPruned, foldHours, pruneDays, readDays, readLifetime, writeDays } from "./usage-rollup.js";
|
|
26
|
+
import { officeLevels } from "./office-levels.js";
|
|
26
27
|
import { antigravityUsageSupported } from "./antigravity-usage-scan.js";
|
|
27
28
|
export const WINDOWS = { "24h": 86_400_000, "7d": 7 * 86_400_000, "30d": 30 * 86_400_000 };
|
|
28
29
|
/** A window name as asked (a query string, a tool argument); anything unknown is the default, 7 days. */
|
|
@@ -41,6 +42,8 @@ export class CacheService {
|
|
|
41
42
|
ledgers = new Map();
|
|
42
43
|
/** #2122: each instance's daily rollup (usage-rollup.ts), beside its ledger. */
|
|
43
44
|
rollups = new Map();
|
|
45
|
+
/** #2661: each instance's carried lifetime total (usage-rollup.ts UsageLifetime), beside its rollup. */
|
|
46
|
+
lifetimes = new Map();
|
|
44
47
|
dirty = new Set();
|
|
45
48
|
/** Rollout path → the inode its session_meta was read from, and the cwd it names (null: not a session_meta). */
|
|
46
49
|
meta = null;
|
|
@@ -138,6 +141,19 @@ export class CacheService {
|
|
|
138
141
|
}
|
|
139
142
|
zone() { return this.o.zone?.() || Intl.DateTimeFormat().resolvedOptions().timeZone || "UTC"; }
|
|
140
143
|
daysPath(inst) { return join(dirname(inst.ledgerPath), "usage-days.json"); }
|
|
144
|
+
lifetimePath(inst) { return join(dirname(inst.ledgerPath), "usage-lifetime.json"); }
|
|
145
|
+
/** #2661: an instance's carried lifetime total, read once. */
|
|
146
|
+
async lifetimeFor(inst) {
|
|
147
|
+
let l = this.lifetimes.get(inst.name);
|
|
148
|
+
if (l)
|
|
149
|
+
return l;
|
|
150
|
+
l = await readLifetime(this.lifetimePath(inst));
|
|
151
|
+
const again = this.lifetimes.get(inst.name);
|
|
152
|
+
if (again)
|
|
153
|
+
return again;
|
|
154
|
+
this.lifetimes.set(inst.name, l);
|
|
155
|
+
return l;
|
|
156
|
+
}
|
|
141
157
|
/** #2122: an instance's rollup, read once. */
|
|
142
158
|
async rollupFor(inst) {
|
|
143
159
|
let d = this.rollups.get(inst.name);
|
|
@@ -158,7 +174,16 @@ export class CacheService {
|
|
|
158
174
|
const current = await this.rollupFor(inst);
|
|
159
175
|
const next = structuredClone(current);
|
|
160
176
|
const folded = foldHours(next, ledger, cutoff, this.zone());
|
|
161
|
-
|
|
177
|
+
// #2661: the days about to be pruned are carried into the lifetime file first, and pruned only once it is on disk
|
|
178
|
+
// (usage-rollup.ts UsageLifetime: a crash between the two writes never counts a day twice or loses one).
|
|
179
|
+
const life = structuredClone(await this.lifetimeFor(inst));
|
|
180
|
+
if (carryPruned(life, next, this.now(), this.zone())) {
|
|
181
|
+
if (await writeDays(this.lifetimePath(inst), life))
|
|
182
|
+
this.lifetimes.set(inst.name, life);
|
|
183
|
+
else
|
|
184
|
+
this.o.log?.("warn", "usage lifetime: could not be saved; the rollup keeps those days until it can", { instance: inst.name });
|
|
185
|
+
}
|
|
186
|
+
const pruned = pruneDays(next, this.now(), this.zone(), (await this.lifetimeFor(inst)).through);
|
|
162
187
|
if (!folded && !pruned)
|
|
163
188
|
return current.checkpoint;
|
|
164
189
|
if (!(await writeDays(this.daysPath(inst), next))) {
|
|
@@ -825,6 +850,24 @@ export class CacheService {
|
|
|
825
850
|
}
|
|
826
851
|
return { scanning: this.scanning(), instances: out };
|
|
827
852
|
}
|
|
853
|
+
/**
|
|
854
|
+
* #2661: every instance's Office level (office-levels.ts), from its ledger, rollup and lifetime file as they are now —
|
|
855
|
+
* read in place, one instance at a time with no await between its reads (as usageData copies them), never copied or changed.
|
|
856
|
+
* Never reads a transcript (a catch-up is started, not waited for).
|
|
857
|
+
*/
|
|
858
|
+
async officeLevels(now) {
|
|
859
|
+
this.start();
|
|
860
|
+
void this.kick();
|
|
861
|
+
const out = Object.create(null);
|
|
862
|
+
for (const inst of this.o.instances()) {
|
|
863
|
+
await this.ledgerFor(inst);
|
|
864
|
+
await this.rollupFor(inst);
|
|
865
|
+
await this.lifetimeFor(inst);
|
|
866
|
+
const one = officeLevels({ now, zone: this.zone(), instances: [{ name: inst.name, ledger: this.ledgers.get(inst.name), days: this.rollups.get(inst.name), life: this.lifetimes.get(inst.name) }] });
|
|
867
|
+
out[inst.name] = one[inst.name];
|
|
868
|
+
}
|
|
869
|
+
return out;
|
|
870
|
+
}
|
|
828
871
|
/** The analysis for a window, from the ledgers as they are now (a catch-up is started, not waited for). */
|
|
829
872
|
async report(window) {
|
|
830
873
|
this.start();
|