devchain-cli 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/drizzle/0027_legal_malice.sql +17 -0
  2. package/dist/drizzle/0028_populate_provider_configs.sql +19 -0
  3. package/dist/drizzle/0029_merge_profiles_by_family_slug.sql +116 -0
  4. package/dist/drizzle/0030_set_agents_provider_config_id.sql +14 -0
  5. package/dist/drizzle/0031_remove_legacy_profile_columns.sql +68 -0
  6. package/dist/drizzle/0032_agents_provider_config_not_null.sql +52 -0
  7. package/dist/drizzle/0033_profile_provider_configs_name.sql +38 -0
  8. package/dist/drizzle/0034_sessions_agent_running_unique.sql +30 -0
  9. package/dist/drizzle/0035_provider_config_position.sql +26 -0
  10. package/dist/drizzle/PHASE2_MIGRATION_GUIDE.md +109 -0
  11. package/dist/drizzle/meta/0027_snapshot.json +3648 -0
  12. package/dist/drizzle/meta/0035_snapshot.json +3670 -0
  13. package/dist/drizzle/meta/_journal.json +64 -1
  14. package/dist/drizzle/migration-guard.sql +17 -0
  15. package/dist/drizzle/phase2-rollback.sql +44 -0
  16. package/dist/node_modules/@devchain/shared/schemas/export-schema.d.ts +101 -12
  17. package/dist/node_modules/@devchain/shared/schemas/export-schema.d.ts.map +1 -1
  18. package/dist/node_modules/@devchain/shared/schemas/export-schema.js +20 -0
  19. package/dist/node_modules/@devchain/shared/schemas/export-schema.js.map +1 -1
  20. package/dist/node_modules/@devchain/shared/tsconfig.tsbuildinfo +1 -1
  21. package/dist/server/modules/agents/controllers/agents.controller.d.ts +15 -0
  22. package/dist/server/modules/agents/controllers/agents.controller.js +120 -57
  23. package/dist/server/modules/agents/controllers/agents.controller.js.map +1 -1
  24. package/dist/server/modules/core/services/preflight.service.d.ts +6 -0
  25. package/dist/server/modules/core/services/preflight.service.js +143 -57
  26. package/dist/server/modules/core/services/preflight.service.js.map +1 -1
  27. package/dist/server/modules/epics/services/epics.service.d.ts +10 -4
  28. package/dist/server/modules/epics/services/epics.service.js +8 -5
  29. package/dist/server/modules/epics/services/epics.service.js.map +1 -1
  30. package/dist/server/modules/events/catalog/epic.created.d.ts +18 -0
  31. package/dist/server/modules/events/catalog/epic.created.js +8 -0
  32. package/dist/server/modules/events/catalog/epic.created.js.map +1 -1
  33. package/dist/server/modules/events/catalog/epic.updated.d.ts +18 -0
  34. package/dist/server/modules/events/catalog/epic.updated.js +8 -0
  35. package/dist/server/modules/events/catalog/epic.updated.js.map +1 -1
  36. package/dist/server/modules/events/catalog/index.d.ts +36 -0
  37. package/dist/server/modules/events/subscribers/epic-assignment-notifier.subscriber.d.ts +1 -0
  38. package/dist/server/modules/events/subscribers/epic-assignment-notifier.subscriber.js +33 -2
  39. package/dist/server/modules/events/subscribers/epic-assignment-notifier.subscriber.js.map +1 -1
  40. package/dist/server/modules/events/subscribers/review-comment-notifier.subscriber.js +12 -5
  41. package/dist/server/modules/events/subscribers/review-comment-notifier.subscriber.js.map +1 -1
  42. package/dist/server/modules/mcp/services/mcp.service.js +16 -2
  43. package/dist/server/modules/mcp/services/mcp.service.js.map +1 -1
  44. package/dist/server/modules/mcp/services/terminal-activity.service.d.ts +1 -1
  45. package/dist/server/modules/mcp/services/terminal-activity.service.js +22 -2
  46. package/dist/server/modules/mcp/services/terminal-activity.service.js.map +1 -1
  47. package/dist/server/modules/profiles/controllers/profiles.controller.d.ts +11 -8
  48. package/dist/server/modules/profiles/controllers/profiles.controller.js +88 -14
  49. package/dist/server/modules/profiles/controllers/profiles.controller.js.map +1 -1
  50. package/dist/server/modules/profiles/controllers/provider-configs.controller.d.ts +9 -0
  51. package/dist/server/modules/profiles/controllers/provider-configs.controller.js +94 -0
  52. package/dist/server/modules/profiles/controllers/provider-configs.controller.js.map +1 -0
  53. package/dist/server/modules/profiles/dto.d.ts +81 -6
  54. package/dist/server/modules/profiles/dto.js +45 -3
  55. package/dist/server/modules/profiles/dto.js.map +1 -1
  56. package/dist/server/modules/profiles/profiles.module.js +2 -1
  57. package/dist/server/modules/profiles/profiles.module.js.map +1 -1
  58. package/dist/server/modules/projects/controllers/projects.controller.d.ts +78 -19
  59. package/dist/server/modules/projects/controllers/projects.controller.js +243 -17
  60. package/dist/server/modules/projects/controllers/projects.controller.js.map +1 -1
  61. package/dist/server/modules/projects/dtos/export.dto.d.ts +44 -0
  62. package/dist/server/modules/projects/dtos/export.dto.js +10 -0
  63. package/dist/server/modules/projects/dtos/export.dto.js.map +1 -1
  64. package/dist/server/modules/projects/services/projects.service.d.ts +48 -11
  65. package/dist/server/modules/projects/services/projects.service.js +359 -27
  66. package/dist/server/modules/projects/services/projects.service.js.map +1 -1
  67. package/dist/server/modules/providers/controllers/providers.controller.js +12 -7
  68. package/dist/server/modules/providers/controllers/providers.controller.js.map +1 -1
  69. package/dist/server/modules/registry/controllers/templates.controller.d.ts +2 -2
  70. package/dist/server/modules/registry/services/registry-orchestration.service.js +11 -0
  71. package/dist/server/modules/registry/services/registry-orchestration.service.js.map +1 -1
  72. package/dist/server/modules/registry/services/template-upgrade.service.js +6 -0
  73. package/dist/server/modules/registry/services/template-upgrade.service.js.map +1 -1
  74. package/dist/server/modules/registry/services/unified-template.service.d.ts +2 -1
  75. package/dist/server/modules/registry/services/unified-template.service.js +61 -0
  76. package/dist/server/modules/registry/services/unified-template.service.js.map +1 -1
  77. package/dist/server/modules/reviews/services/reviews.service.js +8 -0
  78. package/dist/server/modules/reviews/services/reviews.service.js.map +1 -1
  79. package/dist/server/modules/sessions/services/activity-tracker.service.d.ts +2 -0
  80. package/dist/server/modules/sessions/services/activity-tracker.service.js +20 -0
  81. package/dist/server/modules/sessions/services/activity-tracker.service.js.map +1 -1
  82. package/dist/server/modules/sessions/services/sessions-message-pool.service.js +2 -2
  83. package/dist/server/modules/sessions/services/sessions-message-pool.service.js.map +1 -1
  84. package/dist/server/modules/sessions/services/sessions.service.d.ts +3 -1
  85. package/dist/server/modules/sessions/services/sessions.service.js +275 -144
  86. package/dist/server/modules/sessions/services/sessions.service.js.map +1 -1
  87. package/dist/server/modules/sessions/utils/env-builder.d.ts +8 -0
  88. package/dist/server/modules/sessions/utils/env-builder.js +62 -0
  89. package/dist/server/modules/sessions/utils/env-builder.js.map +1 -0
  90. package/dist/server/modules/settings/dtos/settings.dto.d.ts +84 -8
  91. package/dist/server/modules/settings/dtos/settings.dto.js +15 -2
  92. package/dist/server/modules/settings/dtos/settings.dto.js.map +1 -1
  93. package/dist/server/modules/settings/services/settings.service.d.ts +10 -1
  94. package/dist/server/modules/settings/services/settings.service.js +275 -0
  95. package/dist/server/modules/settings/services/settings.service.js.map +1 -1
  96. package/dist/server/modules/storage/db/db.provider.js +2 -0
  97. package/dist/server/modules/storage/db/db.provider.js.map +1 -1
  98. package/dist/server/modules/storage/db/schema.d.ts +185 -28
  99. package/dist/server/modules/storage/db/schema.js +32 -6
  100. package/dist/server/modules/storage/db/schema.js.map +1 -1
  101. package/dist/server/modules/storage/interfaces/storage.interface.d.ts +17 -1
  102. package/dist/server/modules/storage/interfaces/storage.interface.js.map +1 -1
  103. package/dist/server/modules/storage/local/local-storage.service.d.ts +15 -1
  104. package/dist/server/modules/storage/local/local-storage.service.js +352 -21
  105. package/dist/server/modules/storage/local/local-storage.service.js.map +1 -1
  106. package/dist/server/modules/storage/models/domain.models.d.ts +26 -7
  107. package/dist/server/modules/subscribers/actions/restart-agent.action.js +17 -19
  108. package/dist/server/modules/subscribers/actions/restart-agent.action.js.map +1 -1
  109. package/dist/server/modules/subscribers/events/event-fields-catalog.js +4 -0
  110. package/dist/server/modules/subscribers/events/event-fields-catalog.js.map +1 -1
  111. package/dist/server/modules/terminal/services/pty.service.js +6 -1
  112. package/dist/server/modules/terminal/services/pty.service.js.map +1 -1
  113. package/dist/server/modules/watchers/services/watcher-runner.service.js +27 -8
  114. package/dist/server/modules/watchers/services/watcher-runner.service.js.map +1 -1
  115. package/dist/{templates/claude-opus.json → server/templates/dev-loop.json} +365 -209
  116. package/dist/server/tsconfig.tsbuildinfo +1 -1
  117. package/dist/server/ui/assets/{ReviewDetailPage-I54h-2L-.js → ReviewDetailPage-YlFGGJv7.js} +2 -2
  118. package/dist/server/ui/assets/ReviewsPage-Diegg4jt.js +19 -0
  119. package/dist/server/ui/assets/index-DuMIsIyY.css +32 -0
  120. package/dist/server/ui/assets/index-sEtQpiB4.js +868 -0
  121. package/dist/server/ui/assets/{useReviewSubscription-C0GEsiRw.js → useReviewSubscription-CMhQ2m0h.js} +22 -22
  122. package/dist/server/ui/index.html +2 -2
  123. package/dist/{server/templates/claude-opus.json → templates/dev-loop.json} +365 -209
  124. package/package.json +9 -4
  125. package/dist/node_modules/@devchain/shared/schemas/export-schema.spec.d.ts +0 -2
  126. package/dist/node_modules/@devchain/shared/schemas/export-schema.spec.d.ts.map +0 -1
  127. package/dist/node_modules/@devchain/shared/schemas/export-schema.spec.js +0 -88
  128. package/dist/node_modules/@devchain/shared/schemas/export-schema.spec.js.map +0 -1
  129. package/dist/server/templates/claude-codex-advanced.json +0 -470
  130. package/dist/server/templates/simple-codex.json +0 -469
  131. package/dist/server/ui/assets/ReviewsPage-B4ua5hiX.js +0 -19
  132. package/dist/server/ui/assets/index-CqcmnFBh.css +0 -32
  133. package/dist/server/ui/assets/index-JbUMpbg7.js +0 -858
  134. package/dist/templates/claude-codex-advanced.json +0 -470
  135. package/dist/templates/simple-codex.json +0 -469
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EnvBuilderError = void 0;
4
+ exports.validateEnvKey = validateEnvKey;
5
+ exports.validateEnvValue = validateEnvValue;
6
+ exports.quoteEnvValue = quoteEnvValue;
7
+ exports.buildEnvArgs = buildEnvArgs;
8
+ exports.buildSessionCommand = buildSessionCommand;
9
+ class EnvBuilderError extends Error {
10
+ constructor(message) {
11
+ super(message);
12
+ this.name = 'EnvBuilderError';
13
+ }
14
+ }
15
+ exports.EnvBuilderError = EnvBuilderError;
16
+ const ENV_KEY_REGEX = /^[A-Za-z_][A-Za-z0-9_]*$/;
17
+ const CONTROL_CHAR_REGEX = /[\x00-\x1f]/;
18
+ function validateEnvKey(key) {
19
+ if (!key || key.length === 0) {
20
+ throw new EnvBuilderError('Environment variable key cannot be empty');
21
+ }
22
+ if (key.length > 255) {
23
+ throw new EnvBuilderError(`Environment variable key too long: ${key.slice(0, 20)}... (max 255 chars)`);
24
+ }
25
+ if (!ENV_KEY_REGEX.test(key)) {
26
+ throw new EnvBuilderError(`Invalid environment variable key "${key}": must contain only alphanumeric characters and underscores, starting with a letter or underscore`);
27
+ }
28
+ }
29
+ function validateEnvValue(key, value) {
30
+ if (value.length > 32768) {
31
+ throw new EnvBuilderError(`Environment variable value too long for "${key}" (max 32KB)`);
32
+ }
33
+ if (CONTROL_CHAR_REGEX.test(value)) {
34
+ throw new EnvBuilderError(`Environment variable "${key}" contains control characters or newlines`);
35
+ }
36
+ }
37
+ function quoteEnvValue(value) {
38
+ if (value.length === 0) {
39
+ return "''";
40
+ }
41
+ return `'${value.replace(/'/g, "'\\''")}'`;
42
+ }
43
+ function buildEnvArgs(env) {
44
+ if (!env || Object.keys(env).length === 0) {
45
+ return [];
46
+ }
47
+ const args = [];
48
+ for (const [key, value] of Object.entries(env)) {
49
+ validateEnvKey(key);
50
+ validateEnvValue(key, value);
51
+ args.push(`${key}=${value}`);
52
+ }
53
+ return args;
54
+ }
55
+ function buildSessionCommand(envVars, providerBinPath, optionArgs) {
56
+ const envArgs = buildEnvArgs(envVars);
57
+ if (envArgs.length === 0) {
58
+ return [providerBinPath, ...optionArgs];
59
+ }
60
+ return ['env', ...envArgs, providerBinPath, ...optionArgs];
61
+ }
62
+ //# sourceMappingURL=env-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-builder.js","sourceRoot":"","sources":["../../../../src/modules/sessions/utils/env-builder.ts"],"names":[],"mappings":";;;AA6BA,wCAgBC;AAOD,4CAUC;AAUD,sCAQC;AAcD,oCAgBC;AAWD,kDAcC;AAlID,MAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AALD,0CAKC;AAMD,MAAM,aAAa,GAAG,0BAA0B,CAAC;AAMjD,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAOzC,SAAgB,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,eAAe,CAAC,0CAA0C,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACrB,MAAM,IAAI,eAAe,CACvB,sCAAsC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAC5E,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,eAAe,CACvB,qCAAqC,GAAG,oGAAoG,CAC7I,CAAC;IACJ,CAAC;AACH,CAAC;AAOD,SAAgB,gBAAgB,CAAC,GAAW,EAAE,KAAa;IACzD,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,eAAe,CAAC,4CAA4C,GAAG,cAAc,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,eAAe,CACvB,yBAAyB,GAAG,2CAA2C,CACxE,CAAC;IACJ,CAAC;AACH,CAAC;AAUD,SAAgB,aAAa,CAAC,KAAa;IAEzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC7C,CAAC;AAcD,SAAgB,YAAY,CAAC,GAA8C;IACzE,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,cAAc,CAAC,GAAG,CAAC,CAAC;QACpB,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAG7B,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAWD,SAAgB,mBAAmB,CACjC,OAAkD,EAClD,eAAuB,EACvB,UAAoB;IAEpB,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAEtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAEzB,OAAO,CAAC,eAAe,EAAE,GAAG,UAAU,CAAC,CAAC;IAC1C,CAAC;IAGD,OAAO,CAAC,KAAK,EAAE,GAAG,OAAO,EAAE,eAAe,EAAE,GAAG,UAAU,CAAC,CAAC;AAC7D,CAAC"}
@@ -15,7 +15,7 @@ declare const TerminalSettingsSchema: z.ZodObject<{
15
15
  }>;
