feat: HSAP platform v2 — modular navigation, quality review, audit log, world model simulation

Major changes:
- New frontend (platform/web/): Vite + React 18 + TypeScript + Tailwind
- 4-module navigation: 数据送标 / 模型管理 / 车队管理 / 系统管理
- Data catalog with charts (DMS/ADAS/Lane 3-tab view)
- Quality review workflow (标注质检): Good/Fine/Bad scoring with auto-advance
- Audit enhancements: batch operations, rejection categories, Feishu notifications
- Operation audit log (操作日志)
- World model simulation studio (仿真工坊)
- Dataset version management with snapshots and diff
- ADAS 7-class dataset integration (138K images organized + compressed)
- User management with Feishu integration and pagination
- CRUD/search/filter on all pages, card layout redesign
- PIL-optimized image overlay rendering
- Auto-snapshot on build, in_review workflow stage
- Removed embedded algorithm code (now in workspace)
This commit is contained in:
2026-06-03 11:40:21 +08:00
parent 7c43b44c57
commit e72bc061c5
5487 changed files with 979207 additions and 6197 deletions

View File

@@ -0,0 +1,22 @@
MIT License
Copyright (c) 2014-present Sebastian McKenzie and other contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -0,0 +1,19 @@
# @babel/plugin-transform-react-jsx-source
> Add a __source prop to all JSX Elements
See our website [@babel/plugin-transform-react-jsx-source](https://babeljs.io/docs/babel-plugin-transform-react-jsx-source) for more information.
## Install
Using npm:
```sh
npm install --save-dev @babel/plugin-transform-react-jsx-source
```
or using yarn:
```sh
yarn add @babel/plugin-transform-react-jsx-source --dev
```

View File

@@ -0,0 +1,51 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _helperPluginUtils = require("@babel/helper-plugin-utils");
var _core = require("@babel/core");
const TRACE_ID = "__source";
const FILE_NAME_VAR = "_jsxFileName";
const createNodeFromNullish = (val, fn) => val == null ? _core.types.nullLiteral() : fn(val);
var _default = exports.default = (0, _helperPluginUtils.declare)(api => {
api.assertVersion(7);
function makeTrace(fileNameIdentifier, {
line,
column
}) {
const fileLineLiteral = createNodeFromNullish(line, _core.types.numericLiteral);
const fileColumnLiteral = createNodeFromNullish(column, c => _core.types.numericLiteral(c + 1));
return _core.template.expression.ast`{
fileName: ${fileNameIdentifier},
lineNumber: ${fileLineLiteral},
columnNumber: ${fileColumnLiteral},
}`;
}
const isSourceAttr = attr => _core.types.isJSXAttribute(attr) && attr.name.name === TRACE_ID;
return {
name: "transform-react-jsx-source",
visitor: {
JSXOpeningElement(path, state) {
const {
node
} = path;
if (!node.loc || path.node.attributes.some(isSourceAttr)) {
return;
}
if (!state.fileNameIdentifier) {
const fileNameId = path.scope.generateUidIdentifier(FILE_NAME_VAR);
state.fileNameIdentifier = fileNameId;
path.scope.getProgramParent().push({
id: fileNameId,
init: _core.types.stringLiteral(state.filename || "")
});
}
node.attributes.push(_core.types.jsxAttribute(_core.types.jsxIdentifier(TRACE_ID), _core.types.jsxExpressionContainer(makeTrace(_core.types.cloneNode(state.fileNameIdentifier), node.loc.start))));
}
}
};
});
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["_helperPluginUtils","require","_core","TRACE_ID","FILE_NAME_VAR","createNodeFromNullish","val","fn","t","nullLiteral","_default","exports","default","declare","api","assertVersion","makeTrace","fileNameIdentifier","line","column","fileLineLiteral","numericLiteral","fileColumnLiteral","c","template","expression","ast","isSourceAttr","attr","isJSXAttribute","name","visitor","JSXOpeningElement","path","state","node","loc","attributes","some","fileNameId","scope","generateUidIdentifier","getProgramParent","push","id","init","stringLiteral","filename","jsxAttribute","jsxIdentifier","jsxExpressionContainer","cloneNode","start"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * This adds {fileName, lineNumber, columnNumber} annotations to JSX tags.\n *\n * NOTE: lineNumber and columnNumber are both 1-based.\n *\n * == JSX Literals ==\n *\n * <sometag />\n *\n * becomes:\n *\n * var __jsxFileName = 'this/file.js';\n * <sometag __source={{fileName: __jsxFileName, lineNumber: 10, columnNumber: 1}}/>\n */\nimport { declare } from \"@babel/helper-plugin-utils\";\nimport { types as t, template } from \"@babel/core\";\n\nconst TRACE_ID = \"__source\";\nconst FILE_NAME_VAR = \"_jsxFileName\";\n\nconst createNodeFromNullish = <T, N extends t.Node>(\n val: T | null,\n fn: (val: T) => N,\n): N | t.NullLiteral => (val == null ? t.nullLiteral() : fn(val));\n\ntype State = {\n fileNameIdentifier: t.Identifier;\n};\nexport default declare<State>(api => {\n api.assertVersion(REQUIRED_VERSION(7));\n\n function makeTrace(\n fileNameIdentifier: t.Identifier,\n { line, column }: { line: number; column: number },\n ) {\n const fileLineLiteral = createNodeFromNullish(line, t.numericLiteral);\n const fileColumnLiteral = createNodeFromNullish(column, c =>\n // c + 1 to make it 1-based instead of 0-based.\n t.numericLiteral(c + 1),\n );\n\n return template.expression.ast`{\n fileName: ${fileNameIdentifier},\n lineNumber: ${fileLineLiteral},\n columnNumber: ${fileColumnLiteral},\n }`;\n }\n\n const isSourceAttr = (attr: t.Node) =>\n t.isJSXAttribute(attr) && attr.name.name === TRACE_ID;\n\n return {\n name: \"transform-react-jsx-source\",\n visitor: {\n JSXOpeningElement(path, state) {\n const { node } = path;\n if (\n // the element was generated and doesn't have location information\n !node.loc ||\n // Already has __source\n path.node.attributes.some(isSourceAttr)\n ) {\n return;\n }\n\n if (!state.fileNameIdentifier) {\n const fileNameId = path.scope.generateUidIdentifier(FILE_NAME_VAR);\n state.fileNameIdentifier = fileNameId;\n\n path.scope.getProgramParent().push({\n id: fileNameId,\n init: t.stringLiteral(state.filename || \"\"),\n });\n }\n\n node.attributes.push(\n t.jsxAttribute(\n t.jsxIdentifier(TRACE_ID),\n t.jsxExpressionContainer(\n makeTrace(t.cloneNode(state.fileNameIdentifier), node.loc.start),\n ),\n ),\n );\n },\n },\n };\n});\n"],"mappings":";;;;;;AAcA,IAAAA,kBAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AAEA,MAAME,QAAQ,GAAG,UAAU;AAC3B,MAAMC,aAAa,GAAG,cAAc;AAEpC,MAAMC,qBAAqB,GAAGA,CAC5BC,GAAa,EACbC,EAAiB,KACMD,GAAG,IAAI,IAAI,GAAGE,WAAC,CAACC,WAAW,CAAC,CAAC,GAAGF,EAAE,CAACD,GAAG,CAAE;AAAC,IAAAI,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAKnD,IAAAC,0BAAO,EAAQC,GAAG,IAAI;EACnCA,GAAG,CAACC,aAAa,CAAkB,CAAE,CAAC;EAEtC,SAASC,SAASA,CAChBC,kBAAgC,EAChC;IAAEC,IAAI;IAAEC;EAAyC,CAAC,EAClD;IACA,MAAMC,eAAe,GAAGf,qBAAqB,CAACa,IAAI,EAAEV,WAAC,CAACa,cAAc,CAAC;IACrE,MAAMC,iBAAiB,GAAGjB,qBAAqB,CAACc,MAAM,EAAEI,CAAC,IAEvDf,WAAC,CAACa,cAAc,CAACE,CAAC,GAAG,CAAC,CACxB,CAAC;IAED,OAAOC,cAAQ,CAACC,UAAU,CAACC,GAAG;AAClC,kBAAkBT,kBAAkB;AACpC,oBAAoBG,eAAe;AACnC,sBAAsBE,iBAAiB;AACvC,MAAM;EACJ;EAEA,MAAMK,YAAY,GAAIC,IAAY,IAChCpB,WAAC,CAACqB,cAAc,CAACD,IAAI,CAAC,IAAIA,IAAI,CAACE,IAAI,CAACA,IAAI,KAAK3B,QAAQ;EAEvD,OAAO;IACL2B,IAAI,EAAE,4BAA4B;IAClCC,OAAO,EAAE;MACPC,iBAAiBA,CAACC,IAAI,EAAEC,KAAK,EAAE;QAC7B,MAAM;UAAEC;QAAK,CAAC,GAAGF,IAAI;QACrB,IAEE,CAACE,IAAI,CAACC,GAAG,IAETH,IAAI,CAACE,IAAI,CAACE,UAAU,CAACC,IAAI,CAACX,YAAY,CAAC,EACvC;UACA;QACF;QAEA,IAAI,CAACO,KAAK,CAACjB,kBAAkB,EAAE;UAC7B,MAAMsB,UAAU,GAAGN,IAAI,CAACO,KAAK,CAACC,qBAAqB,CAACrC,aAAa,CAAC;UAClE8B,KAAK,CAACjB,kBAAkB,GAAGsB,UAAU;UAErCN,IAAI,CAACO,KAAK,CAACE,gBAAgB,CAAC,CAAC,CAACC,IAAI,CAAC;YACjCC,EAAE,EAAEL,UAAU;YACdM,IAAI,EAAErC,WAAC,CAACsC,aAAa,CAACZ,KAAK,CAACa,QAAQ,IAAI,EAAE;UAC5C,CAAC,CAAC;QACJ;QAEAZ,IAAI,CAACE,UAAU,CAACM,IAAI,CAClBnC,WAAC,CAACwC,YAAY,CACZxC,WAAC,CAACyC,aAAa,CAAC9C,QAAQ,CAAC,EACzBK,WAAC,CAAC0C,sBAAsB,CACtBlC,SAAS,CAACR,WAAC,CAAC2C,SAAS,CAACjB,KAAK,CAACjB,kBAAkB,CAAC,EAAEkB,IAAI,CAACC,GAAG,CAACgB,KAAK,CACjE,CACF,CACF,CAAC;MACH;IACF;EACF,CAAC;AACH,CAAC,CAAC","ignoreList":[]}

View File

@@ -0,0 +1,35 @@
{
"name": "@babel/plugin-transform-react-jsx-source",
"version": "7.29.7",
"description": "Add a __source prop to all JSX Elements",
"repository": {
"type": "git",
"url": "https://github.com/babel/babel.git",
"directory": "packages/babel-plugin-transform-react-jsx-source"
},
"homepage": "https://babel.dev/docs/en/next/babel-plugin-transform-react-jsx-source",
"license": "MIT",
"publishConfig": {
"access": "public"
},
"main": "./lib/index.js",
"keywords": [
"babel-plugin"
],
"dependencies": {
"@babel/helper-plugin-utils": "^7.29.7"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
},
"devDependencies": {
"@babel/core": "^7.29.7",
"@babel/helper-plugin-test-runner": "^7.29.7",
"@babel/plugin-syntax-jsx": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
},
"author": "The Babel Team (https://babel.dev/team)",
"type": "commonjs"
}