@things-factory/mlops 10.0.0-zeta.7 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist-client/bootstrap.d.ts +1 -0
  2. package/dist-client/bootstrap.js +40 -0
  3. package/dist-client/bootstrap.js.map +1 -0
  4. package/dist-client/index.d.ts +2 -0
  5. package/dist-client/index.js +3 -0
  6. package/dist-client/index.js.map +1 -0
  7. package/dist-client/pages/ml-deployment/ml-deployment-list-page.d.ts +5 -0
  8. package/dist-client/pages/ml-deployment/ml-deployment-list-page.js +49 -0
  9. package/dist-client/pages/ml-deployment/ml-deployment-list-page.js.map +1 -0
  10. package/dist-client/pages/ml-model/ml-model-list-page.d.ts +5 -0
  11. package/dist-client/pages/ml-model/ml-model-list-page.js +49 -0
  12. package/dist-client/pages/ml-model/ml-model-list-page.js.map +1 -0
  13. package/dist-client/pages/ml-pipeline/ml-pipeline-list-page.d.ts +5 -0
  14. package/dist-client/pages/ml-pipeline/ml-pipeline-list-page.js +49 -0
  15. package/dist-client/pages/ml-pipeline/ml-pipeline-list-page.js.map +1 -0
  16. package/dist-client/pages/mlops-dashboard/mlops-dashboard-page.d.ts +5 -0
  17. package/dist-client/pages/mlops-dashboard/mlops-dashboard-page.js +93 -0
  18. package/dist-client/pages/mlops-dashboard/mlops-dashboard-page.js.map +1 -0
  19. package/dist-client/route.d.ts +1 -0
  20. package/dist-client/route.js +17 -0
  21. package/dist-client/route.js.map +1 -0
  22. package/dist-client/tsconfig.tsbuildinfo +1 -0
  23. package/dist-server/index.d.ts +2 -0
  24. package/dist-server/index.js +6 -0
  25. package/dist-server/index.js.map +1 -0
  26. package/dist-server/routes.d.ts +5 -0
  27. package/dist-server/routes.js +12 -0
  28. package/dist-server/routes.js.map +1 -0
  29. package/dist-server/service/index.d.ts +8 -0
  30. package/dist-server/service/index.js +31 -0
  31. package/dist-server/service/index.js.map +1 -0
  32. package/dist-server/service/ml-deployment/index.d.ts +3 -0
  33. package/dist-server/service/ml-deployment/index.js +8 -0
  34. package/dist-server/service/ml-deployment/index.js.map +1 -0
  35. package/dist-server/service/ml-deployment/ml-deployment.d.ts +48 -0
  36. package/dist-server/service/ml-deployment/ml-deployment.js +153 -0
  37. package/dist-server/service/ml-deployment/ml-deployment.js.map +1 -0
  38. package/dist-server/service/ml-model/index.d.ts +5 -0
  39. package/dist-server/service/ml-model/index.js +11 -0
  40. package/dist-server/service/ml-model/index.js.map +1 -0
  41. package/dist-server/service/ml-model/ml-model-mutation.d.ts +24 -0
  42. package/dist-server/service/ml-model/ml-model-mutation.js +177 -0
  43. package/dist-server/service/ml-model/ml-model-mutation.js.map +1 -0
  44. package/dist-server/service/ml-model/ml-model-query.d.ts +23 -0
  45. package/dist-server/service/ml-model/ml-model-query.js +123 -0
  46. package/dist-server/service/ml-model/ml-model-query.js.map +1 -0
  47. package/dist-server/service/ml-model/ml-model-types.d.ts +27 -0
  48. package/dist-server/service/ml-model/ml-model-types.js +105 -0
  49. package/dist-server/service/ml-model/ml-model-types.js.map +1 -0
  50. package/dist-server/service/ml-model/ml-model.d.ts +52 -0
  51. package/dist-server/service/ml-model/ml-model.js +161 -0
  52. package/dist-server/service/ml-model/ml-model.js.map +1 -0
  53. package/dist-server/service/ml-pipeline/index.d.ts +3 -0
  54. package/dist-server/service/ml-pipeline/index.js +8 -0
  55. package/dist-server/service/ml-pipeline/index.js.map +1 -0
  56. package/dist-server/service/ml-pipeline/ml-pipeline.d.ts +50 -0
  57. package/dist-server/service/ml-pipeline/ml-pipeline.js +163 -0
  58. package/dist-server/service/ml-pipeline/ml-pipeline.js.map +1 -0
  59. package/dist-server/service/ml-pipeline-run/index.d.ts +3 -0
  60. package/dist-server/service/ml-pipeline-run/index.js +8 -0
  61. package/dist-server/service/ml-pipeline-run/index.js.map +1 -0
  62. package/dist-server/service/ml-pipeline-run/ml-pipeline-run.d.ts +40 -0
  63. package/dist-server/service/ml-pipeline-run/ml-pipeline-run.js +136 -0
  64. package/dist-server/service/ml-pipeline-run/ml-pipeline-run.js.map +1 -0
  65. package/dist-server/tsconfig.tsbuildinfo +1 -0
  66. package/package.json +12 -12
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.schema = exports.entities = void 0;
4
+ const tslib_1 = require("tslib");
5
+ /* EXPORT ENTITY TYPES */
6
+ tslib_1.__exportStar(require("./ml-model/ml-model"), exports);
7
+ tslib_1.__exportStar(require("./ml-pipeline/ml-pipeline"), exports);
8
+ tslib_1.__exportStar(require("./ml-pipeline-run/ml-pipeline-run"), exports);
9
+ tslib_1.__exportStar(require("./ml-deployment/ml-deployment"), exports);
10
+ /* IMPORT ENTITIES AND RESOLVERS */
11
+ const ml_model_1 = require("./ml-model");
12
+ const ml_pipeline_1 = require("./ml-pipeline");
13
+ const ml_pipeline_run_1 = require("./ml-pipeline-run");
14
+ const ml_deployment_1 = require("./ml-deployment");
15
+ exports.entities = [
16
+ /* ENTITIES */
17
+ ...ml_model_1.entities,
18
+ ...ml_pipeline_1.entities,
19
+ ...ml_pipeline_run_1.entities,
20
+ ...ml_deployment_1.entities
21
+ ];
22
+ exports.schema = {
23
+ resolverClasses: [
24
+ /* RESOLVER CLASSES */
25
+ ...ml_model_1.resolvers,
26
+ ...ml_pipeline_1.resolvers,
27
+ ...ml_pipeline_run_1.resolvers,
28
+ ...ml_deployment_1.resolvers
29
+ ]
30
+ };
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,8DAAmC;AACnC,oEAAyC;AACzC,4EAAiD;AACjD,wEAA6C;AAE7C,mCAAmC;AACnC,yCAAuF;AACvF,+CAAgG;AAChG,uDAA0G;AAC1G,mDAAsG;AAEzF,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,GAAG,mBAAe;IAClB,GAAG,sBAAkB;IACrB,GAAG,0BAAqB;IACxB,GAAG,wBAAoB;CACxB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACtB,GAAG,oBAAgB;QACnB,GAAG,uBAAmB;QACtB,GAAG,2BAAsB;QACzB,GAAG,yBAAqB;KACzB;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './ml-model/ml-model'\nexport * from './ml-pipeline/ml-pipeline'\nexport * from './ml-pipeline-run/ml-pipeline-run'\nexport * from './ml-deployment/ml-deployment'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport { entities as MLModelEntities, resolvers as MLModelResolvers } from './ml-model'\nimport { entities as MLPipelineEntities, resolvers as MLPipelineResolvers } from './ml-pipeline'\nimport { entities as MLPipelineRunEntities, resolvers as MLPipelineRunResolvers } from './ml-pipeline-run'\nimport { entities as MLDeploymentEntities, resolvers as MLDeploymentResolvers } from './ml-deployment'\n\nexport const entities = [\n /* ENTITIES */\n ...MLModelEntities,\n ...MLPipelineEntities,\n ...MLPipelineRunEntities,\n ...MLDeploymentEntities\n]\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n ...MLModelResolvers,\n ...MLPipelineResolvers,\n ...MLPipelineRunResolvers,\n ...MLDeploymentResolvers\n ]\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { MLDeployment } from './ml-deployment.js';
2
+ export declare const entities: (typeof MLDeployment)[];
3
+ export declare const resolvers: any[];
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvers = exports.entities = void 0;
4
+ const ml_deployment_js_1 = require("./ml-deployment.js");
5
+ exports.entities = [ml_deployment_js_1.MLDeployment];
6
+ exports.resolvers = [];
7
+ // export * from './ml-deployment'
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/ml-deployment/index.ts"],"names":[],"mappings":";;;AAAA,yDAAiD;AAEpC,QAAA,QAAQ,GAAG,CAAC,+BAAY,CAAC,CAAA;AACzB,QAAA,SAAS,GAAG,EAAE,CAAA;AAE3B,kCAAkC","sourcesContent":["import { MLDeployment } from './ml-deployment.js'\n\nexport const entities = [MLDeployment]\nexport const resolvers = []\n\n// export * from './ml-deployment'\n"]}
@@ -0,0 +1,48 @@
1
+ import { Domain } from '@things-factory/shell';
2
+ import { User } from '@things-factory/auth-base';
3
+ import { MLModel } from '../ml-model/ml-model';
4
+ /**
5
+ * Deployment Status
6
+ */
7
+ export declare enum DeploymentStatus {
8
+ DEPLOYING = "DEPLOYING",
9
+ ACTIVE = "ACTIVE",
10
+ FAILED = "FAILED",
11
+ STOPPED = "STOPPED"
12
+ }
13
+ /**
14
+ * Deployment Environment
15
+ */
16
+ export declare enum DeploymentEnvironment {
17
+ DEVELOPMENT = "DEVELOPMENT",
18
+ STAGING = "STAGING",
19
+ PRODUCTION = "PRODUCTION"
20
+ }
21
+ /**
22
+ * ML Deployment Entity
23
+ *
24
+ * Tracks model deployments to various environments
25
+ */
26
+ export declare class MLDeployment {
27
+ id: string;
28
+ model: MLModel;
29
+ modelId: string;
30
+ name: string;
31
+ environment: DeploymentEnvironment;
32
+ status: DeploymentStatus;
33
+ endpoint?: string;
34
+ scalingConfig?: string;
35
+ resources?: string;
36
+ deployedAt?: Date;
37
+ predictionCount: number;
38
+ avgLatency?: number;
39
+ errorRate?: number;
40
+ metadata?: string;
41
+ domain?: Domain;
42
+ domainId?: string;
43
+ deployedBy?: User;
44
+ deployedById?: string;
45
+ createdAt: Date;
46
+ updatedAt: Date;
47
+ deletedAt?: Date;
48
+ }
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MLDeployment = exports.DeploymentEnvironment = exports.DeploymentStatus = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const typeorm_1 = require("typeorm");
6
+ const type_graphql_1 = require("type-graphql");
7
+ const shell_1 = require("@things-factory/shell");
8
+ const auth_base_1 = require("@things-factory/auth-base");
9
+ const ml_model_1 = require("../ml-model/ml-model");
10
+ /**
11
+ * Deployment Status
12
+ */
13
+ var DeploymentStatus;
14
+ (function (DeploymentStatus) {
15
+ DeploymentStatus["DEPLOYING"] = "DEPLOYING";
16
+ DeploymentStatus["ACTIVE"] = "ACTIVE";
17
+ DeploymentStatus["FAILED"] = "FAILED";
18
+ DeploymentStatus["STOPPED"] = "STOPPED";
19
+ })(DeploymentStatus || (exports.DeploymentStatus = DeploymentStatus = {}));
20
+ (0, type_graphql_1.registerEnumType)(DeploymentStatus, {
21
+ name: 'DeploymentStatus',
22
+ description: 'Model deployment status'
23
+ });
24
+ /**
25
+ * Deployment Environment
26
+ */
27
+ var DeploymentEnvironment;
28
+ (function (DeploymentEnvironment) {
29
+ DeploymentEnvironment["DEVELOPMENT"] = "DEVELOPMENT";
30
+ DeploymentEnvironment["STAGING"] = "STAGING";
31
+ DeploymentEnvironment["PRODUCTION"] = "PRODUCTION";
32
+ })(DeploymentEnvironment || (exports.DeploymentEnvironment = DeploymentEnvironment = {}));
33
+ (0, type_graphql_1.registerEnumType)(DeploymentEnvironment, {
34
+ name: 'DeploymentEnvironment',
35
+ description: 'Deployment environment'
36
+ });
37
+ /**
38
+ * ML Deployment Entity
39
+ *
40
+ * Tracks model deployments to various environments
41
+ */
42
+ let MLDeployment = class MLDeployment {
43
+ };
44
+ exports.MLDeployment = MLDeployment;
45
+ tslib_1.__decorate([
46
+ (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
47
+ (0, type_graphql_1.Field)(type => type_graphql_1.ID, { description: 'Deployment ID' }),
48
+ tslib_1.__metadata("design:type", String)
49
+ ], MLDeployment.prototype, "id", void 0);
50
+ tslib_1.__decorate([
51
+ (0, typeorm_1.ManyToOne)(() => ml_model_1.MLModel),
52
+ (0, type_graphql_1.Field)(type => ml_model_1.MLModel, { description: 'Deployed model' }),
53
+ tslib_1.__metadata("design:type", ml_model_1.MLModel)
54
+ ], MLDeployment.prototype, "model", void 0);
55
+ tslib_1.__decorate([
56
+ (0, typeorm_1.RelationId)((deployment) => deployment.model),
57
+ tslib_1.__metadata("design:type", String)
58
+ ], MLDeployment.prototype, "modelId", void 0);
59
+ tslib_1.__decorate([
60
+ (0, typeorm_1.Column)({ nullable: true, comment: 'Deployment name' }),
61
+ (0, type_graphql_1.Field)({ description: 'Deployment name' }),
62
+ tslib_1.__metadata("design:type", String)
63
+ ], MLDeployment.prototype, "name", void 0);
64
+ tslib_1.__decorate([
65
+ (0, typeorm_1.Column)({ type: 'varchar', default: DeploymentEnvironment.DEVELOPMENT, comment: 'Environment' }),
66
+ (0, type_graphql_1.Field)(type => DeploymentEnvironment, { description: 'Deployment environment' }),
67
+ tslib_1.__metadata("design:type", String)
68
+ ], MLDeployment.prototype, "environment", void 0);
69
+ tslib_1.__decorate([
70
+ (0, typeorm_1.Column)({ type: 'varchar', default: DeploymentStatus.DEPLOYING, comment: 'Status' }),
71
+ (0, type_graphql_1.Field)(type => DeploymentStatus, { description: 'Current deployment status' }),
72
+ tslib_1.__metadata("design:type", String)
73
+ ], MLDeployment.prototype, "status", void 0);
74
+ tslib_1.__decorate([
75
+ (0, typeorm_1.Column)({ nullable: true, comment: 'Endpoint URL' }),
76
+ (0, type_graphql_1.Field)({ nullable: true, description: 'API endpoint URL' }),
77
+ tslib_1.__metadata("design:type", String)
78
+ ], MLDeployment.prototype, "endpoint", void 0);
79
+ tslib_1.__decorate([
80
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true, comment: 'Scaling configuration' }),
81
+ (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'Scaling config as JSON' }),
82
+ tslib_1.__metadata("design:type", String)
83
+ ], MLDeployment.prototype, "scalingConfig", void 0);
84
+ tslib_1.__decorate([
85
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true, comment: 'Resource allocation' }),
86
+ (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'Resource config as JSON' }),
87
+ tslib_1.__metadata("design:type", String)
88
+ ], MLDeployment.prototype, "resources", void 0);
89
+ tslib_1.__decorate([
90
+ (0, typeorm_1.Column)({ type: 'timestamp', nullable: true, comment: 'Deployment time' }),
91
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Deployed at' }),
92
+ tslib_1.__metadata("design:type", Date)
93
+ ], MLDeployment.prototype, "deployedAt", void 0);
94
+ tslib_1.__decorate([
95
+ (0, typeorm_1.Column)({ type: 'int', default: 0, comment: 'Total prediction count' }),
96
+ (0, type_graphql_1.Field)(type => type_graphql_1.Int, { description: 'Total predictions served' }),
97
+ tslib_1.__metadata("design:type", Number)
98
+ ], MLDeployment.prototype, "predictionCount", void 0);
99
+ tslib_1.__decorate([
100
+ (0, typeorm_1.Column)({ type: 'float', nullable: true, comment: 'Average latency (ms)' }),
101
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Average latency in ms' }),
102
+ tslib_1.__metadata("design:type", Number)
103
+ ], MLDeployment.prototype, "avgLatency", void 0);
104
+ tslib_1.__decorate([
105
+ (0, typeorm_1.Column)({ type: 'float', nullable: true, comment: 'Error rate' }),
106
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Error rate (0-1)' }),
107
+ tslib_1.__metadata("design:type", Number)
108
+ ], MLDeployment.prototype, "errorRate", void 0);
109
+ tslib_1.__decorate([
110
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true, comment: 'Deployment metadata' }),
111
+ (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'Metadata as JSON' }),
112
+ tslib_1.__metadata("design:type", String)
113
+ ], MLDeployment.prototype, "metadata", void 0);
114
+ tslib_1.__decorate([
115
+ (0, typeorm_1.ManyToOne)(() => shell_1.Domain),
116
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Domain' }),
117
+ tslib_1.__metadata("design:type", shell_1.Domain)
118
+ ], MLDeployment.prototype, "domain", void 0);
119
+ tslib_1.__decorate([
120
+ (0, typeorm_1.RelationId)((deployment) => deployment.domain),
121
+ tslib_1.__metadata("design:type", String)
122
+ ], MLDeployment.prototype, "domainId", void 0);
123
+ tslib_1.__decorate([
124
+ (0, typeorm_1.ManyToOne)(() => auth_base_1.User, { nullable: true }),
125
+ (0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true, description: 'Deployed by' }),
126
+ tslib_1.__metadata("design:type", auth_base_1.User)
127
+ ], MLDeployment.prototype, "deployedBy", void 0);
128
+ tslib_1.__decorate([
129
+ (0, typeorm_1.RelationId)((deployment) => deployment.deployedBy),
130
+ tslib_1.__metadata("design:type", String)
131
+ ], MLDeployment.prototype, "deployedById", void 0);
132
+ tslib_1.__decorate([
133
+ (0, typeorm_1.CreateDateColumn)(),
134
+ (0, type_graphql_1.Field)({ description: 'Created at' }),
135
+ tslib_1.__metadata("design:type", Date)
136
+ ], MLDeployment.prototype, "createdAt", void 0);
137
+ tslib_1.__decorate([
138
+ (0, typeorm_1.UpdateDateColumn)(),
139
+ (0, type_graphql_1.Field)({ description: 'Updated at' }),
140
+ tslib_1.__metadata("design:type", Date)
141
+ ], MLDeployment.prototype, "updatedAt", void 0);
142
+ tslib_1.__decorate([
143
+ (0, typeorm_1.DeleteDateColumn)(),
144
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Deleted at' }),
145
+ tslib_1.__metadata("design:type", Date)
146
+ ], MLDeployment.prototype, "deletedAt", void 0);
147
+ exports.MLDeployment = MLDeployment = tslib_1.__decorate([
148
+ (0, typeorm_1.Entity)('ml_deployments'),
149
+ (0, typeorm_1.Index)('ix_ml_deployment_0', ['domain', 'model']),
150
+ (0, typeorm_1.Index)('ix_ml_deployment_1', ['environment', 'status']),
151
+ (0, type_graphql_1.ObjectType)({ description: 'ML Model deployment configuration' })
152
+ ], MLDeployment);
153
+ //# sourceMappingURL=ml-deployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ml-deployment.js","sourceRoot":"","sources":["../../../server/service/ml-deployment/ml-deployment.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { MLModel } from '../ml-model/ml-model'\n\n/**\n * Deployment Status\n */\nexport enum DeploymentStatus {\n DEPLOYING = 'DEPLOYING',\n ACTIVE = 'ACTIVE',\n FAILED = 'FAILED',\n STOPPED = 'STOPPED'\n}\n\nregisterEnumType(DeploymentStatus, {\n name: 'DeploymentStatus',\n description: 'Model deployment status'\n})\n\n/**\n * Deployment Environment\n */\nexport enum DeploymentEnvironment {\n DEVELOPMENT = 'DEVELOPMENT',\n STAGING = 'STAGING',\n PRODUCTION = 'PRODUCTION'\n}\n\nregisterEnumType(DeploymentEnvironment, {\n name: 'DeploymentEnvironment',\n description: 'Deployment environment'\n})\n\n/**\n * ML Deployment Entity\n *\n * Tracks model deployments to various environments\n */\n@Entity('ml_deployments')\n@Index('ix_ml_deployment_0', ['domain', 'model'])\n@Index('ix_ml_deployment_1', ['environment', 'status'])\n@ObjectType({ description: 'ML Model deployment configuration' })\nexport class MLDeployment {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Deployment ID' })\n id: string\n\n @ManyToOne(() => MLModel)\n @Field(type => MLModel, { description: 'Deployed model' })\n model: MLModel\n\n @RelationId((deployment: MLDeployment) => deployment.model)\n modelId: string\n\n @Column({ nullable: true, comment: 'Deployment name' })\n @Field({ description: 'Deployment name' })\n name: string\n\n @Column({ type: 'varchar', default: DeploymentEnvironment.DEVELOPMENT, comment: 'Environment' })\n @Field(type => DeploymentEnvironment, { description: 'Deployment environment' })\n environment: DeploymentEnvironment\n\n @Column({ type: 'varchar', default: DeploymentStatus.DEPLOYING, comment: 'Status' })\n @Field(type => DeploymentStatus, { description: 'Current deployment status' })\n status: DeploymentStatus\n\n @Column({ nullable: true, comment: 'Endpoint URL' })\n @Field({ nullable: true, description: 'API endpoint URL' })\n endpoint?: string\n\n @Column({ type: 'simple-json', nullable: true, comment: 'Scaling configuration' })\n @Field(type => String, { nullable: true, description: 'Scaling config as JSON' })\n scalingConfig?: string\n\n @Column({ type: 'simple-json', nullable: true, comment: 'Resource allocation' })\n @Field(type => String, { nullable: true, description: 'Resource config as JSON' })\n resources?: string\n\n @Column({ type: 'timestamp', nullable: true, comment: 'Deployment time' })\n @Field({ nullable: true, description: 'Deployed at' })\n deployedAt?: Date\n\n @Column({ type: 'int', default: 0, comment: 'Total prediction count' })\n @Field(type => Int, { description: 'Total predictions served' })\n predictionCount: number\n\n @Column({ type: 'float', nullable: true, comment: 'Average latency (ms)' })\n @Field({ nullable: true, description: 'Average latency in ms' })\n avgLatency?: number\n\n @Column({ type: 'float', nullable: true, comment: 'Error rate' })\n @Field({ nullable: true, description: 'Error rate (0-1)' })\n errorRate?: number\n\n @Column({ type: 'simple-json', nullable: true, comment: 'Deployment metadata' })\n @Field(type => String, { nullable: true, description: 'Metadata as JSON' })\n metadata?: string\n\n @ManyToOne(() => Domain)\n @Field({ nullable: true, description: 'Domain' })\n domain?: Domain\n\n @RelationId((deployment: MLDeployment) => deployment.domain)\n domainId?: string\n\n @ManyToOne(() => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'Deployed by' })\n deployedBy?: User\n\n @RelationId((deployment: MLDeployment) => deployment.deployedBy)\n deployedById?: string\n\n @CreateDateColumn()\n @Field({ description: 'Created at' })\n createdAt: Date\n\n @UpdateDateColumn()\n @Field({ description: 'Updated at' })\n updatedAt: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'Deleted at' })\n deletedAt?: Date\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import { MLModel } from './ml-model';
2
+ import { MLModelQuery } from './ml-model-query';
3
+ import { MLModelMutation } from './ml-model-mutation';
4
+ export declare const entities: (typeof MLModel)[];
5
+ export declare const resolvers: (typeof MLModelQuery | typeof MLModelMutation)[];
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvers = exports.entities = void 0;
4
+ const ml_model_1 = require("./ml-model");
5
+ const ml_model_query_1 = require("./ml-model-query");
6
+ const ml_model_mutation_1 = require("./ml-model-mutation");
7
+ exports.entities = [ml_model_1.MLModel];
8
+ exports.resolvers = [ml_model_query_1.MLModelQuery, ml_model_mutation_1.MLModelMutation];
9
+ // export * from './ml-model'
10
+ // export * from './ml-model-types'
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/ml-model/index.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,qDAA+C;AAC/C,2DAAqD;AAExC,QAAA,QAAQ,GAAG,CAAC,kBAAO,CAAC,CAAA;AACpB,QAAA,SAAS,GAAG,CAAC,6BAAY,EAAE,mCAAe,CAAC,CAAA;AAExD,6BAA6B;AAC7B,mCAAmC","sourcesContent":["import { MLModel } from './ml-model'\nimport { MLModelQuery } from './ml-model-query'\nimport { MLModelMutation } from './ml-model-mutation'\n\nexport const entities = [MLModel]\nexport const resolvers = [MLModelQuery, MLModelMutation]\n\n// export * from './ml-model'\n// export * from './ml-model-types'\n"]}
@@ -0,0 +1,24 @@
1
+ import { MLModel } from './ml-model';
2
+ import { RegisterMLModelInput, UpdateMLModelInput, PromoteModelInput } from './ml-model-types';
3
+ export declare class MLModelMutation {
4
+ /**
5
+ * Register new ML model
6
+ */
7
+ registerMLModel(input: RegisterMLModelInput, context: ResolverContext): Promise<MLModel>;
8
+ /**
9
+ * Update ML model
10
+ */
11
+ updateMLModel(id: string, input: UpdateMLModelInput, context: ResolverContext): Promise<MLModel>;
12
+ /**
13
+ * Promote model to target stage
14
+ */
15
+ promoteMLModel(input: PromoteModelInput, context: ResolverContext): Promise<MLModel>;
16
+ /**
17
+ * Archive ML model
18
+ */
19
+ archiveMLModel(id: string, context: ResolverContext): Promise<boolean>;
20
+ /**
21
+ * Delete ML model
22
+ */
23
+ deleteMLModel(id: string, context: ResolverContext): Promise<boolean>;
24
+ }
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MLModelMutation = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const type_graphql_1 = require("type-graphql");
6
+ const typeorm_1 = require("typeorm");
7
+ const ml_model_1 = require("./ml-model");
8
+ const ml_model_types_1 = require("./ml-model-types");
9
+ let MLModelMutation = class MLModelMutation {
10
+ /**
11
+ * Register new ML model
12
+ */
13
+ async registerMLModel(input, context) {
14
+ const { domain, user } = context.state;
15
+ // Check if model with same name and version exists
16
+ const existing = await (0, typeorm_1.getRepository)(ml_model_1.MLModel).findOne({
17
+ where: {
18
+ domain: { id: domain.id },
19
+ name: input.name,
20
+ version: input.version
21
+ }
22
+ });
23
+ if (existing) {
24
+ throw new Error(`Model ${input.name} version ${input.version} already exists`);
25
+ }
26
+ const model = (0, typeorm_1.getRepository)(ml_model_1.MLModel).create({
27
+ ...input,
28
+ stage: input.stage || ml_model_1.ModelStage.NONE,
29
+ domain,
30
+ creator: user,
31
+ updater: user
32
+ });
33
+ return await (0, typeorm_1.getRepository)(ml_model_1.MLModel).save(model);
34
+ }
35
+ /**
36
+ * Update ML model
37
+ */
38
+ async updateMLModel(id, input, context) {
39
+ const { domain, user } = context.state;
40
+ const model = await (0, typeorm_1.getRepository)(ml_model_1.MLModel).findOne({
41
+ where: { id, domain: { id: domain.id } }
42
+ });
43
+ if (!model) {
44
+ throw new Error(`Model ${id} not found`);
45
+ }
46
+ Object.assign(model, input, { updater: user });
47
+ return await (0, typeorm_1.getRepository)(ml_model_1.MLModel).save(model);
48
+ }
49
+ /**
50
+ * Promote model to target stage
51
+ */
52
+ async promoteMLModel(input, context) {
53
+ const { domain, user } = context.state;
54
+ const model = await (0, typeorm_1.getRepository)(ml_model_1.MLModel).findOne({
55
+ where: { id: input.modelId, domain: { id: domain.id } }
56
+ });
57
+ if (!model) {
58
+ throw new Error(`Model ${input.modelId} not found`);
59
+ }
60
+ // Validate stage transition
61
+ if (model.stage === ml_model_1.ModelStage.ARCHIVED) {
62
+ throw new Error('Cannot promote archived model');
63
+ }
64
+ if (input.targetStage === ml_model_1.ModelStage.NONE) {
65
+ throw new Error('Cannot promote to None stage');
66
+ }
67
+ // If promoting to Production, demote other Production models with same name
68
+ if (input.targetStage === ml_model_1.ModelStage.PRODUCTION) {
69
+ await (0, typeorm_1.getRepository)(ml_model_1.MLModel).update({
70
+ domain: { id: domain.id },
71
+ name: model.name,
72
+ stage: ml_model_1.ModelStage.PRODUCTION
73
+ }, {
74
+ stage: ml_model_1.ModelStage.STAGING
75
+ });
76
+ }
77
+ model.stage = input.targetStage;
78
+ model.updater = user;
79
+ return await (0, typeorm_1.getRepository)(ml_model_1.MLModel).save(model);
80
+ }
81
+ /**
82
+ * Archive ML model
83
+ */
84
+ async archiveMLModel(id, context) {
85
+ const { domain } = context.state;
86
+ const model = await (0, typeorm_1.getRepository)(ml_model_1.MLModel).findOne({
87
+ where: { id, domain: { id: domain.id } }
88
+ });
89
+ if (!model) {
90
+ throw new Error(`Model ${id} not found`);
91
+ }
92
+ if (model.stage === ml_model_1.ModelStage.PRODUCTION) {
93
+ throw new Error('Cannot archive production model. Demote it first.');
94
+ }
95
+ model.stage = ml_model_1.ModelStage.ARCHIVED;
96
+ await (0, typeorm_1.getRepository)(ml_model_1.MLModel).save(model);
97
+ return true;
98
+ }
99
+ /**
100
+ * Delete ML model
101
+ */
102
+ async deleteMLModel(id, context) {
103
+ const { domain } = context.state;
104
+ const model = await (0, typeorm_1.getRepository)(ml_model_1.MLModel).findOne({
105
+ where: { id, domain: { id: domain.id } }
106
+ });
107
+ if (!model) {
108
+ throw new Error(`Model ${id} not found`);
109
+ }
110
+ if (model.stage === ml_model_1.ModelStage.PRODUCTION) {
111
+ throw new Error('Cannot delete production model');
112
+ }
113
+ await (0, typeorm_1.getRepository)(ml_model_1.MLModel).softDelete({ id });
114
+ return true;
115
+ }
116
+ };
117
+ exports.MLModelMutation = MLModelMutation;
118
+ tslib_1.__decorate([
119
+ (0, type_graphql_1.Mutation)(returns => ml_model_1.MLModel, {
120
+ description: 'Register new ML model in the system'
121
+ }),
122
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "mutation")'),
123
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('input')),
124
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
125
+ tslib_1.__metadata("design:type", Function),
126
+ tslib_1.__metadata("design:paramtypes", [ml_model_types_1.RegisterMLModelInput, Object]),
127
+ tslib_1.__metadata("design:returntype", Promise)
128
+ ], MLModelMutation.prototype, "registerMLModel", null);
129
+ tslib_1.__decorate([
130
+ (0, type_graphql_1.Mutation)(returns => ml_model_1.MLModel, {
131
+ description: 'Update ML model information'
132
+ }),
133
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "mutation")'),
134
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
135
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('input')),
136
+ tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
137
+ tslib_1.__metadata("design:type", Function),
138
+ tslib_1.__metadata("design:paramtypes", [String, ml_model_types_1.UpdateMLModelInput, Object]),
139
+ tslib_1.__metadata("design:returntype", Promise)
140
+ ], MLModelMutation.prototype, "updateMLModel", null);
141
+ tslib_1.__decorate([
142
+ (0, type_graphql_1.Mutation)(returns => ml_model_1.MLModel, {
143
+ description: 'Promote model to target deployment stage (Staging/Production)'
144
+ }),
145
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "mutation")'),
146
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('input')),
147
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
148
+ tslib_1.__metadata("design:type", Function),
149
+ tslib_1.__metadata("design:paramtypes", [ml_model_types_1.PromoteModelInput, Object]),
150
+ tslib_1.__metadata("design:returntype", Promise)
151
+ ], MLModelMutation.prototype, "promoteMLModel", null);
152
+ tslib_1.__decorate([
153
+ (0, type_graphql_1.Mutation)(returns => Boolean, {
154
+ description: 'Archive ML model (soft delete)'
155
+ }),
156
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "mutation")'),
157
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
158
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
159
+ tslib_1.__metadata("design:type", Function),
160
+ tslib_1.__metadata("design:paramtypes", [String, Object]),
161
+ tslib_1.__metadata("design:returntype", Promise)
162
+ ], MLModelMutation.prototype, "archiveMLModel", null);
163
+ tslib_1.__decorate([
164
+ (0, type_graphql_1.Mutation)(returns => Boolean, {
165
+ description: 'Delete ML model permanently'
166
+ }),
167
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "mutation")'),
168
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
169
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
170
+ tslib_1.__metadata("design:type", Function),
171
+ tslib_1.__metadata("design:paramtypes", [String, Object]),
172
+ tslib_1.__metadata("design:returntype", Promise)
173
+ ], MLModelMutation.prototype, "deleteMLModel", null);
174
+ exports.MLModelMutation = MLModelMutation = tslib_1.__decorate([
175
+ (0, type_graphql_1.Resolver)(ml_model_1.MLModel)
176
+ ], MLModelMutation);
177
+ //# sourceMappingURL=ml-model-mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ml-model-mutation.js","sourceRoot":"","sources":["../../../server/service/ml-model/ml-model-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { getRepository } from 'typeorm'\nimport { MLModel, ModelStage } from './ml-model'\nimport { RegisterMLModelInput, UpdateMLModelInput, PromoteModelInput } from './ml-model-types'\n\n@Resolver(MLModel)\nexport class MLModelMutation {\n /**\n * Register new ML model\n */\n @Mutation(returns => MLModel, {\n description: 'Register new ML model in the system'\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"mutation\")')\n async registerMLModel(@Arg('input') input: RegisterMLModelInput, @Ctx() context: ResolverContext): Promise<MLModel> {\n const { domain, user } = context.state\n\n // Check if model with same name and version exists\n const existing = await getRepository(MLModel).findOne({\n where: {\n domain: { id: domain.id },\n name: input.name,\n version: input.version\n }\n })\n\n if (existing) {\n throw new Error(`Model ${input.name} version ${input.version} already exists`)\n }\n\n const model = getRepository(MLModel).create({\n ...input,\n stage: input.stage || ModelStage.NONE,\n domain,\n creator: user,\n updater: user\n })\n\n return await getRepository(MLModel).save(model)\n }\n\n /**\n * Update ML model\n */\n @Mutation(returns => MLModel, {\n description: 'Update ML model information'\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"mutation\")')\n async updateMLModel(\n @Arg('id') id: string,\n @Arg('input') input: UpdateMLModelInput,\n @Ctx() context: ResolverContext\n ): Promise<MLModel> {\n const { domain, user } = context.state\n\n const model = await getRepository(MLModel).findOne({\n where: { id, domain: { id: domain.id } }\n })\n\n if (!model) {\n throw new Error(`Model ${id} not found`)\n }\n\n Object.assign(model, input, { updater: user })\n\n return await getRepository(MLModel).save(model)\n }\n\n /**\n * Promote model to target stage\n */\n @Mutation(returns => MLModel, {\n description: 'Promote model to target deployment stage (Staging/Production)'\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"mutation\")')\n async promoteMLModel(@Arg('input') input: PromoteModelInput, @Ctx() context: ResolverContext): Promise<MLModel> {\n const { domain, user } = context.state\n\n const model = await getRepository(MLModel).findOne({\n where: { id: input.modelId, domain: { id: domain.id } }\n })\n\n if (!model) {\n throw new Error(`Model ${input.modelId} not found`)\n }\n\n // Validate stage transition\n if (model.stage === ModelStage.ARCHIVED) {\n throw new Error('Cannot promote archived model')\n }\n\n if (input.targetStage === ModelStage.NONE) {\n throw new Error('Cannot promote to None stage')\n }\n\n // If promoting to Production, demote other Production models with same name\n if (input.targetStage === ModelStage.PRODUCTION) {\n await getRepository(MLModel).update(\n {\n domain: { id: domain.id },\n name: model.name,\n stage: ModelStage.PRODUCTION\n },\n {\n stage: ModelStage.STAGING\n }\n )\n }\n\n model.stage = input.targetStage\n model.updater = user\n\n return await getRepository(MLModel).save(model)\n }\n\n /**\n * Archive ML model\n */\n @Mutation(returns => Boolean, {\n description: 'Archive ML model (soft delete)'\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"mutation\")')\n async archiveMLModel(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain } = context.state\n\n const model = await getRepository(MLModel).findOne({\n where: { id, domain: { id: domain.id } }\n })\n\n if (!model) {\n throw new Error(`Model ${id} not found`)\n }\n\n if (model.stage === ModelStage.PRODUCTION) {\n throw new Error('Cannot archive production model. Demote it first.')\n }\n\n model.stage = ModelStage.ARCHIVED\n\n await getRepository(MLModel).save(model)\n\n return true\n }\n\n /**\n * Delete ML model\n */\n @Mutation(returns => Boolean, {\n description: 'Delete ML model permanently'\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"mutation\")')\n async deleteMLModel(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain } = context.state\n\n const model = await getRepository(MLModel).findOne({\n where: { id, domain: { id: domain.id } }\n })\n\n if (!model) {\n throw new Error(`Model ${id} not found`)\n }\n\n if (model.stage === ModelStage.PRODUCTION) {\n throw new Error('Cannot delete production model')\n }\n\n await getRepository(MLModel).softDelete({ id })\n\n return true\n }\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import { MLModel, ModelStage } from './ml-model';
2
+ export declare class MLModelQuery {
3
+ /**
4
+ * Get all ML models
5
+ */
6
+ mlModels(context: ResolverContext): Promise<MLModel[]>;
7
+ /**
8
+ * Get ML model by ID
9
+ */
10
+ mlModel(id: string, context: ResolverContext): Promise<MLModel | undefined>;
11
+ /**
12
+ * Get models by stage
13
+ */
14
+ mlModelsByStage(stage: ModelStage, context: ResolverContext): Promise<MLModel[]>;
15
+ /**
16
+ * Get models by name (all versions)
17
+ */
18
+ mlModelVersions(name: string, context: ResolverContext): Promise<MLModel[]>;
19
+ /**
20
+ * Get models by Label Studio project
21
+ */
22
+ mlModelsByLabelStudioProject(projectId: number, context: ResolverContext): Promise<MLModel[]>;
23
+ }