ratacode 0.2.5

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 (58) hide show
  1. package/CREDITS.md +80 -0
  2. package/LICENSE +21 -0
  3. package/README.md +289 -0
  4. package/apreton/README.md +54 -0
  5. package/apreton/handshake.md +33 -0
  6. package/apreton/headless.md +58 -0
  7. package/apreton/mcp.md +221 -0
  8. package/apreton/navegador.md +58 -0
  9. package/bin/instalacion.js +148 -0
  10. package/bin/ratacode.js +1251 -0
  11. package/fabrica/settings.yaml +247 -0
  12. package/mcp/README.md +253 -0
  13. package/mcp/bin/ratacode-mcp.js +215 -0
  14. package/mcp/lib/actividad.js +49 -0
  15. package/mcp/lib/casa.js +126 -0
  16. package/mcp/lib/claves.js +148 -0
  17. package/mcp/lib/espacios.js +117 -0
  18. package/mcp/lib/http.js +184 -0
  19. package/mcp/lib/lectura.js +210 -0
  20. package/mcp/lib/modelos.js +235 -0
  21. package/mcp/lib/nucleo.js +332 -0
  22. package/mcp/lib/registro.js +21 -0
  23. package/mcp/lib/seguridad.js +283 -0
  24. package/mcp/lib/servidor.js +397 -0
  25. package/mcp/lib/tareas.js +406 -0
  26. package/mcp/package.json +22 -0
  27. package/mcp/tunel.mjs +209 -0
  28. package/modos/arquitecto/agent.cordis.yml +120 -0
  29. package/modos/arquitecto/preset.yml +3 -0
  30. package/modos/capataz/agent.cordis.yml +120 -0
  31. package/modos/capataz/preset.yml +3 -0
  32. package/modos/faro/agent.cordis.yml +120 -0
  33. package/modos/faro/preset.yml +3 -0
  34. package/modos/gepeto/agent.cordis.yml +191 -0
  35. package/modos/gepeto/preset.yml +3 -0
  36. package/modos/hero/agent.cordis.yml +198 -0
  37. package/modos/hero/preset.yml +3 -0
  38. package/modos/modo-rata/agent.cordis.yml +198 -0
  39. package/modos/modo-rata/preset.yml +3 -0
  40. package/modos/nex/agent.cordis.yml +213 -0
  41. package/modos/nex/preset.yml +3 -0
  42. package/modos/nex/skills/cordis-plugin-development/SKILL.md +420 -0
  43. package/modos/nex/skills/editing-cordis-compositions/SKILL.md +165 -0
  44. package/modos/pix/agent.cordis.yml +207 -0
  45. package/modos/pix/preset.yml +3 -0
  46. package/modos/tirita/agent.cordis.yml +130 -0
  47. package/modos/tirita/preset.yml +3 -0
  48. package/package.json +49 -0
  49. package/piel/activos/ratacode-emblema.svg +14 -0
  50. package/piel/activos/ratacode-es.js +1331 -0
  51. package/piel/activos/ratacode-identidad.css +50 -0
  52. package/piel/activos/ratacode-piel.css +217 -0
  53. package/piel/activos/ratacode-piel.js +487 -0
  54. package/piel/activos/ratacode-vida.js +424 -0
  55. package/piel/cordis.patch.yml +6 -0
  56. package/piel/lib/cliente.js +1020 -0
  57. package/piel/lib/index.js +1230 -0
  58. package/piel/package.json +36 -0
