Aller au contenu principal

Construire Depuis les Sources

AISCouncil est une application HTML monofichier assemblée à partir de 80 fichiers sources modulaires dans src/. Ce guide couvre le pipeline de build complet, de la compilation TypeScript à l'assemblage final.

Prérequis​

  • Node.js 20+ et npm
  • Bash (Linux/macOS, ou WSL sur Windows)
  • Python 3.10+ (pour la validation du registre uniquement)

Configuration​

Clonez le référentiel et installez les dépendances de développement :

git clone https://github.com/nicholasgasior/bcz.git
cd bcz
npm install

Cela installe :

  • esbuild — Suppression de types TypeScript (pas de bundling)
  • vitest + jsdom — Framework de test
  • typescript — Vérification de types (tsc --noEmit)
info

Ce sont des dépendances de développement uniquement. Rien de node_modules n'est livré au navigateur. La sortie de production est un index.html unique avec zéro dépendance externe.

Étapes de Build​

1. Compilation TypeScript​

Si vous avez des modules TypeScript dans modules/*/index.ts, compilez-les d'abord :

npm run build:ts

Ou compilez un seul module :

node scripts/compile-ts.js grid
astuce

build.sh exécute automatiquement la compilation TypeScript si esbuild est installé. Vous n'avez besoin d'exécuter npm run build:ts manuellement que si vous voulez compiler sans assembler.

2. Assemblage​

Concaténez les 80 parties sources en index.html :

./build.sh

Sortie :

Compiling TypeScript modules...
grid: modules/grid/index.ts -> src/grid.js
Compiled 1 module.
Built index.html (15432 lines, 982451 bytes) from 80 parts

3. Vérification​

Vérifiez que src/ correspond au index.html actuel sans écraser :

./build.sh --check

Sortie si correspondance :

OK: src/ matches index.html (80 parts)

Sortie si non-correspondance :

MISMATCH: src/ does not match index.html

Pipeline TypeScript​

Le pipeline TypeScript est un système léger de suppression de types, pas un bundler.

Comment Ça Fonctionne​

Pour chaque module dans modules/*/ :

  1. Source : modules/{name}/index.ts — Source TypeScript avec types
  2. Wrapper : modules/{name}/wrapper.txt — Template IIFE avec placeholders {CODE} et {Name}
  3. Sortie : src/{name}.js — Bloc <script> prêt à concaténer

Le script scripts/compile-ts.js :

  1. Lit la source TypeScript
  2. Appelle esbuild.transformSync() pour supprimer les types (pas de bundling, pas de conversion de format)
  3. Supprime toutes les instructions import/export (le module est enveloppé dans une IIFE)
  4. Indente le code et l'insère dans le template wrapper
  5. Si le code définit __exports, ajoute return __exports;

Template Wrapper​

Chaque module TypeScript a un wrapper.txt qui définit l'enveloppe <script> :

<script>
// ============================================================================
// MODULE: AIS.{Name} (compiled from TypeScript)
// ============================================================================
if (!AIS.{Name}) AIS.lazy('{Name}', function() {
'use strict';
{CODE}
});
</script>

Le placeholder {Name} est remplacé par le nom de module capitalisé (ex., grid devient Grid). Le placeholder {CODE} est remplacé par la source sans types et indentée.

Écrire des Modules TypeScript​

Utilisez le pattern var __exports = {...} pour l'API publique du module :

// modules/mymodule/index.ts

interface MyConfig {
name: string;
value: number;
}

function doSomething(config: MyConfig): string {
return config.name + ": " + config.value;
}

var __exports = {
doSomething,
};
avertissement

N'utilisez pas d'instructions return seules — elles causent des erreurs avec tsc --noEmit. Utilisez var __exports = {...} et compile-ts.js ajoutera return __exports; automatiquement.

avertissement

Ne définissez pas format: 'esm' dans les options esbuild. Cela cause un wrapping CommonJS qui casse le pattern IIFE. Le script de compilation omet l'option format intentionnellement.

Vérification de Types​

Exécutez le compilateur TypeScript en mode vérification uniquement (pas de sortie) :

npm run check

Cela utilise tsc --noEmit avec le tsconfig.json du projet. Les définitions de types sont dans :

  • core-types/index.d.ts — Types complets de l'espace de noms AIS
  • core-types/grid.d.ts — Types spécifiques à Grid

Ordre des Fichiers Sources​

L'ordre des fichiers dans build.sh est critique. Le tableau PARTS définit la séquence exacte de concaténation :

Shell (HTML/CSS/DOM):
shell-head.html # DOCTYPE, meta tags, redirection anticipée
shell-style.html # Styles CSS sans classes
shell-body.html # Corps HTML, layout, dialogues, formulaires

