Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
631e16b
Merge pull request #54 from Devin-AXIS/Lunette
Devin-AXIS Jul 17, 2026
3a541fc
Merge pull request #55 from Devin-AXIS/Lunette
Devin-AXIS Jul 17, 2026
c6b204b
fix(desktop): create the first conversation before model setup
Devin-DigitalID Jul 17, 2026
2c6b824
fix(release): align client versions and support patch packages
Devin-DigitalID Jul 17, 2026
a32b52a
fix(design): restore navigation label matching
Devin-DigitalID Jul 17, 2026
75fcf1b
chore(release): prepare iPollo 0.17.24
Devin-DigitalID Jul 17, 2026
5c8ff66
Add flagship video templates and upgrade OpenCode
Devin-DigitalID Jul 18, 2026
53de84e
Merge pull request #56 from Devin-AXIS/agent/opencode-1-18-3-video-te…
Devin-AXIS Jul 18, 2026
30566f3
Bump client package to 0.17.25
Devin-DigitalID Jul 18, 2026
91d5e67
Merge pull request #57 from Devin-AXIS/agent/opencode-1-18-3-video-te…
Devin-AXIS Jul 18, 2026
cc44029
Clean previous installers before packaging
Devin-DigitalID Jul 18, 2026
c850e84
Merge pull request #58 from Devin-AXIS/agent/opencode-1-18-3-video-te…
Devin-AXIS Jul 18, 2026
916ad8f
fix(app): streamline permissions and template prompts
Devin-DigitalID Jul 18, 2026
8b109d2
Merge pull request #59 from Devin-AXIS/agent/opencode-1-18-3-video-te…
Devin-AXIS Jul 18, 2026
a95358a
fix: localize settings overview
Jul 18, 2026
c188b06
docs: add complete Japanese README
IPollo-1 Jul 18, 2026
c37b4f8
fix: translate remaining common labels
Jul 18, 2026
1bd5b06
Merge pull request #60 from Devin-AXIS/agent/add-japanese-readme
Devin-AXIS Jul 18, 2026
4794082
test: verify GitHub author identity
Aetheridx Jul 18, 2026
1bb0daa
fix: localize remaining app surfaces
Aetheridx Jul 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/app/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@ipollowork/app",
"private": true,
"version": "0.17.23",
"version": "0.17.25",
"type": "module",
"scripts": {
"test": "bun test --isolate tests/",
Expand Down Expand Up @@ -50,7 +50,7 @@
"@ipollowork/types": "workspace:*",
"@ipollowork/ui": "workspace:*",
"@lexical/react": "^0.35.0",
"@opencode-ai/sdk": "^1.17.11",
"@opencode-ai/sdk": "^1.18.3",
"@paper-design/shaders-react": "0.0.72",
"@radix-ui/colors": "^3.0.0",
"@radix-ui/react-use-controllable-state": "^1.2.2",
Expand Down
2 changes: 1 addition & 1 deletion apps/app/src/app/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ export type MessageGroup =
export type PromptMode = "prompt" | "shell";

export type ComposerPart =
| { type: "text"; text: string }
| { type: "text"; text: string; synthetic?: boolean }
| { type: "agent"; name: string }
| { type: "skill"; name: string }
| { type: "file"; path: string; label?: string }
Expand Down
39 changes: 20 additions & 19 deletions apps/app/src/components/chat/message-list.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {
import type { SessionStatus } from "@opencode-ai/sdk/v2/client"
import { openDesktopUrl } from "@/app/lib/desktop"
import { SYNTHETIC_SESSION_ERROR_MESSAGE_PREFIX } from "@/app/types"
import { t } from "@/i18n"
import { ApplyPatchTool } from "@/components/tools/apply-patch"
import { BashTool } from "@/components/tools/bash"
import { EditTool } from "@/components/tools/edit"
Expand Down Expand Up @@ -126,7 +127,7 @@ class ToolMessage extends React.Component<ToolMessageProps, { failed: boolean }>
render() {
if (this.state.failed) {
return (
<div className="text-xs text-muted-foreground">Tool step unavailable</div>
<div className="text-xs text-muted-foreground">{t("chat.tool_step_unavailable")}</div>
)
}
return <ToolMessageInner part={this.props.part} />
Expand Down Expand Up @@ -288,11 +289,11 @@ function CopyMessageButton({ messages }: CopyMessageButtonProps) {
}

return (
<MessageAction tooltip={copied ? "Copied!" : "Copy"}>
<MessageAction tooltip={copied ? t("message.copied") : t("message.copy")}>
<Button
variant="ghost"
size="icon"
aria-label="Copy message"
aria-label={t("message.copy")}
onClick={() => void onCopy()}
>
{copied ? <Check /> : <Copy />}
Expand Down Expand Up @@ -469,32 +470,32 @@ const UserMessage = React.memo(
<MessageTimestamp message={message} className="mr-1.5" />
<CopyMessageButton messages={[message]} />
{messageText ? (
<MessageAction tooltip="Edit message">
<MessageAction tooltip={t("message.edit")}>
<Button
variant="ghost"
size="icon"
aria-label="Edit message"
aria-label={t("message.edit")}
onClick={() => onEditUserMessage(message.id, messageText)}
>
<Pencil />
</Button>
</MessageAction>
) : null}
<MessageAction tooltip="Branch in new chat">
<MessageAction tooltip={t("message.branch_new_chat")}>
<Button
variant="ghost"
size="icon"
aria-label="Branch in new chat"
aria-label={t("message.branch_new_chat")}
onClick={() => onForkAtMessage(message.id)}
>
<Split className="rotate-90" />
</Button>
</MessageAction>
<MessageAction tooltip="Revert">
<MessageAction tooltip={t("message.revert")}>
<Button
variant="ghost"
size="icon"
aria-label="Revert"
aria-label={t("message.revert")}
onClick={() => onRevertToUserMessage(message.id)}
>
<Undo2 />
Expand All @@ -509,22 +510,22 @@ const UserMessage = React.memo(
{messageText ? (
<ContextMenuItem onClick={() => onEditUserMessage(message.id, messageText)}>
<Pencil className="size-4" />
Edit message
{t("message.edit")}
</ContextMenuItem>
) : null}
{messageText ? (
<ContextMenuItem onClick={() => void navigator.clipboard.writeText(messageText)}>
<Copy className="size-4" />
Copy
{t("message.copy")}
</ContextMenuItem>
) : null}
<ContextMenuItem onClick={() => onForkAtMessage(message.id)}>
<Split className="size-4 rotate-90" />
Branch in new chat
{t("message.branch_new_chat")}
</ContextMenuItem>
<ContextMenuItem onClick={() => onRevertToUserMessage(message.id)}>
<Undo2 className="size-4" />
Revert
{t("message.revert")}
</ContextMenuItem>
</ContextMenuContent>
</ContextMenu>
Expand All @@ -545,7 +546,7 @@ type MessageComponentProps = {
const MessageComponent = React.memo(
({ message, isLastMessage, isStreaming, isLastStep }: MessageComponentProps) => {
if (isSessionErrorMessage(message)) {
return <ErrorMessage error={getMessagesText([message]) || "Session failed"} />
return <ErrorMessage error={getMessagesText([message]) || t("message.session_failed")} />
}

if (isEmptyMessage(message) && !isStreaming) {
Expand Down Expand Up @@ -595,7 +596,7 @@ const LoadingMessage = React.memo(({ label }: { label?: string }) => (
style={{ backgroundColor: "#818cf8", width: "100%", height: "100%", borderRadius: "50%" }}
/>
</div>
<span>{label ?? "Thinking…"}</span>
<span>{label ?? t("session.assistant_thinking")}</span>
</div>
</div>
</Message>
Expand Down Expand Up @@ -774,21 +775,21 @@ function MessageGroup({
<CopyMessageButton messages={renderableItems.map((item) => item.message)} />
{lastRealItem ? (
<>
<MessageAction tooltip="Branch in new chat">
<MessageAction tooltip={t("message.branch_new_chat")}>
<Button
variant="ghost"
size="icon"
aria-label="Branch in new chat"
aria-label={t("message.branch_new_chat")}
onClick={() => onForkAtMessage(lastRealItem.message.id)}
>
<Split className="rotate-90" />
</Button>
</MessageAction>
<MessageAction tooltip="Revert">
<MessageAction tooltip={t("message.revert")}>
<Button
variant="ghost"
size="icon"
aria-label="Revert"
aria-label={t("message.revert")}
onClick={() => onRevertToUserMessage(lastRealItem.message.id)}
>
<Undo2 />
Expand Down
2 changes: 1 addition & 1 deletion apps/app/src/components/model-behavior-select.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ export function ModelBehaviorSelect({
</Tooltip>
<SelectContent side="top" sideOffset={8} align="start" className="min-w-48">
<SelectGroup>
<SelectLabel>Thinking</SelectLabel>
<SelectLabel>{t("composer.thinking")}</SelectLabel>
{items.map((option) => (
<SelectItem key={option.value} value={option.value} className="text-xs">
{option.label}
Expand Down
Loading
Loading