@n8n/instance-ai 1.26.3 → 1.27.1

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 (98) hide show
  1. package/dist/agent/communication-style.prompt.d.ts +2 -0
  2. package/dist/agent/communication-style.prompt.js +73 -0
  3. package/dist/agent/communication-style.prompt.js.map +1 -0
  4. package/dist/agent/instance-agent.js +1 -2
  5. package/dist/agent/instance-agent.js.map +1 -1
  6. package/dist/agent/shared-prompts.d.ts +1 -1
  7. package/dist/agent/shared-prompts.js +1 -1
  8. package/dist/agent/shared-prompts.js.map +1 -1
  9. package/dist/agent/sub-agent-debriefing.d.ts +10 -0
  10. package/dist/agent/sub-agent-factory.d.ts +1 -1
  11. package/dist/agent/sub-agent-factory.js +3 -0
  12. package/dist/agent/sub-agent-factory.js.map +1 -1
  13. package/dist/agent/system-prompt.d.ts +3 -3
  14. package/dist/agent/system-prompt.js +19 -28
  15. package/dist/agent/system-prompt.js.map +1 -1
  16. package/dist/build.tsbuildinfo +1 -1
  17. package/dist/debug/run-debug-buffer.js +38 -1
  18. package/dist/debug/run-debug-buffer.js.map +1 -1
  19. package/dist/debug/sanitize-debug-snapshot.js +10 -7
  20. package/dist/debug/sanitize-debug-snapshot.js.map +1 -1
  21. package/dist/errors/index.d.ts +4 -0
  22. package/dist/errors/index.js +12 -0
  23. package/dist/errors/index.js.map +1 -0
  24. package/dist/index.d.ts +14 -6
  25. package/dist/index.js +17 -10
  26. package/dist/index.js.map +1 -1
  27. package/dist/prompts/prompt-profiles.d.ts +1 -0
  28. package/dist/prompts/prompt-profiles.js +11 -1
  29. package/dist/prompts/prompt-profiles.js.map +1 -1
  30. package/dist/runtime/instance-context-state.d.ts +96 -0
  31. package/dist/runtime/instance-context-state.js +12 -0
  32. package/dist/runtime/instance-context-state.js.map +1 -0
  33. package/dist/runtime/run-state-registry.d.ts +5 -0
  34. package/dist/runtime/run-state-registry.js +12 -0
  35. package/dist/runtime/run-state-registry.js.map +1 -1
  36. package/dist/stream/instance-context-reach.d.ts +4 -0
  37. package/dist/stream/instance-context-reach.js +49 -0
  38. package/dist/stream/instance-context-reach.js.map +1 -0
  39. package/dist/stream/work-summary-accumulator.d.ts +20 -0
  40. package/dist/stream/work-summary-accumulator.js +20 -1
  41. package/dist/stream/work-summary-accumulator.js.map +1 -1
  42. package/dist/tools/agent-context.tool.d.ts +154 -0
  43. package/dist/tools/agent-context.tool.js +125 -0
  44. package/dist/tools/agent-context.tool.js.map +1 -0
  45. package/dist/tools/conversation-history.tool.js +3 -10
  46. package/dist/tools/conversation-history.tool.js.map +1 -1
  47. package/dist/tools/credentials.tool.js +96 -22
  48. package/dist/tools/credentials.tool.js.map +1 -1
  49. package/dist/tools/executions.tool.js +12 -1
  50. package/dist/tools/executions.tool.js.map +1 -1
  51. package/dist/tools/index.js +19 -7
  52. package/dist/tools/index.js.map +1 -1
  53. package/dist/tools/nodes.tool.js +11 -3
  54. package/dist/tools/nodes.tool.js.map +1 -1
  55. package/dist/tools/orchestration/build-agent.tool.js +33 -15
  56. package/dist/tools/orchestration/build-agent.tool.js.map +1 -1
  57. package/dist/tools/save-user-preference.tool.d.ts +3 -0
  58. package/dist/tools/save-user-preference.tool.js +87 -0
  59. package/dist/tools/save-user-preference.tool.js.map +1 -0
  60. package/dist/tools/shared/safe-error-message.d.ts +3 -0
  61. package/dist/tools/shared/safe-error-message.js +11 -0
  62. package/dist/tools/shared/safe-error-message.js.map +1 -0
  63. package/dist/tools/tool-ids.d.ts +2 -2
  64. package/dist/tools/tool-ids.js +4 -4
  65. package/dist/tools/tool-ids.js.map +1 -1
  66. package/dist/tools/workflows/build-workflow.tool.js +49 -9
  67. package/dist/tools/workflows/build-workflow.tool.js.map +1 -1
  68. package/dist/tools/workflows/prepare-workflow-setup.d.ts +25 -0
  69. package/dist/tools/workflows/prepare-workflow-setup.js +114 -0
  70. package/dist/tools/workflows/prepare-workflow-setup.js.map +1 -0
  71. package/dist/tools/workflows/resolve-credentials.d.ts +1 -1
  72. package/dist/tools/workflows/resolve-credentials.js +10 -2
  73. package/dist/tools/workflows/resolve-credentials.js.map +1 -1
  74. package/dist/tools/workflows/setup-credential-selections.d.ts +15 -0
  75. package/dist/tools/workflows/setup-credential-selections.js +97 -0
  76. package/dist/tools/workflows/setup-credential-selections.js.map +1 -0
  77. package/dist/tools/workflows/setup-items.d.ts +2 -0
  78. package/dist/tools/workflows/setup-items.js +27 -11
  79. package/dist/tools/workflows/setup-items.js.map +1 -1
  80. package/dist/tools/workflows/workflow-file-bindings.d.ts +32 -2
  81. package/dist/tools/workflows/workflow-file-bindings.js +27 -5
  82. package/dist/tools/workflows/workflow-file-bindings.js.map +1 -1
  83. package/dist/tools/workflows.tool.js +5 -2
  84. package/dist/tools/workflows.tool.js.map +1 -1
  85. package/dist/types.d.ts +63 -15
  86. package/dist/types.js +2 -1
  87. package/dist/types.js.map +1 -1
  88. package/package.json +18 -10
  89. package/skills/agent-builder/SKILL.md +32 -2
  90. package/skills/debugging-executions/SKILL.md +53 -0
  91. package/skills/intent-recognition/SKILL.md +3 -3
  92. package/skills/workflow-builder/SKILL.md +21 -5
  93. package/dist/tools/agents.tool.d.ts +0 -2
  94. package/dist/tools/agents.tool.js +0 -40
  95. package/dist/tools/agents.tool.js.map +0 -1
  96. package/dist/tools/orchestration/list-agent-capabilities.tool.d.ts +0 -2
  97. package/dist/tools/orchestration/list-agent-capabilities.tool.js +0 -45
  98. package/dist/tools/orchestration/list-agent-capabilities.tool.js.map +0 -1
