@jossuealcala/madre 0.7.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +773 -1
- package/README.md +92 -28
- package/bin/madre.mjs +30 -10
- package/docs/REFERENCE.md +157 -81
- package/docs/SDK.md +23 -19
- package/package.json +1 -1
- package/public/app.js +11207 -4196
- package/public/assets/brand/Geist-latin-ext.woff2 +0 -0
- package/public/assets/brand/Geist-latin.woff2 +0 -0
- package/public/assets/brand/GeistMono-latin-ext.woff2 +0 -0
- package/public/assets/brand/GeistMono-latin.woff2 +0 -0
- package/public/assets/brand/JetBrainsMono-latin-ext.woff2 +0 -0
- package/public/assets/brand/JetBrainsMono-latin.woff2 +0 -0
- package/public/assets/brand/OFL-Geist.txt +93 -0
- package/public/assets/brand/OFL-GeistMono.txt +93 -0
- package/public/assets/brand/OFL-JetBrainsMono.txt +93 -0
- package/public/assets/brand/OFL-Sora.txt +93 -0
- package/public/assets/brand/Sora-latin-ext.woff2 +0 -0
- package/public/assets/brand/Sora-latin.woff2 +0 -0
- package/public/assets/brand/madre-app-180.png +0 -0
- package/public/assets/brand/madre-app-192.png +0 -0
- package/public/assets/brand/madre-app-512.png +0 -0
- package/public/assets/brand/madre-app.svg +1 -0
- package/public/assets/brand/madre-favicon.svg +1 -0
- package/public/assets/news/1.0/alerts.webp +0 -0
- package/public/assets/news/1.0/bar.webp +0 -0
- package/public/assets/news/1.0/finder.webp +0 -0
- package/public/assets/news/1.0/github.webp +0 -0
- package/public/assets/news/1.0/intents.webp +0 -0
- package/public/assets/news/1.0/looks.webp +0 -0
- package/public/assets/news/1.0/modules.webp +0 -0
- package/public/assets/news/1.0/mother.webp +0 -0
- package/public/assets/news/1.0/nostromo.webp +0 -0
- package/public/assets/news/1.0/permissions.webp +0 -0
- package/public/assets/news/1.0/room.webp +0 -0
- package/public/assets/news/1.0/settings.webp +0 -0
- package/public/assets/wallpapers/biznaga.webp +0 -0
- package/public/assets/wallpapers/canela.webp +0 -0
- package/public/assets/wallpapers/jarrito.webp +0 -0
- package/public/assets/wallpapers/magna.webp +0 -0
- package/public/assets/wallpapers/oceano.webp +0 -0
- package/public/assets/wallpapers/paraiso.webp +0 -0
- package/public/assets/wallpapers/quila.webp +0 -0
- package/public/assets/wallpapers/tradicion.webp +0 -0
- package/public/assets/wallpapers/tropical.webp +0 -0
- package/public/assets/wallpapers/urbania.webp +0 -0
- package/public/assets/wallpapers/ventura.webp +0 -0
- package/public/assets/wallpapers/xico.webp +0 -0
- package/public/brands.js +28 -2
- package/public/editor.js +744 -0
- package/public/es.js +2784 -1026
- package/public/i18n.js +1 -1
- package/public/index.html +201 -175
- package/public/inquiry.js +11 -11
- package/public/loader.js +79 -0
- package/public/macroverso.js +1497 -0
- package/public/manifest.webmanifest +14 -0
- package/public/nostromo-engine.js +2222 -0
- package/public/resay.js +24 -0
- package/public/review-ask.js +85 -0
- package/public/salas-mac.css +787 -0
- package/public/salas-mac.html +154 -0
- package/public/salas-mac.js +3264 -0
- package/public/salas.css +85 -0
- package/public/salas.html +47 -0
- package/public/salas.js +200 -0
- package/public/styles.css +6207 -425
- package/public/touch.js +83 -0
- package/public/tour-chapters.js +342 -0
- package/public/tour.js +510 -0
- package/public/troubleshooting.js +159 -140
- package/src/adapters/codex.mjs +46 -6
- package/src/adapters/gemini.mjs +30 -10
- package/src/adapters/madre.mjs +110 -18
- package/src/adapters/process.mjs +42 -2
- package/src/auth-probe.mjs +2 -2
- package/src/bridge/devices.mjs +202 -0
- package/src/bridge/handoff.mjs +45 -0
- package/src/bridge/host.mjs +82 -0
- package/src/bridge/network.mjs +133 -0
- package/src/bridge/policy.mjs +89 -0
- package/src/bridge/qr.mjs +287 -0
- package/src/bridge/server.mjs +269 -0
- package/src/capabilities.mjs +5 -9
- package/src/chats.mjs +59 -22
- package/src/checkpoint.mjs +137 -35
- package/src/choices.mjs +18 -3
- package/src/cli-args.mjs +12 -1
- package/src/commands.mjs +15 -15
- package/src/config.mjs +73 -9
- package/src/conversation-context.mjs +5 -2
- package/src/dataset.mjs +3 -1
- package/src/directives.mjs +0 -5
- package/src/enlaces.mjs +451 -0
- package/src/event-store.mjs +55 -10
- package/src/exam.mjs +5 -5
- package/src/extensions.mjs +0 -2
- package/src/file-ops.mjs +23 -0
- package/src/files.mjs +52 -2
- package/src/github.mjs +407 -0
- package/src/json-file.mjs +63 -0
- package/src/lease.mjs +2 -2
- package/src/lobby-work.mjs +103 -0
- package/src/looks.mjs +55 -0
- package/src/maturity.mjs +3 -3
- package/src/mcp/github-server.mjs +164 -0
- package/src/mcp/image-server.mjs +1 -1
- package/src/mcp/memory-server.mjs +11 -3
- package/src/memory.mjs +38 -12
- package/src/models.mjs +89 -5
- package/src/modules/ahp.mjs +4 -4
- package/src/modules/ash.mjs +1 -1
- package/src/modules/bishop-plan.mjs +207 -0
- package/src/modules/bishop.mjs +645 -0
- package/src/modules/choices.mjs +2 -2
- package/src/modules/correo.mjs +1 -1
- package/src/modules/enlaces.mjs +255 -0
- package/src/modules/git-pulse.mjs +2 -2
- package/src/modules/github.mjs +322 -0
- package/src/modules/image-studio.mjs +3 -3
- package/src/modules/index.mjs +18 -4
- package/src/modules/intents-calibration.mjs +338 -0
- package/src/modules/intents-desk.mjs +481 -0
- package/src/modules/intents-observe.mjs +266 -0
- package/src/modules/intents-policy.mjs +414 -0
- package/src/modules/intents-try.mjs +91 -0
- package/src/modules/intents.mjs +145 -0
- package/src/modules/ollama.mjs +4 -4
- package/src/modules/playwright.mjs +121 -11
- package/src/modules/ripley.mjs +1 -1
- package/src/modules/runs.mjs +2 -2
- package/src/modules/sdk.mjs +10 -4
- package/src/ollama.mjs +6 -1
- package/src/outbound.mjs +19 -17
- package/src/override.mjs +100 -0
- package/src/ports.mjs +23 -1
- package/src/prices.mjs +72 -0
- package/src/privacy.mjs +30 -11
- package/src/quota-sources.mjs +0 -8
- package/src/request-guard.mjs +1 -1
- package/src/review-ask.mjs +111 -0
- package/src/room/archivist.mjs +55 -37
- package/src/room/budget.mjs +17 -5
- package/src/room/control.mjs +70 -7
- package/src/room/economy.mjs +35 -7
- package/src/room/escalation.mjs +2 -0
- package/src/room/guard.mjs +26 -2
- package/src/room/prompt.mjs +22 -15
- package/src/room/runs.mjs +84 -21
- package/src/room/vectors.mjs +19 -4
- package/src/room.mjs +351 -65
- package/src/router.mjs +3 -1
- package/src/runs.mjs +23 -5
- package/src/salas.mjs +313 -0
- package/src/sentinel-errors.mjs +1 -1
- package/src/server-sentinel.mjs +124 -0
- package/src/server.mjs +1526 -163
- package/src/setup.mjs +1 -0
- package/src/tour.mjs +159 -0
- package/src/updates.mjs +48 -8
- package/src/usage-sentinel.mjs +1 -1
- package/src/verdict.mjs +7 -7
- package/src/whats-new.mjs +160 -0
package/public/touch.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// A tap is not a hover (2026-10-11). On a screen with no pointer (a phone, a tablet without a
|
|
2
|
+
// trackpad), the browser gives :hover to whatever was tapped and keeps it until the next tap lands
|
|
3
|
+
// somewhere else: a button looked pressed after it was let go. So, where nothing can hover, the
|
|
4
|
+
// page's own rules for :hover are taken out as it opens. A selector that is only :hover goes; one
|
|
5
|
+
// that offers :hover among other states, as `:is(:hover, :focus-visible)` does, keeps the others.
|
|
6
|
+
// Where a pointer exists, nothing is touched.
|
|
7
|
+
|
|
8
|
+
const canHover = () => typeof matchMedia !== 'function' || !matchMedia('(hover: none)').matches;
|
|
9
|
+
|
|
10
|
+
// The parts of a list split at its top-level commas, never at a comma inside parentheses or quotes.
|
|
11
|
+
function topLevel(text) {
|
|
12
|
+
const parts = [];
|
|
13
|
+
let depth = 0;
|
|
14
|
+
let quote = null;
|
|
15
|
+
let start = 0;
|
|
16
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
17
|
+
const c = text[i];
|
|
18
|
+
if (quote) { if (c === quote && text[i - 1] !== '\\') quote = null; continue; }
|
|
19
|
+
if (c === '"' || c === "'") quote = c;
|
|
20
|
+
else if (c === '(') depth += 1;
|
|
21
|
+
else if (c === ')') depth -= 1;
|
|
22
|
+
else if (c === ',' && depth === 0) { parts.push(text.slice(start, i)); start = i + 1; }
|
|
23
|
+
}
|
|
24
|
+
parts.push(text.slice(start));
|
|
25
|
+
return parts.map((part) => part.trim()).filter(Boolean);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// One selector without :hover, or null when it cannot match without one.
|
|
29
|
+
export function withoutHover(selector) {
|
|
30
|
+
let out = '';
|
|
31
|
+
let i = 0;
|
|
32
|
+
while (i < selector.length) {
|
|
33
|
+
const open = selector.slice(i).match(/^:(is|where|matches|-webkit-any)\(/);
|
|
34
|
+
if (open) {
|
|
35
|
+
// Find the parenthesis that closes it, and rewrite each of its alternatives.
|
|
36
|
+
let depth = 1;
|
|
37
|
+
let j = i + open[0].length;
|
|
38
|
+
for (; j < selector.length && depth; j += 1) {
|
|
39
|
+
if (selector[j] === '(') depth += 1;
|
|
40
|
+
else if (selector[j] === ')') depth -= 1;
|
|
41
|
+
}
|
|
42
|
+
const inner = selector.slice(i + open[0].length, j - 1);
|
|
43
|
+
const kept = topLevel(inner).map((part) => withoutHover(part)).filter((part) => part !== null);
|
|
44
|
+
if (!kept.length) return null;
|
|
45
|
+
out += `:${open[1]}(${kept.join(', ')})`;
|
|
46
|
+
i = j;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (selector.startsWith(':hover', i) && !/[\w-]/.test(selector[i + 6] ?? '')) return null;
|
|
50
|
+
out += selector[i];
|
|
51
|
+
i += 1;
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function sweep(rules, owner) {
|
|
57
|
+
let changed = 0;
|
|
58
|
+
for (let index = rules.length - 1; index >= 0; index -= 1) {
|
|
59
|
+
const rule = rules[index];
|
|
60
|
+
if (rule.cssRules?.length && !rule.selectorText) { changed += sweep(rule.cssRules, rule); continue; }
|
|
61
|
+
if (!rule.selectorText || !rule.selectorText.includes(':hover')) continue;
|
|
62
|
+
const kept = topLevel(rule.selectorText).map((selector) => withoutHover(selector)).filter((selector) => selector !== null);
|
|
63
|
+
try {
|
|
64
|
+
if (kept.length) rule.selectorText = kept.join(', ');
|
|
65
|
+
else owner.deleteRule(index);
|
|
66
|
+
changed += 1;
|
|
67
|
+
} catch { /* a rule the browser would not let go of: left as it is */ }
|
|
68
|
+
}
|
|
69
|
+
return changed;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Takes the :hover rules out of every stylesheet of this page, where nothing can hover. Answers how
|
|
73
|
+
// many rules it changed.
|
|
74
|
+
export function dropStickyHover(doc = globalThis.document) {
|
|
75
|
+
if (!doc || canHover()) return 0;
|
|
76
|
+
let changed = 0;
|
|
77
|
+
for (const sheet of doc.styleSheets ?? []) {
|
|
78
|
+
let rules = null;
|
|
79
|
+
try { rules = sheet.cssRules; } catch { continue; } // another origin's sheet: not ours to read
|
|
80
|
+
if (rules) changed += sweep(rules, sheet);
|
|
81
|
+
}
|
|
82
|
+
return changed;
|
|
83
|
+
}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
// What the welcome of MADRE 1.0 says (2026-10-11): twelve chapters and the sheet of gestures, in
|
|
2
|
+
// both languages side by side, as the cards of What's new are (src/whats-new.mjs). Each chapter
|
|
3
|
+
// fits on one view: a short scene, a line, three sentences, its gestures and «Take me there».
|
|
4
|
+
// Everything here is what the product does today; what could not be checked in the code is not
|
|
5
|
+
// said. `where` is where the thing lives: in Home, inside a project, or both; «Take me there» is
|
|
6
|
+
// offered wherever the page can take the person to it (public/tour.js).
|
|
7
|
+
//
|
|
8
|
+
// Two people read it (2026-10-11). Whoever installs MADRE for the first time gets to know it: the
|
|
9
|
+
// essentials first, in the order they are used. Whoever comes from 0.7.2 is told what changed:
|
|
10
|
+
// what moved first, then what is new, then what changed, and each chapter opens with one line —
|
|
11
|
+
// `news` — that says what is new or different since 0.7.2, checked against the v0.7.2 tag (BISHOP,
|
|
12
|
+
// Home, the second bar, Settings and the phone did not exist there; MU/TH/UR, NOSTROMO,
|
|
13
|
+
// ⚙ CONNECTIONS, AIRLOCK, the ash key and the EN and theme keys did).
|
|
14
|
+
|
|
15
|
+
export const ORDER = {
|
|
16
|
+
new: ['home', 'project', 'talk', 'modes', 'settings', 'modules', 'coordinator', 'links', 'maps', 'phone', 'gestures'],
|
|
17
|
+
back: ['moved', 'home', 'coordinator', 'links', 'maps', 'project', 'settings', 'modules', 'talk', 'modes', 'phone', 'gestures'],
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const CHAPTERS = [
|
|
21
|
+
{
|
|
22
|
+
id: 'moved',
|
|
23
|
+
title: { es: 'Qué se movió', en: 'What moved' },
|
|
24
|
+
lead: { es: 'Lo que buscabas sigue ahí, con otro nombre o en otro lugar.', en: 'What you looked for is still there, under another name or in another place.' },
|
|
25
|
+
moved: [
|
|
26
|
+
['MU/TH/UR', { es: 'Diagnóstico', en: 'Diagnostics' }],
|
|
27
|
+
['NOSTROMO', { es: 'Mapa de memoria, en la barra', en: 'Memory map, on the bar' }],
|
|
28
|
+
[{ es: '⚙ CONEXIONES (sesión)', en: '⚙ CONNECTIONS (sign-in)' }, { es: 'Ajustes › Agentes', en: 'Settings › Agents' }],
|
|
29
|
+
['#4 AIRLOCK', { es: '#4 Acceso total: la llave dos veces', en: '#4 Full access: the key, twice' }],
|
|
30
|
+
['ash', { es: 'Ahorro de tokens, en Módulos', en: 'Token saver, in Modules' }],
|
|
31
|
+
[{ es: 'EN · tema', en: 'EN · theme' }, { es: 'Ajustes › Apariencia', en: 'Settings › Appearance' }],
|
|
32
|
+
],
|
|
33
|
+
points: {
|
|
34
|
+
es: [
|
|
35
|
+
'<code>madre</code> sin nada más abre Inicio; <code>madre start</code> sigue abriendo el proyecto de la carpeta.',
|
|
36
|
+
'«Conexiones» ya no es iniciar sesión de los agentes: eso vive en Ajustes › Agentes. Ahora una conexión deja que un proyecto consulte lo que otro aprendió.',
|
|
37
|
+
'Ajustes (⌘ ,) reúne lo que estaba en MU/TH/UR, en ⚙ CONEXIONES y en las teclas EN y de tema; Diagnóstico es lo que era MU/TH/UR.',
|
|
38
|
+
],
|
|
39
|
+
en: [
|
|
40
|
+
'<code>madre</code> on its own opens Home; <code>madre start</code> still opens the project in the folder.',
|
|
41
|
+
'«Connections» is no longer signing your agents in: that lives in Settings › Agents. A connection now lets one project look up what another learned.',
|
|
42
|
+
'Settings (⌘ ,) gathers what was in MU/TH/UR, in ⚙ CONNECTIONS and on the EN and theme keys; Diagnostics is what MU/TH/UR was.',
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
keys: [],
|
|
46
|
+
where: [],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: 'home',
|
|
50
|
+
title: { es: 'Inicio', en: 'Home' },
|
|
51
|
+
lead: { es: 'Todos tus proyectos en un lugar, abiertos o dormidos.', en: 'All your projects in one place, open or asleep.' },
|
|
52
|
+
news: { kind: 'new', es: 'En 0.7.2 cada proyecto se abría por su cuenta con <code>madre start</code>; Inicio los reúne a todos.', en: 'In 0.7.2 each project opened on its own with <code>madre start</code>; Home gathers them all.' },
|
|
53
|
+
points: {
|
|
54
|
+
es: [
|
|
55
|
+
'Agrega carpetas: no se abren hasta que tú quieras.',
|
|
56
|
+
'Clic derecho o ⋯ en una tarjeta: anclarla a la barra, ordenarla o quitarla de MADRE. Su carpeta no se toca.',
|
|
57
|
+
'Te esperan, Decisiones recientes y el Resumen reciente te dicen qué pasó mientras no estabas.',
|
|
58
|
+
],
|
|
59
|
+
en: [
|
|
60
|
+
'Add folders: they do not open until you want them to.',
|
|
61
|
+
'Right-click or ⋯ on a card: pin it to the bar, order it, or remove it from MADRE. Its folder is not touched.',
|
|
62
|
+
'Waiting for you, Recent decisions and the Recent summary tell you what happened while you were away.',
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
keys: [
|
|
66
|
+
[{ es: 'Menú de un proyecto', en: 'A project\'s menu' }, { es: 'clic derecho · ⋯', en: 'right-click · ⋯' }],
|
|
67
|
+
[{ es: 'Anclarlo a la barra', en: 'Pin it to the bar' }, { es: 'arrastrar la tarjeta', en: 'drag the card' }],
|
|
68
|
+
[{ es: 'Los que no caben', en: 'Those that do not fit' }, '+n'],
|
|
69
|
+
],
|
|
70
|
+
where: ['home'],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: 'project',
|
|
74
|
+
title: { es: 'Tu proyecto', en: 'Your project' },
|
|
75
|
+
lead: { es: 'Cada proyecto tiene su conversación, sus archivos y su memoria.', en: 'Each project has its own conversation, files and memory.' },
|
|
76
|
+
news: { kind: 'changed', es: 'Son nuevos la segunda barra y Cambiar de proyecto, y los paneles se abren al lado o en una ventana que mueves.', en: 'The second bar and Switch project are new, and panels open beside you or in a window you move.' },
|
|
77
|
+
points: {
|
|
78
|
+
es: [
|
|
79
|
+
'La segunda barra lleva a Inicio, a otro proyecto abierto, a recargar y a Ajustes.',
|
|
80
|
+
'Cambiar de proyecto muestra los que tienes abiertos; su luz avisa si alguien te espera, si un agente trabaja o si algo terminó.',
|
|
81
|
+
'Abre otra conversación al lado o en una ventana, y acomoda los paneles como quieras.',
|
|
82
|
+
],
|
|
83
|
+
en: [
|
|
84
|
+
'The second bar takes you to Home, to another open project, to reload and to Settings.',
|
|
85
|
+
'Switch project shows the ones you have open; its light says if someone waits for you, if an agent is working or if something finished.',
|
|
86
|
+
'Open another conversation beside this one or in a window, and arrange the panels as you like.',
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
keys: [
|
|
90
|
+
[{ es: 'Recorrer Cambiar de proyecto', en: 'Move through Switch project' }, '← → ↑ ↓'],
|
|
91
|
+
[{ es: 'Ir al elegido', en: 'Go to the one chosen' }, { es: 'clic o ↵', en: 'click or ↵' }],
|
|
92
|
+
[{ es: 'Mover una ventana', en: 'Move a window' }, { es: 'arrastrar la cabecera', en: 'drag its header' }],
|
|
93
|
+
],
|
|
94
|
+
where: ['room'],
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: 'talk',
|
|
98
|
+
title: { es: 'Hablar con los agentes', en: 'Talking to your agents' },
|
|
99
|
+
lead: { es: 'Una conversación, todos tus agentes.', en: 'One conversation, every agent.' },
|
|
100
|
+
news: { kind: 'changed', es: 'Se suman el módulo Intenciones, que sugiere bajo la caja cuánto debe pensar cada agente, y /gh, con el módulo GitHub.', en: 'New here: the Intenciones module, which suggests under the box how hard each agent should think, and /gh, with the GitHub module.' },
|
|
101
|
+
points: {
|
|
102
|
+
es: [
|
|
103
|
+
'Elige el agente en el orbe; el modo, el modelo y el esfuerzo van en una fila bajo la caja.',
|
|
104
|
+
'Escribe @ para un agente, # para un modo, ! para un archivo y / para un comando.',
|
|
105
|
+
'Cada respuesta se puede calificar, copiar o responder.',
|
|
106
|
+
],
|
|
107
|
+
en: [
|
|
108
|
+
'Choose the agent in the orb; mode, model and effort sit in one row under the box.',
|
|
109
|
+
'Type @ for an agent, # for a mode, ! for a file and / for a command.',
|
|
110
|
+
'Every answer can be rated, copied or replied to.',
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
keys: [
|
|
114
|
+
[{ es: 'Enviar', en: 'Send' }, '↵'],
|
|
115
|
+
[{ es: 'Salto de línea', en: 'New line' }, '⌥ ↵'],
|
|
116
|
+
[{ es: 'Agente, modo, archivo, comando', en: 'Agent, mode, file, command' }, '@ # ! /'],
|
|
117
|
+
[{ es: 'Pegar o soltar imágenes', en: 'Paste or drop images' }, '⌘ V'],
|
|
118
|
+
],
|
|
119
|
+
where: ['room'],
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: 'modes',
|
|
123
|
+
title: { es: 'Modos y permisos', en: 'Modes and permissions' },
|
|
124
|
+
lead: { es: 'Cada mensaje dice hasta dónde puede llegar el agente.', en: 'Every message says how far the agent may go.' },
|
|
125
|
+
news: { kind: 'changed', es: '#4 AIRLOCK ahora es #4 Acceso total. Tú eliges qué llave abre #3 y #4, y una llave aceptada puede valer unos minutos.', en: '#4 AIRLOCK is now #4 Full access. You choose which key opens #3 and #4, and an accepted key can last a few minutes.' },
|
|
126
|
+
points: {
|
|
127
|
+
es: [
|
|
128
|
+
'#0 Incógnito, #1 Solo conversar, #2 Crear, #3 Editar y #4 Acceso total.',
|
|
129
|
+
'#3 y #4 piden tu llave, y #4 la pide dos veces. Qué llave usar lo eliges en Ajustes › Permisos.',
|
|
130
|
+
'Una llave aceptada puede valer unos minutos; mientras dura, lo ves junto a la caja.',
|
|
131
|
+
],
|
|
132
|
+
en: [
|
|
133
|
+
'#0 Incognito, #1 Chat only, #2 Create, #3 Edit and #4 Full access.',
|
|
134
|
+
'#3 and #4 ask for your key, and #4 asks for it twice. Which key, you choose in Settings › Permissions.',
|
|
135
|
+
'An accepted key can last a few minutes; while it does, you see it beside the box.',
|
|
136
|
+
],
|
|
137
|
+
},
|
|
138
|
+
keys: [[{ es: 'Elegir el modo al escribir', en: 'Choose the mode as you type' }, '#']],
|
|
139
|
+
where: ['room'],
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
id: 'coordinator',
|
|
143
|
+
title: { es: 'El Coordinador', en: 'The Coordinator' },
|
|
144
|
+
lead: { es: 'Un agente que ve todos tus proyectos desde arriba.', en: 'An agent that sees all your projects from above.' },
|
|
145
|
+
news: { kind: 'new', es: 'En 0.7.2 cada proyecto trabajaba por su cuenta; ahora un agente los ve todos.', en: 'In 0.7.2 each project worked on its own; now one agent sees them all.' },
|
|
146
|
+
points: {
|
|
147
|
+
es: [
|
|
148
|
+
'Lee entre tus proyectos, firma conexiones y lleva órdenes de uno a otro. Le hablas en su propio proyecto, desde Inicio.',
|
|
149
|
+
'Desde cualquier proyecto le preguntas con /bishop, y la respuesta es solo para ti.',
|
|
150
|
+
'Sus órdenes llegan hasta #2; #3 y #4 llegan como una propuesta que tú desbloqueas en ese proyecto.',
|
|
151
|
+
],
|
|
152
|
+
en: [
|
|
153
|
+
'It reads across your projects, signs connections and carries orders from one to another. You talk to it in its own project, from Home.',
|
|
154
|
+
'From any project you ask it with /bishop, and the answer is for you only.',
|
|
155
|
+
'Its orders go up to #2; #3 and #4 arrive as a proposal you unlock in that project.',
|
|
156
|
+
],
|
|
157
|
+
},
|
|
158
|
+
keys: [[{ es: 'Preguntarle desde un proyecto', en: 'Ask it from a project' }, '/bishop']],
|
|
159
|
+
where: ['home'],
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
id: 'links',
|
|
163
|
+
title: { es: 'Conexiones', en: 'Connections' },
|
|
164
|
+
lead: { es: 'Un proyecto puede consultar lo que otro ya aprendió.', en: 'One project can look up what another has already learned.' },
|
|
165
|
+
news: { kind: 'new', es: 'En 0.7.2, «Conexiones» era iniciar sesión de tus agentes; ahora une dos proyectos.', en: 'In 0.7.2, «Connections» was signing your agents in; now it joins two projects.' },
|
|
166
|
+
points: {
|
|
167
|
+
es: [
|
|
168
|
+
'Tú firmas cada conexión: qué consulta, por cuánto tiempo y si el Coordinador puede dar órdenes.',
|
|
169
|
+
'Solo cruzan notas que ya están en uso, limpias de datos privados; nunca tus archivos ni tus conversaciones.',
|
|
170
|
+
'Dos proyectos se conectan una vez; la revocas cuando quieras desde Conexiones, en Inicio.',
|
|
171
|
+
],
|
|
172
|
+
en: [
|
|
173
|
+
'You sign every connection: what it looks up, for how long, and whether the Coordinator may give orders.',
|
|
174
|
+
'Only notes already in use cross, cleaned of private data; never your files nor your conversations.',
|
|
175
|
+
'Two projects are connected once; you revoke it whenever you want from Connections, in Home.',
|
|
176
|
+
],
|
|
177
|
+
},
|
|
178
|
+
keys: [[{ es: 'Conectar en el Mapa de proyectos', en: 'Connect in the Project map' }, { es: 'llevar uno sobre otro', en: 'carry one onto another' }]],
|
|
179
|
+
where: ['home'],
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
id: 'maps',
|
|
183
|
+
title: { es: 'Los mapas', en: 'The maps' },
|
|
184
|
+
lead: { es: 'Tu memoria y tus proyectos, de un vistazo.', en: 'Your memory and your projects, at a glance.' },
|
|
185
|
+
news: { kind: 'changed', es: 'NOSTROMO ahora es el Mapa de memoria, con su tecla en la barra; el Mapa de proyectos es nuevo.', en: 'NOSTROMO is now the Memory map, with its key on the bar; the Project map is new.' },
|
|
186
|
+
points: {
|
|
187
|
+
es: [
|
|
188
|
+
'El Mapa de memoria tiene su tecla en la barra del proyecto: cada estrella es algo que MADRE recuerda de él.',
|
|
189
|
+
'El Mapa de proyectos, en Inicio, muestra tus proyectos y sus conexiones; pide una pantalla de 900 px o más.',
|
|
190
|
+
'En el Mapa de proyectos, lleva un proyecto sobre otro para conectarlos.',
|
|
191
|
+
],
|
|
192
|
+
en: [
|
|
193
|
+
'The Memory map has its key on the project\'s bar: every star is something MADRE remembers about it.',
|
|
194
|
+
'The Project map, in Home, shows your projects and their connections; it needs a screen of 900 px or more.',
|
|
195
|
+
'In the Project map, carry one project onto another to connect them.',
|
|
196
|
+
],
|
|
197
|
+
},
|
|
198
|
+
keys: [
|
|
199
|
+
[{ es: 'Girar', en: 'Turn' }, { es: 'arrastrar', en: 'drag' }],
|
|
200
|
+
[{ es: 'Mover', en: 'Move' }, { es: '⇧ arrastrar', en: '⇧ drag' }],
|
|
201
|
+
[{ es: 'Acercar', en: 'Zoom' }, { es: 'rueda', en: 'wheel' }],
|
|
202
|
+
[{ es: 'Volver', en: 'Back' }, { es: 'Esc, por capas', en: 'Esc, layer by layer' }],
|
|
203
|
+
],
|
|
204
|
+
where: ['home', 'room'],
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
id: 'settings',
|
|
208
|
+
title: { es: 'Diagnóstico y Ajustes', en: 'Diagnostics and Settings' },
|
|
209
|
+
lead: { es: 'Todo lo que configuras, en un lugar; y el remedio cuando algo falla.', en: 'Everything you set, in one place; and the remedy when something fails.' },
|
|
210
|
+
news: { kind: 'new', es: 'Lo que estaba repartido entre MU/TH/UR, ⚙ CONEXIONES y la barra ahora vive en una ventana con buscador, y Diagnóstico te da el remedio.', en: 'What was spread across MU/TH/UR, ⚙ CONNECTIONS and the bar now lives in one window with a search, and Diagnostics gives you the remedy.' },
|
|
211
|
+
points: {
|
|
212
|
+
es: [
|
|
213
|
+
'Ajustes se abre con ⌘ , y se busca con /. Los cambios se aplican al instante.',
|
|
214
|
+
'Apariencia tiene los acentos y los fondos para tema claro y oscuro, y también el idioma.',
|
|
215
|
+
'En Diagnóstico escribes lo que pasa con tus palabras y te dice qué hacer, con la tecla que lo resuelve.',
|
|
216
|
+
],
|
|
217
|
+
en: [
|
|
218
|
+
'Settings opens with ⌘ , and is searched with /. Changes apply at once.',
|
|
219
|
+
'Appearance has the accents and wallpapers for light and dark, and the language too.',
|
|
220
|
+
'In Diagnostics you say what happens in your own words and it tells you what to do, with the key that fixes it.',
|
|
221
|
+
],
|
|
222
|
+
},
|
|
223
|
+
keys: [
|
|
224
|
+
[{ es: 'Ajustes', en: 'Settings' }, '⌘ ,'],
|
|
225
|
+
[{ es: 'Buscar en Ajustes', en: 'Search Settings' }, '/'],
|
|
226
|
+
[{ es: 'Atrás, por capas', en: 'Back, layer by layer' }, 'Esc'],
|
|
227
|
+
],
|
|
228
|
+
where: ['home', 'room'],
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
id: 'modules',
|
|
232
|
+
title: { es: 'Módulos', en: 'Modules' },
|
|
233
|
+
lead: { es: 'Lo que le agregas a MADRE, como apps.', en: 'What you add to MADRE, like apps.' },
|
|
234
|
+
news: { kind: 'changed', es: 'Ahora son un tablero de mosaicos, como apps; ash es Ahorro de tokens, y se suman Intenciones y GitHub.', en: 'They are now a board of tiles, like apps; ash is Token saver, and Intenciones and GitHub join them.' },
|
|
235
|
+
points: {
|
|
236
|
+
es: [
|
|
237
|
+
'Un tablero de mosaicos, cada uno con su interruptor y su ficha.',
|
|
238
|
+
'Ahorro de tokens, Intenciones e IA local se abren en su propia ventana.',
|
|
239
|
+
'Continuidad (AHP+), GitHub y los demás dicen qué escriben y qué necesitan antes de instalarse.',
|
|
240
|
+
],
|
|
241
|
+
en: [
|
|
242
|
+
'A board of tiles, each with its switch and its sheet.',
|
|
243
|
+
'Token saver, Intents and Local AI open in their own window.',
|
|
244
|
+
'Continuity (AHP+), GitHub and the rest say what they write and what they need before they are installed.',
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
keys: [],
|
|
248
|
+
where: ['room'],
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
id: 'phone',
|
|
252
|
+
title: { es: 'Tu teléfono', en: 'Your phone' },
|
|
253
|
+
lead: { es: 'Sigue donde ibas, desde el teléfono.', en: 'Carry on where you were, from your phone.' },
|
|
254
|
+
news: { kind: 'new', es: 'En 0.7.2 MADRE solo se abría en la Mac.', en: 'In 0.7.2 MADRE only opened on the Mac.' },
|
|
255
|
+
points: {
|
|
256
|
+
es: [
|
|
257
|
+
'Empareja tu teléfono con un código QR, en la misma red Wi‑Fi que tu Mac.',
|
|
258
|
+
'Desde el teléfono llegas hasta #2; #3 y #4 se quedan en la Mac.',
|
|
259
|
+
'Lo que empiezas en uno lo sigues en el otro: la Mac te ofrece continuar donde ibas.',
|
|
260
|
+
],
|
|
261
|
+
en: [
|
|
262
|
+
'Pair your phone with a QR code, on the same Wi‑Fi as your Mac.',
|
|
263
|
+
'From the phone you reach up to #2; #3 and #4 stay on the Mac.',
|
|
264
|
+
'What you start on one you carry on on the other: the Mac offers to continue where you were.',
|
|
265
|
+
],
|
|
266
|
+
},
|
|
267
|
+
keys: [[{ es: 'Ordenar la barra en el teléfono', en: 'Order the bar on the phone' }, { es: 'mantener 0,5 s', en: 'hold 0.5 s' }]],
|
|
268
|
+
where: ['room'],
|
|
269
|
+
// Told only where the phone is offered (src/server.mjs, phonePreview); hidden everywhere else.
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
id: 'gestures',
|
|
273
|
+
title: { es: 'Gestos y atajos', en: 'Gestures and shortcuts' },
|
|
274
|
+
lead: { es: 'Lo que se hace con las manos. Esta hoja se abre con ? en cualquier momento.', en: 'What is done with your hands. This sheet opens with ? at any moment.' },
|
|
275
|
+
news: { kind: 'new', es: 'Los gestos y atajos de todo MADRE, juntos en una hoja por primera vez.', en: 'The gestures and shortcuts of all of MADRE, together on one sheet for the first time.' },
|
|
276
|
+
points: { es: [], en: [] },
|
|
277
|
+
keys: [],
|
|
278
|
+
where: ['home', 'room'],
|
|
279
|
+
},
|
|
280
|
+
];
|
|
281
|
+
|
|
282
|
+
// The sheet of gestures: what `?` opens anywhere, and the last chapter.
|
|
283
|
+
export const GESTURES = [
|
|
284
|
+
[{ es: 'En todo MADRE', en: 'Everywhere in MADRE' }, [
|
|
285
|
+
[{ es: 'Ajustes', en: 'Settings' }, '⌘ ,'],
|
|
286
|
+
[{ es: 'Cerrar lo de arriba, por capas', en: 'Close what is on top, layer by layer' }, 'Esc'],
|
|
287
|
+
[{ es: 'Detener todo', en: 'Stop everything' }, '/stopall'],
|
|
288
|
+
[{ es: 'Otra pestaña al ir a un proyecto', en: 'Another tab when going to a project' }, { es: '⌘ clic', en: '⌘ click' }],
|
|
289
|
+
[{ es: 'Esta hoja', en: 'This sheet' }, '?'],
|
|
290
|
+
]],
|
|
291
|
+
[{ es: 'La barra', en: 'The bar' }, [
|
|
292
|
+
[{ es: 'Ordenarla', en: 'Order it' }, { es: 'clic derecho', en: 'right-click' }],
|
|
293
|
+
[{ es: 'Quitar una tecla', en: 'Remove a key' }, '−'],
|
|
294
|
+
[{ es: 'Mover una tecla', en: 'Move a key' }, { es: 'arrastrar', en: 'drag' }],
|
|
295
|
+
[{ es: 'Lo que no cabe', en: 'What does not fit' }, '•••'],
|
|
296
|
+
]],
|
|
297
|
+
[{ es: 'Cambiar de proyecto', en: 'Switch project' }, [
|
|
298
|
+
[{ es: 'Abrir el panel', en: 'Open the panel' }, { es: 'clic', en: 'click' }],
|
|
299
|
+
[{ es: 'Recorrerlo', en: 'Move through it' }, '← → ↑ ↓'],
|
|
300
|
+
[{ es: 'Ir', en: 'Go' }, { es: 'clic o ↵', en: 'click or ↵' }],
|
|
301
|
+
[{ es: 'Cerrarlo', en: 'Close it' }, 'Esc'],
|
|
302
|
+
]],
|
|
303
|
+
[{ es: 'Ventanas y paneles', en: 'Windows and panels' }, [
|
|
304
|
+
[{ es: 'Mover', en: 'Move' }, { es: 'arrastrar la cabecera', en: 'drag the header' }],
|
|
305
|
+
[{ es: 'ACOMODAR', en: 'ARRANGE' }, { es: 'mantener el puntero 0,4 s', en: 'hold the pointer 0.4 s' }],
|
|
306
|
+
[{ es: 'Apartar las ventanas', en: 'Set the windows aside' }, { es: 'clic en el escritorio', en: 'click the desktop' }],
|
|
307
|
+
[{ es: 'Ancho del panel', en: 'Panel width' }, { es: '← → · ⇧ para 64 px', en: '← → · ⇧ for 64 px' }],
|
|
308
|
+
]],
|
|
309
|
+
[{ es: 'La caja', en: 'The box' }, [
|
|
310
|
+
[{ es: 'Enviar', en: 'Send' }, '↵'],
|
|
311
|
+
[{ es: 'Salto de línea', en: 'New line' }, '⌥ ↵'],
|
|
312
|
+
[{ es: 'Agente, modo, archivo, comando', en: 'Agent, mode, file, command' }, '@ # ! /'],
|
|
313
|
+
[{ es: 'Pegar o soltar imágenes', en: 'Paste or drop images' }, '⌘ V'],
|
|
314
|
+
]],
|
|
315
|
+
[{ es: 'Ajustes', en: 'Settings' }, [
|
|
316
|
+
[{ es: 'Buscar', en: 'Search' }, '/'],
|
|
317
|
+
[{ es: 'Abrir el primero', en: 'Open the first' }, '↵'],
|
|
318
|
+
[{ es: 'Atrás, por capas', en: 'Back, layer by layer' }, 'Esc'],
|
|
319
|
+
]],
|
|
320
|
+
[{ es: 'Mapa de memoria', en: 'Memory map' }, [
|
|
321
|
+
[{ es: 'Girar', en: 'Turn' }, { es: 'arrastrar', en: 'drag' }],
|
|
322
|
+
[{ es: 'Mover', en: 'Move' }, { es: '⇧ arrastrar', en: '⇧ drag' }],
|
|
323
|
+
[{ es: 'Acercar', en: 'Zoom' }, { es: 'rueda', en: 'wheel' }],
|
|
324
|
+
[{ es: 'Leer una memoria', en: 'Read a memory' }, { es: 'clic', en: 'click' }],
|
|
325
|
+
]],
|
|
326
|
+
[{ es: 'Mapa de proyectos', en: 'Project map' }, [
|
|
327
|
+
[{ es: 'Mover el espacio', en: 'Move the space' }, { es: 'arrastrar', en: 'drag' }],
|
|
328
|
+
[{ es: 'Ir a uno', en: 'Go to one' }, { es: 'clic · ← →', en: 'click · ← →' }],
|
|
329
|
+
[{ es: 'Conectar dos', en: 'Connect two' }, { es: 'llevar uno sobre otro', en: 'carry one onto another' }],
|
|
330
|
+
[{ es: 'Volver', en: 'Back' }, { es: 'Esc, por capas', en: 'Esc, layer by layer' }],
|
|
331
|
+
]],
|
|
332
|
+
[{ es: 'Inicio', en: 'Home' }, [
|
|
333
|
+
[{ es: 'Menú de un proyecto', en: 'A project\'s menu' }, { es: 'clic derecho · ⋯', en: 'right-click · ⋯' }],
|
|
334
|
+
[{ es: 'Anclarlo', en: 'Pin it' }, { es: 'arrastrar a la barra', en: 'drag to the bar' }],
|
|
335
|
+
[{ es: 'Los que no caben', en: 'Those that do not fit' }, '+n'],
|
|
336
|
+
]],
|
|
337
|
+
[{ es: 'Visor y editor', en: 'Viewer and editor' }, [
|
|
338
|
+
[{ es: 'Guardar', en: 'Save' }, '⌘ S'],
|
|
339
|
+
[{ es: 'Buscar · reemplazar', en: 'Find · replace' }, '⌘ F · ⌥ ⌘ F'],
|
|
340
|
+
[{ es: 'Ir a una línea', en: 'Go to a line' }, '⌃ G'],
|
|
341
|
+
]],
|
|
342
|
+
];
|