16
16
  declare const RegistryTemplateMetadataSchema: z.ZodObject<{
17
17
  templateSlug: z.ZodString;
18
- source: z.ZodOptional<z.ZodEnum<["bundled", "registry"]>>;
18
+ source: z.ZodOptional<z.ZodEnum<["bundled", "registry", "file"]>>;
19
19
  installedVersion: z.ZodNullable<z.ZodString>;
20
20
  registryUrl: z.ZodNullable<z.ZodString>;
21
21
  installedAt: z.ZodString;
@@ -25,16 +25,44 @@ declare const RegistryTemplateMetadataSchema: z.ZodObject<{
25
25
  installedVersion: string | null;
26
26
  registryUrl: string | null;
27
27
  installedAt: string;
28
- source?: "bundled" | "registry" | undefined;
28
+ source?: "bundled" | "registry" | "file" | undefined;
29
29
  lastUpdateCheckAt?: string | undefined;
30
30
  }, {
31
31
  templateSlug: string;
32
32
  installedVersion: string | null;
33
33
  registryUrl: string | null;
34
34
  installedAt: string;
35
- source?: "bundled" | "registry" | undefined;
35
+ source?: "bundled" | "registry" | "file" | undefined;
36
36
  lastUpdateCheckAt?: string | undefined;
37
37
  }>;
38
+ export declare const TemplatePresetSchema: z.ZodObject<{
39
+ name: z.ZodString;
40
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
41
+ agentConfigs: z.ZodArray<z.ZodObject<{
42
+ agentName: z.ZodString;
43
+ providerConfigName: z.ZodString;
44
+ }, "strip", z.ZodTypeAny, {
45
+ agentName: string;
46
+ providerConfigName: string;
47
+ }, {
48
+ agentName: string;
49
+ providerConfigName: string;
50
+ }>, "many">;
51
+ }, "strip", z.ZodTypeAny, {
52
+ name: string;
53
+ agentConfigs: {
54
+ agentName: string;
55
+ providerConfigName: string;
56
+ }[];
57
+ description?: string | null | undefined;
58
+ }, {
59
+ name: string;
60
+ agentConfigs: {
61
+ agentName: string;
62
+ providerConfigName: string;
63
+ }[];
64
+ description?: string | null | undefined;
65
+ }>;
38
66
  declare const RegistryConfigSchema: z.ZodObject<{
39
67
  url: z.ZodOptional<z.ZodString>;
40
68
  cacheDir: z.ZodOptional<z.ZodString>;
@@ -218,7 +246,7 @@ export declare const SettingsSchema: z.ZodObject<{
218
246
  }>>;
219
247
  registryTemplates: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
220
248
  templateSlug: z.ZodString;
221
- source: z.ZodOptional<z.ZodEnum<["bundled", "registry"]>>;
249
+ source: z.ZodOptional<z.ZodEnum<["bundled", "registry", "file"]>>;
222
250
  installedVersion: z.ZodNullable<z.ZodString>;
223
251
  registryUrl: z.ZodNullable<z.ZodString>;
224
252
  installedAt: z.ZodString;
@@ -228,16 +256,45 @@ export declare const SettingsSchema: z.ZodObject<{
228
256
  installedVersion: string | null;
229
257
  registryUrl: string | null;
230
258
  installedAt: string;
231
- source?: "bundled" | "registry" | undefined;
259
+ source?: "bundled" | "registry" | "file" | undefined;
232
260
  lastUpdateCheckAt?: string | undefined;
233
261
  }, {
234
262
  templateSlug: string;
235
263
  installedVersion: string | null;
236
264
  registryUrl: string | null;
237
265
  installedAt: string;
238
- source?: "bundled" | "registry" | undefined;
266
+ source?: "bundled" | "registry" | "file" | undefined;
239
267
  lastUpdateCheckAt?: string | undefined;
240
268
  }>>>;
269
+ projectPresets: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
270
+ name: z.ZodString;
271
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
272
+ agentConfigs: z.ZodArray<z.ZodObject<{
273
+ agentName: z.ZodString;
274
+ providerConfigName: z.ZodString;
275
+ }, "strip", z.ZodTypeAny, {
276
+ agentName: string;
277
+ providerConfigName: string;
278
+ }, {
279
+ agentName: string;
280
+ providerConfigName: string;
281
+ }>, "many">;
282
+ }, "strip", z.ZodTypeAny, {
283
+ name: string;
284
+ agentConfigs: {
285
+ agentName: string;
286
+ providerConfigName: string;
287
+ }[];
288
+ description?: string | null | undefined;
289
+ }, {
290
+ name: string;
291
+ agentConfigs: {
292
+ agentName: string;
293
+ providerConfigName: string;
294
+ }[];
295
+ description?: string | null | undefined;
296
+ }>, "many">>>;
297
+ projectActivePresets: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNullable<z.ZodString>>>;
241
298
  }, "strip", z.ZodTypeAny, {
242
299
  projectId?: string | undefined;
243
300
  dbPath?: string | undefined;
@@ -285,9 +342,18 @@ export declare const SettingsSchema: z.ZodObject<{
285
342
  installedVersion: string | null;
286
343
  registryUrl: string | null;
287
344
  installedAt: string;
288
- source?: "bundled" | "registry" | undefined;
345
+ source?: "bundled" | "registry" | "file" | undefined;
289
346
  lastUpdateCheckAt?: string | undefined;
290
347
  }> | undefined;
348
+ projectPresets?: Record<string, {
349
+ name: string;
350
+ agentConfigs: {
351
+ agentName: string;
352
+ providerConfigName: string;
353
+ }[];
354
+ description?: string | null | undefined;
355
+ }[]> | undefined;
356
+ projectActivePresets?: Record<string, string | null> | undefined;
291
357
  }, {
292
358
  projectId?: string | undefined;
293
359
  dbPath?: string | undefined;
@@ -335,9 +401,18 @@ export declare const SettingsSchema: z.ZodObject<{
335
401
  installedVersion: string | null;
336
402
  registryUrl: string | null;
337
403
  installedAt: string;
338
- source?: "bundled" | "registry" | undefined;
404
+ source?: "bundled" | "registry" | "file" | undefined;
339
405
  lastUpdateCheckAt?: string | undefined;
340
406
  }> | undefined;
407
+ projectPresets?: Record<string, {
408
+ name: string;
409
+ agentConfigs: {
410
+ agentName: string;
411
+ providerConfigName: string;
412
+ }[];
413
+ description?: string | null | undefined;
414
+ }[]> | undefined;
415
+ projectActivePresets?: Record<string, string | null> | undefined;
341
416
  }>;
