@nodii/approval 0.2.0 → 0.3.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/dist/errors.d.ts +14 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +22 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +19 -7
- package/dist/init.js.map +1 -1
- package/dist/kinds.d.ts.map +1 -1
- package/dist/kinds.js +1 -0
- package/dist/kinds.js.map +1 -1
- package/dist/outbox.d.ts +59 -0
- package/dist/outbox.d.ts.map +1 -0
- package/dist/outbox.js +68 -0
- package/dist/outbox.js.map +1 -0
- package/dist/preview-validation.d.ts +21 -0
- package/dist/preview-validation.d.ts.map +1 -0
- package/dist/preview-validation.js +179 -0
- package/dist/preview-validation.js.map +1 -0
- package/dist/request.d.ts.map +1 -1
- package/dist/request.js +124 -162
- package/dist/request.js.map +1 -1
- package/dist/types.d.ts +87 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/uuid.d.ts +2 -0
- package/dist/uuid.d.ts.map +1 -0
- package/dist/uuid.js +33 -0
- package/dist/uuid.js.map +1 -0
- package/package.json +1 -1
package/dist/errors.d.ts
CHANGED
|
@@ -55,4 +55,18 @@ export declare class TenantPolicyKindUnknown extends ApprovalError {
|
|
|
55
55
|
readonly name = "TenantPolicyKindUnknown";
|
|
56
56
|
constructor(kind: string);
|
|
57
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Raised by `requestApproval` (D236) when `deferredActionPayloadSummary` fails
|
|
60
|
+
* the structured non-PII allow-list, a per-kind `previewSchema` rule, or the
|
|
61
|
+
* defensive PII-pattern heuristic. Thrown BEFORE any deferred_action row is
|
|
62
|
+
* written or begin-event emitted, so the requester sees + fixes the bad shape.
|
|
63
|
+
*/
|
|
64
|
+
export declare class InvalidApprovalPreviewShape extends ApprovalError {
|
|
65
|
+
readonly kind: string;
|
|
66
|
+
readonly reason: string;
|
|
67
|
+
readonly name = "InvalidApprovalPreviewShape";
|
|
68
|
+
/** Stable wire code mapped by downstream interceptors / error middleware. */
|
|
69
|
+
static readonly code = "INVALID_APPROVAL_PREVIEW_SHAPE";
|
|
70
|
+
constructor(kind: string, reason: string);
|
|
71
|
+
}
|
|
58
72
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAMA,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAkB,IAAI,EAAE,MAAM,CAAmB;CAClD;AAED,qBAAa,sBAAuB,SAAQ,aAAa;IACvD,SAAkB,IAAI,4BAA4B;;CAOnD;AAED,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,SAAkB,IAAI,yBAAyB;gBACnC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE;CAKxD;AAED,qBAAa,0BAA2B,SAAQ,aAAa;IAC3D,SAAkB,IAAI,gCAAgC;gBAC1C,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE;CAKxD;AAED,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,SAAkB,IAAI,0BAA0B;gBACpC,IAAI,EAAE,MAAM;CAKzB;AAED,qBAAa,sBAAuB,SAAQ,aAAa;IACvD,SAAkB,IAAI,4BAA4B;;CAMnD;AAED,qBAAa,4BAA6B,SAAQ,aAAa;IAC7D,SAAkB,IAAI,kCAAkC;gBAC5C,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE;CAK7D;AAED,qBAAa,sBAAuB,SAAQ,aAAa;aAGrC,KAAK,EAAE,UAAU,GAAG,MAAM;aAC1B,KAAK,EAAE,MAAM;IAH/B,SAAkB,IAAI,4BAA4B;gBAEhC,KAAK,EAAE,UAAU,GAAG,MAAM,EAC1B,KAAK,EAAE,MAAM,EAC7B,GAAG,EAAE,MAAM;CAId;AAED,qBAAa,wBAAyB,SAAQ,aAAa;IACzD,SAAkB,IAAI,8BAA8B;gBAElD,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,SAAS,MAAM,EAAE;CAMhC;AAED,qBAAa,kBAAmB,SAAQ,aAAa;aAGjC,KAAK,EAAE,OAAO;IAFhC,SAAkB,IAAI,wBAAwB;gBAE5B,KAAK,EAAE,OAAO,EAC9B,GAAG,EAAE,MAAM;CAId;AAED,qBAAa,sBAAuB,SAAQ,aAAa;IACvD,SAAkB,IAAI,4BAA4B;gBACtC,MAAM,EAAE,MAAM;CAG3B;AAED,qBAAa,uBAAwB,SAAQ,aAAa;aAKtC,IAAI,EAAE,MAAM;IAJ9B,SAAkB,IAAI,6BAA6B;IACnD,6EAA6E;IAC7E,MAAM,CAAC,QAAQ,CAAC,IAAI,+BAA+B;gBAEjC,IAAI,EAAE,MAAM,EAC5B,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,cAAc,EAAE,SAAS,MAAM,EAAE;CAMpC;AAED,qBAAa,uBAAwB,SAAQ,aAAa;IACxD,SAAkB,IAAI,6BAA6B;gBACvC,IAAI,EAAE,MAAM;CAKzB"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAMA,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAkB,IAAI,EAAE,MAAM,CAAmB;CAClD;AAED,qBAAa,sBAAuB,SAAQ,aAAa;IACvD,SAAkB,IAAI,4BAA4B;;CAOnD;AAED,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,SAAkB,IAAI,yBAAyB;gBACnC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE;CAKxD;AAED,qBAAa,0BAA2B,SAAQ,aAAa;IAC3D,SAAkB,IAAI,gCAAgC;gBAC1C,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE;CAKxD;AAED,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,SAAkB,IAAI,0BAA0B;gBACpC,IAAI,EAAE,MAAM;CAKzB;AAED,qBAAa,sBAAuB,SAAQ,aAAa;IACvD,SAAkB,IAAI,4BAA4B;;CAMnD;AAED,qBAAa,4BAA6B,SAAQ,aAAa;IAC7D,SAAkB,IAAI,kCAAkC;gBAC5C,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE;CAK7D;AAED,qBAAa,sBAAuB,SAAQ,aAAa;aAGrC,KAAK,EAAE,UAAU,GAAG,MAAM;aAC1B,KAAK,EAAE,MAAM;IAH/B,SAAkB,IAAI,4BAA4B;gBAEhC,KAAK,EAAE,UAAU,GAAG,MAAM,EAC1B,KAAK,EAAE,MAAM,EAC7B,GAAG,EAAE,MAAM;CAId;AAED,qBAAa,wBAAyB,SAAQ,aAAa;IACzD,SAAkB,IAAI,8BAA8B;gBAElD,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,SAAS,MAAM,EAAE;CAMhC;AAED,qBAAa,kBAAmB,SAAQ,aAAa;aAGjC,KAAK,EAAE,OAAO;IAFhC,SAAkB,IAAI,wBAAwB;gBAE5B,KAAK,EAAE,OAAO,EAC9B,GAAG,EAAE,MAAM;CAId;AAED,qBAAa,sBAAuB,SAAQ,aAAa;IACvD,SAAkB,IAAI,4BAA4B;gBACtC,MAAM,EAAE,MAAM;CAG3B;AAED,qBAAa,uBAAwB,SAAQ,aAAa;aAKtC,IAAI,EAAE,MAAM;IAJ9B,SAAkB,IAAI,6BAA6B;IACnD,6EAA6E;IAC7E,MAAM,CAAC,QAAQ,CAAC,IAAI,+BAA+B;gBAEjC,IAAI,EAAE,MAAM,EAC5B,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,cAAc,EAAE,SAAS,MAAM,EAAE;CAMpC;AAED,qBAAa,uBAAwB,SAAQ,aAAa;IACxD,SAAkB,IAAI,6BAA6B;gBACvC,IAAI,EAAE,MAAM;CAKzB;AAED;;;;;GAKG;AACH,qBAAa,2BAA4B,SAAQ,aAAa;aAK1C,IAAI,EAAE,MAAM;aACZ,MAAM,EAAE,MAAM;IALhC,SAAkB,IAAI,iCAAiC;IACvD,6EAA6E;IAC7E,MAAM,CAAC,QAAQ,CAAC,IAAI,oCAAoC;gBAEtC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM;CAUjC"}
|
package/dist/errors.js
CHANGED
|
@@ -89,4 +89,26 @@ export class TenantPolicyKindUnknown extends ApprovalError {
|
|
|
89
89
|
super(`Tenant policy row exists for kind '${kind}', but the kind is not registered in the running service. Falling through to kind defaults; the policy row is stale and should be cleaned up.`);
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Raised by `requestApproval` (D236) when `deferredActionPayloadSummary` fails
|
|
94
|
+
* the structured non-PII allow-list, a per-kind `previewSchema` rule, or the
|
|
95
|
+
* defensive PII-pattern heuristic. Thrown BEFORE any deferred_action row is
|
|
96
|
+
* written or begin-event emitted, so the requester sees + fixes the bad shape.
|
|
97
|
+
*/
|
|
98
|
+
export class InvalidApprovalPreviewShape extends ApprovalError {
|
|
99
|
+
kind;
|
|
100
|
+
reason;
|
|
101
|
+
name = "InvalidApprovalPreviewShape";
|
|
102
|
+
/** Stable wire code mapped by downstream interceptors / error middleware. */
|
|
103
|
+
static code = "INVALID_APPROVAL_PREVIEW_SHAPE";
|
|
104
|
+
constructor(kind, reason) {
|
|
105
|
+
super(`Invalid deferred_action_payload_summary for kind '${kind}': ${reason}. ` +
|
|
106
|
+
"The summary is a structured non-PII preview surfaced into task-tracking; " +
|
|
107
|
+
"only { preview_label (required, non-PII string), preview_subline (optional " +
|
|
108
|
+
"non-PII string), counts (optional string→number map) } are permitted, " +
|
|
109
|
+
"tightened per-kind by the kind's previewSchema. See D236.");
|
|
110
|
+
this.kind = kind;
|
|
111
|
+
this.reason = reason;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
92
114
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
export declare const LIB_NAME = "approval";
|
|
2
|
-
export declare const VERSION = "0.
|
|
2
|
+
export declare const VERSION = "0.3.0";
|
|
3
3
|
export { defineApprovalKinds, KindRegistry, RequesterRegistry, validateCrossOwnerKind, type DefineApprovalKindsOpts, } from "./kinds";
|
|
4
4
|
export { initApproval, requireApproval, getApprovalOrNull, requireKindRegistry, requireHandlers, requesterRegistry, defineApprovalRequester, registerKinds, _resetForTests, } from "./init";
|
|
5
5
|
export { bindApprovalHandlers, type BindApprovalHandlersOpts, } from "./handlers";
|
|
6
6
|
export { requestApproval } from "./request";
|
|
7
|
+
export { validatePreviewSummary, PII_PATTERNS, } from "./preview-validation";
|
|
7
8
|
export { startApprovalConsumer, stopApprovalConsumer, defaultQueueName, _resetConsumerForTests, type StartApprovalConsumerOpts, type ApprovalConsumerHandle, } from "./consumer";
|
|
8
9
|
export { getApprovalMigrationSQL, splitStatements, type GetMigrationSQLOpts, } from "./migrations";
|
|
10
|
+
export { APPROVAL_OUTBOX_AGGREGATE_KIND, DEFAULT_OUTBOX_TABLE_NAME, approvalRequestedTopic, insertBeginEventOutboxRow, type ApprovalBeginEventPayload, type InsertBeginEventOutboxRowInput, } from "./outbox";
|
|
11
|
+
export { uuidv7 } from "./uuid";
|
|
9
12
|
export { TaskTrackingGrpcClient, TASK_SERVICE_DESCRIPTOR, type TaskTrackingGrpcClientOpts, } from "./task-tracking-client";
|
|
10
13
|
export { createApprovalPolicyClient, ApprovalPolicyGrpcClient, APPROVAL_POLICY_SERVICE, type CreateApprovalPolicyClientOpts, } from "./policy-client";
|
|
11
|
-
export { ApprovalError, ApprovalNotInitialized, ApproverRoleNotInCatalog, DeferredActionNotFound, HandlerForUnregisteredKind, HandlerNotRegistered, IdempotencyKeyRequired, InvalidApprovalSegment, ReservedServiceNameViolation, TaskCreationFailed, TenantPolicyKindUnknown, UndeclaredRequesterKind, UnknownApprovalKind, } from "./errors";
|
|
12
|
-
export type { ApprovalKindDef, ApprovalKindDefInput, ApprovalPolicyRow, ApprovalPolicyServiceClient, ApproverKind, CreateTaskRequest, CreateTaskResponse, DbRlsLike, DeferredActionRow, DefinedKindMap, GetPolicyRequest, GetPolicyResponse, HandlerContext, HandlerSet, InitApprovalConfig, MembershipRolesLookup, RequestApprovalOpts, RequestApprovalResult, RequestApprovalResultStatus, ResolvedApprovalConfig, ResolvedPolicy, TaskCompletedEvent, TaskServiceClient, } from "./types";
|
|
14
|
+
export { ApprovalError, ApprovalNotInitialized, ApproverRoleNotInCatalog, DeferredActionNotFound, HandlerForUnregisteredKind, HandlerNotRegistered, IdempotencyKeyRequired, InvalidApprovalPreviewShape, InvalidApprovalSegment, ReservedServiceNameViolation, TaskCreationFailed, TenantPolicyKindUnknown, UndeclaredRequesterKind, UnknownApprovalKind, } from "./errors";
|
|
15
|
+
export type { ApprovalKindDef, ApprovalKindDefInput, ApprovalPolicyRow, ApprovalPolicyServiceClient, ApproverKind, CreateTaskRequest, CreateTaskResponse, DbRlsLike, DeferredActionPayloadSummary, DeferredActionRow, DefinedKindMap, GetPolicyRequest, GetPolicyResponse, HandlerContext, HandlerSet, InitApprovalConfig, MembershipRolesLookup, PreviewFieldRule, PreviewSchema, RequestApprovalOpts, RequestApprovalResult, RequestApprovalResultStatus, ResolvedApprovalConfig, ResolvedPolicy, TaskCompletedEvent, TaskServiceClient, } from "./types";
|
|
13
16
|
export { DEFAULT_CONSUMER_LEASE_SECONDS, DEFAULT_CONSUMER_MAX_RETRIES, DEFAULT_EXPIRY_SECONDS, DEFAULT_IDEMPOTENCY_TTL_SECONDS, RESERVED_SERVICE_NAMES, } from "./types";
|
|
14
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACb,cAAc,GACf,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,oBAAoB,EACpB,KAAK,wBAAwB,GAC9B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,GAC5B,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,0BAA0B,GAChC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,KAAK,8BAA8B,GACpC,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,EAC5B,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,EAC3B,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,EAC3B,sBAAsB,EACtB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,8BAA8B,EAC9B,4BAA4B,EAC5B,sBAAsB,EACtB,+BAA+B,EAC/B,sBAAsB,GACvB,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACb,cAAc,GACf,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,oBAAoB,EACpB,KAAK,wBAAwB,GAC9B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EACL,sBAAsB,EACtB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,GAC5B,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,EACzB,sBAAsB,EACtB,yBAAyB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,GACpC,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,0BAA0B,GAChC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,KAAK,8BAA8B,GACpC,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,sBAAsB,EACtB,4BAA4B,EAC5B,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,EAC3B,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,4BAA4B,EAC5B,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,EAC3B,sBAAsB,EACtB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,8BAA8B,EAC9B,4BAA4B,EAC5B,sBAAsB,EACtB,+BAA+B,EAC/B,sBAAsB,GACvB,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,15 +3,18 @@
|
|
|
3
3
|
// Spec: planning hub feature_doc serviceId=nodii-libs docKey=approval.
|
|
4
4
|
// Polyglot ship: TS + Python + Go in parity. This is the TypeScript impl.
|
|
5
5
|
export const LIB_NAME = "approval";
|
|
6
|
-
export const VERSION = "0.
|
|
6
|
+
export const VERSION = "0.3.0";
|
|
7
7
|
export { defineApprovalKinds, KindRegistry, RequesterRegistry, validateCrossOwnerKind, } from "./kinds";
|
|
8
8
|
export { initApproval, requireApproval, getApprovalOrNull, requireKindRegistry, requireHandlers, requesterRegistry, defineApprovalRequester, registerKinds, _resetForTests, } from "./init";
|
|
9
9
|
export { bindApprovalHandlers, } from "./handlers";
|
|
10
10
|
export { requestApproval } from "./request";
|
|
11
|
+
export { validatePreviewSummary, PII_PATTERNS, } from "./preview-validation";
|
|
11
12
|
export { startApprovalConsumer, stopApprovalConsumer, defaultQueueName, _resetConsumerForTests, } from "./consumer";
|
|
12
13
|
export { getApprovalMigrationSQL, splitStatements, } from "./migrations";
|
|
14
|
+
export { APPROVAL_OUTBOX_AGGREGATE_KIND, DEFAULT_OUTBOX_TABLE_NAME, approvalRequestedTopic, insertBeginEventOutboxRow, } from "./outbox";
|
|
15
|
+
export { uuidv7 } from "./uuid";
|
|
13
16
|
export { TaskTrackingGrpcClient, TASK_SERVICE_DESCRIPTOR, } from "./task-tracking-client";
|
|
14
17
|
export { createApprovalPolicyClient, ApprovalPolicyGrpcClient, APPROVAL_POLICY_SERVICE, } from "./policy-client";
|
|
15
|
-
export { ApprovalError, ApprovalNotInitialized, ApproverRoleNotInCatalog, DeferredActionNotFound, HandlerForUnregisteredKind, HandlerNotRegistered, IdempotencyKeyRequired, InvalidApprovalSegment, ReservedServiceNameViolation, TaskCreationFailed, TenantPolicyKindUnknown, UndeclaredRequesterKind, UnknownApprovalKind, } from "./errors";
|
|
18
|
+
export { ApprovalError, ApprovalNotInitialized, ApproverRoleNotInCatalog, DeferredActionNotFound, HandlerForUnregisteredKind, HandlerNotRegistered, IdempotencyKeyRequired, InvalidApprovalPreviewShape, InvalidApprovalSegment, ReservedServiceNameViolation, TaskCreationFailed, TenantPolicyKindUnknown, UndeclaredRequesterKind, UnknownApprovalKind, } from "./errors";
|
|
16
19
|
export { DEFAULT_CONSUMER_LEASE_SECONDS, DEFAULT_CONSUMER_MAX_RETRIES, DEFAULT_EXPIRY_SECONDS, DEFAULT_IDEMPOTENCY_TTL_SECONDS, RESERVED_SERVICE_NAMES, } from "./types";
|
|
17
20
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,uEAAuE;AACvE,0EAA0E;AAE1E,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AACnC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,GAEvB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACb,cAAc,GACf,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,oBAAoB,GAErB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,GAGvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,uBAAuB,EACvB,eAAe,GAEhB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,sBAAsB,EACtB,uBAAuB,GAExB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,GAExB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,EAC5B,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,uEAAuE;AACvE,0EAA0E;AAE1E,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AACnC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,GAEvB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACb,cAAc,GACf,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,oBAAoB,GAErB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EACL,sBAAsB,EACtB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,GAGvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,uBAAuB,EACvB,eAAe,GAEhB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,EACzB,sBAAsB,EACtB,yBAAyB,GAG1B,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,GAExB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,GAExB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,sBAAsB,EACtB,4BAA4B,EAC5B,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,UAAU,CAAC;AA+BlB,OAAO,EACL,8BAA8B,EAC9B,4BAA4B,EAC5B,sBAAsB,EACtB,+BAA+B,EAC/B,sBAAsB,GACvB,MAAM,SAAS,CAAC"}
|
package/dist/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAG1D,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,kBAAkB,EAClB,sBAAsB,EAEvB,MAAM,SAAS,CAAC;AA+BjB;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI,CA6E1D;AAED,wBAAgB,eAAe,IAAI,sBAAsB,CAGxD;AAED,wBAAgB,iBAAiB,IAAI,sBAAsB,GAAG,IAAI,CAEjE;AAED,wBAAgB,mBAAmB,IAAI,YAAY,CAGlD;AAED,wBAAgB,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAGzD;AAED;;sBAEsB;AACtB,wBAAgB,iBAAiB,IAAI,iBAAiB,CAErD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,CAezE;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,IAAI,IAAI,CAKrC"}
|
package/dist/init.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
// No Noop default. No InMemory default. Per R1.
|
|
13
13
|
import { ApprovalNotInitialized, ApproverRoleNotInCatalog } from "./errors";
|
|
14
14
|
import { KindRegistry, RequesterRegistry } from "./kinds";
|
|
15
|
+
import { DEFAULT_OUTBOX_TABLE_NAME } from "./outbox";
|
|
15
16
|
import { validateServiceName } from "./validation";
|
|
16
17
|
import { DEFAULT_CONSUMER_LEASE_SECONDS, DEFAULT_CONSUMER_MAX_RETRIES, DEFAULT_EXPIRY_SECONDS, } from "./types";
|
|
17
18
|
import { TaskTrackingGrpcClient } from "./task-tracking-client";
|
|
@@ -60,19 +61,26 @@ export function initApproval(cfg) {
|
|
|
60
61
|
if (!cfg.pgPool && !cfg.dbRls) {
|
|
61
62
|
throw new TypeError("initApproval: either pgPool or dbRls must be provided");
|
|
62
63
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
// Since D237 (v0.3.0) the request flow no longer calls CreateTask (the
|
|
65
|
+
// begin-event is a same-tx outbox emit), so neither taskServiceUrl nor
|
|
66
|
+
// taskServiceClient is REQUIRED. They stay OPTIONAL — wired only for
|
|
67
|
+
// NON-approval direct task creation (D237 Rule 5). Do NOT throw if absent.
|
|
67
68
|
if (!cfg.membershipRolesLookup) {
|
|
68
69
|
throw new TypeError("initApproval: membershipRolesLookup is required (used for self-action exception evaluation)");
|
|
69
70
|
}
|
|
70
71
|
const pgPool = cfg.dbRls ? cfg.dbRls.pool : cfg.pgPool;
|
|
71
72
|
if (!pgPool)
|
|
72
73
|
throw new TypeError("initApproval: pgPool resolution failed");
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
// Resolve the task client ONLY when the service actually wired one (D237
|
|
75
|
+
// Rule 5 — kept available for NON-approval direct CreateTask). When neither
|
|
76
|
+
// a client nor a URL is provided, it stays `undefined`; the request flow no
|
|
77
|
+
// longer needs it (begin-event is a same-tx outbox emit).
|
|
78
|
+
let taskServiceClient;
|
|
79
|
+
if (cfg.taskServiceClient) {
|
|
80
|
+
taskServiceClient = cfg.taskServiceClient;
|
|
81
|
+
}
|
|
82
|
+
else if (cfg.taskServiceUrl && cfg.taskServiceUrl.trim() !== "") {
|
|
83
|
+
taskServiceClient = new TaskTrackingGrpcClient({
|
|
76
84
|
url: cfg.taskServiceUrl,
|
|
77
85
|
sourceModule: cfg.serviceName,
|
|
78
86
|
// Production wiring — adopters layer grpc-auth S2S envelope +
|
|
@@ -83,12 +91,16 @@ export function initApproval(cfg) {
|
|
|
83
91
|
credentials: cfg.taskClientOptions?.credentials,
|
|
84
92
|
deadlineMs: cfg.taskClientOptions?.deadlineMs,
|
|
85
93
|
});
|
|
94
|
+
}
|
|
86
95
|
RESOLVED = {
|
|
87
96
|
serviceName: cfg.serviceName,
|
|
88
97
|
pgPool,
|
|
89
98
|
dbRls: cfg.dbRls,
|
|
90
99
|
redis: cfg.redis,
|
|
91
100
|
taskServiceClient,
|
|
101
|
+
outboxTableName: cfg.outboxTableName && cfg.outboxTableName.trim() !== ""
|
|
102
|
+
? cfg.outboxTableName
|
|
103
|
+
: DEFAULT_OUTBOX_TABLE_NAME,
|
|
92
104
|
membershipRolesLookup: cfg.membershipRolesLookup,
|
|
93
105
|
defaultExpirySeconds: cfg.defaultExpirySeconds ?? DEFAULT_EXPIRY_SECONDS,
|
|
94
106
|
consumerLeaseSeconds: cfg.consumerLeaseSeconds ?? DEFAULT_CONSUMER_LEASE_SECONDS,
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,0EAA0E;AAC1E,qEAAqE;AACrE,EAAE;AACF,6BAA6B;AAC7B,uEAAuE;AACvE,kCAAkC;AAClC,+EAA+E;AAC/E,uCAAuC;AACvC,EAAE;AACF,gDAAgD;AAEhD,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,0EAA0E;AAC1E,qEAAqE;AACrE,EAAE;AACF,6BAA6B;AAC7B,uEAAuE;AACvE,kCAAkC;AAClC,+EAA+E;AAC/E,uCAAuC;AACvC,EAAE;AACF,gDAAgD;AAEhD,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAQnD,OAAO,EACL,8BAA8B,EAC9B,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,IAAI,QAAQ,GAAkC,IAAI,CAAC;AACnD,IAAI,QAAQ,GAAwB,IAAI,CAAC;AACzC,IAAI,QAAQ,GAAmC,IAAI,CAAC;AACpD,6EAA6E;AAC7E,qFAAqF;AACrF,gEAAgE;AAChE,IAAI,UAAU,GAAsB,IAAI,iBAAiB,EAAE,CAAC;AAE5D,MAAM,cAAc,GAAG;IACrB,IAAI,CAAC,GAAW,EAAE,MAAgC;QAChD,yDAAyD;QACzD,OAAO,CAAC,IAAI,CAAC,qBAAqB,GAAG,EAAE,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,GAAW,EAAE,MAAgC;QAChD,yDAAyD;QACzD,OAAO,CAAC,IAAI,CAAC,qBAAqB,GAAG,EAAE,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,KAAK,CAAC,GAAW,EAAE,MAAgC;QACjD,yDAAyD;QACzD,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAG,EAAE,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAuB;IAClD,IAAI,QAAQ,EAAE,CAAC;QACb,cAAc,CAAC,IAAI,CACjB,iEAAiE,CAClE,CAAC;QACF,OAAO;IACT,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACtD,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAC;IAC/D,CAAC;IACD,iEAAiE;IACjE,uEAAuE;IACvE,qEAAqE;IACrE,6BAA6B;IAC7B,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CACjB,uDAAuD,CACxD,CAAC;IACJ,CAAC;IACD,uEAAuE;IACvE,uEAAuE;IACvE,qEAAqE;IACrE,2EAA2E;IAC3E,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;QAC/B,MAAM,IAAI,SAAS,CACjB,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;IACvD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;IAE3E,yEAAyE;IACzE,4EAA4E;IAC5E,4EAA4E;IAC5E,0DAA0D;IAC1D,IAAI,iBAAgD,CAAC;IACrD,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC1B,iBAAiB,GAAG,GAAG,CAAC,iBAAiB,CAAC;IAC5C,CAAC;SAAM,IAAI,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAClE,iBAAiB,GAAG,IAAI,sBAAsB,CAAC;YAC7C,GAAG,EAAE,GAAG,CAAC,cAAc;YACvB,YAAY,EAAE,GAAG,CAAC,WAAW;YAC7B,8DAA8D;YAC9D,8DAA8D;YAC9D,YAAY,EAAE,GAAG,CAAC,iBAAiB,EAAE,YAAY;gBAC/C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC;gBAChD,CAAC,CAAC,SAAS;YACb,WAAW,EAAE,GAAG,CAAC,iBAAiB,EAAE,WAAW;YAC/C,UAAU,EAAE,GAAG,CAAC,iBAAiB,EAAE,UAAU;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,GAAG;QACT,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,MAAM;QACN,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,iBAAiB;QACjB,eAAe,EACb,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE;YACtD,CAAC,CAAC,GAAG,CAAC,eAAe;YACrB,CAAC,CAAC,yBAAyB;QAC/B,qBAAqB,EAAE,GAAG,CAAC,qBAAqB;QAChD,oBAAoB,EAAE,GAAG,CAAC,oBAAoB,IAAI,sBAAsB;QACxE,oBAAoB,EAClB,GAAG,CAAC,oBAAoB,IAAI,8BAA8B;QAC5D,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,IAAI,4BAA4B;QAC1E,UAAU,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACzC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,cAAc;KACrC,CAAC;IACF,QAAQ,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7C,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,sBAAsB,EAAE,CAAC;IAClD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,sBAAsB,EAAE,CAAC;IAClD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,sBAAsB,EAAE,CAAC;IAClD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;sBAEsB;AACtB,MAAM,UAAU,iBAAiB;IAC/B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAqC;IACjE,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,mBAAmB,EAAE,CAAC;IAClC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,wBAAwB,CAChC,GAAG,CAAC,YAAY,EAChB,IAAI,EACJ,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAC3B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,cAAc;IAC5B,QAAQ,GAAG,IAAI,CAAC;IAChB,QAAQ,GAAG,IAAI,CAAC;IAChB,QAAQ,GAAG,IAAI,CAAC;IAChB,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;AACvC,CAAC"}
|
package/dist/kinds.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kinds.d.ts","sourceRoot":"","sources":["../src/kinds.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,cAAc,EACf,MAAM,SAAS,CAAC;AAGjB,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,wBAAgB,mBAAmB,CACjC,CAAC,SAAS,MAAM,EAChB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAEpD,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,CAAC,EACP,IAAI,GAAE,uBAA4B,GACjC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"kinds.d.ts","sourceRoot":"","sources":["../src/kinds.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,cAAc,EACf,MAAM,SAAS,CAAC;AAGjB,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,wBAAgB,mBAAmB,CACjC,CAAC,SAAS,MAAM,EAChB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAEpD,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,CAAC,EACP,IAAI,GAAE,uBAA4B,GACjC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAoCtB;AAED,mEAAmE;AACnE,qBAAa,YAAY;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsC;gBAE9C,WAAW,EAAE,MAAM;IAI/B,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI;IAWrD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI9C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,IAAI,IAAI,SAAS,MAAM,EAAE;IAIzB,MAAM,IAAI,SAAS,eAAe,EAAE;IAIpC,IAAI,IAAI,MAAM;CAGf;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAgBzD;AAED;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IAEzC,yEAAyE;IACzE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKvB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,IAAI,IAAI,SAAS,MAAM,EAAE;IAIzB,IAAI,IAAI,MAAM;CAGf"}
|
package/dist/kinds.js
CHANGED
|
@@ -34,6 +34,7 @@ export function defineApprovalKinds(serviceName, defs, opts = {}) {
|
|
|
34
34
|
selfActionAllowed: def.selfActionAllowed ?? false,
|
|
35
35
|
expirySeconds: def.expirySeconds,
|
|
36
36
|
actionButtonLabel: def.actionButtonLabel,
|
|
37
|
+
previewSchema: def.previewSchema,
|
|
37
38
|
};
|
|
38
39
|
}
|
|
39
40
|
return out;
|
package/dist/kinds.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kinds.js","sourceRoot":"","sources":["../src/kinds.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,EAAE;AACF,uEAAuE;AACvE,iDAAiD;AACjD,gEAAgE;AAChE,2EAA2E;AAE3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAMlD,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAO9E,MAAM,UAAU,mBAAmB,CAIjC,WAAc,EACd,IAAO,EACP,OAAgC,EAAE;IAElC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,GAAG,GAAoC,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5C,MAAM,IAAI,SAAS,CACjB,+BAA+B,IAAI,4BAA4B,OAAO,GAAG,EAAE,CAC5E,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,CAAC;QAChB,yBAAyB,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACpD,yBAAyB,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,GAAG,WAAW,IAAI,SAAS,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,SAAS,CACjB,wCAAwC,IAAI,iBAAiB,WAAW,GAAG,CAC5E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,GAAG;YACV,SAAS;YACT,IAAI;YACJ,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;YAClC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;YACtC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,IAAI,KAAK;YACjD,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;
|
|
1
|
+
{"version":3,"file":"kinds.js","sourceRoot":"","sources":["../src/kinds.ts"],"names":[],"mappings":"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"}
|
package/dist/outbox.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { DeferredActionPayloadSummary, SqlTxExecutor } from "./types";
|
|
2
|
+
/** Aggregate kind written onto every approval begin-event outbox row. */
|
|
3
|
+
export declare const APPROVAL_OUTBOX_AGGREGATE_KIND = "ApprovalRequest";
|
|
4
|
+
/** Default outbox table name (matches @nodii/outbox-dispatcher's default). */
|
|
5
|
+
export declare const DEFAULT_OUTBOX_TABLE_NAME = "outbox";
|
|
6
|
+
/** Structured begin-event payload carried in the outbox row's `payload` JSONB.
|
|
7
|
+
* Carries the same D231/D236 provenance the prior CreateTask begin-event did,
|
|
8
|
+
* PLUS `tenant_id` (no column on the outbox table) and the in-tx occurred-at. */
|
|
9
|
+
export interface ApprovalBeginEventPayload {
|
|
10
|
+
/** Fully-qualified kind (`<owner>.<resource>.<verb>`). */
|
|
11
|
+
kind: string;
|
|
12
|
+
/** Requester service (this service). */
|
|
13
|
+
requester_service: string;
|
|
14
|
+
/** Owner service (parsed from `kind` before the first `.`). */
|
|
15
|
+
owner_service: string;
|
|
16
|
+
/** The requester-local deferred_action row id (== aggregate_id). */
|
|
17
|
+
deferred_action_id: string;
|
|
18
|
+
/** Caller-supplied idempotency key (consumer dedupe + replay guard). */
|
|
19
|
+
idempotency_key: string;
|
|
20
|
+
/** Tenant id — lives in the payload because the outbox table has no column. */
|
|
21
|
+
tenant_id: string;
|
|
22
|
+
/** Requester membership id (begin-event provenance). */
|
|
23
|
+
requester_membership_id: string;
|
|
24
|
+
/** Owner-resolved fallback approver role (empty for cross-owner). */
|
|
25
|
+
default_approver_role: string;
|
|
26
|
+
/** Requester-side expiry fallback (task-tracking may override via GetPolicy). */
|
|
27
|
+
default_expires_in_seconds: number;
|
|
28
|
+
/** D236 validated non-PII preview summary, when supplied. */
|
|
29
|
+
deferred_action_payload_summary?: DeferredActionPayloadSummary;
|
|
30
|
+
/** Wall-clock ms when the row was written inside the requester's tx. */
|
|
31
|
+
occurred_at_in_requester_tx_ms: number;
|
|
32
|
+
/** Caller metadata passed through to the begin-event (non-lib-mandated). */
|
|
33
|
+
metadata?: Record<string, unknown>;
|
|
34
|
+
}
|
|
35
|
+
export interface InsertBeginEventOutboxRowInput {
|
|
36
|
+
/** Resolved outbox table name. */
|
|
37
|
+
tableName: string;
|
|
38
|
+
/** aggregate_id == deferred_action_id. */
|
|
39
|
+
aggregateId: string;
|
|
40
|
+
/** `<requester_service>.approval.requested.v1`. */
|
|
41
|
+
topic: string;
|
|
42
|
+
/** The structured begin-event payload. */
|
|
43
|
+
payload: ApprovalBeginEventPayload;
|
|
44
|
+
}
|
|
45
|
+
/** Same-tx INSERT of the begin-event outbox row.
|
|
46
|
+
*
|
|
47
|
+
* MUST run inside the SAME `pgPool.begin` transaction that inserts the
|
|
48
|
+
* deferred_action row (D237 Rule 3 — same-tx atomicity). The drainer-managed
|
|
49
|
+
* columns (dispatched_at, stream_id, publish_attempts, last_error,
|
|
50
|
+
* last_attempt_at) are left to their table defaults; only the producer-owned
|
|
51
|
+
* columns are written. Returns the row's transport `id` + `event_id` so the
|
|
52
|
+
* caller can surface the begin-event id back to the requester. */
|
|
53
|
+
export declare function insertBeginEventOutboxRow(tx: SqlTxExecutor, input: InsertBeginEventOutboxRowInput): Promise<{
|
|
54
|
+
id: string;
|
|
55
|
+
eventId: string;
|
|
56
|
+
}>;
|
|
57
|
+
/** `<requester_service>.approval.requested.v1` — the begin-event topic. */
|
|
58
|
+
export declare function approvalRequestedTopic(requesterService: string): string;
|
|
59
|
+
//# sourceMappingURL=outbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.d.ts","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,4BAA4B,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE3E,yEAAyE;AACzE,eAAO,MAAM,8BAA8B,oBAAoB,CAAC;AAEhE,8EAA8E;AAC9E,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAoBlD;;kFAEkF;AAClF,MAAM,WAAW,yBAAyB;IACxC,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,aAAa,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,wEAAwE;IACxE,eAAe,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,uBAAuB,EAAE,MAAM,CAAC;IAChC,qEAAqE;IACrE,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iFAAiF;IACjF,0BAA0B,EAAE,MAAM,CAAC;IACnC,6DAA6D;IAC7D,+BAA+B,CAAC,EAAE,4BAA4B,CAAC;IAC/D,wEAAwE;IACxE,8BAA8B,EAAE,MAAM,CAAC;IACvC,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,8BAA8B;IAC7C,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,OAAO,EAAE,yBAAyB,CAAC;CACpC;AAED;;;;;;;mEAOmE;AACnE,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,aAAa,EACjB,KAAK,EAAE,8BAA8B,GACpC,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAuB1C;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAEvE"}
|
package/dist/outbox.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Begin-event transactional-outbox emit per D237 + 01-comms § 9.1.
|
|
2
|
+
//
|
|
3
|
+
// D237 LOCKED (2026-06-05): `requestApproval`'s begin-event MUST be emitted
|
|
4
|
+
// via the requester service's transactional outbox — NOT a synchronous direct
|
|
5
|
+
// gRPC `TaskService.CreateTask`. The deferred_action row + the outbox row
|
|
6
|
+
// commit in the SAME transaction (same-tx atomicity); the service's
|
|
7
|
+
// @nodii/outbox-dispatcher drainer (01-comms § 9.2) publishes the row to
|
|
8
|
+
// `<svc>.approval.requested.v1`, where task-tracking's approval-runtime
|
|
9
|
+
// consumer projects it (D232 + R2). The library makes ZERO gRPC calls from
|
|
10
|
+
// the request flow.
|
|
11
|
+
//
|
|
12
|
+
// The outbox row targets the canonical `outbox` table from
|
|
13
|
+
// @nodii/outbox-dispatcher (ts/outbox-dispatcher/src/migrations/
|
|
14
|
+
// 001-outbox-dispatcher.sql). NOTE: that table has NO `tenant_id` column —
|
|
15
|
+
// `tenant_id` rides INSIDE the `payload` JSONB, not as a column.
|
|
16
|
+
import { randomUUID } from "node:crypto";
|
|
17
|
+
import { uuidv7 } from "./uuid";
|
|
18
|
+
/** Aggregate kind written onto every approval begin-event outbox row. */
|
|
19
|
+
export const APPROVAL_OUTBOX_AGGREGATE_KIND = "ApprovalRequest";
|
|
20
|
+
/** Default outbox table name (matches @nodii/outbox-dispatcher's default). */
|
|
21
|
+
export const DEFAULT_OUTBOX_TABLE_NAME = "outbox";
|
|
22
|
+
/**
|
|
23
|
+
* Safe SQL identifier: optional `schema.` prefix + a table name, each a plain
|
|
24
|
+
* unquoted identifier. The outbox table name is config-driven (initApproval's
|
|
25
|
+
* `outboxTableName`) and interpolated into the INSERT (a table name cannot be a
|
|
26
|
+
* bound parameter), so we validate it as a strict identifier to keep it from
|
|
27
|
+
* being an injection vector if a service mis-configures it.
|
|
28
|
+
*/
|
|
29
|
+
const SAFE_SQL_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)?$/;
|
|
30
|
+
function assertSafeOutboxTableName(tableName) {
|
|
31
|
+
if (!SAFE_SQL_IDENTIFIER.test(tableName)) {
|
|
32
|
+
throw new Error(`approval: outboxTableName '${tableName}' is not a valid SQL identifier (expected [schema.]table of letters/digits/underscore)`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Same-tx INSERT of the begin-event outbox row.
|
|
36
|
+
*
|
|
37
|
+
* MUST run inside the SAME `pgPool.begin` transaction that inserts the
|
|
38
|
+
* deferred_action row (D237 Rule 3 — same-tx atomicity). The drainer-managed
|
|
39
|
+
* columns (dispatched_at, stream_id, publish_attempts, last_error,
|
|
40
|
+
* last_attempt_at) are left to their table defaults; only the producer-owned
|
|
41
|
+
* columns are written. Returns the row's transport `id` + `event_id` so the
|
|
42
|
+
* caller can surface the begin-event id back to the requester. */
|
|
43
|
+
export async function insertBeginEventOutboxRow(tx, input) {
|
|
44
|
+
// id: a fresh transport id (uuid v4) — matches outbox-dispatcher's per-row
|
|
45
|
+
// id convention; the dedupe key is `event_id` (uuid v7), not `id`.
|
|
46
|
+
const id = randomUUID();
|
|
47
|
+
const eventId = uuidv7();
|
|
48
|
+
assertSafeOutboxTableName(input.tableName);
|
|
49
|
+
await tx.unsafe(`INSERT INTO ${input.tableName}
|
|
50
|
+
(id, event_id, aggregate_kind, aggregate_id, source_entity_version,
|
|
51
|
+
topic, payload)
|
|
52
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)`, [
|
|
53
|
+
id,
|
|
54
|
+
eventId,
|
|
55
|
+
APPROVAL_OUTBOX_AGGREGATE_KIND,
|
|
56
|
+
input.aggregateId,
|
|
57
|
+
// source_entity_version — a freshly-created aggregate is version 1.
|
|
58
|
+
1,
|
|
59
|
+
input.topic,
|
|
60
|
+
JSON.stringify(input.payload),
|
|
61
|
+
]);
|
|
62
|
+
return { id, eventId };
|
|
63
|
+
}
|
|
64
|
+
/** `<requester_service>.approval.requested.v1` — the begin-event topic. */
|
|
65
|
+
export function approvalRequestedTopic(requesterService) {
|
|
66
|
+
return `${requesterService}.approval.requested.v1`;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=outbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.js","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,0EAA0E;AAC1E,oEAAoE;AACpE,yEAAyE;AACzE,wEAAwE;AACxE,2EAA2E;AAC3E,oBAAoB;AACpB,EAAE;AACF,2DAA2D;AAC3D,iEAAiE;AACjE,2EAA2E;AAC3E,iEAAiE;AAEjE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,yEAAyE;AACzE,MAAM,CAAC,MAAM,8BAA8B,GAAG,iBAAiB,CAAC;AAEhE,8EAA8E;AAC9E,MAAM,CAAC,MAAM,yBAAyB,GAAG,QAAQ,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,mBAAmB,GACvB,qDAAqD,CAAC;AAExD,SAAS,yBAAyB,CAAC,SAAiB;IAClD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,8BAA8B,SAAS,wFAAwF,CAChI,CAAC;IACJ,CAAC;AACH,CAAC;AA2CD;;;;;;;mEAOmE;AACnE,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,EAAiB,EACjB,KAAqC;IAErC,2EAA2E;IAC3E,mEAAmE;IACnE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;IACzB,yBAAyB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,EAAE,CAAC,MAAM,CACb,eAAe,KAAK,CAAC,SAAS;;;yCAGO,EACrC;QACE,EAAE;QACF,OAAO;QACP,8BAA8B;QAC9B,KAAK,CAAC,WAAW;QACjB,oEAAoE;QACpE,CAAC;QACD,KAAK,CAAC,KAAK;QACX,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;KAC9B,CACF,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;AACzB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,sBAAsB,CAAC,gBAAwB;IAC7D,OAAO,GAAG,gBAAgB,wBAAwB,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { DeferredActionPayloadSummary, PreviewSchema } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Best-effort PII heuristics (D236 #3). Kept in ONE place; intentionally
|
|
4
|
+
* heuristic-grade (false positives acceptable). Defense-in-depth only.
|
|
5
|
+
*/
|
|
6
|
+
export declare const PII_PATTERNS: ReadonlyArray<{
|
|
7
|
+
name: string;
|
|
8
|
+
re: RegExp;
|
|
9
|
+
}>;
|
|
10
|
+
/**
|
|
11
|
+
* Validate a `deferredActionPayloadSummary` against the global allow-list +
|
|
12
|
+
* the kind's optional `previewSchema` + the PII heuristic. Throws
|
|
13
|
+
* `InvalidApprovalPreviewShape` on the first failure. Returns the validated
|
|
14
|
+
* summary (a shallow normalised copy) so the caller persists exactly what was
|
|
15
|
+
* checked.
|
|
16
|
+
*
|
|
17
|
+
* `summary` may be `undefined` — that is allowed UNLESS the previewSchema
|
|
18
|
+
* marks `preview_label` (or any field) `required`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function validatePreviewSummary(kind: string, summary: DeferredActionPayloadSummary | undefined, previewSchema: PreviewSchema | undefined): DeferredActionPayloadSummary | undefined;
|
|
21
|
+
//# sourceMappingURL=preview-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview-validation.d.ts","sourceRoot":"","sources":["../src/preview-validation.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,4BAA4B,EAE5B,aAAa,EACd,MAAM,SAAS,CAAC;AASjB;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAOpE,CAAC;AAUF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,4BAA4B,GAAG,SAAS,EACjD,aAAa,EAAE,aAAa,GAAG,SAAS,GACvC,4BAA4B,GAAG,SAAS,CAoE1C"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// D236 — structured non-PII preview-shape validation for
|
|
2
|
+
// `deferredActionPayloadSummary` on `requestApproval`.
|
|
3
|
+
//
|
|
4
|
+
// Three layers, applied in this order, at REQUEST TIME, BEFORE any
|
|
5
|
+
// deferred_action row is written or begin-event emitted:
|
|
6
|
+
//
|
|
7
|
+
// [1] Global allow-list — the only permitted top-level keys are
|
|
8
|
+
// `preview_label` (required, non-empty string), `preview_subline`
|
|
9
|
+
// (optional string), `counts` (optional string→number map). ANY other
|
|
10
|
+
// top-level key is rejected.
|
|
11
|
+
// [2] Per-kind previewSchema — when the kind defines one, it TIGHTENS the
|
|
12
|
+
// global allow-list: a `forbidden` field present ⇒ throw; a `required`
|
|
13
|
+
// field absent ⇒ throw; a required nested count-key absent ⇒ throw.
|
|
14
|
+
// [3] PII-pattern heuristic — best-effort defense-in-depth. Rejects string
|
|
15
|
+
// values (and count keys) that look like email / phone / uuid / long
|
|
16
|
+
// opaque ids. Heuristic-grade — false positives are acceptable; this is
|
|
17
|
+
// NOT a substitute for the structural allow-list.
|
|
18
|
+
//
|
|
19
|
+
// All rejections throw `InvalidApprovalPreviewShape` with a stable code.
|
|
20
|
+
import { InvalidApprovalPreviewShape } from "./errors";
|
|
21
|
+
/** The only top-level keys the global allow-list permits (#1). */
|
|
22
|
+
const ALLOWED_TOP_LEVEL_KEYS = new Set([
|
|
23
|
+
"preview_label",
|
|
24
|
+
"preview_subline",
|
|
25
|
+
"counts",
|
|
26
|
+
]);
|
|
27
|
+
/**
|
|
28
|
+
* Best-effort PII heuristics (D236 #3). Kept in ONE place; intentionally
|
|
29
|
+
* heuristic-grade (false positives acceptable). Defense-in-depth only.
|
|
30
|
+
*/
|
|
31
|
+
export const PII_PATTERNS = [
|
|
32
|
+
// email-shaped: contains `@` then a `.` somewhere after it.
|
|
33
|
+
{ name: "email-shaped", re: /@.+\./ },
|
|
34
|
+
// phone-shaped: 10–15 digits, optional leading `+`, nothing else.
|
|
35
|
+
{ name: "phone-shaped", re: /^\+?\d{10,15}$/ },
|
|
36
|
+
// uuid-ish / long opaque id: 16+ chars of hex + dashes only.
|
|
37
|
+
{ name: "uuid-or-long-opaque-id", re: /^[0-9a-fA-F-]{16,}$/ },
|
|
38
|
+
];
|
|
39
|
+
/** Return the first matching PII pattern name, or null. Heuristic-grade. */
|
|
40
|
+
function matchPii(value) {
|
|
41
|
+
for (const { name, re } of PII_PATTERNS) {
|
|
42
|
+
if (re.test(value))
|
|
43
|
+
return name;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Validate a `deferredActionPayloadSummary` against the global allow-list +
|
|
49
|
+
* the kind's optional `previewSchema` + the PII heuristic. Throws
|
|
50
|
+
* `InvalidApprovalPreviewShape` on the first failure. Returns the validated
|
|
51
|
+
* summary (a shallow normalised copy) so the caller persists exactly what was
|
|
52
|
+
* checked.
|
|
53
|
+
*
|
|
54
|
+
* `summary` may be `undefined` — that is allowed UNLESS the previewSchema
|
|
55
|
+
* marks `preview_label` (or any field) `required`.
|
|
56
|
+
*/
|
|
57
|
+
export function validatePreviewSummary(kind, summary, previewSchema) {
|
|
58
|
+
// No summary supplied. Allowed only if the previewSchema does not require
|
|
59
|
+
// any field. (The global allow-list does NOT itself make the summary
|
|
60
|
+
// mandatory — a kind opts into "required" via previewSchema.)
|
|
61
|
+
if (summary === undefined || summary === null) {
|
|
62
|
+
if (previewSchema)
|
|
63
|
+
enforceSchemaOnAbsentSummary(kind, previewSchema);
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
if (typeof summary !== "object" || Array.isArray(summary)) {
|
|
67
|
+
throw new InvalidApprovalPreviewShape(kind, "summary must be a plain object");
|
|
68
|
+
}
|
|
69
|
+
// [1] Global allow-list — reject any extra top-level key.
|
|
70
|
+
for (const key of Object.keys(summary)) {
|
|
71
|
+
if (!ALLOWED_TOP_LEVEL_KEYS.has(key)) {
|
|
72
|
+
throw new InvalidApprovalPreviewShape(kind, `unexpected top-level key '${key}' (only preview_label, preview_subline, counts are permitted)`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const rec = summary;
|
|
76
|
+
// preview_label — required by the global allow-list, non-empty string.
|
|
77
|
+
const label = rec.preview_label;
|
|
78
|
+
if (typeof label !== "string" || label.length === 0) {
|
|
79
|
+
throw new InvalidApprovalPreviewShape(kind, "preview_label is required and must be a non-empty string");
|
|
80
|
+
}
|
|
81
|
+
assertNoPii(kind, "preview_label", label);
|
|
82
|
+
// preview_subline — optional string.
|
|
83
|
+
if (rec.preview_subline !== undefined) {
|
|
84
|
+
if (typeof rec.preview_subline !== "string") {
|
|
85
|
+
throw new InvalidApprovalPreviewShape(kind, "preview_subline must be a string when present");
|
|
86
|
+
}
|
|
87
|
+
assertNoPii(kind, "preview_subline", rec.preview_subline);
|
|
88
|
+
}
|
|
89
|
+
// counts — optional object of string → number.
|
|
90
|
+
if (rec.counts !== undefined) {
|
|
91
|
+
validateCountsObject(kind, rec.counts);
|
|
92
|
+
}
|
|
93
|
+
// [2] Per-kind previewSchema layering.
|
|
94
|
+
if (previewSchema) {
|
|
95
|
+
enforceSchemaOnSummary(kind, rec, previewSchema);
|
|
96
|
+
}
|
|
97
|
+
// Normalised copy — only the allow-listed keys, in canonical order.
|
|
98
|
+
const out = { preview_label: label };
|
|
99
|
+
if (typeof rec.preview_subline === "string") {
|
|
100
|
+
out.preview_subline = rec.preview_subline;
|
|
101
|
+
}
|
|
102
|
+
if (rec.counts !== undefined) {
|
|
103
|
+
out.counts = { ...rec.counts };
|
|
104
|
+
}
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
/** Validate the `counts` value is a string→number map (no PII keys). */
|
|
108
|
+
function validateCountsObject(kind, counts) {
|
|
109
|
+
if (typeof counts !== "object" || counts === null || Array.isArray(counts)) {
|
|
110
|
+
throw new InvalidApprovalPreviewShape(kind, "counts must be an object of string→number when present");
|
|
111
|
+
}
|
|
112
|
+
for (const [k, v] of Object.entries(counts)) {
|
|
113
|
+
if (typeof v !== "number" || Number.isNaN(v)) {
|
|
114
|
+
throw new InvalidApprovalPreviewShape(kind, `counts['${k}'] must be a number (got ${typeof v})`);
|
|
115
|
+
}
|
|
116
|
+
// Count keys are also subject to the PII heuristic (defense-in-depth).
|
|
117
|
+
assertNoPii(kind, `counts key '${k}'`, k);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** Throw if `value` matches a PII heuristic. */
|
|
121
|
+
function assertNoPii(kind, field, value) {
|
|
122
|
+
const hit = matchPii(value);
|
|
123
|
+
if (hit) {
|
|
124
|
+
throw new InvalidApprovalPreviewShape(kind, `${field} looks like PII (${hit}); the preview summary must be non-PII`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/** Enforce a previewSchema when NO summary was supplied. */
|
|
128
|
+
function enforceSchemaOnAbsentSummary(kind, schema) {
|
|
129
|
+
if (schema.preview_label === "required") {
|
|
130
|
+
throw new InvalidApprovalPreviewShape(kind, "preview_label is required by the kind's previewSchema but no summary was supplied");
|
|
131
|
+
}
|
|
132
|
+
if (schema.preview_subline === "required") {
|
|
133
|
+
throw new InvalidApprovalPreviewShape(kind, "preview_subline is required by the kind's previewSchema but no summary was supplied");
|
|
134
|
+
}
|
|
135
|
+
enforceCountsRuleOnAbsent(kind, schema.counts);
|
|
136
|
+
}
|
|
137
|
+
/** Enforce a previewSchema against a present, allow-list-valid summary. */
|
|
138
|
+
function enforceSchemaOnSummary(kind, rec, schema) {
|
|
139
|
+
enforceFieldRule(kind, "preview_label", schema.preview_label, rec.preview_label !== undefined);
|
|
140
|
+
enforceFieldRule(kind, "preview_subline", schema.preview_subline, rec.preview_subline !== undefined);
|
|
141
|
+
const countsRule = schema.counts;
|
|
142
|
+
if (countsRule === undefined)
|
|
143
|
+
return;
|
|
144
|
+
const counts = rec.counts;
|
|
145
|
+
const countsPresent = counts !== undefined;
|
|
146
|
+
if (typeof countsRule === "string") {
|
|
147
|
+
enforceFieldRule(kind, "counts", countsRule, countsPresent);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// Nested map: specific count-key → rule.
|
|
151
|
+
for (const [countKey, rule] of Object.entries(countsRule)) {
|
|
152
|
+
const present = countsPresent && counts?.[countKey] !== undefined;
|
|
153
|
+
enforceFieldRule(kind, `counts['${countKey}']`, rule, present);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/** Enforce the counts rule when no summary (hence no counts) was supplied. */
|
|
157
|
+
function enforceCountsRuleOnAbsent(kind, countsRule) {
|
|
158
|
+
if (countsRule === undefined)
|
|
159
|
+
return;
|
|
160
|
+
if (typeof countsRule === "string") {
|
|
161
|
+
enforceFieldRule(kind, "counts", countsRule, false);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
for (const [countKey, rule] of Object.entries(countsRule)) {
|
|
165
|
+
enforceFieldRule(kind, `counts['${countKey}']`, rule, false);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** Apply one required/optional/forbidden rule to one field's presence. */
|
|
169
|
+
function enforceFieldRule(kind, field, rule, present) {
|
|
170
|
+
if (rule === undefined || rule === "optional")
|
|
171
|
+
return;
|
|
172
|
+
if (rule === "required" && !present) {
|
|
173
|
+
throw new InvalidApprovalPreviewShape(kind, `${field} is required by the kind's previewSchema but is absent`);
|
|
174
|
+
}
|
|
175
|
+
if (rule === "forbidden" && present) {
|
|
176
|
+
throw new InvalidApprovalPreviewShape(kind, `${field} is forbidden by the kind's previewSchema but is present`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=preview-validation.js.map
|