@shivaedev/agent-codex 0.0.0 → 0.2.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 (164) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +21 -0
  3. package/README.md +47 -1
  4. package/dist/adapters/Request.d.ts +4 -0
  5. package/dist/adapters/Request.d.ts.map +1 -0
  6. package/dist/adapters/Request.js +2 -0
  7. package/dist/adapters/Request.js.map +1 -0
  8. package/dist/adapters/UserMessageItem.d.ts +22 -0
  9. package/dist/adapters/UserMessageItem.d.ts.map +1 -0
  10. package/dist/adapters/UserMessageItem.js +24 -0
  11. package/dist/adapters/UserMessageItem.js.map +1 -0
  12. package/dist/adapters/attributed.d.ts +6 -0
  13. package/dist/adapters/attributed.d.ts.map +1 -0
  14. package/dist/adapters/attributed.js +17 -0
  15. package/dist/adapters/attributed.js.map +1 -0
  16. package/dist/adapters/codexFailure.d.ts +3 -0
  17. package/dist/adapters/codexFailure.d.ts.map +1 -0
  18. package/dist/adapters/codexFailure.js +5 -0
  19. package/dist/adapters/codexFailure.js.map +1 -0
  20. package/dist/adapters/connect.d.ts +11 -0
  21. package/dist/adapters/connect.d.ts.map +1 -0
  22. package/dist/adapters/connect.js +100 -0
  23. package/dist/adapters/connect.js.map +1 -0
  24. package/dist/adapters/delivery.d.ts +18 -0
  25. package/dist/adapters/delivery.d.ts.map +1 -0
  26. package/dist/adapters/delivery.js +115 -0
  27. package/dist/adapters/delivery.js.map +1 -0
  28. package/dist/adapters/deliveryState.d.ts +31 -0
  29. package/dist/adapters/deliveryState.d.ts.map +1 -0
  30. package/dist/adapters/deliveryState.js +29 -0
  31. package/dist/adapters/deliveryState.js.map +1 -0
  32. package/dist/adapters/engine.d.ts +10 -0
  33. package/dist/adapters/engine.d.ts.map +1 -0
  34. package/dist/adapters/engine.js +80 -0
  35. package/dist/adapters/engine.js.map +1 -0
  36. package/dist/adapters/features.d.ts +726 -0
  37. package/dist/adapters/features.d.ts.map +1 -0
  38. package/dist/adapters/features.js +46 -0
  39. package/dist/adapters/features.js.map +1 -0
  40. package/dist/adapters/handshake.d.ts +5 -0
  41. package/dist/adapters/handshake.d.ts.map +1 -0
  42. package/dist/adapters/handshake.js +30 -0
  43. package/dist/adapters/handshake.js.map +1 -0
  44. package/dist/adapters/items.d.ts +7 -0
  45. package/dist/adapters/items.d.ts.map +1 -0
  46. package/dist/adapters/items.js +105 -0
  47. package/dist/adapters/items.js.map +1 -0
  48. package/dist/adapters/mapping.d.ts +9 -0
  49. package/dist/adapters/mapping.d.ts.map +1 -0
  50. package/dist/adapters/mapping.js +57 -0
  51. package/dist/adapters/mapping.js.map +1 -0
  52. package/dist/adapters/process.d.ts +15 -0
  53. package/dist/adapters/process.d.ts.map +1 -0
  54. package/dist/adapters/process.js +55 -0
  55. package/dist/adapters/process.js.map +1 -0
  56. package/dist/adapters/protocol.d.ts +178 -0
  57. package/dist/adapters/protocol.d.ts.map +1 -0
  58. package/dist/adapters/protocol.js +97 -0
  59. package/dist/adapters/protocol.js.map +1 -0
  60. package/dist/adapters/protocolItems.d.ts +89 -0
  61. package/dist/adapters/protocolItems.d.ts.map +1 -0
  62. package/dist/adapters/protocolItems.js +100 -0
  63. package/dist/adapters/protocolItems.js.map +1 -0
  64. package/dist/adapters/rateLimits.d.ts +7 -0
  65. package/dist/adapters/rateLimits.d.ts.map +1 -0
  66. package/dist/adapters/rateLimits.js +40 -0
  67. package/dist/adapters/rateLimits.js.map +1 -0
  68. package/dist/adapters/reads.d.ts +324 -0
  69. package/dist/adapters/reads.d.ts.map +1 -0
  70. package/dist/adapters/reads.js +83 -0
  71. package/dist/adapters/reads.js.map +1 -0
  72. package/dist/adapters/recovery.d.ts +324 -0
  73. package/dist/adapters/recovery.d.ts.map +1 -0
  74. package/dist/adapters/recovery.js +39 -0
  75. package/dist/adapters/recovery.js.map +1 -0
  76. package/dist/adapters/residualApproval.d.ts +4 -0
  77. package/dist/adapters/residualApproval.d.ts.map +1 -0
  78. package/dist/adapters/residualApproval.js +21 -0
  79. package/dist/adapters/residualApproval.js.map +1 -0
  80. package/dist/adapters/rpc.d.ts +8 -0
  81. package/dist/adapters/rpc.d.ts.map +1 -0
  82. package/dist/adapters/rpc.js +2 -0
  83. package/dist/adapters/rpc.js.map +1 -0
  84. package/dist/adapters/rpcProtocol.d.ts +11 -0
  85. package/dist/adapters/rpcProtocol.d.ts.map +1 -0
  86. package/dist/adapters/rpcProtocol.js +29 -0
  87. package/dist/adapters/rpcProtocol.js.map +1 -0
  88. package/dist/adapters/server.d.ts +30 -0
  89. package/dist/adapters/server.d.ts.map +1 -0
  90. package/dist/adapters/server.js +68 -0
  91. package/dist/adapters/server.js.map +1 -0
  92. package/dist/adapters/session.d.ts +312 -0
  93. package/dist/adapters/session.d.ts.map +1 -0
  94. package/dist/adapters/session.js +45 -0
  95. package/dist/adapters/session.js.map +1 -0
  96. package/dist/adapters/subagentItems.d.ts +16 -0
  97. package/dist/adapters/subagentItems.d.ts.map +1 -0
  98. package/dist/adapters/subagentItems.js +58 -0
  99. package/dist/adapters/subagentItems.js.map +1 -0
  100. package/dist/adapters/tellCliVersionOnce.d.ts +5 -0
  101. package/dist/adapters/tellCliVersionOnce.d.ts.map +1 -0
  102. package/dist/adapters/tellCliVersionOnce.js +13 -0
  103. package/dist/adapters/tellCliVersionOnce.js.map +1 -0
  104. package/dist/adapters/threadClaims.d.ts +8 -0
  105. package/dist/adapters/threadClaims.d.ts.map +1 -0
  106. package/dist/adapters/threadClaims.js +20 -0
  107. package/dist/adapters/threadClaims.js.map +1 -0
  108. package/dist/adapters/threadSweep.d.ts +15 -0
  109. package/dist/adapters/threadSweep.d.ts.map +1 -0
  110. package/dist/adapters/threadSweep.js +57 -0
  111. package/dist/adapters/threadSweep.js.map +1 -0
  112. package/dist/adapters/threadTree.d.ts +8 -0
  113. package/dist/adapters/threadTree.d.ts.map +1 -0
  114. package/dist/adapters/threadTree.js +125 -0
  115. package/dist/adapters/threadTree.js.map +1 -0
  116. package/dist/adapters/turnRequests.d.ts +13 -0
  117. package/dist/adapters/turnRequests.d.ts.map +1 -0
  118. package/dist/adapters/turnRequests.js +27 -0
  119. package/dist/adapters/turnRequests.js.map +1 -0
  120. package/dist/adapters/userMessageEvent.d.ts +7 -0
  121. package/dist/adapters/userMessageEvent.d.ts.map +1 -0
  122. package/dist/adapters/userMessageEvent.js +19 -0
  123. package/dist/adapters/userMessageEvent.js.map +1 -0
  124. package/dist/codex.d.ts +11 -0
  125. package/dist/codex.d.ts.map +1 -0
  126. package/dist/codex.js +16 -0
  127. package/dist/codex.js.map +1 -0
  128. package/dist/config.d.ts +24 -0
  129. package/dist/config.d.ts.map +1 -0
  130. package/dist/config.js +4 -0
  131. package/dist/config.js.map +1 -0
  132. package/package.json +63 -4
  133. package/src/adapters/Request.ts +3 -0
  134. package/src/adapters/UserMessageItem.ts +28 -0
  135. package/src/adapters/attributed.ts +21 -0
  136. package/src/adapters/codexFailure.ts +4 -0
  137. package/src/adapters/connect.ts +129 -0
  138. package/src/adapters/delivery.ts +137 -0
  139. package/src/adapters/deliveryState.ts +43 -0
  140. package/src/adapters/engine.ts +101 -0
  141. package/src/adapters/features.ts +62 -0
  142. package/src/adapters/handshake.ts +35 -0
  143. package/src/adapters/items.ts +133 -0
  144. package/src/adapters/mapping.ts +66 -0
  145. package/src/adapters/process.ts +69 -0
  146. package/src/adapters/protocol.ts +125 -0
  147. package/src/adapters/protocolItems.ts +113 -0
  148. package/src/adapters/rateLimits.ts +55 -0
  149. package/src/adapters/reads.ts +93 -0
  150. package/src/adapters/recovery.ts +44 -0
  151. package/src/adapters/residualApproval.ts +23 -0
  152. package/src/adapters/rpc.ts +8 -0
  153. package/src/adapters/rpcProtocol.ts +28 -0
  154. package/src/adapters/server.ts +96 -0
  155. package/src/adapters/session.ts +71 -0
  156. package/src/adapters/subagentItems.ts +73 -0
  157. package/src/adapters/tellCliVersionOnce.ts +20 -0
  158. package/src/adapters/threadClaims.ts +26 -0
  159. package/src/adapters/threadSweep.ts +79 -0
  160. package/src/adapters/threadTree.ts +149 -0
  161. package/src/adapters/turnRequests.ts +45 -0
  162. package/src/adapters/userMessageEvent.ts +22 -0
  163. package/src/codex.ts +15 -0
  164. package/src/config.ts +17 -0
