@motiadev/core 0.17.3-beta.184 → 0.17.4-beta.186-859040

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.
@@ -50,7 +50,7 @@ const callStepFile = (options, motia) => {
50
50
  step: step.config.name,
51
51
  timeout: timeoutSeconds
52
52
  });
53
- await tracer.end({ message: errorMessage });
53
+ tracer.end({ message: errorMessage });
54
54
  trackEvent("step_execution_timeout", {
55
55
  stepName: step.config.name,
56
56
  traceId,
@@ -68,22 +68,22 @@ const callStepFile = (options, motia) => {
68
68
  traceId,
69
69
  message: err.message
70
70
  });
71
- await tracer.end({
71
+ tracer.end({
72
72
  message: err.message,
73
73
  code: err.code,
74
74
  stack: err.stack?.replace(/* @__PURE__ */ new RegExp(`${motia.lockedData.baseDir}/`), "")
75
75
  });
76
76
  reject(err ?? /* @__PURE__ */ new Error("Handler execution failed"));
77
- } else await tracer.end();
77
+ } else tracer.end();
78
78
  processManager.kill();
79
79
  });
80
80
  processManager.handler("log", async (input) => logger.log(input));
81
81
  processManager.handler("state.get", async (input) => {
82
- await tracer.stateOperation("get", input);
82
+ tracer.stateOperation("get", input);
83
83
  return motia.state.get(input.traceId, input.key);
84
84
  });
