@snoai/memory 1.2.9 → 1.2.10

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 (175) hide show
  1. package/README.md +4 -4
  2. package/dist/{access-tracker-D1e-2-Bb.d.ts → access-tracker-BOPHSJjf.d.ts} +4 -4
  3. package/dist/{adapter-TCrv5P-C.d.ts → adapter-lyb6RaQE.d.ts} +2 -2
  4. package/dist/{atomic-memory-extraction-C0n0wHzt.d.ts → atomic-memory-extraction-B_XpkhMd.d.ts} +7 -5
  5. package/dist/{atomic-memory-extraction-BG42OXou.js → atomic-memory-extraction-o2v8mp7G.js} +109 -50
  6. package/dist/{b-profile-section-dictionary-provider-y3DMQ518.d.ts → b-profile-section-dictionary-provider-BK5NBs-y.d.ts} +1 -1
  7. package/dist/{capture-policy-detector-BY7v5Cq1.d.ts → capture-policy-detector-BvVGmxxX.d.ts} +1 -1
  8. package/dist/{classifier-DnbbtwTS.d.ts → classifier-CXQxJJPP.d.ts} +1 -1
  9. package/dist/client.d.ts +1 -1
  10. package/dist/{coding-skin-_Qu3INZD.js → coding-skin-azRXA51Z.js} +2 -1
  11. package/dist/coding-skin.d.ts +1 -0
  12. package/dist/coding-skin.js +2 -2
  13. package/dist/{config-BCZRhUvW.js → config-C7LzSWhG.js} +9 -4
  14. package/dist/{connection-C9YD5sgm.js → connection-PQcq3TPO.js} +1 -1
  15. package/dist/{derived-suppression-cache-BLAH0nB9.d.ts → derived-suppression-cache-Ckwjey7I.d.ts} +1 -1
  16. package/dist/diagnostic-encoder.js +1 -1
  17. package/dist/{index-dQMkc_6y.d.ts → index-CsPUNkcm.d.ts} +2 -2
  18. package/dist/{index-BO4RU_mc.d.ts → index-DPfJrOFD.d.ts} +1 -1
  19. package/dist/{index-DL8AVj0Z.d.ts → index-Pb9LrHgL.d.ts} +4 -5
  20. package/dist/index.d.ts +12 -9
  21. package/dist/index.js +97 -47
  22. package/dist/internal/config/index.d.ts +1 -1
  23. package/dist/internal/config/index.js +4 -5
  24. package/dist/internal/config/plugin-config-schema.d.ts +1 -1
  25. package/dist/internal/config/plugin-config-schema.js +1 -1
  26. package/dist/internal/config/product-mode.d.ts +1 -1
  27. package/dist/internal/config/settings.d.ts +1 -1
  28. package/dist/internal/config/settings.js +4 -4
  29. package/dist/internal/config/skin-defaults.d.ts +1 -1
  30. package/dist/internal/contract/profile.d.ts +1 -1
  31. package/dist/internal/contract/routes.d.ts +1 -1
  32. package/dist/internal/engine/bindings/memory-cli-shared.d.ts +4 -4
  33. package/dist/internal/engine/bindings/memory-forget-tool.js +1 -1
  34. package/dist/internal/engine/bindings/memory-list-tool.js +1 -1
  35. package/dist/internal/engine/bindings/memory-recall-tool.js +1 -1
  36. package/dist/internal/engine/bindings/memory-reflection-resolve-tool.js +1 -1
  37. package/dist/internal/engine/bindings/memory-stats-tool.js +2 -2
  38. package/dist/internal/engine/bindings/memory-store-tool.js +4 -4
  39. package/dist/internal/engine/bindings/memory-tool-access.d.ts +1 -1
  40. package/dist/internal/engine/bindings/memory-tool-access.js +1 -1
  41. package/dist/internal/engine/bindings/memory-tool-results.d.ts +1 -1
  42. package/dist/internal/engine/bindings/memory-tool-results.js +1 -1
  43. package/dist/internal/engine/bindings/memory-tool-schemas.d.ts +5 -5
  44. package/dist/internal/engine/bindings/memory-tool-schemas.js +1 -1
  45. package/dist/internal/engine/bindings/memory-update-tool.js +3 -3
  46. package/dist/internal/engine/bindings/sno-station-mem-ambient-learning-hook.d.ts +4 -4
  47. package/dist/internal/engine/bindings/sno-station-mem-ambient-learning-hook.js +4 -4
  48. package/dist/internal/engine/bindings/sno-station-mem-auto-recall-hook.d.ts +4 -4
  49. package/dist/internal/engine/bindings/sno-station-mem-auto-recall-hook.js +2 -2
  50. package/dist/internal/engine/bindings/sno-station-mem-insight-distill-factory.d.ts +6 -6
  51. package/dist/internal/engine/bindings/sno-station-mem-insight-distill-factory.js +7 -5
  52. package/dist/internal/engine/bindings/sno-station-mem-message-transcript.js +2 -2
  53. package/dist/internal/engine/bindings/sno-station-mem-reset-hook.d.ts +3 -3
  54. package/dist/internal/engine/bindings/sno-station-mem-runtime-mode.d.ts +1 -1
  55. package/dist/internal/engine/bindings/sno-station-mem-runtime-mode.js +3 -3
  56. package/dist/internal/engine/extraction/atomic-memory-extraction.d.ts +1 -1
  57. package/dist/internal/engine/extraction/atomic-memory-extraction.js +1 -1
  58. package/dist/internal/engine/extraction/b-profile-section-dictionary-provider.d.ts +1 -1
  59. package/dist/internal/engine/extraction/b-profile-section-rekey.d.ts +5 -5
  60. package/dist/internal/engine/extraction/capture-policy-detector.d.ts +1 -1
  61. package/dist/internal/engine/extraction/memory-metadata-codec.d.ts +2 -2
  62. package/dist/internal/engine/extraction/memory-temporality-classifier.d.ts +1 -1
  63. package/dist/internal/engine/extraction/memory-temporality-classifier.js +1 -1
  64. package/dist/internal/engine/observability/adapter.d.ts +1 -1
  65. package/dist/internal/engine/observability/memory-snapshot.d.ts +1 -1
  66. package/dist/internal/engine/observability/observable-embedder.d.ts +1 -1
  67. package/dist/internal/engine/observability/observable-llm-client.d.ts +1 -1
  68. package/dist/internal/engine/observability/observable-llm-client.js +0 -2
  69. package/dist/internal/engine/observability/observable-memory-store.d.ts +1 -1
  70. package/dist/internal/engine/observability/observable-memory-store.js +2 -2
  71. package/dist/internal/engine/observability/observable-retriever.d.ts +1 -1
  72. package/dist/internal/engine/observability/observable-retriever.js +1 -1
  73. package/dist/internal/engine/observability/runtime-diagnostics.d.ts +1 -1
  74. package/dist/internal/engine/observability/runtime-diagnostics.js +3 -3
  75. package/dist/internal/engine/operations/daily-spend-estimator.js +1 -1
  76. package/dist/internal/engine/operations/memory-tier-promoter.d.ts +1 -1
  77. package/dist/internal/engine/operations/runtime-audit-log.d.ts +3 -3
  78. package/dist/internal/engine/operations/runtime-audit-log.js +2 -2
  79. package/dist/internal/engine/provider/provider-registration.d.ts +4 -4
  80. package/dist/internal/engine/provider/provider-row-renderer.d.ts +1 -1
  81. package/dist/internal/engine/reflection/reflection-command-hooks.d.ts +1 -1
  82. package/dist/internal/engine/reflection/reflection-command-hooks.js +1 -1
  83. package/dist/internal/engine/reflection/reflection-deps.d.ts +1 -1
  84. package/dist/internal/engine/reflection/reflection-embedded-generator.d.ts +1 -1
  85. package/dist/internal/engine/reflection/reflection-embedded-generator.js +1 -1
  86. package/dist/internal/engine/reflection/reflection-injection-hooks.d.ts +1 -1
  87. package/dist/internal/engine/reflection/reflection-injection-hooks.js +1 -1
  88. package/dist/internal/engine/reflection/reflection-lifecycle-hooks.d.ts +1 -1
  89. package/dist/internal/engine/reflection/reflection-lifecycle-hooks.js +1 -1
  90. package/dist/internal/engine/reflection/strategy-hook-runner.d.ts +3 -3
  91. package/dist/internal/engine/reflection/strategy-hook-runner.js +2 -2
  92. package/dist/internal/engine/rem/classifier.d.ts +1 -1
  93. package/dist/internal/engine/rem/index.d.ts +2 -2
  94. package/dist/internal/engine/rem/index.js +9 -7
  95. package/dist/internal/engine/retrieval/access-tracker.d.ts +1 -1
  96. package/dist/internal/engine/retrieval/retriever.d.ts +1 -1
  97. package/dist/internal/engine/security/memory-scope-policy.js +1 -1
  98. package/dist/internal/engine/security/scopes.js +2 -2
  99. package/dist/internal/engine/shared/memory-kind-policy.d.ts +1 -1
  100. package/dist/internal/engine/shared/paths.d.ts +2 -2
  101. package/dist/internal/engine/shared/types.d.ts +2 -2
  102. package/dist/internal/engine/shared/types.js +1 -1
  103. package/dist/internal/engine/shared/utils.d.ts +1 -1
  104. package/dist/internal/engine/shared/utils.js +2 -3
  105. package/dist/internal/engine/telemetry/memory-telemetry-api.js +2 -2
  106. package/dist/internal/engine/telemetry/observe-ledger.d.ts +1 -1
  107. package/dist/internal/engine/telemetry/observe-ledger.js +46 -19
  108. package/dist/internal/model/llm-client.d.ts +2 -2
  109. package/dist/internal/model/llm-client.js +1 -1
  110. package/dist/internal/model/llm-mode-routing.d.ts +1 -1
  111. package/dist/internal/model/llm-mode-routing.js +1 -1
  112. package/dist/internal/store/atomic-memory-cutover-sql.js +1 -1
  113. package/dist/internal/store/connection.js +1 -1
  114. package/dist/internal/store/maintenance.d.ts +2 -2
  115. package/dist/internal/store/maintenance.js +443 -39
  116. package/dist/internal/store/memory-kinds-cutover-migrator.js +1 -1
  117. package/dist/internal/store/migrations.js +1 -1
  118. package/dist/internal/store/store.d.ts +2 -2
  119. package/dist/internal/store/store.js +1 -1
  120. package/dist/{llm-client-RqmOEQkg.d.ts → llm-client-BTaUVmDe.d.ts} +1 -1
  121. package/dist/{llm-client-fVrzPcyz.js → llm-client-ConEyQEs.js} +51 -12
  122. package/dist/{log-site-catalog.generated-By86ZBRB.js → log-site-catalog.generated-C9RmyAA0.js} +219 -184
  123. package/dist/log-site-catalog.json +1 -1
  124. package/dist/{memory-kind-policy-BOGb8thm.d.ts → memory-kind-policy-ClQEXeOL.d.ts} +1 -1
  125. package/dist/{memory-metadata-codec-DcSqjbWR.d.ts → memory-metadata-codec-wVAuoKrG.d.ts} +1 -1
  126. package/dist/{memory-runtime-CbuNkL0G.js → memory-runtime-HibOMCFa.js} +474 -289
  127. package/dist/{memory-scope-policy-DICSCURA.js → memory-scope-policy--TiLZnrE.js} +2 -2
  128. package/dist/{memory-snapshot-C5BnJ2rO.d.ts → memory-snapshot-uTdxJnIh.d.ts} +2 -2
  129. package/dist/{memory-store-base-z593oJ4h.d.ts → memory-store-base-Bk2dOKED.d.ts} +5 -6
  130. package/dist/{memory-store-shared-DqpWJXZZ.js → memory-store-shared-CURizQIy.js} +1 -1
  131. package/dist/{memory-telemetry-receipts-YsxbwOAf.js → memory-telemetry-receipts-cjIQGwdp.js} +5 -1
  132. package/dist/{memory-temporality-classifier-SzlUCgTj.d.ts → memory-temporality-classifier-CcxfHYoT.d.ts} +1 -1
  133. package/dist/{memory-temporality-classifier-CeSOL2vq.js → memory-temporality-classifier-MBJyJdvB.js} +2 -2
  134. package/dist/{memory-tier-promoter-Z7jprFB7.d.ts → memory-tier-promoter-MkZPQ8u1.d.ts} +1 -1
  135. package/dist/memory-tool-dependencies--SrMdT3P.d.ts +14 -0
  136. package/dist/{memory-tool-dependencies-CnaGABQG.js → memory-tool-dependencies-DUMY8SwB.js} +3 -3
  137. package/dist/{model-call-table-BZJQkbKX.js → model-call-table-BE97f37s.js} +6 -1
  138. package/dist/{observable-embedder-DjhGxHx2.d.ts → observable-embedder-CGr3Zejf.d.ts} +1 -1
  139. package/dist/{observable-llm-client-CLJLMmwA.d.ts → observable-llm-client-CXUA7Gi3.d.ts} +3 -3
  140. package/dist/{observable-memory-store-B48HV2NK.d.ts → observable-memory-store-BwwKcUzf.d.ts} +4 -4
  141. package/dist/{observable-retriever-CAdHncKh.d.ts → observable-retriever-BZpdv93Y.d.ts} +5 -5
  142. package/dist/paths-DmmPxD_v.d.ts +1 -0
  143. package/dist/{plugin-config-schema-VBSPGEG3.d.ts → plugin-config-schema-BrhMvnXJ.d.ts} +3 -1
  144. package/dist/{plugin-config-schema-hIfZTELX.js → plugin-config-schema-Di-uKTP0.js} +1 -1
  145. package/dist/{profile-CQNCtVIu.d.ts → profile-CF5oDjR7.d.ts} +1 -1
  146. package/dist/{profile-section-writer-joJEIYhF.js → profile-section-writer-CmNa95uN.js} +3 -3
  147. package/dist/{reflection-command-hooks-Cl0ShtbF.d.ts → reflection-command-hooks-CM2mWb69.d.ts} +4 -4
  148. package/dist/{reflection-command-hooks-CG8n1GNK.js → reflection-command-hooks-CnTj8cKL.js} +3 -3
  149. package/dist/{reflection-deps-B0_cPBZt.d.ts → reflection-deps-B5I0nYZS.d.ts} +2 -2
  150. package/dist/{reflection-embedded-generator-C5kA0T0v.d.ts → reflection-embedded-generator-CogQIBcG.d.ts} +3 -3
  151. package/dist/{reflection-embedded-generator-D342_5o_.js → reflection-embedded-generator-DR525Moy.js} +1 -1
  152. package/dist/{reflection-injection-hooks-CtgcjLGx.d.ts → reflection-injection-hooks-BnbfZqpj.d.ts} +4 -4
  153. package/dist/{reflection-lifecycle-hooks-Pd7P9wya.d.ts → reflection-lifecycle-hooks-DMDhtidj.d.ts} +3 -3
  154. package/dist/{rem-batch-executor-ryxxkzQp.js → rem-batch-executor-8x4FBLtW.js} +1 -1
  155. package/dist/{rem-trigger-Dz_Jrr9p.js → rem-trigger-DmRERTNH.js} +1664 -1008
  156. package/dist/{retriever-DQdyGlkr.d.ts → retriever-BpxV-0fB.d.ts} +8 -8
  157. package/dist/{runtime-audit-log-BCeujlEp.js → runtime-audit-log-DK6xAYxh.js} +103 -2
  158. package/dist/{runtime-audit-log-Bn3JLBPj.d.ts → runtime-audit-log-DdhLlTxi.d.ts} +4 -2
  159. package/dist/{scopes-CSOn6zdd.js → scopes-a4Kly9n7.js} +1 -1
  160. package/dist/{server-DFLEPkQA.js → server-CCduS_Ea.js} +17 -320
  161. package/dist/sidecar/main.js +11 -4
  162. package/dist/sno-station-mem-runtime-dependencies-AdFFr3bU.d.ts +31 -0
  163. package/dist/{sno-station-mem-runtime-dependencies-CY-XDHxU.js → sno-station-mem-runtime-dependencies-CexFtaY6.js} +8 -8
  164. package/dist/{store-DKndKig1.d.ts → store-BDIAl2cc.d.ts} +1 -1
  165. package/dist/{store-CUk-jEGA.js → store-BQxkgJTX.js} +31 -23
  166. package/dist/{strategy-hook-runner-BSk_o6Yt.d.ts → strategy-hook-runner-DT9emgCZ.d.ts} +7 -7
  167. package/dist/{strategy-hook-runner-CWApiUZW.js → strategy-hook-runner-SvyyGBXw.js} +1 -1
  168. package/dist/{types-Del9J7UB.d.ts → types-Ae3a8562.d.ts} +1 -1
  169. package/dist/{utils-Ctb9aevJ.d.ts → utils-CDw2ttQf.d.ts} +2 -3
  170. package/package.json +2 -2
  171. package/settings.default.json +4 -4
  172. package/dist/memory-tool-dependencies-CJNppsKh.d.ts +0 -14
  173. package/dist/paths-D3dEsoE4.d.ts +0 -1
  174. package/dist/sno-station-mem-runtime-dependencies-8CRIkARK.d.ts +0 -31
  175. package/dist/{unplaced-candidate-migration-CbQHzcEM.js → unplaced-candidate-migration-BCcdQkcx.js} +1 -1
