Skip to content

Commit 3bf0c79

Browse files
authored
Merge branch 'dev' into nxl/scout-repo-tools
2 parents 35a19df + 2cda629 commit 3bf0c79

140 files changed

Lines changed: 2532 additions & 883 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/actions/setup-bun/action.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
name: "Setup Bun"
22
description: "Setup Bun with caching and install dependencies"
3+
inputs:
4+
install-flags:
5+
description: "Additional flags to pass to 'bun install'"
6+
required: false
7+
default: ""
38
runs:
49
using: "composite"
510
steps:
@@ -46,8 +51,8 @@ runs:
4651
# e.g. ./patches/ for standard-openapi
4752
# https://github.com/oven-sh/bun/issues/28147
4853
if [ "$RUNNER_OS" = "Windows" ]; then
49-
bun install --linker hoisted
54+
bun install --linker hoisted ${{ inputs.install-flags }}
5055
else
51-
bun install
56+
bun install ${{ inputs.install-flags }}
5257
fi
5358
shell: bash

.github/workflows/publish.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,12 +402,14 @@ jobs:
402402
fail-fast: false
403403
matrix:
404404
settings:
405-
- host: macos-latest
405+
- host: macos-26-intel
406406
target: x86_64-apple-darwin
407407
platform_flag: --mac --x64
408-
- host: macos-latest
408+
bun_install_flags: --os=darwin --cpu=x64
409+
- host: macos-26
409410
target: aarch64-apple-darwin
410411
platform_flag: --mac --arm64
412+
bun_install_flags: --os=darwin --cpu=arm64
411413
# github-hosted: blacksmith lacks ARM64 MSVC cross-compilation toolchain
412414
- host: "windows-2025"
413415
target: aarch64-pc-windows-msvc
@@ -437,6 +439,8 @@ jobs:
437439
run: echo "${{ secrets.APPLE_API_KEY_PATH }}" > $RUNNER_TEMP/apple-api-key.p8
438440

439441
- uses: ./.github/actions/setup-bun
442+
with:
443+
install-flags: ${{ matrix.settings.bun_install_flags }}
440444

441445
- name: Azure login
442446
if: runner.os == 'Windows'

packages/app/src/components/prompt-input.tsx

