sweep every module to satisfy the new method-name rule, renaming
about 40 methods together with their interface, implementation, test
and cli call sites: store find() lookups become get(), analytics
queryLatest/queryHistory become getLatest/getHistory, sql helper
query() becomes spec()/sql(), jwks fetch() becomes load(), and the
cursor record component queryDigest becomes requestDigest
no behavior changes; full unit suite (5278 tests) and both quality
gates stay green
- command_history/get_by_record_id now binds the declared wire name
record_id instead of the raw parameter name recordId, matching the
event_history twin and the frontend/CLI clients
- point_command_history/get_by_command_id likewise binds command_id,
and the accepted statusUri built by point_command write now uses it
- openapi-data snapshot updated for both query params
- cli command history and web mock handlers aligned to the same names
- web mock registers command_history under the data service prefix
Land the v7 three-terminal UX decision: drop the width/pointer-based
44px touch enlargement so one 32px density holds across desktop,
tablet, and mobile, and rebuild entity pages on a responsive record
list (ResponsiveRecordList + EntityMobileCard + per-entity mobile
summaries). Tighten the nginx security headers (CSP frame-ancestors
'none', X-Frame-Options DENY) to match the static e2e server.
Complete the dc3-web audit remediation, including the remaining LOW
items from docs/dc3-web-low-defects-handoff.md: streaming-safe
message loads in the agentic store, mock menu reparent cycle
rejection, paged-list page clamping, fetch/axios mock request
normalization, per-table attribute catalogs, post-flush alarm
watchers, rowKey-agnostic delete state, localized card text
fallbacks, and e2e-server port fail-fast.
Gate: vue-tsc, eslint, vitest 687 passed, responsive e2e 64 passed.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Replace the Particles canvas with LoginAtmosphere, the warped interactive
grid + logo-dot silhouette shared with the dc3.site family sites, and add
an AGPL copyright footer with the platform tagline. Drop the 48px grid
overlay from the login background so the atmosphere carries the scene.
Serve the dc3-web image over plain HTTP on port 80 only: remove the ssl_certificate/ssl_certificate_key directives, the 443 listeners and the HSTS header from default.conf, drop the 8443:443 mapping and the certificate COPY from the Dockerfile, and remove the acme.sh README. The retired dc3.site certificate is preserved as reference material at nginx/certs/ssl-certs.md.
- Move the login page spacing and radii onto the 4/8/12/16/24/32 token
scale (shell paddings, form gaps, input radii, mobile breakpoints)
- Align shared form containers: edit-card margins, card-footer gap,
matrix toolbar footer, breadcrumb strip, dropdown identity row
- Normalize card internals to tokens: StatCard row gap, DashboardCard
title bar, AlertList group padding, home widgets, NavMenu items,
things-dialog body, MCP/role/user assign views, point value card
- Use the 8px page gutter (--dc3-space-2) for home row rhythm, the stat
grid gap, and the SLA strip margin so vertical spacing matches the
horizontal card gutters
- Normalize the home banner internals to the token scale: 16px body
padding and area gap, 8x16 clock box, 8x12 service chips
- Normalize the SLA strip padding/radius and chip spacing to tokens
- Align things-card vertical margin with its documented 8px rhythm so
settings grids match the horizontal gutter
- Unify the two 12px form gutters and the breadcrumb strip padding on
the same scale
- Extract a shared BrandLockup (logo, gradient wordmark, AGENTIC tag,
signal line) used by both the header brand capsule and the login page
- Add a shared glass-capsule SCSS recipe so the header capsules and the
login brand pill keep identical geometry and glass decoration
- Align the login page with the workspace font stack
- Reduce the account trigger to an avatar and move the username into a
themed identity dropdown with divider; style the popper with dc3
tokens so light and dark themes both follow the system theme
- Point the About action at the live site domain (https://dc3.site)
- migrate auth, manager, data, and agentic persistence to R2DBC
- hard cut pagination, facade, gateway, web, and CLI contracts
- remove legacy database and TSDB adapters and document validation gates
BREAKING CHANGE: platform persistence now requires PostgreSQL 18 with TimescaleDB and the new reactive API contracts.
Ready-to-copy shell block (install, set gateway to the current
origin, interactive login) next to the existing agent config
snippets, plus en/zh i18n keys for the new card.
Replace limit-truncated listing with real server-side paging
(LIMIT/OFFSET plus a shared count query) behind Page envelopes:
tool/list accepts a nested Pages block and audit/list takes
current/size params, both keeping the legacy limit as a compatibility
page size. The frontend configs forward pager state and consume
{records, total} instead of faking a single page; the assignment
drawer keeps its full-catalog semantics with one 500-row page (the
service cap). Adds a mapper XML grammar gate and audit page/count
symmetry tests.
Co-Authored-By: Claude <noreply@anthropic.com>
Extract the header language switch into a reusable AppPreferences
component and add a light/system/dark theme toggle beside it, backed by
the persisted app store theme mode. Use the component in both the
console header (compact) and the login page (surface variant) so the
public page obeys the same theme contract as the workspace.
Tokenize the login page palette in theme.scss with dark-mode twins,
switch the login validation rules to computed form rules so messages
follow locale changes, and extend the layout component test and the
login/responsive e2e specs for the new controls.
Co-Authored-By: Claude <noreply@anthropic.com>
Bump pnpm to 11.24.0 and refresh element-plus, axios, dayjs, dompurify,
marked, pinia, vue-i18n, playwright, typescript-eslint, eslint, sass,
vite and vitest within their minor lines, and widen the pnpm-workspace
onlyBuiltDependencies ranges accordingly.
Keep typescript on ~6.0.3, vue on ^3.5.40 and happy-dom on ^20.11.0:
typescript 7 drops the ./lib/tsc subpath vue-tsc still resolves, vue
3.5.41 makes compiler-sfc require filesystem access for imported prop
types under the vitest environment, and happy-dom 20.11.6 changes the
execCommand clipboard behaviour the utils suites assert on.
Co-Authored-By: Claude <noreply@anthropic.com>
- add JSDoc to useEntityListPage, useEntityNames, usePagedList, and the four Pinia stores
- add JSDoc to 39 utils exports across thingModelFormat, formRule, validation, date, json, pointFormat, and searchParam utilities
- verified: pnpm check and pnpm lint:check pass
Remove the unused highlight.js plugin and four dead dependencies, switch Element Plus styles to per-component imports, split marked/dompurify/vue-element-plus-x into a lazy agentic-vendor chunk, and restore the 500 kB chunk warning limit.
Fix calcDate second remainder, drop dead storage helpers, follow the i18n locale for numeric formatting, rename order to sortAsc and expand abbreviated identifiers, and remove the unused English dashboard empty default.
Remove the unused interval store and its test, the duplicate agentic session/message seed block, and consolidate AUTO_REFRESH_INTERVAL plus PRINCIPAL_TYPE_OPTIONS into shared constants.
Route meta titles become i18n keys resolved in the guard, the axios interceptor and agentic store reuse locale messages instead of hardcoded English, leftover labels and copy hints switch to t(), and the route/sidebar aliases merge into one source.
Clear only the auth storage keys instead of wiping localStorage and sessionStorage when an SSE request returns 401, matching the axios interceptor contract.
Default the R envelope to unknown so bare wrappers surface their data shape, remove the | string tail that voided alarm/attribute unions, add explicit generics to every dashboard/point/info wrapper, and move the alert row types plus RangeKey to a single dashboard source. Also fix mock seeds to match backend enums (PENDING, DINGTALK_BOT).
Upload the import file as a real multipart FormData part (the backend contract is @RequestPart), render operateTime on the operation-time detail rows, and stop double success toasts for add/import flows.
R2b of docs/design/storage-abstraction.md §3:
- PostgreSQL seed: the three driver-lease sequences retire. The fencing
token and assignment version default to 1 and advance row-locally —
per-device / per-driver monotonicity is the property the checks rely
on, which the global sequences only delivered incidentally, and MySQL
has no sequence objects. The three statement-level revision triggers
(transition tables + INSERT .. ON CONFLICT, none of which MySQL can
express) collapse into one row-level function with row-local +1 upserts
— a shape both engines share.
- MySQL seed under dc3/dependencies/mysql/initdb/ (00-06), derived by
dc3/dependencies/mysql/pg2mysql_seed.py: schemas become databases,
TIMESTAMPTZ becomes DATETIME(6), TEXT/JSON literal defaults become
expression defaults (MySQL 8 refuses literal defaults on BLOB/TEXT/
JSON), operate-time plpgsql triggers become the ON UPDATE column
attribute (explicit SETs keep winning), the revision family becomes
row-level DELIMITER triggers, keyed TEXT columns widen to VARCHAR(191),
partial indexes drop, and the embedded-JSON seed values load under
NO_BACKSLASH_ESCAPES (MySQL string literals eat the backslashes the
escaped-JSON content values depend on; PostgreSQL does not). 05 is
hand-maintained: only the dc3_point_latest projection — a MySQL core
requires an external time-series store, so the hypertable and cagg DDL
have no counterpart by design.
- Compose: the optional stack gains a mysql:8.4 service (utf8mb4, seed
mounted at docker-entrypoint-initdb.d, healthcheck); the app stack
passes DC3_DB_TYPE through.
Verified by loading all seven files into a fresh mysql:8.4 container —
zero errors, five databases, table counts aligned with the PostgreSQL
seed (manager 24 incl. common, auth 24, data 12, agentic 6, history 1),
and the revision trigger proven live: insert bumps the owning driver's
revision to 1, an enable_flag flip bumps it again to 2.