@@ -1,6 +1,6 @@
1
1
  import { ct as FIXED_PROTOCOL_VALUE_69, d as FIXED_EXTERNAL_VALUE_8, f as FIXED_EXTERNAL_VALUE_9 } from "./signed-registry-constants-yq3DlG3B.js";
2
2
  import { i as memoryOperationSignal, r as memoryOperationId, t as checkMemoryOperation } from "./operation-cancellation-CTKWwNHk.js";
3
- import { t as MODEL_CALLS } from "./model-call-table-BZJQkbKX.js";
3
+ import { t as MODEL_CALLS } from "./model-call-table-BE97f37s.js";
4
4
  import { classifyLlmFailure, isCredentialFailure, isTransientLlmStatus } from "./internal/model/llm-failure.js";
5
5
  import { a as repairCommonJson, i as previewText, n as readModelReplyJson, r as extractJsonFromResponse } from "./model-reply-text-CKopStP2.js";
6
6
  import { resolveLlmRoute } from "./internal/model/llm-mode-routing.js";
@@ -165,7 +165,10 @@ function materializeBundledLlmixEndpoint(input) {
165
165
  if (!path) throw new Error(`sno-station-mem llm-client: signed endpoint path missing from preset ${input.preset.preset}`);
166
166
  return {
167
167
  url: new URL(path, resolveEndpointBase(input.baseSource, input.preset.provider !== "sno-gpu")).toString(),
168
- preset: input.preset
168
+ preset: input.preset.provider === "sno-gpu" && path === "/extract/profile/v1/completions" ? {
169
+ ...input.preset,
170
+ model: "b-profile"
171
+ } : input.preset
169
172
  };
170
173
  }
