@xemahq/opencode-xema-plugin 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.
- package/README.md +33 -40
- package/dist/.source-stamp.json +2 -2
- package/dist/context.d.ts +5 -15
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +4 -14
- package/dist/context.js.map +1 -1
- package/dist/hooks/compaction-invariants.d.ts +8 -0
- package/dist/hooks/compaction-invariants.d.ts.map +1 -0
- package/dist/hooks/compaction-invariants.js +60 -0
- package/dist/hooks/compaction-invariants.js.map +1 -0
- package/dist/hooks/root-turn-completion.d.ts +14 -0
- package/dist/hooks/root-turn-completion.d.ts.map +1 -0
- package/dist/hooks/root-turn-completion.js +84 -0
- package/dist/hooks/root-turn-completion.js.map +1 -0
- package/dist/hooks/shell-env-hygiene.d.ts +6 -0
- package/dist/hooks/shell-env-hygiene.d.ts.map +1 -0
- package/dist/hooks/shell-env-hygiene.js +10 -0
- package/dist/hooks/shell-env-hygiene.js.map +1 -0
- package/dist/hooks/subagent-fanout-ceiling.d.ts +18 -17
- package/dist/hooks/subagent-fanout-ceiling.d.ts.map +1 -1
- package/dist/hooks/subagent-fanout-ceiling.js +106 -92
- package/dist/hooks/subagent-fanout-ceiling.js.map +1 -1
- package/dist/hooks/system-overlay.d.ts +6 -0
- package/dist/hooks/system-overlay.d.ts.map +1 -0
- package/dist/hooks/system-overlay.js +40 -0
- package/dist/hooks/system-overlay.js.map +1 -0
- package/dist/hooks/tool-surface-observation.d.ts +14 -0
- package/dist/hooks/tool-surface-observation.d.ts.map +1 -0
- package/dist/hooks/tool-surface-observation.js +30 -0
- package/dist/hooks/tool-surface-observation.js.map +1 -0
- package/dist/hooks/workspace-listing.js +3 -3
- package/dist/hooks/workspace-listing.js.map +1 -1
- package/dist/index.d.ts +9 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -81
- package/dist/index.js.map +1 -1
- package/dist/plugin-id.d.ts +2 -0
- package/dist/plugin-id.d.ts.map +1 -0
- package/dist/plugin-id.js +2 -0
- package/dist/plugin-id.js.map +1 -0
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +86 -0
- package/dist/plugin.js.map +1 -0
- package/dist/runtime-events.d.ts +17 -0
- package/dist/runtime-events.d.ts.map +1 -0
- package/dist/runtime-events.js +39 -0
- package/dist/runtime-events.js.map +1 -0
- package/package.json +12 -17
- package/{plugin.mjs → plugin/xema-runtime-bridge/index.js} +7770 -2857
- package/plugin/xema-runtime-bridge/package.json +8 -0
- package/dist/hooks/session-idle-autocommit.d.ts +0 -11
- package/dist/hooks/session-idle-autocommit.d.ts.map +0 -1
- package/dist/hooks/session-idle-autocommit.js +0 -206
- package/dist/hooks/session-idle-autocommit.js.map +0 -1
- package/dist/hooks/system-prompt-overlay.d.ts +0 -3
- package/dist/hooks/system-prompt-overlay.d.ts.map +0 -1
- package/dist/hooks/system-prompt-overlay.js +0 -30
- package/dist/hooks/system-prompt-overlay.js.map +0 -1
- package/dist/opencode-types.d.ts +0 -69
- package/dist/opencode-types.d.ts.map +0 -1
- package/dist/opencode-types.js +0 -4
- package/dist/opencode-types.js.map +0 -1
- package/dist/plugin-entry.d.ts +0 -2
- package/dist/plugin-entry.d.ts.map +0 -1
- package/dist/plugin-entry.js +0 -2
- package/dist/plugin-entry.js.map +0 -1
- package/dist/session-state.d.ts +0 -20
- package/dist/session-state.d.ts.map +0 -1
- package/dist/session-state.js +0 -43
- package/dist/session-state.js.map +0 -1
- package/dist/tools/runtime.d.ts +0 -2
- package/dist/tools/runtime.d.ts.map +0 -1
- package/dist/tools/runtime.js +0 -2
- package/dist/tools/runtime.js.map +0 -1
- package/dist/tools/service-token.d.ts +0 -3
- package/dist/tools/service-token.d.ts.map +0 -1
- package/dist/tools/service-token.js +0 -31
- package/dist/tools/service-token.js.map +0 -1
- package/dist/tools/shared.d.ts +0 -3
- package/dist/tools/shared.d.ts.map +0 -1
- package/dist/tools/shared.js +0 -11
- package/dist/tools/shared.js.map +0 -1
- package/dist/tools/xema-memory.d.ts +0 -31
- package/dist/tools/xema-memory.d.ts.map +0 -1
- package/dist/tools/xema-memory.js +0 -157
- package/dist/tools/xema-memory.js.map +0 -1
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { tool } from '../opencode-types.js';
|
|
3
|
-
import { loadSessionStateForTool } from './runtime.js';
|
|
4
|
-
import { serviceTokenAuthorizationHeader } from './service-token.js';
|
|
5
|
-
import { toJsonString } from './shared.js';
|
|
6
|
-
const MEMORY_KINDS = [
|
|
7
|
-
'GENERAL',
|
|
8
|
-
'DECISION',
|
|
9
|
-
'CONSTRAINT',
|
|
10
|
-
'PATTERN',
|
|
11
|
-
'LESSON',
|
|
12
|
-
'EPISODIC',
|
|
13
|
-
'PROCEDURAL',
|
|
14
|
-
'CORRECTION',
|
|
15
|
-
];
|
|
16
|
-
const SET_ARGS = {
|
|
17
|
-
content: z
|
|
18
|
-
.string()
|
|
19
|
-
.min(5)
|
|
20
|
-
.describe('The memory statement. A short fact / preference / lesson phrased as ' +
|
|
21
|
-
'a complete sentence. Avoid ephemeral context ("just now the user said"); ' +
|
|
22
|
-
'memory persists across turns.'),
|
|
23
|
-
kind: z
|
|
24
|
-
.enum(MEMORY_KINDS)
|
|
25
|
-
.default('GENERAL')
|
|
26
|
-
.describe('Kind of memory. Use DECISION for choices made, CONSTRAINT for ' +
|
|
27
|
-
'hard limits, LESSON for insights from failures, PATTERN for ' +
|
|
28
|
-
'recurring structures, CORRECTION when overriding a prior memory, ' +
|
|
29
|
-
'GENERAL otherwise.'),
|
|
30
|
-
tag: z
|
|
31
|
-
.string()
|
|
32
|
-
.optional()
|
|
33
|
-
.describe('Optional short tag that appears in the originRef so the memory can ' +
|
|
34
|
-
'later be recalled by the same tag (e.g. "preferences", "style").'),
|
|
35
|
-
importance: z
|
|
36
|
-
.number()
|
|
37
|
-
.int()
|
|
38
|
-
.min(1)
|
|
39
|
-
.max(4)
|
|
40
|
-
.optional()
|
|
41
|
-
.describe('1=LOW, 2=NORMAL (default), 3=HIGH, 4=CRITICAL.'),
|
|
42
|
-
};
|
|
43
|
-
const GET_ARGS = {
|
|
44
|
-
kind: z
|
|
45
|
-
.enum(MEMORY_KINDS)
|
|
46
|
-
.optional()
|
|
47
|
-
.describe('Filter to a specific kind. Omit for all.'),
|
|
48
|
-
tag: z
|
|
49
|
-
.string()
|
|
50
|
-
.optional()
|
|
51
|
-
.describe('Filter to memories written with this tag. Matches on originRef suffix.'),
|
|
52
|
-
limit: z
|
|
53
|
-
.number()
|
|
54
|
-
.int()
|
|
55
|
-
.min(1)
|
|
56
|
-
.max(50)
|
|
57
|
-
.default(20)
|
|
58
|
-
.describe('Maximum number of memories to return.'),
|
|
59
|
-
};
|
|
60
|
-
function resolveMemoryApiCtx(workspaceDir, toolName) {
|
|
61
|
-
const state = loadSessionStateForTool(workspaceDir, toolName);
|
|
62
|
-
const baseUrl = process.env.MEMORY_API_URL?.trim();
|
|
63
|
-
if (!baseUrl) {
|
|
64
|
-
throw new Error('MEMORY_API_URL is not configured on this worker. The operator must ' +
|
|
65
|
-
'set it for xema_memory_* tools to work.');
|
|
66
|
-
}
|
|
67
|
-
const project = state.ctx.project;
|
|
68
|
-
if (!project || !project.projectId) {
|
|
69
|
-
throw new Error('Session memory requires a projectId in context.json; this session is ' +
|
|
70
|
-
'not bound to a project (orgId-only). Skip xema_memory_* tools here.');
|
|
71
|
-
}
|
|
72
|
-
const sessionId = state.ctx.invocation.sessionId ?? state.ctx.invocation.runId ?? 'no-session';
|
|
73
|
-
return {
|
|
74
|
-
baseUrl: baseUrl.replace(/\/+$/, ''),
|
|
75
|
-
orgId: project.orgId,
|
|
76
|
-
projectId: project.projectId,
|
|
77
|
-
actorId: `xema:${state.ctx.invocation.role}`,
|
|
78
|
-
sessionId,
|
|
79
|
-
role: state.ctx.invocation.role,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
function memoryApiHeaders(ctx) {
|
|
83
|
-
return {
|
|
84
|
-
'Content-Type': 'application/json',
|
|
85
|
-
Authorization: serviceTokenAuthorizationHeader(),
|
|
86
|
-
'x-xema-org-id': ctx.orgId,
|
|
87
|
-
'x-project-id': ctx.projectId,
|
|
88
|
-
'x-actor-type': 'agent',
|
|
89
|
-
'x-actor-id': ctx.actorId,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
export function buildXemaMemorySetTool(workspaceDir) {
|
|
93
|
-
return tool({
|
|
94
|
-
description: 'Persist a project-scoped memory that survives context compaction and ' +
|
|
95
|
-
'future sessions. Use sparingly — for durable preferences, decisions, ' +
|
|
96
|
-
'lessons, or patterns worth recalling next time. Do NOT use for ' +
|
|
97
|
-
'conversational context or task-local notes.',
|
|
98
|
-
args: SET_ARGS,
|
|
99
|
-
async execute(args) {
|
|
100
|
-
const ctx = resolveMemoryApiCtx(workspaceDir, 'xema_memory_set');
|
|
101
|
-
const originRef = args.tag
|
|
102
|
-
? `session:${ctx.sessionId}:${args.tag}`
|
|
103
|
-
: `session:${ctx.sessionId}`;
|
|
104
|
-
const body = {
|
|
105
|
-
content: args.content,
|
|
106
|
-
type: args.kind ?? 'GENERAL',
|
|
107
|
-
source: ctx.actorId,
|
|
108
|
-
originType: 'SESSION',
|
|
109
|
-
originRef,
|
|
110
|
-
};
|
|
111
|
-
if (args.importance !== undefined)
|
|
112
|
-
body.importance = args.importance;
|
|
113
|
-
const res = await fetch(`${ctx.baseUrl}/memories`, {
|
|
114
|
-
method: 'POST',
|
|
115
|
-
headers: memoryApiHeaders(ctx),
|
|
116
|
-
body: JSON.stringify(body),
|
|
117
|
-
signal: AbortSignal.timeout(10_000),
|
|
118
|
-
});
|
|
119
|
-
if (!res.ok) {
|
|
120
|
-
const errText = await res.text().catch(() => '');
|
|
121
|
-
throw new Error(`memory-api rejected write (${res.status}): ${errText.slice(0, 400)}`);
|
|
122
|
-
}
|
|
123
|
-
const stored = (await res.json().catch(() => null));
|
|
124
|
-
return toJsonString({ stored, originRef });
|
|
125
|
-
},
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
export function buildXemaMemoryGetTool(workspaceDir) {
|
|
129
|
-
return tool({
|
|
130
|
-
description: 'Recall project-scoped memories written by earlier sessions or by ' +
|
|
131
|
-
'xema_memory_set. Returns the most relevant items subject to an ' +
|
|
132
|
-
'optional kind or tag filter. Read this BEFORE large decisions so ' +
|
|
133
|
-
'prior lessons and preferences inform the work.',
|
|
134
|
-
args: GET_ARGS,
|
|
135
|
-
async execute(args) {
|
|
136
|
-
const ctx = resolveMemoryApiCtx(workspaceDir, 'xema_memory_get');
|
|
137
|
-
const params = new URLSearchParams();
|
|
138
|
-
params.set('limit', String(args.limit ?? 20));
|
|
139
|
-
if (args.kind)
|
|
140
|
-
params.set('type', args.kind);
|
|
141
|
-
if (args.tag)
|
|
142
|
-
params.set('originRefContains', `:${args.tag}`);
|
|
143
|
-
const res = await fetch(`${ctx.baseUrl}/memories?${params.toString()}`, {
|
|
144
|
-
method: 'GET',
|
|
145
|
-
headers: memoryApiHeaders(ctx),
|
|
146
|
-
signal: AbortSignal.timeout(10_000),
|
|
147
|
-
});
|
|
148
|
-
if (!res.ok) {
|
|
149
|
-
const errText = await res.text().catch(() => '');
|
|
150
|
-
throw new Error(`memory-api rejected read (${res.status}): ${errText.slice(0, 400)}`);
|
|
151
|
-
}
|
|
152
|
-
const raw = (await res.json().catch(() => null));
|
|
153
|
-
return toJsonString(raw ?? []);
|
|
154
|
-
},
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
//# sourceMappingURL=xema-memory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"xema-memory.js","sourceRoot":"","sources":["../../src/tools/xema-memory.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,YAAY,GAAG;IACnB,SAAS;IACT,UAAU;IACV,YAAY;IACZ,SAAS;IACT,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,YAAY;CACJ,CAAC;AAIX,MAAM,QAAQ,GAAG;IACf,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACP,sEAAsE;QACpE,2EAA2E;QAC3E,+BAA+B,CAClC;IACH,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,YAAY,CAAC;SAClB,OAAO,CAAC,SAAS,CAAC;SAClB,QAAQ,CACP,gEAAgE;QAC9D,8DAA8D;QAC9D,mEAAmE;QACnE,oBAAoB,CACvB;IACH,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,qEAAqE;QACnE,kEAAkE,CACrE;IACH,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,gDAAgD,CAAC;CAC9D,CAAC;AAEF,MAAM,QAAQ,GAAG;IACf,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,YAAY,CAAC;SAClB,QAAQ,EAAE;SACV,QAAQ,CAAC,0CAA0C,CAAC;IACvD,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,wEAAwE,CACzE;IACH,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,uCAAuC,CAAC;CACrD,CAAC;AAWF,SAAS,mBAAmB,CAAC,YAAoB,EAAE,QAAgB;IACjE,MAAM,KAAK,GAAG,uBAAuB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAe9D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IACnD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,qEAAqE;YACnE,yCAAyC,CAC5C,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;IAClC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,uEAAuE;YACrE,qEAAqE,CACxE,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GACb,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,YAAY,CAAC;IAC/E,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,QAAQ,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE;QAC5C,SAAS;QACT,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI;KAChC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAiB;IAIzC,OAAO;QACL,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAE,+BAA+B,EAAE;QAChD,eAAe,EAAE,GAAG,CAAC,KAAK;QAC1B,cAAc,EAAE,GAAG,CAAC,SAAS;QAC7B,cAAc,EAAE,OAAO;QACvB,YAAY,EAAE,GAAG,CAAC,OAAO;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,YAAoB;IACzD,OAAO,IAAI,CAAC;QACV,WAAW,EACT,uEAAuE;YACvE,uEAAuE;YACvE,iEAAiE;YACjE,6CAA6C;QAC/C,IAAI,EAAE,QAAQ;QACd,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,MAAM,GAAG,GAAG,mBAAmB,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG;gBACxB,CAAC,CAAC,WAAW,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;gBACxC,CAAC,CAAC,WAAW,GAAG,CAAC,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,GAA4B;gBACpC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,SAAS;gBAC5B,MAAM,EAAE,GAAG,CAAC,OAAO;gBACnB,UAAU,EAAE,SAAS;gBACrB,SAAS;aACV,CAAC;YACF,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;gBAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAErE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,WAAW,EAAE;gBACjD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC;gBAC9B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACpC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBACjD,MAAM,IAAI,KAAK,CACb,8BAA8B,GAAG,CAAC,MAAM,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACtE,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAY,CAAC;YAC/D,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7C,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,YAAoB;IACzD,OAAO,IAAI,CAAC;QACV,WAAW,EACT,mEAAmE;YACnE,iEAAiE;YACjE,mEAAmE;YACnE,gDAAgD;QAClD,IAAI,EAAE,QAAQ;QACd,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,MAAM,GAAG,GAAG,mBAAmB,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9C,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAkB,CAAC,CAAC;YAC3D,IAAI,IAAI,CAAC,GAAG;gBAAE,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAE9D,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,GAAG,CAAC,OAAO,aAAa,MAAM,CAAC,QAAQ,EAAE,EAAE,EAC9C;gBACE,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC;gBAC9B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACpC,CACF,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBACjD,MAAM,IAAI,KAAK,CACb,6BAA6B,GAAG,CAAC,MAAM,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACrE,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAY,CAAC;YAC5D,OAAO,YAAY,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|