@@ -86,6 +86,10 @@ first move whenever the user is debugging a **read** node that already failed a
86
86
  real execution: the node ran for real once already, and a mock-only check is
87
87
  what sends the user back for a second session.
88
88
 
89
+ The action refuses a replay that would re-run a node above the target: an
90
+ unpinned one the execution never reached, one that failed there, or a loop
91
+ that did not finish. Pick another execution, or tell the user which node would run again.
92
+
89
93
  ### Decide whether the node is safe to run first
90
94
 
91
95
  A step run is a real run. The node uses the user's real credentials and reaches
@@ -142,6 +146,55 @@ Mocked input does **not** make a write node safe. The node still runs for real
142
146
  against the user's systems; only its input is invented, which makes the effect
143
147
  less predictable, not more.
144
148
 
149
+ ### Running a tool
150
+
151
+ A tool never runs on its own. n8n runs it through the node that owns it —
152
+ usually the Agent. A step run on a tool therefore behaves like a step run on
153
+ that Agent:
154
+
155
+ - `mockInput` feeds the **Agent's** input, not the tool's arguments.
156
+ - `reuseExecutionId` replays the nodes above the **Agent**.
157
+ - A chain run (neither option) runs every node above the Agent for real. Give
158
+ one of the two options when a node up there writes.
159
+ - `ranThroughNodeNames` lists **every** node that can run the tool, not the one
160
+ that ran it. A tool on several agents lists them all: the engine picks one,
161
+ and it does not report which. Do not name a single Agent to the user when
162
+ this field holds more than one.
163
+ - A tool on two Agents where one runs above the other is refused. Run the
164
+ upper Agent, then read the tool with `executions(action="get-node-output")`.
165
+
166
+ The tool's own arguments come from `toolArguments` — the values the agent would
167
+ normally decide:
168
+
169
+ ```
170
+ executions(action="run-step", workflowId, nodeName="Search Tickets Tool",
171
+ reuseExecutionId=<the failed execution>,
172
+ toolArguments={"query": "login fails", "status": "open"})
173
+ ```
174
+
175
+ The example targets a **read** tool on purpose. The write rule above holds here
176
+ too, and a tool hides the write behind a friendly name: a step run on a "Create
177
+ Ticket" tool creates the ticket again, and `toolArguments` does not change that.
178
+ Only run one when the user has accepted a second write.
179
+
180
+ Use the argument names from the node's `$fromAI` calls, which
181
+ `workflows(action="get-as-code")` shows. Pass a plain string instead for a tool
182
+ that takes one free-text input (Wikipedia, Code Tool, a vector store used as a
183
+ tool).
184
+
185
+ A tool that declares `$fromAI` arguments is refused without them: it would
186
+ otherwise fail for a reason that has nothing to do with the user's problem, and
187
+ you would report that as the defect. A node that holds several tools is refused
188
+ outright, because nothing here can name one of its tools the way the agent
189
+ does: the "MCP Client Tool" node, and every node the MCP registry added, whose
190
+ type is `@n8n/mcp-registry.<server slug>`. Run the Agent for those, and read
191
+ the node's output from that execution.
192
+
193
+ A sub-node that is not a tool — a model, memory, embeddings — cannot be run this
194
+ way at all. Run the Agent, and read the sub-node with
195
+ `executions(action="get-node-output")` on **that** execution: n8n records every
196
+ call a sub-node made while the Agent ran.
197
+
145
198
  ## Successful execution with wrong or empty value
