@cleocode/core 2026.6.6 → 2026.6.8

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 (168) hide show
  1. package/dist/db/index.d.ts +5 -1
  2. package/dist/db/index.d.ts.map +1 -1
  3. package/dist/db/index.js +5 -1
  4. package/dist/db/index.js.map +1 -1
  5. package/dist/dispatch/contracts/output-contracts.d.ts +36 -0
  6. package/dist/dispatch/contracts/output-contracts.d.ts.map +1 -0
  7. package/dist/dispatch/contracts/output-contracts.js +38 -0
  8. package/dist/dispatch/contracts/output-contracts.js.map +1 -0
  9. package/dist/dispatch/describe-operation.d.ts +98 -0
  10. package/dist/dispatch/describe-operation.d.ts.map +1 -0
  11. package/dist/dispatch/describe-operation.js +101 -0
  12. package/dist/dispatch/describe-operation.js.map +1 -0
  13. package/dist/docs/build-provenance-graph.d.ts +12 -0
  14. package/dist/docs/build-provenance-graph.d.ts.map +1 -1
  15. package/dist/docs/build-provenance-graph.js +52 -0
  16. package/dist/docs/build-provenance-graph.js.map +1 -1
  17. package/dist/docs/docs-read-model.d.ts +40 -0
  18. package/dist/docs/docs-read-model.d.ts.map +1 -1
  19. package/dist/docs/docs-read-model.js +29 -0
  20. package/dist/docs/docs-read-model.js.map +1 -1
  21. package/dist/docs/export-document.js +1794 -1235
  22. package/dist/docs/export-document.js.map +3 -3
  23. package/dist/docs/index.d.ts +4 -0
  24. package/dist/docs/index.d.ts.map +1 -1
  25. package/dist/docs/index.js +2 -0
  26. package/dist/docs/index.js.map +1 -1
  27. package/dist/docs/read-doc.d.ts +60 -0
  28. package/dist/docs/read-doc.d.ts.map +1 -0
  29. package/dist/docs/read-doc.js +188 -0
  30. package/dist/docs/read-doc.js.map +1 -0
  31. package/dist/docs/wikilinks.d.ts +119 -0
  32. package/dist/docs/wikilinks.d.ts.map +1 -0
  33. package/dist/docs/wikilinks.js +217 -0
  34. package/dist/docs/wikilinks.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +5 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/internal.d.ts +2 -0
  40. package/dist/internal.d.ts.map +1 -1
  41. package/dist/internal.js +6 -0
  42. package/dist/internal.js.map +1 -1
  43. package/dist/llm/index.d.ts +1 -3
  44. package/dist/llm/index.d.ts.map +1 -1
  45. package/dist/llm/index.js +1 -2
  46. package/dist/llm/index.js.map +1 -1
  47. package/dist/llm/model-metadata.d.ts +14 -0
  48. package/dist/llm/model-metadata.d.ts.map +1 -1
  49. package/dist/llm/model-metadata.js +23 -0
  50. package/dist/llm/model-metadata.js.map +1 -1
  51. package/dist/llm/model-runner.d.ts.map +1 -1
  52. package/dist/llm/model-runner.js +104 -74
  53. package/dist/llm/model-runner.js.map +1 -1
  54. package/dist/llm/plugin-facade.js +1947 -1364
  55. package/dist/llm/plugin-facade.js.map +3 -3
  56. package/dist/llm/provider-registry/builtin/anthropic.d.ts.map +1 -1
  57. package/dist/llm/provider-registry/builtin/anthropic.js +4 -0
  58. package/dist/llm/provider-registry/builtin/anthropic.js.map +1 -1
  59. package/dist/llm/provider-registry/builtin/gemini.d.ts.map +1 -1
  60. package/dist/llm/provider-registry/builtin/gemini.js +4 -0
  61. package/dist/llm/provider-registry/builtin/gemini.js.map +1 -1
  62. package/dist/llm/provider-registry/builtin/ollama.d.ts.map +1 -1
  63. package/dist/llm/provider-registry/builtin/ollama.js +4 -0
  64. package/dist/llm/provider-registry/builtin/ollama.js.map +1 -1
  65. package/dist/llm/provider-registry/builtin/openai.d.ts.map +1 -1
  66. package/dist/llm/provider-registry/builtin/openai.js +6 -0
  67. package/dist/llm/provider-registry/builtin/openai.js.map +1 -1
  68. package/dist/llm/transports/index.d.ts +5 -3
  69. package/dist/llm/transports/index.d.ts.map +1 -1
  70. package/dist/llm/transports/index.js +5 -2
  71. package/dist/llm/transports/index.js.map +1 -1
  72. package/dist/reconciliation/reconciliation-engine.d.ts.map +1 -1
  73. package/dist/reconciliation/reconciliation-engine.js +3 -0
  74. package/dist/reconciliation/reconciliation-engine.js.map +1 -1
  75. package/dist/release/plan.d.ts +27 -0
  76. package/dist/release/plan.d.ts.map +1 -1
  77. package/dist/release/plan.js +36 -2
  78. package/dist/release/plan.js.map +1 -1
  79. package/dist/release/provenance-fk.d.ts +74 -0
  80. package/dist/release/provenance-fk.d.ts.map +1 -0
  81. package/dist/release/provenance-fk.js +122 -0
  82. package/dist/release/provenance-fk.js.map +1 -0
  83. package/dist/release/reconcile.d.ts +2 -53
  84. package/dist/release/reconcile.d.ts.map +1 -1
  85. package/dist/release/reconcile.js +13 -93
  86. package/dist/release/reconcile.js.map +1 -1
  87. package/dist/sticky/convert.d.ts.map +1 -1
  88. package/dist/sticky/convert.js +3 -0
  89. package/dist/sticky/convert.js.map +1 -1
  90. package/dist/store/dual-scope-db.d.ts +83 -0
  91. package/dist/store/dual-scope-db.d.ts.map +1 -1
  92. package/dist/store/dual-scope-db.js +135 -6
  93. package/dist/store/dual-scope-db.js.map +1 -1
  94. package/dist/store/exodus/abort-events.d.ts +116 -0
  95. package/dist/store/exodus/abort-events.d.ts.map +1 -0
  96. package/dist/store/exodus/abort-events.js +130 -0
  97. package/dist/store/exodus/abort-events.js.map +1 -0
  98. package/dist/store/exodus/column-transforms.d.ts +35 -8
  99. package/dist/store/exodus/column-transforms.d.ts.map +1 -1
  100. package/dist/store/exodus/column-transforms.js +47 -13
  101. package/dist/store/exodus/column-transforms.js.map +1 -1
  102. package/dist/store/exodus/count-parity.d.ts +71 -0
  103. package/dist/store/exodus/count-parity.d.ts.map +1 -0
  104. package/dist/store/exodus/count-parity.js +124 -0
  105. package/dist/store/exodus/count-parity.js.map +1 -0
  106. package/dist/store/exodus/health.d.ts +70 -0
  107. package/dist/store/exodus/health.d.ts.map +1 -0
  108. package/dist/store/exodus/health.js +130 -0
  109. package/dist/store/exodus/health.js.map +1 -0
  110. package/dist/store/exodus/index.d.ts +4 -0
  111. package/dist/store/exodus/index.d.ts.map +1 -1
  112. package/dist/store/exodus/index.js +4 -0
  113. package/dist/store/exodus/index.js.map +1 -1
  114. package/dist/store/exodus/migrate.d.ts.map +1 -1
  115. package/dist/store/exodus/migrate.js +98 -31
  116. package/dist/store/exodus/migrate.js.map +1 -1
  117. package/dist/store/exodus/plan.d.ts +48 -4
  118. package/dist/store/exodus/plan.d.ts.map +1 -1
  119. package/dist/store/exodus/plan.js +67 -9
  120. package/dist/store/exodus/plan.js.map +1 -1
  121. package/dist/store/exodus/seal.d.ts +69 -0
  122. package/dist/store/exodus/seal.d.ts.map +1 -0
  123. package/dist/store/exodus/seal.js +73 -0
  124. package/dist/store/exodus/seal.js.map +1 -0
  125. package/dist/store/exodus/types.d.ts +24 -1
  126. package/dist/store/exodus/types.d.ts.map +1 -1
  127. package/dist/store/exodus/types.js.map +1 -1
  128. package/dist/store/exodus/verify-migration.d.ts.map +1 -1
  129. package/dist/store/exodus/verify-migration.js +53 -26
  130. package/dist/store/exodus/verify-migration.js.map +1 -1
  131. package/dist/store/repair-malformed-dbs.d.ts +87 -0
  132. package/dist/store/repair-malformed-dbs.d.ts.map +1 -0
  133. package/dist/store/repair-malformed-dbs.js +188 -0
  134. package/dist/store/repair-malformed-dbs.js.map +1 -0
  135. package/dist/store/schema/attachments.d.ts +133 -0
  136. package/dist/store/schema/attachments.d.ts.map +1 -1
  137. package/dist/store/schema/attachments.js +63 -0
  138. package/dist/store/schema/attachments.js.map +1 -1
  139. package/dist/tasks/add.d.ts +13 -0
  140. package/dist/tasks/add.d.ts.map +1 -1
  141. package/dist/tasks/add.js +50 -18
  142. package/dist/tasks/add.js.map +1 -1
  143. package/dist/tasks/archive.d.ts.map +1 -1
  144. package/dist/tasks/archive.js +12 -7
  145. package/dist/tasks/archive.js.map +1 -1
  146. package/dist/tasks/child-disposition.d.ts +66 -0
  147. package/dist/tasks/child-disposition.d.ts.map +1 -0
  148. package/dist/tasks/child-disposition.js +80 -0
  149. package/dist/tasks/child-disposition.js.map +1 -0
  150. package/dist/tasks/delete-preview.js +1 -1
  151. package/dist/tasks/delete-preview.js.map +1 -1
  152. package/dist/tasks/deletion-strategy.d.ts +21 -3
  153. package/dist/tasks/deletion-strategy.d.ts.map +1 -1
  154. package/dist/tasks/deletion-strategy.js +61 -15
  155. package/dist/tasks/deletion-strategy.js.map +1 -1
  156. package/dist/tasks/engine-wrap.d.ts +8 -0
  157. package/dist/tasks/engine-wrap.d.ts.map +1 -1
  158. package/dist/tasks/engine-wrap.js +22 -9
  159. package/dist/tasks/engine-wrap.js.map +1 -1
  160. package/dist/tasks/update.d.ts.map +1 -1
  161. package/dist/tasks/update.js +12 -0
  162. package/dist/tasks/update.js.map +1 -1
  163. package/migrations/drizzle-tasks/20260605000001_t11826-docs-wikilinks/migration.sql +110 -0
  164. package/package.json +12 -12
  165. package/dist/llm/transports/openai.d.ts +0 -181
  166. package/dist/llm/transports/openai.d.ts.map +0 -1
  167. package/dist/llm/transports/openai.js +0 -645
  168. package/dist/llm/transports/openai.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cleocode/core",
