opclawtm 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +136 -0
- package/dist/bin/team-manager.d.ts +6 -0
- package/dist/bin/team-manager.d.ts.map +1 -0
- package/dist/bin/team-manager.js +36 -0
- package/dist/bin/team-manager.js.map +1 -0
- package/dist/bin/team-setup.d.ts +7 -0
- package/dist/bin/team-setup.d.ts.map +1 -0
- package/dist/bin/team-setup.js +66 -0
- package/dist/bin/team-setup.js.map +1 -0
- package/dist/bin/team-uninstall.d.ts +6 -0
- package/dist/bin/team-uninstall.d.ts.map +1 -0
- package/dist/bin/team-uninstall.js +91 -0
- package/dist/bin/team-uninstall.js.map +1 -0
- package/dist/cli/commands/agent.command.d.ts +43 -0
- package/dist/cli/commands/agent.command.d.ts.map +1 -0
- package/dist/cli/commands/agent.command.js +223 -0
- package/dist/cli/commands/agent.command.js.map +1 -0
- package/dist/cli/commands/checklist.command.d.ts +35 -0
- package/dist/cli/commands/checklist.command.d.ts.map +1 -0
- package/dist/cli/commands/checklist.command.js +77 -0
- package/dist/cli/commands/checklist.command.js.map +1 -0
- package/dist/cli/commands/dept.command.d.ts +32 -0
- package/dist/cli/commands/dept.command.d.ts.map +1 -0
- package/dist/cli/commands/dept.command.js +92 -0
- package/dist/cli/commands/dept.command.js.map +1 -0
- package/dist/cli/commands/document.command.d.ts +37 -0
- package/dist/cli/commands/document.command.d.ts.map +1 -0
- package/dist/cli/commands/document.command.js +146 -0
- package/dist/cli/commands/document.command.js.map +1 -0
- package/dist/cli/commands/domain.command.d.ts +36 -0
- package/dist/cli/commands/domain.command.d.ts.map +1 -0
- package/dist/cli/commands/domain.command.js +97 -0
- package/dist/cli/commands/domain.command.js.map +1 -0
- package/dist/cli/commands/feishu.command.d.ts +63 -0
- package/dist/cli/commands/feishu.command.d.ts.map +1 -0
- package/dist/cli/commands/feishu.command.js +433 -0
- package/dist/cli/commands/feishu.command.js.map +1 -0
- package/dist/cli/commands/job.command.d.ts +39 -0
- package/dist/cli/commands/job.command.d.ts.map +1 -0
- package/dist/cli/commands/job.command.js +168 -0
- package/dist/cli/commands/job.command.js.map +1 -0
- package/dist/cli/commands/license.command.d.ts +22 -0
- package/dist/cli/commands/license.command.d.ts.map +1 -0
- package/dist/cli/commands/license.command.js +68 -0
- package/dist/cli/commands/license.command.js.map +1 -0
- package/dist/cli/commands/message-failure.command.d.ts +44 -0
- package/dist/cli/commands/message-failure.command.d.ts.map +1 -0
- package/dist/cli/commands/message-failure.command.js +137 -0
- package/dist/cli/commands/message-failure.command.js.map +1 -0
- package/dist/cli/commands/message.command.d.ts +47 -0
- package/dist/cli/commands/message.command.d.ts.map +1 -0
- package/dist/cli/commands/message.command.js +129 -0
- package/dist/cli/commands/message.command.js.map +1 -0
- package/dist/cli/commands/node.command.d.ts +76 -0
- package/dist/cli/commands/node.command.d.ts.map +1 -0
- package/dist/cli/commands/node.command.js +251 -0
- package/dist/cli/commands/node.command.js.map +1 -0
- package/dist/cli/commands/role-flow.command.d.ts +12 -0
- package/dist/cli/commands/role-flow.command.d.ts.map +1 -0
- package/dist/cli/commands/role-flow.command.js +54 -0
- package/dist/cli/commands/role-flow.command.js.map +1 -0
- package/dist/cli/commands/skill-pack.command.d.ts +41 -0
- package/dist/cli/commands/skill-pack.command.d.ts.map +1 -0
- package/dist/cli/commands/skill-pack.command.js +137 -0
- package/dist/cli/commands/skill-pack.command.js.map +1 -0
- package/dist/cli/commands/status.command.d.ts +8 -0
- package/dist/cli/commands/status.command.d.ts.map +1 -0
- package/dist/cli/commands/status.command.js +61 -0
- package/dist/cli/commands/status.command.js.map +1 -0
- package/dist/cli/commands/task.command.d.ts +105 -0
- package/dist/cli/commands/task.command.d.ts.map +1 -0
- package/dist/cli/commands/task.command.js +402 -0
- package/dist/cli/commands/task.command.js.map +1 -0
- package/dist/cli/commands/user.command.d.ts +43 -0
- package/dist/cli/commands/user.command.d.ts.map +1 -0
- package/dist/cli/commands/user.command.js +134 -0
- package/dist/cli/commands/user.command.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +863 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/tui/index.d.ts +45 -0
- package/dist/cli/tui/index.d.ts.map +1 -0
- package/dist/cli/tui/index.js +470 -0
- package/dist/cli/tui/index.js.map +1 -0
- package/dist/cli/tui/menus/agent-manage.menu.d.ts +8 -0
- package/dist/cli/tui/menus/agent-manage.menu.d.ts.map +1 -0
- package/dist/cli/tui/menus/agent-manage.menu.js +614 -0
- package/dist/cli/tui/menus/agent-manage.menu.js.map +1 -0
- package/dist/cli/tui/menus/dept-manage.menu.d.ts +8 -0
- package/dist/cli/tui/menus/dept-manage.menu.d.ts.map +1 -0
- package/dist/cli/tui/menus/dept-manage.menu.js +299 -0
- package/dist/cli/tui/menus/dept-manage.menu.js.map +1 -0
- package/dist/cli/tui/menus/domain-manage.menu.d.ts +8 -0
- package/dist/cli/tui/menus/domain-manage.menu.d.ts.map +1 -0
- package/dist/cli/tui/menus/domain-manage.menu.js +208 -0
- package/dist/cli/tui/menus/domain-manage.menu.js.map +1 -0
- package/dist/cli/tui/menus/feishu.menu.d.ts +8 -0
- package/dist/cli/tui/menus/feishu.menu.d.ts.map +1 -0
- package/dist/cli/tui/menus/feishu.menu.js +1727 -0
- package/dist/cli/tui/menus/feishu.menu.js.map +1 -0
- package/dist/cli/tui/menus/job-manage.menu.d.ts +16 -0
- package/dist/cli/tui/menus/job-manage.menu.d.ts.map +1 -0
- package/dist/cli/tui/menus/job-manage.menu.js +734 -0
- package/dist/cli/tui/menus/job-manage.menu.js.map +1 -0
- package/dist/cli/tui/menus/license.menu.d.ts +12 -0
- package/dist/cli/tui/menus/license.menu.d.ts.map +1 -0
- package/dist/cli/tui/menus/license.menu.js +164 -0
- package/dist/cli/tui/menus/license.menu.js.map +1 -0
- package/dist/cli/tui/menus/main.menu.d.ts +10 -0
- package/dist/cli/tui/menus/main.menu.d.ts.map +1 -0
- package/dist/cli/tui/menus/main.menu.js +94 -0
- package/dist/cli/tui/menus/main.menu.js.map +1 -0
- package/dist/cli/tui/menus/reset.menu.d.ts +10 -0
- package/dist/cli/tui/menus/reset.menu.d.ts.map +1 -0
- package/dist/cli/tui/menus/reset.menu.js +767 -0
- package/dist/cli/tui/menus/reset.menu.js.map +1 -0
- package/dist/cli/tui/menus/status.menu.d.ts +8 -0
- package/dist/cli/tui/menus/status.menu.d.ts.map +1 -0
- package/dist/cli/tui/menus/status.menu.js +123 -0
- package/dist/cli/tui/menus/status.menu.js.map +1 -0
- package/dist/cli/tui/menus/task-manage.menu.d.ts +11 -0
- package/dist/cli/tui/menus/task-manage.menu.d.ts.map +1 -0
- package/dist/cli/tui/menus/task-manage.menu.js +129 -0
- package/dist/cli/tui/menus/task-manage.menu.js.map +1 -0
- package/dist/cli/tui/menus/team-create.menu.d.ts +8 -0
- package/dist/cli/tui/menus/team-create.menu.d.ts.map +1 -0
- package/dist/cli/tui/menus/team-create.menu.js +353 -0
- package/dist/cli/tui/menus/team-create.menu.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +74 -0
- package/dist/config.js.map +1 -0
- package/dist/core/auth/index.d.ts +6 -0
- package/dist/core/auth/index.d.ts.map +1 -0
- package/dist/core/auth/index.js +22 -0
- package/dist/core/auth/index.js.map +1 -0
- package/dist/core/auth/middleware.d.ts +73 -0
- package/dist/core/auth/middleware.d.ts.map +1 -0
- package/dist/core/auth/middleware.js +456 -0
- package/dist/core/auth/middleware.js.map +1 -0
- package/dist/core/auth/storage.d.ts +38 -0
- package/dist/core/auth/storage.d.ts.map +1 -0
- package/dist/core/auth/storage.js +280 -0
- package/dist/core/auth/storage.js.map +1 -0
- package/dist/core/keys/public.pem +9 -0
- package/dist/core/models/types.d.ts +426 -0
- package/dist/core/models/types.d.ts.map +1 -0
- package/dist/core/models/types.js +9 -0
- package/dist/core/models/types.js.map +1 -0
- package/dist/core/services/agent-template.service.d.ts +49 -0
- package/dist/core/services/agent-template.service.d.ts.map +1 -0
- package/dist/core/services/agent-template.service.js +88 -0
- package/dist/core/services/agent-template.service.js.map +1 -0
- package/dist/core/services/agent.service.d.ts +120 -0
- package/dist/core/services/agent.service.d.ts.map +1 -0
- package/dist/core/services/agent.service.js +381 -0
- package/dist/core/services/agent.service.js.map +1 -0
- package/dist/core/services/auth-profiles.service.d.ts +93 -0
- package/dist/core/services/auth-profiles.service.d.ts.map +1 -0
- package/dist/core/services/auth-profiles.service.js +220 -0
- package/dist/core/services/auth-profiles.service.js.map +1 -0
- package/dist/core/services/checklist.service.d.ts +58 -0
- package/dist/core/services/checklist.service.d.ts.map +1 -0
- package/dist/core/services/checklist.service.js +240 -0
- package/dist/core/services/checklist.service.js.map +1 -0
- package/dist/core/services/config-tracker.service.d.ts +119 -0
- package/dist/core/services/config-tracker.service.d.ts.map +1 -0
- package/dist/core/services/config-tracker.service.js +1093 -0
- package/dist/core/services/config-tracker.service.js.map +1 -0
- package/dist/core/services/crypto.service.d.ts +102 -0
- package/dist/core/services/crypto.service.d.ts.map +1 -0
- package/dist/core/services/crypto.service.js +377 -0
- package/dist/core/services/crypto.service.js.map +1 -0
- package/dist/core/services/dept.service.d.ts +92 -0
- package/dist/core/services/dept.service.d.ts.map +1 -0
- package/dist/core/services/dept.service.js +260 -0
- package/dist/core/services/dept.service.js.map +1 -0
- package/dist/core/services/document.service.d.ts +131 -0
- package/dist/core/services/document.service.d.ts.map +1 -0
- package/dist/core/services/document.service.js +368 -0
- package/dist/core/services/document.service.js.map +1 -0
- package/dist/core/services/domain.service.d.ts +50 -0
- package/dist/core/services/domain.service.d.ts.map +1 -0
- package/dist/core/services/domain.service.js +98 -0
- package/dist/core/services/domain.service.js.map +1 -0
- package/dist/core/services/feishu.service.d.ts +124 -0
- package/dist/core/services/feishu.service.d.ts.map +1 -0
- package/dist/core/services/feishu.service.js +165 -0
- package/dist/core/services/feishu.service.js.map +1 -0
- package/dist/core/services/index.d.ts +27 -0
- package/dist/core/services/index.d.ts.map +1 -0
- package/dist/core/services/index.js +89 -0
- package/dist/core/services/index.js.map +1 -0
- package/dist/core/services/job.service.d.ts +60 -0
- package/dist/core/services/job.service.d.ts.map +1 -0
- package/dist/core/services/job.service.js +190 -0
- package/dist/core/services/job.service.js.map +1 -0
- package/dist/core/services/log.service.d.ts +111 -0
- package/dist/core/services/log.service.d.ts.map +1 -0
- package/dist/core/services/log.service.js +237 -0
- package/dist/core/services/log.service.js.map +1 -0
- package/dist/core/services/message-failure.service.d.ts +65 -0
- package/dist/core/services/message-failure.service.d.ts.map +1 -0
- package/dist/core/services/message-failure.service.js +112 -0
- package/dist/core/services/message-failure.service.js.map +1 -0
- package/dist/core/services/message.service.d.ts +122 -0
- package/dist/core/services/message.service.d.ts.map +1 -0
- package/dist/core/services/message.service.js +374 -0
- package/dist/core/services/message.service.js.map +1 -0
- package/dist/core/services/node.service.d.ts +150 -0
- package/dist/core/services/node.service.d.ts.map +1 -0
- package/dist/core/services/node.service.js +257 -0
- package/dist/core/services/node.service.js.map +1 -0
- package/dist/core/services/openclaw-config.service.d.ts +187 -0
- package/dist/core/services/openclaw-config.service.d.ts.map +1 -0
- package/dist/core/services/openclaw-config.service.js +268 -0
- package/dist/core/services/openclaw-config.service.js.map +1 -0
- package/dist/core/services/preset-loader.service.d.ts +80 -0
- package/dist/core/services/preset-loader.service.d.ts.map +1 -0
- package/dist/core/services/preset-loader.service.js +379 -0
- package/dist/core/services/preset-loader.service.js.map +1 -0
- package/dist/core/services/role-flow.service.d.ts +21 -0
- package/dist/core/services/role-flow.service.d.ts.map +1 -0
- package/dist/core/services/role-flow.service.js +47 -0
- package/dist/core/services/role-flow.service.js.map +1 -0
- package/dist/core/services/setup.service.d.ts +46 -0
- package/dist/core/services/setup.service.d.ts.map +1 -0
- package/dist/core/services/setup.service.js +336 -0
- package/dist/core/services/setup.service.js.map +1 -0
- package/dist/core/services/skill-pack.service.d.ts +56 -0
- package/dist/core/services/skill-pack.service.d.ts.map +1 -0
- package/dist/core/services/skill-pack.service.js +113 -0
- package/dist/core/services/skill-pack.service.js.map +1 -0
- package/dist/core/services/task.service.d.ts +177 -0
- package/dist/core/services/task.service.d.ts.map +1 -0
- package/dist/core/services/task.service.js +397 -0
- package/dist/core/services/task.service.js.map +1 -0
- package/dist/core/services/template.service.d.ts +51 -0
- package/dist/core/services/template.service.d.ts.map +1 -0
- package/dist/core/services/template.service.js +88 -0
- package/dist/core/services/template.service.js.map +1 -0
- package/dist/core/services/user.service.d.ts +50 -0
- package/dist/core/services/user.service.d.ts.map +1 -0
- package/dist/core/services/user.service.js +111 -0
- package/dist/core/services/user.service.js.map +1 -0
- package/dist/core/utils/agent-guide-generator.d.ts +38 -0
- package/dist/core/utils/agent-guide-generator.d.ts.map +1 -0
- package/dist/core/utils/agent-guide-generator.js +187 -0
- package/dist/core/utils/agent-guide-generator.js.map +1 -0
- package/dist/core/utils/credentials-cleanup.d.ts +81 -0
- package/dist/core/utils/credentials-cleanup.d.ts.map +1 -0
- package/dist/core/utils/credentials-cleanup.js +256 -0
- package/dist/core/utils/credentials-cleanup.js.map +1 -0
- package/dist/core/utils/index.d.ts +215 -0
- package/dist/core/utils/index.d.ts.map +1 -0
- package/dist/core/utils/index.js +462 -0
- package/dist/core/utils/index.js.map +1 -0
- package/dist/core/utils/openclaw-helper.d.ts +250 -0
- package/dist/core/utils/openclaw-helper.d.ts.map +1 -0
- package/dist/core/utils/openclaw-helper.js +1629 -0
- package/dist/core/utils/openclaw-helper.js.map +1 -0
- package/dist/core/utils/template-generator.d.ts +67 -0
- package/dist/core/utils/template-generator.d.ts.map +1 -0
- package/dist/core/utils/template-generator.js +170 -0
- package/dist/core/utils/template-generator.js.map +1 -0
- package/dist/db/index.d.ts +54 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +403 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/repositories/agent-template.repo.d.ts +47 -0
- package/dist/db/repositories/agent-template.repo.d.ts.map +1 -0
- package/dist/db/repositories/agent-template.repo.js +108 -0
- package/dist/db/repositories/agent-template.repo.js.map +1 -0
- package/dist/db/repositories/agent.repo.d.ts +64 -0
- package/dist/db/repositories/agent.repo.d.ts.map +1 -0
- package/dist/db/repositories/agent.repo.js +103 -0
- package/dist/db/repositories/agent.repo.js.map +1 -0
- package/dist/db/repositories/base.repository.d.ts +51 -0
- package/dist/db/repositories/base.repository.d.ts.map +1 -0
- package/dist/db/repositories/base.repository.js +107 -0
- package/dist/db/repositories/base.repository.js.map +1 -0
- package/dist/db/repositories/company.repo.d.ts +18 -0
- package/dist/db/repositories/company.repo.d.ts.map +1 -0
- package/dist/db/repositories/company.repo.js +33 -0
- package/dist/db/repositories/company.repo.js.map +1 -0
- package/dist/db/repositories/config-change.repo.d.ts +65 -0
- package/dist/db/repositories/config-change.repo.d.ts.map +1 -0
- package/dist/db/repositories/config-change.repo.js +119 -0
- package/dist/db/repositories/config-change.repo.js.map +1 -0
- package/dist/db/repositories/dept.repo.d.ts +37 -0
- package/dist/db/repositories/dept.repo.d.ts.map +1 -0
- package/dist/db/repositories/dept.repo.js +66 -0
- package/dist/db/repositories/dept.repo.js.map +1 -0
- package/dist/db/repositories/document.repo.d.ts +25 -0
- package/dist/db/repositories/document.repo.d.ts.map +1 -0
- package/dist/db/repositories/document.repo.js +51 -0
- package/dist/db/repositories/document.repo.js.map +1 -0
- package/dist/db/repositories/domain.repo.d.ts +42 -0
- package/dist/db/repositories/domain.repo.d.ts.map +1 -0
- package/dist/db/repositories/domain.repo.js +79 -0
- package/dist/db/repositories/domain.repo.js.map +1 -0
- package/dist/db/repositories/index.d.ts +24 -0
- package/dist/db/repositories/index.d.ts.map +1 -0
- package/dist/db/repositories/index.js +81 -0
- package/dist/db/repositories/index.js.map +1 -0
- package/dist/db/repositories/init-session.repo.d.ts +38 -0
- package/dist/db/repositories/init-session.repo.d.ts.map +1 -0
- package/dist/db/repositories/init-session.repo.js +112 -0
- package/dist/db/repositories/init-session.repo.js.map +1 -0
- package/dist/db/repositories/job.repo.d.ts +54 -0
- package/dist/db/repositories/job.repo.d.ts.map +1 -0
- package/dist/db/repositories/job.repo.js +119 -0
- package/dist/db/repositories/job.repo.js.map +1 -0
- package/dist/db/repositories/message-failure.repo.d.ts +92 -0
- package/dist/db/repositories/message-failure.repo.d.ts.map +1 -0
- package/dist/db/repositories/message-failure.repo.js +141 -0
- package/dist/db/repositories/message-failure.repo.js.map +1 -0
- package/dist/db/repositories/message-log.repo.d.ts +36 -0
- package/dist/db/repositories/message-log.repo.d.ts.map +1 -0
- package/dist/db/repositories/message-log.repo.js +64 -0
- package/dist/db/repositories/message-log.repo.js.map +1 -0
- package/dist/db/repositories/node.repo.d.ts +107 -0
- package/dist/db/repositories/node.repo.d.ts.map +1 -0
- package/dist/db/repositories/node.repo.js +276 -0
- package/dist/db/repositories/node.repo.js.map +1 -0
- package/dist/db/repositories/role-flow.repo.d.ts +43 -0
- package/dist/db/repositories/role-flow.repo.d.ts.map +1 -0
- package/dist/db/repositories/role-flow.repo.js +83 -0
- package/dist/db/repositories/role-flow.repo.js.map +1 -0
- package/dist/db/repositories/skill-pack.repo.d.ts +45 -0
- package/dist/db/repositories/skill-pack.repo.d.ts.map +1 -0
- package/dist/db/repositories/skill-pack.repo.js +149 -0
- package/dist/db/repositories/skill-pack.repo.js.map +1 -0
- package/dist/db/repositories/task.repo.d.ts +168 -0
- package/dist/db/repositories/task.repo.d.ts.map +1 -0
- package/dist/db/repositories/task.repo.js +381 -0
- package/dist/db/repositories/task.repo.js.map +1 -0
- package/dist/db/repositories/template.repo.d.ts +40 -0
- package/dist/db/repositories/template.repo.d.ts.map +1 -0
- package/dist/db/repositories/template.repo.js +66 -0
- package/dist/db/repositories/template.repo.js.map +1 -0
- package/dist/db/repositories/user.repo.d.ts +46 -0
- package/dist/db/repositories/user.repo.d.ts.map +1 -0
- package/dist/db/repositories/user.repo.js +75 -0
- package/dist/db/repositories/user.repo.js.map +1 -0
- package/dist/db/schema.sql +364 -0
- package/package.json +90 -0
- package/resources/preset-data-hash.enc +1 -0
- package/resources/preset-data.enc +1 -0
|
@@ -0,0 +1,767 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* System Reset Menu
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.showResetSystemDialog = showResetSystemDialog;
|
|
43
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
44
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const index_1 = require("../index");
|
|
48
|
+
const utils_1 = require("../../../core/utils");
|
|
49
|
+
const db_1 = require("../../../db");
|
|
50
|
+
const configChangeRepo = __importStar(require("../../../db/repositories/config-change.repo"));
|
|
51
|
+
const credentials_cleanup_1 = require("../../../core/utils/credentials-cleanup");
|
|
52
|
+
/**
|
|
53
|
+
* 获取备份目录(位于当前 OpenClaw 根目录下)
|
|
54
|
+
*/
|
|
55
|
+
function getBackupDir() {
|
|
56
|
+
return path.join((0, utils_1.getOpenClawRoot)(), 'backup');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 显示系统重置菜单
|
|
60
|
+
*
|
|
61
|
+
* @returns 'reset' 表示已重置,需要重新初始化;'back' 表示返回
|
|
62
|
+
*/
|
|
63
|
+
async function showResetSystemDialog() {
|
|
64
|
+
while (true) {
|
|
65
|
+
const choices = [
|
|
66
|
+
new inquirer_1.default.Separator(chalk_1.default.cyan.bold('🔄 系统重置与恢复')),
|
|
67
|
+
new inquirer_1.default.Separator(),
|
|
68
|
+
{ name: '🔄 重置系统(恢复到初始状态)', value: 'reset' },
|
|
69
|
+
{ name: '📂 从备份恢复', value: 'restore' },
|
|
70
|
+
{ name: '📋 查看备份列表', value: 'list' },
|
|
71
|
+
new inquirer_1.default.Separator(),
|
|
72
|
+
{ name: '🔙 返回主菜单', value: 'back' }
|
|
73
|
+
];
|
|
74
|
+
const { action } = await inquirer_1.default.prompt([
|
|
75
|
+
{
|
|
76
|
+
type: 'list',
|
|
77
|
+
name: 'action',
|
|
78
|
+
message: '请选择:',
|
|
79
|
+
choices,
|
|
80
|
+
loop: true,
|
|
81
|
+
pageSize: 15
|
|
82
|
+
}
|
|
83
|
+
]);
|
|
84
|
+
switch (action) {
|
|
85
|
+
case 'reset':
|
|
86
|
+
const resetted = await confirmAndReset();
|
|
87
|
+
if (resetted) {
|
|
88
|
+
return 'reset';
|
|
89
|
+
}
|
|
90
|
+
break;
|
|
91
|
+
case 'restore':
|
|
92
|
+
await selectBackupAndRestore();
|
|
93
|
+
break;
|
|
94
|
+
case 'list':
|
|
95
|
+
await listBackups();
|
|
96
|
+
break;
|
|
97
|
+
case 'back':
|
|
98
|
+
return 'back';
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 确认并重置系统
|
|
104
|
+
*
|
|
105
|
+
* @returns true 表示重置成功,false 表示取消或失败
|
|
106
|
+
*/
|
|
107
|
+
async function confirmAndReset() {
|
|
108
|
+
console.log(chalk_1.default.yellow('\n⚠️ 警告:此操作将删除以下内容:'));
|
|
109
|
+
console.log(chalk_1.default.dim(' • 所有 Agent 数据(包括总助理)'));
|
|
110
|
+
console.log(chalk_1.default.dim(' • 所有事业部数据'));
|
|
111
|
+
console.log(chalk_1.default.dim(' • 所有任务和节点数据'));
|
|
112
|
+
console.log(chalk_1.default.dim(' • Agent 工作空间目录'));
|
|
113
|
+
console.log(chalk_1.default.dim(' • 配置变更记录'));
|
|
114
|
+
console.log(chalk_1.default.dim(' • 飞书配对文件(credentials 目录)'));
|
|
115
|
+
console.log(chalk_1.default.dim('\n ✅ 保留以下内容:'));
|
|
116
|
+
console.log(chalk_1.default.dim(' • OpenClaw 基础配置(模型 API Key 等)'));
|
|
117
|
+
console.log(chalk_1.default.dim(' • 渠道配置(飞书账号配置)\n'));
|
|
118
|
+
const { confirm } = await inquirer_1.default.prompt([
|
|
119
|
+
{
|
|
120
|
+
type: 'confirm',
|
|
121
|
+
name: 'confirm',
|
|
122
|
+
message: '确认要重置系统吗?',
|
|
123
|
+
default: false
|
|
124
|
+
}
|
|
125
|
+
]);
|
|
126
|
+
if (!confirm) {
|
|
127
|
+
console.log(chalk_1.default.dim('\n已取消\n'));
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
// 二次确认
|
|
131
|
+
const { confirmText } = await inquirer_1.default.prompt([
|
|
132
|
+
{
|
|
133
|
+
type: 'input',
|
|
134
|
+
name: 'confirmText',
|
|
135
|
+
message: chalk_1.default.red('请输入 "RESET" 确认重置:')
|
|
136
|
+
}
|
|
137
|
+
]);
|
|
138
|
+
if (confirmText !== 'RESET') {
|
|
139
|
+
console.log(chalk_1.default.dim('\n已取消重置\n'));
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
// 检查数据库是否存在
|
|
143
|
+
const openClawRoot = (0, utils_1.getOpenClawRoot)();
|
|
144
|
+
const teamDir = path.join(openClawRoot, 'team');
|
|
145
|
+
const dbPath = path.join(teamDir, 'team.db');
|
|
146
|
+
if (!fs.existsSync(dbPath)) {
|
|
147
|
+
console.log(chalk_1.default.dim('\n系统未初始化,无需重置\n'));
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
// 执行重置
|
|
151
|
+
console.log(chalk_1.default.dim('\n正在重置系统...'));
|
|
152
|
+
// 1. 最先创建备份(在任何修改操作之前)
|
|
153
|
+
console.log(chalk_1.default.dim(' 创建备份...'));
|
|
154
|
+
let backupPath;
|
|
155
|
+
try {
|
|
156
|
+
backupPath = await createBackup();
|
|
157
|
+
console.log(chalk_1.default.dim(` ✓ 备份已创建: ${backupPath}`));
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
console.log(chalk_1.default.red(` ✗ 备份失败: ${e instanceof Error ? e.message : String(e)}`));
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
// 2. 执行重置操作
|
|
164
|
+
const result = await resetSystem();
|
|
165
|
+
if (result.success) {
|
|
166
|
+
console.log(chalk_1.default.green('\n✓ 系统已重置!'));
|
|
167
|
+
console.log(chalk_1.default.dim(`备份位置: ${backupPath}\n`));
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
console.log(chalk_1.default.red(`\n✗ 重置失败: ${result.message}\n`));
|
|
172
|
+
console.log(chalk_1.default.dim(`备份位置: ${backupPath}\n`));
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* 重置系统
|
|
178
|
+
*
|
|
179
|
+
* 根据变更记录精确撤销:
|
|
180
|
+
* 1. 获取变更记录
|
|
181
|
+
* 2. 根据变更记录撤销配置
|
|
182
|
+
* 3. 清理飞书配置
|
|
183
|
+
* 4. 删除工作空间目录和 Agent 目录
|
|
184
|
+
* 5. 最后清空数据库表
|
|
185
|
+
*
|
|
186
|
+
* 注意:备份已在 confirmAndReset() 中执行
|
|
187
|
+
*/
|
|
188
|
+
async function resetSystem() {
|
|
189
|
+
try {
|
|
190
|
+
const db = (0, db_1.getDatabase)();
|
|
191
|
+
const openClawRoot = (0, utils_1.getOpenClawRoot)();
|
|
192
|
+
// 检查数据库是否存在
|
|
193
|
+
const teamDir = path.join(openClawRoot, 'team');
|
|
194
|
+
const dbPath = path.join(teamDir, 'team.db');
|
|
195
|
+
const hasDatabase = fs.existsSync(dbPath);
|
|
196
|
+
if (!hasDatabase) {
|
|
197
|
+
return { success: false, message: '系统未初始化,无需重置' };
|
|
198
|
+
}
|
|
199
|
+
// 1. 获取所有变更记录(备份已在 confirmAndReset 中执行)
|
|
200
|
+
const allChanges = configChangeRepo.getAllChanges();
|
|
201
|
+
console.log(chalk_1.default.dim(` 变更记录总数: ${allChanges.length}`));
|
|
202
|
+
// 3. 根据变更记录撤销配置(精确撤销)
|
|
203
|
+
if (allChanges.length > 0) {
|
|
204
|
+
const stats = {
|
|
205
|
+
agent_create: allChanges.filter(c => c.change_type === 'agent_create').length,
|
|
206
|
+
agent_delete: allChanges.filter(c => c.change_type === 'agent_delete').length,
|
|
207
|
+
department_create: allChanges.filter(c => c.change_type === 'department_create').length,
|
|
208
|
+
binding_create: allChanges.filter(c => c.change_type === 'binding_create').length,
|
|
209
|
+
directory_create: allChanges.filter(c => c.change_type === 'directory_create').length
|
|
210
|
+
};
|
|
211
|
+
console.log(chalk_1.default.dim(` Agent创建: ${stats.agent_create}, 删除: ${stats.agent_delete}`));
|
|
212
|
+
console.log(chalk_1.default.dim(` 事业部创建: ${stats.department_create}`));
|
|
213
|
+
console.log(chalk_1.default.dim(` 绑定创建: ${stats.binding_create}`));
|
|
214
|
+
console.log(chalk_1.default.dim(` 目录创建: ${stats.directory_create}`));
|
|
215
|
+
// 3.1 删除变更记录中的目录
|
|
216
|
+
console.log(chalk_1.default.dim(' 根据变更记录清理目录...'));
|
|
217
|
+
const dirCreates = allChanges.filter(c => c.change_type === 'directory_create' && c.action === 'add');
|
|
218
|
+
const deletedDirs = [];
|
|
219
|
+
for (const change of dirCreates) {
|
|
220
|
+
if (change.target_path && fs.existsSync(change.target_path)) {
|
|
221
|
+
try {
|
|
222
|
+
fs.rmSync(change.target_path, { recursive: true, force: true });
|
|
223
|
+
deletedDirs.push(change.target_path);
|
|
224
|
+
console.log(chalk_1.default.dim(` ✓ 已删除: ${change.target_path}`));
|
|
225
|
+
}
|
|
226
|
+
catch (e) {
|
|
227
|
+
console.log(chalk_1.default.yellow(` ⚠ 删除失败: ${change.target_path}`));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// 3.2 删除 Agent 创建记录中的 workspace 目录
|
|
232
|
+
console.log(chalk_1.default.dim(' 清理 Agent 工作空间...'));
|
|
233
|
+
const agentCreates = allChanges.filter(c => c.change_type === 'agent_create' && c.related_id);
|
|
234
|
+
for (const change of agentCreates) {
|
|
235
|
+
const agentId = change.related_id;
|
|
236
|
+
if (agentId && agentId !== 'main') {
|
|
237
|
+
// 删除 workspace-{agentId}
|
|
238
|
+
const workspaceDir = path.join(openClawRoot, `workspace-${agentId}`);
|
|
239
|
+
if (fs.existsSync(workspaceDir)) {
|
|
240
|
+
try {
|
|
241
|
+
fs.rmSync(workspaceDir, { recursive: true, force: true });
|
|
242
|
+
deletedDirs.push(workspaceDir);
|
|
243
|
+
console.log(chalk_1.default.dim(` ✓ 已删除: workspace-${agentId}`));
|
|
244
|
+
}
|
|
245
|
+
catch (e) {
|
|
246
|
+
console.log(chalk_1.default.yellow(` ⚠ 删除失败: workspace-${agentId}`));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// 删除 agents/{agentId}
|
|
250
|
+
const agentDir = path.join(openClawRoot, 'agents', agentId);
|
|
251
|
+
if (fs.existsSync(agentDir)) {
|
|
252
|
+
try {
|
|
253
|
+
fs.rmSync(agentDir, { recursive: true, force: true });
|
|
254
|
+
deletedDirs.push(agentDir);
|
|
255
|
+
console.log(chalk_1.default.dim(` ✓ 已删除: agents/${agentId}`));
|
|
256
|
+
}
|
|
257
|
+
catch (e) {
|
|
258
|
+
console.log(chalk_1.default.yellow(` ⚠ 删除失败: agents/${agentId}`));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// 3.3 清理空目录
|
|
264
|
+
if (deletedDirs.length > 0) {
|
|
265
|
+
console.log(chalk_1.default.dim(' 清理空目录...'));
|
|
266
|
+
const cleanedCount = cleanEmptyDirectories(openClawRoot, deletedDirs);
|
|
267
|
+
if (cleanedCount > 0) {
|
|
268
|
+
console.log(chalk_1.default.dim(` ✓ 已清理 ${cleanedCount} 个空目录`));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// 3.4 撤销 openclaw.json 配置变更
|
|
272
|
+
console.log(chalk_1.default.dim(' 撤销配置变更...'));
|
|
273
|
+
// 获取所有未清理的变更并撤销
|
|
274
|
+
const uncleanedChanges = allChanges.filter(c => !c.cleaned);
|
|
275
|
+
for (const change of uncleanedChanges.reverse()) { // 逆序撤销
|
|
276
|
+
try {
|
|
277
|
+
revertConfigChange(change);
|
|
278
|
+
}
|
|
279
|
+
catch (e) {
|
|
280
|
+
console.log(chalk_1.default.yellow(` ⚠ 撤销失败: ${change.change_type} - ${change.target_path}`));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
console.log(chalk_1.default.dim(` ✓ 已撤销 ${uncleanedChanges.length} 条配置变更`));
|
|
284
|
+
}
|
|
285
|
+
// 4. 清理飞书配置
|
|
286
|
+
console.log(chalk_1.default.dim(' 清理飞书配置...'));
|
|
287
|
+
const feishuConfigCleaned = cleanupFeishuGroupConfig();
|
|
288
|
+
if (feishuConfigCleaned) {
|
|
289
|
+
console.log(chalk_1.default.dim(' ✓ 已清理飞书群配置'));
|
|
290
|
+
}
|
|
291
|
+
// 清理飞书配对文件
|
|
292
|
+
const cleanupResult = (0, credentials_cleanup_1.cleanupAllFeishuCredentials)();
|
|
293
|
+
if (cleanupResult.deleted.length > 0) {
|
|
294
|
+
console.log(chalk_1.default.dim(` ✓ 已清理 ${cleanupResult.deleted.length} 个飞书配对文件`));
|
|
295
|
+
}
|
|
296
|
+
// 5. 关闭数据库连接(在清空前关闭)
|
|
297
|
+
(0, db_1.closeDatabase)();
|
|
298
|
+
console.log(chalk_1.default.dim(' ✓ 数据库连接已关闭'));
|
|
299
|
+
// 6. 最后清空数据库(删除数据库文件并重新创建空数据库)
|
|
300
|
+
console.log(chalk_1.default.dim(' 清空数据库...'));
|
|
301
|
+
try {
|
|
302
|
+
// 删除整个数据库文件
|
|
303
|
+
if (fs.existsSync(dbPath)) {
|
|
304
|
+
fs.unlinkSync(dbPath);
|
|
305
|
+
console.log(chalk_1.default.dim(' ✓ 数据库文件已删除'));
|
|
306
|
+
}
|
|
307
|
+
// 删除 team 目录(如果为空)
|
|
308
|
+
const teamDir = path.dirname(dbPath);
|
|
309
|
+
if (fs.existsSync(teamDir)) {
|
|
310
|
+
const remaining = fs.readdirSync(teamDir);
|
|
311
|
+
if (remaining.length === 0) {
|
|
312
|
+
fs.rmdirSync(teamDir);
|
|
313
|
+
console.log(chalk_1.default.dim(' ✓ team 目录已清理'));
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch (e) {
|
|
318
|
+
console.log(chalk_1.default.yellow(` ⚠ 清空数据库失败: ${e instanceof Error ? e.message : String(e)}`));
|
|
319
|
+
}
|
|
320
|
+
console.log(chalk_1.default.green('\n✓ 系统重置完成!'));
|
|
321
|
+
console.log(chalk_1.default.yellow('⚠️ 请手动重启 Gateway 以断开飞书长连接:'));
|
|
322
|
+
console.log(chalk_1.default.cyan(' openclaw gateway restart\n'));
|
|
323
|
+
// 重置完成后退出进程
|
|
324
|
+
process.exit(0);
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
return {
|
|
328
|
+
success: false,
|
|
329
|
+
message: error instanceof Error ? error.message : String(error)
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* 撤销单条配置变更
|
|
335
|
+
*/
|
|
336
|
+
function revertConfigChange(change) {
|
|
337
|
+
const configPath = (0, utils_1.getOpenClawJsonPath)();
|
|
338
|
+
if (!fs.existsSync(configPath))
|
|
339
|
+
return;
|
|
340
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
341
|
+
const config = JSON.parse(content);
|
|
342
|
+
switch (change.change_type) {
|
|
343
|
+
case 'agent_create':
|
|
344
|
+
// 从 agents.list 中移除
|
|
345
|
+
if (config.agents?.list && change.related_id) {
|
|
346
|
+
config.agents.list = config.agents.list.filter((a) => a.id !== change.related_id);
|
|
347
|
+
}
|
|
348
|
+
break;
|
|
349
|
+
case 'agent_delete':
|
|
350
|
+
// 恢复到 agents.list
|
|
351
|
+
if (change.old_value && config.agents?.list) {
|
|
352
|
+
const oldAgent = JSON.parse(change.old_value);
|
|
353
|
+
config.agents.list.push(oldAgent);
|
|
354
|
+
}
|
|
355
|
+
break;
|
|
356
|
+
case 'agent_allow_list_update':
|
|
357
|
+
// 恢复 allowAgents(旧格式,已弃用)
|
|
358
|
+
if (change.old_value && change.related_id && config.agents?.list) {
|
|
359
|
+
const agentConfig = config.agents.list.find((a) => a.id === change.related_id);
|
|
360
|
+
if (agentConfig) {
|
|
361
|
+
if (!agentConfig.subagents) {
|
|
362
|
+
agentConfig.subagents = {};
|
|
363
|
+
}
|
|
364
|
+
agentConfig.subagents.allowAgents = JSON.parse(change.old_value);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
break;
|
|
368
|
+
case 'agent_to_agent_update':
|
|
369
|
+
// 恢复 tools.agentToAgent.allow
|
|
370
|
+
if (change.old_value) {
|
|
371
|
+
if (!config.tools) {
|
|
372
|
+
config.tools = {};
|
|
373
|
+
}
|
|
374
|
+
if (!config.tools.agentToAgent) {
|
|
375
|
+
config.tools.agentToAgent = { enabled: true, allow: [] };
|
|
376
|
+
}
|
|
377
|
+
config.tools.agentToAgent.enabled = true;
|
|
378
|
+
config.tools.agentToAgent.allow = JSON.parse(change.old_value);
|
|
379
|
+
console.log(chalk_1.default.dim(` ✓ 已恢复 agentToAgent.allow`));
|
|
380
|
+
}
|
|
381
|
+
break;
|
|
382
|
+
case 'binding_create':
|
|
383
|
+
// 从 bindings 中移除
|
|
384
|
+
if (config.bindings) {
|
|
385
|
+
config.bindings = config.bindings.filter((b, i) => change.target_path !== `bindings[${i}]`);
|
|
386
|
+
}
|
|
387
|
+
break;
|
|
388
|
+
case 'binding_delete':
|
|
389
|
+
// 恢复到 bindings
|
|
390
|
+
if (change.old_value) {
|
|
391
|
+
if (!config.bindings)
|
|
392
|
+
config.bindings = [];
|
|
393
|
+
config.bindings.push(JSON.parse(change.old_value));
|
|
394
|
+
}
|
|
395
|
+
break;
|
|
396
|
+
case 'department_create':
|
|
397
|
+
case 'department_delete':
|
|
398
|
+
// 部门在数据库中处理,配置文件无影响
|
|
399
|
+
break;
|
|
400
|
+
case 'feishu_group_bind':
|
|
401
|
+
// 清理飞书群绑定
|
|
402
|
+
if (config.channels?.feishu?.groups && change.related_id) {
|
|
403
|
+
delete config.channels.feishu.groups[change.related_id];
|
|
404
|
+
}
|
|
405
|
+
break;
|
|
406
|
+
default:
|
|
407
|
+
// 其他变更:尝试恢复 old_value
|
|
408
|
+
if (change.old_value && change.target_path) {
|
|
409
|
+
applyValueToPath(config, change.target_path, JSON.parse(change.old_value));
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// 写回配置文件
|
|
413
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
414
|
+
// 标记为已清理
|
|
415
|
+
configChangeRepo.markAsCleaned(change.id);
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* 根据路径设置配置值
|
|
419
|
+
*/
|
|
420
|
+
function applyValueToPath(obj, path, value) {
|
|
421
|
+
const parts = path.replace(/\[(\d+)\]/g, '.$1').split('.');
|
|
422
|
+
let current = obj;
|
|
423
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
424
|
+
const part = parts[i];
|
|
425
|
+
if (!current[part]) {
|
|
426
|
+
current[part] = {};
|
|
427
|
+
}
|
|
428
|
+
current = current[part];
|
|
429
|
+
}
|
|
430
|
+
current[parts[parts.length - 1]] = value;
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* 创建备份
|
|
434
|
+
*/
|
|
435
|
+
async function createBackup() {
|
|
436
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
437
|
+
const backupBase = getBackupDir();
|
|
438
|
+
const backupDir = path.join(backupBase, `team-manager-reset-${timestamp}`);
|
|
439
|
+
// 确保备份目录存在
|
|
440
|
+
if (!fs.existsSync(backupBase)) {
|
|
441
|
+
fs.mkdirSync(backupBase, { recursive: true });
|
|
442
|
+
}
|
|
443
|
+
fs.mkdirSync(backupDir, { recursive: true });
|
|
444
|
+
// 备份数据库(清理加密内容)
|
|
445
|
+
const dbPath = (0, utils_1.getDatabasePath)();
|
|
446
|
+
if (fs.existsSync(dbPath)) {
|
|
447
|
+
const cleanedDbPath = path.join(backupDir, 'team.db');
|
|
448
|
+
await createCleanedDatabaseBackup(dbPath, cleanedDbPath);
|
|
449
|
+
}
|
|
450
|
+
// 备份配置
|
|
451
|
+
const configPath = (0, utils_1.getOpenClawJsonPath)();
|
|
452
|
+
if (fs.existsSync(configPath)) {
|
|
453
|
+
fs.copyFileSync(configPath, path.join(backupDir, 'openclaw.json'));
|
|
454
|
+
}
|
|
455
|
+
// 写入备份信息
|
|
456
|
+
const backupInfo = {
|
|
457
|
+
timestamp: new Date().toISOString(),
|
|
458
|
+
type: 'reset',
|
|
459
|
+
description: '系统重置前自动备份(已清理加密预设数据)'
|
|
460
|
+
};
|
|
461
|
+
fs.writeFileSync(path.join(backupDir, 'backup-info.json'), JSON.stringify(backupInfo, null, 2));
|
|
462
|
+
return backupDir;
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* 创建清理后的数据库备份
|
|
466
|
+
*
|
|
467
|
+
* 清理内容:
|
|
468
|
+
* 1. 删除所有预设数据(is_preset=1)
|
|
469
|
+
* 2. 预设数据包含加密内容,备份无意义
|
|
470
|
+
*/
|
|
471
|
+
async function createCleanedDatabaseBackup(sourcePath, targetPath) {
|
|
472
|
+
const Database = require('better-sqlite3');
|
|
473
|
+
// 打开源数据库
|
|
474
|
+
const sourceDb = new Database(sourcePath, { readonly: true });
|
|
475
|
+
// 创建目标数据库
|
|
476
|
+
const targetDb = new Database(targetPath);
|
|
477
|
+
try {
|
|
478
|
+
// 禁用外键约束(避免复制顺序问题)
|
|
479
|
+
targetDb.exec('PRAGMA foreign_keys = OFF');
|
|
480
|
+
// 获取源数据库的所有表结构
|
|
481
|
+
const tables = sourceDb.prepare("SELECT name, sql FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'").all();
|
|
482
|
+
// 在目标数据库创建表结构
|
|
483
|
+
for (const table of tables) {
|
|
484
|
+
targetDb.exec(table.sql);
|
|
485
|
+
}
|
|
486
|
+
// 复制数据(排除预设数据)
|
|
487
|
+
for (const table of tables) {
|
|
488
|
+
const tableName = table.name;
|
|
489
|
+
// 检查表是否有 is_preset 字段
|
|
490
|
+
const columns = sourceDb.pragma(`table_info(${tableName})`);
|
|
491
|
+
const hasIsPreset = columns.some((col) => col.name === 'is_preset');
|
|
492
|
+
if (hasIsPreset) {
|
|
493
|
+
// 只复制非预设数据
|
|
494
|
+
const rows = sourceDb.prepare(`SELECT * FROM ${tableName} WHERE is_preset = 0`).all();
|
|
495
|
+
if (rows.length > 0) {
|
|
496
|
+
const columnNames = columns.map((c) => c.name);
|
|
497
|
+
const placeholders = columnNames.map(() => '?').join(', ');
|
|
498
|
+
const insertStmt = targetDb.prepare(`INSERT INTO ${tableName} (${columnNames.join(', ')}) VALUES (${placeholders})`);
|
|
499
|
+
for (const row of rows) {
|
|
500
|
+
insertStmt.run(...columnNames.map((c) => row[c]));
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
// 没有 is_preset 字段,复制所有数据
|
|
506
|
+
const rows = sourceDb.prepare(`SELECT * FROM ${tableName}`).all();
|
|
507
|
+
if (rows.length > 0) {
|
|
508
|
+
const columnNames = columns.map((c) => c.name);
|
|
509
|
+
const placeholders = columnNames.map(() => '?').join(', ');
|
|
510
|
+
const insertStmt = targetDb.prepare(`INSERT INTO ${tableName} (${columnNames.join(', ')}) VALUES (${placeholders})`);
|
|
511
|
+
for (const row of rows) {
|
|
512
|
+
insertStmt.run(...columnNames.map((c) => row[c]));
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
// 重新启用外键约束
|
|
518
|
+
targetDb.exec('PRAGMA foreign_keys = ON');
|
|
519
|
+
console.log(chalk_1.default.dim(' ✓ 已清理备份中的加密预设数据'));
|
|
520
|
+
}
|
|
521
|
+
finally {
|
|
522
|
+
sourceDb.close();
|
|
523
|
+
targetDb.close();
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* 从备份恢复
|
|
528
|
+
*/
|
|
529
|
+
async function selectBackupAndRestore() {
|
|
530
|
+
const backups = listBackupDirs();
|
|
531
|
+
if (backups.length === 0) {
|
|
532
|
+
console.log(chalk_1.default.yellow('\n暂无可用备份\n'));
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
const choices = [
|
|
536
|
+
...backups.map(b => ({
|
|
537
|
+
name: `${b.name} (${b.time})`,
|
|
538
|
+
value: b.path
|
|
539
|
+
})),
|
|
540
|
+
new inquirer_1.default.Separator(),
|
|
541
|
+
{ name: '🔙 取消', value: 'cancel' }
|
|
542
|
+
];
|
|
543
|
+
const { backupPath } = await inquirer_1.default.prompt([
|
|
544
|
+
{
|
|
545
|
+
type: 'list',
|
|
546
|
+
name: 'backupPath',
|
|
547
|
+
message: '选择要恢复的备份:',
|
|
548
|
+
choices,
|
|
549
|
+
loop: true
|
|
550
|
+
}
|
|
551
|
+
]);
|
|
552
|
+
if (backupPath === 'cancel') {
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
// 确认恢复
|
|
556
|
+
const { confirm } = await inquirer_1.default.prompt([
|
|
557
|
+
{
|
|
558
|
+
type: 'confirm',
|
|
559
|
+
name: 'confirm',
|
|
560
|
+
message: chalk_1.default.yellow('确认要从此备份恢复吗?当前数据将被覆盖。'),
|
|
561
|
+
default: false
|
|
562
|
+
}
|
|
563
|
+
]);
|
|
564
|
+
if (!confirm) {
|
|
565
|
+
console.log(chalk_1.default.dim('\n已取消\n'));
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
// 执行恢复
|
|
569
|
+
console.log(chalk_1.default.dim('\n正在恢复...'));
|
|
570
|
+
const result = await restoreFromBackup(backupPath);
|
|
571
|
+
if (result.success) {
|
|
572
|
+
console.log(chalk_1.default.green('\n✓ 恢复成功!\n'));
|
|
573
|
+
}
|
|
574
|
+
else {
|
|
575
|
+
console.log(chalk_1.default.red(`\n✗ 恢复失败: ${result.message}\n`));
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* 从备份恢复
|
|
580
|
+
*/
|
|
581
|
+
async function restoreFromBackup(backupPath) {
|
|
582
|
+
try {
|
|
583
|
+
// 恢复数据库
|
|
584
|
+
const backupDb = path.join(backupPath, 'team.db');
|
|
585
|
+
if (fs.existsSync(backupDb)) {
|
|
586
|
+
const dbPath = (0, utils_1.getDatabasePath)();
|
|
587
|
+
// 确保目录存在
|
|
588
|
+
const dbDir = path.dirname(dbPath);
|
|
589
|
+
if (!fs.existsSync(dbDir)) {
|
|
590
|
+
fs.mkdirSync(dbDir, { recursive: true });
|
|
591
|
+
}
|
|
592
|
+
fs.copyFileSync(backupDb, dbPath);
|
|
593
|
+
console.log(chalk_1.default.dim(' ✓ 数据库已恢复'));
|
|
594
|
+
}
|
|
595
|
+
// 恢复配置
|
|
596
|
+
const backupConfig = path.join(backupPath, 'openclaw.json');
|
|
597
|
+
if (fs.existsSync(backupConfig)) {
|
|
598
|
+
const configPath = (0, utils_1.getOpenClawJsonPath)();
|
|
599
|
+
fs.copyFileSync(backupConfig, configPath);
|
|
600
|
+
console.log(chalk_1.default.dim(' ✓ 配置已恢复'));
|
|
601
|
+
}
|
|
602
|
+
return { success: true, message: '恢复成功' };
|
|
603
|
+
}
|
|
604
|
+
catch (error) {
|
|
605
|
+
return {
|
|
606
|
+
success: false,
|
|
607
|
+
message: error instanceof Error ? error.message : String(error)
|
|
608
|
+
};
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* 列出备份目录
|
|
613
|
+
*/
|
|
614
|
+
function listBackupDirs() {
|
|
615
|
+
const backupBase = getBackupDir();
|
|
616
|
+
if (!fs.existsSync(backupBase)) {
|
|
617
|
+
return [];
|
|
618
|
+
}
|
|
619
|
+
const entries = fs.readdirSync(backupBase, { withFileTypes: true });
|
|
620
|
+
const backups = [];
|
|
621
|
+
for (const entry of entries) {
|
|
622
|
+
if (entry.isDirectory() && entry.name.startsWith('team-manager-')) {
|
|
623
|
+
const backupPath = path.join(backupBase, entry.name);
|
|
624
|
+
const infoPath = path.join(backupPath, 'backup-info.json');
|
|
625
|
+
let time = '';
|
|
626
|
+
if (fs.existsSync(infoPath)) {
|
|
627
|
+
try {
|
|
628
|
+
const info = JSON.parse(fs.readFileSync(infoPath, 'utf-8'));
|
|
629
|
+
time = new Date(info.timestamp).toLocaleString('zh-CN');
|
|
630
|
+
}
|
|
631
|
+
catch {
|
|
632
|
+
time = entry.name.replace('team-manager-reset-', '');
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
else {
|
|
636
|
+
time = entry.name.replace('team-manager-reset-', '');
|
|
637
|
+
}
|
|
638
|
+
backups.push({
|
|
639
|
+
name: entry.name,
|
|
640
|
+
path: backupPath,
|
|
641
|
+
time
|
|
642
|
+
});
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
// 按时间倒序排列
|
|
646
|
+
return backups.sort((a, b) => b.name.localeCompare(a.name));
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* 列出所有备份
|
|
650
|
+
*/
|
|
651
|
+
async function listBackups() {
|
|
652
|
+
const backups = listBackupDirs();
|
|
653
|
+
if (backups.length === 0) {
|
|
654
|
+
console.log(chalk_1.default.yellow('\n暂无备份\n'));
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
657
|
+
console.log(chalk_1.default.bold('\n📋 备份列表\n'));
|
|
658
|
+
console.log(chalk_1.default.dim('名称'.padEnd(45)) + chalk_1.default.dim('时间'));
|
|
659
|
+
index_1.tuiUtils.printDivider();
|
|
660
|
+
for (const backup of backups) {
|
|
661
|
+
console.log(backup.name.padEnd(45) + backup.time);
|
|
662
|
+
}
|
|
663
|
+
console.log('');
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* 清理 openclaw.json 中的飞书群相关配置
|
|
667
|
+
*
|
|
668
|
+
* 清理内容:
|
|
669
|
+
* - channels.feishu.accounts - 清空所有 agent 的飞书账户
|
|
670
|
+
* - channels.feishu.groupAllowFrom - 清空群组白名单
|
|
671
|
+
* - channels.feishu.groups - 清空群组配置
|
|
672
|
+
* - bindings - 移除所有飞书相关的绑定
|
|
673
|
+
*
|
|
674
|
+
* @returns 是否有配置被清理
|
|
675
|
+
*/
|
|
676
|
+
function cleanupFeishuGroupConfig() {
|
|
677
|
+
const configPath = (0, utils_1.getOpenClawJsonPath)();
|
|
678
|
+
if (!fs.existsSync(configPath))
|
|
679
|
+
return false;
|
|
680
|
+
try {
|
|
681
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
682
|
+
const config = JSON.parse(content);
|
|
683
|
+
let configChanged = false;
|
|
684
|
+
// 清理 channels.feishu.accounts
|
|
685
|
+
const channels = config.channels;
|
|
686
|
+
if (channels?.feishu) {
|
|
687
|
+
const feishuConfig = channels.feishu;
|
|
688
|
+
// 清空 accounts
|
|
689
|
+
if (feishuConfig.accounts && Object.keys(feishuConfig.accounts).length > 0) {
|
|
690
|
+
feishuConfig.accounts = {};
|
|
691
|
+
configChanged = true;
|
|
692
|
+
console.log(chalk_1.default.dim(' - 已清空飞书账户配置'));
|
|
693
|
+
}
|
|
694
|
+
// 清空 groupAllowFrom
|
|
695
|
+
if (feishuConfig.groupAllowFrom && Array.isArray(feishuConfig.groupAllowFrom) && feishuConfig.groupAllowFrom.length > 0) {
|
|
696
|
+
feishuConfig.groupAllowFrom = [];
|
|
697
|
+
configChanged = true;
|
|
698
|
+
console.log(chalk_1.default.dim(' - 已清空群组白名单'));
|
|
699
|
+
}
|
|
700
|
+
// 清空 groups
|
|
701
|
+
if (feishuConfig.groups && Object.keys(feishuConfig.groups).length > 0) {
|
|
702
|
+
feishuConfig.groups = {};
|
|
703
|
+
configChanged = true;
|
|
704
|
+
console.log(chalk_1.default.dim(' - 已清空群组配置'));
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
// 清理飞书相关的 bindings
|
|
708
|
+
if (config.bindings && Array.isArray(config.bindings) && config.bindings.length > 0) {
|
|
709
|
+
const originalLength = config.bindings.length;
|
|
710
|
+
config.bindings = config.bindings.filter((b) => b.match?.channel !== 'feishu');
|
|
711
|
+
if (config.bindings.length < originalLength) {
|
|
712
|
+
configChanged = true;
|
|
713
|
+
console.log(chalk_1.default.dim(` - 已移除 ${originalLength - config.bindings.length} 个飞书绑定`));
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
if (configChanged) {
|
|
717
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
718
|
+
}
|
|
719
|
+
return configChanged;
|
|
720
|
+
}
|
|
721
|
+
catch (e) {
|
|
722
|
+
console.warn('清理飞书群配置失败:', e);
|
|
723
|
+
return false;
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
/**
|
|
727
|
+
* 清理空目录
|
|
728
|
+
*
|
|
729
|
+
* @param rootDir 根目录
|
|
730
|
+
* @param deletedDirs 已删除的目录列表(用于检查父目录)
|
|
731
|
+
* @returns 清理的空目录数量
|
|
732
|
+
*/
|
|
733
|
+
function cleanEmptyDirectories(rootDir, deletedDirs) {
|
|
734
|
+
let count = 0;
|
|
735
|
+
const checkedDirs = new Set();
|
|
736
|
+
// 收集所有需要检查的父目录
|
|
737
|
+
const dirsToCheck = new Set();
|
|
738
|
+
for (const dir of deletedDirs) {
|
|
739
|
+
let current = path.dirname(dir);
|
|
740
|
+
while (current !== rootDir && current.length > rootDir.length) {
|
|
741
|
+
dirsToCheck.add(current);
|
|
742
|
+
current = path.dirname(current);
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
// 按深度从深到浅排序(先删除深层目录)
|
|
746
|
+
const sortedDirs = Array.from(dirsToCheck).sort((a, b) => b.length - a.length);
|
|
747
|
+
for (const dir of sortedDirs) {
|
|
748
|
+
if (checkedDirs.has(dir))
|
|
749
|
+
continue;
|
|
750
|
+
checkedDirs.add(dir);
|
|
751
|
+
if (!fs.existsSync(dir))
|
|
752
|
+
continue;
|
|
753
|
+
try {
|
|
754
|
+
const entries = fs.readdirSync(dir);
|
|
755
|
+
if (entries.length === 0) {
|
|
756
|
+
fs.rmdirSync(dir);
|
|
757
|
+
count++;
|
|
758
|
+
console.log(chalk_1.default.dim(` ✓ 已清理空目录: ${path.relative(rootDir, dir)}`));
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
catch (e) {
|
|
762
|
+
// 忽略错误(可能被其他进程占用)
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
return count;
|
|
766
|
+
}
|
|
767
|
+
//# sourceMappingURL=reset.menu.js.map
|