@skaile/workspaces 2.2.0 → 2.4.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 (207) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +35 -12
  3. package/dist/{asset-feeds-D2LOXTOS.js → asset-feeds-4AWAT5PW.js} +6 -6
  4. package/dist/{asset-feeds-D2LOXTOS.js.map → asset-feeds-4AWAT5PW.js.map} +1 -1
  5. package/dist/asset-manager/catalog-deployer.js +1 -1
  6. package/dist/asset-manager/index.js +5 -5
  7. package/dist/asset-manager/installer.js +2 -2
  8. package/dist/bridge/drivers/claude-sdk.js +5 -2
  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-CERGXDGG.js → chunk-2OCYS5EP.js} +3 -3
  21. package/dist/{chunk-CERGXDGG.js.map → chunk-2OCYS5EP.js.map} +1 -1
  22. package/dist/{chunk-TQIU4HQG.js → chunk-2QVPCZTL.js} +101 -40
  23. package/dist/chunk-2QVPCZTL.js.map +1 -0
  24. package/dist/{chunk-A67FJ4YT.js → chunk-3HVASHBF.js} +3 -3
  25. package/dist/{chunk-A67FJ4YT.js.map → chunk-3HVASHBF.js.map} +1 -1
  26. package/dist/chunk-4O2RAXKJ.js +446 -0
  27. package/dist/chunk-4O2RAXKJ.js.map +1 -0
  28. package/dist/chunk-4QROZZ5Z.js +50 -0
  29. package/dist/chunk-4QROZZ5Z.js.map +1 -0
  30. package/dist/{chunk-VSSAJYFK.js → chunk-57RFYEVM.js} +3 -3
  31. package/dist/{chunk-VSSAJYFK.js.map → chunk-57RFYEVM.js.map} +1 -1
  32. package/dist/{chunk-SZJCUC52.js → chunk-6BV5NAPD.js} +156 -28
  33. package/dist/chunk-6BV5NAPD.js.map +1 -0
  34. package/dist/{chunk-MAIKGYFR.js → chunk-AKVAZ5CB.js} +2 -2
  35. package/dist/{chunk-MAIKGYFR.js.map → chunk-AKVAZ5CB.js.map} +1 -1
  36. package/dist/{chunk-BFIK6NPZ.js → chunk-AM5LFRXJ.js} +3 -3
  37. package/dist/{chunk-BFIK6NPZ.js.map → chunk-AM5LFRXJ.js.map} +1 -1
  38. package/dist/{chunk-6QSGCHE5.js → chunk-EEHOMCRU.js} +1071 -123
  39. package/dist/chunk-EEHOMCRU.js.map +1 -0
  40. package/dist/{chunk-6I5VRIX3.js → chunk-ENBTXMPL.js} +7 -7
  41. package/dist/{chunk-6I5VRIX3.js.map → chunk-ENBTXMPL.js.map} +1 -1
  42. package/dist/{chunk-Y662DNQQ.js → chunk-FKBQRV4J.js} +68 -24
  43. package/dist/chunk-FKBQRV4J.js.map +1 -0
  44. package/dist/{chunk-BUPFJFGP.js → chunk-G5V6YCHF.js} +3 -3
  45. package/dist/{chunk-BUPFJFGP.js.map → chunk-G5V6YCHF.js.map} +1 -1
  46. package/dist/{chunk-KGIVZOLU.js → chunk-GM2X24Q6.js} +2 -2
  47. package/dist/{chunk-KGIVZOLU.js.map → chunk-GM2X24Q6.js.map} +1 -1
  48. package/dist/{chunk-5BH6ZEGC.js → chunk-IHX2SN35.js} +9 -9
  49. package/dist/{chunk-5BH6ZEGC.js.map → chunk-IHX2SN35.js.map} +1 -1
  50. package/dist/{chunk-6HPTB6KT.js → chunk-JAFEMG7W.js} +4 -4
  51. package/dist/{chunk-6HPTB6KT.js.map → chunk-JAFEMG7W.js.map} +1 -1
  52. package/dist/{chunk-I5ESMJMW.js → chunk-MADO7PH5.js} +2 -2
  53. package/dist/{chunk-I5ESMJMW.js.map → chunk-MADO7PH5.js.map} +1 -1
  54. package/dist/{chunk-BCTU4TN7.js → chunk-MWFYXUFK.js} +3 -3
  55. package/dist/{chunk-BCTU4TN7.js.map → chunk-MWFYXUFK.js.map} +1 -1
  56. package/dist/{chunk-MAN7AGQJ.js → chunk-NU4E7C5I.js} +25 -6
  57. package/dist/chunk-NU4E7C5I.js.map +1 -0
  58. package/dist/{chunk-RKMXBOIO.js → chunk-O7ROIKTF.js} +3 -3
  59. package/dist/{chunk-RKMXBOIO.js.map → chunk-O7ROIKTF.js.map} +1 -1
  60. package/dist/chunk-OEGHKO5N.js +1236 -0
  61. package/dist/chunk-OEGHKO5N.js.map +1 -0
  62. package/dist/{chunk-63ZPKREA.js → chunk-P43HBWKK.js} +11 -4
  63. package/dist/chunk-P43HBWKK.js.map +1 -0
  64. package/dist/{chunk-IR6VPAVH.js → chunk-PJ6INYDD.js} +3 -3
  65. package/dist/{chunk-IR6VPAVH.js.map → chunk-PJ6INYDD.js.map} +1 -1
  66. package/dist/{chunk-DHGMYXOY.js → chunk-UGKOWIRP.js} +4 -4
  67. package/dist/{chunk-DHGMYXOY.js.map → chunk-UGKOWIRP.js.map} +1 -1
  68. package/dist/{chunk-WA7ADYSA.js → chunk-UZYTSIX6.js} +6 -6
  69. package/dist/{chunk-WA7ADYSA.js.map → chunk-UZYTSIX6.js.map} +1 -1
  70. package/dist/chunk-V4ZLZJFN.js +86 -0
  71. package/dist/chunk-V4ZLZJFN.js.map +1 -0
  72. package/dist/{chunk-GPMIXOJJ.js → chunk-WSARNOPP.js} +5 -5
  73. package/dist/{chunk-GPMIXOJJ.js.map → chunk-WSARNOPP.js.map} +1 -1
  74. package/dist/cli/index.js +49 -46
  75. package/dist/cli/index.js.map +1 -1
  76. package/dist/connectors/config.js +1 -1
  77. package/dist/connectors/index.js +6 -4
  78. package/dist/core/index.js +1 -1
  79. package/dist/core/src/subprocess.d.ts +5 -1
  80. package/dist/core/src/subprocess.d.ts.map +1 -1
  81. package/dist/deploy/index.js +1 -1
  82. package/dist/discovery/index.js +1 -1
  83. package/dist/discovery/src/requires-graph.d.ts +1 -1
  84. package/dist/discovery/src/requires-graph.d.ts.map +1 -1
  85. package/dist/{ensure-sources-6QMXRI6D.js → ensure-sources-QF72HVUM.js} +8 -8
  86. package/dist/{ensure-sources-6QMXRI6D.js.map → ensure-sources-QF72HVUM.js.map} +1 -1
  87. package/dist/factory-assets/connectors/box.js +6 -4
  88. package/dist/factory-assets/connectors/deploy.js +6 -4
  89. package/dist/factory-assets/connectors/devserver.js +6 -4
  90. package/dist/factory-assets/connectors/flow/CONNECTOR.md +63 -10
  91. package/dist/factory-assets/connectors/flow/adapter.d.ts +79 -36
  92. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
  93. package/dist/factory-assets/connectors/flow/adapter.js +6 -4
  94. package/dist/factory-assets/connectors/flow/contract/expression.d.ts +55 -0
  95. package/dist/factory-assets/connectors/flow/contract/expression.d.ts.map +1 -1
  96. package/dist/factory-assets/connectors/flow/contract/flow.v2.schema.json +61 -134
  97. package/dist/factory-assets/connectors/flow/contract/index.d.ts +1 -1
  98. package/dist/factory-assets/connectors/flow/contract/index.d.ts.map +1 -1
  99. package/dist/factory-assets/connectors/flow/contract/normalize.d.ts +4 -1
  100. package/dist/factory-assets/connectors/flow/contract/normalize.d.ts.map +1 -1
  101. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +20 -8
  102. package/dist/factory-assets/connectors/flow/contract/schema.d.ts.map +1 -1
  103. package/dist/factory-assets/connectors/flow/contract.js +2 -1024
  104. package/dist/factory-assets/connectors/flow/contract.js.map +1 -1
  105. package/dist/factory-assets/connectors/flow/engine/bindings.d.ts +9 -0
  106. package/dist/factory-assets/connectors/flow/engine/bindings.d.ts.map +1 -0
  107. package/dist/factory-assets/connectors/flow/engine/engine.d.ts +11 -6
  108. package/dist/factory-assets/connectors/flow/engine/engine.d.ts.map +1 -1
  109. package/dist/factory-assets/connectors/flow/engine/flow-kind-provider.d.ts +1 -1
  110. package/dist/factory-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +1 -1
  111. package/dist/factory-assets/connectors/flow/engine/index.d.ts +2 -0
  112. package/dist/factory-assets/connectors/flow/engine/index.d.ts.map +1 -1
  113. package/dist/factory-assets/connectors/flow/engine/loader.d.ts.map +1 -1
  114. package/dist/factory-assets/connectors/flow/engine/node-shape.d.ts +42 -0
  115. package/dist/factory-assets/connectors/flow/engine/node-shape.d.ts.map +1 -0
  116. package/dist/factory-assets/connectors/flow/engine/output-schema.d.ts +18 -0
  117. package/dist/factory-assets/connectors/flow/engine/output-schema.d.ts.map +1 -0
  118. package/dist/factory-assets/connectors/flow/engine/types.d.ts +67 -33
  119. package/dist/factory-assets/connectors/flow/engine/types.d.ts.map +1 -1
  120. package/dist/factory-assets/connectors/flow/engine.js +4 -2
  121. package/dist/factory-assets/connectors/flow/index.d.ts +3 -0
  122. package/dist/factory-assets/connectors/flow/index.d.ts.map +1 -1
  123. package/dist/factory-assets/connectors/flow/inline-sub-flow-host.d.ts +48 -0
  124. package/dist/factory-assets/connectors/flow/inline-sub-flow-host.d.ts.map +1 -0
  125. package/dist/factory-assets/connectors/flow/node-executor.d.ts +45 -0
  126. package/dist/factory-assets/connectors/flow/node-executor.d.ts.map +1 -0
  127. package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts +5 -6
  128. package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts.map +1 -1
  129. package/dist/factory-assets/connectors/flow/prompt-fragments.js +2 -1
  130. package/dist/factory-assets/connectors/flow/run-flow.d.ts +10 -9
  131. package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -1
  132. package/dist/factory-assets/connectors/flow/run-flow.js +7 -5
  133. package/dist/factory-assets/connectors/flow/sub-flow-runner.d.ts +73 -0
  134. package/dist/factory-assets/connectors/flow/sub-flow-runner.d.ts.map +1 -0
  135. package/dist/factory-assets/connectors/flow.js +6 -4
  136. package/dist/factory-assets/connectors/git.js +6 -4
  137. package/dist/factory-assets/connectors/gmail.js +6 -4
  138. package/dist/factory-assets/connectors/googledrive.js +6 -4
  139. package/dist/factory-assets/connectors/local.js +6 -4
  140. package/dist/factory-assets/connectors/mattermost.js +6 -4
  141. package/dist/factory-assets/connectors/memory.js +6 -4
  142. package/dist/factory-assets/connectors/minio.js +6 -4
  143. package/dist/factory-assets/connectors/postgres.js +6 -4
  144. package/dist/factory-assets/connectors/s3.js +6 -4
  145. package/dist/factory-assets/connectors/sharepoint.js +6 -4
  146. package/dist/factory-assets/connectors/sqlite.js +6 -4
  147. package/dist/factory-assets/connectors/static-server.js +6 -4
  148. package/dist/factory-assets/connectors/tunnel.js +6 -4
  149. package/dist/factory-assets/connectors/webdav.js +6 -4
  150. package/dist/factory-assets/connectors/xstate-store.js +6 -4
  151. package/dist/factory-assets/connectors/xstate.js +6 -4
  152. package/dist/{flows-TDDBCLNF.js → flows-YIW4HL3L.js} +4 -4
  153. package/dist/{flows-TDDBCLNF.js.map → flows-YIW4HL3L.js.map} +1 -1
  154. package/dist/{helpers-COQ7TDD4.js → helpers-LURCZHA4.js} +8 -8
  155. package/dist/{helpers-COQ7TDD4.js.map → helpers-LURCZHA4.js.map} +1 -1
  156. package/dist/library/index.js +3 -3
  157. package/dist/library/install.js +1 -1
  158. package/dist/{library-publish-SNPER6PO.js → library-publish-2GMJM3NZ.js} +14 -12
  159. package/dist/library-publish-2GMJM3NZ.js.map +1 -0
  160. package/dist/{open-library-VH2VEYQ7.js → open-library-POFOXZWH.js} +12 -10
  161. package/dist/{open-library-VH2VEYQ7.js.map → open-library-POFOXZWH.js.map} +1 -1
  162. package/dist/{paths-XZA22IB4.js → paths-ZLX4ITAQ.js} +6 -6
  163. package/dist/{paths-XZA22IB4.js.map → paths-ZLX4ITAQ.js.map} +1 -1
  164. package/dist/{plugin-store-CYSNVZIX.js → plugin-store-YIMNH2FH.js} +3 -3
  165. package/dist/{plugin-store-CYSNVZIX.js.map → plugin-store-YIMNH2FH.js.map} +1 -1
  166. package/dist/{project-FKL7PMJV.js → project-GVOPZEJZ.js} +9 -9
  167. package/dist/{project-FKL7PMJV.js.map → project-GVOPZEJZ.js.map} +1 -1
  168. package/dist/resolver/index.js +1 -1
  169. package/dist/runner/index.js +14 -8
  170. package/dist/runner/src/serve.d.ts +3 -1
  171. package/dist/runner/src/serve.d.ts.map +1 -1
  172. package/dist/sdk/asset-manager.js +5 -5
  173. package/dist/sdk/bridge.js +2 -2
  174. package/dist/sdk/core.js +1 -1
  175. package/dist/sdk/flow.js +4 -2
  176. package/dist/sdk/index.js +14 -8
  177. package/dist/sdk/index.js.map +1 -1
  178. package/dist/sdk/resolver.js +1 -1
  179. package/dist/sdk/runner.js +14 -8
  180. package/dist/{setup-BM6HMYJJ.js → setup-TJYLYT2A.js} +5 -5
  181. package/dist/{setup-BM6HMYJJ.js.map → setup-TJYLYT2A.js.map} +1 -1
  182. package/dist/{skills-LHS4TOKK.js → skills-HGVH6UTA.js} +5 -5
  183. package/dist/{skills-LHS4TOKK.js.map → skills-HGVH6UTA.js.map} +1 -1
  184. package/dist/{source-JIUBJC4F.js → source-FB3T4IHP.js} +13 -11
  185. package/dist/{source-JIUBJC4F.js.map → source-FB3T4IHP.js.map} +1 -1
  186. package/dist/{source-manifest-publish-TLH6UWWU.js → source-manifest-publish-XTRDVPSC.js} +15 -13
  187. package/dist/source-manifest-publish-XTRDVPSC.js.map +1 -0
  188. package/dist/tui/index.js +14 -8
  189. package/dist/tui/index.js.map +1 -1
  190. package/dist/types/src/flow.d.ts +26 -0
  191. package/dist/types/src/flow.d.ts.map +1 -1
  192. package/dist/types/src/index.d.ts +1 -1
  193. package/dist/types/src/index.d.ts.map +1 -1
  194. package/dist/workspace-plugin/adapters/mcp.js +4 -4
  195. package/dist/workspace-plugin/adapters/omp.js +7 -7
  196. package/dist/workspace-plugin/index.js +1 -1
  197. package/package.json +1 -1
  198. package/dist/chunk-63ZPKREA.js.map +0 -1
  199. package/dist/chunk-6QSGCHE5.js.map +0 -1
  200. package/dist/chunk-HPGV54O4.js +0 -301
  201. package/dist/chunk-HPGV54O4.js.map +0 -1
  202. package/dist/chunk-MAN7AGQJ.js.map +0 -1
  203. package/dist/chunk-SZJCUC52.js.map +0 -1
  204. package/dist/chunk-TQIU4HQG.js.map +0 -1
  205. package/dist/chunk-Y662DNQQ.js.map +0 -1
  206. package/dist/library-publish-SNPER6PO.js.map +0 -1
  207. package/dist/source-manifest-publish-TLH6UWWU.js.map +0 -1
