🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@bintel/dimens-cli

Package Overview
Dependencies
Maintainers
1
Versions
9
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@bintel/dimens-cli - npm Package Compare versions

Comparing version
1.0.4
to
1.0.5
dist/commands-CIiYTu6h.mjs

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

+51
import { t as __exportAll } from "./rolldown-runtime-95iHPtFO.mjs";
import { a as RoleSDK, c as ProjectSDK, d as SheetSDK, f as ColumnSDK, g as FlowChatSDK, h as DimensClient, i as RowSDK, l as UploadSDK, m as AuthSDK, n as RowPolicySDK, o as ReportSDK, p as CanvasSDK, r as RowAclSDK, s as PermissionSDK, t as ViewSDK, u as DocumentSDK } from "./view-dMOh46FK.mjs";
//#region src/sdk/index.ts
var sdk_exports = /* @__PURE__ */ __exportAll({
DimensSDK: () => DimensSDK,
createSDK: () => createSDK
});
var DimensSDK = class {
client;
auth;
project;
report;
canvas;
role;
permission;
sheet;
column;
document;
view;
row;
rowPolicy;
rowAcl;
ai;
upload;
constructor(config) {
this.client = new DimensClient(config);
this.auth = new AuthSDK(this.client);
this.project = new ProjectSDK(this.client);
this.report = new ReportSDK(this.client);
this.canvas = new CanvasSDK(this.client);
this.role = new RoleSDK(this.client);
this.permission = new PermissionSDK(this.client);
this.sheet = new SheetSDK(this.client);
this.column = new ColumnSDK(this.client);
this.document = new DocumentSDK(this.client);
this.view = new ViewSDK(this.client);
this.row = new RowSDK(this.client);
this.rowPolicy = new RowPolicySDK(this.client);
this.rowAcl = new RowAclSDK(this.client);
this.ai = new FlowChatSDK(this.client);
this.upload = new UploadSDK(this.client);
}
};
function createSDK(config) {
return new DimensSDK(config);
}
//#endregion
export { createSDK as n, sdk_exports as r, DimensSDK as t };
//# sourceMappingURL=sdk-B4tFCZxH.mjs.map
{"version":3,"file":"sdk-B4tFCZxH.mjs","names":[],"sources":["../src/sdk/index.ts"],"sourcesContent":["import { AuthSDK } from './auth';\nimport { CanvasSDK } from './canvas';\nimport { DimensClient, type APIResponse, type DimensClientOptions } from './client';\nimport { ColumnSDK } from './column';\nimport { DocumentSDK } from './document';\nimport { FlowChatSDK } from './flow-chat';\nimport { PermissionSDK } from './permission';\nimport { ProjectSDK } from './project';\nimport { ReportSDK } from './report';\nimport { RowSDK } from './row';\nimport { RowAclSDK } from './row-acl';\nimport { RowPolicySDK } from './row-policy';\nimport { RoleSDK } from './role';\nimport { SheetSDK } from './sheet';\nimport { UploadSDK } from './upload';\nimport { ViewSDK } from './view';\n\nexport type { APIResponse, DimensClientOptions };\n\nexport interface SDKConfig extends DimensClientOptions {}\n\nexport class DimensSDK {\n readonly client: DimensClient;\n readonly auth: AuthSDK;\n readonly project: ProjectSDK;\n readonly report: ReportSDK;\n readonly canvas: CanvasSDK;\n readonly role: RoleSDK;\n readonly permission: PermissionSDK;\n readonly sheet: SheetSDK;\n readonly column: ColumnSDK;\n readonly document: DocumentSDK;\n readonly view: ViewSDK;\n readonly row: RowSDK;\n readonly rowPolicy: RowPolicySDK;\n readonly rowAcl: RowAclSDK;\n readonly ai: FlowChatSDK;\n readonly upload: UploadSDK;\n\n constructor(config: SDKConfig) {\n this.client = new DimensClient(config);\n this.auth = new AuthSDK(this.client);\n this.project = new ProjectSDK(this.client);\n this.report = new ReportSDK(this.client);\n this.canvas = new CanvasSDK(this.client);\n this.role = new RoleSDK(this.client);\n this.permission = new PermissionSDK(this.client);\n this.sheet = new SheetSDK(this.client);\n this.column = new ColumnSDK(this.client);\n this.document = new DocumentSDK(this.client);\n this.view = new ViewSDK(this.client);\n this.row = new RowSDK(this.client);\n this.rowPolicy = new RowPolicySDK(this.client);\n this.rowAcl = new RowAclSDK(this.client);\n this.ai = new FlowChatSDK(this.client);\n this.upload = new UploadSDK(this.client);\n }\n}\n\nexport function createSDK(config: SDKConfig): DimensSDK {\n return new DimensSDK(config);\n}\n\nexport { DimensClient } from './client';\nexport { AuthSDK } from './auth';\nexport { CanvasSDK } from './canvas';\nexport { ProjectSDK } from './project';\nexport { ReportSDK } from './report';\nexport { RoleSDK } from './role';\nexport { PermissionSDK } from './permission';\nexport { SheetSDK } from './sheet';\nexport { ColumnSDK } from './column';\nexport { DocumentSDK } from './document';\nexport { ViewSDK } from './view';\nexport { RowSDK } from './row';\nexport { RowPolicySDK } from './row-policy';\nexport { RowAclSDK } from './row-acl';\nexport { FlowChatSDK } from './flow-chat';\nexport { UploadSDK } from './upload';\n"],"mappings":";;;;;;;;AAqBA,IAAa,YAAb,MAAuB;CACrB,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CAET,YAAY,QAAmB;AAC7B,OAAK,SAAS,IAAI,aAAa,OAAO;AACtC,OAAK,OAAO,IAAI,QAAQ,KAAK,OAAO;AACpC,OAAK,UAAU,IAAI,WAAW,KAAK,OAAO;AAC1C,OAAK,SAAS,IAAI,UAAU,KAAK,OAAO;AACxC,OAAK,SAAS,IAAI,UAAU,KAAK,OAAO;AACxC,OAAK,OAAO,IAAI,QAAQ,KAAK,OAAO;AACpC,OAAK,aAAa,IAAI,cAAc,KAAK,OAAO;AAChD,OAAK,QAAQ,IAAI,SAAS,KAAK,OAAO;AACtC,OAAK,SAAS,IAAI,UAAU,KAAK,OAAO;AACxC,OAAK,WAAW,IAAI,YAAY,KAAK,OAAO;AAC5C,OAAK,OAAO,IAAI,QAAQ,KAAK,OAAO;AACpC,OAAK,MAAM,IAAI,OAAO,KAAK,OAAO;AAClC,OAAK,YAAY,IAAI,aAAa,KAAK,OAAO;AAC9C,OAAK,SAAS,IAAI,UAAU,KAAK,OAAO;AACxC,OAAK,KAAK,IAAI,YAAY,KAAK,OAAO;AACtC,OAAK,SAAS,IAAI,UAAU,KAAK,OAAO;;;AAI5C,SAAgB,UAAU,QAA8B;AACtD,QAAO,IAAI,UAAU,OAAO"}
import { dirname, join } from "path";
import { readFileSync } from "fs";
import { fileURLToPath } from "url";
import { basename } from "node:path";
import { readFile } from "node:fs/promises";
//#region src/core/version.ts
/**
* 版本信息
*/
let _version;
function getVersion() {
if (_version) return _version;
try {
const packageJsonPath = join(dirname(fileURLToPath(import.meta.url)), "..", "package.json");
_version = JSON.parse(readFileSync(packageJsonPath, "utf-8")).version;
} catch {
_version = "1.0.0";
}
return _version ?? "1.0.0";
}
const version = getVersion();
function getUserAgent() {
return `DimensCLI/${version} (Node.js/${process.version})`;
}
//#endregion
//#region src/sdk/flow-chat.ts
var FlowChatSDK = class {
constructor(client) {
this.client = client;
}
completions(teamId, payload) {
return this.client.post(`/app/flow/${teamId}/v1/chat/completions`, payload);
}
};
//#endregion
//#region src/core/http.ts
async function requestJson(url, init = {}) {
const response = await fetch(url, init);
const payload = await response.json();
if (!response.ok) throw new Error(payload?.message || `HTTP ${response.status}`);
return payload;
}
//#endregion
//#region src/sdk/client.ts
var DimensClient = class {
options;
constructor(options) {
this.options = options;
}
getOptions() {
return { ...this.options };
}
async get(path, query, init = {}) {
return requestJson(this.buildUrl(path, query), {
...init,
method: "GET",
headers: this.buildHeaders(init.headers)
});
}
async post(path, body, init = {}) {
const requestInit = {
...init,
method: "POST",
headers: this.buildHeaders(init.headers, true)
};
if (body !== void 0) requestInit.body = JSON.stringify(body);
return requestJson(this.buildUrl(path), requestInit);
}
async postFormData(path, formData, init = {}) {
const requestInit = {
...init,
method: "POST",
headers: this.buildHeaders(init.headers, false, true),
body: formData
};
return requestJson(this.buildUrl(path), requestInit);
}
buildUrl(path, query) {
const base = this.options.baseUrl.replace(/\/+$/, "");
const normalizedPath = path.startsWith("/") ? path : `/${path}`;
const url = new URL(`${base}${normalizedPath}`);
Object.entries(query || {}).forEach(([key, value]) => {
if (value === void 0 || value === null || value === "") return;
url.searchParams.set(key, String(value));
});
return url.toString();
}
buildHeaders(headers, hasJsonBody = false, hasFormDataBody = false) {
const merged = normalizeHeaders(headers);
merged.Accept = "application/json";
merged["User-Agent"] = getUserAgent();
if (hasJsonBody && !hasFormDataBody) merged["Content-Type"] = "application/json";
if (hasFormDataBody) delete merged["Content-Type"];
if (this.options.token) merged.Authorization = `Bearer ${this.options.token}`;
if (this.options.refreshToken) merged["X-Refresh-Token"] = this.options.refreshToken;
return merged;
}
};
function normalizeHeaders(headers) {
if (!headers) return {};
if (typeof Headers !== "undefined" && headers instanceof Headers) return Object.fromEntries(headers.entries());
if (Array.isArray(headers)) return Object.fromEntries(headers.map(([key, value]) => [String(key), String(value)]));
const normalized = {};
Object.entries(headers).forEach(([key, value]) => {
normalized[key] = typeof value === "string" ? value : value.join(", ");
});
return normalized;
}
//#endregion
//#region src/sdk/auth.ts
var AuthSDK = class {
constructor(client) {
this.client = client;
}
login(payload) {
return this.client.post("/login", payload);
}
loginByApiKey(payload) {
return this.client.post("/open/user/login/apiKey", payload);
}
exchangeTokenByApiKey(payload) {
return this.loginByApiKey(payload);
}
refreshToken() {
return this.client.get("/refreshToken");
}
};
//#endregion
//#region src/sdk/canvas.ts
const EMPTY_GRAPH = {
nodes: [],
edges: [],
viewport: {
x: 0,
y: 0,
zoom: 1
}
};
var CanvasSDK = class {
constructor(client) {
this.client = client;
}
normalizeCreatedCanvas(data) {
const sheetId = typeof data.sheetId === "string" ? data.sheetId : typeof data.id === "string" ? data.id : "";
return {
...data,
sheetId,
canvasId: sheetId
};
}
async create(projectId, payload) {
const response = await this.client.post(`/app/mul/project/${projectId}/sheet/create`, {
name: payload.name,
type: "canvas",
...payload.folderId ? { folderId: payload.folderId } : {},
config: { data: payload.data ?? EMPTY_GRAPH }
});
return {
...response,
data: this.normalizeCreatedCanvas(response.data || {})
};
}
info(teamId, projectId, sheetId) {
return this.client.get(`/app/canvas/${teamId}/${projectId}/info`, { sheetId });
}
save(teamId, projectId, payload) {
return this.client.post(`/app/canvas/${teamId}/${projectId}/save`, payload);
}
versions(teamId, projectId, payload) {
return this.client.post(`/app/canvas/${teamId}/${projectId}/versions`, payload);
}
version(teamId, projectId, sheetId, version) {
return this.client.get(`/app/canvas/${teamId}/${projectId}/version`, {
sheetId,
version
});
}
restore(teamId, projectId, payload) {
return this.client.post(`/app/canvas/${teamId}/${projectId}/restore`, payload);
}
listMineResources(teamId, keyword) {
return this.client.get(`/app/canvas/${teamId}/resource/mine`, { keyword });
}
saveMineResource(teamId, payload) {
return this.client.post(`/app/canvas/${teamId}/resource/mine`, payload);
}
removeMineResource(teamId, id) {
return this.client.post(`/app/canvas/${teamId}/resource/mine/delete`, { id });
}
publishMineResource(teamId, id) {
return this.client.post(`/app/canvas/${teamId}/resource/mine/publish`, { id });
}
listMarketResources(teamId, keyword) {
return this.client.get(`/app/canvas/${teamId}/resource/market`, { keyword });
}
};
//#endregion
//#region src/sdk/column.ts
var ColumnSDK = class {
constructor(client) {
this.client = client;
}
list(teamId, projectId, sheetId) {
return this.client.get(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/column/list`);
}
create(teamId, projectId, sheetId, payload) {
return this.client.post(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/column/create`, payload);
}
update(sheetId, fieldId, payload) {
return this.client.post(`/app/mul/sheet/${sheetId}/column/${fieldId}/update`, payload);
}
delete(sheetId, fieldId) {
return this.client.post(`/app/mul/sheet/${sheetId}/column/${fieldId}/delete`);
}
};
//#endregion
//#region src/sdk/sheet.ts
var SheetSDK = class {
constructor(client) {
this.client = client;
}
list(projectId) {
return this.client.get(`/app/mul/project/${projectId}/sheet/list`);
}
tree(projectId) {
return this.client.get(`/app/mul/project/${projectId}/sheet/tree`);
}
create(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/sheet/create`, payload);
}
info(teamId, projectId, sheetId) {
return this.client.get(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/info`);
}
update(teamId, projectId, sheetId, payload) {
return this.client.post(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/update`, payload);
}
delete(teamId, projectId, sheetId) {
return this.client.post(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/delete`);
}
structure(sheetId) {
return this.client.get(`/app/mul/sheet/${sheetId}/structure`);
}
};
//#endregion
//#region src/sdk/document.ts
var DocumentSDK = class {
constructor(client) {
this.client = client;
}
createWithSheet(teamId, projectId, payload) {
return this.client.post(`/app/documents/${teamId}/${projectId}/document/createWithSheet`, payload);
}
info(teamId, projectId, documentId) {
return this.client.get(`/app/documents/${teamId}/${projectId}/document/${documentId}/info`);
}
getBySheetId(teamId, projectId, sheetId) {
return this.client.get(`/app/documents/${teamId}/${projectId}/document/getBySheetId`, { sheetId });
}
update(teamId, projectId, payload) {
return this.client.post(`/app/documents/${teamId}/${projectId}/document/update`, payload);
}
delete(teamId, projectId, documentId) {
return this.client.post(`/app/documents/${teamId}/${projectId}/document/delete`, { documentId });
}
versions(teamId, projectId, query) {
return this.client.get(`/app/documents/${teamId}/${projectId}/document/versions`, query);
}
version(teamId, projectId, query) {
return this.client.get(`/app/documents/${teamId}/${projectId}/document/version`, query);
}
restore(teamId, projectId, payload) {
return this.client.post(`/app/documents/${teamId}/${projectId}/document/restore`, payload);
}
};
//#endregion
//#region src/sdk/upload.ts
var UploadSDK = class {
constructor(client) {
this.client = client;
}
async uploadFile(filePath, keyOrOptions) {
const fileBuffer = await readFile(filePath);
const fileName = basename(filePath);
const file = new File([fileBuffer], fileName, {
type: resolveMimeType(fileName),
lastModified: Date.now()
});
const formData = new FormData();
formData.append("file", file, file.name);
const options = typeof keyOrOptions === "string" ? { key: keyOrOptions } : keyOrOptions ?? {};
if (!options.name) options.name = file.name;
if (!options.size) options.size = String(file.size);
if (!options.mimeType) options.mimeType = file.type;
Object.entries(options).forEach(([field, value]) => {
if (!value) return;
formData.append(field, value);
});
return this.client.postFormData("/app/base/comm/upload", formData);
}
async getMode() {
return this.client.get("/app/base/comm/uploadMode");
}
};
function resolveMimeType(fileName) {
const lowerFileName = fileName.toLowerCase();
if (lowerFileName.endsWith(".txt")) return "text/plain";
if (lowerFileName.endsWith(".json")) return "application/json";
if (lowerFileName.endsWith(".pdf")) return "application/pdf";
if (lowerFileName.endsWith(".png")) return "image/png";
if (lowerFileName.endsWith(".jpg") || lowerFileName.endsWith(".jpeg")) return "image/jpeg";
if (lowerFileName.endsWith(".gif")) return "image/gif";
if (lowerFileName.endsWith(".svg")) return "image/svg+xml";
if (lowerFileName.endsWith(".csv")) return "text/csv";
return "application/octet-stream";
}
//#endregion
//#region src/sdk/project.ts
var ProjectSDK = class {
constructor(client) {
this.client = client;
}
page(teamId, payload) {
return this.client.post(`/app/org/${teamId}/project/page`, payload);
}
info(teamId, id) {
return this.client.get(`/app/org/${teamId}/project/info`, { id });
}
create(teamId, payload) {
return this.client.post(`/app/org/${teamId}/project/add`, payload);
}
update(teamId, payload) {
return this.client.post(`/app/org/${teamId}/project/update`, payload);
}
trash(teamId, ids) {
return this.client.post(`/app/org/${teamId}/project/trash`, { ids });
}
restore(teamId, ids) {
return this.client.post(`/app/org/${teamId}/project/restore`, { ids });
}
};
//#endregion
//#region src/sdk/permission.ts
var PermissionSDK = class {
constructor(client) {
this.client = client;
}
list(projectId, sheetId) {
return this.client.get(`/app/mul/project/${projectId}/permission/list`, { sheetId });
}
info(projectId, id, sheetId) {
return this.client.get(`/app/mul/project/${projectId}/permission/info`, {
id,
sheetId
});
}
create(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/permission/add`, payload);
}
update(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/permission/update`, payload);
}
delete(projectId, ids, sheetId) {
return this.client.post(`/app/mul/project/${projectId}/permission/delete`, {
ids,
sheetId
});
}
check(projectId, payload) {
return this.client.get(`/app/mul/project/${projectId}/permission/check`, payload);
}
batch(projectId, sheetId, permissions) {
return this.client.post(`/app/mul/project/${projectId}/permission/batch`, {
sheetId,
permissions
});
}
updateResourcePermission(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/permission/updateResourcePermission`, payload);
}
};
//#endregion
//#region src/sdk/report.ts
var ReportSDK = class {
constructor(client) {
this.client = client;
}
normalizeProjectReport(data) {
const reportId = typeof data.reportId === "string" ? data.reportId : typeof data.sheetId === "string" ? data.sheetId : typeof data.id === "string" ? data.id : "";
return {
...data,
reportId,
sheetId: typeof data.sheetId === "string" ? data.sheetId : reportId
};
}
list(projectId, payload) {
return this.client.post(`/app/report/${projectId}/list`, payload);
}
info(projectId, reportId) {
return this.client.get(`/app/report/${projectId}/info`, { reportId });
}
create(projectId, payload) {
return this.client.post(`/app/report/${projectId}/add`, payload);
}
async createProjectReport(projectId, payload) {
const response = await this.client.post(`/app/mul/project/${projectId}/sheet/create`, {
name: payload.name,
type: "report",
config: { dashboardConfig: {
id: payload.dashboardId || `dashboard_${Date.now()}`,
title: payload.name,
...payload.description ? { description: payload.description } : {},
widgets: [],
parameters: [],
createdAt: payload.createdAt || Date.now()
} }
});
return {
...response,
data: this.normalizeProjectReport(response.data || {})
};
}
update(projectId, payload) {
return this.client.post(`/app/report/${projectId}/update`, payload);
}
copy(projectId, payload) {
return this.client.post(`/app/report/${projectId}/copy`, payload);
}
publish(projectId, payload) {
return this.client.post(`/app/report/${projectId}/publish`, payload);
}
delete(projectId, payload) {
return this.client.post(`/app/report/${projectId}/delete`, payload);
}
archive(projectId, payload) {
return this.client.post(`/app/report/${projectId}/archive`, payload);
}
sort(projectId, payload) {
return this.client.post(`/app/report/${projectId}/sort`, payload);
}
move(projectId, payload) {
return this.client.post(`/app/report/${projectId}/move`, payload);
}
query(projectId, payload) {
return this.client.post(`/app/report/query/${projectId}`, payload);
}
queryWidget(projectId, payload) {
return this.client.post(`/app/report/query/${projectId}/widget`, payload);
}
preview(projectId, payload) {
return this.client.post(`/app/report/query/${projectId}/preview`, payload);
}
validate(projectId, payload) {
return this.client.post(`/app/report/${projectId}/validate`, payload);
}
addWidget(projectId, payload) {
return this.client.post(`/app/report/widget/${projectId}/add`, payload);
}
updateWidget(projectId, payload) {
return this.client.post(`/app/report/widget/${projectId}/update`, payload);
}
deleteWidget(projectId, payload) {
return this.client.post(`/app/report/widget/${projectId}/delete`, payload);
}
batchWidgets(projectId, payload) {
return this.client.post(`/app/report/widget/${projectId}/batch`, payload);
}
sortWidget(projectId, payload) {
return this.client.post(`/app/report/widget/${projectId}/sort`, payload);
}
};
//#endregion
//#region src/sdk/role.ts
var RoleSDK = class {
constructor(client) {
this.client = client;
}
list(projectId) {
return this.client.get(`/app/mul/project/${projectId}/role/list`);
}
info(projectId, roleId) {
return this.client.get(`/app/mul/project/${projectId}/role/info`, { roleId });
}
create(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/role/add`, payload);
}
update(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/role/update`, payload);
}
delete(projectId, roleIds) {
return this.client.post(`/app/mul/project/${projectId}/role/delete`, { roleIds });
}
assignUser(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/role/assignUser`, payload);
}
removeUser(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/role/removeUser`, payload);
}
userRoles(projectId, userId, sheetId) {
return this.client.get(`/app/mul/project/${projectId}/role/userRoles`, {
userId,
sheetId
});
}
roleUsers(projectId, roleId) {
return this.client.get(`/app/mul/project/${projectId}/role/roleUsers`, { roleId });
}
projectUsers(projectId) {
return this.client.get(`/app/mul/project/${projectId}/role/projectUsers`);
}
};
//#endregion
//#region src/sdk/row.ts
var RowSDK = class {
constructor(client) {
this.client = client;
}
page(teamId, projectId, sheetId, payload) {
return this.client.post(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/row/page`, payload);
}
info(teamId, projectId, sheetId, rowId) {
return this.client.get(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/row/${rowId}/info`);
}
create(sheetId, payload) {
return this.client.post(`/app/mul/sheet/${sheetId}/row/create`, payload);
}
batchCreate(sheetId, payload) {
return this.client.post(`/app/mul/sheet/${sheetId}/row/batch-create`, payload);
}
update(sheetId, rowId, data, version) {
return this.client.post(`/app/mul/sheet/${sheetId}/row/${rowId}/update`, {
data,
version
});
}
delete(sheetId, rowId) {
return this.client.post(`/app/mul/sheet/${sheetId}/row/${rowId}/delete`);
}
updateCell(sheetId, payload) {
return this.client.post(`/app/mul/sheet/${sheetId}/row/cell`, payload);
}
};
//#endregion
//#region src/sdk/row-acl.ts
var RowAclSDK = class {
constructor(client) {
this.client = client;
}
grant(sheetId, payload) {
return this.client.post("/app/mul/rowAcl/grant", {
sheetId,
...payload
});
}
revoke(sheetId, rowId, target) {
return this.client.post("/app/mul/rowAcl/revoke", {
sheetId,
rowId,
target
});
}
revokeDept(sheetId, rowId, deptId) {
return this.client.post("/app/mul/rowAcl/revokeDeptAccess", {
sheetId,
rowId,
deptId
});
}
revokeRole(sheetId, rowId, roleId) {
return this.client.post("/app/mul/rowAcl/revokeRoleAccess", {
sheetId,
rowId,
roleId
});
}
list(sheetId, rowId) {
return this.client.get("/app/mul/rowAcl/list", {
sheetId,
rowId
});
}
roleAcls(sheetId, roleId) {
return this.client.get("/app/mul/rowAcl/roleAcls", {
sheetId,
roleId
});
}
};
//#endregion
//#region src/sdk/row-policy.ts
var RowPolicySDK = class {
constructor(client) {
this.client = client;
}
list(projectId, sheetId) {
return this.client.get(`/app/mul/project/${projectId}/row_policy/list`, { sheetId });
}
info(projectId, id, sheetId) {
return this.client.get(`/app/mul/project/${projectId}/row_policy/info`, {
id,
sheetId
});
}
create(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/row_policy/add`, payload);
}
update(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/row_policy/update`, payload);
}
delete(projectId, ids, sheetId) {
return this.client.post(`/app/mul/project/${projectId}/row_policy/delete`, {
ids,
sheetId
});
}
toggle(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/row_policy/toggle`, payload);
}
check(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/row_policy/check`, payload);
}
};
//#endregion
//#region src/sdk/view.ts
var ViewSDK = class {
constructor(client) {
this.client = client;
}
list(teamId, projectId, sheetId) {
return this.client.get(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/view/list`);
}
create(teamId, projectId, sheetId, payload) {
return this.client.post(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/view/create`, payload);
}
};
//#endregion
export { getUserAgent as _, RoleSDK as a, ProjectSDK as c, SheetSDK as d, ColumnSDK as f, FlowChatSDK as g, DimensClient as h, RowSDK as i, UploadSDK as l, AuthSDK as m, RowPolicySDK as n, ReportSDK as o, CanvasSDK as p, RowAclSDK as r, PermissionSDK as s, ViewSDK as t, DocumentSDK as u, getVersion as v, version as y };
//# sourceMappingURL=view-dMOh46FK.mjs.map
{"version":3,"file":"view-dMOh46FK.mjs","names":[],"sources":["../src/core/version.ts","../src/sdk/flow-chat.ts","../src/core/http.ts","../src/sdk/client.ts","../src/sdk/auth.ts","../src/sdk/canvas.ts","../src/sdk/column.ts","../src/sdk/sheet.ts","../src/sdk/document.ts","../src/sdk/upload.ts","../src/sdk/project.ts","../src/sdk/permission.ts","../src/sdk/report.ts","../src/sdk/role.ts","../src/sdk/row.ts","../src/sdk/row-acl.ts","../src/sdk/row-policy.ts","../src/sdk/view.ts"],"sourcesContent":["/**\n * 版本信息\n */\n\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { dirname } from 'path';\n\nlet _version: string | undefined;\n\nexport function getVersion(): string {\n if (_version) return _version;\n\n try {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const packageJsonPath = join(__dirname, '..', 'package.json');\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n _version = packageJson.version;\n } catch {\n _version = '1.0.0';\n }\n\n return _version ?? '1.0.0';\n}\n\nexport const version = getVersion();\n\nexport function getUserAgent(): string {\n return `DimensCLI/${version} (Node.js/${process.version})`;\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface FlowChatMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\nexport interface FlowChatCompletionsPayload {\n model?: string | number;\n messages: FlowChatMessage[];\n stream?: boolean;\n user?: string;\n sessionId?: string;\n [key: string]: unknown;\n}\n\nexport interface FlowChatCompletionChoice {\n index?: number;\n message: {\n role: string;\n content: string;\n };\n finish_reason?: string | null;\n}\n\nexport interface FlowChatCompletionResult {\n id: string;\n object?: string;\n created?: number;\n model?: string;\n choices: FlowChatCompletionChoice[];\n usage?: Record<string, unknown>;\n}\n\nexport class FlowChatSDK {\n constructor(private readonly client: DimensClient) {}\n\n completions(\n teamId: string,\n payload: FlowChatCompletionsPayload\n ): Promise<APIResponse<FlowChatCompletionResult>> {\n return this.client.post<FlowChatCompletionResult>(\n `/app/flow/${teamId}/v1/chat/completions`,\n payload\n );\n }\n}\n","export async function requestJson<T>(\n url: string,\n init: RequestInit = {}\n): Promise<T> {\n const response = await fetch(url, init);\n const payload = (await response.json()) as { message?: string };\n\n if (!response.ok) {\n throw new Error(payload?.message || `HTTP ${response.status}`);\n }\n\n return payload as T;\n}\n","import { getUserAgent } from '../core/version';\nimport { requestJson } from '../core/http';\n\nexport interface DimensClientOptions {\n baseUrl: string;\n token?: string;\n refreshToken?: string;\n teamId?: string;\n projectId?: string;\n}\n\nexport interface APIResponse<T> {\n code: number;\n message: string;\n data: T;\n}\n\ntype QueryValue = string | number | boolean | null | undefined;\ntype QueryParams = Record<string, QueryValue>;\ntype HeaderTupleList = Array<[string, string]> | string[][];\ntype HeaderObjectInput = Record<string, string | readonly string[]>;\n\nexport class DimensClient {\n private readonly options: DimensClientOptions;\n\n constructor(options: DimensClientOptions) {\n this.options = options;\n }\n\n getOptions(): DimensClientOptions {\n return { ...this.options };\n }\n\n async get<T>(\n path: string,\n query?: QueryParams,\n init: RequestInit = {}\n ): Promise<APIResponse<T>> {\n return requestJson<APIResponse<T>>(this.buildUrl(path, query), {\n ...init,\n method: 'GET',\n headers: this.buildHeaders(init.headers),\n });\n }\n\n async post<T>(\n path: string,\n body?: unknown,\n init: RequestInit = {}\n ): Promise<APIResponse<T>> {\n const requestInit: RequestInit = {\n ...init,\n method: 'POST',\n headers: this.buildHeaders(init.headers, true),\n };\n\n if (body !== undefined) {\n requestInit.body = JSON.stringify(body);\n }\n\n return requestJson<APIResponse<T>>(this.buildUrl(path), requestInit);\n }\n\n async postFormData<T>(\n path: string,\n formData: FormData,\n init: RequestInit = {}\n ): Promise<APIResponse<T>> {\n const requestInit: RequestInit = {\n ...init,\n method: 'POST',\n headers: this.buildHeaders(init.headers, false, true),\n body: formData,\n };\n\n return requestJson<APIResponse<T>>(this.buildUrl(path), requestInit);\n }\n\n private buildUrl(path: string, query?: QueryParams): string {\n const base = this.options.baseUrl.replace(/\\/+$/, '');\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${base}${normalizedPath}`);\n\n Object.entries(query || {}).forEach(([key, value]) => {\n if (value === undefined || value === null || value === '') {\n return;\n }\n url.searchParams.set(key, String(value));\n });\n\n return url.toString();\n }\n\n private buildHeaders(\n headers?: unknown,\n hasJsonBody = false,\n hasFormDataBody = false\n ): Record<string, string> {\n const merged = normalizeHeaders(headers);\n merged.Accept = 'application/json';\n merged['User-Agent'] = getUserAgent();\n\n if (hasJsonBody && !hasFormDataBody) {\n merged['Content-Type'] = 'application/json';\n }\n if (hasFormDataBody) {\n delete merged['Content-Type'];\n }\n if (this.options.token) {\n merged.Authorization = `Bearer ${this.options.token}`;\n }\n if (this.options.refreshToken) {\n merged['X-Refresh-Token'] = this.options.refreshToken;\n }\n\n return merged;\n }\n}\n\nfunction normalizeHeaders(headers?: unknown): Record<string, string> {\n if (!headers) {\n return {};\n }\n if (typeof Headers !== 'undefined' && headers instanceof Headers) {\n return Object.fromEntries(headers.entries());\n }\n if (Array.isArray(headers)) {\n return Object.fromEntries(\n (headers as HeaderTupleList).map(([key, value]) => [String(key), String(value)])\n );\n }\n const normalized: Record<string, string> = {};\n Object.entries(headers as HeaderObjectInput).forEach(([key, value]) => {\n normalized[key] = typeof value === 'string' ? value : value.join(', ');\n });\n return normalized;\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface LoginPayload {\n username: string;\n password: string;\n captchaId?: string;\n verifyCode?: string;\n}\n\nexport interface ApiKeyLoginPayload {\n apiKey: string;\n apiSecret: string;\n}\n\nexport interface LoginResult {\n token: string;\n refreshToken?: string;\n expire?: number;\n userInfo?: Record<string, unknown>;\n}\n\nexport interface RefreshTokenResult {\n token: string;\n refreshToken?: string;\n expire?: number;\n}\n\nexport class AuthSDK {\n constructor(private readonly client: DimensClient) {}\n\n login(payload: LoginPayload): Promise<APIResponse<LoginResult>> {\n return this.client.post<LoginResult>('/login', payload);\n }\n\n loginByApiKey(payload: ApiKeyLoginPayload): Promise<APIResponse<LoginResult>> {\n return this.client.post<LoginResult>('/open/user/login/apiKey', payload);\n }\n\n exchangeTokenByApiKey(\n payload: ApiKeyLoginPayload\n ): Promise<APIResponse<LoginResult>> {\n return this.loginByApiKey(payload);\n }\n\n refreshToken(): Promise<APIResponse<RefreshTokenResult>> {\n return this.client.get<RefreshTokenResult>('/refreshToken');\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface CanvasGraphValue {\n nodes: unknown[];\n edges: unknown[];\n viewport?: {\n x: number;\n y: number;\n zoom: number;\n };\n meta?: Record<string, unknown>;\n}\n\nexport interface CanvasInfo {\n canvasId: string;\n sheetId: string;\n teamId?: string;\n projectId: string;\n name: string;\n data: CanvasGraphValue;\n dataHash?: string;\n version: number;\n lastEditorId?: number;\n [key: string]: unknown;\n}\n\nexport interface CanvasCreatePayload {\n name: string;\n folderId?: string;\n data?: CanvasGraphValue;\n}\n\nexport interface CanvasSavePayload {\n sheetId: string;\n data: CanvasGraphValue;\n baseVersion: number;\n changeSummary?: string;\n}\n\nexport interface CanvasVersionListPayload {\n sheetId: string;\n page?: number;\n size?: number;\n}\n\nexport interface CanvasVersionItem {\n id: string | number;\n canvasId: string;\n sheetId: string;\n version: number;\n changeSummary?: string;\n source?: string;\n createdBy?: number;\n createTime?: string;\n snapshot?: CanvasGraphValue;\n [key: string]: unknown;\n}\n\nexport interface CanvasVersionListResult {\n list: CanvasVersionItem[];\n pagination?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface CanvasRestorePayload {\n sheetId: string;\n version: number;\n}\n\nexport interface CanvasResourcePayload {\n projectId?: string;\n sheetId?: string;\n name: string;\n description?: string;\n nodes: unknown[];\n edges?: unknown[];\n tags?: string[];\n cover?: string;\n}\n\nexport interface CanvasResourceItem extends CanvasResourcePayload {\n id: string;\n visibility?: 'private' | 'market';\n status?: number;\n createdBy?: number;\n createTime?: string;\n updateTime?: string;\n publishTime?: string;\n [key: string]: unknown;\n}\n\nexport interface CanvasCreateResult {\n sheetId: string;\n canvasId: string;\n type?: string;\n name?: string;\n [key: string]: unknown;\n}\n\nconst EMPTY_GRAPH: CanvasGraphValue = {\n nodes: [],\n edges: [],\n viewport: { x: 0, y: 0, zoom: 1 },\n};\n\nexport class CanvasSDK {\n constructor(private readonly client: DimensClient) {}\n\n private normalizeCreatedCanvas(data: Record<string, unknown>): CanvasCreateResult {\n const sheetId =\n typeof data.sheetId === 'string'\n ? data.sheetId\n : typeof data.id === 'string'\n ? data.id\n : '';\n return {\n ...data,\n sheetId,\n canvasId: sheetId,\n } as CanvasCreateResult;\n }\n\n async create(\n projectId: string,\n payload: CanvasCreatePayload\n ): Promise<APIResponse<CanvasCreateResult>> {\n const response = await this.client.post<Record<string, unknown>>(\n `/app/mul/project/${projectId}/sheet/create`,\n {\n name: payload.name,\n type: 'canvas',\n ...(payload.folderId ? { folderId: payload.folderId } : {}),\n config: {\n data: payload.data ?? EMPTY_GRAPH,\n },\n }\n );\n return {\n ...response,\n data: this.normalizeCreatedCanvas((response.data || {}) as Record<string, unknown>),\n };\n }\n\n info(teamId: string, projectId: string, sheetId: string): Promise<APIResponse<CanvasInfo>> {\n return this.client.get<CanvasInfo>(`/app/canvas/${teamId}/${projectId}/info`, {\n sheetId,\n });\n }\n\n save(\n teamId: string,\n projectId: string,\n payload: CanvasSavePayload\n ): Promise<APIResponse<CanvasInfo>> {\n return this.client.post<CanvasInfo>(`/app/canvas/${teamId}/${projectId}/save`, payload);\n }\n\n versions(\n teamId: string,\n projectId: string,\n payload: CanvasVersionListPayload\n ): Promise<APIResponse<CanvasVersionListResult>> {\n return this.client.post<CanvasVersionListResult>(\n `/app/canvas/${teamId}/${projectId}/versions`,\n payload\n );\n }\n\n version(\n teamId: string,\n projectId: string,\n sheetId: string,\n version: number\n ): Promise<APIResponse<CanvasVersionItem>> {\n return this.client.get<CanvasVersionItem>(`/app/canvas/${teamId}/${projectId}/version`, {\n sheetId,\n version,\n });\n }\n\n restore(\n teamId: string,\n projectId: string,\n payload: CanvasRestorePayload\n ): Promise<APIResponse<CanvasInfo>> {\n return this.client.post<CanvasInfo>(`/app/canvas/${teamId}/${projectId}/restore`, payload);\n }\n\n listMineResources(\n teamId: string,\n keyword?: string\n ): Promise<APIResponse<CanvasResourceItem[]>> {\n return this.client.get<CanvasResourceItem[]>(`/app/canvas/${teamId}/resource/mine`, {\n keyword,\n });\n }\n\n saveMineResource(\n teamId: string,\n payload: CanvasResourcePayload\n ): Promise<APIResponse<CanvasResourceItem>> {\n return this.client.post<CanvasResourceItem>(`/app/canvas/${teamId}/resource/mine`, payload);\n }\n\n removeMineResource(teamId: string, id: string): Promise<APIResponse<boolean>> {\n return this.client.post<boolean>(`/app/canvas/${teamId}/resource/mine/delete`, { id });\n }\n\n publishMineResource(\n teamId: string,\n id: string\n ): Promise<APIResponse<CanvasResourceItem>> {\n return this.client.post<CanvasResourceItem>(`/app/canvas/${teamId}/resource/mine/publish`, {\n id,\n });\n }\n\n listMarketResources(\n teamId: string,\n keyword?: string\n ): Promise<APIResponse<CanvasResourceItem[]>> {\n return this.client.get<CanvasResourceItem[]>(`/app/canvas/${teamId}/resource/market`, {\n keyword,\n });\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface ColumnInfo {\n id: string;\n title?: string;\n label?: string;\n type?: string;\n [key: string]: unknown;\n}\n\nexport interface ColumnMutationPayload {\n title?: string;\n label?: string;\n type?: string;\n description?: string;\n config?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport class ColumnSDK {\n constructor(private readonly client: DimensClient) {}\n\n list(\n teamId: string,\n projectId: string,\n sheetId: string\n ): Promise<APIResponse<ColumnInfo[]>> {\n return this.client.get<ColumnInfo[]>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/column/list`\n );\n }\n\n create(\n teamId: string,\n projectId: string,\n sheetId: string,\n payload: ColumnMutationPayload\n ): Promise<APIResponse<ColumnInfo>> {\n return this.client.post<ColumnInfo>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/column/create`,\n payload\n );\n }\n\n update(\n sheetId: string,\n fieldId: string,\n payload: ColumnMutationPayload\n ): Promise<APIResponse<ColumnInfo>> {\n return this.client.post<ColumnInfo>(\n `/app/mul/sheet/${sheetId}/column/${fieldId}/update`,\n payload\n );\n }\n\n delete(sheetId: string, fieldId: string): Promise<APIResponse<boolean>> {\n return this.client.post<boolean>(`/app/mul/sheet/${sheetId}/column/${fieldId}/delete`);\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface SheetInfo {\n id: string;\n name?: string;\n [key: string]: unknown;\n}\n\nexport interface SheetMutationPayload {\n name?: string;\n icon?: string;\n type?: 'sheet' | 'folder' | 'document' | 'report' | 'canvas';\n folderId?: string;\n [key: string]: unknown;\n}\n\nexport class SheetSDK {\n constructor(private readonly client: DimensClient) {}\n\n list(projectId: string): Promise<APIResponse<SheetInfo[]>> {\n return this.client.get<SheetInfo[]>(`/app/mul/project/${projectId}/sheet/list`);\n }\n\n tree(projectId: string): Promise<APIResponse<unknown[]>> {\n return this.client.get<unknown[]>(`/app/mul/project/${projectId}/sheet/tree`);\n }\n\n create(projectId: string, payload: SheetMutationPayload): Promise<APIResponse<SheetInfo>> {\n return this.client.post<SheetInfo>(`/app/mul/project/${projectId}/sheet/create`, payload);\n }\n\n info(teamId: string, projectId: string, sheetId: string): Promise<APIResponse<SheetInfo>> {\n return this.client.get<SheetInfo>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/info`\n );\n }\n\n update(\n teamId: string,\n projectId: string,\n sheetId: string,\n payload: SheetMutationPayload\n ): Promise<APIResponse<SheetInfo>> {\n return this.client.post<SheetInfo>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/update`,\n payload\n );\n }\n\n delete(teamId: string, projectId: string, sheetId: string): Promise<APIResponse<boolean>> {\n return this.client.post<boolean>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/delete`\n );\n }\n\n structure(sheetId: string): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.get<Record<string, unknown>>(`/app/mul/sheet/${sheetId}/structure`);\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface DocumentInfo {\n documentId: string;\n sheetId?: string;\n rowId?: string;\n title?: string;\n content?: string;\n format?: 'richtext' | 'markdown' | 'html';\n version?: number;\n [key: string]: unknown;\n}\n\nexport interface DocumentCreateWithSheetPayload {\n parentId?: string;\n title: string;\n content?: string;\n format?: 'richtext' | 'markdown' | 'html';\n}\n\nexport interface DocumentUpdatePayload {\n documentId: string;\n content: string;\n version: number;\n createVersion?: boolean;\n changeSummary?: string;\n}\n\nexport interface DocumentVersionsQuery {\n documentId: string;\n page?: number;\n size?: number;\n [key: string]: string | number | boolean | null | undefined;\n}\n\nexport interface DocumentVersionQuery {\n documentId: string;\n version: number;\n [key: string]: string | number | boolean | null | undefined;\n}\n\nexport interface DocumentRestorePayload {\n documentId: string;\n version: number;\n}\n\nexport interface DocumentCreateWithSheetResult {\n sheet: Record<string, unknown>;\n document: DocumentInfo;\n}\n\nexport class DocumentSDK {\n constructor(private readonly client: DimensClient) {}\n\n createWithSheet(\n teamId: string,\n projectId: string,\n payload: DocumentCreateWithSheetPayload\n ): Promise<APIResponse<DocumentCreateWithSheetResult>> {\n return this.client.post<DocumentCreateWithSheetResult>(\n `/app/documents/${teamId}/${projectId}/document/createWithSheet`,\n payload\n );\n }\n\n info(teamId: string, projectId: string, documentId: string): Promise<APIResponse<DocumentInfo>> {\n return this.client.get<DocumentInfo>(\n `/app/documents/${teamId}/${projectId}/document/${documentId}/info`\n );\n }\n\n getBySheetId(\n teamId: string,\n projectId: string,\n sheetId: string\n ): Promise<APIResponse<DocumentInfo>> {\n return this.client.get<DocumentInfo>(\n `/app/documents/${teamId}/${projectId}/document/getBySheetId`,\n { sheetId }\n );\n }\n\n update(\n teamId: string,\n projectId: string,\n payload: DocumentUpdatePayload\n ): Promise<APIResponse<DocumentInfo>> {\n return this.client.post<DocumentInfo>(\n `/app/documents/${teamId}/${projectId}/document/update`,\n payload\n );\n }\n\n delete(\n teamId: string,\n projectId: string,\n documentId: string\n ): Promise<APIResponse<{ success?: boolean } | boolean>> {\n return this.client.post<{ success?: boolean } | boolean>(\n `/app/documents/${teamId}/${projectId}/document/delete`,\n { documentId }\n );\n }\n\n versions(\n teamId: string,\n projectId: string,\n query: DocumentVersionsQuery\n ): Promise<APIResponse<unknown>> {\n return this.client.get<unknown>(`/app/documents/${teamId}/${projectId}/document/versions`, query);\n }\n\n version(\n teamId: string,\n projectId: string,\n query: DocumentVersionQuery\n ): Promise<APIResponse<unknown>> {\n return this.client.get<unknown>(`/app/documents/${teamId}/${projectId}/document/version`, query);\n }\n\n restore(\n teamId: string,\n projectId: string,\n payload: DocumentRestorePayload\n ): Promise<APIResponse<DocumentInfo>> {\n return this.client.post<DocumentInfo>(\n `/app/documents/${teamId}/${projectId}/document/restore`,\n payload\n );\n }\n}\n","import { basename } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface UploadResponse {\n id?: string;\n fileId?: string;\n key?: string;\n url?: string;\n name?: string;\n size?: number;\n type?: string;\n mimeType?: string;\n ext?: string;\n [key: string]: unknown;\n}\n\nexport interface UploadFileOptions {\n key?: string;\n type?: string;\n bizType?: string;\n scene?: string;\n teamId?: string;\n projectId?: string;\n source?: string;\n name?: string;\n size?: string;\n mimeType?: string;\n classifyId?: string;\n [key: string]: string | undefined;\n}\n\nexport interface UploadModeResult {\n mode?: string;\n type?: string;\n [key: string]: unknown;\n}\n\nexport class UploadSDK {\n constructor(private readonly client: DimensClient) {}\n\n async uploadFile(\n filePath: string,\n keyOrOptions?: string | UploadFileOptions\n ): Promise<APIResponse<UploadResponse>> {\n const fileBuffer = await readFile(filePath);\n const fileName = basename(filePath);\n const file = new File([fileBuffer], fileName, {\n type: resolveMimeType(fileName),\n lastModified: Date.now(),\n });\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n\n const options =\n typeof keyOrOptions === 'string'\n ? { key: keyOrOptions }\n : (keyOrOptions ?? {});\n\n if (!options.name) {\n options.name = file.name;\n }\n if (!options.size) {\n options.size = String(file.size);\n }\n if (!options.mimeType) {\n options.mimeType = file.type;\n }\n\n Object.entries(options).forEach(([field, value]) => {\n if (!value) {\n return;\n }\n formData.append(field, value);\n });\n\n return this.client.postFormData<UploadResponse>('/app/base/comm/upload', formData);\n }\n\n async getMode(): Promise<APIResponse<UploadModeResult>> {\n return this.client.get<UploadModeResult>('/app/base/comm/uploadMode');\n }\n}\n\nfunction resolveMimeType(fileName: string): string {\n const lowerFileName = fileName.toLowerCase();\n\n if (lowerFileName.endsWith('.txt')) {\n return 'text/plain';\n }\n if (lowerFileName.endsWith('.json')) {\n return 'application/json';\n }\n if (lowerFileName.endsWith('.pdf')) {\n return 'application/pdf';\n }\n if (lowerFileName.endsWith('.png')) {\n return 'image/png';\n }\n if (lowerFileName.endsWith('.jpg') || lowerFileName.endsWith('.jpeg')) {\n return 'image/jpeg';\n }\n if (lowerFileName.endsWith('.gif')) {\n return 'image/gif';\n }\n if (lowerFileName.endsWith('.svg')) {\n return 'image/svg+xml';\n }\n if (lowerFileName.endsWith('.csv')) {\n return 'text/csv';\n }\n\n return 'application/octet-stream';\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface ProjectInfo {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\nexport interface ProjectPagePayload {\n page?: number;\n size?: number;\n keyword?: string;\n [key: string]: unknown;\n}\n\nexport interface ProjectPageResult {\n list: ProjectInfo[];\n pagination?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface ProjectMutationPayload {\n id?: string;\n name?: string;\n description?: string;\n icon?: string;\n remark?: string;\n projectType?: string;\n coverImage?: string;\n [key: string]: unknown;\n}\n\nexport class ProjectSDK {\n constructor(private readonly client: DimensClient) {}\n\n page(teamId: string, payload: ProjectPagePayload): Promise<APIResponse<ProjectPageResult>> {\n return this.client.post<ProjectPageResult>(`/app/org/${teamId}/project/page`, payload);\n }\n\n info(teamId: string, id: string): Promise<APIResponse<ProjectInfo>> {\n return this.client.get<ProjectInfo>(`/app/org/${teamId}/project/info`, { id });\n }\n\n create(\n teamId: string,\n payload: ProjectMutationPayload\n ): Promise<APIResponse<ProjectInfo>> {\n return this.client.post<ProjectInfo>(`/app/org/${teamId}/project/add`, payload);\n }\n\n update(\n teamId: string,\n payload: ProjectMutationPayload\n ): Promise<APIResponse<ProjectInfo>> {\n return this.client.post<ProjectInfo>(`/app/org/${teamId}/project/update`, payload);\n }\n\n trash(teamId: string, ids: string[]): Promise<APIResponse<boolean>> {\n return this.client.post<boolean>(`/app/org/${teamId}/project/trash`, { ids });\n }\n\n restore(teamId: string, ids: string[]): Promise<APIResponse<boolean>> {\n return this.client.post<boolean>(`/app/org/${teamId}/project/restore`, { ids });\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport type ResourceType = 'sheet' | 'document' | 'report' | 'page' | 'micro_module';\n\nexport interface ResourcePermission {\n visible: boolean;\n editable: boolean;\n}\n\nexport interface PermissionInfo {\n id?: number;\n roleId?: string;\n sheetId?: string;\n dataAccess?: string;\n canRead?: boolean;\n canWrite?: boolean;\n columnVisibility?: Record<string, boolean>;\n columnReadonly?: Record<string, boolean>;\n resourceId?: string;\n resourceType?: ResourceType;\n resourcePermission?: ResourcePermission;\n [key: string]: unknown;\n}\n\nexport interface PermissionMutationPayload extends PermissionInfo {}\n\nexport interface PermissionUpdatePayload {\n id: number;\n data: PermissionMutationPayload;\n sheetId: string;\n}\n\nexport interface ResourcePermissionUpdatePayload {\n roleId: string;\n resourceId: string;\n resourceType: ResourceType;\n permission: Partial<ResourcePermission>;\n}\n\nexport class PermissionSDK {\n constructor(private readonly client: DimensClient) {}\n\n list(projectId: string, sheetId?: string): Promise<APIResponse<PermissionInfo[]>> {\n return this.client.get<PermissionInfo[]>(\n `/app/mul/project/${projectId}/permission/list`,\n { sheetId }\n );\n }\n\n info(projectId: string, id: number, sheetId: string): Promise<APIResponse<PermissionInfo>> {\n return this.client.get<PermissionInfo>(`/app/mul/project/${projectId}/permission/info`, {\n id,\n sheetId,\n });\n }\n\n create(projectId: string, payload: PermissionMutationPayload): Promise<APIResponse<PermissionInfo>> {\n return this.client.post<PermissionInfo>(\n `/app/mul/project/${projectId}/permission/add`,\n payload\n );\n }\n\n update(projectId: string, payload: PermissionUpdatePayload): Promise<APIResponse<PermissionInfo>> {\n return this.client.post<PermissionInfo>(\n `/app/mul/project/${projectId}/permission/update`,\n payload\n );\n }\n\n delete(projectId: string, ids: number[], sheetId: string): Promise<APIResponse<unknown[]>> {\n return this.client.post<unknown[]>(`/app/mul/project/${projectId}/permission/delete`, {\n ids,\n sheetId,\n });\n }\n\n check(\n projectId: string,\n payload: { userId: number; sheetId: string; action: 'view' | 'edit' | 'delete' | 'manage' | 'schema' }\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.get<Record<string, unknown>>(\n `/app/mul/project/${projectId}/permission/check`,\n payload\n );\n }\n\n batch(projectId: string, sheetId: string, permissions: PermissionMutationPayload[]): Promise<APIResponse<unknown[]>> {\n return this.client.post<unknown[]>(`/app/mul/project/${projectId}/permission/batch`, {\n sheetId,\n permissions,\n });\n }\n\n updateResourcePermission(\n projectId: string,\n payload: ResourcePermissionUpdatePayload\n ): Promise<APIResponse<PermissionInfo>> {\n return this.client.post<PermissionInfo>(\n `/app/mul/project/${projectId}/permission/updateResourcePermission`,\n payload\n );\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface ReportInfo {\n reportId: string;\n projectId?: string;\n name?: string;\n description?: string;\n type?: number | string;\n config?: Record<string, unknown>;\n widgets?: Array<Record<string, unknown>>;\n parameters?: Array<Record<string, unknown>>;\n [key: string]: unknown;\n}\n\nexport interface ReportListPayload {\n keyword?: string;\n type?: number | string;\n status?: number;\n page?: number;\n size?: number;\n}\n\nexport interface ReportListResult {\n list: ReportInfo[];\n pagination?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface ReportCreatePayload {\n name: string;\n description?: string;\n type?: number | string;\n config?: Record<string, unknown>;\n widgets?: Array<Record<string, unknown>>;\n parameters?: Array<Record<string, unknown>>;\n}\n\nexport interface ReportCreateResult {\n reportId: string;\n sheetId?: string;\n [key: string]: unknown;\n}\n\nexport interface ProjectReportCreatePayload {\n name: string;\n description?: string;\n dashboardId?: string;\n createdAt?: number;\n}\n\nexport interface ReportUpdatePayload {\n reportId: string;\n name?: string;\n description?: string;\n type?: number | string;\n config?: Record<string, unknown>;\n widgets?: Array<Record<string, unknown>>;\n parameters?: Array<Record<string, unknown>>;\n}\n\nexport interface ReportDeletePayload {\n reportId: string;\n}\n\nexport interface ReportCopyPayload {\n reportId: string;\n name?: string;\n}\n\nexport interface ReportSortPayload {\n reportId: string;\n targetIndex: number;\n}\n\nexport interface ReportMovePayload {\n reportId: string;\n targetProjectId: string;\n}\n\nexport interface ReportPublishPayload {\n reportId: string;\n isPublic: number;\n}\n\nexport interface ReportQueryPayload {\n reportId: string;\n parameterValues?: Record<string, unknown>;\n widgetIds?: string[];\n}\n\nexport type ReportQueryResult = Record<string, unknown>;\n\nexport interface ReportQueryWidgetPayload {\n reportId: string;\n widgetId: string;\n parameterValues?: Record<string, unknown>;\n dataSource?: Record<string, unknown>;\n dataMapping?: Record<string, unknown>;\n}\n\nexport interface ReportPreviewPayload {\n dataSource: Record<string, unknown>;\n dataMapping?: Record<string, unknown>;\n parameterValues?: Record<string, unknown>;\n}\n\nexport interface ReportValidatePayload {\n config: Record<string, unknown>;\n}\n\nexport interface ReportWidgetPayload {\n reportId: string;\n type: string;\n title?: string;\n description?: string;\n dataSource: Record<string, unknown>;\n layout?: Record<string, unknown>;\n dataMapping?: Record<string, unknown>;\n chartConfig?: Record<string, unknown>;\n orderNum?: number;\n parentId?: string;\n visibility?: Record<string, unknown>;\n}\n\nexport interface ReportWidgetUpdatePayload {\n widgetId: string;\n type?: string;\n title?: string;\n description?: string;\n dataSource?: Record<string, unknown>;\n layout?: Record<string, unknown>;\n dataMapping?: Record<string, unknown>;\n chartConfig?: Record<string, unknown> | null;\n orderNum?: number;\n parentId?: string;\n visibility?: Record<string, unknown>;\n}\n\nexport interface ReportWidgetDeletePayload {\n widgetId: string;\n}\n\nexport interface ReportWidgetBatchPayload {\n reportId: string;\n widgets: Array<Record<string, unknown>>;\n}\n\nexport interface ReportWidgetSortPayload {\n reportId: string;\n widgetId: string;\n targetOrder: number;\n}\n\nexport interface ReportWidgetResult {\n widgetId: string;\n [key: string]: unknown;\n}\n\nexport class ReportSDK {\n constructor(private readonly client: DimensClient) {}\n\n private normalizeProjectReport(data: Record<string, unknown>): ReportCreateResult {\n const reportId =\n typeof data.reportId === 'string'\n ? data.reportId\n : typeof data.sheetId === 'string'\n ? data.sheetId\n : typeof data.id === 'string'\n ? data.id\n : '';\n return {\n ...data,\n reportId,\n sheetId: typeof data.sheetId === 'string' ? data.sheetId : reportId,\n } as ReportCreateResult;\n }\n\n list(\n projectId: string,\n payload: ReportListPayload\n ): Promise<APIResponse<ReportListResult>> {\n return this.client.post<ReportListResult>(`/app/report/${projectId}/list`, payload);\n }\n\n info(projectId: string, reportId: string): Promise<APIResponse<ReportInfo | null>> {\n return this.client.get<ReportInfo | null>(`/app/report/${projectId}/info`, { reportId });\n }\n\n create(\n projectId: string,\n payload: ReportCreatePayload\n ): Promise<APIResponse<ReportCreateResult>> {\n return this.client.post<ReportCreateResult>(`/app/report/${projectId}/add`, payload);\n }\n\n async createProjectReport(\n projectId: string,\n payload: ProjectReportCreatePayload\n ): Promise<APIResponse<ReportCreateResult>> {\n const response = await this.client.post<Record<string, unknown>>(\n `/app/mul/project/${projectId}/sheet/create`,\n {\n name: payload.name,\n type: 'report',\n config: {\n dashboardConfig: {\n id: payload.dashboardId || `dashboard_${Date.now()}`,\n title: payload.name,\n ...(payload.description ? { description: payload.description } : {}),\n widgets: [],\n parameters: [],\n createdAt: payload.createdAt || Date.now(),\n },\n },\n }\n );\n return {\n ...response,\n data: this.normalizeProjectReport((response.data || {}) as Record<string, unknown>),\n };\n }\n\n update(\n projectId: string,\n payload: ReportUpdatePayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/update`, payload);\n }\n\n copy(\n projectId: string,\n payload: ReportCopyPayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/copy`, payload);\n }\n\n publish(\n projectId: string,\n payload: ReportPublishPayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/publish`, payload);\n }\n\n delete(\n projectId: string,\n payload: ReportDeletePayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/delete`, payload);\n }\n\n archive(\n projectId: string,\n payload: ReportDeletePayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/archive`, payload);\n }\n\n sort(\n projectId: string,\n payload: ReportSortPayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/sort`, payload);\n }\n\n move(\n projectId: string,\n payload: ReportMovePayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/move`, payload);\n }\n\n query(\n projectId: string,\n payload: ReportQueryPayload\n ): Promise<APIResponse<ReportQueryResult>> {\n return this.client.post<ReportQueryResult>(`/app/report/query/${projectId}`, payload);\n }\n\n queryWidget(\n projectId: string,\n payload: ReportQueryWidgetPayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/report/query/${projectId}/widget`,\n payload\n );\n }\n\n preview(\n projectId: string,\n payload: ReportPreviewPayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/report/query/${projectId}/preview`,\n payload\n );\n }\n\n validate(\n projectId: string,\n payload: ReportValidatePayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/validate`, payload);\n }\n\n addWidget(\n projectId: string,\n payload: ReportWidgetPayload\n ): Promise<APIResponse<ReportWidgetResult>> {\n return this.client.post<ReportWidgetResult>(`/app/report/widget/${projectId}/add`, payload);\n }\n\n updateWidget(\n projectId: string,\n payload: ReportWidgetUpdatePayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/report/widget/${projectId}/update`,\n payload\n );\n }\n\n deleteWidget(\n projectId: string,\n payload: ReportWidgetDeletePayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/report/widget/${projectId}/delete`,\n payload\n );\n }\n\n batchWidgets(\n projectId: string,\n payload: ReportWidgetBatchPayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/report/widget/${projectId}/batch`,\n payload\n );\n }\n\n sortWidget(\n projectId: string,\n payload: ReportWidgetSortPayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/report/widget/${projectId}/sort`,\n payload\n );\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface RoleInfo {\n roleId: string;\n name: string;\n description?: string;\n isSystem?: boolean;\n canManageSheets?: boolean;\n canEditSchema?: boolean;\n canEditData?: boolean;\n [key: string]: unknown;\n}\n\nexport interface RoleMutationPayload {\n name?: string;\n description?: string;\n isSystem?: boolean;\n canManageSheets?: boolean;\n canEditSchema?: boolean;\n canEditData?: boolean;\n [key: string]: unknown;\n}\n\nexport interface RoleUpdatePayload {\n roleId: string;\n data: RoleMutationPayload;\n}\n\nexport interface RoleAssignUserPayload {\n roleId: string;\n userId: number;\n sheetId?: string;\n}\n\nexport class RoleSDK {\n constructor(private readonly client: DimensClient) {}\n\n list(projectId: string): Promise<APIResponse<RoleInfo[]>> {\n return this.client.get<RoleInfo[]>(`/app/mul/project/${projectId}/role/list`);\n }\n\n info(projectId: string, roleId: string): Promise<APIResponse<RoleInfo>> {\n return this.client.get<RoleInfo>(`/app/mul/project/${projectId}/role/info`, { roleId });\n }\n\n create(projectId: string, payload: RoleMutationPayload): Promise<APIResponse<RoleInfo>> {\n return this.client.post<RoleInfo>(`/app/mul/project/${projectId}/role/add`, payload);\n }\n\n update(projectId: string, payload: RoleUpdatePayload): Promise<APIResponse<RoleInfo>> {\n return this.client.post<RoleInfo>(`/app/mul/project/${projectId}/role/update`, payload);\n }\n\n delete(projectId: string, roleIds: string[]): Promise<APIResponse<Array<{ success: boolean; message?: string }>>> {\n return this.client.post<Array<{ success: boolean; message?: string }>>(\n `/app/mul/project/${projectId}/role/delete`,\n { roleIds }\n );\n }\n\n assignUser(projectId: string, payload: RoleAssignUserPayload): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/mul/project/${projectId}/role/assignUser`,\n payload\n );\n }\n\n removeUser(projectId: string, payload: RoleAssignUserPayload): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/mul/project/${projectId}/role/removeUser`,\n payload\n );\n }\n\n userRoles(\n projectId: string,\n userId: number,\n sheetId?: string\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.get<Record<string, unknown>>(\n `/app/mul/project/${projectId}/role/userRoles`,\n { userId, sheetId }\n );\n }\n\n roleUsers(projectId: string, roleId: string): Promise<APIResponse<Record<string, unknown>[]>> {\n return this.client.get<Record<string, unknown>[]>(\n `/app/mul/project/${projectId}/role/roleUsers`,\n { roleId }\n );\n }\n\n projectUsers(projectId: string): Promise<APIResponse<Record<string, unknown>[]>> {\n return this.client.get<Record<string, unknown>[]>(\n `/app/mul/project/${projectId}/role/projectUsers`\n );\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface RowInfo {\n id: string;\n [key: string]: unknown;\n}\n\nexport interface RowPagePayload {\n page?: number;\n size?: number;\n viewId?: string;\n filters?: unknown[];\n sorter?: unknown;\n [key: string]: unknown;\n}\n\nexport interface RowPageResult {\n list: RowInfo[];\n total?: number;\n [key: string]: unknown;\n}\n\nexport interface RowCreatePayload {\n data?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface RowBatchCreatePayload {\n rows: Array<{ data: Record<string, unknown> }>;\n}\n\nexport interface RowCellPayload {\n rowId: string;\n fieldId: string;\n value: unknown;\n version?: number;\n [key: string]: unknown;\n}\n\nexport class RowSDK {\n constructor(private readonly client: DimensClient) {}\n\n page(\n teamId: string,\n projectId: string,\n sheetId: string,\n payload: RowPagePayload\n ): Promise<APIResponse<RowPageResult>> {\n return this.client.post<RowPageResult>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/row/page`,\n payload\n );\n }\n\n info(\n teamId: string,\n projectId: string,\n sheetId: string,\n rowId: string\n ): Promise<APIResponse<RowInfo>> {\n return this.client.get<RowInfo>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/row/${rowId}/info`\n );\n }\n\n create(sheetId: string, payload: RowCreatePayload): Promise<APIResponse<RowInfo>> {\n return this.client.post<RowInfo>(`/app/mul/sheet/${sheetId}/row/create`, payload);\n }\n\n batchCreate(\n sheetId: string,\n payload: RowBatchCreatePayload\n ): Promise<APIResponse<RowInfo[]>> {\n return this.client.post<RowInfo[]>(\n `/app/mul/sheet/${sheetId}/row/batch-create`,\n payload\n );\n }\n\n update(\n sheetId: string,\n rowId: string,\n data: Record<string, unknown>,\n version: number\n ): Promise<APIResponse<RowInfo>> {\n return this.client.post<RowInfo>(`/app/mul/sheet/${sheetId}/row/${rowId}/update`, {\n data,\n version,\n });\n }\n\n delete(sheetId: string, rowId: string): Promise<APIResponse<boolean>> {\n return this.client.post<boolean>(`/app/mul/sheet/${sheetId}/row/${rowId}/delete`);\n }\n\n updateCell(sheetId: string, payload: RowCellPayload): Promise<APIResponse<boolean>> {\n return this.client.post<boolean>(`/app/mul/sheet/${sheetId}/row/cell`, payload);\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface RowAclTarget {\n userId?: number;\n deptId?: number;\n roleId?: string;\n}\n\nexport interface RowAclGrantPayload {\n rowId: string;\n target: RowAclTarget;\n permission: string;\n expiresAt?: string;\n canTransfer?: boolean;\n}\n\nexport class RowAclSDK {\n constructor(private readonly client: DimensClient) {}\n\n grant(sheetId: string, payload: RowAclGrantPayload): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>('/app/mul/rowAcl/grant', {\n sheetId,\n ...payload,\n });\n }\n\n revoke(sheetId: string, rowId: string, target: RowAclTarget): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>('/app/mul/rowAcl/revoke', {\n sheetId,\n rowId,\n target,\n });\n }\n\n revokeDept(sheetId: string, rowId: string, deptId: number): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>('/app/mul/rowAcl/revokeDeptAccess', {\n sheetId,\n rowId,\n deptId,\n });\n }\n\n revokeRole(sheetId: string, rowId: string, roleId: string): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>('/app/mul/rowAcl/revokeRoleAccess', {\n sheetId,\n rowId,\n roleId,\n });\n }\n\n list(sheetId: string, rowId: string): Promise<APIResponse<Record<string, unknown>[]>> {\n return this.client.get<Record<string, unknown>[]>('/app/mul/rowAcl/list', {\n sheetId,\n rowId,\n });\n }\n\n roleAcls(sheetId: string, roleId: string): Promise<APIResponse<Record<string, unknown>[]>> {\n return this.client.get<Record<string, unknown>[]>('/app/mul/rowAcl/roleAcls', {\n sheetId,\n roleId,\n });\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface RowPolicyCondition {\n columnId: string;\n operator: string;\n value: unknown;\n [key: string]: unknown;\n}\n\nexport interface RowPolicyInfo {\n policyId?: string;\n sheetId?: string;\n roleId?: string;\n name?: string;\n effect?: string;\n actions?: string[];\n priority?: number;\n conditions?: RowPolicyCondition[];\n conditionMatchType?: string;\n isActive?: boolean;\n [key: string]: unknown;\n}\n\nexport interface RowPolicyUpdatePayload {\n id: string;\n data: RowPolicyInfo;\n sheetId: string;\n}\n\nexport interface RowPolicyTogglePayload {\n id: string;\n isActive: boolean;\n sheetId: string;\n}\n\nexport class RowPolicySDK {\n constructor(private readonly client: DimensClient) {}\n\n list(projectId: string, sheetId: string): Promise<APIResponse<RowPolicyInfo[]>> {\n return this.client.get<RowPolicyInfo[]>(\n `/app/mul/project/${projectId}/row_policy/list`,\n { sheetId }\n );\n }\n\n info(projectId: string, id: string, sheetId: string): Promise<APIResponse<RowPolicyInfo>> {\n return this.client.get<RowPolicyInfo>(`/app/mul/project/${projectId}/row_policy/info`, {\n id,\n sheetId,\n });\n }\n\n create(projectId: string, payload: RowPolicyInfo): Promise<APIResponse<RowPolicyInfo>> {\n return this.client.post<RowPolicyInfo>(\n `/app/mul/project/${projectId}/row_policy/add`,\n payload\n );\n }\n\n update(projectId: string, payload: RowPolicyUpdatePayload): Promise<APIResponse<RowPolicyInfo>> {\n return this.client.post<RowPolicyInfo>(\n `/app/mul/project/${projectId}/row_policy/update`,\n payload\n );\n }\n\n delete(projectId: string, ids: string[], sheetId: string): Promise<APIResponse<unknown[]>> {\n return this.client.post<unknown[]>(`/app/mul/project/${projectId}/row_policy/delete`, {\n ids,\n sheetId,\n });\n }\n\n toggle(projectId: string, payload: RowPolicyTogglePayload): Promise<APIResponse<RowPolicyInfo>> {\n return this.client.post<RowPolicyInfo>(\n `/app/mul/project/${projectId}/row_policy/toggle`,\n payload\n );\n }\n\n check(\n projectId: string,\n payload: {\n sheetId: string;\n rowData: Record<string, unknown>;\n action: string;\n context: { userId?: number; deptId?: number; deptIds?: number[] };\n }\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/mul/project/${projectId}/row_policy/check`,\n payload\n );\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface ViewInfo {\n viewId: string;\n name?: string;\n type?: string;\n isPublic?: boolean;\n config?: Record<string, unknown> | null;\n [key: string]: unknown;\n}\n\nexport interface ViewMutationPayload {\n name?: string;\n type?: string;\n isPublic?: boolean;\n config?: Record<string, unknown> | null;\n [key: string]: unknown;\n}\n\nexport class ViewSDK {\n constructor(private readonly client: DimensClient) {}\n\n list(teamId: string, projectId: string, sheetId: string): Promise<APIResponse<ViewInfo[]>> {\n return this.client.get<ViewInfo[]>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/view/list`\n );\n }\n\n create(\n teamId: string,\n projectId: string,\n sheetId: string,\n payload: ViewMutationPayload\n ): Promise<APIResponse<ViewInfo>> {\n return this.client.post<ViewInfo>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/view/create`,\n payload\n );\n }\n}\n"],"mappings":"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"}
# dimens-manager 画布章节 assets
当前目录用于存放 `dimens-manager` 的 `canvas` 业务章节素材。
如无独立章节素材,可只保留本占位文件。
---
name: dimens-manager-canvas
slug: dimens-manager-canvas
description: 用于维表智联项目内画布资源创建、AI 生成画布保存、版本管理、资源市场和业务工作流画布落地。
version: 1.0.0
author: 方块智联工作室
tags: [canvas, diagram, workflow, resource, dimens-cli]
---
# dimens-manager 画布章节
## 执行前必读
- ✅ 画布是项目菜单资源,创建入口是 `canvas create` 或 `sheet create --type canvas`。
- ✅ 画布详情、保存、版本和恢复走 `dimens-cli canvas *` 命令。
- ✅ 保存前必须先读取 `canvas info`,拿到当前 `version` 后再传 `--base-version`。
- ✅ AI 一键生成画布时,最终结果必须落成 `nodes/edges` JSON,而不是只输出文字说明。
- ✅ 画布落地不只是生成 `nodes/edges`,还要说明每个节点的业务职责、节点类型选择和使用方式;详细规则先看 `references/canvas/references/generation-guide.md`。
- ✅ 用户要“创建 PPT / 演示稿 / 幻灯片”时,画布 JSON 必须按 PPT 画布规则生成:16:9 比例,一页一个 `SECTION` 分区,页面内容全部放在对应分区内。
- ✅ PPT 或复杂展示场景中,优先善用 `INFOGRAPHIC` 信息图节点;它比普通文本、矩形、Markdown 更适合承载复杂信息。
- ✅ 业务工作流画布不等于可执行工作流;可执行工作流仍看 `references/workflow/overview.md`。
## 快速命令表
| 场景 | 命令 |
| --- | --- |
| 创建画布 | `dimens-cli canvas create --team-id <teamId> --project-id <projectId> --name <name>` |
| 创建带初始图的画布 | `dimens-cli canvas create --team-id <teamId> --project-id <projectId> --name <name> --file ./canvas.json` |
| 查询画布 | `dimens-cli canvas info <sheetId> --team-id <teamId> --project-id <projectId>` |
| 保存画布 | `dimens-cli canvas save <sheetId> --team-id <teamId> --project-id <projectId> --base-version <version> --file ./canvas.json` |
| 版本列表 | `dimens-cli canvas versions <sheetId> --team-id <teamId> --project-id <projectId>` |
| 查看版本 | `dimens-cli canvas version <sheetId> --team-id <teamId> --project-id <projectId> --version <version>` |
| 恢复版本 | `dimens-cli canvas restore <sheetId> --team-id <teamId> --project-id <projectId> --version <version>` |
| 保存组件资源 | `dimens-cli canvas resource-save --team-id <teamId> --name <name> --nodes '<json-array>' --edges '<json-array>'` |
| 发布组件资源 | `dimens-cli canvas resource-publish <resourceId> --team-id <teamId>` |
| 查看资源市场 | `dimens-cli canvas resource-market --team-id <teamId> --keyword <keyword>` |
## 默认处理顺序
1. 先确认 `teamId / projectId`。
2. 如果要创建新画布,执行 `canvas create`,记录返回的 `sheetId/canvasId`。
3. 如果要写入已有画布,执行 `canvas info <sheetId> --team-id <teamId> --project-id <projectId>` 获取 `version`。
4. 生成或整理画布 JSON,确认包含 `nodes` 和 `edges`。
5. 自检每个节点是否有明确业务职责,并使用合适类型:输入输出用 `PARALLELOGRAM`,判断用 `DIAMOND`,数据沉淀用 `CYLINDER`,文档产物用 `DOCUMENT` 或 `MARKDOWN`。
6. 执行 `canvas save <sheetId> --team-id <teamId> --project-id <projectId> --base-version <version>`。
7. 需要复用时保存组件资源,需要共享时发布到资源市场。
## 与其他章节的关系
| 章节 | 关系 |
| --- | --- |
| `references/team/overview.md` | 画布资源必须落在正确团队和项目下 |
| `references/project/overview.md` | 画布属于项目菜单资源,目录归位依赖项目资源链路 |
| `references/workflow/overview.md` | 可执行工作流定义、项目挂载和运行调用仍走工作流章节 |
| `references/permission/overview.md` | 画布页面资源可见性和协同边界要走权限章节 |
| `references/canvas/references/generation-guide.md` | AI 生成画布 JSON、节点职责和节点类型用法 |
| `references/canvas/references/generation-guide.md#8-ppt--演示稿画布规则` | PPT 画布 16:9、分区页面和页面内元素约束 |
| `references/canvas/references/generation-guide.md#infographic-信息图节点` | 信息图节点、AntV Infographic 语法和复杂展示模板 |
## 高风险跑偏点
- 不要把 `canvas save` 当成局部 patch;它保存的是整份图数据。
- 不要跳过 `baseVersion`;版本冲突时应重新读取后合并。
- 不要省略 `--team-id` 和 `--project-id`;快速查询、保存、版本命令都需要明确团队和项目上下文。
- 不要只用 `RECTANGLE` 画完整业务流程;节点类型要表达“输入、判断、处理、沉淀、说明”等不同职责。
- 不要生成缺字段的节点或边;节点必须有 `style/width/height/positionAbsolute`,边必须有 `sourceHandle/targetHandle/markerEnd/style`。
- 不要把 PPT 画布画成散落节点;PPT 画布最外层必须是一组 16:9 的 `SECTION`,一页 PPT 对应一个分区,所有页面内容都在分区内。
- 不要把复杂展示内容拆成大量普通节点;能用 `INFOGRAPHIC` 表达的方案亮点、路径、对比、趋势、关系,应优先用信息图。
- 不要把画布资源市场当成项目权限系统,资源可见性和项目页面权限仍要分开判断。
- 不要生成无法被前端识别的节点类型;不确定时用 `RECTANGLE`、`DIAMOND`、`MARKDOWN` 等保守类型。
## 参考文档
- `references/command-mapping.md`
- `references/generation-guide.md`
- `references/examples.md`
# dimens-manager 画布章节
当前目录是 `dimens-manager` 的 `canvas` 业务章节,用于承载项目内画布资源、版本、组件资源市场和 AI 生成画布落地说明。
## 入口
- `overview.md`:章节总览和执行前必读
- `references/`:命令映射、生成规范和案例
- `rules/`:平台兼容入口
- `assets/`:素材占位目录
# dimens-manager 画布章节 命令映射
## 命令与接口
| 命令 | 作用 | 接口 |
| --- | --- | --- |
| `canvas create` | 创建项目画布菜单资源 | `POST /app/mul/project/:projectId/sheet/create` |
| `canvas info` | 获取画布详情 | `GET /app/canvas/:teamId/:projectId/info` |
| `canvas save` | 保存画布图数据 | `POST /app/canvas/:teamId/:projectId/save` |
| `canvas versions` | 获取版本列表 | `POST /app/canvas/:teamId/:projectId/versions` |
| `canvas version` | 获取指定版本快照 | `GET /app/canvas/:teamId/:projectId/version` |
| `canvas restore` | 恢复指定版本 | `POST /app/canvas/:teamId/:projectId/restore` |
| `canvas resource-list` | 查看我的组件资源 | `GET /app/canvas/:teamId/resource/mine` |
| `canvas resource-save` | 保存我的组件资源 | `POST /app/canvas/:teamId/resource/mine` |
| `canvas resource-delete` | 删除我的组件资源 | `POST /app/canvas/:teamId/resource/mine/delete` |
| `canvas resource-publish` | 发布资源到市场 | `POST /app/canvas/:teamId/resource/mine/publish` |
| `canvas resource-market` | 查看资源市场 | `GET /app/canvas/:teamId/resource/market` |
## 常用链路
```bash
dimens-cli canvas create --team-id TEAM1 --project-id PROJ1 --name 业务流程画布
dimens-cli canvas info canvas_1 --team-id TEAM1 --project-id PROJ1
dimens-cli canvas save canvas_1 --team-id TEAM1 --project-id PROJ1 --base-version 1 --file ./canvas.json --summary AI生成业务工作流
```
```bash
dimens-cli canvas versions canvas_1 --team-id TEAM1 --project-id PROJ1
dimens-cli canvas restore canvas_1 --team-id TEAM1 --project-id PROJ1 --version 2
```
# dimens-manager 画布章节案例
## 1. 一键生成审批流程画布
1. 根据用户描述生成 `approval-canvas.json`。
2. 创建画布:
```bash
dimens-cli canvas create --team-id TEAM1 --project-id PROJ1 --name 审批流程画布 --file ./approval-canvas.json
```
3. 如果后续要更新:
```bash
dimens-cli canvas info canvas_1 --team-id TEAM1 --project-id PROJ1
dimens-cli canvas save canvas_1 --team-id TEAM1 --project-id PROJ1 --base-version 1 --file ./approval-canvas.json --summary 优化审批异常分支
```
4. 如果要沉淀为组件:
```bash
dimens-cli canvas resource-save --team-id TEAM1 --name 审批节点组 --nodes '[{"id":"submit"}]' --edges '[]' --tags 审批,流程
```
## 2. 售后工单工作流画布
用户输入:
```text
帮我生成一个售后工单处理工作流画布
```
推荐输出画布 JSON:
```json
{
"version": "1.0",
"timestamp": 1777800000000,
"nodes": [
{
"id": "ticket_submit",
"type": "PARALLELOGRAM",
"position": { "x": 0, "y": 0 },
"positionAbsolute": { "x": 0, "y": 0 },
"width": 150,
"height": 80,
"selected": false,
"dragging": false,
"style": { "width": 150, "height": 80 },
"data": { "label": "客户提交工单表单", "backgroundColor": "#ffffff", "borderColor": "#d1d5db", "borderWidth": 1, "textColor": "#111827", "fontSize": 14, "width": 150, "height": 80, "borderRadius": 12, "align": "center", "verticalAlign": "center", "text": "职责:采集客户、问题描述、附件和期望处理时限" }
},
{
"id": "ticket_classify",
"type": "RECTANGLE",
"position": { "x": 0, "y": 160 },
"positionAbsolute": { "x": 0, "y": 160 },
"width": 150,
"height": 80,
"selected": false,
"dragging": false,
"style": { "width": 150, "height": 80 },
"data": { "label": "系统识别问题类型", "backgroundColor": "#ffffff", "borderColor": "#d1d5db", "borderWidth": 1, "textColor": "#111827", "fontSize": 14, "width": 150, "height": 80, "borderRadius": 12, "align": "center", "verticalAlign": "center", "text": "职责:根据工单内容判断问题类别、优先级和建议处理方式" }
},
{
"id": "need_engineer",
"type": "DIAMOND",
"position": { "x": 0, "y": 320 },
"positionAbsolute": { "x": 0, "y": 320 },
"width": 150,
"height": 100,
"selected": false,
"dragging": false,
"style": { "width": 150, "height": 100 },
"data": { "label": "是否需要工程师介入", "backgroundColor": "#fff7ed", "borderColor": "#f97316", "borderWidth": 1, "textColor": "#111827", "fontSize": 14, "width": 150, "height": 100, "borderRadius": 12, "align": "center", "verticalAlign": "center" }
},
{
"id": "auto_reply",
"type": "RECTANGLE",
"position": { "x": -260, "y": 500 },
"positionAbsolute": { "x": -260, "y": 500 },
"width": 150,
"height": 80,
"selected": false,
"dragging": false,
"style": { "width": 150, "height": 80 },
"data": { "label": "自动回复解决方案", "backgroundColor": "#ecfdf5", "borderColor": "#10b981", "borderWidth": 1, "textColor": "#111827", "fontSize": 14, "width": 150, "height": 80, "borderRadius": 12, "align": "center", "verticalAlign": "center" }
},
{
"id": "engineer_process",
"type": "RECTANGLE",
"position": { "x": 260, "y": 500 },
"positionAbsolute": { "x": 260, "y": 500 },
"width": 150,
"height": 80,
"selected": false,
"dragging": false,
"style": { "width": 150, "height": 80 },
"data": { "label": "工程师排查处理", "backgroundColor": "#eff6ff", "borderColor": "#3b82f6", "borderWidth": 1, "textColor": "#111827", "fontSize": 14, "width": 150, "height": 80, "borderRadius": 12, "align": "center", "verticalAlign": "center" }
},
{
"id": "customer_confirm",
"type": "DIAMOND",
"position": { "x": 0, "y": 680 },
"positionAbsolute": { "x": 0, "y": 680 },
"width": 150,
"height": 100,
"selected": false,
"dragging": false,
"style": { "width": 150, "height": 100 },
"data": { "label": "客户是否确认解决", "backgroundColor": "#fff7ed", "borderColor": "#f97316", "borderWidth": 1, "textColor": "#111827", "fontSize": 14, "width": 150, "height": 100, "borderRadius": 12, "align": "center", "verticalAlign": "center" }
},
{
"id": "ticket_close",
"type": "CYLINDER",
"position": { "x": 0, "y": 860 },
"positionAbsolute": { "x": 0, "y": 860 },
"width": 150,
"height": 80,
"selected": false,
"dragging": false,
"style": { "width": 150, "height": 80 },
"data": { "label": "写入工单状态和知识库", "backgroundColor": "#f8fafc", "borderColor": "#64748b", "borderWidth": 1, "textColor": "#111827", "fontSize": 14, "width": 150, "height": 80, "borderRadius": 12, "align": "center", "verticalAlign": "center", "text": "职责:更新工单状态、处理结果和可复用解决方案" }
},
{
"id": "service_report",
"type": "DOCUMENT",
"position": { "x": 0, "y": 1020 },
"positionAbsolute": { "x": 0, "y": 1020 },
"width": 180,
"height": 100,
"selected": false,
"dragging": false,
"style": { "width": 180, "height": 100 },
"data": { "label": "生成结案报告", "backgroundColor": "#ffffff", "borderColor": "#94a3b8", "borderWidth": 1, "textColor": "#111827", "fontSize": 14, "width": 180, "height": 100, "borderRadius": 12, "align": "center", "verticalAlign": "center", "text": "职责:输出客户可查看的结案说明和服务记录" }
}
],
"edges": [
{ "id": "edge_ticket_submit_ticket_classify", "source": "ticket_submit", "target": "ticket_classify", "sourceHandle": "source-bottom", "targetHandle": "target-top", "type": "default", "animated": false, "selected": false, "zIndex": 0, "markerEnd": { "type": "arrowclosed", "color": "#94a3b8" }, "style": { "stroke": "#94a3b8", "strokeWidth": 2 } },
{ "id": "edge_ticket_classify_need_engineer", "source": "ticket_classify", "target": "need_engineer", "sourceHandle": "source-bottom", "targetHandle": "target-top", "type": "default", "animated": false, "selected": false, "zIndex": 0, "markerEnd": { "type": "arrowclosed", "color": "#94a3b8" }, "style": { "stroke": "#94a3b8", "strokeWidth": 2 } },
{ "id": "edge_need_engineer_auto_reply", "source": "need_engineer", "target": "auto_reply", "sourceHandle": "source-left", "targetHandle": "target-top", "type": "smoothstep", "label": "否", "animated": false, "selected": false, "zIndex": 0, "markerEnd": { "type": "arrowclosed", "color": "#94a3b8" }, "style": { "stroke": "#94a3b8", "strokeWidth": 2 } },
{ "id": "edge_need_engineer_engineer_process", "source": "need_engineer", "target": "engineer_process", "sourceHandle": "source-right", "targetHandle": "target-top", "type": "smoothstep", "label": "是", "animated": false, "selected": false, "zIndex": 0, "markerEnd": { "type": "arrowclosed", "color": "#94a3b8" }, "style": { "stroke": "#94a3b8", "strokeWidth": 2 } },
{ "id": "edge_auto_reply_customer_confirm", "source": "auto_reply", "target": "customer_confirm", "sourceHandle": "source-bottom", "targetHandle": "target-left", "type": "smoothstep", "animated": false, "selected": false, "zIndex": 0, "markerEnd": { "type": "arrowclosed", "color": "#94a3b8" }, "style": { "stroke": "#94a3b8", "strokeWidth": 2 } },
{ "id": "edge_engineer_process_customer_confirm", "source": "engineer_process", "target": "customer_confirm", "sourceHandle": "source-bottom", "targetHandle": "target-right", "type": "smoothstep", "animated": false, "selected": false, "zIndex": 0, "markerEnd": { "type": "arrowclosed", "color": "#94a3b8" }, "style": { "stroke": "#94a3b8", "strokeWidth": 2 } },
{ "id": "edge_customer_confirm_ticket_close", "source": "customer_confirm", "target": "ticket_close", "sourceHandle": "source-bottom", "targetHandle": "target-top", "type": "default", "label": "确认", "animated": false, "selected": false, "zIndex": 0, "markerEnd": { "type": "arrowclosed", "color": "#94a3b8" }, "style": { "stroke": "#94a3b8", "strokeWidth": 2 } },
{ "id": "edge_ticket_close_service_report", "source": "ticket_close", "target": "service_report", "sourceHandle": "source-bottom", "targetHandle": "target-top", "type": "default", "animated": false, "selected": false, "zIndex": 0, "markerEnd": { "type": "arrowclosed", "color": "#94a3b8" }, "style": { "stroke": "#94a3b8", "strokeWidth": 2 } },
{ "id": "edge_customer_confirm_engineer_process", "source": "customer_confirm", "target": "engineer_process", "sourceHandle": "source-right", "targetHandle": "target-right", "type": "smoothstep", "label": "未解决", "animated": false, "selected": false, "zIndex": 1, "markerEnd": { "type": "arrowclosed", "color": "#ef4444" }, "style": { "stroke": "#ef4444", "strokeWidth": 2 } }
],
"viewport": { "x": 0, "y": 0, "zoom": 1 },
"meta": {
"source": "dimens-manager-canvas",
"scenario": "售后工单",
"nodeGuide": {
"ticket_submit": "输入节点:客户提交问题信息",
"ticket_classify": "系统处理节点:识别问题类型、优先级和建议处理方式",
"need_engineer": "判断节点:决定自动回复还是人工介入",
"ticket_close": "数据沉淀节点:写入状态和知识库",
"service_report": "文档节点:输出结案报告"
}
}
}
```
## 3. PPT 演示稿画布
用户输入:
```text
帮我创建一个客户增长方案 PPT 画布
```
生成要求:
- 每一页 PPT 必须是一个 `SECTION` 分区。
- 每个 `SECTION` 固定 16:9,推荐 `1280 x 720`。
- 页面内容节点必须通过 `parentNode` 挂到对应 `SECTION` 下。
- 复杂方案、路径、趋势、对比等核心内容优先使用 `INFOGRAPHIC` 信息图节点。
- 内容节点的 `position` 是页内相对坐标,`positionAbsolute` 是画布绝对坐标。
- 页面分区节点放在 `nodes` 数组前面,页面内容节点跟在对应分区后面。
推荐输出画布 JSON 结构:
```json
{
"version": "1.0",
"timestamp": 1777800000000,
"nodes": [
{
"id": "slide_01",
"type": "SECTION",
"position": { "x": 0, "y": 0 },
"positionAbsolute": { "x": 0, "y": 0 },
"width": 1280,
"height": 720,
"selected": false,
"dragging": false,
"style": { "width": 1280, "height": 720 },
"data": { "label": "第 1 页:方案总览", "backgroundColor": "#ffffff", "borderColor": "#e5e7eb", "borderWidth": 1, "textColor": "#111827", "fontSize": 16, "width": 1280, "height": 720, "borderRadius": 0, "align": "left", "verticalAlign": "top", "text": "PPT 页面分区,16:9" }
},
{
"id": "slide_02",
"type": "SECTION",
"position": { "x": 0, "y": 820 },
"positionAbsolute": { "x": 0, "y": 820 },
"width": 1280,
"height": 720,
"selected": false,
"dragging": false,
"style": { "width": 1280, "height": 720 },
"data": { "label": "第 2 页:执行路径", "backgroundColor": "#ffffff", "borderColor": "#e5e7eb", "borderWidth": 1, "textColor": "#111827", "fontSize": 16, "width": 1280, "height": 720, "borderRadius": 0, "align": "left", "verticalAlign": "top", "text": "PPT 页面分区,16:9" }
},
{
"id": "slide_01_title",
"type": "TEXT",
"parentNode": "slide_01",
"position": { "x": 72, "y": 56 },
"positionAbsolute": { "x": 72, "y": 56 },
"width": 620,
"height": 72,
"selected": false,
"dragging": false,
"style": { "width": 620, "height": 72 },
"data": { "label": "客户增长方案", "backgroundColor": "transparent", "borderColor": "transparent", "borderWidth": 0, "textColor": "#111827", "fontSize": 40, "width": 620, "height": 72, "borderRadius": 0, "align": "left", "verticalAlign": "center", "text": "客户增长方案" }
},
{
"id": "slide_01_growth_infographic",
"type": "INFOGRAPHIC",
"parentNode": "slide_01",
"position": { "x": 72, "y": 170 },
"positionAbsolute": { "x": 72, "y": 170 },
"width": 760,
"height": 420,
"selected": false,
"dragging": false,
"style": { "width": 760, "height": 420 },
"data": { "label": "客户增长路径信息图", "backgroundColor": "#ffffff", "borderColor": "#cbd5e1", "borderWidth": 1, "textColor": "#111827", "fontSize": 14, "width": 760, "height": 420, "borderRadius": 16, "align": "center", "verticalAlign": "center", "infographicSyntax": "infographic list-row-horizontal-icon-arrow\ndata\n title 客户增长路径\n desc 聚焦获客、转化、复购三个阶段\n lists\n - label 获客\n desc 统一线索来源并提升触达效率\n icon rocket launch\n - label 转化\n desc 优化销售跟进路径并减少流失\n icon chart line\n - label 复购\n desc 用会员权益和分层运营提升复购\n icon repeat\ntheme\n palette #3b82f6 #8b5cf6 #f97316" }
},
{
"id": "slide_02_title",
"type": "TEXT",
"parentNode": "slide_02",
"position": { "x": 72, "y": 56 },
"positionAbsolute": { "x": 72, "y": 876 },
"width": 620,
"height": 72,
"selected": false,
"dragging": false,
"style": { "width": 620, "height": 72 },
"data": { "label": "执行路径", "backgroundColor": "transparent", "borderColor": "transparent", "borderWidth": 0, "textColor": "#111827", "fontSize": 40, "width": 620, "height": 72, "borderRadius": 0, "align": "left", "verticalAlign": "center", "text": "执行路径" }
}
],
"edges": [],
"viewport": { "x": 0, "y": 0, "zoom": 0.8 },
"meta": {
"source": "dimens-manager-canvas",
"scenario": "ppt-canvas",
"slideRule": "16:9; one SECTION per slide; all content nodes must use parentNode",
"infographicRule": "use INFOGRAPHIC for complex PPT content; data.infographicSyntax must be AntV Infographic DSL"
}
}
```
# dimens-manager 画布章节 AI 生成规范
## 1. 输出结构
AI 生成画布时,目标不是生成说明文,而是生成能被 `CanvasBoard` 渲染和继续编辑的图数据:
```json
{
"nodes": [],
"edges": [],
"viewport": { "x": 0, "y": 0, "zoom": 1 },
"version": "1.0",
"timestamp": 1777800000000,
"meta": { "source": "dimens-manager-canvas" }
}
```
画布表达的是可视化说明和协作,不直接代表工作流引擎已创建、发布或绑定项目。可执行工作流仍进入 `dimens-manager/references/workflow/overview.md`。
## 2. 节点生成硬规则
- 每个节点必须说明业务职责:触发、输入、处理、判断、人工处理、数据存储、文档沉淀、展示、分组或结束。
- 每个节点必须选择能表达职责的 `type`,不要把所有节点都画成 `RECTANGLE`。
- `data.label` 写业务动作或判断条件,不写“节点1 / 步骤2 / 处理”这类空泛名称。
- 节点说明放在 `data.text`、`data.markdownContent` 或整图 `meta.nodeGuide` 中;不要依赖前端一定渲染自定义字段。
- 条件节点必须使用 `DIAMOND`,并给每条分支边写 `label`,如“是 / 否 / 通过 / 驳回 / 命中 / 未命中”。
- 辅助节点如 `SECTION`、`TEXT`、`STICKY_NOTE`、`IMAGE` 不代表真实流程步骤,不能替代主流程节点。
## 3. 流程节点选型
先定义节点的业务职责,再选择节点类型。每个节点必须说明业务职责,否则 AI 只能画出看起来像流程、实际不可读的图。
| 业务职责 | 推荐节点类型 | 典型 label | 使用要求 |
| --- | --- | --- | --- |
| 触发、开始、结束、普通动作 | `RECTANGLE` | `客户提交线索`、`关闭工单` | 一个节点只写一个动作 |
| 输入、输出、上传、外部返回 | `PARALLELOGRAM` | `销售填写线索表单`、`接口返回审批结果` | 表示数据进入或输出流程 |
| 条件判断、审批、分流 | `DIAMOND` | `是否命中高风险规则` | 至少两条出边,边上写“是/否”等分支 |
| 数据库、多维表、业务对象沉淀 | `CYLINDER` | `写入客户表`、`读取库存数据` | 表示读写数据,不表示人工动作 |
| 文档、合同、报告、知识条目 | `DOCUMENT` | `生成服务报告`、`沉淀知识条目` | 表示文档产物 |
| 长说明、SOP、策略文本 | `MARKDOWN` | `审批策略说明` | 使用 `data.markdownContent` 放正文 |
| 阶段、泳道、区域分组 | `SECTION` | `售前阶段`、`交付阶段` | 只做分组背景,不作为流程步骤 |
| 备注、风险、口径补充 | `TEXT` / `STICKY_NOTE` | `风险提示` | 辅助说明,通常不接主流程边 |
| 方案树、分类树、模块拆解 | `MINDMAP` | `CRM 能力拆解` | 用 `mindMapRoot`,不用于严格时序 |
| 画布内 AI 智能体生成 | `CUSTOM_AGENT` | `根据前置内容生成报告` | 只在需要用户点击运行并生成后续节点时使用,不作为普通业务步骤 |
| 嵌入多维表视图 | `EMBEDDED_SHEET` | `客户列表视图` | 需要 `embeddedSheet.sheetId/viewId` |
| 图片、视频、SVG、信息图 | `IMAGE` / `VIDEO` / `SVG` / `INFOGRAPHIC` | `增长漏斗信息图`、`流程概览图` | 展示材料;复杂信息展示优先用 `INFOGRAPHIC` |
支持的节点类型包括:`RECTANGLE`、`CIRCLE`、`TRIANGLE`、`DIAMOND`、`PARALLELOGRAM`、`HEXAGON`、`CYLINDER`、`CLOUD`、`DOCUMENT`、`TEXT`、`STICKY_NOTE`、`GROUP`、`SECTION`、`MINDMAP`、`IMAGE`、`VIDEO`、`CUSTOM_AGENT`、`MARKDOWN`、`CLOCK`、`SVG`、`INFOGRAPHIC`、`EMBEDDED_SHEET`。不要发明前端无法识别的新类型。
## 4. 节点类型详解
### `RECTANGLE` 普通动作节点
- 作用:表达一个业务动作、系统处理或明确状态。
- 用法:`data.label` 使用“动词 + 对象”,如“创建客户档案”“分配服务工程师”。
- 不要:把多个动作写在同一个矩形里,如“提交、审核、归档”。
### `PARALLELOGRAM` 输入输出节点
- 作用:表达表单提交、文件上传、外部接口返回、流程输出。
- 用法:放在流程入口、数据采集点或输出交付点。
- 推荐字段:`data.label` 写输入/输出内容,`data.text` 可写来源或去向。
- 不要:把内部处理步骤画成输入输出。
### `DIAMOND` 判断节点
- 作用:表达“是否满足条件”的分支。
- 用法:`data.label` 写成问题句,如“是否需要主管审批”;每条出边都写 `label`。
- 不要:只有一条出边,或边没有“是/否/通过/驳回”等含义。
### `CYLINDER` 数据沉淀节点
- 作用:表达数据库、多维表、业务对象、日志或知识库的读写。
- 用法:写入类 label 用“写入...表”,读取类 label 用“读取...数据”。
- 不要:用它表达普通人工操作;人工操作仍用 `RECTANGLE`。
### `DOCUMENT` 与 `MARKDOWN` 文档节点
- `DOCUMENT`:表示合同、报告、工单回执、知识条目等文档产物。
- `MARKDOWN`:表示较长说明、SOP、策略规则,正文放 `data.markdownContent`。
- 不要:把主流程动作藏进长文档里,主流程仍要拆成节点。
### `SECTION` 分组节点
- 作用:表达阶段、泳道、业务域背景,如“售前阶段”“财务审批”。
- 用法:尺寸通常大于普通节点,包住一组节点,可不连边。
- 不要:把 `SECTION` 当成一个流程步骤。
### `TEXT` / `STICKY_NOTE` 说明节点
- 作用:补充风险、规则、口径和待确认事项。
- 用法:放在相关节点旁边,避免干扰主流程连线。
- 不要:把它们当作必须执行的流程环节。
### `MINDMAP` 思维导图节点
- 作用:表达非线性的分类、方案拆解、能力树。
- 用法:使用 `data.mindMapRoot`,层级控制在 2-3 层。
- 不要:用于审批流、工单流这类严格时序流程。
### `CUSTOM_AGENT` 画布内 AI 智能体节点
- 作用:画布内的 AI 智能体节点,用来读取上游节点内容,并生成新的 Markdown、思维导图或信息图节点。
- 用法:仅在用户明确需要“在画布里放一个可运行的 AI 智能体”时使用;`data.label` 写成用户给智能体的指令,`data.agentOutputType` 可用 `MARKDOWN`、`MINDMAP`、`INFOGRAPHIC`。
- 不要:不要把它当成普通“AI 分析步骤”滥用;普通业务处理、系统分类、规则判断仍优先用 `RECTANGLE` 或 `DIAMOND`。也不要把它当成后端可执行工作流节点。
### `EMBEDDED_SHEET` 嵌入表格节点
- 作用:在画布中展示项目内多维表视图。
- 用法:必须提供 `data.embeddedSheet.sheetId` 和 `data.embeddedSheet.viewId`,可附带 `sheetName/viewName`。
- 不要:没有真实表格视图时虚构 ID。
### 展示类节点
- `INFOGRAPHIC` 是复杂信息展示的强表达节点,尤其适合 PPT 页、方案页、数据解读页、流程概览页、对比分析页。
- `IMAGE`、`VIDEO`、`SVG` 用于已有素材或静态资产;如果用户给的是需要结构化表达的信息,应优先考虑 `INFOGRAPHIC`。
- `CLOCK` 适合表示计时、倒计时、SLA 提醒。
- `CLOUD` 可表示外部云服务或第三方系统,`HEXAGON` 可表示能力模块或服务组件。
### `INFOGRAPHIC` 信息图节点
- 作用:把复杂信息、数据、知识、流程、对比、层级、关系压缩成强视觉表达。它比普通 `TEXT`、`MARKDOWN`、`RECTANGLE` 更适合做 PPT 里的核心展示内容。
- 用法:当用户需要展示复杂效果、方案亮点、指标趋势、业务链路、对比分析、SWOT、象限、组织结构、路线图、系统关系、数据图表时,优先使用 `INFOGRAPHIC`。
- 字段:必须在 `data.infographicSyntax` 中写 AntV Infographic DSL;不要只写 `data.label`。
- 尺寸:默认 `400 x 300`;PPT 页核心信息图建议 `720 x 420`、`800 x 460` 或按页面留白调整。
- 不要:不要把复杂信息拆成大量小 `RECTANGLE` 或长 `MARKDOWN`;如果这些内容本质上是“给用户一眼看懂”的展示信息,应使用 `INFOGRAPHIC`。
`INFOGRAPHIC` 节点的 `data.infographicSyntax` 必须遵循:
- 第一行必须是 `infographic <template-name>`。
- 使用 `data` / `theme` 块,块内使用两个空格缩进。
- 只使用一个与模板匹配的主数据字段,例如 `lists`、`sequences`、`compares`、`values`、`root`、`nodes`。
- 列表、步骤、节点、对比项等主要数据项默认补 `icon`。
- `palette` 使用裸颜色值,不加引号、不加逗号,例如 `palette #3b82f6 #8b5cf6 #f97316`。
- 用户输入中文时,`title`、`desc`、`label` 等继续用中文;用户输入英文时继续用英文,不要自动翻译。
常用模板选择:
| 信息结构 | 推荐模板 |
| --- | --- |
| 并列要点、卖点、能力清单 | `list-row-horizontal-icon-arrow`、`list-grid-badge-card`、`list-grid-ribbon-card` |
| 阶段步骤、推进路径、路线图 | `sequence-ascending-steps`、`sequence-timeline-simple`、`sequence-roadmap-vertical-simple` |
| 多角色或多系统交互 | `sequence-interaction-default-badge-card`、`sequence-interaction-default-rounded-rect-node` |
| 双方对比、方案对比、前后对比 | `compare-binary-horizontal-simple-fold`、`compare-binary-horizontal-badge-card-arrow` |
| SWOT / 象限分析 | `compare-swot`、`compare-quadrant-quarter-simple-card` |
| 层级树、组织结构、能力树 | `hierarchy-tree-curved-line-rounded-rect-node`、`hierarchy-structure` |
| 趋势、数值对比、占比 | `chart-line-plain-text`、`chart-column-simple`、`chart-pie-donut-plain-text` |
| 系统关系、依赖链路 | `relation-dagre-flow-tb-simple-circle-node`、`relation-dagre-flow-tb-badge-card` |
可渲染字段模板:
```json
{
"id": "growth_infographic",
"type": "INFOGRAPHIC",
"position": { "x": 72, "y": 170 },
"positionAbsolute": { "x": 72, "y": 170 },
"width": 760,
"height": 420,
"selected": false,
"dragging": false,
"style": { "width": 760, "height": 420 },
"data": {
"label": "增长路径信息图",
"backgroundColor": "#ffffff",
"borderColor": "#e2e8f0",
"borderWidth": 1,
"textColor": "#111827",
"fontSize": 14,
"width": 760,
"height": 420,
"borderRadius": 16,
"align": "center",
"verticalAlign": "center",
"infographicSyntax": "infographic list-row-horizontal-icon-arrow\ndata\n title 产品增长要点\n desc 聚焦获客、转化、复购三个阶段\n lists\n - label 获客\n desc 多渠道投放与内容触达\n icon rocket launch\n - label 转化\n desc 优化路径并减少流失\n icon chart line\n - label 复购\n desc 会员权益与分层运营\n icon repeat\ntheme\n palette #3b82f6 #8b5cf6 #f97316"
}
}
```
## 5. 节点字段写法
节点必须按“可渲染字段模板”生成。不要只给 `id/type/position/data.label`,否则容易出现节点不可见、尺寸丢失或拖拽异常。
```json
{
"id": "lead_submit",
"type": "PARALLELOGRAM",
"position": { "x": 0, "y": 0 },
"positionAbsolute": { "x": 0, "y": 0 },
"width": 150,
"height": 80,
"selected": false,
"dragging": false,
"style": { "width": 150, "height": 80 },
"data": {
"label": "销售填写线索表单",
"backgroundColor": "#ffffff",
"borderColor": "#d1d5db",
"borderWidth": 1,
"textColor": "#111827",
"fontSize": 14,
"width": 150,
"height": 80,
"borderRadius": 12,
"align": "center",
"verticalAlign": "center",
"text": "职责:采集客户来源、联系人、需求摘要"
}
}
```
关键字段:
- `id`:稳定英文短名,后续边通过它连接。
- `type`:用来表达节点语义,不只是视觉形状。
- `position`:React Flow 相对坐标;无父节点时和 `positionAbsolute` 保持一致。
- `positionAbsolute`:绝对坐标;生成时必须填,避免画布恢复或检索时坐标缺失。
- `style.width/style.height`、顶层 `width/height`、`data.width/data.height`:三处保持一致。普通节点标准尺寸 `150x80`。
- `data.label`:用户第一眼看到的业务动作。
- `data.align` / `data.verticalAlign`:普通流程节点默认 `center/center`。
- `data.borderRadius`:普通节点默认 `12`,开始/结束或强调节点可用 `16`。
- `data.text` / `data.markdownContent`:放节点说明、规则、SOP。
- `selected` / `dragging`:保存型 JSON 默认都填 `false`。
标准尺寸:
| 节点类型 | 推荐尺寸 |
| --- | --- |
| 普通流程节点 | `150 x 80` |
| 判断节点 `DIAMOND` | `150 x 100` |
| 文档节点 `DOCUMENT` | `180 x 100` |
| `MARKDOWN` | `400 x 300` 或更大 |
| `INFOGRAPHIC` | 默认 `400 x 300`,PPT 核心展示建议 `720 x 420` 或更大 |
| `SECTION` | 按包裹范围设置,通常不小于 `800 x 400` |
| PPT 页面分区 `SECTION` | 固定 16:9,推荐 `1280 x 720` |
| `EMBEDDED_SHEET` | `720 x 420` |
## 6. 连线设计
边必须按“可渲染字段模板”生成。不要只给 `id/source/target/type/label`。
```json
{
"id": "edge_start_check",
"source": "start",
"target": "check",
"sourceHandle": "source-bottom",
"targetHandle": "target-top",
"type": "default",
"animated": false,
"selected": false,
"zIndex": 0,
"markerEnd": { "type": "arrowclosed", "color": "#94a3b8" },
"style": { "stroke": "#94a3b8", "strokeWidth": 2 }
}
```
规则:
- 主流程边不要交叉,默认从 `source-bottom` 连到 `target-top`。
- 横向回退或人工兜底路径可用 `source-right -> target-right` 或 `source-left -> target-left`,并调整布局避免重叠。
- 普通直线边用 `type: "default"`;分支、回退、跨层级连接可用 `type: "smoothstep"`。
- 条件分支边必须在 `label` 上标注“是 / 否 / 通过 / 驳回”。
- 所有边必须带 `markerEnd: { "type": "arrowclosed" }` 和 `style.stroke/style.strokeWidth`。
- 保存型 JSON 默认 `animated: false`、`selected: false`、`zIndex: 0`;只有需要强调运行中或高亮时才改。
- 连线方向必须与业务时序一致。
- 不要把多个业务动作挤进一条边,动作应该放在节点里。
## 7. 布局规则
推荐左到右布局:
- 起点:`x=0`
- 普通节点标准尺寸:`width=150`、`height=80`
- 普通步骤间隔:`x += 260`
- 分支节点上下间隔:`y += 160`
- 异常或退回路径放在主流程下方
推荐自上而下布局:
- 起点:`y=0`
- 普通节点标准尺寸:`width=150`、`height=80`
- 普通步骤间隔:`y += 160`
- 分支节点左右间隔:`x += 260`
## 8. PPT / 演示稿画布规则
当用户说“创建 PPT”“生成演示稿”“做一套汇报幻灯片”“把方案做成 PPT 画布”时,必须按 PPT 画布结构生成,而不是把内容散落在无限画布上。
硬规则:
- PPT 画布必须是 `16:9` 比例。
- 最外层必须是 `SECTION` 分区;一页 PPT 对应一个 `SECTION`。
- 每个 PPT 页面分区推荐尺寸固定为 `1280 x 720`,也可等比放大或缩小,但 `width / height` 必须等于 `16 / 9`。
- 所有标题、正文、图表、流程、图片、备注等内容节点都必须在对应页面 `SECTION` 内实现。
- PPT 页面里只要涉及复杂信息展示、指标趋势、方案对比、流程概览、路径拆解、SWOT、象限或系统关系,优先使用 `INFOGRAPHIC` 节点承载,而不是堆叠大量 `TEXT` / `RECTANGLE`。
- 页面内容节点必须写 `parentNode: "<slide_section_id>"`,`position` 使用相对该页分区的坐标,`positionAbsolute` 使用画布绝对坐标。
- 页面分区节点要排在 `nodes` 数组前面,保证作为底层容器渲染。
- 页面之间建议纵向排列,默认 `y += 820`,也就是 `720` 页面高度加 `100` 页间距。
- PPT 页面之间通常不需要连边;如果要表达跨页导航,可以用轻量 `TEXT` 节点标注,不要用主流程边把所有页串起来。
- 不要把 `SECTION` 当成幻灯片中的普通内容块;PPT 场景下它就是页面画布。
- 不要让内容节点超出页面分区边界;标题、正文、图表都必须留在 `SECTION` 的 `0 <= x <= 1280`、`0 <= y <= 720` 范围内,并预留页边距。
PPT 页面分区模板:
```json
{
"id": "slide_01",
"type": "SECTION",
"position": { "x": 0, "y": 0 },
"positionAbsolute": { "x": 0, "y": 0 },
"width": 1280,
"height": 720,
"selected": false,
"dragging": false,
"style": { "width": 1280, "height": 720 },
"data": {
"label": "第 1 页:方案总览",
"backgroundColor": "#ffffff",
"borderColor": "#e5e7eb",
"borderWidth": 1,
"textColor": "#111827",
"fontSize": 16,
"width": 1280,
"height": 720,
"borderRadius": 0,
"align": "left",
"verticalAlign": "top",
"text": "PPT 页面分区,16:9"
}
}
```
页面内内容节点模板:
```json
{
"id": "slide_01_title",
"type": "TEXT",
"parentNode": "slide_01",
"position": { "x": 72, "y": 56 },
"positionAbsolute": { "x": 72, "y": 56 },
"width": 520,
"height": 64,
"selected": false,
"dragging": false,
"style": { "width": 520, "height": 64 },
"data": {
"label": "客户增长方案",
"backgroundColor": "transparent",
"borderColor": "transparent",
"borderWidth": 0,
"textColor": "#111827",
"fontSize": 36,
"width": 520,
"height": 64,
"borderRadius": 0,
"align": "left",
"verticalAlign": "center",
"text": "客户增长方案"
}
}
```
多页布局示例:
| 页码 | SECTION id | position / positionAbsolute | width x height |
| --- | --- | --- | --- |
| 第 1 页 | `slide_01` | `{ "x": 0, "y": 0 }` | `1280 x 720` |
| 第 2 页 | `slide_02` | `{ "x": 0, "y": 820 }` | `1280 x 720` |
| 第 3 页 | `slide_03` | `{ "x": 0, "y": 1640 }` | `1280 x 720` |
PPT 画布生成后自检:
- 是否每一页都有一个 `type: "SECTION"` 的页面分区。
- 是否每个页面分区都是 `16:9`,推荐 `1280 x 720`。
- 是否所有非页面内容节点都有 `parentNode` 指向某个 `SECTION`。
- 是否复杂展示内容优先使用了 `INFOGRAPHIC`,并在 `data.infographicSyntax` 中写入合法 AntV Infographic 语法。
- 是否所有内容节点的相对 `position` 落在所属页面分区内。
- 是否所有页面分区和内容节点仍满足可渲染字段模板。
## 9. 常见业务流程模板
审批流程:
1. `PARALLELOGRAM` 提交申请。
2. `RECTANGLE` 系统校验字段和权限。
3. `DIAMOND` 是否需要主管审批。
4. `RECTANGLE` 主管审批。
5. `DIAMOND` 是否通过。
6. `CYLINDER` 写入审批结果。
7. `DOCUMENT` 生成审批记录或回执。
工单流程:
1. `PARALLELOGRAM` 客户提交工单。
2. `RECTANGLE` 系统识别问题类型。
3. `DIAMOND` 是否可自动回复。
4. `RECTANGLE` 工程师处理。
5. `CYLINDER` 更新工单状态。
6. `DOCUMENT` 沉淀知识条目。
数据处理流程:
1. `PARALLELOGRAM` 导入或接收数据。
2. `RECTANGLE` 清洗和标准化。
3. `DIAMOND` 是否存在异常。
4. `RECTANGLE` 人工修正异常。
5. `CYLINDER` 写入多维表。
6. `EMBEDDED_SHEET` 展示结果视图。
## 10. 业务工作流生成清单
生成前确认:
1. 触发条件是什么。
2. 参与角色有哪些。
3. 核心业务对象是什么。
4. 正常路径有哪些步骤。
5. 判断条件有哪些。
6. 异常路径如何处理。
7. 最终沉淀到哪里:表格、文档、报表、消息或外部系统。
生成后自检:
- 每个节点只做一件事。
- 每个节点都有清晰业务职责和合适 `type`。
- 所有节点都有稳定 `id`。
- 所有节点都有 `style.width/height`、顶层 `width/height`、`positionAbsolute`、`data.width/height`、`data.align/verticalAlign`。
- 所有边的 `source/target` 都能找到节点。
- 所有边都有 `sourceHandle/targetHandle`、`markerEnd`、`style.stroke/style.strokeWidth`。
- 至少有一个起点和一个终点。
- 条件分支有清晰 label。
- 保存前能通过 `canvas save` 的 `nodes/edges` 校验。
- 如果用户要 PPT / 演示稿,必须额外确认一页一个 `SECTION`、页面比例 `16:9`、所有内容节点都在页面分区内。
- 如果用户要展示复杂信息,必须优先考虑 `INFOGRAPHIC`,并检查 `data.infographicSyntax` 是否以 `infographic <template-name>` 开头。
## 11. 保存要求
- 新建画布可以在 `canvas create --file` 中直接带初始图。
- 修改已有画布必须先执行 `canvas info`,再执行 `canvas save`。
- 输出文件建议命名为 `*-canvas.json`,方便后续版本追踪。
# rules(发布兼容层)
本目录用于兼容 ClawHub / OpenClaw 的 `rules/` 目录扫描约定。
当前章节正文以 `overview.md` 为准;需要命令和生成细节时再看 `references/`。
# 审批工作流 AI 自动生成规范
本文档用于指导 AI 根据用户描述生成可落地的审批工作流。它属于 `dimens-manager` 的工作流章节,不新增顶层 Skill。
## 1. 适用场景
当用户提出下面这类需求时,优先使用本文档:
| 用户表达 | 默认意图 |
| --- | --- |
| AI 自动生成审批工作流 | 生成审批流定义草案,并给出落地步骤 |
| 一键生成业务审批流程 | 从业务规则抽取触发条件、审批节点、分支和动作 |
| 请假 / 报销 / 采购 / 合同审批流程 | 按真实业务表单字段和角色生成审批链路 |
| 审批节点自动化处理 | 在人工审批节点前后补自动校验、通知、回写节点 |
| 把审批流程挂到项目里 | 补齐团队定义、项目挂载、系统视图与权限检查 |
如果用户说的是“生成一个审批系统”,这是系统级建设需求,应先路由到 `dimens-system-orchestrator`;如果用户说的是“生成审批工作流 / 审批流程 / 审批节点”,才进入本文档。
## 2. 执行前必须收集的信息
AI 生成审批工作流前,至少要明确下面信息:
| 信息 | 说明 | 缺失时默认处理 |
| --- | --- | --- |
| `teamId` | 团队隔离上下文 | 不能执行真实写入,只能生成方案和草案 |
| `projectId` | 项目创建上下文 | 允许直接创建项目内审批流;缺失时只能生成草案,不能落到项目路由 |
| 业务对象 | 例如请假单、报销单、采购单、合同 | 从用户描述抽取,没有则先问清 |
| 发起入口 | 通常是多维表格 `workflow` 字段 | 默认按表格字段发起和展示摘要 |
| 审批角色 | 直接主管、部门负责人、财务、法务、管理员等 | 缺失时使用角色占位,不写死用户 |
| 条件分支 | 金额、天数、风险等级、合同类型等 | 没有则生成直线审批链路 |
| 结束动作 | 通过、拒绝、撤回、超时、回写字段、通知 | 默认包含通过、拒绝、撤回三类 |
## 3. 生成结果分三层
AI 输出不能只给自然语言说明,必须按三层组织。
### 3.1 业务审批蓝图
蓝图用于让用户确认业务规则,至少包含:
- 触发条件
- 申请人输入字段
- 审批角色与顺序
- 条件分支
- 自动化动作
- 结束状态
- 异常路径
### 3.2 工作流图草案
草案用于落到 `flow_info.draft/data`,建议输出 JSON 对象,至少包含:
```json
{
"pluginType": "approval",
"nodes": [],
"edges": [],
"globalVariables": [],
"meta": {
"source": "dimens-manager",
"scenario": "approval-generation"
}
}
```
说明:
- `pluginType` 固定为 `approval`,避免生成全功能工作流节点。
- `nodes` 和 `edges` 必须稳定可读,节点 `id` 使用英文短名。
- `globalVariables` 只放跨节点共享的变量,不要把整张表字段全部塞进去。
- 如果只是文档草案,不要声称已经创建或发布了工作流。
### 3.3 项目落地计划
落地计划必须覆盖:
1. 如果有 `projectId`,优先直接调用项目内创建接口生成审批流。
2. 保存草稿并调试。
3. 发布工作流。
4. 验证项目内审批流是否可在当前项目中直接读取和执行。
5. 如果还存在团队级复用需求,再考虑团队安装实例或项目绑定。
6. `systemView` 设置为 `approval`。
7. 在表格里用 `workflow` 类型字段作为发起入口。
8. 验证审批实例、任务、候选人、动作日志和字段摘要回写。
## 4. 节点总表与配置清单
审批工作流生成时,先按“核心必备节点”和“按场景补充节点”拆开,不要把可选节点写成必备,也不要少掉拒绝路径。下面的配置名是**推荐写法**,如果后端实现字段名略有差异,必须以当前实现为准,但语义不能省。
### 4.1 核心必备节点
| 节点语义 | 是否必备 | 推荐 id 示例 | 必填配置 | 常见可选配置 | 少了会怎样 |
| --- | --- | --- | --- | --- | --- |
| 开始节点 | 必备 | `start` | `label`, `variables` | `triggerField`, `sourceSheetId` | 没有入口变量,后续审批节点拿不到申请单上下文 |
| 表单校验 | 必备 | `validate_request` | `label`, `rules` | `failMessage`, `haltOnFail` | 校验规则不完整时,草案一执行就容易报参数或规则错误 |
| 条件判断 | 按需,但审批分支常用 | `amount_branch` | `label`, `expression` 或 `rules` | 边标签 `通过/驳回/超过阈值/不超过阈值` | 分支条件不明确会导致连线方向和业务语义混乱 |
| 人工审批 | 大多数审批必备 | `manager_approval` | `label`, `assigneeStrategy`, `roleKey` 或 `candidateUserIds`, `actions` | `timeout`, `canTransfer`, `remarkRequired` | 没有审批人策略时,常见报错是“找不到审批人/候选人” |
| 多级审批 | 按需 | `finance_approval` | `label`, `assigneeStrategy`, `roleKey` 或 `candidateUserIds`, `actions` | `timeout`, `canTransfer`, `skipWhen` | 多级审批少了这一层,会把财务、法务、负责人等关键节点跳过去 |
| 通过终点 | 必备 | `approved_end` | `label`, `result` | `summary`, `notifyTemplate` | 没有通过终点,流程无法正常收口 |
| 拒绝终点 | 必备 | `rejected_end` | `label`, `result` | `reasonField`, `notifyTemplate` | 没有拒绝终点,拒绝路径会断掉,容易出现悬挂状态 |
### 4.2 按场景补充节点
| 节点语义 | 是否必备 | 推荐 id 示例 | 必填配置 | 常见可选配置 | 少了会怎样 |
| --- | --- | --- | --- | --- | --- |
| 通知节点 | 推荐 | `notify_result` | `label`, `recipients`, `template` 或 `message` | `trigger`, `notifyApplicant`, `notifyApprovers` | 没有通知配置时,审批结束后只能“默默结束” |
| 回写节点 | 推荐 | `sync_workflow_cell` | `label`, `action`, `targetField` 或 `mapping` | `summaryFields`, `writeMode` | 没有回写节点时,表格里的 `workflow` 摘要字段不会更新 |
| 自动归档 | 按需 | `auto_archive` | `label`, `action`, `targetStatus` | `archiveReason`, `writeBackFields` | 归档节点没配时,可能只改状态不沉淀结果 |
| 撤回终点 | 按需 | `withdraw_end` | `label`, `result` | `reasonField` | 用户要求“可撤回”但没给撤回终点时,撤回语义容易和拒绝混淆 |
| 超时终点 | 按需 | `timeout_end` | `label`, `result` | `timeoutMinutes`, `escalation` | 有超时要求却没收口时,容易只挂起不结束 |
### 4.3 节点配置原则
1. `node.id` 必须稳定、唯一,建议使用英文短名,不要用中文和空格。
2. 每个审批节点都必须明确“谁来处理”,优先用 `roleKey`、`candidateUserIds`、`candidateRoleIds` 这类策略,不要写死姓名。
3. 条件节点必须至少有两条出边,且边标签要能看出分支含义。
4. 通知、回写、归档类节点如果被使用,就必须填完整目标配置,不能只留空壳。
5. 终点必须能区分通过、拒绝、撤回、超时等不同结果,不要把所有结果都落到一个终点里。
6. 如果后端暂时没有独立的 `withdraw_end` 或 `timeout_end` 类型,不要硬编不存在的节点类型,改用“动作节点 + 终点节点”的组合表达语义。
7. 如果某个场景不需要通知、回写或归档,就不要为了“凑节点数”强行加节点。
## 5. 最小 JSON 模板
下面模板适合“普通金额审批”场景,AI 可按业务描述增删节点:
```json
{
"pluginType": "approval",
"nodes": [
{
"id": "start",
"type": "start",
"data": {
"label": "提交申请",
"variables": ["rowId", "applicantId", "amount", "reason"]
}
},
{
"id": "validate_request",
"type": "condition",
"data": {
"label": "校验申请信息",
"rules": [
{ "field": "amount", "operator": ">", "value": 0 },
{ "field": "reason", "operator": "notEmpty" }
]
}
},
{
"id": "manager_approval",
"type": "approval",
"data": {
"label": "直属负责人审批",
"assigneeStrategy": "role",
"roleKey": "direct_manager",
"actions": ["approve", "reject", "transfer"]
}
},
{
"id": "amount_branch",
"type": "condition",
"data": {
"label": "金额是否超过 5000",
"expression": "amount > 5000"
}
},
{
"id": "finance_approval",
"type": "approval",
"data": {
"label": "财务复核",
"assigneeStrategy": "role",
"roleKey": "finance_reviewer",
"actions": ["approve", "reject"]
}
},
{
"id": "sync_workflow_cell",
"type": "action",
"data": {
"label": "回写审批摘要",
"action": "syncWorkflowCell"
}
},
{
"id": "approved_end",
"type": "end",
"data": {
"label": "审批通过"
}
},
{
"id": "rejected_end",
"type": "end",
"data": {
"label": "审批拒绝"
}
}
],
"edges": [
{ "id": "edge_start_validate", "source": "start", "target": "validate_request" },
{ "id": "edge_validate_manager", "source": "validate_request", "target": "manager_approval" },
{ "id": "edge_manager_amount", "source": "manager_approval", "target": "amount_branch", "label": "同意" },
{ "id": "edge_manager_reject", "source": "manager_approval", "target": "rejected_end", "label": "拒绝" },
{ "id": "edge_amount_finance", "source": "amount_branch", "target": "finance_approval", "label": "超过 5000" },
{ "id": "edge_amount_sync", "source": "amount_branch", "target": "sync_workflow_cell", "label": "不超过 5000" },
{ "id": "edge_finance_sync", "source": "finance_approval", "target": "sync_workflow_cell", "label": "同意" },
{ "id": "edge_finance_reject", "source": "finance_approval", "target": "rejected_end", "label": "拒绝" },
{ "id": "edge_sync_end", "source": "sync_workflow_cell", "target": "approved_end" }
],
"globalVariables": [
{ "key": "rowId", "type": "string", "required": true },
{ "key": "applicantId", "type": "string", "required": true },
{ "key": "amount", "type": "number", "required": true },
{ "key": "reason", "type": "string", "required": true }
],
"meta": {
"source": "dimens-manager",
"scenario": "approval-generation"
}
}
```
## 6. 项目挂载规则
审批工作流要进入项目业务入口,不能只创建团队工作流定义。
必须检查:
- 工作流是否已发布。
- `usageType` 是否为 `approval`。
- 项目绑定关系是否存在。
- `systemView` 是否为 `approval`。
- 当前用户是否具备项目可见和审批操作权限。
- 表格是否已有 `workflow` 类型字段作为发起入口。
一句话规则:
**团队工作流负责定义,项目绑定负责入口,审批运行表负责真值,`workflow` 字段只负责发起和展示摘要。**
## 7. 当前 CLI 能力边界
当前 `dimens-cli` 已封装的是 `ai chat-completions` 等运行/调用入口;项目内审批流创建、更新、发布已经有独立服务端路由,但不等于 CLI 已完整封装。
因此 Skill 输出时必须区分:
| 输出内容 | 可以怎么说 |
| --- | --- |
| 生成审批工作流草案 | 可以直接输出 JSON 和落地步骤 |
| 调用 AI 辅助生成 | 可用 `dimens-cli ai chat-completions` 让模型产出草案 |
| 创建 / 更新 / 发布项目审批流 | 优先说明项目内路由 `/app/approval/:teamId/:projectId/workflow/create|update|publish`,并明确创建结果是项目归属,不是团队安装实例 |
| 团队工作流安装 / 跨项目绑定 | 说明仍需要看团队定义、项目挂载和绑定关系 |
| 验证运行结果 | 需要看审批实例、任务、候选人、日志、字段摘要和权限 |
## 8. 推荐 AI 提示语
```text
你是维表智联审批工作流生成助手。
请根据我的业务描述,输出三部分:
1. 业务审批蓝图
2. pluginType=approval 的工作流 JSON 草案,包含 nodes、edges、globalVariables、meta
3. 项目落地计划,覆盖项目内创建接口、发布、workflow 字段入口、权限和运行验证
业务描述:
{{用户业务描述}}
约束:
- 不要新增顶层 Skill
- 不要把审批画布等同于可执行审批工作流
- 不要声称 server-only 能力已被 CLI 完整封装
- 审批真值以后端审批实例表为准,表格 workflow 字段只展示摘要
```
## 8.1 项目内创建接口
当 `projectId` 已知时,优先输出下面这个创建请求,而不是只给团队级草案:
```http
POST /app/approval/:teamId/:projectId/workflow/create
```
请求体示例:
```json
{
"name": "报销审批",
"label": "expense_approval",
"description": "5000 元以内直属负责人审批,超过 5000 元追加财务复核",
"draft": {
"nodes": [],
"edges": []
}
}
```
返回语义里需要特别关注:
- `ownerScope = project`:这是项目归属审批流。
- `usageType = approval`:这是审批类型,不是通用工作流。
- `projectId = 当前项目`:说明它已经落在目标项目中。
- `bindScope = unbound`:这是这个创建路径的正常语义,不代表创建失败。
- `isInstalledInstance = false`:说明它不是团队安装实例,而是项目内直接创建的审批流。
如果后续要更新、发布或分页读取,继续使用同一条项目路由。
```
## 9. 验证清单
生成审批工作流后,至少按下面清单检查:
- 节点是否存在唯一 `id`。
- 连线 `source/target` 是否都能指向已有节点。
- 是否至少有开始、人工审批、通过结束、拒绝结束四类节点。
- 条件分支是否有清晰的通过和异常路径。
- 审批人是否用角色、部门或人员策略表达,而不是写死姓名。
- 是否说明 `teamId/projectId/systemView=approval`。
- 是否说明 `workflow` 字段入口和摘要回写边界。
- 是否区分了 CLI 已封装能力与 server-only 能力。
### 9.1 更细的节点校验
- `start` 是否包含能串起整条审批链路的上下文变量。
- `validate_request` 是否把必填字段和失败处理写明。
- 每个审批节点是否都能定位到明确审批人策略。
- 条件节点是否至少有两条有意义的出边。
- 通知节点是否明确通知对象和触发时机。
- 回写节点是否明确写回字段或摘要目标。
- 拒绝路径是否直达 `rejected_end` 或拒绝终点链路。
- 通过路径是否直达 `approved_end` 或通过终点链路。
- 是否存在没有后继节点的“悬挂节点”。
- 是否存在重复 `id` 或指向不存在节点的边。
### 9.2 场景模板校验
- 请假模板至少要能覆盖单级审批和多天数升级两种情况。
- 报销模板至少要能覆盖金额阈值分支和财务复核。
- 采购模板至少要能覆盖金额分支和合规检查扩展位。
- 合同模板至少要能覆盖法务审批和拒绝通知。
## 10. 常见报错与修正
| 报错 / 异常 | 常见原因 | 修正方式 |
| --- | --- | --- |
| 只有开始和结束,没有审批节点 | 把审批流写成了普通动作流 | 补 `manager_approval`,必要时再补 `finance_approval` |
| 审批节点报“找不到审批人” | `assigneeStrategy`、`roleKey` 或候选人列表没配好 | 先明确使用角色、部门还是指定人员,再补对应配置 |
| 条件分支跑偏 | `expression`、`rules` 或边标签不清楚 | 让分支条件和边标签一一对应,避免一条边承载多个语义 |
| 拒绝后没有结束 | 只有通过终点,没有拒绝终点 | 必须补 `rejected_end`,并让拒绝边直接指向它 |
| 回写字段没有变化 | `sync_workflow_cell` 没写 `targetField` 或 `mapping` | 先确认要写回的表字段,再补映射 |
| 通知没发出去 | `recipients` 或 `template/message` 为空 | 先确认通知对象,再决定模板或消息内容 |
| 草案能看懂但运行时报错 | 节点 id 重复、边指向不存在节点、或用了未支持的节点类型 | 先查节点唯一性和边连通性,再对照当前实现收敛节点类型 |
## 11. 标准审批场景模板
下面四类模板是最常见的审批工作流场景。生成时不要从零发散,优先在这些模板上按业务字段做增删,这样最不容易漏掉节点和配置。
### 11.1 请假审批
适用场景:年假、事假、调休、病假、外出申请。
建议节点:
```text
start -> validate_request -> manager_approval -> approved_end
└-> rejected_end
```
建议补充条件:
- 请假天数大于阈值时,增加部门负责人审批。
- 病假、外出类可根据类型增加附件或证明材料校验。
- 超过某个天数时,增加财务或行政复核。
建议配置:
| 节点 | 必填配置 | 常用配置 |
| --- | --- | --- |
| `start` | `variables` | `triggerField`, `sourceSheetId` |
| `validate_request` | `rules` | `failMessage`, `haltOnFail` |
| `manager_approval` | `assigneeStrategy`, `roleKey`, `actions` | `timeout`, `canTransfer`, `remarkRequired` |
| `approved_end` | `result` | `summary` |
| `rejected_end` | `result` | `reasonField` |
### 11.2 报销审批
适用场景:差旅报销、办公报销、采购报销、业务招待。
建议节点:
```text
start -> validate_request -> amount_branch -> manager_approval -> approved_end
├-> finance_approval -> approved_end
└-> rejected_end
```
建议补充条件:
- 金额低于阈值时只走直属负责人审批。
- 金额高于阈值时增加财务复核。
- 涉及票据或附件时必须加附件校验节点。
建议配置:
| 节点 | 必填配置 | 常用配置 |
| --- | --- | --- |
| `start` | `variables` | `triggerField`, `sourceSheetId` |
| `validate_request` | `rules` | `failMessage`, `haltOnFail` |
| `amount_branch` | `expression` 或 `rules` | `label` 分支说明 |
| `manager_approval` | `assigneeStrategy`, `roleKey`, `actions` | `timeout`, `canTransfer` |
| `finance_approval` | `assigneeStrategy`, `roleKey`, `actions` | `timeout`, `canTransfer`, `skipWhen` |
| `approved_end` | `result` | `summary`, `notifyTemplate` |
| `rejected_end` | `result` | `reasonField`, `notifyTemplate` |
### 11.3 采购审批
适用场景:物料采购、服务采购、固定资产采购、供应商比价。
建议节点:
```text
start -> validate_request -> amount_branch -> manager_approval -> finance_approval -> approved_end
└-> rejected_end
```
建议补充条件:
- 金额超过阈值时,增加更高层级审批。
- 涉及供应商选择时,增加比价或合规检查节点。
- 固定资产类采购可增加资产编码或入账校验节点。
建议配置:
| 节点 | 必填配置 | 常用配置 |
| --- | --- | --- |
| `start` | `variables` | `triggerField`, `sourceSheetId` |
| `validate_request` | `rules` | `failMessage`, `haltOnFail` |
| `amount_branch` | `expression` | `label` 分支说明 |
| `manager_approval` | `assigneeStrategy`, `roleKey`, `actions` | `timeout`, `canTransfer` |
| `finance_approval` | `assigneeStrategy`, `roleKey`, `actions` | `timeout`, `canTransfer` |
| `approved_end` | `result` | `summary`, `writeBackFields` |
| `rejected_end` | `result` | `reasonField`, `notifyTemplate` |
### 11.4 合同审批
适用场景:销售合同、采购合同、服务合同、补充协议。
建议节点:
```text
start -> validate_request -> amount_branch -> manager_approval -> legal_approval -> approved_end
└-> rejected_end
```
建议补充条件:
- 合同金额、期限、风险等级决定是否进入法务审批。
- 模板类合同可增加条款校验节点。
- 涉及对外签署时可增加通知或归档节点。
建议配置:
| 节点 | 必填配置 | 常用配置 |
| --- | --- | --- |
| `start` | `variables` | `triggerField`, `sourceSheetId` |
| `validate_request` | `rules` | `failMessage`, `haltOnFail` |
| `amount_branch` | `expression` | `label` 分支说明 |
| `manager_approval` | `assigneeStrategy`, `roleKey`, `actions` | `timeout`, `canTransfer` |
| `legal_approval` | `assigneeStrategy`, `roleKey`, `actions` | `timeout`, `canTransfer`, `remarkRequired` |
| `approved_end` | `result` | `summary`, `notifyTemplate`, `writeBackFields` |
| `rejected_end` | `result` | `reasonField`, `notifyTemplate` |
### 11.5 场景选择原则
1. 先确定申请类型,再选模板,不要先选节点再倒推业务。
2. 先确定是否需要金额分支,再决定是否引入 `amount_branch`。
3. 先确定是否需要多人审批,再决定是否加 `finance_approval`、`legal_approval` 或更高层级节点。
4. 先确定是否需要附件、票据、合同文本校验,再决定是否加校验节点。
5. 如果只是单级审批,不要强行塞入财务、法务或超时节点。
6. 如果业务明确要求“拒绝后通知申请人”,拒绝终点必须配通知动作,不要只写结束。
7. 如果业务要求“审批通过后回写表格”,通过终点前必须有回写节点或回写动作。
# 系统级业务场景画布流程
本文档用于优化 `dimens-system-orchestrator` 的系统搭建流程:当用户要生成完整业务系统时,除了表格、文档、报表,还要按需补“业务场景画布”,用来表达业务流程、角色协作、审批流转和异常路径。
## 1. 定位
业务场景画布是系统方案的可视化交付物,不等同于可执行工作流。
| 类型 | 主要作用 | 下一跳 |
| --- | --- | --- |
| 业务场景画布 | 展示业务对象、角色、阶段、状态流转、异常路径 | `dimens-manager/references/canvas/overview.md` |
| 审批工作流画布 | 展示发起、条件分支、人工审批、拒绝/撤回、摘要回写等审批业务流程 | `dimens-manager/references/canvas/overview.md` + `dimens-manager/references/workflow/references/approval-generation.md` |
| PPT 演示稿画布 | 用画布表达汇报页、方案页、路演页等演示稿内容 | `dimens-manager/references/canvas/references/generation-guide.md#8-ppt--演示稿画布规则` |
| 可执行审批工作流 | 真实创建、发布、项目挂载和运行审批任务 | `dimens-manager/references/workflow/overview.md` |
一句话规则:
**画布负责看清业务场景,可执行工作流负责跑通业务动作。**
## 2. 什么时候必须加画布
系统拆解中出现下面任一条件时,默认应补业务场景画布:
- 用户明确说“流程、流转、审批、自动化、节点、场景、业务链路”。
- 用户明确说“PPT、演示稿、幻灯片、汇报页”,并且希望在画布中生成可编辑页面。
- 系统涉及 3 个以上角色协作。
- 核心对象存在明显生命周期,例如线索、商机、工单、合同、采购单、报销单。
- 流程包含条件分支、退回、撤回、超时、异常处理。
- 用户希望 AI 自动生成系统方案,并且要能直观看到业务场景。
如果只是简单维护一张静态表,不强制创建画布。
## 3. 系统级默认流程
总控 Skill 处理完整系统建设时,推荐按下面顺序补画布:
1. 先拆业务对象和角色。
2. 再拆表格字段和状态模型。
3. 识别是否存在流程、审批或自动化。
4. 生成业务场景画布草案。
5. 如果是审批场景,再生成审批工作流画布草案。
6. 需要保存时路由到 `dimens-manager` 执行 `canvas create -> canvas info -> canvas save`。
7. 需要真实执行审批时,再路由到 `dimens-manager/references/workflow/overview.md`。
不要在业务对象、角色和状态都没拆清前直接生成画布,否则画布会变成空泛流程图。
## 4. 业务场景画布输出要求
业务场景画布至少包含:
| 画布元素 | 要求 |
| --- | --- |
| 角色泳道 | 申请人、审批人、负责人、财务、管理员、外部客户等 |
| 业务对象 | 表单、工单、合同、商机、采购单、报销单等 |
| 状态节点 | 草稿、待审批、处理中、已完成、已拒绝、已撤回 |
| 动作节点 | 提交、分配、审批、复核、通知、归档、回写 |
| 条件节点 | 金额、风险、优先级、部门、合同类型等 |
| 异常路径 | 拒绝、退回、撤回、超时、转交、人工兜底 |
| 数据沉淀 | 表格字段、审批摘要、报表统计口径 |
## 5. 系统级节点职责与用法
总控生成画布草案时,先定义节点职责,再选择节点类型。不要把完整业务流程全部画成 `RECTANGLE`,否则后续 AI 保存出来的流程图会失去业务语义。
| 系统级元素 | 推荐节点类型 | 作用 | 用法 |
| --- | --- | --- | --- |
| 用户提交、外部导入、接口返回 | `PARALLELOGRAM` | 表示输入或输出 | 放在流程入口、接口边界或结果输出位置 |
| 系统处理、人工处理、状态动作 | `RECTANGLE` | 表示普通业务动作 | `label` 使用“动词 + 对象”,一个节点只做一件事 |
| 审批、风控、规则判断 | `DIAMOND` | 表示条件分支 | 出边必须写“是/否/通过/驳回/命中/未命中” |
| 表格、数据库、知识库、日志 | `CYLINDER` | 表示数据沉淀或读取 | 用于“写入客户表”“读取库存数据”“沉淀知识库” |
| 合同、报告、回执、SOP | `DOCUMENT` / `MARKDOWN` | 表示文档产物或长说明 | 业务产物用 `DOCUMENT`,规则说明用 `MARKDOWN` |
| 角色泳道、阶段区域 | `SECTION` | 表示分组背景 | 用于“销售阶段”“财务审批”“售后处理”,不作为流程步骤 |
| 信息图、复杂展示、PPT 核心页 | `INFOGRAPHIC` | 表示复杂信息、趋势、对比、路径、关系的强视觉表达 | PPT 和复杂展示场景优先使用,内容写入 `data.infographicSyntax` |
| 画布内 AI 智能体生成 | `CUSTOM_AGENT` | 读取上游节点并生成 Markdown、思维导图或信息图等后续节点 | 只在需要用户点击运行并生成内容时使用,不作为普通业务处理步骤 |
| 项目表格视图 | `EMBEDDED_SHEET` | 表示嵌入多维表视图 | 真实落地时需要 `embeddedSheet.sheetId/viewId` |
| 风险提示、补充说明 | `TEXT` / `STICKY_NOTE` | 表示备注 | 放在相关节点旁边,不接入主流程时序 |
节点说明要求:
- 每个节点必须能说清业务职责,例如“采集申请信息”“判断是否超预算”“写入审批结果”。
- 每条边必须表达时序或分支,不要把业务动作写在边上。
- 判断节点至少有两条出边,分支 label 必须清楚。
- `SECTION`、`TEXT`、`STICKY_NOTE` 是辅助表达,不要当成主流程动作。
- `CUSTOM_AGENT` 是画布内 AI 智能体,不要滥用为普通“AI 分析”业务步骤。
- 需要保存或生成完整 JSON 时,继续进入 `dimens-manager/references/canvas/references/generation-guide.md`。
输出画布 JSON 时,必须至少包含:
```json
{
"version": "1.0",
"timestamp": 1777800000000,
"nodes": [],
"edges": [],
"viewport": { "x": 0, "y": 0, "zoom": 1 },
"meta": {
"source": "dimens-system-orchestrator",
"scenario": "business-canvas"
}
}
```
保存型 JSON 不能只给 `id/type/position/data.label` 这种简化节点。总控如果直接生成草案,也必须遵循 `dimens-manager/references/canvas/references/generation-guide.md` 的可渲染字段模板:
- 节点必须包含 `style.width/height`、顶层 `width/height`、`positionAbsolute`、`data.width/height`、`data.borderRadius`、`data.align`、`data.verticalAlign`、`selected`、`dragging`。
- 边必须包含 `sourceHandle`、`targetHandle`、`markerEnd: { "type": "arrowclosed" }`、`style.stroke`、`style.strokeWidth`、`animated`、`selected`、`zIndex`。
- 普通边使用 `type: "default"`,分支、回退或跨层级连线使用 `type: "smoothstep"`,不要使用前端无法识别的边类型。
如果用户要 PPT / 演示稿 / 幻灯片画布,必须额外遵守:
- PPT 画布必须是 `16:9`。
- 最外层必须是 `SECTION` 页面分区,一页 PPT 对应一个 `SECTION`。
- 每页推荐 `1280 x 720`,页面间纵向间隔默认 `100`。
- 所有标题、正文、图表、流程、图片、备注等内容节点都必须通过 `parentNode` 放在对应页面分区内。
- 复杂展示内容优先用 `INFOGRAPHIC`,包括方案亮点、路径拆解、趋势、对比、SWOT、象限、系统关系和流程概览。
- 继续进入 `dimens-manager/references/canvas/references/generation-guide.md#8-ppt--演示稿画布规则` 查看页面分区模板。
## 6. 审批工作流画布要求
审批工作流画布是审批场景的可视化说明,不直接等同于 `flow_info` 中的可执行定义。
审批画布至少要表达:
- 发起入口:通常是表格的 `workflow` 字段。
- 申请信息:申请单字段、附件、金额、原因、发起部门。
- 审批链路:直属负责人、部门负责人、财务、法务、管理员等。
- 条件分支:金额阈值、天数、风险等级、合同类型。
- 人工动作:同意、拒绝、退回、转交、撤回。
- 自动动作:通知、编号、状态回写、审批摘要回写。
- 结束状态:已通过、已拒绝、已撤回、已超时。
审批画布在表达时,还要给出“节点职责边界”,不能只画线不讲配置:
| 画布节点 | 需要说清的配置 |
| --- | --- |
| 开始节点 | 触发来源、申请单上下文、入参变量 |
| 校验节点 | 必填字段、金额/天数/风险规则、失败提示 |
| 审批节点 | 审批人策略、角色/人员来源、可执行动作、是否允许转交 |
| 条件节点 | 判断表达式、分支标签、进入哪条后续链路 |
| 通知节点 | 通知对象、模板、触发时机 |
| 回写节点 | 写回哪个字段、摘要内容、是否同步状态 |
| 终点节点 | 结束结果、是否需要沉淀原因或摘要 |
如果用户要求“这个审批流要能跑”,必须继续进入:
```text
dimens-manager/references/workflow/references/approval-generation.md
```
## 7. 推荐路由
| 用户意图 | 先由总控做什么 | 下一跳 |
| --- | --- | --- |
| 生成一个业务系统,并体现业务流程 | 在系统拆解中补业务场景画布 | `dimens-manager/references/canvas/overview.md` |
| 生成审批系统 | 先拆系统模块,再补审批工作流画布和可执行审批流计划 | `dimens-manager/references/canvas/overview.md` + `dimens-manager/references/workflow/overview.md` |
| 生成审批工作流画布 | 直接生成审批画布草案,强调非可执行边界 | `dimens-manager/references/canvas/overview.md` |
| 生成 PPT / 演示稿 / 幻灯片画布 | 直接路由到画布章节,按 16:9 和一页一个 `SECTION` 生成 | `dimens-manager/references/canvas/references/generation-guide.md#8-ppt--演示稿画布规则` |
| AI 自动生成审批工作流 | 生成审批蓝图和 `pluginType=approval` 工作流草案 | `dimens-manager/references/workflow/references/approval-generation.md` |
| 保存画布版本 | 不在总控里细化,转到画布命令链 | `dimens-manager/references/canvas/overview.md` |
## 8. 验收标准
系统级方案如果声明“已补业务场景画布”,至少要满足:
- 画布能看出核心业务对象。
- 画布能看出主要角色和职责边界。
- 画布能看出主流程和异常路径。
- 每个节点能说清业务职责,并且节点类型能表达输入、处理、判断、沉淀、文档、AI 辅助等不同语义。
- 审批画布能看出发起、审批、拒绝、撤回、回写摘要。
- PPT 画布必须每页都有 `SECTION` 分区,比例为 `16:9`,页面内容节点都在对应分区内。
- 复杂展示页必须优先使用 `INFOGRAPHIC`,并提供合法 `data.infographicSyntax`。
- 保存型任务必须执行或说明 `canvas create -> canvas info -> canvas save`。
- 可执行审批流必须另有工作流定义、发布、项目挂载和运行验证计划。
+119
-2

