@remnic/core 10.0.39 → 10.0.41

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 (199) hide show
  1. package/dist/access-admin-ops-surface.js +14 -14
  2. package/dist/access-authorization-probe.js +15 -15
  3. package/dist/access-boundary.js +14 -14
  4. package/dist/access-cli.js +53 -53
  5. package/dist/access-extraction-force-flush.js +14 -14
  6. package/dist/access-http-briefing.js +15 -15
  7. package/dist/access-http-query.js +16 -16
  8. package/dist/access-http.js +30 -30
  9. package/dist/access-identity-continuity-surface.js +14 -14
  10. package/dist/access-lcm-surface.js +14 -14
  11. package/dist/access-mcp.js +23 -23
  12. package/dist/access-namespace-preflight.js +14 -14
  13. package/dist/access-observe-write-surface.js +14 -14
  14. package/dist/access-operations-batch.js +15 -15
  15. package/dist/access-operations.js +22 -22
  16. package/dist/access-recall-concurrency.js +14 -14
  17. package/dist/access-recall-response.js +14 -14
  18. package/dist/access-recall-surface.js +14 -14
  19. package/dist/access-service.d.ts +2 -2
  20. package/dist/access-service.d.ts.map +1 -1
  21. package/dist/access-service.js +14 -14
  22. package/dist/access-surface-catalog.js +16 -16
  23. package/dist/active-recall.js +2 -2
  24. package/dist/briefing.js +3 -3
  25. package/dist/causal-consolidation.js +4 -4
  26. package/dist/{chunk-M7KGIW5F.js → chunk-4KS4IHKH.js} +2 -2
  27. package/dist/{chunk-JORSMFL6.js → chunk-574N53FL.js} +5 -5
  28. package/dist/{chunk-BUKZ7MTN.js → chunk-5TRU6QQC.js} +2 -2
  29. package/dist/{chunk-SRPGA6WN.js → chunk-7BCYAJKP.js} +2 -2
  30. package/dist/{chunk-MD3W2H3G.js → chunk-7G4O5EQT.js} +31 -31
  31. package/dist/{chunk-MD3W2H3G.js.map → chunk-7G4O5EQT.js.map} +1 -1
  32. package/dist/{chunk-F2IU6A2L.js → chunk-7XGWW3LQ.js} +16 -16
  33. package/dist/{chunk-ZXFKG7VZ.js → chunk-AOBDA3VC.js} +2 -2
  34. package/dist/{chunk-JRTKYFFY.js → chunk-AY6LO7GD.js} +2 -2
  35. package/dist/{chunk-5KZNWERU.js → chunk-BIYVUPC6.js} +19 -3
  36. package/dist/{chunk-5KZNWERU.js.map → chunk-BIYVUPC6.js.map} +1 -1
  37. package/dist/{chunk-V2XMG7GM.js → chunk-CHNZPOWX.js} +3 -2
  38. package/dist/{chunk-V2XMG7GM.js.map → chunk-CHNZPOWX.js.map} +1 -1
  39. package/dist/{chunk-GPVGAHXL.js → chunk-CNAL35D5.js} +2 -2
  40. package/dist/{chunk-NJ2DZYEK.js → chunk-DBM2NQBG.js} +2 -2
  41. package/dist/{chunk-U66CTIF5.js → chunk-F2RDRE7M.js} +2 -2
  42. package/dist/{chunk-VIS23B6O.js → chunk-F7MP76CB.js} +15 -13
  43. package/dist/chunk-F7MP76CB.js.map +1 -0
  44. package/dist/{chunk-B7VKRCAG.js → chunk-FNEYSTB6.js} +2 -2
  45. package/dist/{chunk-GSBSGT43.js → chunk-FPHU6KVI.js} +2 -2
  46. package/dist/{chunk-RO2NNWR5.js → chunk-GAUS4XGN.js} +3 -3
  47. package/dist/{chunk-4UT2NUAC.js → chunk-GCDIHTWF.js} +2 -2
  48. package/dist/{chunk-4HJ2QK32.js → chunk-GDOI4U4D.js} +2 -2
  49. package/dist/{chunk-VCOCOBUS.js → chunk-GZMHBRIR.js} +3 -3
  50. package/dist/{chunk-LJXBFVI2.js → chunk-ICTJOOWZ.js} +2 -2
  51. package/dist/{chunk-6Z2ZWBOV.js → chunk-IWDFHVPJ.js} +2 -2
  52. package/dist/{chunk-TTQYX7VU.js → chunk-J3FPMHQG.js} +2 -2
  53. package/dist/{chunk-GCW7UT5I.js → chunk-JJSMSS45.js} +2 -2
  54. package/dist/{chunk-O2O4FDAH.js → chunk-JXQTECMU.js} +2 -2
  55. package/dist/{chunk-ANV373S5.js → chunk-KYYN2FK4.js} +2 -2
  56. package/dist/{chunk-PJRKLB4Z.js → chunk-L5PM7B3I.js} +16 -2
  57. package/dist/{chunk-PJRKLB4Z.js.map → chunk-L5PM7B3I.js.map} +1 -1
  58. package/dist/{chunk-5TJEOU6Y.js → chunk-LKRXGOQW.js} +18 -8
  59. package/dist/{chunk-5TJEOU6Y.js.map → chunk-LKRXGOQW.js.map} +1 -1
  60. package/dist/{chunk-B3I2QQU7.js → chunk-LWIU5BMA.js} +3 -3
  61. package/dist/{chunk-WQYS47G4.js → chunk-N3PUGD7E.js} +2 -2
  62. package/dist/{chunk-EKR6OO4P.js → chunk-NTD3VWJ2.js} +2 -2
  63. package/dist/{chunk-JQCP5QW3.js → chunk-O67H7OXJ.js} +2 -2
  64. package/dist/{chunk-4LLV2N3R.js → chunk-ONIVKGNC.js} +2 -2
  65. package/dist/{chunk-GLB6VV3J.js → chunk-OUYYEPXD.js} +3 -3
  66. package/dist/{chunk-RWW5KPIY.js → chunk-PCZZMMBL.js} +12 -12
  67. package/dist/chunk-PCZZMMBL.js.map +1 -0
  68. package/dist/{chunk-WT2VVYBM.js → chunk-PJXSBXEC.js} +2 -2
  69. package/dist/{chunk-P3YUEPSQ.js → chunk-PUMP554C.js} +2 -2
  70. package/dist/{chunk-SJHFU52W.js → chunk-Q47WGGKI.js} +5 -5
  71. package/dist/chunk-Q47WGGKI.js.map +1 -0
  72. package/dist/{chunk-RIAKNXZB.js → chunk-Q77SLBWT.js} +3 -3
  73. package/dist/{chunk-22YJQTPN.js → chunk-QGNZ5QPV.js} +2 -2
  74. package/dist/{chunk-GE5ZNDLE.js → chunk-R42VUN5V.js} +3 -3
  75. package/dist/{chunk-7IANFJ24.js → chunk-RWMLDC2F.js} +17 -17
  76. package/dist/chunk-RWMLDC2F.js.map +1 -0
  77. package/dist/{chunk-LPD6I2U6.js → chunk-SLVR3U4E.js} +2 -2
  78. package/dist/{chunk-IAOW2L6K.js → chunk-TNTYAH7T.js} +2 -2
  79. package/dist/{chunk-CR72WZ3M.js → chunk-UBGFPD62.js} +4 -4
  80. package/dist/{chunk-CR72WZ3M.js.map → chunk-UBGFPD62.js.map} +1 -1
  81. package/dist/{chunk-JZFJZLJY.js → chunk-UGV256H3.js} +2 -2
  82. package/dist/{chunk-L74NWAD4.js → chunk-UKIIAEJF.js} +2 -2
  83. package/dist/{chunk-5Q6CR65T.js → chunk-VTZSIG6O.js} +2 -2
  84. package/dist/{chunk-IZRNMXZC.js → chunk-WCUYCTTG.js} +2 -2
  85. package/dist/{chunk-JT3IXJIL.js → chunk-XBHUMPIQ.js} +7 -7
  86. package/dist/{chunk-JM6U3SAE.js → chunk-XJ77IOAD.js} +2 -2
  87. package/dist/{chunk-ODJ2HRFW.js → chunk-XXBCUIYQ.js} +7 -7
  88. package/dist/{chunk-JOOGPZJE.js → chunk-XXW3P3RX.js} +2 -2
  89. package/dist/cli.js +40 -40
  90. package/dist/coding/export-okf-codegraph.js +2 -2
  91. package/dist/compounding/engine.js +4 -4
  92. package/dist/config.js +2 -2
  93. package/dist/connectors/codex-materialize-runner.js +3 -3
  94. package/dist/connectors/index.js +4 -4
  95. package/dist/convergence-refresh.js +5 -5
  96. package/dist/corpus-watermark.js +5 -5
  97. package/dist/entity-retrieval.js +3 -3
  98. package/dist/external-wiki-access.js +15 -15
  99. package/dist/extraction-error-classification.d.ts +15 -0
  100. package/dist/extraction-error-classification.d.ts.map +1 -1
  101. package/dist/extraction-error-classification.js +7 -3
  102. package/dist/extraction.js +8 -8
  103. package/dist/harmonic-retrieval.js +3 -3
  104. package/dist/index.js +53 -53
  105. package/dist/location/index.js +5 -5
  106. package/dist/maintenance/memory-governance.js +3 -3
  107. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  108. package/dist/maintenance/rebuild-memory-projection-runner.js +5 -5
  109. package/dist/maintenance/rebuild-memory-projection.js +4 -4
  110. package/dist/memory-browse-operations.js +15 -15
  111. package/dist/namespaces/migrate.js +4 -4
  112. package/dist/namespaces/search.d.ts +1 -0
  113. package/dist/namespaces/search.d.ts.map +1 -1
  114. package/dist/namespaces/search.js +5 -3
  115. package/dist/namespaces/storage.js +3 -3
  116. package/dist/operator-doctor-corpus.js +6 -6
  117. package/dist/operator-toolkit.js +11 -11
  118. package/dist/orchestration/maintenance.js +13 -13
  119. package/dist/orchestration/qmd-result-resolver.d.ts +5 -0
  120. package/dist/orchestration/qmd-result-resolver.d.ts.map +1 -1
  121. package/dist/orchestration/recall-search-pipeline.d.ts.map +1 -1
  122. package/dist/orchestrator.js +53 -53
  123. package/dist/recall-navigation-operations.js +15 -15
  124. package/dist/recall-navigation.js +14 -14
  125. package/dist/resume-bundles.js +2 -2
  126. package/dist/runtime/daemon-health.d.ts.map +1 -1
  127. package/dist/semantic-consolidation.js +4 -4
  128. package/dist/semantic-rule-promotion.js +3 -3
  129. package/dist/semantic-rule-verifier.js +3 -3
  130. package/dist/source-agent-qualifier.js +6 -6
  131. package/dist/standup/build.js +3 -3
  132. package/dist/storage.js +2 -2
  133. package/dist/support-passport/index.js +17 -17
  134. package/dist/transfer/export-okf.js +3 -3
  135. package/dist/verified-recall.js +3 -3
  136. package/dist/who-knows-cli.js +4 -4
  137. package/dist/who-knows.js +3 -3
  138. package/package.json +3 -3
  139. package/src/access-entity-principal.test.ts +190 -0
  140. package/src/access-http.ts +2 -2
  141. package/src/access-operations-batch.ts +2 -2
  142. package/src/access-service.ts +7 -6
  143. package/src/chat/chat-executor.ts +1 -1
  144. package/src/extraction-error-classification.ts +23 -0
  145. package/src/extraction-local-failure-class.test.ts +55 -0
  146. package/src/extraction.ts +9 -9
  147. package/src/namespaces/search.ts +1 -1
  148. package/src/orchestration/extraction-run.test.ts +83 -2
  149. package/src/orchestration/qmd-result-resolver.ts +26 -1
  150. package/src/orchestration/recall-search-pipeline.ts +11 -12
  151. package/src/runtime/daemon-health.test.ts +85 -0
  152. package/src/runtime/daemon-health.ts +20 -7
  153. package/dist/chunk-7IANFJ24.js.map +0 -1
  154. package/dist/chunk-RWW5KPIY.js.map +0 -1
  155. package/dist/chunk-SJHFU52W.js.map +0 -1
  156. package/dist/chunk-VIS23B6O.js.map +0 -1
  157. /package/dist/{chunk-M7KGIW5F.js.map → chunk-4KS4IHKH.js.map} +0 -0
  158. /package/dist/{chunk-JORSMFL6.js.map → chunk-574N53FL.js.map} +0 -0
  159. /package/dist/{chunk-BUKZ7MTN.js.map → chunk-5TRU6QQC.js.map} +0 -0
  160. /package/dist/{chunk-SRPGA6WN.js.map → chunk-7BCYAJKP.js.map} +0 -0
  161. /package/dist/{chunk-F2IU6A2L.js.map → chunk-7XGWW3LQ.js.map} +0 -0
  162. /package/dist/{chunk-ZXFKG7VZ.js.map → chunk-AOBDA3VC.js.map} +0 -0
  163. /package/dist/{chunk-JRTKYFFY.js.map → chunk-AY6LO7GD.js.map} +0 -0
  164. /package/dist/{chunk-GPVGAHXL.js.map → chunk-CNAL35D5.js.map} +0 -0
  165. /package/dist/{chunk-NJ2DZYEK.js.map → chunk-DBM2NQBG.js.map} +0 -0
  166. /package/dist/{chunk-U66CTIF5.js.map → chunk-F2RDRE7M.js.map} +0 -0
  167. /package/dist/{chunk-B7VKRCAG.js.map → chunk-FNEYSTB6.js.map} +0 -0
  168. /package/dist/{chunk-GSBSGT43.js.map → chunk-FPHU6KVI.js.map} +0 -0
  169. /package/dist/{chunk-RO2NNWR5.js.map → chunk-GAUS4XGN.js.map} +0 -0
  170. /package/dist/{chunk-4UT2NUAC.js.map → chunk-GCDIHTWF.js.map} +0 -0
  171. /package/dist/{chunk-4HJ2QK32.js.map → chunk-GDOI4U4D.js.map} +0 -0
  172. /package/dist/{chunk-VCOCOBUS.js.map → chunk-GZMHBRIR.js.map} +0 -0
  173. /package/dist/{chunk-LJXBFVI2.js.map → chunk-ICTJOOWZ.js.map} +0 -0
  174. /package/dist/{chunk-6Z2ZWBOV.js.map → chunk-IWDFHVPJ.js.map} +0 -0
  175. /package/dist/{chunk-TTQYX7VU.js.map → chunk-J3FPMHQG.js.map} +0 -0
  176. /package/dist/{chunk-GCW7UT5I.js.map → chunk-JJSMSS45.js.map} +0 -0
  177. /package/dist/{chunk-O2O4FDAH.js.map → chunk-JXQTECMU.js.map} +0 -0
  178. /package/dist/{chunk-ANV373S5.js.map → chunk-KYYN2FK4.js.map} +0 -0
  179. /package/dist/{chunk-B3I2QQU7.js.map → chunk-LWIU5BMA.js.map} +0 -0
  180. /package/dist/{chunk-WQYS47G4.js.map → chunk-N3PUGD7E.js.map} +0 -0
  181. /package/dist/{chunk-EKR6OO4P.js.map → chunk-NTD3VWJ2.js.map} +0 -0
  182. /package/dist/{chunk-JQCP5QW3.js.map → chunk-O67H7OXJ.js.map} +0 -0
  183. /package/dist/{chunk-4LLV2N3R.js.map → chunk-ONIVKGNC.js.map} +0 -0
  184. /package/dist/{chunk-GLB6VV3J.js.map → chunk-OUYYEPXD.js.map} +0 -0
  185. /package/dist/{chunk-WT2VVYBM.js.map → chunk-PJXSBXEC.js.map} +0 -0
  186. /package/dist/{chunk-P3YUEPSQ.js.map → chunk-PUMP554C.js.map} +0 -0
  187. /package/dist/{chunk-RIAKNXZB.js.map → chunk-Q77SLBWT.js.map} +0 -0
  188. /package/dist/{chunk-22YJQTPN.js.map → chunk-QGNZ5QPV.js.map} +0 -0
  189. /package/dist/{chunk-GE5ZNDLE.js.map → chunk-R42VUN5V.js.map} +0 -0
  190. /package/dist/{chunk-LPD6I2U6.js.map → chunk-SLVR3U4E.js.map} +0 -0
  191. /package/dist/{chunk-IAOW2L6K.js.map → chunk-TNTYAH7T.js.map} +0 -0
  192. /package/dist/{chunk-JZFJZLJY.js.map → chunk-UGV256H3.js.map} +0 -0
  193. /package/dist/{chunk-L74NWAD4.js.map → chunk-UKIIAEJF.js.map} +0 -0
  194. /package/dist/{chunk-5Q6CR65T.js.map → chunk-VTZSIG6O.js.map} +0 -0
  195. /package/dist/{chunk-IZRNMXZC.js.map → chunk-WCUYCTTG.js.map} +0 -0
  196. /package/dist/{chunk-JT3IXJIL.js.map → chunk-XBHUMPIQ.js.map} +0 -0
  197. /package/dist/{chunk-JM6U3SAE.js.map → chunk-XJ77IOAD.js.map} +0 -0
  198. /package/dist/{chunk-ODJ2HRFW.js.map → chunk-XXBCUIYQ.js.map} +0 -0
  199. /package/dist/{chunk-JOOGPZJE.js.map → chunk-XXW3P3RX.js.map} +0 -0
