loopforge 3.9.2 → 4.0.7

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 (285) hide show
  1. package/README.md +236 -112
  2. package/dist/audit.d.ts +73 -15
  3. package/dist/audit.d.ts.map +1 -1
  4. package/dist/audit.js +131 -61
  5. package/dist/audit.js.map +1 -1
  6. package/dist/canonical-state.d.ts +152 -40
  7. package/dist/canonical-state.d.ts.map +1 -1
  8. package/dist/canonical-state.js +382 -206
  9. package/dist/canonical-state.js.map +1 -1
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +41 -12
  12. package/dist/cli.js.map +1 -1
  13. package/dist/cognitive-governance.d.ts +0 -2
  14. package/dist/cognitive-governance.d.ts.map +1 -1
  15. package/dist/cognitive-governance.js +0 -4
  16. package/dist/cognitive-governance.js.map +1 -1
  17. package/dist/committed-round.d.ts +105 -141
  18. package/dist/committed-round.d.ts.map +1 -1
  19. package/dist/committed-round.js +249 -372
  20. package/dist/committed-round.js.map +1 -1
  21. package/dist/constraint-lifecycle.d.ts +73 -0
  22. package/dist/constraint-lifecycle.d.ts.map +1 -0
  23. package/dist/constraint-lifecycle.js +174 -0
  24. package/dist/constraint-lifecycle.js.map +1 -0
  25. package/dist/context-boundary.d.ts +83 -0
  26. package/dist/context-boundary.d.ts.map +1 -0
  27. package/dist/context-boundary.js +101 -0
  28. package/dist/context-boundary.js.map +1 -0
  29. package/dist/contract-items.d.ts +12 -8
  30. package/dist/contract-items.d.ts.map +1 -1
  31. package/dist/contract-items.js +31 -26
  32. package/dist/contract-items.js.map +1 -1
  33. package/dist/contract-requirement.d.ts +47 -0
  34. package/dist/contract-requirement.d.ts.map +1 -0
  35. package/dist/contract-requirement.js +51 -0
  36. package/dist/contract-requirement.js.map +1 -0
  37. package/dist/criterion-status.d.ts +35 -0
  38. package/dist/criterion-status.d.ts.map +1 -0
  39. package/dist/criterion-status.js +89 -0
  40. package/dist/criterion-status.js.map +1 -0
  41. package/dist/enforcement-gate.d.ts +32 -67
  42. package/dist/enforcement-gate.d.ts.map +1 -1
  43. package/dist/enforcement-gate.js +203 -439
  44. package/dist/enforcement-gate.js.map +1 -1
  45. package/dist/engine.d.ts +9 -103
  46. package/dist/engine.d.ts.map +1 -1
  47. package/dist/engine.js +28 -887
  48. package/dist/engine.js.map +1 -1
  49. package/dist/errors.d.ts +41 -0
  50. package/dist/errors.d.ts.map +1 -0
  51. package/dist/errors.js +69 -0
  52. package/dist/errors.js.map +1 -0
  53. package/dist/evidence-claims.d.ts +33 -31
  54. package/dist/evidence-claims.d.ts.map +1 -1
  55. package/dist/evidence-claims.js +58 -72
  56. package/dist/evidence-claims.js.map +1 -1
  57. package/dist/evidence-posture-view.d.ts +19 -0
  58. package/dist/evidence-posture-view.d.ts.map +1 -0
  59. package/dist/evidence-posture-view.js +116 -0
  60. package/dist/evidence-posture-view.js.map +1 -0
  61. package/dist/evidence-posture.d.ts +73 -0
  62. package/dist/evidence-posture.d.ts.map +1 -0
  63. package/dist/evidence-posture.js +281 -0
  64. package/dist/evidence-posture.js.map +1 -0
  65. package/dist/evidence-provider.d.ts +55 -37
  66. package/dist/evidence-provider.d.ts.map +1 -1
  67. package/dist/evidence-provider.js +182 -332
  68. package/dist/evidence-provider.js.map +1 -1
  69. package/dist/explain.d.ts +167 -27
  70. package/dist/explain.d.ts.map +1 -1
  71. package/dist/explain.js +373 -58
  72. package/dist/explain.js.map +1 -1
  73. package/dist/field-accounting.d.ts.map +1 -1
  74. package/dist/field-accounting.js +3 -22
  75. package/dist/field-accounting.js.map +1 -1
  76. package/dist/generate-schema.js +13 -8
  77. package/dist/generate-schema.js.map +1 -1
  78. package/dist/git-boundary.d.ts +128 -0
  79. package/dist/git-boundary.d.ts.map +1 -0
  80. package/dist/git-boundary.js +625 -0
  81. package/dist/git-boundary.js.map +1 -0
  82. package/dist/git-facts.d.ts +22 -0
  83. package/dist/git-facts.d.ts.map +1 -0
  84. package/dist/git-facts.js +29 -0
  85. package/dist/git-facts.js.map +1 -0
  86. package/dist/git-motion.d.ts +37 -0
  87. package/dist/git-motion.d.ts.map +1 -0
  88. package/dist/git-motion.js +59 -0
  89. package/dist/git-motion.js.map +1 -0
  90. package/dist/history.d.ts +44 -0
  91. package/dist/history.d.ts.map +1 -0
  92. package/dist/history.js +77 -0
  93. package/dist/history.js.map +1 -0
  94. package/dist/index.d.ts +19 -9
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +12 -4
  97. package/dist/index.js.map +1 -1
  98. package/dist/init.d.ts +16 -0
  99. package/dist/init.d.ts.map +1 -1
  100. package/dist/init.js +80 -14
  101. package/dist/init.js.map +1 -1
  102. package/dist/loop-compiler.d.ts +51 -19
  103. package/dist/loop-compiler.d.ts.map +1 -1
  104. package/dist/loop-compiler.js +423 -507
  105. package/dist/loop-compiler.js.map +1 -1
  106. package/dist/loop-store.d.ts +6 -5
  107. package/dist/loop-store.d.ts.map +1 -1
  108. package/dist/loop-store.js +153 -35
  109. package/dist/loop-store.js.map +1 -1
  110. package/dist/mcp/round-lifecycle.d.ts +285 -81
  111. package/dist/mcp/round-lifecycle.d.ts.map +1 -1
  112. package/dist/mcp/round-lifecycle.js +1629 -574
  113. package/dist/mcp/round-lifecycle.js.map +1 -1
  114. package/dist/mcp/server.d.ts +5 -0
  115. package/dist/mcp/server.d.ts.map +1 -1
  116. package/dist/mcp/server.js +61 -19
  117. package/dist/mcp/server.js.map +1 -1
  118. package/dist/mcp/session.d.ts +81 -39
  119. package/dist/mcp/session.d.ts.map +1 -1
  120. package/dist/mcp/session.js +963 -271
  121. package/dist/mcp/session.js.map +1 -1
  122. package/dist/mcp/submission-boundary.d.ts +23 -31
  123. package/dist/mcp/submission-boundary.d.ts.map +1 -1
  124. package/dist/mcp/submission-boundary.js +242 -82
  125. package/dist/mcp/submission-boundary.js.map +1 -1
  126. package/dist/mcp/submission-handle.d.ts +66 -0
  127. package/dist/mcp/submission-handle.d.ts.map +1 -0
  128. package/dist/mcp/submission-handle.js +173 -0
  129. package/dist/mcp/submission-handle.js.map +1 -0
  130. package/dist/mcp/tools.d.ts +17 -7
  131. package/dist/mcp/tools.d.ts.map +1 -1
  132. package/dist/mcp/tools.js +763 -244
  133. package/dist/mcp/tools.js.map +1 -1
  134. package/dist/open-question.d.ts +7 -0
  135. package/dist/open-question.d.ts.map +1 -0
  136. package/dist/open-question.js +14 -0
  137. package/dist/open-question.js.map +1 -0
  138. package/dist/policy-metrics.d.ts +31 -21
  139. package/dist/policy-metrics.d.ts.map +1 -1
  140. package/dist/policy-metrics.js +117 -64
  141. package/dist/policy-metrics.js.map +1 -1
  142. package/dist/policy.d.ts +15 -40
  143. package/dist/policy.d.ts.map +1 -1
  144. package/dist/policy.js +13 -13
  145. package/dist/policy.js.map +1 -1
  146. package/dist/progress.d.ts +45 -0
  147. package/dist/progress.d.ts.map +1 -0
  148. package/dist/progress.js +136 -0
  149. package/dist/progress.js.map +1 -0
  150. package/dist/prompt-assembler.d.ts +28 -9
  151. package/dist/prompt-assembler.d.ts.map +1 -1
  152. package/dist/prompt-assembler.js +592 -603
  153. package/dist/prompt-assembler.js.map +1 -1
  154. package/dist/prompt-coverage.d.ts +39 -0
  155. package/dist/prompt-coverage.d.ts.map +1 -0
  156. package/dist/prompt-coverage.js +80 -0
  157. package/dist/prompt-coverage.js.map +1 -0
  158. package/dist/prompt-freshness.d.ts +25 -0
  159. package/dist/prompt-freshness.d.ts.map +1 -0
  160. package/dist/prompt-freshness.js +88 -0
  161. package/dist/prompt-freshness.js.map +1 -0
  162. package/dist/prompt-policy.d.ts +14 -4
  163. package/dist/prompt-policy.d.ts.map +1 -1
  164. package/dist/prompt-policy.js +29 -10
  165. package/dist/prompt-policy.js.map +1 -1
  166. package/dist/protocol.d.ts +875 -419
  167. package/dist/protocol.d.ts.map +1 -1
  168. package/dist/protocol.js +73 -99
  169. package/dist/protocol.js.map +1 -1
  170. package/dist/recovery-guidance.d.ts +13 -0
  171. package/dist/recovery-guidance.d.ts.map +1 -0
  172. package/dist/recovery-guidance.js +15 -0
  173. package/dist/recovery-guidance.js.map +1 -0
  174. package/dist/recovery.d.ts +68 -0
  175. package/dist/recovery.d.ts.map +1 -0
  176. package/dist/recovery.js +234 -0
  177. package/dist/recovery.js.map +1 -0
  178. package/dist/replay.d.ts +42 -8
  179. package/dist/replay.d.ts.map +1 -1
  180. package/dist/replay.js +311 -84
  181. package/dist/replay.js.map +1 -1
  182. package/dist/result-facts.d.ts +45 -0
  183. package/dist/result-facts.d.ts.map +1 -0
  184. package/dist/result-facts.js +86 -0
  185. package/dist/result-facts.js.map +1 -0
  186. package/dist/round-contract.d.ts +38 -8
  187. package/dist/round-contract.d.ts.map +1 -1
  188. package/dist/round-contract.js +71 -31
  189. package/dist/round-contract.js.map +1 -1
  190. package/dist/round-coordinator.d.ts +45 -91
  191. package/dist/round-coordinator.d.ts.map +1 -1
  192. package/dist/round-coordinator.js +254 -271
  193. package/dist/round-coordinator.js.map +1 -1
  194. package/dist/round-driver.d.ts +56 -16
  195. package/dist/round-driver.d.ts.map +1 -1
  196. package/dist/round-driver.js +225 -39
  197. package/dist/round-driver.js.map +1 -1
  198. package/dist/round-facts.d.ts +33 -52
  199. package/dist/round-facts.d.ts.map +1 -1
  200. package/dist/round-facts.js +54 -157
  201. package/dist/round-facts.js.map +1 -1
  202. package/dist/round-guidance.d.ts +56 -0
  203. package/dist/round-guidance.d.ts.map +1 -0
  204. package/dist/round-guidance.js +161 -0
  205. package/dist/round-guidance.js.map +1 -0
  206. package/dist/round-outcome.d.ts +21 -0
  207. package/dist/round-outcome.d.ts.map +1 -0
  208. package/dist/round-outcome.js +31 -0
  209. package/dist/round-outcome.js.map +1 -0
  210. package/dist/round-transaction.d.ts +168 -21
  211. package/dist/round-transaction.d.ts.map +1 -1
  212. package/dist/round-transaction.js +856 -39
  213. package/dist/round-transaction.js.map +1 -1
  214. package/dist/self-eval.d.ts +40 -60
  215. package/dist/self-eval.d.ts.map +1 -1
  216. package/dist/self-eval.js +455 -384
  217. package/dist/self-eval.js.map +1 -1
  218. package/dist/storage.d.ts +16 -0
  219. package/dist/storage.d.ts.map +1 -1
  220. package/dist/storage.js +54 -4
  221. package/dist/storage.js.map +1 -1
  222. package/dist/subgoal-state.d.ts +2 -3
  223. package/dist/subgoal-state.d.ts.map +1 -1
  224. package/dist/subgoal-state.js +2 -3
  225. package/dist/subgoal-state.js.map +1 -1
  226. package/dist/submission-guidance.d.ts +43 -21
  227. package/dist/submission-guidance.d.ts.map +1 -1
  228. package/dist/submission-guidance.js +368 -262
  229. package/dist/submission-guidance.js.map +1 -1
  230. package/dist/submission-receipt.d.ts +16 -8
  231. package/dist/submission-receipt.d.ts.map +1 -1
  232. package/dist/submission-receipt.js +146 -51
  233. package/dist/submission-receipt.js.map +1 -1
  234. package/dist/token-utils.d.ts +47 -7
  235. package/dist/token-utils.d.ts.map +1 -1
  236. package/dist/token-utils.js +66 -15
  237. package/dist/token-utils.js.map +1 -1
  238. package/dist/transaction-identity.d.ts +9 -0
  239. package/dist/transaction-identity.d.ts.map +1 -0
  240. package/dist/transaction-identity.js +69 -0
  241. package/dist/transaction-identity.js.map +1 -0
  242. package/dist/verification-actions.d.ts +13 -0
  243. package/dist/verification-actions.d.ts.map +1 -0
  244. package/dist/verification-actions.js +44 -0
  245. package/dist/verification-actions.js.map +1 -0
  246. package/dist/verification-gate.d.ts +26 -46
  247. package/dist/verification-gate.d.ts.map +1 -1
  248. package/dist/verification-gate.js +218 -427
  249. package/dist/verification-gate.js.map +1 -1
  250. package/dist/version.d.ts +1 -1
  251. package/dist/version.js +1 -1
  252. package/dist/working-memory.d.ts +187 -0
  253. package/dist/working-memory.d.ts.map +1 -0
  254. package/dist/working-memory.js +767 -0
  255. package/dist/working-memory.js.map +1 -0
  256. package/dist/workspace-checkpoint.d.ts +88 -0
  257. package/dist/workspace-checkpoint.d.ts.map +1 -0
  258. package/dist/workspace-checkpoint.js +326 -0
  259. package/dist/workspace-checkpoint.js.map +1 -0
  260. package/dist/workspace-restore.d.ts +68 -0
  261. package/dist/workspace-restore.d.ts.map +1 -0
  262. package/dist/workspace-restore.js +604 -0
  263. package/dist/workspace-restore.js.map +1 -0
  264. package/dist/workspace.d.ts +0 -9
  265. package/dist/workspace.d.ts.map +1 -1
  266. package/dist/workspace.js +0 -17
  267. package/dist/workspace.js.map +1 -1
  268. package/loop_policy.json +5 -19
  269. package/package.json +2 -2
  270. package/skills/forge/SKILL.md +212 -0
  271. package/skills/forge/references/evidence-and-contracts.md +204 -0
  272. package/skills/forge/references/recovery-and-views.md +188 -0
  273. package/dist/cognitive-facts.d.ts +0 -30
  274. package/dist/cognitive-facts.d.ts.map +0 -1
  275. package/dist/cognitive-facts.js +0 -113
  276. package/dist/cognitive-facts.js.map +0 -1
  277. package/dist/loop-extras-parser.d.ts +0 -81
  278. package/dist/loop-extras-parser.d.ts.map +0 -1
  279. package/dist/loop-extras-parser.js +0 -213
  280. package/dist/loop-extras-parser.js.map +0 -1
  281. package/dist/loop-projection.d.ts +0 -6
  282. package/dist/loop-projection.d.ts.map +0 -1
  283. package/dist/loop-projection.js +0 -28
  284. package/dist/loop-projection.js.map +0 -1
  285. package/skills/perception/SKILL.md +0 -370
