@dsh-enhanced/assistant-policy 0.1.12 → 0.1.14

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 CHANGED
@@ -127,9 +127,9 @@ DSH 原生 `user-approval` 仍只负责 open turn 内的即时询问;本插件
127
127
  - 文件系统:创建一个 SQLite 数据库及 WAL/SHM 辅助文件;新目录权限 `0700`,主数据库 `0600`。数据库使用 WAL、`busy_timeout`、外键、FULL synchronous 和前向 schema 版本。
128
128
  - 网络:插件不直接打开 socket;启用隔离自动 reviewer 时会调用宿主 `dsh-llm`,所选 provider route 可能使用网络。provider 的认证与传输仍由宿主拥有,本插件不直接读取其凭据。
129
129
  - 子进程:无。
130
- - 凭据:不读取或保存凭据值。审计按敏感 key/value、shell `command`、授权头、token、password、path/cwd 做脱敏,资源 id 仅保存 SHA-256。自动 reviewer 输入只要需要任何 secret 脱敏就失去自动放行资格并转人工。
130
+ - 凭据:运行时的 Policy service 不读取或保存凭据值。审计按敏感 key/value、shell `command`、授权头、token、password、path/cwd 做脱敏,资源 id 仅保存 SHA-256。自动 reviewer 输入只要需要任何 secret 脱敏就失去自动放行资格并转人工。包另附带两个安装期 CLI(`dsh-permission-setup`、`dsh-model-setup`),仅供安装器/部署者手动调用,不在 Cordis 运行时加载:`dsh-permission-setup` 只原子改写 `settings.yaml` 的 `permission.defaultPreset`;`dsh-model-setup` 原子写入 `agent-default-model`(自定义网关另写 `llm-pi-ai.providers.<route>`),并在显式 `--store-key` 时把仅从环境变量读取的 API Key 原子写入 `$DSH_HOME/.credentials.yaml`(`0600`,目录 `0700`),密钥绝不作为命令行参数、缺失时 fail-closed。`dsh-model-setup` 还支持 agent route(如 `traex-agent`):这类 route 不涉及 API Key,`--enable-in-profile <profile>` 只在该 profile 的 `cordis.patch.yml` 原子改写对应 provider 行的 `enabled`(保留其它行/注释/`!!js`),非 YAML 序列的 patch 会 fail-closed 而非被覆盖。
131
131
  - 浏览器:无。
132
- - 安装脚本:无。
132
+ - 安装脚本:无 npm 生命周期脚本;上述 CLI 仅在被显式调用时运行。
133
133
 
134
134
  审批展示预算由包根的 frozen `APPROVAL_DISPLAY_BUDGET` 统一公开:Delivery 默认文本上限 64 KiB,summary 最多 120 UTF-8 bytes,diff 最多 60 KiB,预留 4 KiB 给渠道渲染。原始 diff 只在 routed dispatch 仍为 pending 时存在;成功 enqueue、批准、拒绝或过期都会在同一状态事务中清除,v2→v3 迁移也会清除无路由、已 enqueue 和终态记录的遗留原文。业务域仍不得把 credential、token 或其他秘密写进 diff。`proposalMaintenanceIntervalMs` 默认每 15 秒有界地过期 stale proposal,设为 `0` 可关闭,最大值为 `2147483647`。审计是 append-only;当前版本不会自动删除记录,部署者应根据自己的隐私与合规周期备份或轮换整个数据库。SQLite 提供单机多连接并发安全,不承诺多主机共享文件系统上的一致性。