@@ -58,2 +58,106 @@ //#region src/sdk/client.d.ts

//#endregion
//#region src/sdk/canvas.d.ts
interface CanvasGraphValue {
nodes: unknown[];
edges: unknown[];
viewport?: {
x: number;
y: number;
zoom: number;
};
meta?: Record<string, unknown>;
}
interface CanvasInfo {
canvasId: string;
sheetId: string;
teamId?: string;
projectId: string;
name: string;
data: CanvasGraphValue;
dataHash?: string;
version: number;
lastEditorId?: number;
[key: string]: unknown;
}
interface CanvasCreatePayload {
name: string;
folderId?: string;
data?: CanvasGraphValue;
}
interface CanvasSavePayload {
sheetId: string;
data: CanvasGraphValue;
baseVersion: number;
changeSummary?: string;
}
interface CanvasVersionListPayload {
sheetId: string;
page?: number;
size?: number;
}
interface CanvasVersionItem {
id: string | number;
canvasId: string;
sheetId: string;
version: number;
changeSummary?: string;
source?: string;
createdBy?: number;
createTime?: string;
snapshot?: CanvasGraphValue;
[key: string]: unknown;
}
interface CanvasVersionListResult {
list: CanvasVersionItem[];
pagination?: Record<string, unknown>;
[key: string]: unknown;
}
interface CanvasRestorePayload {
sheetId: string;
version: number;
}
interface CanvasResourcePayload {
projectId?: string;
sheetId?: string;
name: string;
description?: string;
nodes: unknown[];
edges?: unknown[];
tags?: string[];
cover?: string;
}
interface CanvasResourceItem extends CanvasResourcePayload {
id: string;
visibility?: 'private' | 'market';
status?: number;
createdBy?: number;
createTime?: string;
updateTime?: string;
publishTime?: string;
[key: string]: unknown;
}
interface CanvasCreateResult {
sheetId: string;
canvasId: string;
type?: string;
name?: string;
[key: string]: unknown;
}
declare class CanvasSDK {
private readonly client;
constructor(client: DimensClient);
private normalizeCreatedCanvas;
create(projectId: string, payload: CanvasCreatePayload): Promise<APIResponse<CanvasCreateResult>>;
info(teamId: string, projectId: string, sheetId: string): Promise<APIResponse<CanvasInfo>>;
save(teamId: string, projectId: string, payload: CanvasSavePayload): Promise<APIResponse<CanvasInfo>>;
versions(teamId: string, projectId: string, payload: CanvasVersionListPayload): Promise<APIResponse<CanvasVersionListResult>>;
version(teamId: string, projectId: string, sheetId: string, version: number): Promise<APIResponse<CanvasVersionItem>>;
restore(teamId: string, projectId: string, payload: CanvasRestorePayload): Promise<APIResponse<CanvasInfo>>;
listMineResources(teamId: string, keyword?: string): Promise<APIResponse<CanvasResourceItem[]>>;
saveMineResource(teamId: string, payload: CanvasResourcePayload): Promise<APIResponse<CanvasResourceItem>>;
removeMineResource(teamId: string, id: string): Promise<APIResponse<boolean>>;
publishMineResource(teamId: string, id: string): Promise<APIResponse<CanvasResourceItem>>;
listMarketResources(teamId: string, keyword?: string): Promise<APIResponse<CanvasResourceItem[]>>;
}
//#endregion
//#region src/sdk/column.d.ts

