@datafog/fogclaw 0.1.6 → 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.
Files changed (100) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +39 -0
  3. package/dist/backlog-tools.d.ts +57 -0
  4. package/dist/backlog-tools.d.ts.map +1 -0
  5. package/dist/backlog-tools.js +173 -0
  6. package/dist/backlog-tools.js.map +1 -0
  7. package/dist/backlog.d.ts +82 -0
  8. package/dist/backlog.d.ts.map +1 -0
  9. package/dist/backlog.js +169 -0
  10. package/dist/backlog.js.map +1 -0
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js +6 -0
  13. package/dist/config.js.map +1 -1
  14. package/dist/extract.d.ts +28 -0
  15. package/dist/extract.d.ts.map +1 -0
  16. package/dist/extract.js +91 -0
  17. package/dist/extract.js.map +1 -0
  18. package/dist/index.d.ts +2 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +96 -3
  21. package/dist/index.js.map +1 -1
  22. package/dist/message-sending-handler.d.ts +41 -0
  23. package/dist/message-sending-handler.d.ts.map +1 -0
  24. package/dist/message-sending-handler.js +54 -0
  25. package/dist/message-sending-handler.js.map +1 -0
  26. package/dist/tool-result-handler.d.ts +37 -0
  27. package/dist/tool-result-handler.d.ts.map +1 -0
  28. package/dist/tool-result-handler.js +95 -0
  29. package/dist/tool-result-handler.js.map +1 -0
  30. package/dist/types.d.ts +16 -0
  31. package/dist/types.d.ts.map +1 -1
  32. package/dist/types.js +3 -0
  33. package/dist/types.js.map +1 -1
  34. package/openclaw.plugin.json +11 -1
  35. package/package.json +7 -1
  36. package/.github/workflows/harness-docs.yml +0 -30
  37. package/AGENTS.md +0 -28
  38. package/docs/DATA.md +0 -28
  39. package/docs/DESIGN.md +0 -17
  40. package/docs/DOMAIN_DOCS.md +0 -30
  41. package/docs/FRONTEND.md +0 -24
  42. package/docs/OBSERVABILITY.md +0 -25
  43. package/docs/PLANS.md +0 -171
  44. package/docs/PRODUCT_SENSE.md +0 -20
  45. package/docs/RELIABILITY.md +0 -60
  46. package/docs/SECURITY.md +0 -50
  47. package/docs/design-docs/core-beliefs.md +0 -17
  48. package/docs/design-docs/index.md +0 -8
  49. package/docs/generated/README.md +0 -36
  50. package/docs/generated/memory.md +0 -1
  51. package/docs/plans/2026-02-16-fogclaw-design.md +0 -172
  52. package/docs/plans/2026-02-16-fogclaw-implementation.md +0 -1606
  53. package/docs/plans/README.md +0 -15
  54. package/docs/plans/active/2026-02-16-feat-openclaw-official-submission-plan.md +0 -386
  55. package/docs/plans/active/2026-02-17-feat-release-fogclaw-via-datafog-package-plan.md +0 -328
  56. package/docs/plans/active/2026-02-17-feat-submit-fogclaw-to-openclaw-plan.md +0 -244
  57. package/docs/plans/tech-debt-tracker.md +0 -42
  58. package/docs/plugins/fogclaw.md +0 -101
  59. package/docs/runbooks/address-review-findings.md +0 -30
  60. package/docs/runbooks/ci-failures.md +0 -46
  61. package/docs/runbooks/code-review.md +0 -34
  62. package/docs/runbooks/merge-change.md +0 -28
  63. package/docs/runbooks/pull-request.md +0 -45
  64. package/docs/runbooks/record-evidence.md +0 -43
  65. package/docs/runbooks/reproduce-bug.md +0 -42
  66. package/docs/runbooks/respond-to-feedback.md +0 -42
  67. package/docs/runbooks/review-findings.md +0 -31
  68. package/docs/runbooks/submit-openclaw-plugin.md +0 -68
  69. package/docs/runbooks/update-agents-md.md +0 -59
  70. package/docs/runbooks/update-domain-docs.md +0 -42
  71. package/docs/runbooks/validate-current-state.md +0 -41
  72. package/docs/runbooks/verify-release.md +0 -69
  73. package/docs/specs/2026-02-16-feat-openclaw-official-submission-spec.md +0 -115
  74. package/docs/specs/2026-02-17-feat-submit-fogclaw-to-openclaw.md +0 -125
  75. package/docs/specs/README.md +0 -5
  76. package/docs/specs/index.md +0 -8
  77. package/docs/spikes/README.md +0 -8
  78. package/fogclaw.config.example.json +0 -33
  79. package/scripts/ci/he-docs-config.json +0 -123
  80. package/scripts/ci/he-docs-drift.sh +0 -112
  81. package/scripts/ci/he-docs-lint.sh +0 -234
  82. package/scripts/ci/he-plans-lint.sh +0 -354
  83. package/scripts/ci/he-runbooks-lint.sh +0 -445
  84. package/scripts/ci/he-specs-lint.sh +0 -258
  85. package/scripts/ci/he-spikes-lint.sh +0 -249
  86. package/scripts/runbooks/select-runbooks.sh +0 -154
  87. package/src/config.ts +0 -183
  88. package/src/engines/gliner.ts +0 -240
  89. package/src/engines/regex.ts +0 -71
  90. package/src/index.ts +0 -372
  91. package/src/redactor.ts +0 -51
  92. package/src/scanner.ts +0 -196
  93. package/src/types.ts +0 -71
  94. package/tests/config.test.ts +0 -78
  95. package/tests/gliner.test.ts +0 -289
  96. package/tests/plugin-smoke.test.ts +0 -143
  97. package/tests/redactor.test.ts +0 -320
  98. package/tests/regex.test.ts +0 -345
  99. package/tests/scanner.test.ts +0 -348
  100. package/tsconfig.json +0 -20
