@pegma/support-desk-application 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +18 -9
  2. package/dist/attachments.d.ts +57 -0
  3. package/dist/attachments.d.ts.map +1 -0
  4. package/dist/attachments.js +91 -0
  5. package/dist/attachments.js.map +1 -0
  6. package/dist/engineering-evidence.d.ts.map +1 -1
  7. package/dist/engineering-evidence.js +45 -8
  8. package/dist/engineering-evidence.js.map +1 -1
  9. package/dist/engineering-mutation-guard.d.ts +9 -0
  10. package/dist/engineering-mutation-guard.d.ts.map +1 -0
  11. package/dist/engineering-mutation-guard.js +71 -0
  12. package/dist/engineering-mutation-guard.js.map +1 -0
  13. package/dist/engineering-policy.d.ts.map +1 -1
  14. package/dist/engineering-policy.js +8 -3
  15. package/dist/engineering-policy.js.map +1 -1
  16. package/dist/engineering-types.d.ts +12 -7
  17. package/dist/engineering-types.d.ts.map +1 -1
  18. package/dist/engineering-work.d.ts.map +1 -1
  19. package/dist/engineering-work.js +10 -3
  20. package/dist/engineering-work.js.map +1 -1
  21. package/dist/index.d.ts +80 -4
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +855 -41
  24. package/dist/index.js.map +1 -1
  25. package/dist/resolution-learning-records.d.ts +2 -0
  26. package/dist/resolution-learning-records.d.ts.map +1 -1
  27. package/dist/resolution-learning-records.js +7 -0
  28. package/dist/resolution-learning-records.js.map +1 -1
  29. package/dist/resolution-learning-review-commit.d.ts +18 -0
  30. package/dist/resolution-learning-review-commit.d.ts.map +1 -0
  31. package/dist/resolution-learning-review-commit.js +199 -0
  32. package/dist/resolution-learning-review-commit.js.map +1 -0
  33. package/dist/resolution-learning-review-identity.d.ts +28 -0
  34. package/dist/resolution-learning-review-identity.d.ts.map +1 -0
  35. package/dist/resolution-learning-review-identity.js +110 -0
  36. package/dist/resolution-learning-review-identity.js.map +1 -0
  37. package/dist/resolution-learning-staged-records.d.ts +45 -0
  38. package/dist/resolution-learning-staged-records.d.ts.map +1 -0
  39. package/dist/resolution-learning-staged-records.js +193 -0
  40. package/dist/resolution-learning-staged-records.js.map +1 -0
  41. package/dist/resolution-learning-staged-types.d.ts +88 -0
  42. package/dist/resolution-learning-staged-types.d.ts.map +1 -0
  43. package/dist/resolution-learning-staged-types.js +2 -0
  44. package/dist/resolution-learning-staged-types.js.map +1 -0
  45. package/dist/resolution-learning-staged.d.ts +12 -0
  46. package/dist/resolution-learning-staged.d.ts.map +1 -0
  47. package/dist/resolution-learning-staged.js +585 -0
  48. package/dist/resolution-learning-staged.js.map +1 -0
  49. package/dist/resolution-learning-types.d.ts +6 -0
  50. package/dist/resolution-learning-types.d.ts.map +1 -1
  51. package/dist/resolution-learning-worker.d.ts.map +1 -1
  52. package/dist/resolution-learning-worker.js +58 -186
  53. package/dist/resolution-learning-worker.js.map +1 -1
  54. package/dist/resolution-learning.d.ts +3 -2
  55. package/dist/resolution-learning.d.ts.map +1 -1
  56. package/dist/resolution-learning.js +29 -2
  57. package/dist/resolution-learning.js.map +1 -1
  58. package/package.json +3 -3
