lsd-pi 1.1.2 → 1.1.3

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 (183) hide show
  1. package/README.md +2 -1
  2. package/dist/bedrock-auth.d.ts +25 -0
  3. package/dist/bedrock-auth.js +59 -0
  4. package/dist/headless.js +8 -3
  5. package/dist/loader.js +1 -0
  6. package/dist/onboarding-llm.d.ts +37 -0
  7. package/dist/onboarding-llm.js +64 -0
  8. package/dist/onboarding.d.ts +2 -14
  9. package/dist/onboarding.js +146 -71
  10. package/dist/pi-migration.js +1 -0
  11. package/dist/resources/extensions/memory/auto-extract.js +21 -3
  12. package/dist/resources/extensions/memory/dream.js +703 -0
  13. package/dist/resources/extensions/memory/extension-manifest.json +2 -2
  14. package/dist/resources/extensions/memory/index.js +115 -8
  15. package/dist/resources/extensions/slash-commands/extension-manifest.json +10 -10
  16. package/dist/resources/extensions/slash-commands/index.js +0 -4
  17. package/dist/resources/extensions/slash-commands/plan.js +181 -45
  18. package/dist/resources/extensions/subagent/agents.js +14 -1
  19. package/dist/resources/extensions/subagent/configured-model.js +3 -2
  20. package/dist/resources/extensions/subagent/index.js +34 -28
  21. package/dist/resources/extensions/subagent/launch-helpers.js +24 -0
  22. package/dist/resources/extensions/subagent/model-resolution.js +41 -3
  23. package/dist/resources/extensions/usage/extension-manifest.json +11 -0
  24. package/dist/resources/extensions/usage/index.js +346 -0
  25. package/{src/resources/skills/create-gsd-extension → dist/resources/skills/create-lsd-extension}/SKILL.md +6 -6
  26. package/{src/resources/skills/create-gsd-extension → dist/resources/skills/create-lsd-extension}/references/custom-tools.md +1 -1
  27. package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extension-lifecycle.md +2 -2
  28. package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensioncontext-reference.md +1 -1
  29. package/{src/resources/skills/create-gsd-extension → dist/resources/skills/create-lsd-extension}/references/key-rules-gotchas.md +4 -4
  30. package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/packaging-distribution.md +6 -6
  31. package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/create-extension.md +3 -3
  32. package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/debug-extension.md +5 -5
  33. package/dist/resources/skills/teams-debug/SKILL.md +5 -6
  34. package/dist/resources/skills/teams-document/SKILL.md +1 -2
  35. package/dist/resources/skills/teams-plan/SKILL.md +3 -4
  36. package/dist/resources/skills/teams-run/SKILL.md +3 -4
  37. package/dist/resources/skills/teams-verify/SKILL.md +4 -5
  38. package/dist/startup-model-validation.js +1 -0
  39. package/dist/welcome-screen.js +13 -11
  40. package/dist/wizard.js +12 -0
  41. package/package.json +1 -1
  42. package/packages/pi-ai/dist/models.generated.d.ts +688 -409
  43. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  44. package/packages/pi-ai/dist/models.generated.js +761 -488
  45. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  46. package/packages/pi-ai/scripts/generate-models.ts +40 -18
  47. package/packages/pi-ai/src/models.generated.ts +759 -486
  48. package/packages/pi-coding-agent/dist/cli/config-selector.js +1 -1
  49. package/packages/pi-coding-agent/dist/cli/config-selector.js.map +1 -1
  50. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +1 -2
  51. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  52. package/packages/pi-coding-agent/dist/core/agent-session.js +6 -30
  53. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  54. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +6 -0
  55. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  56. package/packages/pi-coding-agent/dist/core/settings-manager.js +44 -1
  57. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  58. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +9 -5
  59. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  60. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  61. package/packages/pi-coding-agent/dist/core/skills.js +3 -2
  62. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  63. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  64. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  65. package/packages/pi-coding-agent/dist/index.js +1 -1
  66. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  67. package/packages/pi-coding-agent/dist/main.js +1 -1
  68. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  69. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -2
  70. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  71. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  72. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +15 -12
  73. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  74. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +6 -0
  75. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  76. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +25 -1
  77. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  78. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  79. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  80. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  81. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +10 -0
  82. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  83. package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.js +1 -1
  84. package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
  85. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  86. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +31 -22
  87. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  88. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +18 -5
  89. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  90. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +139 -20
  91. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  92. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  93. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +4 -0
  94. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  95. package/packages/pi-coding-agent/package.json +1 -1
  96. package/packages/pi-coding-agent/src/cli/config-selector.ts +1 -1
  97. package/packages/pi-coding-agent/src/core/agent-session.ts +5 -28
  98. package/packages/pi-coding-agent/src/core/settings-manager.ts +52 -1
  99. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +18 -5
  100. package/packages/pi-coding-agent/src/core/skills.ts +3 -2
  101. package/packages/pi-coding-agent/src/index.ts +1 -1
  102. package/packages/pi-coding-agent/src/main.ts +1 -1
  103. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +2 -2
  104. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +12 -13
  105. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +39 -1
  106. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  107. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +10 -0
  108. package/packages/pi-coding-agent/src/modes/interactive/controllers/extension-ui-controller.ts +1 -1
  109. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +46 -20
  110. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +171 -20
  111. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +4 -0
  112. package/packages/pi-tui/dist/components/editor.d.ts +1 -0
  113. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  114. package/packages/pi-tui/dist/components/editor.js +23 -0
  115. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  116. package/packages/pi-tui/src/components/editor.ts +23 -0
  117. package/pkg/dist/modes/interactive/theme/theme.d.ts +18 -5
  118. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  119. package/pkg/dist/modes/interactive/theme/theme.js +139 -20
  120. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  121. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  122. package/pkg/dist/modes/interactive/theme/themes.js +4 -0
  123. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  124. package/pkg/package.json +1 -1
  125. package/src/resources/extensions/memory/auto-extract.ts +23 -3
  126. package/src/resources/extensions/memory/dream.ts +814 -0
  127. package/src/resources/extensions/memory/extension-manifest.json +2 -2
  128. package/src/resources/extensions/memory/index.ts +134 -13
  129. package/src/resources/extensions/memory/tests/auto-extract.test.ts +10 -2
  130. package/src/resources/extensions/memory/tests/dream.test.ts +142 -0
  131. package/src/resources/extensions/slash-commands/extension-manifest.json +10 -10
  132. package/src/resources/extensions/slash-commands/index.ts +3 -7
  133. package/src/resources/extensions/slash-commands/plan.ts +192 -46
  134. package/src/resources/extensions/subagent/agents.ts +11 -1
  135. package/src/resources/extensions/subagent/configured-model.ts +3 -2
  136. package/src/resources/extensions/subagent/index.ts +38 -30
  137. package/src/resources/extensions/subagent/launch-helpers.ts +30 -0
  138. package/src/resources/extensions/subagent/model-resolution.ts +40 -3
  139. package/src/resources/extensions/usage/extension-manifest.json +11 -0
  140. package/src/resources/extensions/usage/index.ts +441 -0
  141. package/{dist/resources/skills/create-gsd-extension → src/resources/skills/create-lsd-extension}/SKILL.md +6 -6
  142. package/{dist/resources/skills/create-gsd-extension → src/resources/skills/create-lsd-extension}/references/custom-tools.md +1 -1
  143. package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extension-lifecycle.md +2 -2
  144. package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensioncontext-reference.md +1 -1
  145. package/{dist/resources/skills/create-gsd-extension → src/resources/skills/create-lsd-extension}/references/key-rules-gotchas.md +4 -4
  146. package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/packaging-distribution.md +6 -6
  147. package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/create-extension.md +3 -3
  148. package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/debug-extension.md +5 -5
  149. package/src/resources/skills/teams-debug/SKILL.md +5 -6
  150. package/src/resources/skills/teams-document/SKILL.md +1 -2
  151. package/src/resources/skills/teams-plan/SKILL.md +3 -4
  152. package/src/resources/skills/teams-run/SKILL.md +3 -4
  153. package/src/resources/skills/teams-verify/SKILL.md +4 -5
  154. package/dist/resources/extensions/slash-commands/create-extension.js +0 -264
  155. package/dist/resources/extensions/slash-commands/create-slash-command.js +0 -208
  156. package/src/resources/extensions/slash-commands/create-extension.ts +0 -297
  157. package/src/resources/extensions/slash-commands/create-slash-command.ts +0 -234
  158. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/compaction-session-control.md +0 -0
  159. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-commands.md +0 -0
  160. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-rendering.md +0 -0
  161. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-ui.md +0 -0
  162. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/events-reference.md +0 -0
  163. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensionapi-reference.md +0 -0
  164. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/mode-behavior.md +0 -0
  165. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/model-provider-management.md +0 -0
  166. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/remote-execution-overrides.md +0 -0
  167. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/state-management.md +0 -0
  168. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/system-prompt-modification.md +0 -0
  169. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/add-capability.md +0 -0
  170. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/compaction-session-control.md +0 -0
  171. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-commands.md +0 -0
  172. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-rendering.md +0 -0
  173. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-ui.md +0 -0
  174. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/events-reference.md +0 -0
  175. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensionapi-reference.md +0 -0
  176. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/mode-behavior.md +0 -0
  177. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/model-provider-management.md +0 -0
  178. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/remote-execution-overrides.md +0 -0
  179. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/state-management.md +0 -0
  180. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/system-prompt-modification.md +0 -0
  181. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/templates/extension-skeleton.ts +0 -0
  182. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/templates/stateful-tool-skeleton.ts +0 -0
  183. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/add-capability.md +0 -0