package/CHANGELOG.md ADDED
@@ -0,0 +1,42 @@
1
+ # Changelog
2
+
3
+ ## 0.3.0
4
+
5
+ ### Added
6
+
7
+ - **PII access request backlog** — agents can request access to redacted data via `fogclaw_request_access`, users review via `fogclaw_requests`, and resolve (approve/deny/follow-up) via `fogclaw_resolve`. Full async workflow with batch resolve support.
8
+ - **RedactionMapStore** — captures placeholder-to-original text mappings from all three scanning hooks, enabling backlog approvals to reveal original data.
9
+ - **Configurable `maxPendingRequests`** — caps the number of pending access requests per session (default: 50). Configurable in `fogclaw.config.json` and `openclaw.plugin.json`.
10
+ - **FIFO eviction for redaction mappings** — `RedactionMapStore` caps at 10,000 entries by default with oldest-first eviction to prevent unbounded PII accumulation in memory.
11
+ - **Access request audit events** — `access_request_created` and `access_request_resolved` structured audit log entries when `auditEnabled: true`. Never includes raw PII.
12
+ - **ARCHITECTURE.md** — top-level architecture document covering components, scanning layers, tools, data flow, and key invariants.
13
+
14
+ ## 0.2.0
15
+
16
+ ### Added
17
+
18
+ - **Tool result PII scanning** — new `tool_result_persist` hook scans file reads, API responses, and web fetches for PII before they enter the session transcript. Uses regex engine (sync) for <1ms latency on the hot path.
19
+ - **Outbound message PII scanning** — new `message_sending` hook provides a last-chance gate that catches PII in agent replies before delivery to Telegram, Slack, Discord, and other external channels. Uses full Scanner (regex + GLiNER).
20
+ - **Policy allowlist** — whitelist exact strings, regex patterns, or per-entity-type values to skip enforcement on known-safe content (e.g., `noreply@example.com`).
21
+ - **Per-entity confidence thresholds** — tune GLiNER detection sensitivity per label (e.g., require 0.7 for PERSON, 0.85 for ORGANIZATION).
22
+ - **Audit trail logging** — structured audit log entries with `source` field (`guardrail`, `tool_result`, `outbound`) when `auditEnabled: true`. Logs entity counts and labels without raw PII.
23
+ - **Policy preview tool** — `fogclaw_preview` shows which entities would be blocked, warned, or redacted without changing runtime behavior.
24
+ - **Scanning architecture documentation** — README now includes a comparison matrix showing engine trade-offs across all three hooks.
25
+ - **Control UI hints** — `openclaw.plugin.json` includes `uiHints` for policy configuration in OpenClaw's Control UI.
26
+
27
+ ### Changed
28
+
29
+ - `resolveAction` extracted to shared `types.ts` module (was duplicated across files).
30
+ - README updated with three-layer scanning overview and defense-in-depth flow diagram.
31
+
32
+ ## 0.1.6
33
+
34
+ Initial scoped release as `@datafog/fogclaw`.
35
+
36
+ - Dual-engine PII detection (regex + GLiNER via ONNX)
37
+ - `before_agent_start` hook for automatic prompt guardrail
38
+ - `fogclaw_scan` and `fogclaw_redact` tools
39
+ - Configurable per-entity actions (`redact`, `block`, `warn`)
40
+ - Multiple redaction strategies (`token`, `mask`, `hash`)
41
+ - Custom entity types via GLiNER zero-shot NER
42
+ - Graceful degradation to regex-only when GLiNER unavailable
package/README.md CHANGED
@@ -6,7 +6,10 @@ FogClaw uses a dual-engine approach: battle-tested regex patterns for structured
6
6
 
7
7
  ## Features