Lines changed: 46 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
270270
const buttonsSpring = useSpring(() => (store.mode === "normal" ? 1 : 0), { visualDuration: 0.2, bounce: 0 })
271271
const motion = (value: number) => ({
272272
opacity: value,
273-
transform: `scale(${0.95 + value * 0.05})`,
273+
transform: `scale(${0.98 + value * 0.02})`,
274274
filter: `blur(${(1 - value) * 2}px)`,
275275
"pointer-events": value > 0.5 ? ("auto" as const) : ("none" as const),
276276
})
@@ -345,7 +345,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
345345
promptPlaceholder({
346346
mode: store.mode,
347347
commentCount: commentCount(),
348-
example: suggest() ? language.t(EXAMPLES[store.placeholder]) : "",
348+
example: suggest() ? (store.mode === "shell" ? "git status" : language.t(EXAMPLES[store.placeholder])) : "",
349349
suggest: suggest(),
350350
t: (key, params) => language.t(key as Parameters<typeof language.t>[0], params as never),
351351
}),
@@ -1403,12 +1403,11 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
14031403
<IconButton
14041404
data-action="prompt-submit"
14051405
type="submit"
1406-
disabled={store.mode !== "normal" || (!working() && blank())}
1406+
disabled={!working() && blank()}
14071407
tabIndex={store.mode === "normal" ? undefined : -1}
1408-
icon={stopping() ? "stop" : "arrow-up"}
1408+
icon={stopping() ? "stop" : store.mode === "shell" ? "arrow-undo-down" : "arrow-up"}
14091409
variant="primary"
14101410
class="size-8"
1411-
style={buttons()}
14121411
aria-label={stopping() ? language.t("prompt.action.stop") : language.t("prompt.action.send")}
14131412
/>
14141413
</Tooltip>
@@ -1451,14 +1450,24 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
14511450
<div class="px-1.75 pt-5.5 pb-2 flex items-center gap-2 min-w-0">
14521451
<div class="flex items-center gap-1.5 min-w-0 flex-1 relative">
14531452
<div
1454-
class="h-7 flex items-center gap-1.5 max-w-[160px] min-w-0 absolute inset-y-0 left-0"
1453+
class="h-7 flex items-center gap-1.5 min-w-0 absolute inset-0"
14551454
style={{
1456-
padding: "0 4px 0 8px",
1455+
padding: "0 0px 0 8px",
14571456
...shell(),
14581457
}}
14591458
>
1460-
<span class="truncate text-13-medium text-text-strong">{language.t("prompt.mode.shell")}</span>
1461-
<div class="size-4 shrink-0" />
1459+
<Icon name="console" />
1460+
<span class="truncate text-13-medium text-text-base">{language.t("prompt.mode.shell")}</span>
1461+
<div class="flex-1" />
1462+
<Button
1463+
variant="ghost"
1464+
class="text-text-base"
1465+
onClick={() => {
1466+
setStore("mode", "normal")
1467+
}}
1468+
>
1469+
{language.t("common.cancel")}
1470+
</Button>
14621471
</div>
14631472
<div class="flex items-center gap-1.5 min-w-0 flex-1 h-7">
14641473
<Show when={!agentsLoading()}>
@@ -1565,33 +1574,35 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
15651574
</TooltipKeybind>
15661575
</Show>
15671576
</div>
1568-
<div
1569-
data-component="prompt-variant-control"
1570-
style={providersShouldFadeIn() ? { animation: "fade-in 0.3s" } : undefined}
1571-
>
1572-
<TooltipKeybind
1573-
placement="top"
1574-
gutter={4}
1575-
title={language.t("command.model.variant.cycle")}
1576-
keybind={command.keybind("model.variant.cycle")}
1577+
<Show when={variants().length > 2}>
1578+
<div
1579+
data-component="prompt-variant-control"
1580+
style={providersShouldFadeIn() ? { animation: "fade-in 0.3s" } : undefined}
15771581
>
1578-
<Select
1579-
size="normal"
1580-
options={variants()}
1581-
current={local.model.variant.current() ?? "default"}
1582-
label={(x) => (x === "default" ? language.t("common.default") : x)}
1583-
onSelect={(value) => {
1584-
local.model.variant.set(value === "default" ? undefined : value)
1585-
restoreFocus()
1586-
}}
1587-
class="capitalize max-w-[160px] text-text-base"
1588-
valueClass="truncate text-13-regular text-text-base"
1589-
triggerStyle={control()}
1590-
triggerProps={{ "data-action": "prompt-model-variant" }}
1591-
variant="ghost"
1592-
/>
1593-
</TooltipKeybind>
1594-
</div>
1582+
<TooltipKeybind
1583+
placement="top"
1584+
gutter={4}
1585+
title={language.t("command.model.variant.cycle")}
1586+
keybind={command.keybind("model.variant.cycle")}
1587+
>
1588+
<Select
1589+
size="normal"
1590+
options={variants()}
1591+
current={local.model.variant.current() ?? "default"}
1592+
label={(x) => (x === "default" ? language.t("common.default") : x)}
1593+
onSelect={(value) => {
1594+
local.model.variant.set(value === "default" ? undefined : value)
1595+
restoreFocus()
1596+
}}
1597+
class="capitalize max-w-[160px] text-text-base"
1598+
valueClass="truncate text-13-regular text-text-base"
1599+
triggerStyle={control()}
1600+
triggerProps={{ "data-action": "prompt-model-variant" }}
1601+
variant="ghost"
1602+
/>
1603+
</TooltipKeybind>
1604+
</div>
1605+
</Show>
15951606
</Show>
15961607
</Show>
15971608
</div>

packages/app/src/components/prompt-input/placeholder.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ describe("promptPlaceholder", () => {
1212
suggest: true,
1313
t,
1414
})
15-
expect(value).toBe("prompt.placeholder.shell")
15+
expect(value).toBe("prompt.placeholder.shell:example")
1616
})
1717

