dsh-env-manager-plugin 0.0.0-stage → 0.1.1

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.
Files changed (149) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +273 -3
  3. package/client.js +2581 -0
  4. package/cordis.patch.yml +4 -0
  5. package/docs/00-project/current-state.md +272 -0
  6. package/docs/00-project/glossary.md +215 -0
  7. package/docs/00-project/project-brief.md +114 -0
  8. package/docs/00-project/roadmap.md +89 -0
  9. package/docs/01-architecture/DSH_Environment_Service_Memory_Skill_Brainstorm.md +493 -0
  10. package/docs/01-architecture/api-verification.md +416 -0
  11. package/docs/01-architecture/architecture-overview.md +222 -0
  12. package/docs/01-architecture/data-model.md +930 -0
  13. package/docs/01-architecture/decisions/ADR-0001-plugin-as-bundle.md +29 -0
  14. package/docs/01-architecture/decisions/ADR-0002-file-based-storage.md +25 -0
  15. package/docs/01-architecture/decisions/ADR-0003-skill-router-over-search.md +25 -0
  16. package/docs/01-architecture/decisions/ADR-0004-typescript-host-js-client.md +31 -0
  17. package/docs/01-architecture/decisions/ADR-0005-layered-rule-resolution.md +36 -0
  18. package/docs/01-architecture/decisions/ADR-0006-credentials-as-references.md +30 -0
  19. package/docs/01-architecture/decisions/ADR-0007-session-scoped-default-environment.md +28 -0
  20. package/docs/01-architecture/decisions/ADR-0008-memory-bridge-not-second-store.md +31 -0
  21. package/docs/01-architecture/decisions/ADR-0009-client-host-http-transport.md +87 -0
  22. package/docs/01-architecture/decisions/ADR-0010-environment-plane-model.md +87 -0
  23. package/docs/01-architecture/decisions/ADR-0011-k8s-node-execution-model.md +92 -0
  24. package/docs/01-architecture/design.md +666 -0
  25. package/docs/01-architecture/detailed-design.md +961 -0
  26. package/docs/01-architecture/implementation-plan.md +323 -0
  27. package/docs/01-architecture/module-boundaries.md +306 -0
  28. package/docs/01-architecture/security-model.md +227 -0
  29. package/docs/01-architecture/storage-contract.md +224 -0
  30. package/docs/01-architecture/tool-contract.md +438 -0
  31. package/docs/01-architecture/ui-design.md +587 -0
  32. package/docs/02-harness/agent-behavior.md +36 -0
  33. package/docs/02-harness/change-snapshot-policy.md +29 -0
  34. package/docs/02-harness/client-ui-integration.md +110 -0
  35. package/docs/02-harness/context-policy.md +43 -0
  36. package/docs/02-harness/harness-standard.md +91 -0
  37. package/docs/02-harness/task-execution-policy.md +26 -0
  38. package/docs/02-harness/verification-policy.md +97 -0
  39. package/docs/03-openspec/archive-rule.md +25 -0
  40. package/docs/03-openspec/bugfix-rule.md +30 -0
  41. package/docs/03-openspec/design-rule.md +33 -0
  42. package/docs/03-openspec/openspec-usage-guide.md +31 -0
  43. package/docs/03-openspec/proposal-rule.md +70 -0
  44. package/docs/03-openspec/spec-rule.md +33 -0
  45. package/docs/03-openspec/tasks-rule.md +31 -0
  46. package/docs/04-development/coding-style.md +67 -0
  47. package/docs/04-development/dependency-policy.md +43 -0
  48. package/docs/04-development/development-guide.md +85 -0
  49. package/docs/04-development/directory-convention.md +105 -0
  50. package/docs/04-development/local-run-guide.md +61 -0
  51. package/docs/04-development/testing-guide.md +102 -0
  52. package/docs/05-domain/deployment-template.md +76 -0
  53. package/docs/05-domain/environment-template.md +165 -0
  54. package/docs/05-domain/operation-binding-template.md +55 -0
  55. package/docs/05-domain/operation-record-template.md +55 -0
  56. package/docs/05-domain/prompt-template.md +90 -0
  57. package/docs/05-domain/rule-template.md +73 -0
  58. package/docs/05-domain/service-template.md +39 -0
  59. package/docs/06-operations/deployment-guide.md +54 -0
  60. package/docs/06-operations/release.md +198 -0
  61. package/docs/06-operations/security-policy.md +53 -0
  62. package/docs/06-operations/troubleshooting.md +141 -0
  63. package/docs/07-templates/adr-template.md +21 -0
  64. package/docs/07-templates/bugfix-template.md +11 -0
  65. package/docs/07-templates/case-template.md +15 -0
  66. package/docs/07-templates/design-template.md +29 -0
  67. package/docs/07-templates/proposal-template.md +19 -0
  68. package/docs/07-templates/spec-template.md +15 -0
  69. package/docs/07-templates/tasks-template.md +12 -0
  70. package/docs/99-archive/README.md +13 -0
  71. package/docs/README.md +142 -0
  72. package/icon.svg +4 -0
  73. package/index.js +31 -0
  74. package/lib/app/app.d.ts +67 -0
  75. package/lib/app/app.js +494 -0
  76. package/lib/app/app.js.map +1 -0
  77. package/lib/config.d.ts +55 -0
  78. package/lib/config.js +42 -0
  79. package/lib/config.js.map +1 -0
  80. package/lib/domain/constants.d.ts +21 -0
  81. package/lib/domain/constants.js +59 -0
  82. package/lib/domain/constants.js.map +1 -0
  83. package/lib/domain/errors.d.ts +20 -0
  84. package/lib/domain/errors.js +22 -0
  85. package/lib/domain/errors.js.map +1 -0
  86. package/lib/domain/schemas.d.ts +28 -0
  87. package/lib/domain/schemas.js +445 -0
  88. package/lib/domain/schemas.js.map +1 -0
  89. package/lib/domain/types.d.ts +412 -0
  90. package/lib/domain/types.js +2 -0
  91. package/lib/domain/types.js.map +1 -0
  92. package/lib/index.d.ts +18 -0
  93. package/lib/index.js +89 -0
  94. package/lib/index.js.map +1 -0
  95. package/lib/logger.d.ts +8 -0
  96. package/lib/logger.js +13 -0
  97. package/lib/logger.js.map +1 -0
  98. package/lib/memory/bridge.d.ts +18 -0
  99. package/lib/memory/bridge.js +13 -0
  100. package/lib/memory/bridge.js.map +1 -0
  101. package/lib/registry/integrity.d.ts +10 -0
  102. package/lib/registry/integrity.js +204 -0
  103. package/lib/registry/integrity.js.map +1 -0
  104. package/lib/registry/registry.d.ts +14 -0
  105. package/lib/registry/registry.js +182 -0
  106. package/lib/registry/registry.js.map +1 -0
  107. package/lib/resolver/merge.d.ts +23 -0
  108. package/lib/resolver/merge.js +90 -0
  109. package/lib/resolver/merge.js.map +1 -0
  110. package/lib/resolver/resolve.d.ts +18 -0
  111. package/lib/resolver/resolve.js +288 -0
  112. package/lib/resolver/resolve.js.map +1 -0
  113. package/lib/resolver/template.d.ts +10 -0
  114. package/lib/resolver/template.js +42 -0
  115. package/lib/resolver/template.js.map +1 -0
  116. package/lib/router/params.d.ts +3 -0
  117. package/lib/router/params.js +83 -0
  118. package/lib/router/params.js.map +1 -0
  119. package/lib/router/router.d.ts +11 -0
  120. package/lib/router/router.js +204 -0
  121. package/lib/router/router.js.map +1 -0
  122. package/lib/session/session.d.ts +16 -0
  123. package/lib/session/session.js +64 -0
  124. package/lib/session/session.js.map +1 -0
  125. package/lib/skill.d.ts +17 -0
  126. package/lib/skill.js +56 -0
  127. package/lib/skill.js.map +1 -0
  128. package/lib/storage/atomic.d.ts +10 -0
  129. package/lib/storage/atomic.js +107 -0
  130. package/lib/storage/atomic.js.map +1 -0
  131. package/lib/storage/paths.d.ts +10 -0
  132. package/lib/storage/paths.js +50 -0
  133. package/lib/storage/paths.js.map +1 -0
  134. package/lib/storage/records.d.ts +16 -0
  135. package/lib/storage/records.js +112 -0
  136. package/lib/storage/records.js.map +1 -0
  137. package/lib/storage/sessions.d.ts +17 -0
  138. package/lib/storage/sessions.js +65 -0
  139. package/lib/storage/sessions.js.map +1 -0
  140. package/lib/tools/tools.d.ts +14 -0
  141. package/lib/tools/tools.js +472 -0
  142. package/lib/tools/tools.js.map +1 -0
  143. package/lib/transport/http.d.ts +3 -0
  144. package/lib/transport/http.js +217 -0
  145. package/lib/transport/http.js.map +1 -0
  146. package/locale/en.json +6 -0
  147. package/locale/zh.json +6 -0
  148. package/package.json +101 -6
  149. package/scripts/repair-profile.mjs +141 -0