85
85
  processManager.handler("state.set", async (input) => {
86
- await tracer.stateOperation("set", {
86
+ tracer.stateOperation("set", {
87
87
  traceId: input.traceId,
88
88
  key: input.key,
89
89
  value: input.value
@@ -91,15 +91,15 @@ const callStepFile = (options, motia) => {
91
91
  return motia.state.set(input.traceId, input.key, input.value);
92
92
  });
93
93
  processManager.handler("state.delete", async (input) => {
94
- await tracer.stateOperation("delete", input);
94
+ tracer.stateOperation("delete", input);
95
95
  return motia.state.delete(input.traceId, input.key);
96
96
  });
97
97
  processManager.handler("state.clear", async (input) => {
98
- await tracer.stateOperation("clear", input);
98
+ tracer.stateOperation("clear", input);
99
99
  return motia.state.clear(input.traceId);
100
100
  });
101
101
  processManager.handler(`state.getGroup`, async (input) => {
102
- await tracer.stateOperation("getGroup", input);
102
+ tracer.stateOperation("getGroup", input);
103
103
  return motia.state.getGroup(input.groupId);
104
104
  });
105
105
  processManager.handler("result", async (input) => {
@@ -110,10 +110,10 @@ const callStepFile = (options, motia) => {
110
110
  processManager.handler("emit", async (input) => {
111
111
  const flows$1 = step.config.flows;
112
112
  if (!isAllowedToEmit(step, input.topic)) {
113
- await tracer.emitOperation(input.topic, input.data, false);
113
+ tracer.emitOperation(input.topic, input.data, false);
114
114
  return motia.printer.printInvalidEmit(step, input.topic);
115
115
  }
116
- await tracer.emitOperation(input.topic, input.data, true);
116
+ tracer.emitOperation(input.topic, input.data, true);
117
117
  return motia.eventAdapter.emit({
118
118
  ...input,
119
119
  traceId,
@@ -125,11 +125,11 @@ const callStepFile = (options, motia) => {
125
125
  Object.entries(streamConfig).forEach(([name, streamFactory]) => {
126
126
  const stateStream = streamFactory();
127
127
  processManager.handler(`streams.${name}.get`, async (input) => {
128
- await tracer.streamOperation(name, "get", input);
128
+ tracer.streamOperation(name, "get", input);
129
129
  return stateStream.get(input.groupId, input.id);
130
130
  });
131
131
  processManager.handler(`streams.${name}.set`, async (input) => {
132
- await tracer.streamOperation(name, "set", {
132
+ tracer.streamOperation(name, "set", {
133
133
  groupId: input.groupId,
134
134
  id: input.id,
135
135
  data: input.data
@@ -137,15 +137,15 @@ const callStepFile = (options, motia) => {
137
137
  return stateStream.set(input.groupId, input.id, input.data);
138
138
  });
139
139
  processManager.handler(`streams.${name}.delete`, async (input) => {
140
- await tracer.streamOperation(name, "delete", input);
140
+ tracer.streamOperation(name, "delete", input);
141
141
  return stateStream.delete(input.groupId, input.id);
142
142
  });
143
143
  processManager.handler(`streams.${name}.getGroup`, async (input) => {
144
- await tracer.streamOperation(name, "getGroup", input);
144
+ tracer.streamOperation(name, "getGroup", input);
145
145
  return stateStream.getGroup(input.groupId);
146
146
  });
147
147
  processManager.handler(`streams.${name}.send`, async (input) => {
148
- await tracer.streamOperation(name, "send", input);
148
+ tracer.streamOperation(name, "send", input);
149
149
  return stateStream.send(input.channel, input.event);
150
150
  });
151
151
  });
@@ -166,7 +166,7 @@ const callStepFile = (options, motia) => {
166
166
  message: `Process exited with code ${code}`,
167
167
  code
168
168
  };
169
- await tracer.end(error);
169
+ tracer.end(error);
170
170
  trackEvent("step_execution_error", {
171
171
  stepName: step.config.name,
172
172
  traceId,
@@ -174,14 +174,14 @@ const callStepFile = (options, motia) => {
174
174
  });
175
175
  reject(`Process exited with code ${code}`);
176
176
  } else {
177
- await tracer.end();
177
+ tracer.end();
178
178
  resolve(result);
179
179
  }
180
180
  });
181
181
  processManager.onProcessError(async (error) => {
182
182
  if (timeoutId) clearTimeout(timeoutId);
183
183
  processManager.close();
184
- await tracer.end({
184
+ tracer.end({
185
185
  message: error.message,
186
186
  code: error.code,
187
187
  stack: error.stack
@@ -198,7 +198,7 @@ const callStepFile = (options, motia) => {
198
198
  });
199
199
  }).catch(async (error) => {
200
200
  if (timeoutId) clearTimeout(timeoutId);
201
- await tracer.end({
201
+ tracer.end({
202
202
  message: error.message,
203
203
  code: error.code,
204
204
  stack: error.stack
@@ -214,7 +214,7 @@ const callStepFile = (options, motia) => {
214
214
  });
215
215
  } catch (error) {
216
216
  const err = error;
217
- await tracer.end({
217
+ tracer.end({
218
218
  message: err.message,
219
219
  code: err.code,
220
220
  stack: err.stack
@@ -1 +1 @@
1
- {"version":3,"file":"call-step-file.mjs","names":["result: TData | undefined","timeoutId: NodeJS.Timeout | undefined","flows","data","error: unknown"],"sources":["../../src/call-step-file.ts"],"sourcesContent":["import { trackEvent } from './analytics/utils'\nimport { getLanguageBasedRunner } from './language-runner'\nimport type { Logger } from './logger'\nimport type { Motia } from './motia'\nimport type { Tracer } from './observability'\nimport type { TraceError } from './observability/types'\nimport { ProcessManager } from './process-communication/process-manager'\nimport { compile } from './ts-compiler'\nimport type { Event, InfrastructureConfig, Step } from './types'\nimport type { BaseStreamItem, StateStreamEvent, StateStreamEventChannel } from './types-stream'\nimport { isAllowedToEmit } from './utils'\n\ntype StateGetInput = { traceId: string; key: string }\ntype StateSetInput = { traceId: string; key: string; value: unknown }\ntype StateDeleteInput = { traceId: string; key: string }\ntype StateClearInput = { traceId: string }\n\ntype StateStreamGetInput = { groupId: string; id: string }\ntype StateStreamSendInput = { channel: StateStreamEventChannel; event: StateStreamEvent<unknown> }\ntype StateStreamMutateInput = { groupId: string; id: string; data: BaseStreamItem }\n\ntype CallStepFileOptions = {\n step: Step\n traceId: string\n data?: unknown\n contextInFirstArg?: boolean\n logger: Logger\n tracer: Tracer\n infrastructure?: Partial<InfrastructureConfig>\n}\n\nexport const callStepFile = <TData>(options: CallStepFileOptions, motia: Motia): Promise<TData | undefined> => {\n const { step, traceId, data, tracer, logger, contextInFirstArg = false, infrastructure } = options\n\n const flows = step.config.flows\n\n return (async () => {\n try {\n const streamConfig = motia.lockedData.getStreams()\n const streams = Object.keys(streamConfig).map((name) => ({ name }))\n const jsonData = JSON.stringify({ data, flows, traceId, contextInFirstArg, streams })\n\n const filePathToExecute = step.filePath.endsWith('.ts')\n ? await compile(step.filePath, motia.lockedData.baseDir)\n : step.filePath\n\n const { runner, command, args } = getLanguageBasedRunner(step.filePath)\n let result: TData | undefined\n let timeoutId: NodeJS.Timeout | undefined\n\n return new Promise<TData | undefined>((resolve, reject) => {\n const processManager = new ProcessManager({\n command,\n args: [...args, runner, filePathToExecute, jsonData],\n logger,\n context: 'StepExecution',\n projectRoot: motia.lockedData.baseDir,\n })\n\n trackEvent('step_execution_started', {\n stepName: step.config.name,\n language: command,\n type: step.config.type,\n streams: streams.length,\n })\n\n const timeoutSeconds = infrastructure?.handler?.timeout\n if (timeoutSeconds) {\n timeoutId = setTimeout(async () => {\n processManager.kill()\n const errorMessage = `Step execution timed out after ${timeoutSeconds} seconds`\n logger.error(errorMessage, { step: step.config.name, timeout: timeoutSeconds })\n await tracer.end({ message: errorMessage })\n trackEvent('step_execution_timeout', {\n stepName: step.config.name,\n traceId,\n timeout: timeoutSeconds,\n })\n reject(new Error(errorMessage))\n }, timeoutSeconds * 1000)\n }\n\n processManager\n .spawn()\n .then(() => {\n processManager.handler<TraceError | undefined>('close', async (err) => {\n if (err) {\n if (timeoutId) clearTimeout(timeoutId)\n processManager.close()\n\n trackEvent('step_execution_error', {\n stepName: step.config.name,\n traceId,\n message: err.message,\n })\n\n await tracer.end({\n message: err.message,\n code: err.code,\n stack: err.stack?.replace(new RegExp(`${motia.lockedData.baseDir}/`), ''),\n })\n\n const error = err ?? new Error('Handler execution failed')\n\n reject(error)\n } else {\n await tracer.end()\n }\n\n processManager.kill()\n })\n processManager.handler<unknown>('log', async (input: unknown) => logger.log(input))\n\n processManager.handler<StateGetInput, unknown>('state.get', async (input) => {\n await tracer.stateOperation('get', input)\n return motia.state.get(input.traceId, input.key)\n })\n\n processManager.handler<StateSetInput, unknown>('state.set', async (input) => {\n await tracer.stateOperation('set', { traceId: input.traceId, key: input.key, value: input.value })\n return motia.state.set(input.traceId, input.key, input.value)\n })\n\n processManager.handler<StateDeleteInput, unknown>('state.delete', async (input) => {\n await tracer.stateOperation('delete', input)\n return motia.state.delete(input.traceId, input.key)\n })\n\n processManager.handler<StateClearInput, void>('state.clear', async (input) => {\n await tracer.stateOperation('clear', input)\n return motia.state.clear(input.traceId)\n })\n\n processManager.handler<StateStreamGetInput>(`state.getGroup`, async (input) => {\n await tracer.stateOperation('getGroup', input)\n return motia.state.getGroup(input.groupId)\n })\n\n processManager.handler<TData, void>('result', async (input) => {\n const inputWithBody = input as TData & { body?: { type?: string; data?: number[] } }\n\n if (inputWithBody.body && inputWithBody.body.type === 'Buffer') {\n inputWithBody.body = Buffer.from(inputWithBody.body.data || []) as unknown as typeof inputWithBody.body\n }\n result = inputWithBody as TData\n })\n\n processManager.handler<Event, unknown>('emit', async (input) => {\n const flows = step.config.flows\n\n if (!isAllowedToEmit(step, input.topic)) {\n await tracer.emitOperation(input.topic, input.data, false)\n return motia.printer.printInvalidEmit(step, input.topic)\n }\n\n await tracer.emitOperation(input.topic, input.data, true)\n return motia.eventAdapter.emit({ ...input, traceId, flows, logger, tracer })\n })\n\n Object.entries(streamConfig).forEach(([name, streamFactory]) => {\n const stateStream = streamFactory()\n\n processManager.handler<StateStreamGetInput>(`streams.${name}.get`, async (input) => {\n await tracer.streamOperation(name, 'get', input)\n return stateStream.get(input.groupId, input.id)\n })\n\n processManager.handler<StateStreamMutateInput>(`streams.${name}.set`, async (input) => {\n await tracer.streamOperation(name, 'set', { groupId: input.groupId, id: input.id, data: input.data })\n return stateStream.set(input.groupId, input.id, input.data)\n })\n\n processManager.handler<StateStreamGetInput>(`streams.${name}.delete`, async (input) => {\n await tracer.streamOperation(name, 'delete', input)\n return stateStream.delete(input.groupId, input.id)\n })\n\n processManager.handler<StateStreamGetInput>(`streams.${name}.getGroup`, async (input) => {\n await tracer.streamOperation(name, 'getGroup', input)\n return stateStream.getGroup(input.groupId)\n })\n\n processManager.handler<StateStreamSendInput>(`streams.${name}.send`, async (input) => {\n await tracer.streamOperation(name, 'send', input)\n return stateStream.send(input.channel, input.event)\n })\n })\n\n processManager.onStdout((data) => {\n try {\n const message = JSON.parse(data.toString())\n logger.log(message)\n } catch {\n logger.info(Buffer.from(data).toString())\n }\n })\n\n processManager.onStderr((data) => logger.error(Buffer.from(data).toString()))\n\n processManager.onProcessClose(async (code) => {\n if (timeoutId) clearTimeout(timeoutId)\n processManager.close()\n\n if (code !== 0 && code !== null) {\n const error = { message: `Process exited with code ${code}`, code }\n await tracer.end(error)\n trackEvent('step_execution_error', { stepName: step.config.name, traceId, code })\n reject(`Process exited with code ${code}`)\n } else {\n await tracer.end()\n resolve(result)\n }\n })\n\n processManager.onProcessError(async (error) => {\n if (timeoutId) clearTimeout(timeoutId)\n processManager.close()\n await tracer.end({\n message: error.message,\n code: error.code,\n stack: error.stack,\n })\n\n if (error.code === 'ENOENT') {\n trackEvent('step_execution_error', {\n stepName: step.config.name,\n traceId,\n code: error.code,\n message: error.message,\n })\n reject(`Executable ${command} not found`)\n } else {\n reject(error)\n }\n })\n })\n .catch(async (error) => {\n if (timeoutId) clearTimeout(timeoutId)\n await tracer.end({\n message: error.message,\n code: error.code,\n stack: error.stack,\n })\n\n trackEvent('step_execution_error', {\n stepName: step.config.name,\n traceId,\n code: error.code,\n message: error.message,\n })\n reject(`Failed to spawn process: ${error}`)\n })\n })\n } catch (error: unknown) {\n const err = error as Error & { code?: string }\n await tracer.end({\n message: err.message,\n code: err.code,\n stack: err.stack,\n })\n trackEvent('step_execution_error', {\n stepName: step.config.name,\n traceId,\n code: err.code,\n message: err.message,\n })\n throw err\n }\n })()\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"call-step-file.mjs","names":["result: TData | undefined","timeoutId: NodeJS.Timeout | undefined","flows","data","error: unknown"],"sources":["../../src/call-step-file.ts"],"sourcesContent":["import { trackEvent } from './analytics/utils'\nimport { getLanguageBasedRunner } from './language-runner'\nimport type { Logger } from './logger'\nimport type { Motia } from './motia'\nimport type { Tracer } from './observability'\nimport type { TraceError } from './observability/types'\nimport { ProcessManager } from './process-communication/process-manager'\nimport { compile } from './ts-compiler'\nimport type { Event, InfrastructureConfig, Step } from './types'\nimport type { BaseStreamItem, StateStreamEvent, StateStreamEventChannel } from './types-stream'\nimport { isAllowedToEmit } from './utils'\n\ntype StateGetInput = { traceId: string; key: string }\ntype StateSetInput = { traceId: string; key: string; value: unknown }\ntype StateDeleteInput = { traceId: string; key: string }\ntype StateClearInput = { traceId: string }\n\ntype StateStreamGetInput = { groupId: string; id: string }\ntype StateStreamSendInput = { channel: StateStreamEventChannel; event: StateStreamEvent<unknown> }\ntype StateStreamMutateInput = { groupId: string; id: string; data: BaseStreamItem }\n\ntype CallStepFileOptions = {\n step: Step\n traceId: string\n data?: unknown\n contextInFirstArg?: boolean\n logger: Logger\n tracer: Tracer\n infrastructure?: Partial<InfrastructureConfig>\n}\n\nexport const callStepFile = <TData>(options: CallStepFileOptions, motia: Motia): Promise<TData | undefined> => {\n const { step, traceId, data, tracer, logger, contextInFirstArg = false, infrastructure } = options\n\n const flows = step.config.flows\n\n return (async () => {\n try {\n const streamConfig = motia.lockedData.getStreams()\n const streams = Object.keys(streamConfig).map((name) => ({ name }))\n const jsonData = JSON.stringify({ data, flows, traceId, contextInFirstArg, streams })\n\n const filePathToExecute = step.filePath.endsWith('.ts')\n ? await compile(step.filePath, motia.lockedData.baseDir)\n : step.filePath\n\n const { runner, command, args } = getLanguageBasedRunner(step.filePath)\n let result: TData | undefined\n let timeoutId: NodeJS.Timeout | undefined\n\n return new Promise<TData | undefined>((resolve, reject) => {\n const processManager = new ProcessManager({\n command,\n args: [...args, runner, filePathToExecute, jsonData],\n logger,\n context: 'StepExecution',\n projectRoot: motia.lockedData.baseDir,\n })\n\n trackEvent('step_execution_started', {\n stepName: step.config.name,\n language: command,\n type: step.config.type,\n streams: streams.length,\n })\n\n const timeoutSeconds = infrastructure?.handler?.timeout\n if (timeoutSeconds) {\n timeoutId = setTimeout(async () => {\n processManager.kill()\n const errorMessage = `Step execution timed out after ${timeoutSeconds} seconds`\n logger.error(errorMessage, { step: step.config.name, timeout: timeoutSeconds })\n tracer.end({ message: errorMessage })\n trackEvent('step_execution_timeout', {\n stepName: step.config.name,\n traceId,\n timeout: timeoutSeconds,\n })\n reject(new Error(errorMessage))\n }, timeoutSeconds * 1000)\n }\n\n processManager\n .spawn()\n .then(() => {\n processManager.handler<TraceError | undefined>('close', async (err) => {\n if (err) {\n if (timeoutId) clearTimeout(timeoutId)\n processManager.close()\n\n trackEvent('step_execution_error', {\n stepName: step.config.name,\n traceId,\n message: err.message,\n })\n\n tracer.end({\n message: err.message,\n code: err.code,\n stack: err.stack?.replace(new RegExp(`${motia.lockedData.baseDir}/`), ''),\n })\n\n const error = err ?? new Error('Handler execution failed')\n\n reject(error)\n } else {\n tracer.end()\n }\n\n processManager.kill()\n })\n processManager.handler<unknown>('log', async (input: unknown) => logger.log(input))\n\n processManager.handler<StateGetInput, unknown>('state.get', async (input) => {\n tracer.stateOperation('get', input)\n return motia.state.get(input.traceId, input.key)\n })\n\n processManager.handler<StateSetInput, unknown>('state.set', async (input) => {\n tracer.stateOperation('set', { traceId: input.traceId, key: input.key, value: input.value })\n return motia.state.set(input.traceId, input.key, input.value)\n })\n\n processManager.handler<StateDeleteInput, unknown>('state.delete', async (input) => {\n tracer.stateOperation('delete', input)\n return motia.state.delete(input.traceId, input.key)\n })\n\n processManager.handler<StateClearInput, void>('state.clear', async (input) => {\n tracer.stateOperation('clear', input)\n return motia.state.clear(input.traceId)\n })\n\n processManager.handler<StateStreamGetInput>(`state.getGroup`, async (input) => {\n tracer.stateOperation('getGroup', input)\n return motia.state.getGroup(input.groupId)\n })\n\n processManager.handler<TData, void>('result', async (input) => {\n const inputWithBody = input as TData & { body?: { type?: string; data?: number[] } }\n\n if (inputWithBody.body && inputWithBody.body.type === 'Buffer') {\n inputWithBody.body = Buffer.from(inputWithBody.body.data || []) as unknown as typeof inputWithBody.body\n }\n result = inputWithBody as TData\n })\n\n processManager.handler<Event, unknown>('emit', async (input) => {\n const flows = step.config.flows\n\n if (!isAllowedToEmit(step, input.topic)) {\n tracer.emitOperation(input.topic, input.data, false)\n return motia.printer.printInvalidEmit(step, input.topic)\n }\n\n tracer.emitOperation(input.topic, input.data, true)\n return motia.eventAdapter.emit({ ...input, traceId, flows, logger, tracer })\n })\n\n Object.entries(streamConfig).forEach(([name, streamFactory]) => {\n const stateStream = streamFactory()\n\n processManager.handler<StateStreamGetInput>(`streams.${name}.get`, async (input) => {\n tracer.streamOperation(name, 'get', input)\n return stateStream.get(input.groupId, input.id)\n })\n\n processManager.handler<StateStreamMutateInput>(`streams.${name}.set`, async (input) => {\n tracer.streamOperation(name, 'set', { groupId: input.groupId, id: input.id, data: input.data })\n return stateStream.set(input.groupId, input.id, input.data)\n })\n\n processManager.handler<StateStreamGetInput>(`streams.${name}.delete`, async (input) => {\n tracer.streamOperation(name, 'delete', input)\n return stateStream.delete(input.groupId, input.id)\n })\n\n processManager.handler<StateStreamGetInput>(`streams.${name}.getGroup`, async (input) => {\n tracer.streamOperation(name, 'getGroup', input)\n return stateStream.getGroup(input.groupId)\n })\n\n processManager.handler<StateStreamSendInput>(`streams.${name}.send`, async (input) => {\n tracer.streamOperation(name, 'send', input)\n return stateStream.send(input.channel, input.event)\n })\n })\n\n processManager.onStdout((data) => {\n try {\n const message = JSON.parse(data.toString())\n logger.log(message)\n } catch {\n logger.info(Buffer.from(data).toString())\n }\n })\n\n processManager.onStderr((data) => logger.error(Buffer.from(data).toString()))\n\n processManager.onProcessClose(async (code) => {\n if (timeoutId) clearTimeout(timeoutId)\n processManager.close()\n\n if (code !== 0 && code !== null) {\n const error = { message: `Process exited with code ${code}`, code }\n tracer.end(error)\n trackEvent('step_execution_error', { stepName: step.config.name, traceId, code })\n reject(`Process exited with code ${code}`)\n } else {\n tracer.end()\n resolve(result)\n }\n })\n\n processManager.onProcessError(async (error) => {\n if (timeoutId) clearTimeout(timeoutId)\n processManager.close()\n tracer.end({\n message: error.message,\n code: error.code,\n stack: error.stack,\n })\n\n if (error.code === 'ENOENT') {\n trackEvent('step_execution_error', {\n stepName: step.config.name,\n traceId,\n code: error.code,\n message: error.message,\n })\n reject(`Executable ${command} not found`)\n } else {\n reject(error)\n }\n })\n })\n .catch(async (error) => {\n if (timeoutId) clearTimeout(timeoutId)\n tracer.end({\n message: error.message,\n code: error.code,\n stack: error.stack,\n })\n\n trackEvent('step_execution_error', {\n stepName: step.config.name,\n traceId,\n code: error.code,\n message: error.message,\n })\n reject(`Failed to spawn process: ${error}`)\n })\n })\n } catch (error: unknown) {\n const err = error as Error & { code?: string }\n tracer.end({\n message: err.message,\n code: err.code,\n stack: err.stack,\n })\n trackEvent('step_execution_error', {\n stepName: step.config.name,\n traceId,\n code: err.code,\n message: err.message,\n })\n throw err\n }\n })()\n}\n"],"mappings":"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"}
@@ -2,10 +2,9 @@ import { randomUUID } from "crypto";
2
2
 
3
3
  //#region src/observability/create-trace.ts
4
4
  const createTrace = (traceGroup, step) => {
5
- const trace = {
5
+ return {
6
6
  id: randomUUID(),
7
7
  name: step.config.name,
8
- correlationId: traceGroup.correlationId,
9
8
  parentTraceId: traceGroup.id,
10
9
  status: "running",
11
10
  startTime: Date.now(),
@@ -16,9 +15,6 @@ const createTrace = (traceGroup, step) => {
16
15
  },
17
16
  events: []
18
17
  };
19
- traceGroup.metadata.totalSteps++;
20
- traceGroup.metadata.activeSteps++;
21
- return trace;
22
18
  };
23
19
 
24
20
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"create-trace.mjs","names":["trace: Trace"],"sources":["../../../src/observability/create-trace.ts"],"sourcesContent":["import { randomUUID } from 'crypto'\nimport type { Step } from '../types'\nimport type { Trace, TraceGroup } from './types'\n\nexport const createTrace = (traceGroup: TraceGroup, step: Step) => {\n const id = randomUUID()\n const trace: Trace = {\n id,\n name: step.config.name,\n correlationId: traceGroup.correlationId,\n parentTraceId: traceGroup.id,\n status: 'running',\n startTime: Date.now(),\n endTime: undefined,\n entryPoint: { type: step.config.type, stepName: step.config.name },\n events: [],\n }\n\n traceGroup.metadata.totalSteps++\n traceGroup.metadata.activeSteps++\n\n return trace\n}\n"],"mappings":";;;AAIA,MAAa,eAAe,YAAwB,SAAe;CAEjE,MAAMA,QAAe;EACnB,IAFS,YAAY;EAGrB,MAAM,KAAK,OAAO;EAClB,eAAe,WAAW;EAC1B,eAAe,WAAW;EAC1B,QAAQ;EACR,WAAW,KAAK,KAAK;EACrB,SAAS;EACT,YAAY;GAAE,MAAM,KAAK,OAAO;GAAM,UAAU,KAAK,OAAO;GAAM;EAClE,QAAQ,EAAE;EACX;AAED,YAAW,SAAS;AACpB,YAAW,SAAS;AAEpB,QAAO"}
1
+ {"version":3,"file":"create-trace.mjs","names":[],"sources":["../../../src/observability/create-trace.ts"],"sourcesContent":["import { randomUUID } from 'crypto'\nimport type { Step } from '../types'\nimport type { Trace, TraceGroup } from './types'\n\nexport const createTrace = (traceGroup: TraceGroup, step: Step) => {\n const id = randomUUID()\n const trace: Trace = {\n id,\n name: step.config.name,\n parentTraceId: traceGroup.id,\n status: 'running',\n startTime: Date.now(),\n endTime: undefined,\n entryPoint: { type: step.config.type, stepName: step.config.name },\n events: [],\n }\n\n return trace\n}\n"],"mappings":";;;AAIA,MAAa,eAAe,YAAwB,SAAe;AAajE,QAXqB;EACnB,IAFS,YAAY;EAGrB,MAAM,KAAK,OAAO;EAClB,eAAe,WAAW;EAC1B,QAAQ;EACR,WAAW,KAAK,KAAK;EACrB,SAAS;EACT,YAAY;GAAE,MAAM,KAAK,OAAO;GAAM,UAAU,KAAK,OAAO;GAAM;EAClE,QAAQ,EAAE;EACX"}
@@ -22,25 +22,6 @@ var StreamTracer = class StreamTracer {
22
22
  this.trace.endTime = Date.now();
23
23
  this.trace.error = err;
24
24
  await this.manager.updateTrace();
25
- await this.recomputeTraceGroupStatus();
26
- await this.manager.updateTraceGroup();
27
- }
28
- async recomputeTraceGroupStatus() {
29
- const allTracesFromStorage = await this.manager.getAllTracesForGroup();
30
- const currentTraceIndex = allTracesFromStorage.findIndex((t) => t.id === this.trace.id);
31
- const allTraces = [...allTracesFromStorage];
32
- if (currentTraceIndex >= 0) allTraces[currentTraceIndex] = this.trace;
33
- else allTraces.push(this.trace);
34
- const completedCount = allTraces.filter((t) => t.status === "completed").length;
35
- const failedCount = allTraces.filter((t) => t.status === "failed").length;
36
- const runningCount = allTraces.filter((t) => t.status === "running").length;
37
- this.traceGroup.metadata.completedSteps = completedCount;
38
- this.traceGroup.metadata.activeSteps = runningCount;
39
- if (failedCount > 0) this.traceGroup.status = "failed";
40
- else if (runningCount === 0 && completedCount > 0) {
41
- this.traceGroup.status = "completed";
42
- if (!this.traceGroup.endTime) this.traceGroup.endTime = Date.now();
43
- } else this.traceGroup.status = "running";
44
25
  }
45
26
  async stateOperation(operation, input) {
46
27
  await this.addEvent({
@@ -66,9 +47,7 @@ var StreamTracer = class StreamTracer {
66
47
  lastEvent.calls++;
67
48
  lastEvent.data.data = input.data;
68
49
  lastEvent.maxTimestamp = Date.now();
69
- this.traceGroup.lastActivity = lastEvent.maxTimestamp;
70
50
  await this.manager.updateTrace();
71
- await this.manager.updateTraceGroup();
72
51
  return;
73
52
  }
74
53
  }
@@ -87,9 +66,7 @@ var StreamTracer = class StreamTracer {
87
66
  }
88
67
  async addEvent(event) {
89
68
  this.trace.events.push(event);
90
- this.traceGroup.lastActivity = event.timestamp;
91
69
  await this.manager.updateTrace();
92
- await this.manager.updateTraceGroup();
93
70
  }
94
71
  };
95
72
 
@@ -1 +1 @@
1
- {"version":3,"file":"stream-tracer.mjs","names":["manager: TraceManager","traceGroup: TraceGroup","trace: Trace"],"sources":["../../../src/observability/stream-tracer.ts"],"sourcesContent":["import type { Logger } from '../logger'\nimport type { Step } from '../types'\nimport { createTrace } from './create-trace'\nimport type { Tracer } from './index'\nimport type { TraceManager } from './trace-manager'\nimport type { StateOperation, StreamOperation, Trace, TraceError, TraceEvent, TraceGroup } from './types'\n\nexport class StreamTracer implements Tracer {\n constructor(\n private readonly manager: TraceManager,\n private readonly traceGroup: TraceGroup,\n private readonly trace: Trace,\n logger: Logger,\n ) {\n logger.addListener(async (level, msg, args) => {\n await this.addEvent({\n type: 'log',\n timestamp: Date.now(),\n level,\n message: msg,\n metadata: args,\n })\n })\n }\n\n async end(err?: TraceError) {\n if (this.trace.endTime) {\n return\n }\n\n this.trace.status = err ? 'failed' : 'completed'\n this.trace.endTime = Date.now()\n this.trace.error = err\n\n await this.manager.updateTrace()\n await this.recomputeTraceGroupStatus()\n await this.manager.updateTraceGroup()\n }\n\n private async recomputeTraceGroupStatus() {\n const allTracesFromStorage = await this.manager.getAllTracesForGroup()\n\n const currentTraceIndex = allTracesFromStorage.findIndex((t) => t.id === this.trace.id)\n const allTraces = [...allTracesFromStorage]\n\n if (currentTraceIndex >= 0) {\n allTraces[currentTraceIndex] = this.trace\n } else {\n allTraces.push(this.trace)\n }\n\n const completedCount = allTraces.filter((t) => t.status === 'completed').length\n const failedCount = allTraces.filter((t) => t.status === 'failed').length\n const runningCount = allTraces.filter((t) => t.status === 'running').length\n\n this.traceGroup.metadata.completedSteps = completedCount\n this.traceGroup.metadata.activeSteps = runningCount\n\n if (failedCount > 0) {\n this.traceGroup.status = 'failed'\n } else if (runningCount === 0 && completedCount > 0) {\n this.traceGroup.status = 'completed'\n if (!this.traceGroup.endTime) {\n this.traceGroup.endTime = Date.now()\n }\n } else {\n this.traceGroup.status = 'running'\n }\n }\n\n async stateOperation(operation: StateOperation, input: unknown) {\n await this.addEvent({\n type: 'state',\n timestamp: Date.now(),\n operation,\n data: input,\n })\n }\n\n async emitOperation(topic: string, data: unknown, success: boolean) {\n await this.addEvent({\n type: 'emit',\n timestamp: Date.now(),\n topic,\n success,\n data,\n })\n }\n\n async streamOperation(\n streamName: string,\n operation: StreamOperation,\n input: { groupId: string; id: string; data?: unknown },\n ) {\n if (operation === 'set') {\n const lastEvent = this.trace.events[this.trace.events.length - 1]\n\n if (\n lastEvent &&\n lastEvent.type === 'stream' &&\n lastEvent.streamName === streamName &&\n lastEvent.data.groupId === input.groupId &&\n lastEvent.data.id === input.id\n ) {\n lastEvent.calls++\n lastEvent.data.data = input.data\n lastEvent.maxTimestamp = Date.now()\n\n this.traceGroup.lastActivity = lastEvent.maxTimestamp\n await this.manager.updateTrace()\n await this.manager.updateTraceGroup()\n\n return\n }\n }\n\n await this.addEvent({\n type: 'stream',\n timestamp: Date.now(),\n operation,\n data: input,\n streamName,\n calls: 1,\n })\n }\n\n child(step: Step, logger: Logger) {\n const trace = createTrace(this.traceGroup, step)\n const manager = this.manager.child(trace)\n\n return new StreamTracer(manager, this.traceGroup, trace, logger)\n }\n\n private async addEvent(event: TraceEvent) {\n this.trace.events.push(event)\n this.traceGroup.lastActivity = event.timestamp\n\n await this.manager.updateTrace()\n await this.manager.updateTraceGroup()\n }\n}\n"],"mappings":";;;AAOA,IAAa,eAAb,MAAa,aAA+B;CAC1C,YACE,AAAiBA,SACjB,AAAiBC,YACjB,AAAiBC,OACjB,QACA;EAJiB;EACA;EACA;AAGjB,SAAO,YAAY,OAAO,OAAO,KAAK,SAAS;AAC7C,SAAM,KAAK,SAAS;IAClB,MAAM;IACN,WAAW,KAAK,KAAK;IACrB;IACA,SAAS;IACT,UAAU;IACX,CAAC;IACF;;CAGJ,MAAM,IAAI,KAAkB;AAC1B,MAAI,KAAK,MAAM,QACb;AAGF,OAAK,MAAM,SAAS,MAAM,WAAW;AACrC,OAAK,MAAM,UAAU,KAAK,KAAK;AAC/B,OAAK,MAAM,QAAQ;AAEnB,QAAM,KAAK,QAAQ,aAAa;AAChC,QAAM,KAAK,2BAA2B;AACtC,QAAM,KAAK,QAAQ,kBAAkB;;CAGvC,MAAc,4BAA4B;EACxC,MAAM,uBAAuB,MAAM,KAAK,QAAQ,sBAAsB;EAEtE,MAAM,oBAAoB,qBAAqB,WAAW,MAAM,EAAE,OAAO,KAAK,MAAM,GAAG;EACvF,MAAM,YAAY,CAAC,GAAG,qBAAqB;AAE3C,MAAI,qBAAqB,EACvB,WAAU,qBAAqB,KAAK;MAEpC,WAAU,KAAK,KAAK,MAAM;EAG5B,MAAM,iBAAiB,UAAU,QAAQ,MAAM,EAAE,WAAW,YAAY,CAAC;EACzE,MAAM,cAAc,UAAU,QAAQ,MAAM,EAAE,WAAW,SAAS,CAAC;EACnE,MAAM,eAAe,UAAU,QAAQ,MAAM,EAAE,WAAW,UAAU,CAAC;AAErE,OAAK,WAAW,SAAS,iBAAiB;AAC1C,OAAK,WAAW,SAAS,cAAc;AAEvC,MAAI,cAAc,EAChB,MAAK,WAAW,SAAS;WAChB,iBAAiB,KAAK,iBAAiB,GAAG;AACnD,QAAK,WAAW,SAAS;AACzB,OAAI,CAAC,KAAK,WAAW,QACnB,MAAK,WAAW,UAAU,KAAK,KAAK;QAGtC,MAAK,WAAW,SAAS;;CAI7B,MAAM,eAAe,WAA2B,OAAgB;AAC9D,QAAM,KAAK,SAAS;GAClB,MAAM;GACN,WAAW,KAAK,KAAK;GACrB;GACA,MAAM;GACP,CAAC;;CAGJ,MAAM,cAAc,OAAe,MAAe,SAAkB;AAClE,QAAM,KAAK,SAAS;GAClB,MAAM;GACN,WAAW,KAAK,KAAK;GACrB;GACA;GACA;GACD,CAAC;;CAGJ,MAAM,gBACJ,YACA,WACA,OACA;AACA,MAAI,cAAc,OAAO;GACvB,MAAM,YAAY,KAAK,MAAM,OAAO,KAAK,MAAM,OAAO,SAAS;AAE/D,OACE,aACA,UAAU,SAAS,YACnB,UAAU,eAAe,cACzB,UAAU,KAAK,YAAY,MAAM,WACjC,UAAU,KAAK,OAAO,MAAM,IAC5B;AACA,cAAU;AACV,cAAU,KAAK,OAAO,MAAM;AAC5B,cAAU,eAAe,KAAK,KAAK;AAEnC,SAAK,WAAW,eAAe,UAAU;AACzC,UAAM,KAAK,QAAQ,aAAa;AAChC,UAAM,KAAK,QAAQ,kBAAkB;AAErC;;;AAIJ,QAAM,KAAK,SAAS;GAClB,MAAM;GACN,WAAW,KAAK,KAAK;GACrB;GACA,MAAM;GACN;GACA,OAAO;GACR,CAAC;;CAGJ,MAAM,MAAY,QAAgB;EAChC,MAAM,QAAQ,YAAY,KAAK,YAAY,KAAK;AAGhD,SAAO,IAAI,aAFK,KAAK,QAAQ,MAAM,MAAM,EAER,KAAK,YAAY,OAAO,OAAO;;CAGlE,MAAc,SAAS,OAAmB;AACxC,OAAK,MAAM,OAAO,KAAK,MAAM;AAC7B,OAAK,WAAW,eAAe,MAAM;AAErC,QAAM,KAAK,QAAQ,aAAa;AAChC,QAAM,KAAK,QAAQ,kBAAkB"}
1
+ {"version":3,"file":"stream-tracer.mjs","names":["manager: TraceManager","traceGroup: TraceGroup","trace: Trace"],"sources":["../../../src/observability/stream-tracer.ts"],"sourcesContent":["import type { Logger } from '../logger'\nimport type { Step } from '../types'\nimport { createTrace } from './create-trace'\nimport type { Tracer } from './index'\nimport type { TraceManager } from './trace-manager'\nimport type { StateOperation, StreamOperation, Trace, TraceError, TraceEvent, TraceGroup } from './types'\n\nexport class StreamTracer implements Tracer {\n constructor(\n private readonly manager: TraceManager,\n private readonly traceGroup: TraceGroup,\n private readonly trace: Trace,\n logger: Logger,\n ) {\n logger.addListener(async (level, msg, args) => {\n await this.addEvent({\n type: 'log',\n timestamp: Date.now(),\n level,\n message: msg,\n metadata: args,\n })\n })\n }\n\n async end(err?: TraceError) {\n if (this.trace.endTime) {\n return\n }\n\n this.trace.status = err ? 'failed' : 'completed'\n this.trace.endTime = Date.now()\n this.trace.error = err\n\n await this.manager.updateTrace()\n }\n\n async stateOperation(operation: StateOperation, input: unknown) {\n await this.addEvent({\n type: 'state',\n timestamp: Date.now(),\n operation,\n data: input,\n })\n }\n\n async emitOperation(topic: string, data: unknown, success: boolean) {\n await this.addEvent({\n type: 'emit',\n timestamp: Date.now(),\n topic,\n success,\n data,\n })\n }\n\n async streamOperation(\n streamName: string,\n operation: StreamOperation,\n input: { groupId: string; id: string; data?: unknown },\n ) {\n if (operation === 'set') {\n const lastEvent = this.trace.events[this.trace.events.length - 1]\n\n if (\n lastEvent &&\n lastEvent.type === 'stream' &&\n lastEvent.streamName === streamName &&\n lastEvent.data.groupId === input.groupId &&\n lastEvent.data.id === input.id\n ) {\n lastEvent.calls++\n lastEvent.data.data = input.data\n lastEvent.maxTimestamp = Date.now()\n\n await this.manager.updateTrace()\n\n return\n }\n }\n\n await this.addEvent({\n type: 'stream',\n timestamp: Date.now(),\n operation,\n data: input,\n streamName,\n calls: 1,\n })\n }\n\n child(step: Step, logger: Logger) {\n const trace = createTrace(this.traceGroup, step)\n const manager = this.manager.child(trace)\n\n return new StreamTracer(manager, this.traceGroup, trace, logger)\n }\n\n private async addEvent(event: TraceEvent) {\n this.trace.events.push(event)\n\n await this.manager.updateTrace()\n }\n}\n"],"mappings":";;;AAOA,IAAa,eAAb,MAAa,aAA+B;CAC1C,YACE,AAAiBA,SACjB,AAAiBC,YACjB,AAAiBC,OACjB,QACA;EAJiB;EACA;EACA;AAGjB,SAAO,YAAY,OAAO,OAAO,KAAK,SAAS;AAC7C,SAAM,KAAK,SAAS;IAClB,MAAM;IACN,WAAW,KAAK,KAAK;IACrB;IACA,SAAS;IACT,UAAU;IACX,CAAC;IACF;;CAGJ,MAAM,IAAI,KAAkB;AAC1B,MAAI,KAAK,MAAM,QACb;AAGF,OAAK,MAAM,SAAS,MAAM,WAAW;AACrC,OAAK,MAAM,UAAU,KAAK,KAAK;AAC/B,OAAK,MAAM,QAAQ;AAEnB,QAAM,KAAK,QAAQ,aAAa;;CAGlC,MAAM,eAAe,WAA2B,OAAgB;AAC9D,QAAM,KAAK,SAAS;GAClB,MAAM;GACN,WAAW,KAAK,KAAK;GACrB;GACA,MAAM;GACP,CAAC;;CAGJ,MAAM,cAAc,OAAe,MAAe,SAAkB;AAClE,QAAM,KAAK,SAAS;GAClB,MAAM;GACN,WAAW,KAAK,KAAK;GACrB;GACA;GACA;GACD,CAAC;;CAGJ,MAAM,gBACJ,YACA,WACA,OACA;AACA,MAAI,cAAc,OAAO;GACvB,MAAM,YAAY,KAAK,MAAM,OAAO,KAAK,MAAM,OAAO,SAAS;AAE/D,OACE,aACA,UAAU,SAAS,YACnB,UAAU,eAAe,cACzB,UAAU,KAAK,YAAY,MAAM,WACjC,UAAU,KAAK,OAAO,MAAM,IAC5B;AACA,cAAU;AACV,cAAU,KAAK,OAAO,MAAM;AAC5B,cAAU,eAAe,KAAK,KAAK;AAEnC,UAAM,KAAK,QAAQ,aAAa;AAEhC;;;AAIJ,QAAM,KAAK,SAAS;GAClB,MAAM;GACN,WAAW,KAAK,KAAK;GACrB;GACA,MAAM;GACN;GACA,OAAO;GACR,CAAC;;CAGJ,MAAM,MAAY,QAAgB;EAChC,MAAM,QAAQ,YAAY,KAAK,YAAY,KAAK;AAGhD,SAAO,IAAI,aAFK,KAAK,QAAQ,MAAM,MAAM,EAER,KAAK,YAAY,OAAO,OAAO;;CAGlE,MAAc,SAAS,OAAmB;AACxC,OAAK,MAAM,OAAO,KAAK,MAAM;AAE7B,QAAM,KAAK,QAAQ,aAAa"}
@@ -6,7 +6,6 @@ var TraceManager = class TraceManager {
6
6
  this.traceGroup = traceGroup;
7
7
  this.trace = trace;
8
8
  this.updateTrace().catch(() => {});
9
- this.updateTraceGroup().catch(() => {});
10
9
  }
11
10
  async updateTrace() {
12
11
  await this.traceStream.set(this.traceGroup.id, this.trace.id, this.trace);
@@ -1 +1 @@
1
- {"version":3,"file":"trace-manager.mjs","names":["traceStream: MotiaStream<Trace>","traceGroupStream: MotiaStream<TraceGroup>","traceGroup: TraceGroup","trace: Trace"],"sources":["../../../src/observability/trace-manager.ts"],"sourcesContent":["import type { MotiaStream } from '../types-stream'\nimport type { Trace, TraceGroup } from './types'\n\nexport class TraceManager {\n constructor(\n private readonly traceStream: MotiaStream<Trace>,\n private readonly traceGroupStream: MotiaStream<TraceGroup>,\n private readonly traceGroup: TraceGroup,\n private readonly trace: Trace,\n ) {\n this.updateTrace().catch(() => {})\n this.updateTraceGroup().catch(() => {})\n }\n\n async updateTrace() {\n await this.traceStream.set(this.traceGroup.id, this.trace.id, this.trace)\n }\n\n async updateTraceGroup() {\n await this.traceGroupStream.set('default', this.traceGroup.id, this.traceGroup)\n }\n\n async getAllTracesForGroup(): Promise<Trace[]> {\n return await this.traceStream.getGroup(this.traceGroup.id)\n }\n\n child(trace: Trace) {\n return new TraceManager(this.traceStream, this.traceGroupStream, this.traceGroup, trace)\n }\n}\n"],"mappings":";AAGA,IAAa,eAAb,MAAa,aAAa;CACxB,YACE,AAAiBA,aACjB,AAAiBC,kBACjB,AAAiBC,YACjB,AAAiBC,OACjB;EAJiB;EACA;EACA;EACA;AAEjB,OAAK,aAAa,CAAC,YAAY,GAAG;AAClC,OAAK,kBAAkB,CAAC,YAAY,GAAG;;CAGzC,MAAM,cAAc;AAClB,QAAM,KAAK,YAAY,IAAI,KAAK,WAAW,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM;;CAG3E,MAAM,mBAAmB;AACvB,QAAM,KAAK,iBAAiB,IAAI,WAAW,KAAK,WAAW,IAAI,KAAK,WAAW;;CAGjF,MAAM,uBAAyC;AAC7C,SAAO,MAAM,KAAK,YAAY,SAAS,KAAK,WAAW,GAAG;;CAG5D,MAAM,OAAc;AAClB,SAAO,IAAI,aAAa,KAAK,aAAa,KAAK,kBAAkB,KAAK,YAAY,MAAM"}
1
+ {"version":3,"file":"trace-manager.mjs","names":["traceStream: MotiaStream<Trace>","traceGroupStream: MotiaStream<TraceGroup>","traceGroup: TraceGroup","trace: Trace"],"sources":["../../../src/observability/trace-manager.ts"],"sourcesContent":["import type { MotiaStream } from '../types-stream'\nimport type { Trace, TraceGroup } from './types'\n\nexport class TraceManager {\n constructor(\n private readonly traceStream: MotiaStream<Trace>,\n private readonly traceGroupStream: MotiaStream<TraceGroup>,\n private readonly traceGroup: TraceGroup,\n private readonly trace: Trace,\n ) {\n this.updateTrace().catch(() => {})\n }\n\n async updateTrace() {\n await this.traceStream.set(this.traceGroup.id, this.trace.id, this.trace)\n }\n\n async updateTraceGroup() {\n await this.traceGroupStream.set('default', this.traceGroup.id, this.traceGroup)\n }\n\n async getAllTracesForGroup(): Promise<Trace[]> {\n return await this.traceStream.getGroup(this.traceGroup.id)\n }\n\n child(trace: Trace) {\n return new TraceManager(this.traceStream, this.traceGroupStream, this.traceGroup, trace)\n }\n}\n"],"mappings":";AAGA,IAAa,eAAb,MAAa,aAAa;CACxB,YACE,AAAiBA,aACjB,AAAiBC,kBACjB,AAAiBC,YACjB,AAAiBC,OACjB;EAJiB;EACA;EACA;EACA;AAEjB,OAAK,aAAa,CAAC,YAAY,GAAG;;CAGpC,MAAM,cAAc;AAClB,QAAM,KAAK,YAAY,IAAI,KAAK,WAAW,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM;;CAG3E,MAAM,mBAAmB;AACvB,QAAM,KAAK,iBAAiB,IAAI,WAAW,KAAK,WAAW,IAAI,KAAK,WAAW;;CAGjF,MAAM,uBAAyC;AAC7C,SAAO,MAAM,KAAK,YAAY,SAAS,KAAK,WAAW,GAAG;;CAG5D,MAAM,OAAc;AAClB,SAAO,IAAI,aAAa,KAAK,aAAa,KAAK,kBAAkB,KAAK,YAAY,MAAM"}
@@ -25,18 +25,12 @@ var BaseTracerFactory = class {
25
25
  const traceGroup = {
26
26
  id: traceId,
27
27
  name: step.config.name,
28
- lastActivity: Date.now(),
29
- metadata: {
30
- completedSteps: 0,
31
- activeSteps: 0,
32
- totalSteps: 0
33
- },
34
- correlationId: void 0,
35
- status: "running",
36
28
  startTime: Date.now()
37
29
  };
38
30
  const trace = createTrace(traceGroup, step);
39
- return new StreamTracer(new TraceManager(this.traceStream, this.traceGroupStream, traceGroup, trace), traceGroup, trace, logger);
31
+ const manager = new TraceManager(this.traceStream, this.traceGroupStream, traceGroup, trace);
32
+ await manager.updateTraceGroup();
33
+ return new StreamTracer(manager, traceGroup, trace, logger);
40
34
  }
41
35
  async attachToTrace(traceId, step, logger) {
42
36
  const existingGroup = await this.traceGroupStream.get("default", traceId);
@@ -1 +1 @@
1
- {"version":3,"file":"tracer.mjs","names":["traceStream: MotiaStream<Trace>","traceGroupStream: MotiaStream<TraceGroup>","traceGroup: TraceGroup","traceStreamAdapter: MotiaStream<Trace>","traceGroupStreamAdapter: MotiaStream<TraceGroup>"],"sources":["../../../src/observability/tracer.ts"],"sourcesContent":["import type { LockedData } from '../locked-data'\nimport type { Logger } from '../logger'\nimport type { Step } from '../types'\nimport type { MotiaStream } from '../types-stream'\nimport { createTrace } from './create-trace'\nimport type { TracerFactory } from './index'\nimport { RedisTraceStreamAdapter } from './redis-trace-stream-adapter'\nimport { StreamTracer } from './stream-tracer'\nimport { TraceManager } from './trace-manager'\nimport type { Trace, TraceGroup } from './types'\n\nexport class BaseTracerFactory implements TracerFactory {\n constructor(\n private readonly traceStream: MotiaStream<Trace>,\n private readonly traceGroupStream: MotiaStream<TraceGroup>,\n ) {}\n\n private async getAllGroups() {\n return await this.traceGroupStream.getGroup('default')\n }\n\n private async deleteGroup(group: TraceGroup) {\n const traces = await this.traceStream.getGroup(group.id)\n\n for (const trace of traces) {\n await this.traceStream.delete(group.id, trace.id)\n }\n await this.traceGroupStream.delete('default', group.id)\n }\n\n async clear() {\n const groups = await this.getAllGroups()\n\n for (const group of groups) {\n await this.deleteGroup(group)\n }\n }\n\n async createTracer(traceId: string, step: Step, logger: Logger) {\n const traceGroup: TraceGroup = {\n id: traceId,\n name: step.config.name,\n lastActivity: Date.now(),\n metadata: {\n completedSteps: 0,\n activeSteps: 0,\n totalSteps: 0,\n },\n correlationId: undefined,\n status: 'running',\n startTime: Date.now(),\n }\n\n const trace = createTrace(traceGroup, step)\n const manager = new TraceManager(this.traceStream, this.traceGroupStream, traceGroup, trace)\n\n return new StreamTracer(manager, traceGroup, trace, logger)\n }\n\n async attachToTrace(traceId: string, step: Step, logger: Logger) {\n const existingGroup = await this.traceGroupStream.get('default', traceId)\n\n if (!existingGroup) {\n return this.createTracer(traceId, step, logger)\n }\n\n const trace = createTrace(existingGroup, step)\n const manager = new TraceManager(this.traceStream, this.traceGroupStream, existingGroup, trace)\n\n return new StreamTracer(manager, existingGroup, trace, logger)\n }\n}\n\nexport const createTracerFactory = (lockedData: LockedData): TracerFactory => {\n if (!lockedData.redisClient) {\n throw new Error(\n 'Redis client is required for tracer factory. Please provide a redisClient when creating LockedData.',\n )\n }\n\n const traceStreamName = 'motia-trace'\n const traceStreamAdapter: MotiaStream<Trace> = new RedisTraceStreamAdapter(traceStreamName, lockedData.redisClient)\n\n const traceStream = lockedData.createStream<Trace>({\n filePath: traceStreamName,\n hidden: true,\n config: {\n name: traceStreamName,\n baseConfig: { storageType: 'custom', factory: () => traceStreamAdapter },\n schema: null as never,\n },\n })()\n\n const traceGroupName = 'motia-trace-group'\n const traceGroupStreamAdapter: MotiaStream<TraceGroup> = new RedisTraceStreamAdapter(\n traceGroupName,\n lockedData.redisClient,\n )\n\n const traceGroupStream = lockedData.createStream<TraceGroup>({\n filePath: traceGroupName,\n hidden: true,\n config: {\n name: traceGroupName,\n baseConfig: { storageType: 'custom', factory: () => traceGroupStreamAdapter },\n schema: null as never,\n },\n })()\n\n return new BaseTracerFactory(traceStream, traceGroupStream)\n}\n"],"mappings":";;;;;;AAWA,IAAa,oBAAb,MAAwD;CACtD,YACE,AAAiBA,aACjB,AAAiBC,kBACjB;EAFiB;EACA;;CAGnB,MAAc,eAAe;AAC3B,SAAO,MAAM,KAAK,iBAAiB,SAAS,UAAU;;CAGxD,MAAc,YAAY,OAAmB;EAC3C,MAAM,SAAS,MAAM,KAAK,YAAY,SAAS,MAAM,GAAG;AAExD,OAAK,MAAM,SAAS,OAClB,OAAM,KAAK,YAAY,OAAO,MAAM,IAAI,MAAM,GAAG;AAEnD,QAAM,KAAK,iBAAiB,OAAO,WAAW,MAAM,GAAG;;CAGzD,MAAM,QAAQ;EACZ,MAAM,SAAS,MAAM,KAAK,cAAc;AAExC,OAAK,MAAM,SAAS,OAClB,OAAM,KAAK,YAAY,MAAM;;CAIjC,MAAM,aAAa,SAAiB,MAAY,QAAgB;EAC9D,MAAMC,aAAyB;GAC7B,IAAI;GACJ,MAAM,KAAK,OAAO;GAClB,cAAc,KAAK,KAAK;GACxB,UAAU;IACR,gBAAgB;IAChB,aAAa;IACb,YAAY;IACb;GACD,eAAe;GACf,QAAQ;GACR,WAAW,KAAK,KAAK;GACtB;EAED,MAAM,QAAQ,YAAY,YAAY,KAAK;AAG3C,SAAO,IAAI,aAFK,IAAI,aAAa,KAAK,aAAa,KAAK,kBAAkB,YAAY,MAAM,EAE3D,YAAY,OAAO,OAAO;;CAG7D,MAAM,cAAc,SAAiB,MAAY,QAAgB;EAC/D,MAAM,gBAAgB,MAAM,KAAK,iBAAiB,IAAI,WAAW,QAAQ;AAEzE,MAAI,CAAC,cACH,QAAO,KAAK,aAAa,SAAS,MAAM,OAAO;EAGjD,MAAM,QAAQ,YAAY,eAAe,KAAK;AAG9C,SAAO,IAAI,aAFK,IAAI,aAAa,KAAK,aAAa,KAAK,kBAAkB,eAAe,MAAM,EAE9D,eAAe,OAAO,OAAO;;;AAIlE,MAAa,uBAAuB,eAA0C;AAC5E,KAAI,CAAC,WAAW,YACd,OAAM,IAAI,MACR,sGACD;CAGH,MAAM,kBAAkB;CACxB,MAAMC,qBAAyC,IAAI,wBAAwB,iBAAiB,WAAW,YAAY;CAEnH,MAAM,cAAc,WAAW,aAAoB;EACjD,UAAU;EACV,QAAQ;EACR,QAAQ;GACN,MAAM;GACN,YAAY;IAAE,aAAa;IAAU,eAAe;IAAoB;GACxE,QAAQ;GACT;EACF,CAAC,EAAE;CAEJ,MAAM,iBAAiB;CACvB,MAAMC,0BAAmD,IAAI,wBAC3D,gBACA,WAAW,YACZ;AAYD,QAAO,IAAI,kBAAkB,aAVJ,WAAW,aAAyB;EAC3D,UAAU;EACV,QAAQ;EACR,QAAQ;GACN,MAAM;GACN,YAAY;IAAE,aAAa;IAAU,eAAe;IAAyB;GAC7E,QAAQ;GACT;EACF,CAAC,EAAE,CAEuD"}
1
+ {"version":3,"file":"tracer.mjs","names":["traceStream: MotiaStream<Trace>","traceGroupStream: MotiaStream<TraceGroup>","traceGroup: TraceGroup","traceStreamAdapter: MotiaStream<Trace>","traceGroupStreamAdapter: MotiaStream<TraceGroup>"],"sources":["../../../src/observability/tracer.ts"],"sourcesContent":["import type { LockedData } from '../locked-data'\nimport type { Logger } from '../logger'\nimport type { Step } from '../types'\nimport type { MotiaStream } from '../types-stream'\nimport { createTrace } from './create-trace'\nimport type { TracerFactory } from './index'\nimport { RedisTraceStreamAdapter } from './redis-trace-stream-adapter'\nimport { StreamTracer } from './stream-tracer'\nimport { TraceManager } from './trace-manager'\nimport type { Trace, TraceGroup } from './types'\n\nexport class BaseTracerFactory implements TracerFactory {\n constructor(\n private readonly traceStream: MotiaStream<Trace>,\n private readonly traceGroupStream: MotiaStream<TraceGroup>,\n ) {}\n\n private async getAllGroups() {\n return await this.traceGroupStream.getGroup('default')\n }\n\n private async deleteGroup(group: TraceGroup) {\n const traces = await this.traceStream.getGroup(group.id)\n\n for (const trace of traces) {\n await this.traceStream.delete(group.id, trace.id)\n }\n await this.traceGroupStream.delete('default', group.id)\n }\n\n async clear() {\n const groups = await this.getAllGroups()\n\n for (const group of groups) {\n await this.deleteGroup(group)\n }\n }\n\n async createTracer(traceId: string, step: Step, logger: Logger) {\n const traceGroup: TraceGroup = {\n id: traceId,\n name: step.config.name,\n startTime: Date.now(),\n }\n\n const trace = createTrace(traceGroup, step)\n const manager = new TraceManager(this.traceStream, this.traceGroupStream, traceGroup, trace)\n\n await manager.updateTraceGroup()\n\n return new StreamTracer(manager, traceGroup, trace, logger)\n }\n\n async attachToTrace(traceId: string, step: Step, logger: Logger) {\n const existingGroup = await this.traceGroupStream.get('default', traceId)\n\n if (!existingGroup) {\n return this.createTracer(traceId, step, logger)\n }\n\n const trace = createTrace(existingGroup, step)\n const manager = new TraceManager(this.traceStream, this.traceGroupStream, existingGroup, trace)\n\n return new StreamTracer(manager, existingGroup, trace, logger)\n }\n}\n\nexport const createTracerFactory = (lockedData: LockedData): TracerFactory => {\n if (!lockedData.redisClient) {\n throw new Error(\n 'Redis client is required for tracer factory. Please provide a redisClient when creating LockedData.',\n )\n }\n\n const traceStreamName = 'motia-trace'\n const traceStreamAdapter: MotiaStream<Trace> = new RedisTraceStreamAdapter(traceStreamName, lockedData.redisClient)\n\n const traceStream = lockedData.createStream<Trace>({\n filePath: traceStreamName,\n hidden: true,\n config: {\n name: traceStreamName,\n baseConfig: { storageType: 'custom', factory: () => traceStreamAdapter },\n schema: null as never,\n },\n })()\n\n const traceGroupName = 'motia-trace-group'\n const traceGroupStreamAdapter: MotiaStream<TraceGroup> = new RedisTraceStreamAdapter(\n traceGroupName,\n lockedData.redisClient,\n )\n\n const traceGroupStream = lockedData.createStream<TraceGroup>({\n filePath: traceGroupName,\n hidden: true,\n config: {\n name: traceGroupName,\n baseConfig: { storageType: 'custom', factory: () => traceGroupStreamAdapter },\n schema: null as never,\n },\n })()\n\n return new BaseTracerFactory(traceStream, traceGroupStream)\n}\n"],"mappings":";;;;;;AAWA,IAAa,oBAAb,MAAwD;CACtD,YACE,AAAiBA,aACjB,AAAiBC,kBACjB;EAFiB;EACA;;CAGnB,MAAc,eAAe;AAC3B,SAAO,MAAM,KAAK,iBAAiB,SAAS,UAAU;;CAGxD,MAAc,YAAY,OAAmB;EAC3C,MAAM,SAAS,MAAM,KAAK,YAAY,SAAS,MAAM,GAAG;AAExD,OAAK,MAAM,SAAS,OAClB,OAAM,KAAK,YAAY,OAAO,MAAM,IAAI,MAAM,GAAG;AAEnD,QAAM,KAAK,iBAAiB,OAAO,WAAW,MAAM,GAAG;;CAGzD,MAAM,QAAQ;EACZ,MAAM,SAAS,MAAM,KAAK,cAAc;AAExC,OAAK,MAAM,SAAS,OAClB,OAAM,KAAK,YAAY,MAAM;;CAIjC,MAAM,aAAa,SAAiB,MAAY,QAAgB;EAC9D,MAAMC,aAAyB;GAC7B,IAAI;GACJ,MAAM,KAAK,OAAO;GAClB,WAAW,KAAK,KAAK;GACtB;EAED,MAAM,QAAQ,YAAY,YAAY,KAAK;EAC3C,MAAM,UAAU,IAAI,aAAa,KAAK,aAAa,KAAK,kBAAkB,YAAY,MAAM;AAE5F,QAAM,QAAQ,kBAAkB;AAEhC,SAAO,IAAI,aAAa,SAAS,YAAY,OAAO,OAAO;;CAG7D,MAAM,cAAc,SAAiB,MAAY,QAAgB;EAC/D,MAAM,gBAAgB,MAAM,KAAK,iBAAiB,IAAI,WAAW,QAAQ;AAEzE,MAAI,CAAC,cACH,QAAO,KAAK,aAAa,SAAS,MAAM,OAAO;EAGjD,MAAM,QAAQ,YAAY,eAAe,KAAK;AAG9C,SAAO,IAAI,aAFK,IAAI,aAAa,KAAK,aAAa,KAAK,kBAAkB,eAAe,MAAM,EAE9D,eAAe,OAAO,OAAO;;;AAIlE,MAAa,uBAAuB,eAA0C;AAC5E,KAAI,CAAC,WAAW,YACd,OAAM,IAAI,MACR,sGACD;CAGH,MAAM,kBAAkB;CACxB,MAAMC,qBAAyC,IAAI,wBAAwB,iBAAiB,WAAW,YAAY;CAEnH,MAAM,cAAc,WAAW,aAAoB;EACjD,UAAU;EACV,QAAQ;EACR,QAAQ;GACN,MAAM;GACN,YAAY;IAAE,aAAa;IAAU,eAAe;IAAoB;GACxE,QAAQ;GACT;EACF,CAAC,EAAE;CAEJ,MAAM,iBAAiB;CACvB,MAAMC,0BAAmD,IAAI,wBAC3D,gBACA,WAAW,YACZ;AAYD,QAAO,IAAI,kBAAkB,aAVJ,WAAW,aAAyB;EAC3D,UAAU;EACV,QAAQ;EACR,QAAQ;GACN,MAAM;GACN,YAAY;IAAE,aAAa;IAAU,eAAe;IAAyB;GAC7E,QAAQ;GACT;EACF,CAAC,EAAE,CAEuD"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/observability/types.ts"],"sourcesContent":[],"mappings":";;;;KAiBY,UAAA;;;;;KAqBA,cAAA;KACA,eAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/observability/types.ts"],"sourcesContent":[],"mappings":";;;;KAQY,UAAA;;;;;KAqBA,cAAA;KACA,eAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-state-adapter.d.mts","names":[],"sources":["../../../src/state/create-state-adapter.ts"],"sourcesContent":[],"mappings":";;;;KAOK,aAAA,GAAgB;;AAF6D,CAAA;AAIlE,iBAAA,kBAAA,CAA2B,MAAA,EAAA,aAAgB,CAAY,EAAZ,YAAY"}
1
+ {"version":3,"file":"create-state-adapter.d.mts","names":[],"sources":["../../../src/state/create-state-adapter.ts"],"sourcesContent":[],"mappings":";;;;KAOK,aAAA,GAAgB;;AAF6D,CAAA;AAIlE,iBAAA,kBAAA,CAA2B,MAAA,EAAA,aAAgB,CAAA,EAAA,YAAY"}
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "import": "./dist/index.mjs"
12
12
  }
13
13
  },
14
- "version": "0.17.3-beta.184",
14
+ "version": "0.17.4-beta.186-859040",
15
15
  "dependencies": {
16
16
  "@amplitude/analytics-node": "^1.5.26",
17
17
  "@standard-schema/spec": "^1.0.0",