package/README.md CHANGED
@@ -242,7 +242,8 @@ A few quality-of-life touches in the TUI:
242
242
 
243
243
  - the footer can show a live cache timer for the current prompt-cache window
244
244
  - `/hotkeys` gives you a full shortcut reference on demand
245
- - `/settings` now includes toggles for Codex rotate, the cache timer, and RTK shell-command compression
245
+ - `/settings` now includes toggles for Codex rotate, the cache timer, RTK shell-command compression, and a configurable **Main accent** preset
246
+ - changing the main accent also updates accent-driven UI elements and the text input border across thinking levels
246
247
 
247
248
  Some workflow/automation commands still use the legacy namespace:
248
249
 
@@ -0,0 +1,25 @@
1
+ import type { AuthStorage } from '@gsd/pi-coding-agent';
2
+ export declare const BEDROCK_PROVIDER_ID = "amazon-bedrock";
3
+ export type BedrockCredentialInput = {
4
+ authType: 'sso';
5
+ profile: string;
6
+ region: string;
7
+ } | {
8
+ authType: 'access-key';
9
+ accessKeyId: string;
10
+ secretAccessKey: string;
11
+ region: string;
12
+ };
13
+ export type BedrockStoredCredential = ({
14
+ version: 1;
15
+ } & Extract<BedrockCredentialInput, {
16
+ authType: 'sso';
17
+ }>) | ({
18
+ version: 1;
19
+ } & Extract<BedrockCredentialInput, {
20
+ authType: 'access-key';
21
+ }>);
22
+ export declare function encodeBedrockCredential(credential: BedrockCredentialInput): string;
23
+ export declare function decodeBedrockCredential(value: string): BedrockStoredCredential | null;
24
+ export declare function applyBedrockCredentialToEnv(credential: BedrockStoredCredential): void;
25
+ export declare function saveBedrockCredential(authStorage: AuthStorage, credential: BedrockCredentialInput): void;
@@ -0,0 +1,59 @@
1
+ export const BEDROCK_PROVIDER_ID = 'amazon-bedrock';
2
+ export function encodeBedrockCredential(credential) {
3
+ return JSON.stringify({ version: 1, ...credential });
4
+ }
5
+ export function decodeBedrockCredential(value) {
6
+ try {
7
+ const parsed = JSON.parse(value);
8
+ if (parsed.version !== 1 || typeof parsed.region !== 'string' || !parsed.region.trim()) {
9
+ return null;
10
+ }
11
+ if (parsed.authType === 'sso' && typeof parsed.profile === 'string' && parsed.profile.trim()) {
12
+ return {
13
+ version: 1,
14
+ authType: 'sso',
15
+ profile: parsed.profile.trim(),
16
+ region: parsed.region.trim(),
17
+ };
18
+ }
19
+ if (parsed.authType === 'access-key' &&
20
+ typeof parsed.accessKeyId === 'string' &&
21
+ typeof parsed.secretAccessKey === 'string' &&
22
+ parsed.accessKeyId.trim() &&
23
+ parsed.secretAccessKey.trim()) {
24
+ return {
25
+ version: 1,
26
+ authType: 'access-key',
27
+ accessKeyId: parsed.accessKeyId.trim(),
28
+ secretAccessKey: parsed.secretAccessKey.trim(),
29
+ region: parsed.region.trim(),
30
+ };
31
+ }
32
+ }
33
+ catch {
34
+ // Ignore malformed or legacy plain-text values.
35
+ }
36
+ return null;
37
+ }
38
+ function clearBedrockEnv() {
39
+ delete process.env.AWS_PROFILE;
40
+ delete process.env.AWS_ACCESS_KEY_ID;
41
+ delete process.env.AWS_SECRET_ACCESS_KEY;
42
+ }
43
+ export function applyBedrockCredentialToEnv(credential) {
44
+ clearBedrockEnv();
45
+ process.env.AWS_REGION = credential.region;
46
+ process.env.AWS_DEFAULT_REGION = credential.region;
47
+ if (credential.authType === 'sso') {
48
+ process.env.AWS_PROFILE = credential.profile;
49
+ return;
50
+ }
51
+ process.env.AWS_ACCESS_KEY_ID = credential.accessKeyId;
52
+ process.env.AWS_SECRET_ACCESS_KEY = credential.secretAccessKey;
53
+ }
54
+ export function saveBedrockCredential(authStorage, credential) {
55
+ const encoded = encodeBedrockCredential(credential);
56
+ authStorage.remove(BEDROCK_PROVIDER_ID);
57
+ authStorage.set(BEDROCK_PROVIDER_ID, { type: 'api_key', key: encoded });
58
+ applyBedrockCredentialToEnv({ version: 1, ...credential });
59
+ }
package/dist/headless.js CHANGED
@@ -184,7 +184,8 @@ async function runHeadlessOnce(options, restartCount) {
184
184
  // per-unit timeout via auto-supervisor. Disable the overall timeout unless the
185
185
  // user explicitly set --timeout.
186
186
  const isAutoMode = options.command === 'auto';
187
- const isMultiTurnCommand = options.command === 'auto' || options.command === 'next';
187
+ let isMultiTurnCommand = options.command === 'auto' || options.command === 'next';
188
+ let isSingleTurnContextRun = false;
188
189
  if (isAutoMode && options.timeout === 300_000) {
189
190
  options.timeout = 0;
190
191
  }
@@ -213,6 +214,10 @@ async function runHeadlessOnce(options, restartCount) {
213
214
  if (options.context || options.contextText) {
214
215
  try {
215
216
  contextContent = await loadContext(options);
217
+ isSingleTurnContextRun = !!(options.bare && contextContent);
218
+ if (isSingleTurnContextRun) {
219
+ isMultiTurnCommand = false;
220
+ }
216
221
  }
217
222
  catch (err) {
218
223
  process.stderr.write(`[headless] Error loading context: ${err instanceof Error ? err.message : String(err)}\n`);
@@ -591,8 +596,8 @@ async function runHeadlessOnce(options, restartCount) {
591
596
  return;
592
597
  }
593
598
  }
594
- // Quick commands: resolve on first agent_end
595
- if (eventObj.type === 'agent_end' && isQuickCommand(options.command) && !completed) {
599
+ // Quick commands and bare+context runs: resolve on first agent_end
600
+ if (eventObj.type === 'agent_end' && (isQuickCommand(options.command) || isSingleTurnContextRun) && !completed) {
596
601
  completed = true;
597
602
  resolveCompletion();
598
603
  return;
package/dist/loader.js CHANGED
@@ -142,6 +142,7 @@ const discoveredExtensionPaths = discoverExtensionEntryPaths(bundledExtDir)
142
142
  return isExtensionEnabled(registry, manifest.id, manifest.defaultEnabled ?? true);
143
143
  });
144
144
  process.env.LSD_BUNDLED_EXTENSION_PATHS = serializeBundledExtensionPaths(discoveredExtensionPaths);
145
+ process.env.GSD_BUNDLED_EXTENSION_PATHS = process.env.LSD_BUNDLED_EXTENSION_PATHS;
145
146
  // Respect HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars for all outbound requests.
146
147
  // pi-coding-agent's cli.ts sets this, but GSD bypasses that entry point — so we
147
148
  // must set it here before any SDK clients are created.
@@ -0,0 +1,37 @@
1
+ import type { AuthStorage } from '@gsd/pi-coding-agent';
2
+ export { BEDROCK_PROVIDER_ID } from './bedrock-auth.js';
3
+ export type LlmProviderOption = {
4
+ value: string;
5
+ label: string;
6
+ hint?: string;
7
+ };
8
+ export declare const LLM_PROVIDER_IDS: string[];
9
+ export declare const BUDGET_MODEL_OPTIONS: {
10
+ value: string;
11
+ label: string;
12
+ hint: string;
13
+ }[];
14
+ export declare function getOtherLlmProviders(): ({
15
+ readonly value: "google";
16
+ readonly label: "Google (Gemini)";
17
+ } | {
18
+ readonly value: "groq";
19
+ readonly label: "Groq";
20
+ } | {
21
+ readonly value: "xai";
22
+ readonly label: "xAI (Grok)";
23
+ } | {
24
+ readonly value: "openrouter";
25
+ readonly label: "OpenRouter";
26
+ } | {
27
+ readonly value: "mistral";
28
+ readonly label: "Mistral";
29
+ } | {
30
+ readonly value: "ollama-cloud";
31
+ readonly label: "Ollama Cloud";
32
+ } | {
33
+ readonly value: "custom-openai";
34
+ readonly label: "Custom (OpenAI-compatible)";
35
+ })[];
36
+ export declare function getLlmProviderOptions(method: 'browser' | 'api-key'): LlmProviderOption[];
37
+ export declare function shouldRunOnboarding(authStorage: AuthStorage, settingsDefaultProvider?: string): boolean;
@@ -0,0 +1,64 @@
1
+ import { BEDROCK_PROVIDER_ID } from './bedrock-auth.js';
2
+ export { BEDROCK_PROVIDER_ID } from './bedrock-auth.js';
3
+ export const LLM_PROVIDER_IDS = [
4
+ 'anthropic',
5
+ 'anthropic-vertex',
6
+ 'openai',
7
+ 'github-copilot',
8
+ 'openai-codex',
9
+ 'google-gemini-cli',
10
+ 'google-antigravity',
11
+ 'google',
12
+ 'groq',
13
+ 'xai',
14
+ 'openrouter',
15
+ 'mistral',
16
+ 'ollama-cloud',
17
+ 'custom-openai',
18
+ BEDROCK_PROVIDER_ID,
19
+ ];
20
+ const OTHER_PROVIDERS = [
21
+ { value: 'google', label: 'Google (Gemini)' },
22
+ { value: 'groq', label: 'Groq' },
23
+ { value: 'xai', label: 'xAI (Grok)' },
24
+ { value: 'openrouter', label: 'OpenRouter' },
25
+ { value: 'mistral', label: 'Mistral' },
26
+ { value: 'ollama-cloud', label: 'Ollama Cloud' },
27
+ { value: 'custom-openai', label: 'Custom (OpenAI-compatible)' },
28
+ ];
29
+ export const BUDGET_MODEL_OPTIONS = [
30
+ { value: 'anthropic/claude-haiku-4-5', label: 'Claude Haiku 4.5', hint: 'recommended for scout/subagents' },
31
+ { value: 'google/gemini-2.5-flash', label: 'Gemini 2.5 Flash', hint: 'fast and cheap' },
32
+ { value: 'google/gemini-3-flash-preview', label: 'Gemini 3 Flash Preview', hint: 'newer flash option' },
33
+ { value: 'openai/gpt-4.1-mini', label: 'GPT-4.1 mini', hint: 'small general-purpose option' },
34
+ { value: 'openai/gpt-5.4-mini', label: 'GPT-5.4 mini', hint: 'fast and cheap — OpenAI' },
35
+ ];
36
+ export function getOtherLlmProviders() {
37
+ return [...OTHER_PROVIDERS];
38
+ }
39
+ export function getLlmProviderOptions(method) {
40
+ if (method === 'browser') {
41
+ return [
42
+ { value: 'anthropic', label: 'Anthropic (Claude)', hint: 'recommended' },
43
+ { value: 'github-copilot', label: 'GitHub Copilot' },
44
+ { value: 'openai-codex', label: 'ChatGPT Plus/Pro (Codex)' },
45
+ { value: BEDROCK_PROVIDER_ID, label: 'AWS SSO Login', hint: 'Amazon Bedrock via aws sso login' },
46
+ { value: 'google-gemini-cli', label: 'Google Gemini CLI' },
47
+ { value: 'google-antigravity', label: 'Antigravity (Gemini 3, Claude, GPT-OSS)' },
48
+ ];
49
+ }
50
+ return [
51
+ { value: 'anthropic', label: 'Anthropic (Claude)' },
52
+ { value: 'openai', label: 'OpenAI' },
53
+ { value: BEDROCK_PROVIDER_ID, label: 'Amazon Bedrock', hint: 'AWS access key + region' },
54
+ ...OTHER_PROVIDERS.map(op => ({ value: op.value, label: op.label })),
55
+ ];
56
+ }
57
+ export function shouldRunOnboarding(authStorage, settingsDefaultProvider) {
58
+ if (!process.stdin.isTTY)
59
+ return false;
60
+ if (settingsDefaultProvider)
61
+ return false;
62
+ const hasLlmAuth = LLM_PROVIDER_IDS.some(id => authStorage.hasAuth(id));
63
+ return !hasLlmAuth;
64
+ }
@@ -10,20 +10,8 @@
10
10
  * All steps are skippable. All errors are recoverable. Never crashes boot.
11
11
  */
12
12
  import type { AuthStorage, SettingsManager } from '@gsd/pi-coding-agent';
13
- /**
14
- * Determine if the onboarding wizard should run.
15
- *
16
- * Returns true when:
17
- * - No LLM provider auth is available
18
- * - We're on a TTY (interactive terminal)
19
- *
20
- * Returns false (skip wizard) when:
21
- * - Any LLM provider is already available via auth.json, env vars, runtime overrides, or fallback auth
22
- * - A default provider is already configured in settings (covers extension-based providers
23
- * that may not require credentials in auth.json)
24
- * - Not a TTY (piped input, subagent, CI)
25
- */
26
- export declare function shouldRunOnboarding(authStorage: AuthStorage, settingsDefaultProvider?: string): boolean;
13
+ export { BEDROCK_PROVIDER_ID, saveBedrockCredential } from './bedrock-auth.js';
14
+ export { BUDGET_MODEL_OPTIONS, getLlmProviderOptions, LLM_PROVIDER_IDS, shouldRunOnboarding } from './onboarding-llm.js';
27
15
  /**
28
16
  * Run the unified onboarding wizard.
29
17
  *
@@ -9,9 +9,13 @@
9
9
  *
10
10
  * All steps are skippable. All errors are recoverable. Never crashes boot.
11
11
  */
12
- import { execFile } from 'node:child_process';
12
+ import { execFile, spawnSync } from 'node:child_process';
13
13
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
14
14
  import { dirname, join } from 'node:path';
15
+ import { BEDROCK_PROVIDER_ID, saveBedrockCredential } from './bedrock-auth.js';
16
+ export { BEDROCK_PROVIDER_ID, saveBedrockCredential } from './bedrock-auth.js';
17
+ import { BUDGET_MODEL_OPTIONS, getLlmProviderOptions, getOtherLlmProviders, LLM_PROVIDER_IDS } from './onboarding-llm.js';
18
+ export { BUDGET_MODEL_OPTIONS, getLlmProviderOptions, LLM_PROVIDER_IDS, shouldRunOnboarding } from './onboarding-llm.js';
15
19
  import { renderLogo } from './logo.js';
16
20
  import { agentDir } from './app-paths.js';
17
21
  import { accentAnsi } from './cli-theme.js';
@@ -37,37 +41,11 @@ const TOOL_KEYS = [
37
41
  hint: 'voice transcription — free at console.groq.com',
38
42
  },
39
43
  ];
40
- /** Known LLM provider IDs that, if authed, mean the user doesn't need onboarding */
41
- const LLM_PROVIDER_IDS = [
42
- 'anthropic',
43
- 'anthropic-vertex',
44
- 'openai',
45
- 'github-copilot',
46
- 'openai-codex',
47
- 'google-gemini-cli',
48
- 'google-antigravity',
49
- 'google',
50
- 'groq',
51
- 'xai',
52
- 'openrouter',
53
- 'mistral',
54
- 'ollama-cloud',
55
- 'custom-openai',
56
- ];
57
44
  /** API key prefix validation — loose checks to catch obvious mistakes */
58
45
  const API_KEY_PREFIXES = {
59
46
  anthropic: ['sk-ant-'],
60
47
  openai: ['sk-'],
61
48
  };
62
- const OTHER_PROVIDERS = [
63
- { value: 'google', label: 'Google (Gemini)' },
64
- { value: 'groq', label: 'Groq' },
65
- { value: 'xai', label: 'xAI (Grok)' },
66
- { value: 'openrouter', label: 'OpenRouter' },
67
- { value: 'mistral', label: 'Mistral' },
68
- { value: 'ollama-cloud', label: 'Ollama Cloud' },
69
- { value: 'custom-openai', label: 'Custom (OpenAI-compatible)' },
70
- ];
71
49
  const CLASSIFIER_MODEL_OPTIONS = [
72
50
  { value: 'anthropic/claude-haiku-4-5', label: 'Claude Haiku 4.5', hint: 'fast default' },
73
51
  { value: 'anthropic/claude-sonnet-4-5', label: 'Claude Sonnet 4.5', hint: 'stronger reasoning' },
@@ -76,12 +54,6 @@ const CLASSIFIER_MODEL_OPTIONS = [
76
54
  { value: 'google/gemini-3-flash-preview', label: 'Gemini 3 Flash Preview', hint: 'newer flash option' },
77
55
  { value: 'google/gemini-3.1-pro-preview', label: 'Gemini 3.1 Pro Preview', hint: 'newer pro option' },
78
56
  ];
79
- const BUDGET_MODEL_OPTIONS = [
80
- { value: 'anthropic/claude-haiku-4-5', label: 'Claude Haiku 4.5', hint: 'recommended for scout/subagents' },
81
- { value: 'google/gemini-2.5-flash', label: 'Gemini 2.5 Flash', hint: 'fast and cheap' },
82
- { value: 'google/gemini-3-flash-preview', label: 'Gemini 3 Flash Preview', hint: 'newer flash option' },
83
- { value: 'openai/gpt-4.1-mini', label: 'GPT-4.1 mini', hint: 'small general-purpose option' },
84
- ];
85
57
  // ─── Dynamic imports ──────────────────────────────────────────────────────────
86
58
  /**
87
59
  * Dynamically import @clack/prompts and picocolors.
@@ -122,29 +94,47 @@ function openBrowser(url) {
122
94
  function isCancelError(p, err) {
123
95
  return p.isCancel(err);
124
96
  }
125
- // ─── Public API ───────────────────────────────────────────────────────────────
126
- /**
127
- * Determine if the onboarding wizard should run.
128
- *
129
- * Returns true when:
130
- * - No LLM provider auth is available
131
- * - We're on a TTY (interactive terminal)
132
- *
133
- * Returns false (skip wizard) when:
134
- * - Any LLM provider is already available via auth.json, env vars, runtime overrides, or fallback auth
135
- * - A default provider is already configured in settings (covers extension-based providers
136
- * that may not require credentials in auth.json)
137
- * - Not a TTY (piped input, subagent, CI)
138
- */
139
- export function shouldRunOnboarding(authStorage, settingsDefaultProvider) {
140
- if (!process.stdin.isTTY)
141
- return false;
142
- if (settingsDefaultProvider)
143
- return false;
144
- // Check if any LLM provider has credentials
145
- const hasLlmAuth = LLM_PROVIDER_IDS.some(id => authStorage.hasAuth(id));
146
- return !hasLlmAuth;
97
+ function getAwsCliInstallInstructions() {
98
+ if (process.platform === 'darwin') {
99
+ return 'Install the AWS CLI with `brew install awscli` or from https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html';
100
+ }
101
+ if (process.platform === 'win32') {
102
+ return 'Install the AWS CLI MSI from https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html';
103
+ }
104
+ return 'Install the AWS CLI from https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html';
105
+ }
106
+ function ensureAwsCliInstalled() {
107
+ const result = spawnSync('aws', ['--version'], { encoding: 'utf-8' });
108
+ if (result.error && 'code' in result.error && result.error.code === 'ENOENT') {
109
+ return `AWS CLI not found. ${getAwsCliInstallInstructions()}`;
110
+ }
111
+ return null;
112
+ }
113
+ function saveAwsAuthRefreshCommand(profile) {
114
+ const settingsPath = join(agentDir, 'settings.json');
115
+ let settings = {};
116
+ if (existsSync(settingsPath)) {
117
+ try {
118
+ settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
119
+ }
120
+ catch {
121
+ settings = {};
122
+ }
123
+ }
124
+ settings.awsAuthRefresh = `aws sso login --profile ${profile}`;
125
+ mkdirSync(dirname(settingsPath), { recursive: true });
126
+ writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
147
127
  }
128
+ function validateAwsRegion(region) {
129
+ const trimmed = region?.trim();
130
+ if (!trimmed)
131
+ return 'AWS region is required';
132
+ if (!/^[a-z]{2}(?:-gov)?-[a-z0-9-]+-\d+$/.test(trimmed)) {
133
+ return 'Use a valid AWS region like us-east-1';
134
+ }
135
+ return undefined;
136
+ }
137
+ // ─── Public API ───────────────────────────────────────────────────────────────
148
138
  /**
149
139
  * Run the unified onboarding wizard.
150
140
  *
@@ -171,7 +161,7 @@ export async function runOnboarding(authStorage, settingsManager) {
171
161
  }
172
162
  // ── Intro ─────────────────────────────────────────────────────────────────
173
163
  process.stderr.write(renderLogo(accentAnsi));
174
- p.intro(pc.bold('Welcome to LSD — let\'s get you set up'));
164
+ p.intro(accentAnsi(pc.bold('Welcome to LSD')) + pc.bold(' — let\'s get you set up'));
175
165
  // ── LLM Provider Selection ────────────────────────────────────────────────
176
166
  let llmConfigured = false;
177
167
  try {
@@ -314,8 +304,8 @@ export async function runOnboarding(authStorage, settingsManager) {
314
304
  else {
315
305
  summaryLines.push(`${pc.green('✓')} Language servers: ${lspInstalled.join(', ')} (${lspInstalled.length} installed)`);
316
306
  }
317
- p.note(summaryLines.join('\n'), 'Setup complete');
318
- p.outro(pc.dim('Launching LSD...'));
307
+ p.note(summaryLines.join('\n'), accentAnsi('Setup complete'));
308
+ p.outro(accentAnsi('Launching LSD...'));
319
309
  }
320
310
  async function runClassifierModelStep(p, pc, settingsManager) {
321
311
  const existing = settingsManager.getClassifierModel();
@@ -467,35 +457,32 @@ async function runLlmStep(p, pc, authStorage) {
467
457
  if (method === 'browser') {
468
458
  const provider = await p.select({
469
459
  message: 'Choose provider',
470
- options: [
471
- { value: 'anthropic', label: 'Anthropic (Claude)', hint: 'recommended' },
472
- { value: 'github-copilot', label: 'GitHub Copilot' },
473
- { value: 'openai-codex', label: 'ChatGPT Plus/Pro (Codex)' },
474
- { value: 'google-gemini-cli', label: 'Google Gemini CLI' },
475
- { value: 'google-antigravity', label: 'Antigravity (Gemini 3, Claude, GPT-OSS)' },
476
- ],
460
+ options: getLlmProviderOptions('browser'),
477
461
  });
478
462
  if (p.isCancel(provider))
479
463
  return false;
464
+ if (provider === BEDROCK_PROVIDER_ID) {
465
+ return await runBedrockSsoFlow(p, pc, authStorage);
466
+ }
480
467
  return await runOAuthFlow(p, pc, authStorage, provider, oauthMap);
481
468
  }
482
469
  if (method === 'api-key') {
483
470
  const provider = await p.select({
484
471
  message: 'Choose provider',
485
- options: [
486
- { value: 'anthropic', label: 'Anthropic (Claude)' },
487
- { value: 'openai', label: 'OpenAI' },
488
- ...OTHER_PROVIDERS.map(op => ({ value: op.value, label: op.label })),
489
- ],
472
+ options: getLlmProviderOptions('api-key'),
490
473
  });
491
474
  if (p.isCancel(provider))
492
475
  return false;
493
476
  if (provider === 'custom-openai') {
494
477
  return await runCustomOpenAIFlow(p, pc, authStorage);
495
478
  }
479
+ if (provider === BEDROCK_PROVIDER_ID) {
480
+ return await runBedrockApiKeyFlow(p, pc, authStorage);
481
+ }
482
+ const otherProviders = getOtherLlmProviders();
496
483
  const label = provider === 'anthropic' ? 'Anthropic'
497
484
  : provider === 'openai' ? 'OpenAI'
498
- : OTHER_PROVIDERS.find(op => op.value === provider)?.label ?? String(provider);
485
+ : otherProviders.find(op => op.value === provider)?.label ?? String(provider);
499
486
  return await runApiKeyFlow(p, pc, authStorage, provider, label);
500
487
  }
501
488
  return false;
@@ -563,6 +550,94 @@ async function runOAuthFlow(p, pc, authStorage, providerId, oauthMap) {
563
550
  }
564
551
  }
565
552
  // ─── API Key Flow ─────────────────────────────────────────────────────────────
553
+ async function runBedrockSsoFlow(p, pc, authStorage) {
554
+ const missingAwsCli = ensureAwsCliInstalled();
555
+ if (missingAwsCli) {
556
+ p.log.warn(missingAwsCli);
557
+ return false;
558
+ }
559
+ const profile = await p.text({
560
+ message: 'AWS profile for SSO login:',
561
+ placeholder: 'default',
562
+ initialValue: 'default',
563
+ validate: (value) => value?.trim() ? undefined : 'AWS profile is required',
564
+ });
565
+ if (p.isCancel(profile) || !profile)
566
+ return false;
567
+ const trimmedProfile = String(profile).trim();
568
+ const region = await p.text({
569
+ message: 'AWS region for Bedrock:',
570
+ placeholder: 'us-east-1',
571
+ initialValue: process.env.AWS_REGION ?? process.env.AWS_DEFAULT_REGION ?? 'us-east-1',
572
+ validate: validateAwsRegion,
573
+ });
574
+ if (p.isCancel(region) || !region)
575
+ return false;
576
+ const trimmedRegion = String(region).trim();
577
+ const s = p.spinner();
578
+ s.start(`Running aws sso login for profile ${trimmedProfile}...`);
579
+ try {
580
+ await new Promise((resolve, reject) => {
581
+ execFile('aws', ['sso', 'login', '--profile', trimmedProfile], { timeout: 120_000 }, (error, stdout, stderr) => {
582
+ if (error) {
583
+ reject(new Error((stderr || stdout || error.message).trim() || error.message));
584
+ return;
585
+ }
586
+ resolve();
587
+ });
588
+ });
589
+ saveBedrockCredential(authStorage, {
590
+ authType: 'sso',
591
+ profile: trimmedProfile,
592
+ region: trimmedRegion,
593
+ });
594
+ saveAwsAuthRefreshCommand(trimmedProfile);
595
+ s.stop('AWS SSO login complete');
596
+ p.log.success(`Bedrock configured with ${pc.green(`profile ${trimmedProfile}`)} in ${pc.green(trimmedRegion)}`);
597
+ return true;
598
+ }
599
+ catch (err) {
600
+ s.stop('AWS SSO login failed');
601
+ const message = err instanceof Error ? err.message : String(err);
602
+ p.log.warn(message);
603
+ p.log.info(getAwsCliInstallInstructions());
604
+ return false;
605
+ }
606
+ }
607
+ async function runBedrockApiKeyFlow(p, pc, authStorage) {
608
+ const accessKeyId = await p.text({
609
+ message: 'AWS Access Key ID:',
610
+ placeholder: 'AKIA...',
611
+ validate: (value) => value?.trim() ? undefined : 'AWS Access Key ID is required',
612
+ });
613
+ if (p.isCancel(accessKeyId) || !accessKeyId)
614
+ return false;
615
+ const secretAccessKey = await p.password({
616
+ message: 'AWS Secret Access Key:',
617
+ mask: '●',
618
+ });
619
+ if (p.isCancel(secretAccessKey) || !secretAccessKey)
620
+ return false;
621
+ const trimmedSecret = String(secretAccessKey).trim();
622
+ if (!trimmedSecret)
623
+ return false;
624
+ const region = await p.text({
625
+ message: 'AWS region for Bedrock:',
626
+ placeholder: 'us-east-1',
627
+ initialValue: process.env.AWS_REGION ?? process.env.AWS_DEFAULT_REGION ?? 'us-east-1',
628
+ validate: validateAwsRegion,
629
+ });
630
+ if (p.isCancel(region) || !region)
631
+ return false;
632
+ saveBedrockCredential(authStorage, {
633
+ authType: 'access-key',
634
+ accessKeyId: String(accessKeyId).trim(),
635
+ secretAccessKey: trimmedSecret,
636
+ region: String(region).trim(),
637
+ });
638
+ p.log.success(`Bedrock credentials saved for ${pc.green('Amazon Bedrock')}`);
639
+ return true;
640
+ }
566
641
  async function runApiKeyFlow(p, pc, authStorage, providerId, providerLabel) {
567
642
  const key = await p.password({
568
643
  message: `Paste your ${providerLabel} API key:`,
@@ -20,6 +20,7 @@ const LLM_PROVIDER_IDS = [
20
20
  'xai',
21
21
  'openrouter',
22
22
  'mistral',
23
+ 'amazon-bedrock',
23
24
  ];
24
25
  /**
25
26
  * Migrate provider credentials from Pi's auth.json into GSD's AuthStorage.
@@ -13,6 +13,11 @@ import { randomUUID } from 'node:crypto';
13
13
  import { getAgentDir } from '@gsd/pi-coding-agent';
14
14
  import { getMemoryDir } from './memory-paths.js';
15
15
  import { scanMemoryFiles, formatMemoryManifest } from './memory-scan.js';
16
+ import { normalizeSubagentModel } from '../subagent/model-resolution.js';
17
+ const AUTO_EXTRACT_ANSI_PATTERN = /\u001B\[[0-?]*[ -/]*[@-~]/g;
18
+ export function stripAnsiForAutoExtractLog(text) {
19
+ return text.replace(AUTO_EXTRACT_ANSI_PATTERN, '');
20
+ }
16
21
  /**
17
22
  * Build a plain-text transcript from session entries, keeping only
18
23
  * human-readable message content (no tool_use / tool_result blocks).
@@ -112,7 +117,7 @@ export function readBudgetMemoryModel() {
112
117
  const raw = readFileSync(settingsPath, 'utf-8');
113
118
  const parsed = JSON.parse(raw);
114
119
  return typeof parsed.budgetSubagentModel === 'string'
115
- ? parsed.budgetSubagentModel.trim() || undefined
120
+ ? normalizeSubagentModel(parsed.budgetSubagentModel)
116
121
  : undefined;
117
122
  }
118
123
  catch {
@@ -177,7 +182,7 @@ export function extractMemories(ctx, cwd) {
177
182
  const helperScript = `
178
183
  const { spawn } = require('node:child_process');
179
184
  const { appendFileSync, writeFileSync, readFileSync, readdirSync, statSync, existsSync } = require('node:fs');
180
- const { join } = require('node:path');
185
+ const { join, delimiter } = require('node:path');
181
186
 
182
187
  const [cliPath, cwd, tmpPromptPath, auditPath, logPath, memoryDir, instruction, model, userMessageCount, transcriptLength] = process.argv.slice(1);
183
188
  const startedAt = new Date().toISOString();
@@ -186,6 +191,11 @@ let sawSessionEnded = false;
186
191
  let sessionEndTimer = null;
187
192
  let hardTimeout = null;
188
193
  let pendingLogText = '';
194
+ const ANSI_PATTERN = /\u001B\[[0-?]*[ -/]*[@-~]/g;
195
+
196
+ function stripAnsi(text) {
197
+ return String(text).replace(ANSI_PATTERN, '');
198
+ }
189
199
 
190
200
  function flushLogText(text, force = false) {
191
201
  pendingLogText += text;
@@ -194,7 +204,7 @@ function flushLogText(text, force = false) {
194
204
 
195
205
  const kept = [];
196
206
  for (const rawLine of parts) {
197
- const line = rawLine.trim();
207
+ const line = stripAnsi(rawLine).trim();
198
208
  if (!line) continue;
199
209
  if (/^\[phase\]\s+cache-timer\s*$/.test(line)) continue;
200
210
  kept.push(rawLine);
@@ -278,6 +288,14 @@ writeFileSync(logPath, '', 'utf-8');
278
288
  writeAudit('running', ['startedAt: ' + startedAt]);
279
289
 
280
290
  const childArgs = [cliPath, 'headless'];
291
+ const bundledPaths = Array.from(
292
+ new Set(
293
+ [process.env.GSD_BUNDLED_EXTENSION_PATHS, process.env.LSD_BUNDLED_EXTENSION_PATHS]
294
+ .filter(Boolean)
295
+ .flatMap((value) => String(value).split(delimiter).map((entry) => entry.trim()).filter(Boolean)),
296
+ ),
297
+ );
298
+ for (const extensionPath of bundledPaths) childArgs.push('--extension', extensionPath);
281
299
  if (model) childArgs.push('--model', model);
282
300
  childArgs.push('--bare', '--context', tmpPromptPath, '--context-text', instruction);
283
301