@12ui/design 0.2.84 → 0.2.86

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 (127) hide show
  1. package/README.md +37 -6
  2. package/SKILL.md +1 -1
  3. package/codex-plugin/assets/12ui-icon-dark.png +0 -0
  4. package/codex-plugin/assets/12ui-icon.png +0 -0
  5. package/codex-plugin/marketplace.json +20 -0
  6. package/codex-plugin/mcp.json +7 -0
  7. package/codex-plugin/plugin.json +157 -0
  8. package/dist/agent-command-runner.d.ts +41 -0
  9. package/dist/agent-command-runner.d.ts.map +1 -0
  10. package/dist/agent-command-runner.js +90 -0
  11. package/dist/agent-command-runner.js.map +1 -0
  12. package/dist/agent-plugin-step.d.ts +47 -0
  13. package/dist/agent-plugin-step.d.ts.map +1 -0
  14. package/dist/agent-plugin-step.js +190 -0
  15. package/dist/agent-plugin-step.js.map +1 -0
  16. package/dist/claude-plugin-installer.d.ts +61 -0
  17. package/dist/claude-plugin-installer.d.ts.map +1 -0
  18. package/dist/claude-plugin-installer.js +178 -0
  19. package/dist/claude-plugin-installer.js.map +1 -0
  20. package/dist/cli-run.d.ts.map +1 -1
  21. package/dist/cli-run.js +9 -1
  22. package/dist/cli-run.js.map +1 -1
  23. package/dist/cli-skill-command.d.ts +6 -0
  24. package/dist/cli-skill-command.d.ts.map +1 -1
  25. package/dist/cli-skill-command.js +30 -7
  26. package/dist/cli-skill-command.js.map +1 -1
  27. package/dist/cli-update-command.d.ts +22 -0
  28. package/dist/cli-update-command.d.ts.map +1 -0
  29. package/dist/cli-update-command.js +39 -0
  30. package/dist/cli-update-command.js.map +1 -0
  31. package/dist/cli-usage.d.ts.map +1 -1
  32. package/dist/cli-usage.js +1 -0
  33. package/dist/cli-usage.js.map +1 -1
  34. package/dist/codex-plugin-installer.d.ts +56 -0
  35. package/dist/codex-plugin-installer.d.ts.map +1 -0
  36. package/dist/codex-plugin-installer.js +239 -0
  37. package/dist/codex-plugin-installer.js.map +1 -0
  38. package/dist/codex-skill-config.d.ts +22 -0
  39. package/dist/codex-skill-config.d.ts.map +1 -1
  40. package/dist/codex-skill-config.js +84 -2
  41. package/dist/codex-skill-config.js.map +1 -1
  42. package/dist/mcp-slate-tool-defs.d.ts.map +1 -1
  43. package/dist/mcp-slate-tool-defs.js +2 -1
  44. package/dist/mcp-slate-tool-defs.js.map +1 -1
  45. package/dist/mcp-slate-ui-copy.d.ts +4 -0
  46. package/dist/mcp-slate-ui-copy.d.ts.map +1 -1
  47. package/dist/mcp-slate-ui-copy.js +2 -0
  48. package/dist/mcp-slate-ui-copy.js.map +1 -1
  49. package/dist/mcp-slate-ui-locales/de-DE.d.ts.map +1 -1
  50. package/dist/mcp-slate-ui-locales/de-DE.js +1 -0
  51. package/dist/mcp-slate-ui-locales/de-DE.js.map +1 -1
  52. package/dist/mcp-slate-ui-locales/es-419.d.ts.map +1 -1
  53. package/dist/mcp-slate-ui-locales/es-419.js +1 -0
  54. package/dist/mcp-slate-ui-locales/es-419.js.map +1 -1
  55. package/dist/mcp-slate-ui-locales/es-ES.d.ts.map +1 -1
  56. package/dist/mcp-slate-ui-locales/es-ES.js +1 -0
  57. package/dist/mcp-slate-ui-locales/es-ES.js.map +1 -1
  58. package/dist/mcp-slate-ui-locales/fr-FR.d.ts.map +1 -1
  59. package/dist/mcp-slate-ui-locales/fr-FR.js +1 -0
  60. package/dist/mcp-slate-ui-locales/fr-FR.js.map +1 -1
  61. package/dist/mcp-slate-ui-locales/hi-IN.d.ts.map +1 -1
  62. package/dist/mcp-slate-ui-locales/hi-IN.js +1 -0
  63. package/dist/mcp-slate-ui-locales/hi-IN.js.map +1 -1
  64. package/dist/mcp-slate-ui-locales/it-IT.d.ts.map +1 -1
  65. package/dist/mcp-slate-ui-locales/it-IT.js +1 -0
  66. package/dist/mcp-slate-ui-locales/it-IT.js.map +1 -1
  67. package/dist/mcp-slate-ui-locales/ja-JP.d.ts.map +1 -1
  68. package/dist/mcp-slate-ui-locales/ja-JP.js +1 -0
  69. package/dist/mcp-slate-ui-locales/ja-JP.js.map +1 -1
  70. package/dist/mcp-slate-ui-locales/ko-KR.d.ts.map +1 -1
  71. package/dist/mcp-slate-ui-locales/ko-KR.js +1 -0
  72. package/dist/mcp-slate-ui-locales/ko-KR.js.map +1 -1
  73. package/dist/mcp-slate-ui-locales/pt-BR.d.ts.map +1 -1
  74. package/dist/mcp-slate-ui-locales/pt-BR.js +1 -0
  75. package/dist/mcp-slate-ui-locales/pt-BR.js.map +1 -1
  76. package/dist/mcp-slate-ui-locales/zh-CN.d.ts.map +1 -1
  77. package/dist/mcp-slate-ui-locales/zh-CN.js +1 -0
  78. package/dist/mcp-slate-ui-locales/zh-CN.js.map +1 -1
  79. package/dist/mcp-slate-ui-locales/zh-TW.d.ts.map +1 -1
  80. package/dist/mcp-slate-ui-locales/zh-TW.js +1 -0
  81. package/dist/mcp-slate-ui-locales/zh-TW.js.map +1 -1
  82. package/dist/mcp-slate-ui-script-designs.d.ts.map +1 -1
  83. package/dist/mcp-slate-ui-script-designs.js +21 -0
  84. package/dist/mcp-slate-ui-script-designs.js.map +1 -1
  85. package/dist/mcp-slate-ui-script-remote.d.ts.map +1 -1
  86. package/dist/mcp-slate-ui-script-remote.js +1 -0
  87. package/dist/mcp-slate-ui-script-remote.js.map +1 -1
  88. package/dist/mcp-slate-ui-styles-designs.d.ts.map +1 -1
  89. package/dist/mcp-slate-ui-styles-designs.js +3 -0
  90. package/dist/mcp-slate-ui-styles-designs.js.map +1 -1
  91. package/dist/run-journal-commands.d.ts.map +1 -1
  92. package/dist/run-journal-commands.js +5 -0
  93. package/dist/run-journal-commands.js.map +1 -1
  94. package/dist/server.d.ts.map +1 -1
  95. package/dist/server.js +2 -1
  96. package/dist/server.js.map +1 -1
  97. package/dist/skill-clients.d.ts +2 -1
  98. package/dist/skill-clients.d.ts.map +1 -1
  99. package/dist/skill-clients.js +58 -1
  100. package/dist/skill-clients.js.map +1 -1
  101. package/dist/slate-captions-local.d.ts +2 -0
  102. package/dist/slate-captions-local.d.ts.map +1 -1
  103. package/dist/slate-captions-local.js +9 -3
  104. package/dist/slate-captions-local.js.map +1 -1
  105. package/dist/slate-ledger.d.ts +1 -1
  106. package/dist/slate-ledger.d.ts.map +1 -1
  107. package/dist/slate-retry.d.ts +22 -0
  108. package/dist/slate-retry.d.ts.map +1 -0
  109. package/dist/slate-retry.js +49 -0
  110. package/dist/slate-retry.js.map +1 -0
  111. package/dist/slate-round-runner.d.ts.map +1 -1
  112. package/dist/slate-round-runner.js +2 -1
  113. package/dist/slate-round-runner.js.map +1 -1
  114. package/dist/slate-run-action.d.ts.map +1 -1
  115. package/dist/slate-run-action.js +29 -1
  116. package/dist/slate-run-action.js.map +1 -1
  117. package/dist/slate-runtime.d.ts +3 -0
  118. package/dist/slate-runtime.d.ts.map +1 -1
  119. package/dist/slate-runtime.js +1 -0
  120. package/dist/slate-runtime.js.map +1 -1
  121. package/dist/slate-workspace-parse.d.ts.map +1 -1
  122. package/dist/slate-workspace-parse.js +1 -0
  123. package/dist/slate-workspace-parse.js.map +1 -1
  124. package/dist/slate-workspace-types.d.ts +2 -0
  125. package/dist/slate-workspace-types.d.ts.map +1 -1
  126. package/open-design.json +2 -2
  127. package/package.json +2 -1