@@ -2,7 +2,7 @@ import {
2
2
  SupportPassportError,
3
3
  SupportPassportOwnerCreateGrantRequestSchema,
4
4
  getOperation
5
- } from "./chunk-7IANFJ24.js";
5
+ } from "./chunk-RWMLDC2F.js";
6
6
 
7
7
  // src/support-passport/access-http.ts
8
8
  var OWNER_ROOT = "/engram/v1/support-passport";
@@ -137,4 +137,4 @@ export {
137
137
  SUPPORT_PASSPORT_OWNER_HTTP_ROUTES,
138
138
  handleSupportPassportOwnerHttp
139
139
  };
140
- //# sourceMappingURL=chunk-ANV373S5.js.map
140
+ //# sourceMappingURL=chunk-KYYN2FK4.js.map
@@ -46,10 +46,24 @@ function formatExtractionParseFailureLog(input) {
46
46
  `traceId=${input.traceId}`
47
47
  ].join(" ");
48
48
  }
49
+ var LocalLlmRejectedError = class extends Error {
50
+ constructor(httpStatus) {
51
+ super(httpStatus === void 0 ? "local LLM answered with unusable content" : `local LLM rejected the input (HTTP ${httpStatus})`);
52
+ this.httpStatus = httpStatus;
53
+ this.name = "LocalLlmRejectedError";
54
+ }
55
+ httpStatus;
56
+ };
57
+ function localRejectionStatus(diag) {
58
+ const status = httpStatusFromError(diag.lastError);
59
+ return status !== void 0 && [400, 413, 422].includes(status) ? status : void 0;
60
+ }
49
61
 
