devchain-cli 0.3.2 → 0.4.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 (153) hide show
  1. package/README.md +14 -0
  2. package/dist/server/app.module.js +2 -0
  3. package/dist/server/app.module.js.map +1 -1
  4. package/dist/server/common/constants/terminal.d.ts +3 -0
  5. package/dist/server/common/constants/terminal.js +7 -0
  6. package/dist/server/common/constants/terminal.js.map +1 -0
  7. package/dist/server/common/validation/template-validation.d.ts +8 -0
  8. package/dist/server/common/validation/template-validation.js +18 -0
  9. package/dist/server/common/validation/template-validation.js.map +1 -0
  10. package/dist/server/modules/epics/services/epics.service.d.ts +2 -0
  11. package/dist/server/modules/epics/services/epics.service.js +194 -32
  12. package/dist/server/modules/epics/services/epics.service.js.map +1 -1
  13. package/dist/server/modules/events/catalog/epic.assigned.d.ts +9 -13
  14. package/dist/server/modules/events/catalog/epic.assigned.js +5 -5
  15. package/dist/server/modules/events/catalog/epic.assigned.js.map +1 -1
  16. package/dist/server/modules/events/catalog/epic.created.d.ts +39 -0
  17. package/dist/server/modules/events/catalog/epic.created.js +20 -0
  18. package/dist/server/modules/events/catalog/epic.created.js.map +1 -0
  19. package/dist/server/modules/events/catalog/epic.updated.d.ts +178 -0
  20. package/dist/server/modules/events/catalog/epic.updated.js +43 -0
  21. package/dist/server/modules/events/catalog/epic.updated.js.map +1 -0
  22. package/dist/server/modules/events/catalog/index.d.ts +221 -12
  23. package/dist/server/modules/events/catalog/index.js +9 -1
  24. package/dist/server/modules/events/catalog/index.js.map +1 -1
  25. package/dist/server/modules/events/catalog/settings.terminal.changed.d.ts +12 -0
  26. package/dist/server/modules/events/catalog/settings.terminal.changed.js +11 -0
  27. package/dist/server/modules/events/catalog/settings.terminal.changed.js.map +1 -0
  28. package/dist/server/modules/events/services/events.service.js +0 -7
  29. package/dist/server/modules/events/services/events.service.js.map +1 -1
  30. package/dist/server/modules/events/subscribers/chat-message-delivery.subscriber.d.ts +5 -2
  31. package/dist/server/modules/events/subscribers/chat-message-delivery.subscriber.js +44 -24
  32. package/dist/server/modules/events/subscribers/chat-message-delivery.subscriber.js.map +1 -1
  33. package/dist/server/modules/events/subscribers/epic-assignment-notifier.subscriber.d.ts +5 -8
  34. package/dist/server/modules/events/subscribers/epic-assignment-notifier.subscriber.js +37 -56
  35. package/dist/server/modules/events/subscribers/epic-assignment-notifier.subscriber.js.map +1 -1
  36. package/dist/server/modules/mcp/dtos/mcp.dto.d.ts +8 -6
  37. package/dist/server/modules/mcp/dtos/mcp.dto.js.map +1 -1
  38. package/dist/server/modules/mcp/mcp.module.js +2 -0
  39. package/dist/server/modules/mcp/mcp.module.js.map +1 -1
  40. package/dist/server/modules/mcp/services/mcp.service.d.ts +5 -1
  41. package/dist/server/modules/mcp/services/mcp.service.js +65 -33
  42. package/dist/server/modules/mcp/services/mcp.service.js.map +1 -1
  43. package/dist/server/modules/projects/controllers/projects.controller.d.ts +140 -6
  44. package/dist/server/modules/projects/controllers/projects.controller.js +91 -31
  45. package/dist/server/modules/projects/controllers/projects.controller.js.map +1 -1
  46. package/dist/server/modules/projects/dtos/export.dto.d.ts +91 -0
  47. package/dist/server/modules/projects/dtos/export.dto.js +38 -0
  48. package/dist/server/modules/projects/dtos/export.dto.js.map +1 -0
  49. package/dist/server/modules/projects/projects.module.js +1 -0
  50. package/dist/server/modules/projects/projects.module.js.map +1 -1
  51. package/dist/server/modules/projects/services/projects.service.d.ts +37 -3
  52. package/dist/server/modules/projects/services/projects.service.js +353 -526
  53. package/dist/server/modules/projects/services/projects.service.js.map +1 -1
  54. package/dist/server/modules/registry/controllers/registry.controller.d.ts +98 -0
  55. package/dist/server/modules/registry/controllers/registry.controller.js +352 -0
  56. package/dist/server/modules/registry/controllers/registry.controller.js.map +1 -0
  57. package/dist/server/modules/registry/controllers/templates.controller.d.ts +35 -0
  58. package/dist/server/modules/registry/controllers/templates.controller.js +157 -0
  59. package/dist/server/modules/registry/controllers/templates.controller.js.map +1 -0
  60. package/dist/server/modules/registry/dtos/registry-error.d.ts +11 -0
  61. package/dist/server/modules/registry/dtos/registry-error.js +30 -0
  62. package/dist/server/modules/registry/dtos/registry-error.js.map +1 -0
  63. package/dist/server/modules/registry/dtos/registry.dto.d.ts +7 -0
  64. package/dist/server/modules/registry/dtos/registry.dto.js +50 -0
  65. package/dist/server/modules/registry/dtos/registry.dto.js.map +1 -0
  66. package/dist/server/modules/registry/index.d.ts +7 -0
  67. package/dist/server/modules/registry/index.js +24 -0
  68. package/dist/server/modules/registry/index.js.map +1 -0
  69. package/dist/server/modules/registry/interfaces/registry.interface.d.ts +68 -0
  70. package/dist/server/modules/registry/interfaces/registry.interface.js +3 -0
  71. package/dist/server/modules/registry/interfaces/registry.interface.js.map +1 -0
  72. package/dist/server/modules/registry/registry.module.d.ts +2 -0
  73. package/dist/server/modules/registry/registry.module.js +45 -0
  74. package/dist/server/modules/registry/registry.module.js.map +1 -0
  75. package/dist/server/modules/registry/services/registry-client.service.d.ts +14 -0
  76. package/dist/server/modules/registry/services/registry-client.service.js +226 -0
  77. package/dist/server/modules/registry/services/registry-client.service.js.map +1 -0
  78. package/dist/server/modules/registry/services/registry-orchestration.service.d.ts +45 -0
  79. package/dist/server/modules/registry/services/registry-orchestration.service.js +165 -0
  80. package/dist/server/modules/registry/services/registry-orchestration.service.js.map +1 -0
  81. package/dist/server/modules/registry/services/template-cache.service.d.ts +66 -0
  82. package/dist/server/modules/registry/services/template-cache.service.js +310 -0
  83. package/dist/server/modules/registry/services/template-cache.service.js.map +1 -0
  84. package/dist/server/modules/registry/services/template-upgrade.service.d.ts +41 -0
  85. package/dist/server/modules/registry/services/template-upgrade.service.js +212 -0
  86. package/dist/server/modules/registry/services/template-upgrade.service.js.map +1 -0
  87. package/dist/server/modules/registry/services/unified-template.service.d.ts +35 -0
  88. package/dist/server/modules/registry/services/unified-template.service.js +228 -0
  89. package/dist/server/modules/registry/services/unified-template.service.js.map +1 -0
  90. package/dist/server/modules/sessions/controllers/sessions.controller.d.ts +32 -1
  91. package/dist/server/modules/sessions/controllers/sessions.controller.js +150 -8
  92. package/dist/server/modules/sessions/controllers/sessions.controller.js.map +1 -1
  93. package/dist/server/modules/sessions/services/message-activity-stream.service.d.ts +12 -0
  94. package/dist/server/modules/sessions/services/message-activity-stream.service.js +51 -0
  95. package/dist/server/modules/sessions/services/message-activity-stream.service.js.map +1 -0
  96. package/dist/server/modules/sessions/services/sessions-message-pool.service.d.ts +125 -0
  97. package/dist/server/modules/sessions/services/sessions-message-pool.service.js +599 -0
  98. package/dist/server/modules/sessions/services/sessions-message-pool.service.js.map +1 -0
  99. package/dist/server/modules/sessions/services/sessions.service.d.ts +2 -9
  100. package/dist/server/modules/sessions/services/sessions.service.js +32 -27
  101. package/dist/server/modules/sessions/services/sessions.service.js.map +1 -1
  102. package/dist/server/modules/sessions/sessions.module.js +16 -2
  103. package/dist/server/modules/sessions/sessions.module.js.map +1 -1
  104. package/dist/server/modules/settings/dtos/settings.dto.d.ts +231 -0
  105. package/dist/server/modules/settings/dtos/settings.dto.js +40 -1
  106. package/dist/server/modules/settings/dtos/settings.dto.js.map +1 -1
  107. package/dist/server/modules/settings/services/settings.service.d.ts +56 -15
  108. package/dist/server/modules/settings/services/settings.service.js +295 -10
  109. package/dist/server/modules/settings/services/settings.service.js.map +1 -1
  110. package/dist/server/modules/subscribers/actions/action.interface.d.ts +2 -0
  111. package/dist/server/modules/subscribers/actions/send-message.action.js +34 -11
  112. package/dist/server/modules/subscribers/actions/send-message.action.js.map +1 -1
  113. package/dist/server/modules/subscribers/events/event-fields-catalog.js +109 -6
  114. package/dist/server/modules/subscribers/events/event-fields-catalog.js.map +1 -1
  115. package/dist/server/modules/subscribers/services/subscriber-executor.service.d.ts +3 -1
  116. package/dist/server/modules/subscribers/services/subscriber-executor.service.js +13 -1
  117. package/dist/server/modules/subscribers/services/subscriber-executor.service.js.map +1 -1
  118. package/dist/server/modules/terminal/dtos/ws-envelope.dto.d.ts +20 -0
  119. package/dist/server/modules/terminal/dtos/ws-envelope.dto.js +8 -1
  120. package/dist/server/modules/terminal/dtos/ws-envelope.dto.js.map +1 -1
  121. package/dist/server/modules/terminal/gateways/terminal.gateway.d.ts +1 -3
  122. package/dist/server/modules/terminal/gateways/terminal.gateway.js +50 -11
  123. package/dist/server/modules/terminal/gateways/terminal.gateway.js.map +1 -1
  124. package/dist/server/modules/terminal/services/pty.service.d.ts +1 -3
  125. package/dist/server/modules/terminal/services/pty.service.js +2 -14
  126. package/dist/server/modules/terminal/services/pty.service.js.map +1 -1
  127. package/dist/server/modules/terminal/services/terminal-seed.service.d.ts +6 -4
  128. package/dist/server/modules/terminal/services/terminal-seed.service.js +74 -67
  129. package/dist/server/modules/terminal/services/terminal-seed.service.js.map +1 -1
  130. package/dist/server/modules/terminal/services/tmux.service.js +3 -2
  131. package/dist/server/modules/terminal/services/tmux.service.js.map +1 -1
  132. package/dist/server/modules/terminal/terminal.module.js +0 -3
  133. package/dist/server/modules/terminal/terminal.module.js.map +1 -1
  134. package/dist/server/templates/claude-codex-advanced.json +132 -70
  135. package/dist/server/templates/claude-opus.json +32 -20
  136. package/dist/server/templates/simple-codex.json +32 -20
  137. package/dist/server/test-setup.js +19 -0
  138. package/dist/server/test-setup.js.map +1 -1
  139. package/dist/server/tsconfig.tsbuildinfo +1 -1
  140. package/dist/server/ui/assets/index-BkGGbapJ.css +32 -0
  141. package/dist/server/ui/assets/index-DLpDwHdv.js +733 -0
  142. package/dist/server/ui/index.html +2 -2
  143. package/dist/templates/claude-codex-advanced.json +132 -70
  144. package/dist/templates/claude-opus.json +32 -20
  145. package/dist/templates/simple-codex.json +32 -20
  146. package/package.json +15 -4
  147. package/dist/server/modules/terminal/services/terminal-emulator.service.d.ts +0 -40
  148. package/dist/server/modules/terminal/services/terminal-emulator.service.js +0 -356
  149. package/dist/server/modules/terminal/services/terminal-emulator.service.js.map +0 -1
  150. package/dist/server/templates/claude-codex-advanced-swe.json +0 -130
  151. package/dist/server/ui/assets/index-C9GXCjnF.js +0 -700
  152. package/dist/server/ui/assets/index-o0FbZg-1.css +0 -32
  153. package/dist/templates/claude-codex-advanced-swe.json +0 -130
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.RegistryClientService = void 0;
46
+ const common_1 = require("@nestjs/common");
47
+ const crypto = __importStar(require("crypto"));
48
+ const semver = __importStar(require("semver"));
49
+ const logger_1 = require("../../../common/logging/logger");
50
+ const settings_service_1 = require("../../settings/services/settings.service");
51
+ const registry_error_1 = require("../dtos/registry-error");
52
+ const logger = (0, logger_1.createLogger)('RegistryClientService');
53
+ const HEALTH_CHECK_TIMEOUT_MS = 5000;
54
+ const DEFAULT_REQUEST_TIMEOUT_MS = 30000;
55
+ let RegistryClientService = class RegistryClientService {
56
+ constructor(settingsService) {
57
+ this.settingsService = settingsService;
58
+ logger.info('RegistryClientService initialized');
59
+ }
60
+ getBaseUrl() {
61
+ return this.settingsService.getRegistryConfig().url;
62
+ }
63
+ async listTemplates(query) {
64
+ const params = new URLSearchParams();
65
+ if (query?.search)
66
+ params.set('search', query.search);
67
+ if (query?.category)
68
+ params.set('category', query.category);
69
+ if (query?.tags && query.tags.length > 0)
70
+ params.set('tags', query.tags.join(','));
71
+ if (query?.page)
72
+ params.set('page', String(query.page));
73
+ if (query?.limit)
74
+ params.set('limit', String(query.limit));
75
+ if (query?.sort)
76
+ params.set('sort', query.sort);
77
+ if (query?.order)
78
+ params.set('order', query.order);
79
+ const url = `${this.getBaseUrl()}/api/v1/templates${params.toString() ? `?${params}` : ''}`;
80
+ try {
81
+ const response = await this.fetchWithTimeout(url);
82
+ if (!response.ok) {
83
+ throw new registry_error_1.RegistryError(`Failed to fetch templates: ${response.status} ${response.statusText}`);
84
+ }
85
+ return (await response.json());
86
+ }
87
+ catch (error) {
88
+ if (error instanceof registry_error_1.RegistryError)
89
+ throw error;
90
+ throw new registry_error_1.RegistryError('Failed to fetch templates', error instanceof Error ? error : undefined);
91
+ }
92
+ }
93
+ async getTemplate(slug) {
94
+ const url = `${this.getBaseUrl()}/api/v1/templates/${encodeURIComponent(slug)}`;
95
+ try {
96
+ const response = await this.fetchWithTimeout(url);
97
+ if (response.status === 404) {
98
+ return null;
99
+ }
100
+ if (!response.ok) {
101
+ throw new registry_error_1.RegistryError(`Failed to fetch template: ${response.status} ${response.statusText}`);
102
+ }
103
+ return (await response.json());
104
+ }
105
+ catch (error) {
106
+ if (error instanceof registry_error_1.RegistryError)
107
+ throw error;
108
+ throw new registry_error_1.RegistryError(`Failed to fetch template "${slug}"`, error instanceof Error ? error : undefined);
109
+ }
110
+ }
111
+ async downloadTemplate(slug, version) {
112
+ const url = `${this.getBaseUrl()}/api/v1/download/${encodeURIComponent(slug)}/${encodeURIComponent(version)}`;
113
+ try {
114
+ const response = await this.fetchWithTimeout(url);
115
+ if (response.status === 404) {
116
+ throw new registry_error_1.RegistryError(`Template "${slug}" version "${version}" not found`);
117
+ }
118
+ if (!response.ok) {
119
+ throw new registry_error_1.RegistryError(`Failed to download template: ${response.status} ${response.statusText}`);
120
+ }
121
+ const expectedChecksum = response.headers.get('X-Checksum-SHA256');
122
+ const rawText = await response.text();
123
+ const computedChecksum = crypto.createHash('sha256').update(rawText).digest('hex');
124
+ if (expectedChecksum && computedChecksum !== expectedChecksum) {
125
+ throw new registry_error_1.ChecksumMismatchError(expectedChecksum, computedChecksum);
126
+ }
127
+ const content = JSON.parse(rawText);
128
+ logger.info({ slug, version, checksum: computedChecksum.substring(0, 16) + '...' }, 'Template downloaded and verified');
129
+ return {
130
+ content,
131
+ checksum: computedChecksum,
132
+ slug,
133
+ version,
134
+ };
135
+ }
136
+ catch (error) {
137
+ if (error instanceof registry_error_1.RegistryError || error instanceof registry_error_1.ChecksumMismatchError) {
138
+ throw error;
139
+ }
140
+ throw new registry_error_1.RegistryError(`Failed to download template "${slug}" version "${version}"`, error instanceof Error ? error : undefined);
141
+ }
142
+ }
143
+ async checkForUpdates(installed) {
144
+ const updates = [];
145
+ for (const template of installed) {
146
+ try {
147
+ const remote = await this.getTemplate(template.slug);
148
+ if (!remote) {
149
+ logger.debug({ slug: template.slug }, 'Template not found in registry');
150
+ continue;
151
+ }
152
+ const latestVersion = remote.versions.find((v) => v.isLatest);
153
+ if (latestVersion &&
154
+ semver.valid(latestVersion.version) &&
155
+ semver.valid(template.version)) {
156
+ if (semver.gt(latestVersion.version, template.version)) {
157
+ updates.push({
158
+ slug: template.slug,
159
+ currentVersion: template.version,
160
+ latestVersion: latestVersion.version,
161
+ changelog: latestVersion.changelog,
162
+ });
163
+ logger.info({
164
+ slug: template.slug,
165
+ current: template.version,
166
+ latest: latestVersion.version,
167
+ }, 'Update available');
168
+ }
169
+ }
170
+ }
171
+ catch (error) {
172
+ logger.warn({ slug: template.slug, error: error instanceof Error ? error.message : String(error) }, 'Failed to check for updates');
173
+ }
174
+ }
175
+ return updates;
176
+ }
177
+ async isAvailable() {
178
+ const healthUrl = `${this.getBaseUrl()}/health`;
179
+ try {
180
+ const controller = new AbortController();
181
+ const timeoutId = setTimeout(() => controller.abort(), HEALTH_CHECK_TIMEOUT_MS);
182
+ try {
183
+ const response = await fetch(healthUrl, {
184
+ signal: controller.signal,
185
+ });
186
+ return response.ok;
187
+ }
188
+ finally {
189
+ clearTimeout(timeoutId);
190
+ }
191
+ }
192
+ catch (error) {
193
+ logger.debug({ healthUrl, error: error instanceof Error ? error.message : String(error) }, 'Registry health check failed');
194
+ return false;
195
+ }
196
+ }
197
+ getRegistryUrl() {
198
+ return this.getBaseUrl();
199
+ }
200
+ async fetchWithTimeout(url, options = {}, timeoutMs = DEFAULT_REQUEST_TIMEOUT_MS) {
201
+ const controller = new AbortController();
202
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
203
+ try {
204
+ const response = await fetch(url, {
205
+ ...options,
206
+ signal: controller.signal,
207
+ });
208
+ return response;
209
+ }
210
+ catch (error) {
211
+ if (error instanceof Error && error.name === 'AbortError') {
212
+ throw new registry_error_1.RegistryUnavailableError('Request timed out');
213
+ }
214
+ throw error;
215
+ }
216
+ finally {
217
+ clearTimeout(timeoutId);
218
+ }
219
+ }
220
+ };
221
+ exports.RegistryClientService = RegistryClientService;
222
+ exports.RegistryClientService = RegistryClientService = __decorate([
223
+ (0, common_1.Injectable)(),
224
+ __metadata("design:paramtypes", [settings_service_1.SettingsService])
225
+ ], RegistryClientService);
226
+ //# sourceMappingURL=registry-client.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-client.service.js","sourceRoot":"","sources":["../../../../src/modules/registry/services/registry-client.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { RegistryClientService } from './registry-client.service';
2
+ import { TemplateCacheService } from './template-cache.service';
3
+ import { SettingsService } from '../../settings/services/settings.service';
4
+ import { StorageService } from '../../storage/interfaces/storage.interface';
5
+ import { ProjectsService } from '../../projects/services/projects.service';
6
+ export interface CreateFromRegistryInput {
7
+ slug: string;
8
+ version: string;
9
+ projectName: string;
10
+ projectDescription?: string;
11
+ rootPath: string;
12
+ }
13
+ export interface CreateFromRegistryResult {
14
+ project: {
15
+ id: string;
16
+ name: string;
17
+ rootPath: string;
18
+ };
19
+ fromRegistry: true;
20
+ templateSlug: string;
21
+ templateVersion: string;
22
+ imported: {
23
+ prompts: number;
24
+ profiles: number;
25
+ agents: number;
26
+ statuses: number;
27
+ };
28
+ }
29
+ export declare class RegistryOrchestrationService {
30
+ private readonly registryClient;
31
+ private readonly cacheService;
32
+ private readonly settingsService;
33
+ private readonly storage;
34
+ private readonly projectsService;
35
+ constructor(registryClient: RegistryClientService, cacheService: TemplateCacheService, settingsService: SettingsService, storage: StorageService, projectsService: ProjectsService);
36
+ downloadToCache(slug: string, version: string): Promise<void>;
37
+ createProjectFromRegistry(input: CreateFromRegistryInput): Promise<CreateFromRegistryResult>;
38
+ isCached(slug: string, version: string): boolean;
39
+ getFromCache(slug: string, version: string): Promise<import("./template-cache.service").CachedTemplate | null>;
40
+ checkForUpdates(projectId: string): Promise<{
41
+ hasUpdate: boolean;
42
+ currentVersion: string;
43
+ latestVersion: string;
44
+ } | null>;
45
+ }
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.RegistryOrchestrationService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const logger_1 = require("../../../common/logging/logger");
18
+ const registry_client_service_1 = require("./registry-client.service");
19
+ const template_cache_service_1 = require("./template-cache.service");
20
+ const settings_service_1 = require("../../settings/services/settings.service");
21
+ const storage_interface_1 = require("../../storage/interfaces/storage.interface");
22
+ const projects_service_1 = require("../../projects/services/projects.service");
23
+ const logger = (0, logger_1.createLogger)('RegistryOrchestrationService');
24
+ let RegistryOrchestrationService = class RegistryOrchestrationService {
25
+ constructor(registryClient, cacheService, settingsService, storage, projectsService) {
26
+ this.registryClient = registryClient;
27
+ this.cacheService = cacheService;
28
+ this.settingsService = settingsService;
29
+ this.storage = storage;
30
+ this.projectsService = projectsService;
31
+ }
32
+ async downloadToCache(slug, version) {
33
+ if (this.cacheService.isCached(slug, version)) {
34
+ logger.debug({ slug, version }, 'Template already cached');
35
+ return;
36
+ }
37
+ logger.info({ slug, version }, 'Downloading template from registry');
38
+ const result = await this.registryClient.downloadTemplate(slug, version);
39
+ const contentStr = JSON.stringify(result.content);
40
+ const size = Buffer.byteLength(contentStr, 'utf-8');
41
+ await this.cacheService.saveTemplate(slug, version, result.content, {
42
+ cachedAt: new Date().toISOString(),
43
+ checksum: result.checksum,
44
+ size,
45
+ });
46
+ logger.info({ slug, version, checksum: result.checksum }, 'Template cached');
47
+ }
48
+ async createProjectFromRegistry(input) {
49
+ const { slug, version, projectName, projectDescription, rootPath } = input;
50
+ logger.info({ slug, version, projectName, rootPath }, 'Creating project from registry');
51
+ await this.downloadToCache(slug, version);
52
+ const cached = await this.cacheService.getTemplate(slug, version);
53
+ if (!cached) {
54
+ throw new common_1.BadRequestException({
55
+ message: 'Template not found in cache after download',
56
+ slug,
57
+ version,
58
+ });
59
+ }
60
+ const templateContent = cached.content;
61
+ if (!templateContent || typeof templateContent !== 'object') {
62
+ throw new common_1.BadRequestException({
63
+ message: 'Invalid template format',
64
+ hint: 'Template content is not a valid object',
65
+ });
66
+ }
67
+ const project = await this.storage.createProject({
68
+ name: projectName,
69
+ description: projectDescription ?? null,
70
+ rootPath,
71
+ isTemplate: false,
72
+ });
73
+ logger.info({ projectId: project.id }, 'Created bare project');
74
+ let importResult = { prompts: 0, profiles: 0, agents: 0, statuses: 0 };
75
+ try {
76
+ const importResponse = await this.projectsService.importProject({
77
+ projectId: project.id,
78
+ payload: templateContent,
79
+ dryRun: false,
80
+ });
81
+ if (importResponse && typeof importResponse === 'object' && 'imported' in importResponse) {
82
+ const imported = importResponse.imported;
83
+ importResult = {
84
+ prompts: imported.prompts ?? 0,
85
+ profiles: imported.profiles ?? 0,
86
+ agents: imported.agents ?? 0,
87
+ statuses: imported.statuses ?? 0,
88
+ };
89
+ }
90
+ logger.info({ projectId: project.id, importResult }, 'Template content imported');
91
+ }
92
+ catch (error) {
93
+ logger.error({ projectId: project.id, error: error instanceof Error ? error.message : String(error) }, 'Failed to import template content, project created but template not applied');
94
+ if (error instanceof common_1.BadRequestException) {
95
+ const errorResponse = error.getResponse();
96
+ if (errorResponse?.missingProviders) {
97
+ throw error;
98
+ }
99
+ }
100
+ }
101
+ await this.settingsService.setProjectTemplateMetadata(project.id, {
102
+ templateSlug: slug,
103
+ installedVersion: version,
104
+ registryUrl: this.settingsService.getRegistryConfig().url,
105
+ installedAt: new Date().toISOString(),
106
+ });
107
+ logger.info({ projectId: project.id, slug, version }, 'Project created from registry template');
108
+ return {
109
+ project: {
110
+ id: project.id,
111
+ name: project.name,
112
+ rootPath: project.rootPath,
113
+ },
114
+ fromRegistry: true,
115
+ templateSlug: slug,
116
+ templateVersion: version,
117
+ imported: importResult,
118
+ };
119
+ }
120
+ isCached(slug, version) {
121
+ return this.cacheService.isCached(slug, version);
122
+ }
123
+ async getFromCache(slug, version) {
124
+ return this.cacheService.getTemplate(slug, version);
125
+ }
126
+ async checkForUpdates(projectId) {
127
+ const metadata = this.settingsService.getProjectTemplateMetadata(projectId);
128
+ if (!metadata) {
129
+ return null;
130
+ }
131
+ try {
132
+ const template = await this.registryClient.getTemplate(metadata.templateSlug);
133
+ if (!template) {
134
+ return null;
135
+ }
136
+ const latestVersion = template.versions.find((v) => v.isLatest);
137
+ if (!latestVersion) {
138
+ return null;
139
+ }
140
+ await this.settingsService.updateLastUpdateCheck(projectId);
141
+ if (!metadata.installedVersion) {
142
+ return null;
143
+ }
144
+ return {
145
+ hasUpdate: metadata.installedVersion !== latestVersion.version,
146
+ currentVersion: metadata.installedVersion,
147
+ latestVersion: latestVersion.version,
148
+ };
149
+ }
150
+ catch (error) {
151
+ logger.warn({ projectId, templateSlug: metadata.templateSlug, error }, 'Failed to check for updates');
152
+ return null;
153
+ }
154
+ }
155
+ };
156
+ exports.RegistryOrchestrationService = RegistryOrchestrationService;
157
+ exports.RegistryOrchestrationService = RegistryOrchestrationService = __decorate([
158
+ (0, common_1.Injectable)(),
159
+ __param(3, (0, common_1.Inject)(storage_interface_1.STORAGE_SERVICE)),
160
+ __param(4, (0, common_1.Inject)((0, common_1.forwardRef)(() => projects_service_1.ProjectsService))),
161
+ __metadata("design:paramtypes", [registry_client_service_1.RegistryClientService,
162
+ template_cache_service_1.TemplateCacheService,
163
+ settings_service_1.SettingsService, Object, projects_service_1.ProjectsService])
164
+ ], RegistryOrchestrationService);
165
+ //# sourceMappingURL=registry-orchestration.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-orchestration.service.js","sourceRoot":"","sources":["../../../../src/modules/registry/services/registry-orchestration.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { SettingsService } from '../../settings/services/settings.service';
3
+ export interface VersionMetadata {
4
+ cachedAt: string;
5
+ checksum: string;
6
+ size: number;
7
+ version: string;
8
+ slug: string;
9
+ }
10
+ interface CacheIndexEntry {
11
+ versions: Record<string, {
12
+ cachedAt: string;
13
+ checksum: string;
14
+ size: number;
15
+ }>;
16
+ latestVersion: string;
17
+ displayName?: string;
18
+ description?: string | null;
19
+ category?: string;
20
+ tags?: string[];
21
+ authorName?: string;
22
+ isOfficial?: boolean;
23
+ }
24
+ export interface CacheIndex {
25
+ templates: Record<string, CacheIndexEntry>;
26
+ updatedAt: string;
27
+ }
28
+ export interface CachedTemplate {
29
+ content: Record<string, unknown>;
30
+ metadata: VersionMetadata;
31
+ }
32
+ export interface CachedTemplateInfo {
33
+ slug: string;
34
+ versions: string[];
35
+ latestCached: string;
36
+ displayName?: string;
37
+ description?: string | null;
38
+ category?: string;
39
+ tags?: string[];
40
+ authorName?: string;
41
+ isOfficial?: boolean;
42
+ }
43
+ export declare class TemplateCacheService implements OnModuleInit {
44
+ private readonly settings;
45
+ private cacheDir;
46
+ private index;
47
+ private indexLoaded;
48
+ constructor(settings: SettingsService);
49
+ onModuleInit(): Promise<void>;
50
+ private loadIndex;
51
+ private saveIndex;
52
+ private extractDisplayFields;
53
+ private updateIndex;
54
+ private removeFromIndex;
55
+ saveTemplate(slug: string, version: string, content: Record<string, unknown>, metadata: Omit<VersionMetadata, 'slug' | 'version'>): Promise<void>;
56
+ getTemplate(slug: string, version: string): Promise<CachedTemplate | null>;
57
+ isCached(slug: string, version: string): boolean;
58
+ listCached(): CachedTemplateInfo[];
59
+ removeVersion(slug: string, version: string): Promise<void>;
60
+ clearCache(): Promise<void>;
61
+ getCacheSize(): Promise<number>;
62
+ private getDirectorySize;
63
+ getCacheDir(): string;
64
+ getIndex(): CacheIndex;
65
+ }
66
+ export {};