146
199
 
147
200
  When `debug` doesn't apply because nothing errored, call
@@ -281,7 +281,7 @@ continuity for that primitive.
281
281
 
282
282
  **Unsupported capabilities**: when the user names a specific channel or
283
283
  capability for an agent (e.g. "WhatsApp", "Teams"), call
284
- `list-agent-capabilities` before classifying. If the named channel is
284
+ `agent-context` with `type: "capabilities"` before classifying. If the named channel is
285
285
  absent, it is unsupported for agents — do not classify the request as a
286
286
  workflow substitute, do not improvise workflow nodes to fake the channel,
287
287
  and do not claim it can be configured. Explain that it is unavailable for
@@ -396,7 +396,7 @@ valid, apply the growth tiebreaker instead of asking a theoretical preference.
396
396
  actions or whether an investigator must choose and adapt them.
397
397
  - "Build me an agent my team can @mention on WhatsApp to triage customer
398
398
  messages." -> **agent-anchored** (explicit agent artifact + chat
399
- interaction), but call `list-agent-capabilities` first: WhatsApp is absent,
399
+ interaction), but call `agent-context` with `type: "capabilities"` first: WhatsApp is absent,
400
400
  so do not build. Explain WhatsApp is unsupported for agents, offer the
401
401
  supported chat channels the tool returned, with their
402
402
  `capabilities`, and ask which to use — or whether the user wants a
@@ -438,7 +438,7 @@ valid, apply the growth tiebreaker instead of asking a theoretical preference.
438
438
  workflow-anchored pipeline. A Chat Trigger workflow is correct only when
439
439
  chat is merely the manual trigger for a fixed graph.
440
440
  - Never improvise a workflow substitute for an unsupported agent channel or
441
- capability. When the user names a channel not in `list-agent-capabilities`,
441
+ capability. When the user names a channel not returned by `agent-context`,
442
442
  explain the limitation and offer supported alternatives — do not add
443
443
  workflow nodes that fake the channel or silently translate the request
444
444
  into a workflow change.
@@ -59,6 +59,20 @@ first action turn (each extra sequential turn resends the whole context). When
59
59
  unsure which nodes to use, load this skill first and follow its research
60
60
  process below.
61
61
 
62
+ ## Early service connections
63
+
64
+ When the `credentials(action="setup")` schema offers `filePath`, announce
65
+ known service credentials immediately after the first node definitions or
66
+ credential type search. Do this before detailed planning, SDK research, or
67
+ source generation. Do not wait for every service to be resolved.
68
+
69
+ Pick the source `filePath` and call credential setup with the complete list
70
+ of types known so far. Make it the only tool call in that response. Wait for
71
+ its successful `preBuild: true` result before continuing. Add later discoveries
72
+ with another complete list. Do not batch setup with source writing.
73
+
74
+ When early setup is unavailable, keep the post-build setup flow below.
75
+
62
76
  ## Repair Strategy
63
77
 
64
78
  When the edit is to fix a node the user reports as erroring or showing a red
@@ -97,10 +111,12 @@ resources, credentials, channel IDs, or timezone; use placeholders or unresolved
97
111
  for a capability the user did not name,
98
112
  discover coverage first and use a Gateway credits–covered node instead of asking
