extensaoAtividadesJS
Extensão independente, inspirada no fluxo do Frontend Teams Cup. Versão inicial para VS Code Desktop local no Windows, com JavaScript sem dependências de execução. Não altera a extensão original.
Estado da entrega
Versão 0.2.0: o servidor Python está implementado em server/, pronto para upload manual. Leia server/DEPLOY.md. A extensão usa o prefixo fixo /atividades-js/, envia inventário de extensões e respeita fechamento/reabertura pelo professor. As rotas do serviço antigo permanecem separadas.
O botão abre diretamente o Google no navegador, usando OAuth Desktop com PKCE e o cliente autorizado pelo responsável. O aluno não configura servidor. A API Python valida a conta em /atividades-js/api/login. O backend está implementado, mas sua instalação e a homologação no domínio ainda precisam ser realizadas.
Uso
- Instale o VSIX ou abra esta pasta no VS Code e execute uma janela de desenvolvimento com
code --extensionDevelopmentPath="CAMINHO_ABSOLUTO_DA_PASTA".
- No painel Atividade JS, clique em Entrar com Google. O navegador abre a seleção de conta.
- Depois do login, informe o código da atividade solicitado pela extensão. Sua conta permanece conectada para tentar outro código, se necessário.
- O código aceita de 1 a 8 letras/números. Leia e confirme o aviso de monitoramento para iniciar. Não há formulário de configuração.
- O servidor retorna o modelo
script.js da atividade. O arquivo aparece na seção Atividade JS do Explorer e abre no editor. Entre em tela cheia com F11; a edição libera após confirmação de foco e tela cheia.
- Execute Atividades JS: Ver relatório de foco ou clique no indicador da barra de status.
- Execute Atividades JS: Finalizar e enviar. Aguarde a confirmação de recebimento.
Comportamento
| Requisito |
Implementação |
| Google/Gmail |
Navegador → Google → retorno local → código → API. PKCE/state por tentativa; tokens pessoais somente em memória. |
| Código da atividade |
Expressão ^[A-Z0-9]{1,8}$. |
| Foco a cada 2 s |
Heartbeat com focused e indicação do editor selecionado. Mudanças de janela são registradas imediatamente, mesmo entre heartbeats. |
| Relatório |
Horário de saída/retorno, duração por intervalo, quantidade de saídas e tempo acumulado. Inclui saída ainda em andamento. |
| Arquivos a cada 5 s |
Snapshot completo do único arquivo autorizado, script.js, incluindo alterações ainda não salvas; SHA-256 e sequência. |
| Tela cheia a cada 3 s |
Consulta Windows da janela em primeiro plano, tamanho do monitor e estilo de janela. Maximizar normalmente não basta. Falha da consulta mantém bloqueado. |
| Bloqueio |
Permissão somente leitura, comando do editor, rejeição de gravações e reversão de mudanças recebidas quando bloqueado. Perda de foco bloqueia imediatamente. |
| Área de transferência |
Limpa texto ao sair e retornar ao VS Code; registra sucesso ou falha. Não apaga histórico Win+V, sincronização ou gerenciadores externos. |
| IP, MAC e rede |
Interfaces locais não loopback (IPv4/IPv6/MAC) e perfis do Windows na abertura; atualização a cada 30 s quando mudam. IP público deve ser extraído pelo servidor. |
| Apenas script.js |
FileSystemProvider virtual por instância; recusa criação, exclusão e renomeação. Limite de 1 MiB em UTF-8. |
| Pasta .vscode |
Não pode ser criada na pasta virtual. Nenhuma pasta real preexistente é apagada. |
| Outra instância |
URI aleatória por sessão; outra instância não tem os bytes da pasta virtual. Exclusividade real exige lease no backend. |
| Extensões |
Inventário de IDs, versões e estado ativo na abertura, quando a lista muda e a cada 10 s se houver alteração de estado. |
| Prova fechada |
O backend recusa snapshots; o heartbeat informa o fechamento e a edição bloqueia. A reabertura é percebida no próximo heartbeat. |
Os intervalos são agendamentos de melhor esforço, sujeitos à carga do computador e latência. Requisições possuem prazo de 10 s, não se sobrepõem por tipo e não seguem redirecionamentos. Após 15 s sem resposta do servidor, a edição bloqueia. A consulta de tela cheia expira após 6,5 s. Não há garantias de tempo real.
A pasta da atividade é virtual, não uma pasta comum no disco. Isso impede que um editor externo abra o mesmo script.js por caminho físico. Backups de recuperação e relatório ficam no armazenamento privado da extensão (globalStorageUri), fora da pasta da prova. Eles não são reaplicados automaticamente ao editor.
Interrupções e recuperação
Eventos são gravados em <instanceId>.events.jsonl; cópia de recuperação em <instanceId>.script.js, atualizada a cada snapshot e no encerramento normal. A cópia local não é criptografada e não é prova inviolável. A janela pode ser fechada abruptamente antes da última gravação.
Enquanto a janela permanece aberta, eventos pendentes são reenviados com IDs estáveis. Com 10.000 eventos pendentes, novos heartbeats locais deixam de ser acumulados; transições de foco continuam registradas e a ausência de heartbeat deve aparecer no servidor. Não há limite de duração de prova imposto pelo cliente: o backend deve aplicar prazo.
Ao reiniciar o VS Code, não se retoma silenciosamente uma prova: a instância anterior expira no servidor e o professor autoriza a retomada. Sem sessão ativa, o comando de relatório abre a pasta de armazenamento numa nova janela. O professor deve conciliar a cópia local com a última versão aceita no servidor. Não há reenvio automático do journal de uma execução anterior.
Validação e empacotamento
npm run check
npm test
# Instalação necessária apenas para empacotar em máquina sem vsce:
npm install
npm run package
Confira SEGURANCA.md antes de usar em avaliação. Testes automatizados não substituem o roteiro manual com backend real, F11, múltiplos monitores, perda de rede e fechamento do VS Code.
Resultado da validação desta entrega
Verificação de sintaxe e dez testes automatizados aprovados, incluindo uma sessão com API/VS Code simulados. Login Google e backend reais ainda não foram homologados. A execução de native/probe.ps1 neste computador foi recusada pelo AuthorizationManager do PowerShell; por isso a detecção real de tela cheia não foi validada. A instituição precisa distribuir o script assinado/confiável conforme sua política de execução. A extensão não altera nem contorna essa política e permanece bloqueada quando a consulta nativa falha.
Manutenção da distribuição
src/deployment.json contém o servidor fixo e o cliente OAuth Desktop original, incluindo seu client secret, cuja reutilização foi autorizada pelo responsável. Esses dados fazem parte do VSIX; o aluno não configura nada. Clientes Desktop são públicos e não podem manter esse valor confidencial: a proteção do fluxo depende de PKCE/state, validação Google e autenticação da API. Tokens pessoais ficam somente em memória. A extensão original não precisa estar instalada.