@spences10/pi-lsp 0.0.11 → 0.0.13

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.
package/README.md CHANGED
@@ -75,7 +75,9 @@ diagnostics without guessing from text search alone.
75
75
  When LSP tools are active, the extension injects a small system prompt
76
76
  reminder telling the model to use LSP for focused diagnostics, type
77
77
  and symbol questions, definitions, references, and validation before
78
- reporting completion.
78
+ reporting completion. It also reminds the model to run diagnostics on
79
+ changed language-server-supported files before completion or commit,
80
+ preferring `lsp_diagnostics_many` for batches.
79
81
 
80
82
  ## Commands
81
83
 
@@ -0,0 +1,4 @@
1
+ import { type ExtensionAPI, type ExtensionCommandContext } from '@mariozechner/pi-coding-agent';
2
+ import { LspServerManager } from './server-manager.js';
3
+ export declare function register_lsp_command(pi: ExtensionAPI, manager: LspServerManager): void;
4
+ export declare function handle_lsp_command(args: string, ctx: ExtensionCommandContext, manager: LspServerManager): Promise<void>;
@@ -0,0 +1,172 @@
1
+ import { show_picker_modal, show_text_modal, } from '@spences10/pi-tui-modal';
2
+ import { format_lsp_view, format_status_lines } from './format.js';
3
+ import { list_supported_languages } from './servers.js';
4
+ export function register_lsp_command(pi, manager) {
5
+ pi.registerCommand('lsp', {
6
+ description: 'Show or manage language server state',
7
+ getArgumentCompletions: (prefix) => {
8
+ const parts = prefix.trim().split(/\s+/);
9
+ const subcommands = ['status', 'list', 'restart'];
10
+ if (!prefix.trim()) {
11
+ return subcommands.map((value) => ({
12
+ value,
13
+ label: value,
14
+ }));
15
+ }
16
+ if (parts.length <= 1) {
17
+ return subcommands
18
+ .filter((value) => value.startsWith(parts[0]))
19
+ .map((value) => ({ value, label: value }));
20
+ }
21
+ if (parts[0] === 'restart') {
22
+ const candidate = parts[1] ?? '';
23
+ return ['all', ...list_supported_languages()]
24
+ .filter((value) => value.startsWith(candidate))
25
+ .map((value) => ({
26
+ value: `restart ${value}`,
27
+ label: value,
28
+ }));
29
+ }
30
+ return null;
31
+ },
32
+ handler: async (args, ctx) => {
33
+ await handle_lsp_command(args, ctx, manager);
34
+ },
35
+ });
36
+ }
37
+ export async function handle_lsp_command(args, ctx, manager) {
38
+ const parts = args.trim() ? args.trim().split(/\s+/, 2) : [];
39
+ if (parts.length === 0 && has_modal_ui(ctx)) {
40
+ while (true) {
41
+ const selected = await show_lsp_home_modal(ctx, manager);
42
+ if (!selected)
43
+ return;
44
+ if (selected === 'restart') {
45
+ await handle_lsp_restart_modal(ctx, manager);
46
+ continue;
47
+ }
48
+ if (selected === 'restart-all') {
49
+ await restart_all_lsp_servers(ctx, manager);
50
+ continue;
51
+ }
52
+ await show_lsp_text_modal(ctx, selected === 'running'
53
+ ? 'Running LSP servers'
54
+ : selected === 'failed'
55
+ ? 'Failed LSP servers'
56
+ : 'LSP status', format_lsp_view(selected, manager.cwd, manager.clients_by_server, manager.failed_servers));
57
+ }
58
+ }
59
+ const [subcommand = 'status', target] = parts;
60
+ switch (subcommand) {
61
+ case 'status':
62
+ case 'list':
63
+ await present_lsp_text(ctx, 'LSP status', format_status_lines(manager.cwd, manager.clients_by_server, manager.failed_servers).join('\n'));
64
+ return;
65
+ case 'restart': {
66
+ if (!target && has_modal_ui(ctx)) {
67
+ await handle_lsp_restart_modal(ctx, manager);
68
+ return;
69
+ }
70
+ if (!target || target === 'all') {
71
+ await manager.clear_language_state();
72
+ ctx.ui.notify('Restarted all language server state.');
73
+ return;
74
+ }
75
+ if (!list_supported_languages().includes(target)) {
76
+ ctx.ui.notify(`Unknown language: ${target}. Use one of: ${list_supported_languages().join(', ')}`, 'warning');
77
+ return;
78
+ }
79
+ await manager.clear_language_state(target);
80
+ ctx.ui.notify(`Restarted ${target} language server state.`);
81
+ return;
82
+ }
83
+ default:
84
+ ctx.ui.notify(`Unknown subcommand: ${subcommand}. Use: status, list, restart`, 'warning');
85
+ }
86
+ }
87
+ function has_modal_ui(ctx) {
88
+ return ctx.hasUI && typeof ctx.ui.custom === 'function';
89
+ }
90
+ async function present_lsp_text(ctx, title, text) {
91
+ if (has_modal_ui(ctx)) {
92
+ await show_lsp_text_modal(ctx, title, text);
93
+ return;
94
+ }
95
+ ctx.ui.notify(text);
96
+ }
97
+ async function show_lsp_home_modal(ctx, manager) {
98
+ const running_count = manager.clients_by_server.size;
99
+ const failed_count = manager.failed_servers.size;
100
+ return await show_picker_modal(ctx, {
101
+ title: 'Language servers',
102
+ subtitle: `${running_count} running • ${failed_count} failed • ${list_supported_languages().length} supported`,
103
+ items: [
104
+ {
105
+ value: 'status',
106
+ label: 'Status',
107
+ description: `All configured language servers for ${manager.cwd}`,
108
+ },
109
+ {
110
+ value: 'running',
111
+ label: 'Running servers',
112
+ description: `${running_count} active workspace server(s)`,
113
+ },
114
+ {
115
+ value: 'failed',
116
+ label: 'Failed servers',
117
+ description: `${failed_count} failed server(s)`,
118
+ },
119
+ {
120
+ value: 'restart',
121
+ label: 'Restart server',
122
+ description: 'Pick a supported language to restart',
123
+ },
124
+ {
125
+ value: 'restart-all',
126
+ label: 'Restart all',
127
+ description: 'Stop every running language server',
128
+ },
129
+ ],
130
+ footer: 'enter opens • esc close/back',
131
+ });
132
+ }
133
+ async function show_lsp_text_modal(ctx, title, text) {
134
+ await show_text_modal(ctx, {
135
+ title,
136
+ text,
137
+ max_visible_lines: 20,
138
+ overlay_options: { width: '90%', minWidth: 72 },
139
+ });
140
+ }
141
+ async function handle_lsp_restart_modal(ctx, manager) {
142
+ const selected = await show_picker_modal(ctx, {
143
+ title: 'Restart LSP server',
144
+ subtitle: 'Clear cached language server state',
145
+ items: [
146
+ {
147
+ value: 'all',
148
+ label: 'All servers',
149
+ description: 'Stop every running language server',
150
+ },
151
+ ...list_supported_languages().map((language) => ({
152
+ value: language,
153
+ label: language,
154
+ description: `Restart ${language} language server state`,
155
+ })),
156
+ ],
157
+ footer: 'enter restarts • esc back',
158
+ });
159
+ if (!selected)
160
+ return;
161
+ if (selected === 'all') {
162
+ await restart_all_lsp_servers(ctx, manager);
163
+ return;
164
+ }
165
+ await manager.clear_language_state(selected);
166
+ ctx.ui.notify(`Restarted ${selected} language server state.`);
167
+ }
168
+ async function restart_all_lsp_servers(ctx, manager) {
169
+ await manager.clear_language_state();
170
+ ctx.ui.notify('Restarted all language server state.');
171
+ }
172
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,21 +1,8 @@
1
- import { type BeforeAgentStartEvent, type ExtensionAPI } from '@mariozechner/pi-coding-agent';
2
- import { type LspClientOptions, type LspDiagnostic, type LspDocumentSymbol, type LspHover, type LspLocation, type LspPosition } from './client.js';
3
- export declare function should_inject_lsp_prompt(event: Pick<BeforeAgentStartEvent, 'systemPromptOptions'>): boolean;
4
- export interface LspClientLike {
5
- start(): Promise<void>;
6
- stop(): Promise<void>;
7
- is_ready(): boolean;
8
- ensure_document_open(uri: string, text: string): Promise<void>;
9
- hover(uri: string, position: LspPosition): Promise<LspHover | null>;
10
- definition(uri: string, position: LspPosition): Promise<LspLocation[]>;
11
- references(uri: string, position: LspPosition, include_declaration: boolean): Promise<LspLocation[]>;
12
- document_symbols(uri: string): Promise<LspDocumentSymbol[]>;
13
- wait_for_diagnostics(uri: string, timeout_ms?: number): Promise<LspDiagnostic[]>;
14
- }
15
- export interface CreateLspExtensionOptions {
16
- create_client?: (options: LspClientOptions) => LspClientLike;
17
- read_file?: (path: string) => Promise<string>;
18
- cwd?: () => string;
1
+ import { type ExtensionAPI } from '@mariozechner/pi-coding-agent';
2
+ import { type CreateLspServerManagerOptions } from './server-manager.js';
3
+ export { should_inject_lsp_prompt } from './prompt.js';
4
+ export type { LspClientLike } from './server-manager.js';
5
+ export interface CreateLspExtensionOptions extends CreateLspServerManagerOptions {
19
6
  }
20
7
  export declare function create_lsp_extension(options?: CreateLspExtensionOptions): (pi: ExtensionAPI) => Promise<void>;
21
8
  declare const _default: (pi: ExtensionAPI) => Promise<void>;