1818
test("returns summarize placeholders for comment context", () => {

packages/app/src/components/prompt-input/placeholder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ type PromptPlaceholderInput = {
77
}
88

99
export function promptPlaceholder(input: PromptPlaceholderInput) {
10-
if (input.mode === "shell") return input.t("prompt.placeholder.shell")
10+
if (input.mode === "shell") return input.t("prompt.placeholder.shell", { example: input.example })
1111
if (input.commentCount > 1) return input.t("prompt.placeholder.summarizeComments")
1212
if (input.commentCount === 1) return input.t("prompt.placeholder.summarizeComment")
1313
if (!input.suggest) return input.t("prompt.placeholder.simple")

packages/app/src/components/settings-general.tsx

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -128,27 +128,25 @@ export const SettingsGeneral: Component = () => {
128128
return
129129
}
130130

131-
const actions =
132-
platform.update && platform.restart
133-
? [
134-
{
135-
label: language.t("toast.update.action.installRestart"),
136-
onClick: async () => {
137-
await platform.update!()
138-
await platform.restart!()
139-
},
131+
const actions = platform.updateAndRestart
132+
? [
133+
{
134+
label: language.t("toast.update.action.installRestart"),
135+
onClick: async () => {
136+
await platform.updateAndRestart!()
140137
},
141-
{
142-
label: language.t("toast.update.action.notYet"),
143-
onClick: "dismiss" as const,
144-
},
145-
]
146-
: [
147-
{
148-
label: language.t("toast.update.action.notYet"),
149-
onClick: "dismiss" as const,
150-
},
151-
]
138+
},
139+
{
140+
label: language.t("toast.update.action.notYet"),
141+
onClick: "dismiss" as const,
142+
},
143+
]
144+
: [
145+
{
146+
label: language.t("toast.update.action.notYet"),
147+
onClick: "dismiss" as const,
148+
},
149+
]
152150

153151
showToast({
154152
persistent: true,

packages/app/src/context/platform.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ export type Platform = {
4949
/** Storage mechanism, defaults to localStorage */
5050
storage?: (name?: string) => SyncStorage | AsyncStorage
5151

52-
/** Check for updates (Tauri only) */
52+
/** Check for a downloadable desktop update */
5353
checkUpdate?(): Promise<UpdateInfo>
5454

55-
/** Install updates (Tauri only) */
56-
update?(): Promise<void>
55+
/** Install the downloaded update using the platform restart flow */
56+
updateAndRestart?(): Promise<void>
5757

5858
/** Fetch override */
5959
fetch?: typeof fetch

packages/app/src/i18n/ar.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ export const dict = {
210210
"common.saving": "جارٍ الحفظ...",
211211
"common.default": "افتراضي",
212212
"common.attachment": "مرفق",
213-
"prompt.placeholder.shell": "أدخل أمر shell...",
213+
"prompt.placeholder.shell": "أدخل أمر shell... {{example}}",
214214
"prompt.placeholder.normal": 'اسأل أي شيء... "{{example}}"',
215215
"prompt.placeholder.simple": "اسأل أي شيء...",
216216
"prompt.placeholder.summarizeComments": "لخّص التعليقات…",

packages/app/src/i18n/br.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ export const dict = {
210210
"common.saving": "Salvando...",
211211
"common.default": "Padrão",
212212
"common.attachment": "anexo",
213-
"prompt.placeholder.shell": "Digite comando do shell...",
213+
"prompt.placeholder.shell": "Digite comando do shell... {{example}}",
214214
"prompt.placeholder.normal": 'Pergunte qualquer coisa... "{{example}}"',
215215
"prompt.placeholder.simple": "Pergunte qualquer coisa...",
216216
"prompt.placeholder.summarizeComments": "Resumir comentários…",

packages/app/src/i18n/bs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ export const dict = {
228228
"common.default": "Podrazumijevano",
229229
"common.attachment": "prilog",
230230

231-
"prompt.placeholder.shell": "Unesi shell naredbu...",
231+
"prompt.placeholder.shell": "Unesi shell naredbu... {{example}}",
232232
"prompt.placeholder.normal": 'Pitaj bilo šta... "{{example}}"',
233233
"prompt.placeholder.simple": "Pitaj bilo šta...",
234234
"prompt.placeholder.summarizeComments": "Sažmi komentare…",

0 commit comments

Comments
 (0)