@corenel/harness 0.2.0 → 0.4.0

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 (163) hide show
  1. package/dist/acp/agentMap.d.ts +34 -0
  2. package/dist/acp/agentMap.d.ts.map +1 -0
  3. package/dist/acp/agentMap.js +110 -0
  4. package/dist/acp/agentMap.js.map +1 -0
  5. package/dist/acp/index.d.ts +4 -0
  6. package/dist/acp/index.d.ts.map +1 -0
  7. package/dist/acp/index.js +6 -0
  8. package/dist/acp/index.js.map +1 -0
  9. package/dist/acp/policyMap.d.ts +55 -0
  10. package/dist/acp/policyMap.d.ts.map +1 -0
  11. package/dist/acp/policyMap.js +121 -0
  12. package/dist/acp/policyMap.js.map +1 -0
  13. package/dist/acp/types.d.ts +41 -0
  14. package/dist/acp/types.d.ts.map +1 -0
  15. package/dist/acp/types.js +14 -0
  16. package/dist/acp/types.js.map +1 -0
  17. package/dist/api/backend.d.ts +39 -0
  18. package/dist/api/backend.d.ts.map +1 -0
  19. package/dist/api/backend.js +126 -0
  20. package/dist/api/backend.js.map +1 -0
  21. package/dist/api/client.d.ts +95 -0
  22. package/dist/api/client.d.ts.map +1 -0
  23. package/dist/api/client.js +212 -0
  24. package/dist/api/client.js.map +1 -0
  25. package/dist/api/fileMirrorSource.d.ts +24 -0
  26. package/dist/api/fileMirrorSource.d.ts.map +1 -0
  27. package/dist/api/fileMirrorSource.js +59 -0
  28. package/dist/api/fileMirrorSource.js.map +1 -0
  29. package/dist/api/mirror.d.ts +102 -0
  30. package/dist/api/mirror.d.ts.map +1 -0
  31. package/dist/api/mirror.js +204 -0
  32. package/dist/api/mirror.js.map +1 -0
  33. package/dist/api/mirrorScheduler.d.ts +56 -0
  34. package/dist/api/mirrorScheduler.d.ts.map +1 -0
  35. package/dist/api/mirrorScheduler.js +167 -0
  36. package/dist/api/mirrorScheduler.js.map +1 -0
  37. package/dist/compression.d.ts +15 -1
  38. package/dist/compression.d.ts.map +1 -1
  39. package/dist/compression.js +32 -1
  40. package/dist/compression.js.map +1 -1
  41. package/dist/core/loop.d.ts +12 -0
  42. package/dist/core/loop.d.ts.map +1 -1
  43. package/dist/core/loop.js +138 -14
  44. package/dist/core/loop.js.map +1 -1
  45. package/dist/core/spawn.d.ts +54 -0
  46. package/dist/core/spawn.d.ts.map +1 -0
  47. package/dist/core/spawn.js +58 -0
  48. package/dist/core/spawn.js.map +1 -0
  49. package/dist/dag/executeNode.js +2 -2
  50. package/dist/fileSchema.js +1 -1
  51. package/dist/guardrail/guardrail.js +1 -1
  52. package/dist/guardrail/index.js +7 -7
  53. package/dist/guardrail/permission-service.js +1 -1
  54. package/dist/guardrail/serialize.js +1 -1
  55. package/dist/guardrail/store.js +2 -2
  56. package/dist/install/lockfile.d.ts +79 -0
  57. package/dist/install/lockfile.d.ts.map +1 -0
  58. package/dist/install/lockfile.js +155 -0
  59. package/dist/install/lockfile.js.map +1 -0
  60. package/dist/install/store.d.ts +13 -0
  61. package/dist/install/store.d.ts.map +1 -0
  62. package/dist/install/store.js +38 -0
  63. package/dist/install/store.js.map +1 -0
  64. package/dist/log.d.ts.map +1 -1
  65. package/dist/log.js +6 -1
  66. package/dist/log.js.map +1 -1
  67. package/dist/prompts/config.js +2 -2
  68. package/dist/prompts/host.d.ts +4 -0
  69. package/dist/prompts/host.d.ts.map +1 -1
  70. package/dist/prompts/host.js.map +1 -1
  71. package/dist/prompts/index.d.ts.map +1 -1
  72. package/dist/prompts/index.js +13 -6
  73. package/dist/prompts/index.js.map +1 -1
  74. package/dist/prompts/library/defaults.generated.js +2 -2
  75. package/dist/prompts/library/defaults.generated.js.map +1 -1
  76. package/dist/prompts/library/index.js +1 -1
  77. package/dist/providers/contextWindow.d.ts +19 -0
  78. package/dist/providers/contextWindow.d.ts.map +1 -0
  79. package/dist/providers/contextWindow.js +68 -0
  80. package/dist/providers/contextWindow.js.map +1 -0
  81. package/dist/providers/gateway.d.ts +3 -0
  82. package/dist/providers/gateway.d.ts.map +1 -1
  83. package/dist/providers/gateway.js +4 -1
  84. package/dist/providers/gateway.js.map +1 -1
  85. package/dist/sessions/apiLeaseStore.d.ts +10 -0
  86. package/dist/sessions/apiLeaseStore.d.ts.map +1 -0
  87. package/dist/sessions/apiLeaseStore.js +41 -0
  88. package/dist/sessions/apiLeaseStore.js.map +1 -0
  89. package/dist/sessions/blobGc.d.ts +62 -0
  90. package/dist/sessions/blobGc.d.ts.map +1 -0
  91. package/dist/sessions/blobGc.js +154 -0
  92. package/dist/sessions/blobGc.js.map +1 -0
  93. package/dist/sessions/fileRecallStore.js +1 -1
  94. package/dist/sessions/fileSessionStore.js +1 -1
  95. package/dist/sessions/head.d.ts +90 -0
  96. package/dist/sessions/head.d.ts.map +1 -0
  97. package/dist/sessions/head.js +82 -0
  98. package/dist/sessions/head.js.map +1 -0
  99. package/dist/sessions/inflight.d.ts +58 -0
  100. package/dist/sessions/inflight.d.ts.map +1 -0
  101. package/dist/sessions/inflight.js +0 -0
  102. package/dist/sessions/inflight.js.map +1 -0
  103. package/dist/sessions/lease.d.ts +59 -0
  104. package/dist/sessions/lease.d.ts.map +1 -0
  105. package/dist/sessions/lease.js +115 -0
  106. package/dist/sessions/lease.js.map +1 -0
  107. package/dist/sessions/leaseStore.d.ts +46 -0
  108. package/dist/sessions/leaseStore.d.ts.map +1 -0
  109. package/dist/sessions/leaseStore.js +58 -0
  110. package/dist/sessions/leaseStore.js.map +1 -0
  111. package/dist/sessions/timeline.d.ts +134 -0
  112. package/dist/sessions/timeline.d.ts.map +1 -0
  113. package/dist/sessions/timeline.js +127 -0
  114. package/dist/sessions/timeline.js.map +1 -0
  115. package/dist/sidecar/host.d.ts +241 -5
  116. package/dist/sidecar/host.d.ts.map +1 -1
  117. package/dist/sidecar/host.js +630 -5
  118. package/dist/sidecar/host.js.map +1 -1
  119. package/dist/sidecar/server.d.ts +124 -2
  120. package/dist/sidecar/server.d.ts.map +1 -1
  121. package/dist/sidecar/server.js +620 -9
  122. package/dist/sidecar/server.js.map +1 -1
  123. package/dist/sidecar/wsChannel.d.ts +4 -0
  124. package/dist/sidecar/wsChannel.d.ts.map +1 -0
  125. package/dist/sidecar/wsChannel.js +62 -0
  126. package/dist/sidecar/wsChannel.js.map +1 -0
  127. package/dist/skills.js +2 -2
  128. package/dist/snapshot/effects.d.ts +69 -0
  129. package/dist/snapshot/effects.d.ts.map +1 -0
  130. package/dist/snapshot/effects.js +67 -0
  131. package/dist/snapshot/effects.js.map +1 -0
  132. package/dist/snapshot/manifest.d.ts +73 -0
  133. package/dist/snapshot/manifest.d.ts.map +1 -0
  134. package/dist/snapshot/manifest.js +141 -0
  135. package/dist/snapshot/manifest.js.map +1 -0
  136. package/dist/snapshot/tree.d.ts +62 -0
  137. package/dist/snapshot/tree.d.ts.map +1 -0
  138. package/dist/snapshot/tree.js +147 -0
  139. package/dist/snapshot/tree.js.map +1 -0
  140. package/dist/tools/builtins.d.ts.map +1 -1
  141. package/dist/tools/builtins.js +67 -8
  142. package/dist/tools/builtins.js.map +1 -1
  143. package/dist/tools/callAgent.d.ts +16 -0
  144. package/dist/tools/callAgent.d.ts.map +1 -0
  145. package/dist/tools/callAgent.js +53 -0
  146. package/dist/tools/callAgent.js.map +1 -0
  147. package/dist/tools/files.d.ts +10 -0
  148. package/dist/tools/files.d.ts.map +1 -1
  149. package/dist/tools/files.js +159 -8
  150. package/dist/tools/files.js.map +1 -1
  151. package/dist/tools/http.js +1 -1
  152. package/dist/tools/namespaces.d.ts +1 -1
  153. package/dist/tools/namespaces.d.ts.map +1 -1
  154. package/dist/tools/namespaces.js +40 -2
  155. package/dist/tools/namespaces.js.map +1 -1
  156. package/dist/tools/procs.d.ts +18 -0
  157. package/dist/tools/procs.d.ts.map +1 -0
  158. package/dist/tools/procs.js +281 -0
  159. package/dist/tools/procs.js.map +1 -0
  160. package/dist/tools/todo.d.ts.map +1 -1
  161. package/dist/tools/todo.js +12 -0
  162. package/dist/tools/todo.js.map +1 -1
  163. package/package.json +18 -7
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../providers/gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../providers/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { LeaseStore } from './leaseStore';
2
+ import type { CorenelApiClient } from '../api/client';
3
+ export interface ApiLeaseStoreDeps {
4
+ client: CorenelApiClient;
5
+ /** Epoch ms. Only for the record's diagnostic timestamp — never used to decide
6
+ * anything, because clocks disagree and the epoch is the authority. */
7
+ now: () => number;
8
+ }
9
+ export declare function makeApiLeaseStore(deps: ApiLeaseStoreDeps): LeaseStore;
10
+ //# sourceMappingURL=apiLeaseStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiLeaseStore.d.ts","sourceRoot":"","sources":["../../sessions/apiLeaseStore.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,cAAc,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,gBAAgB,CAAC;IACzB;2EACuE;IACvE,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG,UAAU,CAsCrE"}
@@ -0,0 +1,41 @@
1
+ import { LeaseConflict } from '../api/client.js';
2
+ export function makeApiLeaseStore(deps) {
3
+ const toRecord = (sessionId, epoch, holder) => ({
4
+ sessionId,
5
+ epoch,
6
+ holder,
7
+ updatedAt: deps.now(),
8
+ });
9
+ return {
10
+ async read(sessionId) {
11
+ try {
12
+ const s = await deps.client.getSession(sessionId);
13
+ return toRecord(sessionId, s.epoch, s.holder);
14
+ }
15
+ catch {
16
+ // Absent, unreachable, or not ours — all "no record I can act on". The
17
+ // caller's next step is the same in every case: try to acquire from
18
+ // epoch 0 and let the server refuse if it knows better.
19
+ return null;
20
+ }
21
+ },
22
+ async compareAndSet(sessionId, expectedEpoch, holder) {
23
+ try {
24
+ const lease = await deps.client.acquireLease(sessionId, expectedEpoch, holder);
25
+ return { ok: true, record: toRecord(sessionId, lease.epoch, lease.holder) };
26
+ }
27
+ catch (err) {
28
+ if (err instanceof LeaseConflict) {
29
+ // Refused, and the server said which epoch won. Hand that back rather
30
+ // than throwing: "re-read and decide" is always what happens next.
31
+ return { ok: false, record: toRecord(sessionId, err.currentEpoch, null) };
32
+ }
33
+ // Anything else is a real failure — unreachable, unauthorized, no such
34
+ // session. It must NOT be reported as "someone else holds it", because a
35
+ // caller told that will wait politely for a lease that is already theirs.
36
+ throw err;
37
+ }
38
+ },
39
+ };
40
+ }
41
+ //# sourceMappingURL=apiLeaseStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiLeaseStore.js","sourceRoot":"","sources":["../../sessions/apiLeaseStore.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAS9C,MAAM,UAAU,iBAAiB,CAAC,IAAuB;IACvD,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAE,KAAa,EAAE,MAAqB,EAAe,EAAE,CAAC,CAAC;QAC1F,SAAS;QACT,KAAK;QACL,MAAM;QACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,SAAS;YAClB,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAClD,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,uEAAuE;gBACvE,oEAAoE;gBACpE,wDAAwD;gBACxD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM;YAClD,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;gBAC/E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;oBACjC,sEAAsE;oBACtE,mEAAmE;oBACnE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC5E,CAAC;gBACD,uEAAuE;gBACvE,yEAAyE;gBACzE,0EAA0E;gBAC1E,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,62 @@
1
+ import type { FileService } from '@corenel/protocol';
2
+ /** Default grace window for an UNATTACHED blob before it is even considered —
3
+ * see the module note's hazard #2. 30 minutes is comfortably longer than the
4
+ * gap between an offload and its owning turn being persisted (that gap is
5
+ * normally sub-second; it survives even a slow, still-mid-turn run), while
6
+ * being short enough that a genuinely abandoned unattached blob does not sit
7
+ * around indefinitely. */
8
+ export declare const DEFAULT_UNATTACHED_GRACE_MS: number;
9
+ export type BlobDisposition = 'reap' | 'report-only';
10
+ export interface BlobGcEntry {
11
+ sessionId: string;
12
+ id: string;
13
+ path: string;
14
+ bytes: number;
15
+ toolName: string;
16
+ createdAt: number;
17
+ disposition: BlobDisposition;
18
+ /** Why this blob was classified the way it was — shown in the report so a
19
+ * dry run reads as an explanation, not just a list. */
20
+ reason: string;
21
+ }
22
+ export interface BlobGcPlan {
23
+ /** Reap-eligible: an orphaned session directory, or an aged-out unattached
24
+ * blob. Only these are ever removed, and only when `--delete` is given. */
25
+ reapable: BlobGcEntry[];
26
+ /** Unreferenced, but living in a session directory that still has a
27
+ * SESSION.jsonl. Reported for visibility; this module never deletes them. */
28
+ liveUnreferenced: BlobGcEntry[];
29
+ reapableBytes: number;
30
+ liveUnreferencedBytes: number;
31
+ }
32
+ export interface BlobGcOptions {
33
+ root?: string;
34
+ now?: () => number;
35
+ /** Grace window for an UNATTACHED_SESSION blob — see DEFAULT_UNATTACHED_GRACE_MS. */
36
+ graceMs?: number;
37
+ }
38
+ /**
39
+ * Plan a GC pass. NEVER MUTATES ANYTHING — this is the dry run, always, and
40
+ * `runBlobGc` below reads its plan to decide what an explicit `--delete`
41
+ * removes. Safe to call while an agent is mid-turn: it only reads, and
42
+ * everything it could possibly flag as reap-eligible is defended by the
43
+ * ownership rule in the module note.
44
+ */
45
+ export declare function planBlobGc(files: FileService, opts?: BlobGcOptions): Promise<BlobGcPlan>;
46
+ export interface BlobGcResult {
47
+ plan: BlobGcPlan;
48
+ /** Populated only when `delete: true` was passed — exactly the paths
49
+ * removed, a subset of `plan.reapable`. Empty on a dry run. */
50
+ removed: BlobGcEntry[];
51
+ }
52
+ /**
53
+ * Run a GC pass. Dry run by default (`delete` absent/false): computes the
54
+ * plan and removes nothing. With `delete: true`, removes exactly the
55
+ * `reapable` entries the plan named — never anything from
56
+ * `liveUnreferenced`, and never anything the plan did not already list, so
57
+ * the delete path can only ever remove what the dry run promised.
58
+ */
59
+ export declare function runBlobGc(files: FileService, opts?: BlobGcOptions & {
60
+ delete?: boolean;
61
+ }): Promise<BlobGcResult>;
62
+ //# sourceMappingURL=blobGc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blobGc.d.ts","sourceRoot":"","sources":["../../sessions/blobGc.ts"],"names":[],"mappings":"AA8DA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;;0BAK0B;AAC1B,eAAO,MAAM,2BAA2B,QAAiB,CAAC;AAkB1D,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,aAAa,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,eAAe,CAAC;IAC7B;2DACuD;IACvD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB;+EAC2E;IAC3E,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB;iFAC6E;IAC7E,gBAAgB,EAAE,WAAW,EAAE,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA+DD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CA8ClG;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB;mEAC+D;IAC/D,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,GAAE,aAAa,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAS1H"}
@@ -0,0 +1,154 @@
1
+ import { sessionsRoot, flattenFiles } from '@corenel/protocol';
2
+ import { UNATTACHED_SESSION } from './fileRecallStore.js';
3
+ /** Default grace window for an UNATTACHED blob before it is even considered —
4
+ * see the module note's hazard #2. 30 minutes is comfortably longer than the
5
+ * gap between an offload and its owning turn being persisted (that gap is
6
+ * normally sub-second; it survives even a slow, still-mid-turn run), while
7
+ * being short enough that a genuinely abandoned unattached blob does not sit
8
+ * around indefinitely. */
9
+ export const DEFAULT_UNATTACHED_GRACE_MS = 30 * 60 * 1000;
10
+ /** The `recall_result({ id: "<blobId>" })` tail every marker carries — see
11
+ * compression.ts's `formatOffloadRef`/`POINTER_TAIL_RE`. Duplicated as a
12
+ * standalone global-match pattern (POINTER_TAIL_RE anchors to the START of
13
+ * one pointer string; this one scans a whole SESSION.jsonl file for every
14
+ * occurrence at once) rather than imported, to keep this module's only
15
+ * dependency on the marker FORMAT — not on the loop/compression module
16
+ * graph. Keep in sync with compression.ts's OFFLOAD_MARKER_PREFIX/tail if
17
+ * either changes. */
18
+ // The quotes around the id are matched with an OPTIONAL leading backslash:
19
+ // this scans the RAW SESSION.jsonl bytes, and the marker text lives inside a
20
+ // JSON-encoded string field (the turn's message content) — one level of
21
+ // JSON.stringify turns `"` into `\"` in the file. Blob ids never contain a
22
+ // quote or backslash (fileRecallStore.ts's SAFE_ID), so `[^"\\]+` is a safe
23
+ // capture either way.
24
+ const MARKER_ID_RE = /recall_result\(\{\s*id:\s*\\?"([^"\\]+)\\?"\s*\}\)/g;
25
+ /** Every blob id any session's SESSION.jsonl currently references, across the
26
+ * WHOLE sessions root — not scoped to one session's own log. See the module
27
+ * note on why this has to be global. */
28
+ async function globalReferencedIds(files, root, sessionDirs) {
29
+ const ids = new Set();
30
+ for (const dir of sessionDirs) {
31
+ if (!dir.hasSessionLog)
32
+ continue;
33
+ const text = await files.read(`${root}/${dir.id}/SESSION.jsonl`).catch(() => null);
34
+ if (text == null)
35
+ continue;
36
+ for (const m of text.matchAll(MARKER_ID_RE)) {
37
+ const id = m[1];
38
+ if (id)
39
+ ids.add(id);
40
+ }
41
+ }
42
+ return ids;
43
+ }
44
+ /** Every session directory under root, with whether it carries a
45
+ * SESSION.jsonl. Derived from a flattened listing rather than `readdir`,
46
+ * since FileService backends differ on whether `list()` returns entries
47
+ * relative to the queried dir or to the workspace root (see
48
+ * fileSessionStore.ts's own list() note) — flattening and filtering by path
49
+ * prefix sidesteps that entirely. */
50
+ async function listSessionDirs(files, root) {
51
+ const nodes = await files.list(root).catch(() => []);
52
+ const flat = flattenFiles(nodes).filter((f) => f.path.startsWith(`${root}/`));
53
+ const dirs = new Map();
54
+ for (const f of flat) {
55
+ const rest = f.path.slice(root.length + 1);
56
+ const slash = rest.indexOf('/');
57
+ if (slash < 0)
58
+ continue; // a stray file directly under root, not a session dir
59
+ const id = rest.slice(0, slash);
60
+ const isSessionLog = rest === `${id}/SESSION.jsonl`;
61
+ if (!dirs.has(id))
62
+ dirs.set(id, false);
63
+ if (isSessionLog)
64
+ dirs.set(id, true);
65
+ }
66
+ return [...dirs.entries()].map(([id, hasSessionLog]) => ({ id, hasSessionLog }));
67
+ }
68
+ /** Every blob under one session directory's `blobs/`. */
69
+ async function listBlobs(files, root, sessionId) {
70
+ const dir = `${root}/${sessionId}/blobs`;
71
+ const nodes = await files.list(dir).catch(() => []);
72
+ const blobFiles = flattenFiles(nodes).filter((f) => f.path.startsWith(`${dir}/`) && f.path.endsWith('.json'));
73
+ const out = [];
74
+ for (const f of blobFiles) {
75
+ const text = await files.read(f.path).catch(() => null);
76
+ if (text == null)
77
+ continue;
78
+ try {
79
+ const record = JSON.parse(text);
80
+ if (record && typeof record.id === 'string')
81
+ out.push({ path: f.path, record });
82
+ }
83
+ catch { /* corrupt blob file — skip rather than fail the whole scan */ }
84
+ }
85
+ return out;
86
+ }
87
+ /**
88
+ * Plan a GC pass. NEVER MUTATES ANYTHING — this is the dry run, always, and
89
+ * `runBlobGc` below reads its plan to decide what an explicit `--delete`
90
+ * removes. Safe to call while an agent is mid-turn: it only reads, and
91
+ * everything it could possibly flag as reap-eligible is defended by the
92
+ * ownership rule in the module note.
93
+ */
94
+ export async function planBlobGc(files, opts = {}) {
95
+ const root = opts.root ?? sessionsRoot();
96
+ const now = (opts.now ?? Date.now)();
97
+ const graceMs = opts.graceMs ?? DEFAULT_UNATTACHED_GRACE_MS;
98
+ const sessionDirs = await listSessionDirs(files, root);
99
+ const referenced = await globalReferencedIds(files, root, sessionDirs);
100
+ const reapable = [];
101
+ const liveUnreferenced = [];
102
+ for (const dir of sessionDirs) {
103
+ const blobs = await listBlobs(files, root, dir.id);
104
+ for (const { path, record } of blobs) {
105
+ const isReferenced = referenced.has(record.id);
106
+ const base = {
107
+ sessionId: dir.id, id: record.id, path, bytes: record.bytes,
108
+ toolName: record.toolName, createdAt: record.createdAt,
109
+ };
110
+ if (isReferenced)
111
+ continue; // attached — never a candidate, either list
112
+ if (dir.id === UNATTACHED_SESSION) {
113
+ const age = now - record.createdAt;
114
+ if (age < graceMs)
115
+ continue; // hazard #2's defence — too new to judge
116
+ reapable.push({
117
+ ...base, disposition: 'reap',
118
+ reason: `unattached, unreferenced, and ${Math.round(age / 60000)}m old (grace is ${Math.round(graceMs / 60000)}m)`,
119
+ });
120
+ continue;
121
+ }
122
+ if (!dir.hasSessionLog) {
123
+ reapable.push({ ...base, disposition: 'reap', reason: 'owning session directory has no SESSION.jsonl' });
124
+ continue;
125
+ }
126
+ liveUnreferenced.push({ ...base, disposition: 'report-only', reason: 'unreferenced, but the owning session is live — not deleted by this tool' });
127
+ }
128
+ }
129
+ return {
130
+ reapable,
131
+ liveUnreferenced,
132
+ reapableBytes: reapable.reduce((sum, e) => sum + e.bytes, 0),
133
+ liveUnreferencedBytes: liveUnreferenced.reduce((sum, e) => sum + e.bytes, 0),
134
+ };
135
+ }
136
+ /**
137
+ * Run a GC pass. Dry run by default (`delete` absent/false): computes the
138
+ * plan and removes nothing. With `delete: true`, removes exactly the
139
+ * `reapable` entries the plan named — never anything from
140
+ * `liveUnreferenced`, and never anything the plan did not already list, so
141
+ * the delete path can only ever remove what the dry run promised.
142
+ */
143
+ export async function runBlobGc(files, opts = {}) {
144
+ const plan = await planBlobGc(files, opts);
145
+ if (!opts.delete)
146
+ return { plan, removed: [] };
147
+ const removed = [];
148
+ for (const entry of plan.reapable) {
149
+ await files.remove(entry.path).catch(() => undefined);
150
+ removed.push(entry);
151
+ }
152
+ return { plan, removed };
153
+ }
154
+ //# sourceMappingURL=blobGc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blobGc.js","sourceRoot":"","sources":["../../sessions/blobGc.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { sessionsRoot, flattenFiles } from '@corenel/protocol';
2
- import { PREVIEW_BYTES } from '../compression';
2
+ import { PREVIEW_BYTES } from '../compression.js';
3
3
  /** Reserved pseudo-session for offloads produced outside any chat session
4
4
  * (DAG node runs, the editor's prompt Run). */
