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.
- package/README.md +14 -0
- package/dist/server/app.module.js +2 -0
- package/dist/server/app.module.js.map +1 -1
- package/dist/server/common/constants/terminal.d.ts +3 -0
- package/dist/server/common/constants/terminal.js +7 -0
- package/dist/server/common/constants/terminal.js.map +1 -0
- package/dist/server/common/validation/template-validation.d.ts +8 -0
- package/dist/server/common/validation/template-validation.js +18 -0
- package/dist/server/common/validation/template-validation.js.map +1 -0
- package/dist/server/modules/epics/services/epics.service.d.ts +2 -0
- package/dist/server/modules/epics/services/epics.service.js +194 -32
- package/dist/server/modules/epics/services/epics.service.js.map +1 -1
- package/dist/server/modules/events/catalog/epic.assigned.d.ts +9 -13
- package/dist/server/modules/events/catalog/epic.assigned.js +5 -5
- package/dist/server/modules/events/catalog/epic.assigned.js.map +1 -1
- package/dist/server/modules/events/catalog/epic.created.d.ts +39 -0
- package/dist/server/modules/events/catalog/epic.created.js +20 -0
- package/dist/server/modules/events/catalog/epic.created.js.map +1 -0
- package/dist/server/modules/events/catalog/epic.updated.d.ts +178 -0
- package/dist/server/modules/events/catalog/epic.updated.js +43 -0
- package/dist/server/modules/events/catalog/epic.updated.js.map +1 -0
- package/dist/server/modules/events/catalog/index.d.ts +221 -12
- package/dist/server/modules/events/catalog/index.js +9 -1
- package/dist/server/modules/events/catalog/index.js.map +1 -1
- package/dist/server/modules/events/catalog/settings.terminal.changed.d.ts +12 -0
- package/dist/server/modules/events/catalog/settings.terminal.changed.js +11 -0
- package/dist/server/modules/events/catalog/settings.terminal.changed.js.map +1 -0
- package/dist/server/modules/events/services/events.service.js +0 -7
- package/dist/server/modules/events/services/events.service.js.map +1 -1
- package/dist/server/modules/events/subscribers/chat-message-delivery.subscriber.d.ts +5 -2
- package/dist/server/modules/events/subscribers/chat-message-delivery.subscriber.js +44 -24
- package/dist/server/modules/events/subscribers/chat-message-delivery.subscriber.js.map +1 -1
- package/dist/server/modules/events/subscribers/epic-assignment-notifier.subscriber.d.ts +5 -8
- package/dist/server/modules/events/subscribers/epic-assignment-notifier.subscriber.js +37 -56
- package/dist/server/modules/events/subscribers/epic-assignment-notifier.subscriber.js.map +1 -1
- package/dist/server/modules/mcp/dtos/mcp.dto.d.ts +8 -6
- package/dist/server/modules/mcp/dtos/mcp.dto.js.map +1 -1
- package/dist/server/modules/mcp/mcp.module.js +2 -0
- package/dist/server/modules/mcp/mcp.module.js.map +1 -1
- package/dist/server/modules/mcp/services/mcp.service.d.ts +5 -1
- package/dist/server/modules/mcp/services/mcp.service.js +65 -33
- package/dist/server/modules/mcp/services/mcp.service.js.map +1 -1
- package/dist/server/modules/projects/controllers/projects.controller.d.ts +140 -6
- package/dist/server/modules/projects/controllers/projects.controller.js +91 -31
- package/dist/server/modules/projects/controllers/projects.controller.js.map +1 -1
- package/dist/server/modules/projects/dtos/export.dto.d.ts +91 -0
- package/dist/server/modules/projects/dtos/export.dto.js +38 -0
- package/dist/server/modules/projects/dtos/export.dto.js.map +1 -0
- package/dist/server/modules/projects/projects.module.js +1 -0
- package/dist/server/modules/projects/projects.module.js.map +1 -1
- package/dist/server/modules/projects/services/projects.service.d.ts +37 -3
- package/dist/server/modules/projects/services/projects.service.js +353 -526
- package/dist/server/modules/projects/services/projects.service.js.map +1 -1
- package/dist/server/modules/registry/controllers/registry.controller.d.ts +98 -0
- package/dist/server/modules/registry/controllers/registry.controller.js +352 -0
- package/dist/server/modules/registry/controllers/registry.controller.js.map +1 -0
- package/dist/server/modules/registry/controllers/templates.controller.d.ts +35 -0
- package/dist/server/modules/registry/controllers/templates.controller.js +157 -0
- package/dist/server/modules/registry/controllers/templates.controller.js.map +1 -0
- package/dist/server/modules/registry/dtos/registry-error.d.ts +11 -0
- package/dist/server/modules/registry/dtos/registry-error.js +30 -0
- package/dist/server/modules/registry/dtos/registry-error.js.map +1 -0
- package/dist/server/modules/registry/dtos/registry.dto.d.ts +7 -0
- package/dist/server/modules/registry/dtos/registry.dto.js +50 -0
- package/dist/server/modules/registry/dtos/registry.dto.js.map +1 -0
- package/dist/server/modules/registry/index.d.ts +7 -0
- package/dist/server/modules/registry/index.js +24 -0
- package/dist/server/modules/registry/index.js.map +1 -0
- package/dist/server/modules/registry/interfaces/registry.interface.d.ts +68 -0
- package/dist/server/modules/registry/interfaces/registry.interface.js +3 -0
- package/dist/server/modules/registry/interfaces/registry.interface.js.map +1 -0
- package/dist/server/modules/registry/registry.module.d.ts +2 -0
- package/dist/server/modules/registry/registry.module.js +45 -0
- package/dist/server/modules/registry/registry.module.js.map +1 -0
- package/dist/server/modules/registry/services/registry-client.service.d.ts +14 -0
- package/dist/server/modules/registry/services/registry-client.service.js +226 -0
- package/dist/server/modules/registry/services/registry-client.service.js.map +1 -0
- package/dist/server/modules/registry/services/registry-orchestration.service.d.ts +45 -0
- package/dist/server/modules/registry/services/registry-orchestration.service.js +165 -0
- package/dist/server/modules/registry/services/registry-orchestration.service.js.map +1 -0
- package/dist/server/modules/registry/services/template-cache.service.d.ts +66 -0
- package/dist/server/modules/registry/services/template-cache.service.js +310 -0
- package/dist/server/modules/registry/services/template-cache.service.js.map +1 -0
- package/dist/server/modules/registry/services/template-upgrade.service.d.ts +41 -0
- package/dist/server/modules/registry/services/template-upgrade.service.js +212 -0
- package/dist/server/modules/registry/services/template-upgrade.service.js.map +1 -0
- package/dist/server/modules/registry/services/unified-template.service.d.ts +35 -0
- package/dist/server/modules/registry/services/unified-template.service.js +228 -0
- package/dist/server/modules/registry/services/unified-template.service.js.map +1 -0
- package/dist/server/modules/sessions/controllers/sessions.controller.d.ts +32 -1
- package/dist/server/modules/sessions/controllers/sessions.controller.js +150 -8
- package/dist/server/modules/sessions/controllers/sessions.controller.js.map +1 -1
- package/dist/server/modules/sessions/services/message-activity-stream.service.d.ts +12 -0
- package/dist/server/modules/sessions/services/message-activity-stream.service.js +51 -0
- package/dist/server/modules/sessions/services/message-activity-stream.service.js.map +1 -0
- package/dist/server/modules/sessions/services/sessions-message-pool.service.d.ts +125 -0
- package/dist/server/modules/sessions/services/sessions-message-pool.service.js +599 -0
- package/dist/server/modules/sessions/services/sessions-message-pool.service.js.map +1 -0
- package/dist/server/modules/sessions/services/sessions.service.d.ts +2 -9
- package/dist/server/modules/sessions/services/sessions.service.js +32 -27
- package/dist/server/modules/sessions/services/sessions.service.js.map +1 -1
- package/dist/server/modules/sessions/sessions.module.js +16 -2
- package/dist/server/modules/sessions/sessions.module.js.map +1 -1
- package/dist/server/modules/settings/dtos/settings.dto.d.ts +231 -0
- package/dist/server/modules/settings/dtos/settings.dto.js +40 -1
- package/dist/server/modules/settings/dtos/settings.dto.js.map +1 -1
- package/dist/server/modules/settings/services/settings.service.d.ts +56 -15
- package/dist/server/modules/settings/services/settings.service.js +295 -10
- package/dist/server/modules/settings/services/settings.service.js.map +1 -1
- package/dist/server/modules/subscribers/actions/action.interface.d.ts +2 -0
- package/dist/server/modules/subscribers/actions/send-message.action.js +34 -11
- package/dist/server/modules/subscribers/actions/send-message.action.js.map +1 -1
- package/dist/server/modules/subscribers/events/event-fields-catalog.js +109 -6
- package/dist/server/modules/subscribers/events/event-fields-catalog.js.map +1 -1
- package/dist/server/modules/subscribers/services/subscriber-executor.service.d.ts +3 -1
- package/dist/server/modules/subscribers/services/subscriber-executor.service.js +13 -1
- package/dist/server/modules/subscribers/services/subscriber-executor.service.js.map +1 -1
- package/dist/server/modules/terminal/dtos/ws-envelope.dto.d.ts +20 -0
- package/dist/server/modules/terminal/dtos/ws-envelope.dto.js +8 -1
- package/dist/server/modules/terminal/dtos/ws-envelope.dto.js.map +1 -1
- package/dist/server/modules/terminal/gateways/terminal.gateway.d.ts +1 -3
- package/dist/server/modules/terminal/gateways/terminal.gateway.js +50 -11
- package/dist/server/modules/terminal/gateways/terminal.gateway.js.map +1 -1
- package/dist/server/modules/terminal/services/pty.service.d.ts +1 -3
- package/dist/server/modules/terminal/services/pty.service.js +2 -14
- package/dist/server/modules/terminal/services/pty.service.js.map +1 -1
- package/dist/server/modules/terminal/services/terminal-seed.service.d.ts +6 -4
- package/dist/server/modules/terminal/services/terminal-seed.service.js +74 -67
- package/dist/server/modules/terminal/services/terminal-seed.service.js.map +1 -1
- package/dist/server/modules/terminal/services/tmux.service.js +3 -2
- package/dist/server/modules/terminal/services/tmux.service.js.map +1 -1
- package/dist/server/modules/terminal/terminal.module.js +0 -3
- package/dist/server/modules/terminal/terminal.module.js.map +1 -1
- package/dist/server/templates/claude-codex-advanced.json +132 -70
- package/dist/server/templates/claude-opus.json +32 -20
- package/dist/server/templates/simple-codex.json +32 -20
- package/dist/server/test-setup.js +19 -0
- package/dist/server/test-setup.js.map +1 -1
- package/dist/server/tsconfig.tsbuildinfo +1 -1
- package/dist/server/ui/assets/index-BkGGbapJ.css +32 -0
- package/dist/server/ui/assets/index-DLpDwHdv.js +733 -0
- package/dist/server/ui/index.html +2 -2
- package/dist/templates/claude-codex-advanced.json +132 -70
- package/dist/templates/claude-opus.json +32 -20
- package/dist/templates/simple-codex.json +32 -20
- package/package.json +15 -4
- package/dist/server/modules/terminal/services/terminal-emulator.service.d.ts +0 -40
- package/dist/server/modules/terminal/services/terminal-emulator.service.js +0 -356
- package/dist/server/modules/terminal/services/terminal-emulator.service.js.map +0 -1
- package/dist/server/templates/claude-codex-advanced-swe.json +0 -130
- package/dist/server/ui/assets/index-C9GXCjnF.js +0 -700
- package/dist/server/ui/assets/index-o0FbZg-1.css +0 -32
- 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 {};
|