package/README.md CHANGED
@@ -43,9 +43,13 @@ curl -fsSL https://12ui.com/install-cli.sh | sh
43
43
  Both pin just the `12ui` binary - no skills, no browser sign-in - into the same
44
44
  managed launcher and versioned bundle, verified and installed the same way.
45
45
  `12ui cli status` reports what is pinned. Managed installations do not update
46
- automatically; `12ui cli install` pins the version currently running. To upgrade
47
- an existing installation to this release, run
48
- `npx -y @12ui/design@0.2.67 cli install`, then check `12ui --version`.
46
+ automatically; `12ui cli install` pins the version currently running.
47
+ `12ui update` upgrades an installation: it runs
48
+ `npx -y @12ui/design@latest skill install`, which pins the newest release and
49
+ refreshes every skill and plugin `skill install` manages, then runs
50
+ `claude plugin marketplace update 12ui-plugin` and
51
+ `claude plugin update 12ui-design@12ui-plugin` in every Claude Code home that
52
+ has the plugin.
49
53
  `12ui skill install` adds the skills later.
50
54
 
51
55
  Every supported agent reads `SKILL.md` bundles from one user-scoped directory,
@@ -54,7 +58,7 @@ so the same bundle is installed byte-identically to each:
54
58
  | `--client` | Agent | Installs into |
55
59
  | ------------- | ------------------- | ----------------------------- |
56
60
  | `codex` | Codex CLI | `~/.codex*/skills/` (`CODEX_HOME`) |
57
- | `claude-code` | Claude Code | `~/.claude/skills/` |
61
+ | `claude-code` | Claude Code | `~/.claude*/skills/` (`CLAUDE_CONFIG_DIR`) |
58
62
  | `grok` | Grok CLI | `~/.grok/skills/` (`GROK_HOME`) |
59
63
  | `cursor` | Cursor CLI | `~/.cursor/skills/` |
60
64
  | `antigravity` | Google Antigravity (`agy`) | `~/.gemini/config/skills/` |
@@ -68,8 +72,35 @@ from `~/.copilot/skills/` starting in 1.0; releases before that have no skill
68
72
  mechanism at all.
69
73
 
70
74
  Codex discovery includes every local `~/.codex*` profile directory, plus
