@stardustlc/dsh-docker 0.4.1 → 0.4.3
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/CHANGELOG.md +8 -0
- package/README.en.md +2 -0
- package/README.md +2 -0
- package/docs/USAGE.en.md +4 -0
- package/docs/USAGE.md +4 -0
- package/docs/VALIDATION.md +4 -0
- package/docs/validation-0.4.3.md +19 -0
- package/lib/approval.d.ts +13 -0
- package/lib/approval.js +19 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +15 -2
- package/lib/tools.d.ts +2 -1
- package/lib/tools.js +7 -5
- package/package.json +5 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
[返回简介](README.md) · [使用说明](docs/USAGE.md) · [验证记录](docs/VALIDATION.md)
|
|
4
4
|
|
|
5
|
+
## 0.4.3(2026-10-26)
|
|
6
|
+
|
|
7
|
+
- 确认门读取宿主当前会话的真实审批策略;never 模式不再被误报为用户拒绝,自检明确显示无法询问的原因与解决选项。默认确认保护保持启用。
|
|
8
|
+
- Windows 回归 41 项通过、0 项跳过;宿主与未验收范围见[本次记录](docs/validation-0.4.3.md)。
|
|
9
|
+
|
|
10
|
+
## 0.4.2(2026-10-17)
|
|
11
|
+
|
|
12
|
+
- 补 `publishConfig.access: "public"`:与其余 scoped 包保持一致,避免发布时因默认 restricted 访问级别失败(不影响运行时行为)。
|
|
5
13
|
## 0.4.1 (2026-10-05)
|
|
6
14
|
|
|
7
15
|
- 修复旧版 DSH 生成 PTC SDK 时不支持的数组约束;仍在执行前严格限制 argv 的 128 项与总长度,保留精确参数和审批。
|
package/README.en.md
CHANGED
|
@@ -8,6 +8,8 @@ Inspect and manage local Docker containers and images from DSH.
|
|
|
8
8
|
|
|
9
9
|
[](https://www.npmjs.com/package/@stardustlc/dsh-docker) [](https://www.npmjs.com/package/@stardustlc/dsh-docker)
|
|
10
10
|
|
|
11
|
+
Feedback and contributions are welcome: report [issues](https://github.com/STARDUSTLC666/dsh-docker/issues) or submit [pull requests](https://github.com/STARDUSTLC666/dsh-docker/pulls).
|
|
12
|
+
|
|
11
13
|
## What it does
|
|
12
14
|
|
|
13
15
|
- Inspect containers, images, logs and resource status.
|
package/README.md
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
[](https://www.npmjs.com/package/@stardustlc/dsh-docker) [](https://www.npmjs.com/package/@stardustlc/dsh-docker)
|
|
10
10
|
|
|
11
|
+
欢迎使用,遇到问题或有改进建议,请提交 [issues](https://github.com/STARDUSTLC666/dsh-docker/issues) 和 [PR](https://github.com/STARDUSTLC666/dsh-docker/pulls)。
|
|
12
|
+
|
|
11
13
|
## 功能
|
|
12
14
|
|
|
13
15
|
- 查看容器、镜像、日志和资源状态。
|
package/docs/USAGE.en.md
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
[Overview](../README.en.md) · [Changelog](../CHANGELOG.md) · [Validation](VALIDATION.md)
|
|
4
4
|
|
|
5
|
+
## Confirmation and never policy
|
|
6
|
+
|
|
7
|
+
execApproval and manageApproval stay enabled by default. The host never policy rejects requests that require asking; it does not grant all actions. Select an asking policy, or explicitly disable the relevant plugin gate if the user chooses to do so. docker_health reports the effective policy and still probes the daemon.
|
|
8
|
+
|
|
5
9
|
## Current improvements
|
|
6
10
|
|
|
7
11
|
Prefer docker_exec with container="web" and argv=["printf","%s","a b"]. Supply exactly one of command or argv. The host performs no variable, pipe or command-substitution expansion. Explicit container shell calls such as ["sh","-c","..."] remain approval-gated.
|
package/docs/USAGE.md
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
[返回简介](../README.md) · [更新记录](../CHANGELOG.md) · [验证记录](VALIDATION.md)
|
|
4
4
|
|
|
5
|
+
## 确认与 never 策略
|
|
6
|
+
|
|
7
|
+
execApproval 和 manageApproval 默认开启。宿主 never 策略会拒绝所有需要询问的请求;它不代表允许全部执行。若需要确认,切换至可询问策略;只有用户明确接受风险时,才分别关闭对应的插件确认门。docker_health 会显示实际策略,且继续检测 Docker daemon。
|
|
8
|
+
|
|
5
9
|
## 本次改进
|
|
6
10
|
|
|
7
11
|
推荐 docker_exec { container: "web", argv: ["printf", "%s", "a b"] }。command 与 argv 二选一;宿主不执行变量、管道或命令替换。确需容器 Shell 时显式使用 ["sh", "-c", "..."],仍需审批。
|
package/docs/VALIDATION.md
CHANGED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# 0.4.3 验证记录
|
|
2
|
+
|
|
3
|
+
日期:2026-10-26。官方 Windows 宿主:DSH 0.2.1-rc.3。
|
|
4
|
+
|
|
5
|
+
## 行为变化
|
|
6
|
+
|
|
7
|
+
确认门读取宿主当前会话的真实审批策略;never 模式不再被误报为用户拒绝,自检明确显示无法询问的原因与解决选项。默认确认保护保持启用。
|
|
8
|
+
|
|
9
|
+
## 验证与限制
|
|
10
|
+
|
|
11
|
+
- Windows 本地:41 项,41 通过、0 跳过;没有把跳过计为通过。
|
|
12
|
+
- 官方 RC.3 的 tools.execute 实际调用确认 never 拒绝与健康诊断;Docker 引擎未运行,容器生命周期未验收。
|
|
13
|
+
- GitHub 的跨平台 CI 和 npm 发布完整性以该版本工作流及 registry 为准;本记录不把本地测试等同于已发布。
|
|
14
|
+
|
|
15
|
+
## English
|
|
16
|
+
|
|
17
|
+
Confirmation gates read the effective host session policy. Under never, execution is denied with actionable settings instead of reporting a user rejection; health reports the same state. Default gates remain enabled.
|
|
18
|
+
|
|
19
|
+
Runtime/account limits are listed above. Synthetic peers and model adapters do not establish live account delivery or model quality.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Match the host policy without importing another copy of its services. */
|
|
2
|
+
export type DockerApprovalPolicy = 'ask' | 'never' | 'unknown';
|
|
3
|
+
export interface DockerApprovalService {
|
|
4
|
+
config?: {
|
|
5
|
+
policy?: unknown;
|
|
6
|
+
};
|
|
7
|
+
overrideOf?(session: unknown): unknown;
|
|
8
|
+
}
|
|
9
|
+
export declare function dockerApprovalPolicy(service: DockerApprovalService | undefined, execution: unknown): DockerApprovalPolicy;
|
|
10
|
+
export declare function dockerApprovalCheck(enabled: boolean, policy: DockerApprovalPolicy, setting: string): {
|
|
11
|
+
ok: boolean;
|
|
12
|
+
detail: string;
|
|
13
|
+
};
|
package/lib/approval.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function dockerApprovalPolicy(service, execution) {
|
|
2
|
+
try {
|
|
3
|
+
const session = execution?.agent?.session;
|
|
4
|
+
const policy = (session === undefined ? undefined : service?.overrideOf?.(session)) ?? service?.config?.policy;
|
|
5
|
+
return policy === 'ask' || policy === 'never' ? policy : 'unknown';
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return 'unknown';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function dockerApprovalCheck(enabled, policy, setting) {
|
|
12
|
+
if (!enabled)
|
|
13
|
+
return { ok: true, detail: setting + '=false;本插件不要求单独确认,其它宿主策略仍生效' };
|
|
14
|
+
if (policy === 'never')
|
|
15
|
+
return { ok: false, detail: '插件要求确认,但当前审批策略 never 不允许询问;请切换为可询问模式,或由用户明确设置 ' + setting + '=false' };
|
|
16
|
+
if (policy === 'ask')
|
|
17
|
+
return { ok: true, detail: '开启;当前策略 ask,经宿主询问(无人回答时拒绝)' };
|
|
18
|
+
return { ok: false, detail: '开启;无法读取当前会话审批策略,尚未确认可用' };
|
|
19
|
+
}
|
package/lib/index.d.ts
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import { type DockerConfig } from './config.js';
|
|
11
11
|
import { type SubprocessSpawnLike } from './exec.js';
|
|
12
12
|
import { type DockerToolDefinition } from './tools.js';
|
|
13
|
+
import { type DockerApprovalService } from './approval.js';
|
|
13
14
|
/** cordis 服务注入:apply 里要用 ctx.subprocess 与 ctx.tools。 */
|
|
14
15
|
export declare const name = "docker";
|
|
15
16
|
export declare const inject: string[];
|
|
@@ -32,6 +33,8 @@ interface DockerToolExecution {
|
|
|
32
33
|
type DockerPreExecuteListener = (exec: DockerToolExecution, next: () => Promise<DockerPreToolDecision>) => Promise<DockerPreToolDecision>;
|
|
33
34
|
/** 插件所需的最小 ctx 面。 */
|
|
34
35
|
export interface DockerPluginContext {
|
|
36
|
+
approval?: DockerApprovalService;
|
|
37
|
+
get?(name: string): unknown;
|
|
35
38
|
subprocess: {
|
|
36
39
|
spawn: SubprocessSpawnLike;
|
|
37
40
|
};
|
|
@@ -50,3 +53,4 @@ export * from './config.js';
|
|
|
50
53
|
export * from './exec.js';
|
|
51
54
|
export * from './parse.js';
|
|
52
55
|
export * from './tools.js';
|
|
56
|
+
export * from './approval.js';
|
package/lib/index.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import { resolveConfig } from './config.js';
|
|
11
11
|
import { createSubprocessRunner } from './exec.js';
|
|
12
12
|
import { buildDockerTools } from './tools.js';
|
|
13
|
+
import { dockerApprovalPolicy, dockerApprovalCheck } from './approval.js';
|
|
13
14
|
/** cordis 服务注入:apply 里要用 ctx.subprocess 与 ctx.tools。 */
|
|
14
15
|
export const name = 'docker';
|
|
15
16
|
export const inject = ['subprocess', 'tools'];
|
|
@@ -19,11 +20,19 @@ export const inject = ['subprocess', 'tools'];
|
|
|
19
20
|
export function apply(ctx, config) {
|
|
20
21
|
const cfg = resolveConfig(config);
|
|
21
22
|
const runner = createSubprocessRunner((spec) => ctx.subprocess.spawn(spec), cfg.graceMs, cfg.timeoutMs);
|
|
22
|
-
const
|
|
23
|
+
const policyOf = (execution) => dockerApprovalPolicy((ctx.get ? ctx.get('approval') : ctx.approval), execution);
|
|
24
|
+
const tools = buildDockerTools(cfg, runner, policyOf);
|
|
23
25
|
if (cfg.execApproval || cfg.manageApproval) {
|
|
24
26
|
ctx.on('tools/pre-execute', async (exec, next) => {
|
|
27
|
+
// Preserve denials from the remaining host waterfall before adding a question.
|
|
28
|
+
const downstream = await next();
|
|
29
|
+
if (downstream.kind === 'deny')
|
|
30
|
+
return downstream;
|
|
25
31
|
const args = (typeof exec.arguments === 'object' && exec.arguments !== null ? exec.arguments : {});
|
|
26
32
|
if (exec.name === 'docker_exec' && cfg.execApproval) {
|
|
33
|
+
const policy = policyOf(exec);
|
|
34
|
+
if (policy === 'never')
|
|
35
|
+
return { kind: 'deny', reason: dockerApprovalCheck(true, policy, 'execApproval').detail };
|
|
27
36
|
const command = Array.isArray(args.argv) ? JSON.stringify(args.argv) : typeof args.command === 'string' ? args.command : '';
|
|
28
37
|
const container = typeof args.container === 'string' ? args.container : '';
|
|
29
38
|
return {
|
|
@@ -34,6 +43,9 @@ export function apply(ctx, config) {
|
|
|
34
43
|
if (exec.name === 'docker_manage' && cfg.manageApproval) {
|
|
35
44
|
const action = typeof args.action === 'string' ? args.action : '';
|
|
36
45
|
if (action === 'stop' || action === 'restart' || action === 'rm') {
|
|
46
|
+
const policy = policyOf(exec);
|
|
47
|
+
if (policy === 'never')
|
|
48
|
+
return { kind: 'deny', reason: dockerApprovalCheck(true, policy, 'manageApproval').detail };
|
|
37
49
|
const container = typeof args.container === 'string' ? args.container : '';
|
|
38
50
|
return {
|
|
39
51
|
kind: 'ask',
|
|
@@ -41,7 +53,7 @@ export function apply(ctx, config) {
|
|
|
41
53
|
};
|
|
42
54
|
}
|
|
43
55
|
}
|
|
44
|
-
return
|
|
56
|
+
return downstream;
|
|
45
57
|
});
|
|
46
58
|
}
|
|
47
59
|
const disposers = [];
|
|
@@ -58,3 +70,4 @@ export * from './config.js';
|
|
|
58
70
|
export * from './exec.js';
|
|
59
71
|
export * from './parse.js';
|
|
60
72
|
export * from './tools.js';
|
|
73
|
+
export * from './approval.js';
|
package/lib/tools.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type ResolvedDockerConfig } from './config.js';
|
|
2
2
|
import { type ProcessRunner } from './exec.js';
|
|
3
|
+
import { type DockerApprovalPolicy } from './approval.js';
|
|
3
4
|
export interface ContentBlock {
|
|
4
5
|
type: 'text';
|
|
5
6
|
text: string;
|
|
@@ -20,4 +21,4 @@ export interface DockerToolDefinition {
|
|
|
20
21
|
timeoutMs?: number;
|
|
21
22
|
}
|
|
22
23
|
/** 构建七个工具定义。 */
|
|
23
|
-
export declare function buildDockerTools(config: ResolvedDockerConfig, runner: ProcessRunner): DockerToolDefinition[];
|
|
24
|
+
export declare function buildDockerTools(config: ResolvedDockerConfig, runner: ProcessRunner, policyOf?: (execution: unknown) => DockerApprovalPolicy): DockerToolDefinition[];
|
package/lib/tools.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { imagesArgs, inspectArgs, logsArgs, manageArgs, execArgs, psArgs, splitCommand } from './args.js';
|
|
8
8
|
import { assertContainerRef } from './config.js';
|
|
9
9
|
import { parseImagesJson, parseInspectJson, parsePsJson } from './parse.js';
|
|
10
|
+
import { dockerApprovalCheck } from './approval.js';
|
|
10
11
|
function compileParameters(spec) {
|
|
11
12
|
const properties = {};
|
|
12
13
|
const required = [];
|
|
@@ -89,7 +90,7 @@ const manageSchema = {
|
|
|
89
90
|
additionalProperties: true,
|
|
90
91
|
};
|
|
91
92
|
/** 构建七个工具定义。 */
|
|
92
|
-
export function buildDockerTools(config, runner) {
|
|
93
|
+
export function buildDockerTools(config, runner, policyOf = () => 'unknown') {
|
|
93
94
|
const cfg = config;
|
|
94
95
|
const timeout = cfg.timeoutMs;
|
|
95
96
|
const dockerPs = {
|
|
@@ -262,7 +263,7 @@ export function buildDockerTools(config, runner) {
|
|
|
262
263
|
const lines = ['dsh-docker 自检' + (rec.ok === true ? ':正常。' : ':发现问题。')];
|
|
263
264
|
for (const item of checks) {
|
|
264
265
|
const c = asRecord(item);
|
|
265
|
-
lines.push('- ' + c.name + ':' + (c.ok === true ? '✅' : '❌ ' + String(c.detail ?? ''))
|
|
266
|
+
lines.push('- ' + c.name + ':' + (c.ok === true ? '✅ ' : '❌ ') + String(c.detail ?? ''));
|
|
266
267
|
}
|
|
267
268
|
return [{ type: 'text', text: lines.join('\n') }];
|
|
268
269
|
},
|
|
@@ -280,10 +281,11 @@ export function buildDockerTools(config, runner) {
|
|
|
280
281
|
ok = false;
|
|
281
282
|
checks.push({ name: 'docker daemon', ok: false, detail: error instanceof Error ? error.message : String(error) });
|
|
282
283
|
}
|
|
283
|
-
|
|
284
|
-
checks.push({ name: '
|
|
284
|
+
const policy = policyOf(exec);
|
|
285
|
+
checks.push({ name: 'exec 审批门', ...dockerApprovalCheck(cfg.execApproval, policy, 'execApproval') });
|
|
286
|
+
checks.push({ name: 'manage 审批门', ...dockerApprovalCheck(cfg.manageApproval, policy, 'manageApproval') });
|
|
285
287
|
checks.push({ name: '超时配置', ok: true, detail: 'timeoutMs=' + cfg.timeoutMs + ', graceMs=' + cfg.graceMs });
|
|
286
|
-
return { ok, plugin: 'dsh-docker', checks };
|
|
288
|
+
return { ok: ok && checks.every(check => check.ok === true), plugin: 'dsh-docker', approvalPolicy: policy, checks };
|
|
287
289
|
},
|
|
288
290
|
timeoutMs: 20000,
|
|
289
291
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stardustlc/dsh-docker",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.3",
|
|
4
4
|
"description": "在 DSH 中查看和管理本机 Docker 容器与镜像。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -57,5 +57,8 @@
|
|
|
57
57
|
},
|
|
58
58
|
"homepage": "https://github.com/STARDUSTLC666/dsh-docker#readme",
|
|
59
59
|
"author": "stardustlc",
|
|
60
|
-
"packageManager": "pnpm@11.7.0"
|
|
60
|
+
"packageManager": "pnpm@11.7.0",
|
|
61
|
+
"publishConfig": {
|
|
62
|
+
"access": "public"
|
|
63
|
+
}
|
|
61
64
|
}
|