342
417
  export type SettingsDto = z.infer<typeof SettingsSchema>;
343
418
  export type MessagePoolSettingsDto = z.infer<typeof MessagePoolSettingsSchema>;
@@ -345,4 +420,5 @@ export type TerminalSettingsDto = z.infer<typeof TerminalSettingsSchema>;
345
420
  export type TerminalInputMode = (typeof TERMINAL_INPUT_MODES)[number];
346
421
  export type RegistryTemplateMetadataDto = z.infer<typeof RegistryTemplateMetadataSchema>;
347
422
  export type RegistryConfigDto = z.infer<typeof RegistryConfigSchema>;
423
+ export type TemplatePresetDto = z.infer<typeof TemplatePresetSchema>;
348
424
  export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SettingsSchema = exports.TERMINAL_INPUT_MODES = void 0;
3
+ exports.SettingsSchema = exports.TemplatePresetSchema = exports.TERMINAL_INPUT_MODES = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const terminal_1 = require("../../../common/constants/terminal");
6
6
  const EventTemplateSchema = zod_1.z.object({
@@ -32,12 +32,23 @@ const AutoCleanSettingsSchema = zod_1.z.object({
32
32
  });
33
33
  const RegistryTemplateMetadataSchema = zod_1.z.object({
34
34
  templateSlug: zod_1.z.string(),
35
- source: zod_1.z.enum(['bundled', 'registry']).optional(),
35
+ source: zod_1.z.enum(['bundled', 'registry', 'file']).optional(),
36
36
  installedVersion: zod_1.z.string().nullable(),
37
37
  registryUrl: zod_1.z.string().nullable(),
38
38
  installedAt: zod_1.z.string(),
39
39
  lastUpdateCheckAt: zod_1.z.string().optional(),
40
40
  });
41
+ const TemplatePresetAgentConfigSchema = zod_1.z.object({
42
+ agentName: zod_1.z.string().min(1),
43
+ providerConfigName: zod_1.z.string().min(1),
44
+ });
45
+ exports.TemplatePresetSchema = zod_1.z.object({
46
+ name: zod_1.z.string().min(1),
47
+ description: zod_1.z.string().nullable().optional(),
48
+ agentConfigs: zod_1.z.array(TemplatePresetAgentConfigSchema),
49
+ });
50
+ const ProjectPresetsSchema = zod_1.z.record(zod_1.z.string(), zod_1.z.array(exports.TemplatePresetSchema));
51
+ const ProjectActivePresetsSchema = zod_1.z.record(zod_1.z.string(), zod_1.z.string().nullable());
41
52
  const RegistryConfigSchema = zod_1.z.object({
42
53
  url: zod_1.z.string().url().optional(),
43
54
  cacheDir: zod_1.z.string().optional(),
@@ -83,5 +94,7 @@ exports.SettingsSchema = zod_1.z.object({
83
94
  messagePool: MessagePoolSettingsSchema.optional(),
84
95
  registry: RegistryConfigSchema.optional(),
85
96
  registryTemplates: zod_1.z.record(zod_1.z.string(), RegistryTemplateMetadataSchema).optional(),
97
+ projectPresets: ProjectPresetsSchema.optional(),
98
+ projectActivePresets: ProjectActivePresetsSchema.optional(),
86
99
  });
87
100
  //# sourceMappingURL=settings.dto.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.dto.js","sourceRoot":"","sources":["../../../../src/modules/settings/dtos/settings.dto.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings.dto.js","sourceRoot":"","sources":["../../../../src/modules/settings/dtos/settings.dto.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { EventEmitter2 } from '@nestjs/event-emitter';
2
- import { SettingsDto, MessagePoolSettingsDto, TerminalInputMode, RegistryTemplateMetadataDto, RegistryConfigDto } from '../dtos/settings.dto';
2
+ import { SettingsDto, MessagePoolSettingsDto, TerminalInputMode, RegistryTemplateMetadataDto, RegistryConfigDto, TemplatePresetDto } from '../dtos/settings.dto';
3
3
  import { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';
4
4
  import { DEFAULT_TERMINAL_SCROLLBACK, MIN_TERMINAL_SCROLLBACK, MAX_TERMINAL_SCROLLBACK } from '../../../common/constants/terminal';
5
5
  export { DEFAULT_TERMINAL_SCROLLBACK, MIN_TERMINAL_SCROLLBACK, MAX_TERMINAL_SCROLLBACK };
@@ -74,4 +74,13 @@ export declare class SettingsService {
74
74
  }>;
75
75
  getAllProjectTemplateMetadataMap(): Map<string, RegistryTemplateMetadataDto>;
76
76
  updateLastUpdateCheck(projectId: string): Promise<void>;
77
+ getProjectPresets(projectId: string): TemplatePresetDto[];
78
+ setProjectPresets(projectId: string, presets: unknown[]): Promise<void>;
79
+ clearProjectPresets(projectId: string): Promise<void>;
80
+ getAllProjectPresetsMap(): Map<string, TemplatePresetDto[]>;
81
+ createProjectPreset(projectId: string, preset: unknown): Promise<void>;
82
+ updateProjectPreset(projectId: string, presetName: string, updates: unknown): Promise<void>;
83
+ deleteProjectPreset(projectId: string, presetName: string): Promise<void>;
84
+ getProjectActivePreset(projectId: string): string | null;
85
+ setProjectActivePreset(projectId: string, presetName: string | null): Promise<void>;
77
86
  }
@@ -220,6 +220,28 @@ let SettingsService = class SettingsService {
220
220
  logger.warn({ error }, 'Failed to parse registryTemplates');
221
221
  }
222
222
  }
223
+ else if (row.key === 'projectPresets') {
224
+ try {
225
+ const map = JSON.parse(row.value);
226
+ if (typeof map === 'object' && map !== null) {
227
+ settings.projectPresets = map;
228
+ }
229
+ }
230
+ catch (error) {
231
+ logger.warn({ error }, 'Failed to parse projectPresets');
232
+ }
233
+ }
234
+ else if (row.key === 'projectActivePresets') {
235
+ try {
236
+ const map = JSON.parse(row.value);
237
+ if (typeof map === 'object' && map !== null) {
238
+ settings.projectActivePresets = map;
239
+ }
240
+ }
241
+ catch (error) {
242
+ logger.warn({ error }, 'Failed to parse projectActivePresets');
243
+ }
244
+ }
223
245
  }
224
246
  const terminalSettings = settings.terminal ?? {};
225
247
  const storedScrollback = terminalSettings.scrollbackLines ?? terminal_1.DEFAULT_TERMINAL_SCROLLBACK;
@@ -363,6 +385,14 @@ let SettingsService = class SettingsService {
363
385
  const encodedMap = JSON.stringify(settings.registryTemplates);
364
386
  stmt.run((0, crypto_1.randomUUID)(), 'registryTemplates', encodedMap, now, now);
365
387
  }
388
+ if (settings.projectPresets !== undefined) {
389
+ const encodedMap = JSON.stringify(settings.projectPresets);
390
+ stmt.run((0, crypto_1.randomUUID)(), 'projectPresets', encodedMap, now, now);
391
+ }
392
+ if (settings.projectActivePresets !== undefined) {
393
+ const encodedMap = JSON.stringify(settings.projectActivePresets);
394
+ stmt.run((0, crypto_1.randomUUID)(), 'projectActivePresets', encodedMap, now, now);
395
+ }
366
396
  })();
