gsd-pi 2.26.0 → 2.27.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.
- package/README.md +43 -6
- package/dist/cli.js +4 -2
- package/dist/headless.d.ts +3 -0
- package/dist/headless.js +136 -8
- package/dist/help-text.js +3 -0
- package/dist/loader.js +33 -4
- package/dist/resources/extensions/bg-shell/index.ts +19 -2
- package/dist/resources/extensions/bg-shell/process-manager.ts +45 -0
- package/dist/resources/extensions/bg-shell/types.ts +21 -1
- package/dist/resources/extensions/gsd/auto/session.ts +224 -0
- package/dist/resources/extensions/gsd/auto-budget.ts +32 -0
- package/dist/resources/extensions/gsd/auto-dashboard.ts +63 -10
- package/dist/resources/extensions/gsd/auto-direct-dispatch.ts +229 -0
- package/dist/resources/extensions/gsd/auto-dispatch.ts +23 -10
- package/dist/resources/extensions/gsd/auto-model-selection.ts +179 -0
- package/dist/resources/extensions/gsd/auto-observability.ts +74 -0
- package/dist/resources/extensions/gsd/auto-prompts.ts +0 -1
- package/dist/resources/extensions/gsd/auto-timeout-recovery.ts +262 -0
- package/dist/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.ts +46 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.ts +207 -0
- package/dist/resources/extensions/gsd/auto.ts +977 -1551
- package/dist/resources/extensions/gsd/commands.ts +3 -3
- package/dist/resources/extensions/gsd/dashboard-overlay.ts +47 -72
- package/dist/resources/extensions/gsd/doctor-proactive.ts +9 -4
- package/dist/resources/extensions/gsd/export-html.ts +1001 -0
- package/dist/resources/extensions/gsd/export.ts +49 -1
- package/dist/resources/extensions/gsd/git-service.ts +6 -0
- package/dist/resources/extensions/gsd/gitignore.ts +4 -1
- package/dist/resources/extensions/gsd/guided-flow.ts +24 -5
- package/dist/resources/extensions/gsd/index.ts +54 -1
- package/dist/resources/extensions/gsd/native-git-bridge.ts +30 -2
- package/dist/resources/extensions/gsd/observability-validator.ts +21 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.ts +231 -20
- package/dist/resources/extensions/gsd/preferences.ts +62 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -3
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/reports.ts +510 -0
- package/dist/resources/extensions/gsd/roadmap-slices.ts +1 -1
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +178 -0
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +54 -0
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +59 -0
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/multi-session.md +185 -0
- package/dist/resources/extensions/gsd/state.ts +30 -0
- package/dist/resources/extensions/gsd/templates/task-summary.md +9 -0
- package/dist/resources/extensions/gsd/tests/auto-dashboard.test.ts +13 -0
- package/dist/resources/extensions/gsd/tests/continue-here.test.ts +81 -0
- package/dist/resources/extensions/gsd/tests/derive-state-db.test.ts +5 -0
- package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +1 -0
- package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +1 -0
- package/dist/resources/extensions/gsd/tests/derive-state.test.ts +10 -1
- package/dist/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +132 -0
- package/dist/resources/extensions/gsd/tests/doctor-proactive.test.ts +14 -0
- package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +1 -0
- package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +61 -0
- package/dist/resources/extensions/gsd/tests/network-error-fallback.test.ts +51 -1
- package/dist/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +331 -0
- package/dist/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +298 -0
- package/dist/resources/extensions/gsd/tests/parallel-merge.test.ts +465 -0
- package/dist/resources/extensions/gsd/tests/parallel-orchestration.test.ts +39 -10
- package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +71 -0
- package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +42 -0
- package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +9 -9
- package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +743 -0
- package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +965 -0
- package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +44 -10
- package/dist/resources/extensions/gsd/tests/worktree.test.ts +3 -1
- package/dist/resources/extensions/gsd/types.ts +38 -0
- package/dist/resources/extensions/gsd/verification-evidence.ts +183 -0
- package/dist/resources/extensions/gsd/verification-gate.ts +567 -0
- package/dist/resources/extensions/gsd/visualizer-data.ts +25 -3
- package/dist/resources/extensions/gsd/visualizer-overlay.ts +31 -21
- package/dist/resources/extensions/gsd/visualizer-views.ts +15 -66
- package/dist/resources/extensions/search-the-web/tool-search.ts +26 -0
- package/dist/resources/extensions/shared/format-utils.ts +85 -0
- package/dist/resources/extensions/shared/tests/format-utils.test.ts +153 -0
- package/dist/resources/extensions/subagent/index.ts +46 -1
- package/dist/resources/extensions/subagent/isolation.ts +9 -6
- package/package.json +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -4
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/src/providers/openai-completions.ts +7 -4
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js +7 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/config.js +9 -2
- package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
- package/packages/pi-coding-agent/src/core/lsp/client.ts +8 -0
- package/packages/pi-coding-agent/src/core/lsp/config.ts +9 -2
- package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/editor.js +1 -1
- package/packages/pi-tui/dist/components/editor.js.map +1 -1
- package/packages/pi-tui/src/components/editor.ts +3 -1
- package/scripts/link-workspace-packages.cjs +22 -6
- package/src/resources/extensions/bg-shell/index.ts +19 -2
- package/src/resources/extensions/bg-shell/process-manager.ts +45 -0
- package/src/resources/extensions/bg-shell/types.ts +21 -1
- package/src/resources/extensions/gsd/auto/session.ts +224 -0
- package/src/resources/extensions/gsd/auto-budget.ts +32 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +63 -10
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +229 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +23 -10
- package/src/resources/extensions/gsd/auto-model-selection.ts +179 -0
- package/src/resources/extensions/gsd/auto-observability.ts +74 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +0 -1
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +262 -0
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +46 -0
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +207 -0
- package/src/resources/extensions/gsd/auto.ts +977 -1551
- package/src/resources/extensions/gsd/commands.ts +3 -3
- package/src/resources/extensions/gsd/dashboard-overlay.ts +47 -72
- package/src/resources/extensions/gsd/doctor-proactive.ts +9 -4
- package/src/resources/extensions/gsd/export-html.ts +1001 -0
- package/src/resources/extensions/gsd/export.ts +49 -1
- package/src/resources/extensions/gsd/git-service.ts +6 -0
- package/src/resources/extensions/gsd/gitignore.ts +4 -1
- package/src/resources/extensions/gsd/guided-flow.ts +24 -5
- package/src/resources/extensions/gsd/index.ts +54 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +30 -2
- package/src/resources/extensions/gsd/observability-validator.ts +21 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +231 -20
- package/src/resources/extensions/gsd/preferences.ts +62 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +4 -3
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/reports.ts +510 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +1 -1
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +178 -0
- package/src/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +54 -0
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +59 -0
- package/src/resources/extensions/gsd/skills/gsd-headless/references/multi-session.md +185 -0
- package/src/resources/extensions/gsd/state.ts +30 -0
- package/src/resources/extensions/gsd/templates/task-summary.md +9 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +13 -0
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +81 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/derive-state-draft.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/network-error-fallback.test.ts +51 -1
- package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +331 -0
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +298 -0
- package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +465 -0
- package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +39 -10
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +9 -9
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +743 -0
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +965 -0
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +44 -10
- package/src/resources/extensions/gsd/tests/worktree.test.ts +3 -1
- package/src/resources/extensions/gsd/types.ts +38 -0
- package/src/resources/extensions/gsd/verification-evidence.ts +183 -0
- package/src/resources/extensions/gsd/verification-gate.ts +567 -0
- package/src/resources/extensions/gsd/visualizer-data.ts +25 -3
- package/src/resources/extensions/gsd/visualizer-overlay.ts +31 -21
- package/src/resources/extensions/gsd/visualizer-views.ts +15 -66
- package/src/resources/extensions/search-the-web/tool-search.ts +26 -0
- package/src/resources/extensions/shared/format-utils.ts +85 -0
- package/src/resources/extensions/shared/tests/format-utils.test.ts +153 -0
- package/src/resources/extensions/subagent/index.ts +46 -1
- package/src/resources/extensions/subagent/isolation.ts +9 -6
|
@@ -139,10 +139,17 @@ const LOCAL_BIN_PATHS = [
|
|
|
139
139
|
{ markers: ["go.mod", "go.sum"], binDir: "bin" },
|
|
140
140
|
];
|
|
141
141
|
function which(command) {
|
|
142
|
-
|
|
142
|
+
// On Windows, prefer `where.exe` over `which` — MSYS/Git Bash's `which`
|
|
143
|
+
// returns POSIX paths (/c/Users/...) that Node's spawn() can't execute.
|
|
144
|
+
// `where.exe` returns native Windows paths (C:\Users\...).
|
|
145
|
+
const isWindows = process.platform === "win32";
|
|
146
|
+
const cmd = isWindows ? "where.exe" : "which";
|
|
147
|
+
const result = spawnSync(cmd, [command], { encoding: "utf-8", shell: isWindows });
|
|
143
148
|
if (result.status !== 0)
|
|
144
149
|
return null;
|
|
145
|
-
|
|
150
|
+
// `where.exe` may return multiple lines — take the first
|
|
151
|
+
const resolved = result.stdout.trim().split(/\r?\n/)[0]?.trim();
|
|
152
|
+
return resolved || null;
|
|
146
153
|
}
|
|
147
154
|
export function resolveCommand(command, cwd) {
|
|
148
155
|
for (const { markers, binDir } of LOCAL_BIN_PATHS) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/lsp/config.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport YAML from \"yaml\";\nimport { globSync } from \"glob\";\nimport { CONFIG_DIR_NAME } from \"../../config.js\";\nimport { isRecord } from \"./helpers.js\";\nimport type { ServerConfig } from \"./types.js\";\n\nconst require = createRequire(import.meta.url);\nconst DEFAULTS = require(\"./defaults.json\") as Record<string, Partial<ServerConfig>>;\n\nexport interface LspConfig {\n\tservers: Record<string, ServerConfig>;\n\t/** Idle timeout in milliseconds. If set, LSP clients will be shutdown after this period of inactivity. Disabled by default. */\n\tidleTimeoutMs?: number;\n}\n\n// =============================================================================\n// Default Server Configuration Loading\n// =============================================================================\n\nconst PID_TOKEN = \"$PID\";\n\ninterface NormalizedConfig {\n\tservers: Record<string, Partial<ServerConfig>>;\n\tidleTimeoutMs?: number;\n}\n\nfunction parseConfigContent(content: string, filePath: string): unknown {\n\tconst extension = path.extname(filePath).toLowerCase();\n\tif (extension === \".yaml\" || extension === \".yml\") {\n\t\treturn YAML.parse(content) as unknown;\n\t}\n\treturn JSON.parse(content) as unknown;\n}\n\nfunction normalizeConfig(value: unknown): NormalizedConfig | null {\n\tif (!isRecord(value)) return null;\n\n\tconst idleTimeoutMs = typeof value.idleTimeoutMs === \"number\" ? value.idleTimeoutMs : undefined;\n\tconst rawServers = value.servers;\n\n\tif (isRecord(rawServers)) {\n\t\treturn { servers: rawServers as Record<string, Partial<ServerConfig>>, idleTimeoutMs };\n\t}\n\n\tconst servers = Object.fromEntries(Object.entries(value).filter(([key]) => key !== \"idleTimeoutMs\")) as Record<\n\t\tstring,\n\t\tPartial<ServerConfig>\n\t>;\n\n\treturn { servers, idleTimeoutMs };\n}\n\nfunction normalizeStringArray(value: unknown): string[] | null {\n\tif (!Array.isArray(value)) return null;\n\tconst items = value.filter((entry): entry is string => typeof entry === \"string\" && entry.length > 0);\n\treturn items.length > 0 ? items : null;\n}\n\nfunction normalizeServerConfig(name: string, config: Partial<ServerConfig>): ServerConfig | null {\n\tconst command = typeof config.command === \"string\" && config.command.length > 0 ? config.command : null;\n\tconst fileTypes = normalizeStringArray(config.fileTypes);\n\tconst rootMarkers = normalizeStringArray(config.rootMarkers);\n\n\tif (!command || !fileTypes || !rootMarkers) {\n\t\treturn null;\n\t}\n\n\tconst args = Array.isArray(config.args)\n\t\t? config.args.filter((entry): entry is string => typeof entry === \"string\")\n\t\t: undefined;\n\n\treturn {\n\t\t...config,\n\t\tcommand,\n\t\targs,\n\t\tfileTypes,\n\t\trootMarkers,\n\t};\n}\n\nfunction readConfigFile(filePath: string): NormalizedConfig | null {\n\ttry {\n\t\tconst content = fs.readFileSync(filePath, \"utf-8\");\n\t\tconst parsed = parseConfigContent(content, filePath);\n\t\treturn normalizeConfig(parsed);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction coerceServerConfigs(servers: Record<string, Partial<ServerConfig>>): Record<string, ServerConfig> {\n\tconst result: Record<string, ServerConfig> = {};\n\tfor (const [name, config] of Object.entries(servers)) {\n\t\tconst normalized = normalizeServerConfig(name, config);\n\t\tif (normalized) {\n\t\t\tresult[name] = normalized;\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction mergeServers(\n\tbase: Record<string, ServerConfig>,\n\toverrides: Record<string, Partial<ServerConfig>>,\n): Record<string, ServerConfig> {\n\tconst merged: Record<string, ServerConfig> = { ...base };\n\tfor (const [name, config] of Object.entries(overrides)) {\n\t\tif (merged[name]) {\n\t\t\tconst candidate = { ...merged[name], ...config };\n\t\t\tconst normalized = normalizeServerConfig(name, candidate);\n\t\t\tif (normalized) {\n\t\t\t\tmerged[name] = normalized;\n\t\t\t}\n\t\t} else {\n\t\t\tconst normalized = normalizeServerConfig(name, config);\n\t\t\tif (normalized) {\n\t\t\t\tmerged[name] = normalized;\n\t\t\t}\n\t\t}\n\t}\n\treturn merged;\n}\n\nfunction applyRuntimeDefaults(servers: Record<string, ServerConfig>): Record<string, ServerConfig> {\n\tconst updated: Record<string, ServerConfig> = { ...servers };\n\n\tif (updated.omnisharp?.args) {\n\t\tconst args = updated.omnisharp.args.map((arg: string) => (arg === PID_TOKEN ? String(process.pid) : arg));\n\t\tupdated.omnisharp = { ...updated.omnisharp, args };\n\t}\n\n\treturn updated;\n}\n\n// =============================================================================\n// Configuration Loading\n// =============================================================================\n\nexport function hasRootMarkers(cwd: string, markers: string[]): boolean {\n\tfor (const marker of markers) {\n\t\tif (marker.includes(\"*\")) {\n\t\t\ttry {\n\t\t\t\tconst matches = globSync(marker, { cwd, nodir: false });\n\t\t\t\tif (matches.length > 0) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Failed to resolve glob root marker\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst filePath = path.join(cwd, marker);\n\t\tif (fs.existsSync(filePath)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n// =============================================================================\n// Local Binary Resolution\n// =============================================================================\n\nconst LOCAL_BIN_PATHS: Array<{ markers: string[]; binDir: string }> = [\n\t{ markers: [\"package.json\", \"package-lock.json\", \"yarn.lock\", \"pnpm-lock.yaml\"], binDir: \"node_modules/.bin\" },\n\t{ markers: [\"pyproject.toml\", \"requirements.txt\", \"setup.py\", \"Pipfile\"], binDir: \".venv/bin\" },\n\t{ markers: [\"pyproject.toml\", \"requirements.txt\", \"setup.py\", \"Pipfile\"], binDir: \"venv/bin\" },\n\t{ markers: [\"pyproject.toml\", \"requirements.txt\", \"setup.py\", \"Pipfile\"], binDir: \".env/bin\" },\n\t{ markers: [\"Gemfile\", \"Gemfile.lock\"], binDir: \"vendor/bundle/bin\" },\n\t{ markers: [\"Gemfile\", \"Gemfile.lock\"], binDir: \"bin\" },\n\t{ markers: [\"go.mod\", \"go.sum\"], binDir: \"bin\" },\n];\n\nfunction which(command: string): string | null {\n\tconst result = spawnSync(\"which\", [command], { encoding: \"utf-8\" });\n\tif (result.status !== 0) return null;\n\treturn result.stdout.trim() || null;\n}\n\nexport function resolveCommand(command: string, cwd: string): string | null {\n\tfor (const { markers, binDir } of LOCAL_BIN_PATHS) {\n\t\tif (hasRootMarkers(cwd, markers)) {\n\t\t\tconst localPath = path.join(cwd, binDir, command);\n\t\t\tif (fs.existsSync(localPath)) {\n\t\t\t\treturn localPath;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn which(command);\n}\n\n/**\n * Configuration file search paths (in priority order).\n */\nfunction getConfigPaths(cwd: string): string[] {\n\tconst filenames = [\"lsp.json\", \".lsp.json\", \"lsp.yaml\", \".lsp.yaml\", \"lsp.yml\", \".lsp.yml\"];\n\tconst paths: string[] = [];\n\n\t// Project root files (highest priority)\n\tfor (const filename of filenames) {\n\t\tpaths.push(path.join(cwd, filename));\n\t}\n\n\t// Project config directory\n\tconst projectConfigDir = path.join(cwd, CONFIG_DIR_NAME);\n\tfor (const filename of filenames) {\n\t\tpaths.push(path.join(projectConfigDir, filename));\n\t}\n\n\t// User config directory\n\tconst userConfigDir = path.join(os.homedir(), CONFIG_DIR_NAME, \"agent\");\n\tfor (const filename of filenames) {\n\t\tpaths.push(path.join(userConfigDir, filename));\n\t}\n\n\t// User home root files (lowest priority fallback)\n\tfor (const filename of filenames) {\n\t\tpaths.push(path.join(os.homedir(), filename));\n\t}\n\n\treturn paths;\n}\n\n/**\n * Load LSP configuration.\n *\n * Priority (highest to lowest):\n * 1. Project root: lsp.json/.lsp.json/lsp.yml/.lsp.yml/lsp.yaml/.lsp.yaml\n * 2. Project config dir: {CONFIG_DIR_NAME}/lsp.* (+ hidden variants)\n * 3. User config dir: ~/{CONFIG_DIR_NAME}/agent/lsp.* (+ hidden variants)\n * 4. User home root: ~/lsp.*, ~/.lsp.*\n * 5. Auto-detect from project markers + available binaries\n */\nexport function loadConfig(cwd: string): LspConfig {\n\tlet mergedServers = coerceServerConfigs(DEFAULTS);\n\n\tconst configPaths = getConfigPaths(cwd).reverse();\n\tlet hasOverrides = false;\n\n\tlet idleTimeoutMs: number | undefined;\n\tfor (const configPath of configPaths) {\n\t\tconst parsed = readConfigFile(configPath);\n\t\tif (!parsed) continue;\n\t\tconst hasServerOverrides = Object.keys(parsed.servers).length > 0;\n\t\tif (hasServerOverrides) {\n\t\t\thasOverrides = true;\n\t\t\tmergedServers = mergeServers(mergedServers, parsed.servers);\n\t\t}\n\t\tif (parsed.idleTimeoutMs !== undefined) {\n\t\t\tidleTimeoutMs = parsed.idleTimeoutMs;\n\t\t}\n\t}\n\n\tif (!hasOverrides) {\n\t\tconst detected: Record<string, ServerConfig> = {};\n\t\tconst defaultsWithRuntime = applyRuntimeDefaults(mergedServers);\n\n\t\tfor (const [name, config] of Object.entries(defaultsWithRuntime)) {\n\t\t\tif (!hasRootMarkers(cwd, config.rootMarkers)) continue;\n\t\t\tconst resolved = resolveCommand(config.command, cwd);\n\t\t\tif (!resolved) continue;\n\t\t\tdetected[name] = { ...config, resolvedCommand: resolved };\n\t\t}\n\n\t\treturn { servers: detected, idleTimeoutMs };\n\t}\n\n\tconst mergedWithRuntime = applyRuntimeDefaults(mergedServers);\n\tconst available: Record<string, ServerConfig> = {};\n\n\tfor (const [name, config] of Object.entries(mergedWithRuntime)) {\n\t\tif (config.disabled) continue;\n\t\tconst resolved = resolveCommand(config.command, cwd);\n\t\tif (!resolved) continue;\n\t\tavailable[name] = { ...config, resolvedCommand: resolved };\n\t}\n\n\treturn { servers: available, idleTimeoutMs };\n}\n\n// =============================================================================\n// Server Selection\n// =============================================================================\n\nexport function getServersForFile(config: LspConfig, filePath: string): Array<[string, ServerConfig]> {\n\tconst ext = path.extname(filePath).toLowerCase();\n\tconst fileName = path.basename(filePath).toLowerCase();\n\tconst matches: Array<[string, ServerConfig]> = [];\n\n\tfor (const [name, serverConfig] of Object.entries(config.servers)) {\n\t\tconst supportsFile = serverConfig.fileTypes.some(fileType => {\n\t\t\tconst normalized = fileType.toLowerCase();\n\t\t\treturn normalized === ext || normalized === fileName;\n\t\t});\n\n\t\tif (supportsFile) {\n\t\t\tmatches.push([name, serverConfig]);\n\t\t}\n\t}\n\n\t// Sort: primary servers (non-linters) first, then linters\n\treturn matches.sort((a, b) => {\n\t\tconst aIsLinter = a[1].isLinter ? 1 : 0;\n\t\tconst bIsLinter = b[1].isLinter ? 1 : 0;\n\t\treturn aIsLinter - bIsLinter;\n\t});\n}\n\nexport function getServerForFile(config: LspConfig, filePath: string): [string, ServerConfig] | null {\n\tconst servers = getServersForFile(config, filePath);\n\treturn servers.length > 0 ? servers[0] : null;\n}\n\nexport function hasCapability(\n\tconfig: ServerConfig,\n\tcapability: keyof NonNullable<ServerConfig[\"capabilities\"]>,\n): boolean {\n\treturn config.capabilities?.[capability] === true;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/lsp/config.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport YAML from \"yaml\";\nimport { globSync } from \"glob\";\nimport { CONFIG_DIR_NAME } from \"../../config.js\";\nimport { isRecord } from \"./helpers.js\";\nimport type { ServerConfig } from \"./types.js\";\n\nconst require = createRequire(import.meta.url);\nconst DEFAULTS = require(\"./defaults.json\") as Record<string, Partial<ServerConfig>>;\n\nexport interface LspConfig {\n\tservers: Record<string, ServerConfig>;\n\t/** Idle timeout in milliseconds. If set, LSP clients will be shutdown after this period of inactivity. Disabled by default. */\n\tidleTimeoutMs?: number;\n}\n\n// =============================================================================\n// Default Server Configuration Loading\n// =============================================================================\n\nconst PID_TOKEN = \"$PID\";\n\ninterface NormalizedConfig {\n\tservers: Record<string, Partial<ServerConfig>>;\n\tidleTimeoutMs?: number;\n}\n\nfunction parseConfigContent(content: string, filePath: string): unknown {\n\tconst extension = path.extname(filePath).toLowerCase();\n\tif (extension === \".yaml\" || extension === \".yml\") {\n\t\treturn YAML.parse(content) as unknown;\n\t}\n\treturn JSON.parse(content) as unknown;\n}\n\nfunction normalizeConfig(value: unknown): NormalizedConfig | null {\n\tif (!isRecord(value)) return null;\n\n\tconst idleTimeoutMs = typeof value.idleTimeoutMs === \"number\" ? value.idleTimeoutMs : undefined;\n\tconst rawServers = value.servers;\n\n\tif (isRecord(rawServers)) {\n\t\treturn { servers: rawServers as Record<string, Partial<ServerConfig>>, idleTimeoutMs };\n\t}\n\n\tconst servers = Object.fromEntries(Object.entries(value).filter(([key]) => key !== \"idleTimeoutMs\")) as Record<\n\t\tstring,\n\t\tPartial<ServerConfig>\n\t>;\n\n\treturn { servers, idleTimeoutMs };\n}\n\nfunction normalizeStringArray(value: unknown): string[] | null {\n\tif (!Array.isArray(value)) return null;\n\tconst items = value.filter((entry): entry is string => typeof entry === \"string\" && entry.length > 0);\n\treturn items.length > 0 ? items : null;\n}\n\nfunction normalizeServerConfig(name: string, config: Partial<ServerConfig>): ServerConfig | null {\n\tconst command = typeof config.command === \"string\" && config.command.length > 0 ? config.command : null;\n\tconst fileTypes = normalizeStringArray(config.fileTypes);\n\tconst rootMarkers = normalizeStringArray(config.rootMarkers);\n\n\tif (!command || !fileTypes || !rootMarkers) {\n\t\treturn null;\n\t}\n\n\tconst args = Array.isArray(config.args)\n\t\t? config.args.filter((entry): entry is string => typeof entry === \"string\")\n\t\t: undefined;\n\n\treturn {\n\t\t...config,\n\t\tcommand,\n\t\targs,\n\t\tfileTypes,\n\t\trootMarkers,\n\t};\n}\n\nfunction readConfigFile(filePath: string): NormalizedConfig | null {\n\ttry {\n\t\tconst content = fs.readFileSync(filePath, \"utf-8\");\n\t\tconst parsed = parseConfigContent(content, filePath);\n\t\treturn normalizeConfig(parsed);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction coerceServerConfigs(servers: Record<string, Partial<ServerConfig>>): Record<string, ServerConfig> {\n\tconst result: Record<string, ServerConfig> = {};\n\tfor (const [name, config] of Object.entries(servers)) {\n\t\tconst normalized = normalizeServerConfig(name, config);\n\t\tif (normalized) {\n\t\t\tresult[name] = normalized;\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction mergeServers(\n\tbase: Record<string, ServerConfig>,\n\toverrides: Record<string, Partial<ServerConfig>>,\n): Record<string, ServerConfig> {\n\tconst merged: Record<string, ServerConfig> = { ...base };\n\tfor (const [name, config] of Object.entries(overrides)) {\n\t\tif (merged[name]) {\n\t\t\tconst candidate = { ...merged[name], ...config };\n\t\t\tconst normalized = normalizeServerConfig(name, candidate);\n\t\t\tif (normalized) {\n\t\t\t\tmerged[name] = normalized;\n\t\t\t}\n\t\t} else {\n\t\t\tconst normalized = normalizeServerConfig(name, config);\n\t\t\tif (normalized) {\n\t\t\t\tmerged[name] = normalized;\n\t\t\t}\n\t\t}\n\t}\n\treturn merged;\n}\n\nfunction applyRuntimeDefaults(servers: Record<string, ServerConfig>): Record<string, ServerConfig> {\n\tconst updated: Record<string, ServerConfig> = { ...servers };\n\n\tif (updated.omnisharp?.args) {\n\t\tconst args = updated.omnisharp.args.map((arg: string) => (arg === PID_TOKEN ? String(process.pid) : arg));\n\t\tupdated.omnisharp = { ...updated.omnisharp, args };\n\t}\n\n\treturn updated;\n}\n\n// =============================================================================\n// Configuration Loading\n// =============================================================================\n\nexport function hasRootMarkers(cwd: string, markers: string[]): boolean {\n\tfor (const marker of markers) {\n\t\tif (marker.includes(\"*\")) {\n\t\t\ttry {\n\t\t\t\tconst matches = globSync(marker, { cwd, nodir: false });\n\t\t\t\tif (matches.length > 0) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Failed to resolve glob root marker\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst filePath = path.join(cwd, marker);\n\t\tif (fs.existsSync(filePath)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n// =============================================================================\n// Local Binary Resolution\n// =============================================================================\n\nconst LOCAL_BIN_PATHS: Array<{ markers: string[]; binDir: string }> = [\n\t{ markers: [\"package.json\", \"package-lock.json\", \"yarn.lock\", \"pnpm-lock.yaml\"], binDir: \"node_modules/.bin\" },\n\t{ markers: [\"pyproject.toml\", \"requirements.txt\", \"setup.py\", \"Pipfile\"], binDir: \".venv/bin\" },\n\t{ markers: [\"pyproject.toml\", \"requirements.txt\", \"setup.py\", \"Pipfile\"], binDir: \"venv/bin\" },\n\t{ markers: [\"pyproject.toml\", \"requirements.txt\", \"setup.py\", \"Pipfile\"], binDir: \".env/bin\" },\n\t{ markers: [\"Gemfile\", \"Gemfile.lock\"], binDir: \"vendor/bundle/bin\" },\n\t{ markers: [\"Gemfile\", \"Gemfile.lock\"], binDir: \"bin\" },\n\t{ markers: [\"go.mod\", \"go.sum\"], binDir: \"bin\" },\n];\n\nfunction which(command: string): string | null {\n\t// On Windows, prefer `where.exe` over `which` — MSYS/Git Bash's `which`\n\t// returns POSIX paths (/c/Users/...) that Node's spawn() can't execute.\n\t// `where.exe` returns native Windows paths (C:\\Users\\...).\n\tconst isWindows = process.platform === \"win32\";\n\tconst cmd = isWindows ? \"where.exe\" : \"which\";\n\tconst result = spawnSync(cmd, [command], { encoding: \"utf-8\", shell: isWindows });\n\tif (result.status !== 0) return null;\n\t// `where.exe` may return multiple lines — take the first\n\tconst resolved = result.stdout.trim().split(/\\r?\\n/)[0]?.trim();\n\treturn resolved || null;\n}\n\nexport function resolveCommand(command: string, cwd: string): string | null {\n\tfor (const { markers, binDir } of LOCAL_BIN_PATHS) {\n\t\tif (hasRootMarkers(cwd, markers)) {\n\t\t\tconst localPath = path.join(cwd, binDir, command);\n\t\t\tif (fs.existsSync(localPath)) {\n\t\t\t\treturn localPath;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn which(command);\n}\n\n/**\n * Configuration file search paths (in priority order).\n */\nfunction getConfigPaths(cwd: string): string[] {\n\tconst filenames = [\"lsp.json\", \".lsp.json\", \"lsp.yaml\", \".lsp.yaml\", \"lsp.yml\", \".lsp.yml\"];\n\tconst paths: string[] = [];\n\n\t// Project root files (highest priority)\n\tfor (const filename of filenames) {\n\t\tpaths.push(path.join(cwd, filename));\n\t}\n\n\t// Project config directory\n\tconst projectConfigDir = path.join(cwd, CONFIG_DIR_NAME);\n\tfor (const filename of filenames) {\n\t\tpaths.push(path.join(projectConfigDir, filename));\n\t}\n\n\t// User config directory\n\tconst userConfigDir = path.join(os.homedir(), CONFIG_DIR_NAME, \"agent\");\n\tfor (const filename of filenames) {\n\t\tpaths.push(path.join(userConfigDir, filename));\n\t}\n\n\t// User home root files (lowest priority fallback)\n\tfor (const filename of filenames) {\n\t\tpaths.push(path.join(os.homedir(), filename));\n\t}\n\n\treturn paths;\n}\n\n/**\n * Load LSP configuration.\n *\n * Priority (highest to lowest):\n * 1. Project root: lsp.json/.lsp.json/lsp.yml/.lsp.yml/lsp.yaml/.lsp.yaml\n * 2. Project config dir: {CONFIG_DIR_NAME}/lsp.* (+ hidden variants)\n * 3. User config dir: ~/{CONFIG_DIR_NAME}/agent/lsp.* (+ hidden variants)\n * 4. User home root: ~/lsp.*, ~/.lsp.*\n * 5. Auto-detect from project markers + available binaries\n */\nexport function loadConfig(cwd: string): LspConfig {\n\tlet mergedServers = coerceServerConfigs(DEFAULTS);\n\n\tconst configPaths = getConfigPaths(cwd).reverse();\n\tlet hasOverrides = false;\n\n\tlet idleTimeoutMs: number | undefined;\n\tfor (const configPath of configPaths) {\n\t\tconst parsed = readConfigFile(configPath);\n\t\tif (!parsed) continue;\n\t\tconst hasServerOverrides = Object.keys(parsed.servers).length > 0;\n\t\tif (hasServerOverrides) {\n\t\t\thasOverrides = true;\n\t\t\tmergedServers = mergeServers(mergedServers, parsed.servers);\n\t\t}\n\t\tif (parsed.idleTimeoutMs !== undefined) {\n\t\t\tidleTimeoutMs = parsed.idleTimeoutMs;\n\t\t}\n\t}\n\n\tif (!hasOverrides) {\n\t\tconst detected: Record<string, ServerConfig> = {};\n\t\tconst defaultsWithRuntime = applyRuntimeDefaults(mergedServers);\n\n\t\tfor (const [name, config] of Object.entries(defaultsWithRuntime)) {\n\t\t\tif (!hasRootMarkers(cwd, config.rootMarkers)) continue;\n\t\t\tconst resolved = resolveCommand(config.command, cwd);\n\t\t\tif (!resolved) continue;\n\t\t\tdetected[name] = { ...config, resolvedCommand: resolved };\n\t\t}\n\n\t\treturn { servers: detected, idleTimeoutMs };\n\t}\n\n\tconst mergedWithRuntime = applyRuntimeDefaults(mergedServers);\n\tconst available: Record<string, ServerConfig> = {};\n\n\tfor (const [name, config] of Object.entries(mergedWithRuntime)) {\n\t\tif (config.disabled) continue;\n\t\tconst resolved = resolveCommand(config.command, cwd);\n\t\tif (!resolved) continue;\n\t\tavailable[name] = { ...config, resolvedCommand: resolved };\n\t}\n\n\treturn { servers: available, idleTimeoutMs };\n}\n\n// =============================================================================\n// Server Selection\n// =============================================================================\n\nexport function getServersForFile(config: LspConfig, filePath: string): Array<[string, ServerConfig]> {\n\tconst ext = path.extname(filePath).toLowerCase();\n\tconst fileName = path.basename(filePath).toLowerCase();\n\tconst matches: Array<[string, ServerConfig]> = [];\n\n\tfor (const [name, serverConfig] of Object.entries(config.servers)) {\n\t\tconst supportsFile = serverConfig.fileTypes.some(fileType => {\n\t\t\tconst normalized = fileType.toLowerCase();\n\t\t\treturn normalized === ext || normalized === fileName;\n\t\t});\n\n\t\tif (supportsFile) {\n\t\t\tmatches.push([name, serverConfig]);\n\t\t}\n\t}\n\n\t// Sort: primary servers (non-linters) first, then linters\n\treturn matches.sort((a, b) => {\n\t\tconst aIsLinter = a[1].isLinter ? 1 : 0;\n\t\tconst bIsLinter = b[1].isLinter ? 1 : 0;\n\t\treturn aIsLinter - bIsLinter;\n\t});\n}\n\nexport function getServerForFile(config: LspConfig, filePath: string): [string, ServerConfig] | null {\n\tconst servers = getServersForFile(config, filePath);\n\treturn servers.length > 0 ? servers[0] : null;\n}\n\nexport function hasCapability(\n\tconfig: ServerConfig,\n\tcapability: keyof NonNullable<ServerConfig[\"capabilities\"]>,\n): boolean {\n\treturn config.capabilities?.[capability] === true;\n}\n"]}
|
|
@@ -437,6 +437,14 @@ export async function getOrCreateClient(config: ServerConfig, cwd: string, initT
|
|
|
437
437
|
env: env ? { ...process.env, ...env } : undefined,
|
|
438
438
|
});
|
|
439
439
|
|
|
440
|
+
// Handle spawn failure (e.g., ENOENT when the command doesn't exist).
|
|
441
|
+
// Without this, the error bubbles up and can crash auto-mode (#901).
|
|
442
|
+
proc.on("error", (err: NodeJS.ErrnoException) => {
|
|
443
|
+
if (err.code === "ENOENT") {
|
|
444
|
+
proc.emit("exit", 1);
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
|
|
440
448
|
const exitedPromise = new Promise<number>((resolve) => {
|
|
441
449
|
proc.on("exit", (code: number | null) => resolve(code ?? 1));
|
|
442
450
|
});
|
|
@@ -177,9 +177,16 @@ const LOCAL_BIN_PATHS: Array<{ markers: string[]; binDir: string }> = [
|
|
|
177
177
|
];
|
|
178
178
|
|
|
179
179
|
function which(command: string): string | null {
|
|
180
|
-
|
|
180
|
+
// On Windows, prefer `where.exe` over `which` — MSYS/Git Bash's `which`
|
|
181
|
+
// returns POSIX paths (/c/Users/...) that Node's spawn() can't execute.
|
|
182
|
+
// `where.exe` returns native Windows paths (C:\Users\...).
|
|
183
|
+
const isWindows = process.platform === "win32";
|
|
184
|
+
const cmd = isWindows ? "where.exe" : "which";
|
|
185
|
+
const result = spawnSync(cmd, [command], { encoding: "utf-8", shell: isWindows });
|
|
181
186
|
if (result.status !== 0) return null;
|
|
182
|
-
|
|
187
|
+
// `where.exe` may return multiple lines — take the first
|
|
188
|
+
const resolved = result.stdout.trim().split(/\r?\n/)[0]?.trim();
|
|
189
|
+
return resolved || null;
|
|
183
190
|
}
|
|
184
191
|
|
|
185
192
|
export function resolveCommand(command: string, cwd: string): string | null {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/components/editor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/components/editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -423,7 +423,7 @@ export class Editor {
|
|
|
423
423
|
this.state.lines = result.lines;
|
|
424
424
|
this.state.cursorLine = result.cursorLine;
|
|
425
425
|
this.setCursorCol(result.cursorCol);
|
|
426
|
-
if (this.autocompletePrefix.startsWith("/")) {
|
|
426
|
+
if (this.autocompletePrefix.startsWith("/") || this.isInSlashCommandContext((this.state.lines[this.state.cursorLine] || "").slice(0, this.state.cursorCol))) {
|
|
427
427
|
this.cancelAutocomplete();
|
|
428
428
|
// Fall through to submit
|
|
429
429
|
}
|