harnery 0.46.1 → 0.47.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 (176) hide show
  1. package/README.md +24 -0
  2. package/bin/README.md +10 -0
  3. package/bin/agent-coord.mjs +3 -0
  4. package/bin/agent-hook.mjs +3 -0
  5. package/bin/harn.mjs +3 -0
  6. package/bin/run.mjs +43 -0
  7. package/dist/commander.d.ts +18 -6
  8. package/dist/commander.d.ts.map +1 -1
  9. package/dist/commander.js +74 -2
  10. package/dist/commands/agents.d.ts +25 -0
  11. package/dist/commands/agents.d.ts.map +1 -1
  12. package/dist/commands/agents.js +70 -27
  13. package/dist/commands/autoupdate.d.ts +12 -0
  14. package/dist/commands/autoupdate.d.ts.map +1 -0
  15. package/dist/commands/autoupdate.js +190 -0
  16. package/dist/commands/computer.d.ts +45 -0
  17. package/dist/commands/computer.d.ts.map +1 -0
  18. package/dist/commands/computer.js +509 -0
  19. package/dist/commands/docs.js +3 -1
  20. package/dist/commands/fetch.js +11 -1
  21. package/dist/commands/grep.d.ts +72 -0
  22. package/dist/commands/grep.d.ts.map +1 -1
  23. package/dist/commands/grep.js +200 -47
  24. package/dist/commands/init.d.ts.map +1 -1
  25. package/dist/commands/init.js +15 -9
  26. package/dist/commands/rm.js +2 -2
  27. package/dist/commands/web.d.ts.map +1 -1
  28. package/dist/commands/web.js +2 -0
  29. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  30. package/dist/core/agents/canonical-emit.js +2 -3
  31. package/dist/core/agents/coord-bin.d.ts +3 -0
  32. package/dist/core/agents/coord-bin.d.ts.map +1 -1
  33. package/dist/core/agents/coord-bin.js +6 -0
  34. package/dist/core/agents/coord-client.d.ts.map +1 -1
  35. package/dist/core/agents/coord-client.js +6 -2
  36. package/dist/core/agents/render/prompt-context.d.ts +55 -7
  37. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  38. package/dist/core/agents/render/prompt-context.js +122 -48
  39. package/dist/core/agents/state/proc-start.d.ts +3 -1
  40. package/dist/core/agents/state/proc-start.d.ts.map +1 -1
  41. package/dist/core/agents/state/proc-start.js +26 -4
  42. package/dist/core/autoupdate/engine.d.ts +97 -0
  43. package/dist/core/autoupdate/engine.d.ts.map +1 -0
  44. package/dist/core/autoupdate/engine.js +548 -0
  45. package/dist/core/autoupdate/fingerprint.d.ts +16 -0
  46. package/dist/core/autoupdate/fingerprint.d.ts.map +1 -0
  47. package/dist/core/autoupdate/fingerprint.js +73 -0
  48. package/dist/core/autoupdate/git.d.ts +30 -0
  49. package/dist/core/autoupdate/git.d.ts.map +1 -0
  50. package/dist/core/autoupdate/git.js +82 -0
  51. package/dist/core/autoupdate/index.d.ts +6 -0
  52. package/dist/core/autoupdate/index.d.ts.map +1 -0
  53. package/dist/core/autoupdate/index.js +4 -0
  54. package/dist/core/autoupdate/state.d.ts +59 -0
  55. package/dist/core/autoupdate/state.d.ts.map +1 -0
  56. package/dist/core/autoupdate/state.js +214 -0
  57. package/dist/core/autoupdate/types.d.ts +113 -0
  58. package/dist/core/autoupdate/types.d.ts.map +1 -0
  59. package/dist/core/autoupdate/types.js +35 -0
  60. package/dist/core/config.d.ts +53 -1
  61. package/dist/core/config.d.ts.map +1 -1
  62. package/dist/core/config.js +114 -1
  63. package/dist/core/events/v3/bootstrap.js +1 -0
  64. package/dist/core/events/v3/runtime-build.d.ts.map +1 -1
  65. package/dist/core/events/v3/runtime-build.js +1 -0
  66. package/dist/core/hooks/adapter/wiring.d.ts +12 -2
  67. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  68. package/dist/core/hooks/adapter/wiring.js +38 -8
  69. package/dist/core/hooks/autoupdate-cue.d.ts +29 -0
  70. package/dist/core/hooks/autoupdate-cue.d.ts.map +1 -0
  71. package/dist/core/hooks/autoupdate-cue.js +53 -0
  72. package/dist/core/hooks/cli.js +28 -3
  73. package/dist/core/hooks/effects/index.js +4 -4
  74. package/dist/core/hooks/resolve/coord-root.js +1 -0
  75. package/dist/core/semantic/contract.d.ts +3 -3
  76. package/dist/core/semantic/service.d.ts.map +1 -1
  77. package/dist/core/semantic/service.js +4 -2
  78. package/dist/core/storage/modes.d.ts +1 -1
  79. package/dist/core/storage/modes.d.ts.map +1 -1
  80. package/dist/core/storage/modes.js +5 -1
  81. package/dist/core/workflow/durable-record.d.ts +2 -0
  82. package/dist/core/workflow/durable-record.d.ts.map +1 -1
  83. package/dist/core/workflow/durable-record.js +13 -1
  84. package/dist/core/workflow/engine.js +4 -0
  85. package/dist/core/workflow/spawn-claude.d.ts +7 -0
  86. package/dist/core/workflow/spawn-claude.d.ts.map +1 -1
  87. package/dist/core/workflow/spawn-claude.js +16 -4
  88. package/dist/core/workflow/specialists.d.ts.map +1 -1
  89. package/dist/core/workflow/specialists.js +1 -0
  90. package/dist/core/workflow/types.d.ts +10 -0
  91. package/dist/core/workflow/types.d.ts.map +1 -1
  92. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  93. package/dist/core/workflow/workspaces/leases.js +1 -9
  94. package/dist/lib/computer/cua.d.ts +50 -0
  95. package/dist/lib/computer/cua.d.ts.map +1 -0
  96. package/dist/lib/computer/cua.js +474 -0
  97. package/dist/lib/computer/host.d.ts +19 -0
  98. package/dist/lib/computer/host.d.ts.map +1 -0
  99. package/dist/lib/computer/host.js +72 -0
  100. package/dist/lib/computer/lease.d.ts +13 -0
  101. package/dist/lib/computer/lease.d.ts.map +1 -0
  102. package/dist/lib/computer/lease.js +269 -0
  103. package/dist/lib/computer/types.d.ts +163 -0
  104. package/dist/lib/computer/types.d.ts.map +1 -0
  105. package/dist/lib/computer/types.js +10 -0
  106. package/dist/lib/docs-metadata-v2.d.ts.map +1 -1
  107. package/dist/lib/docs-metadata-v2.js +6 -5
  108. package/dist/lib/exec.d.ts.map +1 -1
  109. package/dist/lib/exec.js +1 -0
  110. package/dist/lib/guarded-remove.d.ts.map +1 -1
  111. package/dist/lib/guarded-remove.js +5 -4
  112. package/dist/lib/headless/index.d.ts +33 -0
  113. package/dist/lib/headless/index.d.ts.map +1 -1
  114. package/dist/lib/headless/index.js +38 -2
  115. package/dist/lib/http/client.d.ts +2 -9
  116. package/dist/lib/http/client.d.ts.map +1 -1
  117. package/dist/lib/http/client.js +30 -9
  118. package/dist/lib/instructions/apply.d.ts +9 -0
  119. package/dist/lib/instructions/apply.d.ts.map +1 -1
  120. package/dist/lib/instructions/apply.js +92 -14
  121. package/dist/lib/instructions/git-hooks.d.ts.map +1 -1
  122. package/dist/lib/instructions/git-hooks.js +8 -4
  123. package/dist/lib/instructions/templates.d.ts +11 -0
  124. package/dist/lib/instructions/templates.d.ts.map +1 -1
  125. package/dist/lib/instructions/templates.js +81 -1
  126. package/package.json +5 -5
  127. package/schemas/config.schema.json +89 -1
  128. package/src/commander.ts +98 -8
  129. package/src/commands/agents.ts +100 -32
  130. package/src/commands/autoupdate.ts +250 -0
  131. package/src/commands/computer.ts +682 -0
  132. package/src/commands/docs.ts +3 -1
  133. package/src/commands/fetch.ts +11 -1
  134. package/src/commands/grep.ts +274 -59
  135. package/src/commands/init.ts +17 -7
  136. package/src/commands/rm.ts +2 -2
  137. package/src/commands/web.ts +2 -0
  138. package/src/core/agents/canonical-emit.ts +2 -3
  139. package/src/core/agents/coord-bin.ts +30 -0
  140. package/src/core/agents/coord-client.ts +6 -2
  141. package/src/core/agents/render/prompt-context.ts +152 -53
  142. package/src/core/agents/state/proc-start.ts +29 -5
  143. package/src/core/autoupdate/engine.ts +691 -0
  144. package/src/core/autoupdate/fingerprint.ts +89 -0
  145. package/src/core/autoupdate/git.ts +120 -0
  146. package/src/core/autoupdate/index.ts +29 -0
  147. package/src/core/autoupdate/state.ts +269 -0
  148. package/src/core/autoupdate/types.ts +135 -0
  149. package/src/core/config.ts +142 -1
  150. package/src/core/events/v3/bootstrap.ts +1 -0
  151. package/src/core/events/v3/runtime-build.ts +1 -0
  152. package/src/core/hooks/adapter/wiring.ts +51 -6
  153. package/src/core/hooks/autoupdate-cue.ts +72 -0
  154. package/src/core/hooks/cli.ts +27 -1
  155. package/src/core/hooks/effects/index.ts +4 -4
  156. package/src/core/hooks/resolve/coord-root.ts +1 -0
  157. package/src/core/semantic/service.ts +6 -2
  158. package/src/core/storage/modes.ts +7 -1
  159. package/src/core/workflow/durable-record.ts +15 -1
  160. package/src/core/workflow/engine.ts +3 -0
  161. package/src/core/workflow/spawn-claude.ts +16 -4
  162. package/src/core/workflow/specialists.ts +1 -0
  163. package/src/core/workflow/types.ts +10 -0
  164. package/src/core/workflow/workspaces/leases.ts +1 -9
  165. package/src/lib/computer/cua.ts +572 -0
  166. package/src/lib/computer/host.ts +87 -0
  167. package/src/lib/computer/lease.ts +299 -0
  168. package/src/lib/computer/types.ts +177 -0
  169. package/src/lib/docs-metadata-v2.ts +24 -5
  170. package/src/lib/exec.ts +1 -0
  171. package/src/lib/guarded-remove.ts +5 -3
  172. package/src/lib/headless/index.ts +66 -2
  173. package/src/lib/http/client.ts +33 -19
  174. package/src/lib/instructions/apply.ts +100 -12
  175. package/src/lib/instructions/git-hooks.ts +8 -4
  176. package/src/lib/instructions/templates.ts +95 -1