@@ -132,2 +236,3 @@ interface ColumnInfo {

info(teamId: string, projectId: string, documentId: string): Promise<APIResponse<DocumentInfo>>;
getBySheetId(teamId: string, projectId: string, sheetId: string): Promise<APIResponse<DocumentInfo>>;
update(teamId: string, projectId: string, payload: DocumentUpdatePayload): Promise<APIResponse<DocumentInfo>>;

@@ -446,2 +551,7 @@ delete(teamId: string, projectId: string, documentId: string): Promise<APIResponse<{

}
interface RowBatchCreatePayload {
rows: Array<{
data: Record<string, unknown>;
}>;
}
interface RowCellPayload {

@@ -460,2 +570,3 @@ rowId: string;

create(sheetId: string, payload: RowCreatePayload): Promise<APIResponse<RowInfo>>;
batchCreate(sheetId: string, payload: RowBatchCreatePayload): Promise<APIResponse<RowInfo[]>>;
update(sheetId: string, rowId: string, data: Record<string, unknown>, version: number): Promise<APIResponse<RowInfo>>;

@@ -597,3 +708,3 @@ delete(sheetId: string, rowId: string): Promise<APIResponse<boolean>>;

icon?: string;
type?: 'sheet' | 'folder' | 'document' | 'report';
type?: 'sheet' | 'folder' | 'document' | 'report' | 'canvas';
folderId?: string;

@@ -634,2 +745,7 @@ [key: string]: unknown;

projectId?: string;
source?: string;
name?: string;
size?: string;
mimeType?: string;
classifyId?: string;
[key: string]: string | undefined;

@@ -679,2 +795,3 @@ }

readonly report: ReportSDK;
readonly canvas: CanvasSDK;
readonly role: RoleSDK;

@@ -922,3 +1039,3 @@ readonly permission: PermissionSDK;

//#endregion
export { type APIResponse, AuthSDK, CLICommand, CLICommandGroup, CLICommandHandler, CLIContext, CLIProfile, ColumnSDK, DimensClient, type DimensClientOptions, DimensSDK, FlowChatSDK, LogEntry, LogLevel, OutputMode, PluginConfig, ProjectSDK, RowSDK, type SDKConfig, SKILLS, SheetSDK, Skill, SkillExample, Tool, ToolHandler, ToolParameter, ToolParameters, ToolResult, UploadSDK, config, createDimensSDK, createLogger, createSDK, initialize as default, initialize, getAllCommands, getAllSkills, getAllTools, getCommand, getGroupCommand, getSkill, getTool, getUserAgent, getVersion, logger, registerAllTools, registerCommand, registerCommands, registerTool, runCLI, version };
export { type APIResponse, AuthSDK, CLICommand, CLICommandGroup, CLICommandHandler, CLIContext, CLIProfile, CanvasSDK, ColumnSDK, DimensClient, type DimensClientOptions, DimensSDK, FlowChatSDK, LogEntry, LogLevel, OutputMode, PluginConfig, ProjectSDK, RowSDK, type SDKConfig, SKILLS, SheetSDK, Skill, SkillExample, Tool, ToolHandler, ToolParameter, ToolParameters, ToolResult, UploadSDK, config, createDimensSDK, createLogger, createSDK, initialize as default, initialize, getAllCommands, getAllSkills, getAllTools, getCommand, getGroupCommand, getSkill, getTool, getUserAgent, getVersion, logger, registerAllTools, registerCommand, registerCommands, registerTool, runCLI, version };
//# sourceMappingURL=index.d.mts.map
+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.mts","names":[],"sources":["../src/sdk/client.ts","../src/sdk/auth.ts","../src/sdk/column.ts","../src/sdk/document.ts","../src/sdk/flow-chat.ts","../src/sdk/permission.ts","../src/sdk/project.ts","../src/sdk/report.ts","../src/sdk/row.ts","../src/sdk/row-acl.ts","../src/sdk/row-policy.ts","../src/sdk/role.ts","../src/sdk/sheet.ts","../src/sdk/upload.ts","../src/sdk/view.ts","../src/sdk/index.ts","../src/types.ts","../src/core/logger.ts","../src/core/config.ts","../src/core/version.ts","../src/tools/registry.ts","../src/tools/index.ts","../src/commands/registry.ts","../src/commands/index.ts","../src/cli.ts","../src/skills/index.ts","../index.ts"],"mappings":"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"}
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/sdk/client.ts","../src/sdk/auth.ts","../src/sdk/canvas.ts","../src/sdk/column.ts","../src/sdk/document.ts","../src/sdk/flow-chat.ts","../src/sdk/permission.ts","../src/sdk/project.ts","../src/sdk/report.ts","../src/sdk/row.ts","../src/sdk/row-acl.ts","../src/sdk/row-policy.ts","../src/sdk/role.ts","../src/sdk/sheet.ts","../src/sdk/upload.ts","../src/sdk/view.ts","../src/sdk/index.ts","../src/types.ts","../src/core/logger.ts","../src/core/config.ts","../src/core/version.ts","../src/tools/registry.ts","../src/tools/index.ts","../src/commands/registry.ts","../src/commands/index.ts","../src/cli.ts","../src/skills/index.ts","../index.ts"],"mappings":"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"}
import { n as logger, t as createLogger } from "./logger-CEOtAYhF.mjs";
import { _ as config, a as getRelatedSkillObjectsForExecutionContext, c as getAllSkills, d as clearCommands, f as getAllCommands, g as registerCommand, h as getGroupCommand, i as clearExecutionContext, l as getSkill, m as getCommandGroup, n as registerCommands, o as setExecutionContext, p as getCommand, r as parseFlags, s as SKILLS, u as getSkillsRootPath } from "./commands-BawiOX7i.mjs";
import { _ as getVersion, c as ProjectSDK, d as SheetSDK, f as ColumnSDK, g as getUserAgent, h as FlowChatSDK, i as RowSDK, l as UploadSDK, m as DimensClient, p as AuthSDK, v as version } from "./view-Cyzxo5yi.mjs";
import { _ as config, a as getRelatedSkillObjectsForExecutionContext, c as getAllSkills, d as clearCommands, f as getAllCommands, g as registerCommand, h as getGroupCommand, i as clearExecutionContext, l as getSkill, m as getCommandGroup, n as registerCommands, o as setExecutionContext, p as getCommand, r as parseFlags, s as SKILLS, u as getSkillsRootPath } from "./commands-CIiYTu6h.mjs";
import { _ as getUserAgent, c as ProjectSDK, d as SheetSDK, f as ColumnSDK, g as FlowChatSDK, h as DimensClient, i as RowSDK, l as UploadSDK, m as AuthSDK, p as CanvasSDK, v as getVersion, y as version } from "./view-dMOh46FK.mjs";
import { a as registerTool, i as getTool, r as getAllTools, t as registerAllTools } from "./tools-C66Gl8k6.mjs";
import { n as createSDK, t as DimensSDK } from "./sdk-DQT9fb9B.mjs";
import { n as createSDK, t as DimensSDK } from "./sdk-B4tFCZxH.mjs";
import { readFileSync } from "node:fs";

@@ -106,3 +106,3 @@ import { relative } from "node:path";

const { registerAllTools } = await import("./tools-C66Gl8k6.mjs").then((n) => n.n);
const { registerCommands } = await import("./commands-BawiOX7i.mjs").then((n) => n.t);
const { registerCommands } = await import("./commands-CIiYTu6h.mjs").then((n) => n.t);
return {

@@ -119,3 +119,3 @@ name: "@bintel/dimens-cli",

async function createDimensSDK(config) {
const { DimensSDK } = await import("./sdk-DQT9fb9B.mjs").then((n) => n.r);
const { DimensSDK } = await import("./sdk-B4tFCZxH.mjs").then((n) => n.r);
if (!config) throw new Error("createDimensSDK 需要传入 baseUrl");

@@ -126,3 +126,3 @@ return new DimensSDK(config);

//#endregion
export { AuthSDK, ColumnSDK, DimensClient, DimensSDK, FlowChatSDK, ProjectSDK, RowSDK, SKILLS, SheetSDK, UploadSDK, config, createDimensSDK, createLogger, createSDK, initialize as default, initialize, getAllCommands, getAllSkills, getAllTools, getCommand, getGroupCommand, getSkill, getTool, getUserAgent, getVersion, logger, registerAllTools, registerCommand, registerCommands, registerTool, runCLI, version };
export { AuthSDK, CanvasSDK, ColumnSDK, DimensClient, DimensSDK, FlowChatSDK, ProjectSDK, RowSDK, SKILLS, SheetSDK, UploadSDK, config, createDimensSDK, createLogger, createSDK, initialize as default, initialize, getAllCommands, getAllSkills, getAllTools, getCommand, getGroupCommand, getSkill, getTool, getUserAgent, getVersion, logger, registerAllTools, registerCommand, registerCommands, registerTool, runCLI, version };
//# sourceMappingURL=index.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.mjs","names":[],"sources":["../src/cli.ts","../index.ts"],"sourcesContent":["import { config } from './core/config';\nimport { readFileSync } from 'node:fs';\nimport { relative } from 'node:path';\nimport { registerCommands, clearCommands, getCommand, getCommandGroup, getGroupCommand } from './commands';\nimport {\n clearExecutionContext,\n getRelatedSkillObjectsForExecutionContext,\n setExecutionContext,\n} from './commands/execution-context';\nimport { parseFlags } from './commands/utils';\nimport { getSkillsRootPath } from './skills';\n\nfunction toRelativeSkillPath(filePath: string): string {\n return relative(getSkillsRootPath(), filePath) || filePath;\n}\n\nfunction printSkillSummary(): void {\n const relatedSkills = getRelatedSkillObjectsForExecutionContext();\n if (relatedSkills.length === 0) {\n return;\n }\n\n console.log('\\n执行前建议关注 Skill:\\n');\n relatedSkills.forEach(skill => {\n console.log(`- ${skill.name}`);\n console.log(` ${skill.description.split('\\n')[0] ?? skill.description}`);\n });\n console.log('');\n}\n\nfunction printSkillMapping(): void {\n const relatedSkills = getRelatedSkillObjectsForExecutionContext();\n if (relatedSkills.length === 0) {\n return;\n }\n\n console.log('\\n执行前建议关注 Skill:\\n');\n relatedSkills.forEach(skill => {\n console.log(`===== ${skill.name} / mapping =====`);\n console.log('命令组:');\n (skill.commandGroups ?? []).forEach(item => console.log(`- ${item}`));\n console.log('命令:');\n (skill.commands ?? []).forEach(item => console.log(`- ${item}`));\n console.log('SDK:');\n (skill.sdkModules ?? []).forEach(item => console.log(`- ${item}`));\n console.log('工具:');\n (skill.toolNames ?? []).forEach(item => console.log(`- ${item}`));\n console.log('');\n });\n}\n\nfunction printSkillFull(): void {\n const relatedSkills = getRelatedSkillObjectsForExecutionContext();\n if (relatedSkills.length === 0) {\n return;\n }\n\n console.log('\\n执行前建议关注 Skill:\\n');\n relatedSkills.forEach(skill => {\n if (!skill.skillPath) {\n return;\n }\n console.log(`===== ${skill.name} / ${toRelativeSkillPath(skill.skillPath)} =====\\n`);\n console.log(readFileSync(skill.skillPath, 'utf8'));\n console.log('');\n });\n}\n\nexport async function runCLI(argv: string[]): Promise<number> {\n await config.load();\n clearCommands();\n clearExecutionContext();\n registerCommands();\n process.exitCode = 0;\n\n const args = argv.filter(Boolean);\n if (args.length === 0) {\n await getCommand('help')?.handler([]);\n return 0;\n }\n\n const [first, second, ...rest] = args;\n if (!first) {\n await getCommand('help')?.handler([]);\n return 0;\n }\n\n if (first === 'help' || first === 'version') {\n await getCommand(first)?.handler([second, ...rest].filter(Boolean) as string[]);\n return 0;\n }\n\n const group = getCommandGroup(first);\n if (!group) {\n console.log(`未找到命令组: ${first}`);\n await getCommand('help')?.handler([]);\n return 1;\n }\n\n if (!second) {\n await getCommand('help')?.handler([first]);\n return 0;\n }\n\n const command = getGroupCommand(first, second);\n if (!command) {\n console.log(`未找到命令: ${first} ${second}`);\n await getCommand('help')?.handler([first]);\n return 1;\n }\n\n setExecutionContext({\n groupName: first,\n commandName: second,\n });\n const flags = parseFlags(rest);\n const showSkillMode = flags['show-skill'];\n if (showSkillMode === 'true' || showSkillMode === 'summary') {\n printSkillSummary();\n } else if (showSkillMode === 'mapping') {\n printSkillMapping();\n } else if (showSkillMode === 'full') {\n printSkillFull();\n }\n await command.handler(rest);\n clearExecutionContext();\n return process.exitCode ?? 0;\n}\n","/**\n * Dimens CLI 插件入口\n * \n * 提供两种使用模式:\n * 1. CLI 模式:命令行工具\n * 2. SDK 模式:直接引入 SDK 调用\n */\n\n// 导出核心类型\nexport * from './src/types';\n\n// 导出核心功能\nexport { logger, createLogger } from './src/core/logger';\nexport { config } from './src/core/config';\nexport { version, getVersion, getUserAgent } from './src/core/version';\n\n// 导出工具\nexport { registerAllTools, registerTool, getTool, getAllTools } from './src/tools';\n\n// 导出命令\nexport {\n registerCommands,\n registerCommand,\n getCommand,\n getGroupCommand,\n getAllCommands,\n} from './src/commands';\nexport { runCLI } from './src/cli';\n\n// 导出技能\nexport { SKILLS, getSkill, getAllSkills } from './src/skills';\n\n// 导出 SDK\nexport {\n DimensSDK,\n createSDK,\n DimensClient,\n AuthSDK,\n ColumnSDK,\n FlowChatSDK,\n ProjectSDK,\n RowSDK,\n SheetSDK,\n UploadSDK,\n type SDKConfig,\n type APIResponse,\n type DimensClientOptions,\n} from './src/sdk';\n\n/**\n * 插件初始化函数\n */\nexport async function initialize() {\n const { registerAllTools } = await import('./src/tools');\n const { registerCommands } = await import('./src/commands');\n \n return {\n name: '@bintel/dimens-cli',\n version: '1.0.0',\n registerTools: registerAllTools,\n registerCommands,\n };\n}\n\n/**\n * 快速创建 SDK 实例\n */\nexport async function createDimensSDK(\n config?: import('./src/sdk').SDKConfig\n) {\n const { DimensSDK } = await import('./src/sdk');\n if (!config) {\n throw new Error('createDimensSDK 需要传入 baseUrl');\n }\n return new DimensSDK(config);\n}\n\nexport default initialize;\n"],"mappings":"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"}
{"version":3,"file":"index.mjs","names":[],"sources":["../src/cli.ts","../index.ts"],"sourcesContent":["import { config } from './core/config';\nimport { readFileSync } from 'node:fs';\nimport { relative } from 'node:path';\nimport { registerCommands, clearCommands, getCommand, getCommandGroup, getGroupCommand } from './commands';\nimport {\n clearExecutionContext,\n getRelatedSkillObjectsForExecutionContext,\n setExecutionContext,\n} from './commands/execution-context';\nimport { parseFlags } from './commands/utils';\nimport { getSkillsRootPath } from './skills';\n\nfunction toRelativeSkillPath(filePath: string): string {\n return relative(getSkillsRootPath(), filePath) || filePath;\n}\n\nfunction printSkillSummary(): void {\n const relatedSkills = getRelatedSkillObjectsForExecutionContext();\n if (relatedSkills.length === 0) {\n return;\n }\n\n console.log('\\n执行前建议关注 Skill:\\n');\n relatedSkills.forEach(skill => {\n console.log(`- ${skill.name}`);\n console.log(` ${skill.description.split('\\n')[0] ?? skill.description}`);\n });\n console.log('');\n}\n\nfunction printSkillMapping(): void {\n const relatedSkills = getRelatedSkillObjectsForExecutionContext();\n if (relatedSkills.length === 0) {\n return;\n }\n\n console.log('\\n执行前建议关注 Skill:\\n');\n relatedSkills.forEach(skill => {\n console.log(`===== ${skill.name} / mapping =====`);\n console.log('命令组:');\n (skill.commandGroups ?? []).forEach(item => console.log(`- ${item}`));\n console.log('命令:');\n (skill.commands ?? []).forEach(item => console.log(`- ${item}`));\n console.log('SDK:');\n (skill.sdkModules ?? []).forEach(item => console.log(`- ${item}`));\n console.log('工具:');\n (skill.toolNames ?? []).forEach(item => console.log(`- ${item}`));\n console.log('');\n });\n}\n\nfunction printSkillFull(): void {\n const relatedSkills = getRelatedSkillObjectsForExecutionContext();\n if (relatedSkills.length === 0) {\n return;\n }\n\n console.log('\\n执行前建议关注 Skill:\\n');\n relatedSkills.forEach(skill => {\n if (!skill.skillPath) {\n return;\n }\n console.log(`===== ${skill.name} / ${toRelativeSkillPath(skill.skillPath)} =====\\n`);\n console.log(readFileSync(skill.skillPath, 'utf8'));\n console.log('');\n });\n}\n\nexport async function runCLI(argv: string[]): Promise<number> {\n await config.load();\n clearCommands();\n clearExecutionContext();\n registerCommands();\n process.exitCode = 0;\n\n const args = argv.filter(Boolean);\n if (args.length === 0) {\n await getCommand('help')?.handler([]);\n return 0;\n }\n\n const [first, second, ...rest] = args;\n if (!first) {\n await getCommand('help')?.handler([]);\n return 0;\n }\n\n if (first === 'help' || first === 'version') {\n await getCommand(first)?.handler([second, ...rest].filter(Boolean) as string[]);\n return 0;\n }\n\n const group = getCommandGroup(first);\n if (!group) {\n console.log(`未找到命令组: ${first}`);\n await getCommand('help')?.handler([]);\n return 1;\n }\n\n if (!second) {\n await getCommand('help')?.handler([first]);\n return 0;\n }\n\n const command = getGroupCommand(first, second);\n if (!command) {\n console.log(`未找到命令: ${first} ${second}`);\n await getCommand('help')?.handler([first]);\n return 1;\n }\n\n setExecutionContext({\n groupName: first,\n commandName: second,\n });\n const flags = parseFlags(rest);\n const showSkillMode = flags['show-skill'];\n if (showSkillMode === 'true' || showSkillMode === 'summary') {\n printSkillSummary();\n } else if (showSkillMode === 'mapping') {\n printSkillMapping();\n } else if (showSkillMode === 'full') {\n printSkillFull();\n }\n await command.handler(rest);\n clearExecutionContext();\n return process.exitCode ?? 0;\n}\n","/**\n * Dimens CLI 插件入口\n * \n * 提供两种使用模式:\n * 1. CLI 模式:命令行工具\n * 2. SDK 模式:直接引入 SDK 调用\n */\n\n// 导出核心类型\nexport * from './src/types';\n\n// 导出核心功能\nexport { logger, createLogger } from './src/core/logger';\nexport { config } from './src/core/config';\nexport { version, getVersion, getUserAgent } from './src/core/version';\n\n// 导出工具\nexport { registerAllTools, registerTool, getTool, getAllTools } from './src/tools';\n\n// 导出命令\nexport {\n registerCommands,\n registerCommand,\n getCommand,\n getGroupCommand,\n getAllCommands,\n} from './src/commands';\nexport { runCLI } from './src/cli';\n\n// 导出技能\nexport { SKILLS, getSkill, getAllSkills } from './src/skills';\n\n// 导出 SDK\nexport {\n DimensSDK,\n createSDK,\n DimensClient,\n AuthSDK,\n CanvasSDK,\n ColumnSDK,\n FlowChatSDK,\n ProjectSDK,\n RowSDK,\n SheetSDK,\n UploadSDK,\n type SDKConfig,\n type APIResponse,\n type DimensClientOptions,\n} from './src/sdk';\n\n/**\n * 插件初始化函数\n */\nexport async function initialize() {\n const { registerAllTools } = await import('./src/tools');\n const { registerCommands } = await import('./src/commands');\n \n return {\n name: '@bintel/dimens-cli',\n version: '1.0.0',\n registerTools: registerAllTools,\n registerCommands,\n };\n}\n\n/**\n * 快速创建 SDK 实例\n */\nexport async function createDimensSDK(\n config?: import('./src/sdk').SDKConfig\n) {\n const { DimensSDK } = await import('./src/sdk');\n if (!config) {\n throw new Error('createDimensSDK 需要传入 baseUrl');\n }\n return new DimensSDK(config);\n}\n\nexport default initialize;\n"],"mappings":"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"}
{
"name": "@bintel/dimens-cli",
"version": "1.0.4",
"version": "1.0.5",
"description": "Dimens CLI 与 Node.js SDK,提供维表智联项目的认证、项目、表格、行数据与 AI chat-completions 调用能力",

@@ -51,2 +51,3 @@ "type": "module",

"eslint": "^9.39.3",
"eslint-plugin-import-x": "^4.16.2",
"prettier": "^3.8.1",

@@ -53,0 +54,0 @@ "tsdown": "^0.21.4",

@@ -152,2 +152,3 @@ # Dimens CLI

node ./bin/dimens-cli.js skill recommend 工作流 默认模型 AI 分析
node ./bin/dimens-cli.js skill recommend 'AI 一键生成业务工作流画布'
node ./bin/dimens-cli.js skill recommend api-key token --output json

@@ -163,4 +164,6 @@ node ./bin/dimens-cli.js skill recommend 生成一个客户管理系统

- 如果输入是“生成一个 XX 系统 / 平台 / 管理系统 / 业务系统”这类系统建设需求,当前会优先推荐 `dimens-system-orchestrator`
- 如果输入是“AI 一键生成画布 / 流程图 / 思维导图 / 工作流画布”这类可视化生成需求,当前会优先推荐 `dimens-manager`
- `--output json` 不会再污染推荐文本,参数值不会被拼进 query
- `--output json` 下的推荐结果除了 `score`,还会额外返回 `matchedBy` 和 `reason`,用于解释“为什么命中这个 Skill”
- 文档链接里常见的 `sh_xxx` 是菜单资源 `sheetId`,不是文档内容 `documentId`;如果用户给的是文档页面链接,优先用 `doc info --sheet-id sh_xxx` 或 `doc info sh_xxx`,拿到真实 `documentId` 后再继续 `doc update`

@@ -194,3 +197,15 @@ JSON 输出示例:

- `report-intent`:报表意图
- `canvas-intent`:画布意图
画布资源命令:
```bash
node ./bin/dimens-cli.js help canvas
node ./bin/dimens-cli.js canvas create --project-id PROJ1 --name 业务流程画布
node ./bin/dimens-cli.js canvas info canvas_1 --team-id TEAM1 --project-id PROJ1
node ./bin/dimens-cli.js canvas save canvas_1 --team-id TEAM1 --project-id PROJ1 --base-version 1 --file ./workflow-canvas.json --summary AI生成业务工作流
node ./bin/dimens-cli.js canvas versions canvas_1 --team-id TEAM1 --project-id PROJ1
node ./bin/dimens-cli.js canvas resource-market --team-id TEAM1 --keyword 审批
```
例如:

@@ -240,2 +255,3 @@

node ./bin/dimens-cli.js upload file --path ./project-cover.png --team-id TEAM1 --project-id PROJ1 --scene project-cover
node ./bin/dimens-cli.js upload file --path ./logo.svg --team-id TEAM1 --source material
node ./bin/dimens-cli.js upload mode

@@ -252,2 +268,3 @@ ```

- 如果上传资源明确归属于某个团队或项目,建议同时传 `--team-id`、`--project-id`,必要时补充 `--scene`
- 如果希望上传后直接进入素材管理,必须显式传 `--source material`;CLI 会自动补 `name`、`size`、`mimeType`

@@ -258,3 +275,3 @@ 项目初始化与菜单骨架示例:

node ./bin/dimens-cli.js project create --team-id TEAM1 --name 客户管理系统 --description 客户全生命周期管理 --project-type spreadsheet
node ./bin/dimens-cli.js upload file --path ./project-cover.svg --key covers/project-cover.svg
node ./bin/dimens-cli.js upload file --path ./project-cover.svg --team-id TEAM1 --scene project-cover
node ./bin/dimens-cli.js sheet create --project-id PROJ1 --name 客户中心 --type folder

@@ -314,2 +331,17 @@ node ./bin/dimens-cli.js sheet create --project-id PROJ1 --name 项目文档 --type folder

批量写入行数据:
```bash
node ./bin/dimens-cli.js row batch-create \
--sheet-id SHEET1 \
--file ./data/rows.json
```
说明:
- `rows.json` 顶层必须是 JSON 数组,每一项可以直接是字段对象,也可以是 `{ "data": { ... } }`
- 后端单批最高限制 1000 行,但 1000 行分片在真实导入中存在静默丢数据风险,CLI 默认按 200 行稳定分片
- 可通过 `--batch-size 200` 显式指定稳定分片大小;如临时调大,不能超过 1000
- 系统初始化、迁移、批量补数据时优先用 `row batch-create`,不要循环调用 `row create`
## 权限命令快速示例

@@ -316,0 +348,0 @@

# dimens-manager
`dimens-manager` 是维表智联业务管理统一技能,用于承载项目内的认证、团队上下文、项目初始化、表格建模、权限、工作流和报表等业务落地细节。
`dimens-manager` 是维表智联业务管理统一技能,用于承载项目内的认证、团队上下文、项目初始化、表格建模、权限、工作流、报表和画布等业务落地细节。

@@ -16,2 +16,3 @@ ## 定位

- `dimens-manager/references/report/overview.md`
- `dimens-manager/references/canvas/overview.md`

@@ -31,1 +32,6 @@ 系统级拆解仍由 `dimens-system-orchestrator` 负责,SDK 与开发者接入仍由 `dimens-sdk` 负责。

| `references/report/` | `dimens-manager/references/report/overview.md` | 报表、组件、参数、数据源与查询 |
| `references/canvas/` | `dimens-manager/references/canvas/overview.md` | 画布资源、AI 生成画布、版本与组件资源市场 |
## 工作流补充
审批工作流 AI 自动生成归入 `references/workflow/references/approval-generation.md`,不新增顶层 Skill。它负责把业务描述转换为审批蓝图、`pluginType=approval` 的工作流 JSON 草案和项目落地计划。

@@ -35,2 +35,3 @@ ---

- ✅ 文件/图片上传在产品侧已存在 `/app/base/comm/upload` 上传接口,`dimens-cli` 也已支持 `upload file / upload mode`;如果目标是把文件继续写入在线文档,优先走 `doc attach-file / doc append-image`
- ✅ 如果目标是“上传完成后还能在素材管理里看到”,必须显式传 `--source material`;素材链路会额外写入 `name/size/mimeType` 并落库到素材管理
- ✅ 项目封面、图标、文档图片、文档附件等资源类更新,统一先 `upload file` 拿 `url`,再把 `url` 写回当前业务数据后更新

@@ -72,3 +73,3 @@ - ✅ SVG 封面/图标上传时必须保留 `.svg` 扩展名;当前 CLI 会按 `image/svg+xml` 上传,避免被后端当成普通二进制文件处理

| `dimens-cli auth use-project` | 切换本地默认项目上下文 | `projectId` | - | 只影响默认上下文,不会替代真实的项目详情读取和更新流程 |
| `dimens-cli upload file` | 上传封面、图标、文档图片、附件等资源,先拿 URL | `file` | `team-id`, `project-id`, `scene`, `app-url` | 所有资源类更新先走上传,再把返回 `url` 写回业务数据,最后执行 update |
| `dimens-cli upload file` | 上传封面、图标、文档图片、附件等资源,先拿 URL | `file` | `team-id`, `project-id`, `scene`, `source`, `classify-id`, `app-url` | 所有资源类更新先走上传,再把返回 `url` 写回业务数据,最后执行 update;要进入素材管理必须显式传 `--source material` |
| `dimens-cli sheet create` | 创建项目目录节点或表格节点 | `projectId`, `name` | `type=folder`, `folder-id`, `teamId`, `app-url` | 项目创建后优先补菜单骨架;创建子资源时要显式传 `--folder-id` |

@@ -94,2 +95,3 @@ | `dimens-cli sheet update` | 更新资源名称或把已有菜单资源移动到目录 | `teamId`, `projectId`, `sheetId` | `name`, `folder-id`, `app-url` | 已创建资源不会因为目录创建自动归位,移动时必须显式执行 `sheet update --folder-id` |

- 所有资源类更新默认都按“先上传拿 URL -> 把 URL 写回当前业务数据 -> 再 update”执行,项目封面、图标、文档图片、文档附件都走这条链。
- 纯上传拿 URL 和“上传后进入素材管理”不是一回事;后者必须显式带 `--source material`,必要时再补 `--classify-id`。
- 文档相关更新必须先拿 `doc info`,因为内容更新依赖当前文档内容和 `version`,不能跳过版本控制。

@@ -96,0 +98,0 @@ - 如果是项目封面、项目图标这类资源字段更新,默认先 `project info` 拿当前数据,再合并上传后的 `url`,最后 `project update`。

@@ -165,2 +165,7 @@ # 项目初始化端到端链路

dimens-cli doc info \
--team-id TEAM_ID \
--project-id PROJECT_ID \
--sheet-id sh_xxx
dimens-cli doc update \

@@ -184,2 +189,3 @@ --team-id TEAM_ID \

- `doc info` 用于回查文档详情,确认文档是否创建成功、当前版本是多少
- 如果输入来自浏览器文档链接,URL 里通常拿到的是 `sheetId=sh_xxx` 这一层菜单资源 ID,不是 `documentId=doc_xxx`;这时先用 `doc info --sheet-id sh_xxx` 拿文档详情,再继续更新
- `doc update` 用于修订 TipTap 在线文档内容,必须显式带 `version`

@@ -186,0 +192,0 @@ - `doc delete` 用于清理误建或废弃的文档资源

@@ -35,3 +35,3 @@ # dimens-manager 项目初始化章节 项目初始化案例

```bash
dimens-cli upload file --file ./project-cover.svg --key covers/project-cover.svg
dimens-cli upload file --file ./project-cover.svg --team-id TEAM_ID --scene project-cover
```

@@ -96,3 +96,3 @@

dimens-cli upload file --path ./project-cover.svg --key covers/project-cover.svg
dimens-cli upload file --path ./project-cover.svg --team-id TTFFEN --scene project-cover --source material

@@ -99,0 +99,0 @@ dimens-cli sheet create \

@@ -29,2 +29,3 @@ ---

- ✅ `select` / `multiSelect` / 下拉选择类配置在技能输出时必须同时给出候选项颜色策略:默认颜色还是自定义颜色,不能只给 `label`
- ✅ 用户上传 Excel 并要求创建选择器字段时,必须先从 Excel 表头和样本值提取候选项,用 `column create --options` 创建完整下拉;行数据写入必须映射到这些候选项,不能把不存在的下拉值直接写入
- ✅ 选项颜色字符串要与前端真实实现对齐:内置颜色使用 `bg-xxx-100 text-xxx-700`,自定义颜色使用 `custom:{\"bg\":\"#xxxxxx\",\"text\":\"#xxxxxx\"}`

@@ -76,2 +77,4 @@ - ✅ 当前 `dimens-cli` 对字段选项颜色的内置白名单已与前端真实字段配置对齐为 12 色;如果超出这 12 种内置色,优先改用 `custom:{...}`,不要直接写扩展类名

| `dimens-cli row page` | 分页查询行数据 | `teamId`, `projectId`, `sheetId` | `viewId`, `page`, `size`, `keyword`, `searchFieldIds`, `filters`, `filterMatchType`, `sortRule` | 行读取链路会同时受字段筛选、视图配置和权限影响 |
| `dimens-cli row create` | 新增单行数据 | `sheetId`, `values` | - | 写入前必须先通过 `column list` 确认真实 `fieldId`,CLI 会把 `--values` 映射成服务端 `data` |
| `dimens-cli row batch-create` | 批量新增行数据 | `sheetId`, `file` 或 `values` | `batch-size` | 推荐大批量初始化、迁移和补数据使用;CLI 默认按 200 行稳定分片,后端单批硬限制 1000 行且单批事务原子 |
| `dimens-cli row update` | 更新整行数据 | `teamId`, `projectId`, `sheetId`, `rowId` | `data`, `version`, `app-url` | 默认先读当前行数据,再修改目标字段,再 update;不要只凭局部字段直接覆盖 |

@@ -84,2 +87,3 @@ | `dimens-cli row set-cell` | 更新单个单元格 | `sheetId`, `rowId`, `fieldId`, `value` | `version`, `columnId` | 服务端真实契约以 `fieldId` 为准,写入时仍要注意版本和权限边界 |

- `sheet update` 前默认先 `sheet info`;`column update` 前默认先取当前 `structure.columns`;`row update` 前默认先读取当前行数据。
- 初始化、迁移、补数据这类多行写入优先用 `row batch-create --file`,不要让技能循环调用 `row create` 逐条写入;CLI 默认按 200 行稳定分片,后端只保证每个分片事务原子。
- 如果字段后续要进入报表,建模阶段就要把字段类型、选项、数值字段和维度字段设计清楚,不要拖到报表阶段返工。

@@ -117,2 +121,3 @@ - 新建表后默认检查公开默认视图,不要只建表不补视图。

- 如果字段类型是 `select` 或 `multiSelect`,每个候选项默认至少明确:`id`、`label`、`color`
- 如果数据来源是 Excel,创建 `select` / `multiSelect` 字段前必须先扫描该列实际值,把去重后的合法值转成候选项;后续 `row batch-create` 写入时只能写已有候选项对应的 `label` 或 `id`,发现新值要先补字段选项再导入
- 下拉候选项颜色必须区分两类:

@@ -246,2 +251,37 @@ 1. 内置默认颜色:使用前端内置的 Tailwind 类名组合

### 场景 2.0:批量初始化行数据
推荐把示例数据、迁移数据或补录数据写入 JSON 文件,再批量导入:
```json
[
{ "fld_customerName": "华东智造", "fld_customerLevel": "A" },
{ "fld_customerName": "华南制造", "fld_customerLevel": "B" }
]
```
```bash
dimens-cli row batch-create \
--sheet-id SHEET1 \
--file ./data/customers.json
```
如果数据量超过 200 行,CLI 默认按 200 行稳定切分请求:
```bash
dimens-cli row batch-create \
--sheet-id SHEET1 \
--file ./data/customers.json \
--batch-size 200
```
注意:
- 后端单次 `batch-create` 最高限制 1000 行。
- 真实导入不要使用 1000 行分片,已确认 1000 行存在静默丢数据风险;技能生成命令默认使用 200 行。
- CLI 多批导入时,每批在后端事务内原子提交;整个文件不是一个全局事务。
- 仍然必须使用真实 `fieldId` 写入,不要用中文字段名。
- `select` / `multiSelect` 字段写入前必须先回查字段 `options`,把 Excel 单元格值映射到已有候选项;字段没有下拉时先补 `--options`,不能先导入行数据。
- 写入会继续受表级、列级、行级权限影响,只读字段会被后端过滤或拒绝。
### 场景 2.1:设计带颜色的单选/多选字段

@@ -248,0 +288,0 @@

@@ -211,2 +211,4 @@ # dimens-manager 多维表格章节 建模落地链路

- 是否需要颜色
- 如果来源是 Excel,先扫描该列去重值生成候选项,再创建字段;不要只按表头创建一个空 `select`
- 行数据导入前要把 Excel 单元格值映射到字段已有 `options` 的 `label` 或 `id`;遇到不存在的值,先补选项再写入

@@ -213,0 +215,0 @@ 不要只创建空的 `select` 字段,否则前端新增数据时会直接报错或不可用。

@@ -26,2 +26,3 @@ ---

- ✅ 涉及项目入口、AI 分析、审批、自动化时,要同时检查项目上下文和权限边界
- ✅ AI 自动生成审批工作流时,必须同时输出业务蓝图、`pluginType=approval` 的图草案和项目落地计划

@@ -38,2 +39,3 @@ ## 命令维护表

| `flow_config_get` | 查询团队默认模型策略 | `teamId` | `type=default_models` | 只说明团队默认模型配置,不代表节点自动回退一定生效 |
| `dimens-cli ai chat-completions` | 辅助生成审批工作流草案 | `teamId`, `messages` | `model=team-default` | 可用于让 AI 产出审批蓝图和 JSON 草案,但创建、发布、挂载仍要看当前能力边界 |

@@ -78,2 +80,9 @@ ### 强调细节

### 6. 审批自动生成边界
- “生成审批系统”属于系统级建设,先用 `dimens-system-orchestrator`。
- “生成审批工作流 / 审批流程 / 审批节点”属于本章节,重点看 `references/approval-generation.md`。
- AI 生成结果必须能落成工作流图草案,不能只输出自然语言流程说明。
- 审批真值以后端审批实例表为准,表格 `workflow` 字段只负责发起和展示摘要。
## 必查文档

@@ -89,2 +98,3 @@

| `references/model-routing.md` | 默认模型与节点模型边界 | 处理模型配置时必须看 |
| `references/approval-generation.md` | AI 自动生成审批工作流的输入、输出、JSON 草案和落地计划 | 处理审批工作流自动生成时必须看 |
| `references/capability-status.md` | 已封装 / server-only / 部分对齐 状态 | 判断当前能力范围时建议看 |

@@ -145,2 +155,15 @@ | `references/examples.md` | 工作流接口案例 | 需要直接举例时看 |

### 场景 4:AI 自动生成审批工作流
推荐输出顺序:
1. 业务审批蓝图:触发条件、表单字段、审批角色、条件分支、结束动作。
2. 工作流图草案:`pluginType=approval`,包含 `nodes`、`edges`、`globalVariables`、`meta`。
3. 项目落地计划:发布工作流、挂载到项目、设置 `systemView=approval`、补 `workflow` 字段入口、验证审批实例和字段摘要回写。
注意:
- 如果缺少 `teamId/projectId`,只能生成草案和落地步骤,不要声称已经写入项目。
- 如果需要保存为可视化画布,另看 `dimens-manager`;可视化画布不等于可执行审批工作流。
## 常见错误与排查

@@ -161,4 +184,5 @@

- `references/model-routing.md`
- `references/approval-generation.md`
- `references/capability-status.md`
- `references/examples.md`
- 如需查看整个 Skill 体系的能力总览,请返回 `dimens-cli/skills/README.md`

@@ -11,1 +11,11 @@ # dimens-manager 工作流章节

- `assets/`:素材占位目录
## 高频资料
| 文件 | 用途 |
| --- | --- |
| `references/approval-generation.md` | AI 自动生成审批工作流,包含输入收集、图 JSON 草案、项目挂载和验证清单 |
| `references/usage.md` | 团队定义 / 项目挂载 / 运行调用三层分层 |
| `references/project-binding.md` | 工作流项目挂载与系统视图入口 |
| `references/model-routing.md` | 默认模型与节点模型边界 |
| `references/capability-status.md` | CLI 已封装、server-only、部分对齐能力状态 |

@@ -15,2 +15,5 @@ # dimens-manager 工作流章节 能力状态矩阵

| 节点模型自动回退 | LLM 节点缺省模型回退 | 部分对齐(未完全统一) | `chat/completions` 默认模型模式已通,普通节点不应默认假设自动回退 |
| AI 生成审批工作流草案 | 业务蓝图、`pluginType=approval` 图 JSON、落地计划 | Skill 已覆盖 | 可通过 `dimens-cli ai chat-completions` 辅助产出草案 |
| 项目内审批工作流创建 / 更新 / 发布 | `/app/approval/:teamId/:projectId/workflow/create|update|publish` | 已有项目路由 | 这是项目内直接创建链路,创建后即归属项目;CLI 未必已完整封装 |
| 团队安装实例 / 项目绑定 | `flow_info`、项目工作流绑定、`systemView=approval` | server-only | 适用于团队复用、跨项目挂载、安装实例和入口绑定判断 |

@@ -30,2 +33,3 @@ ## 2. 推荐表达模板

- “默认模型在聊天兼容链路已可用,但工作流普通 LLM 节点是否自动回退仍需按当前实现确认。”
- “审批工作流 AI 生成已由 Skill 覆盖为草案生成能力;项目内创建有独立路由,团队安装实例和项目绑定仍需结合服务端接口或产品界面。”

@@ -32,0 +36,0 @@ ## 3. 与 `examples.md` 的分工

@@ -226,4 +226,35 @@ # dimens-manager 工作流章节 接口案例

## 6. 这份文档的职责边界
## 6. AI 生成审批工作流案例
用户输入:
```text
帮我生成一个报销审批工作流:5000 元以内直属负责人审批,超过 5000 元还要财务复核,拒绝后通知申请人。
```
推荐 Skill 输出必须包含三部分:
1. 业务审批蓝图:报销单字段、金额分支、直属负责人、财务复核、拒绝通知。
2. `pluginType=approval` 的工作流 JSON 草案:包含 `nodes`、`edges`、`globalVariables`、`meta`。
3. 项目落地计划:如果已有 `projectId`,优先调用 `/app/approval/:teamId/:projectId/workflow/create` 创建项目审批流,再补发布、`systemView=approval`、在表格补 `workflow` 字段入口、验证审批实例与摘要回写。
如果要让模型辅助生成草案,可先走聊天兼容接口:
```bash
dimens-cli ai chat-completions \
--team-id TEAM1 \
--model team-default \
--message "请按维表智联 approval 工作流格式,生成报销审批工作流的业务蓝图、nodes/edges/globalVariables/meta JSON 草案和项目落地计划" \
--output json
```
注意:
- 这条命令只负责让 AI 产出草案,不代表工作流已经创建、发布或落到项目里。
- 如果有 `projectId`,优先走项目内创建路由,而不是把它写成“必须先安装到团队再绑定项目”。
- 团队安装实例、跨项目绑定和入口挂载仍按 `capability-status.md` 和 `project-binding.md` 处理。
- 详细生成规范看 `approval-generation.md`。
## 7. 这份文档的职责边界
这份文档只负责接口级案例总览,不再展开:

@@ -230,0 +261,0 @@

@@ -57,2 +57,3 @@ # dimens-manager 工作流章节 使用分层说明

4. 如果是“模型不对或节点报错”,再继续联动看 `model-routing.md`。
5. 如果是“AI 自动生成审批工作流”,先看 `approval-generation.md`,再回到项目挂载和运行验证。

@@ -69,2 +70,3 @@ ---

- 用户说同一个工作流在不同项目表现不同
- 用户要求把 AI 生成的审批工作流挂到项目里使用

@@ -84,2 +86,3 @@ 这时默认至少需要:

- `model-routing.md`:解释默认模型和节点模型边界。
- `approval-generation.md`:解释 AI 自动生成审批工作流的输入、输出、JSON 草案和落地验证。
- `capability-status.md`:解释哪些已封装、哪些仍是 `server-only`、哪些只是部分对齐。

@@ -97,2 +100,3 @@

4. 如果是模型策略问题,再看 `model-routing.md`。
5. 如果是“CLI 到底支不支持”这类问题,再看 `capability-status.md`。
5. 如果是审批自动生成问题,再看 `approval-generation.md`。
6. 如果是“CLI 到底支不支持”这类问题,再看 `capability-status.md`。
---
name: dimens-manager
slug: dimens-manager
description: 用于维表智联项目内业务资源创建、配置、维护和排查,适合处理 Key、团队、项目、表格、权限、工作流、报表等落地问题。
description: 用于维表智联项目内业务资源创建、配置、维护和排查,适合处理 Key、团队、项目、表格、权限、工作流、报表、画布等落地问题。
version: 1.0.1
author: 方块智联工作室
tags: [manager, project, table, permission, workflow, report, auth, dimens-cli]
tags: [manager, project, table, permission, workflow, report, canvas, auth, dimens-cli]
---

@@ -46,2 +46,3 @@

| 报表 | `references/report/overview.md` | 报表、图表组件、参数联动、数据源查询 |
| 画布 | `references/canvas/overview.md` | 画布资源、AI 生成画布、PPT 画布、版本管理、组件资源市场 |

@@ -56,3 +57,5 @@ ## 默认处理顺序

6. 自动化和 AI 流程问题看 `references/workflow/overview.md`。
- 审批工作流 AI 自动生成必须继续看 `references/workflow/references/approval-generation.md`。
7. 统计分析和看板问题看 `references/report/overview.md`。
8. 画布、白板、流程图、PPT 画布和 AI 一键生成画布看 `references/canvas/overview.md`。

@@ -66,2 +69,4 @@ ## 高风险跑偏点

- 不要跳过报表预检链直接创建复杂图表。
- 不要把业务工作流画布直接等同于可执行工作流;可执行链路仍要回到工作流章节。
- 不要把 AI 生成的审批流程文字等同于已发布审批工作流;必须补齐图草案、项目挂载、`workflow` 字段入口和审批运行验证。
- 不要只看 CLI 命令执行成功就判断权限生效;还要关注缓存失效、权限快照和前端刷新。

@@ -77,2 +82,3 @@

| 权限创建成功就认为前端已生效 | 继续检查权限快照、缓存失效和前端刷新 |
| AI 只输出审批说明,没有图草案 | 按 `approval-generation.md` 补齐 `pluginType=approval` 的 `nodes/edges/globalVariables/meta` |

@@ -88,2 +94,4 @@ ## 参考文档

- `references/workflow/overview.md`
- `references/workflow/references/approval-generation.md`
- `references/report/overview.md`
- `references/canvas/overview.md`
# dimens-system-orchestrator
`dimens-system-orchestrator` 是维表智联的系统级总控技能,用于把“生成一个 XX 系统 / 平台 / 管理应用”这类需求先拆成项目、目录、表格、文档、报表、权限、工作流和对接模块,再路由到 `dimens-manager` 的具体业务章节。
`dimens-system-orchestrator` 是维表智联的系统级总控技能,用于把“生成一个 XX 系统 / 平台 / 管理应用”这类需求先拆成项目、目录、表格、文档、报表、业务场景画布、权限、工作流和对接模块,再路由到 `dimens-manager` 的具体业务章节。

@@ -19,3 +19,4 @@ 当前顶层技能体系已经收敛为 3 个:

- “帮我搭一个售后管理平台”
- “做一个项目管理系统,需要表格、报表和权限”
- “做一个项目管理系统,需要表格、报表、业务流程画布和权限”
- “生成一个审批系统,要能体现审批工作流画布”
- “基于这个项目链接,帮我规划业务系统”

@@ -33,8 +34,9 @@

2. 解析或确认 `teamId / projectId / baseUrl`。
3. 先拆项目资源:目录、表格、文档、报表。
3. 先拆项目资源:目录、表格、文档、报表、业务场景画布。
4. 再拆数据模型:表、字段、关联、示例数据、查询案例。
5. 按需补权限、工作流、外部对接。
6. 输出 `dimens-manager` 章节路由和执行顺序。
7. 用户确认后再进入具体命令或落地步骤。
8. 执行后必须回查:`project info` 验证上传 URL 写回,`sheet tree` 验证目录归位,报表链路至少跑到 `query-widget` 或 `query`。
5. 如果涉及流程、审批或多角色协作,补业务场景画布;审批场景补审批工作流画布。
6. 按需补权限、工作流、外部对接。
7. 输出 `dimens-manager` 章节路由和执行顺序。
8. 用户确认后再进入具体命令或落地步骤。
9. 执行后必须回查:`project info` 验证上传 URL 写回,`sheet tree` 验证目录归位,报表链路至少跑到 `query-widget` 或 `query`。

@@ -52,2 +54,3 @@ ## `dimens-manager` 章节入口

| 报表、组件、查询链 | `dimens-manager/references/report/overview.md` |
| 业务场景画布、审批工作流画布 | `dimens-manager/references/canvas/overview.md`、`dimens-manager/references/canvas/references/generation-guide.md` |

@@ -58,2 +61,3 @@ ## 核心原则

- 系统搭建不要只建表,默认考虑表格、文档、报表。
- 涉及流程或审批的系统,默认补业务场景画布;画布用于表达场景,不替代真实工作流。
- 表格建模必须细到字段类型、关联、候选项、示例数据和视图。

@@ -69,2 +73,3 @@ - 权限不是最后补丁,涉及角色、公开访问、部门可见、行级控制时要前置设计。

- `references/system-decomposition.md`
- `references/business-canvas-flow.md`
- `references/skill-routing.md`

@@ -71,0 +76,0 @@ - `references/interface-navigation.md`

@@ -52,3 +52,3 @@ # 系统搭建命令映射

| 查看项目详情 | `dimens-cli project info --team-id TEAM_ID --project-id PROJECT_ID` | 校验上下文是否正确 |
| 上传 SVG 封面/图标 | `dimens-cli upload file --path ./project-cover.svg --key covers/project-cover.svg --biz-type project --scene project-cover` | SVG 默认 `250x150px`、淡色背景、轻量动态效果;文件名必须保留 `.svg`,CLI 会按 `image/svg+xml` 上传,上传后再把 URL 写回项目或文档 |
| 上传 SVG 封面/图标 | `dimens-cli upload file --path ./project-cover.svg --team-id TEAM_ID --scene project-cover` | SVG 默认 `250x150px`、淡色背景、轻量动态效果;文件名必须保留 `.svg`,CLI 会按 `image/svg+xml` 上传,上传后再把 URL 写回项目或文档;如果希望同时进入素材管理,再补 `--source material` |
| 创建目录 | `dimens-cli sheet create --team-id TEAM_ID --project-id PROJECT_ID --name 目录名 --type folder` | 只创建目录节点,不会自动移动其他菜单 |

@@ -73,2 +73,3 @@ | 创建工作表 | `dimens-cli sheet create --team-id TEAM_ID --project-id PROJECT_ID --name 表名 [--folder-id FOLDER_SHEET_ID]` | 新系统一般先建核心表;要进入目录必须显式带 `--folder-id` |

| 创建行 | `dimens-cli row create --sheet-id SHEET_ID --values '{\"fld_xxx\":\"值\"}'` | CLI 会映射到服务端 `data` |
| 批量创建行 | `dimens-cli row batch-create --sheet-id SHEET_ID --file ./rows.json [--batch-size 200]` | 系统初始化、迁移、批量补数据优先用这个命令;后端单批最高 1000 行,但真实导入默认按 200 行稳定分片 |
| 更新行 | `dimens-cli row update --sheet-id SHEET_ID --row-id ROW_ID --version 1 --values '{\"fld_xxx\":\"新值\"}'` | 更新前要拿到版本号 |

@@ -113,6 +114,5 @@ | 更新单元格 | `dimens-cli row set-cell --sheet-id SHEET_ID --row-id ROW_ID --field-id FIELD_ID --value 新值 --version 1` | 推荐用 `fieldId`,不要用中文字段名 |

--path ./project-cover.svg \
--key covers/customer-crm.svg \
--biz-type project \
--team-id TEAM_ID \
--scene project-cover \
--team-id TEAM_ID
--source material

@@ -238,2 +238,17 @@ dimens-cli project create \

批量初始化示例数据时,不要循环执行单行 `row create`,应写入 JSON 文件后走批量命令:
```bash
dimens-cli row batch-create \
--sheet-id SHEET_ID \
--file ./data/customers.json \
--batch-size 200
```
说明:
- `customers.json` 顶层必须是数组,每一项可以是 `{ "fld_xxx": "值" }` 或 `{ "data": { "fld_xxx": "值" } }`。
- 后端单批最多 1000 行;CLI 会按 `--batch-size` 自动分片,默认使用 200 行。不要为了减少请求数改成 1000 行,真实导入中 1000 行分片存在静默丢数据风险。
- 多批导入时只保证每个后端分片事务原子,不保证整个文件全局事务。
## 5. 必须显式提醒的坑

@@ -246,3 +261,3 @@

| 建表后没检查默认视图 | 先 `view list`,缺失时补一个公开的 `grid` 默认视图 |
| `select` / `multiSelect` 只建字段不配选项 | 创建字段时直接补 `--options`,不要留空配置 |
| `select` / `multiSelect` 只建字段不配选项 | 创建字段时直接补 `--options`,不要留空配置;Excel 导入前必须先从表头/样本值提取候选项并创建选项 |
| 把人员字段误建成普通下拉 | 没识别项目已有用户、部门、角色体系,误把“选人”当静态枚举 | 优先改成 `person`,不要手工维护人员选项 |

@@ -252,3 +267,5 @@ | 把部门字段误建成普通下拉 | 没识别组织结构字段和静态枚举字段的区别 | 优先改成 `department`,不要手工维护部门选项 |

| 行写入直接用中文字段名 | 先查字段列表,拿 `fieldId` 再写 |
| 批量导入还循环调用 `row create` | 使用 `row batch-create --file`,让 CLI 默认按 200 行稳定分片,减少 HTTP 和数据库压力 |
| Excel 里的下拉值直接原样写入 | 先确认字段真实 `options`,写入值必须映射到已有选项的 `label` 或 `id`;缺失选项先更新字段选项,不能写表里不存在的下拉值 |
| `row set-cell` 继续用 `columnId` 理解服务端 | 服务端真实字段是 `fieldId`,`columnId` 只是兼容参数 |
| 忽略 `version` | 行更新和单元格更新都建议显式带 `version` |

@@ -20,2 +20,3 @@ # 系统总控输出案例

- 报表:客户来源分析、商机阶段漏斗、合同金额趋势
- 画布:客户生命周期业务场景画布、合同审批工作流画布
3. 数据模型:

@@ -34,2 +35,3 @@ - 客户 1:N 联系人

- 工作流:`dimens-manager/references/workflow/overview.md`
- 业务场景画布:`dimens-system-orchestrator/references/business-canvas-flow.md` -> `dimens-manager/references/canvas/overview.md`
6. 等用户确认方案后,再进入 `references/command-mapping.md` 和 `dimens-manager` 对应章节执行。

@@ -43,2 +45,3 @@

- `report preview` / `query-widget` / `query`:确认报表不是空壳。
- `canvas create` / `canvas info` / `canvas save`:确认业务场景画布不是空壳,且保存了 `nodes/edges` 版本。

@@ -64,6 +67,11 @@ ## 2. 案例:生成售后工单平台

5. 报表资源:工单状态分布、平均处理时长、满意度趋势。
6. 路由:
6. 业务场景画布:
- 工单受理与分配画布
- 工单升级与超时处理画布
- 满意度回访流程画布
7. 路由:
- 上下文与项目:`dimens-manager/references/team/overview.md`、`dimens-manager/references/project/overview.md`
- 表格建模:`dimens-manager/references/table/overview.md`
- 工作流:`dimens-manager/references/workflow/overview.md`
- 画布:`dimens-system-orchestrator/references/business-canvas-flow.md`、`dimens-manager/references/canvas/overview.md`
- 报表:`dimens-manager/references/report/overview.md`

@@ -157,10 +165,13 @@ - 权限:`dimens-manager/references/permission/overview.md`

1. 系统定位:...
2. 资源拆解:项目 / 目录 / 表格 / 文档 / 报表
2. 资源拆解:项目 / 目录 / 表格 / 文档 / 报表 / 业务场景画布
3. 数据模型:表、字段、关联、示例数据、查询方式
4. 扩展模块:权限 / 工作流 / 报表 / 对接
5. 下一步章节:
4. 流程表达:业务场景画布 / 审批工作流画布 / 可执行工作流边界
5. 扩展模块:权限 / 工作流 / 报表 / 对接
6. 下一步章节:
- dimens-manager/references/team/overview.md
- dimens-manager/references/project/overview.md
- dimens-manager/references/table/overview.md
6. 完成后验证:project info / sheet tree / column list / view list / report query
- dimens-system-orchestrator/references/business-canvas-flow.md
- dimens-manager/references/canvas/overview.md
7. 完成后验证:project info / sheet tree / column list / view list / report query / canvas save
```

@@ -18,2 +18,3 @@ # 总控到接口资料导航

| `system-decomposition.md` | 系统模块拆解方法 |
| `business-canvas-flow.md` | 业务场景画布与审批工作流画布的系统级流程 |
| `skill-routing.md` | 顶层技能与 `dimens-manager` 章节路由 |

@@ -33,2 +34,3 @@ | `command-mapping.md` | 系统建设步骤到 CLI 命令的映射 |

| 工作流 | `dimens-manager/references/workflow/overview.md` | `project-binding.md`、`model-routing.md`、`usage.md` |
| 业务场景画布 | `dimens-manager/references/canvas/overview.md` | `dimens-manager/references/canvas/overview.md`、`business-canvas-flow.md` |
| 报表 | `dimens-manager/references/report/overview.md` | `usage.md`、`recharts-widget-guide.md`、`examples.md` |

@@ -35,0 +37,0 @@

@@ -32,3 +32,6 @@ # 系统总控章节路由

| 审批、自动化、AI 分析、模型路由 | `dimens-manager/references/workflow/overview.md` | 区分团队工作流定义、项目挂载和运行调用 |
| 审批工作流自动生成 | `dimens-manager/references/workflow/references/approval-generation.md` | 生成 `pluginType=approval` 草案和落地计划,不等同于画布 |
| 报表、图表、参数联动、数据源查询 | `dimens-manager/references/report/overview.md` | 创建组件前必须先走报表预检链 |
| 业务场景画布、审批工作流画布、流程图、思维导图 | `references/business-canvas-flow.md` -> `dimens-manager/references/canvas/overview.md` -> `dimens-manager/references/canvas/references/generation-guide.md` | 生成 `nodes/edges` 并保存画布版本,不等同于可执行工作流 |
| PPT 画布、演示稿画布、幻灯片画布 | `dimens-manager/references/canvas/overview.md` -> `dimens-manager/references/canvas/references/generation-guide.md#8-ppt--演示稿画布规则` | 16:9,一页一个 `SECTION` 分区,所有内容放在对应分区内 |
| Node.js、Web、BFF、移动端接入 | `dimens-sdk/SKILL.md` | 只有开发者集成问题才进入 SDK |

@@ -44,4 +47,5 @@

4. `dimens-manager/references/table/overview.md`
5. 按需追加 `permission / workflow / report`
6. 如果要写代码接入,再追加 `dimens-sdk/SKILL.md`
5. 如果存在流程、审批或多角色协作,追加 `references/business-canvas-flow.md` 和 `dimens-manager/references/canvas/overview.md`
6. 按需追加 `permission / workflow / report`
7. 如果要写代码接入,再追加 `dimens-sdk/SKILL.md`

@@ -68,2 +72,4 @@ ### 3.2 已有项目链接

| 报表 / 图表 / 数据源 | `report` |
| 画布 / 白板 / 流程图 / 思维导图 / PPT / 演示稿 / 幻灯片 | `dimens-manager/references/canvas/overview.md` |
| 业务场景画布 / 审批工作流画布 | `references/business-canvas-flow.md`,再进入 `dimens-manager/references/canvas/overview.md` |

@@ -75,2 +81,4 @@ ## 4. 章节依赖关系

- `table` 通常先于 `workflow` 和 `report`,因为流程触发和报表数据源都依赖业务对象。
- `canvas` 可以在方案表达阶段提前生成,但如果要执行自动化,仍要回到 `workflow` 创建真实可执行流。
- 审批工作流画布和可执行审批工作流必须拆开:前者路由到 `dimens-manager/references/canvas/overview.md`,后者路由到 `workflow/references/approval-generation.md`。
- `permission` 不是最后补丁,只要用户提到可见范围、公开访问、部门隔离、只看自己,就要提前设计。

@@ -77,0 +85,0 @@ - `sdk` 不替代业务章节;SDK 只是接入方式,业务规则仍以 `dimens-manager` 为准。

@@ -9,3 +9,3 @@ # dimens-system-orchestrator 系统拆解指南

收到系统级需求时,默认先拆下面 6 个主线维度:
收到系统级需求时,默认先拆下面主线维度:

@@ -19,2 +19,3 @@ 1. 系统定位

7. 示例数据与查询案例
8. 业务场景画布

@@ -29,4 +30,5 @@ 这些是默认主线,不应该一上来就被权限、流程、报表抢走重点。

2. 流程与自动化
3. 报表与看板
4. 外部接入
3. 审批工作流画布和可执行审批流
4. 报表与看板
5. 外部接入

@@ -156,2 +158,26 @@ ## 4. 每个维度到底要拆什么

如果流程涉及多角色协作、明显状态流转或审批节点,必须先补业务场景画布。画布用于表达“谁在什么阶段做什么、数据如何流转、异常如何处理”,再决定是否需要真实工作流。
### 4.8.1 业务场景画布
业务场景画布必须拆出:
- 角色泳道:发起人、处理人、审批人、财务、管理员、外部客户等
- 业务对象:表单、工单、合同、采购单、报销单、商机等
- 状态流转:草稿、待处理、审批中、已完成、已拒绝、已撤回
- 条件分支:金额、风险、优先级、部门、合同类型等
- 异常路径:退回、拒绝、撤回、超时、转交、人工兜底
- 数据沉淀:回写字段、审批摘要、报表统计口径
系统级 Skill 只负责判断“需要什么画布、画布表达什么”。保存和版本管理进入 `dimens-manager/references/canvas/overview.md` 或 `dimens-manager/references/canvas/overview.md`。
### 4.8.2 审批工作流画布
审批系统或审批流程需求必须同时拆两件事:
1. 审批工作流画布:表达发起、分支、审批、拒绝、撤回、通知、摘要回写。
2. 可执行审批工作流:进入 `dimens-manager/references/workflow/references/approval-generation.md`,生成 `pluginType=approval` 的工作流草案和项目落地计划。
不能只生成审批画布就声称审批能力完成。
### 4.9 报表与看板

@@ -218,3 +244,4 @@

- 权限
- 工作流
- 业务场景画布
- 工作流 / 审批工作流画布
- 报表

@@ -236,2 +263,4 @@ - 对接

- 销售审批流
- 商机推进业务场景画布
- 合同审批工作流画布
- 客户漏斗报表

@@ -248,2 +277,3 @@ - 外部系统同步能力

| 流程与自动化 | 商机推进、报价审批、合同审批、超期未跟进提醒、流失客户回访 |
| 业务场景画布 | 商机阶段流转画布、合同审批工作流画布、客户跟进异常路径画布 |
| 报表与看板 | 客户漏斗、销售转化率、阶段停留时长、销售排行、回款汇总 |

@@ -258,4 +288,6 @@ | 外部接入 | 外呼系统同步、官网线索导入、API Key 对接外部 CRM/ERP |

4. `dimens-manager/references/workflow/overview.md`
5. `dimens-manager/references/report/overview.md`
6. `dimens-manager/references/key-auth/overview.md`
5. `dimens-manager/references/canvas/overview.md`
6. `dimens-manager/references/canvas/overview.md`
7. `dimens-manager/references/report/overview.md`
8. `dimens-manager/references/key-auth/overview.md`

@@ -281,2 +313,3 @@ ## 7. 不要直接省略的项

5. 如果进入执行阶段,最后必须给验证证据:上传 URL 是否写回、目录资源是否归位、表格字段/视图是否可查、报表预检链是否跑通。
6. 如果包含业务场景画布,必须说明画布 JSON 草案、保存链路和可执行工作流边界。

@@ -283,0 +316,0 @@ 如果缺最后两步,后续 AI 很容易继续用抽象描述代替真实接口。

@@ -24,3 +24,4 @@ ---

- ✅ 默认节奏是“先方案,后执行”;系统边界没拆清前不要直接给创建命令。
- ✅ 项目资源默认按“三驾马车”理解:表格、文档、报表。
- ✅ 项目资源默认按“四类交付物”理解:表格、文档、报表、业务场景画布。
- ✅ 涉及流程、审批、自动化或多角色协作的系统,默认补业务场景画布;审批场景额外补审批工作流画布。
- ✅ 更新类操作统一遵循“先读取当前数据 -> 分析并修改目标字段 -> 再提交更新”。

@@ -34,2 +35,3 @@

| 项目内资源创建、配置、更新、排查 | `dimens-manager` |
| 画布、流程图、思维导图、PPT 画布、AI 一键生成画布 | `dimens-manager/references/canvas/overview.md` |
| SDK、HTTP API、Web/BFF/Node.js/移动端接入 | `dimens-sdk` |

@@ -48,2 +50,4 @@

| 报表阶段 | `dimens-manager/references/report/overview.md` | 报表、组件、参数联动、数据源查询 |
| 画布阶段 | `dimens-manager/references/canvas/overview.md` | 画布资源、AI 生成图数据、版本和组件资源 |
| 业务场景画布阶段 | `references/business-canvas-flow.md` | 系统级业务流程、审批流转、角色协作和异常路径表达 |

@@ -54,9 +58,40 @@ ## 默认处理顺序

2. 归一化上下文:解析或确认 `teamId / projectId / baseUrl`。
3. 设计项目容器:项目名称、目录结构、菜单入口、文档与报表。
3. 设计项目容器:项目名称、目录结构、菜单入口、文档、报表与业务场景画布。
4. 拆核心对象:主对象、从对象、生命周期状态、对象关系。
5. 设计多表模型:表、字段类型、候选项、relation、默认视图、示例数据。
6. 设计查询与视图:常用筛选、列表视图、统计口径、报表数据源。
7. 按需补权限、工作流、报表和外部对接。
8. 最后给出下一步进入 `dimens-manager` 的具体章节路径。
7. 如存在流程、审批、自动化或多角色协作,补业务场景画布;审批系统额外补审批工作流画布。
8. 按需补权限、工作流、报表、画布和外部对接。
9. 最后给出下一步进入 `dimens-manager` 的具体章节路径。
## 系统级画布说明
系统总控遇到完整业务系统、审批系统、售后系统、CRM、项目管理平台等需求时,不能只拆表格和权限,还要判断是否需要业务场景画布。画布的目标是让用户看清“谁在什么阶段做什么、数据如何流转、异常如何处理”,不是替代真实可执行工作流。
画布节点职责必须在系统方案阶段先拆清:
| 节点职责 | 推荐节点类型 | 系统级用法 |
| --- | --- | --- |
| 表单提交、导入、上传、外部返回 | `PARALLELOGRAM` | 表达数据从用户、接口或文件进入系统 |
| 普通动作、系统处理、人工处理 | `RECTANGLE` | 表达一个明确业务动作,不要把多个动作塞进一个节点 |
| 条件判断、审批分支、风控命中 | `DIAMOND` | 表达“是否...”类判断,分支边必须标注“是/否/通过/驳回” |
| 多维表、数据库、知识库、日志沉淀 | `CYLINDER` | 表达数据被读取、写入或沉淀 |
| 合同、报告、SOP、知识条目 | `DOCUMENT` / `MARKDOWN` | 表达文档产物或较长说明 |
| 阶段、泳道、业务域分组 | `SECTION` | 包裹同一阶段或同一角色的一组节点,不作为流程动作 |
| 信息图、复杂展示、PPT 核心页 | `INFOGRAPHIC` | 表达复杂信息、指标趋势、方案对比、流程概览、系统关系,PPT 场景要优先善用 |
| 画布内 AI 智能体生成 | `CUSTOM_AGENT` | 只在需要用户点击运行并生成后续节点时使用,不作为普通业务处理步骤 |
| 嵌入业务表视图 | `EMBEDDED_SHEET` | 展示项目内表格视图,真实落地时需要 `sheetId/viewId` |
系统级输出只负责说明“需要什么画布、画布表达哪些角色/对象/状态/异常、节点职责如何拆”。落地保存和节点字段细节进入:
1. `references/business-canvas-flow.md`
2. `dimens-manager/references/canvas/overview.md`
3. `dimens-manager/references/canvas/references/generation-guide.md`
如果系统总控直接输出画布 JSON 草案,不能只给 `id/type/position/data.label`。保存型 JSON 必须继续采用 `dimens-manager` 的可渲染字段模板:顶层包含 `version/timestamp`,节点包含 `style.width/height`、顶层 `width/height`、`positionAbsolute`、`data.width/height`、`data.align/verticalAlign`,边包含 `sourceHandle/targetHandle`、`markerEnd`、`style.stroke/style.strokeWidth`,边类型使用 `default` 或 `smoothstep`。
如果用户要创建 PPT、演示稿或幻灯片画布,必须路由到 `dimens-manager/references/canvas/references/generation-guide.md#8-ppt--演示稿画布规则`。PPT 画布要求 `16:9`,最外层是一组 `SECTION` 页面分区,一页 PPT 对应一个分区,所有页面内容都必须放在所属分区内。
PPT 或复杂展示场景必须优先考虑 `INFOGRAPHIC` 信息图节点。凡是方案亮点、路径拆解、趋势、对比、SWOT、象限、系统关系、流程概览等需要强视觉表达的信息,优先用 `INFOGRAPHIC`,并在 `data.infographicSyntax` 中写 AntV Infographic DSL。
## 执行完成判定

@@ -74,2 +109,3 @@

| 创建报表 | `report create -> preview -> widget-add -> query-widget -> query` 至少跑通预检链 | 报表只是空壳,不能算完成 |
| 创建画布 | `canvas create -> canvas info -> canvas save` 至少跑通保存链路 | 画布只是空壳或版本未写入,不能算 AI 生成画布完成 |

@@ -83,3 +119,3 @@ 如果用户让“直接创建一套系统”,最后输出必须包含:已创建资源 ID、目录归位结果、上传 URL 写回结果、报表预检结果、下一步风险。

| `https://dimens.bintelai.com/#/TEAM_ID/PROJECT_ID/` | `teamId`、`projectId` | 进入团队与项目章节 |
| `https://dimens.bintelai.com/#/TEAM_ID/PROJECT_ID/SHEET_ID?view=VIEW_ID` | `teamId`、`projectId`、`sheetId`、`viewId` | 进入表格章节 |
| `https://dimens.bintelai.com/#/TEAM_ID/PROJECT_ID/SHEET_ID?view=VIEW_ID` | `teamId`、`projectId`、`sheetId`、`viewId` | 如果是表格页面,进入表格章节;如果是在线文档页面,先把 `sheetId` 当菜单资源 ID,优先走 `doc info --sheet-id SHEET_ID` 取真实 `documentId` |

@@ -95,4 +131,7 @@ ## 高风险跑偏点

- 不要让报表直接从 `widget-add` 开始;固定预检链是 `report create -> report preview -> report widget-add -> report query-widget -> report query`。
- 不要把画布流程图当成可执行工作流;可执行工作流还需要工作流定义、发布和项目挂载。
- 不要只给审批工作流画布就声称审批能力完成;画布只表达业务场景,真实审批还要走工作流定义、发布、项目挂载和运行验证。
- 不要把 SDK 接入问题混入系统拆解;代码接入交给 `dimens-sdk`。
- 不要在没有 `sheet tree`、`project info`、报表 query 等回查证据时宣称“完成”。
- 不要把文档页面链接里的 `sh_xxx` 误当成 `documentId`;在线文档页面 URL 默认先产出 `sheetId`,需要先通过 `getBySheetId` 或 `doc info --sheet-id` 换出真实 `documentId`。

@@ -109,2 +148,4 @@ ## 常见错误与修正

| SVG 上传后无法作为图片使用 | 生成 `250x150px` 淡色动态 SVG,保留 `.svg` 扩展名并走 `upload file`,确认上传类型是 `image/svg+xml` |
| 业务流程只写成文字,没有画布 | 按 `references/business-canvas-flow.md` 生成业务场景画布,再路由到 `dimens-manager` 保存 |
| 审批画布被当成真实审批流 | 明确区分审批工作流画布和可执行审批工作流,后者继续进入 `workflow/approval-generation.md` |

@@ -114,2 +155,3 @@ ## 参考文档

- `references/system-decomposition.md`
- `references/business-canvas-flow.md`
- `references/skill-routing.md`

@@ -116,0 +158,0 @@ - `references/interface-navigation.md`

@@ -71,2 +71,3 @@ # 维表智联 Skill 体系

| `dimens-manager/references/report/overview.md` | `report *`、`widget-*`、`query*`、`preview` | 负责报表主资源、组件、查询和预检链路 | 报表和组件更新都默认先取当前数据,新增或修改组件前优先走 `preview` |
| `dimens-manager/references/canvas/overview.md` | `canvas *`、`sheet create --type canvas` | 负责画布资源、AI 生成图数据、版本和组件资源市场 | 保存前先 `canvas info` 拿版本,再 `canvas save --base-version`,不要把画布当成可执行工作流 |

@@ -84,3 +85,3 @@ ### 3.3 强调细节

当前 `维表智联` 的顶层 Skill 体系收敛为 3 个正式技能:
当前 `维表智联` 的顶层 Skill 体系只保留 3 个正式技能。画布属于 `dimens-manager` 下的业务章节,不再单独发布顶层 Skill:

@@ -104,3 +105,6 @@ | Skill | 业务域 | 什么时候优先用 |

| 报表 | `dimens-manager/references/report/overview.md` | 报表、图表、参数筛选、数据源查询与创建前预检 |
| 画布 | `dimens-manager/references/canvas/overview.md` | 画布、白板、流程图、AI 生成画布、版本恢复、资源市场 |
审批工作流 AI 自动生成属于 `dimens-manager/references/workflow/references/approval-generation.md`,负责把业务描述转换为审批蓝图、`pluginType=approval` 的工作流 JSON 草案和项目落地计划。
## 5. 首页先记住的统一规则

@@ -177,2 +181,3 @@

- 普通下拉字段如果要自定义候选项,同一个字段下每个选项 `id` 必须唯一
- 从 Excel 创建普通下拉字段时,必须先从该列实际值提取候选项,再创建字段;行数据只能写入字段 `options` 中已有的值,缺少选项时先补选项再导入

@@ -405,5 +410,6 @@ 否则后续在权限、筛选、统计、报表映射上都容易出问题。

5. 如果是表、字段、row/page 问题,先看 `dimens-manager/references/table/overview.md`
6. 如果是工作流、权限、报表、Key 接入问题,再进入对应 `dimens-manager` 业务章节
7. 如果是报表生成类需求,优先先看 `dimens-manager/references/report/overview.md`,并按 `report create -> report preview -> report widget-add -> report query-widget -> report query` 的固定预检链执行
8. 需要接口级细节时,再继续看 dimens-manager/references/{业务域}/references/*.md 或对应顶层技能的 `references/*.md`
6. 如果是工作流、权限、报表、画布、Key 接入问题,再进入对应 `dimens-manager` 业务章节。
7. 如果是报表生成类需求,优先先看 `dimens-manager/references/report/overview.md`,并按 `report create -> report preview -> report widget-add -> report query-widget -> report query` 的固定预检链执行。
8. 如果是 AI 一键生成画布、流程图、思维导图,直接进入 `dimens-manager/references/canvas/overview.md` 和 `dimens-manager/references/canvas/references/generation-guide.md`。
9. 需要接口级细节时,再继续看 dimens-manager/references/{业务域}/references/*.md 或对应顶层技能的 `references/*.md`。

@@ -421,3 +427,3 @@ ### 10.1 报表类需求的默认防跑偏规则

当前顶层正式技能目录已收敛为 3 个:
当前顶层正式技能目录只包含 3 个主技能:

@@ -430,3 +436,3 @@ - `dimens-system-orchestrator`

- 顶层入口只暴露上述 3 个技能目录。
- 顶层入口只暴露上述允许的技能目录。
- 业务正文以每个顶层技能目录下的 `SKILL.md` 和 `README.md` 为主。

@@ -443,2 +449,2 @@ - `dimens-manager/references/` 按业务域保留接口级和场景级扩展资料。

该文档约束 3 个顶层 Skill 的边界、`SKILL.md` 写法、references 组织方式、发布验证和高风险错误。
该文档约束当前顶层 Skill 的边界、`SKILL.md` 写法、references 组织方式、发布验证和高风险错误。

@@ -5,3 +5,3 @@ # skills 发布兼容说明

`dimens-cli/skills` 当前按 3 个顶层技能发布:
`dimens-cli/skills` 当前只按 3 个主顶层技能发布;画布能力收敛在 `dimens-manager/references/canvas/`:

@@ -11,6 +11,6 @@ | 顶层技能 | 作用 |

| `dimens-system-orchestrator` | 系统级方案拆解、执行顺序、章节路由 |
| `dimens-manager` | 项目内业务管理:Key、团队、项目、表格、权限、工作流、报表 |
| `dimens-manager` | 项目内业务管理:Key、团队、项目、表格、权限、工作流、报表、画布 |
| `dimens-sdk` | SDK、HTTP API、Web/BFF/Node.js/移动端集成 |
原 `dimens-key-auth`、`dimens-team`、`dimens-project`、`dimens-table`、`dimens-permission`、`dimens-workflow`、`dimens-report` 不再作为顶层技能发布,相关内容已经整合到 dimens-manager/references/{业务域}/。
原 `dimens-key-auth`、`dimens-team`、`dimens-project`、`dimens-table`、`dimens-permission`、`dimens-workflow`、`dimens-report` 和独立画布技能不再作为顶层技能发布,相关内容已经整合到 `dimens-manager/references/{业务域}/`。

@@ -28,4 +28,4 @@ ## 2. 目录兼容策略

1. `find skills -name SKILL.md` 只出现 3 个顶层技能入口。
2. `npm pack --dry-run --json` 中只包含 3 个顶层 `SKILL.md`。
1. `find skills -name SKILL.md` 只出现当前允许的顶层技能入口。
2. `npm pack --dry-run --json` 中只包含当前允许的顶层 `SKILL.md`。
3. `dimens-system-orchestrator` 不再把旧业务技能当作顶层路由目标。

@@ -37,4 +37,4 @@ 4. `dimens-manager` 的业务章节路径都能打开。

- 给 3 个顶层技能补正式封面图和图标。
- 给当前顶层技能补正式封面图和图标。
- 如果技能平台支持多级章节,可以把 dimens-manager/references/{业务域}/ 标注为章节导航。
- 如果平台不支持深层相对链接,优先让用户进入 `dimens-manager` 后按业务域查找。
# dimens-cli/skills 技能开发标准
本文档基于 `skill-creator` 的技能设计原则,并结合维表智联当前 3 个顶层 Skill 体系制定。
本文档基于 `skill-creator` 的技能设计原则,并结合维表智联当前 3 个主顶层 Skill 体系制定。
## 1. 当前技能架构
当前只允许发布 3 个顶层技能:
当前默认只发布 3 个主顶层技能;画布属于 `dimens-manager/references/canvas/` 章节,不再新增顶层 Skill:

@@ -12,3 +12,3 @@ | 顶层 Skill | 职责 | 适用场景 |

| `dimens-system-orchestrator` | 系统级拆解、执行顺序、章节路由 | 用户要生成完整业务系统、平台、管理应用 |
| `dimens-manager` | 项目内业务管理 | Key、团队、项目、表格、权限、工作流、报表等业务落地 |
| `dimens-manager` | 项目内业务管理 | Key、团队、项目、表格、权限、工作流、报表、画布等业务落地 |
| `dimens-sdk` | 开发者集成 | SDK、HTTP API、Web、BFF、Node.js、移动端接入 |

@@ -34,2 +34,4 @@

画布不是顶层 Skill 例外;“AI 一键生成画布 / 业务流程图 / 思维导图 / 工作流画布”统一进入 `dimens-manager/references/canvas/`。
## 3. SKILL.md 标准

@@ -205,3 +207,3 @@

期望只看到:
主体系期望至少看到:

@@ -223,3 +225,3 @@ ```text

- 包内只有 3 个顶层 `SKILL.md`
- 包内只有当前允许的顶层 `SKILL.md`
- 没有过期检查清单

@@ -226,0 +228,0 @@ - 新增 references 文件进入发布包

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

import { t as __exportAll } from "./rolldown-runtime-95iHPtFO.mjs";
import { a as RoleSDK, c as ProjectSDK, d as SheetSDK, f as ColumnSDK, h as FlowChatSDK, i as RowSDK, l as UploadSDK, m as DimensClient, n as RowPolicySDK, o as ReportSDK, p as AuthSDK, r as RowAclSDK, s as PermissionSDK, t as ViewSDK, u as DocumentSDK } from "./view-Cyzxo5yi.mjs";
//#region src/sdk/index.ts
var sdk_exports = /* @__PURE__ */ __exportAll({
DimensSDK: () => DimensSDK,
createSDK: () => createSDK
});
var DimensSDK = class {
client;
auth;
project;
report;
role;
permission;
sheet;
column;
document;
view;
row;
rowPolicy;
rowAcl;
ai;
upload;
constructor(config) {
this.client = new DimensClient(config);
this.auth = new AuthSDK(this.client);
this.project = new ProjectSDK(this.client);
this.report = new ReportSDK(this.client);
this.role = new RoleSDK(this.client);
this.permission = new PermissionSDK(this.client);
this.sheet = new SheetSDK(this.client);
this.column = new ColumnSDK(this.client);
this.document = new DocumentSDK(this.client);
this.view = new ViewSDK(this.client);
this.row = new RowSDK(this.client);
this.rowPolicy = new RowPolicySDK(this.client);
this.rowAcl = new RowAclSDK(this.client);
this.ai = new FlowChatSDK(this.client);
this.upload = new UploadSDK(this.client);
}
};
function createSDK(config) {
return new DimensSDK(config);
}
//#endregion
export { createSDK as n, sdk_exports as r, DimensSDK as t };
//# sourceMappingURL=sdk-DQT9fb9B.mjs.map
{"version":3,"file":"sdk-DQT9fb9B.mjs","names":[],"sources":["../src/sdk/index.ts"],"sourcesContent":["import { AuthSDK } from './auth';\nimport { DimensClient, type APIResponse, type DimensClientOptions } from './client';\nimport { ColumnSDK } from './column';\nimport { DocumentSDK } from './document';\nimport { FlowChatSDK } from './flow-chat';\nimport { PermissionSDK } from './permission';\nimport { ProjectSDK } from './project';\nimport { ReportSDK } from './report';\nimport { RowSDK } from './row';\nimport { RowAclSDK } from './row-acl';\nimport { RowPolicySDK } from './row-policy';\nimport { RoleSDK } from './role';\nimport { SheetSDK } from './sheet';\nimport { UploadSDK } from './upload';\nimport { ViewSDK } from './view';\n\nexport type { APIResponse, DimensClientOptions };\n\nexport interface SDKConfig extends DimensClientOptions {}\n\nexport class DimensSDK {\n readonly client: DimensClient;\n readonly auth: AuthSDK;\n readonly project: ProjectSDK;\n readonly report: ReportSDK;\n readonly role: RoleSDK;\n readonly permission: PermissionSDK;\n readonly sheet: SheetSDK;\n readonly column: ColumnSDK;\n readonly document: DocumentSDK;\n readonly view: ViewSDK;\n readonly row: RowSDK;\n readonly rowPolicy: RowPolicySDK;\n readonly rowAcl: RowAclSDK;\n readonly ai: FlowChatSDK;\n readonly upload: UploadSDK;\n\n constructor(config: SDKConfig) {\n this.client = new DimensClient(config);\n this.auth = new AuthSDK(this.client);\n this.project = new ProjectSDK(this.client);\n this.report = new ReportSDK(this.client);\n this.role = new RoleSDK(this.client);\n this.permission = new PermissionSDK(this.client);\n this.sheet = new SheetSDK(this.client);\n this.column = new ColumnSDK(this.client);\n this.document = new DocumentSDK(this.client);\n this.view = new ViewSDK(this.client);\n this.row = new RowSDK(this.client);\n this.rowPolicy = new RowPolicySDK(this.client);\n this.rowAcl = new RowAclSDK(this.client);\n this.ai = new FlowChatSDK(this.client);\n this.upload = new UploadSDK(this.client);\n }\n}\n\nexport function createSDK(config: SDKConfig): DimensSDK {\n return new DimensSDK(config);\n}\n\nexport { DimensClient } from './client';\nexport { AuthSDK } from './auth';\nexport { ProjectSDK } from './project';\nexport { ReportSDK } from './report';\nexport { RoleSDK } from './role';\nexport { PermissionSDK } from './permission';\nexport { SheetSDK } from './sheet';\nexport { ColumnSDK } from './column';\nexport { DocumentSDK } from './document';\nexport { ViewSDK } from './view';\nexport { RowSDK } from './row';\nexport { RowPolicySDK } from './row-policy';\nexport { RowAclSDK } from './row-acl';\nexport { FlowChatSDK } from './flow-chat';\nexport { UploadSDK } from './upload';\n"],"mappings":";;;;;;;;AAoBA,IAAa,YAAb,MAAuB;CACrB,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CAET,YAAY,QAAmB;AAC7B,OAAK,SAAS,IAAI,aAAa,OAAO;AACtC,OAAK,OAAO,IAAI,QAAQ,KAAK,OAAO;AACpC,OAAK,UAAU,IAAI,WAAW,KAAK,OAAO;AAC1C,OAAK,SAAS,IAAI,UAAU,KAAK,OAAO;AACxC,OAAK,OAAO,IAAI,QAAQ,KAAK,OAAO;AACpC,OAAK,aAAa,IAAI,cAAc,KAAK,OAAO;AAChD,OAAK,QAAQ,IAAI,SAAS,KAAK,OAAO;AACtC,OAAK,SAAS,IAAI,UAAU,KAAK,OAAO;AACxC,OAAK,WAAW,IAAI,YAAY,KAAK,OAAO;AAC5C,OAAK,OAAO,IAAI,QAAQ,KAAK,OAAO;AACpC,OAAK,MAAM,IAAI,OAAO,KAAK,OAAO;AAClC,OAAK,YAAY,IAAI,aAAa,KAAK,OAAO;AAC9C,OAAK,SAAS,IAAI,UAAU,KAAK,OAAO;AACxC,OAAK,KAAK,IAAI,YAAY,KAAK,OAAO;AACtC,OAAK,SAAS,IAAI,UAAU,KAAK,OAAO;;;AAI5C,SAAgB,UAAU,QAA8B;AACtD,QAAO,IAAI,UAAU,OAAO"}
import { dirname, join } from "path";
import { readFileSync } from "fs";
import { fileURLToPath } from "url";
import { basename } from "node:path";
import { readFile } from "node:fs/promises";
//#region src/core/version.ts
/**
* 版本信息
*/
let _version;
function getVersion() {
if (_version) return _version;
try {
const packageJsonPath = join(dirname(fileURLToPath(import.meta.url)), "..", "package.json");
_version = JSON.parse(readFileSync(packageJsonPath, "utf-8")).version;
} catch {
_version = "1.0.0";
}
return _version ?? "1.0.0";
}
const version = getVersion();
function getUserAgent() {
return `DimensCLI/${version} (Node.js/${process.version})`;
}
//#endregion
//#region src/sdk/flow-chat.ts
var FlowChatSDK = class {
constructor(client) {
this.client = client;
}
completions(teamId, payload) {
return this.client.post(`/app/flow/${teamId}/v1/chat/completions`, payload);
}
};
//#endregion
//#region src/core/http.ts
async function requestJson(url, init = {}) {
const response = await fetch(url, init);
const payload = await response.json();
if (!response.ok) throw new Error(payload?.message || `HTTP ${response.status}`);
return payload;
}
//#endregion
//#region src/sdk/client.ts
var DimensClient = class {
options;
constructor(options) {
this.options = options;
}
getOptions() {
return { ...this.options };
}
async get(path, query, init = {}) {
return requestJson(this.buildUrl(path, query), {
...init,
method: "GET",
headers: this.buildHeaders(init.headers)
});
}
async post(path, body, init = {}) {
const requestInit = {
...init,
method: "POST",
headers: this.buildHeaders(init.headers, true)
};
if (body !== void 0) requestInit.body = JSON.stringify(body);
return requestJson(this.buildUrl(path), requestInit);
}
async postFormData(path, formData, init = {}) {
const requestInit = {
...init,
method: "POST",
headers: this.buildHeaders(init.headers, false, true),
body: formData
};
return requestJson(this.buildUrl(path), requestInit);
}
buildUrl(path, query) {
const base = this.options.baseUrl.replace(/\/+$/, "");
const normalizedPath = path.startsWith("/") ? path : `/${path}`;
const url = new URL(`${base}${normalizedPath}`);
Object.entries(query || {}).forEach(([key, value]) => {
if (value === void 0 || value === null || value === "") return;
url.searchParams.set(key, String(value));
});
return url.toString();
}
buildHeaders(headers, hasJsonBody = false, hasFormDataBody = false) {
const merged = normalizeHeaders(headers);
merged.Accept = "application/json";
merged["User-Agent"] = getUserAgent();
if (hasJsonBody && !hasFormDataBody) merged["Content-Type"] = "application/json";
if (hasFormDataBody) delete merged["Content-Type"];
if (this.options.token) merged.Authorization = `Bearer ${this.options.token}`;
if (this.options.refreshToken) merged["X-Refresh-Token"] = this.options.refreshToken;
return merged;
}
};
function normalizeHeaders(headers) {
if (!headers) return {};
if (typeof Headers !== "undefined" && headers instanceof Headers) return Object.fromEntries(headers.entries());
if (Array.isArray(headers)) return Object.fromEntries(headers.map(([key, value]) => [String(key), String(value)]));
const normalized = {};
Object.entries(headers).forEach(([key, value]) => {
normalized[key] = typeof value === "string" ? value : value.join(", ");
});
return normalized;
}
//#endregion
//#region src/sdk/auth.ts
var AuthSDK = class {
constructor(client) {
this.client = client;
}
login(payload) {
return this.client.post("/login", payload);
}
loginByApiKey(payload) {
return this.client.post("/open/user/login/apiKey", payload);
}
exchangeTokenByApiKey(payload) {
return this.loginByApiKey(payload);
}
refreshToken() {
return this.client.get("/refreshToken");
}
};
//#endregion
//#region src/sdk/column.ts
var ColumnSDK = class {
constructor(client) {
this.client = client;
}
list(teamId, projectId, sheetId) {
return this.client.get(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/column/list`);
}
create(teamId, projectId, sheetId, payload) {
return this.client.post(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/column/create`, payload);
}
update(sheetId, fieldId, payload) {
return this.client.post(`/app/mul/sheet/${sheetId}/column/${fieldId}/update`, payload);
}
delete(sheetId, fieldId) {
return this.client.post(`/app/mul/sheet/${sheetId}/column/${fieldId}/delete`);
}
};
//#endregion
//#region src/sdk/sheet.ts
var SheetSDK = class {
constructor(client) {
this.client = client;
}
list(projectId) {
return this.client.get(`/app/mul/project/${projectId}/sheet/list`);
}
tree(projectId) {
return this.client.get(`/app/mul/project/${projectId}/sheet/tree`);
}
create(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/sheet/create`, payload);
}
info(teamId, projectId, sheetId) {
return this.client.get(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/info`);
}
update(teamId, projectId, sheetId, payload) {
return this.client.post(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/update`, payload);
}
delete(teamId, projectId, sheetId) {
return this.client.post(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/delete`);
}
structure(sheetId) {
return this.client.get(`/app/mul/sheet/${sheetId}/structure`);
}
};
//#endregion
//#region src/sdk/document.ts
var DocumentSDK = class {
constructor(client) {
this.client = client;
}
createWithSheet(teamId, projectId, payload) {
return this.client.post(`/app/documents/${teamId}/${projectId}/document/createWithSheet`, payload);
}
info(teamId, projectId, documentId) {
return this.client.get(`/app/documents/${teamId}/${projectId}/document/${documentId}/info`);
}
update(teamId, projectId, payload) {
return this.client.post(`/app/documents/${teamId}/${projectId}/document/update`, payload);
}
delete(teamId, projectId, documentId) {
return this.client.post(`/app/documents/${teamId}/${projectId}/document/delete`, { documentId });
}
versions(teamId, projectId, query) {
return this.client.get(`/app/documents/${teamId}/${projectId}/document/versions`, query);
}
version(teamId, projectId, query) {
return this.client.get(`/app/documents/${teamId}/${projectId}/document/version`, query);
}
restore(teamId, projectId, payload) {
return this.client.post(`/app/documents/${teamId}/${projectId}/document/restore`, payload);
}
};
//#endregion
//#region src/sdk/upload.ts
var UploadSDK = class {
constructor(client) {
this.client = client;
}
async uploadFile(filePath, keyOrOptions) {
const fileBuffer = await readFile(filePath);
const fileName = basename(filePath);
const file = new File([fileBuffer], fileName, {
type: resolveMimeType(fileName),
lastModified: Date.now()
});
const formData = new FormData();
formData.append("file", file, file.name);
Object.entries(typeof keyOrOptions === "string" ? { key: keyOrOptions } : keyOrOptions ?? {}).forEach(([field, value]) => {
if (!value) return;
formData.append(field, value);
});
return this.client.postFormData("/app/base/comm/upload", formData);
}
async getMode() {
return this.client.get("/app/base/comm/uploadMode");
}
};
function resolveMimeType(fileName) {
const lowerFileName = fileName.toLowerCase();
if (lowerFileName.endsWith(".txt")) return "text/plain";
if (lowerFileName.endsWith(".json")) return "application/json";
if (lowerFileName.endsWith(".pdf")) return "application/pdf";
if (lowerFileName.endsWith(".png")) return "image/png";
if (lowerFileName.endsWith(".jpg") || lowerFileName.endsWith(".jpeg")) return "image/jpeg";
if (lowerFileName.endsWith(".gif")) return "image/gif";
if (lowerFileName.endsWith(".svg")) return "image/svg+xml";
if (lowerFileName.endsWith(".csv")) return "text/csv";
return "application/octet-stream";
}
//#endregion
//#region src/sdk/project.ts
var ProjectSDK = class {
constructor(client) {
this.client = client;
}
page(teamId, payload) {
return this.client.post(`/app/org/${teamId}/project/page`, payload);
}
info(teamId, id) {
return this.client.get(`/app/org/${teamId}/project/info`, { id });
}
create(teamId, payload) {
return this.client.post(`/app/org/${teamId}/project/add`, payload);
}
update(teamId, payload) {
return this.client.post(`/app/org/${teamId}/project/update`, payload);
}
trash(teamId, ids) {
return this.client.post(`/app/org/${teamId}/project/trash`, { ids });
}
restore(teamId, ids) {
return this.client.post(`/app/org/${teamId}/project/restore`, { ids });
}
};
//#endregion
//#region src/sdk/permission.ts
var PermissionSDK = class {
constructor(client) {
this.client = client;
}
list(projectId, sheetId) {
return this.client.get(`/app/mul/project/${projectId}/permission/list`, { sheetId });
}
info(projectId, id, sheetId) {
return this.client.get(`/app/mul/project/${projectId}/permission/info`, {
id,
sheetId
});
}
create(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/permission/add`, payload);
}
update(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/permission/update`, payload);
}
delete(projectId, ids, sheetId) {
return this.client.post(`/app/mul/project/${projectId}/permission/delete`, {
ids,
sheetId
});
}
check(projectId, payload) {
return this.client.get(`/app/mul/project/${projectId}/permission/check`, payload);
}
batch(projectId, sheetId, permissions) {
return this.client.post(`/app/mul/project/${projectId}/permission/batch`, {
sheetId,
permissions
});
}
updateResourcePermission(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/permission/updateResourcePermission`, payload);
}
};
//#endregion
//#region src/sdk/report.ts
var ReportSDK = class {
constructor(client) {
this.client = client;
}
normalizeProjectReport(data) {
const reportId = typeof data.reportId === "string" ? data.reportId : typeof data.sheetId === "string" ? data.sheetId : typeof data.id === "string" ? data.id : "";
return {
...data,
reportId,
sheetId: typeof data.sheetId === "string" ? data.sheetId : reportId
};
}
list(projectId, payload) {
return this.client.post(`/app/report/${projectId}/list`, payload);
}
info(projectId, reportId) {
return this.client.get(`/app/report/${projectId}/info`, { reportId });
}
create(projectId, payload) {
return this.client.post(`/app/report/${projectId}/add`, payload);
}
async createProjectReport(projectId, payload) {
const response = await this.client.post(`/app/mul/project/${projectId}/sheet/create`, {
name: payload.name,
type: "report",
config: { dashboardConfig: {
id: payload.dashboardId || `dashboard_${Date.now()}`,
title: payload.name,
...payload.description ? { description: payload.description } : {},
widgets: [],
parameters: [],
createdAt: payload.createdAt || Date.now()
} }
});
return {
...response,
data: this.normalizeProjectReport(response.data || {})
};
}
update(projectId, payload) {
return this.client.post(`/app/report/${projectId}/update`, payload);
}
copy(projectId, payload) {
return this.client.post(`/app/report/${projectId}/copy`, payload);
}
publish(projectId, payload) {
return this.client.post(`/app/report/${projectId}/publish`, payload);
}
delete(projectId, payload) {
return this.client.post(`/app/report/${projectId}/delete`, payload);
}
archive(projectId, payload) {
return this.client.post(`/app/report/${projectId}/archive`, payload);
}
sort(projectId, payload) {
return this.client.post(`/app/report/${projectId}/sort`, payload);
}
move(projectId, payload) {
return this.client.post(`/app/report/${projectId}/move`, payload);
}
query(projectId, payload) {
return this.client.post(`/app/report/query/${projectId}`, payload);
}
queryWidget(projectId, payload) {
return this.client.post(`/app/report/query/${projectId}/widget`, payload);
}
preview(projectId, payload) {
return this.client.post(`/app/report/query/${projectId}/preview`, payload);
}
validate(projectId, payload) {
return this.client.post(`/app/report/${projectId}/validate`, payload);
}
addWidget(projectId, payload) {
return this.client.post(`/app/report/widget/${projectId}/add`, payload);
}
updateWidget(projectId, payload) {
return this.client.post(`/app/report/widget/${projectId}/update`, payload);
}
deleteWidget(projectId, payload) {
return this.client.post(`/app/report/widget/${projectId}/delete`, payload);
}
batchWidgets(projectId, payload) {
return this.client.post(`/app/report/widget/${projectId}/batch`, payload);
}
sortWidget(projectId, payload) {
return this.client.post(`/app/report/widget/${projectId}/sort`, payload);
}
};
//#endregion
//#region src/sdk/role.ts
var RoleSDK = class {
constructor(client) {
this.client = client;
}
list(projectId) {
return this.client.get(`/app/mul/project/${projectId}/role/list`);
}
info(projectId, roleId) {
return this.client.get(`/app/mul/project/${projectId}/role/info`, { roleId });
}
create(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/role/add`, payload);
}
update(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/role/update`, payload);
}
delete(projectId, roleIds) {
return this.client.post(`/app/mul/project/${projectId}/role/delete`, { roleIds });
}
assignUser(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/role/assignUser`, payload);
}
removeUser(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/role/removeUser`, payload);
}
userRoles(projectId, userId, sheetId) {
return this.client.get(`/app/mul/project/${projectId}/role/userRoles`, {
userId,
sheetId
});
}
roleUsers(projectId, roleId) {
return this.client.get(`/app/mul/project/${projectId}/role/roleUsers`, { roleId });
}
projectUsers(projectId) {
return this.client.get(`/app/mul/project/${projectId}/role/projectUsers`);
}
};
//#endregion
//#region src/sdk/row.ts
var RowSDK = class {
constructor(client) {
this.client = client;
}
page(teamId, projectId, sheetId, payload) {
return this.client.post(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/row/page`, payload);
}
info(teamId, projectId, sheetId, rowId) {
return this.client.get(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/row/${rowId}/info`);
}
create(sheetId, payload) {
return this.client.post(`/app/mul/sheet/${sheetId}/row/create`, payload);
}
update(sheetId, rowId, data, version) {
return this.client.post(`/app/mul/sheet/${sheetId}/row/${rowId}/update`, {
data,
version
});
}
delete(sheetId, rowId) {
return this.client.post(`/app/mul/sheet/${sheetId}/row/${rowId}/delete`);
}
updateCell(sheetId, payload) {
return this.client.post(`/app/mul/sheet/${sheetId}/row/cell`, payload);
}
};
//#endregion
//#region src/sdk/row-acl.ts
var RowAclSDK = class {
constructor(client) {
this.client = client;
}
grant(sheetId, payload) {
return this.client.post("/app/mul/rowAcl/grant", {
sheetId,
...payload
});
}
revoke(sheetId, rowId, target) {
return this.client.post("/app/mul/rowAcl/revoke", {
sheetId,
rowId,
target
});
}
revokeDept(sheetId, rowId, deptId) {
return this.client.post("/app/mul/rowAcl/revokeDeptAccess", {
sheetId,
rowId,
deptId
});
}
revokeRole(sheetId, rowId, roleId) {
return this.client.post("/app/mul/rowAcl/revokeRoleAccess", {
sheetId,
rowId,
roleId
});
}
list(sheetId, rowId) {
return this.client.get("/app/mul/rowAcl/list", {
sheetId,
rowId
});
}
roleAcls(sheetId, roleId) {
return this.client.get("/app/mul/rowAcl/roleAcls", {
sheetId,
roleId
});
}
};
//#endregion
//#region src/sdk/row-policy.ts
var RowPolicySDK = class {
constructor(client) {
this.client = client;
}
list(projectId, sheetId) {
return this.client.get(`/app/mul/project/${projectId}/row_policy/list`, { sheetId });
}
info(projectId, id, sheetId) {
return this.client.get(`/app/mul/project/${projectId}/row_policy/info`, {
id,
sheetId
});
}
create(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/row_policy/add`, payload);
}
update(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/row_policy/update`, payload);
}
delete(projectId, ids, sheetId) {
return this.client.post(`/app/mul/project/${projectId}/row_policy/delete`, {
ids,
sheetId
});
}
toggle(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/row_policy/toggle`, payload);
}
check(projectId, payload) {
return this.client.post(`/app/mul/project/${projectId}/row_policy/check`, payload);
}
};
//#endregion
//#region src/sdk/view.ts
var ViewSDK = class {
constructor(client) {
this.client = client;
}
list(teamId, projectId, sheetId) {
return this.client.get(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/view/list`);
}
create(teamId, projectId, sheetId, payload) {
return this.client.post(`/app/mul/${teamId}/${projectId}/sheet/${sheetId}/view/create`, payload);
}
};
//#endregion
export { getVersion as _, RoleSDK as a, ProjectSDK as c, SheetSDK as d, ColumnSDK as f, getUserAgent as g, FlowChatSDK as h, RowSDK as i, UploadSDK as l, DimensClient as m, RowPolicySDK as n, ReportSDK as o, AuthSDK as p, RowAclSDK as r, PermissionSDK as s, ViewSDK as t, DocumentSDK as u, version as v };
//# sourceMappingURL=view-Cyzxo5yi.mjs.map
{"version":3,"file":"view-Cyzxo5yi.mjs","names":[],"sources":["../src/core/version.ts","../src/sdk/flow-chat.ts","../src/core/http.ts","../src/sdk/client.ts","../src/sdk/auth.ts","../src/sdk/column.ts","../src/sdk/sheet.ts","../src/sdk/document.ts","../src/sdk/upload.ts","../src/sdk/project.ts","../src/sdk/permission.ts","../src/sdk/report.ts","../src/sdk/role.ts","../src/sdk/row.ts","../src/sdk/row-acl.ts","../src/sdk/row-policy.ts","../src/sdk/view.ts"],"sourcesContent":["/**\n * 版本信息\n */\n\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { dirname } from 'path';\n\nlet _version: string | undefined;\n\nexport function getVersion(): string {\n if (_version) return _version;\n\n try {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const packageJsonPath = join(__dirname, '..', 'package.json');\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n _version = packageJson.version;\n } catch {\n _version = '1.0.0';\n }\n\n return _version ?? '1.0.0';\n}\n\nexport const version = getVersion();\n\nexport function getUserAgent(): string {\n return `DimensCLI/${version} (Node.js/${process.version})`;\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface FlowChatMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\nexport interface FlowChatCompletionsPayload {\n model?: string | number;\n messages: FlowChatMessage[];\n stream?: boolean;\n user?: string;\n sessionId?: string;\n [key: string]: unknown;\n}\n\nexport interface FlowChatCompletionChoice {\n index?: number;\n message: {\n role: string;\n content: string;\n };\n finish_reason?: string | null;\n}\n\nexport interface FlowChatCompletionResult {\n id: string;\n object?: string;\n created?: number;\n model?: string;\n choices: FlowChatCompletionChoice[];\n usage?: Record<string, unknown>;\n}\n\nexport class FlowChatSDK {\n constructor(private readonly client: DimensClient) {}\n\n completions(\n teamId: string,\n payload: FlowChatCompletionsPayload\n ): Promise<APIResponse<FlowChatCompletionResult>> {\n return this.client.post<FlowChatCompletionResult>(\n `/app/flow/${teamId}/v1/chat/completions`,\n payload\n );\n }\n}\n","export async function requestJson<T>(\n url: string,\n init: RequestInit = {}\n): Promise<T> {\n const response = await fetch(url, init);\n const payload = (await response.json()) as { message?: string };\n\n if (!response.ok) {\n throw new Error(payload?.message || `HTTP ${response.status}`);\n }\n\n return payload as T;\n}\n","import { getUserAgent } from '../core/version';\nimport { requestJson } from '../core/http';\n\nexport interface DimensClientOptions {\n baseUrl: string;\n token?: string;\n refreshToken?: string;\n teamId?: string;\n projectId?: string;\n}\n\nexport interface APIResponse<T> {\n code: number;\n message: string;\n data: T;\n}\n\ntype QueryValue = string | number | boolean | null | undefined;\ntype QueryParams = Record<string, QueryValue>;\ntype HeaderTupleList = Array<[string, string]> | string[][];\ntype HeaderObjectInput = Record<string, string | readonly string[]>;\n\nexport class DimensClient {\n private readonly options: DimensClientOptions;\n\n constructor(options: DimensClientOptions) {\n this.options = options;\n }\n\n getOptions(): DimensClientOptions {\n return { ...this.options };\n }\n\n async get<T>(\n path: string,\n query?: QueryParams,\n init: RequestInit = {}\n ): Promise<APIResponse<T>> {\n return requestJson<APIResponse<T>>(this.buildUrl(path, query), {\n ...init,\n method: 'GET',\n headers: this.buildHeaders(init.headers),\n });\n }\n\n async post<T>(\n path: string,\n body?: unknown,\n init: RequestInit = {}\n ): Promise<APIResponse<T>> {\n const requestInit: RequestInit = {\n ...init,\n method: 'POST',\n headers: this.buildHeaders(init.headers, true),\n };\n\n if (body !== undefined) {\n requestInit.body = JSON.stringify(body);\n }\n\n return requestJson<APIResponse<T>>(this.buildUrl(path), requestInit);\n }\n\n async postFormData<T>(\n path: string,\n formData: FormData,\n init: RequestInit = {}\n ): Promise<APIResponse<T>> {\n const requestInit: RequestInit = {\n ...init,\n method: 'POST',\n headers: this.buildHeaders(init.headers, false, true),\n body: formData,\n };\n\n return requestJson<APIResponse<T>>(this.buildUrl(path), requestInit);\n }\n\n private buildUrl(path: string, query?: QueryParams): string {\n const base = this.options.baseUrl.replace(/\\/+$/, '');\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${base}${normalizedPath}`);\n\n Object.entries(query || {}).forEach(([key, value]) => {\n if (value === undefined || value === null || value === '') {\n return;\n }\n url.searchParams.set(key, String(value));\n });\n\n return url.toString();\n }\n\n private buildHeaders(\n headers?: unknown,\n hasJsonBody = false,\n hasFormDataBody = false\n ): Record<string, string> {\n const merged = normalizeHeaders(headers);\n merged.Accept = 'application/json';\n merged['User-Agent'] = getUserAgent();\n\n if (hasJsonBody && !hasFormDataBody) {\n merged['Content-Type'] = 'application/json';\n }\n if (hasFormDataBody) {\n delete merged['Content-Type'];\n }\n if (this.options.token) {\n merged.Authorization = `Bearer ${this.options.token}`;\n }\n if (this.options.refreshToken) {\n merged['X-Refresh-Token'] = this.options.refreshToken;\n }\n\n return merged;\n }\n}\n\nfunction normalizeHeaders(headers?: unknown): Record<string, string> {\n if (!headers) {\n return {};\n }\n if (typeof Headers !== 'undefined' && headers instanceof Headers) {\n return Object.fromEntries(headers.entries());\n }\n if (Array.isArray(headers)) {\n return Object.fromEntries(\n (headers as HeaderTupleList).map(([key, value]) => [String(key), String(value)])\n );\n }\n const normalized: Record<string, string> = {};\n Object.entries(headers as HeaderObjectInput).forEach(([key, value]) => {\n normalized[key] = typeof value === 'string' ? value : value.join(', ');\n });\n return normalized;\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface LoginPayload {\n username: string;\n password: string;\n captchaId?: string;\n verifyCode?: string;\n}\n\nexport interface ApiKeyLoginPayload {\n apiKey: string;\n apiSecret: string;\n}\n\nexport interface LoginResult {\n token: string;\n refreshToken?: string;\n expire?: number;\n userInfo?: Record<string, unknown>;\n}\n\nexport interface RefreshTokenResult {\n token: string;\n refreshToken?: string;\n expire?: number;\n}\n\nexport class AuthSDK {\n constructor(private readonly client: DimensClient) {}\n\n login(payload: LoginPayload): Promise<APIResponse<LoginResult>> {\n return this.client.post<LoginResult>('/login', payload);\n }\n\n loginByApiKey(payload: ApiKeyLoginPayload): Promise<APIResponse<LoginResult>> {\n return this.client.post<LoginResult>('/open/user/login/apiKey', payload);\n }\n\n exchangeTokenByApiKey(\n payload: ApiKeyLoginPayload\n ): Promise<APIResponse<LoginResult>> {\n return this.loginByApiKey(payload);\n }\n\n refreshToken(): Promise<APIResponse<RefreshTokenResult>> {\n return this.client.get<RefreshTokenResult>('/refreshToken');\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface ColumnInfo {\n id: string;\n title?: string;\n label?: string;\n type?: string;\n [key: string]: unknown;\n}\n\nexport interface ColumnMutationPayload {\n title?: string;\n label?: string;\n type?: string;\n description?: string;\n config?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport class ColumnSDK {\n constructor(private readonly client: DimensClient) {}\n\n list(\n teamId: string,\n projectId: string,\n sheetId: string\n ): Promise<APIResponse<ColumnInfo[]>> {\n return this.client.get<ColumnInfo[]>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/column/list`\n );\n }\n\n create(\n teamId: string,\n projectId: string,\n sheetId: string,\n payload: ColumnMutationPayload\n ): Promise<APIResponse<ColumnInfo>> {\n return this.client.post<ColumnInfo>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/column/create`,\n payload\n );\n }\n\n update(\n sheetId: string,\n fieldId: string,\n payload: ColumnMutationPayload\n ): Promise<APIResponse<ColumnInfo>> {\n return this.client.post<ColumnInfo>(\n `/app/mul/sheet/${sheetId}/column/${fieldId}/update`,\n payload\n );\n }\n\n delete(sheetId: string, fieldId: string): Promise<APIResponse<boolean>> {\n return this.client.post<boolean>(`/app/mul/sheet/${sheetId}/column/${fieldId}/delete`);\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface SheetInfo {\n id: string;\n name?: string;\n [key: string]: unknown;\n}\n\nexport interface SheetMutationPayload {\n name?: string;\n icon?: string;\n type?: 'sheet' | 'folder' | 'document' | 'report';\n folderId?: string;\n [key: string]: unknown;\n}\n\nexport class SheetSDK {\n constructor(private readonly client: DimensClient) {}\n\n list(projectId: string): Promise<APIResponse<SheetInfo[]>> {\n return this.client.get<SheetInfo[]>(`/app/mul/project/${projectId}/sheet/list`);\n }\n\n tree(projectId: string): Promise<APIResponse<unknown[]>> {\n return this.client.get<unknown[]>(`/app/mul/project/${projectId}/sheet/tree`);\n }\n\n create(projectId: string, payload: SheetMutationPayload): Promise<APIResponse<SheetInfo>> {\n return this.client.post<SheetInfo>(`/app/mul/project/${projectId}/sheet/create`, payload);\n }\n\n info(teamId: string, projectId: string, sheetId: string): Promise<APIResponse<SheetInfo>> {\n return this.client.get<SheetInfo>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/info`\n );\n }\n\n update(\n teamId: string,\n projectId: string,\n sheetId: string,\n payload: SheetMutationPayload\n ): Promise<APIResponse<SheetInfo>> {\n return this.client.post<SheetInfo>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/update`,\n payload\n );\n }\n\n delete(teamId: string, projectId: string, sheetId: string): Promise<APIResponse<boolean>> {\n return this.client.post<boolean>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/delete`\n );\n }\n\n structure(sheetId: string): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.get<Record<string, unknown>>(`/app/mul/sheet/${sheetId}/structure`);\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface DocumentInfo {\n documentId: string;\n sheetId?: string;\n rowId?: string;\n title?: string;\n content?: string;\n format?: 'richtext' | 'markdown' | 'html';\n version?: number;\n [key: string]: unknown;\n}\n\nexport interface DocumentCreateWithSheetPayload {\n parentId?: string;\n title: string;\n content?: string;\n format?: 'richtext' | 'markdown' | 'html';\n}\n\nexport interface DocumentUpdatePayload {\n documentId: string;\n content: string;\n version: number;\n createVersion?: boolean;\n changeSummary?: string;\n}\n\nexport interface DocumentVersionsQuery {\n documentId: string;\n page?: number;\n size?: number;\n [key: string]: string | number | boolean | null | undefined;\n}\n\nexport interface DocumentVersionQuery {\n documentId: string;\n version: number;\n [key: string]: string | number | boolean | null | undefined;\n}\n\nexport interface DocumentRestorePayload {\n documentId: string;\n version: number;\n}\n\nexport interface DocumentCreateWithSheetResult {\n sheet: Record<string, unknown>;\n document: DocumentInfo;\n}\n\nexport class DocumentSDK {\n constructor(private readonly client: DimensClient) {}\n\n createWithSheet(\n teamId: string,\n projectId: string,\n payload: DocumentCreateWithSheetPayload\n ): Promise<APIResponse<DocumentCreateWithSheetResult>> {\n return this.client.post<DocumentCreateWithSheetResult>(\n `/app/documents/${teamId}/${projectId}/document/createWithSheet`,\n payload\n );\n }\n\n info(teamId: string, projectId: string, documentId: string): Promise<APIResponse<DocumentInfo>> {\n return this.client.get<DocumentInfo>(\n `/app/documents/${teamId}/${projectId}/document/${documentId}/info`\n );\n }\n\n update(\n teamId: string,\n projectId: string,\n payload: DocumentUpdatePayload\n ): Promise<APIResponse<DocumentInfo>> {\n return this.client.post<DocumentInfo>(\n `/app/documents/${teamId}/${projectId}/document/update`,\n payload\n );\n }\n\n delete(\n teamId: string,\n projectId: string,\n documentId: string\n ): Promise<APIResponse<{ success?: boolean } | boolean>> {\n return this.client.post<{ success?: boolean } | boolean>(\n `/app/documents/${teamId}/${projectId}/document/delete`,\n { documentId }\n );\n }\n\n versions(\n teamId: string,\n projectId: string,\n query: DocumentVersionsQuery\n ): Promise<APIResponse<unknown>> {\n return this.client.get<unknown>(`/app/documents/${teamId}/${projectId}/document/versions`, query);\n }\n\n version(\n teamId: string,\n projectId: string,\n query: DocumentVersionQuery\n ): Promise<APIResponse<unknown>> {\n return this.client.get<unknown>(`/app/documents/${teamId}/${projectId}/document/version`, query);\n }\n\n restore(\n teamId: string,\n projectId: string,\n payload: DocumentRestorePayload\n ): Promise<APIResponse<DocumentInfo>> {\n return this.client.post<DocumentInfo>(\n `/app/documents/${teamId}/${projectId}/document/restore`,\n payload\n );\n }\n}\n","import { basename } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface UploadResponse {\n id?: string;\n fileId?: string;\n key?: string;\n url?: string;\n name?: string;\n size?: number;\n type?: string;\n mimeType?: string;\n ext?: string;\n [key: string]: unknown;\n}\n\nexport interface UploadFileOptions {\n key?: string;\n type?: string;\n bizType?: string;\n scene?: string;\n teamId?: string;\n projectId?: string;\n [key: string]: string | undefined;\n}\n\nexport interface UploadModeResult {\n mode?: string;\n type?: string;\n [key: string]: unknown;\n}\n\nexport class UploadSDK {\n constructor(private readonly client: DimensClient) {}\n\n async uploadFile(\n filePath: string,\n keyOrOptions?: string | UploadFileOptions\n ): Promise<APIResponse<UploadResponse>> {\n const fileBuffer = await readFile(filePath);\n const fileName = basename(filePath);\n const file = new File([fileBuffer], fileName, {\n type: resolveMimeType(fileName),\n lastModified: Date.now(),\n });\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n\n const options =\n typeof keyOrOptions === 'string'\n ? { key: keyOrOptions }\n : (keyOrOptions ?? {});\n\n Object.entries(options).forEach(([field, value]) => {\n if (!value) {\n return;\n }\n formData.append(field, value);\n });\n\n return this.client.postFormData<UploadResponse>('/app/base/comm/upload', formData);\n }\n\n async getMode(): Promise<APIResponse<UploadModeResult>> {\n return this.client.get<UploadModeResult>('/app/base/comm/uploadMode');\n }\n}\n\nfunction resolveMimeType(fileName: string): string {\n const lowerFileName = fileName.toLowerCase();\n\n if (lowerFileName.endsWith('.txt')) {\n return 'text/plain';\n }\n if (lowerFileName.endsWith('.json')) {\n return 'application/json';\n }\n if (lowerFileName.endsWith('.pdf')) {\n return 'application/pdf';\n }\n if (lowerFileName.endsWith('.png')) {\n return 'image/png';\n }\n if (lowerFileName.endsWith('.jpg') || lowerFileName.endsWith('.jpeg')) {\n return 'image/jpeg';\n }\n if (lowerFileName.endsWith('.gif')) {\n return 'image/gif';\n }\n if (lowerFileName.endsWith('.svg')) {\n return 'image/svg+xml';\n }\n if (lowerFileName.endsWith('.csv')) {\n return 'text/csv';\n }\n\n return 'application/octet-stream';\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface ProjectInfo {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\nexport interface ProjectPagePayload {\n page?: number;\n size?: number;\n keyword?: string;\n [key: string]: unknown;\n}\n\nexport interface ProjectPageResult {\n list: ProjectInfo[];\n pagination?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface ProjectMutationPayload {\n id?: string;\n name?: string;\n description?: string;\n icon?: string;\n remark?: string;\n projectType?: string;\n coverImage?: string;\n [key: string]: unknown;\n}\n\nexport class ProjectSDK {\n constructor(private readonly client: DimensClient) {}\n\n page(teamId: string, payload: ProjectPagePayload): Promise<APIResponse<ProjectPageResult>> {\n return this.client.post<ProjectPageResult>(`/app/org/${teamId}/project/page`, payload);\n }\n\n info(teamId: string, id: string): Promise<APIResponse<ProjectInfo>> {\n return this.client.get<ProjectInfo>(`/app/org/${teamId}/project/info`, { id });\n }\n\n create(\n teamId: string,\n payload: ProjectMutationPayload\n ): Promise<APIResponse<ProjectInfo>> {\n return this.client.post<ProjectInfo>(`/app/org/${teamId}/project/add`, payload);\n }\n\n update(\n teamId: string,\n payload: ProjectMutationPayload\n ): Promise<APIResponse<ProjectInfo>> {\n return this.client.post<ProjectInfo>(`/app/org/${teamId}/project/update`, payload);\n }\n\n trash(teamId: string, ids: string[]): Promise<APIResponse<boolean>> {\n return this.client.post<boolean>(`/app/org/${teamId}/project/trash`, { ids });\n }\n\n restore(teamId: string, ids: string[]): Promise<APIResponse<boolean>> {\n return this.client.post<boolean>(`/app/org/${teamId}/project/restore`, { ids });\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport type ResourceType = 'sheet' | 'document' | 'report' | 'page' | 'micro_module';\n\nexport interface ResourcePermission {\n visible: boolean;\n editable: boolean;\n}\n\nexport interface PermissionInfo {\n id?: number;\n roleId?: string;\n sheetId?: string;\n dataAccess?: string;\n canRead?: boolean;\n canWrite?: boolean;\n columnVisibility?: Record<string, boolean>;\n columnReadonly?: Record<string, boolean>;\n resourceId?: string;\n resourceType?: ResourceType;\n resourcePermission?: ResourcePermission;\n [key: string]: unknown;\n}\n\nexport interface PermissionMutationPayload extends PermissionInfo {}\n\nexport interface PermissionUpdatePayload {\n id: number;\n data: PermissionMutationPayload;\n sheetId: string;\n}\n\nexport interface ResourcePermissionUpdatePayload {\n roleId: string;\n resourceId: string;\n resourceType: ResourceType;\n permission: Partial<ResourcePermission>;\n}\n\nexport class PermissionSDK {\n constructor(private readonly client: DimensClient) {}\n\n list(projectId: string, sheetId?: string): Promise<APIResponse<PermissionInfo[]>> {\n return this.client.get<PermissionInfo[]>(\n `/app/mul/project/${projectId}/permission/list`,\n { sheetId }\n );\n }\n\n info(projectId: string, id: number, sheetId: string): Promise<APIResponse<PermissionInfo>> {\n return this.client.get<PermissionInfo>(`/app/mul/project/${projectId}/permission/info`, {\n id,\n sheetId,\n });\n }\n\n create(projectId: string, payload: PermissionMutationPayload): Promise<APIResponse<PermissionInfo>> {\n return this.client.post<PermissionInfo>(\n `/app/mul/project/${projectId}/permission/add`,\n payload\n );\n }\n\n update(projectId: string, payload: PermissionUpdatePayload): Promise<APIResponse<PermissionInfo>> {\n return this.client.post<PermissionInfo>(\n `/app/mul/project/${projectId}/permission/update`,\n payload\n );\n }\n\n delete(projectId: string, ids: number[], sheetId: string): Promise<APIResponse<unknown[]>> {\n return this.client.post<unknown[]>(`/app/mul/project/${projectId}/permission/delete`, {\n ids,\n sheetId,\n });\n }\n\n check(\n projectId: string,\n payload: { userId: number; sheetId: string; action: 'view' | 'edit' | 'delete' | 'manage' | 'schema' }\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.get<Record<string, unknown>>(\n `/app/mul/project/${projectId}/permission/check`,\n payload\n );\n }\n\n batch(projectId: string, sheetId: string, permissions: PermissionMutationPayload[]): Promise<APIResponse<unknown[]>> {\n return this.client.post<unknown[]>(`/app/mul/project/${projectId}/permission/batch`, {\n sheetId,\n permissions,\n });\n }\n\n updateResourcePermission(\n projectId: string,\n payload: ResourcePermissionUpdatePayload\n ): Promise<APIResponse<PermissionInfo>> {\n return this.client.post<PermissionInfo>(\n `/app/mul/project/${projectId}/permission/updateResourcePermission`,\n payload\n );\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface ReportInfo {\n reportId: string;\n projectId?: string;\n name?: string;\n description?: string;\n type?: number | string;\n config?: Record<string, unknown>;\n widgets?: Array<Record<string, unknown>>;\n parameters?: Array<Record<string, unknown>>;\n [key: string]: unknown;\n}\n\nexport interface ReportListPayload {\n keyword?: string;\n type?: number | string;\n status?: number;\n page?: number;\n size?: number;\n}\n\nexport interface ReportListResult {\n list: ReportInfo[];\n pagination?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface ReportCreatePayload {\n name: string;\n description?: string;\n type?: number | string;\n config?: Record<string, unknown>;\n widgets?: Array<Record<string, unknown>>;\n parameters?: Array<Record<string, unknown>>;\n}\n\nexport interface ReportCreateResult {\n reportId: string;\n sheetId?: string;\n [key: string]: unknown;\n}\n\nexport interface ProjectReportCreatePayload {\n name: string;\n description?: string;\n dashboardId?: string;\n createdAt?: number;\n}\n\nexport interface ReportUpdatePayload {\n reportId: string;\n name?: string;\n description?: string;\n type?: number | string;\n config?: Record<string, unknown>;\n widgets?: Array<Record<string, unknown>>;\n parameters?: Array<Record<string, unknown>>;\n}\n\nexport interface ReportDeletePayload {\n reportId: string;\n}\n\nexport interface ReportCopyPayload {\n reportId: string;\n name?: string;\n}\n\nexport interface ReportSortPayload {\n reportId: string;\n targetIndex: number;\n}\n\nexport interface ReportMovePayload {\n reportId: string;\n targetProjectId: string;\n}\n\nexport interface ReportPublishPayload {\n reportId: string;\n isPublic: number;\n}\n\nexport interface ReportQueryPayload {\n reportId: string;\n parameterValues?: Record<string, unknown>;\n widgetIds?: string[];\n}\n\nexport type ReportQueryResult = Record<string, unknown>;\n\nexport interface ReportQueryWidgetPayload {\n reportId: string;\n widgetId: string;\n parameterValues?: Record<string, unknown>;\n dataSource?: Record<string, unknown>;\n dataMapping?: Record<string, unknown>;\n}\n\nexport interface ReportPreviewPayload {\n dataSource: Record<string, unknown>;\n dataMapping?: Record<string, unknown>;\n parameterValues?: Record<string, unknown>;\n}\n\nexport interface ReportValidatePayload {\n config: Record<string, unknown>;\n}\n\nexport interface ReportWidgetPayload {\n reportId: string;\n type: string;\n title?: string;\n description?: string;\n dataSource: Record<string, unknown>;\n layout?: Record<string, unknown>;\n dataMapping?: Record<string, unknown>;\n chartConfig?: Record<string, unknown>;\n orderNum?: number;\n parentId?: string;\n visibility?: Record<string, unknown>;\n}\n\nexport interface ReportWidgetUpdatePayload {\n widgetId: string;\n type?: string;\n title?: string;\n description?: string;\n dataSource?: Record<string, unknown>;\n layout?: Record<string, unknown>;\n dataMapping?: Record<string, unknown>;\n chartConfig?: Record<string, unknown> | null;\n orderNum?: number;\n parentId?: string;\n visibility?: Record<string, unknown>;\n}\n\nexport interface ReportWidgetDeletePayload {\n widgetId: string;\n}\n\nexport interface ReportWidgetBatchPayload {\n reportId: string;\n widgets: Array<Record<string, unknown>>;\n}\n\nexport interface ReportWidgetSortPayload {\n reportId: string;\n widgetId: string;\n targetOrder: number;\n}\n\nexport interface ReportWidgetResult {\n widgetId: string;\n [key: string]: unknown;\n}\n\nexport class ReportSDK {\n constructor(private readonly client: DimensClient) {}\n\n private normalizeProjectReport(data: Record<string, unknown>): ReportCreateResult {\n const reportId =\n typeof data.reportId === 'string'\n ? data.reportId\n : typeof data.sheetId === 'string'\n ? data.sheetId\n : typeof data.id === 'string'\n ? data.id\n : '';\n return {\n ...data,\n reportId,\n sheetId: typeof data.sheetId === 'string' ? data.sheetId : reportId,\n } as ReportCreateResult;\n }\n\n list(\n projectId: string,\n payload: ReportListPayload\n ): Promise<APIResponse<ReportListResult>> {\n return this.client.post<ReportListResult>(`/app/report/${projectId}/list`, payload);\n }\n\n info(projectId: string, reportId: string): Promise<APIResponse<ReportInfo | null>> {\n return this.client.get<ReportInfo | null>(`/app/report/${projectId}/info`, { reportId });\n }\n\n create(\n projectId: string,\n payload: ReportCreatePayload\n ): Promise<APIResponse<ReportCreateResult>> {\n return this.client.post<ReportCreateResult>(`/app/report/${projectId}/add`, payload);\n }\n\n async createProjectReport(\n projectId: string,\n payload: ProjectReportCreatePayload\n ): Promise<APIResponse<ReportCreateResult>> {\n const response = await this.client.post<Record<string, unknown>>(\n `/app/mul/project/${projectId}/sheet/create`,\n {\n name: payload.name,\n type: 'report',\n config: {\n dashboardConfig: {\n id: payload.dashboardId || `dashboard_${Date.now()}`,\n title: payload.name,\n ...(payload.description ? { description: payload.description } : {}),\n widgets: [],\n parameters: [],\n createdAt: payload.createdAt || Date.now(),\n },\n },\n }\n );\n return {\n ...response,\n data: this.normalizeProjectReport((response.data || {}) as Record<string, unknown>),\n };\n }\n\n update(\n projectId: string,\n payload: ReportUpdatePayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/update`, payload);\n }\n\n copy(\n projectId: string,\n payload: ReportCopyPayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/copy`, payload);\n }\n\n publish(\n projectId: string,\n payload: ReportPublishPayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/publish`, payload);\n }\n\n delete(\n projectId: string,\n payload: ReportDeletePayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/delete`, payload);\n }\n\n archive(\n projectId: string,\n payload: ReportDeletePayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/archive`, payload);\n }\n\n sort(\n projectId: string,\n payload: ReportSortPayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/sort`, payload);\n }\n\n move(\n projectId: string,\n payload: ReportMovePayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/move`, payload);\n }\n\n query(\n projectId: string,\n payload: ReportQueryPayload\n ): Promise<APIResponse<ReportQueryResult>> {\n return this.client.post<ReportQueryResult>(`/app/report/query/${projectId}`, payload);\n }\n\n queryWidget(\n projectId: string,\n payload: ReportQueryWidgetPayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/report/query/${projectId}/widget`,\n payload\n );\n }\n\n preview(\n projectId: string,\n payload: ReportPreviewPayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/report/query/${projectId}/preview`,\n payload\n );\n }\n\n validate(\n projectId: string,\n payload: ReportValidatePayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(`/app/report/${projectId}/validate`, payload);\n }\n\n addWidget(\n projectId: string,\n payload: ReportWidgetPayload\n ): Promise<APIResponse<ReportWidgetResult>> {\n return this.client.post<ReportWidgetResult>(`/app/report/widget/${projectId}/add`, payload);\n }\n\n updateWidget(\n projectId: string,\n payload: ReportWidgetUpdatePayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/report/widget/${projectId}/update`,\n payload\n );\n }\n\n deleteWidget(\n projectId: string,\n payload: ReportWidgetDeletePayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/report/widget/${projectId}/delete`,\n payload\n );\n }\n\n batchWidgets(\n projectId: string,\n payload: ReportWidgetBatchPayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/report/widget/${projectId}/batch`,\n payload\n );\n }\n\n sortWidget(\n projectId: string,\n payload: ReportWidgetSortPayload\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/report/widget/${projectId}/sort`,\n payload\n );\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface RoleInfo {\n roleId: string;\n name: string;\n description?: string;\n isSystem?: boolean;\n canManageSheets?: boolean;\n canEditSchema?: boolean;\n canEditData?: boolean;\n [key: string]: unknown;\n}\n\nexport interface RoleMutationPayload {\n name?: string;\n description?: string;\n isSystem?: boolean;\n canManageSheets?: boolean;\n canEditSchema?: boolean;\n canEditData?: boolean;\n [key: string]: unknown;\n}\n\nexport interface RoleUpdatePayload {\n roleId: string;\n data: RoleMutationPayload;\n}\n\nexport interface RoleAssignUserPayload {\n roleId: string;\n userId: number;\n sheetId?: string;\n}\n\nexport class RoleSDK {\n constructor(private readonly client: DimensClient) {}\n\n list(projectId: string): Promise<APIResponse<RoleInfo[]>> {\n return this.client.get<RoleInfo[]>(`/app/mul/project/${projectId}/role/list`);\n }\n\n info(projectId: string, roleId: string): Promise<APIResponse<RoleInfo>> {\n return this.client.get<RoleInfo>(`/app/mul/project/${projectId}/role/info`, { roleId });\n }\n\n create(projectId: string, payload: RoleMutationPayload): Promise<APIResponse<RoleInfo>> {\n return this.client.post<RoleInfo>(`/app/mul/project/${projectId}/role/add`, payload);\n }\n\n update(projectId: string, payload: RoleUpdatePayload): Promise<APIResponse<RoleInfo>> {\n return this.client.post<RoleInfo>(`/app/mul/project/${projectId}/role/update`, payload);\n }\n\n delete(projectId: string, roleIds: string[]): Promise<APIResponse<Array<{ success: boolean; message?: string }>>> {\n return this.client.post<Array<{ success: boolean; message?: string }>>(\n `/app/mul/project/${projectId}/role/delete`,\n { roleIds }\n );\n }\n\n assignUser(projectId: string, payload: RoleAssignUserPayload): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/mul/project/${projectId}/role/assignUser`,\n payload\n );\n }\n\n removeUser(projectId: string, payload: RoleAssignUserPayload): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/mul/project/${projectId}/role/removeUser`,\n payload\n );\n }\n\n userRoles(\n projectId: string,\n userId: number,\n sheetId?: string\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.get<Record<string, unknown>>(\n `/app/mul/project/${projectId}/role/userRoles`,\n { userId, sheetId }\n );\n }\n\n roleUsers(projectId: string, roleId: string): Promise<APIResponse<Record<string, unknown>[]>> {\n return this.client.get<Record<string, unknown>[]>(\n `/app/mul/project/${projectId}/role/roleUsers`,\n { roleId }\n );\n }\n\n projectUsers(projectId: string): Promise<APIResponse<Record<string, unknown>[]>> {\n return this.client.get<Record<string, unknown>[]>(\n `/app/mul/project/${projectId}/role/projectUsers`\n );\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface RowInfo {\n id: string;\n [key: string]: unknown;\n}\n\nexport interface RowPagePayload {\n page?: number;\n size?: number;\n viewId?: string;\n filters?: unknown[];\n sorter?: unknown;\n [key: string]: unknown;\n}\n\nexport interface RowPageResult {\n list: RowInfo[];\n total?: number;\n [key: string]: unknown;\n}\n\nexport interface RowCreatePayload {\n data?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface RowCellPayload {\n rowId: string;\n fieldId: string;\n value: unknown;\n version?: number;\n [key: string]: unknown;\n}\n\nexport class RowSDK {\n constructor(private readonly client: DimensClient) {}\n\n page(\n teamId: string,\n projectId: string,\n sheetId: string,\n payload: RowPagePayload\n ): Promise<APIResponse<RowPageResult>> {\n return this.client.post<RowPageResult>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/row/page`,\n payload\n );\n }\n\n info(\n teamId: string,\n projectId: string,\n sheetId: string,\n rowId: string\n ): Promise<APIResponse<RowInfo>> {\n return this.client.get<RowInfo>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/row/${rowId}/info`\n );\n }\n\n create(sheetId: string, payload: RowCreatePayload): Promise<APIResponse<RowInfo>> {\n return this.client.post<RowInfo>(`/app/mul/sheet/${sheetId}/row/create`, payload);\n }\n\n update(\n sheetId: string,\n rowId: string,\n data: Record<string, unknown>,\n version: number\n ): Promise<APIResponse<RowInfo>> {\n return this.client.post<RowInfo>(`/app/mul/sheet/${sheetId}/row/${rowId}/update`, {\n data,\n version,\n });\n }\n\n delete(sheetId: string, rowId: string): Promise<APIResponse<boolean>> {\n return this.client.post<boolean>(`/app/mul/sheet/${sheetId}/row/${rowId}/delete`);\n }\n\n updateCell(sheetId: string, payload: RowCellPayload): Promise<APIResponse<boolean>> {\n return this.client.post<boolean>(`/app/mul/sheet/${sheetId}/row/cell`, payload);\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface RowAclTarget {\n userId?: number;\n deptId?: number;\n roleId?: string;\n}\n\nexport interface RowAclGrantPayload {\n rowId: string;\n target: RowAclTarget;\n permission: string;\n expiresAt?: string;\n canTransfer?: boolean;\n}\n\nexport class RowAclSDK {\n constructor(private readonly client: DimensClient) {}\n\n grant(sheetId: string, payload: RowAclGrantPayload): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>('/app/mul/rowAcl/grant', {\n sheetId,\n ...payload,\n });\n }\n\n revoke(sheetId: string, rowId: string, target: RowAclTarget): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>('/app/mul/rowAcl/revoke', {\n sheetId,\n rowId,\n target,\n });\n }\n\n revokeDept(sheetId: string, rowId: string, deptId: number): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>('/app/mul/rowAcl/revokeDeptAccess', {\n sheetId,\n rowId,\n deptId,\n });\n }\n\n revokeRole(sheetId: string, rowId: string, roleId: string): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>('/app/mul/rowAcl/revokeRoleAccess', {\n sheetId,\n rowId,\n roleId,\n });\n }\n\n list(sheetId: string, rowId: string): Promise<APIResponse<Record<string, unknown>[]>> {\n return this.client.get<Record<string, unknown>[]>('/app/mul/rowAcl/list', {\n sheetId,\n rowId,\n });\n }\n\n roleAcls(sheetId: string, roleId: string): Promise<APIResponse<Record<string, unknown>[]>> {\n return this.client.get<Record<string, unknown>[]>('/app/mul/rowAcl/roleAcls', {\n sheetId,\n roleId,\n });\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface RowPolicyCondition {\n columnId: string;\n operator: string;\n value: unknown;\n [key: string]: unknown;\n}\n\nexport interface RowPolicyInfo {\n policyId?: string;\n sheetId?: string;\n roleId?: string;\n name?: string;\n effect?: string;\n actions?: string[];\n priority?: number;\n conditions?: RowPolicyCondition[];\n conditionMatchType?: string;\n isActive?: boolean;\n [key: string]: unknown;\n}\n\nexport interface RowPolicyUpdatePayload {\n id: string;\n data: RowPolicyInfo;\n sheetId: string;\n}\n\nexport interface RowPolicyTogglePayload {\n id: string;\n isActive: boolean;\n sheetId: string;\n}\n\nexport class RowPolicySDK {\n constructor(private readonly client: DimensClient) {}\n\n list(projectId: string, sheetId: string): Promise<APIResponse<RowPolicyInfo[]>> {\n return this.client.get<RowPolicyInfo[]>(\n `/app/mul/project/${projectId}/row_policy/list`,\n { sheetId }\n );\n }\n\n info(projectId: string, id: string, sheetId: string): Promise<APIResponse<RowPolicyInfo>> {\n return this.client.get<RowPolicyInfo>(`/app/mul/project/${projectId}/row_policy/info`, {\n id,\n sheetId,\n });\n }\n\n create(projectId: string, payload: RowPolicyInfo): Promise<APIResponse<RowPolicyInfo>> {\n return this.client.post<RowPolicyInfo>(\n `/app/mul/project/${projectId}/row_policy/add`,\n payload\n );\n }\n\n update(projectId: string, payload: RowPolicyUpdatePayload): Promise<APIResponse<RowPolicyInfo>> {\n return this.client.post<RowPolicyInfo>(\n `/app/mul/project/${projectId}/row_policy/update`,\n payload\n );\n }\n\n delete(projectId: string, ids: string[], sheetId: string): Promise<APIResponse<unknown[]>> {\n return this.client.post<unknown[]>(`/app/mul/project/${projectId}/row_policy/delete`, {\n ids,\n sheetId,\n });\n }\n\n toggle(projectId: string, payload: RowPolicyTogglePayload): Promise<APIResponse<RowPolicyInfo>> {\n return this.client.post<RowPolicyInfo>(\n `/app/mul/project/${projectId}/row_policy/toggle`,\n payload\n );\n }\n\n check(\n projectId: string,\n payload: {\n sheetId: string;\n rowData: Record<string, unknown>;\n action: string;\n context: { userId?: number; deptId?: number; deptIds?: number[] };\n }\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this.client.post<Record<string, unknown>>(\n `/app/mul/project/${projectId}/row_policy/check`,\n payload\n );\n }\n}\n","import type { APIResponse } from './client';\nimport { DimensClient } from './client';\n\nexport interface ViewInfo {\n viewId: string;\n name?: string;\n type?: string;\n isPublic?: boolean;\n config?: Record<string, unknown> | null;\n [key: string]: unknown;\n}\n\nexport interface ViewMutationPayload {\n name?: string;\n type?: string;\n isPublic?: boolean;\n config?: Record<string, unknown> | null;\n [key: string]: unknown;\n}\n\nexport class ViewSDK {\n constructor(private readonly client: DimensClient) {}\n\n list(teamId: string, projectId: string, sheetId: string): Promise<APIResponse<ViewInfo[]>> {\n return this.client.get<ViewInfo[]>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/view/list`\n );\n }\n\n create(\n teamId: string,\n projectId: string,\n sheetId: string,\n payload: ViewMutationPayload\n ): Promise<APIResponse<ViewInfo>> {\n return this.client.post<ViewInfo>(\n `/app/mul/${teamId}/${projectId}/sheet/${sheetId}/view/create`,\n payload\n );\n }\n}\n"],"mappings":"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"}