@cat-factory/orchestration 0.88.0 → 0.89.0

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.
@@ -60,4 +60,81 @@ export function orderProvisionTargets(targets, providersOf) {
60
60
  export function deployEvictionEpoch(step) {
61
61
  return (step.evictionRecoveries ?? 0) + (step.transientEvictionRecoveries ?? 0);
62
62
  }
63
+ // ---------------------------------------------------------------------------
64
+ // Run-start Deployer-config gate (pure half).
65
+ //
66
+ // When a pipeline INCLUDES an enabled `deployer` step, the environment it will stand up must be
67
+ // fully + correctly configured on BOTH sides of the "what/where ÷ how" split: the SERVICE owns
68
+ // the in-repo "what/where" (its declared provision type + manifest source / compose path /
69
+ // custom-manifest id), the WORKSPACE owns the "how" (an infra handler that resolves for the
70
+ // type + its credentials). A gap on either side means the deployer would fail mid-run (an async
71
+ // failed environment) or — for docker-compose with no handler — silently no-op, both of which
72
+ // this gate turns into an actionable up-front launch error. `ExecutionService` resolves the IO
73
+ // inputs (service config, handler resolution, an optional live connection probe) and translates
74
+ // the verdict into a `ConflictError` with a machine-readable reason the SPA deep-links off.
75
+ // ---------------------------------------------------------------------------
76
+ /**
77
+ * Whether the ENABLED chain contains a `deployer` step. The Deployer-config gate fires only then:
78
+ * a pipeline with no enabled deployer stands no environment up, so its provisioning config is
79
+ * irrelevant. Mirrors the enabled-subset walk the other pipeline-shape checks use (`enabled?.[i]
80
+ * !== false`), so a disabled deployer is correctly treated as absent.
81
+ */
82
+ export function hasEnabledDeployerStep(agentKinds, enabled) {
83
+ return agentKinds.some((kind, i) => enabled?.[i] !== false && kind === DEPLOYER_AGENT_KIND);
84
+ }
85
+ /**
86
+ * The service-owned provisioning fields a Deployer REQUIRES to stand a `type` environment up (the
87
+ * "what + where" the service must supply — the workspace handler owns the "how"). Returns the list
88
+ * of MISSING field names; empty ⇒ the service config is complete for its type. `infraless` and an
89
+ * undeclared type need nothing (the deployer stands nothing up), so they are always complete.
90
+ * - `kubernetes` → `manifestSource` (where the per-PR manifests live)
91
+ * - `docker-compose` → `composePath` OR a `recipe` that layers compose file(s)
92
+ * - `custom` → `manifestId` (the custom-manifest type matched to a remote-custom handler)
93
+ */
94
+ export function deployerServiceConfigIssues(provisioning) {
95
+ switch (provisioning?.type) {
96
+ case 'kubernetes':
97
+ return provisioning.manifestSource ? [] : ['manifestSource'];
98
+ case 'docker-compose':
99
+ return provisioning.composePath?.trim() ||
100
+ (provisioning.recipe?.composeFiles?.length ?? 0) > 0
101
+ ? []
102
+ : ['composePath'];
103
+ case 'custom':
104
+ return provisioning.manifestId ? [] : ['manifestId'];
105
+ default:
106
+ return [];
107
+ }
108
+ }
109
+ /**
110
+ * Decide whether a Deployer-bearing pipeline may START, given the service's provisioning
111
+ * completeness, whether a workspace handler resolves for its type, and (bonus) a live connection
112
+ * probe. Ordered most-fundamental-first so the surfaced fix is the right one: an incomplete SERVICE
113
+ * config is reported before the WORKSPACE handler (there's nothing to connect to a half-declared
114
+ * service), and a failing connection only after both structural checks pass. `infraless`/undeclared
115
+ * always pass — the deployer stands nothing up for them.
116
+ */
117
+ export function decideDeployerConfig(input) {
118
+ const { provisionType } = input;
119
+ if (!provisionType || provisionType === 'infraless')
120
+ return { ok: true };
121
+ if (input.serviceIssues.length > 0) {
122
+ return { ok: false, reason: 'service-config-incomplete', missing: input.serviceIssues };
123
+ }
124
+ if (!input.handlerResolution.ok) {
125
+ return {
126
+ ok: false,
127
+ reason: 'workspace-unhandled',
128
+ handlerReason: input.handlerResolution.reason ?? 'no-handler',
129
+ };
130
+ }
131
+ if (input.connectionTest && !input.connectionTest.ok) {
132
+ return {
133
+ ok: false,
134
+ reason: 'connection-failed',
135
+ ...(input.connectionTest.message ? { message: input.connectionTest.message } : {}),
136
+ };
137
+ }
138
+ return { ok: true };
139
+ }
63
140
  //# sourceMappingURL=deployer.logic.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deployer.logic.js","sourceRoot":"","sources":["../../../src/modules/execution/deployer.logic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAE/D;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,KAAa,EAAE,OAAgB;IAC9E,wFAAwF;IACxF,8FAA8F;IAC9F,oFAAoF;IACpF,MAAM,IAAI,GAAG,GAAG,WAAW,IAAI,mBAAmB,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IACnF,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAC9C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAA+D,EAC/D,WAAqD;IAErD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACxD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE;QAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACzC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACzC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAA;QAC7B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,CAAC,CAAA;IACD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,OAAO,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;YACvC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACrC,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACpE,CAAC,CAAC,CAAA;QACF,2FAA2F;QAC3F,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,CAAA;QAC9C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAClB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAkB;IACpD,OAAO,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,CAAC,CAAA;AACjF,CAAC"}
1
+ {"version":3,"file":"deployer.logic.js","sourceRoot":"","sources":["../../../src/modules/execution/deployer.logic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAE/D;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,KAAa,EAAE,OAAgB;IAC9E,wFAAwF;IACxF,8FAA8F;IAC9F,oFAAoF;IACpF,MAAM,IAAI,GAAG,GAAG,WAAW,IAAI,mBAAmB,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IACnF,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAC9C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAA+D,EAC/D,WAAqD;IAErD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACxD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE;QAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACzC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACzC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAA;QAC7B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,CAAC,CAAA;IACD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,OAAO,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;YACvC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACrC,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACpE,CAAC,CAAC,CAAA;QACF,2FAA2F;QAC3F,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,CAAA;QAC9C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAClB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAkB;IACpD,OAAO,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,CAAC,CAAA;AACjF,CAAC;AAED,8EAA8E;AAC9E,8CAA8C;AAC9C,EAAE;AACF,gGAAgG;AAChG,+FAA+F;AAC/F,2FAA2F;AAC3F,4FAA4F;AAC5F,gGAAgG;AAChG,8FAA8F;AAC9F,+FAA+F;AAC/F,gGAAgG;AAChG,4FAA4F;AAC5F,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAA6B,EAC7B,OAAuC;IAEvC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,mBAAmB,CAAC,CAAA;AAC7F,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,2BAA2B,CACzC,YAA6C;IAE7C,QAAQ,YAAY,EAAE,IAAI,EAAE,CAAC;QAC3B,KAAK,YAAY;YACf,OAAO,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;QAC9D,KAAK,gBAAgB;YACnB,OAAO,YAAY,CAAC,WAAW,EAAE,IAAI,EAAE;gBACrC,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;gBACpD,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA;QACrB,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;QACtD;YACE,OAAO,EAAE,CAAA;IACb,CAAC;AACH,CAAC;AA2BD;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAA0B;IAC7D,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK,CAAA;IAC/B,IAAI,CAAC,aAAa,IAAI,aAAa,KAAK,WAAW;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;IACxE,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAE,OAAO,EAAE,KAAK,CAAC,aAAa,EAAE,CAAA;IACzF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC;QAChC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,qBAAqB;YAC7B,aAAa,EAAE,KAAK,CAAC,iBAAiB,CAAC,MAAM,IAAI,YAAY;SAC9D,CAAA;IACH,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;QACrD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,mBAAmB;YAC3B,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnF,CAAA;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;AACrB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/orchestration",
3
- "version": "0.88.0",
3
+ "version": "0.89.0",
4
4
  "description": "Delivery-workflow engine for the Agent Architecture Board (execution, bootstrap, pipelines, board, boardScan, requirements, and composition root).",
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,20 +25,20 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "ai": "^6.0.219",
28
- "@cat-factory/agents": "0.40.9",
29
- "@cat-factory/caching": "0.6.0",
30
- "@cat-factory/contracts": "0.114.0",
31
- "@cat-factory/integrations": "0.76.0",
32
- "@cat-factory/kernel": "0.104.0",
33
- "@cat-factory/prompt-fragments": "0.10.22",
34
- "@cat-factory/sandbox": "0.9.23",
35
- "@cat-factory/spend": "0.11.6",
36
- "@cat-factory/workspaces": "0.12.6"
28
+ "@cat-factory/agents": "0.40.10",
29
+ "@cat-factory/caching": "0.6.1",
30
+ "@cat-factory/contracts": "0.115.0",
31
+ "@cat-factory/integrations": "0.77.0",
32
+ "@cat-factory/kernel": "0.104.1",
33
+ "@cat-factory/prompt-fragments": "0.10.23",
34
+ "@cat-factory/sandbox": "0.9.24",
35
+ "@cat-factory/spend": "0.11.7",
36
+ "@cat-factory/workspaces": "0.12.7"
37
37
  },
38
38
  "devDependencies": {
39
39
  "typescript": "7.0.1-rc",
40
40
  "vitest": "^4.1.9",
41
- "@cat-factory/sandbox-fixtures": "0.7.130"
41
+ "@cat-factory/sandbox-fixtures": "0.7.131"
42
42
  },
43
43
  "scripts": {
44
44
  "build": "tsc -b tsconfig.build.json",