dsh-lsp-actions 0.5.19 → 0.5.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +0 -0
  3. package/PRIVACY.md +0 -0
  4. package/README.en.md +520 -0
  5. package/README.es.md +520 -0
  6. package/README.hi.md +520 -0
  7. package/README.md +313 -235
  8. package/README.pt.md +520 -0
  9. package/cordis.patch.yml +0 -0
  10. package/docs/assets/dsh-lsp-actions-demo.gif +0 -0
  11. package/docs/assets/dsh-lsp-actions-demo.png +0 -0
  12. package/docs/assets/dsh-lsp-actions-flow-dark.svg +35 -0
  13. package/docs/assets/dsh-lsp-actions-flow-light.svg +35 -0
  14. package/docs/assets/dsh-lsp-actions-flow-v5-dark.svg +136 -0
  15. package/docs/assets/dsh-lsp-actions-flow-v5-light.svg +136 -0
  16. package/docs/assets/dsh-lsp-actions-flow.svg +0 -0
  17. package/docs/assets/dsh-lsp-actions-hero-en-dark.webp +0 -0
  18. package/docs/assets/dsh-lsp-actions-hero-en-light.webp +0 -0
  19. package/docs/assets/dsh-lsp-actions-hero-zh-dark.webp +0 -0
  20. package/docs/assets/dsh-lsp-actions-hero-zh-light.webp +0 -0
  21. package/docs/assets/dsh-lsp-actions-hero.png +0 -0
  22. package/docs/editor-protocol.md +0 -0
  23. package/docs/editor-protocol.zh-CN.md +0 -0
  24. package/docs/seam-extension-notes.md +0 -0
  25. package/examples/vscode/README.md +0 -0
  26. package/examples/vscode/README.zh-CN.md +0 -0
  27. package/examples/vscode/backend/bin.mjs +0 -0
  28. package/examples/vscode/backend/cordis.yml +0 -0
  29. package/examples/vscode/backend/package.json +0 -0
  30. package/examples/vscode/extension/package.json +0 -0
  31. package/examples/vscode/extension/src/client.js +0 -0
  32. package/examples/vscode/extension/src/extension.js +0 -0
  33. package/examples/vscode/extension/src/views.js +0 -0
  34. package/icon.svg +0 -0
  35. package/lib/abort.d.ts +0 -0
  36. package/lib/abort.d.ts.map +0 -0
  37. package/lib/abort.js +0 -0
  38. package/lib/abort.js.map +0 -0
  39. package/lib/call-id.d.ts +0 -0
  40. package/lib/call-id.d.ts.map +0 -0
  41. package/lib/call-id.js +0 -0
  42. package/lib/call-id.js.map +0 -0
  43. package/lib/client.d.ts +0 -0
  44. package/lib/client.d.ts.map +0 -0
  45. package/lib/client.js +0 -0
  46. package/lib/client.js.map +0 -0
  47. package/lib/connection.d.ts +0 -0
  48. package/lib/connection.d.ts.map +0 -0
  49. package/lib/connection.js +0 -0
  50. package/lib/connection.js.map +0 -0
  51. package/lib/editor/actions.d.ts +0 -0
  52. package/lib/editor/actions.d.ts.map +0 -0
  53. package/lib/editor/actions.js +0 -0
  54. package/lib/editor/actions.js.map +0 -0
  55. package/lib/editor/cache.d.ts +0 -0
  56. package/lib/editor/cache.d.ts.map +0 -0
  57. package/lib/editor/cache.js +0 -0
  58. package/lib/editor/cache.js.map +0 -0
  59. package/lib/editor/server.d.ts +0 -0
  60. package/lib/editor/server.d.ts.map +0 -0
  61. package/lib/editor/server.js +0 -0
  62. package/lib/editor/server.js.map +0 -0
  63. package/lib/editor/service.d.ts +0 -0
  64. package/lib/editor/service.d.ts.map +0 -0
  65. package/lib/editor/service.js +0 -0
  66. package/lib/editor/service.js.map +0 -0
  67. package/lib/editor/transport.d.ts +0 -0
  68. package/lib/editor/transport.d.ts.map +0 -0
  69. package/lib/editor/transport.js +0 -0
  70. package/lib/editor/transport.js.map +0 -0
  71. package/lib/editor/types.d.ts +0 -0
  72. package/lib/editor/types.d.ts.map +0 -0
  73. package/lib/editor/types.js +0 -0
  74. package/lib/editor/types.js.map +0 -0
  75. package/lib/edits.d.ts +0 -0
  76. package/lib/edits.d.ts.map +0 -0
  77. package/lib/edits.js +0 -0
  78. package/lib/edits.js.map +0 -0
  79. package/lib/extension.d.ts +0 -0
  80. package/lib/extension.d.ts.map +0 -0
  81. package/lib/extension.js +0 -0
  82. package/lib/extension.js.map +0 -0
  83. package/lib/extra-tools.d.ts +0 -0
  84. package/lib/extra-tools.d.ts.map +0 -0
  85. package/lib/extra-tools.js +0 -0
  86. package/lib/extra-tools.js.map +0 -0
  87. package/lib/framing.d.ts +0 -0
  88. package/lib/framing.d.ts.map +0 -0
  89. package/lib/framing.js +0 -0
  90. package/lib/framing.js.map +0 -0
  91. package/lib/host.d.ts +0 -0
  92. package/lib/host.d.ts.map +0 -0
  93. package/lib/host.js +0 -0
  94. package/lib/host.js.map +0 -0
  95. package/lib/index.d.ts +0 -0
  96. package/lib/index.d.ts.map +0 -0
  97. package/lib/index.js +0 -0
  98. package/lib/index.js.map +0 -0
  99. package/lib/project.d.ts +0 -0
  100. package/lib/project.d.ts.map +0 -0
  101. package/lib/project.js +0 -0
  102. package/lib/project.js.map +0 -0
  103. package/lib/render.d.ts +0 -0
  104. package/lib/render.d.ts.map +0 -0
  105. package/lib/render.js +0 -0
  106. package/lib/render.js.map +0 -0
  107. package/lib/runner.d.ts +0 -0
  108. package/lib/runner.d.ts.map +0 -0
  109. package/lib/runner.js +0 -0
  110. package/lib/runner.js.map +0 -0
  111. package/lib/sandbox.d.ts +0 -0
  112. package/lib/sandbox.d.ts.map +0 -0
  113. package/lib/sandbox.js +0 -0
  114. package/lib/sandbox.js.map +0 -0
  115. package/lib/seam.d.ts +0 -0
  116. package/lib/seam.d.ts.map +0 -0
  117. package/lib/seam.js +0 -0
  118. package/lib/seam.js.map +0 -0
  119. package/lib/servers.d.ts +0 -0
  120. package/lib/servers.d.ts.map +0 -0
  121. package/lib/servers.js +0 -0
  122. package/lib/servers.js.map +0 -0
  123. package/lib/session-cwd.d.ts +0 -0
  124. package/lib/session-cwd.d.ts.map +0 -0
  125. package/lib/session-cwd.js +0 -0
  126. package/lib/session-cwd.js.map +0 -0
  127. package/lib/tools.d.ts +0 -0
  128. package/lib/tools.d.ts.map +0 -0
  129. package/lib/tools.js +0 -0
  130. package/lib/tools.js.map +0 -0
  131. package/lib/translate.d.ts +0 -0
  132. package/lib/translate.d.ts.map +0 -0
  133. package/lib/translate.js +0 -0
  134. package/lib/translate.js.map +0 -0
  135. package/lib/vocabulary.d.ts +0 -0
  136. package/lib/vocabulary.d.ts.map +0 -0
  137. package/lib/vocabulary.js +0 -0
  138. package/lib/vocabulary.js.map +0 -0
  139. package/package.json +35 -20
  140. package/README-es.md +0 -445
  141. package/README-hi.md +0 -445
  142. package/README-pt.md +0 -445
  143. package/README-zh.md +0 -445
