@remnic/core 9.7.1 → 9.7.3

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 (270) hide show
  1. package/dist/access-admin-ops-surface.d.ts +6 -6
  2. package/dist/access-admin-ops-surface.js +7 -7
  3. package/dist/access-boundary.d.ts +6 -6
  4. package/dist/access-boundary.js +8 -8
  5. package/dist/access-cli.js +31 -31
  6. package/dist/access-http.d.ts +15 -6
  7. package/dist/access-http.js +12 -12
  8. package/dist/access-identity-continuity-surface.d.ts +5 -5
  9. package/dist/access-identity-continuity-surface.js +7 -7
  10. package/dist/access-lcm-surface.d.ts +6 -6
  11. package/dist/access-lcm-surface.js +7 -7
  12. package/dist/access-mcp.d.ts +6 -6
  13. package/dist/access-mcp.js +11 -11
  14. package/dist/access-observe-write-surface.d.ts +6 -6
  15. package/dist/access-observe-write-surface.js +7 -7
  16. package/dist/access-operations-batch.js +9 -9
  17. package/dist/access-operations.d.ts +6 -6
  18. package/dist/access-operations.js +10 -10
  19. package/dist/access-recall-surface.d.ts +6 -6
  20. package/dist/access-recall-surface.js +7 -7
  21. package/dist/{access-service-CJ5hrLqR.d.ts → access-service-CxDZXTKt.d.ts} +4 -4
  22. package/dist/access-service.d.ts +6 -6
  23. package/dist/access-service.js +7 -7
  24. package/dist/access-surface-catalog.d.ts +6 -6
  25. package/dist/action-confidence.d.ts +1 -1
  26. package/dist/active-memory-bridge.d.ts +1 -1
  27. package/dist/active-recall.d.ts +1 -1
  28. package/dist/active-recall.js +1 -1
  29. package/dist/behavior-learner.d.ts +1 -1
  30. package/dist/behavior-signals.d.ts +1 -1
  31. package/dist/bootstrap.d.ts +5 -5
  32. package/dist/briefing.d.ts +2 -2
  33. package/dist/briefing.js +3 -3
  34. package/dist/buffer-surprise-report.d.ts +1 -1
  35. package/dist/buffer.d.ts +2 -2
  36. package/dist/bulk-import/index.d.ts +3 -3
  37. package/dist/calibration.d.ts +1 -1
  38. package/dist/capabilities.d.ts +1 -1
  39. package/dist/{catalog-XCOyxXKw.d.ts → catalog-DzU9HowE.d.ts} +1 -1
  40. package/dist/causal-behavior.d.ts +1 -1
  41. package/dist/causal-consolidation.d.ts +1 -1
  42. package/dist/causal-consolidation.js +4 -4
  43. package/dist/causal-trajectory-graph.d.ts +1 -1
  44. package/dist/{chunk-DDHT5J5M.js → chunk-64ZYEO3L.js} +6 -6
  45. package/dist/{chunk-QFOLNA2C.js → chunk-6C35R7P4.js} +2 -2
  46. package/dist/{chunk-PUPQ2PMC.js → chunk-74MJH7I3.js} +2 -2
  47. package/dist/{chunk-AWHOZTF6.js → chunk-AD2KK5MT.js} +2 -2
  48. package/dist/{chunk-RZEJDF3S.js → chunk-AH3M6F4X.js} +2 -2
  49. package/dist/{chunk-NS4GEMLR.js → chunk-AJWAIX2V.js} +3 -3
  50. package/dist/{chunk-RQTCDICG.js → chunk-CRFTLUWT.js} +2 -2
  51. package/dist/{chunk-BLXNPBJI.js → chunk-DQPPRXFO.js} +2 -2
  52. package/dist/{chunk-DSWYYEIK.js → chunk-EJCVMPIM.js} +12 -2
  53. package/dist/chunk-EJCVMPIM.js.map +1 -0
  54. package/dist/{chunk-CBOHQNTJ.js → chunk-FBE5UNB4.js} +2 -2
  55. package/dist/{chunk-KWJP22WP.js → chunk-FZO5U3OX.js} +7 -7
  56. package/dist/{chunk-ARD5NE4M.js → chunk-HQQLX2TR.js} +3 -3
  57. package/dist/{chunk-4YUPLX7U.js → chunk-HXDKC3BI.js} +2 -2
  58. package/dist/{chunk-QMUERLZK.js → chunk-JO5AT6QT.js} +1 -1
  59. package/dist/chunk-JO5AT6QT.js.map +1 -0
  60. package/dist/{chunk-NGJT7IW5.js → chunk-KKYNAODQ.js} +15 -15
  61. package/dist/{chunk-QRYNEVHP.js → chunk-KTOH7EJE.js} +2 -2
  62. package/dist/{chunk-GWMTFDHF.js → chunk-LKIVJNJU.js} +2 -2
  63. package/dist/{chunk-Y4EMHIQ5.js → chunk-LKVNBJDN.js} +11 -7
  64. package/dist/chunk-LKVNBJDN.js.map +1 -0
  65. package/dist/{chunk-VD56CJRR.js → chunk-O3BZ6PFY.js} +2 -2
  66. package/dist/{chunk-ZXUG3AFP.js → chunk-PKGWJFNR.js} +2 -2
  67. package/dist/{chunk-UKA7GNI2.js → chunk-QDCJNRKK.js} +3 -3
  68. package/dist/{chunk-FMECZFUT.js → chunk-R2SJDIPO.js} +2 -2
  69. package/dist/{chunk-WGE3OYC3.js → chunk-TGX2TY5S.js} +4 -4
  70. package/dist/{chunk-53Y3TETS.js → chunk-TVRPRFUB.js} +2 -2
  71. package/dist/{chunk-O24E5CFS.js → chunk-TZJVTH3F.js} +3 -3
  72. package/dist/{chunk-X6FSCBJZ.js → chunk-UTPNIGMA.js} +21 -17
  73. package/dist/chunk-UTPNIGMA.js.map +1 -0
  74. package/dist/{chunk-Z3HJ5L3Z.js → chunk-UVIQHSS7.js} +2 -2
  75. package/dist/{chunk-HT2DQ27U.js → chunk-UYZUJ4EB.js} +2 -2
  76. package/dist/{chunk-E47TABDR.js → chunk-WKE4VXSZ.js} +2 -2
  77. package/dist/{chunk-D6KNJRGX.js → chunk-ZUFJ7ZTR.js} +2 -2
  78. package/dist/{chunk-PML3GU4Q.js → chunk-ZW6OKHVX.js} +2 -2
  79. package/dist/{cli-CtECZr1q.d.ts → cli-BqyGVyOe.d.ts} +9 -5
  80. package/dist/cli.d.ts +8 -8
  81. package/dist/cli.js +25 -25
  82. package/dist/compounding/engine.d.ts +2 -2
  83. package/dist/compounding/engine.js +3 -3
  84. package/dist/compounding/preference-consolidator.d.ts +1 -1
  85. package/dist/compression-optimizer.d.ts +1 -1
  86. package/dist/config.d.ts +1 -1
  87. package/dist/config.js +1 -1
  88. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  89. package/dist/connectors/codex-materialize-runner.js +3 -3
  90. package/dist/connectors/codex-materialize.d.ts +1 -1
  91. package/dist/connectors/index.d.ts +1 -1
  92. package/dist/connectors/index.js +3 -3
  93. package/dist/consolidation-provenance-check.d.ts +2 -2
  94. package/dist/consolidation-undo.d.ts +2 -2
  95. package/dist/contradiction/index.d.ts +2 -2
  96. package/dist/conversation-index/backend.d.ts +1 -1
  97. package/dist/conversation-index/chunker.d.ts +1 -1
  98. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  99. package/dist/conversation-index/indexer.d.ts +1 -1
  100. package/dist/conversation-index/search.d.ts +1 -1
  101. package/dist/day-summary.d.ts +1 -1
  102. package/dist/delinearize.d.ts +1 -1
  103. package/dist/direct-answer-wiring.d.ts +1 -1
  104. package/dist/direct-answer.d.ts +1 -1
  105. package/dist/embedding-fallback.d.ts +1 -1
  106. package/dist/enrichment/index.d.ts +1 -1
  107. package/dist/entity-retrieval.d.ts +2 -2
  108. package/dist/entity-retrieval.js +3 -3
  109. package/dist/entity-schema.d.ts +1 -1
  110. package/dist/explicit-capture.d.ts +5 -5
  111. package/dist/extraction-faithfulness.d.ts +1 -1
  112. package/dist/extraction-judge-telemetry.d.ts +1 -1
  113. package/dist/extraction-judge-training.d.ts +1 -1
  114. package/dist/extraction-judge.d.ts +1 -1
  115. package/dist/extraction.d.ts +1 -1
  116. package/dist/fallback-llm.d.ts +1 -1
  117. package/dist/graph-dashboard-diff.d.ts +1 -1
  118. package/dist/graph-dashboard-key.d.ts +1 -1
  119. package/dist/graph-dashboard-parser.d.ts +1 -1
  120. package/dist/graph-edge-reinforcement.d.ts +1 -1
  121. package/dist/graph-snapshot.d.ts +1 -1
  122. package/dist/graph.d.ts +1 -1
  123. package/dist/identity-continuity.d.ts +1 -1
  124. package/dist/importance.d.ts +1 -1
  125. package/dist/importers/index.d.ts +1 -1
  126. package/dist/index.d.ts +13 -13
  127. package/dist/index.js +31 -31
  128. package/dist/intent.d.ts +1 -1
  129. package/dist/lcm/engine.d.ts +1 -1
  130. package/dist/lcm/index.d.ts +1 -1
  131. package/dist/lcm/tools.d.ts +1 -1
  132. package/dist/lifecycle.d.ts +1 -1
  133. package/dist/live-connectors-runner.d.ts +1 -1
  134. package/dist/local-llm.d.ts +1 -1
  135. package/dist/local-model-endpoint.d.ts +1 -1
  136. package/dist/maintenance/memory-governance.d.ts +1 -1
  137. package/dist/maintenance/memory-governance.js +3 -3
  138. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  139. package/dist/maintenance/rebuild-memory-projection.js +4 -4
  140. package/dist/mcp-memory-inspector-app.d.ts +6 -6
  141. package/dist/memory-action-policy.d.ts +1 -1
  142. package/dist/memory-cache.d.ts +1 -1
  143. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  144. package/dist/memory-projection-store.d.ts +1 -1
  145. package/dist/memory-provenance.d.ts +1 -1
  146. package/dist/memory-worth-outcomes.d.ts +2 -2
  147. package/dist/models-json.d.ts +1 -1
  148. package/dist/namespaces/migrate.d.ts +3 -3
  149. package/dist/namespaces/migrate.js +4 -4
  150. package/dist/namespaces/principal.d.ts +1 -1
  151. package/dist/namespaces/search.d.ts +1 -1
  152. package/dist/namespaces/storage.d.ts +3 -3
  153. package/dist/namespaces/storage.js +3 -3
  154. package/dist/native-knowledge.d.ts +1 -1
  155. package/dist/operator-toolkit.d.ts +2 -2
  156. package/dist/operator-toolkit.js +8 -8
  157. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  158. package/dist/orchestration/maintenance.d.ts +2 -2
  159. package/dist/orchestration/maintenance.js +5 -5
  160. package/dist/{orchestrator-CKctWsw9.d.ts → orchestrator-37Cx7yyw.d.ts} +4 -4
  161. package/dist/orchestrator.d.ts +5 -5
  162. package/dist/orchestrator.js +31 -31
  163. package/dist/patterns-cli.d.ts +1 -1
  164. package/dist/{pipeline-BWwGIys5.d.ts → pipeline-C6onljHc.d.ts} +1 -1
  165. package/dist/policy-runtime.d.ts +1 -1
  166. package/dist/provenance.d.ts +1 -1
  167. package/dist/{qmd-DFuUrBWW.d.ts → qmd-J08G7MEm.d.ts} +1 -1
  168. package/dist/qmd-preflight.d.ts +2 -2
  169. package/dist/qmd-recall-cache.d.ts +1 -1
  170. package/dist/qmd.d.ts +2 -2
  171. package/dist/recall-disclosure-escalation.d.ts +1 -1
  172. package/dist/recall-explain-renderer.d.ts +1 -1
  173. package/dist/recall-explain-renderer.js +3 -3
  174. package/dist/recall-planner-llm.d.ts +1 -1
  175. package/dist/recall-state.d.ts +1 -1
  176. package/dist/recall-tag-filter.d.ts +1 -1
  177. package/dist/recall-timings.d.ts +1 -1
  178. package/dist/recall-xray-cli.d.ts +1 -1
  179. package/dist/recall-xray-cli.js +4 -4
  180. package/dist/recall-xray-renderer.d.ts +1 -1
  181. package/dist/recall-xray-renderer.js +3 -3
  182. package/dist/recall-xray.d.ts +1 -1
  183. package/dist/recall-xray.js +2 -2
  184. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  185. package/dist/replay/normalizers/claude.d.ts +1 -1
  186. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  187. package/dist/replay/normalizers/shared.d.ts +1 -1
  188. package/dist/replay/runner.d.ts +1 -1
  189. package/dist/replay/types.d.ts +1 -1
  190. package/dist/resolve-auth-token.d.ts +1 -1
  191. package/dist/resume-bundles.js +2 -2
  192. package/dist/retrieval-agents.d.ts +2 -2
  193. package/dist/retrieval-tiers.d.ts +1 -1
  194. package/dist/routing/engine.d.ts +1 -1
  195. package/dist/routing/store.d.ts +1 -1
  196. package/dist/search/embed-helper.d.ts +1 -1
  197. package/dist/search/factory.d.ts +1 -1
  198. package/dist/search/index.d.ts +1 -1
  199. package/dist/search/lancedb-backend.d.ts +1 -1
  200. package/dist/search/meilisearch-backend.d.ts +1 -1
  201. package/dist/search/noop-backend.d.ts +1 -1
  202. package/dist/search/orama-backend.d.ts +1 -1
  203. package/dist/search/port.d.ts +1 -1
  204. package/dist/search/remote-backend.d.ts +1 -1
  205. package/dist/{semantic-consolidation-1Wlr7NWL.d.ts → semantic-consolidation-BFtoVosl.d.ts} +1 -1
  206. package/dist/semantic-consolidation.d.ts +2 -2
  207. package/dist/semantic-consolidation.js +4 -4
  208. package/dist/semantic-rule-promotion.js +3 -3
  209. package/dist/semantic-rule-verifier.d.ts +1 -1
  210. package/dist/semantic-rule-verifier.js +3 -3
  211. package/dist/session-observer-bands.d.ts +1 -1
  212. package/dist/session-observer-state.d.ts +1 -1
  213. package/dist/shared-context/manager.d.ts +1 -1
  214. package/dist/signal.d.ts +1 -1
  215. package/dist/{storage-BQwP90sb.d.ts → storage-CXjwBr69.d.ts} +1 -1
  216. package/dist/storage.d.ts +2 -2
  217. package/dist/storage.js +2 -2
  218. package/dist/summarizer.d.ts +1 -1
  219. package/dist/summary-snapshot.d.ts +1 -1
  220. package/dist/temporal-supersession.d.ts +2 -2
  221. package/dist/temporal-timeline-recall.d.ts +1 -1
  222. package/dist/temporal-validity.d.ts +1 -1
  223. package/dist/threading.d.ts +1 -1
  224. package/dist/tier-migration.d.ts +2 -2
  225. package/dist/tier-routing.d.ts +1 -1
  226. package/dist/topics.d.ts +1 -1
  227. package/dist/transcript.d.ts +1 -1
  228. package/dist/trust-score-stage.d.ts +1 -1
  229. package/dist/trust-score.d.ts +1 -1
  230. package/dist/{types-DgIkyAsK.d.ts → types-DpxqC8dI.d.ts} +4 -0
  231. package/dist/types.d.ts +1 -1
  232. package/dist/types.js +1 -1
  233. package/dist/utility-runtime.d.ts +1 -1
  234. package/dist/verified-recall.js +3 -3
  235. package/package.json +2 -2
  236. package/src/access-http.ts +27 -2
  237. package/src/cli.ts +8 -0
  238. package/src/config.ts +10 -0
  239. package/src/types.ts +4 -0
  240. package/dist/chunk-DSWYYEIK.js.map +0 -1
  241. package/dist/chunk-QMUERLZK.js.map +0 -1
  242. package/dist/chunk-X6FSCBJZ.js.map +0 -1
  243. package/dist/chunk-Y4EMHIQ5.js.map +0 -1
  244. /package/dist/{chunk-DDHT5J5M.js.map → chunk-64ZYEO3L.js.map} +0 -0
  245. /package/dist/{chunk-QFOLNA2C.js.map → chunk-6C35R7P4.js.map} +0 -0
  246. /package/dist/{chunk-PUPQ2PMC.js.map → chunk-74MJH7I3.js.map} +0 -0
  247. /package/dist/{chunk-AWHOZTF6.js.map → chunk-AD2KK5MT.js.map} +0 -0
  248. /package/dist/{chunk-RZEJDF3S.js.map → chunk-AH3M6F4X.js.map} +0 -0
  249. /package/dist/{chunk-NS4GEMLR.js.map → chunk-AJWAIX2V.js.map} +0 -0
  250. /package/dist/{chunk-RQTCDICG.js.map → chunk-CRFTLUWT.js.map} +0 -0
  251. /package/dist/{chunk-BLXNPBJI.js.map → chunk-DQPPRXFO.js.map} +0 -0
  252. /package/dist/{chunk-CBOHQNTJ.js.map → chunk-FBE5UNB4.js.map} +0 -0
  253. /package/dist/{chunk-KWJP22WP.js.map → chunk-FZO5U3OX.js.map} +0 -0
  254. /package/dist/{chunk-ARD5NE4M.js.map → chunk-HQQLX2TR.js.map} +0 -0
  255. /package/dist/{chunk-4YUPLX7U.js.map → chunk-HXDKC3BI.js.map} +0 -0
  256. /package/dist/{chunk-NGJT7IW5.js.map → chunk-KKYNAODQ.js.map} +0 -0
  257. /package/dist/{chunk-QRYNEVHP.js.map → chunk-KTOH7EJE.js.map} +0 -0
  258. /package/dist/{chunk-GWMTFDHF.js.map → chunk-LKIVJNJU.js.map} +0 -0
  259. /package/dist/{chunk-VD56CJRR.js.map → chunk-O3BZ6PFY.js.map} +0 -0
  260. /package/dist/{chunk-ZXUG3AFP.js.map → chunk-PKGWJFNR.js.map} +0 -0
  261. /package/dist/{chunk-UKA7GNI2.js.map → chunk-QDCJNRKK.js.map} +0 -0
  262. /package/dist/{chunk-FMECZFUT.js.map → chunk-R2SJDIPO.js.map} +0 -0
  263. /package/dist/{chunk-WGE3OYC3.js.map → chunk-TGX2TY5S.js.map} +0 -0
  264. /package/dist/{chunk-53Y3TETS.js.map → chunk-TVRPRFUB.js.map} +0 -0
  265. /package/dist/{chunk-O24E5CFS.js.map → chunk-TZJVTH3F.js.map} +0 -0
  266. /package/dist/{chunk-Z3HJ5L3Z.js.map → chunk-UVIQHSS7.js.map} +0 -0
  267. /package/dist/{chunk-HT2DQ27U.js.map → chunk-UYZUJ4EB.js.map} +0 -0
  268. /package/dist/{chunk-E47TABDR.js.map → chunk-WKE4VXSZ.js.map} +0 -0
  269. /package/dist/{chunk-D6KNJRGX.js.map → chunk-ZUFJ7ZTR.js.map} +0 -0
  270. /package/dist/{chunk-PML3GU4Q.js.map → chunk-ZW6OKHVX.js.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { TierRoutingPolicy } from './tier-routing.js';
2
- import './types-DgIkyAsK.js';
2
+ import './types-DpxqC8dI.js';
3
3
  import './message-parts/index.js';
4
4
  import './lifecycle.js';
5
5
 
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  compareVerifiedEpisodeResults,
3
3
  searchVerifiedEpisodes
4
- } from "./chunk-FMECZFUT.js";
4
+ } from "./chunk-R2SJDIPO.js";
5
5
  import "./chunk-2A3OXAP2.js";