99
113
  when the user has no credential for a comparable tool (see Gateway credits
100
- Preference). Setup details — recipients, accounts,
101
- resources, channels, credentials, timezone — belong in placeholders or
102
- unresolved `newCredential()` calls until post-build setup. After the first
103
- build, use `ask-user` when stuck or genuinely ambiguous; do not retry the same
114
+ Preference). Setup details such as recipients, accounts, resources,
115
+ channels, credentials, and timezone belong in placeholders or
116
+ unresolved `newCredential()` calls. Announce known credentials through early
117
+ setup when available, then continue building without waiting for the user.
118
+ After the first build, resolve remaining setup and use `ask-user` when stuck
119
+ or when choices are ambiguous; do not retry the same
104
120
  failing approach more than twice. Never re-ask an answered, deferred, or skipped
105
121
  question. A skip grants no additional permission. Choose defaults only for
106
122
  unspecified details within the requested task. If a skipped question seeks
@@ -978,7 +994,7 @@ For AI Agent workflows:
978
994
 
979
995
  After building a workflow that uses a trigger with an HTTP endpoint, share the
980
996
  full production URL with the user. Use the Webhook base URL and Form base URL
981
- from Instance Info in the system prompt. Each trigger type has a distinct
997
+ from the `<instance-urls>` block in the user's turn. Each trigger type has a distinct
982
998
  pattern:
983
999
 
