nexus-agents 5.0.1 → 5.0.4

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 (125) hide show
  1. package/dist/{child-mcp-config-2EXF74GZ.js → child-mcp-config-PIZSE56V.js} +2 -2
  2. package/dist/{chunk-KYOVZ2QZ.js → chunk-2I5BBD6U.js} +5 -5
  3. package/dist/{chunk-WTQEMR7D.js → chunk-5MQPSHIG.js} +7 -7
  4. package/dist/{chunk-SOKS6XK2.js → chunk-5VP6WPEI.js} +2 -2
  5. package/dist/{chunk-AVYTX7JQ.js → chunk-6OPLDOJG.js} +3 -3
  6. package/dist/chunk-7VPZ26NW.js +7 -0
  7. package/dist/{chunk-SZ6J4YY7.js → chunk-AS4B7KCT.js} +2 -2
  8. package/dist/{chunk-BZRUZSJ6.js → chunk-BD6S7IQ3.js} +27 -22
  9. package/dist/chunk-BD6S7IQ3.js.map +1 -0
  10. package/dist/{chunk-7TXO7LYE.js → chunk-BGGS3PH2.js} +2 -2
  11. package/dist/{chunk-DDUZI6OD.js → chunk-BSWCYRYH.js} +8 -8
  12. package/dist/{chunk-LFAIB5MG.js → chunk-CVDQYONC.js} +47 -42
  13. package/dist/{chunk-LFAIB5MG.js.map → chunk-CVDQYONC.js.map} +1 -1
  14. package/dist/{chunk-Y4XI4RIB.js → chunk-F67CLL5B.js} +2 -2
  15. package/dist/{chunk-KG752W6G.js → chunk-FDWB4PUV.js} +2 -2
  16. package/dist/{chunk-C2LEM7RD.js → chunk-FU45UMX5.js} +2 -2
  17. package/dist/{chunk-3IDYJL2Y.js → chunk-FWBR6DZO.js} +2 -2
  18. package/dist/{chunk-77VDRUFK.js → chunk-GFDE5IAZ.js} +3 -3
  19. package/dist/{chunk-VRJJGXUE.js → chunk-GSK2JRVW.js} +8 -8
  20. package/dist/{chunk-KQPEECXT.js → chunk-GTMJPNPR.js} +2 -2
  21. package/dist/{chunk-W7ITYRY2.js → chunk-JOY5IRVR.js} +2 -2
  22. package/dist/{chunk-AKOBOCUB.js → chunk-K4OBRS4D.js} +2 -2
  23. package/dist/{chunk-FWP5FZ7V.js → chunk-NDVKXAK5.js} +2 -2
  24. package/dist/{chunk-Q225TVYP.js → chunk-OCFY37TZ.js} +16 -2
  25. package/dist/chunk-OCFY37TZ.js.map +1 -0
  26. package/dist/{chunk-ZSNWRX2B.js → chunk-OOGKQTDN.js} +2 -2
  27. package/dist/{chunk-VS2DUTJ5.js → chunk-P7IHQSCC.js} +18 -4
  28. package/dist/chunk-P7IHQSCC.js.map +1 -0
  29. package/dist/{chunk-WIYDV6ZY.js → chunk-Q36RQS7J.js} +3 -3
  30. package/dist/{chunk-VZM7YQZL.js → chunk-R66FJKP4.js} +5 -5
  31. package/dist/{chunk-2P6GBKUN.js → chunk-ROCFIXAK.js} +2 -2
  32. package/dist/{chunk-EQRCOUJJ.js → chunk-SY54YKTT.js} +2 -2
  33. package/dist/{chunk-OKS6I7T7.js → chunk-TC2QG4U3.js} +4 -4
  34. package/dist/{chunk-VHB3L7H7.js → chunk-TIOXRJK3.js} +2 -2
  35. package/dist/{chunk-XIWGJBVE.js → chunk-VX6VNBCU.js} +4 -4
  36. package/dist/{chunk-AYJNW7JN.js → chunk-ZAIZCK2H.js} +7 -7
  37. package/dist/{chunk-GQXDNAMB.js → chunk-ZKX6VVH2.js} +3 -3
  38. package/dist/{chunk-QNF6NAQ3.js → chunk-ZXTOZ7B3.js} +6 -6
  39. package/dist/{cli-circuit-breaker-UFQZZVAB.js → cli-circuit-breaker-YEQKBXCN.js} +3 -3
  40. package/dist/cli.js +41 -41
  41. package/dist/{composite-router-KL7ZLCJY.js → composite-router-7D45ZSSG.js} +2 -2
  42. package/dist/{consensus-vote-X2EF47XM.js → consensus-vote-2TE2APCF.js} +17 -17
  43. package/dist/{context-retriever-GJL6HFJK.js → context-retriever-3R3BWMEW.js} +8 -8
  44. package/dist/{doctor-deep-XEJ7JXQI.js → doctor-deep-ECI74ALB.js} +3 -3
  45. package/dist/{doctor-live-4VAU6HLF.js → doctor-live-OBEZKBNU.js} +9 -9
  46. package/dist/{expert-bridge-VYB4C7C5.js → expert-bridge-XIFIEXQM.js} +4 -4
  47. package/dist/{factory-YYGHDTUN.js → factory-2TN6OVWR.js} +5 -5
  48. package/dist/{factory-S5K2EIKH.js → factory-3T6NTUDH.js} +9 -9
  49. package/dist/{improvement-review-VBLDRXFP.js → improvement-review-OFMMBZPS.js} +6 -6
  50. package/dist/index.js +31 -31
  51. package/dist/{init-opencode-5PUDYNKQ.js → init-opencode-SIT4DIQ4.js} +6 -6
  52. package/dist/issue-triage-42TGOOZX.js +17 -0
  53. package/dist/{pr-reviewer-helpers-4YANH63K.js → pr-reviewer-helpers-NL7YXDAO.js} +4 -4
  54. package/dist/{registry-command-KZDEZNUE.js → registry-command-UBUAESO2.js} +2 -2
  55. package/dist/{repo-security-plan-7N2BVFFF.js → repo-security-plan-MK3OFGIC.js} +3 -3
  56. package/dist/{research-helpers-synthesize-FCXEDCUC.js → research-helpers-synthesize-UZGA2H5E.js} +4 -4
  57. package/dist/{routing-memory-NZZHHDN6.js → routing-memory-GSOJXKYR.js} +2 -2
  58. package/dist/{session-memory-OV55DW3U.js → session-memory-QK544BZF.js} +3 -3
  59. package/dist/{setup-config-WFHZTYAU.js → setup-config-AXDZQQZD.js} +3 -3
  60. package/dist/{setup-custom-api-5V5IQUMA.js → setup-custom-api-JNLX5DPO.js} +4 -4
  61. package/dist/setup-data-dir-7H26F7FW.js +29 -0
  62. package/dist/{tool-memory-NJ5B3U27.js → tool-memory-DYW3QKJZ.js} +5 -5
  63. package/dist/{unified-registry-YBGPLXH3.js → unified-registry-ZRG3SO3X.js} +10 -10
  64. package/dist/{weather-report-U626M3HS.js → weather-report-JQGPC6ZC.js} +2 -2
  65. package/package.json +1 -1
  66. package/dist/chunk-7A63AX2A.js +0 -7
  67. package/dist/chunk-BZRUZSJ6.js.map +0 -1
  68. package/dist/chunk-Q225TVYP.js.map +0 -1
  69. package/dist/chunk-VS2DUTJ5.js.map +0 -1
  70. package/dist/issue-triage-5ZFQWQ3W.js +0 -17
  71. package/dist/setup-data-dir-RQCYL3D3.js +0 -29
  72. /package/dist/{child-mcp-config-2EXF74GZ.js.map → child-mcp-config-PIZSE56V.js.map} +0 -0
  73. /package/dist/{chunk-KYOVZ2QZ.js.map → chunk-2I5BBD6U.js.map} +0 -0
  74. /package/dist/{chunk-WTQEMR7D.js.map → chunk-5MQPSHIG.js.map} +0 -0
  75. /package/dist/{chunk-SOKS6XK2.js.map → chunk-5VP6WPEI.js.map} +0 -0
  76. /package/dist/{chunk-AVYTX7JQ.js.map → chunk-6OPLDOJG.js.map} +0 -0
  77. /package/dist/{chunk-7A63AX2A.js.map → chunk-7VPZ26NW.js.map} +0 -0
  78. /package/dist/{chunk-SZ6J4YY7.js.map → chunk-AS4B7KCT.js.map} +0 -0
  79. /package/dist/{chunk-7TXO7LYE.js.map → chunk-BGGS3PH2.js.map} +0 -0
  80. /package/dist/{chunk-DDUZI6OD.js.map → chunk-BSWCYRYH.js.map} +0 -0
  81. /package/dist/{chunk-Y4XI4RIB.js.map → chunk-F67CLL5B.js.map} +0 -0
  82. /package/dist/{chunk-KG752W6G.js.map → chunk-FDWB4PUV.js.map} +0 -0
  83. /package/dist/{chunk-C2LEM7RD.js.map → chunk-FU45UMX5.js.map} +0 -0
  84. /package/dist/{chunk-3IDYJL2Y.js.map → chunk-FWBR6DZO.js.map} +0 -0
  85. /package/dist/{chunk-77VDRUFK.js.map → chunk-GFDE5IAZ.js.map} +0 -0
  86. /package/dist/{chunk-VRJJGXUE.js.map → chunk-GSK2JRVW.js.map} +0 -0
  87. /package/dist/{chunk-KQPEECXT.js.map → chunk-GTMJPNPR.js.map} +0 -0
  88. /package/dist/{chunk-W7ITYRY2.js.map → chunk-JOY5IRVR.js.map} +0 -0
  89. /package/dist/{chunk-AKOBOCUB.js.map → chunk-K4OBRS4D.js.map} +0 -0
  90. /package/dist/{chunk-FWP5FZ7V.js.map → chunk-NDVKXAK5.js.map} +0 -0
  91. /package/dist/{chunk-ZSNWRX2B.js.map → chunk-OOGKQTDN.js.map} +0 -0
  92. /package/dist/{chunk-WIYDV6ZY.js.map → chunk-Q36RQS7J.js.map} +0 -0
  93. /package/dist/{chunk-VZM7YQZL.js.map → chunk-R66FJKP4.js.map} +0 -0
  94. /package/dist/{chunk-2P6GBKUN.js.map → chunk-ROCFIXAK.js.map} +0 -0
  95. /package/dist/{chunk-EQRCOUJJ.js.map → chunk-SY54YKTT.js.map} +0 -0
  96. /package/dist/{chunk-OKS6I7T7.js.map → chunk-TC2QG4U3.js.map} +0 -0
  97. /package/dist/{chunk-VHB3L7H7.js.map → chunk-TIOXRJK3.js.map} +0 -0
  98. /package/dist/{chunk-XIWGJBVE.js.map → chunk-VX6VNBCU.js.map} +0 -0
  99. /package/dist/{chunk-AYJNW7JN.js.map → chunk-ZAIZCK2H.js.map} +0 -0
  100. /package/dist/{chunk-GQXDNAMB.js.map → chunk-ZKX6VVH2.js.map} +0 -0
  101. /package/dist/{chunk-QNF6NAQ3.js.map → chunk-ZXTOZ7B3.js.map} +0 -0
  102. /package/dist/{cli-circuit-breaker-UFQZZVAB.js.map → cli-circuit-breaker-YEQKBXCN.js.map} +0 -0
  103. /package/dist/{composite-router-KL7ZLCJY.js.map → composite-router-7D45ZSSG.js.map} +0 -0
  104. /package/dist/{consensus-vote-X2EF47XM.js.map → consensus-vote-2TE2APCF.js.map} +0 -0
  105. /package/dist/{context-retriever-GJL6HFJK.js.map → context-retriever-3R3BWMEW.js.map} +0 -0
  106. /package/dist/{doctor-deep-XEJ7JXQI.js.map → doctor-deep-ECI74ALB.js.map} +0 -0
  107. /package/dist/{doctor-live-4VAU6HLF.js.map → doctor-live-OBEZKBNU.js.map} +0 -0
  108. /package/dist/{expert-bridge-VYB4C7C5.js.map → expert-bridge-XIFIEXQM.js.map} +0 -0
  109. /package/dist/{factory-S5K2EIKH.js.map → factory-2TN6OVWR.js.map} +0 -0
  110. /package/dist/{factory-YYGHDTUN.js.map → factory-3T6NTUDH.js.map} +0 -0
  111. /package/dist/{improvement-review-VBLDRXFP.js.map → improvement-review-OFMMBZPS.js.map} +0 -0
  112. /package/dist/{init-opencode-5PUDYNKQ.js.map → init-opencode-SIT4DIQ4.js.map} +0 -0
  113. /package/dist/{issue-triage-5ZFQWQ3W.js.map → issue-triage-42TGOOZX.js.map} +0 -0
  114. /package/dist/{pr-reviewer-helpers-4YANH63K.js.map → pr-reviewer-helpers-NL7YXDAO.js.map} +0 -0
  115. /package/dist/{registry-command-KZDEZNUE.js.map → registry-command-UBUAESO2.js.map} +0 -0
  116. /package/dist/{repo-security-plan-7N2BVFFF.js.map → repo-security-plan-MK3OFGIC.js.map} +0 -0
  117. /package/dist/{research-helpers-synthesize-FCXEDCUC.js.map → research-helpers-synthesize-UZGA2H5E.js.map} +0 -0
  118. /package/dist/{routing-memory-NZZHHDN6.js.map → routing-memory-GSOJXKYR.js.map} +0 -0
  119. /package/dist/{session-memory-OV55DW3U.js.map → session-memory-QK544BZF.js.map} +0 -0
  120. /package/dist/{setup-config-WFHZTYAU.js.map → setup-config-AXDZQQZD.js.map} +0 -0
  121. /package/dist/{setup-custom-api-5V5IQUMA.js.map → setup-custom-api-JNLX5DPO.js.map} +0 -0
  122. /package/dist/{setup-data-dir-RQCYL3D3.js.map → setup-data-dir-7H26F7FW.js.map} +0 -0
  123. /package/dist/{tool-memory-NJ5B3U27.js.map → tool-memory-DYW3QKJZ.js.map} +0 -0
  124. /package/dist/{unified-registry-YBGPLXH3.js.map → unified-registry-ZRG3SO3X.js.map} +0 -0
  125. /package/dist/{weather-report-U626M3HS.js.map → weather-report-JQGPC6ZC.js.map} +0 -0