@@ -0,0 +1,80 @@
1
+ import { Effect, PubSub, Semaphore, Stream } from "effect";
2
+ import { Rejected, UnknownAcceptance } from "@shivaedev/agent/failures.ts";
3
+ import { features } from "#adapters/features.ts";
4
+ import { observe, readRequest } from "#adapters/reads.ts";
5
+ import { receiptOf, recovery } from "#adapters/recovery.ts";
6
+ import { AppServer, openServer } from "#adapters/server.ts";
7
+ import { openSession } from "#adapters/session.ts";
8
+ import { sweepSpawnedDescendants } from "#adapters/threadSweep.ts";
9
+ export const engine = Effect.fn("Codex.engine")(function* (config, spawn) {
10
+ const server = yield* openServer(config, spawn);
11
+ const sessions = new Map();
12
+ const { operations, refusals, reconcile } = yield* recovery(sessions).pipe(Effect.provideService(AppServer, server));
13
+ const submissionGate = yield* Semaphore.make(1);
14
+ const submit = Effect.fn("Codex.submit")(function* (request, reference) {
15
+ if (operations.has(request.operationId)) {
16
+ const result = yield* reconcile(request.operationId);
17
+ if (result.type === "accepted") {
18
+ return result.receipt;
19
+ }
20
+ if (result.type === "not-accepted") {
21
+ return yield* new Rejected({ backend: "codex", message: result.evidence });
22
+ }
23
+ return yield* new UnknownAcceptance({
24
+ backend: "codex",
25
+ message: result.reason,
26
+ operationId: request.operationId,
27
+ });
28
+ }
29
+ if (reference !== undefined && (reference.version !== 1 || server.claims.isNode(reference.value))) {
30
+ return yield* new Rejected({ backend: "codex", message: "Child threads are observed passively and cannot be resumed" });
31
+ }
32
+ operations.set(request.operationId, reference?.value);
33
+ const session = yield* openSession(config, request, reference?.value, (operationId, threadId) => {
34
+ operations.set(operationId, threadId);
35
+ }).pipe(Effect.provideService(AppServer, server));
36
+ operations.set(request.operationId, session.threadId);
37
+ sessions.set(session.threadId, session);
38
+ yield* Effect.addFinalizer(() => Effect.sync(() => {
39
+ if (sessions.get(session.threadId) === session) {
40
+ sessions.delete(session.threadId);
41
+ }
42
+ }));
43
+ const turnId = yield* session.driver.start(request.input, request.operationId);
44
+ return receiptOf(request.operationId, session.threadId, turnId);
45
+ });
46
+ function start(request, session) {
47
+ return Semaphore.withPermit(submissionGate)(submit(request, session)).pipe(Effect.tapError((error) => Effect.sync(() => {
48
+ if (error._tag === "Rejected") {
49
+ refusals.set(request.operationId, error.message);
50
+ }
51
+ })));
52
+ }
53
+ const backend = {
54
+ backend: "codex",
55
+ events: (receipt) => Stream.unwrap(Effect.gen(function* () {
56
+ const session = sessions.get(receipt.session?.value ?? "");
57
+ if (session === undefined) {
58
+ return Stream.empty;
59
+ }
60
+ const subscription = yield* PubSub.subscribe(session.events);
61
+ return Stream.fromIterable([
62
+ { receipt, type: "acknowledged" },
63
+ { reference: session.threadId, type: "session.opened" },
64
+ ]).pipe(Stream.concat(Stream.fromSubscription(subscription)), Stream.interruptWhen(server.exited));
65
+ })),
66
+ features: yield* features(sessions, start).pipe(Effect.provideService(AppServer, server)),
67
+ inspect: (receipt) => observe(receipt).pipe(Effect.provideService(AppServer, server)),
68
+ reconcile,
69
+ start,
70
+ };
71
+ return {
72
+ backend: () => Effect.succeed(backend),
73
+ census: (rootThreadId) => sweepSpawnedDescendants((method, params) => readRequest(method, params).pipe(Effect.provideService(AppServer, server)), rootThreadId).pipe(Effect.tap((children) => Effect.sync(() => {
74
+ for (const child of children) {
75
+ server.claims.claim(rootThreadId, child.threadId);
76
+ }
77
+ }))),
78
+ };
79
+ });
80
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/adapters/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAG3D,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAgB,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,EAAE,MAA0B,EAAE,KAAyB;IAC/G,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC5C,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACrH,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,EACjD,OAAqE,EACrE,SAA8C;QAE9C,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACrD,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAChC,OAAO,MAAM,CAAC,OAAO,CAAC;YACvB,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACpC,OAAO,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO,KAAK,CAAC,CAAC,IAAI,iBAAiB,CAAC;gBACnC,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,MAAM,CAAC,MAAM;gBACtB,WAAW,EAAE,OAAO,CAAC,WAAW;aAChC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACnG,OAAO,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,4DAA4D,EAAE,CAAC,CAAC;QACzH,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,EAAE;YAC/F,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QAClD,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YAChB,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,OAAO,EAAE,CAAC;gBAChD,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnC,CAAC;QACF,CAAC,CAAC,CACF,CAAC;QACF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAC/E,OAAO,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IACH,SAAS,KAAK,CAAC,OAAqE,EAAE,OAA4C;QACjI,OAAO,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CACzE,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACzB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YAChB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC/B,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAClD,CAAC;QACF,CAAC,CAAC,CACF,CACD,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAsB;QAClC,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CACnB,MAAM,CAAC,MAAM,CACZ,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YAC3D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,MAAM,CAAC,KAAK,CAAC;YACrB,CAAC;YACD,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC7D,OAAO,MAAM,CAAC,YAAY,CAAW;gBACpC,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE;gBACjC,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE;aACvD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACpG,CAAC,CAAC,CACF;QACF,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACzF,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACrF,SAAS;QACT,KAAK;KACL,CAAC;IACF,OAAO;QACN,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QACtC,MAAM,EAAE,CAAC,YAAoB,EAAE,EAAE,CAChC,uBAAuB,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,CACzI,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACvB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YAChB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC9B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACnD,CAAC;QACF,CAAC,CAAC,CACF,CACD;KACF,CAAC;AACH,CAAC,CAAC,CAAC"}