28 Commits
Author SHA1 Message Date
pnokerandClaude Code 3fb43c4239 feat(web): unify three-terminal control density and close audit defects
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>
2026-09-07 19:33:17 +08:00
pnoker d43a6c4d0f chore(web): add dev:mock script for static demo mode 2026-09-02 02:22:15 +08:00
pnokerandClaude 691f6c8798 build(web): refresh frontend dependencies
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>
2026-08-27 09:40:41 +08:00
pnoker 6ee8974403 test(web): add three-viewport e2e gate and align playwright 2026-08-24 19:39:30 +08:00
pnoker 6133a7c5db perf(web): drop dead dependencies and split agentic vendor
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.
2026-08-24 17:50:30 +08:00
pnoker 90a7db4d6b merge: integrate upstream deployment docs and validation targets 2026-08-19 14:30:34 +08:00
pnoker 003686240c build(web): align package metadata with build image 2026-08-19 00:06:20 +08:00
pnoker b02d8f81fc refactor!(web): parse identifiers as strings and drop json-bigint
BREAKING CHANGE: frontend identifier types converge to string and the json-bigint dependency is removed; the backend now emits string ids.
2026-08-17 21:37:49 +08:00
dependabot[bot] 33ee1a728c build(deps): bump dompurify from 3.4.12 to 3.4.13 in /dc3-web (#206)
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.4.12 to 3.4.13.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/3.4.12...3.4.13)

---
updated-dependencies:
- dependency-name: dompurify
  dependency-version: 3.4.13
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-17 20:18:22 +08:00
pnoker 6c9149f9b2 feat(web): enrich the localized Industrial AI mock experience 2026-08-12 01:04:47 +08:00
Henry ZhangandClaude Fable 5 7c643a8e80 fix(api): dc3-api contract overhaul (auth JWT, history, presence, decision enum) (#193)
* fix(api): correct inverted enable_flag comment and document time unit

- tenant.proto enable_flag comment said "1 enabled, 0 disabled" but the
  actual EnableFlagEnum is ENABLE=0, DISABLE=1 — callers reading the
  comment would invert the flag. Correct it.
- base.proto create_time/operate_time are epoch milliseconds
  (LocalDateTimeUtil/Instant.toEpochMilli); document the unit so callers
  don't guess seconds vs millis.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(api): carry timestamp in point-value history; explicit bool presence

#5 Point-value history: the whole chain (proto -> gRPC server ->
PointValueService -> repository -> facades -> controller -> agentic tool)
returned List<String> and dropped create_time even though the DB row
already carried it. Switch to PointValueBO / FacadePointValueBO end to
end so callers receive each value with its timestamp.

#6 Field presence: GrpcR.ok and McpIntrospectDTO.active are now optional
bool, so "unset" is distinguishable from false on the wire.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(auth): unify JWT signing key, drop salt/password from token contract

The JWT signing key was per-principal — securityKey + ":" + salt, where
salt was the credential salt also carried through the gateway and the
token RPC. That makes the JWT key weak and widens salt exposure to every
gateway hop. Sign with the single configured securityKey (HS256) instead
and remove salt from the JWT path entirely:

- KeyUtil.generateToken/parserToken drop the salt parameter; the HMAC
  key is now just securityKey (must be >= 32 bytes for HS256).
- TokenService.generateToken/checkValid drop the salt parameter.
- token.proto GrpcLoginQuery drops salt and password — CheckValid only
  ever needed tenant, name and token.
- gateway FilterService, TokenGrpcFacade, TokenController adapted; the
  request header no longer feeds salt into validation.

The login-handshake salt (POST /token/salt, used to salt the password
client-side before verifyPassword) is unchanged — only the JWT signing
salt is removed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(api): type MCP authorize decision as proto enum