@@ -5,7 +5,7 @@ import {
5
5
  getErrorMessage,
6
6
  ok,
7
7
  parseBoolEnv
8
- } from "./chunk-AVYTX7JQ.js";
8
+ } from "./chunk-6OPLDOJG.js";
9
9
 
10
10
  // src/cli/research-helpers-io.ts
11
11
  import * as fs2 from "fs/promises";
@@ -156,4 +156,4 @@ export {
156
156
  loadPapersRegistry,
157
157
  savePapersRegistry
158
158
  };
159
- //# sourceMappingURL=chunk-Y4XI4RIB.js.map
159
+ //# sourceMappingURL=chunk-F67CLL5B.js.map
@@ -8,7 +8,7 @@ import {
8
8
  getTimeProvider,
9
9
  isRateLimitText,
10
10
  ok
11
- } from "./chunk-AVYTX7JQ.js";
11
+ } from "./chunk-6OPLDOJG.js";
12
12
 
13
13
  // src/cli-adapters/circuit-breaker-types.ts
14
14
  var CircuitErrorCode = {
@@ -541,4 +541,4 @@ export {
541
541
  CliCircuitBreakerIntegration,
542
542
  createCliCircuitBreakerIntegration
543
543
  };
544
- //# sourceMappingURL=chunk-KG752W6G.js.map
544
+ //# sourceMappingURL=chunk-FDWB4PUV.js.map
@@ -2,7 +2,7 @@ import {
2
2
  CACHE_TIMEOUTS,
3
3
  createLogger,
4
4
  getTimeProvider
5
- } from "./chunk-AVYTX7JQ.js";
5
+ } from "./chunk-6OPLDOJG.js";
6
6
 