package/lib/app/app.js ADDED
@@ -0,0 +1,494 @@
1
+ import { EnvManagerError } from '../domain/errors.js';
2
+ import { LIMITS, isRecordKind } from '../domain/constants.js';
3
+ import { parseRecord, parseRecordInput, withTimestamps } from '../domain/schemas.js';
4
+ import { RegistryLoader, lookup, lookupByRef } from '../registry/registry.js';
5
+ import { findReferences } from '../registry/integrity.js';
6
+ import { resolveContext } from '../resolver/resolve.js';
7
+ import { resolveOperation } from '../router/router.js';
8
+ import { SessionStore } from '../session/session.js';
9
+ import { parseYamlText, stringifyRecord } from '../storage/records.js';
10
+ import { deleteRecordFile, readRecordRaw, writeRecordFile } from '../storage/records.js';
11
+ import { ensureLayout } from '../storage/atomic.js';
12
+ export const VERSION = '0.1.0';
13
+ function notFoundCode(kind) {
14
+ switch (kind) {
15
+ case 'environment':
16
+ return 'ENV_NOT_FOUND';
17
+ case 'service':
18
+ return 'SERVICE_NOT_FOUND';
19
+ case 'deployment':
20
+ return 'DEPLOYMENT_NOT_FOUND';
21
+ case 'ruleProfile':
22
+ return 'RULE_PROFILE_NOT_FOUND';
23
+ case 'operationBinding':
24
+ return 'BINDING_NOT_FOUND';
25
+ }
26
+ }
27
+ function recordName(record) {
28
+ const named = record;
29
+ if (named.name)
30
+ return named.name;
31
+ return record.id;
32
+ }
33
+ function summaryOf(kind, record) {
34
+ let summary;
35
+ switch (kind) {
36
+ case 'environment': {
37
+ const env = record;
38
+ const accounts = env.hosts.reduce((total, host) => total + (host.accounts?.length ?? 0), 0);
39
+ summary = `${env.category} · ${env.hosts.length} hosts · ${accounts} accounts · ${env.loginRecords?.length ?? 0} logins`;
40
+ break;
41
+ }
42
+ case 'service': {
43
+ const service = record;
44
+ summary = `${service.category} · ${service.deployModes.join(', ')}`;
45
+ break;
46
+ }
47
+ case 'deployment': {
48
+ const deployment = record;
49
+ summary = `${deployment.environmentId}/${deployment.serviceId} · ${deployment.runtimeMode}`;
50
+ break;
51
+ }
52
+ case 'ruleProfile': {
53
+ const profile = record;
54
+ summary = `${Object.keys(profile.variables ?? {}).length} variables · ${Object.keys(profile.paths ?? {}).length} paths`;
55
+ break;
56
+ }
57
+ case 'operationBinding': {
58
+ const binding = record;
59
+ summary = `${binding.operation} → ${binding.skill.name}`;
60
+ break;
61
+ }
62
+ }
63
+ return { kind, id: record.id, name: recordName(record), summary };
64
+ }
65
+ function errorDiagnostic(code, message, details) {
66
+ return { code, severity: 'error', message, details };
67
+ }
68
+ export class App {
69
+ options;
70
+ loader;
71
+ sessions;
72
+ constructor(options) {
73
+ this.options = options;
74
+ this.loader = new RegistryLoader(options.dataDir);
75
+ this.sessions = new SessionStore(options.dataDir);
76
+ }
77
+ get dataDir() {
78
+ return this.options.dataDir;
79
+ }
80
+ async init() {
81
+ await ensureLayout(this.options.dataDir);
82
+ }
83
+ async snapshot() {
84
+ await this.init();
85
+ return this.loader.load();
86
+ }
87
+ counts(snapshot) {
88
+ return {
89
+ environments: snapshot.environments.size,
90
+ services: snapshot.services.size,
91
+ deployments: snapshot.deployments.size,
92
+ ruleProfiles: snapshot.ruleProfiles.size,
93
+ operationBindings: snapshot.operationBindings.size,
94
+ };
95
+ }
96
+ warnings(snapshot) {
97
+ return snapshot.diagnostics
98
+ .filter((item) => item.severity !== 'info')
99
+ .slice(0, LIMITS.maxWarnings);
100
+ }
101
+ async meta() {
102
+ const snapshot = await this.snapshot();
103
+ return {
104
+ dataDir: this.options.dataDir,
105
+ version: VERSION,
106
+ counts: this.counts(snapshot),
107
+ warnings: this.warnings(snapshot),
108
+ };
109
+ }
110
+ async list(kind) {
111
+ const snapshot = await this.snapshot();
112
+ const map = this.mapFor(snapshot, kind);
113
+ const items = [...map.values()]
114
+ .map((record) => summaryOf(kind, record))
115
+ .sort((a, b) => a.id.localeCompare(b.id));
116
+ return { items, warnings: this.warnings(snapshot) };
117
+ }
118
+ async get(kind, id) {
119
+ const snapshot = await this.snapshot();
120
+ const record = lookup(snapshot, kind, id);
121
+ if (!record) {
122
+ throw new EnvManagerError(notFoundCode(kind), `${kind} "${id}" was not found`, {
123
+ kind,
124
+ id,
125
+ });
126
+ }
127
+ const raw = await readRecordRaw(this.options.dataDir, kind, id);
128
+ if (!raw.found || !raw.text) {
129
+ throw new EnvManagerError('INTERNAL_ERROR', `${kind} "${id}" disappeared during read`);
130
+ }
131
+ return { record, yaml: raw.text };
132
+ }
133
+ async find(query) {
134
+ const snapshot = await this.snapshot();
135
+ const needle = query.trim().toLowerCase();
136
+ if (!needle)
137
+ return { hits: [] };
138
+ const hits = [];
139
+ for (const kind of ['environment', 'service', 'deployment', 'ruleProfile', 'operationBinding']) {
140
+ for (const record of this.mapFor(snapshot, kind).values()) {
141
+ const named = record;
142
+ let field = null;
143
+ if (record.id.toLowerCase().includes(needle))
144
+ field = 'id';
145
+ else if (named.name?.toLowerCase().includes(needle))
146
+ field = 'name';
147
+ else if (named.aliases?.some((alias) => alias.toLowerCase().includes(needle))) {
148
+ field = 'alias';
149
+ }
150
+ else if (named.category?.toLowerCase().includes(needle))
151
+ field = 'category';
152
+ if (field) {
153
+ hits.push({ kind, id: record.id, name: recordName(record), field });
154
+ }
155
+ if (hits.length >= 25)
156
+ break;
157
+ }
158
+ }
159
+ hits.sort((a, b) => a.kind.localeCompare(b.kind) || a.id.localeCompare(b.id));
160
+ return { hits };
161
+ }
162
+ async saveYaml(kind, yaml, options = {}) {
163
+ const parsed = parseYamlText(yaml, `${kind}.yaml`);
164
+ return this.save(kind, parsed, options);
165
+ }
166
+ async save(kind, raw, options = {}) {
167
+ if (!isRecordKind(kind)) {
168
+ throw new EnvManagerError('INVALID_ARGUMENT', `Unknown record kind "${kind}"`);
169
+ }
170
+ const parsed = parseRecordInput(kind, raw);
171
+ if (!parsed.ok) {
172
+ throw new EnvManagerError('RECORD_INVALID', 'Record failed validation', {
173
+ issues: parsed.issues,
174
+ });
175
+ }
176
+ const snapshot = await this.snapshot();
177
+ let previous;
178
+ try {
179
+ const rawPrevious = await readRecordRaw(this.options.dataDir, kind, parsed.record.id);
180
+ if (rawPrevious.found) {
181
+ const prior = parseRecord(kind, rawPrevious.raw);
182
+ if (prior.ok)
183
+ previous = { createdAt: prior.record.createdAt };
184
+ }
185
+ }
186
+ catch {
187
+ previous = undefined;
188
+ }
189
+ const finalized = withTimestamps(parsed.record, previous);
190
+ const checked = parseRecord(kind, finalized);
191
+ if (!checked.ok) {
192
+ throw new EnvManagerError('RECORD_INVALID', 'Record failed validation', {
193
+ issues: checked.issues,
194
+ });
195
+ }
196
+ const record = checked.record;
197
+ const created = !(await readRecordRaw(this.options.dataDir, kind, record.id)).found;
198
+ if (created && this.mapFor(snapshot, kind).size >= this.options.maxRecords) {
199
+ throw new EnvManagerError('RECORD_LIMIT_EXCEEDED', `The ${kind} registry is at its ${this.options.maxRecords}-record limit`, { kind, maxRecords: this.options.maxRecords });
200
+ }
201
+ if (options.actor === 'ui' && this.isProductionRecord(kind, record, snapshot)) {
202
+ if (!this.options.writePolicy.allowUiProductionWrites) {
203
+ throw new EnvManagerError('FORBIDDEN', 'The panel cannot write production records unless writePolicy.allowUiProductionWrites is true', { kind, id: record.id });
204
+ }
205
+ }
206
+ const text = stringifyRecord(record);
207
+ if (Buffer.byteLength(text, 'utf8') > LIMITS.recordBytes) {
208
+ throw new EnvManagerError('RECORD_TOO_LARGE', `Record exceeds ${LIMITS.recordBytes} bytes`, { kind, id: record.id });
209
+ }
210
+ if (options.dryRun) {
211
+ return {
212
+ id: record.id,
213
+ kind,
214
+ created,
215
+ dryRun: true,
216
+ warnings: this.warnings(snapshot),
217
+ };
218
+ }
219
+ try {
220
+ await writeRecordFile(this.options.dataDir, kind, record);
221
+ }
222
+ catch (error) {
223
+ if (error instanceof EnvManagerError)
224
+ throw error;
225
+ throw new EnvManagerError('STORAGE_UNWRITABLE', `Could not write ${kind} "${record.id}"`, {
226
+ reason: error instanceof Error ? error.message : String(error),
227
+ });
228
+ }
229
+ const reloaded = await this.snapshot();
230
+ return {
231
+ id: record.id,
232
+ kind,
233
+ created,
234
+ dryRun: false,
235
+ warnings: this.warnings(reloaded),
236
+ };
237
+ }
238
+ async remove(kind, id, actor, options = {}) {
239
+ const snapshot = await this.snapshot();
240
+ const record = lookup(snapshot, kind, id);
241
+ if (!record) {
242
+ throw new EnvManagerError(notFoundCode(kind), `${kind} "${id}" was not found`, {
243
+ kind,
244
+ id,
245
+ });
246
+ }
247
+ if (actor === 'ui' && this.isProductionRecord(kind, record, snapshot)) {
248
+ if (!this.options.writePolicy.allowUiProductionWrites) {
249
+ throw new EnvManagerError('FORBIDDEN', 'The panel cannot delete production records unless writePolicy.allowUiProductionWrites is true', { kind, id });
250
+ }
251
+ }
252
+ const referrers = findReferences(snapshot, kind, id);
253
+ const blockers = referrers.map((ref) => errorDiagnostic('RECORD_IN_USE', `${ref.kind} "${ref.id}" references ${kind} "${id}"`, {
254
+ referrer: ref,
255
+ }));
256
+ if (options.dryRun) {
257
+ return { id, kind, deleted: false, blockers };
258
+ }
259
+ if (blockers.length > 0) {
260
+ throw new EnvManagerError('RECORD_IN_USE', `${kind} "${id}" is still referenced`, {
261
+ kind,
262
+ id,
263
+ blockers,
264
+ });
265
+ }
266
+ try {
267
+ await deleteRecordFile(this.options.dataDir, kind, id);
268
+ }
269
+ catch (error) {
270
+ throw new EnvManagerError('STORAGE_UNWRITABLE', `Could not delete ${kind} "${id}"`, {
271
+ reason: error instanceof Error ? error.message : String(error),
272
+ });
273
+ }
274
+ return { id, kind, deleted: true, blockers: [] };
275
+ }
276
+ async validate() {
277
+ const snapshot = await this.snapshot();
278
+ return {
279
+ ok: !snapshot.diagnostics.some((item) => item.severity === 'error'),
280
+ counts: this.counts(snapshot),
281
+ diagnostics: snapshot.diagnostics,
282
+ };
283
+ }
284
+ /**
285
+ * Store one SSH/web credential in the DSH credential service and return only
286
+ * its reference. Registry YAML must never contain the value itself.
287
+ */
288
+ async setCredential(ref, value) {
289
+ const cleanRef = String(ref || '').trim();
290
+ if (!/^env-manager\/[A-Za-z0-9._-]{1,80}\/[A-Za-z0-9._-]{1,80}$/.test(cleanRef)) {
291
+ throw new EnvManagerError('INVALID_ARGUMENT', 'Credential ref must look like env-manager/<environmentId>/<accountId>');
292
+ }
293
+ if (typeof value !== 'string' || value.length === 0 || value.length > 8192) {
294
+ throw new EnvManagerError('INVALID_ARGUMENT', 'Credential value must be between 1 and 8192 characters');
295
+ }
296
+ if (!this.options.credentials) {
297
+ throw new EnvManagerError('CREDENTIAL_UNAVAILABLE', 'The DSH credential service is unavailable; the password was not stored');
298
+ }
299
+ try {
300
+ await this.options.credentials.set(cleanRef, value);
301
+ }
302
+ catch {
303
+ this.options.logger.warn(`Credential write failed for ${cleanRef}`);
304
+ throw new EnvManagerError('CREDENTIAL_WRITE_FAILED', 'Could not store the credential in the DSH credential service');
305
+ }
306
+ return { ref: cleanRef, configured: true };
307
+ }
308
+ /** Remove a credential owned by this plugin; other namespaces are rejected. */
309
+ async unsetCredential(ref) {
310
+ const cleanRef = String(ref || '').trim();
311
+ if (!/^env-manager\/[A-Za-z0-9._-]{1,80}\/[A-Za-z0-9._-]{1,80}$/.test(cleanRef)) {
312
+ throw new EnvManagerError('INVALID_ARGUMENT', 'Credential ref must look like env-manager/<environmentId>/<accountId>');
313
+ }
314
+ if (!this.options.credentials) {
315
+ throw new EnvManagerError('CREDENTIAL_UNAVAILABLE', 'The DSH credential service is unavailable');
316
+ }
317
+ try {
318
+ await this.options.credentials.unset(cleanRef);
319
+ }
320
+ catch {
321
+ this.options.logger.warn(`Credential delete failed for ${cleanRef}`);
322
+ throw new EnvManagerError('CREDENTIAL_WRITE_FAILED', 'Could not remove the credential from the DSH credential service');
323
+ }
324
+ return { ref: cleanRef, removed: true };
325
+ }
326
+ async resolve(request) {
327
+ const snapshot = await this.snapshot();
328
+ const environment = lookupByRef(snapshot, 'environment', request.environmentId);
329
+ if (!environment) {
330
+ throw new EnvManagerError('ENV_NOT_FOUND', `Environment "${request.environmentId}" was not found`, { environmentId: request.environmentId });
331
+ }
332
+ const service = lookupByRef(snapshot, 'service', request.serviceId);
333
+ if (!service) {
334
+ throw new EnvManagerError('SERVICE_NOT_FOUND', `Service "${request.serviceId}" was not found`, { serviceId: request.serviceId });
335
+ }
336
+ const deployment = this.selectDeployment(snapshot, environment.id, service.id, request.deploymentId);
337
+ const result = resolveContext({
338
+ environment,
339
+ service,
340
+ deployment,
341
+ ruleProfiles: snapshot.ruleProfiles,
342
+ });
343
+ if (!result.ok) {
344
+ const first = result.diagnostics.find((item) => item.severity === 'error');
345
+ throw new EnvManagerError(first?.code ?? 'INTERNAL_ERROR', first?.message ?? 'Context resolution failed', { diagnostics: result.diagnostics });
346
+ }
347
+ const credentials = await this.describeCredentials(environment.hosts, environment.clusters, environment.endpoints);
348
+ const context = result.context;
349
+ const warnings = [];
350
+ for (const credential of credentials) {
351
+ if (!credential.configured) {
352
+ warnings.push({
353
+ code: 'CREDENTIAL_MISSING',
354
+ severity: 'warning',
355
+ message: `Credential "${credential.ref}" is not configured`,
356
+ details: { ref: credential.ref },
357
+ });
358
+ }
359
+ }
360
+ context.credentials = credentials;
361
+ context.diagnostics = [...context.diagnostics, ...warnings];
362
+ return { context, warnings };
363
+ }
364
+ async route(request) {
365
+ const snapshot = await this.snapshot();
366
+ let serviceId = request.serviceId;
367
+ if (!serviceId && request.deploymentId) {
368
+ serviceId = snapshot.deployments.get(request.deploymentId)?.serviceId;
369
+ }
370
+ if (!serviceId) {
371
+ throw new EnvManagerError('SERVICE_NOT_FOUND', 'env_resolve_operation requires serviceId or a deploymentId that supplies one', { environmentId: request.environmentId, deploymentId: request.deploymentId });
372
+ }
373
+ const resolved = await this.resolve({
374
+ environmentId: request.environmentId,
375
+ serviceId,
376
+ deploymentId: request.deploymentId,
377
+ });
378
+ const resolution = await resolveOperation({
379
+ operation: request.operation,
380
+ context: resolved.context,
381
+ bindings: [...snapshot.operationBindings.values()],
382
+ skills: this.options.skills,
383
+ });
384
+ if (!resolution.ok) {
385
+ const first = resolution.diagnostics.find((item) => item.severity === 'error');
386
+ throw new EnvManagerError(first?.code ?? 'INTERNAL_ERROR', first?.message ?? 'Operation resolution failed', { resolution });
387
+ }
388
+ return resolution;
389
+ }
390
+ async getContext(sessionId) {
391
+ const result = await this.sessions.get(sessionId);
392
+ return result.context;
393
+ }
394
+ async setContext(sessionId, environmentId) {
395
+ if (environmentId !== null) {
396
+ const snapshot = await this.snapshot();
397
+ if (!lookupByRef(snapshot, 'environment', environmentId)) {
398
+ throw new EnvManagerError('ENV_NOT_FOUND', `Environment "${environmentId}" was not found`, { environmentId });
399
+ }
400
+ }
401
+ const result = await this.sessions.set(sessionId, environmentId);
402
+ return result.context;
403
+ }
404
+ async needsProductionApproval(kind, raw) {
405
+ const parsed = parseRecordInput(kind, raw);
406
+ if (!parsed.ok)
407
+ return false;
408
+ const snapshot = await this.snapshot();
409
+ return this.isProductionRecord(kind, parsed.record, snapshot);
410
+ }
411
+ mapFor(snapshot, kind) {
412
+ switch (kind) {
413
+ case 'environment':
414
+ return snapshot.environments;
415
+ case 'service':
416
+ return snapshot.services;
417
+ case 'deployment':
418
+ return snapshot.deployments;
419
+ case 'ruleProfile':
420
+ return snapshot.ruleProfiles;
421
+ case 'operationBinding':
422
+ return snapshot.operationBindings;
423
+ }
424
+ }
425
+ selectDeployment(snapshot, environmentId, serviceId, deploymentId) {
426
+ if (deploymentId) {
427
+ const deployment = lookup(snapshot, 'deployment', deploymentId);
428
+ if (!deployment ||
429
+ deployment.environmentId !== environmentId ||
430
+ deployment.serviceId !== serviceId) {
431
+ throw new EnvManagerError('DEPLOYMENT_NOT_FOUND', `Deployment "${deploymentId}" does not bind ${environmentId}/${serviceId}`, { deploymentId, environmentId, serviceId });
432
+ }
433
+ return deployment;
434
+ }
435
+ const candidates = [...snapshot.deployments.values()].filter((deployment) => deployment.environmentId === environmentId && deployment.serviceId === serviceId);
436
+ if (candidates.length === 0) {
437
+ throw new EnvManagerError('DEPLOYMENT_NOT_FOUND', `No deployment binds ${environmentId}/${serviceId}`, { environmentId, serviceId });
438
+ }
439
+ if (candidates.length > 1) {
440
+ throw new EnvManagerError('DEPLOYMENT_AMBIGUOUS', `${environmentId}/${serviceId} has ${candidates.length} deployments; pass deploymentId`, { candidates: candidates.map((item) => item.id) });
441
+ }
442
+ return candidates[0];
443
+ }
444
+ isProductionRecord(kind, record, snapshot) {
445
+ if (kind === 'environment') {
446
+ return record.category === 'production';
447
+ }
448
+ if (kind === 'deployment') {
449
+ const deployment = record;
450
+ return snapshot.environments.get(deployment.environmentId)?.category === 'production';
451
+ }
452
+ if (kind === 'operationBinding') {
453
+ const binding = record;
454
+ if (binding.match.deploymentId) {
455
+ const deployment = snapshot.deployments.get(binding.match.deploymentId);
456
+ return deployment
457
+ ? snapshot.environments.get(deployment.environmentId)?.category === 'production'
458
+ : false;
459
+ }
460
+ if (binding.match.environmentId) {
461
+ return snapshot.environments.get(binding.match.environmentId)?.category === 'production';
462
+ }
463
+ }
464
+ return false;
465
+ }
466
+ async describeCredentials(hosts, clusters, endpoints) {
467
+ const refs = new Set();
468
+ for (const host of hosts)
469
+ if (host.credentialRef)
470
+ refs.add(host.credentialRef);
471
+ for (const cluster of clusters)
472
+ if (cluster.credentialRef)
473
+ refs.add(cluster.credentialRef);
474
+ for (const endpoint of endpoints)
475
+ if (endpoint.credentialRef)
476
+ refs.add(endpoint.credentialRef);
477
+ const out = [];
478
+ for (const ref of [...refs].sort()) {
479
+ if (!this.options.credentials) {
480
+ out.push({ ref, configured: false });
481
+ continue;
482
+ }
483
+ try {
484
+ const info = await this.options.credentials.describe(ref);
485
+ out.push({ ref, configured: info.configured, source: info.source });
486
+ }
487
+ catch {
488
+ out.push({ ref, configured: false });
489
+ }
490
+ }
491
+ return out;
492
+ }
493
+ }
494
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import z from '@deepseek-ai/schemastery';
2
+ /**
3
+ * Host plugin config (schemastery). See `docs/01-architecture/detailed-design.md` §3.
4
+ */
5
+ export declare const Config: z<Schemastery.ObjectS<NoInfer<{
6
+ dataDir: z<string, string, "defined">;
7
+ maxRecords: z<number, number, "defined">;
8
+ registerSkill: z<boolean, boolean, "defined">;
9
+ writePolicy: z<Schemastery.ObjectS<NoInfer<{
10
+ allowUiProductionWrites: z<boolean, boolean, "defined">;
11
+ requireApprovalForDelete: z<boolean, boolean, "defined">;
12
+ requireApprovalForProductionSave: z<boolean, boolean, "defined">;
13
+ }>>, Schemastery.ObjectT<NoInfer<{
14
+ allowUiProductionWrites: z<boolean, boolean, "defined">;
15
+ requireApprovalForDelete: z<boolean, boolean, "defined">;
16
+ requireApprovalForProductionSave: z<boolean, boolean, "defined">;
17
+ }>>, "defined">;
18
+ defaults: z<Schemastery.ObjectS<NoInfer<{
19
+ environmentId: z<string, string, "defined">;
20
+ }>>, Schemastery.ObjectT<NoInfer<{
21
+ environmentId: z<string, string, "defined">;
22
+ }>>, "defined">;
23
+ }>>, Schemastery.ObjectT<NoInfer<{
24
+ dataDir: z<string, string, "defined">;
25
+ maxRecords: z<number, number, "defined">;
26
+ registerSkill: z<boolean, boolean, "defined">;
27
+ writePolicy: z<Schemastery.ObjectS<NoInfer<{
28
+ allowUiProductionWrites: z<boolean, boolean, "defined">;
29
+ requireApprovalForDelete: z<boolean, boolean, "defined">;
30
+ requireApprovalForProductionSave: z<boolean, boolean, "defined">;
31
+ }>>, Schemastery.ObjectT<NoInfer<{
32
+ allowUiProductionWrites: z<boolean, boolean, "defined">;
33
+ requireApprovalForDelete: z<boolean, boolean, "defined">;
34
+ requireApprovalForProductionSave: z<boolean, boolean, "defined">;
35
+ }>>, "defined">;
36
+ defaults: z<Schemastery.ObjectS<NoInfer<{
37
+ environmentId: z<string, string, "defined">;
38
+ }>>, Schemastery.ObjectT<NoInfer<{
39
+ environmentId: z<string, string, "defined">;
40
+ }>>, "defined">;
41
+ }>>, "plain">;
42
+ export type HostConfig = {
43
+ dataDir: string;
44
+ maxRecords: number;
45
+ registerSkill: boolean;
46
+ writePolicy: {
47
+ allowUiProductionWrites: boolean;
48
+ requireApprovalForDelete: boolean;
49
+ requireApprovalForProductionSave: boolean;
50
+ };
51
+ defaults: {
52
+ environmentId: string;
53
+ };
54
+ };
55
+ export declare function normalizeConfig(config: unknown): HostConfig;
package/lib/config.js ADDED
@@ -0,0 +1,42 @@
1
+ import z from '@deepseek-ai/schemastery';
2
+ /**
3
+ * Host plugin config (schemastery). See `docs/01-architecture/detailed-design.md` §3.
4
+ */
5
+ export const Config = z.object({
6
+ dataDir: z
7
+ .string()
8
+ .default('')
9
+ .description('Registry directory; relative paths resolve against the profile directory.'),
10
+ maxRecords: z.natural().default(2000),
11
+ registerSkill: z
12
+ .boolean()
13
+ .default(true)
14
+ .description('Register the profile-wide dsh-env-manager discovery Skill.'),
15
+ writePolicy: z
16
+ .object({
17
+ allowUiProductionWrites: z.boolean().default(false),
18
+ requireApprovalForDelete: z.boolean().default(true),
19
+ requireApprovalForProductionSave: z.boolean().default(true),
20
+ })
21
+ .default({}),
22
+ defaults: z
23
+ .object({
24
+ environmentId: z.string().default(''),
25
+ })
26
+ .default({}),
27
+ });
28
+ export function normalizeConfig(config) {
29
+ const parsed = Config(config ?? {});
30
+ return {
31
+ dataDir: parsed.dataDir ?? '',
32
+ maxRecords: parsed.maxRecords ?? 2000,
33
+ registerSkill: parsed.registerSkill ?? true,
34
+ writePolicy: {
35
+ allowUiProductionWrites: parsed.writePolicy?.allowUiProductionWrites ?? false,
36
+ requireApprovalForDelete: parsed.writePolicy?.requireApprovalForDelete ?? true,
37
+ requireApprovalForProductionSave: parsed.writePolicy?.requireApprovalForProductionSave ?? true,
38
+ },
39
+ defaults: { environmentId: parsed.defaults?.environmentId ?? '' },
40
+ };
41
+ }
42
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAExC;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,OAAO,CAAC,EAAE,CAAC;SACX,WAAW,CAAC,2EAA2E,CAAC;IAC3F,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACrC,aAAa,EAAE,CAAC;SACb,OAAO,EAAE;SACT,OAAO,CAAC,IAAI,CAAC;SACb,WAAW,CAAC,4DAA4D,CAAC;IAC5E,WAAW,EAAE,CAAC;SACX,MAAM,CAAC;QACN,uBAAuB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QACnD,wBAAwB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QACnD,gCAAgC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;KAC5D,CAAC;SACD,OAAO,CAAC,EAAE,CAAC;IACd,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;KACtC,CAAC;SACD,OAAO,CAAC,EAAE,CAAC;CACf,CAAC,CAAA;AAgBF,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAe,CAAA;IACjD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAC7B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;QACrC,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;QAC3C,WAAW,EAAE;YACX,uBAAuB,EAAE,MAAM,CAAC,WAAW,EAAE,uBAAuB,IAAI,KAAK;YAC7E,wBAAwB,EAAE,MAAM,CAAC,WAAW,EAAE,wBAAwB,IAAI,IAAI;YAC9E,gCAAgC,EAC9B,MAAM,CAAC,WAAW,EAAE,gCAAgC,IAAI,IAAI;SAC/D;QACD,QAAQ,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,QAAQ,EAAE,aAAa,IAAI,EAAE,EAAE;KAClE,CAAA;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { RecordKind } from './types.js';
2
+ export declare const SCHEMA_VERSION = 1;
3
+ export declare const ID_PATTERN: RegExp;
4
+ export declare const SESSION_ID_PATTERN: RegExp;
5
+ export declare const PARAMETER_KEY_PATTERN: RegExp;
6
+ export declare const TEMPLATE_REF_PATTERN: RegExp;
7
+ export declare const RECORD_KINDS: readonly RecordKind[];
8
+ export declare const KIND_DIRECTORIES: Record<RecordKind, string>;
9
+ export declare const STANDARD_OPERATIONS: readonly ["install", "deploy", "redeploy", "replace", "restart", "upgrade", "rollback", "uninstall", "collect-logs", "health-check", "inspect", "upload", "download"];
10
+ export declare const WRITE_OPERATIONS: ReadonlySet<string>;
11
+ export declare const LIMITS: {
12
+ readonly recordBytes: number;
13
+ readonly sessionBytes: number;
14
+ readonly templateLength: 2048;
15
+ readonly maxParameters: 50;
16
+ readonly maxDiagnostics: 200;
17
+ readonly maxWarnings: 20;
18
+ readonly backupCount: 5;
19
+ readonly maxSnapshotRecords: 5000;
20
+ };
21
+ export declare function isRecordKind(value: string): value is RecordKind;