@@ -13,12 +13,14 @@
13
13
  * SessionManager → RoundDriver → RoundCoordinator path.
14
14
  */
15
15
  import type { GateActionDescriptor } from "../protocol.js";
16
- import type { ExternalContextProvider, LoopTerminalSink, SubmissionGuidance, SubmissionReceipt } from "../protocol.js";
16
+ import type { LoopTerminalSink, SubmissionGuidance, SubmissionHandle, SubmissionReceipt } from "../protocol.js";
17
17
  import type { ActiveContractView } from "../round-contract.js";
18
+ import type { ReplayPage, ReplayWindowOptions } from "../replay.js";
18
19
  import type { LoopStore } from "../loop-store.js";
20
+ import { FileWorkspaceCheckpointStore } from "../workspace-checkpoint.js";
19
21
  import type { PolicyMetricsSnapshot } from "../policy-metrics.js";
20
22
  import type { SessionStateStore } from "../storage.js";
21
- import type { McpSession, McpSessionSummary, StartInput, AdvanceResult, SessionRegistry } from "./round-lifecycle.js";
23
+ import type { McpSession, McpSessionSummary, StartInput, AdvanceResult, InvocationInputs, ResumeInputs, SessionRegistry } from "./round-lifecycle.js";
22
24
  export type { McpSession, McpSessionSummary, StartInput, AdvanceResult, } from "./round-lifecycle.js";