3
- "version": "2026.6.6",
3
+ "version": "2026.6.8",
4
4
  "description": "CLEO core business logic kernel — tasks, sessions, memory, orchestration, lifecycle, with bundled SQLite store",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -429,16 +429,16 @@
429
429
  "write-file-atomic": "^7.0.1",
430
430
  "yaml": "^2.8.3",
431
431
  "zod": "^4.3.6",
432
- "@cleocode/adapters": "2026.6.6",
433
- "@cleocode/agents": "2026.6.6",
434
- "@cleocode/contracts": "2026.6.6",
435
- "@cleocode/git-shim": "2026.6.6",
436
- "@cleocode/caamp": "2026.6.6",
437
- "@cleocode/lafs": "2026.6.6",
438
- "@cleocode/nexus": "2026.6.6",
439
- "@cleocode/skills": "2026.6.6",
440
- "@cleocode/paths": "2026.6.6",
441
- "@cleocode/worktree": "2026.6.6"
432
+ "@cleocode/adapters": "2026.6.8",
433
+ "@cleocode/agents": "2026.6.8",
434
+ "@cleocode/caamp": "2026.6.8",
435
+ "@cleocode/git-shim": "2026.6.8",
436
+ "@cleocode/contracts": "2026.6.8",
437
+ "@cleocode/lafs": "2026.6.8",
438
+ "@cleocode/paths": "2026.6.8",
439
+ "@cleocode/nexus": "2026.6.8",
440
+ "@cleocode/worktree": "2026.6.8",
441
+ "@cleocode/skills": "2026.6.8"
442
442
  },
