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.
- package/README.md +2 -1
- package/dist/bedrock-auth.d.ts +25 -0
- package/dist/bedrock-auth.js +59 -0
- package/dist/headless.js +8 -3
- package/dist/loader.js +1 -0
- package/dist/onboarding-llm.d.ts +37 -0
- package/dist/onboarding-llm.js +64 -0
- package/dist/onboarding.d.ts +2 -14
- package/dist/onboarding.js +146 -71
- package/dist/pi-migration.js +1 -0
- package/dist/resources/extensions/memory/auto-extract.js +21 -3
- package/dist/resources/extensions/memory/dream.js +703 -0
- package/dist/resources/extensions/memory/extension-manifest.json +2 -2
- package/dist/resources/extensions/memory/index.js +115 -8
- package/dist/resources/extensions/slash-commands/extension-manifest.json +10 -10
- package/dist/resources/extensions/slash-commands/index.js +0 -4
- package/dist/resources/extensions/slash-commands/plan.js +181 -45
- package/dist/resources/extensions/subagent/agents.js +14 -1
- package/dist/resources/extensions/subagent/configured-model.js +3 -2
- package/dist/resources/extensions/subagent/index.js +34 -28
- package/dist/resources/extensions/subagent/launch-helpers.js +24 -0
- package/dist/resources/extensions/subagent/model-resolution.js +41 -3
- package/dist/resources/extensions/usage/extension-manifest.json +11 -0
- package/dist/resources/extensions/usage/index.js +346 -0
- package/{src/resources/skills/create-gsd-extension → dist/resources/skills/create-lsd-extension}/SKILL.md +6 -6
- package/{src/resources/skills/create-gsd-extension → dist/resources/skills/create-lsd-extension}/references/custom-tools.md +1 -1
- package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extension-lifecycle.md +2 -2
- package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensioncontext-reference.md +1 -1
- package/{src/resources/skills/create-gsd-extension → dist/resources/skills/create-lsd-extension}/references/key-rules-gotchas.md +4 -4
- package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/packaging-distribution.md +6 -6
- package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/create-extension.md +3 -3
- package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/debug-extension.md +5 -5
- package/dist/resources/skills/teams-debug/SKILL.md +5 -6
- package/dist/resources/skills/teams-document/SKILL.md +1 -2
- package/dist/resources/skills/teams-plan/SKILL.md +3 -4
- package/dist/resources/skills/teams-run/SKILL.md +3 -4
- package/dist/resources/skills/teams-verify/SKILL.md +4 -5
- package/dist/startup-model-validation.js +1 -0
- package/dist/welcome-screen.js +13 -11
- package/dist/wizard.js +12 -0
- package/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +688 -409
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +761 -488
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +40 -18
- package/packages/pi-ai/src/models.generated.ts +759 -486
- package/packages/pi-coding-agent/dist/cli/config-selector.js +1 -1
- package/packages/pi-coding-agent/dist/cli/config-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +1 -2
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +6 -30
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +44 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +9 -5
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +3 -2
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +1 -1
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +15 -12
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +6 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +10 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +31 -22
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +18 -5
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +139 -20
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/cli/config-selector.ts +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +5 -28
- package/packages/pi-coding-agent/src/core/settings-manager.ts +52 -1
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +18 -5
- package/packages/pi-coding-agent/src/core/skills.ts +3 -2
- package/packages/pi-coding-agent/src/index.ts +1 -1
- package/packages/pi-coding-agent/src/main.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +2 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +12 -13
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +39 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +10 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/extension-ui-controller.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +46 -20
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +171 -20
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +4 -0
- package/packages/pi-tui/dist/components/editor.d.ts +1 -0
- package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/editor.js +23 -0
- package/packages/pi-tui/dist/components/editor.js.map +1 -1
- package/packages/pi-tui/src/components/editor.ts +23 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts +18 -5
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +139 -20
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +4 -0
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/memory/auto-extract.ts +23 -3
- package/src/resources/extensions/memory/dream.ts +814 -0
- package/src/resources/extensions/memory/extension-manifest.json +2 -2
- package/src/resources/extensions/memory/index.ts +134 -13
- package/src/resources/extensions/memory/tests/auto-extract.test.ts +10 -2
- package/src/resources/extensions/memory/tests/dream.test.ts +142 -0
- package/src/resources/extensions/slash-commands/extension-manifest.json +10 -10
- package/src/resources/extensions/slash-commands/index.ts +3 -7
- package/src/resources/extensions/slash-commands/plan.ts +192 -46
- package/src/resources/extensions/subagent/agents.ts +11 -1
- package/src/resources/extensions/subagent/configured-model.ts +3 -2
- package/src/resources/extensions/subagent/index.ts +38 -30
- package/src/resources/extensions/subagent/launch-helpers.ts +30 -0
- package/src/resources/extensions/subagent/model-resolution.ts +40 -3
- package/src/resources/extensions/usage/extension-manifest.json +11 -0
- package/src/resources/extensions/usage/index.ts +441 -0
- package/{dist/resources/skills/create-gsd-extension → src/resources/skills/create-lsd-extension}/SKILL.md +6 -6
- package/{dist/resources/skills/create-gsd-extension → src/resources/skills/create-lsd-extension}/references/custom-tools.md +1 -1
- package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extension-lifecycle.md +2 -2
- package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensioncontext-reference.md +1 -1
- package/{dist/resources/skills/create-gsd-extension → src/resources/skills/create-lsd-extension}/references/key-rules-gotchas.md +4 -4
- package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/packaging-distribution.md +6 -6
- package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/create-extension.md +3 -3
- package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/debug-extension.md +5 -5
- package/src/resources/skills/teams-debug/SKILL.md +5 -6
- package/src/resources/skills/teams-document/SKILL.md +1 -2
- package/src/resources/skills/teams-plan/SKILL.md +3 -4
- package/src/resources/skills/teams-run/SKILL.md +3 -4
- package/src/resources/skills/teams-verify/SKILL.md +4 -5
- package/dist/resources/extensions/slash-commands/create-extension.js +0 -264
- package/dist/resources/extensions/slash-commands/create-slash-command.js +0 -208
- package/src/resources/extensions/slash-commands/create-extension.ts +0 -297
- package/src/resources/extensions/slash-commands/create-slash-command.ts +0 -234
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/compaction-session-control.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-commands.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-rendering.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-ui.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/events-reference.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensionapi-reference.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/mode-behavior.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/model-provider-management.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/remote-execution-overrides.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/state-management.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/system-prompt-modification.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/add-capability.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/compaction-session-control.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-commands.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-rendering.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-ui.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/events-reference.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensionapi-reference.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/mode-behavior.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/model-provider-management.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/remote-execution-overrides.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/state-management.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/system-prompt-modification.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/templates/extension-skeleton.ts +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/templates/stateful-tool-skeleton.ts +0 -0
- /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,
|
|
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
|
-
|
|
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
|
+
}
|
package/dist/onboarding.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
*
|
package/dist/onboarding.js
CHANGED
|
@@ -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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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(
|
|
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
|
-
:
|
|
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:`,
|
package/dist/pi-migration.js
CHANGED
|
@@ -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
|
|
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
|
|