50
62
  export {
51
63
  classifyExtractionThrownError,
52
64
  classifyFallbackParseFailure,
53
- formatExtractionParseFailureLog
65
+ formatExtractionParseFailureLog,
66
+ LocalLlmRejectedError,
67
+ localRejectionStatus
54
68
  };
55
- //# sourceMappingURL=chunk-PJRKLB4Z.js.map
69
+ //# sourceMappingURL=chunk-L5PM7B3I.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/extraction-error-classification.ts"],"sourcesContent":["import type { ExtractionFailureClass } from \"./types.js\";\nimport { isTransientHttpError } from \"./connectors/live/transient-errors.js\";\n\n/**\n * Read a numeric HTTP status off a thrown error without re-implementing the\n * shared transient classifier. Uses `in`/typeof narrowing (no inline casts).\n */\nfunction httpStatusFromError(err: unknown): number | undefined {\n if (!err || typeof err !== \"object\") return undefined;\n if (\"status\" in err && typeof err.status === \"number\" && Number.isFinite(err.status)) return err.status;\n if (\"statusCode\" in err && typeof err.statusCode === \"number\" && Number.isFinite(err.statusCode)) {\n return err.statusCode;\n }\n return undefined;\n}\n\n/**\n * Map a thrown extraction error to a coarse failure class for the retry/breaker\n * layer. 401/403 → `auth_config` (misconfigured provider, open the breaker);\n * transient (429/5xx/network, per the shared `isTransientHttpError`) → back off;\n * anything else defaults to `provider_retryable` (fail-open toward retry, but\n * capped by the per-fingerprint attempt budget). Never throws.\n */\nexport function classifyExtractionThrownError(err: unknown): ExtractionFailureClass {\n try {\n const status = httpStatusFromError(err);\n if (status === 401 || status === 403) return \"auth_config\";\n if (isTransientHttpError(err)) return \"provider_retryable\";\n return \"provider_retryable\";\n } catch {\n return \"provider_retryable\";\n }\n}\n\n/**\n * Map the gateway fallback's discriminated parse-failure reason to a coarse\n * extraction failure class. \"no models configured\" is an auth/config problem;\n * an HTTP/transport failure backs off; an unparseable-but-present response is a\n * genuine empty-parse.\n */\nexport function classifyFallbackParseFailure(\n reason: \"no_models\" | \"empty\" | \"http_error\" | \"schema_rejection\" | \"timeout\",\n): ExtractionFailureClass {\n switch (reason) {\n case \"no_models\":\n return \"auth_config\";\n case \"http_error\":\n case \"timeout\":\n return \"provider_retryable\";\n case \"empty\":\n case \"schema_rejection\":\n return \"parse_empty\";\n }\n}\n\n/**\n * Operator-visible extraction parse-failure line. Keeps the historical\n * greppable prefix and appends the fields that used to live only at debug.\n */\nexport function formatExtractionParseFailureLog(input: {\n failureReason: string;\n attemptedModel?: string;\n httpStatus?: number;\n errorClass?: string;\n traceId: string;\n}): string {\n const modelUsed =\n typeof input.attemptedModel === \"string\" && input.attemptedModel.length > 0\n ? input.attemptedModel\n : \"unknown\";\n const errorClass =\n typeof input.errorClass === \"string\" && input.errorClass.length > 0\n ? input.errorClass\n : \"none\";\n const httpStatus =\n typeof input.httpStatus === \"number\" && Number.isFinite(input.httpStatus)\n ? String(input.httpStatus)\n : \"none\";\n return [\n \"extraction fallback returned no parsed output\",\n `failureReason=${input.failureReason}`,\n `modelUsed=${modelUsed}`,\n `errorClass=${errorClass}`,\n `httpStatus=${httpStatus}`,\n `traceId=${input.traceId}`,\n ].join(\" \");\n}\n"],"mappings":";;;;;AAOA,SAAS,oBAAoB,KAAkC;AAC7D,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,MAAI,YAAY,OAAO,OAAO,IAAI,WAAW,YAAY,OAAO,SAAS,IAAI,MAAM,EAAG,QAAO,IAAI;AACjG,MAAI,gBAAgB,OAAO,OAAO,IAAI,eAAe,YAAY,OAAO,SAAS,IAAI,UAAU,GAAG;AAChG,WAAO,IAAI;AAAA,EACb;AACA,SAAO;AACT;AASO,SAAS,8BAA8B,KAAsC;AAClF,MAAI;AACF,UAAM,SAAS,oBAAoB,GAAG;AACtC,QAAI,WAAW,OAAO,WAAW,IAAK,QAAO;AAC7C,QAAI,qBAAqB,GAAG,EAAG,QAAO;AACtC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQO,SAAS,6BACd,QACwB;AACxB,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAMO,SAAS,gCAAgC,OAMrC;AACT,QAAM,YACJ,OAAO,MAAM,mBAAmB,YAAY,MAAM,eAAe,SAAS,IACtE,MAAM,iBACN;AACN,QAAM,aACJ,OAAO,MAAM,eAAe,YAAY,MAAM,WAAW,SAAS,IAC9D,MAAM,aACN;AACN,QAAM,aACJ,OAAO,MAAM,eAAe,YAAY,OAAO,SAAS,MAAM,UAAU,IACpE,OAAO,MAAM,UAAU,IACvB;AACN,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB,MAAM,aAAa;AAAA,IACpC,aAAa,SAAS;AAAA,IACtB,cAAc,UAAU;AAAA,IACxB,cAAc,UAAU;AAAA,IACxB,WAAW,MAAM,OAAO;AAAA,EAC1B,EAAE,KAAK,GAAG;AACZ;","names":[]}
1
+ {"version":3,"sources":["../src/extraction-error-classification.ts"],"sourcesContent":["import type { ExtractionFailureClass } from \"./types.js\";\nimport { isTransientHttpError } from \"./connectors/live/transient-errors.js\";\n\n/**\n * Read a numeric HTTP status off a thrown error without re-implementing the\n * shared transient classifier. Uses `in`/typeof narrowing (no inline casts).\n */\nfunction httpStatusFromError(err: unknown): number | undefined {\n if (!err || typeof err !== \"object\") return undefined;\n if (\"status\" in err && typeof err.status === \"number\" && Number.isFinite(err.status)) return err.status;\n if (\"statusCode\" in err && typeof err.statusCode === \"number\" && Number.isFinite(err.statusCode)) {\n return err.statusCode;\n }\n return undefined;\n}\n\n/**\n * Map a thrown extraction error to a coarse failure class for the retry/breaker\n * layer. 401/403 → `auth_config` (misconfigured provider, open the breaker);\n * transient (429/5xx/network, per the shared `isTransientHttpError`) → back off;\n * anything else defaults to `provider_retryable` (fail-open toward retry, but\n * capped by the per-fingerprint attempt budget). Never throws.\n */\nexport function classifyExtractionThrownError(err: unknown): ExtractionFailureClass {\n try {\n const status = httpStatusFromError(err);\n if (status === 401 || status === 403) return \"auth_config\";\n if (isTransientHttpError(err)) return \"provider_retryable\";\n return \"provider_retryable\";\n } catch {\n return \"provider_retryable\";\n }\n}\n\n/**\n * Map the gateway fallback's discriminated parse-failure reason to a coarse\n * extraction failure class. \"no models configured\" is an auth/config problem;\n * an HTTP/transport failure backs off; an unparseable-but-present response is a\n * genuine empty-parse.\n */\nexport function classifyFallbackParseFailure(\n reason: \"no_models\" | \"empty\" | \"http_error\" | \"schema_rejection\" | \"timeout\",\n): ExtractionFailureClass {\n switch (reason) {\n case \"no_models\":\n return \"auth_config\";\n case \"http_error\":\n case \"timeout\":\n return \"provider_retryable\";\n case \"empty\":\n case \"schema_rejection\":\n return \"parse_empty\";\n }\n}\n\n/**\n * Operator-visible extraction parse-failure line. Keeps the historical\n * greppable prefix and appends the fields that used to live only at debug.\n */\nexport function formatExtractionParseFailureLog(input: {\n failureReason: string;\n attemptedModel?: string;\n httpStatus?: number;\n errorClass?: string;\n traceId: string;\n}): string {\n const modelUsed =\n typeof input.attemptedModel === \"string\" && input.attemptedModel.length > 0\n ? input.attemptedModel\n : \"unknown\";\n const errorClass =\n typeof input.errorClass === \"string\" && input.errorClass.length > 0\n ? input.errorClass\n : \"none\";\n const httpStatus =\n typeof input.httpStatus === \"number\" && Number.isFinite(input.httpStatus)\n ? String(input.httpStatus)\n : \"none\";\n return [\n \"extraction fallback returned no parsed output\",\n `failureReason=${input.failureReason}`,\n `modelUsed=${modelUsed}`,\n `errorClass=${errorClass}`,\n `httpStatus=${httpStatus}`,\n `traceId=${input.traceId}`,\n ].join(\" \");\n}\n\n/**\n * The local endpoint answered, and what it said rejects this input (unusable content, or a client error that is not\n * auth, timeout or rate limiting): the chunk's problem, not an outage. Retried like an empty parse, and a trigger-drain\n * chunk that keeps drawing it is dropped after its recovery copy is saved.\n */\nexport class LocalLlmRejectedError extends Error {\n constructor(readonly httpStatus?: number) {\n super(httpStatus === undefined ? \"local LLM answered with unusable content\" : `local LLM rejected the input (HTTP ${httpStatus})`);\n this.name = \"LocalLlmRejectedError\";\n }\n}\n\n/** What the local client recorded about a failed call (`failureDiag`). */\nexport interface LocalFailureDiag {\n lastError?: unknown;\n}\n\n/** The HTTP status when the local endpoint answered and refuses this input (400, 413, 422); else undefined. A wrong model name or route (404, 405, 410), auth, timeout and rate limiting are the setup's problem, not the chunk's. */\nexport function localRejectionStatus(diag: LocalFailureDiag): number | undefined {\n const status = httpStatusFromError(diag.lastError);\n return status !== undefined && [400, 413, 422].includes(status) ? status : undefined;\n}\n"],"mappings":";;;;;AAOA,SAAS,oBAAoB,KAAkC;AAC7D,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,MAAI,YAAY,OAAO,OAAO,IAAI,WAAW,YAAY,OAAO,SAAS,IAAI,MAAM,EAAG,QAAO,IAAI;AACjG,MAAI,gBAAgB,OAAO,OAAO,IAAI,eAAe,YAAY,OAAO,SAAS,IAAI,UAAU,GAAG;AAChG,WAAO,IAAI;AAAA,EACb;AACA,SAAO;AACT;AASO,SAAS,8BAA8B,KAAsC;AAClF,MAAI;AACF,UAAM,SAAS,oBAAoB,GAAG;AACtC,QAAI,WAAW,OAAO,WAAW,IAAK,QAAO;AAC7C,QAAI,qBAAqB,GAAG,EAAG,QAAO;AACtC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQO,SAAS,6BACd,QACwB;AACxB,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAMO,SAAS,gCAAgC,OAMrC;AACT,QAAM,YACJ,OAAO,MAAM,mBAAmB,YAAY,MAAM,eAAe,SAAS,IACtE,MAAM,iBACN;AACN,QAAM,aACJ,OAAO,MAAM,eAAe,YAAY,MAAM,WAAW,SAAS,IAC9D,MAAM,aACN;AACN,QAAM,aACJ,OAAO,MAAM,eAAe,YAAY,OAAO,SAAS,MAAM,UAAU,IACpE,OAAO,MAAM,UAAU,IACvB;AACN,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB,MAAM,aAAa;AAAA,IACpC,aAAa,SAAS;AAAA,IACtB,cAAc,UAAU;AAAA,IACxB,cAAc,UAAU;AAAA,IACxB,WAAW,MAAM,OAAO;AAAA,EAC1B,EAAE,KAAK,GAAG;AACZ;AAOO,IAAM,wBAAN,cAAoC,MAAM;AAAA,EAC/C,YAAqB,YAAqB;AACxC,UAAM,eAAe,SAAY,6CAA6C,sCAAsC,UAAU,GAAG;AAD9G;AAEnB,SAAK,OAAO;AAAA,EACd;AAAA,EAHqB;AAIvB;AAQO,SAAS,qBAAqB,MAA4C;AAC/E,QAAM,SAAS,oBAAoB,KAAK,SAAS;AACjD,SAAO,WAAW,UAAa,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,MAAM,IAAI,SAAS;AAC7E;","names":[]}
@@ -57,13 +57,23 @@ function checkDaemonHealth(host, port, authToken, allowInsecureHttp = false) {
57
57
  "const transport = require(protocol);",
58
58
  "const headers = {};",
59
59
  "if (env.REMNIC_HEALTH_TOKEN) headers['authorization'] = 'Bearer ' + env.REMNIC_HEALTH_TOKEN;",
60
- "const req = transport.get({",
61
- " host: env.REMNIC_HEALTH_HOST,",
62
- " port: parseInt(env.REMNIC_HEALTH_PORT, 10),",
63
- " path: '/engram/v1/health', headers, timeout: 3000,",
64
- "}, (res) => { process.exit(res.statusCode === 200 ? 0 : res.statusCode === 401 ? 2 : 1); });",
65
- "req.on('error', () => process.exit(1));",
66
- "req.on('timeout', () => { req.destroy(); process.exit(1); });"
60
+ "const exitFor = (status) => process.exit(status === 200 ? 0 : status === 401 ? 2 : 1);",
61
+ "const attempt = (path, timeoutMs, onStatus) => {",
62
+ " const req = transport.get({",
63
+ " host: env.REMNIC_HEALTH_HOST,",
64
+ " port: parseInt(env.REMNIC_HEALTH_PORT, 10),",
65
+ " path, headers, timeout: timeoutMs,",
66
+ " }, (res) => { res.resume(); onStatus(res.statusCode); });",
67
+ " req.on('error', () => process.exit(1));",
68
+ " req.on('timeout', () => { req.destroy(); process.exit(1); });",
69
+ "};",
70
+ "const deadline = Date.now() + 3000;",
71
+ "attempt('/engram/v1/live', 3000, (status) => {",
72
+ " if (status !== 404) exitFor(status);",
73
+ " const remaining = deadline - Date.now();",
74
+ " if (remaining <= 0) process.exit(1);",
75
+ " attempt('/engram/v1/health', remaining, exitFor);",
76
+ "});"
67
77
  ].join("\n");
68
78
  const env = mergeEnv({
69
79
  REMNIC_HEALTH_HOST: bareHost,
@@ -3397,4 +3407,4 @@ export {
3397
3407
  resolveWeCloneProxyConfigPath,
3398
3408
  buildWeCloneProxyConfig
3399
3409
  };
3400
- //# sourceMappingURL=chunk-5TJEOU6Y.js.map
3410
+ //# sourceMappingURL=chunk-LKRXGOQW.js.map