From caa0d03900c846d20778442fc6c106fbb4814212 Mon Sep 17 00:00:00 2001 From: oss-sync Date: Sat, 6 Jun 2026 00:39:26 +0000 Subject: [PATCH] sync: update from private repo (fd190dc) --- src/engine/piece-runner.test.ts | 30 ++++++++++++++ src/engine/piece-runner.ts | 8 +++- ui/src/App.tsx | 4 +- .../components/activity/ActivityEventCard.tsx | 14 +++---- .../browser/BrowserSessionPanel.tsx | 6 +-- ui/src/components/chat/ChatMessage.tsx | 10 ++--- ui/src/components/chat/ChatPane.tsx | 16 ++++---- ui/src/components/chat/SubtaskInlineCard.tsx | 6 +-- ui/src/components/chat/ToolCallsSection.tsx | 2 +- ui/src/components/create/CreateTaskDialog.tsx | 4 +- .../components/dashboard/MarkdownWidget.tsx | 2 +- .../dashboard/WorkerStatusWidget.tsx | 2 +- .../detail/ContinueWithPieceDialog.tsx | 2 +- ui/src/components/detail/DetailHeader.tsx | 4 +- ui/src/components/detail/DetailPanel.tsx | 2 +- ui/src/components/detail/ReflectionBadge.tsx | 2 +- ui/src/components/detail/tabs/BrowserTab.tsx | 4 +- ui/src/components/detail/tabs/OverviewTab.tsx | 4 +- ui/src/components/detail/tabs/TraceTab.tsx | 16 ++++---- .../detail/tabs/console/ConsoleHeader.tsx | 2 +- .../components/embed/AmazonProductsCard.tsx | 2 +- ui/src/components/embed/MapPlacesCard.tsx | 2 +- ui/src/components/embed/XPostsCard.tsx | 2 +- ui/src/components/embed/YouTubeVideosCard.tsx | 2 +- ui/src/components/files/FilePreview.tsx | 8 ++-- ui/src/components/list/TaskListItem.tsx | 6 +-- ui/src/components/settings/BrandingForm.tsx | 2 +- ui/src/components/settings/ConfigForm.tsx | 6 +-- .../settings/GatewayKeyRawKeyDialog.tsx | 6 +-- .../settings/GatewayKeysSection.tsx | 6 +-- .../components/settings/GatewayServerForm.tsx | 12 +++--- .../settings/KnowledgeNamespacesForm.tsx | 6 +-- ui/src/components/settings/LlmWorkersForm.tsx | 2 +- .../settings/MemoryLearningForm.tsx | 30 +++++++------- ui/src/components/settings/ModelSelect.tsx | 2 +- .../components/settings/MovementAccordion.tsx | 6 +-- .../components/settings/NotificationsForm.tsx | 4 +- ui/src/components/settings/PieceEditor.tsx | 4 +- ui/src/components/settings/ReflectionForm.tsx | 2 +- ui/src/components/settings/RulesTable.tsx | 2 +- ui/src/components/settings/SecretInput.tsx | 4 +- ui/src/components/settings/SkillsForm.tsx | 16 ++++---- ui/src/components/settings/SshAuditLog.tsx | 6 +-- .../settings/SshGlobalConnectionsForm.tsx | 16 ++++---- ui/src/components/settings/SshGrantsForm.tsx | 12 +++--- .../settings/SshMasterKeyRotationForm.tsx | 8 ++-- ui/src/components/settings/ToolTagInput.tsx | 10 ++--- ui/src/components/settings/ToolsForm.tsx | 6 +-- ui/src/components/settings/formUtils.tsx | 2 +- ui/src/components/shared/EmptyState.tsx | 2 +- .../components/userfolder/AgentsMdPanel.tsx | 2 +- .../userfolder/BrowserSessionsPanel.tsx | 8 ++-- ui/src/components/userfolder/FileTree.tsx | 2 +- .../userfolder/McpConnectionsPanel.tsx | 2 +- ui/src/components/userfolder/McpPanel.tsx | 8 ++-- .../components/userfolder/McpServersPanel.tsx | 10 ++--- .../userfolder/MonacoFileEditor.tsx | 2 +- ui/src/components/userfolder/PetsPanel.tsx | 4 +- .../userfolder/SaveAsScriptDialog.tsx | 4 +- .../userfolder/SshConnectionForm.tsx | 4 +- .../userfolder/SshConnectionsPanel.tsx | 12 +++--- .../userfolder/SshPublicKeyDialog.tsx | 2 +- .../userfolder/SubscriptionsPanel.tsx | 2 +- ui/src/index.css | 2 +- ui/src/lib/utils.test.ts | 26 ++++++++++++ ui/src/lib/utils.ts | 40 +++++++++++++++---- ui/src/pages/AdminCaptchaPage.tsx | 4 +- ui/src/pages/PiecesPage.tsx | 6 +-- ui/src/pages/SchedulesPage.tsx | 12 +++--- ui/src/pages/UsersPage.tsx | 16 ++++---- 70 files changed, 294 insertions(+), 208 deletions(-) create mode 100644 ui/src/lib/utils.test.ts diff --git a/src/engine/piece-runner.test.ts b/src/engine/piece-runner.test.ts index 2b71f89..1865b7b 100644 --- a/src/engine/piece-runner.test.ts +++ b/src/engine/piece-runner.test.ts @@ -129,6 +129,36 @@ describe('piece-runner review feedback flow', () => { expect(instructions[4]).toContain('review 2: add conclusion'); }); + it('defaults ownerId and userId to "local" for owner-less (no-auth) jobs', async () => { + workspacePath = makeWorkspace(); + let capturedCtx: { ownerId?: unknown; userId?: unknown } | undefined; + executeMovementMock.mockImplementation(async (_movement, _instruction, _client, ctx) => { + capturedCtx = ctx as typeof capturedCtx; + return { next: 'COMPLETE', output: 'done', toolsUsed: [] }; + }); + + // options omit ownerId/userId entirely — a no-auth job has no owner. + // (runPiece args: piece, instruction, client, workspace, callbacks, toolsConfig, options) + await runPiece(makePiece(), 'TASK', {} as never, workspacePath, undefined, undefined, {}); + + expect(capturedCtx?.ownerId).toBe('local'); + expect(capturedCtx?.userId).toBe('local'); + }); + + it('preserves a real ownerId/userId when the job is owned (auth mode)', async () => { + workspacePath = makeWorkspace(); + let capturedCtx: { ownerId?: unknown; userId?: unknown } | undefined; + executeMovementMock.mockImplementation(async (_movement, _instruction, _client, ctx) => { + capturedCtx = ctx as typeof capturedCtx; + return { next: 'COMPLETE', output: 'done', toolsUsed: [] }; + }); + + await runPiece(makePiece(), 'TASK', {} as never, workspacePath, undefined, undefined, { ownerId: 'alice', userId: 'alice' }); + + expect(capturedCtx?.ownerId).toBe('alice'); + expect(capturedCtx?.userId).toBe('alice'); + }); + it('appends safe git status and diff context after verify loops', async () => { workspacePath = makeGitWorkspace(); const instructions: string[] = []; diff --git a/src/engine/piece-runner.ts b/src/engine/piece-runner.ts index ce92ab3..c61b9d2 100644 --- a/src/engine/piece-runner.ts +++ b/src/engine/piece-runner.ts @@ -725,12 +725,16 @@ function prepareMovementContext( spawnSubTask: options?.spawnSubTask, missionBrief: options?.missionBrief, taskId: options?.taskId, - userId: options?.userId, + // No-auth jobs have no owner (ownerId/userId null). Resolve a single 'local' + // identity — matching where pieces already resolve (worker.ts: ownerId ?? 'local') + // — so MCP (global servers via ctx.ownerId) and the user folder / memory / notes + // (ctx.userId) work in single-tenant deployments instead of being disabled. + userId: options?.userId ?? 'local', browserSessionState: options?.browserSessionState, browserSessionProfileId: options?.browserSessionProfileId, browserSessionProfile: options?.browserSessionProfile, onAuthExpired: options?.onAuthExpired, - ownerId: options?.ownerId, + ownerId: options?.ownerId ?? 'local', jobId: options?.jobId, mcpConfig: options?.mcpConfig, mcpQuotaState: { files: 0, bytes: 0 }, diff --git a/ui/src/App.tsx b/ui/src/App.tsx index 770ea7e..cce0913 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -390,8 +390,8 @@ function AppInner({ isAdmin, authEnabled, user }: { isAdmin: boolean; authEnable {toast && (
{toast.message}
diff --git a/ui/src/components/activity/ActivityEventCard.tsx b/ui/src/components/activity/ActivityEventCard.tsx index 49b62c9..302450b 100644 --- a/ui/src/components/activity/ActivityEventCard.tsx +++ b/ui/src/components/activity/ActivityEventCard.tsx @@ -10,13 +10,13 @@ import { MarkdownText } from '../../lib/markdown-text'; const MD_KINDS = new Set(['preview', 'final', 'ask', 'other']); const KIND_COLORS: Record = { - movement_start: { dot: 'bg-blue-600', badge: 'bg-blue-100', badgeText: 'text-blue-700', border: 'border-slate-200' }, - movement_complete:{ dot: 'bg-blue-600', badge: 'bg-blue-100', badgeText: 'text-blue-700', border: 'border-slate-200' }, - tool: { dot: 'bg-teal-600', badge: 'bg-teal-100', badgeText: 'text-teal-700', border: 'border-teal-200' }, - preview: { dot: 'bg-blue-600', badge: 'bg-blue-100', badgeText: 'text-blue-700', border: 'border-blue-200' }, - final: { dot: 'bg-green-600', badge: 'bg-green-100', badgeText: 'text-green-700', border: 'border-green-200' }, - ask: { dot: 'bg-amber-500', badge: 'bg-amber-100', badgeText: 'text-amber-700', border: 'border-amber-200' }, - preflight: { dot: 'bg-purple-400', badge: 'bg-purple-50', badgeText: 'text-purple-600', border: 'border-purple-100' }, + movement_start: { dot: 'bg-blue-600', badge: 'bg-blue-100 dark:bg-blue-500/15', badgeText: 'text-blue-700 dark:text-blue-300', border: 'border-slate-200' }, + movement_complete:{ dot: 'bg-blue-600', badge: 'bg-blue-100 dark:bg-blue-500/15', badgeText: 'text-blue-700 dark:text-blue-300', border: 'border-slate-200' }, + tool: { dot: 'bg-teal-600', badge: 'bg-teal-100 dark:bg-teal-500/15', badgeText: 'text-teal-700 dark:text-teal-300', border: 'border-teal-200 dark:border-teal-500/30' }, + preview: { dot: 'bg-blue-600', badge: 'bg-blue-100 dark:bg-blue-500/15', badgeText: 'text-blue-700 dark:text-blue-300', border: 'border-blue-200 dark:border-blue-500/30' }, + final: { dot: 'bg-green-600', badge: 'bg-green-100 dark:bg-green-500/15', badgeText: 'text-green-700 dark:text-green-300', border: 'border-green-200 dark:border-green-500/30' }, + ask: { dot: 'bg-amber-500', badge: 'bg-amber-100 dark:bg-amber-500/15', badgeText: 'text-amber-700 dark:text-amber-300', border: 'border-amber-200 dark:border-amber-500/30' }, + preflight: { dot: 'bg-purple-400', badge: 'bg-purple-50 dark:bg-purple-500/15', badgeText: 'text-purple-600 dark:text-purple-300', border: 'border-purple-100 dark:border-purple-500/30' }, other: { dot: 'bg-slate-400', badge: 'bg-slate-100', badgeText: 'text-slate-600', border: 'border-slate-200' }, }; diff --git a/ui/src/components/browser/BrowserSessionPanel.tsx b/ui/src/components/browser/BrowserSessionPanel.tsx index b69a5fe..ca0875a 100644 --- a/ui/src/components/browser/BrowserSessionPanel.tsx +++ b/ui/src/components/browser/BrowserSessionPanel.tsx @@ -96,8 +96,8 @@ export function BrowserSessionPanel() {
{session.id.slice(0, 8)}... {session.state} @@ -121,7 +121,7 @@ export function BrowserSessionPanel() { )} diff --git a/ui/src/components/chat/ChatMessage.tsx b/ui/src/components/chat/ChatMessage.tsx index b2ce88f..4def8ba 100644 --- a/ui/src/components/chat/ChatMessage.tsx +++ b/ui/src/components/chat/ChatMessage.tsx @@ -179,12 +179,12 @@ function ChecklistCard({ comment }: { comment: LocalTaskComment }) { {/* Summary badges */}
{summary.done > 0 && ( - + {summary.done} )} {summary.failed > 0 && ( - + {summary.failed} )} @@ -343,7 +343,7 @@ export function ChatMessage({ comment, taskId, imageBaseUrl, isStaleThinking }: const isPending = !comment.injectedAt; return (
-
+
{author} · {new Date(createdAt).toLocaleString()}
@@ -374,7 +374,7 @@ export function ChatMessage({ comment, taskId, imageBaseUrl, isStaleThinking }: if (kind === 'ask') { return (
-
+
{author} · {new Date(createdAt).toLocaleString()}
@@ -388,7 +388,7 @@ export function ChatMessage({ comment, taskId, imageBaseUrl, isStaleThinking }: if (kind === 'result') { return (
-
+
{author} · {new Date(createdAt).toLocaleString()}
diff --git a/ui/src/components/chat/ChatPane.tsx b/ui/src/components/chat/ChatPane.tsx index ef7fca6..7e1773b 100644 --- a/ui/src/components/chat/ChatPane.tsx +++ b/ui/src/components/chat/ChatPane.tsx @@ -244,14 +244,14 @@ export function ChatPane({ task, comments, onSubmit, onCancel, onOpenDetail }: C {isBusy && (
{isWaitingSubtasks ? 'subtasks' : 'running'} @@ -385,8 +385,8 @@ export function ChatPane({ task, comments, onSubmit, onCancel, onOpenDetail }: C {isBusy && (
)} {sendError && !isBusy && ( -
+
⚠ {sendError} @@ -461,7 +461,7 @@ export function ChatPane({ task, comments, onSubmit, onCancel, onOpenDetail }: C
{mode === 'view' && error && ( -
{error}
+
{error}
)} {body}
diff --git a/ui/src/components/list/TaskListItem.tsx b/ui/src/components/list/TaskListItem.tsx index b0ae072..eb2d0b3 100644 --- a/ui/src/components/list/TaskListItem.tsx +++ b/ui/src/components/list/TaskListItem.tsx @@ -52,15 +52,15 @@ export const LocalTaskListItem = memo(function LocalTaskListItem({ task, active, system )} {task.visibility === 'private' && ( - private + private )} {task.visibility === 'org' && ( - + {task.visibilityScopeOrgName ?? 'org'} )} {task.visibility === 'public' && ( - public + public )}
diff --git a/ui/src/components/settings/BrandingForm.tsx b/ui/src/components/settings/BrandingForm.tsx index e33ca72..c4fb3e7 100644 --- a/ui/src/components/settings/BrandingForm.tsx +++ b/ui/src/components/settings/BrandingForm.tsx @@ -124,7 +124,7 @@ function AssetUploader({ type="button" onClick={() => void handleClear()} disabled={busy} - className="px-2.5 h-7 text-2xs font-medium text-red-700 border border-red-200 bg-canvas hover:bg-red-50 rounded-md disabled:opacity-50 transition-colors" + className="px-2.5 h-7 text-2xs font-medium text-red-700 dark:text-red-300 border border-red-200 bg-canvas hover:bg-red-50 dark:hover:bg-red-500/15 rounded-md disabled:opacity-50 transition-colors" > 削除 diff --git a/ui/src/components/settings/ConfigForm.tsx b/ui/src/components/settings/ConfigForm.tsx index 810bfbb..709eeaa 100644 --- a/ui/src/components/settings/ConfigForm.tsx +++ b/ui/src/components/settings/ConfigForm.tsx @@ -242,16 +242,16 @@ function ConfigFormInner({ section }: ConfigFormProps) {
{toast ? ( - + {toast} ) : dirty ? ( - + 未保存: {dirtyCount} 項目 — 「Save & Apply」を押すまで反映されません diff --git a/ui/src/components/settings/GatewayKeyRawKeyDialog.tsx b/ui/src/components/settings/GatewayKeyRawKeyDialog.tsx index 19c7bc3..4186a1b 100644 --- a/ui/src/components/settings/GatewayKeyRawKeyDialog.tsx +++ b/ui/src/components/settings/GatewayKeyRawKeyDialog.tsx @@ -106,9 +106,9 @@ export function GatewayKeyRawKeyDialog({ rawKey, team, reason, onClose }: Props)

team: {team}

-
-

⚠️ このキーは今後二度と表示されません

-

+

+

⚠️ このキーは今後二度と表示されません

+

必ずパスワードマネージャや LLM クライアントの設定にコピー・保存してから閉じてください。 紛失した場合は Rotate で再発行する必要があります。

diff --git a/ui/src/components/settings/GatewayKeysSection.tsx b/ui/src/components/settings/GatewayKeysSection.tsx index dbae0ae..3f25860 100644 --- a/ui/src/components/settings/GatewayKeysSection.tsx +++ b/ui/src/components/settings/GatewayKeysSection.tsx @@ -282,9 +282,9 @@ export function GatewayKeysSection({ showToast }: Props) { {isRevoked ? ( - revoked + revoked ) : ( - active + active )} @@ -308,7 +308,7 @@ export function GatewayKeysSection({ showToast }: Props) { type="button" disabled={isRevoked} onClick={() => handleRevoke(row)} - className="px-2 py-0.5 text-xs rounded border border-red-300 text-red-700 hover:bg-red-50 disabled:opacity-40 disabled:cursor-not-allowed" + className="px-2 py-0.5 text-xs rounded border border-red-300 text-red-700 dark:text-red-300 hover:bg-red-50 dark:hover:bg-red-500/15 disabled:opacity-40 disabled:cursor-not-allowed" > Revoke diff --git a/ui/src/components/settings/GatewayServerForm.tsx b/ui/src/components/settings/GatewayServerForm.tsx index ca0645b..2848752 100644 --- a/ui/src/components/settings/GatewayServerForm.tsx +++ b/ui/src/components/settings/GatewayServerForm.tsx @@ -87,21 +87,21 @@ function StatusBadge({ status }: { status: GatewayServerStatus | undefined }) { } if (status.state === 'running') { return ( - + running (mounted at /v1, port {status.sharedPort}) ); } if (status.state === 'misconfigured') { return ( - + misconfigured ({status.errors.length} error{status.errors.length === 1 ? '' : 's'}) ); } if (status.state === 'starting' || status.state === 'stopping') { return ( - + {status.state}… ); @@ -206,7 +206,7 @@ export function GatewayServerForm({ config, onChange }: SectionFormProps) {
{statusQuery.data?.errors && statusQuery.data.errors.length > 0 && ( -