7
7
  // src/security/trust-types.ts
8
8
  import { z } from "zod";
@@ -560,4 +560,4 @@ export {
560
560
  resolveReputationGatingMode,
561
561
  gateWithReputation
562
562
  };
563
- //# sourceMappingURL=chunk-C2LEM7RD.js.map
563
+ //# sourceMappingURL=chunk-FU45UMX5.js.map
@@ -2,7 +2,7 @@ import {
2
2
  createLogger,
3
3
  err,
4
4
  ok
5
- } from "./chunk-AVYTX7JQ.js";
5
+ } from "./chunk-6OPLDOJG.js";
6
6
 
7
7
  // src/scm/token-resolver.ts
8
8
  import { execFile } from "child_process";
@@ -87,4 +87,4 @@ export {
87
87
  hasToken,
88
88
  getTokenEnvVars
89
89
  };
90
- //# sourceMappingURL=chunk-3IDYJL2Y.js.map
90
+ //# sourceMappingURL=chunk-FWBR6DZO.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  loadPapersRegistry
3
- } from "./chunk-Y4XI4RIB.js";
3
+ } from "./chunk-F67CLL5B.js";
4
4
  import {
5
5
  getErrorMessage
6
- } from "./chunk-AVYTX7JQ.js";
6
+ } from "./chunk-6OPLDOJG.js";
7
7
 
8
8
  // src/cli/research-helpers-synthesize.ts
9
9
  import { z } from "zod";
@@ -886,4 +886,4 @@ export {
886
886
  AttributedInsightSchema,
887
887
  synthesizeResearch
888
888
  };
889
- //# sourceMappingURL=chunk-77VDRUFK.js.map
889
+ //# sourceMappingURL=chunk-GFDE5IAZ.js.map
@@ -5,34 +5,34 @@ import {
5
5
  planOptionalParams,
6
6
  requireApiKey,
7
7
  validateApiKeyPresence
8
- } from "./chunk-2P6GBKUN.js";
8
+ } from "./chunk-ROCFIXAK.js";
9
9
  import {
10
10
  CUSTOM_API_DEFAULT_MODEL
11
- } from "./chunk-EQRCOUJJ.js";
11
+ } from "./chunk-SY54YKTT.js";
12
12
  import {
13
13
  CUSTOM_API_BASE_URL_ENV,
14
14
  PROVIDER_ENV_KEYS,
15
15
  assertCustomApiHostResolvesPublic,
16
16
  validateCustomApiBaseUrl
17
- } from "./chunk-7TXO7LYE.js";
17
+ } from "./chunk-BGGS3PH2.js";
18
18
  import {
19
19
  nexusMkdtempSync
20
20
  } from "./chunk-4OW67KT2.js";
21
21
  import {
22
22
  getAvailabilityCache
23
- } from "./chunk-FWP5FZ7V.js";
23
+ } from "./chunk-NDVKXAK5.js";
24
24
  import {
25
25
  extractSystemPrompt
26
26
  } from "./chunk-QZUG667L.js";
27
27
  import {
28
28
  generateHyphenId
29
- } from "./chunk-SZ6J4YY7.js";
29
+ } from "./chunk-AS4B7KCT.js";
30
30
  import {
31
31
  CliCircuitBreaker,
32
32
  DEFAULT_CIRCUIT_BREAKER_CONFIG,
33
33
  getCliCircuitBreakerSnapshot,
34
34
  getDefaultCliCircuitBreakerRegistry
35
- } from "./chunk-KG752W6G.js";
35
+ } from "./chunk-FDWB4PUV.js";
36
36
  import {
37
37
  CLI_SUBPROCESS_TIMEOUTS,
38
38
  CLI_TIMEOUTS,
@@ -72,7 +72,7 @@ import {
72
72
  resolveCliAlias,
73
73
  resolveRetryAfterMs,
74
74
  retryAfterMsFromContext
75
- } from "./chunk-AVYTX7JQ.js";
75
+ } from "./chunk-6OPLDOJG.js";
76
76
 
77
77
  // src/cli-adapters/cli-to-model-adapter.ts
78
78
  var CliToModelAdapter = class {
@@ -4903,4 +4903,4 @@ export {
4903
4903
  SdkAdapter,
4904
4904
  createAutoAdapter
4905
4905
  };
4906
- //# sourceMappingURL=chunk-VRJJGXUE.js.map
4906
+ //# sourceMappingURL=chunk-GSK2JRVW.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getErrorMessage
3
- } from "./chunk-AVYTX7JQ.js";
3
+ } from "./chunk-6OPLDOJG.js";
4
4
 
5
5
  // src/cli/setup-config.ts
6
6
  import { copyFileSync, existsSync, mkdirSync, writeFileSync } from "fs";
@@ -77,4 +77,4 @@ function ensureBackup(outputPath) {
77
77
  export {
78
78
  runConfigInitSync
79
79
  };
80
- //# sourceMappingURL=chunk-KQPEECXT.js.map
80
+ //# sourceMappingURL=chunk-GTMJPNPR.js.map
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  createLogger,
6
6
  getTimeProvider
7
- } from "./chunk-AVYTX7JQ.js";
7
+ } from "./chunk-6OPLDOJG.js";
8
8
 
9
9
  // src/mcp/tools/scanner-registry-fetcher.ts
10
10
  import { z } from "zod";
@@ -721,4 +721,4 @@ export {
721
721
  generateSecurityPlan,
722
722
  buildPlanFromAnalysis
723
723
  };
724
- //# sourceMappingURL=chunk-W7ITYRY2.js.map
724
+ //# sourceMappingURL=chunk-JOY5IRVR.js.map
@@ -4,7 +4,7 @@ import {
4
4
  err,
5
5
  getErrorMessage,
6
6
  ok
7
- } from "./chunk-AVYTX7JQ.js";
7
+ } from "./chunk-6OPLDOJG.js";
8
8
 
9
9
  // src/scm/types.ts
10
10
  var ScmError = class extends Error {
@@ -263,4 +263,4 @@ export {
263
263
  ScmError,
264
264
  GitHubProvider
265
265
  };
266
- //# sourceMappingURL=chunk-AKOBOCUB.js.map
266
+ //# sourceMappingURL=chunk-K4OBRS4D.js.map
@@ -3,7 +3,7 @@ import {
3
3
  MODEL_IDS,
4
4
  getTimeProvider,
5
5
  resolveModelIdentitySync
6
- } from "./chunk-AVYTX7JQ.js";
6
+ } from "./chunk-6OPLDOJG.js";
7
7
 
8
8
  // src/config/model-availability.ts
9
9
  var DEFAULT_TTL_MS = 6e4;
