@skaile/workspaces 2.1.0 → 2.3.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.
Files changed (198) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +33 -3
  3. package/dist/{asset-feeds-FBGBQEYD.js → asset-feeds-DKNYRLED.js} +10 -10
  4. package/dist/{asset-feeds-FBGBQEYD.js.map → asset-feeds-DKNYRLED.js.map} +1 -1
  5. package/dist/asset-manager/catalog-deployer.js +5 -5
  6. package/dist/asset-manager/index.js +9 -9
  7. package/dist/asset-manager/installer.js +6 -6
  8. package/dist/bridge/drivers/claude-sdk.js +9 -6
  9. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  10. package/dist/bridge/drivers/codex.js +1 -1
  11. package/dist/bridge/drivers/continue.js +2 -2
  12. package/dist/bridge/drivers/echo.js +1 -1
  13. package/dist/bridge/drivers/gemini.js +3 -3
  14. package/dist/bridge/drivers/goose.js +2 -2
  15. package/dist/bridge/drivers/omp.js +1 -1
  16. package/dist/bridge/drivers/opencode.js +2 -2
  17. package/dist/bridge/drivers/qwen.js +3 -3
  18. package/dist/bridge/index.js +2 -2
  19. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  20. package/dist/{chunk-ZWFLEMI4.js → chunk-3F54MH2T.js} +4 -4
  21. package/dist/{chunk-ZWFLEMI4.js.map → chunk-3F54MH2T.js.map} +1 -1
  22. package/dist/{chunk-RTLQAZAE.js → chunk-63ZPKREA.js} +3 -3
  23. package/dist/{chunk-RTLQAZAE.js.map → chunk-63ZPKREA.js.map} +1 -1
  24. package/dist/{chunk-MLYV6WEM.js → chunk-7IRH7MGV.js} +10 -10
  25. package/dist/{chunk-MLYV6WEM.js.map → chunk-7IRH7MGV.js.map} +1 -1
  26. package/dist/{chunk-Y6VSFX2A.js → chunk-7UZGKVSK.js} +3 -3
  27. package/dist/{chunk-Y6VSFX2A.js.map → chunk-7UZGKVSK.js.map} +1 -1
  28. package/dist/{chunk-XQVP6XWR.js → chunk-BFIK6NPZ.js} +3 -3
  29. package/dist/{chunk-XQVP6XWR.js.map → chunk-BFIK6NPZ.js.map} +1 -1
  30. package/dist/{chunk-L26NGI43.js → chunk-BLWNI5KW.js} +2 -2
  31. package/dist/{chunk-L26NGI43.js.map → chunk-BLWNI5KW.js.map} +1 -1
  32. package/dist/{chunk-CTWE7I7Z.js → chunk-CERGXDGG.js} +4 -4
  33. package/dist/{chunk-CTWE7I7Z.js.map → chunk-CERGXDGG.js.map} +1 -1
  34. package/dist/{chunk-VPXBAEWE.js → chunk-CILACPUC.js} +8 -8
  35. package/dist/{chunk-VPXBAEWE.js.map → chunk-CILACPUC.js.map} +1 -1
  36. package/dist/{chunk-43TAGQ3Z.js → chunk-CXX3UGJP.js} +8 -8
  37. package/dist/{chunk-43TAGQ3Z.js.map → chunk-CXX3UGJP.js.map} +1 -1
  38. package/dist/chunk-DZM33LQO.js +38 -0
  39. package/dist/chunk-DZM33LQO.js.map +1 -0
  40. package/dist/{chunk-PSVF3LDU.js → chunk-ETFETLLB.js} +6 -6
  41. package/dist/{chunk-PSVF3LDU.js.map → chunk-ETFETLLB.js.map} +1 -1
  42. package/dist/{chunk-Y662DNQQ.js → chunk-FB4GPWYC.js} +18 -15
  43. package/dist/chunk-FB4GPWYC.js.map +1 -0
  44. package/dist/{chunk-BTR3ZJ7S.js → chunk-G2ILW47R.js} +4 -4
  45. package/dist/{chunk-BTR3ZJ7S.js.map → chunk-G2ILW47R.js.map} +1 -1
  46. package/dist/{chunk-2BSXXTUP.js → chunk-LD6YGIKZ.js} +105 -16
  47. package/dist/chunk-LD6YGIKZ.js.map +1 -0
  48. package/dist/{chunk-HOL5KD7U.js → chunk-PTS3QN5P.js} +67 -25
  49. package/dist/chunk-PTS3QN5P.js.map +1 -0
  50. package/dist/{chunk-YODP3STD.js → chunk-Q26C5GLO.js} +3 -3
  51. package/dist/{chunk-YODP3STD.js.map → chunk-Q26C5GLO.js.map} +1 -1
  52. package/dist/{chunk-GUKMNUQK.js → chunk-RIEXN7WA.js} +2 -2
  53. package/dist/{chunk-GUKMNUQK.js.map → chunk-RIEXN7WA.js.map} +1 -1
  54. package/dist/chunk-SIF5F5SN.js +86 -0
  55. package/dist/chunk-SIF5F5SN.js.map +1 -0
  56. package/dist/{chunk-RBOPTTTK.js → chunk-TAJBFYCT.js} +32 -17
  57. package/dist/chunk-TAJBFYCT.js.map +1 -0
  58. package/dist/{chunk-MAN7AGQJ.js → chunk-TK66CMXV.js} +21 -6
  59. package/dist/chunk-TK66CMXV.js.map +1 -0
  60. package/dist/{chunk-5BGEYZ7I.js → chunk-UFY2HFLO.js} +3 -3
  61. package/dist/{chunk-5BGEYZ7I.js.map → chunk-UFY2HFLO.js.map} +1 -1
  62. package/dist/{chunk-N6TYW6EB.js → chunk-UNP4M5ZZ.js} +4 -4
  63. package/dist/{chunk-N6TYW6EB.js.map → chunk-UNP4M5ZZ.js.map} +1 -1
  64. package/dist/{chunk-HPGV54O4.js → chunk-UQ3RJKDD.js} +41 -23
  65. package/dist/chunk-UQ3RJKDD.js.map +1 -0
  66. package/dist/{chunk-XSIXGVH6.js → chunk-W3Q37HEF.js} +4 -4
  67. package/dist/{chunk-XSIXGVH6.js.map → chunk-W3Q37HEF.js.map} +1 -1
  68. package/dist/{chunk-WVPL4OGD.js → chunk-WG3L5VHF.js} +2 -2
  69. package/dist/{chunk-WVPL4OGD.js.map → chunk-WG3L5VHF.js.map} +1 -1
  70. package/dist/{chunk-SGLGA2AZ.js → chunk-X6BPVUV2.js} +3 -3
  71. package/dist/{chunk-SGLGA2AZ.js.map → chunk-X6BPVUV2.js.map} +1 -1
  72. package/dist/chunk-ZE2KEPE2.js +1002 -0
  73. package/dist/chunk-ZE2KEPE2.js.map +1 -0
  74. package/dist/{chunk-BHLNQ4L5.js → chunk-ZNIHTT22.js} +3 -3
  75. package/dist/{chunk-BHLNQ4L5.js.map → chunk-ZNIHTT22.js.map} +1 -1
  76. package/dist/{chunk-PYYL5XMA.js → chunk-ZR5Q4KZK.js} +3 -3
  77. package/dist/{chunk-PYYL5XMA.js.map → chunk-ZR5Q4KZK.js.map} +1 -1
  78. package/dist/cli/index.js +53 -50
  79. package/dist/cli/index.js.map +1 -1
  80. package/dist/connectors/config.js +6 -6
  81. package/dist/connectors/index.js +11 -9
  82. package/dist/core/index.js +5 -5
  83. package/dist/core/runtime-assets.js +3 -3
  84. package/dist/core/workspace-config.js +2 -2
  85. package/dist/deploy/index.js +5 -5
  86. package/dist/discovery/index.js +1 -1
  87. package/dist/discovery/src/requires-graph.d.ts +1 -1
  88. package/dist/discovery/src/requires-graph.d.ts.map +1 -1
  89. package/dist/{ensure-sources-AVCVX7CV.js → ensure-sources-R6KW7K3M.js} +12 -12
  90. package/dist/{ensure-sources-AVCVX7CV.js.map → ensure-sources-R6KW7K3M.js.map} +1 -1
  91. package/dist/factory-assets/connectors/box.js +11 -9
  92. package/dist/factory-assets/connectors/deploy.js +11 -9
  93. package/dist/factory-assets/connectors/devserver.js +11 -9
  94. package/dist/factory-assets/connectors/flow/CONNECTOR.md +7 -1
  95. package/dist/factory-assets/connectors/flow/adapter.d.ts +2 -3
  96. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
  97. package/dist/factory-assets/connectors/flow/adapter.js +11 -9
  98. package/dist/factory-assets/connectors/flow/contract/expression.d.ts +46 -0
  99. package/dist/factory-assets/connectors/flow/contract/expression.d.ts.map +1 -0
  100. package/dist/factory-assets/connectors/flow/contract/flow.v2.schema.json +948 -0
  101. package/dist/factory-assets/connectors/flow/contract/hash.d.ts +6 -0
  102. package/dist/factory-assets/connectors/flow/contract/hash.d.ts.map +1 -0
  103. package/dist/factory-assets/connectors/flow/contract/index.d.ts +6 -0
  104. package/dist/factory-assets/connectors/flow/contract/index.d.ts.map +1 -0
  105. package/dist/factory-assets/connectors/flow/contract/json-schema.d.ts +6 -0
  106. package/dist/factory-assets/connectors/flow/contract/json-schema.d.ts.map +1 -0
  107. package/dist/factory-assets/connectors/flow/contract/normalize.d.ts +38 -0
  108. package/dist/factory-assets/connectors/flow/contract/normalize.d.ts.map +1 -0
  109. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +364 -0
  110. package/dist/factory-assets/connectors/flow/contract/schema.d.ts.map +1 -0
  111. package/dist/factory-assets/connectors/flow/contract.d.ts +2 -0
  112. package/dist/factory-assets/connectors/flow/contract.js +5 -0
  113. package/dist/factory-assets/connectors/flow/contract.js.map +1 -0
  114. package/dist/factory-assets/connectors/flow/engine/engine.d.ts +4 -4
  115. package/dist/factory-assets/connectors/flow/engine/engine.d.ts.map +1 -1
  116. package/dist/factory-assets/connectors/flow/engine/flow-kind-provider.d.ts +1 -1
  117. package/dist/factory-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +1 -1
  118. package/dist/factory-assets/connectors/flow/engine/loader.d.ts.map +1 -1
  119. package/dist/factory-assets/connectors/flow/engine/node-shape.d.ts +20 -0
  120. package/dist/factory-assets/connectors/flow/engine/node-shape.d.ts.map +1 -0
  121. package/dist/factory-assets/connectors/flow/engine/types.d.ts +56 -28
  122. package/dist/factory-assets/connectors/flow/engine/types.d.ts.map +1 -1
  123. package/dist/factory-assets/connectors/flow/engine.js +8 -6
  124. package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts +4 -6
  125. package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts.map +1 -1
  126. package/dist/factory-assets/connectors/flow/prompt-fragments.js +2 -1
  127. package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -1
  128. package/dist/factory-assets/connectors/flow/run-flow.js +12 -10
  129. package/dist/factory-assets/connectors/flow.js +11 -9
  130. package/dist/factory-assets/connectors/git.js +11 -9
  131. package/dist/factory-assets/connectors/gmail.js +11 -9
  132. package/dist/factory-assets/connectors/googledrive.js +11 -9
  133. package/dist/factory-assets/connectors/local.js +11 -9
  134. package/dist/factory-assets/connectors/mattermost.js +11 -9
  135. package/dist/factory-assets/connectors/memory.js +11 -9
  136. package/dist/factory-assets/connectors/minio.js +11 -9
  137. package/dist/factory-assets/connectors/postgres.js +11 -9
  138. package/dist/factory-assets/connectors/s3.js +11 -9
  139. package/dist/factory-assets/connectors/sharepoint.js +11 -9
  140. package/dist/factory-assets/connectors/sqlite.js +11 -9
  141. package/dist/factory-assets/connectors/static-server.js +11 -9
  142. package/dist/factory-assets/connectors/tunnel.js +11 -9
  143. package/dist/factory-assets/connectors/webdav.js +11 -9
  144. package/dist/factory-assets/connectors/xstate-store.js +11 -9
  145. package/dist/factory-assets/connectors/xstate.js +11 -9
  146. package/dist/{flows-CXVFGR27.js → flows-F3CJNMK6.js} +8 -8
  147. package/dist/{flows-CXVFGR27.js.map → flows-F3CJNMK6.js.map} +1 -1
  148. package/dist/{helpers-M5SXB4LL.js → helpers-KPOLCGKX.js} +12 -12
  149. package/dist/{helpers-M5SXB4LL.js.map → helpers-KPOLCGKX.js.map} +1 -1
  150. package/dist/library/index.js +7 -7
  151. package/dist/library/install.js +5 -5
  152. package/dist/{library-publish-HVIIQMI6.js → library-publish-ZAPZS64O.js} +18 -16
  153. package/dist/library-publish-ZAPZS64O.js.map +1 -0
  154. package/dist/{open-library-EJQISBWV.js → open-library-I4F2UNOY.js} +16 -14
  155. package/dist/{open-library-EJQISBWV.js.map → open-library-I4F2UNOY.js.map} +1 -1
  156. package/dist/{paths-2HMHL25W.js → paths-KBACHM5B.js} +10 -10
  157. package/dist/{paths-2HMHL25W.js.map → paths-KBACHM5B.js.map} +1 -1
  158. package/dist/{plugin-store-TLBQ5XRS.js → plugin-store-CYSNVZIX.js} +7 -7
  159. package/dist/{plugin-store-TLBQ5XRS.js.map → plugin-store-CYSNVZIX.js.map} +1 -1
  160. package/dist/{project-M2COJFPZ.js → project-SIHZBTGB.js} +13 -13
  161. package/dist/{project-M2COJFPZ.js.map → project-SIHZBTGB.js.map} +1 -1
  162. package/dist/resolver/index.js +5 -5
  163. package/dist/runner/index.js +17 -14
  164. package/dist/runner/src/serve.d.ts.map +1 -1
  165. package/dist/sdk/asset-manager.js +9 -9
  166. package/dist/sdk/bridge.js +2 -2
  167. package/dist/sdk/core.js +5 -5
  168. package/dist/sdk/flow.js +8 -6
  169. package/dist/sdk/index.js +17 -14
  170. package/dist/sdk/index.js.map +1 -1
  171. package/dist/sdk/resolver.js +5 -5
  172. package/dist/sdk/runner.js +17 -14
  173. package/dist/sdk/transport/ws.js +1 -1
  174. package/dist/sdk/transport.js +1 -1
  175. package/dist/{setup-GWXEG3G2.js → setup-KMBXMV25.js} +9 -9
  176. package/dist/{setup-GWXEG3G2.js.map → setup-KMBXMV25.js.map} +1 -1
  177. package/dist/{skills-YTMGG23D.js → skills-LHS4TOKK.js} +7 -7
  178. package/dist/{skills-YTMGG23D.js.map → skills-LHS4TOKK.js.map} +1 -1
  179. package/dist/{source-WMXH2OBW.js → source-X226ZJPR.js} +17 -15
  180. package/dist/{source-WMXH2OBW.js.map → source-X226ZJPR.js.map} +1 -1
  181. package/dist/{source-manifest-publish-MTHUGBAY.js → source-manifest-publish-N2QVUR5U.js} +19 -17
  182. package/dist/source-manifest-publish-N2QVUR5U.js.map +1 -0
  183. package/dist/transport/index.js +1 -1
  184. package/dist/transport/ws.js +1 -1
  185. package/dist/tui/index.js +17 -14
  186. package/dist/tui/index.js.map +1 -1
  187. package/dist/workspace-plugin/adapters/mcp.js +6 -6
  188. package/dist/workspace-plugin/adapters/omp.js +7 -7
  189. package/dist/workspace-plugin/index.js +1 -1
  190. package/package.json +18 -1
  191. package/dist/chunk-2BSXXTUP.js.map +0 -1
  192. package/dist/chunk-HOL5KD7U.js.map +0 -1
  193. package/dist/chunk-HPGV54O4.js.map +0 -1
  194. package/dist/chunk-MAN7AGQJ.js.map +0 -1
  195. package/dist/chunk-RBOPTTTK.js.map +0 -1
  196. package/dist/chunk-Y662DNQQ.js.map +0 -1
  197. package/dist/library-publish-HVIIQMI6.js.map +0 -1
  198. package/dist/source-manifest-publish-MTHUGBAY.js.map +0 -1
