@jingyi0605/codingns 0.8.1 → 0.8.5
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/bin/codingns.mjs +180 -0
- package/dist/public/assets/{AdaptiveButlerPage-b7s6F_sd.js → AdaptiveButlerPage-CJw8Ae62.js} +3 -3
- package/dist/public/assets/App-BOHBGFOd.js +30 -0
- package/dist/public/assets/{BootstrapPage-jFfl7KNK.js → BootstrapPage-BxHQT4nA.js} +1 -1
- package/dist/public/assets/{ConversationPage-sj_rn4q0.js → ConversationPage-DWFsF6BB.js} +6 -6
- package/dist/public/assets/{DesktopDetachPreviewPage-C5c88SOX.js → DesktopDetachPreviewPage-DOgEjYEf.js} +1 -1
- package/dist/public/assets/DesktopModal-D_A8sgQU.js +1 -0
- package/dist/public/assets/DesktopWindowPage-DK7L7osV.js +2 -0
- package/dist/public/assets/FileContextPanel-BdCoubcJ.js +1 -0
- package/dist/public/assets/GitSidebar-BeZ0hj7A.js +6 -0
- package/dist/public/assets/MobileCreateSessionSheet-DfLMVu8q.js +1 -0
- package/dist/public/assets/MobileSheet-5kZ-w-gU.js +1 -0
- package/dist/public/assets/{MobileTopHeaderFrame-_I0t7cC_.js → MobileTopHeaderFrame-lcp2GscV.js} +1 -1
- package/dist/public/assets/MobileWorkspaceSwitcherHeader-C6JMiOq_.js +1 -0
- package/dist/public/assets/PluginAccessOverview-DGcKAMQl.js +1 -0
- package/dist/public/assets/PluginContainerPage-BlY-xJDh.js +1 -0
- package/dist/public/assets/PluginDetailPage-CAJ7LFpD.js +1 -0
- package/dist/public/assets/PluginsListPage-BxZG1NyT.js +1 -0
- package/dist/public/assets/{RelayConnectEntryPage-CMtDWyGS.js → RelayConnectEntryPage-CfNO_TIl.js} +1 -1
- package/dist/public/assets/ServerSettingsModal-by36Z_5k.js +1 -0
- package/dist/public/assets/SessionIndexPage-DkBp9Mqz.js +1 -0
- package/dist/public/assets/SettingsPage-C-ASmJAG.js +2 -0
- package/dist/public/assets/TerminalManagerPanel-NVZRxxmH.js +1 -0
- package/dist/public/assets/{TerminalPage-CBIKHI33.js → TerminalPage-C4LNoPBp.js} +3 -3
- package/dist/public/assets/TerminalRuntimeFallbackModal-Bzum5nZ0.js +1 -0
- package/dist/public/assets/ToolFilesPage-47zbdgTW.js +1 -0
- package/dist/public/assets/ToolGitPage-Fuk_b_jg.js +1 -0
- package/dist/public/assets/ToolProcessesPage-sWSMWD-9.js +1 -0
- package/dist/public/assets/ToolsHomePage-R1mZlbZi.js +1 -0
- package/dist/public/assets/WorkbenchLandingPage-CqmiFH2u.js +1 -0
- package/dist/public/assets/WorkbenchLayout-OFi6CWgH.js +244 -0
- package/dist/public/assets/WorkbenchModal-C7qoQElW.js +1 -0
- package/dist/public/assets/WorkbenchShellRoute-BAQe_E0O.js +1 -0
- package/dist/public/assets/WorkspaceDebugDetailPage-DhKa6e9y.js +1 -0
- package/dist/public/assets/WorkspaceDetailPage-BPsrFffw.js +1 -0
- package/dist/public/assets/WorkspaceHomePage-KAtqZOAb.js +1 -0
- package/dist/public/assets/{client-runtime-manager-CdJP7nUp.js → client-runtime-manager-wmCJZKYd.js} +1 -1
- package/dist/public/assets/file-tree-icon-Mg1DiBRX.js +590 -0
- package/dist/public/assets/{index-VVxfF0s5.css → index-C4t-vvqk.css} +1 -1
- package/dist/public/assets/index-CL97fwWB.js +42 -0
- package/dist/public/assets/{login-direct-candidate-resolver-C-mo698r.js → login-direct-candidate-resolver-BOAgTuUf.js} +1 -1
- package/dist/public/assets/plugin-permission-copy-Cq99cnzV.js +1 -0
- package/dist/public/assets/plugins-api-BQTV5DOp.js +1 -0
- package/dist/public/assets/{preferences-service-CnaTvZq2.js → preferences-service-DJxbEEeg.js} +1 -1
- package/dist/public/assets/realtime-client-CLafKzzJ.js +1 -0
- package/dist/public/assets/{relay-entry-D7OgZZN-.js → relay-entry-D-LfvdiX.js} +1 -1
- package/dist/public/assets/{terminal-runtime-meta-BCtAYB0E.js → terminal-runtime-meta-BJmy8dyK.js} +1 -1
- package/dist/public/assets/useRegisteredDebugTemplates-DQAWVdCo.js +1 -0
- package/dist/public/assets/workbench-navigation-MEzCSmsK.js +1 -0
- package/dist/public/index.html +2 -2
- package/dist/server/config/env.d.ts +1 -0
- package/dist/server/config/env.js +4 -0
- package/dist/server/config/env.js.map +1 -1
- package/dist/server/helpers/wechat-claw-runtime/modules/runtime-state-store.js +1 -1
- package/dist/server/helpers/wechat-claw-runtime/modules/runtime-state-store.js.map +1 -1
- package/dist/server/modules/channels/wechat-claw-client.d.ts +51 -0
- package/dist/server/modules/channels/wechat-claw-client.js +245 -0
- package/dist/server/modules/channels/wechat-claw-client.js.map +1 -0
- package/dist/server/modules/file/file-access-guard.d.ts +2 -0
- package/dist/server/modules/file/file-access-guard.js +24 -2
- package/dist/server/modules/file/file-access-guard.js.map +1 -1
- package/dist/server/modules/file/file-controller.d.ts +153 -1
- package/dist/server/modules/file/file-controller.js +215 -1
- package/dist/server/modules/file/file-controller.js.map +1 -1
- package/dist/server/modules/file/file-preview-link-service.d.ts +2 -0
- package/dist/server/modules/file/file-preview-link-service.js +5 -1
- package/dist/server/modules/file/file-preview-link-service.js.map +1 -1
- package/dist/server/modules/file/runtime/codingns-workspace-bridge.js +911 -0
- package/dist/server/modules/file/workspace-file-bridge-service.d.ts +126 -0
- package/dist/server/modules/file/workspace-file-bridge-service.js +471 -0
- package/dist/server/modules/file/workspace-file-bridge-service.js.map +1 -0
- package/dist/server/modules/file/workspace-file-bridge-watch-service.d.ts +42 -0
- package/dist/server/modules/file/workspace-file-bridge-watch-service.js +304 -0
- package/dist/server/modules/file/workspace-file-bridge-watch-service.js.map +1 -0
- package/dist/server/modules/model-switch/cc-switch-adapter.js +1 -1
- package/dist/server/modules/model-switch/cc-switch-adapter.js.map +1 -1
- package/dist/server/modules/plugins/plugin-controller.d.ts +131 -0
- package/dist/server/modules/plugins/plugin-controller.js +277 -0
- package/dist/server/modules/plugins/plugin-controller.js.map +1 -0
- package/dist/server/modules/plugins/plugin-file-gateway-service.d.ts +38 -0
- package/dist/server/modules/plugins/plugin-file-gateway-service.js +178 -0
- package/dist/server/modules/plugins/plugin-file-gateway-service.js.map +1 -0
- package/dist/server/modules/plugins/plugin-manifest.d.ts +8 -0
- package/dist/server/modules/plugins/plugin-manifest.js +420 -0
- package/dist/server/modules/plugins/plugin-manifest.js.map +1 -0
- package/dist/server/modules/plugins/plugin-permission-service.d.ts +49 -0
- package/dist/server/modules/plugins/plugin-permission-service.js +267 -0
- package/dist/server/modules/plugins/plugin-permission-service.js.map +1 -0
- package/dist/server/modules/plugins/plugin-process-runner.d.ts +21 -0
- package/dist/server/modules/plugins/plugin-process-runner.js +127 -0
- package/dist/server/modules/plugins/plugin-process-runner.js.map +1 -0
- package/dist/server/modules/plugins/plugin-registry-service.d.ts +41 -0
- package/dist/server/modules/plugins/plugin-registry-service.js +238 -0
- package/dist/server/modules/plugins/plugin-registry-service.js.map +1 -0
- package/dist/server/modules/plugins/plugin-runtime-service.d.ts +55 -0
- package/dist/server/modules/plugins/plugin-runtime-service.js +252 -0
- package/dist/server/modules/plugins/plugin-runtime-service.js.map +1 -0
- package/dist/server/modules/plugins/plugin-runtime-session-service.d.ts +21 -0
- package/dist/server/modules/plugins/plugin-runtime-session-service.js +83 -0
- package/dist/server/modules/plugins/plugin-runtime-session-service.js.map +1 -0
- package/dist/server/modules/plugins/plugin-scheduler-service.d.ts +31 -0
- package/dist/server/modules/plugins/plugin-scheduler-service.js +232 -0
- package/dist/server/modules/plugins/plugin-scheduler-service.js.map +1 -0
- package/dist/server/modules/plugins/plugin-static-service.d.ts +11 -0
- package/dist/server/modules/plugins/plugin-static-service.js +145 -0
- package/dist/server/modules/plugins/plugin-static-service.js.map +1 -0
- package/dist/server/modules/presentation/presentation-controller.d.ts +3 -0
- package/dist/server/modules/presentation/presentation-controller.js +11 -0
- package/dist/server/modules/presentation/presentation-controller.js.map +1 -1
- package/dist/server/modules/presentation/presentation-export-task-service.d.ts +6 -0
- package/dist/server/modules/presentation/presentation-export-task-service.js +52 -8
- package/dist/server/modules/presentation/presentation-export-task-service.js.map +1 -1
- package/dist/server/modules/presentation/presentation-pptx-export-service.js +200 -14
- package/dist/server/modules/presentation/presentation-pptx-export-service.js.map +1 -1
- package/dist/server/modules/presentation/presentation-renderer.d.ts +50 -0
- package/dist/server/modules/presentation/presentation-renderer.js +450 -37
- package/dist/server/modules/presentation/presentation-renderer.js.map +1 -1
- package/dist/server/modules/tasks/task-types.d.ts +2 -0
- package/dist/server/modules/tasks/task-types.js +2 -0
- package/dist/server/modules/tasks/task-types.js.map +1 -1
- package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js +1 -1
- package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js.map +1 -1
- package/dist/server/routes/files.js +40 -0
- package/dist/server/routes/files.js.map +1 -1
- package/dist/server/routes/plugins-public.d.ts +3 -0
- package/dist/server/routes/plugins-public.js +5 -0
- package/dist/server/routes/plugins-public.js.map +1 -0
- package/dist/server/routes/plugins.d.ts +3 -0
- package/dist/server/routes/plugins.js +19 -0
- package/dist/server/routes/plugins.js.map +1 -0
- package/dist/server/routes/presentation.js +1 -0
- package/dist/server/routes/presentation.js.map +1 -1
- package/dist/server/server/create-server.d.ts +20 -0
- package/dist/server/server/create-server.js +47 -1
- package/dist/server/server/create-server.js.map +1 -1
- package/dist/server/shared/http/error-handler.js +10 -6
- package/dist/server/shared/http/error-handler.js.map +1 -1
- package/dist/server/shared/runtime/better-sqlite3.d.ts +5 -0
- package/dist/server/shared/runtime/better-sqlite3.js +6 -0
- package/dist/server/shared/runtime/better-sqlite3.js.map +1 -0
- package/dist/server/storage/repositories/plugin-audit-event-repository.d.ts +8 -0
- package/dist/server/storage/repositories/plugin-audit-event-repository.js +49 -0
- package/dist/server/storage/repositories/plugin-audit-event-repository.js.map +1 -0
- package/dist/server/storage/repositories/plugin-definition-repository.d.ts +10 -0
- package/dist/server/storage/repositories/plugin-definition-repository.js +84 -0
- package/dist/server/storage/repositories/plugin-definition-repository.js.map +1 -0
- package/dist/server/storage/repositories/plugin-enablement-repository.d.ts +9 -0
- package/dist/server/storage/repositories/plugin-enablement-repository.js +74 -0
- package/dist/server/storage/repositories/plugin-enablement-repository.js.map +1 -0
- package/dist/server/storage/repositories/plugin-permission-grant-repository.d.ts +12 -0
- package/dist/server/storage/repositories/plugin-permission-grant-repository.js +142 -0
- package/dist/server/storage/repositories/plugin-permission-grant-repository.js.map +1 -0
- package/dist/server/storage/repositories/plugin-run-repository.d.ts +10 -0
- package/dist/server/storage/repositories/plugin-run-repository.js +111 -0
- package/dist/server/storage/repositories/plugin-run-repository.js.map +1 -0
- package/dist/server/storage/repositories/plugin-runtime-session-repository.d.ts +10 -0
- package/dist/server/storage/repositories/plugin-runtime-session-repository.js +86 -0
- package/dist/server/storage/repositories/plugin-runtime-session-repository.js.map +1 -0
- package/dist/server/storage/sqlite/client.d.ts +2 -2
- package/dist/server/storage/sqlite/client.js +250 -1
- package/dist/server/storage/sqlite/client.js.map +1 -1
- package/dist/server/storage/sqlite/schema.sql +140 -0
- package/dist/server/types/domain.d.ts +122 -0
- package/package.json +10 -3
- package/scripts/postinstall.mjs +248 -11
- package/vendor/better-sqlite3-win32-x64-node22/LICENSE +21 -0
- package/vendor/better-sqlite3-win32-x64-node22/README.md +12 -0
- package/vendor/better-sqlite3-win32-x64-node22/README.upstream.md +99 -0
- package/vendor/better-sqlite3-win32-x64-node22/binding.gyp +38 -0
- package/vendor/better-sqlite3-win32-x64-node22/build/Release/better_sqlite3.node +0 -0
- package/vendor/better-sqlite3-win32-x64-node22/deps/common.gypi +68 -0
- package/vendor/better-sqlite3-win32-x64-node22/deps/copy.js +31 -0
- package/vendor/better-sqlite3-win32-x64-node22/deps/defines.gypi +41 -0
- package/vendor/better-sqlite3-win32-x64-node22/deps/download.sh +122 -0
- package/vendor/better-sqlite3-win32-x64-node22/deps/patches/1208.patch +15 -0
- package/vendor/better-sqlite3-win32-x64-node22/deps/sqlite3/sqlite3.c +265994 -0
- package/vendor/better-sqlite3-win32-x64-node22/deps/sqlite3/sqlite3.h +13968 -0
- package/vendor/better-sqlite3-win32-x64-node22/deps/sqlite3/sqlite3ext.h +730 -0
- package/vendor/better-sqlite3-win32-x64-node22/deps/sqlite3.gyp +80 -0
- package/vendor/better-sqlite3-win32-x64-node22/deps/test_extension.c +21 -0
- package/vendor/better-sqlite3-win32-x64-node22/lib/database.js +90 -0
- package/vendor/better-sqlite3-win32-x64-node22/lib/index.js +3 -0
- package/vendor/better-sqlite3-win32-x64-node22/lib/methods/aggregate.js +43 -0
- package/vendor/better-sqlite3-win32-x64-node22/lib/methods/backup.js +67 -0
- package/vendor/better-sqlite3-win32-x64-node22/lib/methods/function.js +31 -0
- package/vendor/better-sqlite3-win32-x64-node22/lib/methods/inspect.js +7 -0
- package/vendor/better-sqlite3-win32-x64-node22/lib/methods/pragma.js +12 -0
- package/vendor/better-sqlite3-win32-x64-node22/lib/methods/serialize.js +16 -0
- package/vendor/better-sqlite3-win32-x64-node22/lib/methods/table.js +189 -0
- package/vendor/better-sqlite3-win32-x64-node22/lib/methods/transaction.js +78 -0
- package/vendor/better-sqlite3-win32-x64-node22/lib/methods/wrappers.js +54 -0
- package/vendor/better-sqlite3-win32-x64-node22/lib/sqlite-error.js +20 -0
- package/vendor/better-sqlite3-win32-x64-node22/lib/util.js +12 -0
- package/vendor/better-sqlite3-win32-x64-node22/package.json +38 -0
- package/vendor/better-sqlite3-win32-x64-node22/scripts/verify-runtime.cjs +42 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/addon.cpp +47 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/better_sqlite3.cpp +74 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/objects/backup.cpp +120 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/objects/backup.hpp +36 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/objects/database.cpp +417 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/objects/database.hpp +103 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/objects/statement-iterator.cpp +113 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/objects/statement-iterator.hpp +50 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/objects/statement.cpp +383 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/objects/statement.hpp +58 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/util/bind-map.cpp +73 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/util/binder.cpp +193 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/util/constants.cpp +172 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/util/custom-aggregate.cpp +121 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/util/custom-function.cpp +59 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/util/custom-table.cpp +409 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/util/data-converter.cpp +17 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/util/data.cpp +194 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/util/helpers.cpp +109 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/util/macros.cpp +83 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/util/query-macros.cpp +71 -0
- package/vendor/better-sqlite3-win32-x64-node22/src/util/row-builder.cpp +49 -0
- package/vendor/node-pty-fork/README.md +1 -0
- package/vendor/node-pty-fork/scripts/runtime-install-context.cjs +24 -0
- package/vendor/node-pty-fork/scripts/verify-runtime.cjs +8 -0
- package/vendor/node-pty-fork/scripts/verify-runtime.test.cjs +30 -0
- package/vendor-src/better-sqlite3-win32-x64-node22/README.md +12 -0
- package/dist/public/assets/App-B0q8uDA-.js +0 -30
- package/dist/public/assets/DesktopWindowPage-BdKUZrKG.js +0 -2
- package/dist/public/assets/FileContextPanel-lM5mBcfn.js +0 -1
- package/dist/public/assets/GitSidebar-CmXAhyjo.js +0 -6
- package/dist/public/assets/MobileCreateSessionSheet-CceV0-AH.js +0 -1
- package/dist/public/assets/MobileWorkspaceSwitcherHeader-DhaM9fgx.js +0 -1
- package/dist/public/assets/ServerSettingsModal-Rkgn3jft.js +0 -1
- package/dist/public/assets/SessionIndexPage-BOumP3ij.js +0 -1
- package/dist/public/assets/SettingsPage-vx_c-00-.js +0 -2
- package/dist/public/assets/TerminalManagerPanel-D9JHCS6d.js +0 -1
- package/dist/public/assets/TerminalRuntimeFallbackModal-W5NjqFEz.js +0 -1
- package/dist/public/assets/ToolFilesPage-DWtpaN_7.js +0 -1
- package/dist/public/assets/ToolGitPage-MpGXsw4_.js +0 -1
- package/dist/public/assets/ToolProcessesPage-B1jHQKhZ.js +0 -1
- package/dist/public/assets/ToolsHomePage-CJrn8ZFl.js +0 -1
- package/dist/public/assets/WorkbenchLandingPage-CJQ1V5U-.js +0 -1
- package/dist/public/assets/WorkbenchLayout-D48i71PU.js +0 -244
- package/dist/public/assets/WorkbenchModal-BYNuMIoV.js +0 -1
- package/dist/public/assets/WorkbenchShellRoute-CGKjy4J-.js +0 -1
- package/dist/public/assets/WorkspaceDebugDetailPage-DCAYgays.js +0 -1
- package/dist/public/assets/WorkspaceDetailPage-D5v-nUIi.js +0 -1
- package/dist/public/assets/WorkspaceHomePage-I5G1p5SR.js +0 -1
- package/dist/public/assets/file-tree-icon-BFwaPxKs.js +0 -590
- package/dist/public/assets/index-CjewzOUG.js +0 -42
- package/dist/public/assets/model-switch-api-Br0ivfe5.js +0 -1
- package/dist/public/assets/realtime-client-BlQRqVmm.js +0 -1
- package/dist/public/assets/useRegisteredDebugTemplates-CXmxu69X.js +0 -1
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { AppError } from "../../shared/errors/app-error.js";
|
|
2
|
+
import { createId } from "../../shared/utils/id.js";
|
|
3
|
+
import { nowIso } from "../../shared/utils/time.js";
|
|
4
|
+
const DESKTOP_PERMISSION_KEY_MAP = {
|
|
5
|
+
open_file: "desktop.open_file",
|
|
6
|
+
reveal_in_file_manager: "desktop.reveal_in_file_manager"
|
|
7
|
+
};
|
|
8
|
+
export class PluginPermissionService {
|
|
9
|
+
pluginPermissionGrantRepository;
|
|
10
|
+
pluginAuditEventRepository;
|
|
11
|
+
constructor(pluginPermissionGrantRepository, pluginAuditEventRepository) {
|
|
12
|
+
this.pluginPermissionGrantRepository = pluginPermissionGrantRepository;
|
|
13
|
+
this.pluginAuditEventRepository = pluginAuditEventRepository;
|
|
14
|
+
}
|
|
15
|
+
assertWorkspaceScopedContext(workspaceId) {
|
|
16
|
+
const normalized = workspaceId?.trim() ?? "";
|
|
17
|
+
if (!normalized) {
|
|
18
|
+
throw new AppError({
|
|
19
|
+
statusCode: 400,
|
|
20
|
+
errorCode: "PLUGIN_WORKSPACE_CONTEXT_REQUIRED",
|
|
21
|
+
detail: "插件运行必须绑定当前工作区"
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return normalized;
|
|
25
|
+
}
|
|
26
|
+
assertManifestPermissionDeclared(manifest, permissionKey) {
|
|
27
|
+
if (isPermissionDeclared(manifest, permissionKey)) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
throw new AppError({
|
|
31
|
+
statusCode: 403,
|
|
32
|
+
errorCode: "PLUGIN_PERMISSION_DECLARATION_MISSING",
|
|
33
|
+
detail: `插件未声明权限:${permissionKey}`,
|
|
34
|
+
data: {
|
|
35
|
+
permissionKey
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
requirePermissionGrant(input) {
|
|
40
|
+
this.assertManifestPermissionDeclared(input.manifest, input.permissionKey);
|
|
41
|
+
if (!this.pluginPermissionGrantRepository) {
|
|
42
|
+
throwGrantRequired(input.permissionKey, input.scopePath ?? null);
|
|
43
|
+
}
|
|
44
|
+
const grants = this.pluginPermissionGrantRepository.listActiveByPluginWorkspaceAndPermission(input.pluginId, input.workspaceId, input.permissionKey, nowIso());
|
|
45
|
+
const matched = grants.find((grant) => isGrantMatchingScope(grant, input.scopePath ?? null, input.runtimeSessionId ?? null));
|
|
46
|
+
if (!matched) {
|
|
47
|
+
throwGrantRequired(input.permissionKey, input.scopePath ?? null);
|
|
48
|
+
}
|
|
49
|
+
return matched;
|
|
50
|
+
}
|
|
51
|
+
assertWorkspaceRead(manifest, context) {
|
|
52
|
+
return this.requirePermissionGrant({
|
|
53
|
+
manifest,
|
|
54
|
+
pluginId: context.pluginId,
|
|
55
|
+
workspaceId: context.workspaceId,
|
|
56
|
+
permissionKey: "workspace.read_file"
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
assertWorkspaceWrite(manifest, context, scopePath) {
|
|
60
|
+
return this.requirePermissionGrant({
|
|
61
|
+
manifest,
|
|
62
|
+
pluginId: context.pluginId,
|
|
63
|
+
workspaceId: context.workspaceId,
|
|
64
|
+
permissionKey: "workspace.write_file",
|
|
65
|
+
scopePath
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
assertDesktopPermission(manifest, context, permission, scopePath, runtimeSessionId) {
|
|
69
|
+
return this.requirePermissionGrant({
|
|
70
|
+
manifest,
|
|
71
|
+
pluginId: context.pluginId,
|
|
72
|
+
workspaceId: context.workspaceId,
|
|
73
|
+
permissionKey: DESKTOP_PERMISSION_KEY_MAP[permission],
|
|
74
|
+
scopePath,
|
|
75
|
+
runtimeSessionId
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
listWorkspaceGrants(pluginId, workspaceId) {
|
|
79
|
+
if (!this.pluginPermissionGrantRepository) {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
return this.pluginPermissionGrantRepository.listActiveByPluginAndWorkspace(pluginId, workspaceId, nowIso());
|
|
83
|
+
}
|
|
84
|
+
createGrant(input) {
|
|
85
|
+
if (!this.pluginPermissionGrantRepository) {
|
|
86
|
+
throw new AppError({
|
|
87
|
+
statusCode: 500,
|
|
88
|
+
errorCode: "PLUGIN_PERMISSION_STORE_UNAVAILABLE",
|
|
89
|
+
detail: "插件授权存储当前不可用"
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
this.assertManifestPermissionDeclared(input.manifest, input.permissionKey);
|
|
93
|
+
const normalizedScope = normalizeGrantScope(input.scopeType, input.scopePath);
|
|
94
|
+
assertGrantModeAllowed(input.grantMode, input.runtimeSessionId);
|
|
95
|
+
const grantedAt = nowIso();
|
|
96
|
+
const record = {
|
|
97
|
+
id: createId(),
|
|
98
|
+
pluginId: input.pluginId,
|
|
99
|
+
workspaceId: input.workspaceId,
|
|
100
|
+
permissionKey: input.permissionKey,
|
|
101
|
+
scopeType: normalizedScope.scopeType,
|
|
102
|
+
scopePath: normalizedScope.scopePath,
|
|
103
|
+
grantMode: input.grantMode,
|
|
104
|
+
grantedByUserId: input.grantedByUserId,
|
|
105
|
+
runtimeSessionId: input.grantMode === "session" ? input.runtimeSessionId : null,
|
|
106
|
+
createdAt: grantedAt,
|
|
107
|
+
expiresAt: null,
|
|
108
|
+
revokedAt: null
|
|
109
|
+
};
|
|
110
|
+
const created = this.pluginPermissionGrantRepository.create(record);
|
|
111
|
+
this.recordAuditEvent("plugin.permission_granted", created.pluginId, created.workspaceId, created.grantedByUserId, {
|
|
112
|
+
grantId: created.id,
|
|
113
|
+
permissionKey: created.permissionKey,
|
|
114
|
+
scopeType: created.scopeType,
|
|
115
|
+
scopePath: created.scopePath,
|
|
116
|
+
grantMode: created.grantMode,
|
|
117
|
+
runtimeSessionId: created.runtimeSessionId
|
|
118
|
+
});
|
|
119
|
+
return created;
|
|
120
|
+
}
|
|
121
|
+
revokeGrant(pluginId, workspaceId, grantId, actorUserId) {
|
|
122
|
+
if (!this.pluginPermissionGrantRepository) {
|
|
123
|
+
throw new AppError({
|
|
124
|
+
statusCode: 500,
|
|
125
|
+
errorCode: "PLUGIN_PERMISSION_STORE_UNAVAILABLE",
|
|
126
|
+
detail: "插件授权存储当前不可用"
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
const existing = this.pluginPermissionGrantRepository.findById(grantId);
|
|
130
|
+
if (!existing || existing.pluginId !== pluginId || existing.workspaceId !== workspaceId) {
|
|
131
|
+
throw new AppError({
|
|
132
|
+
statusCode: 404,
|
|
133
|
+
errorCode: "PLUGIN_PERMISSION_GRANT_NOT_FOUND",
|
|
134
|
+
detail: "未找到当前工作区下的插件授权记录"
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
const revoked = this.pluginPermissionGrantRepository.revokeById(grantId, nowIso());
|
|
138
|
+
if (!revoked) {
|
|
139
|
+
throw new AppError({
|
|
140
|
+
statusCode: 404,
|
|
141
|
+
errorCode: "PLUGIN_PERMISSION_GRANT_NOT_FOUND",
|
|
142
|
+
detail: "未找到当前工作区下的插件授权记录"
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
this.recordAuditEvent("plugin.permission_revoked", revoked.pluginId, revoked.workspaceId, actorUserId, {
|
|
146
|
+
grantId: revoked.id,
|
|
147
|
+
permissionKey: revoked.permissionKey,
|
|
148
|
+
scopeType: revoked.scopeType,
|
|
149
|
+
scopePath: revoked.scopePath,
|
|
150
|
+
grantMode: revoked.grantMode,
|
|
151
|
+
runtimeSessionId: revoked.runtimeSessionId
|
|
152
|
+
});
|
|
153
|
+
return revoked;
|
|
154
|
+
}
|
|
155
|
+
recordPermissionDenied(input) {
|
|
156
|
+
this.recordAuditEvent("plugin.permission_denied", input.pluginId, input.workspaceId, input.actorUserId, {
|
|
157
|
+
permissionKey: input.permissionKey,
|
|
158
|
+
scopeType: input.scopePath ? "file" : "workspace",
|
|
159
|
+
scopePath: input.scopePath,
|
|
160
|
+
runtimeSessionId: input.runtimeSessionId ?? null,
|
|
161
|
+
reason: input.reason
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
recordAuditEvent(eventType, pluginId, workspaceId, actorUserId, payload) {
|
|
165
|
+
if (!this.pluginAuditEventRepository) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
this.pluginAuditEventRepository.create({
|
|
169
|
+
id: createId(),
|
|
170
|
+
pluginId,
|
|
171
|
+
workspaceId,
|
|
172
|
+
eventType,
|
|
173
|
+
actorUserId,
|
|
174
|
+
payloadJson: JSON.stringify(payload),
|
|
175
|
+
createdAt: nowIso()
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function isPermissionDeclared(manifest, permissionKey) {
|
|
180
|
+
switch (permissionKey) {
|
|
181
|
+
case "workspace.read_file":
|
|
182
|
+
case "workspace.list_dir":
|
|
183
|
+
return manifest.permissions.workspaceRead === true;
|
|
184
|
+
case "workspace.write_file":
|
|
185
|
+
return manifest.permissions.workspaceWrite === true;
|
|
186
|
+
case "desktop.open_file":
|
|
187
|
+
return manifest.permissions.desktop?.includes("open_file") === true;
|
|
188
|
+
case "desktop.reveal_in_file_manager":
|
|
189
|
+
return manifest.permissions.desktop?.includes("reveal_in_file_manager") === true;
|
|
190
|
+
default:
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function isGrantMatchingScope(grant, requestedScopePath, runtimeSessionId) {
|
|
195
|
+
if (grant.grantMode === "session" && grant.runtimeSessionId && runtimeSessionId && grant.runtimeSessionId !== runtimeSessionId) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
if (grant.scopeType === "workspace") {
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
const normalizedRequestedPath = normalizeScopePath(requestedScopePath);
|
|
202
|
+
const normalizedGrantPath = normalizeScopePath(grant.scopePath);
|
|
203
|
+
if (!normalizedRequestedPath || !normalizedGrantPath) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
if (grant.scopeType === "file") {
|
|
207
|
+
return normalizedRequestedPath === normalizedGrantPath;
|
|
208
|
+
}
|
|
209
|
+
return normalizedRequestedPath === normalizedGrantPath
|
|
210
|
+
|| normalizedRequestedPath.startsWith(`${normalizedGrantPath}/`);
|
|
211
|
+
}
|
|
212
|
+
function normalizeScopePath(pathValue) {
|
|
213
|
+
const normalized = (pathValue?.trim() ?? "")
|
|
214
|
+
.replace(/\\/g, "/")
|
|
215
|
+
.replace(/^\/+|\/+$/g, "");
|
|
216
|
+
return normalized || null;
|
|
217
|
+
}
|
|
218
|
+
function normalizeGrantScope(scopeType, scopePath) {
|
|
219
|
+
const normalizedScopePath = normalizeScopePath(scopePath);
|
|
220
|
+
if (scopeType === "workspace") {
|
|
221
|
+
if (normalizedScopePath) {
|
|
222
|
+
throw new AppError({
|
|
223
|
+
statusCode: 400,
|
|
224
|
+
errorCode: "PLUGIN_PERMISSION_SCOPE_INVALID",
|
|
225
|
+
detail: "全工作区授权不能再附带路径范围"
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
scopeType,
|
|
230
|
+
scopePath: null
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
if (!normalizedScopePath) {
|
|
234
|
+
throw new AppError({
|
|
235
|
+
statusCode: 400,
|
|
236
|
+
errorCode: "PLUGIN_PERMISSION_SCOPE_INVALID",
|
|
237
|
+
detail: "目录或文件授权必须提供相对路径"
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
scopeType,
|
|
242
|
+
scopePath: normalizedScopePath
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function assertGrantModeAllowed(grantMode, runtimeSessionId) {
|
|
246
|
+
if (grantMode === "session" && !runtimeSessionId) {
|
|
247
|
+
throw new AppError({
|
|
248
|
+
statusCode: 400,
|
|
249
|
+
errorCode: "PLUGIN_PERMISSION_SCOPE_INVALID",
|
|
250
|
+
detail: "会话授权必须绑定当前 runtimeSessionId"
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
function throwGrantRequired(permissionKey, scopePath) {
|
|
255
|
+
throw new AppError({
|
|
256
|
+
statusCode: 403,
|
|
257
|
+
errorCode: "PLUGIN_PERMISSION_GRANT_REQUIRED",
|
|
258
|
+
detail: `插件权限尚未授权:${permissionKey}`,
|
|
259
|
+
data: {
|
|
260
|
+
permissionKey,
|
|
261
|
+
scopeType: scopePath ? "file" : "workspace",
|
|
262
|
+
scopePath,
|
|
263
|
+
grantOptions: ["once", "session", "persistent"]
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=plugin-permission-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-permission-service.js","sourceRoot":"","sources":["../../../../src/modules/plugins/plugin-permission-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface PluginProcessRunResult {
|
|
2
|
+
exitCode: number;
|
|
3
|
+
stdout: string;
|
|
4
|
+
stderr: string;
|
|
5
|
+
}
|
|
6
|
+
export interface RunPluginNodeScriptInput {
|
|
7
|
+
entryAbsolutePath: string;
|
|
8
|
+
installRoot: string;
|
|
9
|
+
payload: {
|
|
10
|
+
pluginId: string;
|
|
11
|
+
actionId: string;
|
|
12
|
+
workspaceId: string;
|
|
13
|
+
runtimeSessionId: string | null;
|
|
14
|
+
input: unknown;
|
|
15
|
+
};
|
|
16
|
+
timeoutMs: number;
|
|
17
|
+
signal?: AbortSignal;
|
|
18
|
+
}
|
|
19
|
+
export declare class PluginProcessRunner {
|
|
20
|
+
runNodeScript(input: RunPluginNodeScriptInput): Promise<PluginProcessRunResult>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { AppError } from "../../shared/errors/app-error.js";
|
|
5
|
+
const RUNNER_FILENAME = ".codingns-plugin-runner.mjs";
|
|
6
|
+
export class PluginProcessRunner {
|
|
7
|
+
async runNodeScript(input) {
|
|
8
|
+
if (!fs.existsSync(input.entryAbsolutePath) || !fs.statSync(input.entryAbsolutePath).isFile()) {
|
|
9
|
+
throw new AppError({
|
|
10
|
+
statusCode: 404,
|
|
11
|
+
errorCode: "PLUGIN_ACTION_ENTRY_NOT_FOUND",
|
|
12
|
+
detail: "插件动作入口脚本不存在"
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
const bootstrapScript = path.join(input.installRoot, RUNNER_FILENAME);
|
|
16
|
+
if (!fs.existsSync(bootstrapScript) || fs.readFileSync(bootstrapScript, "utf8") !== buildRunnerScript()) {
|
|
17
|
+
fs.writeFileSync(bootstrapScript, buildRunnerScript(), "utf8");
|
|
18
|
+
}
|
|
19
|
+
return await new Promise((resolve, reject) => {
|
|
20
|
+
const child = spawn(process.execPath, [bootstrapScript, input.entryAbsolutePath, JSON.stringify(input.payload)], {
|
|
21
|
+
cwd: input.installRoot,
|
|
22
|
+
env: buildWhitelistedEnv(),
|
|
23
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
24
|
+
});
|
|
25
|
+
let stdout = "";
|
|
26
|
+
let stderr = "";
|
|
27
|
+
let settled = false;
|
|
28
|
+
const cleanupAbortListener = bindAbortSignal(input.signal, () => {
|
|
29
|
+
child.kill("SIGKILL");
|
|
30
|
+
if (!settled) {
|
|
31
|
+
settled = true;
|
|
32
|
+
reject(new AppError({
|
|
33
|
+
statusCode: 499,
|
|
34
|
+
errorCode: "PLUGIN_ACTION_CANCELLED",
|
|
35
|
+
detail: "插件动作执行已取消"
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
const timer = setTimeout(() => {
|
|
40
|
+
child.kill("SIGKILL");
|
|
41
|
+
if (!settled) {
|
|
42
|
+
settled = true;
|
|
43
|
+
reject(new AppError({
|
|
44
|
+
statusCode: 504,
|
|
45
|
+
errorCode: "PLUGIN_ACTION_TIMEOUT",
|
|
46
|
+
detail: "插件动作执行超时"
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
}, input.timeoutMs);
|
|
50
|
+
child.stdout.on("data", (chunk) => {
|
|
51
|
+
stdout += chunk.toString();
|
|
52
|
+
});
|
|
53
|
+
child.stderr.on("data", (chunk) => {
|
|
54
|
+
stderr += chunk.toString();
|
|
55
|
+
});
|
|
56
|
+
child.on("error", (error) => {
|
|
57
|
+
clearTimeout(timer);
|
|
58
|
+
cleanupAbortListener();
|
|
59
|
+
if (!settled) {
|
|
60
|
+
settled = true;
|
|
61
|
+
reject(error);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
child.on("exit", (code) => {
|
|
65
|
+
clearTimeout(timer);
|
|
66
|
+
cleanupAbortListener();
|
|
67
|
+
if (settled) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
settled = true;
|
|
71
|
+
resolve({
|
|
72
|
+
exitCode: code ?? 1,
|
|
73
|
+
stdout,
|
|
74
|
+
stderr
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function buildWhitelistedEnv() {
|
|
81
|
+
const env = {
|
|
82
|
+
PATH: process.env.PATH,
|
|
83
|
+
HOME: process.env.HOME,
|
|
84
|
+
TMPDIR: process.env.TMPDIR,
|
|
85
|
+
TEMP: process.env.TEMP,
|
|
86
|
+
TMP: process.env.TMP,
|
|
87
|
+
LANG: process.env.LANG,
|
|
88
|
+
LC_ALL: process.env.LC_ALL,
|
|
89
|
+
NODE_ENV: "production"
|
|
90
|
+
};
|
|
91
|
+
Object.keys(env).forEach((key) => {
|
|
92
|
+
if (env[key] === undefined) {
|
|
93
|
+
delete env[key];
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return env;
|
|
97
|
+
}
|
|
98
|
+
function bindAbortSignal(signal, onAbort) {
|
|
99
|
+
if (!signal) {
|
|
100
|
+
return () => undefined;
|
|
101
|
+
}
|
|
102
|
+
if (signal.aborted) {
|
|
103
|
+
onAbort();
|
|
104
|
+
return () => undefined;
|
|
105
|
+
}
|
|
106
|
+
const listener = () => onAbort();
|
|
107
|
+
signal.addEventListener("abort", listener, { once: true });
|
|
108
|
+
return () => signal.removeEventListener("abort", listener);
|
|
109
|
+
}
|
|
110
|
+
function buildRunnerScript() {
|
|
111
|
+
return `
|
|
112
|
+
import { pathToFileURL } from "node:url";
|
|
113
|
+
|
|
114
|
+
const [, , entryPath, payloadText] = process.argv;
|
|
115
|
+
const mod = await import(pathToFileURL(entryPath).href);
|
|
116
|
+
const handler = typeof mod.default === "function" ? mod.default : mod.run;
|
|
117
|
+
|
|
118
|
+
if (typeof handler !== "function") {
|
|
119
|
+
throw new Error("PLUGIN_ACTION_HANDLER_MISSING: 插件动作入口必须导出 default 或 run 函数");
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const payload = JSON.parse(payloadText);
|
|
123
|
+
const result = await handler(payload);
|
|
124
|
+
process.stdout.write(JSON.stringify(result ?? null));
|
|
125
|
+
`;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=plugin-process-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-process-runner.js","sourceRoot":"","sources":["../../../../src/modules/plugins/plugin-process-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { PluginAuditEventRepository } from "../../storage/repositories/plugin-audit-event-repository.js";
|
|
2
|
+
import type { PluginDefinitionRepository } from "../../storage/repositories/plugin-definition-repository.js";
|
|
3
|
+
import type { PluginEnablementRepository } from "../../storage/repositories/plugin-enablement-repository.js";
|
|
4
|
+
import type { PluginAuditEvent, PluginDefinition, PluginEnablement, PluginManifest } from "../../types/domain.js";
|
|
5
|
+
interface PluginRegistryLogger {
|
|
6
|
+
warn(bindings: Record<string, unknown>, message: string): void;
|
|
7
|
+
info?(bindings: Record<string, unknown>, message: string): void;
|
|
8
|
+
}
|
|
9
|
+
export interface PluginSummary {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
version: string;
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
installRoot: string;
|
|
15
|
+
hasFrontend: boolean;
|
|
16
|
+
hasBackend: boolean;
|
|
17
|
+
updatedAt: string;
|
|
18
|
+
}
|
|
19
|
+
export interface PluginDetail {
|
|
20
|
+
definition: PluginDefinition;
|
|
21
|
+
manifest: PluginManifest;
|
|
22
|
+
enablement: PluginEnablement;
|
|
23
|
+
auditEvents: PluginAuditEvent[];
|
|
24
|
+
}
|
|
25
|
+
export declare class PluginRegistryService {
|
|
26
|
+
private readonly pluginDefinitionRepository;
|
|
27
|
+
private readonly pluginEnablementRepository;
|
|
28
|
+
private readonly pluginAuditEventRepository;
|
|
29
|
+
private readonly pluginRootDir;
|
|
30
|
+
private readonly logger;
|
|
31
|
+
constructor(pluginDefinitionRepository: PluginDefinitionRepository, pluginEnablementRepository: PluginEnablementRepository, pluginAuditEventRepository: PluginAuditEventRepository, pluginRootDir: string, logger: PluginRegistryLogger);
|
|
32
|
+
listPlugins(): PluginSummary[];
|
|
33
|
+
getPlugin(pluginId: string): PluginDetail;
|
|
34
|
+
enablePlugin(pluginId: string, userId: string): PluginEnablement;
|
|
35
|
+
disablePlugin(pluginId: string, userId: string, reason?: string | null): PluginEnablement;
|
|
36
|
+
syncPluginsFromDisk(): void;
|
|
37
|
+
private requireDefinition;
|
|
38
|
+
private getOrCreateEnablement;
|
|
39
|
+
private recordAuditEvent;
|
|
40
|
+
}
|
|
41
|
+
export {};
|