@mastra/factory 0.15.1-alpha.0 → 0.16.0-alpha.11
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 +41 -3
- package/dist/auth.js +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/boards/index.d.ts +1 -1
- package/dist/boards/index.d.ts.map +1 -1
- package/dist/boards/index.js +2 -2
- package/dist/boards/index.js.map +1 -1
- package/dist/boards/review.d.ts.map +1 -1
- package/dist/boards/review.js +23 -9
- package/dist/boards/review.js.map +1 -1
- package/dist/boards/semantics.d.ts +7 -0
- package/dist/boards/semantics.d.ts.map +1 -1
- package/dist/boards/semantics.js +15 -1
- package/dist/boards/semantics.js.map +1 -1
- package/dist/boards/work.d.ts.map +1 -1
- package/dist/boards/work.js +68 -6
- package/dist/boards/work.js.map +1 -1
- package/dist/capabilities/intake.d.ts +8 -0
- package/dist/capabilities/intake.d.ts.map +1 -1
- package/dist/capabilities/version-control.d.ts +15 -0
- package/dist/capabilities/version-control.d.ts.map +1 -1
- package/dist/factory.d.ts +8 -5
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +136 -53
- package/dist/factory.js.map +1 -1
- package/dist/integrations/base.d.ts +5 -0
- package/dist/integrations/base.d.ts.map +1 -1
- package/dist/integrations/github/integration.d.ts.map +1 -1
- package/dist/integrations/github/integration.js +21 -0
- package/dist/integrations/github/integration.js.map +1 -1
- package/dist/integrations/github/routes.js +2 -1
- package/dist/integrations/github/routes.js.map +1 -1
- package/dist/integrations/github/sandbox.d.ts +41 -42
- package/dist/integrations/github/sandbox.d.ts.map +1 -1
- package/dist/integrations/github/sandbox.js +416 -227
- package/dist/integrations/github/sandbox.js.map +1 -1
- package/dist/integrations/github/webhook.d.ts +2 -5
- package/dist/integrations/github/webhook.d.ts.map +1 -1
- package/dist/integrations/github/webhook.js +8 -48
- package/dist/integrations/github/webhook.js.map +1 -1
- package/dist/integrations/gitlab/agent-tools.d.ts +14 -0
- package/dist/integrations/gitlab/agent-tools.d.ts.map +1 -0
- package/dist/integrations/gitlab/agent-tools.js +42 -0
- package/dist/integrations/gitlab/agent-tools.js.map +1 -0
- package/dist/integrations/gitlab/api.d.ts +222 -0
- package/dist/integrations/gitlab/api.d.ts.map +1 -0
- package/dist/integrations/gitlab/api.js +274 -0
- package/dist/integrations/gitlab/api.js.map +1 -0
- package/dist/integrations/gitlab/default-rules.d.ts +125 -0
- package/dist/integrations/gitlab/default-rules.d.ts.map +1 -0
- package/dist/integrations/gitlab/default-rules.js +172 -0
- package/dist/integrations/gitlab/default-rules.js.map +1 -0
- package/dist/integrations/gitlab/integration.d.ts +138 -0
- package/dist/integrations/gitlab/integration.d.ts.map +1 -0
- package/dist/integrations/gitlab/integration.js +705 -0
- package/dist/integrations/gitlab/integration.js.map +1 -0
- package/dist/integrations/gitlab/issue-reconciler.d.ts +6 -0
- package/dist/integrations/gitlab/issue-reconciler.d.ts.map +1 -0
- package/dist/integrations/gitlab/issue-reconciler.js +123 -0
- package/dist/integrations/gitlab/issue-reconciler.js.map +1 -0
- package/dist/integrations/gitlab/merge-request-reconciler.d.ts +6 -0
- package/dist/integrations/gitlab/merge-request-reconciler.d.ts.map +1 -0
- package/dist/integrations/gitlab/merge-request-reconciler.js +267 -0
- package/dist/integrations/gitlab/merge-request-reconciler.js.map +1 -0
- package/dist/integrations/gitlab/reconciler.d.ts +5 -0
- package/dist/integrations/gitlab/reconciler.d.ts.map +1 -0
- package/dist/integrations/gitlab/reconciler.js +31 -0
- package/dist/integrations/gitlab/reconciler.js.map +1 -0
- package/dist/integrations/gitlab/reconciliation-config.d.ts +3 -0
- package/dist/integrations/gitlab/reconciliation-config.d.ts.map +1 -0
- package/dist/integrations/gitlab/reconciliation-config.js +17 -0
- package/dist/integrations/gitlab/reconciliation-config.js.map +1 -0
- package/dist/integrations/gitlab/routes.d.ts +20 -0
- package/dist/integrations/gitlab/routes.d.ts.map +1 -0
- package/dist/integrations/gitlab/routes.js +473 -0
- package/dist/integrations/gitlab/routes.js.map +1 -0
- package/dist/integrations/gitlab/rules.d.ts +35 -0
- package/dist/integrations/gitlab/rules.d.ts.map +1 -0
- package/dist/integrations/gitlab/rules.js +391 -0
- package/dist/integrations/gitlab/rules.js.map +1 -0
- package/dist/integrations/gitlab/session-subscriptions.d.ts +32 -0
- package/dist/integrations/gitlab/session-subscriptions.d.ts.map +1 -0
- package/dist/integrations/gitlab/session-subscriptions.js +192 -0
- package/dist/integrations/gitlab/session-subscriptions.js.map +1 -0
- package/dist/integrations/gitlab/subscriptions.d.ts +70 -0
- package/dist/integrations/gitlab/subscriptions.d.ts.map +1 -0
- package/dist/integrations/gitlab/subscriptions.js +76 -0
- package/dist/integrations/gitlab/subscriptions.js.map +1 -0
- package/dist/integrations/gitlab/version-control.d.ts +16 -0
- package/dist/integrations/gitlab/version-control.d.ts.map +1 -0
- package/dist/integrations/gitlab/version-control.js +622 -0
- package/dist/integrations/gitlab/version-control.js.map +1 -0
- package/dist/integrations/gitlab/webhook-dispatch.d.ts +75 -0
- package/dist/integrations/gitlab/webhook-dispatch.d.ts.map +1 -0
- package/dist/integrations/gitlab/webhook-dispatch.js +235 -0
- package/dist/integrations/gitlab/webhook-dispatch.js.map +1 -0
- package/dist/integrations/gitlab/webhook.d.ts +72 -0
- package/dist/integrations/gitlab/webhook.d.ts.map +1 -0
- package/dist/integrations/gitlab/webhook.js +201 -0
- package/dist/integrations/gitlab/webhook.js.map +1 -0
- package/dist/integrations/incidentio/agent-tools.d.ts +49 -0
- package/dist/integrations/incidentio/agent-tools.d.ts.map +1 -0
- package/dist/integrations/incidentio/agent-tools.js +90 -0
- package/dist/integrations/incidentio/agent-tools.js.map +1 -0
- package/dist/integrations/incidentio/claim.d.ts +8 -0
- package/dist/integrations/incidentio/claim.d.ts.map +1 -0
- package/dist/integrations/incidentio/claim.js +14 -0
- package/dist/integrations/incidentio/claim.js.map +1 -0
- package/dist/integrations/incidentio/default-rules.d.ts +46 -0
- package/dist/integrations/incidentio/default-rules.d.ts.map +1 -0
- package/dist/integrations/incidentio/default-rules.js +66 -0
- package/dist/integrations/incidentio/default-rules.js.map +1 -0
- package/dist/integrations/incidentio/integration.d.ts +48 -2
- package/dist/integrations/incidentio/integration.d.ts.map +1 -1
- package/dist/integrations/incidentio/integration.js +89 -3
- package/dist/integrations/incidentio/integration.js.map +1 -1
- package/dist/integrations/incidentio/issue-reconciler.d.ts +2 -0
- package/dist/integrations/incidentio/issue-reconciler.d.ts.map +1 -1
- package/dist/integrations/incidentio/issue-reconciler.js +38 -2
- package/dist/integrations/incidentio/issue-reconciler.js.map +1 -1
- package/dist/integrations/incidentio/routes.d.ts +71 -0
- package/dist/integrations/incidentio/routes.d.ts.map +1 -0
- package/dist/integrations/incidentio/routes.js +245 -0
- package/dist/integrations/incidentio/routes.js.map +1 -0
- package/dist/integrations/incidentio/rules.d.ts +55 -0
- package/dist/integrations/incidentio/rules.d.ts.map +1 -0
- package/dist/integrations/incidentio/rules.js +175 -0
- package/dist/integrations/incidentio/rules.js.map +1 -0
- package/dist/integrations/issue-reconciler.d.ts +3 -3
- package/dist/integrations/issue-reconciler.d.ts.map +1 -1
- package/dist/integrations/issue-reconciler.js +22 -2
- package/dist/integrations/issue-reconciler.js.map +1 -1
- package/dist/integrations/jira/adf.d.ts +26 -0
- package/dist/integrations/jira/adf.d.ts.map +1 -0
- package/dist/integrations/jira/adf.js +73 -0
- package/dist/integrations/jira/adf.js.map +1 -0
- package/dist/integrations/jira/agent-tools.d.ts +45 -0
- package/dist/integrations/jira/agent-tools.d.ts.map +1 -0
- package/dist/integrations/jira/agent-tools.js +87 -0
- package/dist/integrations/jira/agent-tools.js.map +1 -0
- package/dist/integrations/jira/api.d.ts +157 -0
- package/dist/integrations/jira/api.d.ts.map +1 -0
- package/dist/integrations/jira/api.js +141 -0
- package/dist/integrations/jira/api.js.map +1 -0
- package/dist/integrations/jira/claim.d.ts +9 -0
- package/dist/integrations/jira/claim.d.ts.map +1 -0
- package/dist/integrations/jira/claim.js +15 -0
- package/dist/integrations/jira/claim.js.map +1 -0
- package/dist/integrations/jira/default-rules.d.ts +47 -0
- package/dist/integrations/jira/default-rules.d.ts.map +1 -0
- package/dist/integrations/jira/default-rules.js +67 -0
- package/dist/integrations/jira/default-rules.js.map +1 -0
- package/dist/integrations/jira/integration.d.ts +114 -0
- package/dist/integrations/jira/integration.d.ts.map +1 -0
- package/dist/integrations/jira/integration.js +401 -0
- package/dist/integrations/jira/integration.js.map +1 -0
- package/dist/integrations/jira/issue-reconciler.d.ts +10 -0
- package/dist/integrations/jira/issue-reconciler.d.ts.map +1 -0
- package/dist/integrations/jira/issue-reconciler.js +70 -0
- package/dist/integrations/jira/issue-reconciler.js.map +1 -0
- package/dist/integrations/jira/reconciliation-config.d.ts +3 -0
- package/dist/integrations/jira/reconciliation-config.d.ts.map +1 -0
- package/dist/integrations/jira/reconciliation-config.js +17 -0
- package/dist/integrations/jira/reconciliation-config.js.map +1 -0
- package/dist/integrations/jira/routes.d.ts +54 -0
- package/dist/integrations/jira/routes.d.ts.map +1 -0
- package/dist/integrations/jira/routes.js +260 -0
- package/dist/integrations/jira/routes.js.map +1 -0
- package/dist/integrations/jira/rules.d.ts +57 -0
- package/dist/integrations/jira/rules.d.ts.map +1 -0
- package/dist/integrations/jira/rules.js +175 -0
- package/dist/integrations/jira/rules.js.map +1 -0
- package/dist/integrations/linear/claim.d.ts +8 -0
- package/dist/integrations/linear/claim.d.ts.map +1 -0
- package/dist/integrations/linear/claim.js +14 -0
- package/dist/integrations/linear/claim.js.map +1 -0
- package/dist/integrations/linear/default-rules.d.ts +1 -0
- package/dist/integrations/linear/default-rules.d.ts.map +1 -1
- package/dist/integrations/linear/default-rules.js +2 -0
- package/dist/integrations/linear/default-rules.js.map +1 -1
- package/dist/integrations/linear/integration.d.ts +24 -6
- package/dist/integrations/linear/integration.d.ts.map +1 -1
- package/dist/integrations/linear/integration.js +257 -37
- package/dist/integrations/linear/integration.js.map +1 -1
- package/dist/integrations/linear/routes.d.ts +10 -0
- package/dist/integrations/linear/routes.d.ts.map +1 -1
- package/dist/integrations/linear/routes.js +74 -10
- package/dist/integrations/linear/routes.js.map +1 -1
- package/dist/integrations/linear/rules.d.ts +1 -1
- package/dist/integrations/linear/rules.d.ts.map +1 -1
- package/dist/integrations/linear/rules.js +27 -2
- package/dist/integrations/linear/rules.js.map +1 -1
- package/dist/integrations/platform/connect/routes.d.ts +39 -0
- package/dist/integrations/platform/connect/routes.d.ts.map +1 -0
- package/dist/integrations/platform/connect/routes.js +129 -0
- package/dist/integrations/platform/connect/routes.js.map +1 -0
- package/dist/integrations/platform/github/event-worker.js +1 -1
- package/dist/integrations/platform/github/integration.d.ts.map +1 -1
- package/dist/integrations/platform/github/integration.js +22 -1
- package/dist/integrations/platform/github/integration.js.map +1 -1
- package/dist/integrations/platform/gitlab/event-worker.d.ts +64 -0
- package/dist/integrations/platform/gitlab/event-worker.d.ts.map +1 -0
- package/dist/integrations/platform/gitlab/event-worker.js +306 -0
- package/dist/integrations/platform/gitlab/event-worker.js.map +1 -0
- package/dist/integrations/platform/gitlab/integration.d.ts +57 -0
- package/dist/integrations/platform/gitlab/integration.d.ts.map +1 -0
- package/dist/integrations/platform/gitlab/integration.js +125 -0
- package/dist/integrations/platform/gitlab/integration.js.map +1 -0
- package/dist/integrations/platform/incidentio/integration.d.ts +61 -4
- package/dist/integrations/platform/incidentio/integration.d.ts.map +1 -1
- package/dist/integrations/platform/incidentio/integration.js +372 -23
- package/dist/integrations/platform/incidentio/integration.js.map +1 -1
- package/dist/integrations/platform/jira/agent-tools.d.ts +36 -0
- package/dist/integrations/platform/jira/agent-tools.d.ts.map +1 -0
- package/dist/integrations/platform/jira/agent-tools.js +85 -0
- package/dist/integrations/platform/jira/agent-tools.js.map +1 -0
- package/dist/integrations/platform/jira/integration.d.ts +65 -0
- package/dist/integrations/platform/jira/integration.d.ts.map +1 -0
- package/dist/integrations/platform/jira/integration.js +540 -0
- package/dist/integrations/platform/jira/integration.js.map +1 -0
- package/dist/integrations/platform/jira/routes.d.ts +55 -0
- package/dist/integrations/platform/jira/routes.d.ts.map +1 -0
- package/dist/integrations/platform/jira/routes.js +274 -0
- package/dist/integrations/platform/jira/routes.js.map +1 -0
- package/dist/integrations/platform/linear/integration.d.ts +34 -1
- package/dist/integrations/platform/linear/integration.d.ts.map +1 -1
- package/dist/integrations/platform/linear/integration.js +271 -48
- package/dist/integrations/platform/linear/integration.js.map +1 -1
- package/dist/integrations/slack/integration.d.ts.map +1 -1
- package/dist/integrations/slack/integration.js +3 -3
- package/dist/integrations/slack/integration.js.map +1 -1
- package/dist/integrations/slack/slack.d.ts +2 -0
- package/dist/integrations/slack/slack.d.ts.map +1 -1
- package/dist/integrations/slack/slack.js +21 -7
- package/dist/integrations/slack/slack.js.map +1 -1
- package/dist/integrations/subscription-session.d.ts +37 -0
- package/dist/integrations/subscription-session.d.ts.map +1 -0
- package/dist/integrations/subscription-session.js +83 -0
- package/dist/integrations/subscription-session.js.map +1 -0
- package/dist/packages/_internals/workspace/dist/index.js +1 -11
- package/dist/packages/_internals/workspace/dist/index.js.map +1 -1
- package/dist/routes/intake.d.ts.map +1 -1
- package/dist/routes/intake.js +16 -4
- package/dist/routes/intake.js.map +1 -1
- package/dist/routes/oauth.js +3 -6
- package/dist/routes/oauth.js.map +1 -1
- package/dist/routes/projects.d.ts +1 -0
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +1 -0
- package/dist/routes/projects.js.map +1 -1
- package/dist/routes/source-control-sessions.d.ts +20 -0
- package/dist/routes/source-control-sessions.d.ts.map +1 -0
- package/dist/routes/source-control-sessions.js +319 -0
- package/dist/routes/source-control-sessions.js.map +1 -0
- package/dist/routes/source-control-settings.d.ts +10 -0
- package/dist/routes/source-control-settings.d.ts.map +1 -0
- package/dist/routes/source-control-settings.js +87 -0
- package/dist/routes/source-control-settings.js.map +1 -0
- package/dist/routes/surface.d.ts +3 -3
- package/dist/routes/surface.d.ts.map +1 -1
- package/dist/routes/surface.js +79 -17
- package/dist/routes/surface.js.map +1 -1
- package/dist/routes/tenant-credentials.d.ts +8 -0
- package/dist/routes/tenant-credentials.d.ts.map +1 -1
- package/dist/routes/tenant-credentials.js +20 -3
- package/dist/routes/tenant-credentials.js.map +1 -1
- package/dist/routes/work-items.d.ts.map +1 -1
- package/dist/routes/work-items.js +1 -1
- package/dist/routes/work-items.js.map +1 -1
- package/dist/rules/dispatch-errors.d.ts.map +1 -1
- package/dist/rules/dispatch-errors.js +8 -0
- package/dist/rules/dispatch-errors.js.map +1 -1
- package/dist/rules/dispatcher.d.ts +1 -0
- package/dist/rules/dispatcher.d.ts.map +1 -1
- package/dist/rules/dispatcher.js +186 -106
- package/dist/rules/dispatcher.js.map +1 -1
- package/dist/rules/index.d.ts +2 -2
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +2 -2
- package/dist/rules/start-coordinator.d.ts +1 -1
- package/dist/rules/start-coordinator.d.ts.map +1 -1
- package/dist/rules/start-coordinator.js +7 -3
- package/dist/rules/start-coordinator.js.map +1 -1
- package/dist/rules/terminal-cleanup.d.ts +14 -1
- package/dist/rules/terminal-cleanup.d.ts.map +1 -1
- package/dist/rules/terminal-cleanup.js +20 -0
- package/dist/rules/terminal-cleanup.js.map +1 -1
- package/dist/rules/tools.d.ts +2 -0
- package/dist/rules/tools.d.ts.map +1 -1
- package/dist/rules/tools.js +30 -2
- package/dist/rules/tools.js.map +1 -1
- package/dist/rules/transition-service.d.ts +3 -0
- package/dist/rules/transition-service.d.ts.map +1 -1
- package/dist/rules/transition-service.js +10 -5
- package/dist/rules/transition-service.js.map +1 -1
- package/dist/rules/types.d.ts +136 -3
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/rules/types.js +31 -2
- package/dist/rules/types.js.map +1 -1
- package/dist/rules/validation.d.ts.map +1 -1
- package/dist/rules/validation.js +15 -2
- package/dist/rules/validation.js.map +1 -1
- package/dist/sandbox/git-ref.d.ts +7 -0
- package/dist/sandbox/git-ref.d.ts.map +1 -0
- package/dist/sandbox/git-ref.js +15 -0
- package/dist/sandbox/git-ref.js.map +1 -0
- package/dist/sandbox/session-retirement.js +1 -1
- package/dist/sandbox/workdir.d.ts.map +1 -1
- package/dist/sandbox/workdir.js +6 -6
- package/dist/sandbox/workdir.js.map +1 -1
- package/dist/session/factory-session.d.ts +31 -1
- package/dist/session/factory-session.d.ts.map +1 -1
- package/dist/session/factory-session.js +60 -1
- package/dist/session/factory-session.js.map +1 -1
- package/dist/session/run-audit.d.ts +9 -0
- package/dist/session/run-audit.d.ts.map +1 -1
- package/dist/session/run-audit.js +37 -6
- package/dist/session/run-audit.js.map +1 -1
- package/dist/session/source-control-tools.d.ts +16 -0
- package/dist/session/source-control-tools.d.ts.map +1 -0
- package/dist/session/source-control-tools.js +464 -0
- package/dist/session/source-control-tools.js.map +1 -0
- package/dist/skills/service.d.ts +12 -0
- package/dist/skills/service.d.ts.map +1 -1
- package/dist/skills/service.js +27 -1
- package/dist/skills/service.js.map +1 -1
- package/dist/storage/domains/intake/base.d.ts +18 -0
- package/dist/storage/domains/intake/base.d.ts.map +1 -1
- package/dist/storage/domains/intake/base.js +77 -0
- package/dist/storage/domains/intake/base.js.map +1 -1
- package/dist/storage/domains/work-items/base.d.ts +41 -2
- package/dist/storage/domains/work-items/base.d.ts.map +1 -1
- package/dist/storage/domains/work-items/base.js +159 -12
- package/dist/storage/domains/work-items/base.js.map +1 -1
- package/dist/supervisor/session-messaging.d.ts +23 -0
- package/dist/supervisor/session-messaging.d.ts.map +1 -0
- package/dist/supervisor/session-messaging.js +15 -0
- package/dist/supervisor/session-messaging.js.map +1 -0
- package/dist/supervisor/write-tools.d.ts +2 -1
- package/dist/supervisor/write-tools.d.ts.map +1 -1
- package/dist/supervisor/write-tools.js +11 -7
- package/dist/supervisor/write-tools.js.map +1 -1
- package/dist/work-item-branch.d.ts +3 -1
- package/dist/work-item-branch.d.ts.map +1 -1
- package/dist/work-item-branch.js +26 -6
- package/dist/work-item-branch.js.map +1 -1
- package/dist/workspace.d.ts +15 -1
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +57 -23
- package/dist/workspace.js.map +1 -1
- package/factory-skills/factory-gitlab-rereview/SKILL.md +19 -0
- package/factory-skills/factory-gitlab-review/SKILL.md +30 -0
- package/factory-skills/factory-rereview/SKILL.md +13 -6
- package/factory-skills/factory-review/SKILL.md +13 -6
- package/factory-skills/factory-review/references/archaeology.md +225 -0
- package/factory-skills/factory-review/references/categories/README.md +34 -0
- package/factory-skills/factory-review/references/categories/behavior-change.md +36 -0
- package/factory-skills/factory-review/references/categories/bug-fix.md +37 -0
- package/factory-skills/factory-review/references/categories/docs.md +32 -0
- package/factory-skills/factory-review/references/categories/experimental-flagged.md +34 -0
- package/factory-skills/factory-review/references/categories/infra-tooling.md +37 -0
- package/factory-skills/factory-review/references/categories/internal-capability.md +35 -0
- package/factory-skills/factory-review/references/categories/large-cross-cutting.md +35 -0
- package/factory-skills/factory-review/references/categories/mechanical.md +36 -0
- package/factory-skills/factory-review/references/categories/performance.md +33 -0
- package/factory-skills/factory-review/references/categories/public-api.md +38 -0
- package/factory-skills/factory-review/references/categories/refactor.md +35 -0
- package/factory-skills/factory-review/references/categories/revert.md +31 -0
- package/factory-skills/factory-review/references/categories/schema-storage.md +39 -0
- package/factory-skills/factory-review/references/categories/security.md +35 -0
- package/factory-skills/factory-review/references/categories/tests-only.md +38 -0
- package/package.json +12 -12
package/dist/rules/dispatcher.js
CHANGED
|
@@ -3,11 +3,11 @@ import { boardForWorkItem, resolvePhaseSemantics, workItemPhaseSemantics } from
|
|
|
3
3
|
import { FACTORY_RULE_STAGES, externallyAuthoredWorkItem } from "./types.js";
|
|
4
4
|
import { createBoardRegistry } from "../boards/registry.js";
|
|
5
5
|
import "../boards/index.js";
|
|
6
|
-
import { FACTORY_RULE_MATERIALIZATION_KEY } from "../storage/domains/work-items/base.js";
|
|
6
|
+
import { FACTORY_RULE_MATERIALIZATION_KEY, WorkItemClaimConflictError } from "../storage/domains/work-items/base.js";
|
|
7
7
|
import { FactoryDispatchError, factoryDispatchFailureCode, factoryDispatchFailureMetadata } from "./dispatch-errors.js";
|
|
8
8
|
import { isHumanActorId } from "../storage/domains/audit/actors.js";
|
|
9
|
-
import { resolvePromptInvocation, resolveSkillInvocation } from "../skills/service.js";
|
|
10
|
-
import { recordSessionRunStart } from "../session/run-audit.js";
|
|
9
|
+
import { resolvePromptInvocation, resolveSkillInvocation, resolveSkillResumeInvocation } from "../skills/service.js";
|
|
10
|
+
import { FACTORY_OPEN_RUN_STALE_MS, heartbeatSessionOpenRun, isOpenRunLiveElsewhere, listSessionOpenRuns, recordSessionRunStart, waitForSessionRunAudit } from "../session/run-audit.js";
|
|
11
11
|
import { withWorkItemFeed } from "../storage/domains/comments/feed-context.js";
|
|
12
12
|
import { RequestContext } from "@mastra/core/request-context";
|
|
13
13
|
import { randomUUID } from "crypto";
|
|
@@ -103,7 +103,7 @@ function watchRun(session, { timeoutMs, approvePlans, onAgentEnd, label, runStil
|
|
|
103
103
|
});
|
|
104
104
|
observed = await wait();
|
|
105
105
|
}
|
|
106
|
-
if (!observed) throw new
|
|
106
|
+
if (!observed) throw new FactoryDispatchError("run_terminal_event_missing", `${label} terminal event was not observed before timeout.`);
|
|
107
107
|
if (endReason === "error") throw new Error(`${label} ended in error.`);
|
|
108
108
|
if (endReason === "aborted") {
|
|
109
109
|
if (omFailure) {
|
|
@@ -158,7 +158,7 @@ function retryAt(now, attempts) {
|
|
|
158
158
|
return new Date(now.getTime() + Math.min(1e3 * 2 ** Math.max(0, attempts - 1), MAX_BACKOFF_MS));
|
|
159
159
|
}
|
|
160
160
|
function externalSourceForDecision(decision) {
|
|
161
|
-
const [integrationId, type] = decision.source === "github-pr" ? ["github", "pull-request"] : decision.source === "github-issue" ? ["github", "issue"] : decision.source === "linear-issue" ? ["linear", "issue"] : ["factory", "manual"];
|
|
161
|
+
const [integrationId, type] = decision.source === "github-pr" ? ["github", "pull-request"] : decision.source === "github-issue" ? ["github", "issue"] : decision.source === "gitlab-pr" ? ["gitlab", "pull-request"] : decision.source === "gitlab-issue" ? ["gitlab", "issue"] : decision.source === "linear-issue" ? ["linear", "issue"] : decision.source === "jira-issue" ? ["jira", "issue"] : decision.source === "incidentio-follow-up" ? ["incidentio", "issue"] : ["factory", "manual"];
|
|
162
162
|
return {
|
|
163
163
|
integrationId,
|
|
164
164
|
type,
|
|
@@ -174,6 +174,12 @@ function deferredActor(record) {
|
|
|
174
174
|
trusted: actor.trusted,
|
|
175
175
|
factoryAuthored: actor.factoryAuthored
|
|
176
176
|
};
|
|
177
|
+
if (actor?.type === "gitlab" && typeof actor.username === "string" && typeof actor.trusted === "boolean" && typeof actor.factoryAuthored === "boolean") return {
|
|
178
|
+
type: "gitlab",
|
|
179
|
+
username: actor.username,
|
|
180
|
+
trusted: actor.trusted,
|
|
181
|
+
factoryAuthored: actor.factoryAuthored
|
|
182
|
+
};
|
|
177
183
|
return {
|
|
178
184
|
type: "system",
|
|
179
185
|
id: "factory-rule-dispatcher"
|
|
@@ -243,6 +249,7 @@ var FactoryDecisionDispatcher = class {
|
|
|
243
249
|
#timer;
|
|
244
250
|
#activeClaim;
|
|
245
251
|
#inFlight = /* @__PURE__ */ new Set();
|
|
252
|
+
#bindingSkillRuns = /* @__PURE__ */ new Map();
|
|
246
253
|
constructor(options) {
|
|
247
254
|
this.#audit = options.audit;
|
|
248
255
|
this.#controller = options.controller;
|
|
@@ -521,93 +528,120 @@ var FactoryDecisionDispatcher = class {
|
|
|
521
528
|
case "invokeSkill": {
|
|
522
529
|
if (await this.#roleSuperseded(record, decision.role)) return;
|
|
523
530
|
const binding = await this.#requireOrPrepareBinding(record, decision.role);
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
const run = watchRun(session, {
|
|
573
|
-
timeoutMs: this.#skillCompletionObservationTimeoutMs,
|
|
574
|
-
approvePlans: await this.#plansAreAutoApproved(record, item),
|
|
575
|
-
onAgentEnd: () => this.#roleSuperseded(record, decision.role),
|
|
576
|
-
label: "Factory skill run",
|
|
577
|
-
runStillActive: () => this.#controller.listActiveThreadRuns().some((active) => active.threadId === binding.threadId)
|
|
578
|
-
});
|
|
579
|
-
const sendKickoff = async () => {
|
|
580
|
-
const settled = await session.sendSignal({
|
|
581
|
-
id: deliveryId,
|
|
582
|
-
type: "user",
|
|
583
|
-
tagName: "user",
|
|
584
|
-
contents: kickoffContents
|
|
585
|
-
}, {
|
|
586
|
-
requestContext,
|
|
587
|
-
requireDelivery: true
|
|
588
|
-
}).accepted;
|
|
589
|
-
if (settled.action !== "wake" && settled.action !== "deliver") throw new Error(`Factory skill invocation signal did not reach the agent (${String(settled.action)}).`);
|
|
590
|
-
return settled;
|
|
591
|
-
};
|
|
592
|
-
try {
|
|
593
|
-
let settled = await sendKickoff();
|
|
594
|
-
if (settled.action === "deliver") {
|
|
595
|
-
if (!(await session.thread.listActiveMessages()).some((message) => message.id === deliveryId)) {
|
|
596
|
-
if (!await run.wait()) throw new Error("Factory skill invocation is waiting on a run that has not ended.");
|
|
597
|
-
run.arm();
|
|
598
|
-
settled = await sendKickoff();
|
|
599
|
-
if (settled.action !== "wake") throw new Error("Factory skill invocation was queued onto an ending run and never reached the agent.");
|
|
531
|
+
await this.#withBindingSkillRun(binding.id, async () => {
|
|
532
|
+
const item = record.workItemId ? await this.#storage.get({
|
|
533
|
+
orgId: record.orgId,
|
|
534
|
+
id: record.workItemId
|
|
535
|
+
}) : null;
|
|
536
|
+
const startedBy = item?.sessions[binding.role]?.startedBy;
|
|
537
|
+
if (!startedBy) throw new Error(`Factory binding ${binding.id} has no authenticated session owner.`);
|
|
538
|
+
await this.#primeCredentials?.({
|
|
539
|
+
orgId: record.orgId,
|
|
540
|
+
userId: startedBy
|
|
541
|
+
});
|
|
542
|
+
const session = await this.#requireSession(binding);
|
|
543
|
+
const requestContext = factoryRequestContext({
|
|
544
|
+
session,
|
|
545
|
+
binding,
|
|
546
|
+
userId: startedBy,
|
|
547
|
+
orgId: record.orgId
|
|
548
|
+
});
|
|
549
|
+
const resolved = decision.skillName === void 0 ? await resolvePromptInvocation(this.#controller, {
|
|
550
|
+
resourceId: binding.resourceId,
|
|
551
|
+
prompt: decision.prompt
|
|
552
|
+
}) : decision.resume === true ? await resolveSkillResumeInvocation(this.#controller, {
|
|
553
|
+
resourceId: binding.resourceId,
|
|
554
|
+
name: decision.skillName,
|
|
555
|
+
arguments: decision.arguments
|
|
556
|
+
}) : await resolveSkillInvocation(this.#controller, {
|
|
557
|
+
resourceId: binding.resourceId,
|
|
558
|
+
name: decision.skillName,
|
|
559
|
+
arguments: decision.arguments
|
|
560
|
+
});
|
|
561
|
+
await this.#switchThread(session, binding);
|
|
562
|
+
const deliveryId = record.deliveryGeneration === 0 ? record.id : `${record.id}:retry:${record.deliveryGeneration}`;
|
|
563
|
+
const runStillActive = () => this.#controller.listActiveThreadRuns().some((active) => active.threadId === binding.threadId);
|
|
564
|
+
while (true) {
|
|
565
|
+
const openRun = watchRun(session, {
|
|
566
|
+
timeoutMs: this.#skillCompletionObservationTimeoutMs,
|
|
567
|
+
approvePlans: false,
|
|
568
|
+
label: "Factory skill run",
|
|
569
|
+
runStillActive
|
|
570
|
+
});
|
|
571
|
+
try {
|
|
572
|
+
const open = (await listSessionOpenRuns(session)).filter((entry) => entry.bindingId === binding.id);
|
|
573
|
+
if (open.length === 0) break;
|
|
574
|
+
if (open.some((entry) => isOpenRunLiveElsewhere(entry, this.#ownerId))) throw new FactoryDispatchError("session_unavailable", `Factory binding ${binding.id} has a run in flight on another dispatcher.`);
|
|
575
|
+
if (!runStillActive()) break;
|
|
576
|
+
if (!await openRun.wait()) break;
|
|
577
|
+
} finally {
|
|
578
|
+
openRun.close();
|
|
600
579
|
}
|
|
580
|
+
await waitForSessionRunAudit(session);
|
|
601
581
|
}
|
|
602
|
-
await this.#
|
|
582
|
+
if (await this.#roleSuperseded(record, decision.role)) return;
|
|
583
|
+
if ((await this.#requireBinding(record, decision.role)).id !== binding.id) throw new FactoryDispatchError("session_unavailable", `Factory binding ${binding.id} changed while waiting for its open run to end.`);
|
|
584
|
+
if ((await session.thread.listActiveMessages()).some((message) => message.id === deliveryId)) return;
|
|
585
|
+
const kickoffContents = await withWorkItemFeed(this.#feedReader, {
|
|
586
|
+
orgId: record.orgId,
|
|
587
|
+
factoryProjectId: record.factoryProjectId,
|
|
588
|
+
workItemId: record.workItemId
|
|
589
|
+
}, resolved.message);
|
|
590
|
+
if (decision.cancelInFlight && session.stream.isActive()) session.abort();
|
|
591
|
+
const precedingMessage = decision.precedingMessage;
|
|
592
|
+
if (precedingMessage) await awaitNotification(() => session.sendNotificationSignal({
|
|
593
|
+
source: "factory",
|
|
594
|
+
kind: "stage-transition",
|
|
595
|
+
summary: precedingMessage,
|
|
596
|
+
priority: "medium",
|
|
597
|
+
payload: { message: precedingMessage },
|
|
598
|
+
sourceId: `${record.id}:stage-transition`,
|
|
599
|
+
dedupeKey: `${record.idempotencyKey}:stage-transition`
|
|
600
|
+
}, {
|
|
601
|
+
ifActive: { behavior: "deliver" },
|
|
602
|
+
ifIdle: { behavior: "persist" },
|
|
603
|
+
requestContext
|
|
604
|
+
}));
|
|
605
|
+
const run = watchRun(session, {
|
|
606
|
+
timeoutMs: this.#skillCompletionObservationTimeoutMs,
|
|
607
|
+
approvePlans: await this.#plansAreAutoApproved(record, item),
|
|
608
|
+
onAgentEnd: () => this.#roleSuperseded(record, decision.role),
|
|
609
|
+
label: "Factory skill run",
|
|
610
|
+
runStillActive
|
|
611
|
+
});
|
|
612
|
+
const sendKickoff = async () => {
|
|
613
|
+
const settled = await session.sendSignal({
|
|
614
|
+
id: deliveryId,
|
|
615
|
+
type: "user",
|
|
616
|
+
tagName: "user",
|
|
617
|
+
contents: kickoffContents
|
|
618
|
+
}, {
|
|
619
|
+
requestContext,
|
|
620
|
+
requireDelivery: true
|
|
621
|
+
}).accepted;
|
|
622
|
+
if (settled.action !== "wake" && settled.action !== "deliver") throw new FactoryDispatchError(settled.action ? "notification_delivery_failed" : "skill_delivery_ambiguous", `Factory skill invocation signal did not reach the agent (${String(settled.action)}).`);
|
|
623
|
+
return settled;
|
|
624
|
+
};
|
|
603
625
|
try {
|
|
604
|
-
await
|
|
605
|
-
|
|
606
|
-
|
|
626
|
+
let settled = await sendKickoff();
|
|
627
|
+
if (settled.action === "deliver") {
|
|
628
|
+
if (!(await session.thread.listActiveMessages()).some((message) => message.id === deliveryId)) {
|
|
629
|
+
if (!await run.wait()) throw new FactoryDispatchError("run_terminal_event_missing", "Factory skill invocation is waiting on a run whose terminal event was not observed.");
|
|
630
|
+
run.arm();
|
|
631
|
+
settled = await sendKickoff();
|
|
632
|
+
if (settled.action !== "wake") throw new FactoryDispatchError("skill_delivery_ambiguous", "Factory skill invocation was queued onto an ending run and never reached the agent.");
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
await this.#recordRunStart(session, binding, deliveryId, record.approvedBy ?? void 0, run.endReason, item?.title);
|
|
636
|
+
try {
|
|
637
|
+
await this.#withOpenRunHeartbeat(session, deliveryId, () => run.settle());
|
|
638
|
+
} catch (error) {
|
|
639
|
+
if (!(await run.supersededAtEnd() ?? await this.#roleSuperseded(record, decision.role))) throw error;
|
|
640
|
+
}
|
|
641
|
+
} finally {
|
|
642
|
+
run.close();
|
|
607
643
|
}
|
|
608
|
-
}
|
|
609
|
-
run.close();
|
|
610
|
-
}
|
|
644
|
+
});
|
|
611
645
|
return;
|
|
612
646
|
}
|
|
613
647
|
case "sendMessage": {
|
|
@@ -680,24 +714,42 @@ var FactoryDecisionDispatcher = class {
|
|
|
680
714
|
factoryProjectId: record.factoryProjectId,
|
|
681
715
|
decision
|
|
682
716
|
}) ?? null;
|
|
683
|
-
let result
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
717
|
+
let result;
|
|
718
|
+
try {
|
|
719
|
+
result = await this.#storage.upsert({
|
|
720
|
+
orgId: record.orgId,
|
|
721
|
+
userId: "factory-rule-dispatcher",
|
|
722
|
+
factoryProjectId: record.factoryProjectId,
|
|
723
|
+
input: {
|
|
724
|
+
externalSource: externalSourceForDecision(decision),
|
|
725
|
+
...decision.claimKey ? { claimKey: decision.claimKey } : {},
|
|
726
|
+
parentWorkItemId,
|
|
727
|
+
title: decision.title,
|
|
728
|
+
board: decision.board,
|
|
729
|
+
stages: [initialPhase],
|
|
730
|
+
sessions: {},
|
|
731
|
+
metadata: {
|
|
732
|
+
...decision.metadata,
|
|
733
|
+
[FACTORY_RULE_MATERIALIZATION_KEY]: record.idempotencyKey
|
|
734
|
+
}
|
|
735
|
+
},
|
|
736
|
+
reuseMode: "preserve"
|
|
737
|
+
});
|
|
738
|
+
} catch (error) {
|
|
739
|
+
if (error instanceof WorkItemClaimConflictError) return;
|
|
740
|
+
throw error;
|
|
741
|
+
}
|
|
742
|
+
if (!result.created && decision.claimKey && !result.item.claimKey) {
|
|
743
|
+
const claimed = await this.#storage.claimWorkItem({
|
|
744
|
+
orgId: record.orgId,
|
|
745
|
+
id: result.item.id,
|
|
746
|
+
claimKey: decision.claimKey
|
|
747
|
+
});
|
|
748
|
+
if (claimed) result = {
|
|
749
|
+
...result,
|
|
750
|
+
item: claimed
|
|
751
|
+
};
|
|
752
|
+
}
|
|
701
753
|
const itemBoard = boardForWorkItem(result.item);
|
|
702
754
|
if (itemBoard !== decision.board) throw new Error(`The work item belongs to board "${itemBoard}", not "${decision.board}".`);
|
|
703
755
|
if (!result.item.parentWorkItemId && parentWorkItemId && parentWorkItemId !== result.item.id) {
|
|
@@ -821,6 +873,11 @@ var FactoryDecisionDispatcher = class {
|
|
|
821
873
|
const bindings = await this.#storage.listRunBindings(record.orgId, record.factoryProjectId, record.workItemId);
|
|
822
874
|
const own = bindings.filter((candidate) => candidate.role === role);
|
|
823
875
|
if (own.some((candidate) => candidate.status === "active")) return false;
|
|
876
|
+
const item = await this.#storage.get({
|
|
877
|
+
orgId: record.orgId,
|
|
878
|
+
id: record.workItemId
|
|
879
|
+
}).catch(() => null);
|
|
880
|
+
if (item && workItemPhaseSemantics(this.#boards, item)?.kind === "terminal") return true;
|
|
824
881
|
return own.some((revoked) => revoked.revokedAt !== null && revoked.revokedAt.getTime() >= record.createdAt.getTime() && bindings.some((successor) => successor.role !== role && successor.status === "active" && successor.resourceId === revoked.resourceId && successor.sessionId === revoked.sessionId && successor.threadId === revoked.threadId && successor.createdAt.getTime() >= revoked.revokedAt.getTime()));
|
|
825
882
|
}
|
|
826
883
|
async #requireOrPrepareBinding(record, role) {
|
|
@@ -864,6 +921,15 @@ var FactoryDecisionDispatcher = class {
|
|
|
864
921
|
if (session.thread.requireId() === binding.threadId) return;
|
|
865
922
|
await session.thread.switch({ threadId: binding.threadId });
|
|
866
923
|
}
|
|
924
|
+
async #withBindingSkillRun(bindingId, effect) {
|
|
925
|
+
const run = (this.#bindingSkillRuns.get(bindingId) ?? Promise.resolve()).catch(() => {}).then(effect);
|
|
926
|
+
this.#bindingSkillRuns.set(bindingId, run);
|
|
927
|
+
try {
|
|
928
|
+
await run;
|
|
929
|
+
} finally {
|
|
930
|
+
if (this.#bindingSkillRuns.get(bindingId) === run) this.#bindingSkillRuns.delete(bindingId);
|
|
931
|
+
}
|
|
932
|
+
}
|
|
867
933
|
async #withLease(renew, effect) {
|
|
868
934
|
let renewalFailure;
|
|
869
935
|
let renewal = Promise.resolve();
|
|
@@ -886,6 +952,17 @@ var FactoryDecisionDispatcher = class {
|
|
|
886
952
|
await renewal;
|
|
887
953
|
}
|
|
888
954
|
}
|
|
955
|
+
/** Keep this process's claim on an open run fresh for as long as it is watching the run. */
|
|
956
|
+
async #withOpenRunHeartbeat(session, kickoffId, effect) {
|
|
957
|
+
if (!this.#audit) return effect();
|
|
958
|
+
const timer = setInterval(() => void heartbeatSessionOpenRun(session, kickoffId), Math.floor(FACTORY_OPEN_RUN_STALE_MS / 3));
|
|
959
|
+
timer.unref?.();
|
|
960
|
+
try {
|
|
961
|
+
return await effect();
|
|
962
|
+
} finally {
|
|
963
|
+
clearInterval(timer);
|
|
964
|
+
}
|
|
965
|
+
}
|
|
889
966
|
async #recordRunStart(session, binding, kickoffId, approvedBy, observedEnd, workItemName) {
|
|
890
967
|
if (!this.#audit) return;
|
|
891
968
|
const humanApproved = isHumanActorId(approvedBy);
|
|
@@ -895,6 +972,8 @@ var FactoryDecisionDispatcher = class {
|
|
|
895
972
|
observedEnd,
|
|
896
973
|
run: {
|
|
897
974
|
kickoffId,
|
|
975
|
+
ownerId: this.#ownerId,
|
|
976
|
+
heartbeatAt: Date.now(),
|
|
898
977
|
bindingId: binding.id,
|
|
899
978
|
role: binding.role,
|
|
900
979
|
startedBy: humanApproved ? approvedBy : "factory-rule-dispatcher",
|
|
@@ -987,6 +1066,7 @@ const FACTORY_DISPATCH_CONSTANTS = {
|
|
|
987
1066
|
maxBackoffMs: MAX_BACKOFF_MS,
|
|
988
1067
|
skillCompletionObservationTimeoutMs: SKILL_COMPLETION_OBSERVATION_TIMEOUT_MS,
|
|
989
1068
|
runRegistryHeartbeatMs: RUN_REGISTRY_HEARTBEAT_MS,
|
|
1069
|
+
openRunStaleMs: FACTORY_OPEN_RUN_STALE_MS,
|
|
990
1070
|
maxInFlight: MAX_IN_FLIGHT,
|
|
991
1071
|
stages: FACTORY_RULE_STAGES
|
|
992
1072
|
};
|