instar 1.3.230 → 1.3.232
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +29 -1
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +24 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/LlmCircuitBreaker.d.ts +15 -0
- package/dist/core/LlmCircuitBreaker.d.ts.map +1 -1
- package/dist/core/LlmCircuitBreaker.js +37 -1
- package/dist/core/LlmCircuitBreaker.js.map +1 -1
- package/dist/core/types.d.ts +16 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/monitoring/McpProcessReaper.d.ts +135 -0
- package/dist/monitoring/McpProcessReaper.d.ts.map +1 -0
- package/dist/monitoring/McpProcessReaper.js +229 -0
- package/dist/monitoring/McpProcessReaper.js.map +1 -0
- package/dist/monitoring/ResourceLedger.d.ts +78 -0
- package/dist/monitoring/ResourceLedger.d.ts.map +1 -0
- package/dist/monitoring/ResourceLedger.js +163 -0
- package/dist/monitoring/ResourceLedger.js.map +1 -0
- package/dist/monitoring/ResourceLedgerPoller.d.ts +64 -0
- package/dist/monitoring/ResourceLedgerPoller.d.ts.map +1 -0
- package/dist/monitoring/ResourceLedgerPoller.js +83 -0
- package/dist/monitoring/ResourceLedgerPoller.js.map +1 -0
- package/dist/monitoring/mcpProcessReaperDeps.d.ts +22 -0
- package/dist/monitoring/mcpProcessReaperDeps.d.ts.map +1 -0
- package/dist/monitoring/mcpProcessReaperDeps.js +125 -0
- package/dist/monitoring/mcpProcessReaperDeps.js.map +1 -0
- package/dist/monitoring/mcpProcessSignatures.d.ts +38 -0
- package/dist/monitoring/mcpProcessSignatures.d.ts.map +1 -0
- package/dist/monitoring/mcpProcessSignatures.js +55 -0
- package/dist/monitoring/mcpProcessSignatures.js.map +1 -0
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +5 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/AgentServer.d.ts +5 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +50 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/CapabilityIndex.d.ts.map +1 -1
- package/dist/server/CapabilityIndex.js +12 -0
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/routes.d.ts +4 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +31 -0
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +47 -47
- package/src/scaffold/templates.ts +5 -0
- package/upgrades/1.3.231.md +39 -0
- package/upgrades/1.3.232.md +47 -0
- package/upgrades/side-effects/mcp-process-reaper.md +58 -0
- package/upgrades/side-effects/resource-ledger-phase-a.md +101 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Side-Effects Review — Per-agent ResourceLedger, Phase A (durable rate-limit events)
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `resource-ledger-phase-a`
|
|
4
|
+
**Date:** `2026-06-03`
|
|
5
|
+
**Author:** `Echo (instar-dev agent)`
|
|
6
|
+
**Second-pass reviewer:** `not required`
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
Phase A of `docs/specs/per-agent-resource-ledger.md`: a durable, read-only store
|
|
11
|
+
for rate-limit events, so breaker trips + session-sentinel detections survive
|
|
12
|
+
restarts (today they're process-local and vanish). New:
|
|
13
|
+
- `src/monitoring/ResourceLedger.ts` — SQLite store (`rate_limit_events`),
|
|
14
|
+
TokenLedger pattern (NativeModuleHealer/WAL/registerSqliteHandle), swallow-on-write.
|
|
15
|
+
- `src/monitoring/ResourceLedgerPoller.ts` — event-driven; subscribes to the
|
|
16
|
+
breaker observer (+ optional RateLimitSentinel) and writes one row per emission.
|
|
17
|
+
- `src/core/LlmCircuitBreaker.ts` — added a minimal `onTrip`/`onRecover` observer
|
|
18
|
+
(emit in `onRateLimited` and on open→closed `onResolved`).
|
|
19
|
+
- `src/server/AgentServer.ts` — construct ledger (own try/catch) + start poller
|
|
20
|
+
(breaker = `getLlmCircuitBreaker()`); inject into route ctx; stop on shutdown.
|
|
21
|
+
- `src/server/routes.ts` — `GET /resources/rate-limits` (503 on null ledger).
|
|
22
|
+
- `src/config/ConfigDefaults.ts` — `monitoring.resourceLedger.enabled` (default on).
|
|
23
|
+
- `src/scaffold/templates.ts` — CLAUDE.md Capabilities entry (Agent Awareness).
|
|
24
|
+
|
|
25
|
+
## Decision-point inventory
|
|
26
|
+
- `LlmCircuitBreaker.onRateLimited / onResolved` — **modify (additive emit only)** —
|
|
27
|
+
fire observer callbacks; no change to gating/state logic.
|
|
28
|
+
- `ResourceLedger` writes, route, poller, config default, template — **add**.
|
|
29
|
+
|
|
30
|
+
## 1. Over-block
|
|
31
|
+
No block/allow surface — not applicable (read-only observability).
|
|
32
|
+
|
|
33
|
+
## 2. Under-block
|
|
34
|
+
No block/allow surface. (Phase A captures breaker trips + sentinel detections; it
|
|
35
|
+
does not claim to capture every provider 429 — the breaker trip is the canonical
|
|
36
|
+
account-level signal, sentinel detections are counted separately by `source`.)
|
|
37
|
+
|
|
38
|
+
## 3. Level-of-abstraction fit
|
|
39
|
+
Correct. The ledger is a recorder, not an authority; it FEEDS the read-only
|
|
40
|
+
`/resources` surface and never gates. The breaker observer is a pure side-channel
|
|
41
|
+
on a component that DOES hold gating authority — see §4.
|
|
42
|
+
|
|
43
|
+
> CI-fix addendum (full-suite caught two regressions the local subset missed,
|
|
44
|
+
> both no-behavior-change): (a) the new `/resources` route prefix was unclassified
|
|
45
|
+
> in `CapabilityIndex` — added a read-only `resourceLedger` capability entry
|
|
46
|
+
> (enabled only when `ctx.resourceLedger` exists); (b) `ResourceLedger.ts`
|
|
47
|
+
> registers a SQLite handle so it was added to the `SqliteRegistry-wiring` test's
|
|
48
|
+
> `LONG_LIVED_STORES` allowlist. No new surface; purely discoverability/test wiring.
|
|
49
|
+
|
|
50
|
+
## 4. Signal vs authority compliance
|
|
51
|
+
**Required reference:** docs/signal-vs-authority.md
|
|
52
|
+
- [x] No — this change has no block/allow surface of its own.
|
|
53
|
+
|
|
54
|
+
The one sensitive point: `LlmCircuitBreaker` holds real blocking authority (it
|
|
55
|
+
gates ALL LLM work). I added an *observer* to it, NOT logic that affects gating.
|
|
56
|
+
Safety properties, all tested (`tests/unit/llm-circuit-breaker-observers.test.ts`):
|
|
57
|
+
- `emitTrip`/`emitRecover` iterate listeners inside a per-listener `try/catch`, so
|
|
58
|
+
a throwing observer **cannot** propagate into the breaker — verified by a test
|
|
59
|
+
that registers a throwing listener and asserts `onRateLimited` doesn't throw and
|
|
60
|
+
`tripCount` is still correct.
|
|
61
|
+
- The emit happens AFTER all state mutation (last line of `onRateLimited`; end of
|
|
62
|
+
`onResolved`), so an observer can never see/affect an intermediate state.
|
|
63
|
+
- The 30 existing breaker tests still pass unchanged — no behavioral drift.
|
|
64
|
+
|
|
65
|
+
## 5. Interactions
|
|
66
|
+
- **Shadowing/double-fire:** none. The observer is additive; the breaker's
|
|
67
|
+
acquire/onRateLimited/onResolved behavior is byte-identical to before.
|
|
68
|
+
- **Races:** the poller's per-source `seq` + the ledger's `(source,ts,seq)` id +
|
|
69
|
+
`INSERT OR IGNORE` make writes idempotent; a replay can't double-count.
|
|
70
|
+
- **Lifecycle:** ledger constructed in its OWN try/catch in AgentServer (cascade
|
|
71
|
+
isolation — a failure can't 503 TokenLedger/FeatureMetricsLedger); poller
|
|
72
|
+
`stop()` unsubscribes the breaker observer + the ledger closes on shutdown.
|
|
73
|
+
- **Feedback loops:** none — observe-only.
|
|
74
|
+
|
|
75
|
+
## 6. External surfaces
|
|
76
|
+
- New route `GET /resources/rate-limits` (additive; Bearer-auth; read-only).
|
|
77
|
+
- Persistent state: a new `server-data/resource-ledger.db` per agent. No schema
|
|
78
|
+
change to existing DBs. Naturally bounded (~hundreds of events/day) — no
|
|
79
|
+
retention needed for `rate_limit_events` (the high-frequency `resource_samples`
|
|
80
|
+
table that WILL need retention is Phase B, not in this PR).
|
|
81
|
+
- Config: `monitoring.resourceLedger.enabled` default true (ships ON — event-driven,
|
|
82
|
+
negligible cost; `false` leaves the ledger null and the route 503s).
|
|
83
|
+
|
|
84
|
+
## 7. Rollback cost
|
|
85
|
+
Pure additive code + a new DB file. Revert and ship a patch; the orphaned
|
|
86
|
+
`resource-ledger.db` is harmless (nothing else reads it). No migration of existing
|
|
87
|
+
state, no agent-state repair, no user-visible regression.
|
|
88
|
+
|
|
89
|
+
## Conclusion
|
|
90
|
+
Complete, working Phase A with all three test tiers green (unit store+emitter+poller
|
|
91
|
+
incl. a real-breaker→real-ledger wiring test; integration route 200/503; e2e
|
|
92
|
+
"feature is alive" 200 on the real AgentServer init path). The only authority-
|
|
93
|
+
adjacent edit (the breaker observer) is provably unable to affect gating. CPU/mem
|
|
94
|
+
sampling + retention + the unified `/resources` snapshot + dashboard are Phase B
|
|
95
|
+
(specced, not in this PR). Clear to ship.
|
|
96
|
+
|
|
97
|
+
## Evidence pointers
|
|
98
|
+
- `tsc --noEmit` clean; vitest green: `ResourceLedger.test.ts` (6),
|
|
99
|
+
`ResourceLedgerPoller.test.ts` (4), `llm-circuit-breaker-observers.test.ts` (4),
|
|
100
|
+
`llm-circuit-breaker-wait.test.ts` (30, unchanged),
|
|
101
|
+
`resources-rate-limits-routes.test.ts` (2), `resources-rate-limits-lifecycle.test.ts` (3).
|