5
5
  export const UNATTACHED_SESSION = '_unattached';
@@ -1,5 +1,5 @@
1
1
  import { sessionsRoot, flattenFiles } from '@corenel/protocol';
2
- import { encodeLine, foldSession } from './jsonl';
2
+ import { encodeLine, foldSession } from './jsonl.js';
3
3
  function uid(prefix) {
4
4
  return `${prefix}_${Date.now().toString(36)}${Math.floor(Math.random() * 1e6).toString(36)}`;
5
5
  }
@@ -0,0 +1,90 @@
1
+ import type { TimelineEntry } from './timeline';
2
+ export type SessionStatus = 'running' | 'paused' | 'archived' | 'failed' | 'completed';
3
+ /** What the runtime is waiting on. Derived from the tail of the timeline. */
4
+ export type CursorPhase = 'awaiting_model' | 'awaiting_tool_result' | 'awaiting_approval' | 'idle';
5
+ /** A question only a human can answer. Survives transport: an approval requested
6
+ * on the laptop and answered from the phone is the SAME object, and only the
7
+ * client differs (spec s4.4.4). */
8
+ export interface PendingApproval {
9
+ id: string;
10
+ kind: 'tool_permission' | 'resume_unknown' | 'budget';
11
+ callId: string | null;
12
+ /** The timeline entry this is about, so an answer can be attributed. */
13
+ index: number;
14
+ question: string;
15
+ options: {
16
+ id: string;
17
+ label: string;
18
+ }[];
19
+ requestedAt: string;
20
+ }
21
+ export interface SessionHead {
22
+ schemaVersion: 1;
23
+ sessionId: string;
24
+ status: SessionStatus;
25
+ updatedAt: string;
26
+ task?: {
27
+ id: string;
28
+ objective: string;
29
+ cwd: string;
30
+ };
31
+ agent?: {
32
+ package: string;
33
+ version: string;
34
+ entrypoint: string;
35
+ };
36
+ cursor: {
37
+ nextIndex: number;
38
+ phase: CursorPhase;
39
+ };
40
+ pendingApproval: PendingApproval | null;
41
+ usage: {
42
+ inputTokens: number;
43
+ outputTokens: number;
44
+ wallMs: number;
45
+ };
46
+ /** Opaque workflow position when the session is running a .pdflow package.
47
+ * Corenel stores and returns it; the workflow runtime owns its meaning. */
48
+ workflow?: {
49
+ package: string;
50
+ version: string;
51
+ position: unknown;
52
+ completedNodes: {
53
+ id: string;
54
+ outputRef: string;
55
+ }[];
56
+ };
57
+ }
58
+ export declare const HEAD_VERSION: 1;
59
+ export interface DeriveHeadInput {
60
+ sessionId: string;
61
+ entries: readonly TimelineEntry[];
62
+ nextIndex: number;
63
+ updatedAt: string;
64
+ /** Carried through unchanged — none of it is derivable from the timeline. */
65
+ carry?: Pick<SessionHead, 'task' | 'agent' | 'workflow' | 'pendingApproval'>;
66
+ /** The session's own status when it is not implied by the timeline (paused,
67
+ * archived). Absent, the phase decides between running and idle. */
68
+ status?: SessionStatus;
69
+ }
70
+ /**
71
+ * Rebuild the head from the timeline.
72
+ *
73
+ * The phase comes from the LAST entry, because that is what the runtime is
74
+ * actually blocked on:
75
+ * - a tool call still `executing` -> awaiting_tool_result
76
+ * - a user message with no reply -> awaiting_model
77
+ * - an approval outstanding -> awaiting_approval (it outranks the rest;
78
+ * nothing proceeds until it is answered)
79
+ * - anything else -> idle
80
+ */
81
+ export declare function deriveHead(input: DeriveHeadInput): SessionHead;
82
+ export declare function serializeHead(head: SessionHead): string;
83
+ /**
84
+ * Parse a stored head, or null when it is unusable.
85
+ *
86
+ * Null is not an error condition for the caller: the head is a cache, so the
87
+ * answer to "it did not parse" is "fold the log again", never "fail the session".
88
+ */
89
+ export declare function parseHead(text: string): SessionHead | null;
90
+ //# sourceMappingURL=head.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../sessions/head.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEvF,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,sBAAsB,GAAG,mBAAmB,GAAG,MAAM,CAAC;AAEnG;;mCAEmC;AACnC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,QAAQ,CAAC;IACtD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,CAAC,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,CAAA;KAAE,CAAC;IAClD,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE;+EAC2E;IAC3E,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;CACzH;AAED,eAAO,MAAM,YAAY,EAAG,CAAU,CAAC;AAEvC,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,iBAAiB,CAAC,CAAC;IAC7E;wEACoE;IACpE,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,WAAW,CAqB9D;AAsBD,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAEvD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAO1D"}
@@ -0,0 +1,82 @@
1
+ export const HEAD_VERSION = 1;
2
+ /**
3
+ * Rebuild the head from the timeline.
4
+ *
5
+ * The phase comes from the LAST entry, because that is what the runtime is
6
+ * actually blocked on:
7
+ * - a tool call still `executing` -> awaiting_tool_result
8
+ * - a user message with no reply -> awaiting_model
9
+ * - an approval outstanding -> awaiting_approval (it outranks the rest;
10
+ * nothing proceeds until it is answered)
11
+ * - anything else -> idle
12
+ */
13
+ export function deriveHead(input) {
14
+ const pendingApproval = input.carry?.pendingApproval ?? null;
15
+ const last = input.entries[input.entries.length - 1];
16
+ let phase = 'idle';
17
+ if (pendingApproval)
18
+ phase = 'awaiting_approval';
19
+ else if (input.entries.some((e) => e.type === 'tool_call' && e.status === 'executing'))
20
+ phase = 'awaiting_tool_result';
21
+ else if (last?.type === 'user_message')
22
+ phase = 'awaiting_model';
23
+ return {
24
+ schemaVersion: HEAD_VERSION,
25
+ sessionId: input.sessionId,
26
+ status: input.status ?? (phase === 'idle' ? 'completed' : 'running'),
27
+ updatedAt: input.updatedAt,
28
+ ...(input.carry?.task ? { task: input.carry.task } : {}),
29
+ ...(input.carry?.agent ? { agent: input.carry.agent } : {}),
30
+ ...(input.carry?.workflow ? { workflow: input.carry.workflow } : {}),
31
+ cursor: { nextIndex: input.nextIndex, phase },
32
+ pendingApproval,
33
+ usage: usageOf(input.entries),
34
+ };
35
+ }
36
+ /** Token and wall-clock totals, summed from the timeline rather than tracked
37
+ * separately — a counter that drifts from the log is worse than no counter. */
38
+ function usageOf(entries) {
39
+ let inputTokens = 0;
40
+ let outputTokens = 0;
41
+ let wallMs = 0;
42
+ for (const e of entries) {
43
+ const u = e.usage;
44
+ if (u && typeof u === 'object') {
45
+ if (typeof u.inputTokens === 'number')
46
+ inputTokens += u.inputTokens;
47
+ if (typeof u.outputTokens === 'number')
48
+ outputTokens += u.outputTokens;
49
+ }
50
+ if (e.type === 'tool_call' && e.startedAt && e.completedAt) {
51
+ const ms = Date.parse(e.completedAt) - Date.parse(e.startedAt);
52
+ if (Number.isFinite(ms) && ms > 0)
53
+ wallMs += ms;
54
+ }
55
+ }
56
+ return { inputTokens, outputTokens, wallMs };
57
+ }
58
+ export function serializeHead(head) {
59
+ return JSON.stringify(head, null, 2) + '\n';
60
+ }
61
+ /**
62
+ * Parse a stored head, or null when it is unusable.
63
+ *
64
+ * Null is not an error condition for the caller: the head is a cache, so the
65
+ * answer to "it did not parse" is "fold the log again", never "fail the session".
66
+ */
67
+ export function parseHead(text) {
68
+ let parsed;
69
+ try {
70
+ parsed = JSON.parse(text);
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
76
+ return null;
77
+ const h = parsed;
78
+ if (h.schemaVersion !== HEAD_VERSION || typeof h.sessionId !== 'string' || !h.cursor)
79
+ return null;
80
+ return h;
81
+ }
82
+ //# sourceMappingURL=head.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"head.js","sourceRoot":"","sources":["../../sessions/head.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ export interface InflightWork {
2
+ sessionId: string;
3
+ /** The tool call this represents, for the report when a drain times out. */
4
+ callId: string;
5
+ startedAt: number;
6
+ }
7
+ export interface DrainResult {
8
+ /** True when everything finished before the deadline. */
9
+ drained: boolean;
10
+ /** Call ids still running when we gave up. Empty when `drained`. */
11
+ remaining: string[];
12
+ /** How long the drain actually waited. */
13
+ waitedMs: number;
14
+ }
15
+ export interface DrainOptions {
16
+ /** Give up after this long. 0 means "do not wait at all". */
17
+ timeoutMs: number;
18
+ /** Poll interval. Small enough to feel instant, large enough not to spin. */
19
+ stepMs?: number;
20
+ now: () => number;
21
+ sleep: (ms: number) => Promise<void>;
22
+ }
23
+ /**
24
+ * Tracks the tool calls currently running per session.
25
+ *
26
+ * Deliberately a registry the runtime writes to, rather than something the
27
+ * backend infers: only the caller knows when a tool call starts and ends, and a
28
+ * backend guessing at it would be wrong in exactly the cases that matter.
29
+ */
30
+ export declare class InflightRegistry {
31
+ private readonly work;
32
+ private key;
33
+ begin(sessionId: string, callId: string, at: number): void;
34
+ /** Idempotent: ending a call that already ended is a no-op, not an error, so
35
+ * cleanup paths can be unconditional. */
36
+ end(sessionId: string, callId: string): void;
37
+ /** Call ids running for a session, oldest first — the oldest is the one most
38
+ * likely to be stuck, so it leads the report. */
39
+ running(sessionId: string): string[];
40
+ count(sessionId: string): number;
41
+ /** Forget a session's work outright — for destroy, where nothing is coming back. */
42
+ clear(sessionId: string): void;
43
+ /**
44
+ * Wait for a session's in-flight work to finish.
45
+ *
46
+ * Returns rather than throwing on timeout: a drain that could not complete is
47
+ * information the caller has to act on (record a problem, mark entries
48
+ * `executing`), not an error that should abandon the export. Losing the
49
+ * snapshot because one tool hung would be a worse outcome than a torn one that
50
+ * says it is torn.
51
+ */
52
+ drain(sessionId: string, opts: DrainOptions): Promise<DrainResult>;
53
+ }
54
+ /** Default drain budget. Long enough for an ordinary file write or a short
55
+ * command, short enough that closing a laptop still feels immediate. Overridable
56
+ * per call, so a hosted runner and a laptop can differ. */
57
+ export declare const DEFAULT_DRAIN_MS = 5000;
58
+ //# sourceMappingURL=inflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inflight.d.ts","sourceRoot":"","sources":["../../sessions/inflight.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,yDAAyD;IACzD,OAAO,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmC;IAExD,OAAO,CAAC,GAAG;IAIX,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAI1D;6CACyC;IACzC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAI5C;qDACiD;IACjD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAOpC,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIhC,oFAAoF;IACpF,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI9B;;;;;;;;OAQG;IACG,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;CAWzE;AAED;;2DAE2D;AAC3D,eAAO,MAAM,gBAAgB,OAAO,CAAC"}
Binary file
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inflight.js","sourceRoot":"","sources":["../../sessions/inflight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AA2BH;;;;;;GAMG;AACH,MAAM,OAAO,gBAAgB;IAA7B;QACmB;;;;mBAAO,IAAI,GAAG,EAAwB;WAAC;IAsD1D,CAAC;IApDS,GAAG,CAAC,SAAiB,EAAE,MAAc;QAC3C,OAAO,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,SAAiB,EAAE,MAAc,EAAE,EAAU;QACjD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IAED;6CACyC;IACzC,GAAG,CAAC,SAAiB,EAAE,MAAc;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,CAAC;IAED;qDACiD;IACjD,OAAO,CAAC,SAAiB;QACvB,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;aAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC;aACxC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;aACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,SAAiB;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IACxC,CAAC;IAED,oFAAoF;IACpF,KAAK,CAAC,SAAiB;QACrB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,IAAkB;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAC5C,SAAS,CAAC;YACR,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,CAAC,SAAS,CAAC,MAAM;gBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;YAC7F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAClC,IAAI,MAAM,IAAI,IAAI,CAAC,SAAS;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YACrF,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;CACF;AAED;;2DAE2D;AAC3D,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC"}