@mastra/factory 0.0.0 → 0.1.0-alpha.3
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/CHANGELOG.md +23 -0
- package/LICENSE.md +30 -0
- package/dist/auth.d.ts +181 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +370 -0
- package/dist/auth.js.map +1 -0
- package/dist/capabilities/connection.d.ts +9 -0
- package/dist/capabilities/connection.d.ts.map +1 -0
- package/dist/capabilities/connection.js +1 -0
- package/dist/capabilities/connection.js.map +1 -0
- package/dist/capabilities/intake.d.ts +93 -0
- package/dist/capabilities/intake.d.ts.map +1 -0
- package/dist/capabilities/intake.js +1 -0
- package/dist/capabilities/intake.js.map +1 -0
- package/dist/capabilities/version-control.d.ts +239 -0
- package/dist/capabilities/version-control.d.ts.map +1 -0
- package/dist/capabilities/version-control.js +1 -0
- package/dist/capabilities/version-control.js.map +1 -0
- package/dist/factory.d.ts +145 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +38245 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38245 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/base.d.ts +197 -0
- package/dist/integrations/base.d.ts.map +1 -0
- package/dist/integrations/base.js +1 -0
- package/dist/integrations/base.js.map +1 -0
- package/dist/integrations/github/config.d.ts +60 -0
- package/dist/integrations/github/config.d.ts.map +1 -0
- package/dist/integrations/github/config.js +28 -0
- package/dist/integrations/github/config.js.map +1 -0
- package/dist/integrations/github/factory-session.d.ts +12 -0
- package/dist/integrations/github/factory-session.d.ts.map +1 -0
- package/dist/integrations/github/factory-session.js +41 -0
- package/dist/integrations/github/factory-session.js.map +1 -0
- package/dist/integrations/github/integration.d.ts +191 -0
- package/dist/integrations/github/integration.d.ts.map +1 -0
- package/dist/integrations/github/integration.js +3001 -0
- package/dist/integrations/github/integration.js.map +1 -0
- package/dist/integrations/github/issue-triage.d.ts +27 -0
- package/dist/integrations/github/issue-triage.d.ts.map +1 -0
- package/dist/integrations/github/issue-triage.js +82 -0
- package/dist/integrations/github/issue-triage.js.map +1 -0
- package/dist/integrations/github/project-lock.d.ts +78 -0
- package/dist/integrations/github/project-lock.d.ts.map +1 -0
- package/dist/integrations/github/project-lock.js +70 -0
- package/dist/integrations/github/project-lock.js.map +1 -0
- package/dist/integrations/github/provenance.d.ts +27 -0
- package/dist/integrations/github/provenance.d.ts.map +1 -0
- package/dist/integrations/github/provenance.js +104 -0
- package/dist/integrations/github/provenance.js.map +1 -0
- package/dist/integrations/github/routes.d.ts +72 -0
- package/dist/integrations/github/routes.d.ts.map +1 -0
- package/dist/integrations/github/routes.js +1834 -0
- package/dist/integrations/github/routes.js.map +1 -0
- package/dist/integrations/github/sandbox.d.ts +268 -0
- package/dist/integrations/github/sandbox.d.ts.map +1 -0
- package/dist/integrations/github/sandbox.js +381 -0
- package/dist/integrations/github/sandbox.js.map +1 -0
- package/dist/integrations/github/session-subscriptions.d.ts +23 -0
- package/dist/integrations/github/session-subscriptions.d.ts.map +1 -0
- package/dist/integrations/github/session-subscriptions.js +190 -0
- package/dist/integrations/github/session-subscriptions.js.map +1 -0
- package/dist/integrations/github/subscriptions.d.ts +54 -0
- package/dist/integrations/github/subscriptions.d.ts.map +1 -0
- package/dist/integrations/github/subscriptions.js +70 -0
- package/dist/integrations/github/subscriptions.js.map +1 -0
- package/dist/integrations/github/webhook.d.ts +87 -0
- package/dist/integrations/github/webhook.d.ts.map +1 -0
- package/dist/integrations/github/webhook.js +381 -0
- package/dist/integrations/github/webhook.js.map +1 -0
- package/dist/integrations/linear/agent-tools.d.ts +34 -0
- package/dist/integrations/linear/agent-tools.d.ts.map +1 -0
- package/dist/integrations/linear/agent-tools.js +108 -0
- package/dist/integrations/linear/agent-tools.js.map +1 -0
- package/dist/integrations/linear/integration.d.ts +233 -0
- package/dist/integrations/linear/integration.d.ts.map +1 -0
- package/dist/integrations/linear/integration.js +962 -0
- package/dist/integrations/linear/integration.js.map +1 -0
- package/dist/integrations/linear/routes.d.ts +61 -0
- package/dist/integrations/linear/routes.d.ts.map +1 -0
- package/dist/integrations/linear/routes.js +242 -0
- package/dist/integrations/linear/routes.js.map +1 -0
- package/dist/integrations/linear/storage.d.ts +65 -0
- package/dist/integrations/linear/storage.d.ts.map +1 -0
- package/dist/integrations/linear/storage.js +1 -0
- package/dist/integrations/linear/storage.js.map +1 -0
- package/dist/integrations/platform/api-client.d.ts +24 -0
- package/dist/integrations/platform/api-client.d.ts.map +1 -0
- package/dist/integrations/platform/api-client.js +153 -0
- package/dist/integrations/platform/api-client.js.map +1 -0
- package/dist/integrations/platform/github/event-worker.d.ts +44 -0
- package/dist/integrations/platform/github/event-worker.d.ts.map +1 -0
- package/dist/integrations/platform/github/event-worker.js +585 -0
- package/dist/integrations/platform/github/event-worker.js.map +1 -0
- package/dist/integrations/platform/github/integration.d.ts +36 -0
- package/dist/integrations/platform/github/integration.d.ts.map +1 -0
- package/dist/integrations/platform/github/integration.js +3253 -0
- package/dist/integrations/platform/github/integration.js.map +1 -0
- package/dist/integrations/platform/linear/integration.d.ts +46 -0
- package/dist/integrations/platform/linear/integration.d.ts.map +1 -0
- package/dist/integrations/platform/linear/integration.js +891 -0
- package/dist/integrations/platform/linear/integration.js.map +1 -0
- package/dist/integrations/workos/integration.d.ts +39 -0
- package/dist/integrations/workos/integration.d.ts.map +1 -0
- package/dist/integrations/workos/integration.js +96 -0
- package/dist/integrations/workos/integration.js.map +1 -0
- package/dist/routes/config.d.ts +220 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +770 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/fs.d.ts +105 -0
- package/dist/routes/fs.d.ts.map +1 -0
- package/dist/routes/fs.js +294 -0
- package/dist/routes/fs.js.map +1 -0
- package/dist/routes/intake.d.ts +23 -0
- package/dist/routes/intake.d.ts.map +1 -0
- package/dist/routes/intake.js +179 -0
- package/dist/routes/intake.js.map +1 -0
- package/dist/routes/oauth.d.ts +43 -0
- package/dist/routes/oauth.d.ts.map +1 -0
- package/dist/routes/oauth.js +25058 -0
- package/dist/routes/oauth.js.map +1 -0
- package/dist/routes/projects.d.ts +19 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +395 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/provider-credentials.d.ts +81 -0
- package/dist/routes/provider-credentials.d.ts.map +1 -0
- package/dist/routes/provider-credentials.js +68 -0
- package/dist/routes/provider-credentials.js.map +1 -0
- package/dist/routes/route.d.ts +48 -0
- package/dist/routes/route.d.ts.map +1 -0
- package/dist/routes/route.js +11 -0
- package/dist/routes/route.js.map +1 -0
- package/dist/routes/skills.d.ts +30 -0
- package/dist/routes/skills.d.ts.map +1 -0
- package/dist/routes/skills.js +181 -0
- package/dist/routes/skills.js.map +1 -0
- package/dist/routes/surface.d.ts +83 -0
- package/dist/routes/surface.d.ts.map +1 -0
- package/dist/routes/surface.js +28519 -0
- package/dist/routes/surface.js.map +1 -0
- package/dist/routes/tenant-credentials.d.ts +74 -0
- package/dist/routes/tenant-credentials.d.ts.map +1 -0
- package/dist/routes/tenant-credentials.js +181 -0
- package/dist/routes/tenant-credentials.js.map +1 -0
- package/dist/routes/work-items.d.ts +40 -0
- package/dist/routes/work-items.d.ts.map +1 -0
- package/dist/routes/work-items.js +902 -0
- package/dist/routes/work-items.js.map +1 -0
- package/dist/rules/binding-context.d.ts +5 -0
- package/dist/rules/binding-context.d.ts.map +1 -0
- package/dist/rules/binding-context.js +40 -0
- package/dist/rules/binding-context.js.map +1 -0
- package/dist/rules/defaults.d.ts +9 -0
- package/dist/rules/defaults.d.ts.map +1 -0
- package/dist/rules/defaults.js +334 -0
- package/dist/rules/defaults.js.map +1 -0
- package/dist/rules/dispatcher.d.ts +40 -0
- package/dist/rules/dispatcher.d.ts.map +1 -0
- package/dist/rules/dispatcher.js +695 -0
- package/dist/rules/dispatcher.js.map +1 -0
- package/dist/rules/github-service.d.ts +29 -0
- package/dist/rules/github-service.d.ts.map +1 -0
- package/dist/rules/github-service.js +474 -0
- package/dist/rules/github-service.js.map +1 -0
- package/dist/rules/index.d.ts +7 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +583 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/linear-service.d.ts +27 -0
- package/dist/rules/linear-service.d.ts.map +1 -0
- package/dist/rules/linear-service.js +343 -0
- package/dist/rules/linear-service.js.map +1 -0
- package/dist/rules/processor.d.ts +54 -0
- package/dist/rules/processor.d.ts.map +1 -0
- package/dist/rules/processor.js +629 -0
- package/dist/rules/processor.js.map +1 -0
- package/dist/rules/resolve.d.ts +17 -0
- package/dist/rules/resolve.d.ts.map +1 -0
- package/dist/rules/resolve.js +27 -0
- package/dist/rules/resolve.js.map +1 -0
- package/dist/rules/start-coordinator.d.ts +58 -0
- package/dist/rules/start-coordinator.d.ts.map +1 -0
- package/dist/rules/start-coordinator.js +136 -0
- package/dist/rules/start-coordinator.js.map +1 -0
- package/dist/rules/tools.d.ts +10 -0
- package/dist/rules/tools.d.ts.map +1 -0
- package/dist/rules/tools.js +93 -0
- package/dist/rules/tools.js.map +1 -0
- package/dist/rules/transition-service.d.ts +32 -0
- package/dist/rules/transition-service.d.ts.map +1 -0
- package/dist/rules/transition-service.js +474 -0
- package/dist/rules/transition-service.js.map +1 -0
- package/dist/rules/types.d.ts +225 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +33 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/validation.d.ts +11 -0
- package/dist/rules/validation.d.ts.map +1 -0
- package/dist/rules/validation.js +310 -0
- package/dist/rules/validation.js.map +1 -0
- package/dist/sandbox/fleet.d.ts +208 -0
- package/dist/sandbox/fleet.d.ts.map +1 -0
- package/dist/sandbox/fleet.js +259 -0
- package/dist/sandbox/fleet.js.map +1 -0
- package/dist/sandbox/reattach.d.ts +3 -0
- package/dist/sandbox/reattach.d.ts.map +1 -0
- package/dist/sandbox/reattach.js +9 -0
- package/dist/sandbox/reattach.js.map +1 -0
- package/dist/server-error.d.ts +12 -0
- package/dist/server-error.d.ts.map +1 -0
- package/dist/server-error.js +20 -0
- package/dist/server-error.js.map +1 -0
- package/dist/skills/service.d.ts +48 -0
- package/dist/skills/service.d.ts.map +1 -0
- package/dist/skills/service.js +45 -0
- package/dist/skills/service.js.map +1 -0
- package/dist/spa-static.d.ts +34 -0
- package/dist/spa-static.d.ts.map +1 -0
- package/dist/spa-static.js +73 -0
- package/dist/spa-static.js.map +1 -0
- package/dist/state-signing.d.ts +48 -0
- package/dist/state-signing.d.ts.map +1 -0
- package/dist/state-signing.js +48 -0
- package/dist/state-signing.js.map +1 -0
- package/dist/storage/domains/audit/agent-audit.d.ts +27 -0
- package/dist/storage/domains/audit/agent-audit.d.ts.map +1 -0
- package/dist/storage/domains/audit/agent-audit.js +65 -0
- package/dist/storage/domains/audit/agent-audit.js.map +1 -0
- package/dist/storage/domains/audit/base.d.ts +140 -0
- package/dist/storage/domains/audit/base.d.ts.map +1 -0
- package/dist/storage/domains/audit/base.js +127 -0
- package/dist/storage/domains/audit/base.js.map +1 -0
- package/dist/storage/domains/audit/domain.d.ts +69 -0
- package/dist/storage/domains/audit/domain.d.ts.map +1 -0
- package/dist/storage/domains/audit/domain.js +165 -0
- package/dist/storage/domains/audit/domain.js.map +1 -0
- package/dist/storage/domains/credentials/base.d.ts +134 -0
- package/dist/storage/domains/credentials/base.d.ts.map +1 -0
- package/dist/storage/domains/credentials/base.js +257 -0
- package/dist/storage/domains/credentials/base.js.map +1 -0
- package/dist/storage/domains/intake/base.d.ts +38 -0
- package/dist/storage/domains/intake/base.d.ts.map +1 -0
- package/dist/storage/domains/intake/base.js +62 -0
- package/dist/storage/domains/intake/base.js.map +1 -0
- package/dist/storage/domains/integrations/base.d.ts +126 -0
- package/dist/storage/domains/integrations/base.d.ts.map +1 -0
- package/dist/storage/domains/integrations/base.js +252 -0
- package/dist/storage/domains/integrations/base.js.map +1 -0
- package/dist/storage/domains/model-packs/base.d.ts +49 -0
- package/dist/storage/domains/model-packs/base.d.ts.map +1 -0
- package/dist/storage/domains/model-packs/base.js +95 -0
- package/dist/storage/domains/model-packs/base.js.map +1 -0
- package/dist/storage/domains/projects/base.d.ts +55 -0
- package/dist/storage/domains/projects/base.d.ts.map +1 -0
- package/dist/storage/domains/projects/base.js +99 -0
- package/dist/storage/domains/projects/base.js.map +1 -0
- package/dist/storage/domains/queue-health/base.d.ts +52 -0
- package/dist/storage/domains/queue-health/base.d.ts.map +1 -0
- package/dist/storage/domains/queue-health/base.js +87 -0
- package/dist/storage/domains/queue-health/base.js.map +1 -0
- package/dist/storage/domains/source-control/base.d.ts +288 -0
- package/dist/storage/domains/source-control/base.d.ts.map +1 -0
- package/dist/storage/domains/source-control/base.js +722 -0
- package/dist/storage/domains/source-control/base.js.map +1 -0
- package/dist/storage/domains/source-control/inmemory.d.ts +158 -0
- package/dist/storage/domains/source-control/inmemory.d.ts.map +1 -0
- package/dist/storage/domains/source-control/inmemory.js +348 -0
- package/dist/storage/domains/source-control/inmemory.js.map +1 -0
- package/dist/storage/domains/work-items/base.d.ts +412 -0
- package/dist/storage/domains/work-items/base.d.ts.map +1 -0
- package/dist/storage/domains/work-items/base.js +1174 -0
- package/dist/storage/domains/work-items/base.js.map +1 -0
- package/dist/storage/domains/work-items/metrics.d.ts +101 -0
- package/dist/storage/domains/work-items/metrics.d.ts.map +1 -0
- package/dist/storage/domains/work-items/metrics.js +203 -0
- package/dist/storage/domains/work-items/metrics.js.map +1 -0
- package/dist/workspace.d.ts +20 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +364 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +19 -19
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// src/storage/domains/model-packs/base.ts
|
|
2
|
+
import { FactoryStorageDomain } from "@mastra/core/storage";
|
|
3
|
+
var MODEL_PACKS_SCHEMA = {
|
|
4
|
+
name: "model_packs",
|
|
5
|
+
columns: {
|
|
6
|
+
id: { type: "uuid-pk" },
|
|
7
|
+
org_id: { type: "text" },
|
|
8
|
+
created_by: { type: "text" },
|
|
9
|
+
name: { type: "text" },
|
|
10
|
+
build_model_id: { type: "text" },
|
|
11
|
+
plan_model_id: { type: "text" },
|
|
12
|
+
fast_model_id: { type: "text" },
|
|
13
|
+
created_at: { type: "timestamp" },
|
|
14
|
+
updated_at: { type: "timestamp" }
|
|
15
|
+
},
|
|
16
|
+
indexes: [{ name: "model_packs_org_name_idx", columns: ["org_id", "name"] }]
|
|
17
|
+
};
|
|
18
|
+
function toModelPack(row) {
|
|
19
|
+
return {
|
|
20
|
+
id: row.id,
|
|
21
|
+
orgId: row.org_id,
|
|
22
|
+
createdBy: row.created_by,
|
|
23
|
+
name: row.name,
|
|
24
|
+
models: { build: row.build_model_id, plan: row.plan_model_id, fast: row.fast_model_id },
|
|
25
|
+
createdAt: row.created_at,
|
|
26
|
+
updatedAt: row.updated_at
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
var ModelPacksStorage = class extends FactoryStorageDomain {
|
|
30
|
+
constructor() {
|
|
31
|
+
super("model-packs");
|
|
32
|
+
}
|
|
33
|
+
async init() {
|
|
34
|
+
await this.ensureCollections([MODEL_PACKS_SCHEMA]);
|
|
35
|
+
}
|
|
36
|
+
async dangerouslyClearAll() {
|
|
37
|
+
await this.ops.deleteMany("model_packs", {});
|
|
38
|
+
}
|
|
39
|
+
get #db() {
|
|
40
|
+
return this.ops;
|
|
41
|
+
}
|
|
42
|
+
/** Create or replace a pack by `(orgId, name)` — mirrors the settings.json upsert semantics. */
|
|
43
|
+
async upsert({
|
|
44
|
+
orgId,
|
|
45
|
+
userId,
|
|
46
|
+
input
|
|
47
|
+
}) {
|
|
48
|
+
const now = /* @__PURE__ */ new Date();
|
|
49
|
+
const existing = await this.#db.findOne("model_packs", { org_id: orgId, name: input.name });
|
|
50
|
+
if (existing) {
|
|
51
|
+
const row2 = await this.#db.updateAtomic(
|
|
52
|
+
"model_packs",
|
|
53
|
+
{ org_id: orgId, id: existing.id },
|
|
54
|
+
() => ({
|
|
55
|
+
build_model_id: input.models.build,
|
|
56
|
+
plan_model_id: input.models.plan,
|
|
57
|
+
fast_model_id: input.models.fast,
|
|
58
|
+
updated_at: now
|
|
59
|
+
})
|
|
60
|
+
);
|
|
61
|
+
return toModelPack(row2 ?? existing);
|
|
62
|
+
}
|
|
63
|
+
const row = await this.#db.insertOne("model_packs", {
|
|
64
|
+
org_id: orgId,
|
|
65
|
+
created_by: userId,
|
|
66
|
+
name: input.name,
|
|
67
|
+
build_model_id: input.models.build,
|
|
68
|
+
plan_model_id: input.models.plan,
|
|
69
|
+
fast_model_id: input.models.fast,
|
|
70
|
+
created_at: now,
|
|
71
|
+
updated_at: now
|
|
72
|
+
});
|
|
73
|
+
return toModelPack(row);
|
|
74
|
+
}
|
|
75
|
+
async list({ orgId }) {
|
|
76
|
+
const rows = await this.#db.findMany(
|
|
77
|
+
"model_packs",
|
|
78
|
+
{ org_id: orgId },
|
|
79
|
+
{ orderBy: [["name", "asc"]] }
|
|
80
|
+
);
|
|
81
|
+
return rows.map(toModelPack);
|
|
82
|
+
}
|
|
83
|
+
async get({ orgId, id }) {
|
|
84
|
+
const row = await this.#db.findOne("model_packs", { org_id: orgId, id });
|
|
85
|
+
return row ? toModelPack(row) : null;
|
|
86
|
+
}
|
|
87
|
+
async delete({ orgId, id }) {
|
|
88
|
+
return await this.#db.deleteMany("model_packs", { org_id: orgId, id }) > 0;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
export {
|
|
92
|
+
MODEL_PACKS_SCHEMA,
|
|
93
|
+
ModelPacksStorage
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/storage/domains/model-packs/base.ts"],"sourcesContent":["import { FactoryStorageDomain } from '@mastra/core/storage';\nimport type { CollectionSchema, FactoryStorageOps } from '@mastra/core/storage';\n\n/** A saved custom model pack: one model per mode (build / plan / fast). */\nexport interface ModelPackRecord {\n id: string;\n orgId: string;\n createdBy: string;\n name: string;\n models: { build: string; plan: string; fast: string };\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface UpsertModelPackInput {\n name: string;\n models: { build: string; plan: string; fast: string };\n}\n\nexport const MODEL_PACKS_SCHEMA: CollectionSchema = {\n name: 'model_packs',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n created_by: { type: 'text' },\n name: { type: 'text' },\n build_model_id: { type: 'text' },\n plan_model_id: { type: 'text' },\n fast_model_id: { type: 'text' },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n indexes: [{ name: 'model_packs_org_name_idx', columns: ['org_id', 'name'] }],\n};\n\ninterface ModelPackDbRow extends Record<string, unknown> {\n id: string;\n org_id: string;\n created_by: string;\n name: string;\n build_model_id: string;\n plan_model_id: string;\n fast_model_id: string;\n created_at: Date;\n updated_at: Date;\n}\n\nfunction toModelPack(row: ModelPackDbRow): ModelPackRecord {\n return {\n id: row.id,\n orgId: row.org_id,\n createdBy: row.created_by,\n name: row.name,\n models: { build: row.build_model_id, plan: row.plan_model_id, fast: row.fast_model_id },\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nexport class ModelPacksStorage extends FactoryStorageDomain {\n constructor() {\n super('model-packs');\n }\n\n async init(): Promise<void> {\n await this.ensureCollections([MODEL_PACKS_SCHEMA]);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.ops.deleteMany('model_packs', {});\n }\n\n get #db(): FactoryStorageOps {\n return this.ops;\n }\n\n /** Create or replace a pack by `(orgId, name)` — mirrors the settings.json upsert semantics. */\n async upsert({\n orgId,\n userId,\n input,\n }: {\n orgId: string;\n userId: string;\n input: UpsertModelPackInput;\n }): Promise<ModelPackRecord> {\n const now = new Date();\n const existing = await this.#db.findOne<ModelPackDbRow>('model_packs', { org_id: orgId, name: input.name });\n if (existing) {\n const row = await this.#db.updateAtomic<ModelPackDbRow>(\n 'model_packs',\n { org_id: orgId, id: existing.id },\n () => ({\n build_model_id: input.models.build,\n plan_model_id: input.models.plan,\n fast_model_id: input.models.fast,\n updated_at: now,\n }),\n );\n return toModelPack(row ?? existing);\n }\n const row = await this.#db.insertOne<ModelPackDbRow>('model_packs', {\n org_id: orgId,\n created_by: userId,\n name: input.name,\n build_model_id: input.models.build,\n plan_model_id: input.models.plan,\n fast_model_id: input.models.fast,\n created_at: now,\n updated_at: now,\n });\n return toModelPack(row);\n }\n\n async list({ orgId }: { orgId: string }): Promise<ModelPackRecord[]> {\n const rows = await this.#db.findMany<ModelPackDbRow>(\n 'model_packs',\n { org_id: orgId },\n { orderBy: [['name', 'asc']] },\n );\n return rows.map(toModelPack);\n }\n\n async get({ orgId, id }: { orgId: string; id: string }): Promise<ModelPackRecord | null> {\n const row = await this.#db.findOne<ModelPackDbRow>('model_packs', { org_id: orgId, id });\n return row ? toModelPack(row) : null;\n }\n\n async delete({ orgId, id }: { orgId: string; id: string }): Promise<boolean> {\n return (await this.#db.deleteMany('model_packs', { org_id: orgId, id })) > 0;\n }\n}\n"],"mappings":"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","names":["row"]}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { FactoryStorageDomain } from '@mastra/core/storage';
|
|
2
|
+
import type { CollectionSchema } from '@mastra/core/storage';
|
|
3
|
+
export interface FactoryProject {
|
|
4
|
+
id: string;
|
|
5
|
+
orgId: string;
|
|
6
|
+
createdBy: string;
|
|
7
|
+
name: string;
|
|
8
|
+
description: string | null;
|
|
9
|
+
/** Default model for sessions/runs started under this Factory (null = harness default). */
|
|
10
|
+
defaultModelId: string | null;
|
|
11
|
+
createdAt: Date;
|
|
12
|
+
updatedAt: Date;
|
|
13
|
+
}
|
|
14
|
+
export interface CreateFactoryProjectInput {
|
|
15
|
+
name: string;
|
|
16
|
+
description?: string | null;
|
|
17
|
+
defaultModelId?: string | null;
|
|
18
|
+
}
|
|
19
|
+
export interface UpdateFactoryProjectInput {
|
|
20
|
+
name?: string;
|
|
21
|
+
description?: string | null;
|
|
22
|
+
defaultModelId?: string | null;
|
|
23
|
+
}
|
|
24
|
+
export declare const FACTORY_PROJECTS_SCHEMA: CollectionSchema;
|
|
25
|
+
export declare class FactoryProjectsStorage extends FactoryStorageDomain {
|
|
26
|
+
#private;
|
|
27
|
+
constructor();
|
|
28
|
+
init(): Promise<void>;
|
|
29
|
+
dangerouslyClearAll(): Promise<void>;
|
|
30
|
+
create({ orgId, userId, input, }: {
|
|
31
|
+
orgId: string;
|
|
32
|
+
userId: string;
|
|
33
|
+
input: CreateFactoryProjectInput;
|
|
34
|
+
}): Promise<FactoryProject>;
|
|
35
|
+
list({ orgId }: {
|
|
36
|
+
orgId: string;
|
|
37
|
+
}): Promise<FactoryProject[]>;
|
|
38
|
+
get({ orgId, id }: {
|
|
39
|
+
orgId: string;
|
|
40
|
+
id: string;
|
|
41
|
+
}): Promise<FactoryProject | null>;
|
|
42
|
+
getById({ id }: {
|
|
43
|
+
id: string;
|
|
44
|
+
}): Promise<FactoryProject | null>;
|
|
45
|
+
update({ orgId, id, input, }: {
|
|
46
|
+
orgId: string;
|
|
47
|
+
id: string;
|
|
48
|
+
input: UpdateFactoryProjectInput;
|
|
49
|
+
}): Promise<FactoryProject | null>;
|
|
50
|
+
delete({ orgId, id }: {
|
|
51
|
+
orgId: string;
|
|
52
|
+
id: string;
|
|
53
|
+
}): Promise<FactoryProject | null>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/projects/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAqB,MAAM,sBAAsB,CAAC;AAEhF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,2FAA2F;IAC3F,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,eAAO,MAAM,uBAAuB,EAAE,gBAarC,CAAC;AA0BF,qBAAa,sBAAuB,SAAQ,oBAAoB;;;IAKxD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQpC,MAAM,CAAC,EACX,KAAK,EACL,MAAM,EACN,KAAK,GACN,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,yBAAyB,CAAC;KAClC,GAAG,OAAO,CAAC,cAAc,CAAC;IAcrB,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAS7D,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAKjF,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAK/D,MAAM,CAAC,EACX,KAAK,EACL,EAAE,EACF,KAAK,GACN,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,yBAAyB,CAAC;KAClC,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAU5B,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAM3F"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// src/storage/domains/projects/base.ts
|
|
2
|
+
import { FactoryStorageDomain } from "@mastra/core/storage";
|
|
3
|
+
var FACTORY_PROJECTS_SCHEMA = {
|
|
4
|
+
name: "factory_projects",
|
|
5
|
+
columns: {
|
|
6
|
+
id: { type: "uuid-pk" },
|
|
7
|
+
org_id: { type: "text" },
|
|
8
|
+
created_by: { type: "text" },
|
|
9
|
+
name: { type: "text" },
|
|
10
|
+
description: { type: "text", nullable: true },
|
|
11
|
+
default_model_id: { type: "text", nullable: true },
|
|
12
|
+
created_at: { type: "timestamp" },
|
|
13
|
+
updated_at: { type: "timestamp" }
|
|
14
|
+
},
|
|
15
|
+
indexes: [{ name: "factory_projects_org_updated_at_idx", columns: ["org_id", "updated_at"] }]
|
|
16
|
+
};
|
|
17
|
+
function toFactoryProject(row) {
|
|
18
|
+
return {
|
|
19
|
+
id: row.id,
|
|
20
|
+
orgId: row.org_id,
|
|
21
|
+
createdBy: row.created_by,
|
|
22
|
+
name: row.name,
|
|
23
|
+
description: row.description,
|
|
24
|
+
defaultModelId: row.default_model_id,
|
|
25
|
+
createdAt: row.created_at,
|
|
26
|
+
updatedAt: row.updated_at
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
var FactoryProjectsStorage = class extends FactoryStorageDomain {
|
|
30
|
+
constructor() {
|
|
31
|
+
super("projects");
|
|
32
|
+
}
|
|
33
|
+
async init() {
|
|
34
|
+
await this.ensureCollections([FACTORY_PROJECTS_SCHEMA]);
|
|
35
|
+
}
|
|
36
|
+
async dangerouslyClearAll() {
|
|
37
|
+
await this.ops.deleteMany("factory_projects", {});
|
|
38
|
+
}
|
|
39
|
+
get #db() {
|
|
40
|
+
return this.ops;
|
|
41
|
+
}
|
|
42
|
+
async create({
|
|
43
|
+
orgId,
|
|
44
|
+
userId,
|
|
45
|
+
input
|
|
46
|
+
}) {
|
|
47
|
+
const now = /* @__PURE__ */ new Date();
|
|
48
|
+
const row = await this.#db.insertOne("factory_projects", {
|
|
49
|
+
org_id: orgId,
|
|
50
|
+
created_by: userId,
|
|
51
|
+
name: input.name,
|
|
52
|
+
description: input.description ?? null,
|
|
53
|
+
default_model_id: input.defaultModelId ?? null,
|
|
54
|
+
created_at: now,
|
|
55
|
+
updated_at: now
|
|
56
|
+
});
|
|
57
|
+
return toFactoryProject(row);
|
|
58
|
+
}
|
|
59
|
+
async list({ orgId }) {
|
|
60
|
+
const rows = await this.#db.findMany(
|
|
61
|
+
"factory_projects",
|
|
62
|
+
{ org_id: orgId },
|
|
63
|
+
{ orderBy: [["updated_at", "desc"]] }
|
|
64
|
+
);
|
|
65
|
+
return rows.map(toFactoryProject);
|
|
66
|
+
}
|
|
67
|
+
async get({ orgId, id }) {
|
|
68
|
+
const row = await this.#db.findOne("factory_projects", { org_id: orgId, id });
|
|
69
|
+
return row ? toFactoryProject(row) : null;
|
|
70
|
+
}
|
|
71
|
+
async getById({ id }) {
|
|
72
|
+
const row = await this.#db.findOne("factory_projects", { id });
|
|
73
|
+
return row ? toFactoryProject(row) : null;
|
|
74
|
+
}
|
|
75
|
+
async update({
|
|
76
|
+
orgId,
|
|
77
|
+
id,
|
|
78
|
+
input
|
|
79
|
+
}) {
|
|
80
|
+
const row = await this.#db.updateAtomic("factory_projects", { org_id: orgId, id }, () => ({
|
|
81
|
+
...input.name !== void 0 ? { name: input.name } : {},
|
|
82
|
+
...input.description !== void 0 ? { description: input.description } : {},
|
|
83
|
+
...input.defaultModelId !== void 0 ? { default_model_id: input.defaultModelId } : {},
|
|
84
|
+
updated_at: /* @__PURE__ */ new Date()
|
|
85
|
+
}));
|
|
86
|
+
return row ? toFactoryProject(row) : null;
|
|
87
|
+
}
|
|
88
|
+
async delete({ orgId, id }) {
|
|
89
|
+
const project = await this.get({ orgId, id });
|
|
90
|
+
if (!project) return null;
|
|
91
|
+
const deleted = await this.#db.deleteMany("factory_projects", { org_id: orgId, id });
|
|
92
|
+
return deleted > 0 ? project : null;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
export {
|
|
96
|
+
FACTORY_PROJECTS_SCHEMA,
|
|
97
|
+
FactoryProjectsStorage
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/storage/domains/projects/base.ts"],"sourcesContent":["import { FactoryStorageDomain } from '@mastra/core/storage';\nimport type { CollectionSchema, FactoryStorageOps } from '@mastra/core/storage';\n\nexport interface FactoryProject {\n id: string;\n orgId: string;\n createdBy: string;\n name: string;\n description: string | null;\n /** Default model for sessions/runs started under this Factory (null = harness default). */\n defaultModelId: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface CreateFactoryProjectInput {\n name: string;\n description?: string | null;\n defaultModelId?: string | null;\n}\n\nexport interface UpdateFactoryProjectInput {\n name?: string;\n description?: string | null;\n defaultModelId?: string | null;\n}\n\nexport const FACTORY_PROJECTS_SCHEMA: CollectionSchema = {\n name: 'factory_projects',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n created_by: { type: 'text' },\n name: { type: 'text' },\n description: { type: 'text', nullable: true },\n default_model_id: { type: 'text', nullable: true },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n indexes: [{ name: 'factory_projects_org_updated_at_idx', columns: ['org_id', 'updated_at'] }],\n};\n\ninterface FactoryProjectDbRow extends Record<string, unknown> {\n id: string;\n org_id: string;\n created_by: string;\n name: string;\n description: string | null;\n default_model_id: string | null;\n created_at: Date;\n updated_at: Date;\n}\n\nfunction toFactoryProject(row: FactoryProjectDbRow): FactoryProject {\n return {\n id: row.id,\n orgId: row.org_id,\n createdBy: row.created_by,\n name: row.name,\n description: row.description,\n defaultModelId: row.default_model_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nexport class FactoryProjectsStorage extends FactoryStorageDomain {\n constructor() {\n super('projects');\n }\n\n async init(): Promise<void> {\n await this.ensureCollections([FACTORY_PROJECTS_SCHEMA]);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.ops.deleteMany('factory_projects', {});\n }\n\n get #db(): FactoryStorageOps {\n return this.ops;\n }\n\n async create({\n orgId,\n userId,\n input,\n }: {\n orgId: string;\n userId: string;\n input: CreateFactoryProjectInput;\n }): Promise<FactoryProject> {\n const now = new Date();\n const row = await this.#db.insertOne<FactoryProjectDbRow>('factory_projects', {\n org_id: orgId,\n created_by: userId,\n name: input.name,\n description: input.description ?? null,\n default_model_id: input.defaultModelId ?? null,\n created_at: now,\n updated_at: now,\n });\n return toFactoryProject(row);\n }\n\n async list({ orgId }: { orgId: string }): Promise<FactoryProject[]> {\n const rows = await this.#db.findMany<FactoryProjectDbRow>(\n 'factory_projects',\n { org_id: orgId },\n { orderBy: [['updated_at', 'desc']] },\n );\n return rows.map(toFactoryProject);\n }\n\n async get({ orgId, id }: { orgId: string; id: string }): Promise<FactoryProject | null> {\n const row = await this.#db.findOne<FactoryProjectDbRow>('factory_projects', { org_id: orgId, id });\n return row ? toFactoryProject(row) : null;\n }\n\n async getById({ id }: { id: string }): Promise<FactoryProject | null> {\n const row = await this.#db.findOne<FactoryProjectDbRow>('factory_projects', { id });\n return row ? toFactoryProject(row) : null;\n }\n\n async update({\n orgId,\n id,\n input,\n }: {\n orgId: string;\n id: string;\n input: UpdateFactoryProjectInput;\n }): Promise<FactoryProject | null> {\n const row = await this.#db.updateAtomic<FactoryProjectDbRow>('factory_projects', { org_id: orgId, id }, () => ({\n ...(input.name !== undefined ? { name: input.name } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.defaultModelId !== undefined ? { default_model_id: input.defaultModelId } : {}),\n updated_at: new Date(),\n }));\n return row ? toFactoryProject(row) : null;\n }\n\n async delete({ orgId, id }: { orgId: string; id: string }): Promise<FactoryProject | null> {\n const project = await this.get({ orgId, id });\n if (!project) return null;\n const deleted = await this.#db.deleteMany('factory_projects', { org_id: orgId, id });\n return deleted > 0 ? project : null;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Queue-health threshold configuration domain: per-project age buckets for the
|
|
3
|
+
* Factory Overview queue-health chart.
|
|
4
|
+
*
|
|
5
|
+
* Stored per `(org, github_project)` — each connected GitHub project gets its
|
|
6
|
+
* own age thresholds so a fast-moving automated pipeline and a slow human one
|
|
7
|
+
* can bucket "how old is the work" differently. `thresholdsSeconds` is an
|
|
8
|
+
* ordered-ascending list of age boundaries in seconds: an item younger than
|
|
9
|
+
* the first boundary is green, younger than the second amber, younger than the
|
|
10
|
+
* third orange, and red otherwise. Seconds (not hours) so sub-minute buckets
|
|
11
|
+
* are representable for fast automated flows.
|
|
12
|
+
*/
|
|
13
|
+
import { FactoryStorageDomain } from '@mastra/core/storage';
|
|
14
|
+
import type { CollectionSchema } from '@mastra/core/storage';
|
|
15
|
+
export interface QueueHealthConfig {
|
|
16
|
+
/** Ordered-ascending age boundaries in seconds, e.g. `[14400, 86400, 259200]`. */
|
|
17
|
+
thresholdsSeconds: number[];
|
|
18
|
+
}
|
|
19
|
+
/** Default: green <4h, amber <24h, orange <72h, red 72h+. */
|
|
20
|
+
export declare const DEFAULT_QUEUE_HEALTH_CONFIG: QueueHealthConfig;
|
|
21
|
+
/**
|
|
22
|
+
* Throw unless `thresholdsSeconds` is a non-empty ascending number list. A
|
|
23
|
+
* descending config would silently invert bucket semantics, so validate at the
|
|
24
|
+
* write boundary rather than trusting callers.
|
|
25
|
+
*/
|
|
26
|
+
export declare function assertValidThresholds(config: QueueHealthConfig): void;
|
|
27
|
+
/** Validate untrusted JSON into a `QueueHealthConfig`, or `null` when invalid. */
|
|
28
|
+
export declare function parseQueueHealthConfig(body: unknown): QueueHealthConfig | null;
|
|
29
|
+
/**
|
|
30
|
+
* Return `config.thresholdsSeconds` when valid, else the default. Validation
|
|
31
|
+
* lives at the `saveConfig` write boundary, but `getConfig` round-trips a
|
|
32
|
+
* stored JSON row — a corrupted or hand-edited row (empty / non-ascending)
|
|
33
|
+
* would otherwise reach the chart and invert bucket colors, so the read route
|
|
34
|
+
* re-validates and falls back.
|
|
35
|
+
*/
|
|
36
|
+
export declare function thresholdsOrDefault(config: QueueHealthConfig): number[];
|
|
37
|
+
export declare const QUEUE_HEALTH_SETTINGS_SCHEMA: CollectionSchema;
|
|
38
|
+
/**
|
|
39
|
+
* Queue-health settings storage, written once against the generic
|
|
40
|
+
* `FactoryStorageOps` surface — works on any `FactoryStorage` backend.
|
|
41
|
+
*/
|
|
42
|
+
export declare class QueueHealthStorage extends FactoryStorageDomain {
|
|
43
|
+
#private;
|
|
44
|
+
constructor();
|
|
45
|
+
init(): Promise<void>;
|
|
46
|
+
dangerouslyClearAll(): Promise<void>;
|
|
47
|
+
/** Read the project's queue-health config, falling back to {@link DEFAULT_QUEUE_HEALTH_CONFIG}. */
|
|
48
|
+
getConfig(orgId: string, factoryProjectId: string): Promise<QueueHealthConfig>;
|
|
49
|
+
/** Upsert the project's queue-health config (`created_at` is preserved on update). */
|
|
50
|
+
saveConfig(orgId: string, factoryProjectId: string, config: QueueHealthConfig): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/queue-health/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,oBAAoB,EAAwB,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAqB,MAAM,sBAAsB,CAAC;AAEhF,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,6DAA6D;AAC7D,eAAO,MAAM,2BAA2B,EAAE,iBAEzC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAUrE;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAU9E;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAEvE;AAED,eAAO,MAAM,4BAA4B,EAAE,gBAW1C,CAAC;AAEF;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,oBAAoB;;;IAKpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ1C,mGAAmG;IAC7F,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQpF,sFAAsF;IAChF,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBpG"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// src/storage/domains/queue-health/base.ts
|
|
2
|
+
import { FactoryStorageDomain, UniqueViolationError } from "@mastra/core/storage";
|
|
3
|
+
var DEFAULT_QUEUE_HEALTH_CONFIG = {
|
|
4
|
+
thresholdsSeconds: [14400, 86400, 259200]
|
|
5
|
+
};
|
|
6
|
+
function assertValidThresholds(config) {
|
|
7
|
+
const t = config.thresholdsSeconds;
|
|
8
|
+
if (!Array.isArray(t) || t.length === 0 || t.some((v) => typeof v !== "number" || !Number.isFinite(v))) {
|
|
9
|
+
throw new Error("[QueueHealthStorage] thresholdsSeconds must be a non-empty array of finite numbers.");
|
|
10
|
+
}
|
|
11
|
+
for (let i = 1; i < t.length; i++) {
|
|
12
|
+
if (t[i] <= t[i - 1]) {
|
|
13
|
+
throw new Error("[QueueHealthStorage] thresholdsSeconds must be strictly ascending.");
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function parseQueueHealthConfig(body) {
|
|
18
|
+
if (typeof body !== "object" || body === null) return null;
|
|
19
|
+
const config = body;
|
|
20
|
+
if (!Array.isArray(config.thresholdsSeconds)) return null;
|
|
21
|
+
try {
|
|
22
|
+
assertValidThresholds(config);
|
|
23
|
+
} catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return { thresholdsSeconds: [...config.thresholdsSeconds] };
|
|
27
|
+
}
|
|
28
|
+
function thresholdsOrDefault(config) {
|
|
29
|
+
return parseQueueHealthConfig(config)?.thresholdsSeconds ?? DEFAULT_QUEUE_HEALTH_CONFIG.thresholdsSeconds;
|
|
30
|
+
}
|
|
31
|
+
var QUEUE_HEALTH_SETTINGS_SCHEMA = {
|
|
32
|
+
name: "queue_health_settings",
|
|
33
|
+
columns: {
|
|
34
|
+
id: { type: "uuid-pk" },
|
|
35
|
+
org_id: { type: "text" },
|
|
36
|
+
factory_project_id: { type: "text" },
|
|
37
|
+
config: { type: "json" },
|
|
38
|
+
created_at: { type: "timestamp" },
|
|
39
|
+
updated_at: { type: "timestamp" }
|
|
40
|
+
},
|
|
41
|
+
uniqueIndexes: [{ name: "queue_health_settings_org_project_unique", columns: ["org_id", "factory_project_id"] }]
|
|
42
|
+
};
|
|
43
|
+
var QueueHealthStorage = class extends FactoryStorageDomain {
|
|
44
|
+
constructor() {
|
|
45
|
+
super("queue-health");
|
|
46
|
+
}
|
|
47
|
+
async init() {
|
|
48
|
+
await this.ensureCollections([QUEUE_HEALTH_SETTINGS_SCHEMA]);
|
|
49
|
+
}
|
|
50
|
+
async dangerouslyClearAll() {
|
|
51
|
+
await this.ops.deleteMany("queue_health_settings", {});
|
|
52
|
+
}
|
|
53
|
+
get #db() {
|
|
54
|
+
return this.ops;
|
|
55
|
+
}
|
|
56
|
+
/** Read the project's queue-health config, falling back to {@link DEFAULT_QUEUE_HEALTH_CONFIG}. */
|
|
57
|
+
async getConfig(orgId, factoryProjectId) {
|
|
58
|
+
const row = await this.#db.findOne("queue_health_settings", {
|
|
59
|
+
org_id: orgId,
|
|
60
|
+
factory_project_id: factoryProjectId
|
|
61
|
+
});
|
|
62
|
+
return structuredClone(parseQueueHealthConfig(row?.config) ?? DEFAULT_QUEUE_HEALTH_CONFIG);
|
|
63
|
+
}
|
|
64
|
+
/** Upsert the project's queue-health config (`created_at` is preserved on update). */
|
|
65
|
+
async saveConfig(orgId, factoryProjectId, config) {
|
|
66
|
+
assertValidThresholds(config);
|
|
67
|
+
const where = { org_id: orgId, factory_project_id: factoryProjectId };
|
|
68
|
+
const updateExisting = () => this.#db.updateAtomic("queue_health_settings", where, () => ({ config, updated_at: /* @__PURE__ */ new Date() }));
|
|
69
|
+
if (await updateExisting()) return;
|
|
70
|
+
const now = /* @__PURE__ */ new Date();
|
|
71
|
+
try {
|
|
72
|
+
await this.#db.insertOne("queue_health_settings", { ...where, config, created_at: now, updated_at: now });
|
|
73
|
+
} catch (error) {
|
|
74
|
+
if (!(error instanceof UniqueViolationError)) throw error;
|
|
75
|
+
if (!await updateExisting()) throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
export {
|
|
80
|
+
DEFAULT_QUEUE_HEALTH_CONFIG,
|
|
81
|
+
QUEUE_HEALTH_SETTINGS_SCHEMA,
|
|
82
|
+
QueueHealthStorage,
|
|
83
|
+
assertValidThresholds,
|
|
84
|
+
parseQueueHealthConfig,
|
|
85
|
+
thresholdsOrDefault
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/storage/domains/queue-health/base.ts"],"sourcesContent":["/**\n * Queue-health threshold configuration domain: per-project age buckets for the\n * Factory Overview queue-health chart.\n *\n * Stored per `(org, github_project)` — each connected GitHub project gets its\n * own age thresholds so a fast-moving automated pipeline and a slow human one\n * can bucket \"how old is the work\" differently. `thresholdsSeconds` is an\n * ordered-ascending list of age boundaries in seconds: an item younger than\n * the first boundary is green, younger than the second amber, younger than the\n * third orange, and red otherwise. Seconds (not hours) so sub-minute buckets\n * are representable for fast automated flows.\n */\n\nimport { FactoryStorageDomain, UniqueViolationError } from '@mastra/core/storage';\nimport type { CollectionSchema, FactoryStorageOps } from '@mastra/core/storage';\n\nexport interface QueueHealthConfig {\n /** Ordered-ascending age boundaries in seconds, e.g. `[14400, 86400, 259200]`. */\n thresholdsSeconds: number[];\n}\n\n/** Default: green <4h, amber <24h, orange <72h, red 72h+. */\nexport const DEFAULT_QUEUE_HEALTH_CONFIG: QueueHealthConfig = {\n thresholdsSeconds: [14400, 86400, 259200],\n};\n\n/**\n * Throw unless `thresholdsSeconds` is a non-empty ascending number list. A\n * descending config would silently invert bucket semantics, so validate at the\n * write boundary rather than trusting callers.\n */\nexport function assertValidThresholds(config: QueueHealthConfig): void {\n const t = config.thresholdsSeconds;\n if (!Array.isArray(t) || t.length === 0 || t.some(v => typeof v !== 'number' || !Number.isFinite(v))) {\n throw new Error('[QueueHealthStorage] thresholdsSeconds must be a non-empty array of finite numbers.');\n }\n for (let i = 1; i < t.length; i++) {\n if (t[i]! <= t[i - 1]!) {\n throw new Error('[QueueHealthStorage] thresholdsSeconds must be strictly ascending.');\n }\n }\n}\n\n/** Validate untrusted JSON into a `QueueHealthConfig`, or `null` when invalid. */\nexport function parseQueueHealthConfig(body: unknown): QueueHealthConfig | null {\n if (typeof body !== 'object' || body === null) return null;\n const config = body as { thresholdsSeconds?: unknown };\n if (!Array.isArray(config.thresholdsSeconds)) return null;\n try {\n assertValidThresholds(config as QueueHealthConfig);\n } catch {\n return null;\n }\n return { thresholdsSeconds: [...(config as QueueHealthConfig).thresholdsSeconds] };\n}\n\n/**\n * Return `config.thresholdsSeconds` when valid, else the default. Validation\n * lives at the `saveConfig` write boundary, but `getConfig` round-trips a\n * stored JSON row — a corrupted or hand-edited row (empty / non-ascending)\n * would otherwise reach the chart and invert bucket colors, so the read route\n * re-validates and falls back.\n */\nexport function thresholdsOrDefault(config: QueueHealthConfig): number[] {\n return parseQueueHealthConfig(config)?.thresholdsSeconds ?? DEFAULT_QUEUE_HEALTH_CONFIG.thresholdsSeconds;\n}\n\nexport const QUEUE_HEALTH_SETTINGS_SCHEMA: CollectionSchema = {\n name: 'queue_health_settings',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n config: { type: 'json' },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [{ name: 'queue_health_settings_org_project_unique', columns: ['org_id', 'factory_project_id'] }],\n};\n\n/**\n * Queue-health settings storage, written once against the generic\n * `FactoryStorageOps` surface — works on any `FactoryStorage` backend.\n */\nexport class QueueHealthStorage extends FactoryStorageDomain {\n constructor() {\n super('queue-health');\n }\n\n async init(): Promise<void> {\n await this.ensureCollections([QUEUE_HEALTH_SETTINGS_SCHEMA]);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.ops.deleteMany('queue_health_settings', {});\n }\n\n get #db(): FactoryStorageOps {\n return this.ops;\n }\n\n /** Read the project's queue-health config, falling back to {@link DEFAULT_QUEUE_HEALTH_CONFIG}. */\n async getConfig(orgId: string, factoryProjectId: string): Promise<QueueHealthConfig> {\n const row = await this.#db.findOne<{ config: unknown }>('queue_health_settings', {\n org_id: orgId,\n factory_project_id: factoryProjectId,\n });\n return structuredClone(parseQueueHealthConfig(row?.config) ?? DEFAULT_QUEUE_HEALTH_CONFIG);\n }\n\n /** Upsert the project's queue-health config (`created_at` is preserved on update). */\n async saveConfig(orgId: string, factoryProjectId: string, config: QueueHealthConfig): Promise<void> {\n assertValidThresholds(config);\n const where = { org_id: orgId, factory_project_id: factoryProjectId };\n const updateExisting = () =>\n this.#db.updateAtomic('queue_health_settings', where, () => ({ config, updated_at: new Date() }));\n if (await updateExisting()) return;\n\n const now = new Date();\n try {\n await this.#db.insertOne('queue_health_settings', { ...where, config, created_at: now, updated_at: now });\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n // Lost the insert race — update the winning row under the backend's serialized write primitive.\n if (!(await updateExisting())) throw error;\n }\n }\n}\n"],"mappings":";AAaA,SAAS,sBAAsB,4BAA4B;AASpD,IAAM,8BAAiD;AAAA,EAC5D,mBAAmB,CAAC,OAAO,OAAO,MAAM;AAC1C;AAOO,SAAS,sBAAsB,QAAiC;AACrE,QAAM,IAAI,OAAO;AACjB,MAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,KAAK,OAAK,OAAO,MAAM,YAAY,CAAC,OAAO,SAAS,CAAC,CAAC,GAAG;AACpG,UAAM,IAAI,MAAM,qFAAqF;AAAA,EACvG;AACA,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,QAAI,EAAE,CAAC,KAAM,EAAE,IAAI,CAAC,GAAI;AACtB,YAAM,IAAI,MAAM,oEAAoE;AAAA,IACtF;AAAA,EACF;AACF;AAGO,SAAS,uBAAuB,MAAyC;AAC9E,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AACtD,QAAM,SAAS;AACf,MAAI,CAAC,MAAM,QAAQ,OAAO,iBAAiB,EAAG,QAAO;AACrD,MAAI;AACF,0BAAsB,MAA2B;AAAA,EACnD,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO,EAAE,mBAAmB,CAAC,GAAI,OAA6B,iBAAiB,EAAE;AACnF;AASO,SAAS,oBAAoB,QAAqC;AACvE,SAAO,uBAAuB,MAAM,GAAG,qBAAqB,4BAA4B;AAC1F;AAEO,IAAM,+BAAiD;AAAA,EAC5D,MAAM;AAAA,EACN,SAAS;AAAA,IACP,IAAI,EAAE,MAAM,UAAU;AAAA,IACtB,QAAQ,EAAE,MAAM,OAAO;AAAA,IACvB,oBAAoB,EAAE,MAAM,OAAO;AAAA,IACnC,QAAQ,EAAE,MAAM,OAAO;AAAA,IACvB,YAAY,EAAE,MAAM,YAAY;AAAA,IAChC,YAAY,EAAE,MAAM,YAAY;AAAA,EAClC;AAAA,EACA,eAAe,CAAC,EAAE,MAAM,4CAA4C,SAAS,CAAC,UAAU,oBAAoB,EAAE,CAAC;AACjH;AAMO,IAAM,qBAAN,cAAiC,qBAAqB;AAAA,EAC3D,cAAc;AACZ,UAAM,cAAc;AAAA,EACtB;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,KAAK,kBAAkB,CAAC,4BAA4B,CAAC;AAAA,EAC7D;AAAA,EAEA,MAAM,sBAAqC;AACzC,UAAM,KAAK,IAAI,WAAW,yBAAyB,CAAC,CAAC;AAAA,EACvD;AAAA,EAEA,IAAI,MAAyB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,UAAU,OAAe,kBAAsD;AACnF,UAAM,MAAM,MAAM,KAAK,IAAI,QAA6B,yBAAyB;AAAA,MAC/E,QAAQ;AAAA,MACR,oBAAoB;AAAA,IACtB,CAAC;AACD,WAAO,gBAAgB,uBAAuB,KAAK,MAAM,KAAK,2BAA2B;AAAA,EAC3F;AAAA;AAAA,EAGA,MAAM,WAAW,OAAe,kBAA0B,QAA0C;AAClG,0BAAsB,MAAM;AAC5B,UAAM,QAAQ,EAAE,QAAQ,OAAO,oBAAoB,iBAAiB;AACpE,UAAM,iBAAiB,MACrB,KAAK,IAAI,aAAa,yBAAyB,OAAO,OAAO,EAAE,QAAQ,YAAY,oBAAI,KAAK,EAAE,EAAE;AAClG,QAAI,MAAM,eAAe,EAAG;AAE5B,UAAM,MAAM,oBAAI,KAAK;AACrB,QAAI;AACF,YAAM,KAAK,IAAI,UAAU,yBAAyB,EAAE,GAAG,OAAO,QAAQ,YAAY,KAAK,YAAY,IAAI,CAAC;AAAA,IAC1G,SAAS,OAAO;AACd,UAAI,EAAE,iBAAiB,sBAAuB,OAAM;AAEpD,UAAI,CAAE,MAAM,eAAe,EAAI,OAAM;AAAA,IACvC;AAAA,EACF;AACF;","names":[]}
|