@@ -1,13 +1,15 @@
1
1
  import { initTelemetry } from './chunk-4R6DROGN.js';
2
2
  import { parseSkillFrontmatter, validateFlowVersions } from './chunk-CZZRDYT4.js';
3
- import { FlowAdapter } from './chunk-HOL5KD7U.js';
4
- import { loadFlow } from './chunk-HPGV54O4.js';
5
- import { buildOrchestratorPrompt, renderStimulusPrompt } from './chunk-Y662DNQQ.js';
6
- import { resolveSettings } from './chunk-RTLQAZAE.js';
7
- import { resolveAgentDir, resolveSkWorkspaceConfig } from './chunk-YODP3STD.js';
3
+ import { FlowAdapter } from './chunk-PTS3QN5P.js';
4
+ import { loadFlow } from './chunk-UQ3RJKDD.js';
5
+ import { buildOrchestratorPrompt, renderStimulusPrompt } from './chunk-FB4GPWYC.js';
6
+ import { nodeAssets } from './chunk-DZM33LQO.js';
7
+ import { resolveSettings } from './chunk-63ZPKREA.js';
8
+ import { resolveAgentDir, resolveSkWorkspaceConfig } from './chunk-Q26C5GLO.js';
8
9
  import { createLogger } from './chunk-7GOCNYUV.js';