71
- `CODEX_HOME` when it points outside that set. Pass
72
- `--client codex --home <path>` when an operation should target only one profile.
75
+ `CODEX_HOME` when it points outside that set. Claude Code discovery includes
76
+ `~/.claude`, every other `~/.claude*` directory that holds `.claude.json`
77
+ (Claude Code's own file in each config dir; other tools' `~/.claude*` folders
78
+ are skipped), and `CLAUDE_CONFIG_DIR`. A profile that is a symlink to a
79
+ directory counts like the directory. Pass `--client codex --home <path>` when an operation
80
+ should target only one profile.
81
+
82
+ Where the agent can carry the Design workspace as a plugin, `skill install`
83
+ installs the plugin, which carries the same skill, instead of the bare skill:
84
+
85
+ - Claude Code 2.1.287 or later gets `12ui-design@12ui-plugin` from the
86
+ just-every/12ui-plugin GitHub marketplace (the skill, the hosted
87
+ `12ui-workspace` server and the Design workspace pane). The marketplace is
88
+ set to auto-update, so Claude Code refreshes the plugin at startup. An older
89
+ Claude Code gets the skill plus one line asking for `claude update`.
90
+ - Codex with `codex plugin` gets `12ui@12ui-local`: the skill plus the hosted
91
+ server that draws the workspace inline. The CLI writes it to
92
+ `~/.local/share/12ui/codex-plugin/12ui` (from `codex-plugin/` and
93
+ `skills/12ui-design`) and adds that folder as the `12ui-local` marketplace.
94
+ The old directory-listed `12ui-design` skill is switched off by marked
95
+ `[[skills.config]]` blocks.
96
+
97
+ A skill-only copy the CLI wrote earlier is removed once the plugin is in place,
98
+ a re-run changes nothing, and `12ui skill remove` (or `uninstall`) removes the
99
+ plugin, its marketplace and those blocks as well. The shared Codex plugin
100
+ folder goes only once no Codex home on the machine still has the `12ui-local`
101
+ marketplace. A plugin step that fails (or an agent command that runs past a
102
+ minute) leaves that home with the skill instead; the other homes and the exit
103
+ code are unaffected.
73
104
 
74
105
  Skill installation does not require an API account or start account onboarding.
75
106
  Explicit authentication options still prepare credentials; hosted commands handle
package/SKILL.md CHANGED
@@ -23,7 +23,7 @@ candidates.
23
23
  Use `12ui` when it is available on `PATH`. Otherwise invoke the pinned CLI that
24
24
  the plugin's `open-design.json` MCP entry uses:
25
25
 
26
- npx -y @12ui/design@0.2.84 <command> ...
26
+ npx -y @12ui/design@0.2.86 <command> ...
27
27
 
28
28
  Run `12ui auth status --json` (or its pinned `npx` equivalent) first. A desktop user can authenticate with `12ui auth login`; a headless