171
174
  async function resolveConfiguredBundledLlmixEndpoint(input) {
@@ -782,6 +785,7 @@ function normalizeMemoryLlmRequest(value) {
782
785
  const emptyReplyAttempts = raw.emptyReplyAttempts;
783
786
  if (emptyReplyAttempts !== void 0 && (!Number.isInteger(emptyReplyAttempts) || Number(emptyReplyAttempts) < 1 || Number(emptyReplyAttempts) > EMPTY_REPLY_ATTEMPTS)) throw new Error(`sno-station-mem llm-client: emptyReplyAttempts must be an integer from 1 to ${EMPTY_REPLY_ATTEMPTS}`);
784
787
  const enableThinking = raw.enableThinking;
788
+ const takeProviderAttempt = raw.takeProviderAttempt;
785
789
  if (enableThinking !== void 0 && typeof enableThinking !== "boolean") throw new Error("sno-station-mem llm-client: enableThinking must be a boolean");
786
790
  const signal = raw.signal;
787
791
  if (signal !== void 0 && !hasAbortSignalShape(signal)) throw new Error("sno-station-mem llm-client: signal must be an AbortSignal");
@@ -795,6 +799,7 @@ function normalizeMemoryLlmRequest(value) {
795
799
  ...maxTokens !== void 0 ? { maxTokens: Number(maxTokens) } : {},
796
800
  ...emptyReplyAttempts !== void 0 ? { emptyReplyAttempts: Number(emptyReplyAttempts) } : {},
797
801
  ...enableThinking !== void 0 ? { enableThinking } : {},
802
+ ...typeof takeProviderAttempt === "function" ? { takeProviderAttempt: () => takeProviderAttempt() === true } : {},
798
803
  ...requestId !== void 0 ? { requestId } : {},
799
804
  ...typeof raw.promptTemplateHash === "string" && /^[a-f0-9]{64}$/.test(raw.promptTemplateHash) ? { promptTemplateHash: raw.promptTemplateHash } : {},
800
805
  ...typeof raw.extractionSkillHash === "string" && /^[a-f0-9]{64}$/.test(raw.extractionSkillHash) ? { extractionSkillHash: raw.extractionSkillHash } : {},
@@ -802,7 +807,9 @@ function normalizeMemoryLlmRequest(value) {
802
807
  };
803
808
  }
804
809
  function textSystemContent(request) {
805
- return MODEL_CALLS[request.callId].occasion === "conflictAdjudication" ? CONFLICT_ADJUDICATION_SYSTEM_CONTENT : REFLECTION_TEXT_SYSTEM_CONTENT;
810
+ const occasion = MODEL_CALLS[request.callId].occasion;
811
+ if (occasion === "conflictAdjudication") return CONFLICT_ADJUDICATION_SYSTEM_CONTENT;
812
+ return occasion === "memoryExtract" ? JSON_SYSTEM_CONTENT : REFLECTION_TEXT_SYSTEM_CONTENT;
806
813
  }
807
814
  /** Creates the LLM client facade with provider routing, key rotation, and JSON parsing. */
808
815
  function createLlmClient(config) {
@@ -832,8 +839,29 @@ function createLlmClient(config) {
832
839
  }
833
840
  return endpointPromise;
834
841
  };
842
+ const providerBudget = new AsyncLocalStorage();
835
843
  const pipeline = new CallPipeline({
836
- dispatch: callProvider,
844
+ dispatch: async (context) => {
845
+ const budget = providerBudget.getStore();
846
+ if (!budget) return callProvider(context);
847
+ const timeoutMs = Math.floor(budget.deadlineMs - performance.now());
848
+ if (timeoutMs <= 0) throw Object.assign(/* @__PURE__ */ new Error("Request deadline exhausted before provider dispatch"), { statusCode: 499 });
849
+ if (budget.remaining <= 0 || budget.takeProviderAttempt && !budget.takeProviderAttempt()) throw Object.assign(/* @__PURE__ */ new Error("Provider request attempts exhausted"), { statusCode: 499 });
850
+ budget.remaining -= 1;
851
+ const providerConfig = context.config;
852
+ const dispatchConfig = {
853
+ ...providerConfig,
854
+ timeoutMs,
855
+ ...providerConfig.rawCompletion ? { rawCompletion: {
856
+ ...providerConfig.rawCompletion,
857
+ timeoutMs
858
+ } } : {}
859
+ };
860
+ return callProvider({
861
+ ...context,
862
+ config: dispatchConfig
863
+ });
864
+ },
837
865
  maxRetries: 2,
838
866
  retryBaseMs: 100,
839
867
  retryMaxDelayMs: 500,
@@ -905,6 +933,7 @@ function createLlmClient(config) {
905
933
  if (transport === "agent-host-seam") {
906
934
  const agentPort = config.agentPort;
907
935
  if (!agentPort) throw new LlmClientTerminalError("transport", `sno-station-mem: llm-client [${request.callId}] AgentLlmPort is unavailable`);
936
+ if (request.takeProviderAttempt && !request.takeProviderAttempt()) return null;
908
937
  config.onTransportAttempt?.({
909
938
  callId: request.callId,
910
939
  destination,
@@ -1147,13 +1176,18 @@ function createLlmClient(config) {
1147
1176
  * result is returned untouched — it means no call was made, not that the model said nothing.
1148
1177
  */
1149
1178
  const requestContentRetryingEmpty = async (state, request, systemContent, deadlineMs, prompt = request.prompt) => {
1150
- let content = await requestContent(state, request, systemContent, prompt);
1179
+ const budget = {
1180
+ remaining: EMPTY_REPLY_ATTEMPTS,
1181
+ deadlineMs,
1182
+ takeProviderAttempt: request.takeProviderAttempt
1183
+ };
1184
+ let content = await providerBudget.run(budget, () => requestContent(state, request, systemContent, prompt));
1151
1185
  let usage = state.usage;
1152
1186
  try {
1153
1187
  checkMemoryOperation();
1154
1188
  const attemptLimit = request.emptyReplyAttempts ?? EMPTY_REPLY_ATTEMPTS;
1155
1189
  for (let attempt = 2; attempt <= attemptLimit; attempt += 1) {
1156
- if (content === null || content.raw.trim().length > 0) break;
1190
+ if (content === null || content.raw.trim().length > 0 || budget.remaining <= 0) break;
1157
1191
  const remainingMs = deadlineMs - performance.now();
1158
1192
  if (remainingMs <= 0) break;
1159
1193
  log.debug("Retrying empty model reply", {
@@ -1167,10 +1201,10 @@ function createLlmClient(config) {
1167
1201
  function: "requestContentRetryingEmpty",
1168
1202
  site_id: "shared.llm-client.requestContentRetryingEmpty.cd874fefff"
1169
1203
  });
1170
- content = await requestContent(state, {
1204
+ content = await providerBudget.run(budget, () => requestContent(state, {
1171
1205
  ...request,
1172
1206
  timeoutMs: remainingMs
1173
- }, systemContent, prompt);
1207
+ }, systemContent, prompt));
1174
1208
  usage = addUsage(usage, state.usage);
1175
1209
  checkMemoryOperation();
1176
1210
  }
@@ -1195,6 +1229,7 @@ function createLlmClient(config) {
1195
1229
  if (snoError !== void 0) throw snoError;
1196
1230
  return content;
1197
1231
  }
1232
+ const remainingMs = Math.floor(deadlineMs - performance.now());
1198
1233
  const originalLastError = state.error;
1199
1234
  const originalLastUsage = state.usage;
1200
1235
  const source = snoError instanceof Error ? snoError.message : originalLastError ?? "";
@@ -1206,21 +1241,25 @@ function createLlmClient(config) {
1206
1241
  else if (!config.apiKey?.trim()) snoFailure = "missing_key";
1207
1242
  const operationId = config.operationId ?? memoryOperationId();
1208
1243
  let hostFailure = "empty_reply";
1209
- if (!config.agentPort) hostFailure = "port_unavailable";
1244
+ if (remainingMs <= 0) hostFailure = "deadline_exhausted";
1245
+ else if (!config.agentPort) hostFailure = "port_unavailable";
1210
1246
  else if ([
1211
1247
  "E10",
1212
1248
  "P1",
1213
1249
  "REM1"
1214
1250
  ].includes(request.callId) && !request.hostPrompt) hostFailure = "host_prompt_missing";
1215
1251
  else try {
1216
- const host = await requestContent(state, request, systemContent, request.hostPrompt ?? request.prompt, "host");
1252
+ const host = await requestContent(state, {
1253
+ ...request,
1254
+ timeoutMs: remainingMs
1255
+ }, systemContent, request.hostPrompt ?? request.prompt, "host");
1217
1256
  if (host?.raw.trim()) {
1218
1257
  log.info("Sno model call answered by host", {
1219
1258
  call_id: request.callId,
1220
1259
  operation_id: operationId,
1221
1260
  sno_failure: snoFailure,
1222
1261
  host_outcome: "answered",
1223
- timeout_ms: resolveRequestTimeoutMs(request)
1262
+ timeout_ms: remainingMs
1224
1263
  }, {
1225
1264
  event_name: "memory.llm_client.fallback",
1226
1265
  file: "packages/memory/src/model/llm-client.ts",
@@ -1232,7 +1271,7 @@ function createLlmClient(config) {
1232
1271
  }
1233
1272
  if (host === null) hostFailure = "host_error";
1234
1273
  } catch (error) {
1235
- if (request.signal?.aborted) throw error;
1274
+ if (request.signal?.aborted || error instanceof ModelCallRefusedError) throw error;
1236
1275
  hostFailure = error instanceof LlmClientTerminalError ? error.category : "transport";
1237
1276
  }
1238
1277
  state.error = originalLastError;