9
10
  import fs from 'fs';
10
11
  import path from 'path';
12
+ import * as z from 'zod';
11
13
 
12
14
  var _runnerModule;
13
15
  async function loadRunnerModule() {
@@ -16,12 +18,29 @@ async function loadRunnerModule() {
16
18
  return _runnerModule;
17
19
  }
18
20
  var DEFAULT_SESSION_TIMEOUT_MS = 4 * 60 * 60 * 1e3;
21
+ var FLOW_AGENT_OPERATION_NAMES = /* @__PURE__ */ new Set([
22
+ "get_available",
23
+ "get_state",
24
+ "get_globals",
25
+ "build_handoff",
26
+ "validate_node",
27
+ "start_node",
28
+ "request_approval",
29
+ "request_input",
30
+ "complete_node",
31
+ "skip_node",
32
+ "fail_node"
33
+ ]);
19
34
  async function runFlow(opts) {
20
35
  const runner = await loadRunnerModule();
21
36
  const {
22
37
  bootstrapRunnerLogStore,
38
+ bootstrapCapabilityRegistry,
39
+ CapabilityRegistry,
23
40
  createAgentSession,
24
41
  createSessionStimulusBus,
42
+ defineCapability,
43
+ registerCompositionCapabilities,
25
44
  resolveDriverPaths,
26
45
  newSession,
27
46
  saveSession,
@@ -57,6 +76,14 @@ async function runFlow(opts) {
57
76
  instance: session.runId
58
77
  });
59
78
  const log = (line) => flowLog.info(line);
79
+ const capabilityRegistry = new CapabilityRegistry();
80
+ bootstrapCapabilityRegistry(capabilityRegistry);
81
+ const capabilityHooks = {
82
+ sessionId: session.runId,
83
+ composeTools: () => capabilityRegistry.composeLLMTools(),
84
+ resolve: (name) => capabilityRegistry.list().find((cap) => cap.name === name) ?? null,
85
+ invoke: (name, input) => capabilityRegistry.invoke(name, input, { sessionId: session.runId })
86
+ };
60
87
  try {
61
88
  if (opts.dryRun) {
62
89
  const adapter = new FlowAdapter();
@@ -102,8 +129,16 @@ async function runFlow(opts) {
102
129
  onLog: log,
103
130
  telemetry,
104
131
  trace: flowTrace,
105
- wsConfig
132
+ wsConfig,
133
+ capabilities: capabilityHooks,
134
+ capabilityRegistry
106
135
  });
136
+ if (agentSession.composition?.discoverableEntries.length) {
137
+ registerCompositionCapabilities(
138
+ capabilityRegistry,
139
+ agentSession.composition.discoverableEntries
140
+ );
141
+ }
107
142
  const { driver } = agentSession;
108
143
  const updatedSession = { ...session };
109
144
  driver.on("agent-event", () => {
@@ -168,6 +203,41 @@ async function runFlow(opts) {
168
203
  );
169
204
  flowAdapterRef = flowAdapter;
170
205
  flowHandleRef = flowHandle;
206
+ for (const operation of flowAdapter.tools.describeOperations(flowHandle).filter(({ name }) => FLOW_AGENT_OPERATION_NAMES.has(name))) {
207
+ const shape = {};
208
+ for (const arg of operation.args) {
209
+ let schema;
210
+ switch (arg.type) {
211
+ case "boolean":
212
+ schema = z.boolean();
213
+ break;
214
+ case "number":
215
+ schema = z.number();
216
+ break;
217
+ case "json":
218
+ schema = z.union([z.string(), z.record(z.string(), z.unknown()), z.array(z.unknown())]);
219
+ break;
220
+ default:
221
+ schema = z.string();
222
+ }
223
+ shape[arg.name] = arg.required ? schema : schema.optional();
224
+ }
225
+ capabilityRegistry.register(
226
+ defineCapability({
227
+ name: operation.name,
228
+ displayName: operation.name,
229
+ description: operation.description,
230
+ input: z.object(shape),
231
+ side: "agent",
232
+ origin: { kind: "flow", flowId: flow.id },
233
+ scope: "session",
234
+ audience: ["llm"],
235
+ kind: operation.accessLevel === "read" ? "query" : "effect",
236
+ handler: async (args) => flowAdapter.executeOp(flowHandle, operation.name, args)
237
+ }),
238
+ "agent"
239
+ );
240
+ }
171
241
  flowAdapter.onStateChange(flowHandle, (state) => {
172
242
  opts.onEvent?.({
173
243
  type: "state_changed",
@@ -268,13 +338,37 @@ async function resumeFlow(opts) {
268
338
  }
269
339
  }
270
340
  async function validatePinnedVersions(flow, projectDir, log) {
271
- const pinnedNodes = flow.nodes.filter((n) => n.type === "skill" && n.data?.version);
341
+ const pinnedNodes = flow.nodes.flatMap((node) => {
342
+ const fromAssets = nodeAssets(node).flatMap((asset) => {
343
+ if (!asset.startsWith("skill:")) return [];
344
+ const hashIndex = asset.lastIndexOf("#");
345
+ if (hashIndex <= "skill:".length || hashIndex === asset.length - 1) return [];
346
+ const identity = asset.slice("skill:".length, hashIndex);
347
+ const skillId = identity.slice(identity.lastIndexOf("/") + 1);
348
+ return [
349
+ {
350
+ nodeId: node.id,
351
+ skillId,
352
+ requestedVersion: asset.slice(hashIndex + 1)
353
+ }
354
+ ];
355
+ });
356
+ if (fromAssets.length > 0) return fromAssets;
357
+ if (node.type !== "skill" || !node.data?.version) return [];
358
+ return [
359
+ {
360
+ nodeId: node.id,
361
+ skillId: node.data.skill ?? node.id,
362
+ requestedVersion: node.data.version
363
+ }
364
+ ];
365
+ });
272
366
  if (pinnedNodes.length === 0) return;
273
367
  const skillVersions = /* @__PURE__ */ new Map();
274
368
  const aiResourcesDir = findAiResourcesDir(projectDir);
275
369
  if (aiResourcesDir) {
276
370
  for (const node of pinnedNodes) {
277
- const skillId = node.data?.skill ?? node.id;
371
+ const skillId = node.skillId;
278
372
  if (skillVersions.has(skillId)) continue;
279
373
  const skillPath = findSkillMd(aiResourcesDir, skillId);
280
374
  if (skillPath) {
@@ -284,12 +378,7 @@ async function validatePinnedVersions(flow, projectDir, log) {
284
378
  }
285
379
  }
286
380
  }
287
- const versionNodes = pinnedNodes.map((n) => ({
288
- nodeId: n.id,
289
- skillId: n.data?.skill ?? n.id,
290
- requestedVersion: n.data?.version
291
- }));
292
- const checks = validateFlowVersions(versionNodes, skillVersions);
381
+ const checks = validateFlowVersions(pinnedNodes, skillVersions);
293
382
  const failures = checks.filter((c) => !c.satisfied);
294
383
  if (failures.length > 0) {
295
384
  const lines = failures.map(
@@ -389,5 +478,5 @@ function walkForSkill(dir, skillId) {
389
478
  }
390
479
 
391
480
  export { resumeFlow, runFlow };
392
- //# sourceMappingURL=chunk-2BSXXTUP.js.map
393
- //# sourceMappingURL=chunk-2BSXXTUP.js.map
481
+ //# sourceMappingURL=chunk-LD6YGIKZ.js.map
482
+ //# sourceMappingURL=chunk-LD6YGIKZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../factory-assets/connectors/flow/run-flow.ts"],"names":["c"],"mappings":"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","file":"chunk-LD6YGIKZ.js","sourcesContent":["/**\n * runFlow / resumeFlow — CLI entry helpers for the flow connector.\n *\n * Moved from `runner/src/runner.ts` to `factory-assets/connectors/flow/run-flow.ts`\n * in Phase 3 of the flow-connector extraction (2026-05-08). Behaviour is\n * byte-identical to the previous runner-side implementation; only the log\n * source changes from `runner:flow:<runId>` to `flow-connector:run:<runId>`.\n *\n * The runner re-exports these symbols with a deprecation warning for one\n * release. CLI consumers should switch to\n * `import { runFlow, resumeFlow } from \"@skaile/workspaces/factory-assets/connectors/flow/run-flow\"`.\n *\n * Internal runner helpers (FlowOrchestrator, bootstrapRunnerLogStore,\n * createAgentSession, resolveDriverPaths, session helpers) are loaded lazily\n * via dynamic `await import(\"@skaile/workspaces/runner\")` inside\n * `loadRunnerModule()` below. The lazy load avoids a static package-level\n * cycle (runner → connectors → factory-assets → runner) — the cycle exists at\n * the workspace level but never resolves at module-load time because\n * factory-assets only ever calls `import` from inside an async function body.\n * The string-literal specifier preserves `bun --compile` and tsup static\n * analysis.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { AgentEvent } from \"@skaile/workspaces/bridge\";\nimport {\n resolveAgentDir,\n resolveSettings,\n resolveSkWorkspaceConfig,\n} from \"@skaile/workspaces/core\";\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\nimport { parseSkillFrontmatter, validateFlowVersions } from \"@skaile/workspaces/resolver\";\nimport { initTelemetry } from \"@skaile/workspaces/telemetry\";\nimport type { FlowExecution } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { FlowAdapter } from \"./adapter.js\";\nimport { loadFlow } from \"./engine/index.js\";\nimport { nodeAssets } from \"./engine/node-shape.js\";\nimport {\n buildOrchestratorPrompt,\n renderStimulusPrompt,\n type TurnStimulus,\n} from \"./prompt-fragments.js\";\n\n/**\n * Lazy `import(\"@skaile/workspaces/runner\")` accessor. Cached on first call so\n * subsequent `runFlow` invocations don't re-evaluate the runner module.\n *\n * Dynamic ESM import is used (not `require`) so vitest and other ESM\n * bundlers honour their alias resolution — `require` would side-step the\n * configured aliases and pick up two distinct module instances when run\n * under vitest. The string-literal specifier ensures bun --compile keeps\n * the dependency (per the static-import-or-die rule in\n * connectors/CLAUDE.md).\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet _runnerModule: any | undefined;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function loadRunnerModule(): Promise<any> {\n if (_runnerModule) return _runnerModule;\n _runnerModule = await import(\"@skaile/workspaces/runner\");\n return _runnerModule;\n}\n\n/** Type-only re-export of SessionState so the runner tombstone shim still works. */\nexport type SessionState = import(\"@skaile/workspaces/runner\").SessionState;\n\n/** Maximum agent session duration (4 hours). Configurable via {@link RunOptions.sessionTimeoutMs}. */\nconst DEFAULT_SESSION_TIMEOUT_MS = 4 * 60 * 60 * 1000; // 4 hours\n\nconst FLOW_AGENT_OPERATION_NAMES = new Set([\n \"get_available\",\n \"get_state\",\n \"get_globals\",\n \"build_handoff\",\n \"validate_node\",\n \"start_node\",\n \"request_approval\",\n \"request_input\",\n \"complete_node\",\n \"skip_node\",\n \"fail_node\",\n]);\n\n/**\n * Options for {@link runFlow}.\n *\n * Wraps `FlowOrchestrator` with autonomous mode turned on by default so\n * interactive approval/input gates don't block a terminal run.\n *\n * @docLink packages/factory-assets/flow#run-flow\n */\nexport interface RunOptions {\n /** The working directory for the project being orchestrated. */\n projectDir: string;\n /** Absolute path to the `.flow.yaml` or `.flow.json` definition file. */\n flowPath: string;\n /**\n * Directory containing `agent.yaml`, `SOUL.md`, `RULES.md`, `knowledge/`.\n * Resolved from `skaile.yaml` via `resolveAgentDir` when absent.\n */\n agentDir?: string;\n /**\n * Agent driver backend. Defaults to `settings.driver` (`\"omp\"` or `\"claude-sdk\"`).\n */\n driver?: string;\n /**\n * LLM provider override (e.g. `\"anthropic\"`, `\"openrouter\"`).\n * Falls back to `settings.provider` when absent.\n */\n provider?: string;\n /**\n * Model name override. Falls back to `settings.model` when absent.\n */\n model?: string;\n /**\n * Path to a specific `settings.json` to load instead of the default\n * layered resolution chain (project → parent → global → built-in defaults).\n */\n settingsFile?: string;\n /**\n * When `true`, prints the initial flow state without starting the agent\n * and returns immediately.\n */\n dryRun?: boolean;\n /**\n * Per-session timeout in milliseconds. Defaults to\n * {@link DEFAULT_SESSION_TIMEOUT_MS} (4 hours).\n */\n sessionTimeoutMs?: number;\n /** Optional human-readable label shown in the session list. */\n sessionLabel?: string;\n /** Autonomous mode for CLI runs — defaults to true so interactive approval gates are skipped. */\n autonomousMode?: boolean;\n /**\n * Called for each {@link AgentEvent} emitted during the run\n * (e.g. `text`, `tool_call`, `state_changed`).\n */\n onEvent?: (event: AgentEvent) => void;\n /**\n * Called for each diagnostic log line. Defaults to `process.stdout`.\n */\n onLog?: (line: string) => void;\n}\n\n/**\n * Options for resuming an existing CLI session.\n *\n * Reconnects the driver's conversation thread (conversation history is\n * preserved via the stored `driverSessionId`) but restarts flow execution\n * from scratch — flow state is not persisted in CLI mode. For governed,\n * resumable flow runs use a host that persists flow state (e.g. the Skaile\n * platform).\n *\n * @docLink packages/factory-assets/flow#resume-flow\n */\nexport interface ResumeOptions {\n /** The working directory for the project being orchestrated. */\n projectDir: string;\n /**\n * Specific run ID to resume. When absent, the current session pointer\n * at `<projectDir>/.skaile/current` is used.\n */\n sessionId?: string;\n /**\n * Agent definition directory override. Defaults to the directory stored\n * in the session file.\n */\n agentDir?: string;\n /**\n * When `true`, prints the initial flow state without starting the agent\n * and returns immediately.\n */\n dryRun?: boolean;\n /**\n * Per-session timeout in milliseconds. Defaults to\n * {@link DEFAULT_SESSION_TIMEOUT_MS} (4 hours).\n */\n sessionTimeoutMs?: number;\n /**\n * Called for each {@link AgentEvent} emitted during the run.\n */\n onEvent?: RunOptions[\"onEvent\"];\n /**\n * Called for each diagnostic log line. Defaults to `process.stdout`.\n */\n onLog?: RunOptions[\"onLog\"];\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Start a new flow session from the CLI.\n *\n * Wraps `FlowOrchestrator` with autonomous mode turned on by default so\n * interactive approval/input gates don't block a terminal run. The\n * runner remains idle between turns — for the CLI use case, a single\n * turn should carry the flow to completion in autonomous mode. Non-CLI\n * hosts (Skaile platform, Pichi) use the orchestrator directly via the\n * serve command surface and drive gates through user actions.\n *\n * @docLink packages/factory-assets/flow#run-flow\n */\nexport async function runFlow(opts: RunOptions): Promise<void> {\n const runner = await loadRunnerModule();\n const {\n bootstrapRunnerLogStore,\n bootstrapCapabilityRegistry,\n CapabilityRegistry,\n createAgentSession,\n createSessionStimulusBus,\n defineCapability,\n registerCompositionCapabilities,\n resolveDriverPaths,\n newSession,\n saveSession,\n touchSession,\n } = runner;\n\n const flow = loadFlow(opts.flowPath);\n const agentDir = opts.agentDir ?? resolveAgentDir(opts.projectDir);\n const settings = await resolveSettings(opts.projectDir, {\n driver: opts.driver,\n provider: opts.provider,\n model: opts.model,\n });\n\n const session = newSession({\n flowId: flow.id,\n projectDir: opts.projectDir,\n agentDir,\n driver: settings.driver ?? \"omp\",\n provider: settings.provider,\n model: settings.model,\n label: opts.sessionLabel,\n });\n\n await saveSession(opts.projectDir, session);\n\n // Bootstrap structured logging — registers a process-singleton LogStore.\n // OnLogBridgeSink mirrors entries to opts.onLog when caller provides one,\n // preserving back-compat with CLI hosts that consume plain text lines.\n const wsConfigEarly = resolveSkWorkspaceConfig(opts.projectDir);\n const { dispose: disposeLogStore } = bootstrapRunnerLogStore({\n sessionId: session.runId,\n projectDir: opts.projectDir,\n yamlBlock: (wsConfigEarly as { logging?: unknown }).logging,\n onLog: opts.onLog,\n });\n const flowLog = createLogger({\n kind: \"flow-connector\",\n subkind: \"run\",\n instance: session.runId,\n });\n const log = (line: string) => flowLog.info(line);\n const capabilityRegistry = new CapabilityRegistry();\n bootstrapCapabilityRegistry(capabilityRegistry);\n const capabilityHooks = {\n sessionId: session.runId,\n composeTools: () => capabilityRegistry.composeLLMTools(),\n resolve: (name: string) =>\n capabilityRegistry.list().find((cap: { name: string }) => cap.name === name) ?? null,\n invoke: (name: string, input: unknown) =>\n capabilityRegistry.invoke(name, input, { sessionId: session.runId }),\n };\n\n try {\n // ── Dry run ────────────────────────────────────────────────────────────\n if (opts.dryRun) {\n const adapter = new FlowAdapter();\n const handle = await adapter.connect(\n {\n id: \"flow\",\n driver: \"flow\",\n access: \"read-only\" as const,\n options: { flow, seed: { runId: session.runId, startedBy: \"cli\" } },\n },\n {}, // flow needs no connect context\n );\n const state = adapter.getExecution(handle);\n const available = Object.values(state.nodes)\n .filter((n) => n.status === \"available\")\n .map((n) => n.id);\n log(`[dry-run] Flow: ${flow.name} (${flow.id})`);\n log(`[dry-run] Available: ${available.join(\", \") || \"(none)\"}`);\n await adapter.disconnect(handle);\n return;\n }\n\n await validatePinnedVersions(flow, opts.projectDir, log);\n\n // ── Telemetry initialization ────────────────────────────────────────────\n const wsConfig = wsConfigEarly;\n const telemetry = await initTelemetry(wsConfig.telemetry);\n const flowTrace = telemetry.startTrace({\n name: `flow:${flow.id}`,\n kind: \"flow_run\",\n attributes: {\n \"skaile.flow.id\": flow.id,\n \"skaile.flow.run_id\": session.runId,\n },\n });\n\n // ── Agent session setup ─────────────────────────────────────────────────\n const driverPaths = resolveDriverPaths(settings);\n const agentSession = await createAgentSession({\n projectDir: opts.projectDir,\n agentDir: session.agentDir,\n driver: session.driver,\n model: session.model,\n provider: session.provider,\n resumeSessionId: session.driverSessionId,\n projectClaudeMd: path.join(opts.projectDir, \"CLAUDE.md\"),\n promptsDir: path.join(opts.projectDir, driverPaths.promptsDir),\n sessionId: session.runId,\n onLog: log,\n telemetry,\n trace: flowTrace,\n wsConfig,\n capabilities: capabilityHooks,\n capabilityRegistry,\n });\n if (agentSession.composition?.discoverableEntries.length) {\n registerCompositionCapabilities(\n capabilityRegistry,\n agentSession.composition.discoverableEntries,\n );\n }\n const { driver } = agentSession;\n const updatedSession = { ...session };\n\n // Track driver session ID so future resumes can reconnect the SDK thread.\n driver.on(\"agent-event\", () => {\n const runtimeSessionId = driver.runtimeSessionId;\n if (!runtimeSessionId || runtimeSessionId === updatedSession.driverSessionId) return;\n updatedSession.driverSessionId = runtimeSessionId;\n void saveSession(opts.projectDir, updatedSession).catch(() => {});\n });\n\n // ── FlowAdapter + stimulus bus ─────────────────────────────────────────\n //\n // Phase 4 of the flow-connector extraction: SessionStimulusBus is the sole\n // turn driver. The legacy FlowOrchestrator + onStateChange subscription\n // are gone — every turn is initiated either by the bus (after an adapter\n // mutation observed via `useBusForStimulus: true`) or by an explicit\n // `bus.signal()` call from this function (the initial flow_started turn).\n //\n // The bus's `driveTurn` callback receives the stimulus paragraph the\n // adapter rendered (not the full orchestrator prompt). It rebuilds the\n // five-section orchestrator prompt around that fragment using\n // `buildOrchestratorPrompt` so the agent sees the same flow context the\n // legacy orchestrator produced.\n const flowConnectorId = \"flow\";\n const turnTimeoutMs = opts.sessionTimeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS;\n\n // Forward declaration so `driveTurn` can read the live execution\n // snapshot. Assigned just below, before the bus can fire.\n let flowAdapterRef: FlowAdapter | null = null;\n let flowHandleRef: import(\"@skaile/workspaces/connectors\").ConnectorHandle | null = null;\n\n const stimulusBus = createSessionStimulusBus({\n driveTurn: async (\n promptFragment: string,\n metas: Array<Record<string, unknown>>,\n ): Promise<void> => {\n // The adapter signal carries `meta.kind` per stimulus. Use that to\n // reconstruct the typed `TurnStimulus`; for compound batches, fall\n // back to `state_changed` (the union element that means \"look at\n // current state and continue\").\n const lastKind = metas[metas.length - 1]?.kind;\n let stimulus: TurnStimulus;\n if (lastKind === \"flow_started\") {\n stimulus = { kind: \"flow_started\" };\n } else if (\n lastKind === \"user_message\" &&\n typeof metas[metas.length - 1]?.text === \"string\"\n ) {\n const meta = metas[metas.length - 1] as Record<string, unknown>;\n stimulus = {\n kind: \"user_message\",\n text: String(meta.text ?? \"\"),\n senderId: String(meta.senderId ?? \"user\"),\n };\n } else {\n stimulus = { kind: \"state_changed\" };\n }\n // The fragment passed in by the bus is the adapter's\n // `renderStimulusPrompt(stim)` joined across coalesced signals.\n // For the initial / explicit-stimulus path, we build the full prompt\n // around the fragment via `buildOrchestratorPrompt`. The fragment is\n // discarded in favour of the structured stimulus to keep the prompt\n // shape stable; the structured form already contains everything the\n // fragment encoded.\n void promptFragment;\n if (!flowAdapterRef || !flowHandleRef) {\n throw new Error(\"driveTurn fired before FlowAdapter was wired\");\n }\n const fullPrompt = buildOrchestratorPrompt(\n flow,\n flowAdapterRef.getExecution(flowHandleRef),\n stimulus,\n );\n await awaitAgentEnd(driver, fullPrompt, opts.onEvent, turnTimeoutMs);\n },\n log: flowLog,\n });\n\n const flowAdapter = new FlowAdapter();\n const flowHandle = await flowAdapter.connect(\n {\n id: flowConnectorId,\n driver: \"flow\",\n access: \"read-write\" as const,\n options: {\n flow,\n seed: {\n runId: session.runId,\n startedBy: \"cli\",\n autonomousMode: opts.autonomousMode ?? true,\n },\n stimulusBus,\n useBusForStimulus: true,\n },\n },\n {}, // flow needs no connect context\n );\n flowAdapterRef = flowAdapter;\n flowHandleRef = flowHandle;\n\n // Flow operations retain the connector's published bare protocol names;\n // this is the intentional exception to generic capability namespaces.\n for (const operation of flowAdapter.tools\n .describeOperations(flowHandle)\n .filter(({ name }) => FLOW_AGENT_OPERATION_NAMES.has(name))) {\n const shape: Record<string, z.ZodType> = {};\n for (const arg of operation.args) {\n let schema: z.ZodType;\n switch (arg.type) {\n case \"boolean\":\n schema = z.boolean();\n break;\n case \"number\":\n schema = z.number();\n break;\n case \"json\":\n schema = z.union([z.string(), z.record(z.string(), z.unknown()), z.array(z.unknown())]);\n break;\n default:\n schema = z.string();\n }\n shape[arg.name] = arg.required ? schema : schema.optional();\n }\n capabilityRegistry.register(\n defineCapability({\n name: operation.name,\n displayName: operation.name,\n description: operation.description,\n input: z.object(shape),\n side: \"agent\",\n origin: { kind: \"flow\", flowId: flow.id },\n scope: \"session\",\n audience: [\"llm\"],\n kind: operation.accessLevel === \"read\" ? \"query\" : \"effect\",\n handler: async (args: Record<string, unknown>) =>\n flowAdapter.executeOp(flowHandle, operation.name, args),\n }),\n \"agent\",\n );\n }\n\n // Forward state_changed events to the caller. The bus computes a\n // turn-kicking stimulus on each adapter mutation; the host-facing\n // event stream still observes the full snapshot via onChange.\n flowAdapter.onStateChange(flowHandle, (state: FlowExecution) => {\n opts.onEvent?.({\n type: \"state_changed\",\n store: `flow:${state.runId}`,\n state: state as unknown as Record<string, unknown>,\n } as unknown as AgentEvent);\n });\n\n // ── Execute ────────────────────────────────────────────────────────────\n flowLog.info(\"starting flow\", {\n flowId: flow.id,\n flowName: flow.name,\n runId: session.runId,\n });\n\n try {\n // Kick the initial flow_started turn explicitly. Subsequent turns are\n // driven by the bus signaling whenever the adapter mutates.\n const initialStimulus: TurnStimulus = { kind: \"flow_started\" };\n await stimulusBus.signal(flowConnectorId, {\n promptFragment: renderStimulusPrompt(initialStimulus),\n meta: { kind: initialStimulus.kind },\n });\n\n const finalState = flowAdapter.getExecution(flowHandle);\n if (finalState.done) {\n flowLog.info(\"flow complete\", { flowId: flow.id, flowName: flow.name });\n } else if (finalState.status === \"failed\") {\n flowLog.error(\"flow failed\", undefined, { flowId: flow.id, flowName: flow.name });\n } else {\n flowLog.warn(\"flow paused after one turn\", {\n flowId: flow.id,\n status: finalState.status,\n note: \"CLI mode does not interact with approval/input gates\",\n });\n }\n } finally {\n driver.kill();\n const lastState = flowAdapter.getExecution(flowHandle);\n await saveSession(\n opts.projectDir,\n touchSession({\n ...updatedSession,\n driverSessionId: driver.runtimeSessionId ?? updatedSession.driverSessionId,\n status: lastState.status === \"complete\" ? \"complete\" : \"paused\",\n }),\n ).catch(() => {});\n await flowAdapter.disconnect(flowHandle).catch(() => {});\n await agentSession.dispose();\n telemetry.endTrace(flowTrace, {\n status: flowAdapter.getExecution(flowHandle).status === \"complete\" ? \"ok\" : \"error\",\n });\n await telemetry.flush().catch(() => {});\n }\n } finally {\n disposeLogStore();\n }\n}\n\n/**\n * Resume an existing session from the CLI.\n *\n * With the Phase 2 turn-based model, flow state is NOT persisted to\n * local session files — only the driver session ID is kept. The CLI\n * can resume the agent's conversation thread, but the flow execution\n * itself starts from scratch because the runner has no durable store\n * for per-run state.\n *\n * For a governed, resumable flow run, use a host that persists flow\n * state (e.g. the Skaile platform). CLI resume is retained as a\n * driver-level convenience only: we load the session, restart the\n * flow, and the SDK will reconnect to the prior conversation thread.\n *\n * @docLink packages/factory-assets/flow#resume-flow\n */\nexport async function resumeFlow(opts: ResumeOptions): Promise<void> {\n const runner = await loadRunnerModule();\n const { loadSession, loadSessionById, bootstrapRunnerLogStore } = runner;\n\n const session = opts.sessionId\n ? await loadSessionById(opts.projectDir, opts.sessionId)\n : await loadSession(opts.projectDir);\n\n if (!session) {\n const hint = opts.sessionId\n ? `session ${opts.sessionId}`\n : `current session in ${opts.projectDir}/.skaile`;\n throw new Error(`No session found (${hint}) — run 'start' first`);\n }\n\n const flowPath = resolveFlowPath(session.flowId, opts.projectDir);\n\n // Bootstrap a transient logger for the resume diagnostics. The inner\n // runFlow() call will register its own LogStore for the new run. Keep\n // OnLogBridgeSink wiring so callers passing onLog still see this line.\n const wsConfigEarly = resolveSkWorkspaceConfig(opts.projectDir);\n const { dispose: disposeLogStore } = bootstrapRunnerLogStore({\n sessionId: session.runId,\n projectDir: opts.projectDir,\n yamlBlock: (wsConfigEarly as { logging?: unknown }).logging,\n onLog: opts.onLog,\n });\n const flowLog = createLogger({\n kind: \"flow-connector\",\n subkind: \"run\",\n instance: session.runId,\n });\n flowLog.info(\"resuming session\", {\n runId: session.runId,\n flowId: session.flowId,\n note: \"CLI mode does not persist flow state — flow restarts from scratch; driver thread resumes\",\n });\n\n try {\n await runFlow({\n projectDir: opts.projectDir,\n flowPath,\n agentDir: opts.agentDir ?? session.agentDir,\n driver: session.driver,\n model: session.model,\n provider: session.provider,\n sessionLabel: session.label,\n dryRun: opts.dryRun,\n sessionTimeoutMs: opts.sessionTimeoutMs,\n onEvent: opts.onEvent,\n onLog: opts.onLog,\n });\n } finally {\n disposeLogStore();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nasync function validatePinnedVersions(\n flow: Awaited<ReturnType<typeof loadFlow>>,\n projectDir: string,\n log: (line: string) => void,\n): Promise<void> {\n const pinnedNodes = flow.nodes.flatMap((node) => {\n const fromAssets = nodeAssets(node).flatMap((asset) => {\n if (!asset.startsWith(\"skill:\")) return [];\n const hashIndex = asset.lastIndexOf(\"#\");\n if (hashIndex <= \"skill:\".length || hashIndex === asset.length - 1) return [];\n const identity = asset.slice(\"skill:\".length, hashIndex);\n const skillId = identity.slice(identity.lastIndexOf(\"/\") + 1);\n return [\n {\n nodeId: node.id,\n skillId,\n requestedVersion: asset.slice(hashIndex + 1),\n },\n ];\n });\n if (fromAssets.length > 0) return fromAssets;\n if (node.type !== \"skill\" || !node.data?.version) return [];\n return [\n {\n nodeId: node.id,\n skillId: node.data.skill ?? node.id,\n requestedVersion: node.data.version,\n },\n ];\n });\n if (pinnedNodes.length === 0) return;\n\n const skillVersions = new Map<string, string>();\n const aiResourcesDir = findAiResourcesDir(projectDir);\n if (aiResourcesDir) {\n for (const node of pinnedNodes) {\n const skillId = node.skillId;\n if (skillVersions.has(skillId)) continue;\n const skillPath = findSkillMd(aiResourcesDir, skillId);\n if (skillPath) {\n const content = fs.readFileSync(skillPath, \"utf-8\");\n const fm = parseSkillFrontmatter(content);\n skillVersions.set(skillId, fm.metadata?.version ?? fm.version ?? \"\");\n }\n }\n }\n\n const checks = validateFlowVersions(pinnedNodes, skillVersions);\n const failures = checks.filter((c) => !c.satisfied);\n if (failures.length > 0) {\n const lines = failures.map(\n (f) => ` ${f.nodeId}: wants ${f.requested}, found ${f.actual || \"(none)\"}`,\n );\n throw new Error(`Skill version mismatch:\\n${lines.join(\"\\n\")}`);\n }\n for (const c of checks.filter((c) => c.satisfied)) {\n log(` Version OK: ${c.skillId} ${c.actual} satisfies ${c.requested}`);\n }\n}\n\nfunction resolveFlowPath(flowId: string, projectDir: string): string {\n const armInstalled = path.join(projectDir, \".skaile\", \"flows\", flowId, `${flowId}.flow.yaml`);\n if (fs.existsSync(armInstalled)) return armInstalled;\n\n const manual = path.join(projectDir, \".skaile\", \"flows\", `${flowId}.flow.yaml`);\n if (fs.existsSync(manual)) return manual;\n\n let dir = projectDir;\n for (let i = 0; i < 6; i++) {\n const aiResources = path.join(dir, \"ai-assets\");\n if (fs.existsSync(aiResources)) {\n for (const domain of fs.readdirSync(aiResources)) {\n const flowsDir = path.join(aiResources, domain, \"flows\");\n const candidate = path.join(flowsDir, `${flowId}.flow.yaml`);\n if (fs.existsSync(candidate)) return candidate;\n const legacy = path.join(flowsDir, `${flowId}.json`);\n if (fs.existsSync(legacy)) return legacy;\n }\n throw new Error(`Flow not found: ${flowId} (searched .skaile/flows/ and ${aiResources})`);\n }\n dir = path.dirname(dir);\n }\n throw new Error(\n `Flow not found: ${flowId} (no .skaile/flows/ entry and could not locate ai-assets from ${projectDir})`,\n );\n}\n\n/** Walk up from projectDir to find ai-assets/ */\nfunction findAiResourcesDir(projectDir: string): string | null {\n let dir = projectDir;\n for (let i = 0; i < 6; i++) {\n const candidate = path.join(dir, \"ai-assets\");\n if (fs.existsSync(candidate)) return candidate;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/** Find SKILL.md for a given skill ID by walking ai-assets domains */\nfunction findSkillMd(aiResourcesDir: string, skillId: string): string | null {\n for (const domain of fs.readdirSync(aiResourcesDir, { withFileTypes: true })) {\n if (!domain.isDirectory()) continue;\n const skillsDir = path.join(aiResourcesDir, domain.name, \"skills\");\n if (!fs.existsSync(skillsDir)) continue;\n const found = walkForSkill(skillsDir, skillId);\n if (found) return found;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Turn-wait helper\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal driver surface needed by the bus's `driveTurn` callback. Mirrors\n * the slice the legacy `FlowOrchestrator` consumed (`prompt` + `on` +\n * `removeAllListeners`) so we can keep the wait helper private to this\n * module without pulling in a runtime dep on `@skaile/workspaces/bridge`.\n */\ninterface TurnDriverSurface {\n prompt(message: string): Promise<void>;\n on(event: \"agent-event\", handler: (event: AgentEvent) => void): void;\n removeAllListeners(event: \"agent-event\"): void;\n}\n\n/**\n * Send a prompt to the driver and resolve when the agent emits\n * `agent_end` (or reject on `error`). Identical contract to the legacy\n * `awaitAgentEnd` helper from `flow-orchestrator.ts`. Phase 4 lifts the\n * helper into `run-flow.ts` because the bus now owns turn driving.\n */\nfunction awaitAgentEnd(\n driver: TurnDriverSurface,\n prompt: string,\n onEvent: ((event: AgentEvent) => void) | undefined,\n timeoutMs: number,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const done = (err?: Error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n driver.removeAllListeners(\"agent-event\");\n if (err) reject(err);\n else resolve();\n };\n\n const timer = setTimeout(\n () => done(new Error(`Flow turn timed out after ${timeoutMs / 1000}s`)),\n timeoutMs,\n );\n\n driver.on(\"agent-event\", (event: AgentEvent) => {\n onEvent?.(event);\n if (event.type === \"agent_end\") done();\n else if (event.type === \"error\") {\n const msg =\n (event as { error?: string; message?: string }).error ??\n (event as { message?: string }).message ??\n \"Agent error\";\n done(new Error(msg));\n }\n });\n\n driver.prompt(prompt).catch(done);\n });\n}\n\nfunction walkForSkill(dir: string, skillId: string): string | null {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const full = path.join(dir, entry.name);\n const skillMd = path.join(full, \"SKILL.md\");\n if (fs.existsSync(skillMd)) {\n if (entry.name === skillId) return skillMd;\n } else {\n const found = walkForSkill(full, skillId);\n if (found) return found;\n }\n }\n return null;\n}\n"]}
@@ -1,9 +1,11 @@
1
- import { resolveAuthRef } from './chunk-BHLNQ4L5.js';
1
+ import { resolveAuthRef } from './chunk-ZNIHTT22.js';
2
2
  import { pluginRegistry } from './chunk-6E6PKKAD.js';
3
- import { computeFlowStateFromSnapshots } from './chunk-HPGV54O4.js';
4
- import { renderStimulusPrompt } from './chunk-Y662DNQQ.js';
5
3
  import { computeStimulus } from './chunk-IFGTRL2I.js';
6
- import { portableSpawn } from './chunk-RTLQAZAE.js';
4
+ import { computeFlowStateFromSnapshots } from './chunk-UQ3RJKDD.js';
5
+ import { parseFlowDefinition } from './chunk-ZE2KEPE2.js';
6
+ import { renderStimulusPrompt } from './chunk-FB4GPWYC.js';
7
+ import { flowDefaults, nodeRequiresApproval, isAgentNode, nodeIsOptional, nodeLabel, nodeInstruction, nodeBindings, nodeAssets } from './chunk-DZM33LQO.js';
8
+ import { portableSpawn } from './chunk-63ZPKREA.js';
7
9
  import { withFsDeadline, tryWithFsDeadline, FsDeadlineError, fsDeadlineMs } from './chunk-DYMWJAL4.js';
8
10
  import { createLogger } from './chunk-7GOCNYUV.js';
9
11
  import { mkdir, rename, writeFile, readFile, stat, cp, readdir, chmod, realpath } from 'fs/promises';
@@ -7154,6 +7156,12 @@ async function listWorktrees(repoRoot) {
7154
7156
 
7155
7157
  // factory-assets/connectors/flow/adapter.ts
7156
7158
  var now = () => (/* @__PURE__ */ new Date()).toISOString();
7159
+ function normalizeRuntimeFlow(authored) {
7160
+ const parsed = parseFlowDefinition(authored);
7161
+ if (parsed.ok) return parsed.data;
7162
+ const details = parsed.errors.map((issue) => `${issue.path || "<root>"}: ${issue.message}`).join("; ");
7163
+ throw new Error(`FlowAdapter: invalid flow definition: ${details}`);
7164
+ }
7157
7165
  function emptyNode(nodeId) {
7158
7166
  return {
7159
7167
  id: nodeId,
@@ -7166,7 +7174,7 @@ function emptyNode(nodeId) {
7166
7174
  function buildInitialExecution(flowDef, seed) {
7167
7175
  const nodes = {};
7168
7176
  for (const n of flowDef.nodes) {
7169
- if (n.type === "skill") {
7177
+ if (isAgentNode(n)) {
7170
7178
  nodes[n.id] = emptyNode(n.id);
7171
7179
  }
7172
7180
  }
@@ -7208,10 +7216,10 @@ function findNode(flowDef, nodeId) {
7208
7216
  return node;
7209
7217
  }
7210
7218
  function isOptional(flowDef, nodeId) {
7211
- return findNode(flowDef, nodeId).data?.optional === true;
7219
+ return nodeIsOptional(findNode(flowDef, nodeId));
7212
7220
  }
7213
7221
  function isMandatoryGate(flowDef, nodeId) {
7214
- return findNode(flowDef, nodeId).data?.approval?.mandatory === true;
7222
+ return nodeRequiresApproval(findNode(flowDef, nodeId));
7215
7223
  }
7216
7224
  var FlowAdapter = class extends AbstractConnector {
7217
7225
  name = "flow";
@@ -7230,8 +7238,8 @@ var FlowAdapter = class extends AbstractConnector {
7230
7238
  // ── Lifecycle ──
7231
7239
  async connect(declaration, _ctx) {
7232
7240
  const options = declaration.options ?? {};
7233
- const flowDef = options.flow;
7234
- if (!flowDef) throw new Error("FlowAdapter requires options.flow (FlowDefinition)");
7241
+ if (!options.flow) throw new Error("FlowAdapter requires options.flow (FlowDefinition)");
7242
+ const flowDef = normalizeRuntimeFlow(options.flow);
7235
7243
  const execution = options.execution ?? buildInitialExecution(
7236
7244
  flowDef,
7237
7245
  options.seed ?? { runId: "local", startedBy: "system", autonomousMode: false }
@@ -7323,7 +7331,7 @@ var FlowAdapter = class extends AbstractConnector {
7323
7331
  },
7324
7332
  {
7325
7333
  name: "build_handoff",
7326
- description: "Build curated context for a node from its completed flow-type predecessors (summaries + artifact refs).",
7334
+ description: "Build the selected agent node briefing: instruction, supplied bindings, required assets, and completed predecessor context.",
7327
7335
  accessLevel: "read",
7328
7336
  args: [
7329
7337
  {
@@ -7579,7 +7587,7 @@ var FlowAdapter = class extends AbstractConnector {
7579
7587
  case "get_state":
7580
7588
  return JSON.stringify(s.execution);
7581
7589
  case "get_globals":
7582
- return JSON.stringify(s.flowDef.globals ?? {});
7590
+ return JSON.stringify(flowDefaults(s.flowDef));
7583
7591
  case "build_handoff":
7584
7592
  return this.buildHandoff(s, String(args.nodeId ?? ""));
7585
7593
  case "validate_node":
@@ -7709,10 +7717,11 @@ var FlowAdapter = class extends AbstractConnector {
7709
7717
  return JSON.stringify(s.execution);
7710
7718
  }
7711
7719
  opStart(handle, s, args) {
7712
- const flow = args.flow;
7713
- if (!flow || typeof flow !== "object") {
7720
+ const authoredFlow = args.flow;
7721
+ if (!authoredFlow || typeof authoredFlow !== "object") {
7714
7722
  throw new Error("FlowAdapter: start requires args.flow (FlowDefinition)");
7715
7723
  }
7724
+ const flow = normalizeRuntimeFlow(authoredFlow);
7716
7725
  const seed = args.seed ?? {};
7717
7726
  if (!seed.runId || !seed.startedBy) {
7718
7727
  throw new Error("FlowAdapter: start requires args.seed.runId + args.seed.startedBy");
@@ -7959,9 +7968,9 @@ var FlowAdapter = class extends AbstractConnector {
7959
7968
  getExecution(handle) {
7960
7969
  return this.s(handle).execution;
7961
7970
  }
7962
- /** Node IDs marked as mandatory approval gates (`data.approval.mandatory`). */
7971
+ /** Node IDs marked as mandatory approval gates in strict v2 or legacy definitions. */
7963
7972
  getMandatoryGates(handle) {
7964
- return this.s(handle).flowDef.nodes.filter((n) => n.data?.approval?.mandatory === true).map((n) => n.id);
7973
+ return this.s(handle).flowDef.nodes.filter(nodeRequiresApproval).map((n) => n.id);
7965
7974
  }
7966
7975
  // ── Private helpers ──
7967
7976
  s(handle) {
@@ -8019,7 +8028,7 @@ var FlowAdapter = class extends AbstractConnector {
8019
8028
  }
8020
8029
  let flowStatus = s.execution.status;
8021
8030
  if (flowStatus !== "cancelled") {
8022
- const anyRequiredFailed = s.flowDef.nodes.filter((n) => n.type === "skill" && !(n.data?.optional ?? false)).some((n) => nodes[n.id]?.status === "failed");
8031
+ const anyRequiredFailed = s.flowDef.nodes.filter((n) => isAgentNode(n) && !nodeIsOptional(n)).some((n) => nodes[n.id]?.status === "failed");
8023
8032
  if (anyRequiredFailed) {
8024
8033
  flowStatus = "failed";
8025
8034
  } else if (computed.done) {
@@ -8037,13 +8046,40 @@ var FlowAdapter = class extends AbstractConnector {
8037
8046
  };
8038
8047
  }
8039
8048
  /**
8040
- * Build curated context for a node by collecting the summaries and
8041
- * artifact refs produced by its upstream flow-type predecessors.
8049
+ * Build the selected agent node's complete turn briefing plus upstream context.
8042
8050
  */
8043
8051
  buildHandoff(s, nodeId) {
8052
+ const target = findNode(s.flowDef, nodeId);
8053
+ assertLegal(isAgentNode(target), `node is not an active agent node: ${nodeId}`);
8054
+ const targetExecution = s.execution.nodes[nodeId];
8055
+ assertLegal(targetExecution, `node not in execution: ${nodeId}`);
8056
+ assertLegal(
8057
+ targetExecution.status === "available" || targetExecution.status === "running",
8058
+ `cannot build handoff for ${nodeId}: status is ${targetExecution.status}`
8059
+ );
8060
+ const sections = [`# Agent node: ${nodeLabel(target)}`, `Node ID: ${target.id}`];
8061
+ const instruction = nodeInstruction(target);
8062
+ if (instruction) sections.push(`## Instruction
8063
+
8064
+ ${instruction}`);
8065
+ const bindings = nodeBindings(target);
8066
+ if (Object.keys(bindings).length > 0) {
8067
+ sections.push(
8068
+ `## Supplied bindings
8069
+
8070
+ \`\`\`json
8071
+ ${JSON.stringify(bindings, null, 2)}
8072
+ \`\`\``
8073
+ );
8074
+ }
8075
+ const assets = nodeAssets(target);
8076
+ if (assets.length > 0) {
8077
+ sections.push(`## Required assets
8078
+
8079
+ ${assets.map((asset) => `- ${asset}`).join("\n")}`);
8080
+ }
8044
8081
  const deps = flowPredecessors(s.flowDef, nodeId);
8045
- if (deps.length === 0) return "(no prior context)";
8046
- const sections = [];
8082
+ const handoff = [];
8047
8083
  for (const depId of deps) {
8048
8084
  const exec = s.execution.nodes[depId];
8049
8085
  const output = exec?.output;
@@ -8052,11 +8088,17 @@ var FlowAdapter = class extends AbstractConnector {
8052
8088
  Artifacts: ${output.artifacts.map((a) => a.uri).join(", ")}` : "";
8053
8089
  const concerns = output.concerns && output.concerns.length > 0 ? `
8054
8090
  Concerns: ${output.concerns.join("; ")}` : "";
8055
- const label = s.flowDef.nodes.find((n) => n.id === depId)?.data?.label ?? depId;
8056
- sections.push(`### ${label} (${exec?.status})
8091
+ const predecessor = s.flowDef.nodes.find((n) => n.id === depId);
8092
+ const label = predecessor ? nodeLabel(predecessor) : depId;
8093
+ handoff.push(`### ${label} (${exec?.status})
8057
8094
  ${output.summary}${artifacts}${concerns}`);
8058
8095
  }
8059
- return sections.length > 0 ? sections.join("\n\n") : "(no prior context)";
8096
+ sections.push(
8097
+ `## Upstream handoff
8098
+
8099
+ ${handoff.length > 0 ? handoff.join("\n\n") : "(no prior context)"}`
8100
+ );
8101
+ return sections.join("\n\n");
8060
8102
  }
8061
8103
  };
8062
8104
  function flowPredecessors(flowDef, nodeId) {
@@ -8110,5 +8152,5 @@ function createConnector() {
8110
8152
  }
8111
8153
 
8112
8154
  export { AbstractConnector, BUILTIN_CONNECTOR_CATALOG, BoxConnector, ConnectorFieldMissingError, ConnectorManager, ConnectorStartupError, DeployConnector, DevServerConnector, FlowAdapter, GitConnector, GmailConnector, GoogleDriveConnector, LocalConnector, LogBuffer, ManagedGitconfigCollisionError, MattermostConnector, MemoryConnector, MinIOConnector, PortPool, PostgresConnector, S3Connector, SQLiteConnector, SharePointConnector, StaticServerConnector, TunnelConnector, WebDAVConnector, XStateConnector, XStateStoreConnector, __test, atomicReplaceCredential, buildConnectorPromptSection, buildSdkConnectorTools, buildSdkFlowTools, createConnector, createConnector10, createConnector11, createConnector12, createConnector13, createConnector14, createConnector15, createConnector16, createConnector17, createConnector18, createConnector19, createConnector2, createConnector20, createConnector3, createConnector4, createConnector5, createConnector6, createConnector7, createConnector8, createConnector9, createFsWatcher, createWorktree, defaultSpawn, ensureDirMode, ensureFleetMounted, findGitRoot, findMissingPackages, getConnector, installNpmPackages, isFleetManaged, isPackageResolvable, listConnectors, listWorktrees, readGitSyncStatus, registerBuiltinConnectors, removeMountBlock, renderCredentialHelperScript, tryGetConnector, worktreeRegistry, writeHelperScript, writeMountBlock };
8113
- //# sourceMappingURL=chunk-HOL5KD7U.js.map
8114
- //# sourceMappingURL=chunk-HOL5KD7U.js.map
8155
+ //# sourceMappingURL=chunk-PTS3QN5P.js.map
8156
+ //# sourceMappingURL=chunk-PTS3QN5P.js.map