29
29
  run supplies `TWELVE_UI_API_KEY`. Never put a credential into project files,
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "12ui-local",
3
+ "interface": {
4
+ "displayName": "12ui"
5
+ },
6
+ "plugins": [
7
+ {
8
+ "name": "12ui",
9
+ "source": {
10
+ "source": "local",
11
+ "path": "./"
12
+ },
13
+ "policy": {
14
+ "installation": "AVAILABLE",
15
+ "authentication": "ON_INSTALL"
16
+ },
17
+ "category": "Creativity"
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "mcpServers": {
3
+ "12ui-workspace": {
4
+ "url": "https://design.12ui.com/mcp"
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,157 @@
1
+ {
2
+ "name": "12ui",
3
+ "version": "1.0.1",
4
+ "description": "A Design workspace in your Codex thread: see design options for a UI as images, select one, ask for more, edit with a scribble, search design references and hand an option off to be built. Your agent runs the 12ui command line once per request, which draws every option at once with your own Codex sign-in.",
5
+ "author": {
6
+ "name": "12ui",
7
+ "email": "support@12ui.com",
8
+ "url": "https://12ui.com/"
9
+ },
10
+ "homepage": "https://12ui.com/",
11
+ "license": "MIT",
12
+ "keywords": [
13
+ "design",
14
+ "ui",
15
+ "mockup",
16
+ "workspace",
17
+ "12ui"
18
+ ],
19
+ "skills": "./skills/",
20
+ "mcpServers": "./.mcp.json",
21
+ "interface": {
22
+ "displayName": "12ui Design",
23
+ "shortDescription": "Design options for your UI",
24
+ "longDescription": "Open a Design workspace in your Codex thread: a screen that shows design options for an app or a website as images. Select the one you like, ask for more options with a note, mark up an option with a scribble and ask for a change, search a collection of real design references and steer new options with them, and hand an option off to be built.\n\nYour Codex agent runs the 12ui command line once per request, which draws every option at once with your own Codex sign-in and image generation, and adds each option to the workspace as it finishes. Your agent never draws in the thread. There is no 12ui account and no sign-in: a workspace is reached through a private handle held in your thread. Images are stored for up to 30 days and removed after 14 days without use.\n\nWorks in Codex on a computer with Node.js; your agent installs the 12ui command line once. The draw command runs outside the sandbox, with network access to design.12ui.com, which Codex may ask you to approve.",
25
+ "developerName": "12ui",
26
+ "category": "Creativity",
27
+ "capabilities": [
28
+ "Interactive",
29
+ "Read",
30
+ "Write"
31
+ ],
32
+ "websiteURL": "https://12ui.com/",
33
+ "supportURL": "https://12ui.com/contact",
34
+ "privacyPolicyURL": "https://12ui.com/privacy",
35
+ "termsOfServiceURL": "https://12ui.com/terms",
36
+ "defaultPrompt": [
37
+ "Open a Design workspace for my app idea.",
38
+ "Show me design options for a fitness app home screen.",
39
+ "Explore looks for my landing page in a Design workspace."
40
+ ],
41
+ "brandColor": "#0F172A",
42
+ "composerIcon": "./assets/12ui-icon.png",
43
+ "composerIconDark": "./assets/12ui-icon-dark.png",
44
+ "logo": "./assets/12ui-icon.png",
45
+ "logoDark": "./assets/12ui-icon-dark.png"
46
+ },
47
+ "extensions": {
48
+ "com.openai": {
49
+ "onboardingSkill": "./skills/12ui-design/SKILL.md",
50
+ "review": {
51
+ "test_cases": {
52
+ "positive": [
53
+ {
54
+ "description": "Open a workspace and receive options",
55
+ "prompt": "Open a Design workspace for a meditation app landing page.",
56
+ "tools_triggered": "design.slate.create",
57
+ "expected_behavior": "The Design workspace card appears in the thread with waiting tiles. The agent runs the 12ui draw command once and the four options appear in the card."
58
+ },
59
+ {
60
+ "description": "Generate more options with a note",
61
+ "prompt": "Open a Design workspace for a bakery website. When the options appear, click Generate more, choose 2, type 'warmer colors' and click Generate.",
62
+ "tools_triggered": "design.slate.create, design.slate.run, design.slate.data",
63
+ "expected_behavior": "After the click the agent reads the request with design.slate.data and runs the 12ui draw command once; two new options appear as a second round."
64
+ },
65
+ {
66
+ "description": "Edit an option with a scribble",
67
+ "prompt": "Open a Design workspace for a fitness app onboarding screen. When the options appear, open option A, click Edit, circle the headline, type 'Make the headline larger' and click Apply.",
68
+ "tools_triggered": "design.slate.create, design.slate.run, design.slate.data",
69
+ "expected_behavior": "The agent reads the request with design.slate.data and runs the 12ui draw command once; a new version of option A appears."
70
+ },
71
+ {
72
+ "description": "Search inspiration and steer a round",
73
+ "prompt": "Open a Design workspace for a travel booking site. When the options appear, open the Inspiration tab, search 'minimal dashboard', select two references and click Generate more.",
74
+ "tools_triggered": "design.slate.create, design.slate.inspire, design.slate.reference, design.slate.inspiration, design.slate.run, design.slate.data",
75
+ "expected_behavior": "Reference thumbnails appear for the search; the selected references are used by the next round, whose options appear in the card."
76
+ },
77
+ {
78
+ "description": "Select an option and convert it",
79
+ "prompt": "Open a Design workspace for a recipe app home screen. When the options appear, select option B, then click Convert, choose HTML and click Send.",
80
+ "tools_triggered": "design.slate.create, design.slate.pick, design.slate.handoff, design.slate.data",
81
+ "expected_behavior": "The screen shows option B as selected; the agent reads the request with design.slate.data and builds an HTML page from option B in the project."
82
+ }
83
+ ],
84
+ "negative": [
85
+ {
86
+ "description": "Unrelated question",
87
+ "prompt": "What is the weather in Paris today?"
88
+ },
89
+ {
90
+ "description": "Unrelated coding task",
91
+ "prompt": "Write a Python function that sorts a list."
92
+ },
93
+ {
94
+ "description": "Unsupported deliverable",
95
+ "prompt": "Create a slide deck about quarterly sales."
96
+ }
97
+ ]
98
+ },
99
+ "commerce": false,
100
+ "commerce_description": "This plugin has no paid features and no payment flow."
101
+ },
102
+ "publication": {
103
+ "release_notes": "Initial release: a Design workspace for Codex with options drawn all at once by the 12ui command line, select, edit with a scribble, inspiration search and hand-off to build. No 12ui account or sign-in.",
104
+ "translations": {
105
+ "es-419": {
106
+ "subtitle": "Opciones de diseño para tu UI",
107
+ "description": "Abre un espacio de trabajo de diseño en tu hilo de Codex: una pantalla que muestra opciones de diseño para una app o un sitio web en forma de imágenes. Selecciona la que te guste, pide más opciones con una nota, marca una opción con un garabato y pide un cambio, busca en una colección de referencias de diseño reales y úsalas para orientar nuevas opciones, y envía una opción para que se construya.\n\nTu agente de Codex ejecuta la herramienta de línea de comandos de 12ui una vez por solicitud; la herramienta dibuja todas las opciones a la vez con tu propio inicio de sesión de Codex y la generación de imágenes de Codex, y agrega cada opción al espacio de trabajo en cuanto está lista. Tu agente nunca dibuja en el hilo. No hay cuenta de 12ui ni inicio de sesión: al espacio de trabajo se accede mediante un identificador privado que se guarda en tu hilo. Las imágenes se guardan hasta 30 días y se eliminan después de 14 días sin uso.\n\nFunciona en Codex en una computadora con Node.js; tu agente instala la herramienta de línea de comandos de 12ui una sola vez. El comando draw se ejecuta fuera del sandbox, con acceso de red a design.12ui.com, algo que Codex puede pedirte que apruebes."
108
+ },
109
+ "es-ES": {
110
+ "subtitle": "Opciones de diseño para tu UI",
111
+ "description": "Abre un espacio de trabajo de diseño en tu hilo de Codex: una pantalla que muestra opciones de diseño para una app o un sitio web en forma de imágenes. Selecciona la que te guste, pide más opciones con una nota, marca una opción con un garabato y pide un cambio, busca en una colección de referencias de diseño reales y úsalas para orientar nuevas opciones, y envía una opción para que se construya.\n\nTu agente de Codex ejecuta la herramienta de línea de comandos de 12ui una vez por solicitud; la herramienta dibuja todas las opciones a la vez con tu propio inicio de sesión de Codex y la generación de imágenes de Codex, y añade cada opción al espacio de trabajo en cuanto está lista. Tu agente nunca dibuja en el hilo. No hay cuenta de 12ui ni inicio de sesión: al espacio de trabajo se accede mediante un identificador privado que se guarda en tu hilo. Las imágenes se guardan hasta 30 días y se eliminan tras 14 días sin uso.\n\nFunciona en Codex en un ordenador con Node.js; tu agente instala la herramienta de línea de comandos de 12ui una sola vez. El comando draw se ejecuta fuera del sandbox, con acceso de red a design.12ui.com, algo que Codex puede pedirte que apruebes."
112
+ },
113
+ "fr-FR": {
114
+ "subtitle": "Options de design d’interface",
115
+ "description": "Ouvrez un espace de travail de design dans votre fil de discussion Codex : un écran qui présente, sous forme d’images, des options de design pour une app ou un site web. Sélectionnez celle qui vous plaît, demandez d’autres options avec une note, annotez une option d’un gribouillis et demandez une modification, recherchez dans une collection de références de design réelles et servez-vous-en pour orienter de nouvelles options, et transmettez une option pour qu’elle soit construite.\n\nVotre agent Codex exécute l’outil en ligne de commande 12ui une fois par demande ; celui-ci dessine toutes les options en même temps avec votre propre session Codex et la génération d’images de Codex, et ajoute chaque option à l’espace de travail dès qu’elle est prête. Votre agent ne dessine jamais dans le fil. Il n’y a ni compte 12ui ni connexion : on accède à l’espace de travail grâce à un identifiant privé conservé dans votre fil. Les images sont conservées jusqu’à 30 jours et supprimées après 14 jours sans utilisation.\n\nFonctionne dans Codex sur un ordinateur équipé de Node.js ; votre agent installe l’outil en ligne de commande 12ui une seule fois. La commande draw s’exécute hors du bac à sable, avec un accès réseau à design.12ui.com, ce que Codex peut vous demander d’approuver."
116
+ },
117
+ "fr-CA": {
118
+ "subtitle": "Options de design d’interface",
119
+ "description": "Ouvrez un espace de travail de design dans votre fil de discussion Codex : un écran qui présente, sous forme d’images, des options de design pour une application ou un site Web. Sélectionnez celle qui vous plaît, demandez d’autres options avec une note, annotez une option d’un gribouillis et demandez une modification, recherchez dans une collection de références de design réelles et servez-vous-en pour orienter de nouvelles options, et transmettez une option pour qu’elle soit construite.\n\nVotre agent Codex exécute l’outil en ligne de commande 12ui une fois par demande; celui-ci dessine toutes les options en même temps avec votre propre session Codex et la génération d’images de Codex, et ajoute chaque option à l’espace de travail dès qu’elle est prête. Votre agent ne dessine jamais dans le fil. Il n’y a ni compte 12ui ni connexion : on accède à l’espace de travail grâce à un identifiant privé conservé dans votre fil. Les images sont conservées jusqu’à 30 jours et supprimées après 14 jours sans utilisation.\n\nFonctionne dans Codex sur un ordinateur équipé de Node.js; votre agent installe l’outil en ligne de commande 12ui une seule fois. La commande draw s’exécute hors du bac à sable, avec un accès réseau à design.12ui.com, ce que Codex peut vous demander d’approuver."
120
+ },
121
+ "de-DE": {
122
+ "subtitle": "Designoptionen für deine UI",
123
+ "description": "Öffne einen Design-Workspace in deinem Codex-Thread: eine Ansicht, die Designoptionen für eine App oder eine Website als Bilder zeigt. Wähle die Option, die dir gefällt, fordere mit einer Notiz weitere Optionen an, markiere eine Option mit einer Kritzelei und bitte um eine Änderung, durchsuche eine Sammlung echter Designreferenzen und nutze sie, um neue Optionen zu lenken, und übergib eine Option zur Umsetzung.\n\nDein Codex-Agent führt das 12ui-Befehlszeilentool einmal pro Anfrage aus. Es zeichnet alle Optionen auf einmal mit deiner eigenen Codex-Anmeldung und der Bildgenerierung von Codex und fügt jede Option dem Workspace hinzu, sobald sie fertig ist. Dein Agent zeichnet nie im Thread. Es gibt kein 12ui-Konto und keine Anmeldung: Ein Workspace wird über eine private Kennung erreicht, die in deinem Thread gespeichert ist. Bilder werden bis zu 30 Tage gespeichert und nach 14 Tagen ohne Nutzung entfernt.\n\nFunktioniert in Codex auf einem Computer mit Node.js; dein Agent installiert das 12ui-Befehlszeilentool einmalig. Der draw-Befehl läuft außerhalb der Sandbox mit Netzwerkzugriff auf design.12ui.com; Codex bittet dich dafür möglicherweise um Freigabe."
124
+ },
125
+ "it-IT": {
126
+ "subtitle": "Opzioni di design per la UI",
127
+ "description": "Apri uno spazio di lavoro di design nel tuo thread di Codex: una schermata che mostra opzioni di design per un’app o un sito web sotto forma di immagini. Seleziona quella che ti piace, chiedi altre opzioni con una nota, segna un’opzione con uno scarabocchio e chiedi una modifica, cerca in una raccolta di riferimenti di design reali e usali per orientare nuove opzioni, e passa un’opzione allo sviluppo per farla realizzare.\n\nIl tuo agente Codex esegue lo strumento da riga di comando 12ui una volta per richiesta: lo strumento disegna tutte le opzioni contemporaneamente con il tuo accesso a Codex e la generazione di immagini di Codex, e aggiunge ogni opzione allo spazio di lavoro non appena è pronta. Il tuo agente non disegna mai nel thread. Non c’è alcun account 12ui né alcun accesso da effettuare: si raggiunge lo spazio di lavoro tramite un identificativo privato conservato nel tuo thread. Le immagini vengono conservate fino a 30 giorni ed eliminate dopo 14 giorni di inutilizzo.\n\nFunziona in Codex su un computer con Node.js; il tuo agente installa lo strumento da riga di comando 12ui una sola volta. Il comando draw viene eseguito fuori dalla sandbox, con accesso di rete a design.12ui.com, e Codex potrebbe chiederti di approvarlo."
128
+ },
129
+ "pt-BR": {
130
+ "subtitle": "Opções de design para sua UI",
131
+ "description": "Abra um espaço de trabalho de design na sua thread do Codex: uma tela que mostra opções de design para um app ou um site em forma de imagens. Selecione a que você preferir, peça mais opções com uma nota, marque uma opção com um rabisco e peça uma alteração, pesquise em uma coleção de referências de design reais e use-as para orientar novas opções, e encaminhe uma opção para ser construída.\n\nSeu agente do Codex executa a ferramenta de linha de comando do 12ui uma vez por pedido; ela desenha todas as opções de uma só vez com seu próprio login do Codex e a geração de imagens do Codex, e adiciona cada opção ao espaço de trabalho assim que ela fica pronta. Seu agente nunca desenha na thread. Não há conta do 12ui nem login: o espaço de trabalho é acessado por meio de um identificador privado guardado na sua thread. As imagens ficam armazenadas por até 30 dias e são removidas após 14 dias sem uso.\n\nFunciona no Codex em um computador com Node.js; seu agente instala a ferramenta de linha de comando do 12ui uma única vez. O comando draw é executado fora do sandbox, com acesso de rede a design.12ui.com, e o Codex pode pedir que você aprove isso."
132
+ },
133
+ "ja-JP": {
134
+ "subtitle": "あなたのUIのデザイン案",
135
+ "description": "Codexのスレッドでデザインワークスペースを開きます。アプリやWebサイトのデザイン案を画像で表示する画面です。気に入った案を選ぶ、メモを添えて追加の案を依頼する、案に手書きで書き込んで変更を依頼する、実在するデザインの参考事例コレクションを検索してそれをもとに新しい案の方向性を決める、案を実装に引き渡す、といった操作ができます。\n\nCodexエージェントはリクエストごとに12uiのコマンドラインツールを1回実行します。このツールは、あなた自身のCodexのサインインと画像生成を使ってすべての案を一度に描き、完成した案から順にワークスペースに追加します。エージェントがスレッド内で描くことはありません。12uiのアカウントはなく、サインインも不要です。ワークスペースには、スレッド内に保持される非公開の識別子でアクセスします。画像は最大30日間保存され、14日間使われないと削除されます。\n\nNode.jsが入ったコンピューター上のCodexで動作します。エージェントが12uiのコマンドラインツールを一度だけインストールします。drawコマンドはサンドボックスの外で実行され、design.12ui.comへのネットワークアクセスを伴います。これについてCodexから承認を求められる場合があります。"
136
+ },
137
+ "ko-KR": {
138
+ "subtitle": "내 UI를 위한 디자인 시안",
139
+ "description": "Codex 스레드에서 디자인 워크스페이스를 여세요. 앱이나 웹사이트의 디자인 시안을 이미지로 보여 주는 화면입니다. 마음에 드는 시안을 선택하고, 메모를 남겨 시안을 더 요청하고, 시안 위에 직접 그려 표시해 수정을 요청하고, 실제 디자인 레퍼런스 모음을 검색해 이를 바탕으로 새 시안의 방향을 잡고, 시안을 구현 단계로 넘길 수 있습니다.\n\nCodex 에이전트는 요청마다 12ui 명령줄 도구를 한 번 실행합니다. 이 도구는 내 Codex 로그인과 이미지 생성 기능으로 모든 시안을 한꺼번에 그려 내고, 완성되는 대로 각 시안을 워크스페이스에 추가합니다. 에이전트가 스레드 안에서 직접 그리지는 않습니다. 12ui 계정도, 로그인도 없습니다. 워크스페이스에는 스레드에 보관된 비공개 식별자로 접근합니다. 이미지는 최대 30일간 저장되며, 14일 동안 사용하지 않으면 삭제됩니다.\n\nNode.js가 설치된 컴퓨터의 Codex에서 작동하며, 에이전트가 12ui 명령줄 도구를 한 번만 설치합니다. draw 명령은 샌드박스 밖에서 실행되고 design.12ui.com에 네트워크로 접근하며, Codex가 이에 대한 승인을 요청할 수 있습니다."
140
+ },
141
+ "zh-CN": {
142
+ "subtitle": "你的 UI 设计方案",
143
+ "description": "在你的 Codex 对话中打开设计工作区:这是一个以图片形式展示应用或网站设计方案的界面。你可以选择喜欢的方案,附上备注请求更多方案,在方案上涂鸦标注并请求修改,搜索真实设计参考合集并用其引导新方案的方向,还可以将方案交付开发。\n\n你的 Codex 智能体每次请求时运行一次 12ui 命令行工具,该工具使用你自己的 Codex 登录和图像生成能力,一次性绘制所有方案,并在每个方案完成后将其添加到工作区。你的智能体从不在对话中绘图。没有 12ui 账号,也无需登录:工作区通过保存在你对话中的私有标识访问。图片最多保存 30 天,连续 14 天未使用即会删除。\n\n可在装有 Node.js 的电脑上的 Codex 中使用;你的智能体只需安装一次 12ui 命令行工具。draw 命令在沙箱外运行,并通过网络访问 design.12ui.com,Codex 可能会请你批准。"
144
+ },
145
+ "zh-TW": {
146
+ "subtitle": "你的 UI 設計方案",
147
+ "description": "在你的 Codex 對話中開啟設計工作區:這是以圖片呈現 App 或網站設計方案的畫面。你可以選擇喜歡的方案、附上備註要求更多方案、在方案上塗鴉標註並要求修改、搜尋真實設計參考範例集並以此引導新方案的方向,還能將方案交付開發。\n\n你的 Codex 代理程式每次收到請求時會執行一次 12ui 命令列工具,該工具使用你自己的 Codex 登入與影像生成功能,一次繪製所有方案,並在每個方案完成時將其加入工作區。你的代理程式絕不會在對話中繪圖。沒有 12ui 帳號,也不需要登入:工作區透過保存在你對話中的私密識別碼存取。圖片最多保存 30 天,連續 14 天未使用即會刪除。\n\n可在安裝了 Node.js 的電腦上的 Codex 中使用;你的代理程式只需安裝一次 12ui 命令列工具。draw 指令會在沙箱外執行,並透過網路存取 design.12ui.com,Codex 可能會請你核准。"
148
+ },
149
+ "hi-IN": {
150
+ "subtitle": "आपके UI के लिए डिज़ाइन विकल्प",
151
+ "description": "अपने Codex थ्रेड में एक डिज़ाइन वर्कस्पेस खोलें: एक ऐसी स्क्रीन जो किसी ऐप या वेबसाइट के डिज़ाइन विकल्पों को इमेज के रूप में दिखाती है। जो विकल्प आपको पसंद हो उसे चुनें, एक नोट के साथ और विकल्प माँगें, किसी विकल्प पर स्क्रिबल से निशान लगाकर बदलाव माँगें, असली डिज़ाइन संदर्भों के संग्रह में खोजें और उनसे नए विकल्पों को दिशा दें, और किसी विकल्प को बनाने के लिए सौंप दें।\n\nआपका Codex एजेंट हर अनुरोध पर 12ui कमांड लाइन टूल को एक बार चलाता है। यह टूल आपके अपने Codex साइन-इन और इमेज जनरेशन से सभी विकल्प एक साथ बनाता है, और हर विकल्प तैयार होते ही उसे वर्कस्पेस में जोड़ देता है। आपका एजेंट थ्रेड में कभी भी इमेज नहीं बनाता। कोई 12ui खाता नहीं है और कोई साइन-इन नहीं: वर्कस्पेस तक आपके थ्रेड में रखे एक निजी पहचानकर्ता के ज़रिए पहुँचा जाता है। इमेज अधिकतम 30 दिनों तक रखी जाती हैं और 14 दिनों तक इस्तेमाल न होने पर हटा दी जाती हैं।\n\nNode.js वाले कंप्यूटर पर Codex में काम करता है; आपका एजेंट 12ui कमांड लाइन टूल को एक बार इंस्टॉल करता है। draw कमांड सैंडबॉक्स के बाहर चलती है और उसे design.12ui.com तक नेटवर्क एक्सेस मिलता है। Codex इसके लिए आपसे मंज़ूरी माँग सकता है।"
152
+ }
153
+ }
154
+ }
155
+ }
156
+ }
157
+ }
@@ -0,0 +1,41 @@
1
+ export type AgentCommandResult = {
2
+ exitCode: number | null;
3
+ stdout: string;
4
+ stderr: string;
5
+ };
6
+ /**
7
+ * Runs another agent's own CLI (`claude`, `codex`) to manage its plugins. The
8
+ * signature is the seam the plugin installers are tested through: a test passes
9
+ * a scripted runner and no agent binary ever starts.
10
+ */
11
+ export type AgentCommandRunner = (command: string, args: readonly string[], options: {
12
+ environment: NodeJS.ProcessEnv;
13
+ timeoutMs?: number;
14
+ }) => Promise<AgentCommandResult>;
15
+ /**
16
+ * The child environment for every agent command and for `12ui update`: the
17
+ * caller's environment without `OPENAI_API_KEY`, which 12ui never uses without
18
+ * the user's explicit opt-in (owner rule) and no plugin step needs.
19
+ */
20
+ export declare const agentCommandEnvironment: (environment: NodeJS.ProcessEnv, overrides?: NodeJS.ProcessEnv) => NodeJS.ProcessEnv;
21
+ /**
22
+ * The longest an agent command may run. Measured on 2026-10-03 with Claude Code
23
+ * 2.1.287 in a fresh HOME: `claude plugin marketplace add just-every/12ui-plugin`
24
+ * (a GitHub clone) took 8.1-8.3s over three runs, `marketplace update` 5.6s,
25
+ * `plugin install` and `plugin update` under 1s. A minute is about seven times
26
+ * the slowest; past it the home gets the skill instead.
27
+ */
28
+ export declare const AGENT_COMMAND_TIMEOUT_MS = 60000;
29
+ /** After SIGTERM, how long a command has to exit before SIGKILL. */
30
+ export declare const AGENT_COMMAND_KILL_GRACE_MS = 2000;
31
+ /**
32
+ * Runs one command and always settles. A command that outlives its timeout gets
33
+ * SIGTERM, then SIGKILL after a short grace, and its pipes are destroyed, so
34
+ * neither a command that ignores SIGTERM nor a grandchild still holding the
35
+ * pipes keeps the CLI process alive.
36
+ */
37
+ export declare const runAgentCommand: AgentCommandRunner;
38
+ /** The last JSON object a `--json` command printed (both CLIs end with one). */
39
+ export declare const lastJsonObject: (stdout: string) => Record<string, unknown> | null;
40
+ export declare const commandFailure: (label: string, result: AgentCommandResult) => Error;
41
+ //# sourceMappingURL=agent-command-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-command-runner.d.ts","sourceRoot":"","sources":["../src/agent-command-runner.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAC/B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,KAC5D,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEjC;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,GAClC,aAAa,MAAM,CAAC,UAAU,EAC9B,YAAW,MAAM,CAAC,UAAe,KAChC,MAAM,CAAC,UAOT,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAC/C,oEAAoE;AACpE,eAAO,MAAM,2BAA2B,OAAQ,CAAC;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,kBA0C7B,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAWzE,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,OAAO,MAAM,EACb,QAAQ,kBAAkB,KACzB,KAIF,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { spawn } from 'node:child_process';
2
+ /**
3
+ * The child environment for every agent command and for `12ui update`: the
4
+ * caller's environment without `OPENAI_API_KEY`, which 12ui never uses without
5
+ * the user's explicit opt-in (owner rule) and no plugin step needs.
6
+ */
7
+ export const agentCommandEnvironment = (environment, overrides = {}) => {
8
+ const next = { ...environment, ...overrides };
9
+ delete next.OPENAI_API_KEY;
10
+ for (const [name, value] of Object.entries(overrides)) {
11
+ if (value === undefined)
12
+ delete next[name];
13
+ }
14
+ return next;
15
+ };
16
+ /**
17
+ * The longest an agent command may run. Measured on 2026-10-03 with Claude Code
18
+ * 2.1.287 in a fresh HOME: `claude plugin marketplace add just-every/12ui-plugin`
19
+ * (a GitHub clone) took 8.1-8.3s over three runs, `marketplace update` 5.6s,
20
+ * `plugin install` and `plugin update` under 1s. A minute is about seven times
21
+ * the slowest; past it the home gets the skill instead.
22
+ */
23
+ export const AGENT_COMMAND_TIMEOUT_MS = 60_000;
24
+ /** After SIGTERM, how long a command has to exit before SIGKILL. */
25
+ export const AGENT_COMMAND_KILL_GRACE_MS = 2_000;
26
+ /**
27
+ * Runs one command and always settles. A command that outlives its timeout gets
28
+ * SIGTERM, then SIGKILL after a short grace, and its pipes are destroyed, so
29
+ * neither a command that ignores SIGTERM nor a grandchild still holding the
30
+ * pipes keeps the CLI process alive.
31
+ */
32
+ export const runAgentCommand = (command, args, options) => (new Promise((resolve) => {
33
+ let stdout = '';
34
+ let stderr = '';
35
+ let settled = false;
36
+ let killTimer;
37
+ const child = spawn(command, [...args], {
38
+ env: options.environment,
39
+ shell: process.platform === 'win32',
40
+ stdio: ['ignore', 'pipe', 'pipe'],
41
+ windowsHide: true,
42
+ });
43
+ const finish = (result) => {
44
+ if (settled)
45
+ return;
46
+ settled = true;
47
+ clearTimeout(timer);
48
+ clearTimeout(killTimer);
49
+ resolve(result);
50
+ };
51
+ const release = () => {
52
+ child.stdout.destroy();
53
+ child.stderr.destroy();
54
+ child.unref();
55
+ };
56
+ const timedOut = () => ({ exitCode: null, stdout, stderr: `${stderr}\n${command} timed out` });
57
+ const timer = setTimeout(() => {
58
+ child.kill('SIGTERM');
59
+ child.once('exit', () => {
60
+ release();
61
+ finish(timedOut());
62
+ });
63
+ killTimer = setTimeout(() => {
64
+ child.kill('SIGKILL');
65
+ release();
66
+ finish(timedOut());
67
+ }, AGENT_COMMAND_KILL_GRACE_MS);
68
+ }, options.timeoutMs ?? AGENT_COMMAND_TIMEOUT_MS);
69
+ child.stdout.setEncoding('utf8').on('data', (chunk) => { stdout += chunk; });
70
+ child.stderr.setEncoding('utf8').on('data', (chunk) => { stderr += chunk; });
71
+ child.on('error', (error) => finish({ exitCode: null, stdout, stderr: error.message }));
72
+ child.on('close', (exitCode) => finish({ exitCode, stdout, stderr }));
73
+ }));
74
+ /** The last JSON object a `--json` command printed (both CLIs end with one). */
75
+ export const lastJsonObject = (stdout) => {
76
+ const trimmed = stdout.trim();
77
+ for (const candidate of [trimmed, ...trimmed.split('\n').reverse()]) {
78
+ try {
79
+ const parsed = JSON.parse(candidate);
80
+ if (parsed && typeof parsed === 'object')
81
+ return parsed;
82
+ }
83
+ catch {
84
+ // not this slice
85
+ }
86
+ }
87
+ return null;
88
+ };
89
+ export const commandFailure = (label, result) => new Error(`${label} failed (exit ${result.exitCode ?? 'none'}): ${(result.stderr.trim() || result.stdout.trim()).split('\n').slice(-3).join(' ')}`);
90
+ //# sourceMappingURL=agent-command-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-command-runner.js","sourceRoot":"","sources":["../src/agent-command-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { type AgentCommandRunner } from './agent-command-runner.js';
2
+ import { type SkillTarget } from './skill-installer.js';
3
+ /**
4
+ * Where a client can carry the 12ui Design workspace as a plugin, `skill
5
+ * install` installs the plugin instead of the bare skill (the plugin carries
6
+ * the same skill bytes): Claude Code from 2.1.287 gets the 12ui-design plugin
7
+ * with its pane, Codex with `codex plugin` gets 12ui@12ui-local with the
8
+ * inline workspace. Every other client, and an older Claude Code or Codex,
9
+ * keeps the skill exactly as before.
10
+ */
11
+ export type AgentPluginContext = {
12
+ runner: AgentCommandRunner;
13
+ environment: NodeJS.ProcessEnv;
14
+ homeDirectory: string;
15
+ dataRoot: string;
16
+ };
17
+ export declare const defaultAgentPluginContext: () => AgentPluginContext;
18
+ export type PluginPlan = {
19
+ pluginTargets: SkillTarget[];
20
+ skillTargets: SkillTarget[];
21
+ notes: string[];
22
+ };
23
+ /** Splits the targets into plugin homes and skill homes, once per machine per client. */
24
+ export declare const planAgentPlugins: (targets: readonly SkillTarget[], context: AgentPluginContext) => Promise<PluginPlan>;
25
+ export type PluginInstallOutcome = {
26
+ target: SkillTarget;
27
+ line: string;
28
+ installed: boolean;
29
+ };
30
+ /**
31
+ * Installs the plugin into every plugin home, a few at a time. A home whose
32
+ * plugin step fails, including writing the shared Codex plugin folder, gets the
33
+ * skill instead (`installed: false`), its line says why, and every other home
34
+ * goes on as before.
35
+ */
36
+ export declare const installAgentPlugins: (targets: readonly SkillTarget[], context: AgentPluginContext) => Promise<PluginInstallOutcome[]>;
37
+ /** One line per home whose plugin `skill remove` took out or failed to take out. */
38
+ export declare const removeAgentPlugins: (targets: readonly SkillTarget[], context: AgentPluginContext) => Promise<string[]>;
39
+ /**
40
+ * `12ui update` for Claude Code: every config dir on the machine that has the
41
+ * plugin from 12ui-plugin refreshes the marketplace and updates the plugin.
42
+ * One line per such home; a home that fails says why and the others go on.
43
+ */
44
+ export declare const refreshAgentPlugins: (context: AgentPluginContext) => Promise<string[]>;
45
+ /** Whether a home has the plugin, for `skill status` (file reads only). */
46
+ export declare const pluginInstalled: (target: SkillTarget) => Promise<boolean | undefined>;
47
+ //# sourceMappingURL=agent-plugin-step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-plugin-step.d.ts","sourceRoot":"","sources":["../src/agent-plugin-step.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AA0BrF,OAAO,EAAyC,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE/F;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAO,kBAK3C,CAAC;AAUH,MAAM,MAAM,UAAU,GAAG;IACvB,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,yFAAyF;AACzF,eAAO,MAAM,gBAAgB,GAC3B,SAAS,SAAS,WAAW,EAAE,EAC/B,SAAS,kBAAkB,KAC1B,OAAO,CAAC,UAAU,CAmBpB,CAAC;AAeF,MAAM,MAAM,oBAAoB,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAE7F;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAC9B,SAAS,SAAS,WAAW,EAAE,EAC/B,SAAS,kBAAkB,KAC1B,OAAO,CAAC,oBAAoB,EAAE,CA+ChC,CAAC;AAqBF,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,GAC7B,SAAS,SAAS,WAAW,EAAE,EAC/B,SAAS,kBAAkB,KAC1B,OAAO,CAAC,MAAM,EAAE,CA4BlB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAU,SAAS,kBAAkB,KAAG,OAAO,CAAC,MAAM,EAAE,CAoBvF,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,eAAe,GAAU,QAAQ,WAAW,KAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAItF,CAAC"}