@mastra/factory 0.0.0-fix-thread-subscription-multi-instance-redis-streams-20260730204150
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 +695 -0
- package/LICENSE.md +30 -0
- package/README.md +27 -0
- package/dist/auth.d.ts +181 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +505 -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/intake.d.ts +140 -0
- package/dist/capabilities/intake.d.ts.map +1 -0
- package/dist/capabilities/intake.js +1 -0
- package/dist/capabilities/version-control.d.ts +245 -0
- package/dist/capabilities/version-control.d.ts.map +1 -0
- package/dist/capabilities/version-control.js +1 -0
- package/dist/factory.d.ts +156 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +483 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/integrations/base.d.ts +210 -0
- package/dist/integrations/base.d.ts.map +1 -0
- package/dist/integrations/base.js +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 +42 -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 +37 -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 +1077 -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/pat.d.ts +38 -0
- package/dist/integrations/github/pat.d.ts.map +1 -0
- package/dist/integrations/github/pat.js +59 -0
- package/dist/integrations/github/pat.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 +75 -0
- package/dist/integrations/github/provenance.js.map +1 -0
- package/dist/integrations/github/routes.d.ts +69 -0
- package/dist/integrations/github/routes.d.ts.map +1 -0
- package/dist/integrations/github/routes.js +1324 -0
- package/dist/integrations/github/routes.js.map +1 -0
- package/dist/integrations/github/rules.d.ts +78 -0
- package/dist/integrations/github/rules.d.ts.map +1 -0
- package/dist/integrations/github/rules.js +362 -0
- package/dist/integrations/github/rules.js.map +1 -0
- package/dist/integrations/github/sandbox-release.d.ts +38 -0
- package/dist/integrations/github/sandbox-release.d.ts.map +1 -0
- package/dist/integrations/github/sandbox-release.js +74 -0
- package/dist/integrations/github/sandbox-release.js.map +1 -0
- package/dist/integrations/github/sandbox.d.ts +281 -0
- package/dist/integrations/github/sandbox.d.ts.map +1 -0
- package/dist/integrations/github/sandbox.js +547 -0
- package/dist/integrations/github/sandbox.js.map +1 -0
- package/dist/integrations/github/session-subscriptions.d.ts +26 -0
- package/dist/integrations/github/session-subscriptions.d.ts.map +1 -0
- package/dist/integrations/github/session-subscriptions.js +192 -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 +62 -0
- package/dist/integrations/github/subscriptions.js.map +1 -0
- package/dist/integrations/github/token-refresh.d.ts +12 -0
- package/dist/integrations/github/token-refresh.d.ts.map +1 -0
- package/dist/integrations/github/token-refresh.js +24 -0
- package/dist/integrations/github/token-refresh.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 +397 -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 +85 -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 +672 -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 +239 -0
- package/dist/integrations/linear/routes.js.map +1 -0
- package/dist/integrations/linear/rules.d.ts +42 -0
- package/dist/integrations/linear/rules.d.ts.map +1 -0
- package/dist/integrations/linear/rules.js +133 -0
- package/dist/integrations/linear/rules.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/platform/api-client.d.ts +26 -0
- package/dist/integrations/platform/api-client.d.ts.map +1 -0
- package/dist/integrations/platform/api-client.js +156 -0
- package/dist/integrations/platform/api-client.js.map +1 -0
- package/dist/integrations/platform/github/event-worker.d.ts +49 -0
- package/dist/integrations/platform/github/event-worker.d.ts.map +1 -0
- package/dist/integrations/platform/github/event-worker.js +348 -0
- package/dist/integrations/platform/github/event-worker.js.map +1 -0
- package/dist/integrations/platform/github/integration.d.ts +50 -0
- package/dist/integrations/platform/github/integration.d.ts.map +1 -0
- package/dist/integrations/platform/github/integration.js +961 -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 +483 -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 +91 -0
- package/dist/integrations/workos/integration.js.map +1 -0
- package/dist/routes/config.d.ts +235 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +972 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/custom-provider-source.d.ts +52 -0
- package/dist/routes/custom-provider-source.d.ts.map +1 -0
- package/dist/routes/custom-provider-source.js +124 -0
- package/dist/routes/custom-provider-source.js.map +1 -0
- package/dist/routes/fs.d.ts +151 -0
- package/dist/routes/fs.d.ts.map +1 -0
- package/dist/routes/fs.js +708 -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 +463 -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 +461 -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 +86 -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 +15 -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 +168 -0
- package/dist/routes/skills.js.map +1 -0
- package/dist/routes/surface.d.ts +91 -0
- package/dist/routes/surface.d.ts.map +1 -0
- package/dist/routes/surface.js +260 -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 +156 -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 +695 -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 +28 -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 +260 -0
- package/dist/rules/defaults.js.map +1 -0
- package/dist/rules/dispatcher.d.ts +42 -0
- package/dist/rules/dispatcher.d.ts.map +1 -0
- package/dist/rules/dispatcher.js +518 -0
- package/dist/rules/dispatcher.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 +5 -0
- package/dist/rules/processor.d.ts +54 -0
- package/dist/rules/processor.d.ts.map +1 -0
- package/dist/rules/processor.js +378 -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 +30 -0
- package/dist/rules/resolve.js.map +1 -0
- package/dist/rules/start-coordinator.d.ts +60 -0
- package/dist/rules/start-coordinator.d.ts.map +1 -0
- package/dist/rules/start-coordinator.js +194 -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 +58 -0
- package/dist/rules/tools.js.map +1 -0
- package/dist/rules/transition-service.d.ts +49 -0
- package/dist/rules/transition-service.d.ts.map +1 -0
- package/dist/rules/transition-service.js +232 -0
- package/dist/rules/transition-service.js.map +1 -0
- package/dist/rules/types.d.ts +234 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +38 -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 +308 -0
- package/dist/rules/validation.js.map +1 -0
- package/dist/sandbox/fleet.d.ts +222 -0
- package/dist/sandbox/fleet.d.ts.map +1 -0
- package/dist/sandbox/fleet.js +322 -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 +16 -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 +16 -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 +40 -0
- package/dist/skills/service.js.map +1 -0
- package/dist/spa-static.d.ts +33 -0
- package/dist/spa-static.d.ts.map +1 -0
- package/dist/spa-static.js +104 -0
- package/dist/spa-static.js.map +1 -0
- package/dist/state-signing.d.ts +59 -0
- package/dist/state-signing.d.ts.map +1 -0
- package/dist/state-signing.js +83 -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 +66 -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 +184 -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 +167 -0
- package/dist/storage/domains/audit/domain.js.map +1 -0
- package/dist/storage/domains/channel-identity/base.d.ts +96 -0
- package/dist/storage/domains/channel-identity/base.d.ts.map +1 -0
- package/dist/storage/domains/channel-identity/base.js +149 -0
- package/dist/storage/domains/channel-identity/base.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 +273 -0
- package/dist/storage/domains/credentials/base.js.map +1 -0
- package/dist/storage/domains/custom-providers/base.d.ts +57 -0
- package/dist/storage/domains/custom-providers/base.d.ts.map +1 -0
- package/dist/storage/domains/custom-providers/base.js +145 -0
- package/dist/storage/domains/custom-providers/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 +80 -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 +317 -0
- package/dist/storage/domains/integrations/base.js.map +1 -0
- package/dist/storage/domains/memory-settings/base.d.ts +62 -0
- package/dist/storage/domains/memory-settings/base.d.ts.map +1 -0
- package/dist/storage/domains/memory-settings/base.js +126 -0
- package/dist/storage/domains/memory-settings/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 +96 -0
- package/dist/storage/domains/model-packs/base.js.map +1 -0
- package/dist/storage/domains/projects/base.d.ts +58 -0
- package/dist/storage/domains/projects/base.d.ts.map +1 -0
- package/dist/storage/domains/projects/base.js +111 -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 +122 -0
- package/dist/storage/domains/queue-health/base.js.map +1 -0
- package/dist/storage/domains/source-control/base.d.ts +358 -0
- package/dist/storage/domains/source-control/base.d.ts.map +1 -0
- package/dist/storage/domains/source-control/base.js +908 -0
- package/dist/storage/domains/source-control/base.js.map +1 -0
- package/dist/storage/domains/source-control/inmemory.d.ts +175 -0
- package/dist/storage/domains/source-control/inmemory.d.ts.map +1 -0
- package/dist/storage/domains/source-control/inmemory.js +377 -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 +1309 -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 +221 -0
- package/dist/storage/domains/work-items/metrics.js.map +1 -0
- package/dist/timing.d.ts +15 -0
- package/dist/timing.d.ts.map +1 -0
- package/dist/timing.js +34 -0
- package/dist/timing.js.map +1 -0
- package/dist/workspace.d.ts +24 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +286 -0
- package/dist/workspace.js.map +1 -0
- package/factory-skills/configure-factory-rules/SKILL.md +67 -0
- package/factory-skills/factory-plan/SKILL.md +61 -0
- package/factory-skills/factory-review/SKILL.md +155 -0
- package/factory-skills/factory-triage/SKILL.md +77 -0
- package/package.json +81 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { FactoryStorageDomain, UniqueViolationError } from "@mastra/core/storage";
|
|
2
|
+
//#region src/storage/domains/memory-settings/base.ts
|
|
3
|
+
const MEMORY_SETTINGS_SCHEMA = {
|
|
4
|
+
name: "memory_settings",
|
|
5
|
+
columns: {
|
|
6
|
+
id: { type: "uuid-pk" },
|
|
7
|
+
org_id: { type: "text" },
|
|
8
|
+
user_id: { type: "text" },
|
|
9
|
+
observer_model_id: {
|
|
10
|
+
type: "text",
|
|
11
|
+
nullable: true
|
|
12
|
+
},
|
|
13
|
+
reflector_model_id: {
|
|
14
|
+
type: "text",
|
|
15
|
+
nullable: true
|
|
16
|
+
},
|
|
17
|
+
observation_threshold: {
|
|
18
|
+
type: "integer",
|
|
19
|
+
nullable: true
|
|
20
|
+
},
|
|
21
|
+
reflection_threshold: {
|
|
22
|
+
type: "integer",
|
|
23
|
+
nullable: true
|
|
24
|
+
},
|
|
25
|
+
observe_attachments: {
|
|
26
|
+
type: "json",
|
|
27
|
+
nullable: true
|
|
28
|
+
},
|
|
29
|
+
created_at: { type: "timestamp" },
|
|
30
|
+
updated_at: { type: "timestamp" }
|
|
31
|
+
},
|
|
32
|
+
uniqueIndexes: [{
|
|
33
|
+
name: "memory_settings_org_user_key",
|
|
34
|
+
columns: ["org_id", "user_id"]
|
|
35
|
+
}]
|
|
36
|
+
};
|
|
37
|
+
function toRecord(row) {
|
|
38
|
+
return {
|
|
39
|
+
orgId: row.org_id,
|
|
40
|
+
userId: row.user_id,
|
|
41
|
+
observerModelId: row.observer_model_id,
|
|
42
|
+
reflectorModelId: row.reflector_model_id,
|
|
43
|
+
observationThreshold: row.observation_threshold,
|
|
44
|
+
reflectionThreshold: row.reflection_threshold,
|
|
45
|
+
observeAttachments: row.observe_attachments,
|
|
46
|
+
createdAt: row.created_at,
|
|
47
|
+
updatedAt: row.updated_at
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function patchToColumns(patch) {
|
|
51
|
+
const columns = {};
|
|
52
|
+
if (patch.observerModelId !== void 0) columns.observer_model_id = patch.observerModelId;
|
|
53
|
+
if (patch.reflectorModelId !== void 0) columns.reflector_model_id = patch.reflectorModelId;
|
|
54
|
+
if (patch.observationThreshold !== void 0) columns.observation_threshold = patch.observationThreshold;
|
|
55
|
+
if (patch.reflectionThreshold !== void 0) columns.reflection_threshold = patch.reflectionThreshold;
|
|
56
|
+
if (patch.observeAttachments !== void 0) columns.observe_attachments = patch.observeAttachments;
|
|
57
|
+
return columns;
|
|
58
|
+
}
|
|
59
|
+
var MemorySettingsStorage = class extends FactoryStorageDomain {
|
|
60
|
+
constructor() {
|
|
61
|
+
super("memory-settings");
|
|
62
|
+
}
|
|
63
|
+
async init() {
|
|
64
|
+
await this.ensureCollections([MEMORY_SETTINGS_SCHEMA]);
|
|
65
|
+
}
|
|
66
|
+
async dangerouslyClearAll() {
|
|
67
|
+
await this.ops.deleteMany("memory_settings", {});
|
|
68
|
+
}
|
|
69
|
+
get #db() {
|
|
70
|
+
return this.ops;
|
|
71
|
+
}
|
|
72
|
+
async get({ orgId, userId }) {
|
|
73
|
+
const row = await this.#db.findOne("memory_settings", {
|
|
74
|
+
org_id: orgId,
|
|
75
|
+
user_id: userId
|
|
76
|
+
});
|
|
77
|
+
return row ? toRecord(row) : null;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Upsert the user's row, writing only the knobs present in `patch`.
|
|
81
|
+
* `fillIfUnset` knobs are written only where the stored value is still
|
|
82
|
+
* `NULL`, decided inside the atomic update so concurrent explicit writes
|
|
83
|
+
* win over fills. Concurrent first writes are resolved via the shared
|
|
84
|
+
* insert-then-catch-unique-violation pattern (see `queue_health`).
|
|
85
|
+
*/
|
|
86
|
+
async patch({ orgId, userId, patch, fillIfUnset }) {
|
|
87
|
+
const now = /* @__PURE__ */ new Date();
|
|
88
|
+
const updateExisting = () => this.#db.updateAtomic("memory_settings", {
|
|
89
|
+
org_id: orgId,
|
|
90
|
+
user_id: userId
|
|
91
|
+
}, (row) => {
|
|
92
|
+
const columns = {
|
|
93
|
+
...patchToColumns(patch),
|
|
94
|
+
updated_at: now
|
|
95
|
+
};
|
|
96
|
+
if (fillIfUnset?.observerModelId !== void 0 && row.observer_model_id == null) columns.observer_model_id = patch.observerModelId ?? fillIfUnset.observerModelId;
|
|
97
|
+
if (fillIfUnset?.reflectorModelId !== void 0 && row.reflector_model_id == null) columns.reflector_model_id = patch.reflectorModelId ?? fillIfUnset.reflectorModelId;
|
|
98
|
+
return columns;
|
|
99
|
+
});
|
|
100
|
+
const updated = await updateExisting();
|
|
101
|
+
if (updated) return toRecord(updated);
|
|
102
|
+
try {
|
|
103
|
+
return toRecord(await this.#db.insertOne("memory_settings", {
|
|
104
|
+
org_id: orgId,
|
|
105
|
+
user_id: userId,
|
|
106
|
+
observer_model_id: fillIfUnset?.observerModelId ?? null,
|
|
107
|
+
reflector_model_id: fillIfUnset?.reflectorModelId ?? null,
|
|
108
|
+
observation_threshold: null,
|
|
109
|
+
reflection_threshold: null,
|
|
110
|
+
observe_attachments: null,
|
|
111
|
+
...patchToColumns(patch),
|
|
112
|
+
created_at: now,
|
|
113
|
+
updated_at: now
|
|
114
|
+
}));
|
|
115
|
+
} catch (error) {
|
|
116
|
+
if (!(error instanceof UniqueViolationError)) throw error;
|
|
117
|
+
const row = await updateExisting();
|
|
118
|
+
if (!row) throw error;
|
|
119
|
+
return toRecord(row);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
//#endregion
|
|
124
|
+
export { MEMORY_SETTINGS_SCHEMA, MemorySettingsStorage };
|
|
125
|
+
|
|
126
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","names":["#db"],"sources":["../../../../src/storage/domains/memory-settings/base.ts"],"sourcesContent":["import { FactoryStorageDomain, UniqueViolationError } from '@mastra/core/storage';\nimport type { CollectionSchema, FactoryStorageOps } from '@mastra/core/storage';\n\n/**\n * A user's persisted memory (observational-memory) configuration. The\n * DB-backed tenant counterpart of the local `settings.json` OM fields\n * (`observerModelOverride`, `reflectorModelOverride`, `omObservationThreshold`,\n * `omReflectionThreshold`, `omObserveAttachments`): one row per `(org, user)`,\n * every knob nullable so only explicitly-changed values are stored.\n */\nexport interface MemorySettingsRecord {\n orgId: string;\n userId: string;\n observerModelId: string | null;\n reflectorModelId: string | null;\n observationThreshold: number | null;\n reflectionThreshold: number | null;\n observeAttachments: 'auto' | boolean | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\n/** Partial update — only the provided knobs are written. */\nexport interface MemorySettingsPatch {\n observerModelId?: string;\n reflectorModelId?: string;\n observationThreshold?: number;\n reflectionThreshold?: number;\n observeAttachments?: 'auto' | boolean;\n}\n\n/**\n * Knobs written only when the stored value is still unset (`NULL`). The check\n * happens inside the backend's atomic-update primitive, so a concurrent\n * explicit write to the same knob is never clobbered by a fill.\n */\nexport interface MemorySettingsFillIfUnset {\n observerModelId?: string;\n reflectorModelId?: string;\n}\n\nexport const MEMORY_SETTINGS_SCHEMA: CollectionSchema = {\n name: 'memory_settings',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n user_id: { type: 'text' },\n observer_model_id: { type: 'text', nullable: true },\n reflector_model_id: { type: 'text', nullable: true },\n observation_threshold: { type: 'integer', nullable: true },\n reflection_threshold: { type: 'integer', nullable: true },\n // 'auto' | true | false — json keeps the tri-state without string encoding.\n observe_attachments: { type: 'json', nullable: true },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [{ name: 'memory_settings_org_user_key', columns: ['org_id', 'user_id'] }],\n};\n\ninterface MemorySettingsDbRow extends Record<string, unknown> {\n id: string;\n org_id: string;\n user_id: string;\n observer_model_id: string | null;\n reflector_model_id: string | null;\n observation_threshold: number | null;\n reflection_threshold: number | null;\n observe_attachments: 'auto' | boolean | null;\n created_at: Date;\n updated_at: Date;\n}\n\nfunction toRecord(row: MemorySettingsDbRow): MemorySettingsRecord {\n return {\n orgId: row.org_id,\n userId: row.user_id,\n observerModelId: row.observer_model_id,\n reflectorModelId: row.reflector_model_id,\n observationThreshold: row.observation_threshold,\n reflectionThreshold: row.reflection_threshold,\n observeAttachments: row.observe_attachments,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nfunction patchToColumns(patch: MemorySettingsPatch): Partial<MemorySettingsDbRow> {\n const columns: Partial<MemorySettingsDbRow> = {};\n if (patch.observerModelId !== undefined) columns.observer_model_id = patch.observerModelId;\n if (patch.reflectorModelId !== undefined) columns.reflector_model_id = patch.reflectorModelId;\n if (patch.observationThreshold !== undefined) columns.observation_threshold = patch.observationThreshold;\n if (patch.reflectionThreshold !== undefined) columns.reflection_threshold = patch.reflectionThreshold;\n if (patch.observeAttachments !== undefined) columns.observe_attachments = patch.observeAttachments;\n return columns;\n}\n\nexport class MemorySettingsStorage extends FactoryStorageDomain {\n constructor() {\n super('memory-settings');\n }\n\n async init(): Promise<void> {\n await this.ensureCollections([MEMORY_SETTINGS_SCHEMA]);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.ops.deleteMany('memory_settings', {});\n }\n\n get #db(): FactoryStorageOps {\n return this.ops;\n }\n\n async get({ orgId, userId }: { orgId: string; userId: string }): Promise<MemorySettingsRecord | null> {\n const row = await this.#db.findOne<MemorySettingsDbRow>('memory_settings', { org_id: orgId, user_id: userId });\n return row ? toRecord(row) : null;\n }\n\n /**\n * Upsert the user's row, writing only the knobs present in `patch`.\n * `fillIfUnset` knobs are written only where the stored value is still\n * `NULL`, decided inside the atomic update so concurrent explicit writes\n * win over fills. Concurrent first writes are resolved via the shared\n * insert-then-catch-unique-violation pattern (see `queue_health`).\n */\n async patch({\n orgId,\n userId,\n patch,\n fillIfUnset,\n }: {\n orgId: string;\n userId: string;\n patch: MemorySettingsPatch;\n fillIfUnset?: MemorySettingsFillIfUnset;\n }): Promise<MemorySettingsRecord> {\n const now = new Date();\n const updateExisting = () =>\n this.#db.updateAtomic<MemorySettingsDbRow>('memory_settings', { org_id: orgId, user_id: userId }, row => {\n const columns: Partial<MemorySettingsDbRow> = { ...patchToColumns(patch), updated_at: now };\n if (fillIfUnset?.observerModelId !== undefined && row.observer_model_id == null) {\n columns.observer_model_id = patch.observerModelId ?? fillIfUnset.observerModelId;\n }\n if (fillIfUnset?.reflectorModelId !== undefined && row.reflector_model_id == null) {\n columns.reflector_model_id = patch.reflectorModelId ?? fillIfUnset.reflectorModelId;\n }\n return columns;\n });\n\n const updated = await updateExisting();\n if (updated) return toRecord(updated);\n\n try {\n const row = await this.#db.insertOne<MemorySettingsDbRow>('memory_settings', {\n org_id: orgId,\n user_id: userId,\n observer_model_id: fillIfUnset?.observerModelId ?? null,\n reflector_model_id: fillIfUnset?.reflectorModelId ?? null,\n observation_threshold: null,\n reflection_threshold: null,\n observe_attachments: null,\n ...patchToColumns(patch),\n created_at: now,\n updated_at: now,\n });\n return toRecord(row);\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n // Lost the first-write race — apply the patch to the winning row.\n const row = await updateExisting();\n if (!row) throw error;\n return toRecord(row);\n }\n }\n}\n"],"mappings":";;AAyCA,MAAa,yBAA2C;CACtD,MAAM;CACN,SAAS;EACP,IAAI,EAAE,MAAM,UAAU;EACtB,QAAQ,EAAE,MAAM,OAAO;EACvB,SAAS,EAAE,MAAM,OAAO;EACxB,mBAAmB;GAAE,MAAM;GAAQ,UAAU;EAAK;EAClD,oBAAoB;GAAE,MAAM;GAAQ,UAAU;EAAK;EACnD,uBAAuB;GAAE,MAAM;GAAW,UAAU;EAAK;EACzD,sBAAsB;GAAE,MAAM;GAAW,UAAU;EAAK;EAExD,qBAAqB;GAAE,MAAM;GAAQ,UAAU;EAAK;EACpD,YAAY,EAAE,MAAM,YAAY;EAChC,YAAY,EAAE,MAAM,YAAY;CAClC;CACA,eAAe,CAAC;EAAE,MAAM;EAAgC,SAAS,CAAC,UAAU,SAAS;CAAE,CAAC;AAC1F;AAeA,SAAS,SAAS,KAAgD;CAChE,OAAO;EACL,OAAO,IAAI;EACX,QAAQ,IAAI;EACZ,iBAAiB,IAAI;EACrB,kBAAkB,IAAI;EACtB,sBAAsB,IAAI;EAC1B,qBAAqB,IAAI;EACzB,oBAAoB,IAAI;EACxB,WAAW,IAAI;EACf,WAAW,IAAI;CACjB;AACF;AAEA,SAAS,eAAe,OAA0D;CAChF,MAAM,UAAwC,CAAC;CAC/C,IAAI,MAAM,oBAAoB,KAAA,GAAW,QAAQ,oBAAoB,MAAM;CAC3E,IAAI,MAAM,qBAAqB,KAAA,GAAW,QAAQ,qBAAqB,MAAM;CAC7E,IAAI,MAAM,yBAAyB,KAAA,GAAW,QAAQ,wBAAwB,MAAM;CACpF,IAAI,MAAM,wBAAwB,KAAA,GAAW,QAAQ,uBAAuB,MAAM;CAClF,IAAI,MAAM,uBAAuB,KAAA,GAAW,QAAQ,sBAAsB,MAAM;CAChF,OAAO;AACT;AAEA,IAAa,wBAAb,cAA2C,qBAAqB;CAC9D,cAAc;EACZ,MAAM,iBAAiB;CACzB;CAEA,MAAM,OAAsB;EAC1B,MAAM,KAAK,kBAAkB,CAAC,sBAAsB,CAAC;CACvD;CAEA,MAAM,sBAAqC;EACzC,MAAM,KAAK,IAAI,WAAW,mBAAmB,CAAC,CAAC;CACjD;CAEA,IAAIA,MAAyB;EAC3B,OAAO,KAAK;CACd;CAEA,MAAM,IAAI,EAAE,OAAO,UAAmF;EACpG,MAAM,MAAM,MAAM,KAAKA,IAAI,QAA6B,mBAAmB;GAAE,QAAQ;GAAO,SAAS;EAAO,CAAC;EAC7G,OAAO,MAAM,SAAS,GAAG,IAAI;CAC/B;;;;;;;;CASA,MAAM,MAAM,EACV,OACA,QACA,OACA,eAMgC;EAChC,MAAM,sBAAM,IAAI,KAAK;EACrB,MAAM,uBACJ,KAAKA,IAAI,aAAkC,mBAAmB;GAAE,QAAQ;GAAO,SAAS;EAAO,IAAG,QAAO;GACvG,MAAM,UAAwC;IAAE,GAAG,eAAe,KAAK;IAAG,YAAY;GAAI;GAC1F,IAAI,aAAa,oBAAoB,KAAA,KAAa,IAAI,qBAAqB,MACzE,QAAQ,oBAAoB,MAAM,mBAAmB,YAAY;GAEnE,IAAI,aAAa,qBAAqB,KAAA,KAAa,IAAI,sBAAsB,MAC3E,QAAQ,qBAAqB,MAAM,oBAAoB,YAAY;GAErE,OAAO;EACT,CAAC;EAEH,MAAM,UAAU,MAAM,eAAe;EACrC,IAAI,SAAS,OAAO,SAAS,OAAO;EAEpC,IAAI;GAaF,OAAO,SAAS,MAZE,KAAKA,IAAI,UAA+B,mBAAmB;IAC3E,QAAQ;IACR,SAAS;IACT,mBAAmB,aAAa,mBAAmB;IACnD,oBAAoB,aAAa,oBAAoB;IACrD,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,GAAG,eAAe,KAAK;IACvB,YAAY;IACZ,YAAY;GACd,CAAC,CACkB;EACrB,SAAS,OAAO;GACd,IAAI,EAAE,iBAAiB,uBAAuB,MAAM;GAEpD,MAAM,MAAM,MAAM,eAAe;GACjC,IAAI,CAAC,KAAK,MAAM;GAChB,OAAO,SAAS,GAAG;EACrB;CACF;AACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { FactoryStorageDomain } from '@mastra/core/storage';
|
|
2
|
+
import type { CollectionSchema } from '@mastra/core/storage';
|
|
3
|
+
/** A saved custom model pack: one model per mode (build / plan / fast). */
|
|
4
|
+
export interface ModelPackRecord {
|
|
5
|
+
id: string;
|
|
6
|
+
orgId: string;
|
|
7
|
+
createdBy: string;
|
|
8
|
+
name: string;
|
|
9
|
+
models: {
|
|
10
|
+
build: string;
|
|
11
|
+
plan: string;
|
|
12
|
+
fast: string;
|
|
13
|
+
};
|
|
14
|
+
createdAt: Date;
|
|
15
|
+
updatedAt: Date;
|
|
16
|
+
}
|
|
17
|
+
export interface UpsertModelPackInput {
|
|
18
|
+
name: string;
|
|
19
|
+
models: {
|
|
20
|
+
build: string;
|
|
21
|
+
plan: string;
|
|
22
|
+
fast: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export declare const MODEL_PACKS_SCHEMA: CollectionSchema;
|
|
26
|
+
export declare class ModelPacksStorage extends FactoryStorageDomain {
|
|
27
|
+
#private;
|
|
28
|
+
constructor();
|
|
29
|
+
init(): Promise<void>;
|
|
30
|
+
dangerouslyClearAll(): Promise<void>;
|
|
31
|
+
/** Create or replace a pack by `(orgId, name)` — mirrors the settings.json upsert semantics. */
|
|
32
|
+
upsert({ orgId, userId, input, }: {
|
|
33
|
+
orgId: string;
|
|
34
|
+
userId: string;
|
|
35
|
+
input: UpsertModelPackInput;
|
|
36
|
+
}): Promise<ModelPackRecord>;
|
|
37
|
+
list({ orgId }: {
|
|
38
|
+
orgId: string;
|
|
39
|
+
}): Promise<ModelPackRecord[]>;
|
|
40
|
+
get({ orgId, id }: {
|
|
41
|
+
orgId: string;
|
|
42
|
+
id: string;
|
|
43
|
+
}): Promise<ModelPackRecord | null>;
|
|
44
|
+
delete({ orgId, id }: {
|
|
45
|
+
orgId: string;
|
|
46
|
+
id: string;
|
|
47
|
+
}): Promise<boolean>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/model-packs/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAqB,MAAM,sBAAsB,CAAC;AAEhF,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,eAAO,MAAM,kBAAkB,EAAE,gBAchC,CAAC;AA0BF,qBAAa,iBAAkB,SAAQ,oBAAoB;;;IAKnD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ1C,gGAAgG;IAC1F,MAAM,CAAC,EACX,KAAK,EACL,MAAM,EACN,KAAK,GACN,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,oBAAoB,CAAC;KAC7B,GAAG,OAAO,CAAC,eAAe,CAAC;IA6BtB,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAS9D,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAKlF,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAG7E"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { FactoryStorageDomain } from "@mastra/core/storage";
|
|
2
|
+
//#region src/storage/domains/model-packs/base.ts
|
|
3
|
+
const 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: [{
|
|
17
|
+
name: "model_packs_org_name_idx",
|
|
18
|
+
columns: ["org_id", "name"]
|
|
19
|
+
}]
|
|
20
|
+
};
|
|
21
|
+
function toModelPack(row) {
|
|
22
|
+
return {
|
|
23
|
+
id: row.id,
|
|
24
|
+
orgId: row.org_id,
|
|
25
|
+
createdBy: row.created_by,
|
|
26
|
+
name: row.name,
|
|
27
|
+
models: {
|
|
28
|
+
build: row.build_model_id,
|
|
29
|
+
plan: row.plan_model_id,
|
|
30
|
+
fast: row.fast_model_id
|
|
31
|
+
},
|
|
32
|
+
createdAt: row.created_at,
|
|
33
|
+
updatedAt: row.updated_at
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
var ModelPacksStorage = class extends FactoryStorageDomain {
|
|
37
|
+
constructor() {
|
|
38
|
+
super("model-packs");
|
|
39
|
+
}
|
|
40
|
+
async init() {
|
|
41
|
+
await this.ensureCollections([MODEL_PACKS_SCHEMA]);
|
|
42
|
+
}
|
|
43
|
+
async dangerouslyClearAll() {
|
|
44
|
+
await this.ops.deleteMany("model_packs", {});
|
|
45
|
+
}
|
|
46
|
+
get #db() {
|
|
47
|
+
return this.ops;
|
|
48
|
+
}
|
|
49
|
+
/** Create or replace a pack by `(orgId, name)` — mirrors the settings.json upsert semantics. */
|
|
50
|
+
async upsert({ orgId, userId, input }) {
|
|
51
|
+
const now = /* @__PURE__ */ new Date();
|
|
52
|
+
const existing = await this.#db.findOne("model_packs", {
|
|
53
|
+
org_id: orgId,
|
|
54
|
+
name: input.name
|
|
55
|
+
});
|
|
56
|
+
if (existing) return toModelPack(await this.#db.updateAtomic("model_packs", {
|
|
57
|
+
org_id: orgId,
|
|
58
|
+
id: existing.id
|
|
59
|
+
}, () => ({
|
|
60
|
+
build_model_id: input.models.build,
|
|
61
|
+
plan_model_id: input.models.plan,
|
|
62
|
+
fast_model_id: input.models.fast,
|
|
63
|
+
updated_at: now
|
|
64
|
+
})) ?? existing);
|
|
65
|
+
return toModelPack(await this.#db.insertOne("model_packs", {
|
|
66
|
+
org_id: orgId,
|
|
67
|
+
created_by: userId,
|
|
68
|
+
name: input.name,
|
|
69
|
+
build_model_id: input.models.build,
|
|
70
|
+
plan_model_id: input.models.plan,
|
|
71
|
+
fast_model_id: input.models.fast,
|
|
72
|
+
created_at: now,
|
|
73
|
+
updated_at: now
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
async list({ orgId }) {
|
|
77
|
+
return (await this.#db.findMany("model_packs", { org_id: orgId }, { orderBy: [["name", "asc"]] })).map(toModelPack);
|
|
78
|
+
}
|
|
79
|
+
async get({ orgId, id }) {
|
|
80
|
+
const row = await this.#db.findOne("model_packs", {
|
|
81
|
+
org_id: orgId,
|
|
82
|
+
id
|
|
83
|
+
});
|
|
84
|
+
return row ? toModelPack(row) : null;
|
|
85
|
+
}
|
|
86
|
+
async delete({ orgId, id }) {
|
|
87
|
+
return await this.#db.deleteMany("model_packs", {
|
|
88
|
+
org_id: orgId,
|
|
89
|
+
id
|
|
90
|
+
}) > 0;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
//#endregion
|
|
94
|
+
export { MODEL_PACKS_SCHEMA, ModelPacksStorage };
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","names":["#db"],"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":";;AAmBA,MAAa,qBAAuC;CAClD,MAAM;CACN,SAAS;EACP,IAAI,EAAE,MAAM,UAAU;EACtB,QAAQ,EAAE,MAAM,OAAO;EACvB,YAAY,EAAE,MAAM,OAAO;EAC3B,MAAM,EAAE,MAAM,OAAO;EACrB,gBAAgB,EAAE,MAAM,OAAO;EAC/B,eAAe,EAAE,MAAM,OAAO;EAC9B,eAAe,EAAE,MAAM,OAAO;EAC9B,YAAY,EAAE,MAAM,YAAY;EAChC,YAAY,EAAE,MAAM,YAAY;CAClC;CACA,SAAS,CAAC;EAAE,MAAM;EAA4B,SAAS,CAAC,UAAU,MAAM;CAAE,CAAC;AAC7E;AAcA,SAAS,YAAY,KAAsC;CACzD,OAAO;EACL,IAAI,IAAI;EACR,OAAO,IAAI;EACX,WAAW,IAAI;EACf,MAAM,IAAI;EACV,QAAQ;GAAE,OAAO,IAAI;GAAgB,MAAM,IAAI;GAAe,MAAM,IAAI;EAAc;EACtF,WAAW,IAAI;EACf,WAAW,IAAI;CACjB;AACF;AAEA,IAAa,oBAAb,cAAuC,qBAAqB;CAC1D,cAAc;EACZ,MAAM,aAAa;CACrB;CAEA,MAAM,OAAsB;EAC1B,MAAM,KAAK,kBAAkB,CAAC,kBAAkB,CAAC;CACnD;CAEA,MAAM,sBAAqC;EACzC,MAAM,KAAK,IAAI,WAAW,eAAe,CAAC,CAAC;CAC7C;CAEA,IAAIA,MAAyB;EAC3B,OAAO,KAAK;CACd;;CAGA,MAAM,OAAO,EACX,OACA,QACA,SAK2B;EAC3B,MAAM,sBAAM,IAAI,KAAK;EACrB,MAAM,WAAW,MAAM,KAAKA,IAAI,QAAwB,eAAe;GAAE,QAAQ;GAAO,MAAM,MAAM;EAAK,CAAC;EAC1G,IAAI,UAWF,OAAO,YAAY,MAVD,KAAKA,IAAI,aACzB,eACA;GAAE,QAAQ;GAAO,IAAI,SAAS;EAAG,UAC1B;GACL,gBAAgB,MAAM,OAAO;GAC7B,eAAe,MAAM,OAAO;GAC5B,eAAe,MAAM,OAAO;GAC5B,YAAY;EACd,EACF,KAC0B,QAAQ;EAYpC,OAAO,YAAY,MAVD,KAAKA,IAAI,UAA0B,eAAe;GAClE,QAAQ;GACR,YAAY;GACZ,MAAM,MAAM;GACZ,gBAAgB,MAAM,OAAO;GAC7B,eAAe,MAAM,OAAO;GAC5B,eAAe,MAAM,OAAO;GAC5B,YAAY;GACZ,YAAY;EACd,CAAC,CACqB;CACxB;CAEA,MAAM,KAAK,EAAE,SAAwD;EAMnE,QAAO,MALY,KAAKA,IAAI,SAC1B,eACA,EAAE,QAAQ,MAAM,GAChB,EAAE,SAAS,CAAC,CAAC,QAAQ,KAAK,CAAC,EAAE,CAC/B,EAAA,CACY,IAAI,WAAW;CAC7B;CAEA,MAAM,IAAI,EAAE,OAAO,MAAsE;EACvF,MAAM,MAAM,MAAM,KAAKA,IAAI,QAAwB,eAAe;GAAE,QAAQ;GAAO;EAAG,CAAC;EACvF,OAAO,MAAM,YAAY,GAAG,IAAI;CAClC;CAEA,MAAM,OAAO,EAAE,OAAO,MAAuD;EAC3E,OAAQ,MAAM,KAAKA,IAAI,WAAW,eAAe;GAAE,QAAQ;GAAO;EAAG,CAAC,IAAK;CAC7E;AACF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
/** Whether new Slack sessions create Work-board items for this Factory. */
|
|
12
|
+
slackWorkItemsEnabled: boolean;
|
|
13
|
+
createdAt: Date;
|
|
14
|
+
updatedAt: Date;
|
|
15
|
+
}
|
|
16
|
+
export interface CreateFactoryProjectInput {
|
|
17
|
+
name: string;
|
|
18
|
+
description?: string | null;
|
|
19
|
+
defaultModelId?: string | null;
|
|
20
|
+
}
|
|
21
|
+
export interface UpdateFactoryProjectInput {
|
|
22
|
+
name?: string;
|
|
23
|
+
description?: string | null;
|
|
24
|
+
defaultModelId?: string | null;
|
|
25
|
+
slackWorkItemsEnabled?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare const FACTORY_PROJECTS_SCHEMA: CollectionSchema;
|
|
28
|
+
export declare class FactoryProjectsStorage extends FactoryStorageDomain {
|
|
29
|
+
#private;
|
|
30
|
+
constructor();
|
|
31
|
+
init(): Promise<void>;
|
|
32
|
+
dangerouslyClearAll(): Promise<void>;
|
|
33
|
+
create({ orgId, userId, input, }: {
|
|
34
|
+
orgId: string;
|
|
35
|
+
userId: string;
|
|
36
|
+
input: CreateFactoryProjectInput;
|
|
37
|
+
}): Promise<FactoryProject>;
|
|
38
|
+
list({ orgId }: {
|
|
39
|
+
orgId: string;
|
|
40
|
+
}): Promise<FactoryProject[]>;
|
|
41
|
+
get({ orgId, id }: {
|
|
42
|
+
orgId: string;
|
|
43
|
+
id: string;
|
|
44
|
+
}): Promise<FactoryProject | null>;
|
|
45
|
+
getById({ id }: {
|
|
46
|
+
id: string;
|
|
47
|
+
}): Promise<FactoryProject | null>;
|
|
48
|
+
update({ orgId, id, input, }: {
|
|
49
|
+
orgId: string;
|
|
50
|
+
id: string;
|
|
51
|
+
input: UpdateFactoryProjectInput;
|
|
52
|
+
}): Promise<FactoryProject | null>;
|
|
53
|
+
delete({ orgId, id }: {
|
|
54
|
+
orgId: string;
|
|
55
|
+
id: string;
|
|
56
|
+
}): Promise<FactoryProject | null>;
|
|
57
|
+
}
|
|
58
|
+
//# 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,2EAA2E;IAC3E,qBAAqB,EAAE,OAAO,CAAC;IAC/B,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;IAC/B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,eAAO,MAAM,uBAAuB,EAAE,gBAcrC,CAAC;AA4BF,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;IAerB,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;IAW5B,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,111 @@
|
|
|
1
|
+
import { FactoryStorageDomain } from "@mastra/core/storage";
|
|
2
|
+
//#region src/storage/domains/projects/base.ts
|
|
3
|
+
const 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: {
|
|
11
|
+
type: "text",
|
|
12
|
+
nullable: true
|
|
13
|
+
},
|
|
14
|
+
default_model_id: {
|
|
15
|
+
type: "text",
|
|
16
|
+
nullable: true
|
|
17
|
+
},
|
|
18
|
+
slack_work_items_enabled: {
|
|
19
|
+
type: "boolean",
|
|
20
|
+
default: false
|
|
21
|
+
},
|
|
22
|
+
created_at: { type: "timestamp" },
|
|
23
|
+
updated_at: { type: "timestamp" }
|
|
24
|
+
},
|
|
25
|
+
indexes: [{
|
|
26
|
+
name: "factory_projects_org_updated_at_idx",
|
|
27
|
+
columns: ["org_id", "updated_at"]
|
|
28
|
+
}]
|
|
29
|
+
};
|
|
30
|
+
function toFactoryProject(row) {
|
|
31
|
+
return {
|
|
32
|
+
id: row.id,
|
|
33
|
+
orgId: row.org_id,
|
|
34
|
+
createdBy: row.created_by,
|
|
35
|
+
name: row.name,
|
|
36
|
+
description: row.description,
|
|
37
|
+
defaultModelId: row.default_model_id,
|
|
38
|
+
slackWorkItemsEnabled: row.slack_work_items_enabled,
|
|
39
|
+
createdAt: row.created_at,
|
|
40
|
+
updatedAt: row.updated_at
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
var FactoryProjectsStorage = class extends FactoryStorageDomain {
|
|
44
|
+
constructor() {
|
|
45
|
+
super("projects");
|
|
46
|
+
}
|
|
47
|
+
async init() {
|
|
48
|
+
await this.ensureCollections([FACTORY_PROJECTS_SCHEMA]);
|
|
49
|
+
}
|
|
50
|
+
async dangerouslyClearAll() {
|
|
51
|
+
await this.ops.deleteMany("factory_projects", {});
|
|
52
|
+
}
|
|
53
|
+
get #db() {
|
|
54
|
+
return this.ops;
|
|
55
|
+
}
|
|
56
|
+
async create({ orgId, userId, input }) {
|
|
57
|
+
const now = /* @__PURE__ */ new Date();
|
|
58
|
+
return toFactoryProject(await this.#db.insertOne("factory_projects", {
|
|
59
|
+
org_id: orgId,
|
|
60
|
+
created_by: userId,
|
|
61
|
+
name: input.name,
|
|
62
|
+
description: input.description ?? null,
|
|
63
|
+
default_model_id: input.defaultModelId ?? null,
|
|
64
|
+
slack_work_items_enabled: false,
|
|
65
|
+
created_at: now,
|
|
66
|
+
updated_at: now
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
async list({ orgId }) {
|
|
70
|
+
return (await this.#db.findMany("factory_projects", { org_id: orgId }, { orderBy: [["updated_at", "desc"]] })).map(toFactoryProject);
|
|
71
|
+
}
|
|
72
|
+
async get({ orgId, id }) {
|
|
73
|
+
const row = await this.#db.findOne("factory_projects", {
|
|
74
|
+
org_id: orgId,
|
|
75
|
+
id
|
|
76
|
+
});
|
|
77
|
+
return row ? toFactoryProject(row) : null;
|
|
78
|
+
}
|
|
79
|
+
async getById({ id }) {
|
|
80
|
+
const row = await this.#db.findOne("factory_projects", { id });
|
|
81
|
+
return row ? toFactoryProject(row) : null;
|
|
82
|
+
}
|
|
83
|
+
async update({ orgId, id, input }) {
|
|
84
|
+
const row = await this.#db.updateAtomic("factory_projects", {
|
|
85
|
+
org_id: orgId,
|
|
86
|
+
id
|
|
87
|
+
}, () => ({
|
|
88
|
+
...input.name !== void 0 ? { name: input.name } : {},
|
|
89
|
+
...input.description !== void 0 ? { description: input.description } : {},
|
|
90
|
+
...input.defaultModelId !== void 0 ? { default_model_id: input.defaultModelId } : {},
|
|
91
|
+
...input.slackWorkItemsEnabled !== void 0 ? { slack_work_items_enabled: input.slackWorkItemsEnabled } : {},
|
|
92
|
+
updated_at: /* @__PURE__ */ new Date()
|
|
93
|
+
}));
|
|
94
|
+
return row ? toFactoryProject(row) : null;
|
|
95
|
+
}
|
|
96
|
+
async delete({ orgId, id }) {
|
|
97
|
+
const project = await this.get({
|
|
98
|
+
orgId,
|
|
99
|
+
id
|
|
100
|
+
});
|
|
101
|
+
if (!project) return null;
|
|
102
|
+
return await this.#db.deleteMany("factory_projects", {
|
|
103
|
+
org_id: orgId,
|
|
104
|
+
id
|
|
105
|
+
}) > 0 ? project : null;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
//#endregion
|
|
109
|
+
export { FACTORY_PROJECTS_SCHEMA, FactoryProjectsStorage };
|
|
110
|
+
|
|
111
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","names":["#db"],"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 /** Whether new Slack sessions create Work-board items for this Factory. */\n slackWorkItemsEnabled: boolean;\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 slackWorkItemsEnabled?: boolean;\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 slack_work_items_enabled: { type: 'boolean', default: false },\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 slack_work_items_enabled: boolean;\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 slackWorkItemsEnabled: row.slack_work_items_enabled,\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 slack_work_items_enabled: false,\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 ...(input.slackWorkItemsEnabled !== undefined ? { slack_work_items_enabled: input.slackWorkItemsEnabled } : {}),\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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"}
|
|
@@ -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"}
|