@pixelbyte-software/pixcode 1.44.0 → 1.45.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.
@@ -0,0 +1,95 @@
1
+ import express from 'express';
2
+ import { createEvaluationRun, createEvaluationSuite, createSecret, createSecurityAuditRun, createTeamMember, getPlatformizationState, listSecrets, materializeScopedEnv, recordUsageEvent, summarizeUsageEvents, updateMarketplacePluginHealth, updateTeamMember, upsertMarketplacePlugin, } from '../services/platformization.js';
3
+ const router = express.Router();
4
+ function userId(req) {
5
+ return req.user?.id ?? req.user?.userId ?? null;
6
+ }
7
+ function handleError(res, error) {
8
+ res.status(400).json({ success: false, error: error.message });
9
+ }
10
+ router.get('/', (_req, res) => {
11
+ res.json({ success: true, state: getPlatformizationState() });
12
+ });
13
+ router.get('/roles', (_req, res) => {
14
+ const state = getPlatformizationState();
15
+ res.json({ success: true, roles: state.roles });
16
+ });
17
+ router.get('/team/members', (_req, res) => {
18
+ res.json({ success: true, members: getPlatformizationState().teamMembers });
19
+ });
20
+ router.post('/team/members', (req, res) => {
21
+ try {
22
+ res.status(201).json({ success: true, member: createTeamMember(req.body || {}, userId(req)) });
23
+ }
24
+ catch (error) {
25
+ handleError(res, error);
26
+ }
27
+ });
28
+ router.patch('/team/members/:id', (req, res) => {
29
+ const member = updateTeamMember(req.params.id, req.body || {}, userId(req));
30
+ if (!member) {
31
+ res.status(404).json({ success: false, error: 'Team member not found.' });
32
+ return;
33
+ }
34
+ res.json({ success: true, member });
35
+ });
36
+ router.get('/secrets', (_req, res) => {
37
+ res.json({ success: true, secrets: listSecrets() });
38
+ });
39
+ router.post('/secrets', (req, res) => {
40
+ try {
41
+ res.status(201).json({ success: true, secret: createSecret(req.body || {}, userId(req)) });
42
+ }
43
+ catch (error) {
44
+ handleError(res, error);
45
+ }
46
+ });
47
+ router.post('/secrets/scoped-env', (req, res) => {
48
+ try {
49
+ res.json({ success: true, scopedEnv: materializeScopedEnv(req.body || {}, { reveal: req.body?.reveal === true }) });
50
+ }
51
+ catch (error) {
52
+ handleError(res, error);
53
+ }
54
+ });
55
+ router.get('/marketplace/plugins', (_req, res) => {
56
+ res.json({ success: true, plugins: getPlatformizationState().marketplacePlugins });
57
+ });
58
+ router.post('/marketplace/plugins', (req, res) => {
59
+ res.status(201).json({ success: true, plugin: upsertMarketplacePlugin(req.body || {}, userId(req)) });
60
+ });
61
+ router.post('/marketplace/plugins/:id/health', (req, res) => {
62
+ const plugin = updateMarketplacePluginHealth(req.params.id, req.body || {}, userId(req));
63
+ if (!plugin) {
64
+ res.status(404).json({ success: false, error: 'Marketplace plugin not found.' });
65
+ return;
66
+ }
67
+ res.json({ success: true, plugin });
68
+ });
69
+ router.get('/eval/suites', (_req, res) => {
70
+ const state = getPlatformizationState();
71
+ res.json({ success: true, suites: state.evaluationSuites, runs: state.evaluationRuns });
72
+ });
73
+ router.post('/eval/suites', (req, res) => {
74
+ res.status(201).json({ success: true, suite: createEvaluationSuite(req.body || {}, userId(req)) });
75
+ });
76
+ router.post('/eval/runs', (req, res) => {
77
+ res.status(201).json({ success: true, run: createEvaluationRun(req.body || {}, userId(req)) });
78
+ });
79
+ router.get('/usage/summary', (_req, res) => {
80
+ res.json({ success: true, summary: summarizeUsageEvents() });
81
+ });
82
+ router.post('/usage/events', (req, res) => {
83
+ res.status(201).json({ success: true, event: recordUsageEvent(req.body || {}, userId(req)) });
84
+ });
85
+ router.get('/security/audit-runs', (_req, res) => {
86
+ res.json({ success: true, runs: getPlatformizationState().securityAuditRuns });
87
+ });
88
+ router.post('/security/audit-runs', (req, res) => {
89
+ res.status(201).json({ success: true, run: createSecurityAuditRun(req.body || {}, userId(req)) });
90
+ });
91
+ router.get('/audit-log', (_req, res) => {
92
+ res.json({ success: true, auditLog: getPlatformizationState().auditLog });
93
+ });
94
+ export default router;
95
+ //# sourceMappingURL=platformization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platformization.js","sourceRoot":"","sources":["../../../server/routes/platformization.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,441 @@
1
+ import crypto from 'node:crypto';
2
+ import { appConfigDb } from '../database/db.js';
3
+ const CONFIG_KEY = 'platformization';
4
+ export const TEAM_ROLES = {
5
+ owner: [
6
+ 'team:manage',
7
+ 'project:admin',
8
+ 'run:approve',
9
+ 'secret:manage',
10
+ 'marketplace:manage',
11
+ 'eval:run',
12
+ 'usage:view',
13
+ 'security:audit',
14
+ ],
15
+ admin: [
16
+ 'project:admin',
17
+ 'run:approve',
18
+ 'secret:manage',
19
+ 'marketplace:manage',
20
+ 'eval:run',
21
+ 'usage:view',
22
+ 'security:audit',
23
+ ],
24
+ member: [
25
+ 'project:write',
26
+ 'run:create',
27
+ 'secret:use',
28
+ 'eval:run',
29
+ 'usage:view',
30
+ ],
31
+ viewer: [
32
+ 'project:read',
33
+ 'usage:view',
34
+ ],
35
+ };
36
+ export const SECRET_SCOPES = ['global', 'provider', 'project', 'workflow', 'telegram', 'api'];
37
+ export const MARKETPLACE_PLUGIN_TYPES = ['mcp-server', 'workflow-template', 'provider-adapter', 'notification-channel'];
38
+ export const SECURITY_AUDIT_CHECKS = [
39
+ 'dependency_audit',
40
+ 'secret_scan',
41
+ 'permission_audit',
42
+ 'agent_output_leak_detection',
43
+ ];
44
+ function nowIso() {
45
+ return new Date().toISOString();
46
+ }
47
+ function emptyStore() {
48
+ return {
49
+ teamMembers: [],
50
+ secrets: [],
51
+ marketplacePlugins: [],
52
+ evaluationSuites: [],
53
+ evaluationRuns: [],
54
+ usageEvents: [],
55
+ securityAuditRuns: [],
56
+ auditLog: [],
57
+ };
58
+ }
59
+ function readStore() {
60
+ const raw = appConfigDb.get(CONFIG_KEY);
61
+ if (!raw)
62
+ return emptyStore();
63
+ try {
64
+ const parsed = JSON.parse(raw);
65
+ return {
66
+ teamMembers: Array.isArray(parsed.teamMembers) ? parsed.teamMembers : [],
67
+ secrets: Array.isArray(parsed.secrets) ? parsed.secrets : [],
68
+ marketplacePlugins: Array.isArray(parsed.marketplacePlugins) ? parsed.marketplacePlugins : [],
69
+ evaluationSuites: Array.isArray(parsed.evaluationSuites) ? parsed.evaluationSuites : [],
70
+ evaluationRuns: Array.isArray(parsed.evaluationRuns) ? parsed.evaluationRuns : [],
71
+ usageEvents: Array.isArray(parsed.usageEvents) ? parsed.usageEvents : [],
72
+ securityAuditRuns: Array.isArray(parsed.securityAuditRuns) ? parsed.securityAuditRuns : [],
73
+ auditLog: Array.isArray(parsed.auditLog) ? parsed.auditLog : [],
74
+ };
75
+ }
76
+ catch {
77
+ return emptyStore();
78
+ }
79
+ }
80
+ function writeStore(store) {
81
+ appConfigDb.set(CONFIG_KEY, JSON.stringify(store));
82
+ }
83
+ function compact(text, max = 120) {
84
+ const value = String(text || '').replace(/\s+/g, ' ').trim();
85
+ return value.length > max ? value.slice(0, max).replace(/[-_\s]+$/g, '') : value;
86
+ }
87
+ function slugify(value) {
88
+ const slug = compact(value, 72)
89
+ .toLowerCase()
90
+ .replace(/[^a-z0-9]+/g, '-')
91
+ .replace(/^-+|-+$/g, '');
92
+ return slug || crypto.randomUUID();
93
+ }
94
+ function addAudit(store, action, actorId, details = {}) {
95
+ store.auditLog.unshift({
96
+ id: crypto.randomUUID(),
97
+ action,
98
+ actorId: actorId || null,
99
+ createdAt: nowIso(),
100
+ details,
101
+ });
102
+ store.auditLog = store.auditLog.slice(0, 250);
103
+ }
104
+ function normalizeRole(role) {
105
+ return TEAM_ROLES[role] ? role : 'viewer';
106
+ }
107
+ function normalizeScope(scope) {
108
+ return SECRET_SCOPES.includes(scope) ? scope : 'project';
109
+ }
110
+ function vaultKey() {
111
+ const material = process.env.PIXCODE_SECRET_KEY || process.env.JWT_SECRET || appConfigDb.getOrCreateJwtSecret();
112
+ return crypto.createHash('sha256').update(material).digest();
113
+ }
114
+ function sealSecret(value) {
115
+ const iv = crypto.randomBytes(12);
116
+ const cipher = crypto.createCipheriv('aes-256-gcm', vaultKey(), iv);
117
+ const encrypted = Buffer.concat([cipher.update(String(value || ''), 'utf8'), cipher.final()]);
118
+ return {
119
+ algorithm: 'aes-256-gcm',
120
+ iv: iv.toString('base64'),
121
+ tag: cipher.getAuthTag().toString('base64'),
122
+ ciphertext: encrypted.toString('base64'),
123
+ };
124
+ }
125
+ function openSecret(sealed) {
126
+ const decipher = crypto.createDecipheriv('aes-256-gcm', vaultKey(), Buffer.from(sealed.iv, 'base64'));
127
+ decipher.setAuthTag(Buffer.from(sealed.tag, 'base64'));
128
+ return Buffer.concat([
129
+ decipher.update(Buffer.from(sealed.ciphertext, 'base64')),
130
+ decipher.final(),
131
+ ]).toString('utf8');
132
+ }
133
+ function redactSecret(secret) {
134
+ return {
135
+ ...secret,
136
+ sealedValue: undefined,
137
+ redacted: '********',
138
+ };
139
+ }
140
+ function scopeMatches(secret, input = {}) {
141
+ if (secret.scope === 'global')
142
+ return true;
143
+ if (secret.scope === 'provider')
144
+ return !input.provider || secret.target === input.provider;
145
+ if (secret.scope === 'project')
146
+ return !input.projectPath || secret.target === input.projectPath || secret.target === input.projectName;
147
+ if (secret.scope === 'workflow')
148
+ return !input.workflowId || secret.target === input.workflowId;
149
+ if (secret.scope === 'telegram')
150
+ return input.channel === 'telegram';
151
+ if (secret.scope === 'api')
152
+ return input.channel === 'api';
153
+ return false;
154
+ }
155
+ export function getPlatformizationState() {
156
+ const store = readStore();
157
+ return {
158
+ roles: TEAM_ROLES,
159
+ secretScopes: SECRET_SCOPES,
160
+ marketplacePluginTypes: MARKETPLACE_PLUGIN_TYPES,
161
+ securityAuditChecks: SECURITY_AUDIT_CHECKS,
162
+ teamMembers: store.teamMembers,
163
+ secrets: store.secrets.map(redactSecret),
164
+ marketplacePlugins: store.marketplacePlugins,
165
+ evaluationSuites: store.evaluationSuites,
166
+ evaluationRuns: store.evaluationRuns,
167
+ usageSummary: summarizeUsageEvents(store.usageEvents),
168
+ securityAuditRuns: store.securityAuditRuns,
169
+ auditLog: store.auditLog,
170
+ };
171
+ }
172
+ export function createTeamMember(input = {}, actorId = null) {
173
+ const email = compact(input.email || input.username || '');
174
+ if (!email)
175
+ throw new Error('Team member email or username is required.');
176
+ const store = readStore();
177
+ const member = {
178
+ id: crypto.randomUUID(),
179
+ email,
180
+ displayName: compact(input.displayName || email, 80),
181
+ role: normalizeRole(input.role || 'viewer'),
182
+ projectScopes: Array.isArray(input.projectScopes) ? input.projectScopes : [],
183
+ status: input.status || 'active',
184
+ createdAt: nowIso(),
185
+ updatedAt: nowIso(),
186
+ };
187
+ member.permissions = TEAM_ROLES[member.role];
188
+ store.teamMembers.unshift(member);
189
+ addAudit(store, 'team.member.created', actorId, { memberId: member.id, role: member.role });
190
+ writeStore(store);
191
+ return member;
192
+ }
193
+ export function updateTeamMember(memberId, patch = {}, actorId = null) {
194
+ const store = readStore();
195
+ let updated = null;
196
+ store.teamMembers = store.teamMembers.map((member) => {
197
+ if (member.id !== memberId)
198
+ return member;
199
+ updated = {
200
+ ...member,
201
+ ...patch,
202
+ id: member.id,
203
+ role: normalizeRole(patch.role || member.role),
204
+ updatedAt: nowIso(),
205
+ };
206
+ updated.permissions = TEAM_ROLES[updated.role];
207
+ return updated;
208
+ });
209
+ if (updated) {
210
+ addAudit(store, 'team.member.updated', actorId, { memberId, role: updated.role });
211
+ writeStore(store);
212
+ }
213
+ return updated;
214
+ }
215
+ export function createSecret(input = {}, actorId = null) {
216
+ const name = compact(input.name || input.envName || '');
217
+ const value = input.value;
218
+ if (!name || typeof value !== 'string')
219
+ throw new Error('Secret name and string value are required.');
220
+ const scope = normalizeScope(input.scope || 'project');
221
+ const store = readStore();
222
+ const secret = {
223
+ id: crypto.randomUUID(),
224
+ name,
225
+ envName: compact(input.envName || name).replace(/[^A-Z0-9_]/gi, '_').toUpperCase(),
226
+ scope,
227
+ target: input.target || input.projectPath || input.provider || null,
228
+ createdAt: nowIso(),
229
+ updatedAt: nowIso(),
230
+ fingerprint: crypto.createHash('sha256').update(value).digest('hex').slice(0, 12),
231
+ sealedValue: sealSecret(value),
232
+ };
233
+ store.secrets = store.secrets.filter((existing) => !(existing.envName === secret.envName && existing.scope === secret.scope && existing.target === secret.target));
234
+ store.secrets.unshift(secret);
235
+ addAudit(store, 'secret.created', actorId, { secretId: secret.id, scope: secret.scope, envName: secret.envName });
236
+ writeStore(store);
237
+ return redactSecret(secret);
238
+ }
239
+ export function listSecrets() {
240
+ return readStore().secrets.map(redactSecret);
241
+ }
242
+ export function materializeScopedEnv(input = {}, options = {}) {
243
+ const store = readStore();
244
+ const env = {};
245
+ const included = [];
246
+ for (const secret of store.secrets) {
247
+ if (!scopeMatches(secret, input))
248
+ continue;
249
+ included.push({
250
+ id: secret.id,
251
+ envName: secret.envName,
252
+ scope: secret.scope,
253
+ target: secret.target,
254
+ redacted: '********',
255
+ });
256
+ if (options.reveal === true) {
257
+ env[secret.envName] = openSecret(secret.sealedValue);
258
+ }
259
+ }
260
+ return { env, included };
261
+ }
262
+ export function upsertMarketplacePlugin(input = {}, actorId = null) {
263
+ const pluginId = input.id || slugify(input.name || input.packageName || 'plugin');
264
+ const store = readStore();
265
+ const existing = store.marketplacePlugins.find((plugin) => plugin.id === pluginId);
266
+ const plugin = {
267
+ id: pluginId,
268
+ name: compact(input.name || pluginId, 100),
269
+ type: MARKETPLACE_PLUGIN_TYPES.includes(input.type) ? input.type : 'mcp-server',
270
+ source: input.source || input.packageName || input.repository || null,
271
+ permissionScopes: Array.isArray(input.permissionScopes) ? input.permissionScopes : [],
272
+ installCommand: input.installCommand || null,
273
+ status: input.status || existing?.status || 'available',
274
+ health: input.health || existing?.health || { status: 'unknown', checkedAt: null },
275
+ updatedAt: nowIso(),
276
+ createdAt: existing?.createdAt || nowIso(),
277
+ };
278
+ store.marketplacePlugins = [plugin, ...store.marketplacePlugins.filter((item) => item.id !== pluginId)];
279
+ addAudit(store, 'marketplace.plugin.upserted', actorId, { pluginId, type: plugin.type });
280
+ writeStore(store);
281
+ return plugin;
282
+ }
283
+ export function updateMarketplacePluginHealth(pluginId, health = {}, actorId = null) {
284
+ const store = readStore();
285
+ let updated = null;
286
+ store.marketplacePlugins = store.marketplacePlugins.map((plugin) => {
287
+ if (plugin.id !== pluginId)
288
+ return plugin;
289
+ updated = {
290
+ ...plugin,
291
+ health: {
292
+ status: health.status || 'unknown',
293
+ message: health.message || '',
294
+ checkedAt: nowIso(),
295
+ },
296
+ updatedAt: nowIso(),
297
+ };
298
+ return updated;
299
+ });
300
+ if (updated) {
301
+ addAudit(store, 'marketplace.plugin.health_checked', actorId, { pluginId, status: updated.health.status });
302
+ writeStore(store);
303
+ }
304
+ return updated;
305
+ }
306
+ export function createEvaluationSuite(input = {}, actorId = null) {
307
+ const tasks = Array.isArray(input.tasks) ? input.tasks : [];
308
+ const suite = {
309
+ id: input.id || slugify(input.name || 'evaluation-suite'),
310
+ name: compact(input.name || 'Evaluation suite', 100),
311
+ description: compact(input.description || '', 240),
312
+ tasks: tasks.map((task, index) => ({
313
+ id: task.id || `task-${index + 1}`,
314
+ title: compact(task.title || `Task ${index + 1}`, 120),
315
+ acceptanceCriteria: Array.isArray(task.acceptanceCriteria) ? task.acceptanceCriteria : [],
316
+ projectPath: task.projectPath || null,
317
+ })),
318
+ createdAt: nowIso(),
319
+ updatedAt: nowIso(),
320
+ };
321
+ const store = readStore();
322
+ store.evaluationSuites = [suite, ...store.evaluationSuites.filter((item) => item.id !== suite.id)];
323
+ addAudit(store, 'eval.suite.upserted', actorId, { suiteId: suite.id, tasks: suite.tasks.length });
324
+ writeStore(store);
325
+ return suite;
326
+ }
327
+ export function createEvaluationRun(input = {}, actorId = null) {
328
+ const results = Array.isArray(input.results) ? input.results : [];
329
+ const passed = results.filter((result) => result.status === 'passed').length;
330
+ const run = {
331
+ id: crypto.randomUUID(),
332
+ suiteId: input.suiteId || null,
333
+ provider: input.provider || null,
334
+ model: input.model || null,
335
+ status: input.status || 'completed',
336
+ createdAt: nowIso(),
337
+ results,
338
+ summary: {
339
+ total: results.length,
340
+ passed,
341
+ failed: results.filter((result) => result.status === 'failed').length,
342
+ passRate: results.length ? Math.round((passed / results.length) * 1000) / 10 : 0,
343
+ averageLatencyMs: average(results.map((result) => Number(result.latencyMs || 0)).filter(Boolean)),
344
+ },
345
+ };
346
+ const store = readStore();
347
+ store.evaluationRuns.unshift(run);
348
+ addAudit(store, 'eval.run.created', actorId, { runId: run.id, suiteId: run.suiteId, passRate: run.summary.passRate });
349
+ writeStore(store);
350
+ return run;
351
+ }
352
+ function average(values) {
353
+ if (!values.length)
354
+ return 0;
355
+ return Math.round(values.reduce((sum, value) => sum + value, 0) / values.length);
356
+ }
357
+ export function recordUsageEvent(input = {}, actorId = null) {
358
+ const event = {
359
+ id: crypto.randomUUID(),
360
+ createdAt: input.createdAt || nowIso(),
361
+ provider: input.provider || 'unknown',
362
+ model: input.model || 'unknown',
363
+ workflow: input.workflow || input.source || 'manual',
364
+ inputTokens: Number(input.inputTokens || 0),
365
+ outputTokens: Number(input.outputTokens || 0),
366
+ costUsd: Number(input.costUsd || 0),
367
+ latencyMs: Number(input.latencyMs || 0),
368
+ status: input.status || 'ok',
369
+ };
370
+ const store = readStore();
371
+ store.usageEvents.unshift(event);
372
+ store.usageEvents = store.usageEvents.slice(0, 2000);
373
+ addAudit(store, 'usage.event.recorded', actorId, { provider: event.provider, model: event.model, status: event.status });
374
+ writeStore(store);
375
+ return event;
376
+ }
377
+ export function summarizeUsageEvents(events = readStore().usageEvents) {
378
+ const groups = new Map();
379
+ for (const event of events) {
380
+ const key = `${event.provider}:${event.model}:${event.workflow}`;
381
+ const current = groups.get(key) || {
382
+ provider: event.provider,
383
+ model: event.model,
384
+ workflow: event.workflow,
385
+ runs: 0,
386
+ errors: 0,
387
+ inputTokens: 0,
388
+ outputTokens: 0,
389
+ totalTokens: 0,
390
+ costUsd: 0,
391
+ latencyMs: 0,
392
+ };
393
+ current.runs += 1;
394
+ current.errors += event.status === 'error' ? 1 : 0;
395
+ current.inputTokens += event.inputTokens;
396
+ current.outputTokens += event.outputTokens;
397
+ current.totalTokens += event.inputTokens + event.outputTokens;
398
+ current.costUsd += event.costUsd;
399
+ current.latencyMs += event.latencyMs;
400
+ groups.set(key, current);
401
+ }
402
+ return Array.from(groups.values()).map((group) => ({
403
+ ...group,
404
+ costUsd: Math.round(group.costUsd * 10000) / 10000,
405
+ averageLatencyMs: group.runs ? Math.round(group.latencyMs / group.runs) : 0,
406
+ errorRate: group.runs ? Math.round((group.errors / group.runs) * 1000) / 10 : 0,
407
+ latencyMs: undefined,
408
+ }));
409
+ }
410
+ export function createSecurityAuditRun(input = {}, actorId = null) {
411
+ const checks = Array.isArray(input.checks) && input.checks.length
412
+ ? input.checks.filter((check) => SECURITY_AUDIT_CHECKS.includes(check))
413
+ : SECURITY_AUDIT_CHECKS;
414
+ const findings = Array.isArray(input.findings) ? input.findings : [];
415
+ const run = {
416
+ id: crypto.randomUUID(),
417
+ protocol: 'pixcode.security-audit.v1',
418
+ status: input.status || 'queued',
419
+ projectName: input.projectName || null,
420
+ projectPath: input.projectPath || null,
421
+ checks,
422
+ createdAt: nowIso(),
423
+ findings: findings.map((finding, index) => ({
424
+ id: finding.id || `finding-${index + 1}`,
425
+ severity: finding.severity || 'medium',
426
+ title: compact(finding.title || 'Security finding', 140),
427
+ file: finding.file || null,
428
+ recommendation: finding.recommendation || null,
429
+ })),
430
+ checklist: checks.map((check) => ({
431
+ check,
432
+ status: 'pending',
433
+ })),
434
+ };
435
+ const store = readStore();
436
+ store.securityAuditRuns.unshift(run);
437
+ addAudit(store, 'security.audit.created', actorId, { runId: run.id, checks });
438
+ writeStore(store);
439
+ return run;
440
+ }
441
+ //# sourceMappingURL=platformization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platformization.js","sourceRoot":"","sources":["../../../server/services/platformization.js"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixelbyte-software/pixcode",
3
- "version": "1.44.0",
3
+ "version": "1.45.0",
4
4
  "description": "Self-hosted AI coding agent control room for Claude Code, Cursor CLI, OpenAI Codex, Gemini CLI, Qwen Code, and OpenCode with chat, files, shell, Git, orchestration, API keys, Telegram, MCP, plugins, themes, and desktop/server deployment.",