@@ -1,16 +1,19 @@
1
- import { WorkspacePlugin } from './chunk-MAIKGYFR.js';
1
+ import { WorkspacePlugin } from './chunk-AKVAZ5CB.js';
2
2
  import { assembleSystemPrompt, buildCapabilitiesPromptSection } from './chunk-W3UDISS2.js';
3
3
  import { WebSocketServerTransport } from './chunk-WQ7DE5UC.js';
4
- import { EventNormalizer } from './chunk-RKMXBOIO.js';
4
+ import { EventNormalizer } from './chunk-O7ROIKTF.js';
5
5
  import { SUPPORTED_CLOUDS, CLOUD_SECRET_ENV_KEYS } from './chunk-ISQWMBKD.js';
6
6
  import { classifyClaudeSdkError } from './chunk-GAH4YRCI.js';
7
- import { createDriver } from './chunk-KGIVZOLU.js';
7
+ import { createDriver } from './chunk-GM2X24Q6.js';
8
+ import { resolveFlowPath } from './chunk-6BV5NAPD.js';
8
9
  import { findAiAssetsRoot, deployCatalogEntry, undeployCatalogEntry } from './chunk-BEAIJRVF.js';
9
- import { registerBuiltinConnectors, buildConnectorPromptSection, findMissingPackages, installNpmPackages, ConnectorManager, ConnectorStartupError, buildSdkConnectorTools, buildSdkFlowTools } from './chunk-6QSGCHE5.js';
10
+ import { registerBuiltinConnectors, buildConnectorPromptSection, findMissingPackages, installNpmPackages, ConnectorManager, ConnectorStartupError, buildSdkConnectorTools, SessionNodeExecutor, SessionInlineSubFlowRunner, buildSdkFlowTools } from './chunk-EEHOMCRU.js';
10
11
  import { loadConnectorDeclarations, SecretProviderChain, PreMintedSecretProvider, InMemorySecretProvider, resolvedConfigToDeclarations, isKnownSecretRef, deriveSingleMaterializedConnectorDeclaration } from './chunk-ZNIHTT22.js';