443
443
  "engines": {
444
444
  "node": ">=24.16.0"
@@ -472,7 +472,7 @@
472
472
  },
473
473
  "optionalDependencies": {
474
474
  "llmtxt": "^2026.5.15",
475
- "@cleocode/studio": "^2026.6.6"
475
+ "@cleocode/studio": "^2026.6.8"
476
476
  },
477
477
  "scripts": {
478
478
  "build": "tsc",
@@ -1,181 +0,0 @@
1
- /**
2
- * OpenAI LLM transport — real implementation.
3
- *
4
- * Migrated from {@link OpenAIBackend} (`backends/openai.ts`), adapted to the
5
- * provider-neutral {@link LlmTransport} interface. Behavior is preserved
6
- * verbatim; only the constructor signature and I/O types change to match the
7
- * Phase-4 transport contract.
8
- *
9
- * Key behavioral invariants (each enforced with `@invariant` TSDoc at the
10
- * enforcement site):
11
- *
12
- * 1. `usesMaxCompletionTokens` o-series branching — `gpt-5*`, `o1*`, `o3*`,
13
- * `o4*` use `max_completion_tokens`; all others use `max_tokens`.
14
- * 2. `extractReasoningContent` intentional try/catch swallow — NEVER re-throws.
15
- * Returns null on any parse error.
16
- * 3. `parse()` vs `json_schema` streaming split — `complete()` may use `.parse()`
17
- * for non-streaming structured output; `stream()` NEVER uses `.parse()`,
18
- * always `json_schema` response_format.
19
- *
20
- * @module llm/transports/openai
21
- * @task T9284 (W1b)
22
- * @epic T-LLM-CRED-CENTRALIZATION
23
- * @see ADR-072 §LlmTransport — pure wire level
24
- */
25
- import type { NormalizedDelta, TransportContext } from '@cleocode/contracts/llm/interfaces.js';
26
- import type { LlmTransport, NormalizedResponse, TransportRequest } from '@cleocode/contracts/llm/normalized-response.js';
27
- import type { ApiMode } from '@cleocode/contracts/llm/provider-id.js';
28
- /**
29
- * Options accepted by {@link OpenAITransport}.
30
- *
31
- * Structurally identical to `AnthropicTransportOptions` so the role-resolver
32
- * can swap providers by swapping only the constructor reference.
33
- */
34
- export interface OpenAITransportOptions {
35
- /** API key or bearer token. */
36
- apiKey: string;
37
- /** Override base URL (e.g. Azure OpenAI endpoint). */
38
- baseUrl?: string;
39
- /** Extra headers merged into every SDK request. */
40
- defaultHeaders?: Record<string, string>;
41
- }
42
- /**
43
- * Determine if the model requires `max_completion_tokens` instead of `max_tokens`.
44
- *
45
- * @invariant usesMaxCompletionTokens o-series branching — `gpt-5`, `gpt-5-*`,
46
- * `gpt-5.*`, `o1*`, `o3*`, `o4*` use `max_completion_tokens`; all others use
47
- * `max_tokens`. Exported with the SAME name and signature as the old backend
48
- * so all callers via `index.ts` continue to work without change.
49
- *
50
- * @param model - Provider model identifier to test.
51
- * @returns `true` when the model family requires `max_completion_tokens`.
52
- */
53
- export declare function usesMaxCompletionTokens(model: string): boolean;
54
- /**
55
- * Real OpenAI transport.
56
- *
57
- * Wraps the `openai` SDK and normalizes requests/responses to/from the
58
- * provider-neutral {@link LlmTransport} interface. Supports o-series models
59
- * (via `max_completion_tokens` branching), structured output (via `json_schema`
60
- * response_format or Zod `.parse()`), streaming, and reasoning content
61
- * extraction.
62
- *
63
- * @example
64
- * ```ts
65
- * const transport = new OpenAITransport({ apiKey: process.env.OPENAI_API_KEY! });
66
- * const response = await transport.complete({
67
- * model: 'gpt-4o',
68
- * messages: [{ role: 'user', content: 'Hello' }],
69
- * maxTokens: 1024,
70
- * });
71
- * ```
72
- */
73
- export declare class OpenAITransport implements LlmTransport {
74
- /** Provider identifier — always `'openai'`. */
75
- readonly provider: "openai";
76
- /**
77
- * Wire protocol spoken by this transport — always `'chat_completions'`.
78
- *
79
- * @see ADR-072 §Type lock-in
80
- */
81
- readonly apiMode: ApiMode;
82
- private readonly _client;
83
- /**
84
- * Create an `OpenAITransport`.
85
- *
86
- * @param options - API key, optional base URL, and optional extra headers.
87
- */
88
- constructor(options: OpenAITransportOptions);
89
- /**
90
- * Execute a single completion call against the OpenAI chat completions API.
91
- *
92
- * Maps provider-neutral {@link TransportRequest} to the `openai` SDK
93
- * `chat.completions.create` call, then normalizes the response to
94
- * {@link NormalizedResponse}.
95
- *
96
- * When `request` carries a Zod-schema `responseFormat`, uses `.parse()` for
97
- * non-streaming structured output (the only path where `.parse()` is safe).
98
- *
99
- * @invariant parse() vs json_schema streaming split — `complete()` is the ONLY
100
- * path that may use `.parse()` for structured output. `stream()` MUST NOT use
101
- * `.parse()` — it always uses `json_schema` response_format instead.
102
- *
103
- * @param request - Provider-neutral request parameters.
104
- * @param _ctx - Transport context (unused by this transport).
105
- * @returns Normalized response including content, tool calls, usage, and raw SDK object.
106
- */
107
- complete(request: TransportRequest, _ctx?: TransportContext): Promise<NormalizedResponse>;
108
- /**
109
- * Stream a completion against the OpenAI chat completions API.
110
- *
111
- * Yields {@link NormalizedDelta} chunks including incremental text deltas and
112
- * tool-call argument deltas. The final delta carries `stopReason` and `usage`.
113
- *
114
- * Tool-call streaming sequence per tool index:
115
- * 1. First chunk for index `i` (`tool_calls[i].function.name` present) → yields
116
- * `toolCallDelta` with `{ index, name, argumentsChunk }` (start marker).
117
- * 2. Subsequent chunks (name absent) → yields `toolCallDelta` with
118
- * `{ index, argumentsChunk }` (incremental JSON fragment).
119
- *
120
- * @invariant T9316 tool-call streaming parity — emits same toolCallDelta shape
121
- * as AnthropicTransport and ChatCompletionsTransport.
122
- *
123
- * @invariant parse() vs json_schema streaming split — `stream()` MUST NOT use
124
- * `.parse()` for structured output. When a `responseFormat` schema is present,
125
- * only `json_schema` response_format is used. `.parse()` would block the
126
- * stream since the full JSON must be assembled first — use `complete()` instead.
127
- *
128
- * @param request - Provider-neutral request parameters.
129
- * @param _ctx - Transport context (unused by this transport).
130
- * @returns An async iterable of normalized delta chunks.
131
- */
132
- stream(request: TransportRequest, _ctx: TransportContext): AsyncIterable<NormalizedDelta>;
133
- /**
134
- * Returns true when the error signals a credential rotation should be attempted.
135
- *
136
- * @param err - The error thrown by the provider SDK.
137
- * @returns Whether a credential rotation should be attempted.
138
- */
139
- shouldRotateCredential(err: unknown): boolean;
140
- /**
141
- * Build the OpenAI API request params from normalized request fields.
142
- *
143
- * @invariant usesMaxCompletionTokens o-series branching — sets
144
- * `max_completion_tokens` for gpt-5* / o1* / o3* / o4* models;
145
- * `max_tokens` for all others.
146
- */
147
- private _buildParams;
148
- /**
149
- * Normalize a raw OpenAI SDK response into {@link NormalizedResponse}.
150
- *
151
- * @param response - Raw `OpenAI.ChatCompletion` from the SDK.
152
- * @param modelName - Model identifier (carried into the response envelope).
153
- * @param contentOverride - When set, replaces the message content (used for structured output).
154
- */
155
- private _normalizeResponse;
156
- /**
157
- * Convert provider-neutral tools to OpenAI `function` tool format.
158
- *
159
- * Already-converted inputs (first element has `type: 'function'`) are passed
160
- * through unchanged.
161
- */
162
- private _convertTools;
163
- /**
164
- * Extract a Zod schema from a class or constructor that carries a `.schema`
165
- * property or IS a ZodType.
166
- *
167
- * Accepts `unknown` because at runtime the value can be a constructor with a
168
- * static `.schema`, a Zod type instance, or neither — narrowed via type
169
- * guards rather than `as unknown as` chains (T9767).
170
- */
171
- private _zodSchemaFrom;
172
- /**
173
- * Convert a Zod schema to a minimal JSON Schema object for the
174
- * `json_schema` response_format.
175
- *
176
- * Uses `.shape` for `ZodObject`; returns `{}` for other Zod types.
177
- * Full support would require `zod-to-json-schema` — this covers the common case.
178
- */
179
- private _zodToJsonSchema;
180
- }
181
- //# sourceMappingURL=openai.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/llm/transports/openai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAC/F,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAGlB,gBAAgB,EACjB,MAAM,gDAAgD,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAatE;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAO9D;AAsND;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,+CAA+C;IAC/C,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IAEtC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAA+B;IAExD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IAEvC;;;;OAIG;gBACS,OAAO,EAAE,sBAAsB;IAQ3C;;;;;;;;;;;;;;;;;OAiBG;IACG,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAsG/F;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACI,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,GAAG,aAAa,CAAC,eAAe,CAAC;IAmKhG;;;;;OAKG;IACH,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAY7C;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAkDpB;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IA+D1B;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAYrB;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc;IAQtB;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;CAazB"}