@xyne/workflow-sdk 3.2.35 → 3.2.37

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 (83) hide show
  1. package/dist/agents/agent-step.js +1 -1
  2. package/dist/agents/agent-step.js.map +1 -1
  3. package/dist/authz/attributes.d.ts +23 -0
  4. package/dist/authz/attributes.d.ts.map +1 -1
  5. package/dist/client/events-client.d.ts +57 -0
  6. package/dist/client/events-client.d.ts.map +1 -0
  7. package/dist/client/events-client.js +107 -0
  8. package/dist/client/events-client.js.map +1 -0
  9. package/dist/client/index.d.ts +2 -0
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/sse.d.ts +30 -0
  12. package/dist/client/sse.d.ts.map +1 -0
  13. package/dist/client/sse.js +76 -0
  14. package/dist/client/sse.js.map +1 -0
  15. package/dist/client/types.d.ts +24 -1
  16. package/dist/client/types.d.ts.map +1 -1
  17. package/dist/client/url.d.ts +11 -0
  18. package/dist/client/url.d.ts.map +1 -0
  19. package/dist/client/url.js +28 -0
  20. package/dist/client/url.js.map +1 -0
  21. package/dist/client/workflow-client.d.ts +1 -1
  22. package/dist/client/workflow-client.d.ts.map +1 -1
  23. package/dist/client/workflow-client.js +25 -20
  24. package/dist/client/workflow-client.js.map +1 -1
  25. package/dist/engine/workflow-executor.d.ts +11 -4
  26. package/dist/engine/workflow-executor.d.ts.map +1 -1
  27. package/dist/engine/workflow-executor.js +15 -2
  28. package/dist/engine/workflow-executor.js.map +1 -1
  29. package/dist/events/in-memory-adapter.d.ts +15 -0
  30. package/dist/events/in-memory-adapter.d.ts.map +1 -0
  31. package/dist/events/in-memory-adapter.js +50 -0
  32. package/dist/events/in-memory-adapter.js.map +1 -0
  33. package/dist/events/types.d.ts +154 -0
  34. package/dist/events/types.d.ts.map +1 -0
  35. package/dist/events/types.js +34 -0
  36. package/dist/events/types.js.map +1 -0
  37. package/dist/index.d.ts +7 -3
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +9 -1
  40. package/dist/index.js.map +1 -1
  41. package/dist/router/workflow-router.d.ts.map +1 -1
  42. package/dist/router/workflow-router.js +205 -32
  43. package/dist/router/workflow-router.js.map +1 -1
  44. package/dist/runtime/types.d.ts +30 -52
  45. package/dist/runtime/types.d.ts.map +1 -1
  46. package/dist/runtime/workflow-runtime.d.ts +27 -9
  47. package/dist/runtime/workflow-runtime.d.ts.map +1 -1
  48. package/dist/runtime/workflow-runtime.js +64 -13
  49. package/dist/runtime/workflow-runtime.js.map +1 -1
  50. package/dist/steps/builtin/http-request.step.d.ts +29 -29
  51. package/dist/steps/builtin/http-request.step.js +1 -1
  52. package/dist/steps/builtin/http-request.step.js.map +1 -1
  53. package/dist/storage/types.d.ts +11 -3
  54. package/dist/storage/types.d.ts.map +1 -1
  55. package/dist/util/event-channel.d.ts +25 -0
  56. package/dist/util/event-channel.d.ts.map +1 -0
  57. package/dist/util/event-channel.js +61 -0
  58. package/dist/util/event-channel.js.map +1 -0
  59. package/package.json +1 -1
  60. package/dist/common/expression-eval.d.ts +0 -35
  61. package/dist/common/expression-eval.d.ts.map +0 -1
  62. package/dist/common/expression-eval.js +0 -214
  63. package/dist/common/expression-eval.js.map +0 -1
  64. package/dist/common/principal.d.ts +0 -45
  65. package/dist/common/principal.d.ts.map +0 -1
  66. package/dist/common/principal.js +0 -9
  67. package/dist/common/principal.js.map +0 -1
  68. package/dist/steps/builtin/transform.step.d.ts +0 -247
  69. package/dist/steps/builtin/transform.step.d.ts.map +0 -1
  70. package/dist/steps/builtin/transform.step.js +0 -135
  71. package/dist/steps/builtin/transform.step.js.map +0 -1
  72. package/dist/types/attachment.d.ts +0 -23
  73. package/dist/types/attachment.d.ts.map +0 -1
  74. package/dist/types/attachment.js +0 -2
  75. package/dist/types/attachment.js.map +0 -1
  76. package/dist/types/resume-payload.d.ts +0 -34
  77. package/dist/types/resume-payload.d.ts.map +0 -1
  78. package/dist/types/resume-payload.js +0 -12
  79. package/dist/types/resume-payload.js.map +0 -1
  80. package/dist/util/executable-check.d.ts +0 -42
  81. package/dist/util/executable-check.d.ts.map +0 -1
  82. package/dist/util/executable-check.js +0 -115
  83. package/dist/util/executable-check.js.map +0 -1
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The event bus port — how live state transitions reach a watching client.
3
+ *
4
+ * The engine publishes at execution state transitions; the SSE route subscribes
5
+ * and streams to the browser. Between them sits a topic-addressed pub/sub
6
+ * channel that this file describes and deliberately does not implement.
7
+ *
8
+ * ## Why this is a port
9
+ *
10
+ * A bus backed by a process-local `Map` only works when the publisher and the
11
+ * subscriber share a heap, and hosts routinely arrange for them not to: run the
12
+ * queue worker in one process and the HTTP API in another — the ordinary way to
13
+ * scale either independently — and the executor publishes into one map while the
14
+ * stream route listens to a different one. Nothing errors. Every live run just
15
+ * renders its opening snapshot and then appears to freeze.
16
+ *
17
+ * That failure is invisible from inside the engine, so the engine must not be the
18
+ * thing that decides how events travel. A host that spans processes supplies a
19
+ * Redis (or NATS, or Kafka) adapter; {@link InMemoryEventBus} stays the default
20
+ * and stays correct whenever everything shares one process.
21
+ *
22
+ * ## Delivery contract
23
+ *
24
+ * At-most-once, unordered across publishers. Implementations are not required to
25
+ * buffer, replay, or acknowledge — a subscriber that was not listening when an
26
+ * event was published never sees it. Consumers must therefore treat a subscription
27
+ * as a hint to re-read authoritative state, not as the state itself, and must
28
+ * recover by re-reading after any reconnect.
29
+ */
30
+ /** The channel carrying one execution's lifecycle events. */
31
+ export const executionTopic = (executionId) => `execution:${executionId}`;
32
+ /** The channel carrying one workflow definition's change events. */
33
+ export const workflowTopic = (workflowId) => `workflow:${workflowId}`;
34
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AA+EH,6DAA6D;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,WAAmB,EAAc,EAAE,CAAC,aAAa,WAAW,EAAE,CAAC;AAE9F,oEAAoE;AACpE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,UAAkB,EAAc,EAAE,CAAC,YAAY,UAAU,EAAE,CAAC"}
package/dist/index.d.ts CHANGED
@@ -62,9 +62,13 @@ export type { WaitStepConfig, WaitStepOutput, } from './steps/builtin/wait.step.
62
62
  export { HttpRequestStep, HttpRequestStepConfigSchema, HttpMethodSchema, HttpRawContentTypeSchema, HttpResponseSchema, HttpBodySchema, } from './steps/builtin/http-request.step.js';
63
63
  export type { HttpRequestStepConfig, HttpRequestStepOutput, HttpMethod, HttpRawContentType, HttpResponseConfig, HttpResponseType, HttpBody, } from './steps/builtin/http-request.step.js';
64
64
  export { WorkflowRuntime } from './runtime/workflow-runtime.js';
65
- export { ExecutionEventBus, createEventChannel } from './runtime/execution-event-bus.js';
66
- export type { EventChannel } from './runtime/execution-event-bus.js';
67
- export type { ExecutionResult, RuntimeOptions, RuntimeConfig, DispatchEventInput, ResumeInput, ExecutionStreamEvent, } from './runtime/types.js';
65
+ export type { ExecutionResult, RuntimeOptions, RuntimeConfig, DispatchEventInput, MutationOptions, ResumeInput, } from './runtime/types.js';
66
+ export { InMemoryEventBus } from './events/in-memory-adapter.js';
67
+ export { executionTopic } from './events/types.js';
68
+ export { workflowTopic } from './events/types.js';
69
+ export type { EventBusAdapter, EventTopic, BusEvent, BusListener, Unsubscribe, ExecutionStreamEvent, WorkflowChangeEvent, WorkflowChangeKind, } from './events/types.js';
70
+ export { createEventChannel } from './util/event-channel.js';
71
+ export type { EventChannel } from './util/event-channel.js';
68
72
  export type { WorkflowAuthorizer, Action, ResourceType, ResourceRef, ApprovalStepRecord, } from './authz/types.js';
69
73
  export type { Register, ResourceAttributes, AttributedResource } from './authz/attributes.js';
70
74
  export { WORKFLOW_ACTIONS, EXECUTION_ACTIONS, FOLDER_ACTIONS, CONTAINER_ACTIONS, CREDENTIAL_ACTIONS, ALL_ACTIONS, refLabel, } from './authz/types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -66,7 +66,15 @@ export { WaitStep, WaitStepConfigSchema, } from './steps/builtin/wait.step.js';
66
66
  export { HttpRequestStep, HttpRequestStepConfigSchema, HttpMethodSchema, HttpRawContentTypeSchema, HttpResponseSchema, HttpBodySchema, } from './steps/builtin/http-request.step.js';
67
67
  // ─── Runtime ───
68
68
  export { WorkflowRuntime } from './runtime/workflow-runtime.js';
69
- export { ExecutionEventBus, createEventChannel } from './runtime/execution-event-bus.js';
69
+ // ─── Event Bus ───
70
+ //
71
+ // `InMemoryEventBus` is the default and suits any host that runs in one process.
72
+ // Split the queue worker from the HTTP API and it stops working *silently* — that
73
+ // host must implement `EventBusAdapter` over a real broker instead.
74
+ export { InMemoryEventBus } from './events/in-memory-adapter.js';
75
+ export { executionTopic } from './events/types.js';
76
+ export { workflowTopic } from './events/types.js';
77
+ export { createEventChannel } from './util/event-channel.js';
70
78
  export { WORKFLOW_ACTIONS, EXECUTION_ACTIONS, FOLDER_ACTIONS, CONTAINER_ACTIONS, CREDENTIAL_ACTIONS, ALL_ACTIONS, refLabel, } from './authz/types.js';
71
79
  export { applyIdScope } from './authz/id-scope.js';
72
80
  export { AllowAllAuthorizer, AccessDeniedError, ResourceNotFoundError, } from './authz/default.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAE1C,iBAAiB;AAEjB,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAMjE,gBAAgB;AAEhB,OAAO,EACL,QAAQ,EACR,cAAc,EACd,mBAAmB,EACnB,QAAQ,EACR,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAU9B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG1E,mBAAmB;AAEnB,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAO/D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAMzD,OAAO,EACL,eAAe,EACf,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AAMxC,sDAAsD;AAEtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,kDAAkD,CAAC;AAmB3F,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAKhF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAUxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAKxD,OAAO;AACL,cAAc;AACd,eAAe,EACf,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB;AACxB,aAAa;AACb,eAAe,EACf,qBAAqB;AACrB,YAAY;AACZ,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB;AACpB,SAAS;AACT,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,wBAAwB,EACxB,eAAe,EACf,qBAAqB;AACrB,aAAa;AACb,mBAAmB,EACnB,yBAAyB;AACzB,0BAA0B;AAC1B,WAAW,EACX,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,cAAc;AACd,6CAA6C;AAC7C,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAmD1B,eAAe;AAEf,OAAO,EACL,kBAAkB,EAClB,+BAA+B,EAC/B,QAAQ,EACR,SAAS,EACT,cAAc,EACd,WAAW,EACX,QAAQ,EACR,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AAoBjC,OAAO,EACL,YAAY,EACZ,WAAW,EACX,6BAA6B,EAC7B,6BAA6B,EAC7B,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,aAAa,EACb,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AA8B3B,yEAAyE;AAEzE,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,mCAAmC,EACnC,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,EAC3B,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,oEAAoE;AAEpE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGpE,mFAAmF;AAEnF,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAE1F,6EAA6E;AAC7E,iFAAiF;AACjF,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,yBAAyB;AAEzB,OAAO,EACL,QAAQ,EACR,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EACL,OAAO,EACP,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAOrC,OAAO,EACL,QAAQ,EACR,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EACL,SAAS,EACT,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AAMvC,OAAO,EACL,YAAY,EACZ,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAS1C,OAAO,EACL,QAAQ,EACR,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EACL,eAAe,EACf,2BAA2B,EAC3B,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,cAAc,GACf,MAAM,sCAAsC,CAAC;AAW9C,kBAAkB;AAElB,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAqBzF,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAE5B,iBAAiB;AAEjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-router.d.ts","sourceRoot":"","sources":["../../src/router/workflow-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAA+B,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA4J3G,wBAAgB,oBAAoB,CAAC,IAAI,GAAG,WAAW,EAGrD,OAAO,EAAE,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,EAEnC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,GACzB,eAAe,CAAC,IAAI,CAAC,EAAE,CAk6CzB"}
1
+ {"version":3,"file":"workflow-router.d.ts","sourceRoot":"","sources":["../../src/router/workflow-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAA+B,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAmN3G,wBAAgB,oBAAoB,CAAC,IAAI,GAAG,WAAW,EAGrD,OAAO,EAAE,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,EAEnC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,GACzB,eAAe,CAAC,IAAI,CAAC,EAAE,CA4iDzB"}
@@ -27,8 +27,9 @@ import { createChatAgentTools } from '../agents/builtin/chat-tools.js';
27
27
  import { buildWorkflowContext, buildExecutionDataFile, collectExecutionAttachments, EXECUTION_DATA_PATH } from './approval-context.js';
28
28
  import { OPERATOR_DESCRIPTORS } from '../types/operators.js';
29
29
  import { getAvailableContext } from '../engine/available-context.js';
30
+ import { executionTopic, workflowTopic } from '../events/types.js';
30
31
  import { isExecutable } from '../common/executable-check.js';
31
- import { createEventChannel } from '../runtime/execution-event-bus.js';
32
+ import { createEventChannel } from '../util/event-channel.js';
32
33
  import { AccessDeniedError, ResourceNotFoundError } from '../authz/default.js';
33
34
  import { applyResolvedCredentialAuth, CredentialNameSchema, CredentialAuthSchema, validateCredentialValues, } from '../common/credentials.js';
34
35
  // ─── Helpers ───
@@ -131,6 +132,54 @@ async function buildMultipartTriggerPayload(req, storage, scope, inputSchema) {
131
132
  function formatSSE(event, data) {
132
133
  return `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
133
134
  }
135
+ /**
136
+ * An SSE comment. Carries no event, so it never reaches a client handler — it
137
+ * exists purely so that something crosses the wire on an idle connection, before
138
+ * a proxy or load balancer decides the stream is dead and closes it.
139
+ */
140
+ const SSE_KEEPALIVE = ': keepalive\n\n';
141
+ /** How long an event stream may sit silent before it sends a keepalive. */
142
+ const KEEPALIVE_INTERVAL_MS = 25_000;
143
+ /**
144
+ * Marker pushed through an event channel to trigger a keepalive. A symbol so it
145
+ * can never be mistaken for — or collide with — a real event.
146
+ */
147
+ const KEEPALIVE = Symbol('keepalive');
148
+ /** Ceiling on topics per multiplexed connection. */
149
+ const MAX_STREAM_TOPICS = 100;
150
+ /**
151
+ * The writer's self-declared identity, read from `X-Workflow-Origin` and echoed
152
+ * back on the change event the mutation emits.
153
+ *
154
+ * A header rather than a body field: it describes the call, not the resource, so
155
+ * it works the same on JSON, multipart and empty-bodied routes without any of
156
+ * them having to make room for it in their schema.
157
+ *
158
+ * Untrusted by construction — a client may send whatever it likes. Nothing is
159
+ * authorized on it; it only ever lets a client recognise the echo of its own
160
+ * write. Truncated so a subscriber cannot be made to carry an unbounded string.
161
+ */
162
+ function readOrigin(req) {
163
+ const raw = req.headers['x-workflow-origin'];
164
+ const value = Array.isArray(raw) ? raw[0] : raw;
165
+ return value ? { origin: value.slice(0, 128) } : {};
166
+ }
167
+ /**
168
+ * Parse an id list from a query parameter, accepting both `?a=1,2` and `?a=1&a=2`
169
+ * so the route does not depend on how the host's framework folds repeats.
170
+ */
171
+ function parseIdList(raw) {
172
+ const parts = Array.isArray(raw) ? raw : typeof raw === 'string' ? [raw] : [];
173
+ const ids = new Set();
174
+ for (const part of parts) {
175
+ for (const id of part.split(',')) {
176
+ const trimmed = id.trim();
177
+ if (trimmed)
178
+ ids.add(trimmed);
179
+ }
180
+ }
181
+ return [...ids];
182
+ }
134
183
  // ─── Router Factory ───
135
184
  export function createWorkflowRouter(
136
185
  // `any` for services: the router never touches TServices, only forwards ctx.
@@ -200,7 +249,7 @@ _opts) {
200
249
  summary: typeof body['summary'] === 'string' ? body['summary'] : null,
201
250
  folderId: body['folderId'],
202
251
  attributes: body['attributes'],
203
- });
252
+ }, readOrigin(req));
204
253
  return created(workflow);
205
254
  }
206
255
  catch (err) {
@@ -233,7 +282,7 @@ _opts) {
233
282
  }
234
283
  if (typeof body['folderId'] === 'string')
235
284
  input.folderId = body['folderId'];
236
- const workflow = await runtime.updateWorkflow(asCtx(auth), id, input);
285
+ const workflow = await runtime.updateWorkflow(asCtx(auth), id, input, readOrigin(req));
237
286
  return ok(workflow);
238
287
  }
239
288
  catch (err) {
@@ -363,7 +412,7 @@ _opts) {
363
412
  if (folders.length === 0 && workflows.length === 0)
364
413
  return badRequest('Nothing to move');
365
414
  try {
366
- await runtime.moveBatch(asCtx(auth), { folders, workflows });
415
+ await runtime.moveBatch(asCtx(auth), { folders, workflows }, readOrigin(req));
367
416
  return ok({ moved: folders.length + workflows.length });
368
417
  }
369
418
  catch (err) {
@@ -395,7 +444,7 @@ _opts) {
395
444
  if (!id)
396
445
  return badRequest('Missing workflow ID');
397
446
  try {
398
- await runtime.activateWorkflow(asCtx(auth), id);
447
+ await runtime.activateWorkflow(asCtx(auth), id, readOrigin(req));
399
448
  return ok({ activated: true });
400
449
  }
401
450
  catch (err) {
@@ -413,7 +462,7 @@ _opts) {
413
462
  if (!id)
414
463
  return badRequest('Missing workflow ID');
415
464
  try {
416
- await runtime.deactivateWorkflow(asCtx(auth), id);
465
+ await runtime.deactivateWorkflow(asCtx(auth), id, readOrigin(req));
417
466
  return ok({ deactivated: true });
418
467
  }
419
468
  catch (err) {
@@ -487,8 +536,9 @@ _opts) {
487
536
  method: 'POST',
488
537
  path: '/uploads',
489
538
  multipart: 'files',
490
- // TODO(uploads): guard/scope via the authorizer once uploads are ACL-modeled.
491
- handler: async (req, _auth) => {
539
+ // TODO(uploads): guard via the authorizer once blobs are ACL-modeled. The scope
540
+ // below gives tenant attribution; it is not authorization.
541
+ handler: async (req, auth) => {
492
542
  if (!runtime.storage) {
493
543
  return error(501, 'No StorageAdapter configured — file uploads are disabled');
494
544
  }
@@ -507,10 +557,11 @@ _opts) {
507
557
  }
508
558
  }
509
559
  }
510
- // TODO(uploads): uploads are not yet ACL-scoped. The storage scope must be
511
- // produceable from BOTH a caller (here) and a workflow (execution-time
512
- // writes have no caller) designed in the uploads pass. Empty for now.
513
- const scope = {};
560
+ // The host's auth context IS its storage scope for caller-initiated work: an
561
+ // upload has a person and no workflow yet. Not provable here (TCtx is unbound
562
+ // at this point), so the host's adapter validates and rejects a scope it
563
+ // cannot read a tenant from.
564
+ const scope = auth;
514
565
  try {
515
566
  const attachments = [];
516
567
  for (const file of files) {
@@ -539,7 +590,7 @@ _opts) {
539
590
  routes.push({
540
591
  method: 'GET',
541
592
  path: '/attachments',
542
- handler: async (req, _auth) => {
593
+ handler: async (req, auth) => {
543
594
  if (!runtime.storage) {
544
595
  return error(501, 'No StorageAdapter configured — downloads are disabled');
545
596
  }
@@ -554,7 +605,9 @@ _opts) {
554
605
  const url = await runtime.storage.signUrl(attachment, 300);
555
606
  return { status: 302, body: null, headers: { Location: url } };
556
607
  }
557
- const bytes = await runtime.storage.read(attachment);
608
+ // Pass the caller so a tenant-enforcing adapter can refuse a reference
609
+ // owned by another workspace. `ref` is client-supplied.
610
+ const bytes = await runtime.storage.read(attachment, auth);
558
611
  return {
559
612
  status: 200,
560
613
  body: bytes,
@@ -1109,6 +1162,99 @@ _opts) {
1109
1162
  }
1110
1163
  },
1111
1164
  });
1165
+ // ─── SSE: Multiplexed Change Stream ───
1166
+ //
1167
+ // One connection, many topics: `GET /events?workflows=a,b`.
1168
+ //
1169
+ // The topic set lives in the URL and nowhere else, which is what keeps this
1170
+ // working behind a load balancer with no session affinity. There is no
1171
+ // server-side subscription to mutate, so a client that wants to watch something
1172
+ // new simply reconnects with a different query string — and any pod can serve
1173
+ // it, because every pod subscribes to whatever its own clients asked for.
1174
+ //
1175
+ // Frames are notifications, not payloads: `workflow_changed` says *that* a
1176
+ // workflow changed, and the client re-reads through the ordinary authorized
1177
+ // GET. Only `workflows` is accepted today — a live execution has its own richer
1178
+ // stream at `/executions/:execId/stream`, which patches step state in place
1179
+ // rather than re-reading, and duplicating it here would give it two meanings.
1180
+ // The query shape is keyed by entity so further families slot in unchanged.
1181
+ routes.push({
1182
+ method: 'GET',
1183
+ path: '/events',
1184
+ handler: async (req, auth) => {
1185
+ const eventBus = runtime.eventBus;
1186
+ if (!eventBus) {
1187
+ return error(501, 'Event streaming not configured');
1188
+ }
1189
+ const requested = parseIdList(req.query['workflows']);
1190
+ if (requested.length === 0) {
1191
+ return badRequest('Specify at least one id, e.g. ?workflows=a,b');
1192
+ }
1193
+ if (requested.length > MAX_STREAM_TOPICS) {
1194
+ return badRequest(`Too many topics (${String(requested.length)}); the limit is ${String(MAX_STREAM_TOPICS)}`);
1195
+ }
1196
+ // Authorize every id up front, through the same read the client would do.
1197
+ // A bus is addressed by resource id and knows nothing about principals, so
1198
+ // this is the only place the caller's access is actually decided.
1199
+ //
1200
+ // One unreadable id does not fail the connection: on a multiplexed stream
1201
+ // that would take down every other topic the client is watching, and access
1202
+ // can be lost mid-session. The `ready` frame reports what was accepted, so
1203
+ // the client is never left believing it is watching something it is not.
1204
+ const subscribed = [];
1205
+ const rejected = [];
1206
+ await Promise.all(requested.map(async (id) => {
1207
+ try {
1208
+ await runtime.getWorkflow(asCtx(auth), id);
1209
+ subscribed.push(id);
1210
+ }
1211
+ catch {
1212
+ rejected.push(id);
1213
+ }
1214
+ }));
1215
+ const channel = createEventChannel();
1216
+ const results = await Promise.allSettled(subscribed.map((id) => eventBus.subscribe(workflowTopic(id), channel.push)));
1217
+ const unsubs = results.flatMap((r) => r.status === 'fulfilled' ? [r.value] : []);
1218
+ if (unsubs.length !== results.length) {
1219
+ // A partially-subscribed stream is worse than none: it looks live and is
1220
+ // silently blind to some of its topics. Tear it down and let the client
1221
+ // reconnect.
1222
+ for (const unsub of unsubs)
1223
+ unsub();
1224
+ channel.end();
1225
+ return error(503, 'Could not open the event stream');
1226
+ }
1227
+ const keepalive = setInterval(() => {
1228
+ channel.push(KEEPALIVE);
1229
+ }, KEEPALIVE_INTERVAL_MS);
1230
+ async function* generateSSE() {
1231
+ try {
1232
+ // Sent before anything else so the client knows the subscription is
1233
+ // live and which topics it actually got.
1234
+ yield formatSSE('ready', { subscribed, rejected });
1235
+ for await (const frame of channel) {
1236
+ yield frame === KEEPALIVE ? SSE_KEEPALIVE : formatSSE(frame.event, frame.data);
1237
+ }
1238
+ }
1239
+ finally {
1240
+ clearInterval(keepalive);
1241
+ for (const unsub of unsubs)
1242
+ unsub();
1243
+ channel.end();
1244
+ }
1245
+ }
1246
+ return {
1247
+ status: 200,
1248
+ body: null,
1249
+ headers: {
1250
+ 'Content-Type': 'text/event-stream',
1251
+ 'Cache-Control': 'no-cache',
1252
+ 'Connection': 'keep-alive',
1253
+ },
1254
+ stream: generateSSE(),
1255
+ };
1256
+ },
1257
+ });
1112
1258
  // ─── SSE: Execution Event Stream ───
1113
1259
  routes.push({
1114
1260
  method: 'GET',
@@ -1121,27 +1267,51 @@ _opts) {
1121
1267
  if (!eventBus) {
1122
1268
  return error(501, 'Event streaming not configured');
1123
1269
  }
1124
- const detail = await runtime.getExecutionDetail(asCtx(auth), execId);
1125
- if (!detail)
1270
+ // Subscribe BEFORE reading the snapshot, not after.
1271
+ //
1272
+ // Anything published in between is then delivered twice — once folded into
1273
+ // the snapshot, once live — which costs a redundant repaint, because every
1274
+ // execution event is idempotent. A miss is not recoverable: drop
1275
+ // `execution_completed` and the client sits on an open connection waiting
1276
+ // for a frame that has already been and gone. Subscribing second is a race
1277
+ // even in-process; against a distributed bus, where subscribe is a network
1278
+ // round trip, it is a race you lose regularly.
1279
+ //
1280
+ // Ordering it this way subscribes fractionally before the caller's access is
1281
+ // checked. Nothing is delivered in that window: every failure path below
1282
+ // tears the subscription down and drops the channel unread, and the first
1283
+ // frame is only ever yielded after `getExecutionDetail` has authorized it.
1284
+ const channel = createEventChannel();
1285
+ const unsub = await eventBus.subscribe(executionTopic(execId), channel.push);
1286
+ const found = await runtime
1287
+ .getExecutionDetail(asCtx(auth), execId)
1288
+ .catch((err) => {
1289
+ unsub();
1290
+ throw err;
1291
+ });
1292
+ if (!found) {
1293
+ unsub();
1126
1294
  return notFound(`Execution ${execId} not found`);
1295
+ }
1296
+ // Re-bound after the guard: `generateSSE` is a hoisted declaration, so TS
1297
+ // will not carry the null-narrowing of `found` into it.
1298
+ const detail = found;
1127
1299
  const isTerminal = ['COMPLETED', 'FAILED', 'CANCELLED'].includes(detail.execution.status);
1128
1300
  async function* generateSSE() {
1129
- // 1. Send initial snapshot
1130
- yield formatSSE('snapshot', {
1131
- ...detail.execution,
1132
- steps: detail.steps,
1133
- config: detail.config,
1134
- triggerData: detail.triggerData,
1135
- summary: detail.summary,
1136
- name: detail.name,
1137
- });
1138
- // 2. If already terminal, close immediately
1139
- if (isTerminal)
1140
- return;
1141
- // 3. Subscribe to live events
1142
- const channel = createEventChannel();
1143
- const unsub = eventBus.subscribe(execId, channel.push);
1144
1301
  try {
1302
+ // 1. Send the initial snapshot (buffered events wait their turn).
1303
+ yield formatSSE('snapshot', {
1304
+ ...detail.execution,
1305
+ steps: detail.steps,
1306
+ config: detail.config,
1307
+ triggerData: detail.triggerData,
1308
+ summary: detail.summary,
1309
+ name: detail.name,
1310
+ });
1311
+ // 2. If already terminal, close immediately.
1312
+ if (isTerminal)
1313
+ return;
1314
+ // 3. Drain live events.
1145
1315
  for await (const event of channel) {
1146
1316
  yield formatSSE(event.event, event.data);
1147
1317
  // Close stream on terminal events
@@ -1153,7 +1323,10 @@ _opts) {
1153
1323
  }
1154
1324
  }
1155
1325
  finally {
1326
+ // Runs however the generator ends — terminal event, client disconnect,
1327
+ // or a throw mid-yield.
1156
1328
  unsub();
1329
+ channel.end();
1157
1330
  }
1158
1331
  }
1159
1332
  return {
@@ -1287,7 +1460,7 @@ _opts) {
1287
1460
  if (typeof att.attachment.size === 'number' && att.attachment.size > MAX_MOUNT_BYTES)
1288
1461
  continue;
1289
1462
  try {
1290
- const bytes = await runtime.storage.read(att.attachment);
1463
+ const bytes = await runtime.storage.read(att.attachment, auth);
1291
1464
  preloadFiles.push({ path: att.sandboxPath, bytes });
1292
1465
  mountedPaths.set(att.attachment.data, att.sandboxPath);
1293
1466
  }