@@ -0,0 +1,207 @@
1
+ # PIX — composición del modo (agent-plane) de RATACODE.
2
+ # La monta el selector de modos de DSH para UNA sesión; lo compartido (los registros,
3
+ # el sandbox, el modelo) vive en la composición del host.
4
+ #
5
+ # Las filas de herramientas están copiadas TAL CUAL del preset `standard` que trae DSH,
6
+ # porque dos de ellas NO tienen valor por defecto en su esquema y el cargador rechaza el
7
+ # modo AL APLICARLO si faltan (R3: «invalid config: - $.x missing required value»):
8
+ # · tool-fs-search necesita `sampleOverCapGlobResults` (standard/agent.cordis.yml:60-63)
9
+ # · tool-todo necesita `allowParallelInProgress` (standard/agent.cordis.yml:241-244)
10
+ #
11
+ # Compuesto por trabajo\R14\componer-modos.mjs. A partir de aquí, ESTE fichero manda.
12
+
13
+ # ── identidad: el oficio del modo ─────────────────────────────────────────
14
+ - id: persona
15
+ name: '@deepseek-ai/dsh-persona'
16
+ config:
17
+ prefix: >-
18
+ Eres PIX de RATACODE (no eres un asistente genérico): la TÉCNICA de la casa. Tu oficio es el atajo:
19
+ en vez de ir herramienta a herramienta y gastar un viaje en cada paso, escribes UN programa
20
+ (run_code) que hace varios pasos de golpe —leer, buscar, calcular, dejar el resultado— y devuelve
21
+ lo que importa.
22
+
23
+ El atajo NO salta la comprobación: el trabajo sigue siendo el de todos —cambio mínimo, nada
24
+ inventado, y comprobado abriéndolo—. Si el programa falla, enseñas el fallo y el paso exacto, no
25
+ otra versión a ciegas.
26
+
27
+ NORMAS DE LA CASA (van con todos los modos): trabaja SOLO dentro del espacio autorizado; para salir de
28
+ él, para y pide permiso. Nunca enseñes claves, tokens ni secretos, y no leas ficheros de credenciales:
29
+ si falta una clave, para y dilo. Entiende el objetivo ANTES de tocar nada. Cambio mínimo: lo justo, sin
30
+ rehacer lo que ya funciona. No inventes datos: lo que no hayas comprobado es SOSPECHA, y «no lo sé» vale
31
+ más que un número inventado. Instalado no es funcionando: compruébalo abriéndolo y usándolo. Di claro los
32
+ errores y los bloqueos. Respeta tu rol: no hagas el oficio de otro modo. Al terminar entrega: qué hiciste,
33
+ qué encontraste, cómo lo comprobaste y qué queda pendiente.
34
+
35
+ Modelo: {{model}}. Directorio de trabajo: {{cwd}}.
36
+
37
+ - id: agent-instructions
38
+ name: '@deepseek-ai/dsh-agent-instructions'
39
+ config:
40
+ maxBytes: 65536
41
+
42
+ - id: tool-fs
43
+ name: '@deepseek-ai/dsh-tool-fs'
44
+
45
+ - id: tool-fs-search
46
+ name: '@deepseek-ai/dsh-tool-fs-search'
47
+ config:
48
+ sampleOverCapGlobResults: false
49
+
50
+ # ── terminal: este modo SÍ ejecuta cosas ─────────────────────────────────
51
+ - id: tool-bash
52
+ name: '@deepseek-ai/dsh-tool-bash'
53
+ disabled: !!js process.platform === 'win32'
54
+
55
+ - id: tool-pwsh
56
+ name: '@deepseek-ai/dsh-tool-pwsh'
57
+ disabled: !!js process.platform !== 'win32'
58
+
59
+ - id: tool-jobs
60
+ name: '@deepseek-ai/dsh-tool-jobs'
61
+
62
+ - id: skill-filesystem
63
+ name: '@deepseek-ai/dsh-skill-filesystem'
64
+
65
+ - id: tool-skill
66
+ name: '@deepseek-ai/dsh-tool-skill'
67
+
68
+ - id: command-goal
69
+ name: '@deepseek-ai/dsh-command-goal'
70
+
71
+ - id: tool-goal
72
+ name: '@deepseek-ai/dsh-tool-goal'
73
+
74
+ - id: planning
75
+ name: cordis:group
76
+ group: true
77
+ isolate:
78
+ planMode: true
79
+ config:
80
+ - id: plan-mode
81
+ name: '@deepseek-ai/dsh-plan-mode'
82
+ config:
83
+ section: |
84
+ You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
85
+
86
+ Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
87
+
88
+ The tool catalog stays the same across modes for request-cache stability. These plan-mode rules override any later tool description or guidance that suggests using mutation tools; those tools remain listed to keep the tool catalog unchanged. Do not use todo_write to track this planning phase: it tracks implementation after an approved plan, while the plan itself belongs in exit_plan_mode.
89
+
90
+ Resolve discoverable facts by inspection. Use ask_user_question only for user-owned choices or material ambiguity that inspection cannot answer. Do not ask the user where code lives or how current behavior works when you can find out.
91
+
92
+ Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem; identify public API, schema, and data-flow changes; cover edge cases, failure modes, tests, acceptance criteria, and explicit assumptions. Keep it concise enough to review but detailed enough that another engineer can implement it without making design decisions.
93
+
94
+ When ready, call exit_plan_mode with the complete plan markdown, starting with a # title. Make exit_plan_mode the only and final tool call in that assistant response: it presents the plan for approval, and implementation begins only in a later step after approval. Do not paste the final plan as a plain reply or ask "should I proceed?" through prose or ask_user_question. If review rejects it, incorporate the feedback and present again. If the review channel is unavailable or aborted, stay in plan mode and ask the user to switch modes manually; do not proceed with implementation.
95
+
96
+ - id: compaction
97
+ name: cordis:group
98
+ group: true
99
+ isolate:
100
+ compaction: true
101
+ toolResultPruner: true
102
+ config:
103
+ - id: compaction-basic
104
+ name: '@deepseek-ai/dsh-compaction-basic'
105
+
106
+ - id: command-compact
107
+ name: '@deepseek-ai/dsh-command-compact'
108
+
109
+ - id: tool-result-pruner
110
+ name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
111
+ config:
112
+ thresholdChars: 8192
113
+ headChars: 4096
114
+ tailChars: 1024
115
+
116
+ - id: delegation
117
+ name: cordis:group
118
+ group: true
119
+ isolate:
120
+ workflowEngine: true
121
+ config:
122
+ - id: tool-subagent-control
123
+ name: '@deepseek-ai/dsh-tool-subagent-control'
124
+
125
+ - id: tool-subagent-list-agents
126
+ name: '@deepseek-ai/dsh-tool-subagent-control/list-agents'
127
+
128
+ - id: tool-subagent
129
+ name: '@deepseek-ai/dsh-tool-subagent'
130
+ config:
131
+ provider: spawn
132
+ toolName: subagent
133
+ modelSelectionSettings: true
134
+ backgroundMode: continuable
135
+
136
+ # Fork omits model selection so provider/model stay equal to the parent and
137
+ # the inherited history remains eligible for KV Cache reuse. This preset
138
+ # keeps fork continuable; parent and child inherit the same messaging tool,
139
+ # while the parent id and return guidance follow the inherited history.
140
+ - id: tool-subagent-fork
141
+ name: '@deepseek-ai/dsh-tool-subagent'
142
+ config:
143
+ provider: fork
144
+ toolName: subagent_fork
145
+ backgroundMode: continuable
146
+
147
+ # Production dsh does not install these optional providers. Install the
148
+ # matching Bundle in this Profile and restart the Host, then copy this
149
+ # preset and remove `disabled` from the matching tool row. Host availability
150
+ # alone grants no tool.
151
+ - id: tool-subagent-codex
152
+ name: '@deepseek-ai/dsh-tool-subagent'
153
+ disabled: true
154
+ config:
155
+ provider: codex
156
+ toolName: subagent_codex
157
+ backgroundMode: one-shot
158
+ maxDepth: provider-managed
159
+
160
+ - id: tool-subagent-claude-code
161
+ name: '@deepseek-ai/dsh-tool-subagent'
162
+ disabled: true
163
+ config:
164
+ provider: claude-code
165
+ toolName: subagent_claude_code
166
+ backgroundMode: one-shot
167
+ maxDepth: provider-managed
168
+
169
+ - id: workflow-worker-thread
170
+ name: '@deepseek-ai/dsh-workflow-worker-thread'
171
+ config:
172
+ provider: spawn
173
+
174
+ - id: tool-workflow
175
+ name: '@deepseek-ai/dsh-tool-workflow'
176
+ # En PIX el programa es la superficie; no se publica una segunda.
177
+ disabled: true
178
+
179
+ - id: tool-ralph
180
+ disabled: true
181
+ name: '@deepseek-ai/dsh-tool-ralph'
182
+ config:
183
+ subagentProvider: spawn
184
+ maxRounds: 64
185
+
186
+ - id: tool-ask-user
187
+ name: '@deepseek-ai/dsh-tool-ask-user'
188
+
189
+ - id: tool-todo
190
+ name: '@deepseek-ai/dsh-tool-todo'
191
+ config:
192
+ allowParallelInProgress: true
193
+
194
+ - id: tool-web
195
+ name: '@deepseek-ai/dsh-tool-web'
196
+ config:
197
+ fetch: true
198
+ searchTimeoutMs: 60000
199
+
200
+ # ── la vía rápida: las herramientas como SDK de un programa ───────────────
201
+ - id: tool-presentation
202
+ name: '@deepseek-ai/dsh-agent-tool-presentation'
203
+ config:
204
+ mode: ptc
205
+
206
+ - id: present
207
+ name: '@deepseek-ai/dsh-tool-present'
@@ -0,0 +1,3 @@
1
+ name: "PIX"
2
+ description: "La vía rápida: varias operaciones en UN programa (run_code) en vez de ir herramienta a herramienta."
3
+ order: 8
@@ -0,0 +1,130 @@
1
+ # TIRITA — composición del modo (agent-plane) de RATACODE.
2
+ # La monta el selector de modos de DSH para UNA sesión; lo compartido (los registros,
3
+ # el sandbox, el modelo) vive en la composición del host.
4
+ #
5
+ # Las filas de herramientas están copiadas TAL CUAL del preset `standard` que trae DSH,
6
+ # porque dos de ellas NO tienen valor por defecto en su esquema y el cargador rechaza el
7
+ # modo AL APLICARLO si faltan (R3: «invalid config: - $.x missing required value»):
8
+ # · tool-fs-search necesita `sampleOverCapGlobResults` (standard/agent.cordis.yml:60-63)
9
+ # · tool-todo necesita `allowParallelInProgress` (standard/agent.cordis.yml:241-244)
10
+ #
11
+ # Compuesto por trabajo\R14\componer-modos.mjs. A partir de aquí, ESTE fichero manda.
12
+
13
+ # ── identidad: el oficio del modo ─────────────────────────────────────────
14
+ - id: persona
15
+ name: '@deepseek-ai/dsh-persona'
16
+ config:
17
+ prefix: >-
18
+ Eres TIRITA de RATACODE (no eres un asistente genérico): el doctor de la casa. Tu oficio: curar
19
+ fallos. Reproduces el fallo, miras los registros, encuentras la CAUSA RAÍZ, aplicas el arreglo
20
+ MÍNIMO y lo compruebas.
21
+
22
+ NO aprovechas un bug para refactorizar ni tocas lo que no está roto. Si no consigues reproducirlo,
23
+ lo dices con lo que has medido: una búsqueda fallida no es prueba de que no exista. Diagnostican no
24
+ te autoriza a gastar dinero ni a cambiar cosas ajenas al encargo.
25
+
26
+ NORMAS DE LA CASA (van con todos los modos): trabaja SOLO dentro del espacio autorizado; para salir de
27
+ él, para y pide permiso. Nunca enseñes claves, tokens ni secretos, y no leas ficheros de credenciales:
28
+ si falta una clave, para y dilo. Entiende el objetivo ANTES de tocar nada. Cambio mínimo: lo justo, sin
29
+ rehacer lo que ya funciona. No inventes datos: lo que no hayas comprobado es SOSPECHA, y «no lo sé» vale
30
+ más que un número inventado. Instalado no es funcionando: compruébalo abriéndolo y usándolo. Di claro los
31
+ errores y los bloqueos. Respeta tu rol: no hagas el oficio de otro modo. Al terminar entrega: qué hiciste,
32
+ qué encontraste, cómo lo comprobaste y qué queda pendiente.
33
+
34
+ Modelo: {{model}}. Directorio de trabajo: {{cwd}}.
35
+
36
+ - id: agent-instructions
37
+ name: '@deepseek-ai/dsh-agent-instructions'
38
+ config:
39
+ maxBytes: 65536
40
+
41
+ - id: tool-fs
42
+ name: '@deepseek-ai/dsh-tool-fs'
43
+
44
+ - id: tool-fs-search
45
+ name: '@deepseek-ai/dsh-tool-fs-search'
46
+ config:
47
+ sampleOverCapGlobResults: false
48
+
49
+ # ── terminal: este modo SÍ ejecuta cosas ─────────────────────────────────
50
+ - id: tool-bash
51
+ name: '@deepseek-ai/dsh-tool-bash'
52
+ disabled: !!js process.platform === 'win32'
53
+
54
+ - id: tool-pwsh
55
+ name: '@deepseek-ai/dsh-tool-pwsh'
56
+ disabled: !!js process.platform !== 'win32'
57
+
58
+ - id: tool-jobs
59
+ name: '@deepseek-ai/dsh-tool-jobs'
60
+
61
+ - id: skill-filesystem
62
+ name: '@deepseek-ai/dsh-skill-filesystem'
63
+
64
+ - id: tool-skill
65
+ name: '@deepseek-ai/dsh-tool-skill'
66
+
67
+ - id: command-goal
68
+ name: '@deepseek-ai/dsh-command-goal'
69
+
70
+ - id: tool-goal
71
+ name: '@deepseek-ai/dsh-tool-goal'
72
+
73
+ - id: planning
74
+ name: cordis:group
75
+ group: true
76
+ isolate:
77
+ planMode: true
78
+ config:
79
+ - id: plan-mode
80
+ name: '@deepseek-ai/dsh-plan-mode'
81
+ config:
82
+ section: |
83
+ You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
84
+
85
+ Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
86
+
87
+ The tool catalog stays the same across modes for request-cache stability. These plan-mode rules override any later tool description or guidance that suggests using mutation tools; those tools remain listed to keep the tool catalog unchanged. Do not use todo_write to track this planning phase: it tracks implementation after an approved plan, while the plan itself belongs in exit_plan_mode.
88
+
89
+ Resolve discoverable facts by inspection. Use ask_user_question only for user-owned choices or material ambiguity that inspection cannot answer. Do not ask the user where code lives or how current behavior works when you can find out.
90
+
91
+ Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem; identify public API, schema, and data-flow changes; cover edge cases, failure modes, tests, acceptance criteria, and explicit assumptions. Keep it concise enough to review but detailed enough that another engineer can implement it without making design decisions.
92
+
93
+ When ready, call exit_plan_mode with the complete plan markdown, starting with a # title. Make exit_plan_mode the only and final tool call in that assistant response: it presents the plan for approval, and implementation begins only in a later step after approval. Do not paste the final plan as a plain reply or ask "should I proceed?" through prose or ask_user_question. If review rejects it, incorporate the feedback and present again. If the review channel is unavailable or aborted, stay in plan mode and ask the user to switch modes manually; do not proceed with implementation.
94
+
95
+ - id: compaction
96
+ name: cordis:group
97
+ group: true
98
+ isolate:
99
+ compaction: true
100
+ toolResultPruner: true
101
+ config:
102
+ - id: compaction-basic
103
+ name: '@deepseek-ai/dsh-compaction-basic'
104
+
105
+ - id: command-compact
106
+ name: '@deepseek-ai/dsh-command-compact'
107
+
108
+ - id: tool-result-pruner
109
+ name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
110
+ config:
111
+ thresholdChars: 8192
112
+ headChars: 4096
113
+ tailChars: 1024
114
+
115
+ - id: tool-ask-user
116
+ name: '@deepseek-ai/dsh-tool-ask-user'
117
+
118
+ - id: tool-todo
119
+ name: '@deepseek-ai/dsh-tool-todo'
120
+ config:
121
+ allowParallelInProgress: true
122
+
123
+ - id: tool-web
124
+ name: '@deepseek-ai/dsh-tool-web'
125
+ config:
126
+ fetch: true
127
+ searchTimeoutMs: 60000
128
+
129
+ - id: present
130
+ name: '@deepseek-ai/dsh-tool-present'
@@ -0,0 +1,3 @@
1
+ name: "TIRITA"
2
+ description: "El doctor: reproduce el fallo, mira los registros, halla la causa raíz y aplica el arreglo mínimo."
3
+ order: 5
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "ratacode",
3
+ "version": "0.2.5",
4
+ "description": "RATACODE · la terminal de trabajo con IA: le mandas el trabajo pesado a modelos baratos (o a los tuyos, en local) y el resultado vuelve a tu agente o a tu chat.",
5
+ "license": "MIT",
6
+ "author": {
7
+ "name": "Patxi"
8
+ },
9
+ "type": "module",
10
+ "bin": {
11
+ "ratacode": "bin/ratacode.js"
12
+ },
13
+ "engines": {
14
+ "node": ">=24"
15
+ },
16
+ "allowScripts": {
17
+ "node-pty": true,
18
+ "koffi": true,
19
+ "@deepseek-ai/dsh-subprocess-local": true
20
+ },
21
+ "scripts": {
22
+ "postinstall": "node bin/instalacion.js",
23
+ "test": "node pruebas/piel.test.mjs && node pruebas/modos.test.mjs && node pruebas/parche.test.mjs && node pruebas/mcp-espacios.test.mjs && node pruebas/mcp-cerrado.test.mjs"
24
+ },
25
+ "files": [
26
+ "bin",
27
+ "piel",
28
+ "fabrica",
29
+ "modos",
30
+ "mcp",
31
+ "!mcp/prueba",
32
+ "apreton",
33
+ "CREDITS.md",
34
+ "LICENSE",
35
+ "README.md"
36
+ ],
37
+ "keywords": [
38
+ "terminal",
39
+ "agentes",
40
+ "modelos-locales",
41
+ "ollama",
42
+ "mcp",
43
+ "ratacode"
44
+ ],
45
+ "dependencies": {
46
+ "@deepseek-ai/dsh": "0.1.5-rc.1",
47
+ "js-yaml": "^4.2.0"
48
+ }
49
+ }
@@ -0,0 +1,14 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" fill="none">
2
+ <title>RATACODE</title>
3
+ <path d="M43 5A43 43 0 0 0 8 66M18 79l10 8" stroke="#ff268e" stroke-width="3"/>
4
+ <path d="M54 5a43 43 0 0 1 35 59M79 80l-12 8" stroke="#e4f226" stroke-width="3"/>
5
+ <path d="m48 21-8-17-1 15-9-9 5 20M48 21 55 3l2 16 10-9-7 20" fill="#e4f226"/>
6
+ <path d="M47 33 26 16 12 13l4 29 11 10 5 20 15 14V33Z" fill="#151619" stroke="#ff268e" stroke-width="2.5"/>
7
+ <path d="m49 33 21-17 14-3-4 29-11 10-5 20-15 14V33Z" fill="#151619" stroke="#e4f226" stroke-width="2.5"/>
8
+ <path d="m23 26 5 16 8-6-13-10Zm50 0-5 16-8-6 13-10Z" fill="#34373b"/>
9
+ <path d="m31 47 12 7-8 3-4-10Zm34 0-12 7 8 3 4-10Z" fill="#f0eee6"/>
10
+ <path d="m40 72 8 5 8-5-8 12-8-12Z" fill="#26c6cc"/>
11
+ <path d="m35 65-29-6m29 11L8 73m53-8 29-6m-29 11 27 3" stroke="#92968e" stroke-width="1.5"/>
12
+ <path d="m39 37 5 3M61 39l-7 3M33 76l7-2M65 28l5 2" stroke="#777c78"/>
13
+ <path d="M3 44v8m90-8v8M44 93h8" stroke="#26c6cc" stroke-width="2"/>
14
+ </svg>