gsd-pi 2.8.2 → 2.9.0

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 (193) hide show
  1. package/README.md +2 -1
  2. package/dist/cli.js +5 -0
  3. package/dist/loader.js +1 -1
  4. package/dist/update-check.d.ts +24 -0
  5. package/dist/update-check.js +93 -0
  6. package/node_modules/@gsd/pi-coding-agent/dist/core/extensions/types.d.ts +4 -2
  7. package/node_modules/@gsd/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  8. package/node_modules/@gsd/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  9. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/client.d.ts +46 -0
  10. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -0
  11. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/client.js +758 -0
  12. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/client.js.map +1 -0
  13. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/config.d.ts +23 -0
  14. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -0
  15. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/config.js +267 -0
  16. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/config.js.map +1 -0
  17. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/edits.d.ts +17 -0
  18. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/edits.d.ts.map +1 -0
  19. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/edits.js +101 -0
  20. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/edits.js.map +1 -0
  21. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/helpers.d.ts +15 -0
  22. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/helpers.d.ts.map +1 -0
  23. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/helpers.js +46 -0
  24. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/helpers.js.map +1 -0
  25. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/index.d.ts +35 -0
  26. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -0
  27. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/index.js +709 -0
  28. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/index.js.map +1 -0
  29. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lsp-integration.test.d.ts +2 -0
  30. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lsp-integration.test.d.ts.map +1 -0
  31. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +308 -0
  32. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -0
  33. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lspmux.d.ts +34 -0
  34. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -0
  35. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lspmux.js +136 -0
  36. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -0
  37. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/types.d.ts +262 -0
  38. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/types.d.ts.map +1 -0
  39. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/types.js +64 -0
  40. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/types.js.map +1 -0
  41. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/utils.d.ts +50 -0
  42. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/utils.d.ts.map +1 -0
  43. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/utils.js +574 -0
  44. package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/utils.js.map +1 -0
  45. package/node_modules/@gsd/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  46. package/node_modules/@gsd/pi-coding-agent/dist/core/slash-commands.js +1 -0
  47. package/node_modules/@gsd/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  48. package/node_modules/@gsd/pi-coding-agent/dist/core/tools/index.d.ts +13 -0
  49. package/node_modules/@gsd/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  50. package/node_modules/@gsd/pi-coding-agent/dist/core/tools/index.js +4 -0
  51. package/node_modules/@gsd/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  52. package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +10 -1
  53. package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  54. package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +2 -2
  55. package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  56. package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  57. package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  58. package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/interactive-mode.js +80 -1
  59. package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  60. package/node_modules/@gsd/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
  61. package/node_modules/@gsd/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  62. package/node_modules/@gsd/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +5 -0
  63. package/node_modules/@gsd/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  64. package/node_modules/@gsd/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  65. package/node_modules/@gsd/pi-coding-agent/src/core/extensions/types.ts +4 -2
  66. package/node_modules/@gsd/pi-coding-agent/src/core/lsp/client.ts +880 -0
  67. package/node_modules/@gsd/pi-coding-agent/src/core/lsp/config.ts +325 -0
  68. package/node_modules/@gsd/pi-coding-agent/src/core/lsp/defaults.json +456 -0
  69. package/node_modules/@gsd/pi-coding-agent/src/core/lsp/edits.ts +109 -0
  70. package/node_modules/@gsd/pi-coding-agent/src/core/lsp/helpers.ts +54 -0
  71. package/node_modules/@gsd/pi-coding-agent/src/core/lsp/index.ts +943 -0
  72. package/node_modules/@gsd/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +407 -0
  73. package/node_modules/@gsd/pi-coding-agent/src/core/lsp/lsp.md +33 -0
  74. package/node_modules/@gsd/pi-coding-agent/src/core/lsp/lspmux.ts +199 -0
  75. package/node_modules/@gsd/pi-coding-agent/src/core/lsp/types.ts +421 -0
  76. package/node_modules/@gsd/pi-coding-agent/src/core/lsp/utils.ts +682 -0
  77. package/node_modules/@gsd/pi-coding-agent/src/core/slash-commands.ts +1 -0
  78. package/node_modules/@gsd/pi-coding-agent/src/core/tools/index.ts +10 -0
  79. package/node_modules/@gsd/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +2 -2
  80. package/node_modules/@gsd/pi-coding-agent/src/modes/interactive/interactive-mode.ts +94 -2
  81. package/node_modules/@gsd/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -2
  82. package/node_modules/@gsd/pi-coding-agent/src/modes/rpc/rpc-types.ts +2 -1
  83. package/package.json +1 -1
  84. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +4 -2
  85. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  86. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  87. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +46 -0
  88. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -0
  89. package/packages/pi-coding-agent/dist/core/lsp/client.js +758 -0
  90. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -0
  91. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts +23 -0
  92. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -0
  93. package/packages/pi-coding-agent/dist/core/lsp/config.js +267 -0
  94. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -0
  95. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts +17 -0
  96. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts.map +1 -0
  97. package/packages/pi-coding-agent/dist/core/lsp/edits.js +101 -0
  98. package/packages/pi-coding-agent/dist/core/lsp/edits.js.map +1 -0
  99. package/packages/pi-coding-agent/dist/core/lsp/helpers.d.ts +15 -0
  100. package/packages/pi-coding-agent/dist/core/lsp/helpers.d.ts.map +1 -0
  101. package/packages/pi-coding-agent/dist/core/lsp/helpers.js +46 -0
  102. package/packages/pi-coding-agent/dist/core/lsp/helpers.js.map +1 -0
  103. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts +35 -0
  104. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -0
  105. package/packages/pi-coding-agent/dist/core/lsp/index.js +709 -0
  106. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -0
  107. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.d.ts +2 -0
  108. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.d.ts.map +1 -0
  109. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +308 -0
  110. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -0
  111. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts +34 -0
  112. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -0
  113. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +136 -0
  114. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -0
  115. package/packages/pi-coding-agent/dist/core/lsp/types.d.ts +262 -0
  116. package/packages/pi-coding-agent/dist/core/lsp/types.d.ts.map +1 -0
  117. package/packages/pi-coding-agent/dist/core/lsp/types.js +64 -0
  118. package/packages/pi-coding-agent/dist/core/lsp/types.js.map +1 -0
  119. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts +50 -0
  120. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts.map +1 -0
  121. package/packages/pi-coding-agent/dist/core/lsp/utils.js +574 -0
  122. package/packages/pi-coding-agent/dist/core/lsp/utils.js.map +1 -0
  123. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  124. package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
  125. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  126. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +13 -0
  127. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  128. package/packages/pi-coding-agent/dist/core/tools/index.js +4 -0
  129. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  130. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +10 -1
  131. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  132. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +2 -2
  133. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  134. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  135. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  136. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +80 -1
  137. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  138. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
  139. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  140. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +5 -0
  141. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  142. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  143. package/packages/pi-coding-agent/src/core/extensions/types.ts +4 -2
  144. package/packages/pi-coding-agent/src/core/lsp/client.ts +880 -0
  145. package/packages/pi-coding-agent/src/core/lsp/config.ts +325 -0
  146. package/packages/pi-coding-agent/src/core/lsp/defaults.json +456 -0
  147. package/packages/pi-coding-agent/src/core/lsp/edits.ts +109 -0
  148. package/packages/pi-coding-agent/src/core/lsp/helpers.ts +54 -0
  149. package/packages/pi-coding-agent/src/core/lsp/index.ts +943 -0
  150. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +407 -0
  151. package/packages/pi-coding-agent/src/core/lsp/lsp.md +33 -0
  152. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +199 -0
  153. package/packages/pi-coding-agent/src/core/lsp/types.ts +421 -0
  154. package/packages/pi-coding-agent/src/core/lsp/utils.ts +682 -0
  155. package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
  156. package/packages/pi-coding-agent/src/core/tools/index.ts +10 -0
  157. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +2 -2
  158. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +94 -2
  159. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -2
  160. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +2 -1
  161. package/src/resources/extensions/ask-user-questions.ts +42 -2
  162. package/src/resources/extensions/bg-shell/index.ts +34 -37
  163. package/src/resources/extensions/browser-tools/core.d.ts +205 -0
  164. package/src/resources/extensions/browser-tools/index.ts +2 -2
  165. package/src/resources/extensions/browser-tools/refs.ts +1 -1
  166. package/src/resources/extensions/browser-tools/tools/session.ts +1 -1
  167. package/src/resources/extensions/context7/index.ts +2 -2
  168. package/src/resources/extensions/get-secrets-from-user.ts +3 -2
  169. package/src/resources/extensions/google-search/index.ts +1 -1
  170. package/src/resources/extensions/gsd/auto.ts +126 -12
  171. package/src/resources/extensions/gsd/commands.ts +218 -3
  172. package/src/resources/extensions/gsd/doctor.ts +1 -1
  173. package/src/resources/extensions/gsd/git-service.ts +163 -13
  174. package/src/resources/extensions/gsd/guided-flow.ts +19 -9
  175. package/src/resources/extensions/gsd/index.ts +17 -7
  176. package/src/resources/extensions/gsd/preferences.ts +1 -1
  177. package/src/resources/extensions/gsd/tests/git-service.test.ts +226 -0
  178. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +2 -2
  179. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +1 -1
  180. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +10 -10
  181. package/src/resources/extensions/gsd/tests/next-milestone-id.test.ts +87 -0
  182. package/src/resources/extensions/gsd/tests/worktree.test.ts +352 -0
  183. package/src/resources/extensions/gsd/types.ts +1 -0
  184. package/src/resources/extensions/gsd/worktree.ts +20 -1
  185. package/src/resources/extensions/mac-tools/index.ts +1 -1
  186. package/src/resources/extensions/search-the-web/command-search-provider.ts +1 -1
  187. package/src/resources/extensions/search-the-web/format.ts +1 -1
  188. package/src/resources/extensions/search-the-web/index.ts +5 -5
  189. package/src/resources/extensions/search-the-web/native-search.ts +5 -6
  190. package/src/resources/extensions/search-the-web/tool-fetch-page.ts +7 -7
  191. package/src/resources/extensions/search-the-web/tool-llm-context.ts +11 -11
  192. package/src/resources/extensions/search-the-web/tool-search.ts +10 -10
  193. package/src/resources/extensions/shared/interview-ui.ts +2 -2
