Releases: synesis-lang/synesis-vscode
Releases · synesis-lang/synesis-vscode
New graph view options and minor fixes
[0.6.1] - 2026-06-23
Changed
- README translated to English and rewritten for qualitative researchers.
[0.6.0] - 2026-06-22
Fixed
-
Zoom out corta a borda esquerda do grafo (
src/viewers/graphViewer.js)updateZoomagora resetascrollLeft/scrollTopdo wrapper após cada redimensionamento do SVG.- Antes: ao fazer zoom-out depois de rolar para a direita, a borda esquerda ficava fora da área visível.
-
Título do grafo por item mostra arquivo e linha (
src/viewers/graphViewer.js)- Painel exibe
Item: @bibref L<linha> (<arquivo.syn>)em vez deItem: @bibref #N— facilita verificar se o item correto está sendo consultado.
- Painel exibe
-
Show Relation Graph per Item — "No ITEM block found" (
src/viewers/graphViewer.js)_extractItemInfoFromSymbols: ITEMs filhos de um SOURCE são nomeados"ITEM #N"pelo LSP (sem bibref). A função agora sobe o stack de símbolos para encontrar o símbolo paiSOURCE @bibrefe extrai o bibref de lá.- Antes: grafo por item nunca funcionava em arquivos que contivessem um bloco
SOURCE.
-
Show Relation Graph per File — "Sem relações no arquivo" (
synesis-lsp/synesis_lsp/graph.py)- Fix no servidor LSP:
_triples_for_fileagora verifica tambémitem.location.file, não apenassource.location.file. Requer synesis-lsp com a correção correspondente.
- Fix no servidor LSP:
-
Zoom do Graph Viewer não enquadra o grafo corretamente (
src/viewers/graphViewer.js)
Graph Viewer zoom fixed.
[0.5.30] - 2026-04-29
Fixed
- Zoom do Graph Viewer (
src/viewers/graphViewer.js)- Causa raiz: o
<script>do webview não tinha atributononce, fazendo a CSP (script-src 'nonce-{nonce}') bloquear silenciosamente todo o JavaScript customizado — botões +/−/Reset e scroll wheel não respondiam. - Atributo
nonce="${nonce}"adicionado ao<script>tag principal. - Atributos
onclick="..."substituídos poridnos três botões +addEventListenerno script — inline event handlers são bloqueados por CSP mesmo com nonce. svg.getBBox()envolvido emrequestAnimationFramepara garantir que o SVG esteja pintado antes da leitura de dimensões no auto-fit inicial; guardsvgWidth > 0 && svgHeight > 0adicionado para evitar cálculo com dimensões nulas.
- Causa raiz: o
Suport for revision type file (.synr)
[0.5.29] - 2026-04-25
Added
- Suporte a
.synr(formato de revisão do pipeline ACT) (package.json)- A extensão
.synrfoi adicionada à lista de extensões da linguagemsynesis. - Arquivos
.synrrecebem syntax highlighting, semantic tokens e associação de ícone idênticos aos arquivos.syn— o formato é sintaticamente compatível (comentários# REVISIONe# $key: valuesão reconhecidos comocomment.line.synesis). - Nenhuma mudança no atalho Ctrl+Shift+I (
synesis-coder item) — contrato com a extensão inalterado.
- A extensão
Synesis Coder — encoding UTF-8 no Windows
[0.5.28] - 2026-04-01
Fixed
- Synesis Coder — encoding UTF-8 no Windows (
src/services/coderService.js)execFileagora injetaPYTHONUTF8=1ePYTHONIOENCODING=utf-8no
ambiente do processo filho, garantindo que o Python escreva stdout em UTF-8
mesmo em sistemas com code page cp1252 — corrige corrupção de acentos em
textos em português retornados pelosynesis-coder item
Sidebar adjustments
[0.5.27] - 2026-03-26
Changed
- Sidebar — redesign minimalista de todos os 5 explorers
- Redução de ruído textual: contadores verbosos (
N items in N files,N uses,N chains) substituídos por badges(N)nadescription. - Caminhos de arquivo removidos dos labels dos filhos; substituídos por
Ln X— nome do arquivo movido para otooltip(visível ao passar o mouse). - References: nó raiz
@bibref (N), filhoLn X (N). - Codes: nó raiz
código (N), filhoLn Xcomchainna description apenas quando aplicável;not in ontologypreservado no tooltip do nó raiz. - Relations: nó raiz
RELAÇÃO (N), filhoA → BcomLn Xna description. - Ontology Topics: nó pai
tópico (N), nó folhaconceito Ln X. - Ontology Annotations: nó raiz
código (N) · Ln X(quando definido na ontologia) ou(N) · not in ontology, filhoLn Xcomchainquando aplicável.
- Redução de ruído textual: contadores verbosos (
- Codes —
usageCountcorrigido: contagem reflete ocorrências individuais; ordenação primária alfabética, secundária por frequência decrescente.
Sidebar improvements
[0.5.26] - 2026-03-26
Changed
- Sidebar — todas as 5 views melhoradas
- References: descrição
N items in N files(singular/plural), tooltip com título da referência, cabeçalhoReferences (N) - Codes: ordenação por frequência de uso decrescente, descrição
N usescom sufixo· not in ontologyquando não definido na ontologia, contexto de ocorrência exibecode field/chain · fieldName, cabeçalhoCodes (N) - Relations: descrição
N chainsnos itens raiz, seta unicode→nos triplets, descriçãoarquivo:linhanos triplets filhos, cabeçalhoRelations (N) - Ontology Topics: nós pai com ícone
tage descriçãoN concepts, nós folha com íconepine descriçãoarquivo:linha, cabeçalhoOntology Topics (N) - Ontology: descrição
N uses · arquivo:linha(quando definido na ontologia) ouN uses · not in ontology, contexto de ocorrência exibecode field/chain · fieldName, cabeçalhoOntology (N)
- References: descrição
- References: título da referência bibliográfica incluído no payload LSP e exibido como tooltip
[0.5.25] - 2026-03-23
Added
- Synesis Coder integration —
synesis.coder.codeSelectioncommand
integratessynesis-coder itemmode directly into the editor- Context menu: right-click selected text in a
.synfile →
"Synesis: Code Selection" generates an ITEM block via thesynesis-coderCLI
and replaces the selection atomically - Keyboard shortcut:
Ctrl+Shift+I/Cmd+Shift+I(when editor has
selection in a.synfile) - Auto-detection of bibref: reads the SOURCE/ITEM block under the cursor
usingSynesisParser; falls back to the nearest preceding block; prompts
the user manually only when no block is found - Progress notification with Cancel button — calls
synesis-coder item
as a subprocess viachild_process.execFile(shell-safe for text with
quotes, newlines, and special characters) - Cancellation support: Cancel button kills the subprocess via
CancellationToken.onCancellationRequested → child.kill() - Friendly error when
synesis-coderis not installed (ENOENT→ message
suggestingpip install synesis-coder)
- Context menu: right-click selected text in a
- New configuration:
synesisExplorer.coder.path(default:"synesis-coder")
— path to thesynesis-coderexecutable for non-default installations - New module:
src/services/coderService.js—CoderServiceclass
encapsulating bibref detection, CLI invocation, and editor replacement
Better performance and LSP integration
[0.5.24] - 2026-03-15
Fixed
WORD:dentro de GUIDELINES ainda destacado como campo (syntaxes/synesis.tmLanguage.json)match: ".+"emguidelines_contentusa^.+$para ancorar explicitamente ao início da linha.begindoguidelines_blockrelaxado de\s*$para\s*(?:#.*)?\r?$— aceita comentários inline apósGUIDELINESe trata CRLF (Windows) corretamente, evitando falha silenciosa na ativação do bloco.
[0.5.23] - 2026-03-15
Fixed
- Conteúdo de GUIDELINES ainda destacado como keywords/chains/campos (
syntaxes/synesis.tmLanguage.json)- Defesa em profundidade:
#guidelines_blockagora incluído em todos os contextos (root, SOURCE, ITEM, ONTOLOGY, FIELD) — antes só estava emmeta.block.field.synesis. - Novo
#guidelines_contentcommatch: ".+"consome cada linha inteira comostring.unquoted.guidelines.synesis, impedindo qualquer sub-padrão (keywords, chains, fields) de casar dentro do bloco. - Cor do conteúdo: itálico neutro (
#a9b1d6dark /#6e6a86light) — texto instrucional, não código.
- Defesa em profundidade:
[0.5.22] - 2026-03-15
Fixed
- Conteúdo de GUIDELINES destacado como campos/keywords (
syntaxes/synesis.tmLanguage.json)- Campos com
begin/end(DESCRIPTION:,SCOPE:, etc.) não tinhamGUIDELINEScomo delimitador de fim — o campo anterior "vazava" e consumia as linhas do bloco GUIDELINES como valor de campo. - Fix: adicionado
|\\s*GUIDELINES\\bao padrãoendde todos os quatro tipos de campo (chain,code,text,generic), forçando o campo a terminar quando a gramática encontra a linhaGUIDELINES.
- Campos com
[0.5.21] - 2026-03-15
Added
- Semantic Tokens ativados nos temas (
themes/synesis-dark-theme.json,themes/synesis-light-theme.json)"semanticHighlighting": trueem ambos os temas — o editor agora aplica colorização AST do LSP."semanticTokenColors"mapeando os 6 tipos do servidor (keyword, variable, property, string, enumMember, namespace) às novas paletas.- TextMate
tokenColorsatualizado para manter consistência como fallback.
- Novas paletas de cores ("Midnight Scholar" dark / "Parchment & Ink" light)
- Dark: fundo
#1a1b26(azul-noite); keywords#bb9af7(rosa-magenta); @bibrefs#e0af68(dourado); campos#7dcfff(azul-celeste); valores#9ece6a(verde-salvia); códigos#2ac3de(turquesa); relações#f7768e(coral). - Light: fundo
#faf4ed(pergaminho); keywords#8839ef(púrpura-real); @bibrefs#df8e1d(âmbar); campos#1e66f5(azul-tinta); valores#40a02b(verde-floresta); códigos#179299(teal); relações#d20f39(vermelho).
- Dark: fundo
- semanticTokenScopes em
package.json— mapeia token types LSP para escopos TextMate, garantindo compatibilidade com temas de terceiros (Dark+, Monokai, etc.). - Configurações de feature toggle (
package.json)synesisExplorer.diagnostics.enabled— habilita/desabilita squiggles de diagnóstico.synesisExplorer.inlayHints.enabled— habilita/desabilita hints inline "(Author, Year)".synesisExplorer.semanticHighlighting.enabled— habilita/desabilita colorização AST.synesisExplorer.completion.autoImportCodes— inclui/exclui códigos ontológicos nas sugestões de autocomplete.
- Middleware LSP (
src/lsp/synesisClient.js)_buildMiddleware()intercepta respostas de diagnostics, inlayHints, semanticTokens e completion de acordo com as configurações do usuário.- Hot-reload: toggles funcionam sem reiniciar a extensão.
- Capability Validation expandida (
extension.js)validateLspCapabilities()agora verifica 11 capabilities (5 required + 6 optional).- Optional features (SignatureHelp, References, CodeActions, SemanticTokens, InlayHints, DocumentHighlight) logadas no Output channel como disponíveis/indisponíveis.
[0.5.20] - 2026-03-15
Fixed
- Syntax highlighting não aplica keywords/fields dentro de GUIDELINES (
syntaxes/synesis.tmLanguage.json)- O bloco
meta.block.field.synesisincluía#keywordse#fieldssem contexto de bloco —CODE:,CHAIN:, etc. dentro de GUIDELINES eram destacados como nome de campo. - Fix: nova regra
guidelines_blockcombegin/endmarcandoGUIDELINES ... END GUIDELINEScomometa.block.guidelines.synesis; o conteúdo interno só aceita#comments, ignorando keywords e fields. Incluída nometa.block.field.synesisantes de#keywords.
- O bloco
[0.5.19] - 2026-03-15
Changed
- Versões LSP e compilador no rodapé (
extension.js)setLspStatus('ready', stats, lspVersion, compilerVersion)agora exibe[LSP v0.14.26 · synesis v0.4.1]diretamente no texto da status bar.- Tooltip inclui
— LSP vX.Y.Z · synesis vX.Y.Zquando versões disponíveis. - Valores provêm de
lsp_version/compiler_versionretornados porsynesis/loadProject(LSP v0.14.26+).
[0.5.18] - 2026-03-15
Fixed
- Bug 2.6: fallback indevido em
synesisClient.js(src/lsp/synesisClient.js)- O catch em
_actualSendRequestfazia fallback paraclient.sendRequest()em qualquer erro, não apenas-32601 Method Not Found. - Consequência: erros de runtime do LSP eram mascarados como "LSP method not supported", disparando
onLspIncompatiblee exibindo "LSP Incompatível" na barra de status. - Fix: condição alterada para
this._isMethodNotFound(error)— o fallback só ocorre quando o servidor LSP realmente não registrou o método comoexecuteCommand.
- O catch em
[0.5.17] - 2026-03-15
Changed
- Performance — Fase 6: esbuild minification em produção (
esbuild.js)- Adicionado
minify: !isWatch— bundle é minificado emnpm run build/vscode:prepublish, mas não durante--watch(dev). - Source maps continuam gerados em ambos os modos (
sourcemap: true).
- Adicionado
[0.5.16] - 2026-03-15
Changed
- Performance — Fase 5: Mermaid.js local + CSP (
src/viewers/graphViewer.js,extension.js,media/mermaid.min.js)media/mermaid.min.js(~3.2 MB) adicionado como asset local da extensão — grafo funciona sem conexão de rede.GraphVieweraceitaextensionUricomo segundo argumento;extension.jspassacontext.extensionUri.showGraphPaneldefinelocalResourceRoots: [extensionUri/media]para autorizar acesso ao asset.getWebviewContentadiciona<meta http-equiv="Content-Security-Policy">com nonce por requisição:- Asset local:
script-src 'nonce-{nonce}'(sem CDN permitido) - Fallback CDN (se
extensionUrinão disponível):script-src 'nonce-{nonce}' https://cdn.jsdelivr.net
- Asset local:
<link href="https://rsms.me/inter/inter.css">removido — fonte Inter substituída porsystem-ui, sans-serif.getNonce()adicionado como função utilitária de módulo (32 chars alfanuméricos).
[0.5.15] - 2026-03-15
Changed
- Performance — Fase 4:
synesis/getExcerptsLSP + fallback local (src/viewers/abstractViewer.js,src/services/dataService.js,extension.js)AbstractVieweragora aceitadataServicecomo terceiro argumento do construtor._extractExcerpts()tenta LSP primeiro viadataService.getExcerpts(bibref)(novo métodosynesis/getExcerptsdo LSP v0.14.25); se bem-sucedido, monta excerpts a partir dos dados já em memória no servidor sem nenhum I/O de disco na extensão.- Novo método
_buildExcerptsFromLspItems()converte o formato LSP (extra_fields,codes,chains) para o mesmo shape de excerpts da lógica original, usando otemplateManagerpara identificar os campos QUOTATION/MEMO/CHAIN/CODE do template do projeto. - Método
_extractExcerptsLocal()preserva integralmente a lógica anterior (leitura de arquivos + regex) como fallback: acionado se LSP não disponível, retornar null, ou lançar exceção. DataServiceeLspDataProviderrecebem métodogetExcerpts(bibref).- Requer
synesis-lsp >= 0.14.25.
[0.5.14] - 2026-03-15
Changed
- Performance — Fase 3: Remover fallback local do graphViewer (
src/viewers/graphViewer.js)- Removidos
_findBibrefLocal()(33 linhas),this.parser = new SynesisParser()e orequire('../parsers/synesisParser'). _findBibref()agora confia exclusivamente no LSP (_findBibrefViaLspviavscode.executeDocumentSymbolProvider).- Se o LSP não estiver pronto, exibe mensagem clara ("Synesis LSP is not ready. Cannot resolve reference.") ao invés de fallback silencioso com parsing regex local.
synesisParser.jspermanece no projeto pois ainda é usado porabstractViewer.js(Fase 4).
- Removidos
[0.5.13] - 2026-03-15
Changed
- Performance — Fase 2: Cache de responses LSP + deduplicação de requests (
src/lsp/synesisClient.js,extension.js)SynesisLspClientagora mantém um cache em memória (TTL 5s) para respostas dos métodossynesis/*(excetosynesis/loadProject, que sempre vai ao servidor).- Requests idênticos simultâneos (mesmo método + params) são coalescidos numa única Promise em voo — nenhum request duplicado sai pelo stdio enquanto o primeiro ainda não retornou.
invalidateCache()adicionado ao cliente e chamado emrunLspLoadProject()antes de cadasynesis/loadProject, garantindo que os refreshes subsequentes sempre buscam dados frescos após recompilação.- Erros de requests cacheáveis não são armazenados — em caso de falha a entrada não é criada, permitindo nova tentativa no próximo
refresh(). - Efeito prático: os 5 calls de
refreshAllExplorers()disparados apósloadProjectresultam em 5 requests reais na primeira vez; chamadas subsequentes dentro do TTL (ex: segundorefreshAllExplorers()por debounce tardio ou comando manual) retornam do cache sem overhead de stdio.
[0.5.12] - 2026-03-15
Changed
- Performance — Fase 1: Debounce factory + refresh seletivo por tipo de arquivo (
extension.js)- Substituído o debounce timer único compartilhado por instâncias
Debouncerindependentes, eliminando o risco de cancelamento cruzado...
- Substituído o debounce timer único compartilhado por instâncias
GUIDELINES block implementation
[0.5.11] - 2026-03-06
Added
syntaxes/synesis.tmLanguage.json: keywordGUIDELINESadicionado ao grupo
keyword.control.field.synesis, aplicando syntax highlighting ao bloco
GUIDELINES...END GUIDELINESdentro deFIELD...END FIELD.src/core/templateManager.js: campoguidelinesextraído defieldDefe
incluído no field registry viabuildFieldRegistry(), tornando o conteúdo
das guidelines disponível para consumidores da extension.
Several LSP integration fixes
[0.5.10] - 2026-02-06 - Consolidate changes since version 0.4.1
Fixed
- Code Explorer and Ontology (Annotations) refresh now detect rename changes reliably by using a full data hash and avoiding premature cache clears.
- Ontology Topics refresh now detects changes reliably using a full tree hash to prevent stale results.
Removed
- Removed "Rename Code" from the Code Explorer context menu (F2 and editor context rename remain).
[0.5.9] - 2026-02-06
Fixed
- CRÍTICO - Rename (F2) scope error:
renameSymbol()chamavarefreshAllExplorers()que estava fora de escopo, causandoReferenceErrorem runtime- Bug:
refreshAllExplorers()definida dentro deactivate(), masrenameSymbol()está no escopo módulo - Resultado: rename aplicava edições mas refresh falhava silenciosamente
- Bug:
- Rename refresh prematuro:
refreshAllExplorers()era chamado antes do LSP recompilar, retornando dados stale- Fix: command handlers agora chamam
runLspLoadProject()após rename bem-sucedido - LSP recompila →
refreshAllExplorers()→ dados frescos garantidos
- Fix: command handlers agora chamam
- Arquivos não salvos após rename:
applyEdit()deixava arquivos em estado dirty, dependendo de auto-save- Fix:
renameSymbol()agora chamaawait vscode.workspace.saveAll(false)apósapplyEdit() - Garante persistência no disco independente de configuração de auto-save
- Fix:
Changed
renameSymbol()assinatura: Agora retornaboolean(true=sucesso, false=falha) ao invés devoid- Remove
refreshAllExplorers()eshowInformationMessage(movidos para command handlers) - Adiciona
saveAll()apósapplyEdit()
- Remove
- Command handlers (
synesis.code.rename,synesis.reference.rename):- Capturam retorno de
renameSymbol() - Se sucesso: chamam
runLspLoadProject()(que já chamarefreshAllExplorers()internamente) - Mostram mensagem de sucesso após refresh completo
- Capturam retorno de
Architecture
- Fluxo correto:
renameSymbol()→applyEdit()→saveAll()→ retorna true → command handler →runLspLoadProject()→ LSP recompila →refreshAllExplorers()→ mensagem ao usuário - Integridade referencial: LSP rename (
rename.py) já cobre CODE, CHAIN e ONTOLOGY via template-driven field discovery - Scope safety: Todas as chamadas de
runLspLoadProject()erefreshAllExplorers()agora dentro do escopo correto deactivate()
Technical Details
- Double-reload é inofensivo:
scheduleLspLoadProject()(1000ms delay) dispara apóssaveAll(), mas explorers usam hash-based caching - Se dados não mudaram, segundo refresh é ignorado (custo: uma chamada LSP extra sem impacto visual)
- Verificar: rename via F2, menu contextual, cancelamento (Esc), e integridade CODE+CHAIN+ONTOLOGY
[0.5.8] - 2026-02-05
Fixed
- CODE duplication in Ontology Annotations Explorer: Campos CODE agora aparecem apenas 1x (não duplicados)
- Bug estava no LSP (synesis-lsp v0.14.14) - faltava deduplicação final em
ontology_annotations.py - Fix foi server-side: adicionada função
_dedupe_occurrences()emontology_annotations.py - Nenhuma alteração necessária na extension
- Bug estava no LSP (synesis-lsp v0.14.14) - faltava deduplicação final em
- Refresh after Rename: Explorers agora atualizam automaticamente após rename bem-sucedido (F2 ou menu contextual)
- Adicionada chamada
refreshAllExplorers()apósapplyEdit()na funçãorenameSymbol() - UX imediato: usuário vê mudanças instantaneamente sem necessidade de salvar arquivo
- Padrão consistente com refresh após save
- Adicionada chamada
Changed
- Dependency: Requer synesis-lsp v0.14.14+ para funcionamento correto de occurrences CODE em Ontology Annotations Explorer
[0.5.7] - 2026-02-05
Fixed
- CHAIN last-occurrence-only bug: Code Explorer agora mostra TODAS as occurrences de códigos em campos CHAIN consecutivos, não apenas a última
- Bug estava no LSP (synesis-lsp v0.14.13) - Phase 2 de
_dedupe_occurrencescolapsava occurrences próximas - Exemplo: CCS_Support aparecendo em 4 chains consecutivas agora mostra todas as 4 occurrences
- Nenhuma alteração necessária na extension - fix foi server-side
- Bug estava no LSP (synesis-lsp v0.14.13) - Phase 2 de
Changed
- Dependency: Requer synesis-lsp v0.14.13+ para funcionamento correto de múltiplas CHAIN occurrences
[0.5.6] - 2026-02-05
Removed
- Client-side deduplication band-aid: Removed
_deduplicateOccurrences()method from DataService that used 10-line proximity heuristic- Method was removing legitimate occurrences and compensating incorrectly for LSP data issues
- Root cause now fixed in synesis-lsp v0.14.12 via server-side deduplication
- Removed calls in
getCodes()(line 111) andgetOntologyAnnotations()(line 241)
Changed
- Data flow architecture: Extension now consumes clean data directly from LSP without client-side deduplication
- Occurrences are used directly after normalization (line number conversion 1-based → 0-based)
- usageCount reflects actual occurrence count from LSP
- Simpler, more maintainable code path
Technical Details
- Removed ~50 lines of code (method + 2 call sites)
- Performance improvement: eliminated O(n²) proximity comparison on every tree refresh
- Data integrity: no risk of legitimate occurrences being filtered out by heuristics
- Requires synesis-lsp v0.14.12+ for correct behavior
[0.5.5] - 2026-02-05
Fixed
- Duplicate Occurrences: Fixed CODE field occurrences showing duplicate entries (line exact + line block ITEM) - now only shows exact lines
- Inconsistent Duplications: Fixed ontologyAnnotationExplorer showing duplicate occurrences similar to CODE fields
- TreeView Refresh Performance: Fixed slow/laggy tree refreshes when clicking items
Performance
- Cache System: Added intelligent caching in all explorers (Code, Reference, Relation, Ontology, OntologyAnnotation) to prevent unnecessary tree refreshes when data hasn't changed
- Hash-based comparison of data before updating tree
- Skips tree rebuild if data identical to previous refresh
- ~80% reduction in unnecessary tree redraws
- Removed File Watchers: Eliminated redundant file system watchers that duplicated onDidSaveTextDocument functionality
- Removed synesisWatcher and all handleFileChange handlers
- Prevents double-refresh on file save
- Optimized Refresh Strategy: Reduced refresh frequency - only updates when file is saved and LSP confirms data changed
- Removed redundant refresh calls on every file change event
- ~70% reduction in refresh operations
- Removed Excessive Logging: Cleaned up console.log statements in DataService and all explorers for production performance
- Removed ~20 debug logs per refresh cycle
- ~90% reduction in console output
- Kept only critical error logging
- Debounced Active Editor Changes: Added 200ms debounce to ontologyAnnotationExplorer refresh on editor changes
- Prevents refresh spam when quickly switching editors
Changed
- DataService: Added
_deduplicateOccurrences()method to remove near-duplicate occurrences (within 10 lines)- Groups by file + context + field
- Keeps most specific line (highest line number)
- Removes duplicates within 10-line range
- All Explorers: Implemented data hash comparison to skip updates when data unchanged
- CodeExplorer:
_hashData()with count + first/last code + occurrence count - ReferenceExplorer:
_hashData()with count + first ref + occurrence count - RelationExplorer:
_hashData()with count + first relation + triplet count - OntologyExplorer:
_hashData()with count + first topic + child count - OntologyAnnotationExplorer:
_hashData()with activeFile + count + first code + occurrence count
- CodeExplorer:
- Extension.js: Removed file watchers, kept only onDidSaveTextDocument with LSP reload for cleaner refresh flow
- Removed
synesisWatcher,handleFileChange,refreshSynFiles,refreshOntologyFiles,refreshProjectFiles - Single refresh path via LSP reload only
- Removed
Technical Details
- Deduplication algorithm: groups occurrences by
file|context|field, sorts by line descending, removes near-duplicates - Cache invalidation: hash changes trigger tree rebuild, otherwise skips
_onDidChangeTreeData.fire() - Memory impact: minimal (~100 bytes per explorer for hash storage)
- Performance gain: O(1) hash comparison vs O(n) tree rebuild
[0.5.4] - 2026-02-04
Fixed
- Code Explorer: Occurrence counts now reflect resolved occurrences (CODE/CHAIN) instead of raw usage totals.
- Go to Definition/Rename: Symbol position resolution now validates the token location before invoking LSP.
[0.5.3] - 2026-02-04
Changed
- File Watchers: Consolidated from 4 separate watchers into 1 unified watcher with glob pattern
**/*.{syn,syno,synp,synt} - Debounced Refresh: Added 300ms debounce to file watcher refreshes to prevent cascade of multiple refreshes when multiple files change
Removed
- Editor Config Modification: Removed automatic
wordWrap: onsetting that was modifying user preferences without consent
Performance
- Reduced file watcher overhead by ~75% (4 watchers → 1)
- Eliminated redundant refresh calls via debouncing
- Removed blocking I/O during activation (editor config write)
[0.5.2] - 2026-02-03
Fixed
- Relations/Codes/Ontology: Improved path normalization (including
file://URIs) to restore navigation to source locations. - Go to Definition: Uses first occurrence with a valid file before falling back to text search.
Changed
- Ontology Explorers: Now consume LSP-only data (
getOntologyTopics/getOntologyAnnotations). - LSP Validation: Added custom method checks for ontology endpoints.
[0.5.1] - 2026-02-03
Fixed
- SynesisParser: Fixed duplicate field handling - fields with same name now correctly accumulate in arrays instead of overwriting
- AbstractViewer: Fi...