@pegma/support-desk-application 0.1.0 → 0.2.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 +228 -7
- package/dist/assistant-turn-capacity.d.ts +13 -0
- package/dist/assistant-turn-capacity.d.ts.map +1 -0
- package/dist/assistant-turn-capacity.js +111 -0
- package/dist/assistant-turn-capacity.js.map +1 -0
- package/dist/assistant-turn-records.d.ts +68 -0
- package/dist/assistant-turn-records.d.ts.map +1 -0
- package/dist/assistant-turn-records.js +418 -0
- package/dist/assistant-turn-records.js.map +1 -0
- package/dist/assistant-turn-types.d.ts +133 -0
- package/dist/assistant-turn-types.d.ts.map +1 -0
- package/dist/assistant-turn-types.js +2 -0
- package/dist/assistant-turn-types.js.map +1 -0
- package/dist/assistant-turns.d.ts +42 -0
- package/dist/assistant-turns.d.ts.map +1 -0
- package/dist/assistant-turns.js +640 -0
- package/dist/assistant-turns.js.map +1 -0
- package/dist/engineering-evidence.d.ts +20 -0
- package/dist/engineering-evidence.d.ts.map +1 -0
- package/dist/engineering-evidence.js +899 -0
- package/dist/engineering-evidence.js.map +1 -0
- package/dist/engineering-followup-internal.d.ts +45 -0
- package/dist/engineering-followup-internal.d.ts.map +1 -0
- package/dist/engineering-followup-internal.js +2 -0
- package/dist/engineering-followup-internal.js.map +1 -0
- package/dist/engineering-followup-records.d.ts +209 -0
- package/dist/engineering-followup-records.d.ts.map +1 -0
- package/dist/engineering-followup-records.js +1434 -0
- package/dist/engineering-followup-records.js.map +1 -0
- package/dist/engineering-followup-source.d.ts +168 -0
- package/dist/engineering-followup-source.d.ts.map +1 -0
- package/dist/engineering-followup-source.js +1144 -0
- package/dist/engineering-followup-source.js.map +1 -0
- package/dist/engineering-followup-types.d.ts +364 -0
- package/dist/engineering-followup-types.d.ts.map +1 -0
- package/dist/engineering-followup-types.js +2 -0
- package/dist/engineering-followup-types.js.map +1 -0
- package/dist/engineering-followup-work.d.ts +70 -0
- package/dist/engineering-followup-work.d.ts.map +1 -0
- package/dist/engineering-followup-work.js +1153 -0
- package/dist/engineering-followup-work.js.map +1 -0
- package/dist/engineering-internal.d.ts +38 -0
- package/dist/engineering-internal.d.ts.map +1 -0
- package/dist/engineering-internal.js +11 -0
- package/dist/engineering-internal.js.map +1 -0
- package/dist/engineering-policy.d.ts +47 -0
- package/dist/engineering-policy.d.ts.map +1 -0
- package/dist/engineering-policy.js +579 -0
- package/dist/engineering-policy.js.map +1 -0
- package/dist/engineering-reconciliation.d.ts +6 -0
- package/dist/engineering-reconciliation.d.ts.map +1 -0
- package/dist/engineering-reconciliation.js +464 -0
- package/dist/engineering-reconciliation.js.map +1 -0
- package/dist/engineering-records.d.ts +227 -0
- package/dist/engineering-records.d.ts.map +1 -0
- package/dist/engineering-records.js +1272 -0
- package/dist/engineering-records.js.map +1 -0
- package/dist/engineering-types.d.ts +505 -0
- package/dist/engineering-types.d.ts.map +1 -0
- package/dist/engineering-types.js +2 -0
- package/dist/engineering-types.js.map +1 -0
- package/dist/engineering-work.d.ts +32 -0
- package/dist/engineering-work.d.ts.map +1 -0
- package/dist/engineering-work.js +1757 -0
- package/dist/engineering-work.js.map +1 -0
- package/dist/index.d.ts +609 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3568 -204
- package/dist/index.js.map +1 -1
- package/dist/resolution-learning-records.d.ts +154 -0
- package/dist/resolution-learning-records.d.ts.map +1 -0
- package/dist/resolution-learning-records.js +657 -0
- package/dist/resolution-learning-records.js.map +1 -0
- package/dist/resolution-learning-types.d.ts +356 -0
- package/dist/resolution-learning-types.d.ts.map +1 -0
- package/dist/resolution-learning-types.js +2 -0
- package/dist/resolution-learning-types.js.map +1 -0
- package/dist/resolution-learning-worker.d.ts +21 -0
- package/dist/resolution-learning-worker.d.ts.map +1 -0
- package/dist/resolution-learning-worker.js +1027 -0
- package/dist/resolution-learning-worker.js.map +1 -0
- package/dist/resolution-learning.d.ts +38 -0
- package/dist/resolution-learning.d.ts.map +1 -0
- package/dist/resolution-learning.js +860 -0
- package/dist/resolution-learning.js.map +1 -0
- package/package.json +8 -8
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
import { auditEvent, auditRecordId, defineAudit, } from "@pegma/audit";
|
|
2
|
+
import { hasPermission } from "@pegma/authorization-core";
|
|
3
|
+
import { defineCollection, } from "@pegma/storage-core";
|
|
4
|
+
import { SupportDeskAuthorizationError, SupportDeskConflictError, SupportDeskLimitError, supportPermissions, } from "./index.js";
|
|
5
|
+
import { dataArray, encodedBytes, fields, fingerprint, integer, text, timestamp, } from "./assistant-turn-records.js";
|
|
6
|
+
export const engineeringPolicyAuditActions = Object.freeze({
|
|
7
|
+
changed: "support.engineering.policy_changed",
|
|
8
|
+
disabled: "support.engineering.exports_disabled",
|
|
9
|
+
});
|
|
10
|
+
const partition = "instance";
|
|
11
|
+
const headKey = Object.freeze({ partition, id: "policy" });
|
|
12
|
+
const emergencyRows = 2;
|
|
13
|
+
const maximumRecordBytes = 60_000;
|
|
14
|
+
const hardMaximumRepositories = 20;
|
|
15
|
+
const maximumHistoryPage = 64;
|
|
16
|
+
function boolean(value, field) {
|
|
17
|
+
if (typeof value !== "boolean")
|
|
18
|
+
throw new TypeError(`${field} must be boolean`);
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
function hash(value, field) {
|
|
22
|
+
if (typeof value !== "string" || !/^[a-f0-9]{64}$/.test(value))
|
|
23
|
+
throw new TypeError(`${field} must be a SHA-256 fingerprint`);
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
function uniqueStrings(value, field, maximum, characters) {
|
|
27
|
+
const result = dataArray(value, field, maximum).map((item) => text(item, field, characters));
|
|
28
|
+
if (new Set(result).size !== result.length)
|
|
29
|
+
throw new TypeError(`${field} must be unique`);
|
|
30
|
+
return Object.freeze(result);
|
|
31
|
+
}
|
|
32
|
+
function repository(value) {
|
|
33
|
+
const input = fields(value, "engineering repository", [
|
|
34
|
+
"repositoryId",
|
|
35
|
+
"owner",
|
|
36
|
+
"name",
|
|
37
|
+
"visibility",
|
|
38
|
+
"responsibilities",
|
|
39
|
+
"product",
|
|
40
|
+
"component",
|
|
41
|
+
"version",
|
|
42
|
+
"allowedLabels",
|
|
43
|
+
"allowedTemplates",
|
|
44
|
+
"publicationMode",
|
|
45
|
+
"enabled",
|
|
46
|
+
]);
|
|
47
|
+
if (input.visibility !== "public" && input.visibility !== "private")
|
|
48
|
+
throw new TypeError("Repository visibility must be public or private");
|
|
49
|
+
if (input.publicationMode !== "approval_required")
|
|
50
|
+
throw new TypeError("Engineering exports require staff approval");
|
|
51
|
+
const repositoryId = text(input.repositoryId, "repositoryId");
|
|
52
|
+
const owner = text(input.owner, "repository.owner");
|
|
53
|
+
const name = text(input.name, "repository.name");
|
|
54
|
+
for (const identifier of [repositoryId, owner, name])
|
|
55
|
+
if (identifier.trim() !== identifier || identifier.includes("://"))
|
|
56
|
+
throw new TypeError("Repository identity must use separate opaque ID, owner and name fields");
|
|
57
|
+
if (owner.includes("/") || name.includes("/"))
|
|
58
|
+
throw new TypeError("Repository owner and name must be separate fields");
|
|
59
|
+
return Object.freeze({
|
|
60
|
+
repositoryId,
|
|
61
|
+
owner,
|
|
62
|
+
name,
|
|
63
|
+
visibility: input.visibility,
|
|
64
|
+
responsibilities: text(input.responsibilities, "repository.responsibilities", 2_000),
|
|
65
|
+
product: text(input.product, "repository.product", 1_000),
|
|
66
|
+
component: text(input.component, "repository.component", 1_000),
|
|
67
|
+
version: text(input.version, "repository.version", 1_000),
|
|
68
|
+
allowedLabels: uniqueStrings(input.allowedLabels, "repository.allowedLabels", 32, 100),
|
|
69
|
+
allowedTemplates: uniqueStrings(input.allowedTemplates, "repository.allowedTemplates", 8, 200),
|
|
70
|
+
publicationMode: "approval_required",
|
|
71
|
+
enabled: boolean(input.enabled, "repository.enabled"),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function policy(value) {
|
|
75
|
+
const input = fields(value, "engineering policy", [
|
|
76
|
+
"enabled",
|
|
77
|
+
"repositories",
|
|
78
|
+
]);
|
|
79
|
+
const repositories = dataArray(input.repositories, "engineering policy.repositories", hardMaximumRepositories).map(repository);
|
|
80
|
+
if (new Set(repositories.map((item) => item.repositoryId)).size !==
|
|
81
|
+
repositories.length)
|
|
82
|
+
throw new TypeError("Repository policy must have unique immutable repository IDs");
|
|
83
|
+
return Object.freeze({
|
|
84
|
+
enabled: boolean(input.enabled, "engineering policy.enabled"),
|
|
85
|
+
repositories: Object.freeze(repositories),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function result(value) {
|
|
89
|
+
const input = fields(value, "engineering policy result", [
|
|
90
|
+
"generation",
|
|
91
|
+
"policyHash",
|
|
92
|
+
"enabled",
|
|
93
|
+
]);
|
|
94
|
+
return Object.freeze({
|
|
95
|
+
generation: integer(input.generation, "engineering policy generation"),
|
|
96
|
+
policyHash: hash(input.policyHash, "policyHash"),
|
|
97
|
+
enabled: boolean(input.enabled, "engineering policy result.enabled"),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function record(value) {
|
|
101
|
+
const envelope = fields(value, "engineering policy record", ["kind", "partition", "id"], [
|
|
102
|
+
"generation",
|
|
103
|
+
"policyHash",
|
|
104
|
+
"policy",
|
|
105
|
+
"fingerprint",
|
|
106
|
+
"result",
|
|
107
|
+
"event",
|
|
108
|
+
"occurredAt",
|
|
109
|
+
]);
|
|
110
|
+
if (envelope.partition !== partition)
|
|
111
|
+
throw new TypeError("Engineering policy must use the instance partition");
|
|
112
|
+
text(envelope.id, "engineering policy record.id", 1_024);
|
|
113
|
+
if (envelope.kind === "engineering_policy") {
|
|
114
|
+
fields(value, "engineering policy head", [
|
|
115
|
+
"kind",
|
|
116
|
+
"partition",
|
|
117
|
+
"id",
|
|
118
|
+
"generation",
|
|
119
|
+
"policyHash",
|
|
120
|
+
"policy",
|
|
121
|
+
]);
|
|
122
|
+
if (envelope.id !== headKey.id)
|
|
123
|
+
throw new TypeError("Engineering policy head key mismatch");
|
|
124
|
+
return Object.freeze({
|
|
125
|
+
kind: "engineering_policy",
|
|
126
|
+
partition,
|
|
127
|
+
id: "policy",
|
|
128
|
+
generation: integer(envelope.generation, "engineering policy generation", 1),
|
|
129
|
+
policyHash: hash(envelope.policyHash, "policyHash"),
|
|
130
|
+
policy: policy(envelope.policy),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
if (envelope.kind === "engineering_policy_command") {
|
|
134
|
+
fields(value, "engineering policy receipt", ["kind", "partition", "id", "fingerprint", "result"], ["occurredAt"]);
|
|
135
|
+
if (!envelope.id.startsWith("command:"))
|
|
136
|
+
throw new TypeError("Engineering policy receipt key mismatch");
|
|
137
|
+
text(envelope.id.slice("command:".length), "stored commandId");
|
|
138
|
+
const accepted = result(envelope.result);
|
|
139
|
+
integer(accepted.generation, "stored engineering policy generation", 1);
|
|
140
|
+
if (envelope.occurredAt !== undefined)
|
|
141
|
+
timestamp(envelope.occurredAt, "stored receipt occurredAt");
|
|
142
|
+
return Object.freeze({
|
|
143
|
+
kind: "engineering_policy_command",
|
|
144
|
+
partition,
|
|
145
|
+
id: envelope.id,
|
|
146
|
+
fingerprint: hash(envelope.fingerprint, "command fingerprint"),
|
|
147
|
+
result: accepted,
|
|
148
|
+
...(envelope.occurredAt === undefined
|
|
149
|
+
? {}
|
|
150
|
+
: { occurredAt: envelope.occurredAt }),
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (envelope.kind === "audit") {
|
|
154
|
+
fields(value, "engineering policy audit", [
|
|
155
|
+
"kind",
|
|
156
|
+
"partition",
|
|
157
|
+
"id",
|
|
158
|
+
"event",
|
|
159
|
+
]);
|
|
160
|
+
const event = auditEvent(envelope.event);
|
|
161
|
+
if (event.subject !== partition ||
|
|
162
|
+
envelope.id !== auditRecordId(event.id) ||
|
|
163
|
+
!Object.values(engineeringPolicyAuditActions).includes(event.action))
|
|
164
|
+
throw new TypeError("Engineering policy audit envelope mismatch");
|
|
165
|
+
text(event.id, "stored audit commandId");
|
|
166
|
+
if (event.actor.kind !== "principal")
|
|
167
|
+
throw new TypeError("Engineering policy changes require a principal actor");
|
|
168
|
+
text(event.actor.principalId, "stored audit principalId");
|
|
169
|
+
timestamp(event.occurredAt, "stored audit occurredAt");
|
|
170
|
+
const details = fields(event.details, "engineering policy audit details", [
|
|
171
|
+
"commandId",
|
|
172
|
+
"correlationId",
|
|
173
|
+
"generation",
|
|
174
|
+
"policyHash",
|
|
175
|
+
"enabled",
|
|
176
|
+
]);
|
|
177
|
+
if (details.commandId !== event.id || details.generation !== event.sequence)
|
|
178
|
+
throw new TypeError("Engineering policy Audit must bind its command and generation");
|
|
179
|
+
text(details.correlationId, "stored audit correlationId");
|
|
180
|
+
integer(details.generation, "stored audit generation", 1);
|
|
181
|
+
hash(details.policyHash, "stored audit policyHash");
|
|
182
|
+
boolean(details.enabled, "stored audit enabled");
|
|
183
|
+
return Object.freeze({
|
|
184
|
+
kind: "audit",
|
|
185
|
+
partition,
|
|
186
|
+
id: envelope.id,
|
|
187
|
+
event,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
throw new TypeError("Unknown engineering policy record kind");
|
|
191
|
+
}
|
|
192
|
+
function stored(value) {
|
|
193
|
+
const normalized = record(value);
|
|
194
|
+
const encoded = {
|
|
195
|
+
partition,
|
|
196
|
+
id: normalized.id,
|
|
197
|
+
json: JSON.stringify(normalized),
|
|
198
|
+
};
|
|
199
|
+
if (encodedBytes(encoded) > maximumRecordBytes)
|
|
200
|
+
throw new SupportDeskLimitError("serialized_record", maximumRecordBytes);
|
|
201
|
+
return encoded;
|
|
202
|
+
}
|
|
203
|
+
/** The policy, causal Audit and replay receipt share one declared partition. */
|
|
204
|
+
export const engineeringPolicyRecords = defineCollection({
|
|
205
|
+
name: "support-desk.engineering-policy.v1",
|
|
206
|
+
key: (value) => ({ partition: value.partition, id: value.id }),
|
|
207
|
+
codec: {
|
|
208
|
+
encode: stored,
|
|
209
|
+
decode(encoded) {
|
|
210
|
+
if (encoded.partition !== partition ||
|
|
211
|
+
typeof encoded.id !== "string" ||
|
|
212
|
+
typeof encoded.json !== "string")
|
|
213
|
+
throw new TypeError("Engineering policy storage envelope is invalid");
|
|
214
|
+
if (encodedBytes(encoded) > maximumRecordBytes)
|
|
215
|
+
throw new SupportDeskLimitError("serialized_record", maximumRecordBytes);
|
|
216
|
+
const decoded = record(JSON.parse(encoded.json));
|
|
217
|
+
if (decoded.id !== encoded.id)
|
|
218
|
+
throw new TypeError("Engineering policy storage key mismatch");
|
|
219
|
+
return decoded;
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
export const engineeringPolicyAudit = defineAudit({
|
|
224
|
+
collection: engineeringPolicyRecords,
|
|
225
|
+
toRecord(event) {
|
|
226
|
+
return record({
|
|
227
|
+
kind: "audit",
|
|
228
|
+
partition: event.subject,
|
|
229
|
+
id: auditRecordId(event.id),
|
|
230
|
+
event,
|
|
231
|
+
});
|
|
232
|
+
},
|
|
233
|
+
toEvent(value) {
|
|
234
|
+
if (value.kind !== "audit")
|
|
235
|
+
return null;
|
|
236
|
+
const normalized = record(value);
|
|
237
|
+
return normalized.kind === "audit" ? normalized.event : null;
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
function acknowledgement(snapshot) {
|
|
241
|
+
return Object.freeze({
|
|
242
|
+
generation: snapshot.generation,
|
|
243
|
+
policyHash: snapshot.policyHash,
|
|
244
|
+
enabled: snapshot.policy.enabled,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
function snapshot(head) {
|
|
248
|
+
return Object.freeze({
|
|
249
|
+
generation: head.generation,
|
|
250
|
+
policyHash: head.policyHash,
|
|
251
|
+
policy: policy(head.policy),
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
function command(value, put) {
|
|
255
|
+
const input = fields(value, "engineering policy command", [
|
|
256
|
+
"commandId",
|
|
257
|
+
"correlationId",
|
|
258
|
+
"expectedGeneration",
|
|
259
|
+
...(put ? ["policy"] : []),
|
|
260
|
+
]);
|
|
261
|
+
const common = {
|
|
262
|
+
commandId: text(input.commandId, "commandId"),
|
|
263
|
+
correlationId: text(input.correlationId, "correlationId"),
|
|
264
|
+
expectedGeneration: integer(input.expectedGeneration, "expectedGeneration"),
|
|
265
|
+
};
|
|
266
|
+
return Object.freeze(put ? { ...common, policy: policy(input.policy) } : common);
|
|
267
|
+
}
|
|
268
|
+
export function createEngineeringPolicyServices(options) {
|
|
269
|
+
const records = options.store.collection(engineeringPolicyRecords);
|
|
270
|
+
const maxRepositories = integer(options.maxRepositories ?? 8, "engineeringPolicy.maxRepositories", 1, hardMaximumRepositories);
|
|
271
|
+
const maxRecords = integer(options.maxRecords ?? 256, "engineeringPolicy.maxRecords", 5, 1_024);
|
|
272
|
+
const maxAttempts = integer(options.maxConflictAttempts ?? 4, "maxConflictAttempts", 1, 20);
|
|
273
|
+
const historyRetentionMilliseconds = integer(options.historyRetentionMilliseconds ?? 2_592_000_000, "engineeringPolicy.historyRetentionMilliseconds", 1);
|
|
274
|
+
const authorizeRead = (access, actorId) => {
|
|
275
|
+
const currentActor = text(access.principalId, "principalId");
|
|
276
|
+
if (actorId !== undefined && currentActor !== actorId)
|
|
277
|
+
throw new SupportDeskConflictError("Engineering policy actor changed");
|
|
278
|
+
if (hasPermission(access, supportPermissions.engineeringProcess))
|
|
279
|
+
return;
|
|
280
|
+
if (!hasPermission(access, supportPermissions.engineeringPolicyRead))
|
|
281
|
+
throw new SupportDeskAuthorizationError(supportPermissions.engineeringPolicyRead);
|
|
282
|
+
if (!hasPermission(access, supportPermissions.queueRead))
|
|
283
|
+
throw new SupportDeskAuthorizationError(supportPermissions.queueRead);
|
|
284
|
+
};
|
|
285
|
+
const authorizeManage = (access, actorId) => {
|
|
286
|
+
const currentActor = text(access.principalId, "principalId");
|
|
287
|
+
if (actorId !== undefined && currentActor !== actorId)
|
|
288
|
+
throw new SupportDeskConflictError("Engineering policy actor changed");
|
|
289
|
+
if (!hasPermission(access, supportPermissions.engineeringPolicyManage))
|
|
290
|
+
throw new SupportDeskAuthorizationError(supportPermissions.engineeringPolicyManage);
|
|
291
|
+
if (!hasPermission(access, supportPermissions.queueRead))
|
|
292
|
+
throw new SupportDeskAuthorizationError(supportPermissions.queueRead);
|
|
293
|
+
};
|
|
294
|
+
const empty = async () => {
|
|
295
|
+
const value = Object.freeze({
|
|
296
|
+
enabled: false,
|
|
297
|
+
repositories: Object.freeze([]),
|
|
298
|
+
});
|
|
299
|
+
return Object.freeze({
|
|
300
|
+
generation: 0,
|
|
301
|
+
policyHash: await fingerprint(value),
|
|
302
|
+
policy: value,
|
|
303
|
+
});
|
|
304
|
+
};
|
|
305
|
+
const readHead = async () => {
|
|
306
|
+
const head = await records.getVersioned(headKey);
|
|
307
|
+
if (head === null)
|
|
308
|
+
return null;
|
|
309
|
+
if (head.value.kind !== "engineering_policy" ||
|
|
310
|
+
head.value.policyHash !== (await fingerprint(head.value.policy)))
|
|
311
|
+
throw new TypeError("Engineering policy head fingerprint mismatch");
|
|
312
|
+
return { value: head.value, version: head.version };
|
|
313
|
+
};
|
|
314
|
+
const replay = async (id, fingerprint) => {
|
|
315
|
+
const previous = await records.get({ partition, id: `command:${id}` });
|
|
316
|
+
if (previous === null)
|
|
317
|
+
return null;
|
|
318
|
+
if (previous.kind !== "engineering_policy_command" ||
|
|
319
|
+
previous.fingerprint !== fingerprint)
|
|
320
|
+
throw new SupportDeskConflictError("Engineering policy command ID reused with different input");
|
|
321
|
+
return result(previous.result);
|
|
322
|
+
};
|
|
323
|
+
const mutate = async (access, raw, disable) => {
|
|
324
|
+
const actorId = text(access.principalId, "principalId");
|
|
325
|
+
authorizeManage(access, actorId);
|
|
326
|
+
const input = command(raw, !disable);
|
|
327
|
+
if (!disable &&
|
|
328
|
+
input.policy.repositories.length >
|
|
329
|
+
maxRepositories)
|
|
330
|
+
throw new SupportDeskLimitError("engineering_policy_repositories", maxRepositories);
|
|
331
|
+
const requestHash = await fingerprint({
|
|
332
|
+
operation: disable ? "disable" : "put",
|
|
333
|
+
actorId,
|
|
334
|
+
command: input,
|
|
335
|
+
});
|
|
336
|
+
for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
|
|
337
|
+
authorizeManage(access, actorId);
|
|
338
|
+
const previous = await replay(input.commandId, requestHash);
|
|
339
|
+
if (previous !== null) {
|
|
340
|
+
authorizeManage(access, actorId);
|
|
341
|
+
return previous;
|
|
342
|
+
}
|
|
343
|
+
const head = await readHead();
|
|
344
|
+
const current = head === null ? await empty() : snapshot(head.value);
|
|
345
|
+
if (current.generation !== input.expectedGeneration)
|
|
346
|
+
throw new SupportDeskConflictError("Engineering policy generation changed");
|
|
347
|
+
if (disable && !current.policy.enabled) {
|
|
348
|
+
authorizeManage(access, actorId);
|
|
349
|
+
return acknowledgement(current);
|
|
350
|
+
}
|
|
351
|
+
const nextGeneration = integer(current.generation + 1, "engineering policy generation", 1);
|
|
352
|
+
const nextPolicy = disable
|
|
353
|
+
? Object.freeze({ ...current.policy, enabled: false })
|
|
354
|
+
: input.policy;
|
|
355
|
+
const next = {
|
|
356
|
+
kind: "engineering_policy",
|
|
357
|
+
partition,
|
|
358
|
+
id: "policy",
|
|
359
|
+
generation: nextGeneration,
|
|
360
|
+
policyHash: await fingerprint(nextPolicy),
|
|
361
|
+
policy: nextPolicy,
|
|
362
|
+
};
|
|
363
|
+
stored(next);
|
|
364
|
+
// An accepted enabled head must still fit its future emergency disable,
|
|
365
|
+
// including a generation-width increase. Personal metadata stays in Audit.
|
|
366
|
+
if (nextPolicy.enabled)
|
|
367
|
+
stored({
|
|
368
|
+
...next,
|
|
369
|
+
generation: Number.MAX_SAFE_INTEGER,
|
|
370
|
+
policy: Object.freeze({ ...nextPolicy, enabled: false }),
|
|
371
|
+
});
|
|
372
|
+
if (nextPolicy.enabled && nextGeneration === Number.MAX_SAFE_INTEGER)
|
|
373
|
+
throw new SupportDeskConflictError("Engineering policy generation has no remaining disable fence");
|
|
374
|
+
const rows = await records.list(partition);
|
|
375
|
+
const added = head === null ? 3 : 2;
|
|
376
|
+
const maximum = disable ? maxRecords : maxRecords - emergencyRows;
|
|
377
|
+
if (rows.length + added > maximum)
|
|
378
|
+
throw new SupportDeskLimitError("engineering_policy_records", maxRecords);
|
|
379
|
+
const now = options.clock.now();
|
|
380
|
+
timestamp(now, "engineering policy occurredAt");
|
|
381
|
+
const accepted = acknowledgement(next);
|
|
382
|
+
const receipt = {
|
|
383
|
+
kind: "engineering_policy_command",
|
|
384
|
+
partition,
|
|
385
|
+
id: `command:${input.commandId}`,
|
|
386
|
+
fingerprint: requestHash,
|
|
387
|
+
result: accepted,
|
|
388
|
+
occurredAt: now,
|
|
389
|
+
};
|
|
390
|
+
const audit = engineeringPolicyAudit.action({
|
|
391
|
+
id: input.commandId,
|
|
392
|
+
occurredAt: now,
|
|
393
|
+
actor: { kind: "principal", principalId: actorId },
|
|
394
|
+
action: disable
|
|
395
|
+
? engineeringPolicyAuditActions.disabled
|
|
396
|
+
: engineeringPolicyAuditActions.changed,
|
|
397
|
+
subject: partition,
|
|
398
|
+
sequence: next.generation,
|
|
399
|
+
details: {
|
|
400
|
+
commandId: input.commandId,
|
|
401
|
+
correlationId: input.correlationId,
|
|
402
|
+
generation: next.generation,
|
|
403
|
+
policyHash: next.policyHash,
|
|
404
|
+
enabled: next.policy.enabled,
|
|
405
|
+
},
|
|
406
|
+
});
|
|
407
|
+
stored(receipt);
|
|
408
|
+
if (audit.action === "delete")
|
|
409
|
+
throw new TypeError("Policy Audit must append a record");
|
|
410
|
+
stored(audit.value);
|
|
411
|
+
const actions = [
|
|
412
|
+
head === null
|
|
413
|
+
? { action: "insert", value: next }
|
|
414
|
+
: { action: "putIfUnchanged", version: head.version, value: next },
|
|
415
|
+
audit,
|
|
416
|
+
{ action: "insert", value: receipt },
|
|
417
|
+
];
|
|
418
|
+
authorizeManage(access, actorId);
|
|
419
|
+
if ((await records.transact(partition, actions)).committed) {
|
|
420
|
+
authorizeManage(access, actorId);
|
|
421
|
+
return accepted;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
authorizeManage(access, actorId);
|
|
425
|
+
const previous = await replay(input.commandId, requestHash);
|
|
426
|
+
if (previous !== null) {
|
|
427
|
+
authorizeManage(access, actorId);
|
|
428
|
+
return previous;
|
|
429
|
+
}
|
|
430
|
+
throw new SupportDeskConflictError("Engineering policy did not commit within its conflict bound");
|
|
431
|
+
};
|
|
432
|
+
const read = async (access) => {
|
|
433
|
+
const actorId = text(access.principalId, "principalId");
|
|
434
|
+
authorizeRead(access, actorId);
|
|
435
|
+
const head = await readHead();
|
|
436
|
+
const current = head === null ? await empty() : snapshot(head.value);
|
|
437
|
+
authorizeRead(access, actorId);
|
|
438
|
+
return current;
|
|
439
|
+
};
|
|
440
|
+
const prune = async (access, raw) => {
|
|
441
|
+
const actorId = text(access.principalId, "principalId");
|
|
442
|
+
authorizeManage(access, actorId);
|
|
443
|
+
const bounds = fields(raw, "engineering policy history bounds", ["limit"], ["cursor"]);
|
|
444
|
+
const limit = integer(bounds.limit, "engineering policy history limit", 1, maximumHistoryPage);
|
|
445
|
+
if (bounds.cursor !== undefined && typeof bounds.cursor !== "string")
|
|
446
|
+
throw new TypeError("Engineering policy history cursor must be a string");
|
|
447
|
+
const now = timestamp(options.clock.now(), "engineering policy history now");
|
|
448
|
+
const page = await records.scan({
|
|
449
|
+
limit,
|
|
450
|
+
...(bounds.cursor === undefined
|
|
451
|
+
? {}
|
|
452
|
+
: { cursor: bounds.cursor }),
|
|
453
|
+
});
|
|
454
|
+
authorizeManage(access, actorId);
|
|
455
|
+
if (page.records.length > limit)
|
|
456
|
+
throw new TypeError("Engineering policy history scan exceeded its physical bound");
|
|
457
|
+
const head = await readHead();
|
|
458
|
+
authorizeManage(access, actorId);
|
|
459
|
+
let examinedPairs = 0;
|
|
460
|
+
let deletedRows = 0;
|
|
461
|
+
let deletedPairs = 0;
|
|
462
|
+
let incompletePairs = 0;
|
|
463
|
+
const visited = new Set();
|
|
464
|
+
const oldEnough = (occurredAt) => now - timestamp(occurredAt, "engineering policy history occurredAt") >=
|
|
465
|
+
historyRetentionMilliseconds;
|
|
466
|
+
const currentHead = async () => {
|
|
467
|
+
authorizeManage(access, actorId);
|
|
468
|
+
const current = await readHead();
|
|
469
|
+
authorizeManage(access, actorId);
|
|
470
|
+
return (head !== null && current !== null && current.version === head.version);
|
|
471
|
+
};
|
|
472
|
+
for (const entry of page.records) {
|
|
473
|
+
if (head === null || entry.value.kind === "engineering_policy")
|
|
474
|
+
continue;
|
|
475
|
+
if (entry.key.partition !== partition ||
|
|
476
|
+
entry.key.id !== entry.value.id)
|
|
477
|
+
continue;
|
|
478
|
+
const id = entry.value.kind === "audit"
|
|
479
|
+
? entry.value.event.id
|
|
480
|
+
: entry.value.id.slice("command:".length);
|
|
481
|
+
if (visited.has(id))
|
|
482
|
+
continue;
|
|
483
|
+
visited.add(id);
|
|
484
|
+
examinedPairs += 1;
|
|
485
|
+
const receiptKey = { partition, id: `command:${id}` };
|
|
486
|
+
const auditKey = { partition, id: auditRecordId(id) };
|
|
487
|
+
authorizeManage(access, actorId);
|
|
488
|
+
const receipt = await records.getVersioned(receiptKey);
|
|
489
|
+
authorizeManage(access, actorId);
|
|
490
|
+
const audit = await records.getVersioned(auditKey);
|
|
491
|
+
authorizeManage(access, actorId);
|
|
492
|
+
const scanned = entry.value.kind === "audit" ? audit : receipt;
|
|
493
|
+
const receiptRecord = receipt?.value;
|
|
494
|
+
const auditRecord = audit?.value;
|
|
495
|
+
if (scanned?.version !== entry.version ||
|
|
496
|
+
(receiptRecord !== undefined &&
|
|
497
|
+
receiptRecord.kind !== "engineering_policy_command") ||
|
|
498
|
+
(auditRecord !== undefined && auditRecord.kind !== "audit")) {
|
|
499
|
+
incompletePairs += 1;
|
|
500
|
+
continue;
|
|
501
|
+
}
|
|
502
|
+
const auditAccepted = auditRecord === undefined
|
|
503
|
+
? undefined
|
|
504
|
+
: result({
|
|
505
|
+
generation: auditRecord.event.sequence,
|
|
506
|
+
policyHash: auditRecord.event.details?.policyHash,
|
|
507
|
+
enabled: auditRecord.event.details?.enabled,
|
|
508
|
+
});
|
|
509
|
+
const accepted = receiptRecord?.result ?? auditAccepted;
|
|
510
|
+
const occurredAt = auditRecord?.event.occurredAt ?? receiptRecord?.occurredAt;
|
|
511
|
+
if (accepted === undefined ||
|
|
512
|
+
occurredAt === undefined ||
|
|
513
|
+
accepted.generation > head.value.generation ||
|
|
514
|
+
(accepted.generation === head.value.generation &&
|
|
515
|
+
(accepted.policyHash !== head.value.policyHash ||
|
|
516
|
+
accepted.enabled !== head.value.policy.enabled)) ||
|
|
517
|
+
(receiptRecord !== undefined &&
|
|
518
|
+
auditRecord !== undefined &&
|
|
519
|
+
(receiptRecord.result.generation !== auditAccepted?.generation ||
|
|
520
|
+
receiptRecord.result.policyHash !== auditAccepted?.policyHash ||
|
|
521
|
+
receiptRecord.result.enabled !== auditAccepted?.enabled ||
|
|
522
|
+
(receiptRecord.occurredAt !== undefined &&
|
|
523
|
+
receiptRecord.occurredAt !== auditRecord.event.occurredAt)))) {
|
|
524
|
+
incompletePairs += 1;
|
|
525
|
+
continue;
|
|
526
|
+
}
|
|
527
|
+
if (!oldEnough(occurredAt))
|
|
528
|
+
continue;
|
|
529
|
+
if (!(await currentHead())) {
|
|
530
|
+
incompletePairs += 1;
|
|
531
|
+
break;
|
|
532
|
+
}
|
|
533
|
+
// Receipt first: its surviving Audit insert prevents legitimate ID
|
|
534
|
+
// reuse until cleanup finishes. The two removals are not atomic.
|
|
535
|
+
if (receipt !== null) {
|
|
536
|
+
const removed = await records.deleteIfUnchanged(receiptKey, receipt.version);
|
|
537
|
+
authorizeManage(access, actorId);
|
|
538
|
+
if (!removed) {
|
|
539
|
+
incompletePairs += 1;
|
|
540
|
+
continue;
|
|
541
|
+
}
|
|
542
|
+
deletedRows += 1;
|
|
543
|
+
}
|
|
544
|
+
if (audit !== null) {
|
|
545
|
+
if (!(await currentHead())) {
|
|
546
|
+
incompletePairs += 1;
|
|
547
|
+
break;
|
|
548
|
+
}
|
|
549
|
+
const removed = await records.deleteIfUnchanged(auditKey, audit.version);
|
|
550
|
+
authorizeManage(access, actorId);
|
|
551
|
+
if (!removed) {
|
|
552
|
+
incompletePairs += 1;
|
|
553
|
+
continue;
|
|
554
|
+
}
|
|
555
|
+
deletedRows += 1;
|
|
556
|
+
if (receipt !== null)
|
|
557
|
+
deletedPairs += 1;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
authorizeManage(access, actorId);
|
|
561
|
+
return Object.freeze({
|
|
562
|
+
physicalRows: page.records.length,
|
|
563
|
+
pages: 1,
|
|
564
|
+
nextCursor: page.nextCursor,
|
|
565
|
+
examinedPairs,
|
|
566
|
+
deletedRows,
|
|
567
|
+
deletedPairs,
|
|
568
|
+
incompletePairs,
|
|
569
|
+
});
|
|
570
|
+
};
|
|
571
|
+
const application = Object.freeze({
|
|
572
|
+
readRepositoryPolicy: read,
|
|
573
|
+
putRepositoryPolicy: (access, input) => mutate(access, input, false),
|
|
574
|
+
disableEngineeringExports: (access, input) => mutate(access, input, true),
|
|
575
|
+
pruneRepositoryPolicyHistory: prune,
|
|
576
|
+
});
|
|
577
|
+
return Object.freeze({ application, resolve: read });
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=engineering-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engineering-policy.js","sourceRoot":"","sources":["../src/engineering-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { EngineeringDependencies } from "./engineering-internal.js";
|
|
2
|
+
import type { EngineeringApplication } from "./engineering-types.js";
|
|
3
|
+
type Methods = Pick<EngineeringApplication, "readEngineeringReconciliation" | "recordEngineeringReconciliation" | "recordEngineeringDispatchResult">;
|
|
4
|
+
export declare function createEngineeringReconciliationServices(deps: EngineeringDependencies): Methods;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=engineering-reconciliation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engineering-reconciliation.d.ts","sourceRoot":"","sources":["../src/engineering-reconciliation.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAEV,uBAAuB,EAGxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,sBAAsB,EAOvB,MAAM,wBAAwB,CAAC;AAEhC,KAAK,OAAO,GAAG,IAAI,CACjB,sBAAsB,EACpB,+BAA+B,GAC/B,iCAAiC,GACjC,iCAAiC,CACpC,CAAC;AA2GF,wBAAgB,uCAAuC,CACrD,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CA4fT"}
|