@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.
- package/CHANGELOG.md +42 -0
- package/README.md +39 -0
- package/dist/backlog-tools.d.ts +57 -0
- package/dist/backlog-tools.d.ts.map +1 -0
- package/dist/backlog-tools.js +173 -0
- package/dist/backlog-tools.js.map +1 -0
- package/dist/backlog.d.ts +82 -0
- package/dist/backlog.d.ts.map +1 -0
- package/dist/backlog.js +169 -0
- package/dist/backlog.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/extract.d.ts +28 -0
- package/dist/extract.d.ts.map +1 -0
- package/dist/extract.js +91 -0
- package/dist/extract.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +96 -3
- package/dist/index.js.map +1 -1
- package/dist/message-sending-handler.d.ts +41 -0
- package/dist/message-sending-handler.d.ts.map +1 -0
- package/dist/message-sending-handler.js +54 -0
- package/dist/message-sending-handler.js.map +1 -0
- package/dist/tool-result-handler.d.ts +37 -0
- package/dist/tool-result-handler.d.ts.map +1 -0
- package/dist/tool-result-handler.js +95 -0
- package/dist/tool-result-handler.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -1
- package/openclaw.plugin.json +11 -1
- package/package.json +7 -1
- package/.github/workflows/harness-docs.yml +0 -30
- package/AGENTS.md +0 -28
- package/docs/DATA.md +0 -28
- package/docs/DESIGN.md +0 -17
- package/docs/DOMAIN_DOCS.md +0 -30
- package/docs/FRONTEND.md +0 -24
- package/docs/OBSERVABILITY.md +0 -25
- package/docs/PLANS.md +0 -171
- package/docs/PRODUCT_SENSE.md +0 -20
- package/docs/RELIABILITY.md +0 -60
- package/docs/SECURITY.md +0 -50
- package/docs/design-docs/core-beliefs.md +0 -17
- package/docs/design-docs/index.md +0 -8
- package/docs/generated/README.md +0 -36
- package/docs/generated/memory.md +0 -1
- package/docs/plans/2026-02-16-fogclaw-design.md +0 -172
- package/docs/plans/2026-02-16-fogclaw-implementation.md +0 -1606
- package/docs/plans/README.md +0 -15
- package/docs/plans/active/2026-02-16-feat-openclaw-official-submission-plan.md +0 -386
- package/docs/plans/active/2026-02-17-feat-release-fogclaw-via-datafog-package-plan.md +0 -328
- package/docs/plans/active/2026-02-17-feat-submit-fogclaw-to-openclaw-plan.md +0 -244
- package/docs/plans/tech-debt-tracker.md +0 -42
- package/docs/plugins/fogclaw.md +0 -101
- package/docs/runbooks/address-review-findings.md +0 -30
- package/docs/runbooks/ci-failures.md +0 -46
- package/docs/runbooks/code-review.md +0 -34
- package/docs/runbooks/merge-change.md +0 -28
- package/docs/runbooks/pull-request.md +0 -45
- package/docs/runbooks/record-evidence.md +0 -43
- package/docs/runbooks/reproduce-bug.md +0 -42
- package/docs/runbooks/respond-to-feedback.md +0 -42
- package/docs/runbooks/review-findings.md +0 -31
- package/docs/runbooks/submit-openclaw-plugin.md +0 -68
- package/docs/runbooks/update-agents-md.md +0 -59
- package/docs/runbooks/update-domain-docs.md +0 -42
- package/docs/runbooks/validate-current-state.md +0 -41
- package/docs/runbooks/verify-release.md +0 -69
- package/docs/specs/2026-02-16-feat-openclaw-official-submission-spec.md +0 -115
- package/docs/specs/2026-02-17-feat-submit-fogclaw-to-openclaw.md +0 -125
- package/docs/specs/README.md +0 -5
- package/docs/specs/index.md +0 -8
- package/docs/spikes/README.md +0 -8
- package/fogclaw.config.example.json +0 -33
- package/scripts/ci/he-docs-config.json +0 -123
- package/scripts/ci/he-docs-drift.sh +0 -112
- package/scripts/ci/he-docs-lint.sh +0 -234
- package/scripts/ci/he-plans-lint.sh +0 -354
- package/scripts/ci/he-runbooks-lint.sh +0 -445
- package/scripts/ci/he-specs-lint.sh +0 -258
- package/scripts/ci/he-spikes-lint.sh +0 -249
- package/scripts/runbooks/select-runbooks.sh +0 -154
- package/src/config.ts +0 -183
- package/src/engines/gliner.ts +0 -240
- package/src/engines/regex.ts +0 -71
- package/src/index.ts +0 -372
- package/src/redactor.ts +0 -51
- package/src/scanner.ts +0 -196
- package/src/types.ts +0 -71
- package/tests/config.test.ts +0 -78
- package/tests/gliner.test.ts +0 -289
- package/tests/plugin-smoke.test.ts +0 -143
- package/tests/redactor.test.ts +0 -320
- package/tests/regex.test.ts +0 -345
- package/tests/scanner.test.ts +0 -348
- 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"}
|
package/dist/backlog.js
ADDED
|
@@ -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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"}
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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,
|
|
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)) {
|
package/dist/config.js.map
CHANGED
|
@@ -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":"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"}
|