984
1000
  - **Webhook Trigger**: `{webhookBaseUrl}/{path}` (where `{path}` is the node's
@@ -1,2 +0,0 @@
1
- import type { OrchestrationContext } from '../types';
2
- export declare function createAgentsTool(context: OrchestrationContext): import("@n8n/agents").BuiltTool;
@@ -1,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createAgentsTool = createAgentsTool;
4
- const agents_1 = require("@n8n/agents");
5
- const zod_1 = require("zod");
6
- const tool_ids_1 = require("./tool-ids");
7
- const agentsInputSchema = zod_1.z.object({
8
- action: zod_1.z
9
- .literal('list')
10
- .describe('List the n8n Agents in this project (id, name, published state, last update), most recently updated first.'),
11
- });
12
- const agentsOutputSchema = zod_1.z.object({
13
- count: zod_1.z.number(),
14
- agents: zod_1.z.array(zod_1.z.object({
15
- agentId: zod_1.z.string(),
16
- name: zod_1.z.string(),
17
- published: zod_1.z.boolean(),
18
- updatedAt: zod_1.z.string(),
19
- })),
20
- });
21
- function createAgentsTool(context) {
22
- return new agents_1.Tool(tool_ids_1.DOMAIN_TOOL_IDS.AGENTS)
23
- .description('List the n8n Agent artifacts in this project — id, name, published state, and last ' +
24
- 'update, most recently updated first. Use it to answer questions about existing ' +
25
- 'agents and to find the `agentId` to pass to `build-agent` when the user wants to ' +
26
- 'edit an agent that was not built in this conversation. Read-only; agents are ' +
27
- 'created and edited via `build-agent`.')
28
- .input(agentsInputSchema)
29
- .output(agentsOutputSchema)
30
- .handler(async () => {
31
- const delegate = context.domainContext?.builderDelegate;
32
- if (!delegate) {
33
- throw new Error('Agent listing is not available on this instance.');
34
- }
35
- const agents = await delegate.listAgents();
36
- return { count: agents.length, agents };
37
- })
38
- .build();
39
- }
40
- //# sourceMappingURL=agents.tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agents.tool.js","sourceRoot":"","sources":["../../src/tools/agents.tool.ts"],"names":[],"mappings":";;;AAMA,wCAAmC;AACnC,6BAAwB;AAGxB,yCAA6C;AAE7C,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,OAAC;SACP,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CACR,4GAA4G,CAC5G;CACF,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,OAAC,CAAC,KAAK,CACd,OAAC,CAAC,MAAM,CAAC;QACR,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;QACnB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;QAChB,SAAS,EAAE,OAAC,CAAC,OAAO,EAAE;QACtB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;KACrB,CAAC,CACF;CACD,CAAC,CAAC;AAEH,0BAAiC,OAA6B;IAC7D,OAAO,IAAI,aAAI,CAAC,0BAAe,CAAC,MAAM,CAAC;SACrC,WAAW,CACX,qFAAqF;QACpF,iFAAiF;QACjF,mFAAmF;QACnF,+EAA+E;QAC/E,uCAAuC,CACxC;SACA,KAAK,CAAC,iBAAiB,CAAC;SACxB,MAAM,CAAC,kBAAkB,CAAC;SAC1B,OAAO,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,eAAe,CAAC;QACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IACzC,CAAC,CAAC;SACD,KAAK,EAAE,CAAC;AACX,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { OrchestrationContext } from '../../types';
2
- export declare function createListAgentCapabilitiesTool(context: OrchestrationContext): import("@n8n/agents").BuiltTool;
@@ -1,45 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createListAgentCapabilitiesTool = createListAgentCapabilitiesTool;
4
- const agents_1 = require("@n8n/agents");
5
- const zod_1 = require("zod");
6
- const tool_ids_1 = require("../tool-ids");
7
- const chatIntegrationDescriptorSchema = zod_1.z.object({
8
- type: zod_1.z.string(),
9
- label: zod_1.z.string(),
10
- icon: zod_1.z.string(),
11
- credentialTypes: zod_1.z.array(zod_1.z.string()),
12
- capabilities: zod_1.z.array(zod_1.z.string()).optional(),
13
- useIntegrationWhen: zod_1.z.array(zod_1.z.string()).optional(),
14
- useNodeToolWhen: zod_1.z.array(zod_1.z.string()).optional(),
15
- });
16
- const listAgentCapabilitiesOutputSchema = zod_1.z.object({
17
- channels: zod_1.z.array(chatIntegrationDescriptorSchema),
18
- agentCapabilities: zod_1.z.array(zod_1.z.string()),
19
- limitations: zod_1.z.array(zod_1.z.string()),
20
- });
21
- function createListAgentCapabilitiesTool(context) {
22
- return new agents_1.Tool(tool_ids_1.ORCHESTRATION_TOOL_IDS.LIST_AGENT_CAPABILITIES)
23
- .description('List what n8n Agents can do and the chat-channel integrations they support. ' +
24
- "Returns each supported channel's `type`, `label`, supported credential types, " +
25
- 'and builder guidance (`capabilities`, `useIntegrationWhen`, `useNodeToolWhen`), ' +
26
- 'plus `agentCapabilities` (what an agent can do beyond chat) and `limitations` ' +
27
- '(agent-level constraints to respect when planning a build). ' +
28
- 'Call this before building or modifying an agent whenever the user names a ' +
29
- 'specific channel or capability (e.g. WhatsApp, Teams): if the named channel ' +
30
- 'is absent from `channels`, it is unsupported for agents — explain the ' +
31
- 'limitation and offer the listed alternatives instead of improvising a ' +
32
- 'workflow substitute or claiming it is configured. Read-only; channels and ' +
33
- 'capabilities are configured via `build-agent`.')
34
- .input(zod_1.z.object({}))
35
- .output(listAgentCapabilitiesOutputSchema)
36
- .handler(async () => {
37
- const delegate = context.domainContext?.builderDelegate;
38
- if (!delegate) {
39
- throw new Error('Agent capabilities are not available on this instance.');
40
- }
41
- return await delegate.listAgentCapabilities();
42
- })
43
- .build();
44
- }
45
- //# sourceMappingURL=list-agent-capabilities.tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-agent-capabilities.tool.js","sourceRoot":"","sources":["../../../src/tools/orchestration/list-agent-capabilities.tool.ts"],"names":[],"mappings":";;;AAWA,wCAAmC;AACnC,6BAAwB;AAGxB,0CAAqD;AAErD,MAAM,+BAA+B,GAAG,OAAC,CAAC,MAAM,CAAC;IAChD,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,eAAe,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;IACpC,YAAY,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC5C,kBAAkB,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAClD,eAAe,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC/C,CAAC,CAAC;AAEH,MAAM,iCAAiC,GAAG,OAAC,CAAC,MAAM,CAAC;IAElD,QAAQ,EAAE,OAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC;IAElD,iBAAiB,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;IAEtC,WAAW,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;CAChC,CAAC,CAAC;AAEH,yCAAgD,OAA6B;IAC5E,OAAO,IAAI,aAAI,CAAC,iCAAsB,CAAC,uBAAuB,CAAC;SAC7D,WAAW,CACX,8EAA8E;QAC7E,gFAAgF;QAChF,kFAAkF;QAClF,gFAAgF;QAChF,8DAA8D;QAC9D,4EAA4E;QAC5E,8EAA8E;QAC9E,wEAAwE;QACxE,wEAAwE;QACxE,4EAA4E;QAC5E,gDAAgD,CACjD;SACA,KAAK,CAAC,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACnB,MAAM,CAAC,iCAAiC,CAAC;SACzC,OAAO,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,eAAe,CAAC;QACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC3E,CAAC;QAID,OAAO,MAAM,QAAQ,CAAC,qBAAqB,EAAE,CAAC;IAC/C,CAAC,CAAC;SACD,KAAK,EAAE,CAAC;AACX,CAAC"}