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.
Files changed (54) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +29 -1
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  5. package/dist/config/ConfigDefaults.js +24 -0
  6. package/dist/config/ConfigDefaults.js.map +1 -1
  7. package/dist/core/LlmCircuitBreaker.d.ts +15 -0
  8. package/dist/core/LlmCircuitBreaker.d.ts.map +1 -1
  9. package/dist/core/LlmCircuitBreaker.js +37 -1
  10. package/dist/core/LlmCircuitBreaker.js.map +1 -1
  11. package/dist/core/types.d.ts +16 -0
  12. package/dist/core/types.d.ts.map +1 -1
  13. package/dist/core/types.js.map +1 -1
  14. package/dist/monitoring/McpProcessReaper.d.ts +135 -0
  15. package/dist/monitoring/McpProcessReaper.d.ts.map +1 -0
  16. package/dist/monitoring/McpProcessReaper.js +229 -0
  17. package/dist/monitoring/McpProcessReaper.js.map +1 -0
  18. package/dist/monitoring/ResourceLedger.d.ts +78 -0
  19. package/dist/monitoring/ResourceLedger.d.ts.map +1 -0
  20. package/dist/monitoring/ResourceLedger.js +163 -0
  21. package/dist/monitoring/ResourceLedger.js.map +1 -0
  22. package/dist/monitoring/ResourceLedgerPoller.d.ts +64 -0
  23. package/dist/monitoring/ResourceLedgerPoller.d.ts.map +1 -0
  24. package/dist/monitoring/ResourceLedgerPoller.js +83 -0
  25. package/dist/monitoring/ResourceLedgerPoller.js.map +1 -0
  26. package/dist/monitoring/mcpProcessReaperDeps.d.ts +22 -0
  27. package/dist/monitoring/mcpProcessReaperDeps.d.ts.map +1 -0
  28. package/dist/monitoring/mcpProcessReaperDeps.js +125 -0
  29. package/dist/monitoring/mcpProcessReaperDeps.js.map +1 -0
  30. package/dist/monitoring/mcpProcessSignatures.d.ts +38 -0
  31. package/dist/monitoring/mcpProcessSignatures.d.ts.map +1 -0
  32. package/dist/monitoring/mcpProcessSignatures.js +55 -0
  33. package/dist/monitoring/mcpProcessSignatures.js.map +1 -0
  34. package/dist/scaffold/templates.d.ts.map +1 -1
  35. package/dist/scaffold/templates.js +5 -0
  36. package/dist/scaffold/templates.js.map +1 -1
  37. package/dist/server/AgentServer.d.ts +5 -0
  38. package/dist/server/AgentServer.d.ts.map +1 -1
  39. package/dist/server/AgentServer.js +50 -0
  40. package/dist/server/AgentServer.js.map +1 -1
  41. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  42. package/dist/server/CapabilityIndex.js +12 -0
  43. package/dist/server/CapabilityIndex.js.map +1 -1
  44. package/dist/server/routes.d.ts +4 -0
  45. package/dist/server/routes.d.ts.map +1 -1
  46. package/dist/server/routes.js +31 -0
  47. package/dist/server/routes.js.map +1 -1
  48. package/package.json +1 -1
  49. package/src/data/builtin-manifest.json +47 -47
  50. package/src/scaffold/templates.ts +5 -0
  51. package/upgrades/1.3.231.md +39 -0
  52. package/upgrades/1.3.232.md +47 -0
  53. package/upgrades/side-effects/mcp-process-reaper.md +58 -0
  54. 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).