@shipfox/api-workflows 16.1.0 → 17.0.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.
@@ -1,6 +1,6 @@
1
1
  $ shipfox-swc && shipfox-temporal-bundle dist/temporal/workflows/index.js
2
- Successfully compiled: 123 files with swc (791.27ms)
3
- 2026-08-25T09:56:17.502Z [INFO] asset workflow-bundle-4d88ac6c229f6c77759a.js 3.31 MiB [emitted] [immutable] (name: main)
2
+ Successfully compiled: 123 files with swc (640.43ms)
3
+ 2026-08-26T08:19:28.149Z [INFO] asset workflow-bundle-4d88ac6c229f6c77759a.js 3.31 MiB [emitted] [immutable] (name: main)
4
4
  orphan modules 33.5 KiB [orphan] 21 modules
5
5
  runtime modules 1.13 KiB 5 modules
6
6
  modules by path ../../../node_modules/.pnpm/ 970 KiB 196 modules
@@ -16,6 +16,6 @@ optional modules 30 bytes [optional]
16
16
  __temporal_custom_payload_converter (ignored) 15 bytes [optional] [built] [code generated]
17
17
  __temporal_custom_failure_converter (ignored) 15 bytes [optional] [built] [code generated]
18
18
  ../../shared/node/temporal/dist/workflow-error-interceptor.js 1.21 KiB [built] [code generated]
19
- webpack 5.107.2 compiled successfully in 8503 ms
20
- 2026-08-25T09:56:17.537Z [INFO] Workflow bundle created { size: '3.31MB' }
19
+ webpack 5.107.2 compiled successfully in 8041 ms
20
+ 2026-08-26T08:19:28.180Z [INFO] Workflow bundle created { size: '3.31MB' }
21
21
  /home/runner/work/shipfox/shipfox/libs/api/workflows/dist/temporal/workflows/index.js: 3469609 bytes
@@ -1,2 +1 @@
1
1
  $ shipfox-tsc-check
2
- context canceled
package/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # @shipfox/api-workflows
2
2
 
3
+ ## 17.0.0
4
+
5
+ ### Minor Changes
6
+
7
+ - ed4981e: Adds the lease-authed agent session transcript transport: `GET /runs/jobs/current/steps/:stepId/session` returns the decrypted, still-gzipped head snapshot with manifest headers (or a 204 no-head marker), and `POST .../session?attempt=N&base_segment=S` commits segment `S + 1` under the claim/base CAS with idempotent-retry acks and 409 conflicts. The routes resolve the leased step through a new workflows inter-module method (`getLeasedAgentSessionContext`); the artifact store enforces the session blob cap.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [a4f56ff]
12
+ - Updated dependencies [5ae8b3d]
13
+ - Updated dependencies [ed4981e]
14
+ - Updated dependencies [a591e8a]
15
+ - Updated dependencies [918d84a]
16
+ - Updated dependencies [9f898d9]
17
+ - Updated dependencies [9f898d9]
18
+ - Updated dependencies [9fdba44]
19
+ - Updated dependencies [be5fb95]
20
+ - @shipfox/api-auth-context@17.0.0
21
+ - @shipfox/api-auth-dto@17.0.0
22
+ - @shipfox/api-agent-dto@17.0.0
23
+ - @shipfox/api-workflows-dto@17.0.0
24
+ - @shipfox/node-postgres@0.5.1
25
+ - @shipfox/workflow-document@3.3.1
26
+ - @shipfox/node-outbox@0.2.6
27
+ - @shipfox/api-definitions-dto@17.0.0
28
+ - @shipfox/expression@2.4.1
29
+
3
30
  ## 16.1.0
4
31
 