23
25
  export declare class SessionManager implements SessionRegistry {
24
26
  private sessions;
@@ -31,10 +33,9 @@ export declare class SessionManager implements SessionRegistry {
31
33
  private readonly leaseRenewIntervalMs;
32
34
  private leaseTimer;
33
35
  private readonly lifecycle;
34
- /** Explicit context provider; never auto-discovered. */
35
- contextProvider?: ExternalContextProvider;
36
36
  private readonly terminalSinks;
37
- constructor(store?: LoopStore, sessionStore?: SessionStateStore);
37
+ private readonly checkpointStoreFor;
38
+ constructor(store?: LoopStore, sessionStore?: SessionStateStore, checkpointStoreFor?: (loopId: string) => FileWorkspaceCheckpointStore | undefined);
38
39
  /** Stable process-local owner token used for cross-process session leases. */
39
40
  getOwnerId(): string;
40
41
  addTerminalSink(sink: LoopTerminalSink): () => void;
@@ -44,6 +45,10 @@ export declare class SessionManager implements SessionRegistry {
44
45
  /** Register (or replace) a session in the in-memory registry. */
45
46
  upsert(session: McpSession): void;
46
47
  private findSessionEntry;
48
+ /** Whether the loop already has durable round history. A lineage-only round
49
+ * document from a failed start is NOT history and must remain retryable;
50
+ * only a committed feedback envelope counts. */
51
+ private hasCommittedRounds;
47
52
  private claimSessionEntry;
48
53
  private renewSessionLease;
49
54
  private renewOwnedLeases;
@@ -53,11 +58,23 @@ export declare class SessionManager implements SessionRegistry {
53
58
  /** v3.9.1: current-fact submission guidance for the session's held round.
54
59
  * Read-only projection; null when the session is unknown. */
55
60
  getSubmissionGuidance(sessionId: string): SubmissionGuidance | null;
56
- /** v3.9.1: the most recent committed round's receipt, rebuilt from the
57
- * transaction + shared read model. Rejected/terminated attempts are not in
58
- * history; their receipt exists only on their own response. */
59
- getLastSubmissionReceipt(sessionId: string): SubmissionReceipt | null;
61
+ /** v4.0.0: the current held handle, derived on demand. A read-only
62
+ * projection; never persisted. */
63
+ getSubmissionHandle(sessionId: string): SubmissionHandle | null;
64
+ /** v3.9.1: the most recent committed round's receipt for a loop, rebuilt
65
+ * from committed history. Rejected/terminated attempts are not history;
66
+ * their receipt exists only on their own response. This intentionally takes
67
+ * the durable loopId: it never reads live-session state. */
68
+ getLastSubmissionReceiptByLoopId(loopId: string): SubmissionReceipt | null;
69
+ /** v4.0.3: the machine-backed success trajectory is a projection of
70
+ * committed branch rounds, not a session counter. Unbacked claims never
71
+ * enter it. */
72
+ getMachineBackedSuccessTrajectory(loopId: string): boolean[];
60
73
  get(sessionId: string): McpSession | undefined;
74
+ /** Resolve a live session by its durable loop identity. `create` rejects a
75
+ * second live session for the same loop, so the scan is unambiguous. A
76
+ * persisted-only loop has no live session: call `resume` to rebuild it. */
77
+ getByLoopId(loopId: string): McpSession | undefined;
61
78
  getLeaseStatus(loopId: string): Record<string, unknown> | null;
62
79
  delete(sessionId: string): boolean;
63
80
  /** v1.18: Pause a running session. The session state is persisted to
@@ -75,11 +92,11 @@ export declare class SessionManager implements SessionRegistry {
75
92
  * Reconstructs the session and compiles the prompt for the next round
76
93
  * (async — compilation collects evidence through RoundDriver.prepare).
77
94
  * Returns null if no session_state entry exists for this loopId. */
78
- resume(loopId: string): Promise<AdvanceResult | null>;
95
+ resume(loopId: string, inputs?: ResumeInputs): Promise<AdvanceResult | null>;
79
96
  /** v1.18: Resume a paused session. Reconstructs from vault state and
80
97
  * compiles the next prompt. Returns null if no paused session exists
81
98
  * for this loopId. */
82
- unpause(loopId: string): Promise<AdvanceResult | null>;
99
+ unpause(loopId: string, inputs?: ResumeInputs): Promise<AdvanceResult | null>;
83
100
  /** Auto-resume all "running" sessions from vault on server startup.
84
101
  * Scans vault for session_state entries, reconstructs each as an in-memory
85
102
  * McpSession (without compiling — the next loopforge_next will do that).
@@ -90,6 +107,8 @@ export declare class SessionManager implements SessionRegistry {
90
107
  * user_required actions are recorded — agent_allowed needs no human
91
108
  * authorization and opens no record. */
92
109
  private recordOpenedGate;
110
+ private gateInvalidResult;
111
+ private gateLeaseConflictResult;
93
112
  /** v3.7.1: structured gate preflight. The agent submits a
94
113
  * GateActionDescriptor; the runtime classifies it (conservative:
95
114
  * anything not provably safe is user_required with reason codes). A
@@ -97,7 +116,7 @@ export declare class SessionManager implements SessionRegistry {
97
116
  * loop + round + actionHash; agent_allowed records nothing and returns
98
117
  * the evidence suggestion instead. No action is executed and no round
99
118
  * advances from this call. */
100
- checkGate(sessionId: string, roundId: string, action: GateActionDescriptor): Record<string, unknown>;
119
+ checkGate(handle: unknown, action: GateActionDescriptor): Promise<Record<string, unknown>>;
101
120
  /** Record a user decision for a recorded gate. The gateId embeds the
102
121
  * canonicalized action hash — if the action changed, the match fails and
103
122
  * the old approval expires automatically. */
@@ -108,10 +127,14 @@ export declare class SessionManager implements SessionRegistry {
108
127
  * the runtime's submission boundary reads the same context (the sub-goal
109
128
  * reference space is exactly the compiled set the prompt carried), and two
110
129
  * copies would let the projection and the boundary disagree about it. */
111
- private compileContext;
112
- /** Typed cognitive state projection for an active session. Derived on
113
- * demand — zero persistence. Null when nothing meaningful exists yet. */
114
- getProjection(sessionId: string): Record<string, unknown> | null;
130
+ /** v4.0.4: read-only terminal summary of a persisted STOPPED loop.
131
+ *
132
+ * Returns null unless the persisted session status is exactly "stopped":
133
+ * a running/paused/stalled loop without a live session must still go
134
+ * through `loopforge_resume`, so "no live session" is never mistaken for
135
+ * "already stopped". It never claims a lease, saves a session or writes
136
+ * history; the committed view supplies every field. */
137
+ getStoppedLoopSummary(loopId: string): AdvanceResult | null;
115
138
  /** v3.8: Read-only per-round "why" view over committed facts. Never
116
139
  * rebuilds history and never writes. */
117
140
  getExplain(loopId: string, round?: number): Record<string, unknown>;
@@ -137,31 +160,43 @@ export declare class SessionManager implements SessionRegistry {
137
160
  * `strategy_stability` was a literal `true`. What remains is counted
138
161
  * directly from committed round flags. */
139
162
  getHealth(loopId: string): Record<string, unknown> | null;
163
+ /** v4.0.0: the stable result for a missing/malformed handle. */
164
+ private handleRequiredResult;
165
+ private sessionNotFoundResult;
166
+ private sessionStateResult;
167
+ /** v4.0.0: one stored-prompt re-delivery for next/recover. A held prompt is
168
+ * returned with the current handle and a warning; without one, the stable
169
+ * mismatch error carries the current handle when it exists. */
170
+ private handleMismatchResult;
171
+ /** v4.0.0: the checkpoint variant: never re-deliver a prompt, never create a
172
+ * checkpoint. The current handle rides the error for re-anchoring. */
173
+ private checkpointMismatchResult;
174
+ /** v3.9.7: a pending rollback directive whose restore is not yet verified.
175
+ * Read-only; used before the queue/lease so a stale handle cannot mask the
176
+ * "call resume" recovery UX. */
177
+ private restorePendingResult;
140
178
  /** Core cycle: extract self-eval → record feedback → check stop → compile next.
141
- * The lease + per-session queue wrap the RoundLifecycle state machine.
142
- * @param preExtractedEval Structured SelfEvaluation supplied by the caller.
143
- * An absent value is returned as evaluation_invalid without mutating state.
144
- * @param roundId v3.0.1: The roundId of the round this submission reports on
145
- * (from the last start/next/resume response). Anchors the submission so a
146
- * stale or duplicate submission is not processed against a later round.
147
- * Optional for library callers — when absent the anchor check is skipped. */
148
- /** \`submission\` is the RAW evaluation payload, not a built one.
149
- *
150
- * v3.8.1: this method used to carry a partial copy of the submission
151
- * boundary (an object check plus core-field validation) while the MCP tool
152
- * handler carried the rest — one rule, three copies, across two layers.
153
- * The boundary now lives entirely in the runtime
154
- * (`RoundLifecycle.submissionBoundary`), so every caller — this manager, a
155
- * library user, a future CLI command — gets the same strictness. */
156
- /** \`submission\` is the RAW evaluation payload, not a built one.
157
179
  *
158
- * v3.8.1: this method used to carry a partial copy of the submission
159
- * boundary (an object check plus core-field validation) while the MCP tool
160
- * handler carried the rest — one rule, three copies, across two layers.
161
- * The whole boundary now runs HERE, before the queue and before the lease
162
- * heartbeat, so every caller of the public API gets it and a rejected
163
- * payload leaves nothing durable behind. */
164
- advance(sessionId: string, output: string, submission?: unknown, roundId?: string): Promise<AdvanceResult>;
180
+ * v4.0.0: the caller supplies the ONE `submissionHandle`; identity is
181
+ * checked before the payload boundary and before the queue/lease heartbeat.
182
+ * `submission` is the RAW evaluation payload. The whole payload boundary
183
+ * still runs here, so every public caller gets the same strictness. */
184
+ advance(handle: unknown, output: string, submission?: unknown, inputs?: InvocationInputs): Promise<AdvanceResult>;
185
+ /** v4.0.5: recompile the held prompt for a new host-provided instruction.
186
+ * This does NOT submit an evaluation or advance the round: the exact held
187
+ * handle is required, and the same round/attempt/context boundary is
188
+ * preserved. The handle is re-checked inside the queue before the lease is
189
+ * renewed, so a stale handle has zero side effects. */
190
+ recompileHeld(handle: unknown, instruction: string): Promise<AdvanceResult>;
191
+ /** v3.9.7: submit an Agent-initiated recovery. v4.0.0: the handle is the
192
+ * only anchor; shape and target visibility are checked before the
193
+ * queue/lease, and the exact handle is re-checked before lease renewal. */
194
+ recover(handle: unknown, recovery: unknown, inputs?: InvocationInputs): Promise<AdvanceResult>;
195
+ private recoveryDisabledResult;
196
+ /** v3.9.7: Agent-created mid-round savepoint. v4.0.0: handle identity is
197
+ * checked before the queue and again before lease renewal; capture/save
198
+ * happen only after both. A checkpoint never changes the handle. */
199
+ checkpoint(handle: unknown): Promise<Record<string, unknown>>;
165
200
  /** Replay timeline for a session — creates ReplayBackend from the stored backend. */
166
201
  replayTimeline(sessionId: string): Record<string, unknown>[] | null;
167
202
  /** v3.3.1: Replay a loop straight from the vault — no in-memory session
@@ -171,6 +206,13 @@ export declare class SessionManager implements SessionRegistry {
171
206
  * made every vault loop unreplayable after restart.
172
207
  * Returns null when the loop has no committed rounds. */
173
208
  replayByLoop(loopId: string): Record<string, unknown>[] | null;
209
+ /** v4.0.2: a bounded replay page with its window metadata. `null` only when
210
+ * the session does not exist; an empty loop returns an empty page. */
211
+ replayPage(sessionId: string, opts?: ReplayWindowOptions): ReplayPage | null;
212
+ replayPageByLoop(loopId: string, opts?: ReplayWindowOptions): ReplayPage;
213
+ /** v3.9.6: committed rollback directives for the replay view. They are
214
+ * events, not normal rounds; the timeline stays a normal-round projection. */
215
+ replayRollbacks(loopId: string): Record<string, unknown>[];
174
216
  /** v3.9.1: unsupported envelope versions for a loop, reported explicitly
175
217
  * rather than silently dropped from replay/audit. */
176
218
  replayLegacyRounds(loopId: string): Array<{
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/mcp/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAWH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EACV,uBAAuB,EAEvB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AAUxB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAK/D,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,kBAAkB,CAAC;AAS9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAKlE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAS9B,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,aAAa,GACd,MAAM,sBAAsB,CAAC;AAI9B,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,QAAQ,CAAiC;IACjD,qDAAqD;IACrD,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,wDAAwD;IACxD,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+B;gBAG3D,KAAK,CAAC,EAAE,SAAS,EACjB,YAAY,CAAC,EAAE,iBAAiB;IA4BlC,8EAA8E;IAC9E,UAAU,IAAI,MAAM;IAIpB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,IAAI;IAKnD,yDAAyD;IACzD,KAAK,IAAI,IAAI;IAUb,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC;IAI9B,iEAAiE;IACjE,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAMjC,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,mBAAmB;YAcb,gBAAgB;IAyBxB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAuIvD;kEAC8D;IAC9D,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAKnE;;oEAEgE;IAChE,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAgBrE,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI9C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAoB9D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAiBlC;;2EAEuE;IACvE,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAgB9E;8EAC0E;IAC1E,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAI/B;;;yEAGqE;IAC/D,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA8B3D;;2BAEuB;IACjB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAoB5D;;;kDAG8C;IAC9C,aAAa,IAAI,MAAM;IA4CvB,IAAI,IAAI,iBAAiB,EAAE;IAsC3B;;6CAEyC;IACzC,OAAO,CAAC,gBAAgB;IAwBxB;;;;;;mCAM+B;IAC/B,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,oBAAoB,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IA8C1B;;kDAE8C;IAC9C,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,OAAO,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IA4I1B;;;;;8EAK0E;IAC1E,OAAO,CAAC,cAAc;IAItB;8EAC0E;IAC1E,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAqChE;6CACyC;IACzC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAUnE,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAqBxD;;;gDAG4C;IAC5C,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAO/D;;2EAEuE;IACvE,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB;IAiBvD;;;;;;;;;+CAS2C;IAC3C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA0BzD;;;;;;;oFAOgF;IAChF;;;;;;;yEAOqE;IACrE;;;;;;;iDAO6C;IACvC,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,OAAO,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC;IAiDzB,qFAAqF;IACrF,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI;IAOnE;;;;;8DAK0D;IAC1D,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI;IAO9D;0DACsD;IACtD,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;QACxC,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CAIH"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/mcp/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAWH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAI/D,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,kBAAkB,CAAC;AAK9D,OAAO,EAGL,4BAA4B,EAC7B,MAAM,4BAA4B,CAAC;AAgBpC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAKlE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAUvD,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAc9B,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,aAAa,GACd,MAAM,sBAAsB,CAAC;AAI9B,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,QAAQ,CAAiC;IACjD,qDAAqD;IACrD,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+B;IAC7D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAErB;gBAGZ,KAAK,CAAC,EAAE,SAAS,EACjB,YAAY,CAAC,EAAE,iBAAiB,EAChC,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,4BAA4B,GAAG,SAAS;IA+CnF,8EAA8E;IAC9E,UAAU,IAAI,MAAM;IAIpB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,IAAI;IAKnD,yDAAyD;IACzD,KAAK,IAAI,IAAI;IAUb,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC;IAI9B,iEAAiE;IACjE,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAMjC,OAAO,CAAC,gBAAgB;IAIxB;;qDAEiD;IACjD,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,mBAAmB;YAsBb,gBAAgB;IAyBxB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IA8KvD;kEAC8D;IAC9D,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAKnE;uCACmC;IACnC,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAI/D;;;iEAG6D;IAC7D,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAgB1E;;oBAEgB;IAChB,iCAAiC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE;IAQ5D,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI9C;;gFAE4E;IAC5E,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAQnD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAoB9D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAiBlC;;2EAEuE;IACvE,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAgB9E;8EAC0E;IAC1E,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAI/B;;;yEAGqE;IAC/D,MAAM,CACV,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA2DhC;;2BAEuB;IACjB,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA8BhC;;;kDAG8C;IAC9C,aAAa,IAAI,MAAM;IAiDvB,IAAI,IAAI,iBAAiB,EAAE;IAsC3B;;6CAEyC;IACzC,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,uBAAuB;IAe/B;;;;;;mCAM+B;IACzB,SAAS,CACb,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAyEnC;;kDAE8C;IAC9C,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,OAAO,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IA6I1B;;;;;8EAK0E;IAE1E;;;;;;4DAMwD;IACxD,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAY3D;6CACyC;IACzC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAanE,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAkBxD;;;gDAG4C;IAC5C,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAO/D;;2EAEuE;IACvE,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB;IAWvD;;;;;;;;;+CAS2C;IAC3C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAsCzD,gEAAgE;IAChE,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,kBAAkB;IAc1B;;oEAEgE;IAChE,OAAO,CAAC,oBAAoB;IAwB5B;2EACuE;IACvE,OAAO,CAAC,wBAAwB;IAgBhC;;qCAEiC;IACjC,OAAO,CAAC,oBAAoB;IA6B5B;;;;;4EAKwE;IAClE,OAAO,CACX,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,OAAO,EACpB,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,aAAa,CAAC;IAsEzB;;;;4DAIwD;IAClD,aAAa,CACjB,MAAM,EAAE,OAAO,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC;IAoDzB;;gFAE4E;IACtE,OAAO,CACX,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,aAAa,CAAC;IAmHzB,OAAO,CAAC,sBAAsB;IAgB9B;;yEAEqE;IAC/D,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IA6MnE,qFAAqF;IACrF,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI;IAOnE;;;;;8DAK0D;IAC1D,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI;IAO9D;2EACuE;IACvE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,UAAU,GAAG,IAAI;IAM5E,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,UAAU;IAKxE;mFAC+E;IAC/E,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;IA4B1D;0DACsD;IACtD,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;QACxC,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CAIH"}