Core Modules (bloc <script> unique):
core-boot.js # Balise <script>, espace de noms AIS, bus d'événements, lazy loader
core-auth-main.js # OAuth, Google Sign-In
core-auth-local.js # Comptes locaux, mot de passe d'appareil
core-auth-init.js # Câblage UI d'auth, init, export
core-billing.js # Niveau d'abonnement, essai
core-ads.js # Système de pub statique
core-codec.js # Base80, VLQ, compression
core-storage.js # IndexedDB + SQLite
core-providers.js # Factory SSE, API d'enregistrement
core-providers-builtin.js # Définitions des fournisseurs intégrés
core-ui.js # Utils DOM, markdown, toast
core-session.js # CRUD de session de bot
core-chat.js # Messages, streaming
core-config.js # Panneau de config de bot
core-app-botlist.js # Liste de bots, menu contextuel
core-app-switch.js # switchBot, createBot, mega menu
core-app-events.js # bindEvents, UI de conseil
core-app-search.js # Recherche, export, import, addons
core-app-init.js # Helpers de conseil, init, boot
core-end.js # </script>

Remplaçables par WASM (chacun dans son propre <script>):
registry.js, grid.js, council.js, wizard.js,
vision.js, memory.js, imagegen.js, tools.js,
reminders.js, themes.js, templates-registry.js,
model-picker.js

Infrastructure:
kernel-bootstrap.html, moduleloader.js, plugins.js,
mcp.js, channels-*.js, sandbox.js, publish.js,
perf.js, p2p.js, profiles.js, cron.js

Plateforme:
settings-main.js, i18n.js, miniprograms.js,
docs.js, billing-ui.js, pwa.js

Tail:
shell-bottom.js # Gestionnaire d'écran de bienvenue, balises de fermeture
avertissement

Ne réorganisez pas l'ordre des fichiers. Les modules core partagent un seul bloc <script> ouvert par core-boot.js et fermé par core-end.js. Insérer un fichier entre eux qui contient </script> cassera le build.

Exécuter les Tests​

La suite de tests utilise Vitest avec un environnement jsdom.

# Exécuter tous les tests une fois
npm test

# Exécuter les tests en mode watch (ré-exécution sur changements de fichiers)
npm run test:watch

# Exécuter uniquement les tests de modules TypeScript
npm run test:modules

# Exécuter une suite de tests spécifique
npm run test:settings

Les tests de Worker s'exécutent séparément depuis le répertoire worker/ :

cd worker
npm test

Workflow de Développement​

Le cycle standard éditer-construire-tester :

# 1. Éditer les fichiers sources
$EDITOR src/core-chat.js

# 2. Assembler en index.html
./build.sh

# 3. Tester dans le navigateur
# Ouvrir index.html ou utiliser un serveur local

# 4. Exécuter les tests
npm test

# 5. Vérifier l'intégrité du build
./build.sh --check

Pour les modules TypeScript :

# 1. Éditer la source TypeScript
$EDITOR modules/grid/index.ts

# 2. Vérifier les types
npm run check

# 3. Compiler + assembler (build.sh fait les deux)
./build.sh

# 4. Tester
npm run test:modules

Ajouter un Nouveau Module​

Pour ajouter un nouveau module chargé à la demande :

  1. Créez src/mymodule.js avec le pattern standard :
<script>
if (!AIS.MyModule)
AIS.lazy("MyModule", function () {
"use strict";

function doWork() {
/* ... */
}

return { doWork };
});
</script>
  1. Ajoutez le fichier au tableau PARTS dans build.sh à la position appropriée.

  2. Exécutez ./build.sh pour vérifier qu'il s'assemble correctement.

Pour ajouter un nouveau module TypeScript :

  1. Créez modules/mymodule/index.ts avec le code source.
  2. Créez modules/mymodule/wrapper.txt avec le template IIFE (copiez depuis un module existant comme modules/grid/wrapper.txt).
  3. Optionnellement ajoutez des définitions de types à core-types/index.d.ts.
  4. Ajoutez src/mymodule.js au tableau PARTS dans build.sh.
  5. Exécutez ./build.sh.

Validation du Registre​

Les registres de modèles et de packages ont des scripts de validation :

# Valider le registre de modèles
python3 registry/validate.py

# Valider le registre de packages
python3 registry/validate.py packages

# Valider un seul manifeste
python3 registry/validate.py manifest examples/hello-world/manifest.json

Kernel WASM (Optionnel)​

Le kernel WASM est un composant optionnel. Le construire nécessite Zig 0.14.0+ :

cd kernel
../tools/zig/zig build # sorties zig-out/bin/kernel.wasm (~5.5 Ko)

Le kernel n'est pas requis pour que l'application principale fonctionne. Toutes les fonctionnalités du kernel ont des fallbacks JavaScript.