5
5
  "type": "module",
6
6
  "main": "dist-server/server/index.js",
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env node
2
+
3
+ import assert from 'node:assert/strict';
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+
7
+ const root = process.cwd();
8
+
9
+ function read(relativePath) {
10
+ return fs.readFileSync(path.join(root, relativePath), 'utf8');
11
+ }
12
+
13
+ const service = read('server/services/platformization.js');
14
+ assert.match(service, /TEAM_ROLES/, 'Platformization should define enterprise RBAC roles.');
15
+ assert.match(service, /createTeamMember/, 'Platformization should create team members.');
16
+ assert.match(service, /sealSecret/, 'Platformization should seal scoped secrets.');
17
+ assert.match(service, /materializeScopedEnv/, 'Platformization should materialize scoped env previews.');
18
+ assert.match(service, /upsertMarketplacePlugin/, 'Platformization should manage plugin marketplace entries.');
19
+ assert.match(service, /createEvaluationSuite/, 'Platformization should create evaluation suites.');
20
+ assert.match(service, /createEvaluationRun/, 'Platformization should create evaluation runs.');
21
+ assert.match(service, /summarizeUsageEvents/, 'Platformization should summarize cost, token, and latency usage.');
22
+ assert.match(service, /createSecurityAuditRun/, 'Platformization should create security audit runs.');
23
+ assert.match(service, /agent_output_leak_detection/, 'Security audit mode should include output leak detection.');
24
+
25
+ const routes = read('server/routes/platformization.js');
26
+ assert.match(routes, /\/team\/members/, 'Platformization routes should expose team management.');
27
+ assert.match(routes, /\/secrets\/scoped-env/, 'Platformization routes should expose scoped env assembly.');
28
+ assert.match(routes, /\/marketplace\/plugins/, 'Platformization routes should expose marketplace management.');
29
+ assert.match(routes, /\/eval\/runs/, 'Platformization routes should expose evaluation runs.');
30
+ assert.match(routes, /\/usage\/summary/, 'Platformization routes should expose usage dashboards.');
31
+ assert.match(routes, /\/security\/audit-runs/, 'Platformization routes should expose security audit mode.');
32
+ assert.match(routes, /\/audit-log/, 'Platformization routes should expose audit logs.');
33
+
34
+ const server = read('server/index.js');
35
+ assert.match(server, /platformizationRoutes/, 'Server should import platformization routes.');
36
+ assert.match(server, /\/api\/platformization/, 'Server should mount platformization routes.');
37
+
38
+ const docs = read('docs/platformization.md');
39
+ assert.match(docs, /RBAC/i, 'Docs should explain RBAC/team mode.');
40
+ assert.match(docs, /Secret Vault/i, 'Docs should explain the secret vault.');
41
+ assert.match(docs, /MCP\/plugin Marketplace/i, 'Docs should explain marketplace management.');
42
+ assert.match(docs, /Evaluation Harness/i, 'Docs should explain evaluations.');
43
+ assert.match(docs, /Cost, Token, and Latency/i, 'Docs should explain usage dashboards.');
44
+ assert.match(docs, /Security\/audit Mode/i, 'Docs should explain security audit mode.');
45
+
46
+ console.log('v1.45 platformization smoke passed');
package/server/index.js CHANGED
@@ -80,6 +80,7 @@ import remoteRoutes from './routes/remote.js';
80
80
  import publicApiRoutes from './routes/public-api.js';
81
81
  import webhooksRoutes from './routes/webhooks.js';
82
82
  import productionAgentLoopRoutes from './routes/production-agent-loop.js';
83
+ import platformizationRoutes from './routes/platformization.js';
83
84
  import liveViewRoutes, { createLiveViewPublicRouter } from './routes/live-view.js';
84
85
  import providerRoutes from './modules/providers/provider.routes.js';
85
86
  import {
@@ -414,6 +415,9 @@ app.use('/api/webhooks', authenticateToken, webhooksRoutes);
414
415
  // Production agent loop APIs (protected)
415
416
  app.use('/api/production-agent-loop', authenticateToken, productionAgentLoopRoutes);
416
417
 
418
+ // Platform control plane APIs (protected)
419
+ app.use('/api/platformization', authenticateToken, platformizationRoutes);
420
+
417
421
  // Project Live View (protected control API + public share proxy)
418
422
  app.use('/api/live-view', authenticateToken, liveViewRoutes);
419
423