@@ -0,0 +1,421 @@
1
+ import { type Static, type TUnsafe, Type } from "@sinclair/typebox";
2
+ import type { ChildProcess } from "node:child_process";
3
+
4
+ function StringEnum<T extends readonly string[]>(
5
+ values: T,
6
+ options?: { description?: string; default?: T[number] },
7
+ ): TUnsafe<T[number]> {
8
+ return Type.Unsafe<T[number]>({
9
+ type: "string",
10
+ enum: values as any,
11
+ ...(options?.description && { description: options.description }),
12
+ ...(options?.default && { default: options.default }),
13
+ });
14
+ }
15
+
16
+ // =============================================================================
17
+ // Tool Schema
18
+ // =============================================================================
19
+
20
+ export const lspSchema = Type.Object({
21
+ action: StringEnum(
22
+ [
23
+ "diagnostics",
24
+ "definition",
25
+ "references",
26
+ "hover",
27
+ "symbols",
28
+ "rename",
29
+ "code_actions",
30
+ "type_definition",
31
+ "implementation",
32
+ "status",
33
+ "reload",
34
+ ],
35
+ { description: "LSP operation" },
36
+ ),
37
+ file: Type.Optional(Type.String({ description: "File path" })),
38
+ line: Type.Optional(Type.Number({ description: "Line number (1-indexed)" })),
39
+ symbol: Type.Optional(
40
+ Type.String({ description: "Symbol/substring to locate on the line (used to compute column)" }),
41
+ ),
42
+ occurrence: Type.Optional(Type.Number({ description: "Symbol occurrence on line (1-indexed, default: 1)" })),
43
+ query: Type.Optional(Type.String({ description: "Search query or SSR pattern" })),
44
+ new_name: Type.Optional(Type.String({ description: "New name for rename" })),
45
+ apply: Type.Optional(Type.Boolean({ description: "Apply edits (default: true)" })),
46
+ timeout: Type.Optional(Type.Number({ description: "Request timeout in seconds" })),
47
+ });
48
+
49
+ export type LspParams = Static<typeof lspSchema>;
50
+
51
+ export interface LspToolDetails {
52
+ serverName?: string;
53
+ action: string;
54
+ success: boolean;
55
+ request?: LspParams;
56
+ }
57
+
58
+ // =============================================================================
59
+ // Core LSP Protocol Types
60
+ // =============================================================================
61
+
62
+ export interface Position {
63
+ line: number;
64
+ character: number;
65
+ }
66
+
67
+ export interface Range {
68
+ start: Position;
69
+ end: Position;
70
+ }
71
+
72
+ export interface Location {
73
+ uri: string;
74
+ range: Range;
75
+ }
76
+
77
+ export interface LocationLink {
78
+ originSelectionRange?: Range;
79
+ targetUri: string;
80
+ targetRange: Range;
81
+ targetSelectionRange: Range;
82
+ }
83
+
84
+ // =============================================================================
85
+ // Diagnostics
86
+ // =============================================================================
87
+
88
+ export type DiagnosticSeverity = 1 | 2 | 3 | 4; // error, warning, info, hint
89
+
90
+ export interface DiagnosticRelatedInformation {
91
+ location: Location;
92
+ message: string;
93
+ }
94
+
95
+ export interface Diagnostic {
96
+ range: Range;
97
+ severity?: DiagnosticSeverity;
98
+ code?: string | number;
99
+ codeDescription?: { href: string };
100
+ source?: string;
101
+ message: string;
102
+ tags?: number[];
103
+ relatedInformation?: DiagnosticRelatedInformation[];
104
+ data?: unknown;
105
+ }
106
+
107
+ // =============================================================================
108
+ // Text Edits
109
+ // =============================================================================
110
+
111
+ export interface TextEdit {
112
+ range: Range;
113
+ newText: string;
114
+ }
115
+
116
+ export interface AnnotatedTextEdit extends TextEdit {
117
+ annotationId?: string;
118
+ }
119
+
120
+ export interface TextDocumentIdentifier {
121
+ uri: string;
122
+ }
123
+
124
+ export interface VersionedTextDocumentIdentifier extends TextDocumentIdentifier {
125
+ version: number | null;
126
+ }
127
+
128
+ export interface OptionalVersionedTextDocumentIdentifier extends TextDocumentIdentifier {
129
+ version?: number | null;
130
+ }
131
+
132
+ export interface TextDocumentEdit {
133
+ textDocument: OptionalVersionedTextDocumentIdentifier;
134
+ edits: (TextEdit | AnnotatedTextEdit)[];
135
+ }
136
+
137
+ // =============================================================================
138
+ // Resource Operations
139
+ // =============================================================================
140
+
141
+ export interface CreateFileOptions {
142
+ overwrite?: boolean;
143
+ ignoreIfExists?: boolean;
144
+ }
145
+
146
+ export interface CreateFile {
147
+ kind: "create";
148
+ uri: string;
149
+ options?: CreateFileOptions;
150
+ }
151
+
152
+ export interface RenameFileOptions {
153
+ overwrite?: boolean;
154
+ ignoreIfExists?: boolean;
155
+ }
156
+
157
+ export interface RenameFile {
158
+ kind: "rename";
159
+ oldUri: string;
160
+ newUri: string;
161
+ options?: RenameFileOptions;
162
+ }
163
+
164
+ export interface DeleteFileOptions {
165
+ recursive?: boolean;
166
+ ignoreIfNotExists?: boolean;
167
+ }
168
+
169
+ export interface DeleteFile {
170
+ kind: "delete";
171
+ uri: string;
172
+ options?: DeleteFileOptions;
173
+ }
174
+
175
+ export type DocumentChange = TextDocumentEdit | CreateFile | RenameFile | DeleteFile;
176
+
177
+ export interface WorkspaceEdit {
178
+ changes?: Record<string, TextEdit[]>;
179
+ documentChanges?: DocumentChange[];
180
+ changeAnnotations?: Record<string, { label: string; needsConfirmation?: boolean; description?: string }>;
181
+ }
182
+
183
+ // =============================================================================
184
+ // Code Actions
185
+ // =============================================================================
186
+
187
+ export type CodeActionKind =
188
+ | "quickfix"
189
+ | "refactor"
190
+ | "refactor.extract"
191
+ | "refactor.inline"
192
+ | "refactor.rewrite"
193
+ | "source"
194
+ | "source.organizeImports"
195
+ | "source.fixAll"
196
+ | string;
197
+
198
+ export interface Command {
199
+ title: string;
200
+ command: string;
201
+ arguments?: unknown[];
202
+ }
203
+
204
+ export interface CodeAction {
205
+ title: string;
206
+ kind?: CodeActionKind;
207
+ diagnostics?: Diagnostic[];
208
+ isPreferred?: boolean;
209
+ disabled?: { reason: string };
210
+ edit?: WorkspaceEdit;
211
+ command?: Command;
212
+ data?: unknown;
213
+ }
214
+
215
+ export interface CodeActionContext {
216
+ diagnostics: Diagnostic[];
217
+ only?: CodeActionKind[];
218
+ triggerKind?: 1 | 2; // Invoked = 1, Automatic = 2
219
+ }
220
+
221
+ // =============================================================================
222
+ // Symbols
223
+ // =============================================================================
224
+
225
+ export type SymbolKind =
226
+ | 1 // File
227
+ | 2 // Module
228
+ | 3 // Namespace
229
+ | 4 // Package
230
+ | 5 // Class
231
+ | 6 // Method
232
+ | 7 // Property
233
+ | 8 // Field
234
+ | 9 // Constructor
235
+ | 10 // Enum
236
+ | 11 // Interface
237
+ | 12 // Function
238
+ | 13 // Variable
239
+ | 14 // Constant
240
+ | 15 // String
241
+ | 16 // Number
242
+ | 17 // Boolean
243
+ | 18 // Array
244
+ | 19 // Object
245
+ | 20 // Key
246
+ | 21 // Null
247
+ | 22 // EnumMember
248
+ | 23 // Struct
249
+ | 24 // Event
250
+ | 25 // Operator
251
+ | 26; // TypeParameter
252
+
253
+ export const SYMBOL_KIND_NAMES: Record<SymbolKind, string> = {
254
+ 1: "File",
255
+ 2: "Module",
256
+ 3: "Namespace",
257
+ 4: "Package",
258
+ 5: "Class",
259
+ 6: "Method",
260
+ 7: "Property",
261
+ 8: "Field",
262
+ 9: "Constructor",
263
+ 10: "Enum",
264
+ 11: "Interface",
265
+ 12: "Function",
266
+ 13: "Variable",
267
+ 14: "Constant",
268
+ 15: "String",
269
+ 16: "Number",
270
+ 17: "Boolean",
271
+ 18: "Array",
272
+ 19: "Object",
273
+ 20: "Key",
274
+ 21: "Null",
275
+ 22: "EnumMember",
276
+ 23: "Struct",
277
+ 24: "Event",
278
+ 25: "Operator",
279
+ 26: "TypeParameter",
280
+ };
281
+
282
+ export interface DocumentSymbol {
283
+ name: string;
284
+ detail?: string;
285
+ kind: SymbolKind;
286
+ tags?: number[];
287
+ deprecated?: boolean;
288
+ range: Range;
289
+ selectionRange: Range;
290
+ children?: DocumentSymbol[];
291
+ }
292
+
293
+ export interface SymbolInformation {
294
+ name: string;
295
+ kind: SymbolKind;
296
+ tags?: number[];
297
+ deprecated?: boolean;
298
+ location: Location;
299
+ containerName?: string;
300
+ }
301
+
302
+ // =============================================================================
303
+ // Hover
304
+ // =============================================================================
305
+
306
+ export interface MarkupContent {
307
+ kind: "plaintext" | "markdown";
308
+ value: string;
309
+ }
310
+
311
+ export type MarkedString = string | { language: string; value: string };
312
+
313
+ export interface Hover {
314
+ contents: MarkupContent | MarkedString | MarkedString[];
315
+ range?: Range;
316
+ }
317
+
318
+ // =============================================================================
319
+ // Server Configuration
320
+ // =============================================================================
321
+
322
+ export interface ServerCapabilities {
323
+ flycheck?: boolean;
324
+ ssr?: boolean;
325
+ expandMacro?: boolean;
326
+ runnables?: boolean;
327
+ relatedTests?: boolean;
328
+ }
329
+
330
+ export interface ServerConfig {
331
+ command: string;
332
+ args?: string[];
333
+ fileTypes: string[];
334
+ rootMarkers: string[];
335
+ initOptions?: Record<string, unknown>;
336
+ settings?: Record<string, unknown>;
337
+ disabled?: boolean;
338
+ /** Per-server warmup timeout in milliseconds. */
339
+ warmupTimeoutMs?: number;
340
+ capabilities?: ServerCapabilities;
341
+ /** If true, this is a linter/formatter server — used only for diagnostics/actions, not type intelligence */
342
+ isLinter?: boolean;
343
+ /** Resolved absolute path to the command binary (set during config loading) */
344
+ resolvedCommand?: string;
345
+ }
346
+
347
+ // =============================================================================
348
+ // Client State
349
+ // =============================================================================
350
+
351
+ export interface OpenFile {
352
+ version: number;
353
+ languageId: string;
354
+ }
355
+
356
+ export interface PendingRequest {
357
+ resolve: (result: unknown) => void;
358
+ reject: (error: Error) => void;
359
+ method: string;
360
+ }
361
+
362
+ export interface LspServerCapabilities {
363
+ renameProvider?: boolean | { prepareProvider?: boolean };
364
+ codeActionProvider?: boolean | { resolveProvider?: boolean };
365
+ hoverProvider?: boolean;
366
+ definitionProvider?: boolean;
367
+ referencesProvider?: boolean;
368
+ documentSymbolProvider?: boolean;
369
+ documentFormattingProvider?: boolean;
370
+ workspaceSymbolProvider?: boolean;
371
+ [key: string]: unknown;
372
+ }
373
+
374
+ export interface LspClient {
375
+ name: string;
376
+ cwd: string;
377
+ config: ServerConfig;
378
+ proc: {
379
+ stdin: ChildProcess["stdin"];
380
+ stdout: ChildProcess["stdout"];
381
+ stderr: ChildProcess["stderr"];
382
+ pid: number;
383
+ exitCode: number | null;
384
+ exited: Promise<number>;
385
+ kill(signal?: number): void;
386
+ };
387
+ requestId: number;
388
+ diagnostics: Map<string, Diagnostic[]>;
389
+ diagnosticsVersion: number;
390
+ openFiles: Map<string, OpenFile>;
391
+ pendingRequests: Map<number, PendingRequest>;
392
+ messageBuffer: Buffer;
393
+ isReading: boolean;
394
+ serverCapabilities?: LspServerCapabilities;
395
+ lastActivity: number;
396
+ stderrBuffer: string;
397
+ }
398
+
399
+ // =============================================================================
400
+ // JSON-RPC Protocol Types
401
+ // =============================================================================
402
+
403
+ export interface LspJsonRpcRequest {
404
+ jsonrpc: "2.0";
405
+ id: number;
406
+ method: string;
407
+ params: unknown;
408
+ }
409
+
410
+ export interface LspJsonRpcResponse {
411
+ jsonrpc: "2.0";
412
+ id?: number;
413
+ result?: unknown;
414
+ error?: { code: number; message: string; data?: unknown };
415
+ }
416
+
417
+ export interface LspJsonRpcNotification {
418
+ jsonrpc: "2.0";
419
+ method: string;
420
+ params?: unknown;
421
+ }