Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

feat(console): second-pass i18n for Audit Log, Flow Runs, Agent Connect and share links - #13503

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-o71t1g
Oct 25, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-o71t1g

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of objectstack-ai/objectstack#25916

Clause-②: no
Metadata-protocol: none

Claim: comment 6393192822 (Seat: domain:ui#4).

What changed

Second pass of objectstack-ai/objectstack#25916, following the conventions of #13489: useObjectTranslation() with t(key, { defaultValue }) where the inline default is the en value byte for byte, and withSlots for a sentence with an inline element. No new lint gate.

  • System → Audit Log (AuditLogPage.tsx) reads console.system.auditLog.*: the header, the presets row (a refused preset's reason is now a code, worded at render), the filters, the empty and error states, the table heads, the pagination and the detail drawer. formatDate is untouched (plugin-list, plugin-map, plugin-timeline: the record preview overlay is a raw Object.entries dump in four views while five views render RecordDetailPanel — plus four byte-identical helpers to collapse #13458 is waiting on a ruling).
  • Developer → Flow Runs (FlowRunsPage.tsx) reads console.developer.flowRuns.*. "Click Run Flow" and "the Test Run panel" name those controls by their translated labels, and "Paused at screen" puts the node name in a slot.
  • Integrations → Connect an AI agent (AgentConnectSection.tsx) reads console.developer.agentConnect.*. The disabled notice and the steps keep their inline code inside one translated sentence. Copy, Done and Download reuse existing keys.
  • ShareDialog (packages/components) reads shareDialog.*. The expiry and audience choices are literal t() calls built per render, so the dead-key and call-site gates read them. A failure keeps the server's message, or names the step that failed in the viewer's language.
  • Public share landing /s/:token (SharedRecordPage.tsx) reads sharedRecord.*. Failures are kept as codes and worded at render.
  • All ten packs carry the 135 new keys (25 + 24 + 36 + 30 + 20).
  • Dev-only surfaces moved under dev/. apps/console/src/components/PerformanceDashboard.tsx (no importers) moved to apps/console/src/dev/. packages/components/src/debug/ moved to packages/components/src/dev/. The package index re-exports ./dev, so its exports are unchanged.

Tests

  • New: apps/console/src/pages/consolePagesLocale-secondPass-13460.test.tsx renders the four console surfaces under zh through a real I18nProvider, reads its expectations from the pack, and checks that no {{slot}} or slot mark leaks. Each surface also has a provider-less English control.
  • New: packages/components/src/__tests__/share-dialog-locale-13460.test.tsx covers the ShareDialog chrome under zh, the recordLabel hole, and an English control.
  • Updated: AgentConnectSection.keyNameConfirm-13383.test.tsx queries the new echoed keys. displayLocale-9909.test.tsx and ariaLabelLiteralCensus-12145.test.ts follow the debug/ to dev/ move.

Verification

  • 32 affected test files under the verify lock: 32 passed, 223 tests passed (VERDICT 0).
  • vitest run packages/i18n/: 87 files, 1353 tests passed, 13 skipped.
  • turbo run type-check for console, components and i18n: 38 of 38 tasks passed.
  • check-i18n-call-site-keys, check-i18n-en-drift, check-i18n-designer-table-parity: pass. check-i18n-dead-keys lists none of the new keys.
  • check-changeset-presence, check-changeset-no-major, check-changeset-claims, check-pending-changeset-literals, check:new-line-citations: pass.
  • eslint on the touched files: 0 errors (warnings only).
  • NOT MEASURED: the full repo test suite, a browser run of the pages, and translation quality beyond the pack tests.

Acceptance notes: what is left for objectstack-ai/objectstack#25916

These are not in this PR:

  • data-table row titles ('Open record', 'Cancel changes', 'Save row')
  • ObjectView 'Loading chart…'
  • react-page messages
  • ResourceEditPage 'From type' / 'From name' / 'Path'
  • ConnectAgentWidget product names
  • the StudioDesignSurface placeholder
  • the console *-preview.tsx dev entries (not moved), and the copy inside apps/console/src/dev/*
  • Flow Runs client-capability diagnostics ('meta.getItems is not available on this client' and similar)
  • the ShareDialog audience and permission badges, which show raw enum values (enum labels belong to Datasource form's enum selects show raw option values (autoMigrate offers "off" / "safe") #13353)
  • the 'Agent key' name prefill

The brand lines "Powered by ObjectStack" and "Read-only · Shared via ObjectStack" on the share landing are left literal on purpose. metadata-admin/datasource/** (#13353) and the three formatDate helpers (#13458) are excluded as the claim asks.

Deviation: commit 58af2ad ends with a harness-supplied Co-Authored-By trailer that names the model, not the model-free pair from AGENTS.md. History is not rewritten, because force-push is forbidden here. Please drop that line from the squash message when landing.

  • Adds no product-specific widget, dialog, hook or string (see AGENTS.md › Product-neutral renderer)

🤖 Generated with Claude Code

https://claude.ai/code/session_018yk9f7S7q4BrEeWZGRcTKF

Audit Log, Flow Runs, the Integrations page's agent card, the share-link
dialog and the shared-record landing, translated in all ten packs.

Claude-Session: https://claude.ai/code/session_018yk9f7S7q4BrEeWZGRcTKF
Co-authored-by: Claude <noreply@anthropic.com>
…ct and share links

Part of objectui#13460. System -> Audit Log, Developer -> Flow Runs, the
"Connect an AI agent" card, ShareDialog and the /s/:token share landing now
read console.system.auditLog.*, console.developer.flowRuns.*,
console.developer.agentConnect.*, shareDialog.* and sharedRecord.* with
en inline defaults. Error states are kept as codes and worded at render.

The dev-only PerformanceDashboard moves to apps/console/src/dev/ and the
components package's debug/ folder moves to dev/; exports are unchanged.

Clause-②: no
Metadata-protocol: none

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yk9f7S7q4BrEeWZGRcTKF
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 85 chunks) 3041.0 KB 3496.0 KB
Main entry chunk (gzip) 80.8 KB 350 KB
Entry file index-CgHrrM6c.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.41KB 7.90KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 8.84KB 3.61KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 616.98KB 150.93KB
core (index.js) 10.51KB 4.16KB
create-plugin (index.js) 27.92KB 9.50KB
data-objectstack (index.js) 257.46KB 72.08KB
fields (index.js) 296.40KB 75.98KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.17KB 11.96KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (ServerReadScope.js) 4.03KB 1.82KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.99KB 0.43KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.91KB
plugin-calendar (index.js) 55.31KB 16.16KB
plugin-charts (index.js) 88.30KB 24.33KB
plugin-chatbot (core.js) 5.22KB 2.18KB
plugin-chatbot (index.js) 238.05KB 56.30KB
plugin-dashboard (index.js) 147.15KB 39.95KB
plugin-designer (index.js) 232.83KB 50.01KB
plugin-detail (index.js) 268.92KB 71.56KB
plugin-editor (index.js) 2.21KB 1.04KB
plugin-form (index.js) 185.46KB 48.48KB
plugin-gantt (index.js) 178.95KB 45.22KB
plugin-grid (index.js) 277.83KB 77.44KB
plugin-kanban (index.js) 64.27KB 19.81KB
plugin-list (index.js) 149.51KB 39.15KB
plugin-map (index.js) 27.54KB 9.10KB
plugin-markdown (index.js) 13.79KB 4.79KB
plugin-report (index.js) 46.42KB 13.06KB
plugin-timeline (index.js) 39.74KB 12.00KB
plugin-tree (index.js) 15.25KB 5.38KB
plugin-view (index.js) 93.37KB 24.00KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 129.13KB 42.23KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — ACCEPT · PR #13503 @ 58af2ad0c63359425bc247ed4c6b398800338cbe · domain:ui#4 · 2026-10-25T04:57Z

Reviewer of record: session_01XWGTsmqrtrt1Zqh1ioWqsT (seat 4). Implemented-by: session_018yk9f7S7q4BrEeWZGRcTKF on claude/project-thread-o71t1g. Card objectui#13460 (second pass), claim 6393192822, report 6393631342.

  1. Shape: draft, base main, Part of objectstack-ai/objectstack#25916. 25 files (+2,221 −214):

    • Audit Log, Flow Runs, the Connect-an-AI-agent card, ShareDialog and the /s/:token landing now read console.system.auditLog.*, console.developer.flowRuns.*, console.developer.agentConnect.*, shareDialog.* and sharedRecord.*.
    • That is 135 keys in each of the ten packs.
    • PerformanceDashboard and the components package's debug/ move under dev/. The package's export list is unchanged (export * from './dev'), and the two pins that name the old path follow the move.
    • Two new test files and one changeset.
    • All of it is inside the claim's surface.
  2. Exclusions held: nothing under metadata-admin/datasource/** is touched. In AuditLogPage the formatDate helper appears only as an unchanged context line, so objectui#13458's decision is untouched.

  3. Gates on this head: 33 check-runs success, 3 skipped (coverage jobs, dependabot); mergeable_state: clean; Console Performance Budget PASS. Locally:

    • 32 affected test files (223 tests) and packages/i18n/ (1,353 tests);
    • the i18n call-site, en-drift, designer-parity and dead-key checks;
    • type-check 38/38 and eslint (0 errors).
  4. Accepted deviations:

    • Commit 58af2ad carries a model-named trailer. objectui squashes with the PR title and body as the commit message (repository setting), so the trailer never reaches main, and the body names no model. No history rewrite is needed.
    • The body's footer style is accepted as is.
  5. Out of scope, left on the card:

    • data-table row titles;
    • ObjectView's Loading chart…;
    • react-page messages;
    • ResourceEditPage's From type / From name / Path;
    • ConnectAgentWidget product names;
    • the StudioDesignSurface placeholder;
    • the console *-preview.tsx dev entries and the copy in apps/console/src/dev/*;
    • the Flow Runs client-capability diagnostics;
    • the Agent key name prefill.

    New: ShareDialog's audience and permission badges show raw enum values. objectui#13353 is closed, so this line rides the card's leftover list.

  6. Landing: not governed. Changeset: @object-ui/console, @object-ui/components, @object-ui/i18n patch, Clause-② no / Metadata-protocol none; it matches the diff. The maintainer's standing landing word was given in this seat's project thread at 2026-10-25T01:48Z, so the seat lands it. After merge the card returns to pm:queue with the list above.


Generated by Claude Code

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants