@skaile/workspaces 2.5.0 → 2.6.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 (107) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +26 -11
  3. package/dist/{asset-feeds-4AWAT5PW.js → asset-feeds-3GKUWPRJ.js} +4 -4
  4. package/dist/{asset-feeds-4AWAT5PW.js.map → asset-feeds-3GKUWPRJ.js.map} +1 -1
  5. package/dist/asset-manager/index.js +1 -1
  6. package/dist/{chunk-YWPEDILM.js → chunk-3TYRCPO7.js} +8 -8
  7. package/dist/{chunk-YWPEDILM.js.map → chunk-3TYRCPO7.js.map} +1 -1
  8. package/dist/{chunk-PJ6INYDD.js → chunk-7WDM3K2N.js} +3 -3
  9. package/dist/{chunk-PJ6INYDD.js.map → chunk-7WDM3K2N.js.map} +1 -1
  10. package/dist/{chunk-WSARNOPP.js → chunk-ED3BMX72.js} +2 -2
  11. package/dist/{chunk-WSARNOPP.js.map → chunk-ED3BMX72.js.map} +1 -1
  12. package/dist/{chunk-ENBTXMPL.js → chunk-FDZE3XVR.js} +6 -6
  13. package/dist/{chunk-ENBTXMPL.js.map → chunk-FDZE3XVR.js.map} +1 -1
  14. package/dist/{chunk-UZYTSIX6.js → chunk-GAVKKN4O.js} +4 -4
  15. package/dist/{chunk-UZYTSIX6.js.map → chunk-GAVKKN4O.js.map} +1 -1
  16. package/dist/{chunk-4O2RAXKJ.js → chunk-J7K6K5DH.js} +316 -6
  17. package/dist/chunk-J7K6K5DH.js.map +1 -0
  18. package/dist/{chunk-EEHOMCRU.js → chunk-LX7OUTU2.js} +129 -11
  19. package/dist/chunk-LX7OUTU2.js.map +1 -0
  20. package/dist/{chunk-OEGHKO5N.js → chunk-MNPDB7WD.js} +17 -8
  21. package/dist/chunk-MNPDB7WD.js.map +1 -0
  22. package/dist/{chunk-IHX2SN35.js → chunk-PSGOSWDZ.js} +6 -6
  23. package/dist/{chunk-IHX2SN35.js.map → chunk-PSGOSWDZ.js.map} +1 -1
  24. package/dist/{chunk-MADO7PH5.js → chunk-RURJMOBQ.js} +2 -2
  25. package/dist/{chunk-MADO7PH5.js.map → chunk-RURJMOBQ.js.map} +1 -1
  26. package/dist/{chunk-FKBQRV4J.js → chunk-SCR3WGW7.js} +3 -3
  27. package/dist/{chunk-FKBQRV4J.js.map → chunk-SCR3WGW7.js.map} +1 -1
  28. package/dist/{chunk-4QROZZ5Z.js → chunk-TUYN2HDT.js} +7 -4
  29. package/dist/chunk-TUYN2HDT.js.map +1 -0
  30. package/dist/{chunk-V4ZLZJFN.js → chunk-UYRXP3NN.js} +3 -3
  31. package/dist/{chunk-V4ZLZJFN.js.map → chunk-UYRXP3NN.js.map} +1 -1
  32. package/dist/{chunk-EUWN4EK4.js → chunk-VPCFGWA5.js} +6 -6
  33. package/dist/{chunk-EUWN4EK4.js.map → chunk-VPCFGWA5.js.map} +1 -1
  34. package/dist/{chunk-JAFEMG7W.js → chunk-VXAIWI6C.js} +3 -3
  35. package/dist/{chunk-JAFEMG7W.js.map → chunk-VXAIWI6C.js.map} +1 -1
  36. package/dist/{chunk-AKVAZ5CB.js → chunk-WRD3D545.js} +2 -2
  37. package/dist/{chunk-AKVAZ5CB.js.map → chunk-WRD3D545.js.map} +1 -1
  38. package/dist/cli/index.js +31 -31
  39. package/dist/connectors/index.js +5 -5
  40. package/dist/{ensure-sources-QF72HVUM.js → ensure-sources-Z7JDO3VO.js} +4 -4
  41. package/dist/{ensure-sources-QF72HVUM.js.map → ensure-sources-Z7JDO3VO.js.map} +1 -1
  42. package/dist/factory-assets/connectors/box.js +5 -5
  43. package/dist/factory-assets/connectors/deploy.js +5 -5
  44. package/dist/factory-assets/connectors/devserver.js +5 -5
  45. package/dist/factory-assets/connectors/flow/CONNECTOR.md +36 -8
  46. package/dist/factory-assets/connectors/flow/adapter.d.ts +4 -1
  47. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
  48. package/dist/factory-assets/connectors/flow/adapter.js +5 -5
  49. package/dist/factory-assets/connectors/flow/contract/expression.d.ts +3 -0
  50. package/dist/factory-assets/connectors/flow/contract/expression.d.ts.map +1 -1
  51. package/dist/factory-assets/connectors/flow/contract.js +2 -2
  52. package/dist/factory-assets/connectors/flow/engine/engine.d.ts +30 -0
  53. package/dist/factory-assets/connectors/flow/engine/engine.d.ts.map +1 -1
  54. package/dist/factory-assets/connectors/flow/engine/node-shape.d.ts +6 -0
  55. package/dist/factory-assets/connectors/flow/engine/node-shape.d.ts.map +1 -1
  56. package/dist/factory-assets/connectors/flow/engine/router-settlement.d.ts +48 -0
  57. package/dist/factory-assets/connectors/flow/engine/router-settlement.d.ts.map +1 -0
  58. package/dist/factory-assets/connectors/flow/engine/types.d.ts +13 -24
  59. package/dist/factory-assets/connectors/flow/engine/types.d.ts.map +1 -1
  60. package/dist/factory-assets/connectors/flow/engine.js +3 -3
  61. package/dist/factory-assets/connectors/flow/prompt-fragments.js +2 -2
  62. package/dist/factory-assets/connectors/flow/run-flow.js +6 -6
  63. package/dist/factory-assets/connectors/flow.js +5 -5
  64. package/dist/factory-assets/connectors/git.js +5 -5
  65. package/dist/factory-assets/connectors/gmail.js +5 -5
  66. package/dist/factory-assets/connectors/googledrive.js +5 -5
  67. package/dist/factory-assets/connectors/local.js +5 -5
  68. package/dist/factory-assets/connectors/mattermost.js +5 -5
  69. package/dist/factory-assets/connectors/memory.js +5 -5
  70. package/dist/factory-assets/connectors/minio.js +5 -5
  71. package/dist/factory-assets/connectors/postgres.js +5 -5
  72. package/dist/factory-assets/connectors/s3.js +5 -5
  73. package/dist/factory-assets/connectors/sharepoint.js +5 -5
  74. package/dist/factory-assets/connectors/sqlite.js +5 -5
  75. package/dist/factory-assets/connectors/static-server.js +5 -5
  76. package/dist/factory-assets/connectors/tunnel.js +5 -5
  77. package/dist/factory-assets/connectors/webdav.js +5 -5
  78. package/dist/factory-assets/connectors/xstate-store.js +5 -5
  79. package/dist/factory-assets/connectors/xstate.js +5 -5
  80. package/dist/{flows-YIW4HL3L.js → flows-STVPKCMK.js} +3 -3
  81. package/dist/{flows-YIW4HL3L.js.map → flows-STVPKCMK.js.map} +1 -1
  82. package/dist/{helpers-LURCZHA4.js → helpers-RNDOV7WP.js} +4 -4
  83. package/dist/{helpers-LURCZHA4.js.map → helpers-RNDOV7WP.js.map} +1 -1
  84. package/dist/{library-publish-2GMJM3NZ.js → library-publish-6YVFXSZ7.js} +9 -9
  85. package/dist/{library-publish-2GMJM3NZ.js.map → library-publish-6YVFXSZ7.js.map} +1 -1
  86. package/dist/{open-library-POFOXZWH.js → open-library-TGAYDLX3.js} +8 -8
  87. package/dist/{open-library-POFOXZWH.js.map → open-library-TGAYDLX3.js.map} +1 -1
  88. package/dist/{project-GVOPZEJZ.js → project-SNJNBH4L.js} +5 -5
  89. package/dist/{project-GVOPZEJZ.js.map → project-SNJNBH4L.js.map} +1 -1
  90. package/dist/runner/index.js +9 -9
  91. package/dist/sdk/asset-manager.js +1 -1
  92. package/dist/sdk/flow.js +3 -3
  93. package/dist/sdk/index.js +9 -9
  94. package/dist/sdk/runner.js +9 -9
  95. package/dist/{source-FB3T4IHP.js → source-3N2E43PN.js} +9 -9
  96. package/dist/{source-FB3T4IHP.js.map → source-3N2E43PN.js.map} +1 -1
  97. package/dist/{source-manifest-publish-XTRDVPSC.js → source-manifest-publish-ZRKINAOF.js} +10 -10
  98. package/dist/{source-manifest-publish-XTRDVPSC.js.map → source-manifest-publish-ZRKINAOF.js.map} +1 -1
  99. package/dist/tui/index.js +9 -9
  100. package/dist/workspace-plugin/adapters/mcp.js +1 -1
  101. package/dist/workspace-plugin/adapters/omp.js +3 -3
  102. package/dist/workspace-plugin/index.js +1 -1
  103. package/package.json +1 -1
  104. package/dist/chunk-4O2RAXKJ.js.map +0 -1
  105. package/dist/chunk-4QROZZ5Z.js.map +0 -1
  106. package/dist/chunk-EEHOMCRU.js.map +0 -1
  107. package/dist/chunk-OEGHKO5N.js.map +0 -1
@@ -1,10 +1,10 @@
1
1
  import { resolveAuthRef } from './chunk-ZNIHTT22.js';
2
2
  import { pluginRegistry } from './chunk-6E6PKKAD.js';
3
3
  import { computeStimulus } from './chunk-IFGTRL2I.js';
4
- import { getConsumedOutputSchema, validateConsumedNodeOutput, resolveNodeBindings, computeFlowStateFromSnapshots, interpolateNodeInstruction } from './chunk-4O2RAXKJ.js';
5
- import { parseFlowDefinition } from './chunk-OEGHKO5N.js';
6
- import { renderStimulusPrompt } from './chunk-FKBQRV4J.js';
7
- import { flowDefaults, isAgentNode, isGateNode, nodeRequiresApproval, isSubFlowNode, isFunctionNode, nodeIsOptional, isActiveRuntimeNode, nodeLabel, nodeInstruction, nodeAssets } from './chunk-4QROZZ5Z.js';
4
+ import { getConsumedOutputSchema, validateConsumedNodeOutput, resolveNodeBindings, computeFlowStateFromSnapshots, availableRouterFrontier, evaluateRouterSelection, routerSelectionOutput, planRouterSkips, unsettledRouterBranchIds, interpolateNodeInstruction, persistedRouterSelection } from './chunk-J7K6K5DH.js';
5
+ import { parseFlowDefinition } from './chunk-MNPDB7WD.js';
6
+ import { renderStimulusPrompt } from './chunk-SCR3WGW7.js';
7
+ import { flowDefaults, isAgentNode, isGateNode, nodeRequiresApproval, isSubFlowNode, isFunctionNode, nodeIsOptional, isRouterNode, isActiveRuntimeNode, nodeLabel, nodeInstruction, nodeAssets } from './chunk-TUYN2HDT.js';
8
8
  import { portableSpawn } from './chunk-P43HBWKK.js';
9
9
  import { withFsDeadline, tryWithFsDeadline, FsDeadlineError, fsDeadlineMs } from './chunk-DYMWJAL4.js';
10
10
  import { createLogger } from './chunk-7GOCNYUV.js';
@@ -7566,6 +7566,10 @@ function prepareExecutionSnapshot(flowDef, execution) {
7566
7566
  const snapshot = cloned.data;
7567
7567
  for (const [nodeId, node] of Object.entries(snapshot.nodes ?? {})) {
7568
7568
  if (node.status !== "complete") continue;
7569
+ const definitionNode = flowDef.nodes.find(({ id }) => id === nodeId);
7570
+ if (definitionNode && isRouterNode(definitionNode) && !persistedRouterSelection(definitionNode, node)) {
7571
+ throw new Error(`FlowAdapter: invalid execution output for router node ${nodeId}`);
7572
+ }
7569
7573
  const validation = validateConsumedNodeOutput(flowDef, nodeId, node.output?.fields);
7570
7574
  if (!validation.valid) {
7571
7575
  throw new Error(
@@ -8575,7 +8579,8 @@ var FlowAdapter = class extends AbstractConnector {
8575
8579
  }
8576
8580
  /**
8577
8581
  * Drain runtime-owned nodes in definition order until only agent work or a human decision
8578
- * remains. Function nodes use NodeExecutor, gates park, and sub-flows delegate to the host.
8582
+ * remains. Routers select branches, function nodes use NodeExecutor, gates park, and sub-flows
8583
+ * delegate to the host.
8579
8584
  */
8580
8585
  async drainRuntimeNodes(handle) {
8581
8586
  return this.drainAvailableRuntimeNodes(handle, true);
@@ -8588,17 +8593,18 @@ var FlowAdapter = class extends AbstractConnector {
8588
8593
  async executeAvailableFunctionNodes(handle) {
8589
8594
  return this.drainAvailableRuntimeNodes(handle, false);
8590
8595
  }
8591
- async drainAvailableRuntimeNodes(handle, includeGates) {
8596
+ async drainAvailableRuntimeNodes(handle, includeRoutersAndGates) {
8592
8597
  const advancedSubFlows = /* @__PURE__ */ new Set();
8593
8598
  while (true) {
8594
8599
  const state = this.s(handle);
8595
8600
  if (state.execution.status === "cancelled" || state.execution.status === "failed") break;
8601
+ if (includeRoutersAndGates && this.settleAvailableRouters(handle)) continue;
8596
8602
  const node = state.flowDef.nodes.find((candidate) => {
8597
8603
  const status = state.execution.nodes[candidate.id]?.status;
8598
8604
  if (isSubFlowNode(candidate) && !advancedSubFlows.has(candidate.id) && (status === "available" || status === "running")) {
8599
8605
  return true;
8600
8606
  }
8601
- return (isFunctionNode(candidate) || includeGates && isGateNode(candidate)) && status === "available";
8607
+ return (isFunctionNode(candidate) || includeRoutersAndGates && isGateNode(candidate)) && status === "available";
8602
8608
  });
8603
8609
  if (!node) break;
8604
8610
  if (isGateNode(node)) {
@@ -8812,6 +8818,110 @@ var FlowAdapter = class extends AbstractConnector {
8812
8818
  return this.getExecution(handle);
8813
8819
  }
8814
8820
  // ── Private helpers ──
8821
+ /** Settle one decidable router per source ownership component before runtime side effects. */
8822
+ settleAvailableRouters(handle) {
8823
+ const state = this.s(handle);
8824
+ const snapshots = snapshotMap(state.execution);
8825
+ const settlements = [];
8826
+ const availableRouterSnapshots = new Map(snapshots);
8827
+ const computed = computeFlowStateFromSnapshots(state.flowDef, snapshots);
8828
+ for (const nodeId of computed.available) {
8829
+ const execution = availableRouterSnapshots.get(nodeId);
8830
+ if (execution && execution.status !== "available") {
8831
+ availableRouterSnapshots.set(nodeId, { ...execution, status: "available" });
8832
+ }
8833
+ }
8834
+ const frontier = availableRouterFrontier(state.flowDef, availableRouterSnapshots);
8835
+ for (const node of frontier) {
8836
+ const resolution = evaluateRouterSelection(state.flowDef, node, snapshots);
8837
+ if ("unresolved" in resolution) continue;
8838
+ settlements.push({ routerNodeId: node.id, selectedTarget: resolution.selectedTarget });
8839
+ }
8840
+ if (settlements.length === 0) return false;
8841
+ const preparedSettlements = settlements.map((settlement) => {
8842
+ const output = routerSelectionOutput(settlement.selectedTarget);
8843
+ return {
8844
+ settlement,
8845
+ output,
8846
+ validation: validateConsumedNodeOutput(
8847
+ state.flowDef,
8848
+ settlement.routerNodeId,
8849
+ output.fields
8850
+ )
8851
+ };
8852
+ });
8853
+ const validSettlements = preparedSettlements.flatMap(
8854
+ ({ settlement, validation }) => validation.valid ? [settlement] : []
8855
+ );
8856
+ const settlementPlan = [...validSettlements];
8857
+ let skippedNodeIds = [];
8858
+ if (settlementPlan.length > 0) {
8859
+ while (true) {
8860
+ skippedNodeIds = planRouterSkips(state.flowDef, snapshots, settlementPlan);
8861
+ const settledIds = new Set(settlementPlan.map(({ routerNodeId }) => routerNodeId));
8862
+ const losingRouters = skippedNodeIds.flatMap((nodeId) => {
8863
+ const node = state.flowDef.nodes.find(({ id }) => id === nodeId);
8864
+ return node && isRouterNode(node) && !settledIds.has(node.id) ? [node] : [];
8865
+ });
8866
+ if (losingRouters.length === 0) break;
8867
+ settlementPlan.push(
8868
+ ...losingRouters.map(({ id }) => ({ routerNodeId: id, selectedTarget: null }))
8869
+ );
8870
+ }
8871
+ }
8872
+ const settledAt = now();
8873
+ this.mutate(
8874
+ handle,
8875
+ (current) => {
8876
+ for (const prepared of preparedSettlements) {
8877
+ const { settlement, output, validation } = prepared;
8878
+ const execution = current.execution.nodes[settlement.routerNodeId];
8879
+ assertLegal(execution, `node not in execution: ${settlement.routerNodeId}`);
8880
+ assertLegal(
8881
+ execution.status === "available",
8882
+ `cannot resolve router node ${settlement.routerNodeId}: status is ${execution.status}`
8883
+ );
8884
+ if (!validation.valid) {
8885
+ const error = {
8886
+ message: `Router node ${settlement.routerNodeId} failed: output does not match its consumed schema: ${validation.issues.join("; ")}`,
8887
+ recoverable: false,
8888
+ at: settledAt
8889
+ };
8890
+ current.execution.nodes[settlement.routerNodeId] = {
8891
+ ...execution,
8892
+ status: "failed",
8893
+ startedAt: execution.startedAt ?? settledAt,
8894
+ completedAt: settledAt,
8895
+ output,
8896
+ error,
8897
+ errorHistory: [...execution.errorHistory, error]
8898
+ };
8899
+ continue;
8900
+ }
8901
+ current.execution.nodes[settlement.routerNodeId] = {
8902
+ ...execution,
8903
+ status: "complete",
8904
+ startedAt: execution.startedAt ?? settledAt,
8905
+ completedAt: settledAt,
8906
+ output
8907
+ };
8908
+ }
8909
+ for (const skippedNodeId of skippedNodeIds) {
8910
+ const execution = current.execution.nodes[skippedNodeId];
8911
+ if (!execution || execution.status !== "not_started" && execution.status !== "available") {
8912
+ continue;
8913
+ }
8914
+ current.execution.nodes[skippedNodeId] = {
8915
+ ...execution,
8916
+ status: "skipped",
8917
+ completedAt: settledAt
8918
+ };
8919
+ }
8920
+ },
8921
+ false
8922
+ );
8923
+ return true;
8924
+ }
8815
8925
  s(handle) {
8816
8926
  return handle.state;
8817
8927
  }
@@ -8855,13 +8965,15 @@ var FlowAdapter = class extends AbstractConnector {
8855
8965
  recompute(s) {
8856
8966
  const snapshots = snapshotMap(s.execution);
8857
8967
  const computed = computeFlowStateFromSnapshots(s.flowDef, snapshots);
8968
+ const routerGatedNodes = unsettledRouterBranchIds(s.flowDef, snapshots);
8858
8969
  const nodes = nodeExecutionRecord(Object.entries(s.execution.nodes));
8859
8970
  for (const ns of computed.nodes) {
8860
8971
  const existing = nodes[ns.nodeId];
8861
8972
  if (!existing) continue;
8862
8973
  if (existing.status === "not_started" || existing.status === "available") {
8974
+ const definitionNode = s.flowDef.nodes.find(({ id }) => id === ns.nodeId);
8863
8975
  const hasFailedPreconditions = (ns.failedPreconditions?.length ?? 0) > 0;
8864
- const status = existing.status === "available" && ns.status === "not_started" && !hasFailedPreconditions ? "available" : ns.status;
8976
+ const status = existing.status === "available" && ns.status === "not_started" && !hasFailedPreconditions && !routerGatedNodes.has(ns.nodeId) && !(definitionNode && isRouterNode(definitionNode)) ? "available" : ns.status;
8865
8977
  nodes[ns.nodeId] = {
8866
8978
  ...existing,
8867
8979
  status,
@@ -8955,8 +9067,9 @@ Artifacts: ${output.artifacts.map((a) => a.uri).join(", ")}` : "";
8955
9067
  Concerns: ${output.concerns.join("; ")}` : "";
8956
9068
  const predecessor = s.flowDef.nodes.find((n) => n.id === depId);
8957
9069
  const label = predecessor ? nodeLabel(predecessor) : depId;
9070
+ const summary = predecessor && isRouterNode(predecessor) ? routerSelectionHandoffSummary(predecessor, exec) ?? output.summary : output.summary;
8958
9071
  handoff.push(`### ${label} (${exec?.status})
8959
- ${output.summary}${artifacts}${concerns}`);
9072
+ ${summary}${artifacts}${concerns}`);
8960
9073
  }
8961
9074
  sections.push(
8962
9075
  `## Upstream handoff
@@ -8969,6 +9082,11 @@ ${handoff.length > 0 ? handoff.join("\n\n") : "(no prior context)"}`
8969
9082
  function flowPredecessors(flowDef, nodeId) {
8970
9083
  return flowDef.edges.filter((e) => e.target === nodeId && e.type === "flow").map((e) => e.source);
8971
9084
  }
9085
+ function routerSelectionHandoffSummary(router, execution) {
9086
+ const selection = persistedRouterSelection(router, execution);
9087
+ if (!selection) return void 0;
9088
+ return selection.selectedTarget === null ? "Router completed without selecting a target." : `Router selected ${selection.selectedTarget}.`;
9089
+ }
8972
9090
  function functionNodeOutput(node, result) {
8973
9091
  const capturedFields = [];
8974
9092
  for (const channel of ["stdout", "stderr"]) {
@@ -9058,5 +9176,5 @@ function createConnector() {
9058
9176
  }
9059
9177
 
9060
9178
  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, SessionInlineSubFlowRunner, SessionNodeExecutor, 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 };
9061
- //# sourceMappingURL=chunk-EEHOMCRU.js.map
9062
- //# sourceMappingURL=chunk-EEHOMCRU.js.map
9179
+ //# sourceMappingURL=chunk-LX7OUTU2.js.map
9180
+ //# sourceMappingURL=chunk-LX7OUTU2.js.map