package/README.pt.md ADDED
@@ -0,0 +1,520 @@
1
+ <div align="center">
2
+
3
+ <picture>
4
+ <source media="(prefers-color-scheme: dark)" srcset="docs/assets/dsh-lsp-actions-hero-en-dark.webp">
5
+ <img src="docs/assets/dsh-lsp-actions-hero-en-light.webp" width="100%" alt="dsh-lsp-actions: oito ferramentas e o protocolo do editor compartilham um único ActionRunner; cada ação corresponde a um método real do servidor de linguagem, seis somente leitura e duas que gravam">
6
+ </picture>
7
+
8
+ # dsh-lsp-actions
9
+
10
+ **Deixe seu agente escrever e corrigir código contra servidores de linguagem reais — diagnósticos, formatação, autocompletar, ações de código, símbolos, ajuda de assinatura, dicas inline e renomeação em uma única superfície de ações.**
11
+
12
+ A superfície de ações LSP para o DeepSeek Harness: o seam oficial `ctx.lsp` cobre a navegação, este plugin completa o ciclo de ações e o protocolo estável de ações do editor (`lsp.actions.*`) deixa editores como o VS Code usá-lo como backend de IDE.
13
+
14
+ [Instalar](#instalação-em-três-passos) · [Configuração](#configuração) · [FAQ](#faq) · [简体中文](README.md) · [English](README.en.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
15
+
16
+ [![License](https://img.shields.io/badge/license-Apache--2.0-3366CC?style=flat-square&labelColor=2B3245)](LICENSE)
17
+ [![DSH](https://img.shields.io/badge/DSH-%E2%89%A50.2.1%20%3C0.3.0-4B67B4?style=flat-square&labelColor=2B3245)](#compatibilidade)
18
+ [![npm](https://img.shields.io/npm/v/dsh-lsp-actions?style=flat-square&labelColor=2B3245&color=CB3837)](https://www.npmjs.com/package/dsh-lsp-actions)
19
+ [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-lsp-actions/ci.yml?branch=main&label=CI&style=flat-square&labelColor=2B3245)](https://github.com/PerryLink/dsh-lsp-actions/actions/workflows/ci.yml)
20
+ [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24.9-339933?style=flat-square&labelColor=2B3245)](#compatibilidade)
21
+
22
+ [![Stars](https://img.shields.io/github/stars/PerryLink/dsh-lsp-actions?style=flat-square&labelColor=2B3245)](https://github.com/PerryLink/dsh-lsp-actions/stargazers)
23
+ [![npm downloads](https://img.shields.io/npm/dm/dsh-lsp-actions?style=flat-square&labelColor=2B3245&color=CB3837)](https://www.npmjs.com/package/dsh-lsp-actions)
24
+ [![dshfind](https://dshfind.com/api/badge/PerryLink/dsh-lsp-actions?metric=downloads)](https://dshfind.com/plugins/PerryLink/dsh-lsp-actions?ref=badge)
25
+ [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/PerryLink/dsh-lsp-actions/badge)](https://securityscorecards.dev/viewer/?uri=github.com/PerryLink/dsh-lsp-actions)
26
+ [![DSH Market](https://img.shields.io/badge/DSH_Market-listed-4B67B4?style=flat-square&labelColor=2B3245)](https://dsh.market/)
27
+ [![Gitee](https://img.shields.io/badge/Gitee-mirror-C71D23?style=flat-square&labelColor=2B3245&logo=gitee)](https://gitee.com/perrylink/dsh-lsp-actions)
28
+
29
+ ```sh
30
+ dsh plugin --profile <name> add dsh-lsp-actions
31
+ ```
32
+
33
+ </div>
34
+
35
+ <sub>Plugin da comunidade, sem afiliação com a DeepSeek. Repositório canônico: <https://github.com/PerryLink/dsh-lsp-actions> (o Gitee é um espelho).</sub>
36
+
37
+ ## O que é
38
+
39
+ O `dsh-lsp-actions` conecta o ciclo de feedback de que um agente precisa enquanto escreve código a servidores de linguagem reais: diagnósticos, formatação, autocompletar, ações de código, símbolos, ajuda de assinatura, dicas inline e renomeação são respondidos pelo mesmo servidor que o seu IDE usa (`typescript-language-server`, gopls, pyright, rust-analyzer…). O seam oficial `ctx.lsp` cobre apenas a navegação (ir para definição, referências, implementação, hover); este plugin completa a superfície de ações e a empacota como o protocolo estável de ações do editor (`lsp.actions.*`), para que editores como o VS Code consumam essas capacidades sem implementar LSP por conta própria. Ele monta como uma única linha host (`id: lsp-actions`, `inject: [tools, fs, subprocess]`), inicia os processos de servidor sob demanda e faz cada escrita passar pelo waterfall oficial `fs/write-intent` e pela aprovação do sandbox.
40
+
41
+ <picture>
42
+ <source media="(prefers-color-scheme: dark)" srcset="docs/assets/dsh-lsp-actions-flow-v5-dark.svg">
43
+ <img src="docs/assets/dsh-lsp-actions-flow-v5-light.svg" width="100%" alt="Estrutura do dsh-lsp-actions: ida e volta de requisição e resposta; as ferramentas e o protocolo do editor alimentam o ActionRunner, que prefere o seam ctx.lsp e recorre à rota servers com o cliente stdio embutido; a resposta é normalizada e limitada, e apenas formatação e renomeação passam pela válvula de escrita">
44
+ </picture>
45
+
46
+ ## Instalação em três passos
47
+
48
+ 1. **Instalar** (escolha um canal):
49
+
50
+ ```sh
51
+ # canal git (main mais recente; o script prepare compila lib/ com tsc)
52
+ dsh plugin --profile web add github:PerryLink/dsh-lsp-actions
53
+ # canal npm (versões publicadas)
54
+ dsh plugin --profile web add dsh-lsp-actions
55
+ # canal tarball: pnpm pack neste repositório e então
56
+ dsh plugin --profile web add ./dsh-lsp-actions-<version>.tgz
57
+ ```
58
+
59
+ 2. **Configuração mínima** (o padrão `servers: {}` não ativa nenhum servidor; adicione ao menos uma entrada):
60
+
61
+ ```yaml
62
+ - insert:
63
+ - id: lsp-actions
64
+ name: dsh-lsp-actions
65
+ config:
66
+ servers:
67
+ typescript:
68
+ command: typescript-language-server
69
+ args: ["--stdio"]
70
+ extensionToLanguage: { ".ts": typescript, ".tsx": typescriptreact }
71
+ projectMarkers: ["package.json", "tsconfig.json"]
72
+ ```
73
+
74
+ 3. **Verificar se montou**:
75
+
76
+ ```sh
77
+ dsh --profile web --dump-config | grep -A3 'id: lsp-actions'
78
+ ```
79
+
80
+ ```text
81
+ > lsp_diagnostics a.ts
82
+ a.ts:1:3 [Error] boom [ts 2304]
83
+ ```
84
+
85
+ **Desinstalar**: `dsh plugin --profile web remove dsh-lsp-actions` (ou remova a linha do patch do perfil).
86
+
87
+ <details>
88
+ <summary>Instalar pelo mercado do DSH Desktop</summary>
89
+
90
+ Todos os plugins da PerryLink aparecem no mercado embutido do DSH Desktop: **Mercado → Fontes → Adicionar fonte → cole** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ selecione**. A instalação continua exigindo a verificação de identidade npm do mercado e a sua confirmação.
91
+
92
+ </details>
93
+
94
+ ## Capacidades principais
95
+
96
+ Este plugin completa **apenas a superfície de ações**: a navegação continua vindo do seam oficial `ctx.lsp`, e as ações caem para o cliente stdio mínimo próprio quando o seam está ausente, é de uma versão antiga ou não tem provedor para aquele arquivo.
97
+
98
+ - **Oito ferramentas `lsp_*`** — diagnósticos, formatação, autocompletar, ações de código, símbolos, ajuda de assinatura, dicas inline e renomeação, todas respondidas por servidores de linguagem reais, não por mocks.
99
+ - **Protocolo de ações do editor v1** — uma superfície JSON-RPC estável (`lsp.actions.list` / `lsp.actions.run` / `lsp.events`) que permite a qualquer editor (VS Code primeiro) consumir essas capacidades diretamente.
100
+ - **Verificação com servidor real** — a suíte inclui uma execução real de `typescript-language-server` e um e2e do protocolo do editor; a CI roda em Node 22/24 no Linux, Windows e macOS.
101
+ - **Escritas pela via oficial** — `lsp_format` / `lsp_rename` passam pelo waterfall `fs/write-intent` e pela política de sandbox de cada chamada; uma sessão `read-only` é recusada antes de qualquer ida e volta ao servidor.
102
+ - **Somente leitura por padrão** — seis das oito ferramentas são apenas de referência; só formatação e renomeação alteram.
103
+ - **Limitado** — quantidade de resultados, caracteres, bytes de documento e tempo por chamada têm teto; o cache de diagnósticos é uma LRU limitada.
104
+
105
+ ```text
106
+ lsp_diagnostics / lsp_format / lsp_completion / lsp_code_action /
107
+ lsp_symbols / lsp_signature / lsp_inlay_hints / lsp_rename
108
+ │
109
+ ▼
110
+ ctx.lsp seam (estendido: diagnostics / formatDocument / completion)
111
+ │ ausente · versão antiga · sem provedor para este arquivo
112
+ ▼
113
+ cliente stdio embutido ← tabela servers (ctx.subprocess.spawn + JSON-RPC)
114
+ ```
115
+
116
+ ### Ferramentas e superfícies
117
+
118
+ | Superfície | Tipo | Notas |
119
+ |---|---|---|
120
+ | `lsp_diagnostics` | tool | `<file>` — erros, avisos e dicas do compilador/analisador com severidade, intervalo, mensagem e servidor de origem (somente leitura) |
121
+ | `lsp_format` | tool | `<file> [range?]` — formata um arquivo/seleção pelo servidor de linguagem e aplica, retornando o diff (escreve via `fs/write-intent`) |
122
+ | `lsp_completion` | tool | `<file> <line> <character>` — sugestões de autocompletar em uma posição do cursor, incluindo o texto de inserção (somente leitura) |
123
+ | `lsp_code_action` | tool | `<file> [range?] [only?]` — quickfixes/refatorações verificados pelo servidor com suas edições, para um intervalo ou o primeiro diagnóstico (apenas referência) |
124
+ | `lsp_symbols` | tool | `<query?> <file_path?>` — busca de símbolos por nome em todo o workspace, ou o esqueleto de um arquivo (somente leitura) |
125
+ | `lsp_signature` | tool | `<file> <line> <character>` — ajuda de assinatura (parâmetros e documentação) dentro de uma chamada (somente leitura) |
126
+ | `lsp_inlay_hints` | tool | `<file> [range?]` — anotações de tipo e nomes de parâmetro fornecidos pelo servidor (somente leitura) |
127
+ | `lsp_rename` | tool | `<file> <line> <character> <new_name>` — renomeação verificada pelo servidor, aplicada em todo o workspace com diffs por arquivo (escreve via `fs/write-intent`) |
128
+ | `lsp.actions.*` | protocol | Protocolo de ações do editor v1: `lsp.actions.list` / `lsp.actions.run` / `lsp.events` sobre JSON-RPC |
129
+ | `examples/vscode/` | extension | Extensão do VS Code apenas de UI mais a composição headless do backend à qual se conecta |
130
+
131
+ ### Exemplos
132
+
133
+ Estes são os pontos de entrada reais do plugin; instale uma vez e chame um.
134
+
135
+ **Exemplo detalhado** — comando `lsp_diagnostics`, entrada:
136
+
137
+ ```json
138
+ {
139
+ "file_path": "a.ts"
140
+ }
141
+ ```
142
+
143
+ Saída:
144
+
145
+ ```text
146
+ a.ts:1:3 [Error] boom [ts 2304]
147
+ a.ts:3:1 [Hint] hint
148
+ ```
149
+
150
+ *Observed from `plugins/dsh-lsp-actions/tests/render.spec.ts:32-37 (exact toBe); tool-level no-result render at plugins/dsh-lsp-actions/tests/tools.spec.ts:150-156`*
151
+
152
+ **Ramo de falha** — entrada:
153
+
154
+ ```text
155
+ {"action":"format","requestId":"f1","params":{"filePath":"a.ts","workspaceRoot":"<session-workspace>"}} under a read-only permission preset
156
+ ```
157
+
158
+ Saída:
159
+
160
+ ```text
161
+ {
162
+ "requestId": "f1",
163
+ "action": "format",
164
+ "status": "failed",
165
+ "error": {
166
+ "code": "LSP_ACTION_READ_ONLY",
167
+ "message": "[sandbox: file access denied under read-only mode]\n[sandbox: escalation available — retry this exact operation once with sandbox_permissions (the narrowest wider mode that suffices) + justification; the approval prompt asks the user]"
168
+ }
169
+ }
170
+ ```
171
+
172
+ *Observed from `plugins/dsh-lsp-actions/src/tools.ts:213-223; plugins/dsh-lsp-actions/src/editor/actions.ts:320-330; plugins/dsh-lsp-actions/tests/editor-protocol.spec.ts:305-325`*
173
+
174
+ **Exemplos curtos**: `lsp_format` · `lsp_completion`
175
+
176
+ ### Protocolo de ações do editor v1
177
+
178
+ Com `editor.enabled: true` em uma composição headless dedicada, o `dsh-lsp-actions` serve um protocolo de editor estável sobre JSON-RPC 2.0 delimitado por quebras de linha (o mesmo enquadramento dos transportes oficiais SDK/ACP):
179
+
180
+ | Método | O que faz |
181
+ |---|---|
182
+ | `lsp.actions.list` | Retorna a versão de protocolo `lsp-actions/v1`, o catálogo de ações (`diagnostics.get`, `completion.get`, `quickfix.apply`, `format`, cada uma marcada com `writes`) e as sessões DSH endereçáveis |
183
+ | `lsp.actions.run` | Executa uma ação com um envelope estruturado `{ requestId, action, status, result \| error }`; os erros carregam os códigos estáveis `LSP_ACTION_*` |
184
+ | `lsp.events` | Assina as notificações `lsp.event` em streaming: `diagnostics.updated`, `action.status`, `file.changed`, `sessions.changed` |
185
+
186
+ Todas as ações de escrita (`quickfix.apply`, `format`) passam pelos **presets de permissão e pela aprovação oficiais**: uma sessão `read-only` é recusada com `LSP_ACTION_READ_ONLY` antes de qualquer ida e volta ao servidor, as edições viajam pelo waterfall `fs/write-intent`, e o par de escalonamento `sandbox_permissions` + `justification` é resolvido pelo ask oficial `approveEscalation` (fail-closed quando nenhum respondente pode decidir). Especificação completa do protocolo, bilíngue: [`docs/editor-protocol.md`](docs/editor-protocol.md) · [`docs/editor-protocol.zh-CN.md`](docs/editor-protocol.zh-CN.md).
187
+
188
+ **Versionamento e a promessa de compatibilidade retroativa**
189
+
190
+ - O protocolo é versionado — `lsp.actions.list` retorna `protocol: "lsp-actions/v1"`, `version: 1`. **v1 está congelado:** nomes de campo, ids de ação, tipos de evento e códigos de erro permanecem estáveis para sempre.
191
+ - A evolução é **apenas aditiva**: novas ações, campos e tipos de evento chegam sem subir a versão; a semântica existente nunca muda no lugar; uma mudança incompatível sai sob uma nova versão de `protocol`, que os servidores podem servir em paralelo.
192
+ - Os clientes devem ignorar campos, tipos de evento e ações desconhecidos, e rotear pelo `code` estável do erro, nunca pelo texto da mensagem.
193
+
194
+ **Códigos de erro**
195
+
196
+ Cada falha carrega um `code` estável; modelos e chamadores roteiam pelo código, nunca pelo texto da mensagem.
197
+
198
+ | Código | Significado |
199
+ |---|---|
200
+ | `LSP_ACTION_UNAVAILABLE` | Nenhuma entrada de servidor e nenhum provedor do seam trata este arquivo |
201
+ | `LSP_ACTION_UNSUPPORTED` | O servidor (ou provedor do seam) não anuncia a operação |
202
+ | `LSP_ACTION_SERVER_FAILED` | O servidor falhou (com a cauda do stderr); falhas de inicialização tentam de novo uma vez |
203
+ | `LSP_ACTION_MALFORMED_RESPONSE` | O servidor enviou um payload estruturalmente inválido |
204
+ | `LSP_ACTION_CONFLICT` | O arquivo mudou desde a leitura, ou as edições se sobrepõem / saem do intervalo / saem do workspace |
205
+ | `LSP_ACTION_READ_ONLY` | O modo de sandbox da sessão proíbe a escrita de formatação/renomeação |
206
+ | `LSP_ACTION_WORKSPACE_REQUIRED` | A sessão chamadora não tem um cwd de workspace para enraizar o servidor |
207
+ | `LSP_ACTION_NO_SYMBOL` | O servidor não encontrou nenhum símbolo renomeável na posição do cursor |
208
+ | `LSP_ACTION_UNKNOWN` | Protocolo do editor: id de ação desconhecido, ou nenhuma ação de código corresponde a `title`/`index` |
209
+ | `LSP_ACTION_INVALID_ARGS` | Protocolo do editor: parâmetros de ação malformados |
210
+ | `LSP_ACTION_APPROVAL_UNAVAILABLE` | Protocolo do editor: o caminho de aprovação não conseguiu conceder um modo de sandbox mais amplo (fail-closed) |
211
+ | `LSP_PROTOCOL_VERSION_UNSUPPORTED` | Protocolo do editor: a versão de protocolo declarada não é suportada |
212
+
213
+ ### Extensão do VS Code
214
+
215
+ [`examples/vscode/`](examples/vscode/) traz uma extensão **apenas de UI** (barra lateral com as sessões DSH, a lista de diagnósticos, aplicação de quickfix com um clique, abertura no intervalo e formatação) mais a composição headless do backend (`backend/cordis.yml`) à qual se conecta por JSON-RPC no estilo ACP. A extensão não implementa nada de LSP: cada capacidade e cada byte escrito pertencem ao plugin. Passos de instalação, configurações e o script de gravação do gif de demonstração estão em [`examples/vscode/README.md`](examples/vscode/README.md).
216
+
217
+ ### Arquitetura
218
+
219
+ As ações vão **primeiro ao seam oficial** e caem para o cliente stdio mínimo próprio quando não há correspondência. A extensão do seam está proposta upstream ([`upstream/lsp-action-seam.patch`](upstream/lsp-action-seam.patch), descrição do PR em [`upstream/PR-description.md`](upstream/PR-description.md)); quando ela chegar, o plugin continua funcionando sem mudanças — o cliente embutido simplesmente deixa de ser usado. O cliente embutido permanece como fallback autônomo para a tabela `servers`. O **protocolo do editor** usa o mesmo runner, o mesmo caminho de escrita e a mesma maquinaria de permissões.
220
+
221
+ O backend de ações fica atrás de uma interface pública de provedor — `ActionRunner` (exportada pelo pacote) — implementada pelo runner embutido e aberta a provedores de terceiros: as oito ferramentas consomem apenas essa interface, nunca um cliente concreto. Notas completas de pesquisa e design: [`docs/seam-extension-notes.md`](docs/seam-extension-notes.md).
222
+
223
+ ## Configuração
224
+
225
+ Todos os ajustes são campos Schemastery `Config` (alteráveis pelo cordis.yml). Uma sobrescrita direcionada por id substitui a linha inteira — repita todas as chaves de que precisa. O `cordis.patch.yml` documenta cada chave inline.
226
+
227
+ Chaves mais usadas:
228
+
229
+ | Chave | Padrão | Significado |
230
+ |---|---|---|
231
+ | `servers` | `{}` | Servidores de linguagem nomeados; uma tabela vazia não ativa nenhum |
232
+ | `editor.enabled` | `false` | Serve o protocolo de ações do editor por JSON-RPC stdio (apenas backend headless) |
233
+ | `maxDiagnostics` | `200` | Teto de diagnósticos por resultado |
234
+ | `maxResultChars` | `16000` | Teto do resultado renderizado (caracteres) |
235
+ | `maxDocumentBytes` | `4000000` | Teto de leitura de documento (bytes) |
236
+ | `timeoutMs` | `60000` | Tempo limite por chamada, aplicado pela política de timeout oficial |
237
+
238
+ <details>
239
+ <summary>Tabela de configuração completa (13 chaves)</summary>
240
+
241
+ | Chave | Padrão | Significado |
242
+ |---|---|---|
243
+ | `servers` | `{}` | Servidores de linguagem nomeados; uma tabela vazia não ativa nenhum |
244
+ | `editor.enabled` | `false` | Serve o protocolo de ações do editor por JSON-RPC stdio (apenas backend headless) |
245
+ | `editor.requestTimeoutMs` | `60000` | Orçamento de timeout por execução (ms) do protocolo do editor |
246
+ | `editor.diagnosticsCacheMaxFiles` | `64` | Tamanho do cache LRU de diagnósticos (arquivos) |
247
+ | `maxDiagnostics` | `200` | Teto de diagnósticos por resultado |
248
+ | `maxCompletionItems` | `20` | Teto de itens de autocompletar por resultado |
249
+ | `maxCodeActions` | `50` | Teto de ações de código por resultado |
250
+ | `maxSymbols` | `100` | Teto de resultados de símbolos |
251
+ | `maxSignatures` | `10` | Teto da ajuda de assinatura |
252
+ | `maxInlayHints` | `200` | Teto de dicas inline |
253
+ | `maxResultChars` | `16000` | Teto do resultado renderizado (caracteres) |
254
+ | `maxDocumentBytes` | `4000000` | Teto de leitura de documento (bytes) |
255
+ | `timeoutMs` | `60000` | Tempo limite por chamada, aplicado pela política de timeout oficial |
256
+
257
+ </details>
258
+
259
+ Cada entrada de `servers` é um `LspServerEntry`: `command` (executável resolvido no PATH ao carregar) e `extensionToLanguage` (`".ts"` → `typescript`) são obrigatórios; os opcionais `fileGlobs`, `projectMarkers`, `args`, `env`, `initializationOptions`, `configuration`, `formattingOptions`, `maxMessageBytes`, `maxStderrBytes`, `killGraceMs`, `shutdownTimeoutMs`, `diagnosticsSettleMs`, `diagnosticsDebounceMs` e `idleTimeoutMs` (`0` = manter o processo do servidor vivo, que também é o padrão) ajustam o cliente stdio embutido.
260
+
261
+ O roteamento é determinístico e guiado pela configuração. Cada arquivo pega a primeira correspondência de: **(1)** uma entrada de servidor cujos `fileGlobs` correspondam ao caminho; **(2)** o diretório ancestral mais próximo — subindo até a raiz do workspace — que contenha um arquivo de configuração de projeto listado nos `projectMarkers` de alguma entrada, comparado apenas contra as entradas que também mapeiam a extensão do arquivo; **(3)** a entrada cujo `extensionToLanguage` mapeia a extensão do arquivo, na ordem da configuração. Um workspace com `apps/node-app/{package.json,tsconfig.json,src/main.ts}` e `apps/deno-app/{deno.json,src/main.ts}` serve assim cada `main.ts` a partir do servidor do próprio projeto, sem regra de caminho para manter e sem nada a mudar quando um projeto é adicionado, renomeado ou movido:
262
+
263
+ ```yaml
264
+ servers:
265
+ typescript:
266
+ command: typescript-language-server
267
+ args: ["--stdio"]
268
+ extensionToLanguage: { ".ts": typescript, ".tsx": typescriptreact }
269
+ projectMarkers: ["package.json", "tsconfig.json"]
270
+ deno:
271
+ command: deno
272
+ args: ["lsp"]
273
+ extensionToLanguage: { ".ts": typescript, ".tsx": typescriptreact }
274
+ projectMarkers: ["deno.json", "deno.jsonc"]
275
+ ```
276
+
277
+ Um marcador de projeto só decide entre servidores que já mapeiam a extensão do arquivo (nunca amplia os tipos de arquivo de uma entrada); a caminhada nunca sai da raiz do workspace, e a configuração de projeto de um diretório nunca se aplica a um diretório irmão. O passo **(1)** tem prioridade sobre o marcador de projeto: uma entrada cujos `fileGlobs` correspondam ao caminho ainda vence, então remova os globs de nível de projeto ao adotar `projectMarkers` — um `**/*.ts` remanescente continuará reivindicando esses arquivos. Essas regras regem o cliente stdio embutido; um provedor do seam `ctx.lsp` montado decide o próprio roteamento.
278
+
279
+ ## FAQ
280
+
281
+ <details>
282
+ <summary>O que acontece com o padrão <code>servers: {}</code>? Falha em silêncio?</summary>
283
+
284
+ Nada é silencioso. As oito ferramentas continuam registradas, mas uma chamada falha de forma ruidosa com `LSP_ACTION_UNAVAILABLE` quando nem uma entrada de servidor nem um provedor do seam `ctx.lsp` tratam o arquivo. O seam é resolvido a cada chamada, então um seam montado depois deste plugin é atendido sem recarregar. Com `editor.enabled: false` (o padrão) o protocolo do editor não inicia.
285
+
286
+ </details>
287
+
288
+ <details>
289
+ <summary>Uma escrita pode burlar o sandbox e a aprovação?</summary>
290
+
291
+ Não. Apenas `lsp_format` e `lsp_rename` escrevem, e fazem isso pelo mesmo caminho das ferramentas oficiais `write`/`edit`: o waterfall `fs/write-intent` (observação → escrita protegida → observação) e a política de sandbox de cada chamada. Uma sessão `read-only` é recusada com `LSP_ACTION_READ_ONLY` antes de qualquer ida e volta ao servidor; quando é preciso um modo mais amplo, o par de escalonamento `sandbox_permissions` + `justification` passa pelo ask oficial `approveEscalation` e falha fechado como `LSP_ACTION_APPROVAL_UNAVAILABLE` se nenhum respondente puder decidir.
292
+
293
+ </details>
294
+
295
+ <details>
296
+ <summary>Ele disputa com outros plugins nomes de ferramenta, eventos ou slots?</summary>
297
+
298
+ Não. Cada ferramenta tem namespace, ele não fornece nenhuma chave de serviço, não registra slots de cliente nem prefixos `webServer`, e não muta globais; o patch do bundle apenas `insert`a a própria linha; o único evento compartilhado, `fs/write-intent`, é sempre delegado por `next()` e nunca curto-circuita a cadeia. O argumento ponto a ponto está em «Interoperabilidade com outros plugins DSH».
299
+
300
+ </details>
301
+
302
+ <details>
303
+ <summary>E se o arquivo mudar em disco depois que eu o li?</summary>
304
+
305
+ Ele nunca é sobrescrito. A ação falha com `LSP_ACTION_CONFLICT` quando o arquivo mudou desde a leitura; edições sobrepostas, fora do intervalo ou fora do workspace conflitam do mesmo jeito. `lsp_rename` pré-verifica cada arquivo afetado antes da primeira escrita.
306
+
307
+ </details>
308
+
309
+ <details>
310
+ <summary>Qual é o custo de recursos?</summary>
311
+
312
+ Os processos de servidor são iniciados sob demanda e cada instância mantém seus documentos residentes até o processo ser recolhido; `idleTimeoutMs` é `0` por padrão (permanecer vivo), e um valor positivo recolhe a instância quando ociosa. Quantidade de resultados, caracteres, bytes de documento e duração total têm teto por chamada; o cache de diagnósticos do protocolo do editor é uma LRU limitada (`editor.diagnosticsCacheMaxFiles`); o plugin não faz nenhuma requisição de rede.
313
+
314
+ </details>
315
+
316
+ ## Limites de segurança
317
+
318
+ - **Somente leitura por padrão.** Seis das oito ferramentas são apenas de referência; só `lsp_format` e `lsp_rename` alteram, e o fazem como mutações reais `write`/`edit`.
319
+ - **Seams oficiais, não reimplementados.** Cada byte passa pelo waterfall `fs/write-intent` (observação → escrita protegida → observação) e pela política de sandbox de cada chamada; o escalonamento corresponde às ferramentas oficiais `write`/`edit`.
320
+ - **Falha ruidosa, rápida e estruturada.** `servers` vazio + sem seam `ctx.lsp` → `LSP_ACTION_UNAVAILABLE`; sessões somente leitura → `LSP_ACTION_READ_ONLY` antes de qualquer ida e volta ao servidor; formas de comando são reportadas e nunca executadas.
321
+ - **Conflitos nunca sobrescrevem.** Um arquivo alterado em disco depois da leitura falha com `LSP_ACTION_CONFLICT`; `lsp_rename` pré-verifica cada arquivo afetado antes da primeira escrita.
322
+ - **Trabalho limitado.** Tetos de resultado, de bytes e a política de timeout da plataforma limitam cada chamada; o cache de diagnósticos é uma LRU limitada.
323
+ - **Nada em cache no caminho do modelo.** Os resultados de ferramentas vivem apenas no log da sessão; o cache de diagnósticos nunca persiste entre reinícios.
324
+ - **Servidores ruins falham de forma ruidosa.** Um executável ausente falha no carregamento; um servidor que morre na inicialização falha a chamada com `LSP_ACTION_SERVER_FAILED` mais a cauda do stderr (após uma nova tentativa com processo novo).
325
+ - **Higiene de prompt.** O plugin não injeta persona nem prosa de prompt no system prompt da sessão — sua superfície voltada ao modelo são os oito esquemas de ferramenta.
326
+
327
+ ## Permissões e dados
328
+
329
+ - **Permissões**: formatação e renomeação usam os presets de permissão e a aprovação oficiais — o waterfall `fs/write-intent` e o par de escalonamento `sandbox_permissions` / `justification` resolvido por `ctx.approval`. O plugin declara `fs:read`, `fs:write`, `subprocess:spawn` e `network:none` no seu manifest de workshop.
330
+ - **Dados**: nada é gravado em disco; os resultados de ferramentas vivem apenas no log da sessão (sem persistência entre sessões). O protocolo do editor mantém um único cache LRU de diagnósticos em memória, limitado, com marca de frescor e nunca persistido entre reinícios. A nota de privacidade está em [`PRIVACY.md`](PRIVACY.md).
331
+ - **Sem rede**: o plugin não faz requisições de rede; ele fala com os servidores de linguagem por stdio de subprocesso local.
332
+
333
+ ## Limitações conhecidas
334
+
335
+ - **Documentos residentes.** Cada documento abre uma vez e permanece aberto por toda a vida da instância do servidor — uma requisição posterior com o fonte alterado envia um `didChange` de documento completo, e o encerramento do processo fecha todos os documentos. Assim, servidores baseados em projeto como o tsls atendem `textDocument/signatureHelp` e `workspace/symbol` sem documento aberto em vez de responder `null` sobre um documento recém-fechado. O conjunto residente é limitado pelo workspace e limpo com a instância (despejo por ociosidade ou descarte do plugin).
336
+ - **Formatação de intervalo exige o provedor de intervalo do servidor.** Servidores que só anunciam formatação de documento inteiro falham requisições de intervalo com `LSP_ACTION_UNSUPPORTED`.
337
+ - **A renomeação aplica apenas edições de texto.** Operações de recurso (criar/apagar/renomear arquivos) na resposta de renomeação de um servidor são recusadas com `LSP_ACTION_UNSUPPORTED`, e edições fora do workspace falham como `LSP_ACTION_CONFLICT` antes de qualquer escrita.
338
+
339
+ ## Interoperabilidade com outros plugins DSH
340
+
341
+ Verificado contra **DSH `0.2.0-rc.2`** (o runtime para o qual este README é publicado) e o conjunto de plugins de muitas estrelas sondado em 2026-10-05.
342
+
343
+ Este plugin **não interfere** com outros plugins, incluindo os de muitas estrelas amplamente instalados:
344
+
345
+ - **Sem colisão de nome de ferramenta.** Cada ferramenta tem namespace; nenhum nome nu pertencente a uma ferramenta embutida ou a outro plugin é registrado.
346
+ - **Sem colisão de chave de serviço.** Ele não fornece nenhuma chave de serviço, então não pode colidir em uma.
347
+ - **Sem colisão de slot.** Ele não registra nenhuma chave de slot de cliente, então não pode disputar um assento de `shadows-shipped-ui`.
348
+ - **Sem colisão de rota HTTP.** Ele não registra nenhum prefixo `webServer`.
349
+ - **Sem colisão de camada de patch.** O patch do bundle apenas `insert`a a própria linha; nunca sobrescreve o `config` de uma linha embutida.
350
+ - **Sem mutação global.** Ele não faz patch de protótipos, não reescreve `process.env` nem substitui o dispatcher global de fetch.
351
+
352
+ **Listeners de eventos compartilhados não interferem por construção.** Ele observa o evento sensível à ordem `fs/write-intent` com `ctx.on()` — o registro de broadcast do Cordis, em que cada listener roda e nenhum pode deixar outro sem vez. **Cada listener aqui delega por `next()`**, então a cadeia nunca é curto-circuitada, e a mutação é aplicada ao valor que `next()` produziu em vez de ser devolvida no lugar dele.
353
+
354
+ Evidência estática: `dsh-plugin-doctor` K10–K13 reportam `pass` em todas as verificações deste repositório.
355
+
356
+ ## Compatibilidade
357
+
358
+ | Superfície | Estado |
359
+ |---|---|
360
+ | Harness | DeepSeek Harness `dsh-v0.2.1-alpha.1` (`engines.dsh`: `>=0.2.1-0 <0.3.0 \|\| >=0.2.2-0 <0.3.0`); o plugin não escreve eventos de sessão por conta própria — o host registra os eventos padrão tool/call + tool/result. O seam publicado ainda carrega apenas as quatro operações legacy, então o plugin mantém o próprio cliente e registra essa vintage na primeira chamada de ação. Verificado em 2026-09-24 (réguas duplas de typecheck + suíte completa + portões self-contained/artifacts). |
361
+ | Node | `^22.19.0 \|\| >=24.9.0` |
362
+ | Plataformas | Todas (host puro; subprocesso + sistema de arquivos, sem rede) |
363
+ | Modelo | Qualquer (as ferramentas são agnósticas ao modelo; o plugin nunca chama um modelo) |
364
+
365
+ ## Ecossistema e qualidade
366
+
367
+ - [Espelho no Gitee](https://gitee.com/perrylink/dsh-lsp-actions) (espelho sincronizado; o GitHub é a referência)
368
+ - [Página do plugin no dshfind](https://dshfind.com/plugins/PerryLink/dsh-lsp-actions) (instalações e ranking)
369
+ - [Relatório OpenSSF Scorecard](https://securityscorecards.dev/viewer/?uri=github.com/PerryLink/dsh-lsp-actions) (movido por [.github/workflows/scorecard.yml](.github/workflows/scorecard.yml))
370
+ - [Relatório de verificação do dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章) (K10–K13 todos `pass`)
371
+ - [DSH Market](https://dsh.market/) (listado)
372
+ - **Canal da loja 1024**: `npm i -g dsh1024` uma vez e então `dsh1024 plugin --profile web add dsh-lsp-actions` (conta para o ranking de instalações do [deepseek1024.com](https://deepseek1024.com))
373
+ - [Base de conhecimento do ecossistema](https://perrylink.github.io/dsh-plugin-guide/): dados medidos, não marketing: guia de desenvolvimento de plugins · dados de seleção de plugins · critérios de manutenção
374
+
375
+ ## Desenvolvimento
376
+
377
+ ```sh
378
+ pnpm install # node ^22.19 || >=24.9
379
+ pnpm run lint # oxlint sobre src/ e tests/
380
+ pnpm test # vitest: unidade + integração com servidor fixture + e2e do protocolo do editor + e2e real de tsls
381
+ pnpm run test:coverage # portão de cobertura
382
+ pnpm build # tsc --noEmitOnError && node scripts/fix-dts.mjs → lib/
383
+ pnpm run prepare # build (roda na instalação)
384
+ pnpm run prepublishOnly # build (roda antes de publicar)
385
+ pnpm run check:readmes # portão de consistência dos READMEs em cinco idiomas
386
+ pnpm run verify:self-contained # specs de dependência resolvem no registry
387
+ pnpm run verify:artifacts # arquivos publicados presentes + artefatos importáveis
388
+ pnpm run check:lockfile # verificação de desvio do lockfile
389
+ ```
390
+
391
+ Estrutura do repositório:
392
+
393
+ ```text
394
+ src/ corpo do plugin: servers / client / runner / tools / editor / seam
395
+ tests/ vitest: unidade + servidor fixture + e2e do protocolo do editor + e2e real de tsls
396
+ examples/vscode extensão do VS Code apenas de UI + o backend headless ao qual se conecta
397
+ docs/ protocolo do editor (bilíngue) + pesquisa do seam + assets/
398
+ scripts/ correções de artefatos e portões mecânicos (readme sync / self-contained / artifacts)
399
+ upstream/ proposta upstream para a extensão do seam (patch + descrição do PR)
400
+ verify/ scripts de fumaça do backend do editor e composição scratch
401
+ ```
402
+
403
+ As imagens do README são geradas programaticamente por [`scripts/gen-readme-assets.py`](scripts/gen-readme-assets.py) (Pillow gera o hero WebP de 1440×576 em quatro variantes — claro/escuro × zh/en — e um diagrama SVG de ida e volta de 1100×660 escrito à mão) e podem ser reexecutadas sem risco.
404
+
405
+ Topics: `dsh`, `dsh-plugin`, `deepseek-harness`, `lsp`, `language-server`, `diagnostics`, `formatting`, `completion`, `code-action`, `symbols`, `signature-help`, `inlay-hints`, `rename`, `refactor`, `ide`, `editor`, `vscode`, `acp`, `json-rpc`
406
+
407
+ ## Família e agradecimentos
408
+
409
+ Este projeto faz parte da família de plugins do DeepSeek Harness da [PerryLink](https://github.com/PerryLink) (todos Apache-2.0). Se for útil, **uma estrela ajuda a próxima pessoa a encontrá-lo** — nada é bloqueado por trás dela.
410
+
411
+ - [@PerryLink](https://github.com/PerryLink) — criador e mantenedor: o cliente de ações LSP e o ciclo de vida dos servidores, as oito ferramentas, o protocolo de ações do editor, os testes, a CI e a documentação em cinco idiomas.
412
+
413
+ <details>
414
+ <summary>Expandir todos os plugins</summary>
415
+
416
+ | Plugin | Estado |
417
+ |---|---|
418
+ | **[dsh-aqua-input-check](https://github.com/PerryLink/dsh-aqua-input-check)** | |
419
+ | **[dsh-archive-check](https://github.com/PerryLink/dsh-archive-check)** | |
420
+ | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | |
421
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | 🧊 CONGELADO — ver o README do repo |
422
+ | **[dsh-bid-ca-precheck](https://github.com/PerryLink/dsh-bid-ca-precheck)** | |
423
+ | **[dsh-bid-qual-check](https://github.com/PerryLink/dsh-bid-qual-check)** | |
424
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | 🧊 CONGELADO — ver o README do repo |
425
+ | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | |
426
+ | **[dsh-click](https://github.com/PerryLink/dsh-click)** | |
427
+ | **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | |
428
+ | **[dsh-contract-stance](https://github.com/PerryLink/dsh-contract-stance)** | |
429
+ | **[dsh-customs-doc-check](https://github.com/PerryLink/dsh-customs-doc-check)** | |
430
+ | **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | 🧊 CONGELADO — ver o README do repo |
431
+ | **[dsh-demurrage-ledger](https://github.com/PerryLink/dsh-demurrage-ledger)** | |
432
+ | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | |
433
+ | **[dsh-drill-script-check](https://github.com/PerryLink/dsh-drill-script-check)** | |
434
+ | **[dsh-eia-guide-check](https://github.com/PerryLink/dsh-eia-guide-check)** | |
435
+ | **[dsh-emergency-plan](https://github.com/PerryLink/dsh-emergency-plan)** | |
436
+ | **[dsh-essay-rubric-check](https://github.com/PerryLink/dsh-essay-rubric-check)** | |
437
+ | **[dsh-evidence-check](https://github.com/PerryLink/dsh-evidence-check)** | |
438
+ | **[dsh-export-ctl-check](https://github.com/PerryLink/dsh-export-ctl-check)** | |
439
+ | **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | |
440
+ | **[dsh-fmea-table-check](https://github.com/PerryLink/dsh-fmea-table-check)** | |
441
+ | **[dsh-forecast-penalty](https://github.com/PerryLink/dsh-forecast-penalty)** | |
442
+ | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | |
443
+ | **[dsh-github](https://github.com/PerryLink/dsh-github)** | |
444
+ | **[dsh-gongwen-flow-check](https://github.com/PerryLink/dsh-gongwen-flow-check)** | |
445
+ | **[dsh-gongwen-word-check](https://github.com/PerryLink/dsh-gongwen-word-check)** | |
446
+ | **[dsh-guard-plan-qc](https://github.com/PerryLink/dsh-guard-plan-qc)** | |
447
+ | **[dsh-hazchem-check](https://github.com/PerryLink/dsh-hazchem-check)** | |
448
+ | **[dsh-hazplan-check](https://github.com/PerryLink/dsh-hazplan-check)** | |
449
+ | **[dsh-hidden-risk-map](https://github.com/PerryLink/dsh-hidden-risk-map)** | |
450
+ | **[dsh-hs-classify](https://github.com/PerryLink/dsh-hs-classify)** | |
451
+ | **[dsh-icd-rule-check](https://github.com/PerryLink/dsh-icd-rule-check)** | |
452
+ | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | |
453
+ | **[dsh-lawcite-adapter](https://github.com/PerryLink/dsh-lawcite-adapter)** | |
454
+ | **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | |
455
+ | **[dsh-lc-doc-check](https://github.com/PerryLink/dsh-lc-doc-check)** | |
456
+ | **[dsh-learning-gap-check](https://github.com/PerryLink/dsh-learning-gap-check)** | |
457
+ | **[dsh-library](https://github.com/PerryLink/dsh-library)** | |
458
+ | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | |
459
+ | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | |
460
+ | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | |
461
+ | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | |
462
+ | **[dsh-medrec-qc](https://github.com/PerryLink/dsh-medrec-qc)** | |
463
+ | **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | 🧊 CONGELADO — ver o README do repo |
464
+ | **[dsh-nsfc-form-check](https://github.com/PerryLink/dsh-nsfc-form-check)** | |
465
+ | **[dsh-nurse-record-check](https://github.com/PerryLink/dsh-nurse-record-check)** | |
466
+ | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | |
467
+ | **[dsh-origin-rvc-check](https://github.com/PerryLink/dsh-origin-rvc-check)** | |
468
+ | **[dsh-ota-review-check](https://github.com/PerryLink/dsh-ota-review-check)** | |
469
+ | **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | |
470
+ | **[dsh-paper-doc-adapter](https://github.com/PerryLink/dsh-paper-doc-adapter)** | |
471
+ | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | |
472
+ | **[dsh-permit-report-check](https://github.com/PerryLink/dsh-permit-report-check)** | |
473
+ | **[dsh-pipeline-check](https://github.com/PerryLink/dsh-pipeline-check)** | |
474
+ | **[dsh-pleading-draft](https://github.com/PerryLink/dsh-pleading-draft)** | |
475
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | 🚫 APOSENTADO (repo arquivado) |
476
+ | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | |
477
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | 🚫 APOSENTADO (repo arquivado) |
478
+ | **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | 🚫 APOSENTADO (repo arquivado) |
479
+ | **[dsh-policy-brief-draft](https://github.com/PerryLink/dsh-policy-brief-draft)** | |
480
+ | **[dsh-power-loss-split](https://github.com/PerryLink/dsh-power-loss-split)** | |
481
+ | **[dsh-power-ticket-check](https://github.com/PerryLink/dsh-power-ticket-check)** | |
482
+ | **[dsh-ppap-check](https://github.com/PerryLink/dsh-ppap-check)** | |
483
+ | **[dsh-protest-deadline](https://github.com/PerryLink/dsh-protest-deadline)** | |
484
+ | **[dsh-railway-window](https://github.com/PerryLink/dsh-railway-window)** | |
485
+ | **[dsh-repair-order-qc](https://github.com/PerryLink/dsh-repair-order-qc)** | |
486
+ | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | |
487
+ | **[dsh-review-reply-check](https://github.com/PerryLink/dsh-review-reply-check)** | |
488
+ | **[dsh-rulefile-check](https://github.com/PerryLink/dsh-rulefile-check)** | |
489
+ | **[dsh-safety-brief-check](https://github.com/PerryLink/dsh-safety-brief-check)** | |
490
+ | **[dsh-score](https://github.com/PerryLink/dsh-score)** | 🧊 CONGELADO — ver o README do repo |
491
+ | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | |
492
+ | **[dsh-site-log-check](https://github.com/PerryLink/dsh-site-log-check)** | |
493
+ | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | |
494
+ | **[dsh-soe-decision-check](https://github.com/PerryLink/dsh-soe-decision-check)** | |
495
+ | **[dsh-soilwater-check](https://github.com/PerryLink/dsh-soilwater-check)** | |
496
+ | **[dsh-sop-sync-check](https://github.com/PerryLink/dsh-sop-sync-check)** | |
497
+ | **[dsh-spc-gbt-adapter](https://github.com/PerryLink/dsh-spc-gbt-adapter)** | |
498
+ | **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | |
499
+ | **[dsh-tender-extract](https://github.com/PerryLink/dsh-tender-extract)** | |
500
+ | **[dsh-tender-matrix](https://github.com/PerryLink/dsh-tender-matrix)** | |
501
+ | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | |
502
+ | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | 🚫 APOSENTADO (repo arquivado) |
503
+ | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | |
504
+ | **[dsh-warranty-calc](https://github.com/PerryLink/dsh-warranty-calc)** | |
505
+ | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊 CONGELADO — ver o README do repo |
506
+ | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊 CONGELADO — ver o README do repo |
507
+ | **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊 CONGELADO — ver o README do repo |
508
+ | **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊 CONGELADO — ver o README do repo |
509
+ | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊 CONGELADO — ver o README do repo |
510
+ | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫 APOSENTADO (repo arquivado) |
511
+ | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫 APOSENTADO (repo arquivado) |
512
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫 APOSENTADO (repo arquivado) |
513
+
514
+ </details>
515
+
516
+ ## Licença
517
+
518
+ [LICENSE](LICENSE) (Apache License 2.0) © 2026 dsh-lsp-actions contributors
519
+
520
+ <p align="center"><sub>Apache-2.0 · Plugin da comunidade, sem afiliação com a DeepSeek.</sub></p>
package/cordis.patch.yml CHANGED
File without changes
File without changes
File without changes
@@ -0,0 +1,35 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="440" viewBox="0 0 1200 440" role="img" aria-label="dsh-lsp-actions action flow">
2
+ <title>dsh-lsp-actions action flow</title>
3
+ <rect width="1200" height="440" rx="18" fill="#0d1117"/>
4
+ <text x="60" y="62" fill="#f0f6fc" font-family="ui-sans-serif,system-ui,-apple-system,sans-serif" font-size="30" font-weight="700">dsh-lsp-actions</text>
5
+ <text x="60" y="94" fill="#8b949e" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="16">lsp_* ×8 · lsp.actions.* · ctx.lsp · stdio JSON-RPC</text>
6
+ <line x1="60" y1="116" x2="1140" y2="116" stroke="#30363d"/>
7
+ <rect x="60" y="146" width="186" height="92" rx="14" fill="#161b22" stroke="#30363d" stroke-width="2"/>
8
+ <text x="153" y="186" fill="#f0f6fc" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="15" font-weight="700">lsp_* ×8</text>
9
+ <text x="153" y="212" fill="#8b949e" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">tools</text>
10
+ <path d="M251 192h28" stroke="#8b949e" stroke-width="3"/>
11
+ <path d="M278 185l10 7-10 7" fill="none" stroke="#8b949e" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
12
+ <rect x="286" y="146" width="186" height="92" rx="14" fill="#161b22" stroke="#4B67B4" stroke-width="2"/>
13
+ <text x="379" y="186" fill="#f0f6fc" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="15" font-weight="700">ActionRunner</text>
14
+ <text x="379" y="212" fill="#8b949e" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">provider seam</text>
15
+ <path d="M477 192h28" stroke="#8b949e" stroke-width="3"/>
16
+ <path d="M504 185l10 7-10 7" fill="none" stroke="#8b949e" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
17
+ <rect x="512" y="146" width="186" height="92" rx="14" fill="#161b22" stroke="#30363d" stroke-width="2"/>
18
+ <text x="605" y="186" fill="#f0f6fc" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="15" font-weight="700">ctx.lsp / servers</text>
19
+ <text x="605" y="212" fill="#8b949e" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">seam-first</text>
20
+ <path d="M703 192h28" stroke="#8b949e" stroke-width="3"/>
21
+ <path d="M730 185l10 7-10 7" fill="none" stroke="#8b949e" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
22
+ <rect x="738" y="146" width="186" height="92" rx="14" fill="#161b22" stroke="#30363d" stroke-width="2"/>
23
+ <text x="831" y="186" fill="#f0f6fc" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="15" font-weight="700">stdio JSON-RPC</text>
24
+ <text x="831" y="212" fill="#8b949e" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">subprocess</text>
25
+ <path d="M929 192h28" stroke="#8b949e" stroke-width="3"/>
26
+ <path d="M956 185l10 7-10 7" fill="none" stroke="#8b949e" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
27
+ <rect x="964" y="146" width="186" height="92" rx="14" fill="#161b22" stroke="#3fb950" stroke-width="2"/>
28
+ <text x="1057" y="186" fill="#f0f6fc" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="15" font-weight="700">LSP server</text>
29
+ <text x="1057" y="212" fill="#8b949e" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">tsls · gopls · pyright</text>
30
+ <path d="M379 238v48" stroke="#4B67B4" stroke-width="2" stroke-dasharray="5 5"/>
31
+ <rect x="190" y="286" width="820" height="52" rx="12" fill="#161b22" stroke="#4B67B4" stroke-width="2"/>
32
+ <text x="600" y="319" fill="#f0f6fc" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="14">lsp.actions.list · lsp.actions.run · lsp.events</text>
33
+ <text x="60" y="388" fill="#8b949e" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="13">fs/write-intent · sandbox_permissions + justification · read-only</text>
34
+ <text x="60" y="412" fill="#8b949e" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="13">LSP_ACTION_READ_ONLY · LSP_ACTION_CONFLICT · LSP_ACTION_UNAVAILABLE</text>
35
+ </svg>
@@ -0,0 +1,35 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="440" viewBox="0 0 1200 440" role="img" aria-label="dsh-lsp-actions action flow">
2
+ <title>dsh-lsp-actions action flow</title>
3
+ <rect width="1200" height="440" rx="18" fill="#ffffff"/>
4
+ <text x="60" y="62" fill="#1f2328" font-family="ui-sans-serif,system-ui,-apple-system,sans-serif" font-size="30" font-weight="700">dsh-lsp-actions</text>
5
+ <text x="60" y="94" fill="#57606a" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="16">lsp_* ×8 · lsp.actions.* · ctx.lsp · stdio JSON-RPC</text>
6
+ <line x1="60" y1="116" x2="1140" y2="116" stroke="#d0d7de"/>
7
+ <rect x="60" y="146" width="186" height="92" rx="14" fill="#f6f8fa" stroke="#d0d7de" stroke-width="2"/>
8
+ <text x="153" y="186" fill="#1f2328" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="15" font-weight="700">lsp_* ×8</text>
9
+ <text x="153" y="212" fill="#57606a" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">tools</text>
10
+ <path d="M251 192h28" stroke="#57606a" stroke-width="3"/>
11
+ <path d="M278 185l10 7-10 7" fill="none" stroke="#57606a" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
12
+ <rect x="286" y="146" width="186" height="92" rx="14" fill="#f6f8fa" stroke="#4B67B4" stroke-width="2"/>
13
+ <text x="379" y="186" fill="#1f2328" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="15" font-weight="700">ActionRunner</text>
14
+ <text x="379" y="212" fill="#57606a" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">provider seam</text>
15
+ <path d="M477 192h28" stroke="#57606a" stroke-width="3"/>
16
+ <path d="M504 185l10 7-10 7" fill="none" stroke="#57606a" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
17
+ <rect x="512" y="146" width="186" height="92" rx="14" fill="#f6f8fa" stroke="#d0d7de" stroke-width="2"/>
18
+ <text x="605" y="186" fill="#1f2328" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="15" font-weight="700">ctx.lsp / servers</text>
19
+ <text x="605" y="212" fill="#57606a" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">seam-first</text>
20
+ <path d="M703 192h28" stroke="#57606a" stroke-width="3"/>
21
+ <path d="M730 185l10 7-10 7" fill="none" stroke="#57606a" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
22
+ <rect x="738" y="146" width="186" height="92" rx="14" fill="#f6f8fa" stroke="#d0d7de" stroke-width="2"/>
23
+ <text x="831" y="186" fill="#1f2328" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="15" font-weight="700">stdio JSON-RPC</text>
24
+ <text x="831" y="212" fill="#57606a" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">subprocess</text>
25
+ <path d="M929 192h28" stroke="#57606a" stroke-width="3"/>
26
+ <path d="M956 185l10 7-10 7" fill="none" stroke="#57606a" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
27
+ <rect x="964" y="146" width="186" height="92" rx="14" fill="#f6f8fa" stroke="#16a34a" stroke-width="2"/>
28
+ <text x="1057" y="186" fill="#1f2328" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="15" font-weight="700">LSP server</text>
29
+ <text x="1057" y="212" fill="#57606a" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">tsls · gopls · pyright</text>
30
+ <path d="M379 238v48" stroke="#4B67B4" stroke-width="2" stroke-dasharray="5 5"/>
31
+ <rect x="190" y="286" width="820" height="52" rx="12" fill="#f6f8fa" stroke="#4B67B4" stroke-width="2"/>
32
+ <text x="600" y="319" fill="#1f2328" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="14">lsp.actions.list · lsp.actions.run · lsp.events</text>
33
+ <text x="60" y="388" fill="#57606a" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="13">fs/write-intent · sandbox_permissions + justification · read-only</text>
34
+ <text x="60" y="412" fill="#57606a" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="13">LSP_ACTION_READ_ONLY · LSP_ACTION_CONFLICT · LSP_ACTION_UNAVAILABLE</text>
35
+ </svg>