@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,23 @@
|
|
|
1
|
+
import type { ApiRoute } from '@mastra/core/server';
|
|
2
|
+
import type { Intake } from '../capabilities/intake.js';
|
|
3
|
+
import type { AuditEmitter } from '../storage/domains/audit/domain.js';
|
|
4
|
+
import type { IntakeConfig, IntakeStorage } from '../storage/domains/intake/base.js';
|
|
5
|
+
import type { RouteDependencies } from './route.js';
|
|
6
|
+
import { Route } from './route.js';
|
|
7
|
+
export interface IntakeIntegration {
|
|
8
|
+
id: string;
|
|
9
|
+
intake: Pick<Intake, 'listSources' | 'listItems'>;
|
|
10
|
+
}
|
|
11
|
+
export interface IntakeRoutesDeps extends RouteDependencies {
|
|
12
|
+
audit: AuditEmitter;
|
|
13
|
+
/** Intake selection domain handle. */
|
|
14
|
+
intake: IntakeStorage;
|
|
15
|
+
integrations?: IntakeIntegration[];
|
|
16
|
+
}
|
|
17
|
+
/** Validate a request body into an intake config, rejecting unknown shapes. */
|
|
18
|
+
export declare function parseIntakeConfig(body: unknown): IntakeConfig | null;
|
|
19
|
+
export declare class IntakeRoutes extends Route<IntakeRoutesDeps> {
|
|
20
|
+
#private;
|
|
21
|
+
routes(): ApiRoute[];
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=intake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intake.d.ts","sourceRoot":"","sources":["../../src/routes/intake.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAIpD,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACrF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAAC,CAAC;CACnD;AAYD,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,KAAK,EAAE,YAAY,CAAC;IACpB,sCAAsC;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACpC;AAaD,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAuBpE;AAmBD,qBAAa,YAAa,SAAQ,KAAK,CAAC,gBAAgB,CAAC;;IAgBvD,MAAM,IAAI,QAAQ,EAAE;CA6GrB"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// src/routes/intake.ts
|
|
2
|
+
import { registerApiRoute } from "@mastra/core/server";
|
|
3
|
+
|
|
4
|
+
// src/routes/route.ts
|
|
5
|
+
var Route = class {
|
|
6
|
+
deps;
|
|
7
|
+
constructor(deps) {
|
|
8
|
+
this.deps = deps;
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
// src/routes/intake.ts
|
|
13
|
+
function loose(c) {
|
|
14
|
+
return c;
|
|
15
|
+
}
|
|
16
|
+
function sanitizeIdList(value) {
|
|
17
|
+
if (value === null) return null;
|
|
18
|
+
if (!Array.isArray(value) || value.length > 200) return void 0;
|
|
19
|
+
const ids = value.filter((item) => typeof item === "string" && item.length > 0 && item.length <= 256);
|
|
20
|
+
return ids.length === value.length && new Set(ids).size === ids.length ? ids : void 0;
|
|
21
|
+
}
|
|
22
|
+
function parseIntakeConfig(body) {
|
|
23
|
+
if (typeof body !== "object" || body === null || Array.isArray(body)) return null;
|
|
24
|
+
const entries = Object.entries(body);
|
|
25
|
+
if (entries.length > 50) return null;
|
|
26
|
+
const config = {};
|
|
27
|
+
for (const [integrationId, value] of entries) {
|
|
28
|
+
if (!integrationId || integrationId.length > 128 || typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const selection = value;
|
|
32
|
+
if (typeof selection.enabled !== "boolean") return null;
|
|
33
|
+
const sourceIds = sanitizeIdList(selection.sourceIds ?? null);
|
|
34
|
+
if (sourceIds === void 0) return null;
|
|
35
|
+
config[integrationId] = { enabled: selection.enabled, sourceIds };
|
|
36
|
+
}
|
|
37
|
+
return config;
|
|
38
|
+
}
|
|
39
|
+
function encodeCursor(cursors) {
|
|
40
|
+
return Object.keys(cursors).length > 0 ? Buffer.from(JSON.stringify(cursors)).toString("base64url") : null;
|
|
41
|
+
}
|
|
42
|
+
function decodeCursor(value) {
|
|
43
|
+
if (!value) return {};
|
|
44
|
+
try {
|
|
45
|
+
const parsed = JSON.parse(Buffer.from(value, "base64url").toString("utf8"));
|
|
46
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return null;
|
|
47
|
+
const entries = Object.entries(parsed);
|
|
48
|
+
if (entries.some(([key, cursor]) => !key || typeof cursor !== "string")) return null;
|
|
49
|
+
return Object.fromEntries(entries);
|
|
50
|
+
} catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
var IntakeRoutes = class extends Route {
|
|
55
|
+
async #resolveTenant(c) {
|
|
56
|
+
await this.deps.auth.ensureUser(c);
|
|
57
|
+
const tenant = this.deps.auth.tenant(c);
|
|
58
|
+
if (!tenant) return { response: c.json({ error: "unauthorized" }, 401) };
|
|
59
|
+
if (!tenant.orgId) {
|
|
60
|
+
return {
|
|
61
|
+
response: c.json(
|
|
62
|
+
{ error: "organization_required", message: "Intake configuration requires an organization." },
|
|
63
|
+
403
|
|
64
|
+
)
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return { orgId: tenant.orgId, userId: tenant.userId };
|
|
68
|
+
}
|
|
69
|
+
routes() {
|
|
70
|
+
const { audit, intake, integrations = [] } = this.deps;
|
|
71
|
+
const integrationIds = integrations.map((integration) => integration.id);
|
|
72
|
+
return [
|
|
73
|
+
registerApiRoute("/web/intake/config", {
|
|
74
|
+
method: "GET",
|
|
75
|
+
requiresAuth: false,
|
|
76
|
+
handler: async (c) => {
|
|
77
|
+
const tenant = await this.#resolveTenant(loose(c));
|
|
78
|
+
if ("response" in tenant) return tenant.response;
|
|
79
|
+
await intake.ensureReady();
|
|
80
|
+
const config = await intake.getConfig({ ...tenant, integrationIds });
|
|
81
|
+
return c.json({ config });
|
|
82
|
+
}
|
|
83
|
+
}),
|
|
84
|
+
registerApiRoute("/web/intake/config", {
|
|
85
|
+
method: "PUT",
|
|
86
|
+
requiresAuth: false,
|
|
87
|
+
handler: async (c) => {
|
|
88
|
+
const tenant = await this.#resolveTenant(loose(c));
|
|
89
|
+
if ("response" in tenant) return tenant.response;
|
|
90
|
+
let body;
|
|
91
|
+
try {
|
|
92
|
+
body = await c.req.json();
|
|
93
|
+
} catch {
|
|
94
|
+
return c.json({ error: "Invalid JSON body" }, 400);
|
|
95
|
+
}
|
|
96
|
+
const config = parseIntakeConfig(body);
|
|
97
|
+
if (!config || Object.keys(config).some((integrationId) => !integrationIds.includes(integrationId))) {
|
|
98
|
+
return c.json({ error: "invalid_config" }, 400);
|
|
99
|
+
}
|
|
100
|
+
await intake.ensureReady();
|
|
101
|
+
await intake.saveConfig({ ...tenant, config });
|
|
102
|
+
await audit.emit({
|
|
103
|
+
context: loose(c),
|
|
104
|
+
input: {
|
|
105
|
+
action: "factory.intake.config_updated",
|
|
106
|
+
targets: [{ type: "intake_config", id: tenant.orgId }],
|
|
107
|
+
metadata: Object.fromEntries(
|
|
108
|
+
Object.entries(config).map(([integrationId, selection]) => [
|
|
109
|
+
integrationId,
|
|
110
|
+
{ enabled: selection.enabled, sources: selection.sourceIds?.length ?? null }
|
|
111
|
+
])
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
return c.json({ config });
|
|
116
|
+
}
|
|
117
|
+
}),
|
|
118
|
+
registerApiRoute("/web/intake/sources", {
|
|
119
|
+
method: "GET",
|
|
120
|
+
requiresAuth: false,
|
|
121
|
+
handler: async (c) => {
|
|
122
|
+
const tenant = await this.#resolveTenant(loose(c));
|
|
123
|
+
if ("response" in tenant) return tenant.response;
|
|
124
|
+
const pages = await Promise.all(
|
|
125
|
+
integrations.map(async (integration) => ({
|
|
126
|
+
integrationId: integration.id,
|
|
127
|
+
sources: await integration.intake.listSources(tenant)
|
|
128
|
+
}))
|
|
129
|
+
);
|
|
130
|
+
return c.json({
|
|
131
|
+
sources: pages.flatMap(
|
|
132
|
+
(page) => page.sources.map((source) => ({ integrationId: page.integrationId, ...source }))
|
|
133
|
+
)
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}),
|
|
137
|
+
registerApiRoute("/web/intake/items", {
|
|
138
|
+
method: "GET",
|
|
139
|
+
requiresAuth: false,
|
|
140
|
+
handler: async (c) => {
|
|
141
|
+
const tenant = await this.#resolveTenant(loose(c));
|
|
142
|
+
if ("response" in tenant) return tenant.response;
|
|
143
|
+
const cursors = decodeCursor(c.req.query("cursor"));
|
|
144
|
+
if (!cursors) return c.json({ error: "invalid_cursor" }, 400);
|
|
145
|
+
await intake.ensureReady();
|
|
146
|
+
const config = await intake.getConfig({ ...tenant, integrationIds });
|
|
147
|
+
const items = [];
|
|
148
|
+
const nextCursors = {};
|
|
149
|
+
for (const integration of integrations) {
|
|
150
|
+
const selection = config[integration.id];
|
|
151
|
+
if (!selection?.enabled || !selection.sourceIds?.length) continue;
|
|
152
|
+
const page = await integration.intake.listItems({
|
|
153
|
+
...tenant,
|
|
154
|
+
sourceIds: selection.sourceIds,
|
|
155
|
+
...cursors[integration.id] ? { cursor: cursors[integration.id] } : {}
|
|
156
|
+
});
|
|
157
|
+
items.push(
|
|
158
|
+
...page.items.map((item) => {
|
|
159
|
+
const { source, ...candidate } = item;
|
|
160
|
+
return {
|
|
161
|
+
...candidate,
|
|
162
|
+
integrationId: integration.id,
|
|
163
|
+
externalSource: { integrationId: integration.id, ...source }
|
|
164
|
+
};
|
|
165
|
+
})
|
|
166
|
+
);
|
|
167
|
+
if (page.nextCursor) nextCursors[integration.id] = page.nextCursor;
|
|
168
|
+
}
|
|
169
|
+
return c.json({ items, nextCursor: encodeCursor(nextCursors) });
|
|
170
|
+
}
|
|
171
|
+
})
|
|
172
|
+
];
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
export {
|
|
176
|
+
IntakeRoutes,
|
|
177
|
+
parseIntakeConfig
|
|
178
|
+
};
|
|
179
|
+
//# sourceMappingURL=intake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/routes/intake.ts","../../src/routes/route.ts"],"sourcesContent":["import type { ApiRoute } from '@mastra/core/server';\nimport { registerApiRoute } from '@mastra/core/server';\nimport type { Context } from 'hono';\n\nimport type { Intake, IntakeItem } from '../capabilities/intake.js';\nimport type { AuditEmitter } from '../storage/domains/audit/domain.js';\nimport type { IntakeConfig, IntakeStorage } from '../storage/domains/intake/base.js';\nimport type { RouteDependencies } from './route.js';\nimport { Route } from './route.js';\n\nexport interface IntakeIntegration {\n id: string;\n intake: Pick<Intake, 'listSources' | 'listItems'>;\n}\n\ninterface AggregatedIntakeItem extends Omit<IntakeItem, 'source'> {\n integrationId: string;\n externalSource: {\n integrationId: string;\n type: string;\n externalId: string;\n url?: string;\n };\n}\n\nexport interface IntakeRoutesDeps extends RouteDependencies {\n audit: AuditEmitter;\n /** Intake selection domain handle. */\n intake: IntakeStorage;\n integrations?: IntakeIntegration[];\n}\n\nfunction loose(c: unknown): Context {\n return c as Context;\n}\n\nfunction sanitizeIdList(value: unknown): string[] | null | undefined {\n if (value === null) return null;\n if (!Array.isArray(value) || value.length > 200) return undefined;\n const ids = value.filter((item): item is string => typeof item === 'string' && item.length > 0 && item.length <= 256);\n return ids.length === value.length && new Set(ids).size === ids.length ? ids : undefined;\n}\n\n/** Validate a request body into an intake config, rejecting unknown shapes. */\nexport function parseIntakeConfig(body: unknown): IntakeConfig | null {\n if (typeof body !== 'object' || body === null || Array.isArray(body)) return null;\n const entries = Object.entries(body);\n if (entries.length > 50) return null;\n\n const config: IntakeConfig = {};\n for (const [integrationId, value] of entries) {\n if (\n !integrationId ||\n integrationId.length > 128 ||\n typeof value !== 'object' ||\n value === null ||\n Array.isArray(value)\n ) {\n return null;\n }\n const selection = value as { enabled?: unknown; sourceIds?: unknown };\n if (typeof selection.enabled !== 'boolean') return null;\n const sourceIds = sanitizeIdList(selection.sourceIds ?? null);\n if (sourceIds === undefined) return null;\n config[integrationId] = { enabled: selection.enabled, sourceIds };\n }\n return config;\n}\n\nfunction encodeCursor(cursors: Record<string, string>): string | null {\n return Object.keys(cursors).length > 0 ? Buffer.from(JSON.stringify(cursors)).toString('base64url') : null;\n}\n\nfunction decodeCursor(value: string | undefined): Record<string, string> | null {\n if (!value) return {};\n try {\n const parsed = JSON.parse(Buffer.from(value, 'base64url').toString('utf8')) as unknown;\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) return null;\n const entries = Object.entries(parsed);\n if (entries.some(([key, cursor]) => !key || typeof cursor !== 'string')) return null;\n return Object.fromEntries(entries) as Record<string, string>;\n } catch {\n return null;\n }\n}\n\nexport class IntakeRoutes extends Route<IntakeRoutesDeps> {\n async #resolveTenant(c: Context): Promise<{ orgId: string; userId: string } | { response: Response }> {\n await this.deps.auth.ensureUser(c);\n const tenant = this.deps.auth.tenant(c);\n if (!tenant) return { response: c.json({ error: 'unauthorized' }, 401) };\n if (!tenant.orgId) {\n return {\n response: c.json(\n { error: 'organization_required', message: 'Intake configuration requires an organization.' },\n 403,\n ),\n };\n }\n return { orgId: tenant.orgId, userId: tenant.userId };\n }\n\n routes(): ApiRoute[] {\n const { audit, intake, integrations = [] } = this.deps;\n const integrationIds = integrations.map(integration => integration.id);\n\n return [\n registerApiRoute('/web/intake/config', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => {\n const tenant = await this.#resolveTenant(loose(c));\n if ('response' in tenant) return tenant.response;\n await intake.ensureReady();\n const config = await intake.getConfig({ ...tenant, integrationIds });\n return c.json({ config });\n },\n }),\n registerApiRoute('/web/intake/config', {\n method: 'PUT',\n requiresAuth: false,\n handler: async c => {\n const tenant = await this.#resolveTenant(loose(c));\n if ('response' in tenant) return tenant.response;\n\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n const config = parseIntakeConfig(body);\n if (!config || Object.keys(config).some(integrationId => !integrationIds.includes(integrationId))) {\n return c.json({ error: 'invalid_config' }, 400);\n }\n\n await intake.ensureReady();\n await intake.saveConfig({ ...tenant, config });\n await audit.emit({\n context: loose(c),\n input: {\n action: 'factory.intake.config_updated',\n targets: [{ type: 'intake_config', id: tenant.orgId }],\n metadata: Object.fromEntries(\n Object.entries(config).map(([integrationId, selection]) => [\n integrationId,\n { enabled: selection.enabled, sources: selection.sourceIds?.length ?? null },\n ]),\n ),\n },\n });\n return c.json({ config });\n },\n }),\n registerApiRoute('/web/intake/sources', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => {\n const tenant = await this.#resolveTenant(loose(c));\n if ('response' in tenant) return tenant.response;\n const pages = await Promise.all(\n integrations.map(async integration => ({\n integrationId: integration.id,\n sources: await integration.intake.listSources(tenant),\n })),\n );\n return c.json({\n sources: pages.flatMap(page =>\n page.sources.map(source => ({ integrationId: page.integrationId, ...source })),\n ),\n });\n },\n }),\n registerApiRoute('/web/intake/items', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => {\n const tenant = await this.#resolveTenant(loose(c));\n if ('response' in tenant) return tenant.response;\n const cursors = decodeCursor(c.req.query('cursor'));\n if (!cursors) return c.json({ error: 'invalid_cursor' }, 400);\n\n await intake.ensureReady();\n const config = await intake.getConfig({ ...tenant, integrationIds });\n const items: AggregatedIntakeItem[] = [];\n const nextCursors: Record<string, string> = {};\n for (const integration of integrations) {\n const selection = config[integration.id];\n if (!selection?.enabled || !selection.sourceIds?.length) continue;\n const page = await integration.intake.listItems({\n ...tenant,\n sourceIds: selection.sourceIds,\n ...(cursors[integration.id] ? { cursor: cursors[integration.id] } : {}),\n });\n items.push(\n ...page.items.map(item => {\n const { source, ...candidate } = item;\n return {\n ...candidate,\n integrationId: integration.id,\n externalSource: { integrationId: integration.id, ...source },\n };\n }),\n );\n if (page.nextCursor) nextCursors[integration.id] = page.nextCursor;\n }\n return c.json({ items, nextCursor: encodeCursor(nextCursors) });\n },\n }),\n ];\n }\n}\n","/**\n * Base class for factory route modules.\n *\n * Route modules build Mastra `apiRoutes` from injected dependencies instead of\n * reaching into host globals. The host server (e.g. `mastracode/web`) supplies\n * the auth seam and storage domain handles at construction time, so the routes\n * stay portable and testable with fakes.\n */\n\nimport type { ApiRoute } from '@mastra/core/server';\nimport type { Context } from 'hono';\n\n/**\n * The auth surface factory routes need, implemented by the host server.\n *\n * Local (no-auth) deployments implement this with a stub where `enabled()`\n * returns `false` and `tenant()` returns `undefined` — routes then take their\n * single-user local paths.\n */\nexport interface RouteAuth {\n /** Whether an auth provider is active (tenant mode). */\n enabled(): boolean;\n /**\n * Resolve (and cache) the signed-in user for the request, if any. Must be\n * called before `tenant()` so the request context is populated.\n */\n ensureUser(c: Context): Promise<unknown>;\n /** Tenant identity for the request, when signed in. */\n tenant(c: Context): { orgId?: string; userId: string } | undefined;\n /** Fail-closed check that the caller administers the given organization. */\n isOrganizationAdmin(c: Context, organizationId: string): Promise<boolean>;\n}\n\n/** Dependencies shared by every factory route module. */\nexport interface RouteDependencies {\n auth: RouteAuth;\n}\n\n/**\n * A route module: constructed once at boot with its dependencies, then asked\n * for the `ApiRoute[]` it serves.\n */\nexport abstract class Route<TDeps extends RouteDependencies = RouteDependencies> {\n protected readonly deps: TDeps;\n\n constructor(deps: TDeps) {\n this.deps = deps;\n }\n\n /** Build the Mastra `apiRoutes` served by this module. */\n abstract routes(): ApiRoute[];\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web OAuth sign-in routes for model providers (Settings › Providers).
|
|
3
|
+
*
|
|
4
|
+
* Wraps the SDK's step-based OAuth primitives (start/complete for Anthropic's
|
|
5
|
+
* paste-code PKCE flow, start/poll for the Codex/Copilot/xAI device flows) in
|
|
6
|
+
* HTTP routes. Flow state lives in login sessions — the `model-credentials`
|
|
7
|
+
* domain's `oauth_login_sessions` table in tenant mode (any replica can
|
|
8
|
+
* complete/poll), an in-memory store in local mode — so a flow can span
|
|
9
|
+
* requests. Completed credentials are always **user-scoped** (plan tokens are
|
|
10
|
+
* personal subscriptions) in tenant mode, or written to the file-backed
|
|
11
|
+
* `AuthStorage` in local mode.
|
|
12
|
+
*
|
|
13
|
+
* Tokens never leave the server; responses only carry flow metadata (URLs,
|
|
14
|
+
* user codes, poll delays).
|
|
15
|
+
*/
|
|
16
|
+
import type { AuthStorage } from '@mastra/code-sdk/auth/storage';
|
|
17
|
+
import type { ApiRoute } from '@mastra/core/server';
|
|
18
|
+
import { ModelCredentialsStorage } from '../storage/domains/credentials/base.js';
|
|
19
|
+
import { Route } from './route.js';
|
|
20
|
+
import type { RouteDependencies } from './route.js';
|
|
21
|
+
export interface OAuthRoutesDeps extends RouteDependencies {
|
|
22
|
+
/** File-backed credential store; used in local (no-auth) mode. */
|
|
23
|
+
authStorage?: AuthStorage;
|
|
24
|
+
/** Tenant credential domain handle; absent in local (no-DB) mode. */
|
|
25
|
+
modelCredentials?: ModelCredentialsStorage;
|
|
26
|
+
/** Notifies the host after tenant credentials change so caches can be dropped. */
|
|
27
|
+
onCredentialsChanged?: (tenant: {
|
|
28
|
+
orgId: string;
|
|
29
|
+
userId?: string;
|
|
30
|
+
}) => void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Provider OAuth sign-in routes as Mastra `apiRoutes`:
|
|
34
|
+
* - `POST /web/config/providers/:provider/oauth/start` — begin a sign-in flow
|
|
35
|
+
* - `POST /web/config/providers/:provider/oauth/complete` — paste-code exchange
|
|
36
|
+
* - `POST /web/config/providers/:provider/oauth/poll` — one device-code poll
|
|
37
|
+
* - `DELETE /web/config/providers/:provider/oauth/session/:sessionId` — cancel a flow
|
|
38
|
+
* - `DELETE /web/config/providers/:provider/oauth` — sign out (caller only)
|
|
39
|
+
*/
|
|
40
|
+
export declare class OAuthRoutes extends Route<OAuthRoutesDeps> {
|
|
41
|
+
routes(): ApiRoute[];
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/routes/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgBH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAIpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAIjF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAuMpD,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,kEAAkE;IAClE,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC7E;AAED;;;;;;;GAOG;AACH,qBAAa,WAAY,SAAQ,KAAK,CAAC,eAAe,CAAC;IACrD,MAAM,IAAI,QAAQ,EAAE;CAuNrB"}
|