8
8
 
9
+ - **Three-layer scanning** — inbound prompts, tool results, and outbound messages are all scanned for PII before they cross trust boundaries
9
10
  - **Automatic guardrail** — intercepts messages before they reach the LLM via OpenClaw's `before_agent_start` hook
11
+ - **Tool result scanning** — redacts PII in file reads, API responses, and web fetches before they enter the session transcript (`tool_result_persist`)
12
+ - **Outbound message scanning** — last-chance gate that catches PII in agent replies before delivery to external channels (`message_sending`)
10
13
  - **On-demand tools** — `fogclaw_scan`, `fogclaw_preview`, and `fogclaw_redact`
11
14
  - **Dual detection engine** — regex for structured PII (<1ms), GLiNER for zero-shot NER (~50-200ms)
12
15
  - **Custom entity types** — define any entity label (e.g., "project codename", "competitor name") and GLiNER detects them with zero training
@@ -141,6 +144,42 @@ Incoming message
141
144
  Apply action per entity type (redact / block / warn)
142
145
  ```
143
146
 
147
+ ## Scanning Architecture
148
+
149
+ FogClaw hooks into three points in the OpenClaw message lifecycle. Each hook uses the detection engine best suited to its runtime constraints:
150
+
151
+ | Hook | Direction | Engine | Latency | Async | Entity Coverage |
152
+ |------|-----------|--------|---------|-------|-----------------|
153
+ | `before_agent_start` | Inbound (user prompt) | Regex + GLiNER | ~50-200ms | Yes | Full — structured PII + names, orgs, custom entities |
154
+ | `tool_result_persist` | Internal (tool results) | Regex only | <1ms | No (sync) | Structured PII — emails, SSNs, phones, credit cards, IPs |
155
+ | `message_sending` | Outbound (agent reply) | Regex + GLiNER | ~50-200ms | Yes | Full — structured PII + names, orgs, custom entities |
156
+
157
+ **Why regex-only for tool results?** OpenClaw's `tool_result_persist` hook requires synchronous handlers — async returns are rejected. GLiNER inference runs a synchronous ONNX native call that blocks the event loop for 100-500ms per invocation, which would degrade gateway responsiveness (delayed heartbeats, WebSocket pings, HTTP responses). Regex covers the high-confidence structured patterns most common in tool output (credentials in file reads, contact info in API responses). Person names and organization names are caught on the async inbound and outbound paths, providing defense-in-depth without hot-path latency.
158
+
159
+ ```
160
+ User prompt ──► before_agent_start (regex + GLiNER)
161
+
162
+
163
+ Agent + LLM
164
+
165
+ ┌─────────┼─────────┐
166
+ ▼ ▼ ▼
167
+ Tool call Tool call Tool call
168
+ │ │ │
169
+ ▼ ▼ ▼
170
+ tool_result_persist (regex only, sync)
171
+
172
+
173
+ Agent reply
174
+
175
+
176
+ message_sending (regex + GLiNER)
177
+
178
+
179
+ External channel
180
+ (Telegram, Slack, etc.)
181
+ ```
182
+
144
183
  ## Detected Entity Types
145
184
 
146
185
  ### Regex Engine (structured PII)
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Tool handler factories for the PII access request backlog.
3
+ *
4
+ * Three tools:
5
+ * - fogclaw_request_access: agent submits a request for redacted data
6
+ * - fogclaw_requests: list/filter backlog requests
7
+ * - fogclaw_resolve: user approves, denies, or asks follow-up
8
+ */
9
+ import type { BacklogStore } from "./backlog.js";
10
+ import type { FogClawConfig } from "./types.js";
11
+ interface Logger {
12
+ info(msg: string): void;
13
+ warn(msg: string): void;
14
+ }
15
+ interface ToolResponse {
16
+ content: Array<{
17
+ type: "text";
18
+ text: string;
19
+ }>;
20
+ }
21
+ /**
22
+ * Create handler for fogclaw_request_access tool.
23
+ *
24
+ * Agent calls this when it encounters redacted content and wants
25
+ * to request access to the original text.
26
+ */
27
+ export declare function createRequestAccessHandler(backlog: BacklogStore, config: FogClawConfig, logger?: Logger): (params: {
28
+ placeholder: string;
29
+ entity_type: string;
30
+ reason: string;
31
+ context?: string;
32
+ }) => ToolResponse;
33
+ /**
34
+ * Create handler for fogclaw_requests tool.
35
+ *
36
+ * Lists backlog requests, optionally filtered by status.
37
+ * For approved requests, includes the original text.
38
+ */
39
+ export declare function createRequestsListHandler(backlog: BacklogStore, config: FogClawConfig, logger?: Logger): (params: {
40
+ status?: string;
41
+ }) => ToolResponse;
42
+ /**
43
+ * Create handler for fogclaw_resolve tool.
44
+ *
45
+ * User resolves a request: approve (reveals original text),
46
+ * deny, or follow_up (asks agent for more context).
47
+ *
48
+ * Supports single request_id or batch request_ids.
49
+ */
50
+ export declare function createResolveHandler(backlog: BacklogStore, config: FogClawConfig, logger?: Logger): (params: {
51
+ request_id?: string;
52
+ request_ids?: string[];
53
+ action: string;
54
+ message?: string;
55
+ }) => ToolResponse;
56
+ export {};
57
+ //# sourceMappingURL=backlog-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog-tools.d.ts","sourceRoot":"","sources":["../src/backlog-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,UAAU,MAAM;IACd,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAYD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,aAAa,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,CAAC,MAAM,EAAE;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,KAAK,YAAY,CA6BjB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,aAAa,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,CAAC,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,YAAY,CAoD/C;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,aAAa,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,CAAC,MAAM,EAAE;IACV,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,KAAK,YAAY,CAkGjB"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Tool handler factories for the PII access request backlog.
3
+ *
4
+ * Three tools:
5
+ * - fogclaw_request_access: agent submits a request for redacted data
6
+ * - fogclaw_requests: list/filter backlog requests
7
+ * - fogclaw_resolve: user approves, denies, or asks follow-up
8
+ */
9
+ function jsonResponse(data) {
10
+ return {
11
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
12
+ };
13
+ }
14
+ function errorResponse(message) {
15
+ return jsonResponse({ error: message });
16
+ }
17
+ /**
18
+ * Create handler for fogclaw_request_access tool.
19
+ *
20
+ * Agent calls this when it encounters redacted content and wants
21
+ * to request access to the original text.
22
+ */
23
+ export function createRequestAccessHandler(backlog, config, logger) {
24
+ return (params) => {
25
+ try {
26
+ const request = backlog.createRequest(params.placeholder, params.entity_type, params.reason, params.context);
27
+ if (config.auditEnabled && logger) {
28
+ logger.info(`[FOGCLAW AUDIT] access_request_created ${JSON.stringify({
29
+ request_id: request.id,
30
+ entity_type: request.entityType,
31
+ source: "backlog",
32
+ })}`);
33
+ }
34
+ return jsonResponse({
35
+ request_id: request.id,
36
+ status: request.status,
37
+ message: `Access request ${request.id} created for ${params.entity_type} entity "${params.placeholder}". A user must review and approve this request before the original text is revealed.`,
38
+ });
39
+ }
40
+ catch (err) {
41
+ return errorResponse(err.message);
42
+ }
43
+ };
44
+ }
45
+ /**
46
+ * Create handler for fogclaw_requests tool.
47
+ *
48
+ * Lists backlog requests, optionally filtered by status.
49
+ * For approved requests, includes the original text.
50
+ */
51
+ export function createRequestsListHandler(backlog, config, logger) {
52
+ return (params) => {
53
+ const validStatuses = ["pending", "approved", "denied", "follow_up"];
54
+ const statusFilter = params.status;
55
+ if (statusFilter && !validStatuses.includes(statusFilter)) {
56
+ return errorResponse(`Invalid status filter "${params.status}". Must be one of: ${validStatuses.join(", ")}`);
57
+ }
58
+ const requests = backlog.listRequests(statusFilter);
59
+ const items = requests.map((req) => {
60
+ const item = {
61
+ id: req.id,
62
+ placeholder: req.placeholder,
63
+ entity_type: req.entityType,
64
+ reason: req.reason,
65
+ context: req.context,
66
+ status: req.status,
67
+ created_at: req.createdAt,
68
+ };
69
+ if (req.status === "approved") {
70
+ item.original_text = req.originalText;
71
+ item.resolved_at = req.resolvedAt;
72
+ }
73
+ if (req.status === "denied") {
74
+ item.resolved_at = req.resolvedAt;
75
+ item.response_message = req.responseMessage;
76
+ }
77
+ if (req.status === "follow_up") {
78
+ item.follow_up_message = req.followUpMessage;
79
+ }
80
+ return item;
81
+ });
82
+ return jsonResponse({
83
+ requests: items,
84
+ total: items.length,
85
+ filter: statusFilter ?? "all",
86
+ });
87
+ };
88
+ }
89
+ /**
90
+ * Create handler for fogclaw_resolve tool.
91
+ *
92
+ * User resolves a request: approve (reveals original text),
93
+ * deny, or follow_up (asks agent for more context).
94
+ *
95
+ * Supports single request_id or batch request_ids.
96
+ */
97
+ export function createResolveHandler(backlog, config, logger) {
98
+ return (params) => {
99
+ const validActions = ["approve", "deny", "follow_up"];
100
+ if (!validActions.includes(params.action)) {
101
+ return errorResponse(`Invalid action "${params.action}". Must be one of: ${validActions.join(", ")}`);
102
+ }
103
+ const action = params.action;
104
+ // Batch resolve
105
+ if (params.request_ids && params.request_ids.length > 0) {
106
+ const results = backlog.resolveMultiple(params.request_ids, action, params.message);
107
+ if (config.auditEnabled && logger) {
108
+ for (const r of results) {
109
+ if (r.result) {
110
+ logger.info(`[FOGCLAW AUDIT] access_request_resolved ${JSON.stringify({
111
+ request_id: r.id,
112
+ action,
113
+ entity_type: r.result.entityType,
114
+ source: "backlog",
115
+ })}`);
116
+ }
117
+ }
118
+ }
119
+ return jsonResponse({
120
+ results: results.map((r) => {
121
+ if (r.error) {
122
+ return { id: r.id, error: r.error };
123
+ }
124
+ const item = {
125
+ id: r.id,
126
+ status: r.result.status,
127
+ };
128
+ if (action === "approve") {
129
+ item.original_text = r.result.originalText;
130
+ }
131
+ return item;
132
+ }),
133
+ action,
134
+ });
135
+ }
136
+ // Single resolve
137
+ if (!params.request_id) {
138
+ return errorResponse("Either request_id or request_ids must be provided.");
139
+ }
140
+ try {
141
+ const resolved = backlog.resolveRequest(params.request_id, action, params.message);
142
+ if (config.auditEnabled && logger) {
143
+ logger.info(`[FOGCLAW AUDIT] access_request_resolved ${JSON.stringify({
144
+ request_id: resolved.id,
145
+ action,
146
+ entity_type: resolved.entityType,
147
+ source: "backlog",
148
+ })}`);
149
+ }
150
+ const result = {
151
+ request_id: resolved.id,
152
+ status: resolved.status,
153
+ };
154
+ if (action === "approve") {
155
+ result.original_text = resolved.originalText;
156
+ result.message = resolved.originalText
157
+ ? `Access approved. Original text: ${resolved.originalText}`
158
+ : "Access approved, but original text was not captured during redaction.";
159
+ }
160
+ else if (action === "deny") {
161
+ result.message = params.message ?? "Access denied.";
162
+ }
163
+ else if (action === "follow_up") {
164
+ result.message = `Follow-up question sent to agent: "${params.message ?? ""}"`;
165
+ }
166
+ return jsonResponse(result);
167
+ }
168
+ catch (err) {
169
+ return errorResponse(err.message);
170
+ }
171
+ };
172
+ }
173
+ //# sourceMappingURL=backlog-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog-tools.js","sourceRoot":"","sources":["../src/backlog-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * In-memory backlog store for PII access requests.
3
+ *
4
+ * RedactionMapStore captures placeholder → original text mappings from hooks.
5
+ * BacklogStore manages the access request lifecycle (create, list, resolve).
6
+ *
7
+ * Both are session-scoped: state lives in runtime memory only and is
8
+ * discarded when the process exits.
9
+ */
10
+ import type { AccessRequest, RequestStatus } from "./types.js";
11
+ /**
12
+ * Stores redaction mappings from hook handlers so that access request
13
+ * approvals can retrieve the original pre-redaction text.
14
+ *
15
+ * Each time a hook redacts text, it calls addMapping() with the
16
+ * redactor's mapping (placeholder → original). When an access request
17
+ * is approved, the backlog looks up the original text here.
18
+ */
19
+ export declare class RedactionMapStore {
20
+ private store;
21
+ private maxMappings;
22
+ constructor(maxMappings?: number);
23
+ /** Merge new placeholder → original entries into the store. */
24
+ addMapping(mapping: Record<string, string>): void;
25
+ /** Look up the original text for a redacted placeholder. */
26
+ getOriginal(placeholder: string): string | undefined;
27
+ /** Reset all stored mappings. */
28
+ clear(): void;
29
+ /** Number of stored mappings. */
30
+ get size(): number;
31
+ /** Evict oldest entries (FIFO by Map insertion order) when over capacity. */
32
+ private evict;
33
+ }
34
+ /**
35
+ * Manages PII access requests throughout their lifecycle.
36
+ *
37
+ * Requests transition through: pending → approved | denied | follow_up.
38
+ * A follow_up request can later be resolved to approved or denied.
39
+ */
40
+ export declare class BacklogStore {
41
+ private requests;
42
+ private counter;
43
+ private redactionMap;
44
+ private maxPending;
45
+ constructor(redactionMap: RedactionMapStore, maxPending?: number);
46
+ /** Number of pending requests. */
47
+ get pendingCount(): number;
48
+ /** Total number of requests in any status. */
49
+ get totalCount(): number;
50
+ /**
51
+ * Create a new access request.
52
+ *
53
+ * Looks up the original text from the RedactionMapStore automatically.
54
+ * Throws if the pending request limit is reached.
55
+ */
56
+ createRequest(placeholder: string, entityType: string, reason: string, context?: string): AccessRequest;
57
+ /** Get a single request by ID. */
58
+ getRequest(id: string): AccessRequest | undefined;
59
+ /** List requests, optionally filtered by status. */
60
+ listRequests(statusFilter?: RequestStatus): AccessRequest[];
61
+ /**
62
+ * Resolve a single request.
63
+ *
64
+ * - approve: marks as approved, stores response message
65
+ * - deny: marks as denied, stores response message
66
+ * - follow_up: marks as follow_up, stores the follow-up question
67
+ *
68
+ * A follow_up request can be resolved again to approved or denied.
69
+ * Throws if request not found or already in a terminal state (approved/denied).
70
+ */
71
+ resolveRequest(id: string, action: "approve" | "deny" | "follow_up", message?: string): AccessRequest;
72
+ /**
73
+ * Resolve multiple requests with the same action.
74
+ * Returns an array of results (resolved request or error message per ID).
75
+ */
76
+ resolveMultiple(ids: string[], action: "approve" | "deny" | "follow_up", message?: string): Array<{
77
+ id: string;
78
+ result: AccessRequest | null;
79
+ error: string | null;
80
+ }>;
81
+ }
82
+ //# sourceMappingURL=backlog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog.d.ts","sourceRoot":"","sources":["../src/backlog.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D;;;;;;;GAOG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,SAAS;IAIhC,+DAA+D;IAC/D,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAOjD,4DAA4D;IAC5D,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpD,iCAAiC;IACjC,KAAK,IAAI,IAAI;IAIb,iCAAiC;IACjC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,6EAA6E;IAC7E,OAAO,CAAC,KAAK;CASd;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,UAAU,CAAS;gBAEf,YAAY,EAAE,iBAAiB,EAAE,UAAU,SAAK;IAK5D,kCAAkC;IAClC,IAAI,YAAY,IAAI,MAAM,CAMzB;IAED,8CAA8C;IAC9C,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;;;;OAKG;IACH,aAAa,CACX,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,aAAa;IA6BhB,kCAAkC;IAClC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIjD,oDAAoD;IACpD,YAAY,CAAC,YAAY,CAAC,EAAE,aAAa,GAAG,aAAa,EAAE;IAM3D;;;;;;;;;OASG;IACH,cAAc,CACZ,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,WAAW,EACxC,OAAO,CAAC,EAAE,MAAM,GACf,aAAa;IA0BhB;;;OAGG;IACH,eAAe,CACb,GAAG,EAAE,MAAM,EAAE,EACb,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,WAAW,EACxC,OAAO,CAAC,EAAE,MAAM,GACf,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CAU7E"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * In-memory backlog store for PII access requests.
3
+ *
4
+ * RedactionMapStore captures placeholder → original text mappings from hooks.
5
+ * BacklogStore manages the access request lifecycle (create, list, resolve).
6
+ *
7
+ * Both are session-scoped: state lives in runtime memory only and is
8
+ * discarded when the process exits.
9
+ */
10
+ /**
11
+ * Stores redaction mappings from hook handlers so that access request
12
+ * approvals can retrieve the original pre-redaction text.
13
+ *
14
+ * Each time a hook redacts text, it calls addMapping() with the
15
+ * redactor's mapping (placeholder → original). When an access request
16
+ * is approved, the backlog looks up the original text here.
17
+ */
18
+ export class RedactionMapStore {
19
+ store = new Map();
20
+ maxMappings;
21
+ constructor(maxMappings = 10_000) {
22
+ this.maxMappings = maxMappings;
23
+ }
24
+ /** Merge new placeholder → original entries into the store. */
25
+ addMapping(mapping) {
26
+ for (const [placeholder, original] of Object.entries(mapping)) {
27
+ this.store.set(placeholder, original);
28
+ }
29
+ this.evict();
30
+ }
31
+ /** Look up the original text for a redacted placeholder. */
32
+ getOriginal(placeholder) {
33
+ return this.store.get(placeholder);
34
+ }
35
+ /** Reset all stored mappings. */
36
+ clear() {
37
+ this.store.clear();
38
+ }
39
+ /** Number of stored mappings. */
40
+ get size() {
41
+ return this.store.size;
42
+ }
43
+ /** Evict oldest entries (FIFO by Map insertion order) when over capacity. */
44
+ evict() {
45
+ if (this.store.size <= this.maxMappings)
46
+ return;
47
+ const excess = this.store.size - this.maxMappings;
48
+ const iter = this.store.keys();
49
+ for (let i = 0; i < excess; i++) {
50
+ const key = iter.next().value;
51
+ if (key !== undefined)
52
+ this.store.delete(key);
53
+ }
54
+ }
55
+ }
56
+ /**
57
+ * Manages PII access requests throughout their lifecycle.
58
+ *
59
+ * Requests transition through: pending → approved | denied | follow_up.
60
+ * A follow_up request can later be resolved to approved or denied.
61
+ */
62
+ export class BacklogStore {
63
+ requests = new Map();
64
+ counter = 0;
65
+ redactionMap;
66
+ maxPending;
67
+ constructor(redactionMap, maxPending = 50) {
68
+ this.redactionMap = redactionMap;
69
+ this.maxPending = maxPending;
70
+ }
71
+ /** Number of pending requests. */
72
+ get pendingCount() {
73
+ let count = 0;
74
+ for (const req of this.requests.values()) {
75
+ if (req.status === "pending" || req.status === "follow_up")
76
+ count++;
77
+ }
78
+ return count;
79
+ }
80
+ /** Total number of requests in any status. */
81
+ get totalCount() {
82
+ return this.requests.size;
83
+ }
84
+ /**
85
+ * Create a new access request.
86
+ *
87
+ * Looks up the original text from the RedactionMapStore automatically.
88
+ * Throws if the pending request limit is reached.
89
+ */
90
+ createRequest(placeholder, entityType, reason, context) {
91
+ if (this.pendingCount >= this.maxPending) {
92
+ throw new Error(`Maximum pending requests reached (${this.maxPending}). Resolve existing requests before submitting new ones.`);
93
+ }
94
+ this.counter++;
95
+ const id = `REQ-${this.counter}`;
96
+ const originalText = this.redactionMap.getOriginal(placeholder) ?? null;
97
+ const request = {
98
+ id,
99
+ placeholder,
100
+ entityType,
101
+ originalText,
102
+ reason,
103
+ context: context ?? null,
104
+ status: "pending",
105
+ createdAt: new Date().toISOString(),
106
+ resolvedAt: null,
107
+ followUpMessage: null,
108
+ responseMessage: null,
109
+ };
110
+ this.requests.set(id, request);
111
+ return request;
112
+ }
113
+ /** Get a single request by ID. */
114
+ getRequest(id) {
115
+ return this.requests.get(id);
116
+ }
117
+ /** List requests, optionally filtered by status. */
118
+ listRequests(statusFilter) {
119
+ const all = Array.from(this.requests.values());
120
+ if (!statusFilter)
121
+ return all;
122
+ return all.filter((req) => req.status === statusFilter);
123
+ }
124
+ /**
125
+ * Resolve a single request.
126
+ *
127
+ * - approve: marks as approved, stores response message
128
+ * - deny: marks as denied, stores response message
129
+ * - follow_up: marks as follow_up, stores the follow-up question
130
+ *
131
+ * A follow_up request can be resolved again to approved or denied.
132
+ * Throws if request not found or already in a terminal state (approved/denied).
133
+ */
134
+ resolveRequest(id, action, message) {
135
+ const request = this.requests.get(id);
136
+ if (!request) {
137
+ throw new Error(`Request "${id}" not found.`);
138
+ }
139
+ if (request.status === "approved" || request.status === "denied") {
140
+ throw new Error(`Request "${id}" is already ${request.status}. Cannot resolve again.`);
141
+ }
142
+ const now = new Date().toISOString();
143
+ if (action === "follow_up") {
144
+ request.status = "follow_up";
145
+ request.followUpMessage = message ?? null;
146
+ return request;
147
+ }
148
+ request.status = action === "approve" ? "approved" : "denied";
149
+ request.resolvedAt = now;
150
+ request.responseMessage = message ?? null;
151
+ return request;
152
+ }
153
+ /**
154
+ * Resolve multiple requests with the same action.
155
+ * Returns an array of results (resolved request or error message per ID).
156
+ */
157
+ resolveMultiple(ids, action, message) {
158
+ return ids.map((id) => {
159
+ try {
160
+ const resolved = this.resolveRequest(id, action, message);
161
+ return { id, result: resolved, error: null };
162
+ }
163
+ catch (err) {
164
+ return { id, result: null, error: err.message };
165
+ }
166
+ });
167
+ }
168
+ }
169
+ //# sourceMappingURL=backlog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog.js","sourceRoot":"","sources":["../src/backlog.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAGnB,MAAM,YAAY,CAAC;AAoGpB,eAAO,MAAM,cAAc,EAAE,aAe5B,CAAC;AAEF,wBAAgB,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CA2D3E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAGnB,MAAM,YAAY,CAAC;AAoGpB,eAAO,MAAM,cAAc,EAAE,aAgB5B,CAAC;AAEF,wBAAgB,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAqE3E"}
package/dist/config.js CHANGED
@@ -84,6 +84,7 @@ export const DEFAULT_CONFIG = {
84
84
  entities: {},
85
85
  },
86
86
  auditEnabled: true,
87
+ maxPendingRequests: 50,
87
88
  };
88
89
  export function loadConfig(overrides) {
89
90
  const config = {
@@ -115,6 +116,11 @@ export function loadConfig(overrides) {
115
116
  if (typeof config.auditEnabled !== "boolean") {
116
117
  throw new Error(`auditEnabled must be true or false`);
117
118
  }
119
+ if (typeof config.maxPendingRequests !== "number" ||
120
+ !Number.isInteger(config.maxPendingRequests) ||
121
+ config.maxPendingRequests < 1) {
122
+ throw new Error(`maxPendingRequests must be a positive integer, got ${String(config.maxPendingRequests)}`);
123
+ }
118
124
  const normalizedActions = {};
119
125
  for (const [entityType, action] of Object.entries(config.entityActions)) {
120
126
  if (!VALID_GUARDRAIL_MODES.includes(action)) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,GAKd,MAAM,YAAY,CAAC;AAEpB,MAAM,qBAAqB,GAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC7E,MAAM,uBAAuB,GAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5E,SAAS,gBAAgB,CAAC,KAAc,EAAE,IAAY;IACpD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,8BAA8B,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE;QACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,4BAA4B,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAE5E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,uDAAuD,OAAO,GAAG,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IACzC,IACE,OAAO,aAAa,KAAK,QAAQ;QACjC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;QAC5B,aAAa,KAAK,IAAI,EACtB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,QAAQ,GAA6B,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACrE,MAAM,cAAc,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACjD,QAAQ,CAAC,cAAc,CAAC,GAAG,gBAAgB,CAAC,UAAU,EAAE,sBAAsB,UAAU,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO;QACL,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChC,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,gCAAgC,CACvC,KAAc;IAEd,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,UAAU,GAA2B,EAAE,CAAC;IAE9C,KAAK,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7D,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CACb,+BAA+B,UAAU,4CAA4C,MAAM,CACzF,YAAY,CACb,EAAE,CACJ,CAAC;QACJ,CAAC;QAED,IAAI,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CACb,+BAA+B,UAAU,mCAAmC,YAAY,EAAE,CAC3F,CAAC;QACJ,CAAC;QAED,MAAM,gBAAgB,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACnD,UAAU,CAAC,gBAAgB,CAAC,GAAG,YAAY,CAAC;IAC9C,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,QAAQ;IACxB,cAAc,EAAE,OAAO;IACvB,KAAK,EAAE,kCAAkC;IACzC,oBAAoB,EAAE,GAAG;IACzB,eAAe,EAAE,EAAE;IACnB,aAAa,EAAE,EAAE;IACjB,0BAA0B,EAAE,EAAE;IAC9B,SAAS,EAAE;QACT,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;KACb;IACD,YAAY,EAAE,IAAI;IAClB,kBAAkB,EAAE,EAAE;CACvB,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,SAAiC;IAC1D,MAAM,MAAM,GAAkB;QAC5B,GAAG,cAAc;QACjB,GAAG,SAAS;QACZ,aAAa,EAAE;YACb,GAAG,cAAc,CAAC,aAAa;YAC/B,GAAG,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE,CAAC;SACnC;QACD,0BAA0B,EAAE;YAC1B,GAAG,cAAc,CAAC,0BAA0B;YAC5C,GAAG,CAAC,SAAS,CAAC,0BAA0B,IAAI,EAAE,CAAC;SAChD;KACF,CAAC;IAEF,MAAM,CAAC,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,SAAS,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;IAC1F,MAAM,CAAC,0BAA0B,GAAG,gCAAgC,CAClE,MAAM,CAAC,0BAA0B,CAClC,CAAC;IAEF,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,2BAA2B,MAAM,CAAC,cAAc,sBAAsB,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzG,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CACb,2BAA2B,MAAM,CAAC,cAAc,sBAAsB,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3G,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,oBAAoB,GAAG,CAAC,IAAI,MAAM,CAAC,oBAAoB,GAAG,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CACb,qDAAqD,MAAM,CAAC,oBAAoB,EAAE,CACnF,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,IACE,OAAO,MAAM,CAAC,kBAAkB,KAAK,QAAQ;QAC7C,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,CAAC;QAC5C,MAAM,CAAC,kBAAkB,GAAG,CAAC,EAC7B,CAAC;QACD,MAAM,IAAI,KAAK,CACb,sDAAsD,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAC1F,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAoC,EAAE,CAAC;IAC9D,KAAK,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QACxE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,mBAAmB,MAAM,sBAAsB,UAAU,sBAAsB,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClH,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACjD,iBAAiB,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC;IAC7C,CAAC;IACD,MAAM,CAAC,aAAa,GAAG,iBAAiB,CAAC;IAEzC,OAAO,MAAM,CAAC;AAChB,CAAC"}