6
6
  import "./chunk-ZBJMUXZH.js";
7
- import "./chunk-QRYNEVHP.js";
7
+ import "./chunk-KTOH7EJE.js";
8
8
  import "./chunk-B3ABVQ36.js";
9
9
  import "./chunk-L2B3EE7B.js";
10
10
  import "./chunk-5UZXUTVO.js";
@@ -15,7 +15,7 @@ import "./chunk-J6A3CX5N.js";
15
15
  import "./chunk-4KJLYTLS.js";
16
16
  import "./chunk-SVOZFLIQ.js";
17
17
  import "./chunk-LTJAMRGI.js";
18
- import "./chunk-QMUERLZK.js";
18
+ import "./chunk-JO5AT6QT.js";
19
19
  import "./chunk-RHOZ5LLO.js";
20
20
  import "./chunk-RL6NEVXT.js";
21
21
  import "./chunk-AWJ2FHCF.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.7.1",
3
+ "version": "9.7.3",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3000,7 +3000,7 @@
3000
3000
  "core"
3001
3001
  ],
3002
3002
  "peerDependencies": {
3003
- "@remnic/coding-graph": "^9.7.1"
3003
+ "@remnic/coding-graph": "^9.7.3"
3004
3004
  },
3005
3005
  "peerDependenciesMeta": {
3006
3006
  "@remnic/coding-graph": {
@@ -86,6 +86,13 @@ export interface EngramAccessHttpServerOptions {
86
86
  tokenPathPolicy?: (connector: string, pathname: string | undefined) => boolean;
87
87
  principal?: string;
88
88
  maxBodyBytes?: number;
89
+ /**
90
+ * Max non-replayed write requests per rolling window before 429
91
+ * `write_rate_limited` (issue #1937). Positive integer; defaults to 30.
92
+ */
93
+ writeRateLimitMaxRequests?: number;
94
+ /** Rolling window for the write rate limit, in ms. Positive integer; defaults to 60000. */
95
+ writeRateLimitWindowMs?: number;
89
96
  adminConsoleEnabled?: boolean;
90
97
  adminConsolePublicDir?: string;
91
98
  /** Inject the primary auth token into the admin console shell for trusted launch surfaces. */
@@ -206,6 +213,8 @@ function resolveDefaultAdminConsolePublicDir(): string {
206
213
  const defaultAdminConsolePublicDir = resolveDefaultAdminConsolePublicDir();
207
214
  const correlationIdStore = new AsyncLocalStorage<string>();
208
215
 
216
+ // Defaults for the write rate limit; overridable per instance via
217
+ // `writeRateLimitWindowMs` / `writeRateLimitMaxRequests` (issue #1937).
209
218
  const WRITE_RATE_LIMIT_WINDOW_MS = 60_000;
210
219
  const WRITE_RATE_LIMIT_MAX_REQUESTS = 30;
211
220
  const TRUST_ZONE_RECORD_KINDS = ["memory", "artifact", "state", "trajectory", "external"] as const;
@@ -370,6 +379,8 @@ export class EngramAccessHttpServer {
370
379
  ctx: { authorized: boolean },
371
380
  ) => Promise<boolean>;
372
381
  private readonly writeRequestTimestamps: number[] = [];
382
+ private readonly writeRateLimitMaxRequests: number;
383
+ private readonly writeRateLimitWindowMs: number;
373
384
  private readonly mcpServer: EngramMcpServer;
374
385
  private server: Server | null = null;
375
386
  private boundPort = 0;
@@ -406,6 +417,20 @@ export class EngramAccessHttpServer {
406
417
  this.maxBodyBytes = Number.isFinite(options.maxBodyBytes)
407
418
  ? Math.max(1, Math.floor(options.maxBodyBytes ?? 131072))
408
419
  : 131072;
420
+ // Defensive inline validation (config parsers reject invalid values
421
+ // loudly upstream; this only guards direct programmatic constructions).
422
+ this.writeRateLimitMaxRequests =
423
+ typeof options.writeRateLimitMaxRequests === "number" &&
424
+ Number.isInteger(options.writeRateLimitMaxRequests) &&
425
+ options.writeRateLimitMaxRequests >= 1
426
+ ? options.writeRateLimitMaxRequests
427
+ : WRITE_RATE_LIMIT_MAX_REQUESTS;
428
+ this.writeRateLimitWindowMs =
429
+ typeof options.writeRateLimitWindowMs === "number" &&
430
+ Number.isInteger(options.writeRateLimitWindowMs) &&
431
+ options.writeRateLimitWindowMs >= 1
432
+ ? options.writeRateLimitWindowMs
433
+ : WRITE_RATE_LIMIT_WINDOW_MS;
409
434
  this.adminConsoleEnabled = options.adminConsoleEnabled !== false;
410
435
  this.adminConsolePublicDir = options.adminConsolePublicDir ?? defaultAdminConsolePublicDir;
411
436
  this.adminConsolePrefillToken = options.adminConsolePrefillToken === true ? this.authToken : undefined;
@@ -3674,11 +3699,11 @@ export class EngramAccessHttpServer {
3674
3699
  const now = Date.now();
3675
3700
  while (
3676
3701
  this.writeRequestTimestamps.length > 0 &&
3677
- now - (this.writeRequestTimestamps[0] ?? 0) > WRITE_RATE_LIMIT_WINDOW_MS
3702
+ now - (this.writeRequestTimestamps[0] ?? 0) > this.writeRateLimitWindowMs
3678
3703
  ) {
3679
3704
  this.writeRequestTimestamps.shift();
3680
3705
  }
3681
- if (this.writeRequestTimestamps.length >= WRITE_RATE_LIMIT_MAX_REQUESTS) {
3706
+ if (this.writeRequestTimestamps.length >= this.writeRateLimitMaxRequests) {
3682
3707
  throw new HttpError(429, "write_rate_limited", "write_rate_limited");
3683
3708
  }
3684
3709
  }
package/src/cli.ts CHANGED
@@ -747,6 +747,8 @@ export interface AccessHttpServeCliCommandOptions {
747
747
  authToken?: string;
748
748
  principal?: string;
749
749
  maxBodyBytes?: number;
750
+ writeRateLimitMaxRequests?: number;
751
+ writeRateLimitWindowMs?: number;
750
752
  trustPrincipalHeader?: boolean;
751
753
  citationsEnabled?: boolean;
752
754
  citationsAutoDetect?: boolean;
@@ -758,6 +760,8 @@ export interface AccessHttpServeCliCommandOptions {
758
760
  authToken?: string;
759
761
  principal?: string;
760
762
  maxBodyBytes?: number;
763
+ writeRateLimitMaxRequests?: number;
764
+ writeRateLimitWindowMs?: number;
761
765
  trustPrincipalHeader?: boolean;
762
766
  citationsEnabled?: boolean;
763
767
  citationsAutoDetect?: boolean;
@@ -2749,6 +2753,8 @@ export async function runAccessHttpServeCliCommand(
2749
2753
  authToken: input.authToken,
2750
2754
  principal: input.principal,
2751
2755
  maxBodyBytes: input.maxBodyBytes,
2756
+ writeRateLimitMaxRequests: input.writeRateLimitMaxRequests,
2757
+ writeRateLimitWindowMs: input.writeRateLimitWindowMs,
2752
2758
  trustPrincipalHeader: input.trustPrincipalHeader,
2753
2759
  citationsEnabled: input.citationsEnabled,
2754
2760
  citationsAutoDetect: input.citationsAutoDetect,
@@ -6821,6 +6827,8 @@ export function registerCli(
6821
6827
  authToken: cliTokenOverride ?? resolvedConfigAuthToken,
6822
6828
  principal: resolveAccessPrincipalOverride(options.principal, orchestrator.config.agentAccessHttp.principal),
6823
6829
  maxBodyBytes: Number.isFinite(maxBodyBytesRaw) ? maxBodyBytesRaw : 131072,
6830
+ writeRateLimitMaxRequests: orchestrator.config.agentAccessHttp.writeRateLimitMaxRequests,
6831
+ writeRateLimitWindowMs: orchestrator.config.agentAccessHttp.writeRateLimitWindowMs,
6824
6832
  trustPrincipalHeader: options.trustPrincipalHeader === true,
6825
6833
  citationsEnabled: resolveConversationContextCapabilities(orchestrator.config).citations,
6826
6834
  citationsAutoDetect: orchestrator.config.citationsAutoDetect,
package/src/config.ts CHANGED
@@ -1515,6 +1515,16 @@ export function parseConfig(
1515
1515
  typeof rawAgentAccessHttp?.maxBodyBytes === "number"
1516
1516
  ? Math.max(1, Math.floor(rawAgentAccessHttp.maxBodyBytes))
1517
1517
  : 131072,
1518
+ writeRateLimitMaxRequests: resolvePositiveIntegerConfig(
1519
+ rawAgentAccessHttp?.writeRateLimitMaxRequests,
1520
+ 30,
1521
+ "agentAccessHttp.writeRateLimitMaxRequests",
1522
+ ),
1523
+ writeRateLimitWindowMs: resolvePositiveIntegerConfig(
1524
+ rawAgentAccessHttp?.writeRateLimitWindowMs,
1525
+ 60_000,
1526
+ "agentAccessHttp.writeRateLimitWindowMs",
1527
+ ),
1518
1528
  };
1519
1529
 
1520
1530
  let baseUrl: string | undefined;
package/src/types.ts CHANGED
@@ -255,6 +255,10 @@ export interface AgentAccessHttpConfig {
255
255
  authToken?: AgentAccessAuthToken;
256
256
  principal?: string;
257
257
  maxBodyBytes: number;
258
+ /** Max write requests per rolling window before 429 write_rate_limited (issue #1937). */
259
+ writeRateLimitMaxRequests: number;
260
+ /** Rolling window for the write rate limit, in ms (issue #1937). */
261
+ writeRateLimitWindowMs: number;
258
262
  }
259
263
 
260
264
  export interface DreamingConfig {