circle-ir-ai 2.31.0 → 2.33.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 +224 -0
- package/dist/agents/mastra/steps.d.ts +3 -3
- package/dist/agents/mastra/swarm.d.ts.map +1 -1
- package/dist/agents/mastra/swarm.js +277 -238
- package/dist/agents/mastra/swarm.js.map +1 -1
- package/dist/agents/mastra/workflow.d.ts +12 -0
- package/dist/agents/mastra/workflow.d.ts.map +1 -1
- package/dist/agents/mastra/workflow.js +24 -1
- package/dist/agents/mastra/workflow.js.map +1 -1
- package/dist/cache/backend.d.ts +5 -1
- package/dist/cache/backend.d.ts.map +1 -1
- package/dist/cache/backends/layout.js +1 -1
- package/dist/cache/backends/layout.js.map +1 -1
- package/dist/cache/cluster-cache.d.ts +113 -0
- package/dist/cache/cluster-cache.d.ts.map +1 -0
- package/dist/cache/cluster-cache.js +195 -0
- package/dist/cache/cluster-cache.js.map +1 -0
- package/dist/cache/tree-cache.d.ts +11 -0
- package/dist/cache/tree-cache.d.ts.map +1 -1
- package/dist/cache/tree-cache.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/llm/ax-client.d.ts.map +1 -1
- package/dist/llm/ax-client.js +26 -2
- package/dist/llm/ax-client.js.map +1 -1
- package/dist/llm/call-limiter.d.ts +125 -0
- package/dist/llm/call-limiter.d.ts.map +1 -0
- package/dist/llm/call-limiter.js +218 -0
- package/dist/llm/call-limiter.js.map +1 -0
- package/dist/llm/call-logger.d.ts +14 -0
- package/dist/llm/call-logger.d.ts.map +1 -1
- package/dist/llm/call-logger.js.map +1 -1
- package/dist/llm/index.d.ts +1 -0
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +2 -0
- package/dist/llm/index.js.map +1 -1
- package/dist/security-scan/scanner.d.ts +141 -0
- package/dist/security-scan/scanner.d.ts.map +1 -1
- package/dist/security-scan/scanner.js +231 -2
- package/dist/security-scan/scanner.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,230 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.33.0] - 2026-07-02
|
|
9
|
+
|
|
10
|
+
### Added — Cluster emission + policy wiring (cognium-ai#154, Sprint L5c; closes epic #155)
|
|
11
|
+
|
|
12
|
+
Ships P4 of epic #155 — the L5c wiring that connects the k-medoids
|
|
13
|
+
cluster foundation (shipped in 2.25.0) to the scan pipeline. Additive
|
|
14
|
+
by default: with no new inputs the runtime behavior is byte-identical
|
|
15
|
+
to 2.32.0. Coordinated with `cognium-ai@2.28.0`, which adds the
|
|
16
|
+
`--cluster-policy` CLI flag.
|
|
17
|
+
|
|
18
|
+
**Cluster pass in SecurityScanner.**
|
|
19
|
+
|
|
20
|
+
- `SecurityScanner.scan()` now invokes `clusterFiles()` after the
|
|
21
|
+
per-file `analyze()` loop populates `CircleIR[]`. K-selection uses
|
|
22
|
+
`min(8, ceil(sqrt(n)))` — sqrt-heuristic + cap-8 keeps cluster
|
|
23
|
+
count manageable and stays under the O(n² * iter) budget documented
|
|
24
|
+
at `cluster/cluster.ts:355-359`.
|
|
25
|
+
- Assignments are mapped back onto `FileResult` via the `filePath`
|
|
26
|
+
key. Each successfully-analyzed file receives `clusterId?: number`
|
|
27
|
+
(parseFailure / preFlightSkip rows omit it cleanly).
|
|
28
|
+
- New top-level `ScanResult.clusters?: ClusterResult` carries medoid
|
|
29
|
+
file paths + full assignment vector so downstream consumers (health,
|
|
30
|
+
action-queue, cognium-ai formatters) can read cluster shape without
|
|
31
|
+
re-running the pass.
|
|
32
|
+
- Internal `FileResult.clusterVector` field used to seed clustering is
|
|
33
|
+
`@internal` and stripped before emit (asserted by the new
|
|
34
|
+
`cluster-emission.test.ts` suite).
|
|
35
|
+
- **Never-throw contract:** `runClusterPass()` swallows all errors so
|
|
36
|
+
a k-medoids failure preserves pre-2.33.0 behavior. Logged verbose to
|
|
37
|
+
stderr when `--verbose` is on, silent otherwise.
|
|
38
|
+
|
|
39
|
+
**Persistent cluster cache (`src/cache/cluster-cache.ts`).**
|
|
40
|
+
|
|
41
|
+
- New `ClusterCache` layer mirrors the `tree-cache.ts` shape.
|
|
42
|
+
- `CacheNamespace` extended from `'tree' | 'verify' | 'discovery' |
|
|
43
|
+
'classifier'` to include `'cluster'`.
|
|
44
|
+
- Blob envelope `{ schema: 'cluster:v1', k, assignments, medoids,
|
|
45
|
+
iterations, ckVectorSig, computedAt }`. `PROMPT_VER = 'cluster-v1'`
|
|
46
|
+
algorithm sentinel; bump on any change to k-selection, distance
|
|
47
|
+
weights, or seed derivation.
|
|
48
|
+
- Key composition folds sorted-file-paths + CK-vector signature +
|
|
49
|
+
ruleSetFingerprint + projectProfile so any change invalidates the
|
|
50
|
+
cache. Same TTL (7 days) as tree-cache — assignments are stable
|
|
51
|
+
across comment-only edits.
|
|
52
|
+
- `LLM_CLUSTER_CACHE=0` disables the persistent layer without
|
|
53
|
+
throwing (no-op set / null get).
|
|
54
|
+
|
|
55
|
+
**ClusterPolicy hooks (opt-in, post-hoc).**
|
|
56
|
+
|
|
57
|
+
- `ScanOptions` gains two optional fields:
|
|
58
|
+
- `contextProfile?: ContextProfile` — uniform cluster policy label,
|
|
59
|
+
used both for downstream policy application AND for sweep
|
|
60
|
+
telemetry (echoed into `ScanMeta.contextProfile`).
|
|
61
|
+
- `clusterPolicies?: Map<number, ClusterPolicy>` — per-cluster
|
|
62
|
+
overrides. Unset today via the CLI (uniform-profile-only in L5c);
|
|
63
|
+
reserved for L5d when telemetry justifies per-cluster tuning.
|
|
64
|
+
- `applyClusterPolicies()` runs after `runClusterPass()` and before
|
|
65
|
+
emit. Currently exercises the `sinkWhitelist` filter only —
|
|
66
|
+
`sourceWhitelist` and `llmEnabled === false` are documented no-ops
|
|
67
|
+
today (they need pre-LLM wiring in workflow.ts and are deferred to
|
|
68
|
+
L5d to avoid the signature cascade).
|
|
69
|
+
- Zero-inputs fast path: when neither `clusterPolicies` nor
|
|
70
|
+
`contextProfile` is set, `applyClusterPolicies()` returns
|
|
71
|
+
immediately without allocating a policy object.
|
|
72
|
+
|
|
73
|
+
**ScanMeta.contextProfile echo.**
|
|
74
|
+
|
|
75
|
+
- `generateReport()` spreads `contextProfile` into ScanMeta only when
|
|
76
|
+
it was set on the input — so old JSON consumers don't gain a
|
|
77
|
+
null-valued key when the CLI flag is omitted. Populated when the
|
|
78
|
+
caller passes `--cluster-policy <profile>` through cognium-ai; drives
|
|
79
|
+
sweep-diff attribution per the operating principles locked
|
|
80
|
+
2026-06-24 (P2).
|
|
81
|
+
|
|
82
|
+
**Public API additions (all additive).**
|
|
83
|
+
|
|
84
|
+
- `ScanOptions.contextProfile?: ContextProfile`
|
|
85
|
+
- `ScanOptions.clusterPolicies?: Map<number, ClusterPolicy>`
|
|
86
|
+
- `ScanMeta.contextProfile?: ContextProfile`
|
|
87
|
+
- `ScanResult.clusters?: ClusterResult`
|
|
88
|
+
- `FileResult.clusterId?: number`
|
|
89
|
+
|
|
90
|
+
The cluster foundation exports (`clusterFiles`, `extractClusterVector`,
|
|
91
|
+
`ClusterVector`, `ClusterInput`, `ClusterAssignment`, `ClusterResult`,
|
|
92
|
+
`ClusterPolicy`, `ContextProfile`, `DEFAULT_CLUSTER_POLICY`) already
|
|
93
|
+
shipped in 2.25.0.
|
|
94
|
+
|
|
95
|
+
**Tests.**
|
|
96
|
+
|
|
97
|
+
- `tests/cluster-cache.test.ts` (15 tests) — round-trip persistence,
|
|
98
|
+
`ckVectorSignature` order-stability, k-change / file-add /
|
|
99
|
+
file-remove / ruleSetFingerprint invalidation, `LLM_CLUSTER_CACHE=0`
|
|
100
|
+
disable, singleton lifecycle, schema-tag guard on rehydration.
|
|
101
|
+
- `tests/cluster-emission.test.ts` (7 tests, uses `scanDirectory`
|
|
102
|
+
end-to-end) — clusterId populated on happy-path files, clusterVector
|
|
103
|
+
stripped before emit, determinism across two runs on the same corpus
|
|
104
|
+
(with cache reset between), n<2 corpus and empty corpus both omit
|
|
105
|
+
the `clusters` block, contextProfile echo into ScanMeta only when
|
|
106
|
+
set by the caller.
|
|
107
|
+
|
|
108
|
+
**Rollback.** Revert the scanner-wiring commit; foundation stays
|
|
109
|
+
intact (no changes to `cluster/cluster.ts`). Cluster cache never
|
|
110
|
+
fires when `clusterFiles()` is unreachable.
|
|
111
|
+
|
|
112
|
+
**Deferred to L5d.** Per-cluster policy overrides via `clusterPolicies`
|
|
113
|
+
map. Pre-LLM `sourceWhitelist` + `llmEnabled` enforcement in
|
|
114
|
+
workflow.ts (today's hooks are post-hoc filters over already-computed
|
|
115
|
+
findings). Auto-detect `contextProfile` from manifest signals — L5c
|
|
116
|
+
requires explicit `--cluster-policy` opt-in.
|
|
117
|
+
|
|
118
|
+
## [2.32.0] - 2026-07-02
|
|
119
|
+
|
|
120
|
+
### Added — LLM call throttle + hard cap (cognium-ai#159 + #160, Sprint L4a)
|
|
121
|
+
|
|
122
|
+
Ships the LLM call-throttle escape hatch and the per-scan / per-file
|
|
123
|
+
hard cap. Both are opt-in through env vars — with everything unset the
|
|
124
|
+
runtime behavior is identical to `2.31.1`, so this is additive by
|
|
125
|
+
default. Coordinated with `cognium-ai@2.27.0` (doc-only companion).
|
|
126
|
+
|
|
127
|
+
**cognium-ai#159 — `LLM_CONCURRENCY` alias.**
|
|
128
|
+
`src/llm/ax-client.ts` already ran every LLM call through a shared
|
|
129
|
+
`p-queue` with concurrency read from `LLM_MAX_CONCURRENT` (default
|
|
130
|
+
`10`). The ticket's premise — "LLM calls appear fully serial" —
|
|
131
|
+
turned out to be a naming/discoverability problem rather than a
|
|
132
|
+
missing throttle. The fix is a rename with backward-compat:
|
|
133
|
+
|
|
134
|
+
- **New env var:** `LLM_CONCURRENCY` (positive integer). Preferred
|
|
135
|
+
name going forward.
|
|
136
|
+
- **Legacy env var:** `LLM_MAX_CONCURRENT` continues to work; still
|
|
137
|
+
read when `LLM_CONCURRENCY` is unset. No deprecation warning.
|
|
138
|
+
- **Precedence:** `LLM_CONCURRENCY` > `LLM_MAX_CONCURRENT` > default
|
|
139
|
+
`10`. Both unset preserves the pre-2.32 behavior exactly.
|
|
140
|
+
- **Recommended values:** `4–8` for Ollama, `16+` for cloud
|
|
141
|
+
providers. The default `10` is intentionally conservative.
|
|
142
|
+
|
|
143
|
+
**cognium-ai#160 — `LLM_MAX_CALLS_PER_SCAN` + `LLM_MAX_CALLS_PER_FILE`.**
|
|
144
|
+
New module `src/llm/call-limiter.ts` provides a global counter that
|
|
145
|
+
gates every call at the transport boundary in `chatJSON`. When either
|
|
146
|
+
cap is reached, subsequent calls short-circuit to `null` and the
|
|
147
|
+
caller sees the same "LLM disabled" semantics that already exist for
|
|
148
|
+
provider outages and prefilter rejections (`{ llmSources: [],
|
|
149
|
+
llmSinks: [] }` / `{ verified: [], ... }`). No per-caller changes
|
|
150
|
+
were required.
|
|
151
|
+
|
|
152
|
+
New env vars, all default unset (unbounded, matches `2.31.1`
|
|
153
|
+
behavior):
|
|
154
|
+
- `LLM_MAX_CALLS_PER_SCAN` — total LLM calls per scan.
|
|
155
|
+
- `LLM_MAX_CALLS_PER_FILE` — per-file budget. Independent per file;
|
|
156
|
+
a fresh budget is allocated the first time each file appears in
|
|
157
|
+
the `filePath` context.
|
|
158
|
+
|
|
159
|
+
Behavior on cap-hit:
|
|
160
|
+
1. Counter is incremented on **acquire**, not on completion, so
|
|
161
|
+
concurrent p-queue firing cannot overshoot the cap.
|
|
162
|
+
2. Scan cap emits a single `console.warn` (`[call-limit]
|
|
163
|
+
LLM_MAX_CALLS_PER_SCAN=<n> reached; remaining LLM calls skipped,
|
|
164
|
+
files fall back to static-only`). Subsequent skips are silent.
|
|
165
|
+
Per-file cap is silent by design (would spam on large repos).
|
|
166
|
+
3. Retries inside an already-admitted call bypass the gate
|
|
167
|
+
(`retryCount > 0`), so a retried request does not re-acquire
|
|
168
|
+
budget.
|
|
169
|
+
4. A synthetic "no-call" JSONL row is written for every skipped call
|
|
170
|
+
with `skippedByCap: true` and `skippedCapReason: 'scan' | 'file'`,
|
|
171
|
+
following the existing `skippedByPrefilter` / `verifyCacheHit`
|
|
172
|
+
pattern. `analyze-llm-log.ts` in cognium-ai already surfaces
|
|
173
|
+
these rows.
|
|
174
|
+
|
|
175
|
+
**Per-scan isolation.** `analyzeFilesSwarm`,
|
|
176
|
+
`analyzeFilesSwarmStream`, and `analyzeFilesInBatches` in
|
|
177
|
+
`src/agents/mastra/swarm.ts` bracket their work with
|
|
178
|
+
`resetLLMCallLimiter(true)` + `markSwarmStart()` on entry, and
|
|
179
|
+
`markSwarmEnd()` in a `finally` block. `analyzeFile` in
|
|
180
|
+
`src/agents/mastra/workflow.ts` calls the unforced
|
|
181
|
+
`resetLLMCallLimiter()`, which is a no-op while a swarm is
|
|
182
|
+
orchestrating — this keeps the per-scan budget intact across
|
|
183
|
+
swarm-nested single-file callers while still resetting for
|
|
184
|
+
standalone single-file invocations.
|
|
185
|
+
|
|
186
|
+
**New exports (also re-exported from `./llm/index.js`):**
|
|
187
|
+
- `checkAndCountCall(ctx?)` — the gate itself. Returns `true` when
|
|
188
|
+
admitted, `false` when either cap fires.
|
|
189
|
+
- `resetLLMCallLimiter(force?)` — swarm-guarded by default; `force`
|
|
190
|
+
bypasses the guard (test hook + swarm-entry use).
|
|
191
|
+
- `markSwarmStart()` / `markSwarmEnd()` — bracket a swarm run to
|
|
192
|
+
suppress nested per-file resets.
|
|
193
|
+
- `getLLMCallStats()` — snapshot for tail summaries: `scanCounter`,
|
|
194
|
+
`scanSkipped`, `perFileSkipped`, `scanCapWarned`,
|
|
195
|
+
`resolvedConcurrency`, `resolvedScanCap`, `resolvedFileCap`.
|
|
196
|
+
- Consts: `LLM_CONCURRENCY`, `LLM_MAX_CALLS_PER_SCAN`,
|
|
197
|
+
`LLM_MAX_CALLS_PER_FILE`.
|
|
198
|
+
|
|
199
|
+
**Rollback:** unset all three env vars → pre-2.32 behavior. The
|
|
200
|
+
fast path in `checkAndCountCall` bails before any allocation when
|
|
201
|
+
both caps are `null`, so there is zero overhead on the default path.
|
|
202
|
+
|
|
203
|
+
**Tests.** New `tests/llm/call-limiter.test.ts` — 8 tests covering
|
|
204
|
+
default unbounded path, scan cap admit/skip counts, WARN
|
|
205
|
+
emit-exactly-once, per-file independent budgets, reset semantics,
|
|
206
|
+
swarm-guard interaction, env-var precedence (new name > legacy >
|
|
207
|
+
default), and scan-cap-precedes-per-file-cap ordering. Full engine
|
|
208
|
+
suite: 1204 pass + 3 skipped (was 1196 pass + 3 skipped on 2.31.1;
|
|
209
|
+
+8 from this ticket).
|
|
210
|
+
|
|
211
|
+
## [2.31.1] - 2026-07-02
|
|
212
|
+
|
|
213
|
+
### Changed — circle-ir bump 3.139.0 → 3.144.0 (patch, dep-only)
|
|
214
|
+
|
|
215
|
+
Refresh the pinned `circle-ir` dependency to the current published
|
|
216
|
+
version. Rolls up the 3.140/3.141/3.144 releases (3.142 and 3.143
|
|
217
|
+
were unpublished). No engine or public-API changes in this package.
|
|
218
|
+
|
|
219
|
+
**Test update.** `tests/findings-llm-discovery.test.ts` — the
|
|
220
|
+
"drops type-incompatible LLM pairs via canSourceReachSink gate" case
|
|
221
|
+
previously used `http_param → deserialization` as its incompatible
|
|
222
|
+
example. Upstream circle-ir Sprint 93 / cognium-dev#189 legitimately
|
|
223
|
+
widened `http_param` to include `deserialization` for
|
|
224
|
+
SnakeYAML/Jackson-shape gadget chains (Log4Shell shape). The test now
|
|
225
|
+
uses `env_input → xss` — server-side env vars still cannot reach
|
|
226
|
+
browser DOM contexts, so this pair remains outside the coverage matrix
|
|
227
|
+
and the assertion still exercises the intended gate. This is a
|
|
228
|
+
test-fixture correction, not a behavior change.
|
|
229
|
+
|
|
230
|
+
Suite: 1196 pass + 3 skipped (was 1196 pass + 3 skipped on 3.139.0).
|
|
231
|
+
|
|
8
232
|
## [2.31.0] - 2026-07-01
|
|
9
233
|
|
|
10
234
|
### Added — large-repo architectural knobs (cognium-ai#165 + #166 L3)
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* createStep() API with Zod schemas for type safety.
|
|
6
6
|
*/
|
|
7
7
|
export declare const patternMatchStep: import("@mastra/core/workflows").Step<"pattern-match", unknown, {
|
|
8
|
-
sourceCode: string;
|
|
9
8
|
filePath: string;
|
|
9
|
+
sourceCode: string;
|
|
10
10
|
language?: string | undefined;
|
|
11
11
|
}, {
|
|
12
12
|
imports: string[];
|
|
@@ -40,9 +40,9 @@ export declare const patternMatchStep: import("@mastra/core/workflows").Step<"pa
|
|
|
40
40
|
}[];
|
|
41
41
|
}, unknown, unknown, import("@mastra/core/workflows").DefaultEngineType, unknown>;
|
|
42
42
|
export declare const enrichStep: import("@mastra/core/workflows").Step<"enrich", unknown, {
|
|
43
|
+
filePath: string;
|
|
43
44
|
imports: string[];
|
|
44
45
|
sourceCode: string;
|
|
45
|
-
filePath: string;
|
|
46
46
|
patternSources: {
|
|
47
47
|
type: string;
|
|
48
48
|
line: number;
|
|
@@ -160,8 +160,8 @@ export declare const mergeStep: import("@mastra/core/workflows").Step<"merge", u
|
|
|
160
160
|
}[];
|
|
161
161
|
}, unknown, unknown, import("@mastra/core/workflows").DefaultEngineType, unknown>;
|
|
162
162
|
export declare const verifyStep: import("@mastra/core/workflows").Step<"verify", unknown, {
|
|
163
|
-
sourceCode: string;
|
|
164
163
|
filePath: string;
|
|
164
|
+
sourceCode: string;
|
|
165
165
|
types: {
|
|
166
166
|
kind: "class" | "interface" | "enum";
|
|
167
167
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../../src/agents/mastra/swarm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,SAAS,EAAyB,MAAM,2BAA2B,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../../src/agents/mastra/swarm.ts"],"names":[],"mappings":"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"}
|