135
135
 
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { runModelSetup } from '../lib/model-setup.js'
4
+
5
+ void runModelSetup().catch(error => {
6
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`)
7
+ process.exitCode = 1
8
+ })
@@ -0,0 +1,65 @@
1
+ export type ModelApiProtocol = 'openai-completions' | 'openai-responses' | 'anthropic-messages';
2
+ export interface ModelSetupArgs {
3
+ dshHome: string;
4
+ provider: string;
5
+ model: string;
6
+ apiKeyEnv: string;
7
+ baseURL?: string;
8
+ api?: ModelApiProtocol;
9
+ displayName?: string;
10
+ storeKey: boolean;
11
+ keyEnvVar: string;
12
+ enableInProfile?: string;
13
+ help: boolean;
14
+ }
15
+ export interface ResolvedModelSetup {
16
+ dshHome: string;
17
+ provider: string;
18
+ model: string;
19
+ apiKeyEnv: string;
20
+ kind: 'deepseek' | 'gateway' | 'agent';
21
+ custom?: {
22
+ baseURL: string;
23
+ api: ModelApiProtocol;
24
+ displayName?: string;
25
+ };
26
+ agent?: {
27
+ rowId: string;
28
+ packageName: string;
29
+ requiredConfig: {
30
+ key: string;
31
+ value: string;
32
+ jsExpression: boolean;
33
+ }[];
34
+ };
35
+ storeKey: boolean;
36
+ keyEnvVar: string;
37
+ enableInProfile?: string;
38
+ }
39
+ export interface ModelSetupResult {
40
+ settingsPath: string;
41
+ credentialsPath?: string;
42
+ profilePatchPath?: string;
43
+ }
44
+ export declare const DEEPSEEK_OFFICIAL_ROUTE = "deepseek-official";
45
+ export declare const DEFAULT_DEEPSEEK_MODEL = "deepseek-v4-flash";
46
+ export declare const DEFAULT_CUSTOM_API: ModelApiProtocol;
47
+ export declare const DEFAULT_KEY_ENV_VAR = "DSH_ENHANCED_MODEL_API_KEY";
48
+ export interface AgentRouteDefinition {
49
+ model: string;
50
+ rowId: string;
51
+ packageName: string;
52
+ requiredConfig: {
53
+ key: string;
54
+ value: string;
55
+ jsExpression: boolean;
56
+ }[];
57
+ }
58
+ export declare const AGENT_ROUTES: Readonly<Record<string, AgentRouteDefinition>>;
59
+ export declare function deriveApiKeyEnv(provider: string): string;
60
+ export declare function parseModelSetupArgs(argv: readonly string[]): ModelSetupArgs;
61
+ export declare function resolveModelSetup(args: ModelSetupArgs): ResolvedModelSetup;
62
+ export declare function applyModelSetup(resolved: ResolvedModelSetup): Promise<ModelSetupResult>;
63
+ export declare function modelSetupUsage(): string;
64
+ export declare function runModelSetup(argv?: string[]): Promise<void>;
65
+ //# sourceMappingURL=model-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-setup.d.ts","sourceRoot":"","sources":["../src/model-setup.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,GAAG,kBAAkB,GAAG,oBAAoB,CAAA;AAE/F,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,gBAAgB,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAAA;IACtC,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,MAAM,CAAA;QACf,GAAG,EAAE,gBAAgB,CAAA;QACrB,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;IACD,KAAK,CAAC,EAAE;QACN,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,OAAO,CAAA;SAAE,EAAE,CAAA;KACxE,CAAA;IACD,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,eAAO,MAAM,uBAAuB,sBAAsB,CAAA;AAC1D,eAAO,MAAM,sBAAsB,sBAAsB,CAAA;AACzD,eAAO,MAAM,kBAAkB,EAAE,gBAAuC,CAAA;AACxE,eAAO,MAAM,mBAAmB,+BAA+B,CAAA;AAM/D,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,EAAE,CAAA;CACxE;AAED,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAOtE,CAAA;AAiBF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,CAgC3E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,kBAAkB,CAgF1E;AAkJD,wBAAsB,eAAe,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkB7F;AAED,wBAAgB,eAAe,IAAI,MAAM,CAoBxC;AAED,wBAAsB,aAAa,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC/E"}
@@ -0,0 +1,364 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { chmod, mkdir, readFile, rename, writeFile } from 'node:fs/promises';
3
+ import { isAbsolute, join } from 'node:path';
4
+ import { isMap, isSeq, parseDocument, Scalar, YAMLSeq } from 'yaml';
5
+ export const DEEPSEEK_OFFICIAL_ROUTE = 'deepseek-official';
6
+ export const DEFAULT_DEEPSEEK_MODEL = 'deepseek-v4-flash';
7
+ export const DEFAULT_CUSTOM_API = 'openai-completions';
8
+ export const DEFAULT_KEY_ENV_VAR = 'DSH_ENHANCED_MODEL_API_KEY';
9
+ export const AGENT_ROUTES = Object.freeze({
10
+ 'traex-agent': {
11
+ model: 'default',
12
+ rowId: 'dsh-enhanced-traex-acp-provider',
13
+ packageName: '@dsh-enhanced/traex-acp-provider',
14
+ requiredConfig: [{ key: 'cwd', value: "dshHomePath('assistant-workspace')", jsExpression: true }],
15
+ },
16
+ });
17
+ const allowedApis = new Set(['openai-completions', 'openai-responses', 'anthropic-messages']);
18
+ // A provider route is a config key; keep it a conservative kebab/snake token.
19
+ const routePattern = /^[A-Za-z][A-Za-z0-9._-]*$/u;
20
+ // A credential reference and the source env var must be POSIX shell identifiers,
21
+ // matching what dsh-credentials-local accepts as a stored key.
22
+ const posixIdentifierPattern = /^[A-Za-z_][A-Za-z0-9_]*$/u;
23
+ // A DSH profile name, matching the installer's own profile validation.
24
+ const profileNamePattern = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
25
+ function argumentValue(argv, index, option) {
26
+ const value = argv[index + 1];
27
+ if (value === undefined || value.startsWith('--'))
28
+ throw new Error(`assistant-policy model setup: ${option} requires a value`);
29
+ return value;
30
+ }
31
+ export function deriveApiKeyEnv(provider) {
32
+ if (provider === DEEPSEEK_OFFICIAL_ROUTE)
33
+ return 'DEEPSEEK_API_KEY';
34
+ let identifier = provider.toUpperCase().replace(/[^A-Z0-9]/gu, '_');
35
+ if (!/^[A-Z_]/u.test(identifier))
36
+ identifier = `_${identifier}`;
37
+ return identifier.endsWith('_API_KEY') ? identifier : `${identifier}_API_KEY`;
38
+ }
39
+ export function parseModelSetupArgs(argv) {
40
+ const result = {
41
+ dshHome: process.env.DSH_HOME ?? join(process.env.HOME ?? '', '.dsh'),
42
+ provider: DEEPSEEK_OFFICIAL_ROUTE,
43
+ model: '',
44
+ apiKeyEnv: '',
45
+ storeKey: false,
46
+ keyEnvVar: DEFAULT_KEY_ENV_VAR,
47
+ help: false,
48
+ };
49
+ for (let index = 0; index < argv.length; index += 1) {
50
+ const option = argv[index];
51
+ if (option === '--help' || option === '-h') {
52
+ result.help = true;
53
+ continue;
54
+ }
55
+ if (option === '--store-key') {
56
+ result.storeKey = true;
57
+ continue;
58
+ }
59
+ if (option === '--dsh-home')
60
+ result.dshHome = argumentValue(argv, index++, option);
61
+ else if (option === '--provider')
62
+ result.provider = argumentValue(argv, index++, option);
63
+ else if (option === '--model')
64
+ result.model = argumentValue(argv, index++, option);
65
+ else if (option === '--api-key-env')
66
+ result.apiKeyEnv = argumentValue(argv, index++, option);
67
+ else if (option === '--base-url')
68
+ result.baseURL = argumentValue(argv, index++, option);
69
+ else if (option === '--api')
70
+ result.api = argumentValue(argv, index++, option);
71
+ else if (option === '--display-name')
72
+ result.displayName = argumentValue(argv, index++, option);
73
+ else if (option === '--key-env-var')
74
+ result.keyEnvVar = argumentValue(argv, index++, option);
75
+ else if (option === '--enable-in-profile')
76
+ result.enableInProfile = argumentValue(argv, index++, option);
77
+ else
78
+ throw new Error(`assistant-policy model setup: unknown option: ${option}`);
79
+ }
80
+ return result;
81
+ }
82
+ export function resolveModelSetup(args) {
83
+ if (!isAbsolute(args.dshHome))
84
+ throw new Error('assistant-policy model setup: DSH home must be an absolute path');
85
+ if (!routePattern.test(args.provider)) {
86
+ throw new Error('assistant-policy model setup: provider route must start with a letter and use letters, digits, dot, dash, or underscore');
87
+ }
88
+ if (args.api !== undefined && !allowedApis.has(args.api)) {
89
+ throw new Error('assistant-policy model setup: api must be openai-completions, openai-responses, or anthropic-messages');
90
+ }
91
+ if (args.enableInProfile !== undefined && !profileNamePattern.test(args.enableInProfile)) {
92
+ throw new Error('assistant-policy model setup: --enable-in-profile must be a valid profile name');
93
+ }
94
+ const apiKeyEnv = args.apiKeyEnv.length > 0 ? args.apiKeyEnv : deriveApiKeyEnv(args.provider);
95
+ if (!posixIdentifierPattern.test(apiKeyEnv)) {
96
+ throw new Error('assistant-policy model setup: --api-key-env must be a POSIX shell identifier');
97
+ }
98
+ if (!posixIdentifierPattern.test(args.keyEnvVar)) {
99
+ throw new Error('assistant-policy model setup: --key-env-var must be a POSIX shell identifier');
100
+ }
101
+ const agentRoute = AGENT_ROUTES[args.provider];
102
+ if (agentRoute !== undefined) {
103
+ // An agent route carries no API key and no gateway transport: it is a local
104
+ // ACP provider whose credentials and endpoint belong to the coding agent.
105
+ if (args.baseURL !== undefined || args.api !== undefined || args.displayName !== undefined) {
106
+ throw new Error(`assistant-policy model setup: --base-url/--api/--display-name do not apply to the agent route ${args.provider}`);
107
+ }
108
+ if (args.storeKey) {
109
+ throw new Error(`assistant-policy model setup: --store-key does not apply to the agent route ${args.provider}; its credentials belong to the local agent`);
110
+ }
111
+ return {
112
+ dshHome: args.dshHome,
113
+ provider: args.provider,
114
+ model: args.model.length > 0 ? args.model : agentRoute.model,
115
+ apiKeyEnv,
116
+ kind: 'agent',
117
+ agent: { rowId: agentRoute.rowId, packageName: agentRoute.packageName, requiredConfig: agentRoute.requiredConfig },
118
+ storeKey: false,
119
+ keyEnvVar: args.keyEnvVar,
120
+ ...(args.enableInProfile !== undefined ? { enableInProfile: args.enableInProfile } : {}),
121
+ };
122
+ }
123
+ if (args.enableInProfile !== undefined) {
124
+ throw new Error('assistant-policy model setup: --enable-in-profile only applies to an agent route');
125
+ }
126
+ const base = {
127
+ dshHome: args.dshHome,
128
+ provider: args.provider,
129
+ apiKeyEnv,
130
+ storeKey: args.storeKey,
131
+ keyEnvVar: args.keyEnvVar,
132
+ };
133
+ if (args.provider === DEEPSEEK_OFFICIAL_ROUTE) {
134
+ // The built-in deepseek-official route is served by dsh-llm-deepseek, not by
135
+ // the pi-ai gateway, so transport fields have no place here. Reject them
136
+ // instead of writing a provider block that the route would never read.
137
+ if (args.baseURL !== undefined || args.api !== undefined || args.displayName !== undefined) {
138
+ throw new Error('assistant-policy model setup: --base-url/--api/--display-name only apply to a custom gateway route, not deepseek-official');
139
+ }
140
+ return { ...base, kind: 'deepseek', model: args.model.length > 0 ? args.model : DEFAULT_DEEPSEEK_MODEL };
141
+ }
142
+ if (args.model.length === 0) {
143
+ throw new Error('assistant-policy model setup: a custom gateway route requires --model');
144
+ }
145
+ if (args.baseURL === undefined || !/^https?:\/\//u.test(args.baseURL)) {
146
+ throw new Error('assistant-policy model setup: a custom gateway route requires --base-url starting with http:// or https://');
147
+ }
148
+ return {
149
+ ...base,
150
+ kind: 'gateway',
151
+ model: args.model,
152
+ custom: {
153
+ baseURL: args.baseURL,
154
+ api: args.api ?? DEFAULT_CUSTOM_API,
155
+ ...(args.displayName !== undefined ? { displayName: args.displayName } : {}),
156
+ },
157
+ };
158
+ }
159
+ function resolveSecret(resolved) {
160
+ const candidate = process.env[resolved.keyEnvVar] ?? process.env[resolved.apiKeyEnv];
161
+ if (candidate === undefined || candidate.trim().length === 0) {
162
+ throw new Error(`assistant-policy model setup: no API key found; export ${resolved.keyEnvVar} `
163
+ + `(or ${resolved.apiKeyEnv}) before requesting key storage. The key is never passed as an argument.`);
164
+ }
165
+ return candidate;
166
+ }
167
+ async function atomicWriteYaml(path, serialized) {
168
+ const temporaryPath = `${path}.${randomUUID()}.tmp`;
169
+ await writeFile(temporaryPath, serialized, { encoding: 'utf8', mode: 0o600 });
170
+ await chmod(temporaryPath, 0o600);
171
+ await rename(temporaryPath, path);
172
+ }
173
+ async function loadMappingDocument(path, description) {
174
+ let source = '';
175
+ try {
176
+ source = await readFile(path, 'utf8');
177
+ }
178
+ catch (error) {
179
+ if (!(error instanceof Error) || !('code' in error) || error.code !== 'ENOENT')
180
+ throw error;
181
+ }
182
+ const document = parseDocument(source.length === 0 ? '{}' : source);
183
+ if (document.errors.length > 0) {
184
+ throw new Error(`assistant-policy model setup: ${description} is invalid YAML: ${document.errors[0]?.message}`);
185
+ }
186
+ if (!isMap(document.contents)) {
187
+ throw new Error(`assistant-policy model setup: ${description} must contain a YAML mapping`);
188
+ }
189
+ // An absent file is parsed from '{}', which yields a flow-style root map that
190
+ // serializes to a single `{ a: { b: c } }` line. Downstream block-style
191
+ // readers (the installer's awk agent-default-model parser) expect the key on
192
+ // its own line, so force block style. Nested maps created via setIn default
193
+ // to block style already; this only fixes the root of a freshly created file.
194
+ if (document.contents.flow) {
195
+ document.contents.flow = false;
196
+ }
197
+ return document;
198
+ }
199
+ function jsScalar(value) {
200
+ const scalar = new Scalar(value);
201
+ scalar.tag = '!!js';
202
+ scalar.type = Scalar.PLAIN;
203
+ return scalar;
204
+ }
205
+ async function writeCredential(dshHome, apiKeyEnv, secret) {
206
+ const credentialsPath = join(dshHome, '.credentials.yaml');
207
+ const document = await loadMappingDocument(credentialsPath, '.credentials.yaml');
208
+ document.set(apiKeyEnv, secret);
209
+ await mkdir(dshHome, { recursive: true });
210
+ await atomicWriteYaml(credentialsPath, document.toString({ lineWidth: 0 }));
211
+ return credentialsPath;
212
+ }
213
+ async function writeSettings(resolved) {
214
+ const settingsPath = join(resolved.dshHome, 'settings.yaml');
215
+ const document = await loadMappingDocument(settingsPath, 'settings.yaml');
216
+ const agentDefault = document.get('agent-default-model', true);
217
+ if (agentDefault !== undefined && !isMap(agentDefault)) {
218
+ throw new Error('assistant-policy model setup: settings.agent-default-model must be a YAML mapping');
219
+ }
220
+ document.setIn(['agent-default-model', 'provider'], resolved.provider);
221
+ document.setIn(['agent-default-model', 'model'], resolved.model);
222
+ if (resolved.custom !== undefined) {
223
+ const piAi = document.get('llm-pi-ai', true);
224
+ if (piAi !== undefined && !isMap(piAi)) {
225
+ throw new Error('assistant-policy model setup: settings.llm-pi-ai must be a YAML mapping');
226
+ }
227
+ const base = ['llm-pi-ai', 'providers', resolved.provider];
228
+ if (resolved.custom.displayName !== undefined) {
229
+ document.setIn([...base, 'displayName'], resolved.custom.displayName);
230
+ }
231
+ document.setIn([...base, 'apiKeyEnv'], resolved.apiKeyEnv);
232
+ document.setIn([...base, 'api'], resolved.custom.api);
233
+ document.setIn([...base, 'baseURL'], resolved.custom.baseURL);
234
+ document.setIn([...base, 'models'], [{ id: resolved.model, name: resolved.model }]);
235
+ }
236
+ await mkdir(resolved.dshHome, { recursive: true });
237
+ await atomicWriteYaml(settingsPath, document.toString({ lineWidth: 0 }));
238
+ return settingsPath;
239
+ }
240
+ // Flip an agent route's bundle row to enabled:true in the profile's user patch
241
+ // layer, preserving every other row, comment, and !!js expression. The patch
242
+ // layer is a top-level YAML sequence; a fresh profile may be comment-only (null
243
+ // contents), which we upgrade to an empty sequence. Any other shape fails
244
+ // closed rather than clobbering an unrecognised document.
245
+ async function enableAgentRouteInProfile(resolved) {
246
+ const agent = resolved.agent;
247
+ const patchPath = join(resolved.dshHome, 'profiles', resolved.enableInProfile, 'cordis.patch.yml');
248
+ let source = '';
249
+ try {
250
+ source = await readFile(patchPath, 'utf8');
251
+ }
252
+ catch (error) {
253
+ if (!(error instanceof Error) || !('code' in error) || error.code !== 'ENOENT')
254
+ throw error;
255
+ }
256
+ const document = parseDocument(source.length === 0 ? '' : source);
257
+ if (document.errors.length > 0) {
258
+ throw new Error(`assistant-policy model setup: profile patch is invalid YAML: ${document.errors[0]?.message}`);
259
+ }
260
+ if (document.contents === null) {
261
+ document.contents = new YAMLSeq();
262
+ }
263
+ else if (!isSeq(document.contents)) {
264
+ throw new Error('assistant-policy model setup: profile patch must be a top-level YAML sequence of loader entries');
265
+ }
266
+ const sequence = document.contents;
267
+ const existing = sequence.items.find(item => isMap(item) && item.get('id') === agent.rowId);
268
+ if (existing === undefined) {
269
+ const created = document.createNode({ id: agent.rowId });
270
+ const config = document.createNode({ enabled: true });
271
+ for (const field of agent.requiredConfig) {
272
+ config.set(field.key, field.jsExpression ? jsScalar(field.value) : field.value);
273
+ }
274
+ created.set('config', config);
275
+ sequence.add(created);
276
+ }
277
+ else {
278
+ const currentConfig = existing.get('config', true);
279
+ if (currentConfig === undefined || !isMap(currentConfig)) {
280
+ existing.set('config', document.createNode({}));
281
+ }
282
+ existing.setIn(['config', 'enabled'], true);
283
+ // Re-add required non-defaulted config only when the row is missing it, so
284
+ // we never overwrite an operator's explicit override.
285
+ for (const field of agent.requiredConfig) {
286
+ if (existing.getIn(['config', field.key]) === undefined) {
287
+ existing.setIn(['config', field.key], field.jsExpression ? jsScalar(field.value) : field.value);
288
+ }
289
+ }
290
+ }
291
+ await mkdir(join(resolved.dshHome, 'profiles', resolved.enableInProfile), { recursive: true });
292
+ await atomicWriteYaml(patchPath, document.toString({ lineWidth: 0 }));
293
+ return patchPath;
294
+ }
295
+ export async function applyModelSetup(resolved) {
296
+ // Resolve (and fail on) a missing secret before touching any file, so a
297
+ // stored-key request never leaves settings pointing at an unconfigured route.
298
+ let credentialsPath;
299
+ if (resolved.storeKey) {
300
+ const secret = resolveSecret(resolved);
301
+ credentialsPath = await writeCredential(resolved.dshHome, resolved.apiKeyEnv, secret);
302
+ }
303
+ const settingsPath = await writeSettings(resolved);
304
+ let profilePatchPath;
305
+ if (resolved.kind === 'agent' && resolved.enableInProfile !== undefined) {
306
+ profilePatchPath = await enableAgentRouteInProfile(resolved);
307
+ }
308
+ return {
309
+ settingsPath,
310
+ ...(credentialsPath !== undefined ? { credentialsPath } : {}),
311
+ ...(profilePatchPath !== undefined ? { profilePatchPath } : {}),
312
+ };
313
+ }
314
+ export function modelSetupUsage() {
315
+ return [
316
+ 'Usage: dsh-model-setup [--dsh-home <absolute-path>] [--provider <route>] [--model <id>]',
317
+ ' [--api-key-env <VAR>] [--store-key] [--key-env-var <VAR>]',
318
+ ' [--base-url <url>] [--api <openai-completions|openai-responses|anthropic-messages>]',
319
+ ' [--display-name <name>] [--enable-in-profile <profile>]',
320
+ '',
321
+ 'Writes the deployment default model into DSH settings.yaml (section agent-default-model),',
322
+ 'and, for a custom gateway route, its provider profile under section llm-pi-ai.',
323
+ 'With --store-key it also persists the API key into $DSH_HOME/.credentials.yaml (0600).',
324
+ '',
325
+ `Agent routes (${Object.keys(AGENT_ROUTES).join(', ')}) carry no API key; they are backed by a local coding`,
326
+ 'agent. Pass --enable-in-profile <profile> to flip the route bundle row to enabled:true in that',
327
+ "profile's patch layer.",
328
+ '',
329
+ `The key value is read only from the environment variable named by --key-env-var (default ${DEFAULT_KEY_ENV_VAR})`,
330
+ 'or the credential reference; it is never accepted as a command-line argument.',
331
+ '',
332
+ `Default provider is ${DEEPSEEK_OFFICIAL_ROUTE} with model ${DEFAULT_DEEPSEEK_MODEL}; a custom route requires --model and --base-url.`,
333
+ ].join('\n');
334
+ }
335
+ export async function runModelSetup(argv = process.argv.slice(2)) {
336
+ const args = parseModelSetupArgs(argv);
337
+ if (args.help) {
338
+ process.stdout.write(`${modelSetupUsage()}\n`);
339
+ return;
340
+ }
341
+ const resolved = resolveModelSetup(args);
342
+ const result = await applyModelSetup(resolved);
343
+ process.stdout.write(`Updated ${result.settingsPath}: agent-default-model provider=${resolved.provider} model=${resolved.model}\n`);
344
+ if (resolved.custom !== undefined) {
345
+ process.stdout.write(`Configured llm-pi-ai route ${resolved.provider}: api=${resolved.custom.api} baseURL=${resolved.custom.baseURL} apiKeyEnv=${resolved.apiKeyEnv}\n`);
346
+ }
347
+ if (resolved.kind === 'agent') {
348
+ if (result.profilePatchPath !== undefined) {
349
+ process.stdout.write(`Enabled agent route ${resolved.provider} (${resolved.agent.rowId}) in ${result.profilePatchPath}\n`);
350
+ }
351
+ else {
352
+ process.stdout.write(`Set agent route ${resolved.provider} as the default model; enable ${resolved.agent.packageName} in the profile `
353
+ + '(add the bundle and set enabled: true, e.g. via --enable-in-profile) before it can serve requests.\n');
354
+ }
355
+ return;
356
+ }
357
+ if (result.credentialsPath !== undefined) {
358
+ process.stdout.write(`Stored API key ${resolved.apiKeyEnv} in ${result.credentialsPath} (value not shown)\n`);
359
+ }
360
+ else {
361
+ process.stdout.write(`API key not stored; ensure the credential reference ${resolved.apiKeyEnv} resolves at runtime (environment or .credentials.yaml).\n`);
362
+ }
363
+ }
364
+ //# sourceMappingURL=model-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-setup.js","sourceRoot":"","sources":["../src/model-setup.ts"],"names":[],"mappings":"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"}
package/lib/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const version = "0.1.12";
1
+ export declare const version = "0.1.14";
2
2
  //# sourceMappingURL=version.d.ts.map
package/lib/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const version = '0.1.12';
1
+ export const version = '0.1.14';
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "@dsh-enhanced/assistant-policy",
3
- "version": "0.1.12",
3
+ "version": "0.1.14",
4
4
  "description": "A DeepSeek Harness plugin for Assistant Policy.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "main": "./lib/index.js",
8
8
  "types": "./lib/index.d.ts",
9
9
  "bin": {
10
- "dsh-permission-setup": "./bin/dsh-permission-setup.js"
10
+ "dsh-permission-setup": "./bin/dsh-permission-setup.js",
11
+ "dsh-model-setup": "./bin/dsh-model-setup.js"
11
12
  },
12
13
  "exports": {
13
14
  ".": {
@@ -19,6 +20,10 @@
19
20
  "types": "./lib/permission-setup.d.ts",
20
21
  "default": "./lib/permission-setup.js"
21
22
  },
23
+ "./model-setup": {
24
+ "types": "./lib/model-setup.d.ts",
25
+ "default": "./lib/model-setup.js"
26
+ },
22
27
  "./package.json": "./package.json"
23
28
  },
24
29
  "files": [