@@ -150,4 +150,4 @@ export {
150
150
  resetAvailabilityCache,
151
151
  filterAvailableModels
152
152
  };
153
- //# sourceMappingURL=chunk-FWP5FZ7V.js.map
153
+ //# sourceMappingURL=chunk-NDVKXAK5.js.map
@@ -4,7 +4,7 @@ import {
4
4
  getErrorMessage,
5
5
  getTimeProvider,
6
6
  ok
7
- } from "./chunk-AVYTX7JQ.js";
7
+ } from "./chunk-6OPLDOJG.js";
8
8
 
9
9
  // src/context/session-memory.ts
10
10
  import * as fs from "fs";
@@ -140,6 +140,20 @@ var SessionMemory = class {
140
140
  getCurrentSessionLearnings() {
141
141
  return this.currentSession?.learnings ?? [];
142
142
  }
143
+ /**
144
+ * Get tasks completed in the current (unpersisted) session.
145
+ *
146
+ * Sibling of {@link getCurrentSessionLearnings}. Its absence is why
147
+ * `memory_stats` reported a hardcoded `tasksCount: 0` — the data was in the
148
+ * episode all along, just not readable before `endSession` (#5269).
149
+ */
150
+ getCurrentSessionTasks() {
151
+ return this.currentSession?.tasksCompleted ?? [];
152
+ }
153
+ /** Get errors resolved in the current (unpersisted) session. See above. */
154
+ getCurrentSessionErrors() {
155
+ return this.currentSession?.errorsResolved ?? [];
156
+ }
143
157
  /** Record a learning during the current session. */
144
158
  recordLearning(learning) {
145
159
  if (this.currentSession === null) {
@@ -352,4 +366,4 @@ export {
352
366
  SessionMemory,
353
367
  createSessionMemory
354
368
  };
355
- //# sourceMappingURL=chunk-Q225TVYP.js.map
369
+ //# sourceMappingURL=chunk-OCFY37TZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context/session-memory.ts","../src/context/session-memory-types.ts"],"sourcesContent":["/**\n * Cross-session episodic memory persistence with FIFO eviction bounds.\n * @module context/session-memory\n * (Source: Issue #130, #709 - arXiv:2303.11366 - Reflexion)\n */\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { Result } from '../core/result.js';\nimport { ok, err } from '../core/result.js';\nimport { getErrorMessage, getTimeProvider } from '../core/index.js';\nimport type { ILogger } from '../core/logger.js';\nimport { createLogger } from '../core/logger.js';\nimport type {\n SessionLearning,\n CompletedTask,\n ResolvedError,\n SessionEpisode,\n SessionMemoryConfig,\n} from './session-memory-types.js';\nimport {\n SessionLearningSchema,\n CompletedTaskSchema,\n ResolvedErrorSchema,\n SessionEpisodeSchema,\n SessionMemoryError,\n DEFAULT_SESSION_MEMORY_CONFIG,\n} from './session-memory-types.js';\n\nexport type {\n SessionLearning,\n CompletedTask,\n ResolvedError,\n SessionEpisode,\n SessionMemoryConfig,\n} from './session-memory-types.js';\nexport {\n SessionLearningSchema,\n CompletedTaskSchema,\n ResolvedErrorSchema,\n SessionEpisodeSchema,\n SessionMemoryError,\n} from './session-memory-types.js';\n\n/** Manages cross-session episodic memory with per-session bounds and disk retention. */\nexport class SessionMemory {\n private readonly memoryDir: string;\n private readonly maxEpisodesToLoad: number;\n private readonly maxLearningsInContext: number;\n private readonly minConfidenceThreshold: number;\n private readonly maxLearningsPerSession: number;\n private readonly maxTasksPerSession: number;\n private readonly maxErrorsPerSession: number;\n private readonly maxEpisodeFiles: number;\n private readonly log: ILogger;\n private currentSession: SessionEpisode | null = null;\n private sessionStartTime: number | null = null;\n\n constructor(config: SessionMemoryConfig) {\n const d = DEFAULT_SESSION_MEMORY_CONFIG;\n this.memoryDir = config.memoryDir;\n this.maxEpisodesToLoad = config.maxEpisodesToLoad ?? d.maxEpisodesToLoad;\n this.maxLearningsInContext = config.maxLearningsInContext ?? d.maxLearningsInContext;\n this.minConfidenceThreshold = config.minConfidenceThreshold ?? d.minConfidenceThreshold;\n this.maxLearningsPerSession = config.maxLearningsPerSession ?? d.maxLearningsPerSession;\n this.maxTasksPerSession = config.maxTasksPerSession ?? d.maxTasksPerSession;\n this.maxErrorsPerSession = config.maxErrorsPerSession ?? d.maxErrorsPerSession;\n this.maxEpisodeFiles = config.maxEpisodeFiles ?? d.maxEpisodeFiles;\n this.log = config.logger ?? createLogger({ component: 'SessionMemory' });\n }\n\n /** Start a new session and load relevant memories. */\n startSession(sessionId: string): Result<readonly SessionLearning[], SessionMemoryError> {\n if (this.currentSession !== null) {\n return err(\n new SessionMemoryError('Session already in progress', {\n existingSessionId: this.currentSession.sessionId,\n })\n );\n }\n\n this.ensureMemoryDir();\n this.sessionStartTime = getTimeProvider().now();\n\n this.currentSession = {\n sessionId,\n date: getTimeProvider().nowDateString(),\n durationMs: 0,\n summary: '',\n learnings: [],\n tasksCompleted: [],\n errorsResolved: [],\n };\n\n this.log.info('Session started', { sessionId });\n\n // Load relevant learnings from past episodes\n const relevantLearnings = this.loadRelevantLearnings();\n return ok(relevantLearnings);\n }\n\n /** End the current session and persist episode. */\n endSession(summary: string): Result<SessionEpisode, SessionMemoryError> {\n if (this.currentSession === null || this.sessionStartTime === null) {\n return err(new SessionMemoryError('No session in progress'));\n }\n\n const durationMs = getTimeProvider().now() - this.sessionStartTime;\n const episode: SessionEpisode = {\n ...this.currentSession,\n durationMs,\n summary,\n };\n\n const persistResult = this.persistEpisode(episode);\n if (!persistResult.ok) return persistResult;\n\n this.log.info('Session ended', {\n sessionId: episode.sessionId,\n durationMs,\n learningsCount: episode.learnings.length,\n tasksCount: episode.tasksCompleted.length,\n });\n\n this.currentSession = null;\n this.sessionStartTime = null;\n\n return ok(episode);\n }\n\n /** Check if a session is currently active. */\n isSessionActive(): boolean {\n return this.currentSession !== null;\n }\n\n /** Get the current session ID. */\n getCurrentSessionId(): string | null {\n return this.currentSession?.sessionId ?? null;\n }\n\n /** Get learnings accumulated in the current (unpersisted) session. */\n getCurrentSessionLearnings(): readonly SessionLearning[] {\n return this.currentSession?.learnings ?? [];\n }\n\n /**\n * Get tasks completed in the current (unpersisted) session.\n *\n * Sibling of {@link getCurrentSessionLearnings}. Its absence is why\n * `memory_stats` reported a hardcoded `tasksCount: 0` — the data was in the\n * episode all along, just not readable before `endSession` (#5269).\n */\n getCurrentSessionTasks(): readonly CompletedTask[] {\n return this.currentSession?.tasksCompleted ?? [];\n }\n\n /** Get errors resolved in the current (unpersisted) session. See above. */\n getCurrentSessionErrors(): readonly ResolvedError[] {\n return this.currentSession?.errorsResolved ?? [];\n }\n\n /** Record a learning during the current session. */\n recordLearning(learning: SessionLearning): Result<void, SessionMemoryError> {\n if (this.currentSession === null) {\n return err(new SessionMemoryError('No session in progress'));\n }\n\n const validation = SessionLearningSchema.safeParse(learning);\n if (!validation.success) {\n return err(\n new SessionMemoryError('Invalid learning data', {\n errors: validation.error.issues,\n })\n );\n }\n\n const updated = [...this.currentSession.learnings, learning];\n if (updated.length > this.maxLearningsPerSession) {\n updated.splice(0, updated.length - this.maxLearningsPerSession);\n this.log.debug('Learning FIFO eviction', { kept: this.maxLearningsPerSession });\n }\n this.currentSession = { ...this.currentSession, learnings: updated };\n\n this.log.debug('Learning recorded', { pattern: learning.pattern });\n return ok(undefined);\n }\n\n /** Record a completed task during the current session. */\n recordTask(task: CompletedTask): Result<void, SessionMemoryError> {\n if (this.currentSession === null) {\n return err(new SessionMemoryError('No session in progress'));\n }\n\n const validation = CompletedTaskSchema.safeParse(task);\n if (!validation.success) {\n return err(\n new SessionMemoryError('Invalid task data', {\n errors: validation.error.issues,\n })\n );\n }\n\n const updated = [...this.currentSession.tasksCompleted, task];\n if (updated.length > this.maxTasksPerSession) {\n updated.splice(0, updated.length - this.maxTasksPerSession);\n this.log.debug('Task FIFO eviction', { kept: this.maxTasksPerSession });\n }\n this.currentSession = { ...this.currentSession, tasksCompleted: updated };\n\n this.log.debug('Task recorded', { issue: task.issue });\n return ok(undefined);\n }\n\n /** Record a resolved error during the current session. */\n recordError(error: ResolvedError): Result<void, SessionMemoryError> {\n if (this.currentSession === null) {\n return err(new SessionMemoryError('No session in progress'));\n }\n\n const validation = ResolvedErrorSchema.safeParse(error);\n if (!validation.success) {\n return err(\n new SessionMemoryError('Invalid error data', {\n errors: validation.error.issues,\n })\n );\n }\n\n const updated = [...this.currentSession.errorsResolved, error];\n if (updated.length > this.maxErrorsPerSession) {\n updated.splice(0, updated.length - this.maxErrorsPerSession);\n this.log.debug('Error FIFO eviction', { kept: this.maxErrorsPerSession });\n }\n this.currentSession = { ...this.currentSession, errorsResolved: updated };\n\n this.log.debug('Error resolution recorded', { error: error.error });\n return ok(undefined);\n }\n\n /** Load all episodes from the memory directory. */\n loadEpisodes(limit?: number): readonly SessionEpisode[] {\n this.ensureMemoryDir();\n const files = this.getEpisodeFiles();\n const effectiveLimit = limit ?? this.maxEpisodesToLoad;\n\n const episodes: SessionEpisode[] = [];\n for (const file of files.slice(0, effectiveLimit)) {\n const episode = this.loadEpisodeFile(file);\n if (episode !== null) {\n episodes.push(episode);\n }\n }\n\n return episodes;\n }\n\n /** Load learnings relevant to the current context. */\n loadRelevantLearnings(): readonly SessionLearning[] {\n const episodes = this.loadEpisodes();\n const allLearnings: SessionLearning[] = [];\n\n for (const episode of episodes) {\n for (const learning of episode.learnings) {\n if (learning.confidence >= this.minConfidenceThreshold) {\n allLearnings.push(learning);\n }\n }\n }\n\n // Sort by confidence (highest first) and limit\n return allLearnings\n .sort((a, b) => b.confidence - a.confidence)\n .slice(0, this.maxLearningsInContext);\n }\n\n /** Search for learnings matching a query (includes current session).\n * Uses keyword-based matching: all query words must appear in the text. */\n searchLearnings(query: string): readonly SessionLearning[] {\n const keywords = query\n .toLowerCase()\n .split(/\\s+/)\n .filter((k) => k.length > 1);\n const matches: SessionLearning[] = [];\n\n // Search persisted episodes\n const episodes = this.loadEpisodes();\n for (const episode of episodes) {\n for (const learning of episode.learnings) {\n if (matchesKeywords(learning, keywords)) {\n matches.push(learning);\n }\n }\n }\n\n // Include current (unpersisted) session learnings (#1126)\n if (this.currentSession !== null) {\n for (const learning of this.currentSession.learnings) {\n if (matchesKeywords(learning, keywords)) {\n matches.push(learning);\n }\n }\n }\n\n return matches.sort((a, b) => b.confidence - a.confidence);\n }\n\n /** Get recent errors and their solutions. */\n getRecentErrorSolutions(limit = 10): readonly ResolvedError[] {\n const episodes = this.loadEpisodes();\n const errors: ResolvedError[] = [];\n\n for (const episode of episodes) {\n errors.push(...episode.errorsResolved);\n }\n\n return errors.slice(0, limit);\n }\n\n private ensureMemoryDir(): void {\n if (!fs.existsSync(this.memoryDir)) {\n fs.mkdirSync(this.memoryDir, { recursive: true });\n this.log.debug('Created memory directory', { path: this.memoryDir });\n }\n }\n\n private getEpisodeFiles(): readonly string[] {\n try {\n const files = fs\n .readdirSync(this.memoryDir)\n .filter((f) => f.startsWith('episode-') && f.endsWith('.json'))\n .sort()\n .reverse(); // Most recent first\n return files;\n } catch {\n return [];\n }\n }\n\n private loadEpisodeFile(filename: string): SessionEpisode | null {\n try {\n const filepath = path.join(this.memoryDir, filename);\n const content = fs.readFileSync(filepath, 'utf-8');\n const data = JSON.parse(content) as unknown;\n const validation = SessionEpisodeSchema.safeParse(data);\n if (validation.success) {\n // Cast required due to exactOptionalPropertyTypes - Zod validated the data\n return validation.data as SessionEpisode;\n }\n this.log.warn('Invalid episode file', { filename, errors: validation.error.issues });\n return null;\n } catch (error) {\n this.log.warn('Failed to load episode file', { filename, error });\n return null;\n }\n }\n\n private persistEpisode(episode: SessionEpisode): Result<void, SessionMemoryError> {\n try {\n this.ensureMemoryDir();\n // Use more of session ID to avoid collisions\n const sessionSuffix = episode.sessionId.replace(/[^a-zA-Z0-9-]/g, '-').slice(0, 16);\n const timestamp = getTimeProvider().now().toString(36); // Base36 timestamp for uniqueness\n const filename = `episode-${episode.date}-${sessionSuffix}-${timestamp}.json`;\n const filepath = path.join(this.memoryDir, filename);\n const content = JSON.stringify(episode, null, 2);\n fs.writeFileSync(filepath, content, 'utf-8');\n this.log.debug('Episode persisted', { filename });\n this.enforceEpisodeRetention();\n return ok(undefined);\n } catch (error) {\n const message = getErrorMessage(error);\n return err(new SessionMemoryError(`Failed to persist episode: ${message}`));\n }\n }\n\n /** Delete oldest episode files when count exceeds maxEpisodeFiles. */\n private enforceEpisodeRetention(): void {\n try {\n const files = this.getEpisodeFiles(); // sorted most-recent-first\n if (files.length <= this.maxEpisodeFiles) return;\n const toDelete = files.slice(this.maxEpisodeFiles);\n for (const file of toDelete) {\n fs.unlinkSync(path.join(this.memoryDir, file));\n }\n this.log.info('Episode retention enforced', {\n kept: this.maxEpisodeFiles,\n deleted: toDelete.length,\n });\n } catch (error: unknown) {\n this.log.debug('Episode retention cleanup failed', {\n error: getErrorMessage(error),\n });\n }\n }\n}\n\n/** Check if a learning matches all keywords (AND logic). */\nfunction matchesKeywords(learning: SessionLearning, keywords: readonly string[]): boolean {\n if (keywords.length === 0) return false;\n const text = `${learning.pattern} ${learning.context}`.toLowerCase();\n return keywords.every((k) => text.includes(k));\n}\n\n/** Create a SessionMemory instance with default configuration. */\nexport function createSessionMemory(\n memoryDir: string,\n config?: Partial<Omit<SessionMemoryConfig, 'memoryDir'>>\n): SessionMemory {\n return new SessionMemory({\n memoryDir,\n ...config,\n });\n}\n","/**\n * Session Memory Types and Schemas\n *\n * Type definitions for cross-session episodic memory persistence.\n *\n * @module context/session-memory-types\n * (Source: Issue #130, arXiv:2303.11366 - Reflexion)\n */\n\nimport { z } from 'zod';\nimport type { ILogger } from '../core/logger.js';\n\n// ============================================================================\n// Session Learning\n// ============================================================================\n\n/**\n * A learning captured during a session.\n */\nexport interface SessionLearning {\n /** The pattern or technique learned */\n readonly pattern: string;\n /** Context where this learning applies */\n readonly context: string;\n /** Confidence in this learning (0-1) */\n readonly confidence: number;\n /** Optional source (e.g., task, error, user feedback) */\n readonly source?: string;\n}\n\nexport const SessionLearningSchema = z.object({\n pattern: z.string().min(1),\n context: z.string().min(1),\n confidence: z.number().min(0).max(1),\n source: z.string().optional(),\n});\n\n// ============================================================================\n// Completed Task\n// ============================================================================\n\n/**\n * A task completed during a session.\n */\nexport interface CompletedTask {\n /** Issue or task identifier */\n readonly issue?: string | number;\n /** Approach used to complete the task */\n readonly approach: string;\n /** Challenges encountered */\n readonly challenges: readonly string[];\n /** Duration in milliseconds */\n readonly durationMs?: number;\n}\n\nexport const CompletedTaskSchema = z.object({\n issue: z.union([z.string(), z.number()]).optional(),\n approach: z.string().min(1),\n challenges: z.array(z.string()),\n durationMs: z.number().positive().optional(),\n});\n\n// ============================================================================\n// Resolved Error\n// ============================================================================\n\n/**\n * An error resolved during a session.\n */\nexport interface ResolvedError {\n /** Error message or type */\n readonly error: string;\n /** Solution applied */\n readonly solution: string;\n /** File pattern where this applies */\n readonly filePattern?: string;\n}\n\nexport const ResolvedErrorSchema = z.object({\n error: z.string().min(1),\n solution: z.string().min(1),\n filePattern: z.string().optional(),\n});\n\n// ============================================================================\n// Session Episode\n// ============================================================================\n\n/**\n * Complete session episode data.\n */\nexport interface SessionEpisode {\n /** Unique session identifier */\n readonly sessionId: string;\n /** Session date (ISO format) */\n readonly date: string;\n /** Session duration in milliseconds */\n readonly durationMs: number;\n /** Brief summary of the session */\n readonly summary: string;\n /** Learnings captured */\n readonly learnings: readonly SessionLearning[];\n /** Tasks completed */\n readonly tasksCompleted: readonly CompletedTask[];\n /** Errors resolved */\n readonly errorsResolved: readonly ResolvedError[];\n}\n\nexport const SessionEpisodeSchema = z.object({\n sessionId: z.string().min(1),\n date: z.string().min(1),\n durationMs: z.number().min(0),\n summary: z.string(),\n learnings: z.array(SessionLearningSchema),\n tasksCompleted: z.array(CompletedTaskSchema),\n errorsResolved: z.array(ResolvedErrorSchema),\n});\n\n// ============================================================================\n// Error Class\n// ============================================================================\n\n/**\n * Error for session memory operations.\n */\nexport class SessionMemoryError extends Error {\n constructor(\n message: string,\n public readonly context?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'SessionMemoryError';\n }\n}\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\n/**\n * Configuration for SessionMemory.\n */\nexport interface SessionMemoryConfig {\n /** Base directory for memory storage */\n readonly memoryDir: string;\n /** Maximum episodes to load on session start */\n readonly maxEpisodesToLoad?: number;\n /** Maximum learnings to include in context */\n readonly maxLearningsInContext?: number;\n /** Minimum confidence threshold for learnings */\n readonly minConfidenceThreshold?: number;\n /** Maximum learnings per session (FIFO eviction). */\n readonly maxLearningsPerSession?: number;\n /** Maximum tasks per session (FIFO eviction). */\n readonly maxTasksPerSession?: number;\n /** Maximum errors per session (FIFO eviction). */\n readonly maxErrorsPerSession?: number;\n /** Maximum episode files to retain on disk. Oldest are deleted. */\n readonly maxEpisodeFiles?: number;\n /** Logger instance */\n readonly logger?: ILogger;\n}\n\nexport const DEFAULT_SESSION_MEMORY_CONFIG = {\n maxEpisodesToLoad: 10,\n maxLearningsInContext: 20,\n minConfidenceThreshold: 0.5,\n maxLearningsPerSession: 500,\n maxTasksPerSession: 200,\n maxErrorsPerSession: 200,\n maxEpisodeFiles: 50,\n} as const;\n"],"mappings":";;;;;;;;;AAKA,YAAY,QAAQ;AACpB,YAAY,UAAU;;;ACGtB,SAAS,SAAS;AAqBX,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACnC,QAAQ,EAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAoBM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA,EAClD,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAC9B,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAC7C,CAAC;AAkBM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,aAAa,EAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AA0BM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC5B,SAAS,EAAE,OAAO;AAAA,EAClB,WAAW,EAAE,MAAM,qBAAqB;AAAA,EACxC,gBAAgB,EAAE,MAAM,mBAAmB;AAAA,EAC3C,gBAAgB,EAAE,MAAM,mBAAmB;AAC7C,CAAC;AASM,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAC5C,YACE,SACgB,SAChB;AACA,UAAM,OAAO;AAFG;AAGhB,SAAK,OAAO;AAAA,EACd;AAAA,EAJkB;AAKpB;AA8BO,IAAM,gCAAgC;AAAA,EAC3C,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,iBAAiB;AACnB;;;AD/HO,IAAM,gBAAN,MAAoB;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,iBAAwC;AAAA,EACxC,mBAAkC;AAAA,EAE1C,YAAY,QAA6B;AACvC,UAAM,IAAI;AACV,SAAK,YAAY,OAAO;AACxB,SAAK,oBAAoB,OAAO,qBAAqB,EAAE;AACvD,SAAK,wBAAwB,OAAO,yBAAyB,EAAE;AAC/D,SAAK,yBAAyB,OAAO,0BAA0B,EAAE;AACjE,SAAK,yBAAyB,OAAO,0BAA0B,EAAE;AACjE,SAAK,qBAAqB,OAAO,sBAAsB,EAAE;AACzD,SAAK,sBAAsB,OAAO,uBAAuB,EAAE;AAC3D,SAAK,kBAAkB,OAAO,mBAAmB,EAAE;AACnD,SAAK,MAAM,OAAO,UAAU,aAAa,EAAE,WAAW,gBAAgB,CAAC;AAAA,EACzE;AAAA;AAAA,EAGA,aAAa,WAA2E;AACtF,QAAI,KAAK,mBAAmB,MAAM;AAChC,aAAO;AAAA,QACL,IAAI,mBAAmB,+BAA+B;AAAA,UACpD,mBAAmB,KAAK,eAAe;AAAA,QACzC,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,gBAAgB;AACrB,SAAK,mBAAmB,gBAAgB,EAAE,IAAI;AAE9C,SAAK,iBAAiB;AAAA,MACpB;AAAA,MACA,MAAM,gBAAgB,EAAE,cAAc;AAAA,MACtC,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,MACZ,gBAAgB,CAAC;AAAA,MACjB,gBAAgB,CAAC;AAAA,IACnB;AAEA,SAAK,IAAI,KAAK,mBAAmB,EAAE,UAAU,CAAC;AAG9C,UAAM,oBAAoB,KAAK,sBAAsB;AACrD,WAAO,GAAG,iBAAiB;AAAA,EAC7B;AAAA;AAAA,EAGA,WAAW,SAA6D;AACtE,QAAI,KAAK,mBAAmB,QAAQ,KAAK,qBAAqB,MAAM;AAClE,aAAO,IAAI,IAAI,mBAAmB,wBAAwB,CAAC;AAAA,IAC7D;AAEA,UAAM,aAAa,gBAAgB,EAAE,IAAI,IAAI,KAAK;AAClD,UAAM,UAA0B;AAAA,MAC9B,GAAG,KAAK;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAEA,UAAM,gBAAgB,KAAK,eAAe,OAAO;AACjD,QAAI,CAAC,cAAc,GAAI,QAAO;AAE9B,SAAK,IAAI,KAAK,iBAAiB;AAAA,MAC7B,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA,gBAAgB,QAAQ,UAAU;AAAA,MAClC,YAAY,QAAQ,eAAe;AAAA,IACrC,CAAC;AAED,SAAK,iBAAiB;AACtB,SAAK,mBAAmB;AAExB,WAAO,GAAG,OAAO;AAAA,EACnB;AAAA;AAAA,EAGA,kBAA2B;AACzB,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA;AAAA,EAGA,sBAAqC;AACnC,WAAO,KAAK,gBAAgB,aAAa;AAAA,EAC3C;AAAA;AAAA,EAGA,6BAAyD;AACvD,WAAO,KAAK,gBAAgB,aAAa,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,yBAAmD;AACjD,WAAO,KAAK,gBAAgB,kBAAkB,CAAC;AAAA,EACjD;AAAA;AAAA,EAGA,0BAAoD;AAClD,WAAO,KAAK,gBAAgB,kBAAkB,CAAC;AAAA,EACjD;AAAA;AAAA,EAGA,eAAe,UAA6D;AAC1E,QAAI,KAAK,mBAAmB,MAAM;AAChC,aAAO,IAAI,IAAI,mBAAmB,wBAAwB,CAAC;AAAA,IAC7D;AAEA,UAAM,aAAa,sBAAsB,UAAU,QAAQ;AAC3D,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO;AAAA,QACL,IAAI,mBAAmB,yBAAyB;AAAA,UAC9C,QAAQ,WAAW,MAAM;AAAA,QAC3B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,UAAU,CAAC,GAAG,KAAK,eAAe,WAAW,QAAQ;AAC3D,QAAI,QAAQ,SAAS,KAAK,wBAAwB;AAChD,cAAQ,OAAO,GAAG,QAAQ,SAAS,KAAK,sBAAsB;AAC9D,WAAK,IAAI,MAAM,0BAA0B,EAAE,MAAM,KAAK,uBAAuB,CAAC;AAAA,IAChF;AACA,SAAK,iBAAiB,EAAE,GAAG,KAAK,gBAAgB,WAAW,QAAQ;AAEnE,SAAK,IAAI,MAAM,qBAAqB,EAAE,SAAS,SAAS,QAAQ,CAAC;AACjE,WAAO,GAAG,MAAS;AAAA,EACrB;AAAA;AAAA,EAGA,WAAW,MAAuD;AAChE,QAAI,KAAK,mBAAmB,MAAM;AAChC,aAAO,IAAI,IAAI,mBAAmB,wBAAwB,CAAC;AAAA,IAC7D;AAEA,UAAM,aAAa,oBAAoB,UAAU,IAAI;AACrD,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO;AAAA,QACL,IAAI,mBAAmB,qBAAqB;AAAA,UAC1C,QAAQ,WAAW,MAAM;AAAA,QAC3B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,UAAU,CAAC,GAAG,KAAK,eAAe,gBAAgB,IAAI;AAC5D,QAAI,QAAQ,SAAS,KAAK,oBAAoB;AAC5C,cAAQ,OAAO,GAAG,QAAQ,SAAS,KAAK,kBAAkB;AAC1D,WAAK,IAAI,MAAM,sBAAsB,EAAE,MAAM,KAAK,mBAAmB,CAAC;AAAA,IACxE;AACA,SAAK,iBAAiB,EAAE,GAAG,KAAK,gBAAgB,gBAAgB,QAAQ;AAExE,SAAK,IAAI,MAAM,iBAAiB,EAAE,OAAO,KAAK,MAAM,CAAC;AACrD,WAAO,GAAG,MAAS;AAAA,EACrB;AAAA;AAAA,EAGA,YAAY,OAAwD;AAClE,QAAI,KAAK,mBAAmB,MAAM;AAChC,aAAO,IAAI,IAAI,mBAAmB,wBAAwB,CAAC;AAAA,IAC7D;AAEA,UAAM,aAAa,oBAAoB,UAAU,KAAK;AACtD,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO;AAAA,QACL,IAAI,mBAAmB,sBAAsB;AAAA,UAC3C,QAAQ,WAAW,MAAM;AAAA,QAC3B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,UAAU,CAAC,GAAG,KAAK,eAAe,gBAAgB,KAAK;AAC7D,QAAI,QAAQ,SAAS,KAAK,qBAAqB;AAC7C,cAAQ,OAAO,GAAG,QAAQ,SAAS,KAAK,mBAAmB;AAC3D,WAAK,IAAI,MAAM,uBAAuB,EAAE,MAAM,KAAK,oBAAoB,CAAC;AAAA,IAC1E;AACA,SAAK,iBAAiB,EAAE,GAAG,KAAK,gBAAgB,gBAAgB,QAAQ;AAExE,SAAK,IAAI,MAAM,6BAA6B,EAAE,OAAO,MAAM,MAAM,CAAC;AAClE,WAAO,GAAG,MAAS;AAAA,EACrB;AAAA;AAAA,EAGA,aAAa,OAA2C;AACtD,SAAK,gBAAgB;AACrB,UAAM,QAAQ,KAAK,gBAAgB;AACnC,UAAM,iBAAiB,SAAS,KAAK;AAErC,UAAM,WAA6B,CAAC;AACpC,eAAW,QAAQ,MAAM,MAAM,GAAG,cAAc,GAAG;AACjD,YAAM,UAAU,KAAK,gBAAgB,IAAI;AACzC,UAAI,YAAY,MAAM;AACpB,iBAAS,KAAK,OAAO;AAAA,MACvB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,wBAAoD;AAClD,UAAM,WAAW,KAAK,aAAa;AACnC,UAAM,eAAkC,CAAC;AAEzC,eAAW,WAAW,UAAU;AAC9B,iBAAW,YAAY,QAAQ,WAAW;AACxC,YAAI,SAAS,cAAc,KAAK,wBAAwB;AACtD,uBAAa,KAAK,QAAQ;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAGA,WAAO,aACJ,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU,EAC1C,MAAM,GAAG,KAAK,qBAAqB;AAAA,EACxC;AAAA;AAAA;AAAA,EAIA,gBAAgB,OAA2C;AACzD,UAAM,WAAW,MACd,YAAY,EACZ,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC7B,UAAM,UAA6B,CAAC;AAGpC,UAAM,WAAW,KAAK,aAAa;AACnC,eAAW,WAAW,UAAU;AAC9B,iBAAW,YAAY,QAAQ,WAAW;AACxC,YAAI,gBAAgB,UAAU,QAAQ,GAAG;AACvC,kBAAQ,KAAK,QAAQ;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,mBAAmB,MAAM;AAChC,iBAAW,YAAY,KAAK,eAAe,WAAW;AACpD,YAAI,gBAAgB,UAAU,QAAQ,GAAG;AACvC,kBAAQ,KAAK,QAAQ;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAAA,EAC3D;AAAA;AAAA,EAGA,wBAAwB,QAAQ,IAA8B;AAC5D,UAAM,WAAW,KAAK,aAAa;AACnC,UAAM,SAA0B,CAAC;AAEjC,eAAW,WAAW,UAAU;AAC9B,aAAO,KAAK,GAAG,QAAQ,cAAc;AAAA,IACvC;AAEA,WAAO,OAAO,MAAM,GAAG,KAAK;AAAA,EAC9B;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,CAAI,cAAW,KAAK,SAAS,GAAG;AAClC,MAAG,aAAU,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC;AAChD,WAAK,IAAI,MAAM,4BAA4B,EAAE,MAAM,KAAK,UAAU,CAAC;AAAA,IACrE;AAAA,EACF;AAAA,EAEQ,kBAAqC;AAC3C,QAAI;AACF,YAAM,QACH,eAAY,KAAK,SAAS,EAC1B,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU,KAAK,EAAE,SAAS,OAAO,CAAC,EAC7D,KAAK,EACL,QAAQ;AACX,aAAO;AAAA,IACT,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,gBAAgB,UAAyC;AAC/D,QAAI;AACF,YAAM,WAAgB,UAAK,KAAK,WAAW,QAAQ;AACnD,YAAM,UAAa,gBAAa,UAAU,OAAO;AACjD,YAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,YAAM,aAAa,qBAAqB,UAAU,IAAI;AACtD,UAAI,WAAW,SAAS;AAEtB,eAAO,WAAW;AAAA,MACpB;AACA,WAAK,IAAI,KAAK,wBAAwB,EAAE,UAAU,QAAQ,WAAW,MAAM,OAAO,CAAC;AACnF,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,IAAI,KAAK,+BAA+B,EAAE,UAAU,MAAM,CAAC;AAChE,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,eAAe,SAA2D;AAChF,QAAI;AACF,WAAK,gBAAgB;AAErB,YAAM,gBAAgB,QAAQ,UAAU,QAAQ,kBAAkB,GAAG,EAAE,MAAM,GAAG,EAAE;AAClF,YAAM,YAAY,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE;AACrD,YAAM,WAAW,WAAW,QAAQ,IAAI,IAAI,aAAa,IAAI,SAAS;AACtE,YAAM,WAAgB,UAAK,KAAK,WAAW,QAAQ;AACnD,YAAM,UAAU,KAAK,UAAU,SAAS,MAAM,CAAC;AAC/C,MAAG,iBAAc,UAAU,SAAS,OAAO;AAC3C,WAAK,IAAI,MAAM,qBAAqB,EAAE,SAAS,CAAC;AAChD,WAAK,wBAAwB;AAC7B,aAAO,GAAG,MAAS;AAAA,IACrB,SAAS,OAAO;AACd,YAAM,UAAU,gBAAgB,KAAK;AACrC,aAAO,IAAI,IAAI,mBAAmB,8BAA8B,OAAO,EAAE,CAAC;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA,EAGQ,0BAAgC;AACtC,QAAI;AACF,YAAM,QAAQ,KAAK,gBAAgB;AACnC,UAAI,MAAM,UAAU,KAAK,gBAAiB;AAC1C,YAAM,WAAW,MAAM,MAAM,KAAK,eAAe;AACjD,iBAAW,QAAQ,UAAU;AAC3B,QAAG,cAAgB,UAAK,KAAK,WAAW,IAAI,CAAC;AAAA,MAC/C;AACA,WAAK,IAAI,KAAK,8BAA8B;AAAA,QAC1C,MAAM,KAAK;AAAA,QACX,SAAS,SAAS;AAAA,MACpB,CAAC;AAAA,IACH,SAAS,OAAgB;AACvB,WAAK,IAAI,MAAM,oCAAoC;AAAA,QACjD,OAAO,gBAAgB,KAAK;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAGA,SAAS,gBAAgB,UAA2B,UAAsC;AACxF,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,QAAM,OAAO,GAAG,SAAS,OAAO,IAAI,SAAS,OAAO,GAAG,YAAY;AACnE,SAAO,SAAS,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AAC/C;AAGO,SAAS,oBACd,WACA,QACe;AACf,SAAO,IAAI,cAAc;AAAA,IACvB;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACH;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getTimeProvider
3
- } from "./chunk-AVYTX7JQ.js";
3
+ } from "./chunk-6OPLDOJG.js";
4
4
 
5
5
  // src/security/audit-trail.ts
6
6
  var MAX_EVENTS = 1e4;
@@ -205,4 +205,4 @@ export {
205
205
  createGraphAuditBridge,
206
206
  createAuditTrail
207
207
  };
208
- //# sourceMappingURL=chunk-ZSNWRX2B.js.map
208
+ //# sourceMappingURL=chunk-OOGKQTDN.js.map
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-6T3EPABN.js";
6
6
  import {
7
7
  SessionMemory
8
- } from "./chunk-Q225TVYP.js";
8
+ } from "./chunk-OCFY37TZ.js";
9
9
  import {
10
10
  StatsOnlyAdapter,
11
11
  ensureSharedMemoryRegistry
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-KSQSWEFH.js";
16
16
  import {
17
17
  generateId
18
- } from "./chunk-SZ6J4YY7.js";
18
+ } from "./chunk-AS4B7KCT.js";
19
19
  import {
20
20
  ErrorCode,
21
21
  NexusError,
@@ -28,7 +28,7 @@ import {
28
28
  getTimeProvider,
29
29
  ok,
30
30
  setSharedMobiMemDbPathResolver
31
- } from "./chunk-AVYTX7JQ.js";
31
+ } from "./chunk-6OPLDOJG.js";
32
32
  import {
33
33
  nexusDataPath
34
34
  } from "./chunk-OGHEKPLD.js";