11
- import { renderStimulusPrompt, buildOrchestratorPrompt } from './chunk-Y662DNQQ.js';
12
+ import { loadFlow } from './chunk-4O2RAXKJ.js';
13
+ import { parseFlowDefinition } from './chunk-OEGHKO5N.js';
14
+ import { renderStimulusPrompt, buildOrchestratorPrompt } from './chunk-FKBQRV4J.js';
12
15
  import { PROTOCOL_VERSION } from './chunk-RDE43ORT.js';
13
- import { resolveSettings, resolveApiKey, providerEnvKey } from './chunk-63ZPKREA.js';
16
+ import { resolveSettings, resolveApiKey, providerEnvKey } from './chunk-P43HBWKK.js';
14
17
  import { resolveDriverPaths } from './chunk-K5GBV4SA.js';
15
18
  import { resolveRuntimeAssets } from './chunk-UFY2HFLO.js';
16
19
  import { resolveSkWorkspaceConfig, resolveAgentDir, cloudConfigFromProfile, stageMaterializedSkills, loadMcpServerDeclarations, COMPACTION_DEFAULTS, validateAssetRecipeAttr, deriveSingleMaterializedMcpDeclaration } from './chunk-Q26C5GLO.js';
@@ -4443,26 +4446,36 @@ function buildConnectorTokenMediator(deps) {
4443
4446
  }