The authorize-tool-call decision was a free-form string, so callers
could only compare it against literals with no compile-time check.
Introduce GrpcMcpDecision (MCP_DECISION_UNSPECIFIED / AUTHORIZED /
CONFIRM_REQUIRED / REJECTED) and type GrpcMcpToolAuthorizeDTO.decision
with it. Enum names match the existing auth-side literals, so the
mapping is a direct valueOf / name().

- McpRuntimeServer builds the enum via toGrpcDecision (unknown -> UNSPECIFIED).
- McpRuntimeGrpcFacade maps enum -> BO string via name().
- gateway unchanged: it receives the BO (string decision) through the facade.

The other string MCP fields (risk_level, status, grant_type,
principal_type) stay strings for now — their value sets are wider and
partly lowercase (OAuth grant_type), so they are a follow-up.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(facade): align TokenLocalFacade with 3-arg checkValid (CI compile fix)

TokenLocalFacade (local impl) was missed when TokenFacade.checkValid
dropped salt; CI compiles facade-local-auth independently and caught
it. Align it + its test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 16:36:35 +08:00
Henry ZhangandClaude Fable 5 e2527af78d fix(agentic): run markdown sanitize test under jsdom (#176)
DOMPurify does not strip <script>/on* handlers under happy-dom (the
default vitest environment), so the "strips <script> tags" assertion
has been failing on main since the sanitizer switched to DOMPurify.
Production is unaffected — real browsers sanitize correctly. Pin this
single test file to jsdom via a per-file environment annotation and add
jsdom as a devDependency; all other tests stay on happy-dom.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 12:39:45 +08:00
pnoker 4cd16d23d1 Merge remote-tracking branch 'origin/develop' into chore/promote-develop-main-2 2026-08-03 20:24:41 +08:00
Henry Zhang 67526972aa fix(security): sanitize agentic assistant HTML with DOMPurify (XSS) (#157)
RenderedAssistantMessage rendered model output via v-html after a
hand-rolled regex sanitizer that CodeQL flagged 5 ways: bad-tag-filter,
incomplete-multi-character-sanitization (on* attributes, javascript:),
incomplete-url-scheme-check (data:/vbscript:). Replace with DOMPurify,
which covers all these plus mutation XSS. Fixes CodeQL #2146-2150.
2026-08-03 19:46:35 +08:00
7e116b9062 build(deps-dev): bump eslint-plugin-vue in /dc3-web (#140)
Bumps [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue) from 10.9.2 to 10.10.0.
- [Release notes](https://github.com/vuejs/eslint-plugin-vue/releases)
- [Changelog](https://github.com/vuejs/eslint-plugin-vue/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vuejs/eslint-plugin-vue/compare/v10.9.2...v10.10.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-vue
  dependency-version: 10.10.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Henry Zhang <pnokers@icloud.com>
Co-authored-by: pnoker <pnokers@gmail.com>
2026-08-03 14:36:11 +08:00
dependabot[bot]andHenry Zhang 152d6e9bf5 build(deps-dev): bump sass from 1.101.0 to 1.102.0 in /dc3-web (#139)
Bumps [sass](https://github.com/sass/dart-sass) from 1.101.0 to 1.102.0.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.101.0...1.102.0)

---
updated-dependencies:
- dependency-name: sass
  dependency-version: 1.102.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Henry Zhang <pnokers@icloud.com>
2026-08-03 12:11:56 +08:00
dependabot[bot]andHenry Zhang 69c43f3203 build(deps-dev): bump @playwright/test from 1.61.1 to 1.62.0 in /dc3-web (#138)
Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.61.1 to 1.62.0.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.61.1...v1.62.0)

---
updated-dependencies:
- dependency-name: "@playwright/test"
  dependency-version: 1.62.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Henry Zhang <pnokers@icloud.com>
2026-08-03 12:11:52 +08:00
dependabot[bot]andHenry Zhang cce10d17e5 build(deps-dev): bump globals from 17.7.0 to 17.8.0 in /dc3-web (#137)
Bumps [globals](https://github.com/sindresorhus/globals) from 17.7.0 to 17.8.0.
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v17.7.0...v17.8.0)

---
updated-dependencies:
- dependency-name: globals
  dependency-version: 17.8.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Henry Zhang <pnokers@icloud.com>
2026-08-03 12:11:47 +08:00
pnokerandClaude Fable 5 8b7c65715a build(web): bump frontend dependencies
Batch-upgrade dc3-web dependencies (element-plus, pinia, vue-router,
@types/node, typescript-eslint, vite, vitest, and related dev tooling),
covering Dependabot PRs #125/#128/#129 that could not auto-rebase because
Dependabot cannot parse the pnpm v9 lockfile.

Keep typescript on ~6: vue-tsc 3.3.7 and its volar toolchain do not yet
support TypeScript 7 (vue-tsc crashes resolving the removed ./lib/tsc
export), which would break the type-check quality gate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 22:22:45 +08:00
dependabot[bot] 2d064e336d build(deps-dev): bump vite from 8.1.0 to 8.1.5 in /dc3-web (#124)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.1.0 to 8.1.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.1.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.1.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-19 21:27:58 +08:00
dependabot[bot] 1d2c51098b build(deps-dev): bump vue-tsc from 3.3.5 to 3.3.7 in /dc3-web (#122)
Bumps [vue-tsc](https://github.com/vuejs/language-tools/tree/HEAD/packages/tsc) from 3.3.5 to 3.3.7.
- [Release notes](https://github.com/vuejs/language-tools/releases)
- [Changelog](https://github.com/vuejs/language-tools/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vuejs/language-tools/commits/v3.3.7/packages/tsc)

---
updated-dependencies:
- dependency-name: vue-tsc
  dependency-version: 3.3.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-19 21:27:52 +08:00
pnoker 4ea339ba14 chore(web): remove prettier, use IDE formatter for code style
Drop prettier, eslint-config-prettier, eslint-plugin-prettier and related
configs. Code formatting is now controlled solely by the IDE (IDEA) via
.editorconfig, eliminating the two-formatter conflict.
2026-07-10 00:01:51 +08:00
pnoker e739363df4 refactor: remove root package.json, set hooksPath directly from dc3-web 2026-06-29 18:52:14 +08:00
pnoker dc570b5537 refactor: move lint-staged governance to dc3-web, keep husky infra at root 2026-06-29 18:43:08 +08:00
pnoker b3d3962c84 refactor(dc3-web): remove Tauri desktop shell 2026-06-29 17:58:42 +08:00
pnoker f29f01ccd3 fix: remove Chinese text from production code
- EventAttributeExt/CommandAttributeExt: change @Schema example from
  Chinese placeholder to 'Enter text'
- dc3-web/package.json: change description to English
2026-06-28 19:57:57 +08:00
pnokerandClaude 2198d7fffe chore: merge iot-dc3-web frontend into monorepo
Merge the standalone iot-dc3-web repository into iot-dc3 as dc3-web/,
creating a single monorepo with unified versioning, CI/CD, and release
process.

- subtree-add iot-dc3-web under dc3-web/ with full commit history
- relocate nginx configs and SSL certs to dc3/dependencies/
- merge CI workflows (ci-backend.yml, ci-web.yml, docker-ci-web.yml)
- merge Issue/PR templates and dependabot config
- host frontend docs under docs/zh/frontend/
- share .husky/ hooks via root-level package.json (pnpm)
- unify versioning: single dc3/bin/tag.sh (vYYYY.M.P) for the whole repo
- update Dockerfile, docker-compose.yml, Makefile for new paths
- remove redundant directories from dc3-web/ (.claude, .github, dc3, docs, bin)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-28 14:43:22 +08:00
pnoker 2e4645e606 Add 'dc3-web/' from commit '0c3c7a157c3f003d5d8a8077c3e3850069d19747'
git-subtree-dir: dc3-web
git-subtree-mainline: e133f5a027
git-subtree-split: 0c3c7a157c
2026-06-28 09:45:33 +08:00