@@ -0,0 +1,193 @@
1
+ import { canonical, encodedBytes, fields, integer, text, timestamp, } from "./assistant-turn-records.js";
2
+ import { validateResolutionTarget } from "./resolution-learning-records.js";
3
+ export function resolutionLearningReviewAttemptKey(ticketId, commandId) {
4
+ text(ticketId, "ticketId");
5
+ text(commandId, "commandId");
6
+ return { partition: ticketId, id: `learning-review-attempt:${commandId}` };
7
+ }
8
+ function hash(value, name) {
9
+ text(value, name, 64);
10
+ if (!/^[0-9a-f]{64}$/.test(value))
11
+ throw new TypeError(`Invalid ${name}`);
12
+ }
13
+ export function validateStagedReviewIntent(value) {
14
+ const intent = fields(value, "review intent", [
15
+ "reviewerId",
16
+ "ticketId",
17
+ "sourceGeneration",
18
+ "expectedWorkGeneration",
19
+ "target",
20
+ "policy",
21
+ ]);
22
+ text(intent.reviewerId, "reviewerId");
23
+ text(intent.ticketId, "ticketId");
24
+ integer(intent.sourceGeneration, "sourceGeneration", 1);
25
+ integer(intent.expectedWorkGeneration, "expectedWorkGeneration", 1);
26
+ validateResolutionTarget(intent.target);
27
+ const policy = fields(intent.policy, "review policy", [
28
+ "version",
29
+ "binding",
30
+ "verifiedAt",
31
+ "validUntil",
32
+ ]);
33
+ text(policy.version, "policy.version");
34
+ text(policy.binding, "policy.binding");
35
+ if (timestamp(policy.verifiedAt, "verifiedAt") >=
36
+ timestamp(policy.validUntil, "validUntil"))
37
+ throw new TypeError("Invalid review policy interval");
38
+ }
39
+ export function validateStagedReviewProof(value) {
40
+ const proof = fields(value, "review proof", ["binding", "validUntil"]);
41
+ hash(proof.binding, "proof.binding");
42
+ timestamp(proof.validUntil, "proof.validUntil");
43
+ }
44
+ export function validateStagedReviewFence(value) {
45
+ const fence = fields(value, "review claim", [
46
+ "ticketId",
47
+ "commandId",
48
+ "workerId",
49
+ "claimId",
50
+ "claimGeneration",
51
+ ]);
52
+ for (const key of ["ticketId", "commandId", "workerId", "claimId"])
53
+ text(fence[key], key);
54
+ integer(fence.claimGeneration, "claimGeneration", 1);
55
+ }
56
+ /** Pending rows are durable outbox state. Expiry alone never deletes an unknown command. */
57
+ export function assertResolutionLearningReviewAttempt(value, key) {
58
+ const row = fields(value, "review attempt", [
59
+ "kind",
60
+ "partition",
61
+ "id",
62
+ "ticketId",
63
+ "reviewerId",
64
+ "command",
65
+ "intent",
66
+ "fingerprint",
67
+ "state",
68
+ "phase",
69
+ "claimGeneration",
70
+ "createdAt",
71
+ "expiresAt",
72
+ "completionRows",
73
+ ], ["claim", "leaseUntil", "proof"]);
74
+ if (row.kind !== "resolution_learning_review_attempt" ||
75
+ row.partition !== key.partition ||
76
+ row.id !== key.id ||
77
+ row.ticketId !== key.partition)
78
+ throw new TypeError("Invalid review attempt envelope");
79
+ validateStagedReviewIntent(row.intent);
80
+ const intent = row.intent;
81
+ const command = fields(row.command, "staged review command", [
82
+ "ticketId",
83
+ "commandId",
84
+ "correlationId",
85
+ "sourceGeneration",
86
+ "expectedWorkGeneration",
87
+ "target",
88
+ "policyVersion",
89
+ "intentBinding",
90
+ "decision",
91
+ ], ["reason"]);
92
+ for (const name of [
93
+ "ticketId",
94
+ "commandId",
95
+ "correlationId",
96
+ "policyVersion",
97
+ ])
98
+ text(command[name], name);
99
+ if (command.reason !== undefined)
100
+ text(command.reason, "reason");
101
+ validateResolutionTarget(command.target);
102
+ hash(command.intentBinding, "intentBinding");
103
+ hash(row.fingerprint, "fingerprint");
104
+ if (command.decision !== "approve" && command.decision !== "reject")
105
+ throw new TypeError("Invalid review decision");
106
+ const expected = resolutionLearningReviewAttemptKey(intent.ticketId, command.commandId);
107
+ if (key.partition !== expected.partition ||
108
+ key.id !== expected.id ||
109
+ command.ticketId !== intent.ticketId ||
110
+ row.reviewerId !== intent.reviewerId ||
111
+ command.sourceGeneration !== intent.sourceGeneration ||
112
+ command.expectedWorkGeneration !== intent.expectedWorkGeneration ||
113
+ command.policyVersion !== intent.policy.version ||
114
+ canonical(command.target) !== canonical(intent.target) ||
115
+ row.expiresAt !== intent.policy.validUntil)
116
+ throw new TypeError("Review attempt bindings differ");
117
+ integer(row.claimGeneration, "claimGeneration", 0);
118
+ timestamp(row.createdAt, "createdAt");
119
+ timestamp(row.expiresAt, "expiresAt");
120
+ if (!["pending", "held", "accepted", "cancelled"].includes(row.state) ||
121
+ !["proof", "commit"].includes(row.phase))
122
+ throw new TypeError("Invalid staged review state");
123
+ if (row.completionRows !==
124
+ (row.state === "accepted" || row.state === "cancelled" ? 0 : 2))
125
+ throw new TypeError("Invalid review completion reserve");
126
+ if ((row.claim === undefined) !== (row.leaseUntil === undefined))
127
+ throw new TypeError("Incomplete review lease");
128
+ if (row.claim !== undefined) {
129
+ validateStagedReviewFence(row.claim);
130
+ if (row.state !== "pending" ||
131
+ row.claim.ticketId !== row.ticketId ||
132
+ row.claim.commandId !== command.commandId ||
133
+ row.claim.claimGeneration !== row.claimGeneration ||
134
+ timestamp(row.leaseUntil, "leaseUntil") >
135
+ timestamp(row.expiresAt, "expiresAt"))
136
+ throw new TypeError("Invalid review lease binding");
137
+ }
138
+ if (row.proof !== undefined) {
139
+ validateStagedReviewProof(row.proof);
140
+ if (row.phase !== "commit" ||
141
+ timestamp(row.proof.validUntil, "proof.validUntil") >
142
+ timestamp(row.expiresAt, "expiresAt"))
143
+ throw new TypeError("Invalid prepared review proof");
144
+ }
145
+ if (row.state === "pending" &&
146
+ row.phase === "commit" &&
147
+ row.proof === undefined)
148
+ throw new TypeError("Commit phase requires P1 proof");
149
+ if (encodedBytes(value) > 60_000)
150
+ throw new TypeError("Review attempt exceeds serialized limit");
151
+ }
152
+ /** Reserve legal future claim/proof envelopes before accepting the command. */
153
+ export function maximumResolutionLearningReviewAttemptBytes(row) {
154
+ return encodedBytes({
155
+ ...row,
156
+ state: "pending",
157
+ phase: "commit",
158
+ completionRows: 2,
159
+ claimGeneration: Number.MAX_SAFE_INTEGER,
160
+ claim: {
161
+ ticketId: row.ticketId,
162
+ commandId: row.command.commandId,
163
+ workerId: "\ud800".repeat(200),
164
+ claimId: "\ud800".repeat(200),
165
+ claimGeneration: Number.MAX_SAFE_INTEGER,
166
+ },
167
+ leaseUntil: "9999-12-31T23:59:59.999Z",
168
+ proof: { binding: "f".repeat(64), validUntil: "9999-12-31T23:59:59.999Z" },
169
+ });
170
+ }
171
+ export function assertResolutionLearningReviewReservation(value, key) {
172
+ const row = fields(value, "review reservation", [
173
+ "kind",
174
+ "partition",
175
+ "id",
176
+ "ticketId",
177
+ "commandId",
178
+ "reviewerId",
179
+ "fingerprint",
180
+ "expiresAt",
181
+ ]);
182
+ for (const name of ["ticketId", "commandId", "reviewerId"])
183
+ text(row[name], name);
184
+ hash(row.fingerprint, "fingerprint");
185
+ timestamp(row.expiresAt, "expiresAt");
186
+ if (row.kind !== "resolution_learning_review_reservation" ||
187
+ row.partition !== key.partition ||
188
+ row.ticketId !== key.partition ||
189
+ row.id !== key.id ||
190
+ key.id !== `learning-command:${row.commandId}`)
191
+ throw new TypeError("Review reservation envelope mismatch");
192
+ }
193
+ //# sourceMappingURL=resolution-learning-staged-records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolution-learning-staged-records.js","sourceRoot":"","sources":["../src/resolution-learning-staged-records.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import type { AccessContext } from "@pegma/authorization-core";
2
+ import type { IsoTimestamp, PrincipalId } from "@pegma/spine";
3
+ import type { ResolutionLearningReviewReceipt, ResolutionLearningTarget, ReviewResolutionLearningProposalCommand } from "./resolution-learning-types.js";
4
+ /** Immutable checked intent. These observations never replace fresh authority. */
5
+ export interface ResolutionLearningStagedReviewIntent {
6
+ readonly reviewerId: PrincipalId;
7
+ readonly ticketId: string;
8
+ readonly sourceGeneration: number;
9
+ readonly expectedWorkGeneration: number;
10
+ readonly target: ResolutionLearningTarget;
11
+ readonly policy: {
12
+ readonly version: string;
13
+ readonly binding: string;
14
+ readonly verifiedAt: IsoTimestamp;
15
+ readonly validUntil: IsoTimestamp;
16
+ };
17
+ }
18
+ export interface ResolutionLearningStagedReviewKey {
19
+ readonly ticketId: string;
20
+ readonly commandId: string;
21
+ }
22
+ export interface ResolutionLearningStagedReviewFence extends ResolutionLearningStagedReviewKey {
23
+ readonly workerId: string;
24
+ readonly claimId: string;
25
+ readonly claimGeneration: number;
26
+ }
27
+ export interface ResolutionLearningStagedReviewProof {
28
+ /** Digest of the complete P1 observation, never an authorization capability. */
29
+ readonly binding: string;
30
+ readonly validUntil: IsoTimestamp;
31
+ }
32
+ export interface ResolutionLearningStagedReviewHint extends ResolutionLearningStagedReviewKey {
33
+ readonly reviewerId: PrincipalId;
34
+ readonly phase: "proof" | "commit";
35
+ readonly expiresAt: IsoTimestamp;
36
+ readonly leaseUntil?: IsoTimestamp;
37
+ readonly held: boolean;
38
+ }
39
+ export interface ResolutionLearningStagedReviewClaim {
40
+ readonly fence: ResolutionLearningStagedReviewFence;
41
+ readonly reviewerId: PrincipalId;
42
+ readonly command: ReviewResolutionLearningProposalCommand;
43
+ readonly intent: ResolutionLearningStagedReviewIntent;
44
+ readonly phase: "proof" | "commit";
45
+ readonly leaseUntil: IsoTimestamp;
46
+ readonly expiresAt: IsoTimestamp;
47
+ readonly proof?: ResolutionLearningStagedReviewProof;
48
+ }
49
+ export type ResolutionLearningStagedReviewStatus = ResolutionLearningReviewReceipt | {
50
+ readonly outcome: "pending";
51
+ readonly ticketId: string;
52
+ readonly commandId: string;
53
+ readonly phase: "proof" | "commit";
54
+ readonly claimed: boolean;
55
+ readonly held: boolean;
56
+ readonly expiresAt: IsoTimestamp;
57
+ };
58
+ /** Fresh host proof, with an optional synchronous assertion after the last await. */
59
+ export type ResolutionLearningStagedReviewGuard = () => void | (() => true) | Promise<void | (() => true)>;
60
+ /** Additive opt-in capability. Existing inline application implementations need no changes. */
61
+ export interface ResolutionLearningStagedReviewApplication {
62
+ admit(access: AccessContext, command: ReviewResolutionLearningProposalCommand, intent: ResolutionLearningStagedReviewIntent, verifyBeforeCommit: ResolutionLearningStagedReviewGuard): Promise<ResolutionLearningStagedReviewStatus>;
63
+ readStatus(access: AccessContext, command: ReviewResolutionLearningProposalCommand): Promise<ResolutionLearningStagedReviewStatus | null>;
64
+ /** Opaque dispatch metadata only, authorized by learningProcess. */
65
+ readPending(access: AccessContext, key: ResolutionLearningStagedReviewKey): Promise<ResolutionLearningStagedReviewHint | null>;
66
+ scanPending(access: AccessContext, bounds: {
67
+ readonly cursor?: string;
68
+ readonly limit: number;
69
+ }): Promise<{
70
+ readonly candidates: readonly ResolutionLearningStagedReviewHint[];
71
+ readonly nextCursor: string | null;
72
+ readonly physicalRows: number;
73
+ readonly pages: 1;
74
+ }>;
75
+ /** Caller supplies freshly resolved original human authority, never the scanning service's access. */
76
+ claim(access: AccessContext, command: ResolutionLearningStagedReviewKey & {
77
+ readonly workerId: string;
78
+ readonly claimId: string;
79
+ readonly leaseMilliseconds: number;
80
+ }): Promise<ResolutionLearningStagedReviewClaim | null>;
81
+ prepare(access: AccessContext, command: {
82
+ readonly fence: ResolutionLearningStagedReviewFence;
83
+ readonly proof: ResolutionLearningStagedReviewProof;
84
+ }, verifyBeforeCommit: ResolutionLearningStagedReviewGuard): Promise<ResolutionLearningStagedReviewStatus>;
85
+ complete(access: AccessContext, fence: ResolutionLearningStagedReviewFence, verifyBeforeCommit: ResolutionLearningStagedReviewGuard): Promise<ResolutionLearningReviewReceipt>;
86
+ cancel(access: AccessContext, command: ReviewResolutionLearningProposalCommand, verifyBeforeCommit: ResolutionLearningStagedReviewGuard): Promise<ResolutionLearningReviewReceipt>;
87
+ }
88
+ //# sourceMappingURL=resolution-learning-staged-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolution-learning-staged-types.d.ts","sourceRoot":"","sources":["../src/resolution-learning-staged-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resolution-learning-staged-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolution-learning-staged-types.js","sourceRoot":"","sources":["../src/resolution-learning-staged-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { type SupportRecord } from "./index.js";
2
+ import type { ResolutionLearningDependencies, SourceVersion, TicketVersion } from "./resolution-learning.js";
3
+ import type { ResolutionLearningStagedReviewApplication } from "./resolution-learning-staged-types.js";
4
+ type Loaded = {
5
+ ticket: TicketVersion;
6
+ source: SourceVersion;
7
+ rows: readonly SupportRecord[];
8
+ };
9
+ /** Every mutation performs one conditional transaction; uncertain/conflict callers resume in another invocation. */
10
+ export declare function createResolutionLearningStagedReviewServices(deps: ResolutionLearningDependencies, load: (ticketId: string) => Promise<Loaded>): ResolutionLearningStagedReviewApplication;
11
+ export {};
12
+ //# sourceMappingURL=resolution-learning-staged.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolution-learning-staged.d.ts","sourceRoot":"","sources":["../src/resolution-learning-staged.ts"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAkCpB,OAAO,KAAK,EACV,8BAA8B,EAC9B,aAAa,EACb,aAAa,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EACV,yCAAyC,EAK1C,MAAM,uCAAuC,CAAC;AAG/C,KAAK,MAAM,GAAG;IACZ,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;CAChC,CAAC;AA0CF,oHAAoH;AACpH,wBAAgB,4CAA4C,CAC1D,IAAI,EAAE,8BAA8B,EACpC,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAC1C,yCAAyC,CAksB3C"}