5
32
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"file":"inter-module.d.ts","sourceRoot":"","sources":["../../src/presentation/inter-module.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAChF,OAAO,KAAK,EAAC,4BAA4B,EAAC,MAAM,2CAA2C,CAAC;AAC5F,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,gDAAgD,CAAC;AAC7F,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AACjF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AACpF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAC,4BAA4B,EAAC,MAAM,yCAAyC,CAAC;AACrF,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EAIL,KAAK,uBAAuB,EAC7B,MAAM,uBAAuB,CAAC;AAgC/B,wBAAgB,sCAAsC,CAAC,MAAM,EAAE;IAC7D,KAAK,EAAE,sBAAsB,CAAC;IAC9B,WAAW,EAAE,4BAA4B,CAAC;IAC1C,UAAU,EAAE,2BAA2B,CAAC;IACxC,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,CAAC;IACnE,OAAO,EAAE,wBAAwB,CAAC;IAClC,YAAY,EAAE,wBAAwB,CAAC;IACvC,QAAQ,EAAE,oBAAoB,CAAC;CAChC,GAAG,uBAAuB,CAAC,OAAO,4BAA4B,CAAC,CA2I/D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAWlF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE/D"}
1
+ {"version":3,"file":"inter-module.d.ts","sourceRoot":"","sources":["../../src/presentation/inter-module.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAChF,OAAO,KAAK,EAAC,4BAA4B,EAAC,MAAM,2CAA2C,CAAC;AAC5F,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,gDAAgD,CAAC;AAC7F,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AACjF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AACpF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAC,4BAA4B,EAAC,MAAM,yCAAyC,CAAC;AACrF,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EAIL,KAAK,uBAAuB,EAC7B,MAAM,uBAAuB,CAAC;AAkC/B,wBAAgB,sCAAsC,CAAC,MAAM,EAAE;IAC7D,KAAK,EAAE,sBAAsB,CAAC;IAC9B,WAAW,EAAE,4BAA4B,CAAC;IAC1C,UAAU,EAAE,2BAA2B,CAAC;IACxC,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,CAAC;IACnE,OAAO,EAAE,wBAAwB,CAAC;IAClC,YAAY,EAAE,wBAAwB,CAAC;IACvC,QAAQ,EAAE,oBAAoB,CAAC;CAChC,GAAG,uBAAuB,CAAC,OAAO,4BAA4B,CAAC,CAgN/D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAWlF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE/D"}
@@ -1,4 +1,4 @@
1
- import { materializedAgentStepConfigSchema } from '@shipfox/api-agent-dto';
1
+ import { agentSessionDescriptorSchema, materializedAgentStepConfigSchema } from '@shipfox/api-agent-dto';
2
2
  import { workflowsInterModuleContract } from '@shipfox/api-workflows-dto/inter-module';
3
3
  import { createInterModuleKnownError, defineInterModulePresentation } from '@shipfox/inter-module';
4
4
  import { DEFAULT_HARNESS, harnessSchema } from '@shipfox/workflow-document';
@@ -6,9 +6,49 @@ import { InvalidJobRunnerLabelsError, WorkspaceDeletedError, WorkspaceNotFoundEr
6
6
  import { AgentConfigUnresolvableError, AgentIntegrationMaterializationError, DefinitionNotFoundError, InterpolationUnresolvableError, ProjectMismatchError, runDevWorkflow, runWorkflow } from '#core/index.js';
7
7
  import { resolveWorkflowRunTriggerReference } from '#core/resolve-trigger-reference.js';
8
8
  import { assertWorkspaceAdmitsNewJobs } from '#core/workspace-admission.js';
9
- import { getJobScope, getStepById, getStepByIdForJobExecution, listStepAttemptIdsByJobId } from '#db/index.js';
9
+ import { getJobScope, getStepAttemptDetail, getStepById, getStepByIdForJobExecution, listStepAttemptIdsByJobId } from '#db/index.js';
10
10
  import { deliverEventToListener } from '#db/job-listener-events.js';
11
11
  export function createWorkflowsInterModulePresentation(params) {
12
+ /**
13
+ * Shared lease + running-agent-step resolution for the lease-authed
14
+ * inter-module methods (`getLeasedAgentToolContext` and
15
+ * `getLeasedAgentSessionContext`): verifies the runner lease, resolves the
16
+ * step for the job execution, then validates the job scope, attempt, status,
17
+ * and agent type in one canonical order. The two seams previously
18
+ * copy-pasted this chain with diverging check orders (the tool method
19
+ * resolved the job scope before the attempt/status checks, the session
20
+ * method after), so the same underlying state surfaced different errors
21
+ * depending on the method; a single helper keeps error codes and check
22
+ * ordering from drifting.
23
+ *
24
+ * `loadRunningLeasedStep` (routes) deliberately keeps its own copy: it
25
+ * returns the run scope (trigger reference/origin state), skips the
26
+ * agent-type check, and speaks HTTP `ClientError`s instead of contract
27
+ * known errors.
28
+ */ async function resolveLeasedAgentStep(resolution) {
29
+ const { active: leaseIsActive } = await params.runners.getLeaseState({
30
+ jobId: resolution.input.jobId,
31
+ jobExecutionId: resolution.input.jobExecutionId,
32
+ runnerSessionId: resolution.input.runnerSessionId
33
+ });
34
+ if (!leaseIsActive) throw createInterModuleKnownError(resolution.method, 'lease-not-active', {});
35
+ const step = await getStepByIdForJobExecution({
36
+ stepId: resolution.input.stepId,
37
+ jobExecutionId: resolution.input.jobExecutionId
38
+ });
39
+ if (!step) throw createInterModuleKnownError(resolution.method, 'step-not-found', {});
40
+ const scope = await getJobScope(resolution.input.jobId);
41
+ if (!scope) throw createInterModuleKnownError(resolution.method, 'job-not-found', {});
42
+ if (step.currentAttempt !== resolution.input.attempt) {
43
+ throw createInterModuleKnownError(resolution.method, 'step-attempt-mismatch', {});
44
+ }
45
+ if (step.status !== 'running') throw createInterModuleKnownError(resolution.method, 'step-not-running', {});
46
+ if (step.type !== 'agent') throw createInterModuleKnownError(resolution.method, 'leased-step-not-agent', {});
47
+ return {
48
+ step,
49
+ scope
50
+ };
51
+ }
12
52
  return defineInterModulePresentation(workflowsInterModuleContract, {
13
53
  startRunFromTrigger: async (input)=>{
14
54
  try {
@@ -121,24 +161,10 @@ export function createWorkflowsInterModulePresentation(params) {
121
161
  },
122
162
  getLeasedAgentToolContext: async (input)=>{
123
163
  const method = workflowsInterModuleContract.methods.getLeasedAgentToolContext;
124
- const { active: leaseIsActive } = await params.runners.getLeaseState({
125
- jobId: input.jobId,
126
- jobExecutionId: input.jobExecutionId,
127
- runnerSessionId: input.runnerSessionId
164
+ const { step, scope } = await resolveLeasedAgentStep({
165
+ method,
166
+ input
128
167
  });
129
- if (!leaseIsActive) throw createInterModuleKnownError(method, 'lease-not-active', {});
130
- const step = await getStepByIdForJobExecution({
131
- stepId: input.stepId,
132
- jobExecutionId: input.jobExecutionId
133
- });
134
- if (!step) throw createInterModuleKnownError(method, 'step-not-found', {});
135
- const scope = await getJobScope(input.jobId);
136
- if (!scope) throw createInterModuleKnownError(method, 'job-not-found', {});
137
- if (step.currentAttempt !== input.attempt) {
138
- throw createInterModuleKnownError(method, 'step-attempt-mismatch', {});
139
- }
140
- if (step.status !== 'running') throw createInterModuleKnownError(method, 'step-not-running', {});
141
- if (step.type !== 'agent') throw createInterModuleKnownError(method, 'leased-step-not-agent', {});
142
168
  const config = materializedAgentStepConfigSchema.safeParse(step.config);
143
169
  if (!config.success) {
144
170
  throw createInterModuleKnownError(method, 'agent-step-config-invalid', {});
@@ -147,6 +173,41 @@ export function createWorkflowsInterModulePresentation(params) {
147
173
  workspaceId: scope.workspaceId,
148
174
  integrations: config.data.integrations ?? []
149
175
  };
176
+ },
177
+ getLeasedAgentSessionContext: async (input)=>{
178
+ const method = workflowsInterModuleContract.methods.getLeasedAgentSessionContext;
179
+ const { scope } = await resolveLeasedAgentStep({
180
+ method,
181
+ input
182
+ });
183
+ const detail = await getStepAttemptDetail({
184
+ stepId: input.stepId,
185
+ attempt: input.attempt
186
+ });
187
+ if (!detail) throw createInterModuleKnownError(method, 'step-attempt-mismatch', {});
188
+ // The dispatch integration records the resolved descriptor on the step
189
+ // attempt's config; anything else is a recording we cannot trust.
190
+ const recorded = detail.attempt.config?.session;
191
+ if (recorded === undefined || recorded === null) {
192
+ return {
193
+ workspaceId: scope.workspaceId,
194
+ projectId: scope.projectId,
195
+ workflowRunAttemptId: detail.workflowRunAttemptId,
196
+ stepAttemptId: detail.attempt.id,
197
+ session: null
198
+ };
199
+ }
200
+ const parsed = agentSessionDescriptorSchema.safeParse(recorded);
201
+ if (!parsed.success) {
202
+ throw createInterModuleKnownError(method, 'step-session-config-invalid', {});
203
+ }
204
+ return {
205
+ workspaceId: scope.workspaceId,
206
+ projectId: scope.projectId,
207
+ workflowRunAttemptId: detail.workflowRunAttemptId,
208
+ stepAttemptId: detail.attempt.id,
209
+ session: parsed.data
210
+ };
150
211
  }
151
212
  });
152
213
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/presentation/inter-module.ts"],"sourcesContent":["import {materializedAgentStepConfigSchema} from '@shipfox/api-agent-dto';\nimport type {AgentInterModuleClient} from '@shipfox/api-agent-dto/inter-module';\nimport type {DefinitionsInterModuleClient} from '@shipfox/api-definitions-dto/inter-module';\nimport type {IntegrationsModuleClient} from '@shipfox/api-integration-core-dto/inter-module';\nimport type {ProjectsModuleClient} from '@shipfox/api-projects-dto/inter-module';\nimport type {RunnersInterModuleClient} from '@shipfox/api-runners-dto/inter-module';\nimport type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\nimport {workflowsInterModuleContract} from '@shipfox/api-workflows-dto/inter-module';\nimport type {WorkspacesInterModuleClient} from '@shipfox/api-workspaces-dto/inter-module';\nimport {\n createInterModuleKnownError,\n defineInterModulePresentation,\n type InterModuleKnownErrorFor,\n type InterModulePresentation,\n} from '@shipfox/inter-module';\nimport {DEFAULT_HARNESS, harnessSchema} from '@shipfox/workflow-document';\nimport type {WorkflowRunTriggerReference} from '#core/entities/workflow-run.js';\nimport {\n InvalidJobRunnerLabelsError,\n WorkspaceDeletedError,\n WorkspaceNotFoundError,\n WorkspaceSuspendedError,\n} from '#core/errors.js';\nimport {\n AgentConfigUnresolvableError,\n AgentIntegrationMaterializationError,\n DefinitionNotFoundError,\n InterpolationUnresolvableError,\n ProjectMismatchError,\n runDevWorkflow,\n runWorkflow,\n} from '#core/index.js';\nimport {resolveWorkflowRunTriggerReference} from '#core/resolve-trigger-reference.js';\nimport {assertWorkspaceAdmitsNewJobs} from '#core/workspace-admission.js';\nimport {\n getJobScope,\n getStepById,\n getStepByIdForJobExecution,\n listStepAttemptIdsByJobId,\n} from '#db/index.js';\nimport {deliverEventToListener} from '#db/job-listener-events.js';\n\ntype WorkspaceAdmissionKnownError = InterModuleKnownErrorFor<\n typeof workflowsInterModuleContract.methods.deliverEventToJobListener\n>;\n\nexport function createWorkflowsInterModulePresentation(params: {\n agent: AgentInterModuleClient;\n definitions: DefinitionsInterModuleClient;\n workspaces: WorkspacesInterModuleClient;\n secrets: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'>;\n runners: RunnersInterModuleClient;\n integrations: IntegrationsModuleClient;\n projects: ProjectsModuleClient;\n}): InterModulePresentation<typeof workflowsInterModuleContract> {\n return defineInterModulePresentation(workflowsInterModuleContract, {\n startRunFromTrigger: async (input) => {\n try {\n await assertWorkspaceAdmitsNewJobs(params.workspaces, input.workspaceId);\n const run = await runWorkflow(\n params.definitions,\n {\n agent: params.agent,\n workspaceId: input.workspaceId,\n projectId: input.projectId,\n definitionId: input.definitionId,\n triggerPayload: input.triggerPayload,\n triggerConnectionId: input.triggerConnectionId,\n inputs: input.inputs,\n triggerIdempotencyKey: input.idempotencyKey,\n integrations: params.integrations,\n projects: params.projects,\n },\n {secrets: params.secrets},\n );\n return {id: run.id, name: run.name};\n } catch (error) {\n throw toStartRunKnownError(error, input.definitionId);\n }\n },\n startDevRun: async (input) => {\n try {\n await assertWorkspaceAdmitsNewJobs(params.workspaces, input.workspaceId);\n const run = await runDevWorkflow(\n params.agent,\n {\n workspaceId: input.workspaceId,\n projectId: input.projectId,\n workflowId: input.workflowId,\n model: input.model,\n sourceSnapshot: input.sourceSnapshot,\n devSource: {\n ...input.devSource,\n replayOfEventId: input.devSource.replayOfEventId ?? null,\n },\n triggerPayload: input.triggerPayload,\n triggerConnectionId: input.triggerConnectionId,\n inputs: input.inputs,\n integrations: params.integrations,\n projects: params.projects,\n },\n {secrets: params.secrets},\n );\n return {id: run.id, name: run.name};\n } catch (error) {\n throw toStartDevRunKnownError(error);\n }\n },\n resolveWorkflowRunTriggerReference: async (input) =>\n await resolveWorkflowRunTriggerReference({\n workspaceId: input.workspaceId,\n triggerConnectionId: input.triggerConnectionId,\n triggerPayload: input.triggerPayload,\n integrations: params.integrations,\n projects: params.projects,\n }),\n deliverEventToJobListener: async (input) => {\n const method = workflowsInterModuleContract.methods.deliverEventToJobListener;\n try {\n const scope = input.disposition === 'fire' ? await getJobScope(input.jobId) : undefined;\n if (scope) {\n await assertWorkspaceAdmitsNewJobs(params.workspaces, scope.workspaceId);\n }\n\n let triggerReference: WorkflowRunTriggerReference | null = null;\n if (input.triggerReference !== undefined) {\n triggerReference = input.triggerReference;\n } else if (scope) {\n triggerReference = await resolveWorkflowRunTriggerReference({\n workspaceId: scope.workspaceId,\n triggerConnectionId: input.triggerConnectionId,\n triggerPayload: {\n provider: input.provider,\n source: input.source,\n event: input.event,\n deliveryId: input.deliveryId,\n data: input.payload,\n },\n integrations: params.integrations,\n projects: params.projects,\n });\n }\n return await deliverEventToListener({\n ...input,\n triggerReference,\n receivedAt: new Date(input.receivedAt),\n });\n } catch (error) {\n const workspaceError = toWorkspaceAdmissionKnownError(method, error);\n if (workspaceError !== undefined) throw workspaceError;\n throw error;\n }\n },\n getStepLogContext: async ({stepId}) => {\n const step = await getStepById(stepId);\n const parsed = harnessSchema.safeParse(step?.config.harness);\n return {harness: parsed.success ? parsed.data : DEFAULT_HARNESS};\n },\n listJobStepAttempts: async ({jobId}) => {\n return {stepAttemptIds: await listStepAttemptIdsByJobId(jobId)};\n },\n getLeasedAgentToolContext: async (input) => {\n const method = workflowsInterModuleContract.methods.getLeasedAgentToolContext;\n const {active: leaseIsActive} = await params.runners.getLeaseState({\n jobId: input.jobId,\n jobExecutionId: input.jobExecutionId,\n runnerSessionId: input.runnerSessionId,\n });\n if (!leaseIsActive) throw createInterModuleKnownError(method, 'lease-not-active', {});\n\n const step = await getStepByIdForJobExecution({\n stepId: input.stepId,\n jobExecutionId: input.jobExecutionId,\n });\n if (!step) throw createInterModuleKnownError(method, 'step-not-found', {});\n\n const scope = await getJobScope(input.jobId);\n if (!scope) throw createInterModuleKnownError(method, 'job-not-found', {});\n if (step.currentAttempt !== input.attempt) {\n throw createInterModuleKnownError(method, 'step-attempt-mismatch', {});\n }\n if (step.status !== 'running')\n throw createInterModuleKnownError(method, 'step-not-running', {});\n if (step.type !== 'agent')\n throw createInterModuleKnownError(method, 'leased-step-not-agent', {});\n\n const config = materializedAgentStepConfigSchema.safeParse(step.config);\n if (!config.success) {\n throw createInterModuleKnownError(method, 'agent-step-config-invalid', {});\n }\n return {workspaceId: scope.workspaceId, integrations: config.data.integrations ?? []};\n },\n });\n}\n\nexport function toStartRunKnownError(error: unknown, definitionId: string): unknown {\n const method = workflowsInterModuleContract.methods.startRunFromTrigger;\n const mapped = toRunCreationKnownError(method, error);\n if (mapped !== undefined) return mapped;\n if (error instanceof DefinitionNotFoundError) {\n return createInterModuleKnownError(method, 'definition-not-found', {definitionId});\n }\n if (error instanceof ProjectMismatchError) {\n return createInterModuleKnownError(method, 'project-mismatch', {});\n }\n return error;\n}\n\nexport function toStartDevRunKnownError(error: unknown): unknown {\n return toRunCreationKnownError(workflowsInterModuleContract.methods.startDevRun, error) ?? error;\n}\n\nfunction toRunCreationKnownError(\n method:\n | typeof workflowsInterModuleContract.methods.startRunFromTrigger\n | typeof workflowsInterModuleContract.methods.startDevRun,\n error: unknown,\n): unknown {\n const workspaceError = toWorkspaceAdmissionKnownError(method, error);\n if (workspaceError !== undefined) return workspaceError;\n if (error instanceof AgentConfigUnresolvableError) {\n return createInterModuleKnownError(method, 'agent-config-unresolvable', {\n definitionId: error.definitionId,\n });\n }\n if (error instanceof AgentIntegrationMaterializationError) {\n return createInterModuleKnownError(method, 'agent-integration-materialization-failed', {});\n }\n if (error instanceof InterpolationUnresolvableError) {\n return createInterModuleKnownError(method, 'interpolation-unresolvable', {\n definitionId: error.definitionId,\n field: error.field,\n source: error.source,\n ...(error.envKey === undefined ? {} : {envKey: error.envKey}),\n });\n }\n if (error instanceof InvalidJobRunnerLabelsError) {\n return createInterModuleKnownError(method, 'invalid-job-runner-labels', {\n labels: [...error.labels],\n });\n }\n return undefined;\n}\n\nfunction toWorkspaceAdmissionKnownError(\n method:\n | typeof workflowsInterModuleContract.methods.startRunFromTrigger\n | typeof workflowsInterModuleContract.methods.startDevRun\n | typeof workflowsInterModuleContract.methods.deliverEventToJobListener,\n error: unknown,\n): WorkspaceAdmissionKnownError | undefined {\n if (error instanceof WorkspaceSuspendedError) {\n return createInterModuleKnownError(method, 'workspace-suspended', {\n workspaceId: error.workspaceId,\n });\n }\n if (error instanceof WorkspaceDeletedError) {\n return createInterModuleKnownError(method, 'workspace-deleted', {\n workspaceId: error.workspaceId,\n });\n }\n if (error instanceof WorkspaceNotFoundError) {\n return createInterModuleKnownError(method, 'workspace-not-found', {\n workspaceId: error.workspaceId,\n });\n }\n return undefined;\n}\n"],"names":["materializedAgentStepConfigSchema","workflowsInterModuleContract","createInterModuleKnownError","defineInterModulePresentation","DEFAULT_HARNESS","harnessSchema","InvalidJobRunnerLabelsError","WorkspaceDeletedError","WorkspaceNotFoundError","WorkspaceSuspendedError","AgentConfigUnresolvableError","AgentIntegrationMaterializationError","DefinitionNotFoundError","InterpolationUnresolvableError","ProjectMismatchError","runDevWorkflow","runWorkflow","resolveWorkflowRunTriggerReference","assertWorkspaceAdmitsNewJobs","getJobScope","getStepById","getStepByIdForJobExecution","listStepAttemptIdsByJobId","deliverEventToListener","createWorkflowsInterModulePresentation","params","startRunFromTrigger","input","workspaces","workspaceId","run","definitions","agent","projectId","definitionId","triggerPayload","triggerConnectionId","inputs","triggerIdempotencyKey","idempotencyKey","integrations","projects","secrets","id","name","error","toStartRunKnownError","startDevRun","workflowId","model","sourceSnapshot","devSource","replayOfEventId","toStartDevRunKnownError","deliverEventToJobListener","method","methods","scope","disposition","jobId","undefined","triggerReference","provider","source","event","deliveryId","data","payload","receivedAt","Date","workspaceError","toWorkspaceAdmissionKnownError","getStepLogContext","stepId","step","parsed","safeParse","config","harness","success","listJobStepAttempts","stepAttemptIds","getLeasedAgentToolContext","active","leaseIsActive","runners","getLeaseState","jobExecutionId","runnerSessionId","currentAttempt","attempt","status","type","mapped","toRunCreationKnownError","field","envKey","labels"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/presentation/inter-module.ts"],"sourcesContent":["import {\n agentSessionDescriptorSchema,\n materializedAgentStepConfigSchema,\n} from '@shipfox/api-agent-dto';\nimport type {AgentInterModuleClient} from '@shipfox/api-agent-dto/inter-module';\nimport type {DefinitionsInterModuleClient} from '@shipfox/api-definitions-dto/inter-module';\nimport type {IntegrationsModuleClient} from '@shipfox/api-integration-core-dto/inter-module';\nimport type {ProjectsModuleClient} from '@shipfox/api-projects-dto/inter-module';\nimport type {RunnersInterModuleClient} from '@shipfox/api-runners-dto/inter-module';\nimport type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\nimport {workflowsInterModuleContract} from '@shipfox/api-workflows-dto/inter-module';\nimport type {WorkspacesInterModuleClient} from '@shipfox/api-workspaces-dto/inter-module';\nimport {\n createInterModuleKnownError,\n defineInterModulePresentation,\n type InterModuleKnownErrorFor,\n type InterModulePresentation,\n} from '@shipfox/inter-module';\nimport {DEFAULT_HARNESS, harnessSchema} from '@shipfox/workflow-document';\nimport type {Step} from '#core/entities/step.js';\nimport type {WorkflowRunTriggerReference} from '#core/entities/workflow-run.js';\nimport {\n InvalidJobRunnerLabelsError,\n WorkspaceDeletedError,\n WorkspaceNotFoundError,\n WorkspaceSuspendedError,\n} from '#core/errors.js';\nimport {\n AgentConfigUnresolvableError,\n AgentIntegrationMaterializationError,\n DefinitionNotFoundError,\n InterpolationUnresolvableError,\n ProjectMismatchError,\n runDevWorkflow,\n runWorkflow,\n} from '#core/index.js';\nimport {resolveWorkflowRunTriggerReference} from '#core/resolve-trigger-reference.js';\nimport {assertWorkspaceAdmitsNewJobs} from '#core/workspace-admission.js';\nimport {\n getJobScope,\n getStepAttemptDetail,\n getStepById,\n getStepByIdForJobExecution,\n listStepAttemptIdsByJobId,\n} from '#db/index.js';\nimport {deliverEventToListener} from '#db/job-listener-events.js';\n\ntype WorkspaceAdmissionKnownError = InterModuleKnownErrorFor<\n typeof workflowsInterModuleContract.methods.deliverEventToJobListener\n>;\n\nexport function createWorkflowsInterModulePresentation(params: {\n agent: AgentInterModuleClient;\n definitions: DefinitionsInterModuleClient;\n workspaces: WorkspacesInterModuleClient;\n secrets: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'>;\n runners: RunnersInterModuleClient;\n integrations: IntegrationsModuleClient;\n projects: ProjectsModuleClient;\n}): InterModulePresentation<typeof workflowsInterModuleContract> {\n /**\n * Shared lease + running-agent-step resolution for the lease-authed\n * inter-module methods (`getLeasedAgentToolContext` and\n * `getLeasedAgentSessionContext`): verifies the runner lease, resolves the\n * step for the job execution, then validates the job scope, attempt, status,\n * and agent type in one canonical order. The two seams previously\n * copy-pasted this chain with diverging check orders (the tool method\n * resolved the job scope before the attempt/status checks, the session\n * method after), so the same underlying state surfaced different errors\n * depending on the method; a single helper keeps error codes and check\n * ordering from drifting.\n *\n * `loadRunningLeasedStep` (routes) deliberately keeps its own copy: it\n * returns the run scope (trigger reference/origin state), skips the\n * agent-type check, and speaks HTTP `ClientError`s instead of contract\n * known errors.\n */\n async function resolveLeasedAgentStep(resolution: {\n method:\n | typeof workflowsInterModuleContract.methods.getLeasedAgentToolContext\n | typeof workflowsInterModuleContract.methods.getLeasedAgentSessionContext;\n input: {\n jobId: string;\n jobExecutionId: string;\n runnerSessionId: string;\n stepId: string;\n attempt: number;\n };\n }): Promise<{\n step: Step;\n scope: NonNullable<Awaited<ReturnType<typeof getJobScope>>>;\n }> {\n const {active: leaseIsActive} = await params.runners.getLeaseState({\n jobId: resolution.input.jobId,\n jobExecutionId: resolution.input.jobExecutionId,\n runnerSessionId: resolution.input.runnerSessionId,\n });\n if (!leaseIsActive)\n throw createInterModuleKnownError(resolution.method, 'lease-not-active', {});\n\n const step = await getStepByIdForJobExecution({\n stepId: resolution.input.stepId,\n jobExecutionId: resolution.input.jobExecutionId,\n });\n if (!step) throw createInterModuleKnownError(resolution.method, 'step-not-found', {});\n\n const scope = await getJobScope(resolution.input.jobId);\n if (!scope) throw createInterModuleKnownError(resolution.method, 'job-not-found', {});\n if (step.currentAttempt !== resolution.input.attempt) {\n throw createInterModuleKnownError(resolution.method, 'step-attempt-mismatch', {});\n }\n if (step.status !== 'running')\n throw createInterModuleKnownError(resolution.method, 'step-not-running', {});\n if (step.type !== 'agent')\n throw createInterModuleKnownError(resolution.method, 'leased-step-not-agent', {});\n\n return {step, scope};\n }\n\n return defineInterModulePresentation(workflowsInterModuleContract, {\n startRunFromTrigger: async (input) => {\n try {\n await assertWorkspaceAdmitsNewJobs(params.workspaces, input.workspaceId);\n const run = await runWorkflow(\n params.definitions,\n {\n agent: params.agent,\n workspaceId: input.workspaceId,\n projectId: input.projectId,\n definitionId: input.definitionId,\n triggerPayload: input.triggerPayload,\n triggerConnectionId: input.triggerConnectionId,\n inputs: input.inputs,\n triggerIdempotencyKey: input.idempotencyKey,\n integrations: params.integrations,\n projects: params.projects,\n },\n {secrets: params.secrets},\n );\n return {id: run.id, name: run.name};\n } catch (error) {\n throw toStartRunKnownError(error, input.definitionId);\n }\n },\n startDevRun: async (input) => {\n try {\n await assertWorkspaceAdmitsNewJobs(params.workspaces, input.workspaceId);\n const run = await runDevWorkflow(\n params.agent,\n {\n workspaceId: input.workspaceId,\n projectId: input.projectId,\n workflowId: input.workflowId,\n model: input.model,\n sourceSnapshot: input.sourceSnapshot,\n devSource: {\n ...input.devSource,\n replayOfEventId: input.devSource.replayOfEventId ?? null,\n },\n triggerPayload: input.triggerPayload,\n triggerConnectionId: input.triggerConnectionId,\n inputs: input.inputs,\n integrations: params.integrations,\n projects: params.projects,\n },\n {secrets: params.secrets},\n );\n return {id: run.id, name: run.name};\n } catch (error) {\n throw toStartDevRunKnownError(error);\n }\n },\n resolveWorkflowRunTriggerReference: async (input) =>\n await resolveWorkflowRunTriggerReference({\n workspaceId: input.workspaceId,\n triggerConnectionId: input.triggerConnectionId,\n triggerPayload: input.triggerPayload,\n integrations: params.integrations,\n projects: params.projects,\n }),\n deliverEventToJobListener: async (input) => {\n const method = workflowsInterModuleContract.methods.deliverEventToJobListener;\n try {\n const scope = input.disposition === 'fire' ? await getJobScope(input.jobId) : undefined;\n if (scope) {\n await assertWorkspaceAdmitsNewJobs(params.workspaces, scope.workspaceId);\n }\n\n let triggerReference: WorkflowRunTriggerReference | null = null;\n if (input.triggerReference !== undefined) {\n triggerReference = input.triggerReference;\n } else if (scope) {\n triggerReference = await resolveWorkflowRunTriggerReference({\n workspaceId: scope.workspaceId,\n triggerConnectionId: input.triggerConnectionId,\n triggerPayload: {\n provider: input.provider,\n source: input.source,\n event: input.event,\n deliveryId: input.deliveryId,\n data: input.payload,\n },\n integrations: params.integrations,\n projects: params.projects,\n });\n }\n return await deliverEventToListener({\n ...input,\n triggerReference,\n receivedAt: new Date(input.receivedAt),\n });\n } catch (error) {\n const workspaceError = toWorkspaceAdmissionKnownError(method, error);\n if (workspaceError !== undefined) throw workspaceError;\n throw error;\n }\n },\n getStepLogContext: async ({stepId}) => {\n const step = await getStepById(stepId);\n const parsed = harnessSchema.safeParse(step?.config.harness);\n return {harness: parsed.success ? parsed.data : DEFAULT_HARNESS};\n },\n listJobStepAttempts: async ({jobId}) => {\n return {stepAttemptIds: await listStepAttemptIdsByJobId(jobId)};\n },\n getLeasedAgentToolContext: async (input) => {\n const method = workflowsInterModuleContract.methods.getLeasedAgentToolContext;\n const {step, scope} = await resolveLeasedAgentStep({method, input});\n\n const config = materializedAgentStepConfigSchema.safeParse(step.config);\n if (!config.success) {\n throw createInterModuleKnownError(method, 'agent-step-config-invalid', {});\n }\n return {workspaceId: scope.workspaceId, integrations: config.data.integrations ?? []};\n },\n getLeasedAgentSessionContext: async (input) => {\n const method = workflowsInterModuleContract.methods.getLeasedAgentSessionContext;\n const {scope} = await resolveLeasedAgentStep({method, input});\n\n const detail = await getStepAttemptDetail({stepId: input.stepId, attempt: input.attempt});\n if (!detail) throw createInterModuleKnownError(method, 'step-attempt-mismatch', {});\n\n // The dispatch integration records the resolved descriptor on the step\n // attempt's config; anything else is a recording we cannot trust.\n const recorded = detail.attempt.config?.session;\n if (recorded === undefined || recorded === null) {\n return {\n workspaceId: scope.workspaceId,\n projectId: scope.projectId,\n workflowRunAttemptId: detail.workflowRunAttemptId,\n stepAttemptId: detail.attempt.id,\n session: null,\n };\n }\n const parsed = agentSessionDescriptorSchema.safeParse(recorded);\n if (!parsed.success) {\n throw createInterModuleKnownError(method, 'step-session-config-invalid', {});\n }\n return {\n workspaceId: scope.workspaceId,\n projectId: scope.projectId,\n workflowRunAttemptId: detail.workflowRunAttemptId,\n stepAttemptId: detail.attempt.id,\n session: parsed.data,\n };\n },\n });\n}\n\nexport function toStartRunKnownError(error: unknown, definitionId: string): unknown {\n const method = workflowsInterModuleContract.methods.startRunFromTrigger;\n const mapped = toRunCreationKnownError(method, error);\n if (mapped !== undefined) return mapped;\n if (error instanceof DefinitionNotFoundError) {\n return createInterModuleKnownError(method, 'definition-not-found', {definitionId});\n }\n if (error instanceof ProjectMismatchError) {\n return createInterModuleKnownError(method, 'project-mismatch', {});\n }\n return error;\n}\n\nexport function toStartDevRunKnownError(error: unknown): unknown {\n return toRunCreationKnownError(workflowsInterModuleContract.methods.startDevRun, error) ?? error;\n}\n\nfunction toRunCreationKnownError(\n method:\n | typeof workflowsInterModuleContract.methods.startRunFromTrigger\n | typeof workflowsInterModuleContract.methods.startDevRun,\n error: unknown,\n): unknown {\n const workspaceError = toWorkspaceAdmissionKnownError(method, error);\n if (workspaceError !== undefined) return workspaceError;\n if (error instanceof AgentConfigUnresolvableError) {\n return createInterModuleKnownError(method, 'agent-config-unresolvable', {\n definitionId: error.definitionId,\n });\n }\n if (error instanceof AgentIntegrationMaterializationError) {\n return createInterModuleKnownError(method, 'agent-integration-materialization-failed', {});\n }\n if (error instanceof InterpolationUnresolvableError) {\n return createInterModuleKnownError(method, 'interpolation-unresolvable', {\n definitionId: error.definitionId,\n field: error.field,\n source: error.source,\n ...(error.envKey === undefined ? {} : {envKey: error.envKey}),\n });\n }\n if (error instanceof InvalidJobRunnerLabelsError) {\n return createInterModuleKnownError(method, 'invalid-job-runner-labels', {\n labels: [...error.labels],\n });\n }\n return undefined;\n}\n\nfunction toWorkspaceAdmissionKnownError(\n method:\n | typeof workflowsInterModuleContract.methods.startRunFromTrigger\n | typeof workflowsInterModuleContract.methods.startDevRun\n | typeof workflowsInterModuleContract.methods.deliverEventToJobListener,\n error: unknown,\n): WorkspaceAdmissionKnownError | undefined {\n if (error instanceof WorkspaceSuspendedError) {\n return createInterModuleKnownError(method, 'workspace-suspended', {\n workspaceId: error.workspaceId,\n });\n }\n if (error instanceof WorkspaceDeletedError) {\n return createInterModuleKnownError(method, 'workspace-deleted', {\n workspaceId: error.workspaceId,\n });\n }\n if (error instanceof WorkspaceNotFoundError) {\n return createInterModuleKnownError(method, 'workspace-not-found', {\n workspaceId: error.workspaceId,\n });\n }\n return undefined;\n}\n"],"names":["agentSessionDescriptorSchema","materializedAgentStepConfigSchema","workflowsInterModuleContract","createInterModuleKnownError","defineInterModulePresentation","DEFAULT_HARNESS","harnessSchema","InvalidJobRunnerLabelsError","WorkspaceDeletedError","WorkspaceNotFoundError","WorkspaceSuspendedError","AgentConfigUnresolvableError","AgentIntegrationMaterializationError","DefinitionNotFoundError","InterpolationUnresolvableError","ProjectMismatchError","runDevWorkflow","runWorkflow","resolveWorkflowRunTriggerReference","assertWorkspaceAdmitsNewJobs","getJobScope","getStepAttemptDetail","getStepById","getStepByIdForJobExecution","listStepAttemptIdsByJobId","deliverEventToListener","createWorkflowsInterModulePresentation","params","resolveLeasedAgentStep","resolution","active","leaseIsActive","runners","getLeaseState","jobId","input","jobExecutionId","runnerSessionId","method","step","stepId","scope","currentAttempt","attempt","status","type","startRunFromTrigger","workspaces","workspaceId","run","definitions","agent","projectId","definitionId","triggerPayload","triggerConnectionId","inputs","triggerIdempotencyKey","idempotencyKey","integrations","projects","secrets","id","name","error","toStartRunKnownError","startDevRun","workflowId","model","sourceSnapshot","devSource","replayOfEventId","toStartDevRunKnownError","deliverEventToJobListener","methods","disposition","undefined","triggerReference","provider","source","event","deliveryId","data","payload","receivedAt","Date","workspaceError","toWorkspaceAdmissionKnownError","getStepLogContext","parsed","safeParse","config","harness","success","listJobStepAttempts","stepAttemptIds","getLeasedAgentToolContext","getLeasedAgentSessionContext","detail","recorded","session","workflowRunAttemptId","stepAttemptId","mapped","toRunCreationKnownError","field","envKey","labels"],"mappings":"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"}