@a5c-ai/genty-tui 5.1.1-staging.5ad08884fb61
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 +155 -0
- package/dist/app.d.ts +27 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +635 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/adapters-tui.d.ts +3 -0
- package/dist/bin/adapters-tui.d.ts.map +1 -0
- package/dist/bin/adapters-tui.js +75 -0
- package/dist/bin/adapters-tui.js.map +1 -0
- package/dist/bin/runtime.d.ts +31 -0
- package/dist/bin/runtime.d.ts.map +1 -0
- package/dist/bin/runtime.js +78 -0
- package/dist/bin/runtime.js.map +1 -0
- package/dist/command-palette.d.ts +16 -0
- package/dist/command-palette.d.ts.map +1 -0
- package/dist/command-palette.js +72 -0
- package/dist/command-palette.js.map +1 -0
- package/dist/event-stream.d.ts +16 -0
- package/dist/event-stream.d.ts.map +1 -0
- package/dist/event-stream.js +52 -0
- package/dist/event-stream.js.map +1 -0
- package/dist/external-plugins.d.ts +10 -0
- package/dist/external-plugins.d.ts.map +1 -0
- package/dist/external-plugins.js +83 -0
- package/dist/external-plugins.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/kanban-control-plane.d.ts +44 -0
- package/dist/kanban-control-plane.d.ts.map +1 -0
- package/dist/kanban-control-plane.js +30 -0
- package/dist/kanban-control-plane.js.map +1 -0
- package/dist/layout.d.ts +24 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +64 -0
- package/dist/layout.js.map +1 -0
- package/dist/model-picker.d.ts +13 -0
- package/dist/model-picker.d.ts.map +1 -0
- package/dist/model-picker.js +49 -0
- package/dist/model-picker.js.map +1 -0
- package/dist/plugin.d.ts +104 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +4 -0
- package/dist/plugin.js.map +1 -0
- package/dist/plugins/adapters-view.d.ts +2 -0
- package/dist/plugins/adapters-view.d.ts.map +1 -0
- package/dist/plugins/adapters-view.js +38 -0
- package/dist/plugins/adapters-view.js.map +1 -0
- package/dist/plugins/agents-view.d.ts +2 -0
- package/dist/plugins/agents-view.d.ts.map +1 -0
- package/dist/plugins/agents-view.js +234 -0
- package/dist/plugins/agents-view.js.map +1 -0
- package/dist/plugins/approval.d.ts +15 -0
- package/dist/plugins/approval.d.ts.map +1 -0
- package/dist/plugins/approval.js +50 -0
- package/dist/plugins/approval.js.map +1 -0
- package/dist/plugins/auth-view.d.ts +2 -0
- package/dist/plugins/auth-view.d.ts.map +1 -0
- package/dist/plugins/auth-view.js +66 -0
- package/dist/plugins/auth-view.js.map +1 -0
- package/dist/plugins/chat-view.d.ts +8 -0
- package/dist/plugins/chat-view.d.ts.map +1 -0
- package/dist/plugins/chat-view.js +71 -0
- package/dist/plugins/chat-view.js.map +1 -0
- package/dist/plugins/config-view.d.ts +2 -0
- package/dist/plugins/config-view.d.ts.map +1 -0
- package/dist/plugins/config-view.js +63 -0
- package/dist/plugins/config-view.js.map +1 -0
- package/dist/plugins/control.d.ts +6 -0
- package/dist/plugins/control.d.ts.map +1 -0
- package/dist/plugins/control.js +70 -0
- package/dist/plugins/control.js.map +1 -0
- package/dist/plugins/cost-alerts.d.ts +3 -0
- package/dist/plugins/cost-alerts.d.ts.map +1 -0
- package/dist/plugins/cost-alerts.js +38 -0
- package/dist/plugins/cost-alerts.js.map +1 -0
- package/dist/plugins/cost-view.d.ts +2 -0
- package/dist/plugins/cost-view.d.ts.map +1 -0
- package/dist/plugins/cost-view.js +63 -0
- package/dist/plugins/cost-view.js.map +1 -0
- package/dist/plugins/cost.d.ts +2 -0
- package/dist/plugins/cost.d.ts.map +1 -0
- package/dist/plugins/cost.js +16 -0
- package/dist/plugins/cost.js.map +1 -0
- package/dist/plugins/diff.d.ts +6 -0
- package/dist/plugins/diff.d.ts.map +1 -0
- package/dist/plugins/diff.js +42 -0
- package/dist/plugins/diff.js.map +1 -0
- package/dist/plugins/doctor-view.d.ts +2 -0
- package/dist/plugins/doctor-view.d.ts.map +1 -0
- package/dist/plugins/doctor-view.js +58 -0
- package/dist/plugins/doctor-view.js.map +1 -0
- package/dist/plugins/fallback.d.ts +6 -0
- package/dist/plugins/fallback.d.ts.map +1 -0
- package/dist/plugins/fallback.js +17 -0
- package/dist/plugins/fallback.js.map +1 -0
- package/dist/plugins/file-ops.d.ts +15 -0
- package/dist/plugins/file-ops.d.ts.map +1 -0
- package/dist/plugins/file-ops.js +49 -0
- package/dist/plugins/file-ops.js.map +1 -0
- package/dist/plugins/help-view.d.ts +2 -0
- package/dist/plugins/help-view.d.ts.map +1 -0
- package/dist/plugins/help-view.js +46 -0
- package/dist/plugins/help-view.js.map +1 -0
- package/dist/plugins/hooks-view.d.ts +2 -0
- package/dist/plugins/hooks-view.d.ts.map +1 -0
- package/dist/plugins/hooks-view.js +186 -0
- package/dist/plugins/hooks-view.js.map +1 -0
- package/dist/plugins/image.d.ts +9 -0
- package/dist/plugins/image.d.ts.map +1 -0
- package/dist/plugins/image.js +30 -0
- package/dist/plugins/image.js.map +1 -0
- package/dist/plugins/kanban-view.d.ts +4 -0
- package/dist/plugins/kanban-view.d.ts.map +1 -0
- package/dist/plugins/kanban-view.js +480 -0
- package/dist/plugins/kanban-view.js.map +1 -0
- package/dist/plugins/lifecycle.d.ts +6 -0
- package/dist/plugins/lifecycle.d.ts.map +1 -0
- package/dist/plugins/lifecycle.js +46 -0
- package/dist/plugins/lifecycle.js.map +1 -0
- package/dist/plugins/mcp-view.d.ts +2 -0
- package/dist/plugins/mcp-view.d.ts.map +1 -0
- package/dist/plugins/mcp-view.js +66 -0
- package/dist/plugins/mcp-view.js.map +1 -0
- package/dist/plugins/mcp.d.ts +12 -0
- package/dist/plugins/mcp.d.ts.map +1 -0
- package/dist/plugins/mcp.js +39 -0
- package/dist/plugins/mcp.js.map +1 -0
- package/dist/plugins/models-view.d.ts +2 -0
- package/dist/plugins/models-view.d.ts.map +1 -0
- package/dist/plugins/models-view.js +45 -0
- package/dist/plugins/models-view.js.map +1 -0
- package/dist/plugins/observability-view.d.ts +22 -0
- package/dist/plugins/observability-view.d.ts.map +1 -0
- package/dist/plugins/observability-view.js +103 -0
- package/dist/plugins/observability-view.js.map +1 -0
- package/dist/plugins/plugin-skill.d.ts +21 -0
- package/dist/plugins/plugin-skill.d.ts.map +1 -0
- package/dist/plugins/plugin-skill.js +45 -0
- package/dist/plugins/plugin-skill.js.map +1 -0
- package/dist/plugins/plugins-view.d.ts +2 -0
- package/dist/plugins/plugins-view.d.ts.map +1 -0
- package/dist/plugins/plugins-view.js +56 -0
- package/dist/plugins/plugins-view.js.map +1 -0
- package/dist/plugins/profiles-view.d.ts +2 -0
- package/dist/plugins/profiles-view.d.ts.map +1 -0
- package/dist/plugins/profiles-view.js +44 -0
- package/dist/plugins/profiles-view.js.map +1 -0
- package/dist/plugins/session-detail-view.d.ts +4 -0
- package/dist/plugins/session-detail-view.d.ts.map +1 -0
- package/dist/plugins/session-detail-view.js +106 -0
- package/dist/plugins/session-detail-view.js.map +1 -0
- package/dist/plugins/session-lifecycle.d.ts +6 -0
- package/dist/plugins/session-lifecycle.d.ts.map +1 -0
- package/dist/plugins/session-lifecycle.js +37 -0
- package/dist/plugins/session-lifecycle.js.map +1 -0
- package/dist/plugins/sessions-view.d.ts +2 -0
- package/dist/plugins/sessions-view.d.ts.map +1 -0
- package/dist/plugins/sessions-view.js +111 -0
- package/dist/plugins/sessions-view.js.map +1 -0
- package/dist/plugins/shell.d.ts +15 -0
- package/dist/plugins/shell.d.ts.map +1 -0
- package/dist/plugins/shell.js +50 -0
- package/dist/plugins/shell.js.map +1 -0
- package/dist/plugins/skills-view.d.ts +2 -0
- package/dist/plugins/skills-view.d.ts.map +1 -0
- package/dist/plugins/skills-view.js +234 -0
- package/dist/plugins/skills-view.js.map +1 -0
- package/dist/plugins/subagent.d.ts +12 -0
- package/dist/plugins/subagent.d.ts.map +1 -0
- package/dist/plugins/subagent.js +40 -0
- package/dist/plugins/subagent.js.map +1 -0
- package/dist/plugins/text-delta.d.ts +2 -0
- package/dist/plugins/text-delta.d.ts.map +1 -0
- package/dist/plugins/text-delta.js +19 -0
- package/dist/plugins/text-delta.js.map +1 -0
- package/dist/plugins/tool-call.d.ts +2 -0
- package/dist/plugins/tool-call.d.ts.map +1 -0
- package/dist/plugins/tool-call.js +123 -0
- package/dist/plugins/tool-call.js.map +1 -0
- package/dist/plugins/workspaces-view.d.ts +4 -0
- package/dist/plugins/workspaces-view.d.ts.map +1 -0
- package/dist/plugins/workspaces-view.js +382 -0
- package/dist/plugins/workspaces-view.js.map +1 -0
- package/dist/prompt-history-store.d.ts +3 -0
- package/dist/prompt-history-store.d.ts.map +1 -0
- package/dist/prompt-history-store.js +42 -0
- package/dist/prompt-history-store.js.map +1 -0
- package/dist/prompt-input.d.ts +37 -0
- package/dist/prompt-input.d.ts.map +1 -0
- package/dist/prompt-input.js +249 -0
- package/dist/prompt-input.js.map +1 -0
- package/dist/registry.d.ts +13 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +27 -0
- package/dist/registry.js.map +1 -0
- package/dist/session-dispatch.d.ts +35 -0
- package/dist/session-dispatch.d.ts.map +1 -0
- package/dist/session-dispatch.js +129 -0
- package/dist/session-dispatch.js.map +1 -0
- package/package.json +85 -0
- package/specs/kanban-workspaces-spec.md +293 -0
- package/specs/kanban-workspaces-subtasks.md +180 -0
package/README.md
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# @a5c-ai/genty-tui
|
|
2
|
+
|
|
3
|
+
Ink-based TUI for adapters with a plugin-first architecture. Almost everything
|
|
4
|
+
(message renderers, tool-call cards, diff views, session manager, chat) ships
|
|
5
|
+
as a plugin. The host package only provides the Ink process, view router, and
|
|
6
|
+
the SDK-injected `TuiContext`.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm i -g @a5c-ai/genty-tui
|
|
12
|
+
adapters-tui
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Development
|
|
16
|
+
|
|
17
|
+
Package-level `build` and `test` scripts are routed through the repo-root
|
|
18
|
+
`scripts/adapters-build.cjs` helper so `@a5c-ai/genty-tui` runs with its
|
|
19
|
+
adapters prerequisites built in dependency order and its tests executed from
|
|
20
|
+
the repo root. Use `npm run build:local --workspace=@a5c-ai/genty-tui`
|
|
21
|
+
when you only want the package-local TypeScript compile.
|
|
22
|
+
|
|
23
|
+
Run `npm run verify:release --workspace=@a5c-ai/genty-tui` after a build to
|
|
24
|
+
confirm the packed package surface still includes the README-linked kanban/workspaces
|
|
25
|
+
planning artifacts.
|
|
26
|
+
|
|
27
|
+
## Kanban/workspaces surface
|
|
28
|
+
|
|
29
|
+
The package now ships first-phase `kanban` and `workspaces` views backed by the
|
|
30
|
+
shared kanban/workspace control plane.
|
|
31
|
+
|
|
32
|
+
- Runtime today: `kanban` view (list-first issue browsing, issue detail,
|
|
33
|
+
keyboard-driven backlog actions through an injected control plane, and linked
|
|
34
|
+
workspace/session handoff)
|
|
35
|
+
- Runtime today: `workspaces` view (workspace inventory, linked issue/session/run
|
|
36
|
+
context, lifecycle actions routed through the injected control plane, and
|
|
37
|
+
issue/session handoff back into the rest of the TUI)
|
|
38
|
+
|
|
39
|
+
- Spec: [`specs/kanban-workspaces-spec.md`](specs/kanban-workspaces-spec.md)
|
|
40
|
+
- Backlog decomposition: [`specs/kanban-workspaces-subtasks.md`](specs/kanban-workspaces-subtasks.md)
|
|
41
|
+
- Cross-package design note:
|
|
42
|
+
[`../../docs/adapters/archive/design/20-tui-kanban-workspaces.md`](../../docs/adapters/archive/design/20-tui-kanban-workspaces.md)
|
|
43
|
+
|
|
44
|
+
The planning documents remain useful design references for follow-on expansion
|
|
45
|
+
of both surfaces.
|
|
46
|
+
|
|
47
|
+
## Writing a plugin
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import { definePlugin } from '@a5c-ai/genty-tui/plugin';
|
|
51
|
+
import { Text } from 'ink';
|
|
52
|
+
import React from 'react';
|
|
53
|
+
|
|
54
|
+
export default definePlugin({
|
|
55
|
+
name: 'my-error-renderer',
|
|
56
|
+
register(ctx) {
|
|
57
|
+
ctx.registerEventRenderer({
|
|
58
|
+
id: 'error',
|
|
59
|
+
match: (ev) => ev.type === 'error',
|
|
60
|
+
component: ({ event }) =>
|
|
61
|
+
event.type === 'error' ? <Text color="red">{event.message}</Text> : null,
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Pass your plugins to `App`:
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
import { render } from 'ink';
|
|
71
|
+
import { App, builtinPlugins } from '@a5c-ai/genty-tui';
|
|
72
|
+
import myPlugin from './my-plugin.js';
|
|
73
|
+
|
|
74
|
+
render(<App client={client} plugins={[...builtinPlugins, myPlugin]} />);
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Extension points
|
|
78
|
+
|
|
79
|
+
- `registerView` — top-level tab in the TUI (chat, sessions, config, …)
|
|
80
|
+
- `registerEventRenderer` — per-`AgentEvent` display component. The renderer
|
|
81
|
+
with `id: 'fallback'` is reserved for the built-in dim one-liner that
|
|
82
|
+
handles any unrecognized event type; other renderers take priority.
|
|
83
|
+
- `registerCommand` — global hotkey command
|
|
84
|
+
- `registerPromptHandler` — overrides the default `p` prompt dispatch. If any
|
|
85
|
+
plugin registers a prompt handler, it receives the prompt instead of
|
|
86
|
+
`client.run({ agent: defaultAgent, prompt })`.
|
|
87
|
+
|
|
88
|
+
All extension points get an injected `TuiContext` with:
|
|
89
|
+
- `client: AgentMuxClient` — the SDK client instance
|
|
90
|
+
- `eventStream: EventStream` — shared pub/sub of `AgentEvent`s. Views
|
|
91
|
+
subscribe to render streaming output; commands can push synthetic events
|
|
92
|
+
via `ctx.emit({ type: 'event', event })`.
|
|
93
|
+
|
|
94
|
+
## Running a prompt
|
|
95
|
+
|
|
96
|
+
Press `p` to open the prompt input, type your message, and press Enter.
|
|
97
|
+
Events from the resulting `client.run()` are pushed into the shared
|
|
98
|
+
`EventStream` and rendered by `chat-view` in registration-priority order
|
|
99
|
+
(specific renderers before the fallback).
|
|
100
|
+
|
|
101
|
+
The built-in plugins (`text-delta`, `thinking-delta`, `tool-call`,
|
|
102
|
+
`tool-error`, `cost`, `chat-view`, `sessions-view`, `fallback`) are all
|
|
103
|
+
implemented through these same extension points — use them as references.
|
|
104
|
+
|
|
105
|
+
The logs / observability view is part of the supported built-in surface. Press
|
|
106
|
+
`l` to open it. The metrics header aggregates the full buffered `EventStream`,
|
|
107
|
+
the global `/` filter only narrows the visible log rows, and pressing `e`
|
|
108
|
+
exports the full buffered stream to `session-log-<timestamp>.json` in the
|
|
109
|
+
current working directory.
|
|
110
|
+
|
|
111
|
+
## View hotkeys
|
|
112
|
+
|
|
113
|
+
| Key | View | Purpose |
|
|
114
|
+
|-----|------------|-----------------------------------------------|
|
|
115
|
+
| `1` | chat | streaming run output + filter |
|
|
116
|
+
| `2` | sessions | session list (press `d` to inspect + export) |
|
|
117
|
+
| `3` | cost | cost/usage summary |
|
|
118
|
+
| `4` | adapters | discovered adapters |
|
|
119
|
+
| `5` | models | model registry per adapter |
|
|
120
|
+
| `6` | profiles | run-options profiles |
|
|
121
|
+
| `7` | plugins | native plugins per adapter |
|
|
122
|
+
| `8` | kanban | backlog/board browsing + issue actions |
|
|
123
|
+
| `W` | workspaces | workspace lifecycle inventory + actions |
|
|
124
|
+
| `9` | help | keybindings + tips |
|
|
125
|
+
| `0` | mcp | registered MCP servers |
|
|
126
|
+
| `-` | doctor | capability matrix / diagnostics |
|
|
127
|
+
| `l` | logs | observability metrics + filtered log stream |
|
|
128
|
+
| `A` | auth | auth status per adapter |
|
|
129
|
+
| `C` | config | config view |
|
|
130
|
+
| `K` | skills | installed skills (d: delete, r: refresh) |
|
|
131
|
+
| `G` | agents | installed sub-agents (d: delete, r: refresh) |
|
|
132
|
+
| `H` | hooks | registered hooks (d: remove, r: refresh) |
|
|
133
|
+
|
|
134
|
+
Global: chat composer auto-focuses in `chat`; `Esc` temporarily dismisses it;
|
|
135
|
+
`/` filter, `:` / Ctrl-K palette, `m` model picker, `N` agent picker, `P`
|
|
136
|
+
profile picker, `i` interrupt, `y`/`n` approval, `q` quit.
|
|
137
|
+
|
|
138
|
+
Inside `kanban`, press `w` to jump to the linked workspace for the selected
|
|
139
|
+
issue. Inside `workspaces`, press `g` to jump back to the linked issue. If you
|
|
140
|
+
open `session-detail` from either view, `b`/`Esc` returns to the originating
|
|
141
|
+
surface instead of always falling back to `sessions`.
|
|
142
|
+
|
|
143
|
+
## Logs / Observability View
|
|
144
|
+
|
|
145
|
+
The `logs` view is a built-in tab registered as `builtin:observability-view`.
|
|
146
|
+
|
|
147
|
+
- Hotkey: `l`
|
|
148
|
+
- Purpose: show aggregated tokens, cost, latency, error count, and tool-call
|
|
149
|
+
count for the buffered event stream.
|
|
150
|
+
- Filtering: the global `/` filter applies to the log rows in this view,
|
|
151
|
+
including `type:<prefix>` filters. Metrics continue to reflect the full
|
|
152
|
+
buffered stream so you can inspect a subset without losing session totals.
|
|
153
|
+
- Export: press `e` while the view is active to write the full buffered event
|
|
154
|
+
stream as pretty-printed JSON to `session-log-<timestamp>.json` in the
|
|
155
|
+
current working directory.
|
package/dist/app.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AgentMuxClient, DeferredPromptTarget, RunHandle } from '@a5c-ai/adapters';
|
|
2
|
+
import type { TuiPlugin } from './plugin.js';
|
|
3
|
+
import type { KanbanControlPlane } from './kanban-control-plane.js';
|
|
4
|
+
export interface AppProps {
|
|
5
|
+
client: AgentMuxClient;
|
|
6
|
+
plugins: TuiPlugin[];
|
|
7
|
+
kanban?: KanbanControlPlane;
|
|
8
|
+
defaultAgent?: string;
|
|
9
|
+
initialViewId?: string;
|
|
10
|
+
disableChatAutoPrompt?: boolean;
|
|
11
|
+
}
|
|
12
|
+
type ActiveRunCommand = {
|
|
13
|
+
kind: 'send';
|
|
14
|
+
prompt: string;
|
|
15
|
+
} | {
|
|
16
|
+
kind: 'queue';
|
|
17
|
+
prompt: string;
|
|
18
|
+
when: DeferredPromptTarget;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'steer';
|
|
21
|
+
prompt: string;
|
|
22
|
+
when: DeferredPromptTarget;
|
|
23
|
+
};
|
|
24
|
+
export declare function parseActiveRunCommand(prompt: string): ActiveRunCommand | null;
|
|
25
|
+
export declare function dispatchPromptToActiveRun(handle: RunHandle, prompt: string): Promise<string>;
|
|
26
|
+
export declare function App({ client, plugins, kanban, defaultAgent, initialViewId, disableChatAutoPrompt, }: AppProps): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAc,oBAAoB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEpG,OAAO,KAAK,EAAE,SAAS,EAA+B,MAAM,aAAa,CAAC;AAa1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,KAAK,gBAAgB,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAElE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAc7E;AAeD,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAelG;AA6BD,wBAAgB,GAAG,CAAC,EAClB,MAAM,EACN,OAAO,EACP,MAAM,EACN,YAAuB,EACvB,aAAsB,EACtB,qBAA6B,GAC9B,EAAE,QAAQ,2CA4rBV"}
|