@clear-capabilities/agentic-security-scanner 0.145.0 → 0.147.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 +139 -0
- package/bin/agentic-security.js +3508 -69
- package/dist/1122.index.js +702 -0
- package/dist/{301.index.js → 1301.index.js} +2 -2
- package/dist/1379.index.js +591 -0
- package/dist/{444.index.js → 1444.index.js} +2 -2
- package/dist/{660.index.js → 1660.index.js} +2 -2
- package/dist/{700.index.js → 1700.index.js} +2 -2
- package/dist/{905.index.js → 1905.index.js} +3 -3
- package/dist/{920.index.js → 1920.index.js} +3 -3
- package/dist/{238.index.js → 2238.index.js} +3 -3
- package/dist/{271.index.js → 2271.index.js} +2 -2
- package/dist/{985.index.js → 2376.index.js} +1260 -340
- package/dist/2432.index.js +793 -0
- package/dist/2659.index.js +93 -0
- package/dist/{826.index.js → 2826.index.js} +2 -2
- package/dist/{830.index.js → 2830.index.js} +2 -2
- package/dist/2923.index.js +298 -0
- package/dist/{1.index.js → 3001.index.js} +5 -5
- package/dist/{117.index.js → 3117.index.js} +3 -3
- package/dist/3180.index.js +307 -0
- package/dist/3276.index.js +117 -0
- package/dist/{415.index.js → 3415.index.js} +2 -2
- package/dist/{499.index.js → 3499.index.js} +2 -2
- package/dist/3518.index.js +450 -0
- package/dist/{526.index.js → 3526.index.js} +5 -5
- package/dist/{736.index.js → 3736.index.js} +4 -4
- package/dist/{839.index.js → 3839.index.js} +4 -4
- package/dist/{113.index.js → 4113.index.js} +5 -5
- package/dist/{265.index.js → 4265.index.js} +2 -2
- package/dist/{384.index.js → 4384.index.js} +3 -3
- package/dist/4547.index.js +268 -0
- package/dist/4863.index.js +422 -0
- package/dist/{970.index.js → 4970.index.js} +2 -2
- package/dist/5051.index.js +770 -0
- package/dist/{144.index.js → 5144.index.js} +5 -5
- package/dist/{333.index.js → 5333.index.js} +3 -3
- package/dist/5343.index.js +185 -0
- package/dist/5350.index.js +866 -0
- package/dist/5561.index.js +436 -0
- package/dist/{637.index.js → 5637.index.js} +3 -3
- package/dist/{449.index.js → 5830.index.js} +2 -2
- package/dist/6626.index.js +532 -0
- package/dist/6662.index.js +297 -0
- package/dist/{675.index.js → 6675.index.js} +5 -5
- package/dist/{730.index.js → 6730.index.js} +6 -6
- package/dist/6829.index.js +225 -0
- package/dist/6944.index.js +130 -0
- package/dist/{178.index.js → 7178.index.js} +3 -3
- package/dist/{227.index.js → 7227.index.js} +2 -2
- package/dist/7310.index.js +520 -0
- package/dist/{552.index.js → 7552.index.js} +4 -4
- package/dist/7709.index.js +78 -0
- package/dist/8218.index.js +160 -0
- package/dist/{476.index.js → 8476.index.js} +4 -4
- package/dist/{513.index.js → 8513.index.js} +5 -5
- package/dist/{520.index.js → 8520.index.js} +2 -2
- package/dist/{718.index.js → 8718.index.js} +2 -2
- package/dist/{752.index.js → 8752.index.js} +2 -2
- package/dist/8846.index.js +100 -0
- package/dist/{435.index.js → 9091.index.js} +560 -189
- package/dist/{207.index.js → 9207.index.js} +2 -2
- package/dist/{220.index.js → 9220.index.js} +2 -2
- package/dist/9390.index.js +163 -0
- package/dist/{503.index.js → 9503.index.js} +2 -2
- package/dist/{801.index.js → 9801.index.js} +2 -2
- package/dist/{824.index.js → 9824.index.js} +2 -2
- package/dist/agentic-security.mjs +16 -16
- package/dist/agentic-security.mjs.sha256 +1 -1
- package/dist/compliance-frameworks/hipaa-security-rule.json +3 -2
- package/package.json +12 -5
- package/src/dataflow/CLAUDE.md +1 -1
- package/src/dataflow/catalog.js +42 -0
- package/src/dataflow/orm-write-catalog.js +175 -0
- package/src/engine.js +92 -1
- package/src/ir/CLAUDE.md +1 -0
- package/src/ir/chrome-probe.mjs +150 -0
- package/src/ir/parser-js.js +94 -7
- package/src/lineage/CLAUDE.md +1203 -0
- package/src/lineage/DESIGN_DESTINATION_RESOLVER.md +156 -0
- package/src/lineage/DESIGN_GRAPH_BUILDER.md +938 -0
- package/src/lineage/DESIGN_HANDLING_ANALYZER.md +355 -0
- package/src/lineage/DESIGN_INTRAPROCEDURAL.md +628 -0
- package/src/lineage/DESIGN_PATH_PROVENANCE.md +3451 -0
- package/src/lineage/DESIGN_QUEUE_DETAIL.md +120 -0
- package/src/lineage/DESIGN_REGISTRIES.md +880 -0
- package/src/lineage/DESIGN_STORE_DETAIL.md +143 -0
- package/src/lineage/DESIGN_TRANSIT_PROTECTION.md +245 -0
- package/src/lineage/classification.js +56 -0
- package/src/lineage/coverage.js +658 -0
- package/src/lineage/cross-repo-link.js +107 -0
- package/src/lineage/dataflow-graph.schema.json +184 -0
- package/src/lineage/decision-story.js +206 -0
- package/src/lineage/drift-policy.js +279 -0
- package/src/lineage/driver.js +135 -0
- package/src/lineage/engine.js +992 -0
- package/src/lineage/export-briefing.js +628 -0
- package/src/lineage/export-csv.js +62 -0
- package/src/lineage/export-json.js +238 -0
- package/src/lineage/export-privacy.js +258 -0
- package/src/lineage/federation-loader.js +111 -0
- package/src/lineage/field-identity.js +78 -0
- package/src/lineage/fixtures/build-flagship-fixture.mjs +272 -0
- package/src/lineage/fixtures/flagship-graph.json +1453 -0
- package/src/lineage/flow-grade.js +221 -0
- package/src/lineage/governance-edit.js +169 -0
- package/src/lineage/graph-builder.js +1114 -0
- package/src/lineage/graph-diff.js +431 -0
- package/src/lineage/graph-snapshot.js +180 -0
- package/src/lineage/handling-analyzer.js +168 -0
- package/src/lineage/ids.js +349 -0
- package/src/lineage/impact-assessment.js +76 -0
- package/src/lineage/impact-engine.js +268 -0
- package/src/lineage/index.js +281 -0
- package/src/lineage/language-coverage-tiers.js +58 -0
- package/src/lineage/obligation-mapping.js +126 -0
- package/src/lineage/obligation-predicates.js +235 -0
- package/src/lineage/observation-adapters.js +282 -0
- package/src/lineage/observation-correlation.js +622 -0
- package/src/lineage/observation-store.js +497 -0
- package/src/lineage/path-query.js +410 -0
- package/src/lineage/path-store.js +400 -0
- package/src/lineage/protection.js +53 -0
- package/src/lineage/recipient-profile.js +192 -0
- package/src/lineage/recipient-registry.js +394 -0
- package/src/lineage/redact-graph.js +224 -0
- package/src/lineage/remediation.js +417 -0
- package/src/lineage/resolve-destination.js +91 -0
- package/src/lineage/runtime-observation.js +464 -0
- package/src/lineage/scenario-diff.js +84 -0
- package/src/lineage/scenario-engine.js +251 -0
- package/src/lineage/scenario.js +101 -0
- package/src/lineage/schema.js +167 -0
- package/src/lineage/sink-registry.js +427 -0
- package/src/lineage/source-registry.js +357 -0
- package/src/lineage/source-seeding.js +212 -0
- package/src/lineage/summaries.js +590 -0
- package/src/lineage/transform-catalog.js +397 -0
- package/src/lineage/transit-protection.js +150 -0
- package/src/lineage/validate.js +285 -0
- package/src/mcp/CLAUDE.md +7 -1
- package/src/mcp/dataflow-tools.js +160 -0
- package/src/mcp/server.js +1 -1
- package/src/mcp/tools.js +2 -1
- package/src/pipeline/scan-health.js +19 -1
- package/src/posture/CLAUDE.md +19 -0
- package/src/posture/artifact-registry.js +52 -0
- package/src/posture/auditor-walkthrough.js +76 -0
- package/src/posture/compliance-frameworks/hipaa-security-rule.json +3 -2
- package/src/posture/obligation-evidence-pack.js +202 -0
- package/src/posture/remediation-ledger.js +337 -0
- package/src/server/CLAUDE.md +47 -0
- package/src/server/graph-loader.js +141 -0
- package/src/server/http-server.js +325 -0
- package/src/server/routes.js +129 -0
- package/src/server/security.js +111 -0
- package/src/server/static-assets.js +139 -0
- package/dist/11.index.js +0 -353
- package/dist/259.index.js +0 -975
- package/dist/317.index.js +0 -300
- package/dist/609.index.js +0 -741
- package/dist/838.index.js +0 -152
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# DESIGN_QUEUE_DETAIL.md — Sub-project E's binding design record (increment 3)
|
|
2
|
+
|
|
3
|
+
**Status:** landed as Milestone 2, Sub-project E, increment **3** — a
|
|
4
|
+
small, focused slice, per
|
|
5
|
+
`docs/superpowers/plans/2026-08-31-data-flow-explorer-m2-subproject-e3-plan.md`
|
|
6
|
+
and its own scoping document. Binding on later Sub-project E increments the
|
|
7
|
+
same way `DESIGN_STORE_DETAIL.md` binds increment 2 — but this record
|
|
8
|
+
covers its own, unrelated field: `node.queueDetail` is specific to
|
|
9
|
+
queue-category sink nodes (`kind: 'queue'`), never to be conflated with
|
|
10
|
+
`node.storeDetail` (increment 2's own field, for database-category `store`
|
|
11
|
+
nodes — a queue node is never a store node) or `node.destination`
|
|
12
|
+
(Sub-project A's own field, for external-api-category nodes).
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1. What this increment actually is
|
|
17
|
+
|
|
18
|
+
Queue sinks were already reachable before this increment: `sink-registry.js`'s
|
|
19
|
+
`PRIVACY_CATEGORY_MAP` already maps the `'queues'` privacy-catalog category
|
|
20
|
+
to `{category: 'queue', status: 'modeled'}`, and `graph-builder.js`'s
|
|
21
|
+
`enumerateSinkSites` already calls `matchPrivacySink` for every statement-
|
|
22
|
+
call site — the same matcher call increment 1/2's ORM-write work had to
|
|
23
|
+
build a whole new isolated catalog to avoid touching. A queue sink node
|
|
24
|
+
already existed in the graph, with `kind: 'queue'`, whenever a real fixture
|
|
25
|
+
reached one of `dataflow/privacy-catalog.js`'s two real queue entries
|
|
26
|
+
(`privacy-js-queue-sendMessage`, `privacy-js-queue-publish`). This
|
|
27
|
+
increment adds only the missing piece: the queue's own topic/queue-name
|
|
28
|
+
IDENTITY, extracted where extractable and attached to the sink node as a
|
|
29
|
+
new field, `node.queueDetail`.
|
|
30
|
+
|
|
31
|
+
## 2. The `queueDetail` object shape
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
{
|
|
35
|
+
provider: string | null, // deferred — always null in this increment (AWS/GCP/etc. — needs config-chain resolution, Sub-project A's own still-open scope, same reasoning storeDetail's provider/host stay null)
|
|
36
|
+
topic: string | null, // the queue URL / topic / stream name, when extractable
|
|
37
|
+
operation: string | null, // one of schema.js's new QUEUE_OPERATION_VALUES, or null
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Every queue site this increment recognizes gets `operation: 'publish'` —
|
|
42
|
+
both real catalog entries (`sendMessage`, `publish`) are unambiguously a
|
|
43
|
+
WRITE/publish operation, unlike the database case's real
|
|
44
|
+
`create`/`update`/`upsert` spread. `QUEUE_OPERATION_VALUES = ['publish',
|
|
45
|
+
'unknown']` — only two values, deliberately, the same "define the
|
|
46
|
+
vocabulary even if only one value is reachable today" precedent
|
|
47
|
+
`HANDLING_VALUES`/`STORE_OPERATION_VALUES` both already established.
|
|
48
|
+
|
|
49
|
+
## 3. `topic` extraction — two real shapes, one honestly unsupported
|
|
50
|
+
|
|
51
|
+
### 3.1. `privacy-js-queue-sendMessage` (SQS-shaped)
|
|
52
|
+
|
|
53
|
+
`sqs.sendMessage({QueueUrl: '...', MessageBody: ...})`: the queue identity
|
|
54
|
+
is a field INSIDE the call's own object-literal first argument. Directly
|
|
55
|
+
extractable by the same `props`-filtering shape increment 2's
|
|
56
|
+
`ormWriteColumns` already established (`graph-builder.js` — exclude spread
|
|
57
|
+
entries, exclude `'*'`-keyed computed entries), but this increment wants
|
|
58
|
+
the VALUE of one specific matching key, not every key name, so it is a
|
|
59
|
+
different, smaller function (`extractQueueDetail`), not a call to
|
|
60
|
+
`ormWriteColumns` itself.
|
|
61
|
+
|
|
62
|
+
A short, disclosed alias list — `['QueueUrl', 'TopicArn', 'topic',
|
|
63
|
+
'queueName']`, checked in that order — names the property key to look for.
|
|
64
|
+
When a matching key is found AND that property's own value is itself a
|
|
65
|
+
`kind: 'literal'` expression (the same check shape as
|
|
66
|
+
`resolve-destination.js`'s `isLiteral`, replicated locally per this
|
|
67
|
+
package's own "small local copy over cross-module dependency" precedent,
|
|
68
|
+
not imported), `String(value.value)` is extracted as `topic`. When no
|
|
69
|
+
matching key is found, or the matching key's value isn't a literal, `topic`
|
|
70
|
+
stays `null` — this call site is genuinely recognized as a queue sink, just
|
|
71
|
+
without an extractable identity, the same honest-absence discipline
|
|
72
|
+
`storeDetail.table` follows when a receiver name is somehow unavailable.
|
|
73
|
+
|
|
74
|
+
### 3.2. `privacy-js-queue-publish` (SNS/Kafka-shaped) — deferred, honestly
|
|
75
|
+
|
|
76
|
+
`topic.publish(...)` / `producer.publish(...)`: the topic identity is
|
|
77
|
+
typically NOT in this call's own arguments — it lives in a SEPARATE,
|
|
78
|
+
earlier statement that constructed the receiver (`const topic =
|
|
79
|
+
pubsub.topic('my-topic-name'); topic.publish(...)`). This increment does
|
|
80
|
+
**not** attempt a cross-statement lookup (finding the receiver identifier's
|
|
81
|
+
own defining assignment elsewhere in the function/file) — no primitive for
|
|
82
|
+
that exists anywhere in `src/lineage/` today, and building one is real,
|
|
83
|
+
undecided scope bigger than this increment. For this shape, `topic` stays
|
|
84
|
+
`null` unconditionally. This is an honest, disclosed gap, not a
|
|
85
|
+
half-attempt — see `test/lineage/queue-detail.test.js`'s own test comment
|
|
86
|
+
for the same disclosure at the point a future reader is most likely to
|
|
87
|
+
encounter it.
|
|
88
|
+
|
|
89
|
+
## 4. Wiring — mirrors `storeDetail`'s own precedent exactly
|
|
90
|
+
|
|
91
|
+
`mintNode` gains an optional `queueDetail` param (default `null`).
|
|
92
|
+
`sinkNodeFor` passes `site.queueDetail ?? null` through — the exact wiring
|
|
93
|
+
point `storeDetail` already established. `queueDetail` is set once, at node
|
|
94
|
+
MINT time, and is deliberately **NOT** part of the node identity
|
|
95
|
+
discriminator (`ids.nodeId`'s inputs are unchanged) — the same disclosed
|
|
96
|
+
coarsening `destination`/`storeDetail` already accepted: two sites
|
|
97
|
+
colliding onto one registry-decision node (same
|
|
98
|
+
`kind`/`subtypeKey`/`coverageStatus`/`externality`) still collide onto one
|
|
99
|
+
node, and that node's `queueDetail` is whichever site's resolution landed
|
|
100
|
+
first, not a set/union of every site's own facts.
|
|
101
|
+
|
|
102
|
+
`enumerateSinkSites` applies extraction as a conditional POST-step,
|
|
103
|
+
immediately after a general/privacy site is pushed: `if (r.decision
|
|
104
|
+
.category === 'queue') { site.queueDetail = extractQueueDetail(node.args ??
|
|
105
|
+
[]); }` — not a change to `resolveSinkAtCallSite`'s own signature, which has
|
|
106
|
+
no `args` parameter today and would gain one only for a fact solely the
|
|
107
|
+
queue category needs.
|
|
108
|
+
|
|
109
|
+
## 5. Explicitly deferred (named, not silently skipped)
|
|
110
|
+
|
|
111
|
+
- **The cross-statement topic-name lookup** for the
|
|
112
|
+
`publish`-on-a-constructed-topic shape (§3.2) — real future work, no
|
|
113
|
+
primitive exists for it today.
|
|
114
|
+
- **`provider` extraction** — needs config-chain resolution, Sub-project
|
|
115
|
+
A's own still-open scope.
|
|
116
|
+
- **Any language beyond JS/TS.**
|
|
117
|
+
- **Any queue SDK shape beyond the two `PRIVACY_SINK_CATALOG` already
|
|
118
|
+
recognizes** — Redis streams, RabbitMQ, etc. are not in the catalog
|
|
119
|
+
today; widening queue RECOGNITION itself is real, separate scope this
|
|
120
|
+
increment does not attempt.
|