@mastra/factory 0.24.0-alpha.1 → 0.24.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/README.md +103 -4
- package/dist/auth.d.ts +14 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +45 -9
- package/dist/auth.js.map +1 -1
- package/dist/boards/work-transition-policy.d.ts.map +1 -1
- package/dist/boards/work-transition-policy.js +10 -0
- package/dist/boards/work-transition-policy.js.map +1 -1
- package/dist/boards/work.d.ts +14 -0
- package/dist/boards/work.d.ts.map +1 -1
- package/dist/boards/work.js +70 -7
- package/dist/boards/work.js.map +1 -1
- package/dist/capabilities/version-control.d.ts +26 -0
- package/dist/capabilities/version-control.d.ts.map +1 -1
- package/dist/factory.d.ts +8 -0
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +191 -16
- package/dist/factory.js.map +1 -1
- package/dist/integrations/github/integration.d.ts.map +1 -1
- package/dist/integrations/github/integration.js +37 -1
- package/dist/integrations/github/integration.js.map +1 -1
- package/dist/integrations/gitlab/api.d.ts +15 -0
- package/dist/integrations/gitlab/api.d.ts.map +1 -1
- package/dist/integrations/gitlab/api.js +9 -0
- package/dist/integrations/gitlab/api.js.map +1 -1
- package/dist/integrations/gitlab/version-control.d.ts.map +1 -1
- package/dist/integrations/gitlab/version-control.js +37 -3
- package/dist/integrations/gitlab/version-control.js.map +1 -1
- package/dist/integrations/platform/github/integration.d.ts.map +1 -1
- package/dist/integrations/platform/github/integration.js +27 -1
- package/dist/integrations/platform/github/integration.js.map +1 -1
- package/dist/integrations/subscription-session.d.ts +15 -0
- package/dist/integrations/subscription-session.d.ts.map +1 -1
- package/dist/integrations/subscription-session.js +30 -13
- package/dist/integrations/subscription-session.js.map +1 -1
- package/dist/mcp/disconnect.d.ts +10 -0
- package/dist/mcp/disconnect.d.ts.map +1 -0
- package/dist/mcp/disconnect.js +44 -0
- package/dist/mcp/disconnect.js.map +1 -0
- package/dist/mcp/routes.d.ts +46 -0
- package/dist/mcp/routes.d.ts.map +1 -0
- package/dist/mcp/routes.js +243 -0
- package/dist/mcp/routes.js.map +1 -0
- package/dist/provider-display-name.d.ts +2 -0
- package/dist/provider-display-name.d.ts.map +1 -0
- package/dist/provider-display-name.js +16 -0
- package/dist/provider-display-name.js.map +1 -0
- package/dist/routes/config.js +2 -2
- package/dist/routes/config.js.map +1 -1
- package/dist/routes/contracts.d.ts +4 -0
- package/dist/routes/contracts.d.ts.map +1 -1
- package/dist/routes/contracts.js +3 -1
- package/dist/routes/contracts.js.map +1 -1
- package/dist/routes/oauth.js +1 -1
- package/dist/routes/oauth.js.map +1 -1
- package/dist/routes/provider-credentials.d.ts +6 -2
- package/dist/routes/provider-credentials.d.ts.map +1 -1
- package/dist/routes/provider-credentials.js +20 -7
- package/dist/routes/provider-credentials.js.map +1 -1
- package/dist/routes/source-control-sessions.d.ts +1 -0
- package/dist/routes/source-control-sessions.d.ts.map +1 -1
- package/dist/routes/source-control-sessions.js +1 -1
- package/dist/routes/source-control-sessions.js.map +1 -1
- package/dist/routes/surface.d.ts +1 -0
- package/dist/routes/surface.d.ts.map +1 -1
- package/dist/routes/surface.js +4 -3
- package/dist/routes/surface.js.map +1 -1
- package/dist/routes/work-items.d.ts.map +1 -1
- package/dist/routes/work-items.js +61 -121
- package/dist/routes/work-items.js.map +1 -1
- package/dist/rules/dispatcher.d.ts +7 -0
- package/dist/rules/dispatcher.d.ts.map +1 -1
- package/dist/rules/dispatcher.js +62 -5
- package/dist/rules/dispatcher.js.map +1 -1
- package/dist/rules/processor.d.ts.map +1 -1
- package/dist/rules/processor.js +2 -1
- package/dist/rules/processor.js.map +1 -1
- package/dist/rules/tools.d.ts.map +1 -1
- package/dist/rules/tools.js +82 -3
- package/dist/rules/tools.js.map +1 -1
- package/dist/rules/transition-service.d.ts +17 -0
- package/dist/rules/transition-service.d.ts.map +1 -1
- package/dist/rules/transition-service.js +25 -0
- package/dist/rules/transition-service.js.map +1 -1
- package/dist/rules/types.d.ts +2 -4
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/rules/types.js +1 -4
- package/dist/rules/types.js.map +1 -1
- package/dist/sandbox/local-factory-sandbox.d.ts.map +1 -1
- package/dist/sandbox/local-factory-sandbox.js +1 -0
- package/dist/sandbox/local-factory-sandbox.js.map +1 -1
- package/dist/session/factory-session.d.ts +15 -1
- package/dist/session/factory-session.d.ts.map +1 -1
- package/dist/session/factory-session.js +4 -2
- package/dist/session/factory-session.js.map +1 -1
- package/dist/session/reply-credential-processor.d.ts +15 -0
- package/dist/session/reply-credential-processor.d.ts.map +1 -0
- package/dist/session/reply-credential-processor.js +40 -0
- package/dist/session/reply-credential-processor.js.map +1 -0
- package/dist/session/source-control-tools.d.ts +19 -1
- package/dist/session/source-control-tools.d.ts.map +1 -1
- package/dist/session/source-control-tools.js +70 -3
- package/dist/session/source-control-tools.js.map +1 -1
- package/dist/storage/domains/audit/domain.js +1 -1
- package/dist/storage/domains/projects/base.d.ts +6 -0
- package/dist/storage/domains/projects/base.d.ts.map +1 -1
- package/dist/storage/domains/projects/base.js +12 -0
- package/dist/storage/domains/projects/base.js.map +1 -1
- package/dist/storage/domains/source-control/base.d.ts +17 -0
- package/dist/storage/domains/source-control/base.d.ts.map +1 -1
- package/dist/storage/domains/source-control/base.js +23 -0
- package/dist/storage/domains/source-control/base.js.map +1 -1
- package/dist/storage/domains/source-control/inmemory.d.ts +4 -0
- package/dist/storage/domains/source-control/inmemory.d.ts.map +1 -1
- package/dist/storage/domains/source-control/inmemory.js +5 -1
- package/dist/storage/domains/source-control/inmemory.js.map +1 -1
- package/dist/storage/domains/work-items/base.d.ts +56 -0
- package/dist/storage/domains/work-items/base.d.ts.map +1 -1
- package/dist/storage/domains/work-items/base.js +139 -25
- package/dist/storage/domains/work-items/base.js.map +1 -1
- package/dist/tools/annotations.d.ts +7 -0
- package/dist/tools/annotations.d.ts.map +1 -0
- package/dist/tools/annotations.js +102 -0
- package/dist/tools/annotations.js.map +1 -0
- package/dist/tools/approval-tools.d.ts +15 -0
- package/dist/tools/approval-tools.d.ts.map +1 -0
- package/dist/tools/approval-tools.js +77 -0
- package/dist/tools/approval-tools.js.map +1 -0
- package/dist/tools/deliver.d.ts +54 -0
- package/dist/tools/deliver.d.ts.map +1 -0
- package/dist/tools/deliver.js +105 -0
- package/dist/tools/deliver.js.map +1 -0
- package/dist/tools/index.d.ts +29 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +39 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/messaging-tools.d.ts +28 -0
- package/dist/tools/messaging-tools.d.ts.map +1 -0
- package/dist/tools/messaging-tools.js +312 -0
- package/dist/tools/messaging-tools.js.map +1 -0
- package/dist/tools/permissions.d.ts +31 -0
- package/dist/tools/permissions.d.ts.map +1 -0
- package/dist/tools/permissions.js +44 -0
- package/dist/tools/permissions.js.map +1 -0
- package/dist/tools/read-tools.d.ts +27 -0
- package/dist/tools/read-tools.d.ts.map +1 -0
- package/dist/tools/read-tools.js +285 -0
- package/dist/tools/read-tools.js.map +1 -0
- package/dist/tools/reports.d.ts +163 -0
- package/dist/tools/reports.d.ts.map +1 -0
- package/dist/tools/reports.js +352 -0
- package/dist/tools/reports.js.map +1 -0
- package/dist/tools/run-watch.d.ts +46 -0
- package/dist/tools/run-watch.d.ts.map +1 -0
- package/dist/tools/run-watch.js +102 -0
- package/dist/tools/run-watch.js.map +1 -0
- package/dist/tools/scope.d.ts +45 -0
- package/dist/tools/scope.d.ts.map +1 -0
- package/dist/tools/scope.js +73 -0
- package/dist/tools/scope.js.map +1 -0
- package/dist/tools/session-tools.d.ts +31 -0
- package/dist/tools/session-tools.d.ts.map +1 -0
- package/dist/tools/session-tools.js +312 -0
- package/dist/tools/session-tools.js.map +1 -0
- package/dist/tools/sessions-state-processor.d.ts +37 -0
- package/dist/tools/sessions-state-processor.d.ts.map +1 -0
- package/dist/tools/sessions-state-processor.js +206 -0
- package/dist/tools/sessions-state-processor.js.map +1 -0
- package/dist/tools/work-item-tools.d.ts +28 -0
- package/dist/tools/work-item-tools.d.ts.map +1 -0
- package/dist/tools/work-item-tools.js +322 -0
- package/dist/tools/work-item-tools.js.map +1 -0
- package/dist/work-items/create-work-item.d.ts +55 -0
- package/dist/work-items/create-work-item.d.ts.map +1 -0
- package/dist/work-items/create-work-item.js +101 -0
- package/dist/work-items/create-work-item.js.map +1 -0
- package/dist/work-items/decision-actions.d.ts +42 -0
- package/dist/work-items/decision-actions.d.ts.map +1 -0
- package/dist/work-items/decision-actions.js +70 -0
- package/dist/work-items/decision-actions.js.map +1 -0
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +3 -1
- package/dist/workspace.js.map +1 -1
- package/factory-skills/factory-gitlab-rereview/SKILL.md +1 -1
- package/factory-skills/factory-gitlab-review/SKILL.md +1 -1
- package/factory-skills/factory-plan/SKILL.md +4 -4
- package/factory-skills/factory-rereview/SKILL.md +3 -1
- package/factory-skills/factory-review/SKILL.md +3 -1
- package/factory-skills/factory-self-review/SKILL.md +46 -0
- package/package.json +13 -11
package/dist/rules/dispatcher.js
CHANGED
|
@@ -6,10 +6,10 @@ import "../boards/index.js";
|
|
|
6
6
|
import { FactoryDispatchError, factoryDispatchFailureCode, factoryDispatchFailureMetadata } from "./dispatch-errors.js";
|
|
7
7
|
import { FACTORY_RULE_MATERIALIZATION_KEY, WorkItemClaimConflictError } from "../storage/domains/work-items/base.js";
|
|
8
8
|
import { moveCardToBoard } from "../boards/relocate.js";
|
|
9
|
-
import { isHumanActorId } from "../storage/domains/audit/actors.js";
|
|
10
|
-
import { resolvePromptInvocation, resolveSkillInvocation, resolveSkillResumeInvocation } from "../skills/service.js";
|
|
11
9
|
import { decisionOvertaken } from "./decision-applicability.js";
|
|
12
10
|
import { FACTORY_OPEN_RUN_STALE_MS, heartbeatSessionOpenRun, isOpenRunLiveElsewhere, listSessionOpenRuns, recordSessionRunStart, waitForSessionRunAudit } from "../session/run-audit.js";
|
|
11
|
+
import { isHumanActorId } from "../storage/domains/audit/actors.js";
|
|
12
|
+
import { resolvePromptInvocation, resolveSkillInvocation, resolveSkillResumeInvocation } from "../skills/service.js";
|
|
13
13
|
import { withWorkItemFeed } from "../storage/domains/comments/feed-context.js";
|
|
14
14
|
import { RequestContext } from "@mastra/core/request-context";
|
|
15
15
|
//#region src/rules/dispatcher.ts
|
|
@@ -36,6 +36,8 @@ const STALE_BINDING_TTL_MS = 1440 * 6e4;
|
|
|
36
36
|
const RECONCILE_INTERVAL_MS = 3e4;
|
|
37
37
|
/** The card moved on before this run could act; it settles as superseded, not succeeded. */
|
|
38
38
|
var FactoryDecisionSuperseded = class extends Error {};
|
|
39
|
+
/** A run that ran and ended in error; the session's own listener reports it to followers. */
|
|
40
|
+
var RunEndedInError = class extends Error {};
|
|
39
41
|
function isTerminalFailure(attempts, failureCode) {
|
|
40
42
|
return attempts >= MAX_ATTEMPTS || !factoryDispatchFailureMetadata(failureCode).canRetry;
|
|
41
43
|
}
|
|
@@ -100,6 +102,8 @@ function watchRun(session, { timeoutMs, approvePlans, onAgentEnd, label, runStil
|
|
|
100
102
|
wait,
|
|
101
103
|
supersededAtEnd: () => supersededAtEnd,
|
|
102
104
|
endReason: () => endReason,
|
|
105
|
+
/** The tool the run is parked on, when it ended suspended. */
|
|
106
|
+
parked: () => parked,
|
|
103
107
|
close: unsubscribe,
|
|
104
108
|
/** The run's own verdict, thrown as what the dispatcher should record. */
|
|
105
109
|
async settle() {
|
|
@@ -115,7 +119,7 @@ function watchRun(session, { timeoutMs, approvePlans, onAgentEnd, label, runStil
|
|
|
115
119
|
observed = await wait();
|
|
116
120
|
}
|
|
117
121
|
if (!observed) throw new FactoryDispatchError("run_terminal_event_missing", `${label} terminal event was not observed before timeout.`);
|
|
118
|
-
if (endReason === "error") throw new
|
|
122
|
+
if (endReason === "error") throw new RunEndedInError(`${label} ended in error.`);
|
|
119
123
|
if (endReason === "aborted") {
|
|
120
124
|
if (omFailure) {
|
|
121
125
|
if (isPermanentProviderRejection(omFailure)) throw new FactoryDispatchError("run_configuration_invalid", `${label} was aborted by an observational-memory failure that will not succeed on retry: ${omFailure}`);
|
|
@@ -243,6 +247,7 @@ var FactoryDecisionDispatcher = class {
|
|
|
243
247
|
#reconcileToolResults;
|
|
244
248
|
#prepareBinding;
|
|
245
249
|
#primeCredentials;
|
|
250
|
+
#reportRunEnd;
|
|
246
251
|
#feedReader;
|
|
247
252
|
#dismissStaleReviews;
|
|
248
253
|
#resolveLinkedWorkItemParentId;
|
|
@@ -275,6 +280,7 @@ var FactoryDecisionDispatcher = class {
|
|
|
275
280
|
this.#reconcileToolResults = options.reconcileToolResults;
|
|
276
281
|
this.#prepareBinding = options.prepareBinding;
|
|
277
282
|
this.#primeCredentials = options.primeCredentials;
|
|
283
|
+
this.#reportRunEnd = options.reportRunEnd;
|
|
278
284
|
this.#feedReader = options.feedReader;
|
|
279
285
|
this.#dismissStaleReviews = options.dismissStaleReviews;
|
|
280
286
|
this.#resolveLinkedWorkItemParentId = options.resolveLinkedWorkItemParentId;
|
|
@@ -654,6 +660,7 @@ var FactoryDecisionDispatcher = class {
|
|
|
654
660
|
}));
|
|
655
661
|
if (await kickoffStale()) throw new FactoryDecisionSuperseded();
|
|
656
662
|
}
|
|
663
|
+
const since = /* @__PURE__ */ new Date();
|
|
657
664
|
const run = watchRun(session, {
|
|
658
665
|
timeoutMs: this.#skillCompletionObservationTimeoutMs,
|
|
659
666
|
approvePlans: await this.#plansAreAutoApproved(record),
|
|
@@ -686,7 +693,13 @@ var FactoryDecisionDispatcher = class {
|
|
|
686
693
|
}
|
|
687
694
|
await this.#recordRunStart(session, binding, deliveryId, record.approvedBy ?? void 0, run.endReason, item?.title);
|
|
688
695
|
try {
|
|
689
|
-
await this.#
|
|
696
|
+
await this.#reportingRunEnd({
|
|
697
|
+
binding,
|
|
698
|
+
startedBy,
|
|
699
|
+
since,
|
|
700
|
+
attempts: record.attempts,
|
|
701
|
+
superseded: async () => await run.supersededAtEnd() ?? await this.#roleSuperseded(record, decision.role)
|
|
702
|
+
}, () => this.#withOpenRunHeartbeat(session, deliveryId, () => run.settle()));
|
|
690
703
|
} catch (error) {
|
|
691
704
|
if (!(await run.supersededAtEnd() ?? await this.#roleSuperseded(record, decision.role))) throw error;
|
|
692
705
|
}
|
|
@@ -1045,6 +1058,44 @@ var FactoryDecisionDispatcher = class {
|
|
|
1045
1058
|
clearInterval(timer);
|
|
1046
1059
|
}
|
|
1047
1060
|
}
|
|
1061
|
+
/**
|
|
1062
|
+
* Settle a watched run; when it fails terminally, tell the item's followers.
|
|
1063
|
+
* A retryable failure says nothing, since the retry reports. How a run that
|
|
1064
|
+
* ran ends (done, blocked, an error) is reported by the session's own
|
|
1065
|
+
* listener; this covers failures no run end shows. The reporter skips
|
|
1066
|
+
* recipients that already have a final report from this run, and never
|
|
1067
|
+
* throws, so reporting can't change the decision's outcome.
|
|
1068
|
+
*/
|
|
1069
|
+
async #reportingRunEnd({ binding, startedBy, since, attempts, superseded }, settle) {
|
|
1070
|
+
try {
|
|
1071
|
+
await settle();
|
|
1072
|
+
} catch (error) {
|
|
1073
|
+
const reportRunEnd = this.#reportRunEnd;
|
|
1074
|
+
if (reportRunEnd && !(error instanceof RunEndedInError) && !(error instanceof FactoryDecisionSuperseded) && !await superseded?.()) {
|
|
1075
|
+
const failureCode = factoryDispatchFailureCode(error);
|
|
1076
|
+
if (isTerminalFailure(attempts, failureCode)) reportRunEnd({
|
|
1077
|
+
orgId: binding.orgId,
|
|
1078
|
+
factoryProjectId: binding.factoryProjectId,
|
|
1079
|
+
workItemId: binding.workItemId,
|
|
1080
|
+
role: binding.role,
|
|
1081
|
+
sender: {
|
|
1082
|
+
sessionId: binding.sessionId,
|
|
1083
|
+
threadId: binding.threadId,
|
|
1084
|
+
userId: startedBy
|
|
1085
|
+
},
|
|
1086
|
+
since,
|
|
1087
|
+
outcome: {
|
|
1088
|
+
status: "failed",
|
|
1089
|
+
failureCode,
|
|
1090
|
+
reason: sanitizeDispatchError(error)
|
|
1091
|
+
}
|
|
1092
|
+
}).catch((reportError) => {
|
|
1093
|
+
console.warn(`[factory] run-end report failed for binding ${binding.id}:`, reportError);
|
|
1094
|
+
});
|
|
1095
|
+
}
|
|
1096
|
+
throw error;
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1048
1099
|
async #recordRunStart(session, binding, kickoffId, approvedBy, observedEnd, workItemName) {
|
|
1049
1100
|
if (!this.#audit) return;
|
|
1050
1101
|
const humanApproved = isHumanActorId(approvedBy);
|
|
@@ -1092,6 +1143,7 @@ var FactoryDecisionDispatcher = class {
|
|
|
1092
1143
|
userId: startedBy,
|
|
1093
1144
|
orgId: record.orgId
|
|
1094
1145
|
});
|
|
1146
|
+
const since = /* @__PURE__ */ new Date();
|
|
1095
1147
|
const run = watchRun(session, {
|
|
1096
1148
|
timeoutMs: this.#skillCompletionObservationTimeoutMs,
|
|
1097
1149
|
approvePlans: await this.#plansAreAutoApproved(record),
|
|
@@ -1121,7 +1173,12 @@ var FactoryDecisionDispatcher = class {
|
|
|
1121
1173
|
settled = await sendKickoff(`factory-kickoff:${record.kickoffKey}:retry:${record.attempts}:${deliveryGeneration}`);
|
|
1122
1174
|
}
|
|
1123
1175
|
await this.#recordRunStart(session, binding, `factory-kickoff:${record.kickoffKey}:${record.attempts}`, startedBy, run.endReason, item?.title);
|
|
1124
|
-
await
|
|
1176
|
+
await this.#reportingRunEnd({
|
|
1177
|
+
binding,
|
|
1178
|
+
startedBy,
|
|
1179
|
+
since,
|
|
1180
|
+
attempts: record.attempts
|
|
1181
|
+
}, () => run.settle());
|
|
1125
1182
|
} finally {
|
|
1126
1183
|
run.close();
|
|
1127
1184
|
}
|