Compilando a partir do Código Fonte
O AISCouncil é um aplicativo HTML de arquivo único montado a partir de 80 arquivos fonte modulares em src/. Este guia cobre o pipeline completo de build, da compilação TypeScript à montagem final.
Pré-requisitos
- Node.js 20+ e npm
- Bash (Linux/macOS, ou WSL no Windows)
- Python 3.10+ (apenas para validação de registro)
Configuração
Clone o repositório e instale as dependências de desenvolvimento:
git clone https://github.com/nicholasgasior/bcz.git
cd bcz
npm install
Isso instala:
- esbuild -- Remoção de tipos TypeScript (sem bundling)
- vitest + jsdom -- Framework de testes
- typescript -- Verificação de tipos (
tsc --noEmit)
Estas são dependências de desenvolvimento apenas. Nada de node_modules é enviado ao navegador. A saída de produção é um único index.html com zero dependências externas.
Passos de Build
1. Compilação TypeScript
Se você tem módulos TypeScript em modules/*/index.ts, compile-os primeiro:
npm run build:ts
Ou compile um único módulo:
node scripts/compile-ts.js grid
O build.sh executa automaticamente a compilação TypeScript se o esbuild estiver instalado. Você só precisa executar npm run build:ts manualmente se quiser compilar sem montar.
2. Montagem
Concatene todas as 80 partes fonte em index.html:
./build.sh
Saída:
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. Verificação
Verifique se src/ corresponde ao index.html atual sem sobrescrever:
./build.sh --check
Saída em caso de correspondência:
OK: src/ matches index.html (80 parts)
Saída em caso de não correspondência:
MISMATCH: src/ does not match index.html
Pipeline TypeScript
O pipeline TypeScript é um sistema leve de remoção de tipos, não um bundler.
Como Funciona
Para cada módulo em modules/*/:
- Fonte:
modules/{name}/index.ts-- Fonte TypeScript com tipos - Wrapper:
modules/{name}/wrapper.txt-- Template IIFE com placeholders{CODE}e{Name} - Saída:
src/{name}.js-- Bloco<script>pronto para concatenação
O script scripts/compile-ts.js:
- Lê a fonte TypeScript
- Chama
esbuild.transformSync()para remover tipos (sem bundling, sem conversão de formato) - Remove quaisquer statements
import/export(o módulo é wrapped em uma IIFE) - Indenta o código e o insere no template wrapper
- Se o código define
__exports, anexareturn __exports;
Template Wrapper
Cada módulo TypeScript tem um wrapper.txt que define o envelope <script>:
<script>
// ============================================================================
// MODULE: AIS.{Name} (compiled from TypeScript)
// ============================================================================
if (!AIS.{Name}) AIS.lazy('{Name}', function() {
'use strict';
{CODE}
});
</script>
O placeholder {Name} é substituído pelo nome do módulo capitalizado (ex: grid se torna Grid). O placeholder {CODE} é substituído pela fonte sem tipos e indentada.
Escrevendo Módulos TypeScript
Use o padrão var __exports = {...} para a API pública do módulo:
// modules/mymodule/index.ts
interface MyConfig {
name: string;
value: number;
}
function doSomething(config: MyConfig): string {
return config.name + ": " + config.value;
}
var __exports = {
doSomething,
};
Não use statements return soltos -- eles causam erros com tsc --noEmit. Use var __exports = {...} e compile-ts.js anexará return __exports; automaticamente.
Não defina format: 'esm' nas opções do esbuild. Isso causa wrapping CommonJS que quebra o padrão IIFE. O script de compilação omite intencionalmente a opção format.
Verificação de Tipos
Execute o compilador TypeScript em modo apenas verificação (sem saída):
npm run check
Isso usa tsc --noEmit com o tsconfig.json do projeto. As definições de tipos estão em:
core-types/index.d.ts-- Tipos completos do namespaceAIScore-types/grid.d.ts-- Tipos específicos do Grid
Ordem dos Arquivos Fonte
A ordem dos arquivos em build.sh é crítica. O array PARTS define a sequência exata de concatenação:
Shell (HTML/CSS/DOM):
shell-head.html # DOCTYPE, meta tags, redirecionamento antecipado
shell-style.html # Estilos CSS sem classes
shell-body.html # Corpo HTML, layout, diálogos, formulários
Core Modules (único bloco <script>):
core-boot.js # tag <script>, namespace AIS, event bus, lazy loader
core-auth-main.js # OAuth, Google Sign-In
core-auth-local.js # Contas locais, senha do dispositivo
core-auth-init.js # Wiring de UI de auth, init, export
core-billing.js # Nível de assinatura, trial
core-ads.js # Sistema de anúncios estático
core-codec.js # Base80, VLQ, compressão
core-storage.js # IndexedDB + SQLite
core-providers.js # Fábrica SSE, API de registro
core-providers-builtin.js # Definições de provedores integrados
core-ui.js # Utils DOM, markdown, toast
core-session.js # CRUD de sessão de bot
core-chat.js # Mensagens, streaming
core-config.js # Painel de config de bot
core-app-botlist.js # Lista de bots, menu de contexto
core-app-switch.js # switchBot, createBot, mega menu
core-app-events.js # bindEvents, UI de council
core-app-search.js # Busca, export, import, addons
core-app-init.js # Helpers de Council, init, boot
core-end.js # </script>
WASM-Replaceable (cada um em seu próprio <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
Platform:
settings-main.js, i18n.js, miniprograms.js,
docs.js, billing-ui.js, pwa.js
Tail:
shell-bottom.js # Handler de tela de boas-vindas, tags de fechamento
Não reorganize a ordem dos arquivos. Módulos principais compartilham um único bloco <script> aberto por core-boot.js e fechado por core-end.js. Inserir um arquivo entre eles que contenha </script> quebrará o build.
Executando Testes
A suíte de testes usa Vitest com ambiente jsdom.
# Executar todos os testes uma vez
npm test
# Executar testes em modo watch (re-executa em mudanças de arquivo)
npm run test:watch
# Executar apenas testes de módulos TypeScript
npm run test:modules
# Executar uma suíte de testes específica
npm run test:settings
Testes de worker rodam separadamente de dentro do diretório worker/:
cd worker
npm test
Fluxo de Trabalho de Desenvolvimento
O ciclo padrão editar-compilar-testar:
# 1. Editar arquivos fonte
$EDITOR src/core-chat.js
# 2. Montar em index.html
./build.sh
# 3. Testar no navegador
# Abra index.html ou use um servidor local
# 4. Executar testes
npm test
# 5. Verificar integridade do build
./build.sh --check
Para módulos TypeScript:
# 1. Editar fonte TypeScript
$EDITOR modules/grid/index.ts
# 2. Verificar tipos
npm run check
# 3. Compilar + montar (build.sh faz ambos)
./build.sh
# 4. Testar
npm run test:modules
Adicionando um Novo Módulo
Para adicionar um novo módulo de carregamento preguiçoso:
- Crie
src/mymodule.jscom o padrão padrão:
<script>
if (!AIS.MyModule)
AIS.lazy("MyModule", function () {
"use strict";
function doWork() {
/* ... */
}
return { doWork };
});
</script>
-
Adicione o arquivo ao array
PARTSembuild.shna posição apropriada. -
Execute
./build.shpara verificar se monta corretamente.
Para adicionar um novo módulo TypeScript:
- Crie
modules/mymodule/index.tscom o código fonte. - Crie
modules/mymodule/wrapper.txtcom o template IIFE (copie de um módulo existente comomodules/grid/wrapper.txt). - Opcionalmente adicione definições de tipo a
core-types/index.d.ts. - Adicione
src/mymodule.jsao arrayPARTSembuild.sh. - Execute
./build.sh.
Validação de Registro
Os registros de modelos e pacotes têm scripts de validação:
# Validar registro de modelos
python3 registry/validate.py
# Validar registro de pacotes
python3 registry/validate.py packages
# Validar um manifesto único
python3 registry/validate.py manifest examples/hello-world/manifest.json
Kernel WASM (Opcional)
O kernel WASM é um componente opcional. Compilá-lo requer Zig 0.14.0+:
cd kernel
../tools/zig/zig build # outputs zig-out/bin/kernel.wasm (~5.5 KB)
O kernel não é necessário para o funcionamento da aplicação principal. Todas as funcionalidades do kernel têm fallbacks em JavaScript.