367
397
  logger.info('Settings updated');
368
398
  if (settings.terminal?.scrollbackLines !== undefined) {
@@ -657,6 +687,251 @@ let SettingsService = class SettingsService {
657
687
  lastUpdateCheckAt: new Date().toISOString(),
658
688
  });
659
689
  }
690
+ getProjectPresets(projectId) {
691
+ const settings = this.getSettings();
692
+ const rawPresets = settings.projectPresets?.[projectId] ?? [];
693
+ const validatedPresets = [];
694
+ for (const preset of rawPresets) {
695
+ const result = settings_dto_1.TemplatePresetSchema.safeParse(preset);
696
+ if (result.success) {
697
+ validatedPresets.push(result.data);
698
+ }
699
+ else {
700
+ logger.warn({ projectId, preset, issues: result.error.issues }, 'Invalid preset found in storage, filtering out');
701
+ }
702
+ }
703
+ return validatedPresets;
704
+ }
705
+ async setProjectPresets(projectId, presets) {
706
+ const validatedPresets = [];
707
+ const errors = [];
708
+ for (let i = 0; i < presets.length; i++) {
709
+ const preset = presets[i];
710
+ const result = settings_dto_1.TemplatePresetSchema.safeParse(preset);
711
+ if (result.success) {
712
+ validatedPresets.push(result.data);
713
+ }
714
+ else {
715
+ const errorIssues = result.error.issues
716
+ .map((issue) => `[${issue.path.join('.')}] ${issue.message}`)
717
+ .join('; ');
718
+ errors.push(`Preset at index ${i}: ${errorIssues}`);
719
+ }
720
+ }
721
+ if (errors.length > 0) {
722
+ throw new error_types_1.ValidationError('Invalid preset data', {
723
+ projectId,
724
+ errors,
725
+ });
726
+ }
727
+ const currentSettings = this.getSettings();
728
+ const existingPresets = currentSettings.projectPresets ?? {};
729
+ await this.updateSettings({
730
+ projectPresets: {
731
+ ...existingPresets,
732
+ [projectId]: validatedPresets,
733
+ },
734
+ });
735
+ logger.info({ projectId, presetCount: validatedPresets.length }, 'Project presets updated');
736
+ }
737
+ async clearProjectPresets(projectId) {
738
+ const currentSettings = this.getSettings();
739
+ const existingPresets = currentSettings.projectPresets ?? {};
740
+ const { [projectId]: _removed, ...remaining } = existingPresets;
741
+ await this.updateSettings({
742
+ projectPresets: remaining,
743
+ });
744
+ logger.info({ projectId }, 'Project presets cleared');
745
+ }
746
+ getAllProjectPresetsMap() {
747
+ const settings = this.getSettings();
748
+ const presets = settings.projectPresets ?? {};
749
+ return new Map(Object.entries(presets));
750
+ }
751
+ async createProjectPreset(projectId, preset) {
752
+ const result = settings_dto_1.TemplatePresetSchema.safeParse(preset);
753
+ if (!result.success) {
754
+ const errorIssues = result.error.issues
755
+ .map((issue) => `[${issue.path.join('.')}] ${issue.message}`)
756
+ .join('; ');
757
+ throw new error_types_1.ValidationError(`Invalid preset data: ${errorIssues}`, {
758
+ projectId,
759
+ issues: result.error.issues,
760
+ });
761
+ }
762
+ const validatedPreset = result.data;
763
+ const trimmedName = validatedPreset.name.trim();
764
+ if (!trimmedName) {
765
+ throw new error_types_1.ValidationError('Preset name cannot be empty or whitespace only', {
766
+ projectId,
767
+ });
768
+ }
769
+ const existingPresets = this.getProjectPresets(projectId);
770
+ const normalizedName = trimmedName.toLowerCase();
771
+ const nameExists = existingPresets.some((p) => p.name.toLowerCase() === normalizedName);
772
+ if (nameExists) {
773
+ throw new error_types_1.ValidationError(`Preset with name "${trimmedName}" already exists (case-insensitive)`, {
774
+ projectId,
775
+ presetName: trimmedName,
776
+ hint: 'Choose a different name or delete the existing preset first.',
777
+ });
778
+ }
779
+ const currentSettings = this.getSettings();
780
+ const existingPresetsMap = currentSettings.projectPresets ?? {};
781
+ await this.updateSettings({
782
+ projectPresets: {
783
+ ...existingPresetsMap,
784
+ [projectId]: [...existingPresets, { ...validatedPreset, name: trimmedName }],
785
+ },
786
+ });
787
+ logger.info({ projectId, presetName: trimmedName }, 'Preset created');
788
+ }
789
+ async updateProjectPreset(projectId, presetName, updates) {
790
+ const existingPresets = this.getProjectPresets(projectId);
791
+ const normalizedName = presetName.trim().toLowerCase();
792
+ const presetIndex = existingPresets.findIndex((p) => p.name.toLowerCase() === normalizedName);
793
+ if (presetIndex === -1) {
794
+ throw new error_types_1.ValidationError(`Preset "${presetName.trim()}" not found`, {
795
+ projectId,
796
+ presetName: presetName.trim(),
797
+ });
798
+ }
799
+ const existingPreset = existingPresets[presetIndex];
800
+ const mergedPreset = { ...existingPreset };
801
+ if (typeof updates === 'object' && updates !== null) {
802
+ const updateObj = updates;
803
+ if ('name' in updateObj) {
804
+ if (typeof updateObj.name !== 'string') {
805
+ throw new error_types_1.ValidationError(`Invalid preset update: name must be a string`, {
806
+ projectId,
807
+ presetName,
808
+ });
809
+ }
810
+ mergedPreset.name = updateObj.name;
811
+ }
812
+ if ('description' in updateObj) {
813
+ if (updateObj.description !== null && typeof updateObj.description !== 'string') {
814
+ throw new error_types_1.ValidationError(`Invalid preset update: description must be a string or null`, {
815
+ projectId,
816
+ presetName,
817
+ });
818
+ }
819
+ mergedPreset.description = updateObj.description;
820
+ }
821
+ if ('agentConfigs' in updateObj) {
822
+ if (!Array.isArray(updateObj.agentConfigs)) {
823
+ throw new error_types_1.ValidationError(`Invalid preset update: agentConfigs must be an array`, {
824
+ projectId,
825
+ presetName,
826
+ });
827
+ }
828
+ mergedPreset.agentConfigs = updateObj.agentConfigs;
829
+ }
830
+ }
831
+ const result = settings_dto_1.TemplatePresetSchema.safeParse(mergedPreset);
832
+ if (!result.success) {
833
+ const errorIssues = result.error.issues
834
+ .map((issue) => `[${issue.path.join('.')}] ${issue.message}`)
835
+ .join('; ');
836
+ throw new error_types_1.ValidationError(`Invalid preset update: ${errorIssues}`, {
837
+ projectId,
838
+ presetName,
839
+ issues: result.error.issues,
840
+ });
841
+ }
842
+ const validatedPreset = result.data;
843
+ const trimmedName = validatedPreset.name.trim();
844
+ validatedPreset.name = trimmedName;
845
+ if (trimmedName.toLowerCase() !== normalizedName) {
846
+ const nameExists = existingPresets.some((p, idx) => idx !== presetIndex && p.name.toLowerCase() === trimmedName.toLowerCase());
847
+ if (nameExists) {
848
+ throw new error_types_1.ValidationError(`Preset with name "${trimmedName}" already exists (case-insensitive)`, {
849
+ projectId,
850
+ presetName: trimmedName,
851
+ hint: 'Choose a different name.',
852
+ });
853
+ }
854
+ }
855
+ const updatedPresets = [...existingPresets];
856
+ updatedPresets.splice(presetIndex, 1);
857
+ updatedPresets.push(validatedPreset);
858
+ const currentSettings = this.getSettings();
859
+ const existingPresetsMap = currentSettings.projectPresets ?? {};
860
+ const existingActivePresets = currentSettings.projectActivePresets ?? {};
861
+ const updatePayload = {
862
+ projectPresets: {
863
+ ...existingPresetsMap,
864
+ [projectId]: updatedPresets,
865
+ },
866
+ };
867
+ if (trimmedName.toLowerCase() !== normalizedName) {
868
+ const originalName = existingPreset.name;
869
+ const currentActivePreset = existingActivePresets[projectId];
870
+ if (currentActivePreset && currentActivePreset.toLowerCase() === originalName.toLowerCase()) {
871
+ updatePayload.projectActivePresets = {
872
+ ...existingActivePresets,
873
+ [projectId]: trimmedName,
874
+ };
875
+ logger.info({ projectId, oldName: currentActivePreset, newName: trimmedName }, 'Active preset migrated after rename (case-insensitive)');
876
+ }
877
+ }
878
+ await this.updateSettings(updatePayload);
879
+ logger.info({ projectId, presetName: trimmedName }, 'Preset updated');
880
+ }
881
+ async deleteProjectPreset(projectId, presetName) {
882
+ const existingPresets = this.getProjectPresets(projectId);
883
+ const normalizedName = presetName.trim().toLowerCase();
884
+ const presetIndex = existingPresets.findIndex((p) => p.name.toLowerCase() === normalizedName);
885
+ if (presetIndex === -1) {
886
+ throw new error_types_1.ValidationError(`Preset "${presetName.trim()}" not found`, {
887
+ projectId,
888
+ presetName: presetName.trim(),
889
+ });
890
+ }
891
+ const deletedPreset = existingPresets[presetIndex];
892
+ const updatedPresets = existingPresets.filter((_, idx) => idx !== presetIndex);
893
+ const currentSettings = this.getSettings();
894
+ const existingPresetsMap = currentSettings.projectPresets ?? {};
895
+ const existingActivePresets = currentSettings.projectActivePresets ?? {};
896
+ const updatePayload = {
897
+ projectPresets: {
898
+ ...existingPresetsMap,
899
+ [projectId]: updatedPresets,
900
+ },
901
+ };
902
+ const currentActivePreset = existingActivePresets[projectId];
903
+ if (currentActivePreset && currentActivePreset.toLowerCase() === deletedPreset.name.toLowerCase()) {
904
+ const { [projectId]: _removed, ...remainingActivePresets } = existingActivePresets;
905
+ updatePayload.projectActivePresets = remainingActivePresets;
906
+ logger.info({ projectId, presetName: deletedPreset.name, activePreset: currentActivePreset }, 'Active preset cleared after preset deletion (case-insensitive)');
907
+ }
908
+ await this.updateSettings(updatePayload);
909
+ logger.info({ projectId, presetName: deletedPreset.name }, 'Preset deleted');
910
+ }
911
+ getProjectActivePreset(projectId) {
912
+ const settings = this.getSettings();
913
+ return settings.projectActivePresets?.[projectId] ?? null;
914
+ }
915
+ async setProjectActivePreset(projectId, presetName) {
916
+ const currentSettings = this.getSettings();
917
+ const existingActivePresets = currentSettings.projectActivePresets ?? {};
918
+ if (presetName === null) {
919
+ const { [projectId]: _removed, ...remaining } = existingActivePresets;
920
+ await this.updateSettings({
921
+ projectActivePresets: remaining,
922
+ });
923
+ logger.info({ projectId }, 'Project active preset cleared');
924
+ }
925
+ else {
926
+ await this.updateSettings({
927
+ projectActivePresets: {
928
+ ...existingActivePresets,
929
+ [projectId]: presetName,
930
+ },
931
+ });
932
+ logger.info({ projectId, presetName }, 'Project active preset set');
933
+ }
934
+ }
660
935
  };
661
936
  exports.SettingsService = SettingsService;
662
937
  exports.SettingsService = SettingsService = __decorate([