Ir para o conteúdo

Referência do SDK de frontend para plugins ​

O código de frontend dos plugins é executado em um iframe com isolamento de sandbox. Este documento é a referência de baixo nível. Para uma introdução de alto nível, consulte README.md.


Modelo de segurança ​

PropriedadeValor
Sandbox do iframeSomente allow-scripts (sem allow-same-origin)
CSP script-srcRestringida por nonce; somente o script do ponto de entrada é carregado
CSP connect-src'self' - o plugin pode enviar POST para /plugins/{id}/api/* e consultar periodicamente /plugins/{id}/events/poll
CSP default-src'none'
Acesso ao DOM da página principalBloqueado (sem allow-same-origin)
Cookies de sessão do OgmaInacessíveis ao plugin
Comunicação entre pluginsNão disponível

As chamadas de dados da ponte são autorizadas no servidor a cada requisição; a interface do aplicativo principal trata as ações de exibição e navegação. O cache de permissões mostrado na aba Permissões é apenas informativo; ele não controla o acesso aos dados.


Protocolo da ponte ​

O JavaScript do plugin se comunica com o aplicativo principal do Ogma por postMessage. O componente principal fica em PluginsView.vue e trata mensagens bridge_request.

Envelope de requisição ​

ts
interface BridgeRequest {
  type: 'bridge_request'
  sessionId: string     // nonce assigned when the bridge is set up; prevents stale messages
  requestId: string     // caller-generated correlation id (max 128 chars)
  command: string       // e.g. "ogma.requests.get"
  payload?: unknown     // command-specific input
}

Tamanho total máximo da mensagem: 65 536 bytes.

Envelope de resposta ​

ts
interface BridgeResponse {
  type: 'bridge_response'
  requestId: string
  ok: boolean
  result?: unknown
  error?: string
  code?: string
}

Não envie manualmente requisições brutas à ponte por postMessage. Use o objeto global ogmaSDK:

js
ogmaSDK.ready(function(sdk) {
  sdk.meta.get().then(function(meta) {
    sdk.log.info("running as " + meta.pluginId);
  });
});

O SDK encapsula toda a comunicação da ponte e trata a correlação de requisições, o gerenciamento de sessionId e a resolução de promessas.


Referência de comandos ​

ogma.meta.get ​

Não é necessário payload.

Retorna { pluginId, packageId, name, version, ogmaVersion }.

ogma.requests.get ​

Payload: { id: string }

Retorna uma entrada HTTP projetada. Campos: id, method, host, port, path, query, req_len, resp_status, resp_len, roundtrip_ms, created_at. Essa projeção não inclui cabeçalhos nem bytes do corpo.

Exige: read_http_history (concedida automaticamente).

ogma.requests.getRaw ​

Payload: { id: string }. Faça a chamada por sdk.requests.getRaw(id).

Retorna requestBodyBase64, responseBodyBase64, seus comprimentos decodificados (requestBodyLength, responseBodyLength), requestBodyTruncated, responseBodyTruncated e maxBodyBytes. Apesar do nome, essa operação retorna bytes do corpo, não uma mensagem HTTP bruta completa. As codificações de conteúdo compatíveis são decodificadas antes da projeção. Cada corpo é limitado a 256 KiB; verifique os indicadores de truncamento antes de processar um recurso completo.

Exige: read_http_history (concedida automaticamente).

Payload: { limit?: number, offset?: number, query?: string }

query aceita expressões de filtro HTTPQL. Valor máximo de limit: 20. Retorna { items: [...], total: number, limit: number, offset: number }.

Exige: read_http_history (concedida automaticamente).

ogma.findings.list ​

Payload: { limit?: number, offset?: number }

Retorna { items: [...], total: number, limit: number, offset: number }, com no máximo 20 achados por página. Os itens são resumos; os campos incluem id, title, severity, status, reporter, tags e created_at.

Exige: read_findings (concedida automaticamente).

ogma.scope.getActive ​

Sem payload. Retorna a predefinição de escopo ativa ou null.

Exige: read_scope (concedida automaticamente).

ogma.projects.getCurrent ​

Sem payload. Retorna { id, name, status } ou null.

Exige: read_projects (concedida automaticamente).

ogma.log ​

Payload: { message: string }

Grava no buffer de logs do plugin.

ogma.ui.resize ​

Payload: { height: number } (máximo 2000)

Solicita ao aplicativo principal que defina a altura do iframe.

ogma.ui.sidebar.registerItem ​

Payload: { name: string, path: string } (nome de até 64 caracteres, caminho de até 256 caracteres)

Registra a navegação dentro do painel do plugin. Máximo de 20 itens por plugin. Registre os corpos das páginas correspondentes com sdk.navigation.addPage(path, { title, body }); escolher o item exibe essa página dentro do iframe, não uma nova rota de nível superior do espaço de trabalho do Ogma.

ogma.backend.call ​

Payload: { method: string, args: unknown[] }

Chama um handler RPC do backend registrado por sdk.api.register(method, fn). O comprimento máximo do nome do método é de 64 caracteres.

Retorna o que o handler do backend tiver retornado, serializado como JSON.

ogma.backend.onEvent ​

Payload: não é necessário.

Apenas confirma o recebimento. Use ogma.events.poll para obter os eventos de fato.

ogma.events.poll ​

Payload: { since: number } (índice da última consulta; comece em 0)

Retorna { events: [{ event: string, args: unknown[] }], next_since: number }.

ogma.navigation.addPage ​

Payload: { path: string, title?: string }

A ponte confirma o recebimento do caminho da página. O SDK injetado também aceita { body: HTMLElement } como opção de sdk.navigation.addPage(path, options), insere o corpo dentro do iframe e alterna a visibilidade da página quando o aplicativo principal seleciona o item correspondente da barra lateral. O nó DOM permanece local; ele não é serializado pela ponte.

ogma.window.showToast ​

Payload: { message: string, variant?: "info"|"success"|"warning"|"error", duration?: number }

Exibe uma notificação temporária no painel do plugin. Duração em ms (máximo 10000, padrão 3000).

ogma.commands.register ​

Payload: { id: string, name: string }

Registra o comando do plugin no store de comandos do aplicativo principal. A execução pelo aplicativo principal envia de volta ao iframe uma mensagem plugin_command com commandId e contexto; o plugin deve fornecer o callback correspondente. O registro, por si só, não executa o comando.

ogma.menu.registerItem ​

Payload: { type?: "Request" | "RequestRow" | "Response", commandId: string, label?: string }

Registra um item de menu de contexto vinculado a um comando do plugin. Registre o comando primeiro. O rótulo usa por padrão o nome registrado do comando e, na ausência dele, seu ID; se type for omitido, o padrão é Request. A ponte do aplicativo principal não utiliza leadingIcon.

Funções auxiliares de tema ​

O SDK injetado também oferece sdk.theme.get() e sdk.theme.onChange(callback). Essas funções leem o tema do iframe e se inscrevem nas atualizações de tema do aplicativo principal sem um comando separado de dados da ponte. Use-as para manter a interface do plugin consistente com a aparência clara/escura do Ogma.


Códigos de erro ​

CódigoSignificado
PERMISSION_DENIEDO plugin não tem a permissão exigida.
PLUGIN_DISABLEDO plugin não está habilitado no momento.
UNKNOWN_COMMANDO comando não está na lista de comandos compatíveis.
INVALID_PAYLOADUm campo obrigatório do payload está ausente ou tem o tipo incorreto.
NOT_FOUNDO recurso solicitado não existe.
LIMIT_EXCEEDEDUm limite de quantidade por plugin foi atingido (por exemplo, de itens da barra lateral).
SERVER_ERRORErro interno. Verifique os logs do plugin.

Lista de comandos compatíveis ​

ogma.meta.get, ogma.log, ogma.ui.resize, ogma.ui.sidebar.registerItem, ogma.requests.get, ogma.requests.getRaw, ogma.requests.search, ogma.findings.list, ogma.scope.getActive, ogma.projects.getCurrent, ogma.backend.call, ogma.backend.onEvent, ogma.events.poll, ogma.navigation.addPage, ogma.window.showToast, ogma.commands.register, ogma.menu.registerItem.

Software proprietário. Todos os direitos reservados.