@@ -5095,6 +5095,20 @@ var ToolMemoryManager = class {
5095
5095
  getRecentErrorSolutions(limit) {
5096
5096
  return this.memory.getRecentErrorSolutions(limit);
5097
5097
  }
5098
+ /**
5099
+ * Live session counts for `memory_stats` (#5269).
5100
+ *
5101
+ * These were reported as a hardcoded `0` beside `session: true`, so a caller
5102
+ * read "session memory is healthy and holds 0 tasks, 0 errors" — the backend
5103
+ * assertion corroborating the fabricated zeros. The episode has held both all
5104
+ * along; nothing exposed them before `endSession`.
5105
+ */
5106
+ getSessionCounts() {
5107
+ return {
5108
+ tasksCount: this.memory.getCurrentSessionTasks().length,
5109
+ errorsCount: this.memory.getCurrentSessionErrors().length
5110
+ };
5111
+ }
5098
5112
  /**
5099
5113
  * Retrieve past learnings relevant to a task description.
5100
5114
  * Searches by keywords, falls back to highest-confidence learnings.
@@ -5608,4 +5622,4 @@ export {
5608
5622
  reinitializeMemoryBackends,
5609
5623
  ToolMemoryManager
5610
5624
  };
5611
- //# sourceMappingURL=chunk-VS2DUTJ5.js.map
5625
+ //# sourceMappingURL=chunk-P7IHQSCC.js.map