holo-codex 0.1.0
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/.agents/plugins/marketplace.json +20 -0
- package/CONTRIBUTING.md +54 -0
- package/LICENSE +21 -0
- package/README.md +215 -0
- package/README.zh-CN.md +215 -0
- package/SECURITY.md +39 -0
- package/assets/brand/README.md +35 -0
- package/assets/brand/holo-codex-icon.svg +28 -0
- package/assets/brand/holo-codex-lockup.svg +49 -0
- package/assets/brand/holo-codex-mark.svg +33 -0
- package/assets/brand/holo-codex-plugin-card.png +0 -0
- package/assets/brand/holo-codex-plugin-card.svg +81 -0
- package/assets/brand/holo-codex-readme-hero.png +0 -0
- package/assets/brand/holo-codex-readme-hero.svg +140 -0
- package/assets/brand/holo-codex-social-preview.png +0 -0
- package/assets/brand/holo-codex-social-preview.svg +130 -0
- package/assets/brand/holo-codex-wordmark-options.svg +52 -0
- package/docs/checklists/agent-loop-first-delivery-audit.md +129 -0
- package/docs/examples/generic-loop-repo-hygiene.md +168 -0
- package/docs/install.md +190 -0
- package/docs/local-release-readiness.md +206 -0
- package/docs/release-checklist.md +144 -0
- package/docs/self-bootstrap.md +150 -0
- package/docs/trust-and-safety.md +45 -0
- package/package.json +83 -0
- package/plugins/autonomous-pr-loop/.codex-plugin/plugin.json +17 -0
- package/plugins/autonomous-pr-loop/.mcp.json +13 -0
- package/plugins/autonomous-pr-loop/bin/agent-loop.mjs +31 -0
- package/plugins/autonomous-pr-loop/core/artifacts.ts +164 -0
- package/plugins/autonomous-pr-loop/core/autonomy-policy.ts +206 -0
- package/plugins/autonomous-pr-loop/core/ci.ts +131 -0
- package/plugins/autonomous-pr-loop/core/cli-i18n.ts +123 -0
- package/plugins/autonomous-pr-loop/core/cli.ts +1413 -0
- package/plugins/autonomous-pr-loop/core/command-runner.ts +446 -0
- package/plugins/autonomous-pr-loop/core/command.ts +47 -0
- package/plugins/autonomous-pr-loop/core/config-editor.ts +140 -0
- package/plugins/autonomous-pr-loop/core/config.ts +293 -0
- package/plugins/autonomous-pr-loop/core/controller-host.ts +19 -0
- package/plugins/autonomous-pr-loop/core/dashboard-server.ts +536 -0
- package/plugins/autonomous-pr-loop/core/delivery-work-item.ts +217 -0
- package/plugins/autonomous-pr-loop/core/doctor.ts +335 -0
- package/plugins/autonomous-pr-loop/core/errors.ts +82 -0
- package/plugins/autonomous-pr-loop/core/gate-recovery.ts +176 -0
- package/plugins/autonomous-pr-loop/core/gates.ts +26 -0
- package/plugins/autonomous-pr-loop/core/generic-lifecycle.ts +399 -0
- package/plugins/autonomous-pr-loop/core/git.ts +213 -0
- package/plugins/autonomous-pr-loop/core/github.ts +269 -0
- package/plugins/autonomous-pr-loop/core/gitnexus.ts +90 -0
- package/plugins/autonomous-pr-loop/core/happy.ts +42 -0
- package/plugins/autonomous-pr-loop/core/hook-capture.ts +115 -0
- package/plugins/autonomous-pr-loop/core/hook-events.ts +22 -0
- package/plugins/autonomous-pr-loop/core/hook-installation.ts +85 -0
- package/plugins/autonomous-pr-loop/core/hook-observer.ts +84 -0
- package/plugins/autonomous-pr-loop/core/hook-policy.ts +423 -0
- package/plugins/autonomous-pr-loop/core/hook-router.ts +452 -0
- package/plugins/autonomous-pr-loop/core/index.ts +32 -0
- package/plugins/autonomous-pr-loop/core/local-install.ts +778 -0
- package/plugins/autonomous-pr-loop/core/locale.ts +60 -0
- package/plugins/autonomous-pr-loop/core/loop-shapes.ts +190 -0
- package/plugins/autonomous-pr-loop/core/mcp-controller.ts +1479 -0
- package/plugins/autonomous-pr-loop/core/notification-feed.ts +263 -0
- package/plugins/autonomous-pr-loop/core/plan-parser.ts +206 -0
- package/plugins/autonomous-pr-loop/core/plugin-paths.ts +32 -0
- package/plugins/autonomous-pr-loop/core/policy.ts +65 -0
- package/plugins/autonomous-pr-loop/core/pr-lifecycle.ts +464 -0
- package/plugins/autonomous-pr-loop/core/pr-selector.ts +284 -0
- package/plugins/autonomous-pr-loop/core/profiles.ts +439 -0
- package/plugins/autonomous-pr-loop/core/redaction.ts +17 -0
- package/plugins/autonomous-pr-loop/core/repo-root.ts +22 -0
- package/plugins/autonomous-pr-loop/core/review-comments.ts +77 -0
- package/plugins/autonomous-pr-loop/core/scope-guard.ts +179 -0
- package/plugins/autonomous-pr-loop/core/state-machine.ts +828 -0
- package/plugins/autonomous-pr-loop/core/state-types.ts +130 -0
- package/plugins/autonomous-pr-loop/core/storage.ts +2527 -0
- package/plugins/autonomous-pr-loop/core/types.ts +567 -0
- package/plugins/autonomous-pr-loop/core/worker-events.ts +412 -0
- package/plugins/autonomous-pr-loop/core/worker-policy.ts +72 -0
- package/plugins/autonomous-pr-loop/core/worker-prompts.ts +182 -0
- package/plugins/autonomous-pr-loop/core/worker.ts +809 -0
- package/plugins/autonomous-pr-loop/core/workflow-board.ts +1515 -0
- package/plugins/autonomous-pr-loop/hooks/dist/permission-request.js +2462 -0
- package/plugins/autonomous-pr-loop/hooks/dist/post-compact.js +2462 -0
- package/plugins/autonomous-pr-loop/hooks/dist/post-tool-use.js +2462 -0
- package/plugins/autonomous-pr-loop/hooks/dist/pre-compact.js +2462 -0
- package/plugins/autonomous-pr-loop/hooks/dist/pre-tool-use.js +3460 -0
- package/plugins/autonomous-pr-loop/hooks/dist/session-start.js +2462 -0
- package/plugins/autonomous-pr-loop/hooks/dist/stop.js +2462 -0
- package/plugins/autonomous-pr-loop/hooks/dist/user-prompt-submit.js +2462 -0
- package/plugins/autonomous-pr-loop/hooks/hooks.json +106 -0
- package/plugins/autonomous-pr-loop/hooks/observe-runner.ts +25 -0
- package/plugins/autonomous-pr-loop/hooks/permission-request.ts +4 -0
- package/plugins/autonomous-pr-loop/hooks/post-compact.ts +4 -0
- package/plugins/autonomous-pr-loop/hooks/post-tool-use.ts +4 -0
- package/plugins/autonomous-pr-loop/hooks/pre-compact.ts +4 -0
- package/plugins/autonomous-pr-loop/hooks/pre-tool-use.ts +44 -0
- package/plugins/autonomous-pr-loop/hooks/session-start.ts +4 -0
- package/plugins/autonomous-pr-loop/hooks/stop.ts +4 -0
- package/plugins/autonomous-pr-loop/hooks/user-prompt-submit.ts +4 -0
- package/plugins/autonomous-pr-loop/mcp-server/src/index.ts +87 -0
- package/plugins/autonomous-pr-loop/mcp-server/src/tools.ts +205 -0
- package/plugins/autonomous-pr-loop/package.json +9 -0
- package/plugins/autonomous-pr-loop/schemas/config.schema.json +74 -0
- package/plugins/autonomous-pr-loop/schemas/marketplace.schema.json +46 -0
- package/plugins/autonomous-pr-loop/schemas/plugin.schema.json +32 -0
- package/plugins/autonomous-pr-loop/schemas/state.schema.json +19 -0
- package/plugins/autonomous-pr-loop/schemas/worker-event.schema.json +19 -0
- package/plugins/autonomous-pr-loop/schemas/worker-result.schema.json +58 -0
- package/plugins/autonomous-pr-loop/scripts/agent-loop.ts +44 -0
- package/plugins/autonomous-pr-loop/skills/autonomous-pr-loop/SKILL.md +26 -0
- package/plugins/autonomous-pr-loop/skills/autonomous-pr-loop/agents/openai.yaml +6 -0
- package/plugins/autonomous-pr-loop/ui/index.html +26 -0
- package/plugins/autonomous-pr-loop/ui/public/favicon.svg +7 -0
- package/plugins/autonomous-pr-loop/ui/src/api.ts +639 -0
- package/plugins/autonomous-pr-loop/ui/src/app.tsx +238 -0
- package/plugins/autonomous-pr-loop/ui/src/components/ActivityBadge.tsx +31 -0
- package/plugins/autonomous-pr-loop/ui/src/components/BrandMark.tsx +36 -0
- package/plugins/autonomous-pr-loop/ui/src/components/Collapsible.tsx +6 -0
- package/plugins/autonomous-pr-loop/ui/src/components/CommandPreview.tsx +15 -0
- package/plugins/autonomous-pr-loop/ui/src/components/ConfigEditor.tsx +389 -0
- package/plugins/autonomous-pr-loop/ui/src/components/EmptyState.tsx +10 -0
- package/plugins/autonomous-pr-loop/ui/src/components/ErrorState.tsx +12 -0
- package/plugins/autonomous-pr-loop/ui/src/components/List.tsx +7 -0
- package/plugins/autonomous-pr-loop/ui/src/components/MetricRow.tsx +6 -0
- package/plugins/autonomous-pr-loop/ui/src/components/ResponsiveTable.tsx +65 -0
- package/plugins/autonomous-pr-loop/ui/src/components/RiskBadge.tsx +10 -0
- package/plugins/autonomous-pr-loop/ui/src/components/StatusBadge.tsx +29 -0
- package/plugins/autonomous-pr-loop/ui/src/components/TopMetric.tsx +10 -0
- package/plugins/autonomous-pr-loop/ui/src/fixtures.ts +1152 -0
- package/plugins/autonomous-pr-loop/ui/src/i18n.ts +1105 -0
- package/plugins/autonomous-pr-loop/ui/src/main.tsx +14 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/CommandCenter.tsx +470 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/CommandCenterParts.tsx +276 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/agent-timeline/AgentTimelineView.tsx +73 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/artifact-viewer/ArtifactViewer.tsx +44 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/dry-run-preview/DryRunPreview.tsx +66 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/event-ledger/EventLedger.tsx +17 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/gate-center/GateCenter.tsx +34 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/mission-control/MissionControl.tsx +104 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/mission-control/WorkflowBoard.tsx +577 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/notifications/NotificationsView.tsx +30 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/plan-navigator/PlanNavigator.tsx +19 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/policy-config/PolicyConfig.tsx +22 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/pr-inbox/PrInbox.tsx +26 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/recovery-center/RecoveryCenter.tsx +125 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/scope-guard/ScopeGuard.tsx +16 -0
- package/plugins/autonomous-pr-loop/ui/src/pages/worker-runs/WorkerRuns.tsx +39 -0
- package/plugins/autonomous-pr-loop/ui/src/styles.css +2673 -0
- package/plugins/autonomous-pr-loop/ui/src/theme.ts +57 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,1105 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_LOCALE,
|
|
3
|
+
normalizeLocaleSetting,
|
|
4
|
+
resolveEffectiveLocale,
|
|
5
|
+
type EffectiveLocale,
|
|
6
|
+
type LocaleSetting
|
|
7
|
+
} from "../../core/locale.js";
|
|
8
|
+
import type { ThemeSetting } from "./theme.js";
|
|
9
|
+
|
|
10
|
+
export const DASHBOARD_LOCALE_STORAGE_KEY = "agent-loop-dashboard-locale";
|
|
11
|
+
|
|
12
|
+
const TEXT: Record<EffectiveLocale, Record<string, string>> = {
|
|
13
|
+
"en-US": {
|
|
14
|
+
actionApprove: "Approve",
|
|
15
|
+
actionReject: "Reject",
|
|
16
|
+
actionRunToGate: "Run to Gate",
|
|
17
|
+
actionStep: "Step",
|
|
18
|
+
actionResume: "Resume",
|
|
19
|
+
actionStop: "Stop",
|
|
20
|
+
actionRefresh: "Refresh",
|
|
21
|
+
actionStartRealRun: "Start Real Run",
|
|
22
|
+
actionStopRun: "Stop Run",
|
|
23
|
+
actionMarkAllRead: "Mark All Read",
|
|
24
|
+
actionMarkHandled: "Mark Handled",
|
|
25
|
+
actionReevaluate: "Re-evaluate",
|
|
26
|
+
actionRunRecovery: "Run Explicit Recovery",
|
|
27
|
+
actionRead: "Read",
|
|
28
|
+
actionReading: "Reading",
|
|
29
|
+
actionSaveConfig: "Save Config",
|
|
30
|
+
actionRevert: "Revert",
|
|
31
|
+
appLoadingTitle: "Loading dashboard",
|
|
32
|
+
appLoadingMessage: "Reading supervisor state through the dashboard API.",
|
|
33
|
+
appUnavailableTitle: "Dashboard unavailable",
|
|
34
|
+
appNoDataTitle: "No loop data",
|
|
35
|
+
appNoDataMessage: "Run `pnpm agent-loop init` or start a loop run.",
|
|
36
|
+
appUpdated: "Updated",
|
|
37
|
+
appUnknownError: "Dashboard API returned an unknown error.",
|
|
38
|
+
loginTitle: "Dashboard token required",
|
|
39
|
+
loginMessage: "Local loopback sessions usually unlock automatically. Paste the fallback token from `agent-loop dashboard` stderr only if this screen appears.",
|
|
40
|
+
loginTokenLabel: "Dashboard token",
|
|
41
|
+
loginTokenPlaceholder: "Paste dashboard token",
|
|
42
|
+
loginSubmit: "Unlock Dashboard",
|
|
43
|
+
brandTitle: "HOLO-Codex",
|
|
44
|
+
brandSubtitle: "Human On Loop Codex",
|
|
45
|
+
navAria: "Dashboard pages",
|
|
46
|
+
interventionPanel: "Intervention panel",
|
|
47
|
+
interventionPanelEyebrow: "INTERVENTION PANEL",
|
|
48
|
+
decisionNote: "Decision note",
|
|
49
|
+
gateNextState: "Next state",
|
|
50
|
+
decisionNoteEyebrow: "DECISION NOTE",
|
|
51
|
+
decisionNotePlaceholder: "Required only when a gate needs operator intervention...",
|
|
52
|
+
loopControls: "LOOP CONTROLS",
|
|
53
|
+
artifactShortcut: "ARTIFACT SHORTCUT",
|
|
54
|
+
noActiveBranch: "No active branch",
|
|
55
|
+
noArtifactsYet: "No artifacts yet",
|
|
56
|
+
none: "none",
|
|
57
|
+
notStarted: "not started",
|
|
58
|
+
runId: "Run ID",
|
|
59
|
+
gateId: "Gate ID",
|
|
60
|
+
owner: "Owner",
|
|
61
|
+
reason: "Reason",
|
|
62
|
+
updated: "Updated",
|
|
63
|
+
language: "Language",
|
|
64
|
+
theme: "Theme",
|
|
65
|
+
themeLight: "Light",
|
|
66
|
+
themeDark: "Dark",
|
|
67
|
+
themeSystem: "System",
|
|
68
|
+
themeEffective: "Effective",
|
|
69
|
+
localeZh: "中文",
|
|
70
|
+
localeEn: "English",
|
|
71
|
+
localeSystem: "System",
|
|
72
|
+
valueAskOnAnyReview: "Ask on any review",
|
|
73
|
+
valueActive: "Active",
|
|
74
|
+
valueAllGates: "All gates",
|
|
75
|
+
valueAutonomousUntilGate: "Until next gate",
|
|
76
|
+
valueAutonomousUntilTerminal: "Until terminal state",
|
|
77
|
+
valueBlockersOnly: "Blockers only",
|
|
78
|
+
valueBlocked: "Blocked",
|
|
79
|
+
valueClean: "Clean",
|
|
80
|
+
valueCollectingEvidence: "Collecting evidence",
|
|
81
|
+
valueCompleted: "Completed",
|
|
82
|
+
valueConditional: "Conditional",
|
|
83
|
+
valueConfirmationRequired: "Confirmation required",
|
|
84
|
+
valueCommitPushPr: "Commit, push, and open PR",
|
|
85
|
+
valueCreateBranch: "Creating branch",
|
|
86
|
+
valueDisabled: "Disabled",
|
|
87
|
+
valueDiscoverProgress: "Discovering progress",
|
|
88
|
+
valueFixReview: "Fixing review feedback",
|
|
89
|
+
valueFixScopedAndCarryForward: "Fix scoped findings",
|
|
90
|
+
valueFresh: "Fresh",
|
|
91
|
+
valueDefaultPrLoop: "Default PR loop",
|
|
92
|
+
valueDocsOnlyLoop: "Docs-only loop",
|
|
93
|
+
valueReviewFixLoop: "Review-fix loop",
|
|
94
|
+
valueReleaseReadyLoop: "Release-ready loop",
|
|
95
|
+
valueResearchReportLoop: "Research report loop",
|
|
96
|
+
valueDocumentPreparationLoop: "Document preparation loop",
|
|
97
|
+
valueRepoHygieneLoop: "Repo hygiene loop",
|
|
98
|
+
valueWeeklyReviewLoop: "Weekly review loop",
|
|
99
|
+
valueDataExtractionLoop: "Data extraction loop",
|
|
100
|
+
valueDefaultPrRoles: "Default PR roles",
|
|
101
|
+
valuePrLoop: "PR loop",
|
|
102
|
+
valueGenericLoop: "Generic loop",
|
|
103
|
+
valueDefineGoal: "Defining goal",
|
|
104
|
+
valueCollectContext: "Collecting context",
|
|
105
|
+
valuePlanWork: "Planning work",
|
|
106
|
+
valueExecuteStep: "Executing step",
|
|
107
|
+
valueHumanGate: "Human gate",
|
|
108
|
+
valueHistorical: "Historical",
|
|
109
|
+
valueDeliver: "Delivering",
|
|
110
|
+
valueImportantOnly: "Important only",
|
|
111
|
+
valueImplement: "Implementing",
|
|
112
|
+
valueLive: "Live",
|
|
113
|
+
valueManual: "Manual",
|
|
114
|
+
valueMerge: "Merging",
|
|
115
|
+
valueMissingEvidence: "Missing evidence",
|
|
116
|
+
valueNotStarted: "Not started",
|
|
117
|
+
valueOpen: "Open",
|
|
118
|
+
valuePending: "Pending",
|
|
119
|
+
valueDone: "Done",
|
|
120
|
+
valueSkipped: "Skipped",
|
|
121
|
+
valueFailed: "Failed",
|
|
122
|
+
valuePassed: "Passed",
|
|
123
|
+
valueWarn: "Warn",
|
|
124
|
+
valueCaptured: "Captured",
|
|
125
|
+
valueNotSeen: "Not seen",
|
|
126
|
+
valueAmbiguous: "Ambiguous",
|
|
127
|
+
valueUnavailable: "Unavailable",
|
|
128
|
+
valueRunState: "Run state",
|
|
129
|
+
valueWorkflowEvidence: "Workflow evidence",
|
|
130
|
+
valueGate: "Gate",
|
|
131
|
+
valueRequired: "Required",
|
|
132
|
+
valueOptional: "Optional",
|
|
133
|
+
valueNotRequired: "Not required",
|
|
134
|
+
valuePosted: "Posted",
|
|
135
|
+
valueMissing: "Missing",
|
|
136
|
+
valueRequested: "Requested",
|
|
137
|
+
valueStarted: "Started",
|
|
138
|
+
valueInProgress: "In progress",
|
|
139
|
+
valueIncomplete: "Incomplete",
|
|
140
|
+
valueComplete: "Complete",
|
|
141
|
+
valuePushFix: "Pushing fixes",
|
|
142
|
+
valueReady: "Ready",
|
|
143
|
+
valueReadyToMerge: "Ready to merge",
|
|
144
|
+
valueRequireZeroOpenFindings: "Require zero open findings",
|
|
145
|
+
valueResolved: "Resolved",
|
|
146
|
+
valueRunning: "Running",
|
|
147
|
+
valueSelectNextPr: "Selecting next PR",
|
|
148
|
+
valueSelfCheck: "Self check",
|
|
149
|
+
valueStale: "Stale",
|
|
150
|
+
valueStopped: "Stopped",
|
|
151
|
+
valueSucceeded: "Succeeded",
|
|
152
|
+
valueSupervised: "Supervised",
|
|
153
|
+
valueSyncMain: "Syncing main",
|
|
154
|
+
valueWaitReviewOrCi: "Waiting for review/CI",
|
|
155
|
+
valueWriteSpec: "Writing spec",
|
|
156
|
+
live: "Live",
|
|
157
|
+
stale: "Stale",
|
|
158
|
+
riskLow: "low risk",
|
|
159
|
+
riskMedium: "medium risk",
|
|
160
|
+
riskHigh: "high risk",
|
|
161
|
+
draft: "draft",
|
|
162
|
+
ready: "ready",
|
|
163
|
+
pending: "pending",
|
|
164
|
+
unknown: "unknown",
|
|
165
|
+
clean: "clean",
|
|
166
|
+
dirty: "dirty",
|
|
167
|
+
notLinked: "not linked",
|
|
168
|
+
truncated: "truncated",
|
|
169
|
+
topCurrentState: "CURRENT STATE",
|
|
170
|
+
topAutonomy: "AUTONOMY",
|
|
171
|
+
topMerge: "MERGE",
|
|
172
|
+
topAttention: "ATTENTION",
|
|
173
|
+
topPolling: "POLLING",
|
|
174
|
+
pageMission: "Mission Control",
|
|
175
|
+
pagePlan: "Plan Navigator",
|
|
176
|
+
pagePolicy: "Policy Config",
|
|
177
|
+
pageDryRun: "Dry-run Preview",
|
|
178
|
+
pageNotifications: "Notifications",
|
|
179
|
+
pageTimeline: "Observability Console",
|
|
180
|
+
pageGates: "Gate Center",
|
|
181
|
+
pagePr: "PR Inbox",
|
|
182
|
+
pageWorkers: "Worker Runs",
|
|
183
|
+
pageScope: "Scope Guard",
|
|
184
|
+
pageEvents: "Event Ledger",
|
|
185
|
+
pageArtifacts: "Artifact Diff Viewer",
|
|
186
|
+
pageRecovery: "Recovery Center",
|
|
187
|
+
subtitleMission: "Autonomy posture, next action, attention, and merge readiness.",
|
|
188
|
+
subtitlePlan: "Current milestone and selected next PR with evidence folded away.",
|
|
189
|
+
subtitlePolicy: "Edit loop boundaries and merge policy with diff-before-save.",
|
|
190
|
+
subtitleDryRun: "Forecast what the Agent will do before starting a real run.",
|
|
191
|
+
subtitleNotifications: "Severity-grouped attention feed without alert noise.",
|
|
192
|
+
subtitleTimeline: "Unified local console for timeline, live workers, hooks, gates, decisions, and artifacts.",
|
|
193
|
+
subtitleGates: "Open gates and operator decisions.",
|
|
194
|
+
subtitlePr: "Review comments and CI checks.",
|
|
195
|
+
subtitleWorkers: "Worker outcomes, artifacts, and failures.",
|
|
196
|
+
subtitleScope: "Scope and GitNexus evidence.",
|
|
197
|
+
subtitleEvents: "Append-only loop event stream.",
|
|
198
|
+
subtitleArtifacts: "Registered artifacts and diff outputs.",
|
|
199
|
+
subtitleRecovery: "Explicit recovery actions and reality warnings.",
|
|
200
|
+
metricNextAction: "Next action",
|
|
201
|
+
metricPrSelection: "PR selection",
|
|
202
|
+
metricWorkflow: "Workflow",
|
|
203
|
+
metricAutonomyBoundary: "Autonomy boundary",
|
|
204
|
+
metricMergeReadiness: "Merge readiness",
|
|
205
|
+
deliverableReadiness: "Deliverable readiness",
|
|
206
|
+
metricAttention: "Attention",
|
|
207
|
+
metricItems: "{count} items",
|
|
208
|
+
ellipsis: "...",
|
|
209
|
+
rawOriginalMessage: "Raw/original message",
|
|
210
|
+
workerRunsRepoScope: "Worker Runs (repo scope)",
|
|
211
|
+
workerScopeSummary: "current run {current} / repo total {total} / historical {historical} / stale {stale}",
|
|
212
|
+
workerScopePreview: "Showing {shown} of {total} repo-scope workers. Current-run, historical, and stale workers are labeled separately.",
|
|
213
|
+
gateScopeSummary: "Active gates drive operator actions. Active {active} / historical {historical} / repo total {total}.",
|
|
214
|
+
autonomyPosture: "AUTONOMY POSTURE",
|
|
215
|
+
autonomyFallback: "Agent runs until gate; user observes and intervenes when needed.",
|
|
216
|
+
policyDetails: "Policy details",
|
|
217
|
+
workflowProfile: "Workflow profile",
|
|
218
|
+
workflowStages: "Workflow stages",
|
|
219
|
+
stagesChip: "{count} stages",
|
|
220
|
+
workflowUnavailable: "Workflow profile unavailable",
|
|
221
|
+
workflowUnavailableMessage: "No profile summary was returned by the controller.",
|
|
222
|
+
currentRole: "Current role",
|
|
223
|
+
noRoles: "No roles mapped.",
|
|
224
|
+
noWorkflowStages: "No workflow stages forecast.",
|
|
225
|
+
genericForecastReady: "Generic workflow forecast is ready.",
|
|
226
|
+
genericLoop: "Generic loop",
|
|
227
|
+
genericLoopNoPrSelection: "Generic loop uses workflow profile state, not PR selection.",
|
|
228
|
+
yes: "yes",
|
|
229
|
+
no: "no",
|
|
230
|
+
notifyRules: "{count} notify rules",
|
|
231
|
+
mergeEvidence: "Merge evidence",
|
|
232
|
+
allEvidenceReady: "all evidence ready",
|
|
233
|
+
missingCount: "{count} missing",
|
|
234
|
+
noPlanData: "No plan data",
|
|
235
|
+
noPlanDataMessage: "Plan parser returned no dashboard model.",
|
|
236
|
+
selectedNextPr: "SELECTED NEXT PR",
|
|
237
|
+
currentPr: "CURRENT PR",
|
|
238
|
+
nextPr: "NEXT PR",
|
|
239
|
+
noUniqueNextPr: "No unique next PR",
|
|
240
|
+
noNextPrMessage: "Parser could not identify the next PR.",
|
|
241
|
+
selected: "selected",
|
|
242
|
+
current: "current",
|
|
243
|
+
ambiguous: "ambiguous",
|
|
244
|
+
completedPrs: "Completed PRs",
|
|
245
|
+
candidatePrs: "Candidate PRs",
|
|
246
|
+
rawEvidence: "Raw evidence",
|
|
247
|
+
completedChip: "{count} completed",
|
|
248
|
+
candidatesChip: "{count} candidates",
|
|
249
|
+
sourcesChip: "{count} sources",
|
|
250
|
+
policyConfigUnavailable: "Policy config unavailable",
|
|
251
|
+
policyConfigLoadError: "Policy config could not be loaded.",
|
|
252
|
+
loadingConfig: "Loading config",
|
|
253
|
+
loadingConfigMessage: "Reading dashboard policy config.",
|
|
254
|
+
dryRunUnavailable: "Dry-run unavailable",
|
|
255
|
+
dryRunLoadError: "Dry-run preview could not be loaded.",
|
|
256
|
+
loadingPreview: "Loading preview",
|
|
257
|
+
loadingPreviewMessage: "Forecasting the next autonomous run.",
|
|
258
|
+
forecastSummary: "FORECAST SUMMARY",
|
|
259
|
+
mergeReady: "Conditional merge ready when evidence passes.",
|
|
260
|
+
mergeMissing: "Missing evidence before conditional merge.",
|
|
261
|
+
commandsPlanned: "Commands planned",
|
|
262
|
+
commandsChip: "{count} commands",
|
|
263
|
+
possibleGates: "Possible gates",
|
|
264
|
+
gatesChip: "{count} gates",
|
|
265
|
+
missingConditions: "Missing conditions",
|
|
266
|
+
filesLikelyTouched: "Files likely touched",
|
|
267
|
+
pathsChip: "{count} paths",
|
|
268
|
+
needsAttention: "NEEDS ATTENTION",
|
|
269
|
+
notificationsCount: "{count} notifications",
|
|
270
|
+
quietProgress: "Informational progress stays quiet unless policy asks for more noise.",
|
|
271
|
+
timelineLatest: "Latest action",
|
|
272
|
+
timelineLastFailure: "Last failure",
|
|
273
|
+
timelineActiveWorker: "Active worker",
|
|
274
|
+
timelineObservationGap: "Observation gap",
|
|
275
|
+
timelineGap: "gap detected",
|
|
276
|
+
timelineNoGap: "no gap",
|
|
277
|
+
timelineUnavailable: "Timeline unavailable",
|
|
278
|
+
timelineLoadError: "Timeline could not be loaded.",
|
|
279
|
+
timelineEmpty: "No timeline entries",
|
|
280
|
+
timelineEmptyMessage: "No timeline entries match this filter.",
|
|
281
|
+
timelineSource: "Source",
|
|
282
|
+
timelineThread: "Thread",
|
|
283
|
+
observabilityConsole: "OBSERVABILITY CONSOLE",
|
|
284
|
+
observabilityTitle: "Full-cycle local activity",
|
|
285
|
+
observabilityMessage: "Filter the same agent timeline by worker, hook, gate, decision, or artifact trail.",
|
|
286
|
+
timelinePresets: "Timeline presets",
|
|
287
|
+
timelinePresetAll: "Timeline",
|
|
288
|
+
timelinePresetLive: "Live Worker",
|
|
289
|
+
timelinePresetHooks: "Hook Feed",
|
|
290
|
+
timelinePresetGates: "Gate / Decision",
|
|
291
|
+
timelinePresetArtifacts: "Artifact Trail",
|
|
292
|
+
workerEvents: "Worker events",
|
|
293
|
+
actionLoadMore: "Load More",
|
|
294
|
+
severityBlocked: "Blocked",
|
|
295
|
+
severityConfirmationRequired: "Confirmation required",
|
|
296
|
+
severityAttention: "Attention",
|
|
297
|
+
severityInformational: "Informational",
|
|
298
|
+
tablePr: "PR",
|
|
299
|
+
tableGate: "Gate",
|
|
300
|
+
tableActivity: "Activity",
|
|
301
|
+
tableStatus: "Status",
|
|
302
|
+
tableMessage: "Message",
|
|
303
|
+
tableRawMessage: "Raw message",
|
|
304
|
+
tableOpened: "Opened",
|
|
305
|
+
tablePullRequest: "Pull request",
|
|
306
|
+
tableDraft: "Draft",
|
|
307
|
+
tableBranch: "Branch",
|
|
308
|
+
tableComment: "Comment",
|
|
309
|
+
tableAuthor: "Author",
|
|
310
|
+
tablePath: "Path",
|
|
311
|
+
tableCheck: "Check",
|
|
312
|
+
tableConclusion: "Conclusion",
|
|
313
|
+
tableObserved: "Observed",
|
|
314
|
+
tableWorker: "Worker",
|
|
315
|
+
tableRole: "Role",
|
|
316
|
+
tableSandbox: "Sandbox",
|
|
317
|
+
tableStarted: "Started",
|
|
318
|
+
tableResultError: "Result / Error",
|
|
319
|
+
tableRawResultError: "Raw result / error",
|
|
320
|
+
tableSeq: "Seq",
|
|
321
|
+
tableEvent: "Event",
|
|
322
|
+
tableState: "State",
|
|
323
|
+
tableTime: "Time",
|
|
324
|
+
tableDetails: "Details",
|
|
325
|
+
tableArtifact: "Artifact",
|
|
326
|
+
tableKind: "Kind",
|
|
327
|
+
tableCreated: "Created",
|
|
328
|
+
tableAction: "Action",
|
|
329
|
+
reviewComments: "Review comments",
|
|
330
|
+
commentsChip: "{count} comments",
|
|
331
|
+
ciChecks: "CI checks",
|
|
332
|
+
checksChip: "{count} checks",
|
|
333
|
+
noGates: "No gates recorded.",
|
|
334
|
+
noReviewComments: "No review comments stored.",
|
|
335
|
+
noCiChecks: "No CI checks stored.",
|
|
336
|
+
noWorkerRuns: "No worker runs yet.",
|
|
337
|
+
noScopeEvidence: "No scope guard evidence yet.",
|
|
338
|
+
noEvents: "No events in ledger.",
|
|
339
|
+
noArtifacts: "No artifacts stored.",
|
|
340
|
+
artifactPreviewAria: "Artifact preview",
|
|
341
|
+
noArtifactSelected: "No artifact selected",
|
|
342
|
+
artifactSelectMessage: "Select an artifact to inspect registered content.",
|
|
343
|
+
artifactReadError: "Artifact could not be read.",
|
|
344
|
+
artifactLarge: "[artifact too large for inline preview; content truncated]",
|
|
345
|
+
artifactDecodeError: "[artifact content could not be decoded]",
|
|
346
|
+
storageRun: "Storage run",
|
|
347
|
+
gitBranch: "Git branch",
|
|
348
|
+
worktree: "Worktree",
|
|
349
|
+
freshness: "Freshness",
|
|
350
|
+
staleData: "stale data",
|
|
351
|
+
fresh: "fresh",
|
|
352
|
+
recoveryWarnings: "Recovery warnings",
|
|
353
|
+
recoveryWhyStopped: "Why this is visible",
|
|
354
|
+
recoveryExplanationActive: "The current active gate is {gate}; operator action may be required.",
|
|
355
|
+
recoveryExplanationHistorical: "Only historical gates are visible here; they belong to inactive or superseded runs.",
|
|
356
|
+
recoveryExplanationStopped: "The run is stopped; resume only after confirming it should continue.",
|
|
357
|
+
recoveryExplanationClear: "No active recovery condition is visible.",
|
|
358
|
+
reevaluateResultTitle: "Re-evaluate result",
|
|
359
|
+
reevaluateUnknownError: "Re-evaluate failed.",
|
|
360
|
+
"reevaluateResult.still_historical": "Still historical; no current active gate matches this record.",
|
|
361
|
+
"reevaluateResult.overridden_by_current_reality": "Overridden by current reality; a newer run superseded this gate.",
|
|
362
|
+
"reevaluateResult.active_again": "Active again; this gate now belongs to the current blocking state.",
|
|
363
|
+
"reevaluateResult.manually_handled": "Manually handled; an operator already marked this historical gate handled.",
|
|
364
|
+
historicalGates: "Historical gates",
|
|
365
|
+
staleWorkerFailures: "Stale worker failures",
|
|
366
|
+
activityActive: "Active",
|
|
367
|
+
activityHistorical: "Historical",
|
|
368
|
+
activityStaleWorker: "Stale worker",
|
|
369
|
+
activityOverridden: "Overridden",
|
|
370
|
+
activityMarkedHandled: "Marked handled",
|
|
371
|
+
"activityReason.current_run": "current run",
|
|
372
|
+
"activityReason.repo_gate": "repo-level gate",
|
|
373
|
+
"activityReason.historical_run": "historical run",
|
|
374
|
+
"activityReason.repo_gate_not_current": "repo gate not current",
|
|
375
|
+
"activityReason.stale_worker_failure": "stale worker failure",
|
|
376
|
+
"activityReason.overridden_by_reality": "overridden by reality check",
|
|
377
|
+
"activityReason.handled_gate": "already handled",
|
|
378
|
+
"activityReason.marked_handled": "marked handled",
|
|
379
|
+
warningsChip: "{count} warnings",
|
|
380
|
+
noPrs: "No PRs",
|
|
381
|
+
noPrsMessage: "No parseable PR entries in this group.",
|
|
382
|
+
noPrsEmpty: "No PRs.",
|
|
383
|
+
noCommandsPlanned: "No commands planned.",
|
|
384
|
+
title: "Title",
|
|
385
|
+
issues: "Issues",
|
|
386
|
+
noNotifications: "No notifications",
|
|
387
|
+
noNotificationsMessage: "Nothing at this severity.",
|
|
388
|
+
noneList: "None.",
|
|
389
|
+
noInterventionTitle: "No intervention needed",
|
|
390
|
+
noInterventionReason: "Agent may continue under the configured loop policy.",
|
|
391
|
+
visibleGateReason: "A gate is visible in current state.",
|
|
392
|
+
actionClose: "Close",
|
|
393
|
+
workflowBoardTitle: "PR Delivery Workflow",
|
|
394
|
+
workflowBoardSubtitle: "Single-workflow observation board for the active PR delivery loop.",
|
|
395
|
+
workflowBoardLoadError: "Workflow board could not be loaded.",
|
|
396
|
+
workflowNoRun: "No PR delivery run",
|
|
397
|
+
workflowStage: "Stage",
|
|
398
|
+
workflowStageSource: "Stage source",
|
|
399
|
+
workflowRunState: "Run state",
|
|
400
|
+
workflowHookCapture: "Hook capture",
|
|
401
|
+
workflowStageEvidence: "Stage evidence",
|
|
402
|
+
workflowRail: "Workflow rail",
|
|
403
|
+
workflowEvidenceShort: "evidence",
|
|
404
|
+
workflowInspectorOpen: "Open inspector",
|
|
405
|
+
workflowInspectorCollapse: "Collapse inspector",
|
|
406
|
+
workflowCurrentStage: "CURRENT STAGE",
|
|
407
|
+
workflowNextAction: "Next action",
|
|
408
|
+
workflowAttachEvidence: "Attach Evidence",
|
|
409
|
+
workflowEvidencePlaceholder: "Short evidence summary, no secrets or raw logs...",
|
|
410
|
+
workflowEvidenceAppended: "Evidence attached.",
|
|
411
|
+
workflowEvidenceAppendFailed: "Evidence append failed.",
|
|
412
|
+
workflowEvidence: "Evidence",
|
|
413
|
+
workflowEvidenceTarget: "Target",
|
|
414
|
+
workflowNoEvidence: "No evidence for this stage yet.",
|
|
415
|
+
workflowVerifyMatrix: "Verification matrix",
|
|
416
|
+
workflowReviewMatrix: "Review report matrix",
|
|
417
|
+
workflowReviewer: "Reviewer",
|
|
418
|
+
workflowSeverityModel: "Severity / model",
|
|
419
|
+
workflowPrCommentNextAction: "PR comment / next action",
|
|
420
|
+
workflowRequirement: "Requirement",
|
|
421
|
+
workflowProgress: "Progress",
|
|
422
|
+
workflowResult: "Result",
|
|
423
|
+
workflowMergeChecklist: "Merge readiness checklist",
|
|
424
|
+
workflowCleanupChecklist: "Cleanup checklist",
|
|
425
|
+
workflowPrChecklist: "PR publication checklist",
|
|
426
|
+
workflowPrOpened: "PR opened",
|
|
427
|
+
workflowGithubPrNote: "This dashboard observes PR delivery. Review and merge actions happen on GitHub.",
|
|
428
|
+
workflowGithubMergeNote: "When ready, open the PR and complete the final merge on GitHub.",
|
|
429
|
+
workflowOpenGithubPr: "Open GitHub PR",
|
|
430
|
+
workflowStageSummary: "Stage summary",
|
|
431
|
+
configGroupWorkflow: "Workflow",
|
|
432
|
+
configGroupAutonomy: "Autonomy",
|
|
433
|
+
configGroupLanguage: "Language",
|
|
434
|
+
configGroupMerge: "Merge",
|
|
435
|
+
configGroupNotifications: "Notifications",
|
|
436
|
+
configGroupReview: "Review Handling",
|
|
437
|
+
configGroupSafety: "Safety Guards",
|
|
438
|
+
configGroupDashboard: "Dashboard",
|
|
439
|
+
configGroupAdvanced: "Advanced Compatibility",
|
|
440
|
+
configSaved: "Config saved",
|
|
441
|
+
configSaveFailed: "Config save failed",
|
|
442
|
+
configDiffTitle: "Diff Before Save",
|
|
443
|
+
configNoChanges: "No changes yet.",
|
|
444
|
+
configChangedFields: "{count} changed field(s).",
|
|
445
|
+
configChangeControl: "Change a control to preview the diff.",
|
|
446
|
+
configDangerous: "Dangerous policy change: type CONFIRM before saving.",
|
|
447
|
+
operatorNote: "Operator note",
|
|
448
|
+
policyChangeNote: "Policy change note",
|
|
449
|
+
operatorNotePlaceholder: "Required for high-risk policy changes...",
|
|
450
|
+
confirmationToken: "Confirmation token",
|
|
451
|
+
confirmationTokenPlaceholder: "Type a confirmation token for dangerous changes",
|
|
452
|
+
dashboardHost: "dashboard host",
|
|
453
|
+
dashboardPort: "dashboard port",
|
|
454
|
+
compatibilityView: "Compatibility view only. Saved value is derived from mergeMode.",
|
|
455
|
+
fieldAutonomyMode: "Autonomy mode",
|
|
456
|
+
fieldLoopShape: "Loop shape",
|
|
457
|
+
fieldWorkflowProfile: "Workflow profile",
|
|
458
|
+
fieldRoleProfile: "Role profile",
|
|
459
|
+
fieldLocale: "Language",
|
|
460
|
+
fieldConfigLocale: "Repository default language",
|
|
461
|
+
fieldMergeMode: "Merge mode",
|
|
462
|
+
fieldRequireReviewApproval: "Require review approval",
|
|
463
|
+
fieldNotifyMode: "Notification mode",
|
|
464
|
+
fieldReviewHandling: "Review handling",
|
|
465
|
+
fieldCarryoverTarget: "Carryover target",
|
|
466
|
+
fieldGitnexusRequired: "Require GitNexus",
|
|
467
|
+
fieldRequiredChecks: "Required checks",
|
|
468
|
+
fieldProtectedPaths: "Protected paths",
|
|
469
|
+
fieldMaxReviewFixRounds: "Max review fix rounds",
|
|
470
|
+
fieldMaxTestFixRounds: "Max test fix rounds",
|
|
471
|
+
fieldMaxCiReruns: "Max CI reruns",
|
|
472
|
+
fieldAllowAutoMerge: "Legacy auto-merge flag",
|
|
473
|
+
summaryDefault: "default",
|
|
474
|
+
summaryGuarded: "guarded",
|
|
475
|
+
summaryRelaxed: "relaxed",
|
|
476
|
+
summaryLocal: "local",
|
|
477
|
+
summaryDerived: "derived"
|
|
478
|
+
},
|
|
479
|
+
"zh-CN": {
|
|
480
|
+
actionApprove: "批准",
|
|
481
|
+
actionReject: "拒绝",
|
|
482
|
+
actionRunToGate: "运行到 Gate",
|
|
483
|
+
actionStep: "单步推进",
|
|
484
|
+
actionResume: "恢复",
|
|
485
|
+
actionStop: "停止",
|
|
486
|
+
actionRefresh: "刷新",
|
|
487
|
+
actionStartRealRun: "开始真实运行",
|
|
488
|
+
actionStopRun: "停止运行",
|
|
489
|
+
actionMarkAllRead: "全部标为已读",
|
|
490
|
+
actionMarkHandled: "标记已处理",
|
|
491
|
+
actionReevaluate: "重新评估",
|
|
492
|
+
actionRunRecovery: "执行显式恢复",
|
|
493
|
+
actionRead: "读取",
|
|
494
|
+
actionReading: "读取中",
|
|
495
|
+
actionSaveConfig: "保存配置",
|
|
496
|
+
actionRevert: "还原",
|
|
497
|
+
appLoadingTitle: "正在加载 Dashboard",
|
|
498
|
+
appLoadingMessage: "正在通过 dashboard API 读取 supervisor 状态。",
|
|
499
|
+
appUnavailableTitle: "Dashboard 不可用",
|
|
500
|
+
appNoDataTitle: "没有 loop 数据",
|
|
501
|
+
appNoDataMessage: "运行 `pnpm agent-loop init` 或启动一次 loop。",
|
|
502
|
+
appUpdated: "已更新",
|
|
503
|
+
appUnknownError: "Dashboard API 返回未知错误。",
|
|
504
|
+
loginTitle: "需要 Dashboard token",
|
|
505
|
+
loginMessage: "本地 loopback session 通常会自动解锁。只有出现此页面时,才粘贴 `agent-loop dashboard` 在 stderr 打印的 fallback token。",
|
|
506
|
+
loginTokenLabel: "Dashboard token",
|
|
507
|
+
loginTokenPlaceholder: "粘贴 dashboard token",
|
|
508
|
+
loginSubmit: "解锁 Dashboard",
|
|
509
|
+
brandTitle: "HOLO-Codex",
|
|
510
|
+
brandSubtitle: "Human On Loop Codex",
|
|
511
|
+
navAria: "Dashboard 页面",
|
|
512
|
+
interventionPanel: "干预面板",
|
|
513
|
+
interventionPanelEyebrow: "干预面板",
|
|
514
|
+
decisionNote: "决策备注",
|
|
515
|
+
gateNextState: "下一状态",
|
|
516
|
+
decisionNoteEyebrow: "决策备注",
|
|
517
|
+
decisionNotePlaceholder: "仅在 gate 需要人工干预时填写...",
|
|
518
|
+
loopControls: "Loop 控制",
|
|
519
|
+
artifactShortcut: "Artifact 快捷入口",
|
|
520
|
+
noActiveBranch: "无活跃分支",
|
|
521
|
+
noArtifactsYet: "暂无 artifacts",
|
|
522
|
+
none: "无",
|
|
523
|
+
notStarted: "未开始",
|
|
524
|
+
runId: "Run ID",
|
|
525
|
+
gateId: "Gate ID",
|
|
526
|
+
owner: "负责人",
|
|
527
|
+
reason: "原因",
|
|
528
|
+
updated: "更新时间",
|
|
529
|
+
language: "语言",
|
|
530
|
+
theme: "主题",
|
|
531
|
+
themeLight: "浅色",
|
|
532
|
+
themeDark: "深色",
|
|
533
|
+
themeSystem: "跟随系统",
|
|
534
|
+
themeEffective: "当前",
|
|
535
|
+
localeZh: "中文",
|
|
536
|
+
localeEn: "English",
|
|
537
|
+
localeSystem: "跟随系统",
|
|
538
|
+
valueAskOnAnyReview: "每次 review 都询问",
|
|
539
|
+
valueActive: "当前",
|
|
540
|
+
valueAllGates: "所有 gate",
|
|
541
|
+
valueAutonomousUntilGate: "运行到下一 gate",
|
|
542
|
+
valueAutonomousUntilTerminal: "运行到终态",
|
|
543
|
+
valueBlockersOnly: "仅阻塞项",
|
|
544
|
+
valueBlocked: "已阻塞",
|
|
545
|
+
valueClean: "干净",
|
|
546
|
+
valueCollectingEvidence: "收集证据中",
|
|
547
|
+
valueCompleted: "已完成",
|
|
548
|
+
valueConditional: "条件合并",
|
|
549
|
+
valueConfirmationRequired: "需要确认",
|
|
550
|
+
valueCommitPushPr: "提交、推送并开 PR",
|
|
551
|
+
valueCreateBranch: "创建分支中",
|
|
552
|
+
valueDisabled: "禁用",
|
|
553
|
+
valueDiscoverProgress: "发现进度中",
|
|
554
|
+
valueFixReview: "修复 review 反馈中",
|
|
555
|
+
valueFixScopedAndCarryForward: "修复范围内问题",
|
|
556
|
+
valueFresh: "新鲜",
|
|
557
|
+
valueDefaultPrLoop: "默认 PR loop",
|
|
558
|
+
valueDocsOnlyLoop: "文档 loop",
|
|
559
|
+
valueReviewFixLoop: "Review 修复 loop",
|
|
560
|
+
valueReleaseReadyLoop: "发布就绪 loop",
|
|
561
|
+
valueResearchReportLoop: "调研报告 loop",
|
|
562
|
+
valueDocumentPreparationLoop: "文档准备 loop",
|
|
563
|
+
valueRepoHygieneLoop: "仓库卫生审查 loop",
|
|
564
|
+
valueWeeklyReviewLoop: "周报复盘 loop",
|
|
565
|
+
valueDataExtractionLoop: "数据提取 loop",
|
|
566
|
+
valueDefaultPrRoles: "默认 PR 角色",
|
|
567
|
+
valuePrLoop: "PR loop",
|
|
568
|
+
valueGenericLoop: "Generic loop",
|
|
569
|
+
valueDefineGoal: "确认目标中",
|
|
570
|
+
valueCollectContext: "收集上下文中",
|
|
571
|
+
valuePlanWork: "规划工作中",
|
|
572
|
+
valueExecuteStep: "执行步骤中",
|
|
573
|
+
valueHumanGate: "人工 Gate",
|
|
574
|
+
valueHistorical: "历史",
|
|
575
|
+
valueDeliver: "交付中",
|
|
576
|
+
valueImportantOnly: "仅重要项",
|
|
577
|
+
valueImplement: "实现中",
|
|
578
|
+
valueLive: "实时",
|
|
579
|
+
valueManual: "手动",
|
|
580
|
+
valueMerge: "合并中",
|
|
581
|
+
valueMissingEvidence: "缺少证据",
|
|
582
|
+
valueNotStarted: "未开始",
|
|
583
|
+
valueOpen: "打开",
|
|
584
|
+
valuePending: "待定",
|
|
585
|
+
valueDone: "完成",
|
|
586
|
+
valueSkipped: "已跳过",
|
|
587
|
+
valueFailed: "失败",
|
|
588
|
+
valuePassed: "通过",
|
|
589
|
+
valueWarn: "警告",
|
|
590
|
+
valueCaptured: "已捕获",
|
|
591
|
+
valueNotSeen: "未捕获",
|
|
592
|
+
valueAmbiguous: "不唯一",
|
|
593
|
+
valueUnavailable: "不可用",
|
|
594
|
+
valueRunState: "运行状态",
|
|
595
|
+
valueWorkflowEvidence: "工作流证据",
|
|
596
|
+
valueGate: "Gate",
|
|
597
|
+
valueRequired: "必需",
|
|
598
|
+
valueOptional: "可选",
|
|
599
|
+
valueNotRequired: "不需要",
|
|
600
|
+
valuePosted: "已发布",
|
|
601
|
+
valueMissing: "缺失",
|
|
602
|
+
valueRequested: "已请求",
|
|
603
|
+
valueStarted: "已启动",
|
|
604
|
+
valueInProgress: "进行中",
|
|
605
|
+
valueIncomplete: "未完成",
|
|
606
|
+
valueComplete: "已完成",
|
|
607
|
+
valuePushFix: "推送修复中",
|
|
608
|
+
valueReady: "就绪",
|
|
609
|
+
valueReadyToMerge: "可合并",
|
|
610
|
+
valueRequireZeroOpenFindings: "要求零未解决问题",
|
|
611
|
+
valueResolved: "已解决",
|
|
612
|
+
valueRunning: "运行中",
|
|
613
|
+
valueSelectNextPr: "选择下一个 PR",
|
|
614
|
+
valueSelfCheck: "自检",
|
|
615
|
+
valueStale: "过期",
|
|
616
|
+
valueStopped: "已停止",
|
|
617
|
+
valueSucceeded: "已成功",
|
|
618
|
+
valueSupervised: "监督模式",
|
|
619
|
+
valueSyncMain: "同步 main",
|
|
620
|
+
valueWaitReviewOrCi: "等待 review/CI",
|
|
621
|
+
valueWriteSpec: "编写 spec 中",
|
|
622
|
+
live: "实时",
|
|
623
|
+
stale: "过期",
|
|
624
|
+
riskLow: "低风险",
|
|
625
|
+
riskMedium: "中风险",
|
|
626
|
+
riskHigh: "高风险",
|
|
627
|
+
draft: "草稿",
|
|
628
|
+
ready: "就绪",
|
|
629
|
+
pending: "待定",
|
|
630
|
+
unknown: "未知",
|
|
631
|
+
clean: "干净",
|
|
632
|
+
dirty: "有变更",
|
|
633
|
+
notLinked: "未关联",
|
|
634
|
+
truncated: "已截断",
|
|
635
|
+
topCurrentState: "当前状态",
|
|
636
|
+
topAutonomy: "自治",
|
|
637
|
+
topMerge: "合并",
|
|
638
|
+
topAttention: "关注",
|
|
639
|
+
topPolling: "轮询",
|
|
640
|
+
pageMission: "任务控制台",
|
|
641
|
+
pagePlan: "计划导航",
|
|
642
|
+
pagePolicy: "策略配置",
|
|
643
|
+
pageDryRun: "Dry-run 预览",
|
|
644
|
+
pageNotifications: "通知",
|
|
645
|
+
pageTimeline: "观测控制台",
|
|
646
|
+
pageGates: "Gate 中心",
|
|
647
|
+
pagePr: "PR 收件箱",
|
|
648
|
+
pageWorkers: "Worker 运行",
|
|
649
|
+
pageScope: "Scope Guard",
|
|
650
|
+
pageEvents: "事件账本",
|
|
651
|
+
pageArtifacts: "Artifact 查看器",
|
|
652
|
+
pageRecovery: "恢复中心",
|
|
653
|
+
subtitleMission: "自治姿态、下一步、关注项和合并就绪度。",
|
|
654
|
+
subtitlePlan: "当前 milestone、选中的下一 PR 和折叠后的证据。",
|
|
655
|
+
subtitlePolicy: "编辑 loop 边界和合并策略,保存前先看 diff。",
|
|
656
|
+
subtitleDryRun: "真实运行前预览 Agent 会做什么。",
|
|
657
|
+
subtitleNotifications: "按严重度分组的关注流,减少噪音。",
|
|
658
|
+
subtitleTimeline: "统一本地展示 timeline、live worker、hook、gate、decision 与 artifact trail。",
|
|
659
|
+
subtitleGates: "打开的 gates 和人工决策。",
|
|
660
|
+
subtitlePr: "Review 评论和 CI 检查。",
|
|
661
|
+
subtitleWorkers: "Worker 结果、artifacts 和失败信息。",
|
|
662
|
+
subtitleScope: "Scope 与 GitNexus 证据。",
|
|
663
|
+
subtitleEvents: "只追加的 loop 事件流。",
|
|
664
|
+
subtitleArtifacts: "已登记 artifacts 和 diff 输出。",
|
|
665
|
+
subtitleRecovery: "显式恢复操作和真实状态警告。",
|
|
666
|
+
metricNextAction: "下一步",
|
|
667
|
+
metricPrSelection: "PR 选择",
|
|
668
|
+
metricWorkflow: "工作流",
|
|
669
|
+
metricAutonomyBoundary: "自治边界",
|
|
670
|
+
metricMergeReadiness: "合并就绪度",
|
|
671
|
+
deliverableReadiness: "交付就绪度",
|
|
672
|
+
metricAttention: "关注",
|
|
673
|
+
metricItems: "{count} 项",
|
|
674
|
+
ellipsis: "...",
|
|
675
|
+
rawOriginalMessage: "原始消息",
|
|
676
|
+
workerRunsRepoScope: "Worker 运行(仓库范围)",
|
|
677
|
+
workerScopeSummary: "当前 run {current} / 仓库总数 {total} / 历史 {historical} / 过期 {stale}",
|
|
678
|
+
workerScopePreview: "当前只显示仓库范围 worker 的前 {shown}/{total} 项;当前 run、历史和过期 worker 会分别标注。",
|
|
679
|
+
gateScopeSummary: "只有当前活跃 gate 会驱动人工操作。当前 {active} / 历史 {historical} / 仓库总数 {total}。",
|
|
680
|
+
autonomyPosture: "自治姿态",
|
|
681
|
+
autonomyFallback: "Agent 运行到 gate;用户观察,并在需要时干预。",
|
|
682
|
+
policyDetails: "策略详情",
|
|
683
|
+
workflowProfile: "工作流 profile",
|
|
684
|
+
workflowStages: "工作流阶段",
|
|
685
|
+
stagesChip: "{count} 个阶段",
|
|
686
|
+
workflowUnavailable: "工作流 profile 不可用",
|
|
687
|
+
workflowUnavailableMessage: "Controller 未返回 profile 摘要。",
|
|
688
|
+
currentRole: "当前角色",
|
|
689
|
+
noRoles: "没有角色映射。",
|
|
690
|
+
noWorkflowStages: "没有工作流阶段预测。",
|
|
691
|
+
genericForecastReady: "Generic workflow 预测已就绪。",
|
|
692
|
+
genericLoop: "Generic loop",
|
|
693
|
+
genericLoopNoPrSelection: "Generic loop 使用 workflow profile 状态,不使用 PR 选择。",
|
|
694
|
+
yes: "是",
|
|
695
|
+
no: "否",
|
|
696
|
+
notifyRules: "{count} 条通知规则",
|
|
697
|
+
mergeEvidence: "合并证据",
|
|
698
|
+
allEvidenceReady: "证据已满足",
|
|
699
|
+
missingCount: "缺 {count} 项",
|
|
700
|
+
noPlanData: "没有计划数据",
|
|
701
|
+
noPlanDataMessage: "计划解析器未返回 dashboard 模型。",
|
|
702
|
+
selectedNextPr: "选中的下一 PR",
|
|
703
|
+
currentPr: "当前 PR",
|
|
704
|
+
nextPr: "下一 PR",
|
|
705
|
+
noUniqueNextPr: "没有唯一下一 PR",
|
|
706
|
+
noNextPrMessage: "解析器无法识别下一 PR。",
|
|
707
|
+
selected: "已选择",
|
|
708
|
+
current: "当前",
|
|
709
|
+
ambiguous: "有歧义",
|
|
710
|
+
completedPrs: "已完成 PR",
|
|
711
|
+
candidatePrs: "候选 PR",
|
|
712
|
+
rawEvidence: "原始证据",
|
|
713
|
+
completedChip: "{count} 已完成",
|
|
714
|
+
candidatesChip: "{count} 候选",
|
|
715
|
+
sourcesChip: "{count} 来源",
|
|
716
|
+
policyConfigUnavailable: "策略配置不可用",
|
|
717
|
+
policyConfigLoadError: "无法加载策略配置。",
|
|
718
|
+
loadingConfig: "正在加载配置",
|
|
719
|
+
loadingConfigMessage: "正在读取 dashboard 策略配置。",
|
|
720
|
+
dryRunUnavailable: "Dry-run 不可用",
|
|
721
|
+
dryRunLoadError: "无法加载 dry-run 预览。",
|
|
722
|
+
loadingPreview: "正在加载预览",
|
|
723
|
+
loadingPreviewMessage: "正在预测下一次自治运行。",
|
|
724
|
+
forecastSummary: "预测摘要",
|
|
725
|
+
mergeReady: "证据通过后可条件合并。",
|
|
726
|
+
mergeMissing: "条件合并前缺少证据。",
|
|
727
|
+
commandsPlanned: "计划命令",
|
|
728
|
+
commandsChip: "{count} 条命令",
|
|
729
|
+
possibleGates: "可能的 gates",
|
|
730
|
+
gatesChip: "{count} 个 gate",
|
|
731
|
+
missingConditions: "缺失条件",
|
|
732
|
+
filesLikelyTouched: "可能触达文件",
|
|
733
|
+
pathsChip: "{count} 条路径",
|
|
734
|
+
needsAttention: "需要关注",
|
|
735
|
+
notificationsCount: "{count} 条通知",
|
|
736
|
+
quietProgress: "普通进展保持安静,除非策略要求更多提醒。",
|
|
737
|
+
timelineLatest: "最近行动",
|
|
738
|
+
timelineLastFailure: "最近失败点",
|
|
739
|
+
timelineActiveWorker: "活跃 worker",
|
|
740
|
+
timelineObservationGap: "观察缺口",
|
|
741
|
+
timelineGap: "发现缺口",
|
|
742
|
+
timelineNoGap: "无缺口",
|
|
743
|
+
timelineUnavailable: "时间线不可用",
|
|
744
|
+
timelineLoadError: "无法加载时间线。",
|
|
745
|
+
timelineEmpty: "没有时间线记录",
|
|
746
|
+
timelineEmptyMessage: "没有符合当前筛选的时间线记录。",
|
|
747
|
+
timelineSource: "来源",
|
|
748
|
+
timelineThread: "Thread",
|
|
749
|
+
observabilityConsole: "观测控制台",
|
|
750
|
+
observabilityTitle: "本地全周期行动记录",
|
|
751
|
+
observabilityMessage: "用同一条 Agent 时间线筛选 worker、hook、gate、decision 或 artifact trail。",
|
|
752
|
+
timelinePresets: "时间线预设",
|
|
753
|
+
timelinePresetAll: "Timeline",
|
|
754
|
+
timelinePresetLive: "Live Worker",
|
|
755
|
+
timelinePresetHooks: "Hook Feed",
|
|
756
|
+
timelinePresetGates: "Gate / Decision",
|
|
757
|
+
timelinePresetArtifacts: "Artifact Trail",
|
|
758
|
+
workerEvents: "Worker 事件",
|
|
759
|
+
actionLoadMore: "加载更多",
|
|
760
|
+
severityBlocked: "已阻塞",
|
|
761
|
+
severityConfirmationRequired: "需要确认",
|
|
762
|
+
severityAttention: "需关注",
|
|
763
|
+
severityInformational: "信息",
|
|
764
|
+
tablePr: "PR",
|
|
765
|
+
tableGate: "Gate",
|
|
766
|
+
tableActivity: "活动状态",
|
|
767
|
+
tableStatus: "状态",
|
|
768
|
+
tableMessage: "消息",
|
|
769
|
+
tableRawMessage: "原始消息",
|
|
770
|
+
tableOpened: "打开时间",
|
|
771
|
+
tablePullRequest: "Pull request",
|
|
772
|
+
tableDraft: "Draft",
|
|
773
|
+
tableBranch: "分支",
|
|
774
|
+
tableComment: "评论",
|
|
775
|
+
tableAuthor: "作者",
|
|
776
|
+
tablePath: "路径",
|
|
777
|
+
tableCheck: "检查",
|
|
778
|
+
tableConclusion: "结论",
|
|
779
|
+
tableObserved: "观察时间",
|
|
780
|
+
tableWorker: "Worker",
|
|
781
|
+
tableRole: "角色",
|
|
782
|
+
tableSandbox: "Sandbox",
|
|
783
|
+
tableStarted: "开始时间",
|
|
784
|
+
tableResultError: "结果 / 错误",
|
|
785
|
+
tableRawResultError: "原始结果 / 错误",
|
|
786
|
+
tableSeq: "Seq",
|
|
787
|
+
tableEvent: "事件",
|
|
788
|
+
tableState: "状态",
|
|
789
|
+
tableTime: "时间",
|
|
790
|
+
tableDetails: "详情",
|
|
791
|
+
tableArtifact: "Artifact",
|
|
792
|
+
tableKind: "类型",
|
|
793
|
+
tableCreated: "创建时间",
|
|
794
|
+
tableAction: "操作",
|
|
795
|
+
reviewComments: "Review 评论",
|
|
796
|
+
commentsChip: "{count} 条评论",
|
|
797
|
+
ciChecks: "CI 检查",
|
|
798
|
+
checksChip: "{count} 个检查",
|
|
799
|
+
noGates: "没有 gate 记录。",
|
|
800
|
+
noReviewComments: "没有已存 review 评论。",
|
|
801
|
+
noCiChecks: "没有已存 CI 检查。",
|
|
802
|
+
noWorkerRuns: "暂无 worker 运行。",
|
|
803
|
+
noScopeEvidence: "暂无 scope guard 证据。",
|
|
804
|
+
noEvents: "事件账本为空。",
|
|
805
|
+
noArtifacts: "暂无已存 artifacts。",
|
|
806
|
+
artifactPreviewAria: "Artifact 预览",
|
|
807
|
+
noArtifactSelected: "未选择 artifact",
|
|
808
|
+
artifactSelectMessage: "选择一个 artifact 查看已登记内容。",
|
|
809
|
+
artifactReadError: "无法读取 artifact。",
|
|
810
|
+
artifactLarge: "[artifact 过大,无法内联完整预览;内容已截断]",
|
|
811
|
+
artifactDecodeError: "[artifact 内容无法解码]",
|
|
812
|
+
storageRun: "Storage run",
|
|
813
|
+
gitBranch: "Git 分支",
|
|
814
|
+
worktree: "Worktree",
|
|
815
|
+
freshness: "新鲜度",
|
|
816
|
+
staleData: "过期数据",
|
|
817
|
+
fresh: "新鲜",
|
|
818
|
+
recoveryWarnings: "恢复警告",
|
|
819
|
+
recoveryWhyStopped: "为什么这里可见",
|
|
820
|
+
recoveryExplanationActive: "当前 active gate 是 {gate};可能需要操作员处理。",
|
|
821
|
+
recoveryExplanationHistorical: "这里只剩历史 gate;它们属于非活跃或已被新 run 覆盖的 run。",
|
|
822
|
+
recoveryExplanationStopped: "run 已停止;确认应继续后再 resume。",
|
|
823
|
+
recoveryExplanationClear: "当前没有可见的恢复条件。",
|
|
824
|
+
reevaluateResultTitle: "重新评估结果",
|
|
825
|
+
reevaluateUnknownError: "重新评估失败。",
|
|
826
|
+
"reevaluateResult.still_historical": "仍是历史 gate;当前没有匹配的 active gate。",
|
|
827
|
+
"reevaluateResult.overridden_by_current_reality": "已被当前状态覆盖;更新的 run 已经取代这个 gate。",
|
|
828
|
+
"reevaluateResult.active_again": "再次变为 active;这个 gate 当前属于阻塞状态。",
|
|
829
|
+
"reevaluateResult.manually_handled": "已人工处理;操作员已经把这个历史 gate 标记为已处理。",
|
|
830
|
+
historicalGates: "历史 gates",
|
|
831
|
+
staleWorkerFailures: "陈旧 worker 失败",
|
|
832
|
+
activityActive: "当前",
|
|
833
|
+
activityHistorical: "历史",
|
|
834
|
+
activityStaleWorker: "陈旧 worker",
|
|
835
|
+
activityOverridden: "已被覆盖",
|
|
836
|
+
activityMarkedHandled: "已标记处理",
|
|
837
|
+
"activityReason.current_run": "当前 run",
|
|
838
|
+
"activityReason.repo_gate": "仓库级 gate",
|
|
839
|
+
"activityReason.historical_run": "历史 run",
|
|
840
|
+
"activityReason.repo_gate_not_current": "非当前仓库 gate",
|
|
841
|
+
"activityReason.stale_worker_failure": "陈旧 worker 失败",
|
|
842
|
+
"activityReason.overridden_by_reality": "已被 reality check 覆盖",
|
|
843
|
+
"activityReason.handled_gate": "已处理 gate",
|
|
844
|
+
"activityReason.marked_handled": "已标记处理",
|
|
845
|
+
warningsChip: "{count} 条警告",
|
|
846
|
+
noPrs: "没有 PR",
|
|
847
|
+
noPrsMessage: "此分组中没有可解析 PR 条目。",
|
|
848
|
+
noPrsEmpty: "没有 PR。",
|
|
849
|
+
noCommandsPlanned: "没有计划命令。",
|
|
850
|
+
title: "标题",
|
|
851
|
+
issues: "Issues",
|
|
852
|
+
noNotifications: "没有通知",
|
|
853
|
+
noNotificationsMessage: "此严重度暂无内容。",
|
|
854
|
+
noneList: "无。",
|
|
855
|
+
noInterventionTitle: "无需干预",
|
|
856
|
+
noInterventionReason: "Agent 可在已配置 loop 策略下继续推进。",
|
|
857
|
+
visibleGateReason: "当前状态中有可见 gate。",
|
|
858
|
+
actionClose: "关闭",
|
|
859
|
+
workflowBoardTitle: "PR 交付工作流",
|
|
860
|
+
workflowBoardSubtitle: "单一 PR delivery loop 的阶段观察看板。",
|
|
861
|
+
workflowBoardLoadError: "工作流看板加载失败。",
|
|
862
|
+
workflowNoRun: "没有 PR 交付 run",
|
|
863
|
+
workflowStage: "阶段",
|
|
864
|
+
workflowStageSource: "阶段来源",
|
|
865
|
+
workflowRunState: "运行状态",
|
|
866
|
+
workflowHookCapture: "Hook 捕获",
|
|
867
|
+
workflowStageEvidence: "阶段证据",
|
|
868
|
+
workflowRail: "工作流阶段栏",
|
|
869
|
+
workflowEvidenceShort: "证据",
|
|
870
|
+
workflowInspectorOpen: "展开详情栏",
|
|
871
|
+
workflowInspectorCollapse: "折叠详情栏",
|
|
872
|
+
workflowCurrentStage: "当前阶段",
|
|
873
|
+
workflowNextAction: "下一步",
|
|
874
|
+
workflowAttachEvidence: "附加证据",
|
|
875
|
+
workflowEvidencePlaceholder: "简短证据摘要,不要写密钥或原始日志...",
|
|
876
|
+
workflowEvidenceAppended: "证据已附加。",
|
|
877
|
+
workflowEvidenceAppendFailed: "证据附加失败。",
|
|
878
|
+
workflowEvidence: "证据",
|
|
879
|
+
workflowEvidenceTarget: "目标",
|
|
880
|
+
workflowNoEvidence: "这个阶段暂无证据。",
|
|
881
|
+
workflowVerifyMatrix: "验证矩阵",
|
|
882
|
+
workflowReviewMatrix: "Review 报告矩阵",
|
|
883
|
+
workflowReviewer: "审查方",
|
|
884
|
+
workflowSeverityModel: "严重度 / 模型",
|
|
885
|
+
workflowPrCommentNextAction: "PR 评论 / 下一步",
|
|
886
|
+
workflowRequirement: "要求",
|
|
887
|
+
workflowProgress: "进度",
|
|
888
|
+
workflowResult: "结果",
|
|
889
|
+
workflowMergeChecklist: "合并就绪清单",
|
|
890
|
+
workflowCleanupChecklist: "清理清单",
|
|
891
|
+
workflowPrChecklist: "PR 发布清单",
|
|
892
|
+
workflowPrOpened: "PR 已打开",
|
|
893
|
+
workflowGithubPrNote: "这里用于观察 PR 交付;review 和 merge 操作在 GitHub 完成。",
|
|
894
|
+
workflowGithubMergeNote: "确认就绪后,打开 PR 并在 GitHub 完成最终合并。",
|
|
895
|
+
workflowOpenGithubPr: "打开 GitHub PR",
|
|
896
|
+
workflowStageSummary: "阶段摘要",
|
|
897
|
+
configGroupWorkflow: "工作流",
|
|
898
|
+
configGroupAutonomy: "自治",
|
|
899
|
+
configGroupLanguage: "语言",
|
|
900
|
+
configGroupMerge: "合并",
|
|
901
|
+
configGroupNotifications: "通知",
|
|
902
|
+
configGroupReview: "Review 处理",
|
|
903
|
+
configGroupSafety: "安全边界",
|
|
904
|
+
configGroupDashboard: "Dashboard",
|
|
905
|
+
configGroupAdvanced: "高级兼容",
|
|
906
|
+
configSaved: "配置已保存",
|
|
907
|
+
configSaveFailed: "配置保存失败",
|
|
908
|
+
configDiffTitle: "保存前 Diff",
|
|
909
|
+
configNoChanges: "暂无变更。",
|
|
910
|
+
configChangedFields: "{count} 个字段已变更。",
|
|
911
|
+
configChangeControl: "修改一个控件来预览 diff。",
|
|
912
|
+
configDangerous: "危险策略变更:保存前输入 CONFIRM。",
|
|
913
|
+
operatorNote: "操作备注",
|
|
914
|
+
policyChangeNote: "策略变更备注",
|
|
915
|
+
operatorNotePlaceholder: "高风险策略变更必填...",
|
|
916
|
+
confirmationToken: "确认令牌",
|
|
917
|
+
confirmationTokenPlaceholder: "危险变更需输入确认令牌",
|
|
918
|
+
dashboardHost: "dashboard host",
|
|
919
|
+
dashboardPort: "dashboard port",
|
|
920
|
+
compatibilityView: "兼容视图。保存值由 mergeMode 派生。",
|
|
921
|
+
fieldAutonomyMode: "自治模式",
|
|
922
|
+
fieldLoopShape: "Loop shape",
|
|
923
|
+
fieldWorkflowProfile: "工作流 profile",
|
|
924
|
+
fieldRoleProfile: "角色 profile",
|
|
925
|
+
fieldLocale: "语言",
|
|
926
|
+
fieldConfigLocale: "仓库默认语言",
|
|
927
|
+
fieldMergeMode: "合并模式",
|
|
928
|
+
fieldRequireReviewApproval: "需要 review 批准",
|
|
929
|
+
fieldNotifyMode: "通知模式",
|
|
930
|
+
fieldReviewHandling: "Review 处理",
|
|
931
|
+
fieldCarryoverTarget: "Carryover 目标",
|
|
932
|
+
fieldGitnexusRequired: "要求 GitNexus",
|
|
933
|
+
fieldRequiredChecks: "必需检查",
|
|
934
|
+
fieldProtectedPaths: "保护路径",
|
|
935
|
+
fieldMaxReviewFixRounds: "最大 review 修复轮数",
|
|
936
|
+
fieldMaxTestFixRounds: "最大测试修复轮数",
|
|
937
|
+
fieldMaxCiReruns: "最大 CI 重跑次数",
|
|
938
|
+
fieldAllowAutoMerge: "旧版自动合并标记",
|
|
939
|
+
summaryDefault: "默认",
|
|
940
|
+
summaryGuarded: "受保护",
|
|
941
|
+
summaryRelaxed: "放宽",
|
|
942
|
+
summaryLocal: "本地",
|
|
943
|
+
summaryDerived: "派生"
|
|
944
|
+
}
|
|
945
|
+
};
|
|
946
|
+
|
|
947
|
+
/** Pick dashboard display copy. */
|
|
948
|
+
export function t(locale: EffectiveLocale, key: string, values: Record<string, string | number> = {}): string {
|
|
949
|
+
const template = TEXT[locale][key] ?? TEXT["en-US"][key] ?? key;
|
|
950
|
+
return Object.entries(values).reduce(
|
|
951
|
+
(copy, [name, value]) => copy.replaceAll(`{${name}}`, String(value)),
|
|
952
|
+
template
|
|
953
|
+
);
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
/** Read persisted dashboard locale setting from browser storage. */
|
|
957
|
+
export function readStoredLocaleSetting(): LocaleSetting | undefined {
|
|
958
|
+
if (typeof window === "undefined") {
|
|
959
|
+
return undefined;
|
|
960
|
+
}
|
|
961
|
+
const storage = window.localStorage;
|
|
962
|
+
if (typeof storage?.getItem !== "function") {
|
|
963
|
+
return undefined;
|
|
964
|
+
}
|
|
965
|
+
return normalizeLocaleSetting(storage.getItem(DASHBOARD_LOCALE_STORAGE_KEY));
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
/** Persist dashboard locale setting in browser storage. */
|
|
969
|
+
export function writeStoredLocaleSetting(locale: LocaleSetting): void {
|
|
970
|
+
if (typeof window !== "undefined" && typeof window.localStorage?.setItem === "function") {
|
|
971
|
+
window.localStorage.setItem(DASHBOARD_LOCALE_STORAGE_KEY, locale);
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
/** Resolve local, repo, and browser preferences into concrete dashboard locale. */
|
|
976
|
+
export function resolveDashboardLocale(
|
|
977
|
+
localSetting: LocaleSetting | undefined,
|
|
978
|
+
repoSetting: LocaleSetting | undefined,
|
|
979
|
+
browserLocales = browserLocaleCandidates()
|
|
980
|
+
): EffectiveLocale {
|
|
981
|
+
const setting = localSetting === "system" ? repoSetting ?? "system" : localSetting ?? repoSetting ?? "system";
|
|
982
|
+
return resolveEffectiveLocale(setting, browserLocales);
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
/** Return browser language candidates in preference order. */
|
|
986
|
+
export function browserLocaleCandidates(): string[] {
|
|
987
|
+
if (typeof navigator === "undefined") {
|
|
988
|
+
return [];
|
|
989
|
+
}
|
|
990
|
+
return [...(navigator.languages ?? []), navigator.language].filter(
|
|
991
|
+
(value): value is string => typeof value === "string" && value.length > 0
|
|
992
|
+
);
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
/** Human label for a locale selector option. */
|
|
996
|
+
export function localeOptionLabel(locale: EffectiveLocale, option: LocaleSetting): string {
|
|
997
|
+
if (option === "zh-CN") return t(locale, "localeZh");
|
|
998
|
+
if (option === "en-US") return t(locale, "localeEn");
|
|
999
|
+
return t(locale, "localeSystem");
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
/** Human label for a theme selector option. */
|
|
1003
|
+
export function themeOptionLabel(locale: EffectiveLocale, option: ThemeSetting): string {
|
|
1004
|
+
if (option === "light") return t(locale, "themeLight");
|
|
1005
|
+
if (option === "dark") return t(locale, "themeDark");
|
|
1006
|
+
return t(locale, "themeSystem");
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
/** Human-readable label for known dashboard enum-like values. */
|
|
1010
|
+
export function displayValueLabel(locale: EffectiveLocale, value: string): string {
|
|
1011
|
+
const keys: Record<string, string> = {
|
|
1012
|
+
active: "valueActive",
|
|
1013
|
+
all_gates: "valueAllGates",
|
|
1014
|
+
ask_on_any_review: "valueAskOnAnyReview",
|
|
1015
|
+
autonomous_until_gate: "valueAutonomousUntilGate",
|
|
1016
|
+
autonomous_until_terminal: "valueAutonomousUntilTerminal",
|
|
1017
|
+
blocked: "valueBlocked",
|
|
1018
|
+
BLOCKED: "valueBlocked",
|
|
1019
|
+
blockers_only: "valueBlockersOnly",
|
|
1020
|
+
clean: "valueClean",
|
|
1021
|
+
collecting_evidence: "valueCollectingEvidence",
|
|
1022
|
+
COLLECT_CONTEXT: "valueCollectContext",
|
|
1023
|
+
COMMIT_PUSH_PR: "valueCommitPushPr",
|
|
1024
|
+
completed: "valueCompleted",
|
|
1025
|
+
conditional: "valueConditional",
|
|
1026
|
+
confirmation_required: "valueConfirmationRequired",
|
|
1027
|
+
CREATE_BRANCH: "valueCreateBranch",
|
|
1028
|
+
disabled: "valueDisabled",
|
|
1029
|
+
DISCOVER_PROGRESS: "valueDiscoverProgress",
|
|
1030
|
+
default_pr_loop: "valueDefaultPrLoop",
|
|
1031
|
+
data_extraction_loop: "valueDataExtractionLoop",
|
|
1032
|
+
default_pr_roles: "valueDefaultPrRoles",
|
|
1033
|
+
DEFINE_GOAL: "valueDefineGoal",
|
|
1034
|
+
DELIVER: "valueDeliver",
|
|
1035
|
+
document_preparation_loop: "valueDocumentPreparationLoop",
|
|
1036
|
+
docs_only_loop: "valueDocsOnlyLoop",
|
|
1037
|
+
EXECUTE_STEP: "valueExecuteStep",
|
|
1038
|
+
FIX_REVIEW: "valueFixReview",
|
|
1039
|
+
fix_scoped_and_carry_forward: "valueFixScopedAndCarryForward",
|
|
1040
|
+
fresh: "valueFresh",
|
|
1041
|
+
historical: "valueHistorical",
|
|
1042
|
+
captured: "valueCaptured",
|
|
1043
|
+
not_seen: "valueNotSeen",
|
|
1044
|
+
ambiguous: "valueAmbiguous",
|
|
1045
|
+
unavailable: "valueUnavailable",
|
|
1046
|
+
run_state: "valueRunState",
|
|
1047
|
+
workflow_evidence: "valueWorkflowEvidence",
|
|
1048
|
+
gate: "valueGate",
|
|
1049
|
+
IMPLEMENT: "valueImplement",
|
|
1050
|
+
important_only: "valueImportantOnly",
|
|
1051
|
+
live: "valueLive",
|
|
1052
|
+
manual: "valueManual",
|
|
1053
|
+
MERGE: "valueMerge",
|
|
1054
|
+
missing_evidence: "valueMissingEvidence",
|
|
1055
|
+
not_started: "valueNotStarted",
|
|
1056
|
+
unknown: "unknown",
|
|
1057
|
+
open: "valueOpen",
|
|
1058
|
+
pending: "valuePending",
|
|
1059
|
+
done: "valueDone",
|
|
1060
|
+
skipped: "valueSkipped",
|
|
1061
|
+
failed: "valueFailed",
|
|
1062
|
+
passed: "valuePassed",
|
|
1063
|
+
pass: "valuePassed",
|
|
1064
|
+
block: "valueBlocked",
|
|
1065
|
+
warn: "valueWarn",
|
|
1066
|
+
required: "valueRequired",
|
|
1067
|
+
optional: "valueOptional",
|
|
1068
|
+
not_required: "valueNotRequired",
|
|
1069
|
+
posted: "valuePosted",
|
|
1070
|
+
missing: "valueMissing",
|
|
1071
|
+
requested: "valueRequested",
|
|
1072
|
+
started: "valueStarted",
|
|
1073
|
+
in_progress: "valueInProgress",
|
|
1074
|
+
incomplete: "valueIncomplete",
|
|
1075
|
+
complete: "valueComplete",
|
|
1076
|
+
PLAN_WORK: "valuePlanWork",
|
|
1077
|
+
PUSH_FIX: "valuePushFix",
|
|
1078
|
+
"pr-loop": "valuePrLoop",
|
|
1079
|
+
"generic-loop": "valueGenericLoop",
|
|
1080
|
+
generic_human_gate: "valueHumanGate",
|
|
1081
|
+
ready: "valueReady",
|
|
1082
|
+
READY_TO_MERGE: "valueReadyToMerge",
|
|
1083
|
+
release_ready_loop: "valueReleaseReadyLoop",
|
|
1084
|
+
repo_hygiene_loop: "valueRepoHygieneLoop",
|
|
1085
|
+
research_report_loop: "valueResearchReportLoop",
|
|
1086
|
+
require_zero_open_findings: "valueRequireZeroOpenFindings",
|
|
1087
|
+
resolved: "valueResolved",
|
|
1088
|
+
review_fix_loop: "valueReviewFixLoop",
|
|
1089
|
+
running: "valueRunning",
|
|
1090
|
+
RUNNING: "valueRunning",
|
|
1091
|
+
SELECT_NEXT_PR: "valueSelectNextPr",
|
|
1092
|
+
SELF_CHECK: "valueSelfCheck",
|
|
1093
|
+
HUMAN_GATE: "valueHumanGate",
|
|
1094
|
+
stale: "valueStale",
|
|
1095
|
+
STOPPED: "valueStopped",
|
|
1096
|
+
succeeded: "valueSucceeded",
|
|
1097
|
+
supervised: "valueSupervised",
|
|
1098
|
+
SYNC_MAIN: "valueSyncMain",
|
|
1099
|
+
WAIT_REVIEW_OR_CI: "valueWaitReviewOrCi",
|
|
1100
|
+
weekly_review_loop: "valueWeeklyReviewLoop",
|
|
1101
|
+
WRITE_SPEC: "valueWriteSpec"
|
|
1102
|
+
};
|
|
1103
|
+
const key = keys[value];
|
|
1104
|
+
return key ? t(locale, key) : value;
|
|
1105
|
+
}
|