4444
4447
  };
4445
4448
  }
4449
+ function normalizeFlowMutateDefinition(authored) {
4450
+ const parsed = parseFlowDefinition(authored);
4451
+ if (parsed.ok) return { ok: true, flowDef: parsed.data };
4452
+ const details = parsed.errors.map((issue) => `${issue.path || "<root>"}: ${issue.message}`).join("; ");
4453
+ return { ok: false, reason: `invalid flow definition: ${details}` };
4454
+ }
4446
4455
  function planFlowMutate(cmd, ctx) {
4447
4456
  const isBareFlowId = cmd.id === "flow";
4448
4457
  const flowIntercept = ctx.isExistingFlow || isBareFlowId;
4449
4458
  const payload = cmd.payload ?? {};
4450
4459
  if (cmd.op === "start" && flowIntercept) {
4451
- const flowDef = payload.flow;
4460
+ const authoredFlow = payload.flow;
4452
4461
  const seed = payload.seed;
4453
- if (!flowDef?.id || !seed?.runId || !seed?.startedBy) {
4462
+ if (!authoredFlow || !seed?.runId || !seed?.startedBy) {
4454
4463
  return {
4455
4464
  kind: "reject",
4456
4465
  reason: "flow.start payload missing required fields (need payload.flow.id, payload.seed.runId, payload.seed.startedBy)"
4457
4466
  };
4458
4467
  }
4468
+ const normalized = normalizeFlowMutateDefinition(authoredFlow);
4469
+ if (!normalized.ok) {
4470
+ return { kind: "reject", reason: `flow.start ${normalized.reason}` };
4471
+ }
4459
4472
  if (ctx.hasRunningFlow) {
4460
4473
  return {
4461
4474
  kind: "reject",
4462
4475
  reason: "flow.start ignored: a flow is still running (one active flow per session; cancel it, then start the next)"
4463
4476
  };
4464
4477
  }
4465
- return { kind: "create-start", flowDef, seed };
4478
+ return { kind: "create-start", flowDef: normalized.flowDef, seed };
4466
4479
  }
4467
4480
  if (cmd.op === "hydrate" && flowIntercept && !ctx.hasActiveFlow) {
4468
4481
  const state = payload.state;
@@ -4472,14 +4485,18 @@ function planFlowMutate(cmd, ctx) {
4472
4485
  reason: "flow.hydrate payload missing required field payload.state (FlowExecution snapshot)"
4473
4486
  };
4474
4487
  }
4475
- const flowDef = payload.flow;
4476
- if (!flowDef?.id) {
4488
+ const authoredFlow = payload.flow;
4489
+ if (!authoredFlow) {
4477
4490
  return {
4478
4491
  kind: "reject",
4479
4492
  reason: "flow.hydrate cannot bootstrap a cold container without payload.flow (FlowDefinition required when no flow is active)"
4480
4493
  };
4481
4494
  }
4482
- return { kind: "create-hydrate", flowDef, execution: state };
4495
+ const normalized = normalizeFlowMutateDefinition(authoredFlow);
4496
+ if (!normalized.ok) {
4497
+ return { kind: "reject", reason: `flow.hydrate ${normalized.reason}` };
4498
+ }
4499
+ return { kind: "create-hydrate", flowDef: normalized.flowDef, execution: state };
4483
4500
  }
4484
4501
  let dispatchId = cmd.id;
4485
4502
  if (!ctx.targetExists && isBareFlowId && ctx.onlyActiveConnectorId) {
@@ -4636,6 +4653,11 @@ function pendingDecisionOp(decision) {
4636
4653
  }
4637
4654
  };
4638
4655
  }
4656
+ function hasRejectedParkedApproval(execution) {
4657
+ return Object.values(execution.nodes ?? {}).some(
4658
+ (node) => node.status === "awaiting_approval" && node.approval?.decision === "rejected" && node.approval.decidedAt != null
4659
+ );
4660
+ }
4639
4661
  function hostOpResumeStimulus(op, payload) {
4640
4662
  switch (op) {
4641
4663
  case "applyApproval":
@@ -4733,21 +4755,23 @@ async function executeConnectorMutate(cmd, deps) {
4733
4755
  });
4734
4756
  if (payload.pendingDecisions === void 0) {
4735
4757
  respond({ ok: true });
4758
+ if (entry.hydratedStateChanged || hasRejectedParkedApproval(plan.execution)) {
4759
+ deps.signalStimulus(entry, { kind: "resumed_after_hibernation" });
4760
+ }
4736
4761
  return;
4737
4762
  }
4738
4763
  const { toApply, reconciled } = reconcilePendingDecisions(
4739
4764
  plan.execution,
4740
4765
  payload.pendingDecisions
4741
4766
  );
4742
- let lastApplied = null;
4767
+ let appliedAny = false;
4743
4768
  const applied = [];
4744
4769
  for (const decision of toApply) {
4745
4770
  const { op, payload: opPayload } = pendingDecisionOp(decision);
4746
4771
  try {
4747
4772
  await deps.executeOp(entry.connectorId, op, opPayload);
4748
4773
  applied.push(decision.nodeId);
4749
- const stimulus = hostOpResumeStimulus(op, opPayload);
4750
- if (stimulus) lastApplied = { target: entry, stimulus };
4774
+ appliedAny = true;
4751
4775
  } catch (err) {
4752
4776
  reconciled.skipped.push({ nodeId: decision.nodeId, reason: "not_parked" });
4753
4777
  deps.log.warn("flow hydrate reconciliation refused", {
@@ -4759,7 +4783,9 @@ async function executeConnectorMutate(cmd, deps) {
4759
4783
  }
4760
4784
  reconciled.applied = applied;
4761
4785
  respond({ ok: true, reconciled });
4762
- if (lastApplied) deps.signalStimulus(lastApplied.target, lastApplied.stimulus);
4786
+ if (appliedAny || entry.hydratedStateChanged || hasRejectedParkedApproval(plan.execution)) {
4787
+ deps.signalStimulus(entry, { kind: "resumed_after_hibernation" });
4788
+ }
4763
4789
  return;
4764
4790
  }
4765
4791
  case "reject": {
@@ -4789,6 +4815,9 @@ async function executeConnectorMutate(cmd, deps) {
4789
4815
  if (resumeStimulus) {
4790
4816
  const active = deps.flowState().activeFlow;
4791
4817
  if (active) deps.signalStimulus(active, resumeStimulus);
4818
+ } else if (cmd.op === "hydrate" && typeof result === "string" && JSON.stringify(payload.state) !== result) {
4819
+ const active = deps.flowState().activeFlow;
4820
+ if (active) deps.signalStimulus(active, { kind: "resumed_after_hibernation" });
4792
4821
  }
4793
4822
  return;
4794
4823
  }
@@ -4803,6 +4832,8 @@ function reconstructTypedStimulus(meta) {
4803
4832
  switch (meta.kind) {
4804
4833
  case "flow_started":
4805
4834
  return { kind: "flow_started" };
4835
+ case "resumed_after_hibernation":
4836
+ return { kind: "resumed_after_hibernation" };
4806
4837
  case "user_message":
4807
4838
  return typeof meta.text === "string" ? {
4808
4839
  kind: "user_message",
@@ -5375,6 +5406,19 @@ async function startAgentServer(opts) {
5375
5406
  }
5376
5407
  const flowConnectorReadiness = createFlowConnectorReadiness(() => getOnlyActiveFlow() !== null);
5377
5408
  const flowMutateConnectorWaitMs = resolveFlowMutateConnectorWaitMs();
5409
+ async function ensureFlowDriverStarted() {
5410
+ if (driverStarted) return;
5411
+ await driver.start();
5412
+ driverStarted = true;
5413
+ driver.on("agent-event", (event) => {
5414
+ const normalized = normalizer.normalize(event);
5415
+ for (const e of normalized) forwardNormalizedEvent(e);
5416
+ });
5417
+ driver.on("error", (err) => {
5418
+ log(`[serve] driver error: ${err.message}`);
5419
+ sendEvent({ type: "error", message: err.message, fatal: true });
5420
+ });
5421
+ }
5378
5422
  function getOrCreateStimulusBus() {
5379
5423
  if (stimulusBus) return stimulusBus;
5380
5424
  stimulusBus = createSessionStimulusBus({
@@ -5387,23 +5431,14 @@ async function startAgentServer(opts) {
5387
5431
  return;
5388
5432
  }
5389
5433
  const stimulus = stimulusFromMetas(metas);
5390
- const fullPrompt = buildOrchestratorPrompt(
5391
- entry.flowDef,
5392
- entry.adapter.getExecution(entry.handle),
5393
- stimulus
5394
- );
5395
- if (!driverStarted) {
5396
- await driver.start();
5397
- driverStarted = true;
5398
- driver.on("agent-event", (event) => {
5399
- const normalized = normalizer.normalize(event);
5400
- for (const e of normalized) forwardNormalizedEvent(e);
5401
- });
5402
- driver.on("error", (err) => {
5403
- log(`[serve] driver error: ${err.message}`);
5404
- sendEvent({ type: "error", message: err.message, fatal: true });
5405
- });
5434
+ await entry.adapter.drainRuntimeNodes(entry.handle);
5435
+ const execution = entry.adapter.getExecution(entry.handle);
5436
+ if (execution.done || execution.status === "failed" || execution.status === "cancelled") {
5437
+ return;
5406
5438
  }
5439
+ if (!entry.adapter.shouldDriveAgentTurn(entry.handle, stimulus)) return;
5440
+ const fullPrompt = buildOrchestratorPrompt(entry.flowDef, execution, stimulus);
5441
+ await ensureFlowDriverStarted();
5407
5442
  await awaitFlowAgentEnd(fullPrompt, FLOW_TURN_TIMEOUT_MS);
5408
5443
  },
5409
5444
  log: serverLog
@@ -5461,9 +5496,23 @@ async function startAgentServer(opts) {
5461
5496
  }
5462
5497
  async function createActiveFlow(flowDef, seedOrExecution) {
5463
5498
  const bus = getOrCreateStimulusBus();
5499
+ const nodeExecutor = new SessionNodeExecutor({ workspaceDir: opts.projectDir });
5500
+ const inlineSubFlowRunner = new SessionInlineSubFlowRunner({
5501
+ resolveFlow: (flowId) => loadFlow(resolveFlowPath(flowId, opts.projectDir)),
5502
+ nodeExecutor,
5503
+ driveAgentTurn: async ({ flow, execution, stimulus }) => {
5504
+ await ensureFlowDriverStarted();
5505
+ await awaitFlowAgentEnd(
5506
+ buildOrchestratorPrompt(flow, execution, stimulus),
5507
+ FLOW_TURN_TIMEOUT_MS
5508
+ );
5509
+ }
5510
+ });
5464
5511
  const baseOptions = {
5465
5512
  stimulusBus: bus,
5466
- useBusForStimulus: true
5513
+ useBusForStimulus: true,
5514
+ nodeExecutor,
5515
+ inlineSubFlowRunner
5467
5516
  };
5468
5517
  const options = "execution" in seedOrExecution ? { flow: flowDef, execution: seedOrExecution.execution, ...baseOptions } : { flow: flowDef, seed: seedOrExecution.seed, ...baseOptions };
5469
5518
  const seedRunId = "execution" in seedOrExecution ? seedOrExecution.execution.runId : seedOrExecution.seed.runId;
@@ -5480,6 +5529,7 @@ async function startAgentServer(opts) {
5480
5529
  });
5481
5530
  const adapter = manager.get(connectorId).connector;
5482
5531
  const runId = adapter.getExecution(handle).runId;
5532
+ const hydratedStateChanged = "execution" in seedOrExecution && JSON.stringify(adapter.getExecution(handle)) !== JSON.stringify(seedOrExecution.execution);
5483
5533
  adapter.onStateChange(handle, (state) => {
5484
5534
  sendEvent({
5485
5535
  type: "state_changed",
@@ -5487,7 +5537,7 @@ async function startAgentServer(opts) {
5487
5537
  state
5488
5538
  });
5489
5539
  });
5490
- if ("seed" in seedOrExecution) {
5540
+ if ("seed" in seedOrExecution || hydratedStateChanged) {
5491
5541
  sendEvent({
5492
5542
  type: "state_changed",
5493
5543
  store: `flow:${runId}`,
@@ -5495,9 +5545,9 @@ async function startAgentServer(opts) {
5495
5545
  });
5496
5546
  }
5497
5547
  driver.config.flowTestDriver = {
5498
- getState: () => adapter.getExecution(handle),
5548
+ getState: () => adapter.getAgentExecution(handle),
5499
5549
  execute: (op, args) => adapter.executeOp(handle, op, args),
5500
- mandatoryGates: () => adapter.getMandatoryGates(handle)
5550
+ mandatoryGates: () => adapter.getMandatoryAgentApprovalNodeIds(handle)
5501
5551
  };
5502
5552
  if (agentSession?.driverType === "claude-sdk") {
5503
5553
  try {
@@ -5517,7 +5567,14 @@ async function startAgentServer(opts) {
5517
5567
  }
5518
5568
  }
5519
5569
  emitAvailability();
5520
- const entry = { runId, flowDef, adapter, handle, connectorId };
5570
+ const entry = {
5571
+ runId,
5572
+ flowDef,
5573
+ adapter,
5574
+ handle,
5575
+ connectorId,
5576
+ hydratedStateChanged
5577
+ };
5521
5578
  const pruned = registerActiveFlow(activeFlows, runId, entry);
5522
5579
  if (pruned.length > 0) serverLog.debug("pruned terminal flow runs", { runIds: pruned });
5523
5580
  flowConnectorReadiness.drain();
@@ -6232,7 +6289,11 @@ async function startAgentServer(opts) {
6232
6289
  },
6233
6290
  createActiveFlow: async (flowDef, seedOrExecution) => {
6234
6291
  const entry = await createActiveFlow(flowDef, seedOrExecution);
6235
- return { runId: entry.runId, connectorId: entry.connectorId };
6292
+ return {
6293
+ runId: entry.runId,
6294
+ connectorId: entry.connectorId,
6295
+ hydratedStateChanged: entry.hydratedStateChanged
6296
+ };
6236
6297
  },
6237
6298
  waitForFlowConnector: (timeoutMs, isSatisfied) => flowConnectorReadiness.wait(timeoutMs, isSatisfied),
6238
6299
  connectorWaitMs: flowMutateConnectorWaitMs,
@@ -6702,5 +6763,5 @@ function touchSession(state) {
6702
6763
  }
6703
6764
 
6704
6765
  export { CLAUDE_CODE_CREDENTIALS_KEY, COMPILE_MANIFEST_FILENAME, CapabilityRegistry, DEFAULT_CAPABILITY_CALL_TIMEOUT_MS, DEFAULT_COALESCE_MS, DEFAULT_FLOW_MUTATE_CONNECTOR_WAIT_MS, MOUNT_LIST_MAX_DEPTH, MOUNT_LIST_MAX_ENTRIES, MOUNT_READ_DEADLINE_FACTOR, MOUNT_TREE_OP_DEADLINE_FACTOR, MarkdownStreamer, PreInitRingSink, agentDefinitionExists, bootstrapCapabilityRegistry, bootstrapRunnerLogStore, buildAgentResources, buildClientCapabilityHandler, buildConnectorTokenMediator, buildContextSection, buildEnvironmentSection, buildResourcesAvailablePayload, buildStoreSnapshotReplay, builtinCapabilities, capabilityLogInstance, clearPreInitRingSink, clearSession, compileComposition, computeCapabilitySignature, connectorRefreshKind, createAgentSession, createFlowConnectorReadiness, createSessionStimulusBus, defineCapability, deleteSession, dispatchRunnerCapabilityInvocation, emitSystemPromptComposed, ensureGitConfigInclude, executeConnectorMutate, extractClaudeAiOauthExpiresAt, getPreInitRingSink, handleMountResourceRequest, handleResourceRequest, hasNonTerminalFlow, hostOpResumeStimulus, installPreInitRingSink, isTerminalFlowStatus, listSessions, loadAgentManifest, loadCompileManifest, loadCompileManifestFromDir, loadSession, loadSessionById, mcpAuthSecretKey, newSession, pickRepointedManager, planFlowMutate, reconcilePendingDecisions, registerActiveFlow, registerCompositionCapabilities, rejectCapabilityOnApprovalDeny, resetRunnerLogStore, resolveAgentComposition, resolveAgentMixins, resolveBinding, resolveCapabilityCallTimeoutMs, resolveCapabilityResult, resolveComposition, resolveFlowMutateConnectorWaitMs, resolveMixin, runAgentChat, saveSession, setCurrentSession, setUpFlowConnector, startAgentServer, stimulusFromMetas, touchSession, validateInputResponse, writeClaudeCodeCredentialsFile };
6705
- //# sourceMappingURL=chunk-TQIU4HQG.js.map
6706
- //# sourceMappingURL=chunk-TQIU4HQG.js.map
6766
+ //# sourceMappingURL=chunk-2QVPCZTL.js.map
6767
+ //# sourceMappingURL=chunk-2QVPCZTL.js.map