@@ -0,0 +1,190 @@
1
+ // `autoupdate`: inspect and drive project self-update (ADR 0229). The engine
2
+ // lives in src/core/autoupdate/; this command owns flag parsing, human/JSON
3
+ // rendering, and exit codes. `run --background` is what the activity tick
4
+ // launches; people and agents use `status`, `check`, and `run`.
5
+ import { resolveCoordRoot } from "../core/agents/coord-client.js";
6
+ import { autoUpdateStatus, checkForUpdate, runAutoUpdate, } from "../core/autoupdate/engine.js";
7
+ import { readAutoUpdateState } from "../core/autoupdate/state.js";
8
+ import { AUTOUPDATE_DEFAULTS, EXIT_NEEDS_PERSON, } from "../core/autoupdate/types.js";
9
+ import { readAutoUpdateConfig } from "../core/config.js";
10
+ const DAY_MS = 24 * 60 * 60 * 1000;
11
+ function emitLine(emit, s) {
12
+ emit.text(s.endsWith("\n") ? s : `${s}\n`);
13
+ }
14
+ function short(sha) {
15
+ return sha ? sha.slice(0, 7) : "none";
16
+ }
17
+ function formatDuration(ms) {
18
+ const minutes = Math.round(ms / 60_000);
19
+ if (minutes < 1)
20
+ return "under a minute";
21
+ if (minutes < 120)
22
+ return `${minutes} min`;
23
+ return `${Math.round(minutes / 60)} h`;
24
+ }
25
+ export function exitCodeForOutcome(outcome) {
26
+ if (outcome === "failed")
27
+ return 1;
28
+ if (outcome === "blocked")
29
+ return EXIT_NEEDS_PERSON;
30
+ return 0;
31
+ }
32
+ export function registerAutoUpdateCommand(program, emit, binName, options = {}) {
33
+ const root = options.root ?? (() => resolveCoordRoot() ?? process.cwd());
34
+ const deps = options.deps ?? {};
35
+ const guard = (fn) => async (...args) => {
36
+ try {
37
+ await fn(...args);
38
+ }
39
+ catch (err) {
40
+ emit.error({ code: "autoupdate_error", message: err?.message ?? String(err) });
41
+ emit.setExitCode(1);
42
+ }
43
+ };
44
+ const cmd = program
45
+ .command("autoupdate")
46
+ .description("Project self-update: activity checks the upstream branch and watched paths, and runs " +
47
+ "the steps configured in .harnery/config.jsonc `autoUpdate` only when something changed.")
48
+ .addHelpText("after", `\nEnable per project with "autoUpdate": { "enabled": true, "steps": [[...]] } in .harnery/config.jsonc.\n` +
49
+ `Exit codes: 0 current/updated · 1 failed · ${EXIT_NEEDS_PERSON} blocked (needs a person).\n` +
50
+ `Start with \`${binName} autoupdate status\`.`);
51
+ cmd
52
+ .command("status")
53
+ .description("Show configuration, the last run, the converged head, notices, and the next check.")
54
+ .option("--json", "Emit the status as JSON.")
55
+ .action(guard((opts) => {
56
+ const status = autoUpdateStatus(root(), deps);
57
+ const now = (deps.now ?? Date.now)();
58
+ const recent = status.state.notices.filter((n) => now - Date.parse(n.at) < DAY_MS).length;
59
+ if (opts.json) {
60
+ emit.data({
61
+ enabled: status.config?.enabled ?? false,
62
+ config: status.config,
63
+ lastRun: status.state.lastRun ?? null,
64
+ converged: status.state.converged ?? null,
65
+ dailyAt: status.state.dailyAt ?? null,
66
+ cleanupAt: status.state.cleanupAt ?? null,
67
+ notices: status.state.notices.length,
68
+ recentNotices: recent,
69
+ stampAgeMs: status.stampAge,
70
+ nextCheckMs: status.nextCheckMs,
71
+ lock: status.locked.held
72
+ ? {
73
+ owner: status.locked.owner,
74
+ stale: status.locked.stale,
75
+ ageMs: status.locked.ageMs,
76
+ }
77
+ : null,
78
+ });
79
+ return;
80
+ }
81
+ const cfg = status.config;
82
+ const lines = [];
83
+ if (!cfg) {
84
+ lines.push("Auto-update is not configured (no `autoUpdate` section in .harnery/config.jsonc).");
85
+ emitLine(emit, lines.join("\n"));
86
+ return;
87
+ }
88
+ lines.push(`Enabled: ${cfg.enabled ? "yes" : "no"}`);
89
+ lines.push(`Check every: ${cfg.checkMinutes} min`);
90
+ lines.push(`Steps: ${cfg.steps.length ? cfg.steps.map((s) => s.join(" ")).join("; ") : "none"}`);
91
+ if (cfg.dailySteps.length) {
92
+ lines.push(`Daily steps: ${cfg.dailySteps.map((s) => s.join(" ")).join("; ")}`);
93
+ }
94
+ const last = status.state.lastRun;
95
+ if (last) {
96
+ lines.push(`Last run: ${last.outcome} (${last.reason}) at ${last.finishedAt}, ${short(last.fromHead)} -> ${short(last.toHead)}`);
97
+ if (last.error)
98
+ lines.push(`Last error: ${last.error}`);
99
+ }
100
+ else {
101
+ lines.push("Last run: never");
102
+ }
103
+ lines.push(`Converged head: ${short(status.state.converged?.head)}`);
104
+ lines.push(`Notices in the last 24 h: ${recent}`);
105
+ if (status.locked.held) {
106
+ const owner = status.locked.owner;
107
+ lines.push(`Running now: ${owner ? `pid ${owner.pid} since ${owner.at}` : "lock held"}${status.locked.stale ? " (stale)" : ""}`);
108
+ }
109
+ if (cfg.enabled) {
110
+ lines.push(`Next check: ${status.nextCheckMs ? `in ${formatDuration(status.nextCheckMs)}` : "due on the next activity"}`);
111
+ }
112
+ emitLine(emit, lines.join("\n"));
113
+ }));
114
+ cmd
115
+ .command("check")
116
+ .description("Decide whether an update is needed without running any step.")
117
+ .option("--json", "Emit the decision as JSON.")
118
+ .action(guard((opts) => {
119
+ const projectRoot = root();
120
+ const cfg = (deps.readConfig ?? readAutoUpdateConfig)(projectRoot);
121
+ if (!cfg) {
122
+ if (opts.json)
123
+ emit.data({ needed: false, reason: "disabled" });
124
+ else
125
+ emitLine(emit, "Auto-update is not configured.");
126
+ return;
127
+ }
128
+ const decision = checkForUpdate(projectRoot, cfg, readAutoUpdateState(projectRoot), deps);
129
+ if (opts.json) {
130
+ emit.data(decision);
131
+ return;
132
+ }
133
+ emitLine(emit, [
134
+ `${decision.needed ? "Update needed" : "No update needed"}: ${decision.reason}${decision.detail ? ` (${decision.detail})` : ""}`,
135
+ `Head: ${short(decision.head)}${decision.upstream ? ` · upstream ${decision.upstream} at ${short(decision.remoteSha)}` : ""}`,
136
+ ...(cfg.enabled ? [] : ["Auto-update is disabled; activity will not run it."]),
137
+ ].join("\n"));
138
+ }));
139
+ cmd
140
+ .command("run")
141
+ .description("Run the configured steps now if an update is needed (or always with --force).")
142
+ .option("--force", "Run the steps even when the checkout is current.")
143
+ .option("--background", "Write output to the log only (used by the activity tick).")
144
+ .option("--json", "Emit the run result as JSON.")
145
+ .action(guard(async (opts) => {
146
+ const projectRoot = root();
147
+ const result = await runAutoUpdate(projectRoot, {
148
+ force: opts.force,
149
+ background: opts.background,
150
+ deps,
151
+ onOutput: opts.background
152
+ ? undefined
153
+ : (chunk, stream) => {
154
+ // Keep stdout clean for --json.
155
+ const out = opts.json || stream === "stderr" ? process.stderr : process.stdout;
156
+ out.write(chunk);
157
+ },
158
+ });
159
+ emit.setExitCode(exitCodeForOutcome(result.outcome));
160
+ if (opts.json) {
161
+ emit.data({
162
+ outcome: result.outcome,
163
+ decision: result.decision,
164
+ record: result.record,
165
+ notices: result.notices,
166
+ ...(result.outcome === "skipped-locked" ? { lockOwner: result.lockOwner ?? null } : {}),
167
+ });
168
+ return;
169
+ }
170
+ if (result.outcome === "skipped-locked") {
171
+ const owner = result.lockOwner;
172
+ emitLine(emit, `Another auto-update run holds the lock${owner ? ` (pid ${owner.pid} since ${owner.at})` : ""}; skipped.`);
173
+ return;
174
+ }
175
+ if (!result.record) {
176
+ emitLine(emit, `Auto-update is disabled; pass --force to run the steps anyway or enable it in .harnery/config.jsonc.`);
177
+ return;
178
+ }
179
+ const r = result.record;
180
+ const lines = [
181
+ `Auto-update ${r.outcome} (${r.reason}): ${short(r.fromHead)} -> ${short(r.toHead)}, ${r.steps.length} step(s).`,
182
+ ];
183
+ for (const n of result.notices)
184
+ lines.push(`notice [${n.kind}]: ${n.text}`);
185
+ if (r.outcome === "failed") {
186
+ lines.push(`Next automatic attempt after ${AUTOUPDATE_DEFAULTS.failureBackoffMinutes} min; run \`${binName} autoupdate run\` to retry now.`);
187
+ }
188
+ emitLine(emit, lines.join("\n"));
189
+ }));
190
+ }
@@ -0,0 +1,45 @@
1
+ import { Command } from "commander";
2
+ import type { EmitContext } from "../commander.js";
3
+ import { type ComputerProjectConfig } from "../core/config.js";
4
+ import type { DesktopDriver, HostInfo, LeaseApi, LeaseOwner } from "../lib/computer/types.js";
5
+ /** Exit code for a desktop held by another agent. */
6
+ export declare const EXIT_LEASE_HELD = 3;
7
+ /** `call` waits this long for another agent's lease when nothing overrides it. */
8
+ export declare const DEFAULT_CALL_WAIT_SECONDS = 30;
9
+ /** Everything the command touches outside itself; tests inject fakes. */
10
+ export interface ComputerDeps {
11
+ emit: EmitContext;
12
+ binName: string;
13
+ host: () => HostInfo;
14
+ driver: DesktopDriver;
15
+ lease: LeaseApi;
16
+ owner: () => LeaseOwner;
17
+ config: () => ComputerProjectConfig;
18
+ /** Lease directory for a desktop state dir. */
19
+ leaseDir: (desktopStateDir: string) => string;
20
+ /** Idle expiry when config sets none. */
21
+ defaultIdleMs: number;
22
+ /** Driver stderr passthrough. */
23
+ writeStderr: (text: string) => void;
24
+ now: () => number;
25
+ }
26
+ export type ComputerDepsInput = Pick<ComputerDeps, "emit" | "binName"> & Partial<ComputerDeps>;
27
+ /**
28
+ * Who is asking for the desktop: the coordinated agent when one is resolvable,
29
+ * else the calling OS user (`shell:<user>@<hostname>`, label `shell-<user>`), so
30
+ * separate shell invocations by the same person share one lease.
31
+ */
32
+ export declare function resolveLeaseOwner(): LeaseOwner;
33
+ /**
34
+ * Replace inline base64 screenshots in driver output with a short note, so a
35
+ * single state read cannot flood the calling agent's context. Works on the raw
36
+ * text, so the driver's formatting survives.
37
+ */
38
+ export declare function redactInlineScreenshots(stdout: string): string;
39
+ /**
40
+ * Build the `computer` command tree under `parent` (a fresh root when omitted)
41
+ * and return it. Tests pass fakes for host/driver/lease/owner/config.
42
+ */
43
+ export declare function createComputerCommand(input: ComputerDepsInput, parent?: Command): Command;
44
+ export declare function registerComputerCommand(program: Command, emit: EmitContext, binName: string): void;
45
+ //# sourceMappingURL=computer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computer.d.ts","sourceRoot":"","sources":["../../src/commands/computer.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,EAAE,KAAK,qBAAqB,EAAsB,MAAM,mBAAmB,CAAC;AACnF,OAAO,KAAK,EAEV,aAAa,EAGb,QAAQ,EACR,QAAQ,EAER,UAAU,EACX,MAAM,0BAA0B,CAAC;AAElC,qDAAqD;AACrD,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,kFAAkF;AAClF,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,QAAQ,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,MAAM,UAAU,CAAC;IACxB,MAAM,EAAE,MAAM,qBAAqB,CAAC;IACpC,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,yCAAyC;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AAE/F;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,CAgB9C;AA8ID;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAM9D;AAkGD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,iBAAiB,EACxB,MAAM,GAAE,OAAuB,GAC9B,OAAO,CAsVT;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,GACd,IAAI,CAEN"}