Saltar para o conteúdo
KeelOps

SDK de plugins

Construa a peça que falta, dentro do KeelOps.

Um plugin é uma pasta de JavaScript que o KeelOps carrega no seu próprio processo: usa a sua autenticação, as suas permissões e o seu aspeto, lê os seus dados, e aparece onde se trabalha — no menu, na página de um projeto, no detalhe de uma tarefa, na barra superior. Nenhum segundo servidor, nenhum token para distribuir, nenhuma dependência para instalar. O SDK é livre (AGPL), e um plugin declara no manifesto se requer a edição pro.

O que pode construir

Aquilo que só a vós faz falta, com todo o resto do KeelOps à volta.

Uma página no menu

Uma entrada com o seu ícone, uma página que se abre dentro da aplicação e herda as suas cores, o tema claro ou escuro e a língua de quem a vê.

Dentro do trabalho

Um comando na página de um projeto, um painel no detalhe de uma tarefa, um botão entre os anexos de uma proposta, uma caixa no dia: as âncoras levam o plugin aonde é preciso.

Dados seus

Tabelas próprias na mesma base de dados, com as suas migrações, nos dois motores — SQLite e MariaDB. A cópia de segurança do KeelOps leva-as consigo.

Relatórios e notas de versão

O trabalho fechado torna-se um documento que se lê, escrito pelos modelos de IA no seu servidor: para os utilizadores, para a administração, para os comerciais.

Ferramentas para os assistentes

Um plugin oferece ferramentas aos outros, através do núcleo: assim o Claude, o ChatGPT e o Mistral leem os dados de qualidade do QABox, com as permissões de quem pergunta.

O trabalho do núcleo, com as suas regras

Criar uma tarefa, anexar um documento gerado, ter um grupo de pessoas: o plugin passa pelas portas do núcleo, com as permissões, as notificações e o histórico de sempre.

Um exemplo

O mapa de tarefas: um plugin dentro da página de um projeto.

Não tem entrada no menu: abre-se a partir do menu ⋯ de um projeto. Lê as tarefas com as permissões de quem vê, extrai os temas do texto com os modelos locais, e desenha-as como uma rede — hierarquia, janelas de tempo, quem trabalhou com quem, e as ligações que sugere acrescentar.

O mapa de tarefas de um projeto: os temas à esquerda, as tarefas como nós de uma rede, coloridas por tema

IA local

O trabalho feito torna-se um documento que se lê.

O KeelOps sabe o que foi feito, para quem, em que semana. Um modelo que corre no seu servidor — Ollama, nada que saia da empresa — transforma-o em texto para quem o tem de ler.

  • Notas de versão para os utilizadores de um produto, semana a semana, divididas em novidades e correções.
  • O mês de um cliente para a administração: pedidos abertos, trabalho realizado, horas por atividade, dito por palavras.
  • A semana das propostas para os comerciais: o que avançou, o que está parado, a quem voltar a ligar.
  • As não conformidades do mês para a qualidade, com as ações que as fecharam.

O modelo escreve as frases; o que entra no documento e os números decide-os o código. Sem modelo o documento sai na mesma, com os títulos no lugar das frases, e di-lo. É a mesma receita das notas de versão que o KeelOps já gera — ao lado, uma verdadeira, enviada aos utilizadores de um produto.

Uma nota de versão semanal gerada automaticamente: um parágrafo de abertura, as novidades e as correções, cada uma com o seu produto
Uma nota de versão semanal, gerada pelo KeelOps e enviada aos utilizadores.

Por onde começar

Um plugin em vinte linhas.

Um manifesto que diz quem é e onde aparece, e uma função create(ctx) que recebe do núcleo a base de dados, a sessão e as portas, e devolve as suas rotas. Acrescenta-se o nome a PLUGINS, reinicia-se, e a entrada está no menu.

// plugins/Hello/plugin.mjs
export const manifest = { nome: "Hello", versione: "0.1.0", ui: { voce: "Hello", icona: "puzzle" } };

export async function create(ctx) {
  const { json } = await import(`${ctx.sdkDir}/http.mjs`);
  return {
    routes: [
      ["GET", /^\/api\/summary$/, async (req, res) => {
        const user = await ctx.sessionUser(req);          // the real KeelOps session
        if (!user) return json(res, 401, { error: "no session" });
        const row = await ctx.db.get(                      // the KeelOps database, read-only
          "SELECT COUNT(*) AS open FROM Task t JOIN TaskStatus s ON s.id = t.statusId " +
          "WHERE t.assigneeId = ? AND s.isClosed = 0 AND t.deletedAt IS NULL", user.id);
        json(res, 200, { name: user.name, open: row.open });
      }],
    ],
    staticDir: new URL("./ui", import.meta.url).pathname,  // a page, inside the app
  };
}

O código e os comentários dos plugins são em inglês, como a documentação; as páginas traduzem-se nas cinco línguas do KeelOps com um único mecanismo, fornecido pelo SDK.

As regras

Dentro do processo, dentro das regras.

Base de dados vedada

As leituras passam por uma ligação que não sabe escrever; as escritas só nas tabelas do plugin, e o portão lê cada instrução antes de a deixar passar.

A sessão do KeelOps

Cada rota passa pela guarda de sessão do núcleo. Os clientes do portal não chegam aos plugins, e um plugin mostra apenas o que a pessoa pode ver.

Tudo pelo SDK

Nenhum acesso direto à base de dados, ao ambiente do servidor ou aos modelos: um teste no núcleo lê o código-fonte de cada plugin e para num import proibido.

Liga-se e desliga-se

Na página Sistema, o administrador vê versão, licença e descrição de cada plugin e desliga-o sem reiniciar. Desligado, desaparece; os seus dados ficam.

A documentação.

Guias passo a passo, exemplos, as regras e a referência completa da API, em onze capítulos. Está em inglês, a língua de quem escreve código.