@keystrokehq/keystroke 0.0.99 → 0.0.101

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 (51) hide show
  1. package/dist/action.cjs +1 -1
  2. package/dist/action.mjs +1 -1
  3. package/dist/agent.cjs +5 -5
  4. package/dist/agent.cjs.map +1 -1
  5. package/dist/agent.d.cts +3 -274
  6. package/dist/agent.d.mts +3 -274
  7. package/dist/agent.mjs +5 -5
  8. package/dist/agent.mjs.map +1 -1
  9. package/dist/credentials.cjs +1 -1
  10. package/dist/credentials.mjs +1 -1
  11. package/dist/{dist-B1fqDXYa.mjs → dist-CAGgGvND.mjs} +41 -8
  12. package/dist/dist-CAGgGvND.mjs.map +1 -0
  13. package/dist/{dist-T7a5DjzV.cjs → dist-DG2RS68d.cjs} +41 -8
  14. package/dist/dist-DG2RS68d.cjs.map +1 -0
  15. package/dist/{dist-ByV6mHKd.cjs → dist-DJhg5KTL.cjs} +120 -41
  16. package/dist/{dist-ByV6mHKd.cjs.map → dist-DJhg5KTL.cjs.map} +1 -1
  17. package/dist/{dist-CxaI84Ch.cjs → dist-DKGeSeMa.cjs} +3 -3
  18. package/dist/{dist-CxaI84Ch.cjs.map → dist-DKGeSeMa.cjs.map} +1 -1
  19. package/dist/{dist-BML_gJSh.mjs → dist-DzfOPx7X.mjs} +115 -42
  20. package/dist/{dist-BML_gJSh.mjs.map → dist-DzfOPx7X.mjs.map} +1 -1
  21. package/dist/{dist-CiaGdqFg.mjs → dist-cDEt5yzO.mjs} +3 -3
  22. package/dist/{dist-CiaGdqFg.mjs.map → dist-cDEt5yzO.mjs.map} +1 -1
  23. package/dist/index-CBgXyNH2.d.mts +275 -0
  24. package/dist/index-CBgXyNH2.d.mts.map +1 -0
  25. package/dist/index-CiuCYKLw.d.cts.map +1 -1
  26. package/dist/index-CiuCYKLw.d.mts.map +1 -1
  27. package/dist/index-L5a2mf72.d.cts +275 -0
  28. package/dist/index-L5a2mf72.d.cts.map +1 -0
  29. package/dist/{mistral-BLRy436m.cjs → mistral-9mfXttcp.cjs} +2 -2
  30. package/dist/{mistral-BLRy436m.cjs.map → mistral-9mfXttcp.cjs.map} +1 -1
  31. package/dist/{mistral-CI7CQc_C.mjs → mistral-CGHbHFQG.mjs} +2 -2
  32. package/dist/{mistral-CI7CQc_C.mjs.map → mistral-CGHbHFQG.mjs.map} +1 -1
  33. package/dist/{sse-Bxvdniu5.mjs → sse-CcbP5P9d.mjs} +2 -2
  34. package/dist/{sse-Bxvdniu5.mjs.map → sse-CcbP5P9d.mjs.map} +1 -1
  35. package/dist/{sse-DGaTY14k.cjs → sse-DSHssCpN.cjs} +2 -2
  36. package/dist/{sse-DGaTY14k.cjs.map → sse-DSHssCpN.cjs.map} +1 -1
  37. package/dist/trigger.cjs +67 -30
  38. package/dist/trigger.cjs.map +1 -1
  39. package/dist/trigger.d.cts +37 -22
  40. package/dist/trigger.d.cts.map +1 -1
  41. package/dist/trigger.d.mts +37 -22
  42. package/dist/trigger.d.mts.map +1 -1
  43. package/dist/trigger.mjs +65 -31
  44. package/dist/trigger.mjs.map +1 -1
  45. package/dist/workflow.cjs +1 -1
  46. package/dist/workflow.mjs +1 -1
  47. package/package.json +1 -1
  48. package/dist/agent.d.cts.map +0 -1
  49. package/dist/agent.d.mts.map +0 -1
  50. package/dist/dist-B1fqDXYa.mjs.map +0 -1
  51. package/dist/dist-T7a5DjzV.cjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  const require_dist = require("./dist-CLqJza2Y.cjs");
2
- const require_dist$1 = require("./dist-T7a5DjzV.cjs");
3
- const require_dist$2 = require("./dist-ByV6mHKd.cjs");
2
+ const require_dist$1 = require("./dist-DG2RS68d.cjs");
3
+ const require_dist$2 = require("./dist-DJhg5KTL.cjs");
4
4
  let zod = require("zod");
5
5
  let node_async_hooks = require("node:async_hooks");
6
6
  //#region ../workflow/dist/index.mjs
@@ -490,4 +490,4 @@ Object.defineProperty(exports, "serializeWorkflowError", {
490
490
  }
491
491
  });
492
492
 
493
- //# sourceMappingURL=dist-CxaI84Ch.cjs.map
493
+ //# sourceMappingURL=dist-DKGeSeMa.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dist-CxaI84Ch.cjs","names":["z","SandboxDefinitionSchema","normalizeCredentialList","withSpan","logSystem","captureConsole","getActionCredentialRequirements","executeAction","resolveActionCredentials","AsyncLocalStorage","registerWorkflowRunGetter"],"sources":["../../workflow/dist/index.mjs"],"sourcesContent":["import { z } from \"zod\";\nimport { SandboxDefinitionSchema } from \"@keystrokehq/sandbox\";\nimport { captureConsole, logSystem, withSpan } from \"@keystrokehq/tracing\";\nimport { executeAction, getActionCredentialRequirements, normalizeCredentialList, registerWorkflowRunGetter } from \"@keystrokehq/action\";\nimport { resolveActionCredentials } from \"@keystrokehq/credentials\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n//#region src/workflow-definition.ts\nconst zodSchema = z.custom((v) => v instanceof z.ZodType, \"must be a Zod schema\");\n/** Runtime validation for an unbranded workflow definition. */\nconst workflowCoreSchema = z.object({\n\tkey: z.string().trim().min(1),\n\tname: z.string().optional(),\n\tdescription: z.string().optional(),\n\tsubscription: z.object({ mode: z.enum([\"system\", \"subscribable\"]).optional() }).optional(),\n\tsandbox: SandboxDefinitionSchema.optional(),\n\tinput: zodSchema,\n\toutput: zodSchema,\n\trun: z.function()\n});\nconst WORKFLOW = Symbol.for(\"keystroke.workflow\");\n/**\n* Validates brand + shape via `workflowCoreSchema` so discovery and guards\n* reject malformed definitions.\n*/\nfunction isWorkflow(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (!(WORKFLOW in value) || value[WORKFLOW] !== true) return false;\n\treturn workflowCoreSchema.safeParse(value).success;\n}\n//#endregion\n//#region src/define-workflow.ts\nfunction defineWorkflow(def) {\n\tconst result = workflowCoreSchema.safeParse(def);\n\tif (!result.success) throw new Error(`Invalid workflow definition: ${formatIssues(result.error.issues)}`);\n\treturn {\n\t\t...result.data,\n\t\t[WORKFLOW]: true\n\t};\n}\nfunction formatIssues(issues) {\n\treturn issues.map((issue) => {\n\t\treturn `${issue.path.length > 0 ? `${issue.path.join(\".\")}: ` : \"\"}${issue.message}`;\n\t}).join(\"; \");\n}\n//#endregion\n//#region src/replay/error.ts\nfunction serializeWorkflowError(error) {\n\tif (error instanceof Error) return {\n\t\tname: error.name,\n\t\tmessage: error.message\n\t};\n\treturn { message: String(error) };\n}\n/** Rebuild an Error from a recorded error so replay re-raises the same failure. */\nfunction deserializeWorkflowError(data) {\n\tconst serialized = data;\n\tconst error = new Error(serialized?.message ?? \"Workflow step failed\");\n\tif (serialized?.name) error.name = serialized.name;\n\treturn error;\n}\n//#endregion\n//#region src/replay/duration.ts\nconst UNIT_MS = {\n\tms: 1,\n\ts: 1e3,\n\tm: 6e4,\n\th: 36e5,\n\td: 864e5\n};\n/** Resolve a sleep duration to an absolute resume time. */\nfunction resolveResumeAt(duration, now = /* @__PURE__ */ new Date()) {\n\tif (duration instanceof Date) return duration;\n\tif (typeof duration === \"number\") return new Date(now.getTime() + Math.max(0, duration));\n\treturn new Date(now.getTime() + parseDurationToMs(duration));\n}\nfunction parseDurationToMs(value) {\n\tconst match = /^(\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h|d)$/.exec(value.trim());\n\tif (!match) throw new Error(`Invalid sleep duration \"${value}\". Use a number of ms, a Date, or a string like \"5s\", \"10m\", \"1h\".`);\n\tconst amount = Number(match[1]);\n\tconst unit = match[2];\n\treturn Math.round(amount * UNIT_MS[unit]);\n}\n//#endregion\n//#region src/replay/events-consumer.ts\n/** Indexes replay events by correlationId for O(1) cache-hit checks during replay. */\nvar EventsConsumer = class {\n\tbyCorrelationId = /* @__PURE__ */ new Map();\n\tconstructor(events) {\n\t\tfor (const event of events) {\n\t\t\tif (!event.correlationId) continue;\n\t\t\tconst list = this.byCorrelationId.get(event.correlationId);\n\t\t\tif (list) list.push(event);\n\t\t\telse this.byCorrelationId.set(event.correlationId, [event]);\n\t\t}\n\t}\n\tevents(correlationId) {\n\t\treturn this.byCorrelationId.get(correlationId) ?? [];\n\t}\n\thasEventType(correlationId, type) {\n\t\treturn this.events(correlationId).some((event) => event.type === type);\n\t}\n\t/**\n\t* Cache lookup for a step. Returns the recorded output on a `step_completed`,\n\t* re-raises the recorded error on a terminal `step_failed` (so a permanently\n\t* failed step is not re-executed), and otherwise reports a miss — including\n\t* when only `step_retrying` events exist (the step re-runs on the next pass).\n\t*/\n\tgetStepResult(correlationId) {\n\t\tconst events = this.events(correlationId);\n\t\tconst failed = events.find((event) => event.type === \"step_failed\");\n\t\tif (failed) throw deserializeWorkflowError(failed.data);\n\t\tconst completed = events.find((event) => event.type === \"step_completed\");\n\t\tif (completed) return {\n\t\t\tcompleted: true,\n\t\t\tresult: completed.data\n\t\t};\n\t\treturn { completed: false };\n\t}\n\t/** Number of prior `step_retrying` events recorded for a step (= failed attempts so far). */\n\tcountRetrying(correlationId) {\n\t\treturn this.events(correlationId).filter((event) => event.type === \"step_retrying\").length;\n\t}\n\tisSleepCompleted(correlationId) {\n\t\treturn this.hasEventType(correlationId, \"sleep_completed\");\n\t}\n\t/** Returns the persisted resumeAt for a scheduled-but-not-completed sleep, if any. */\n\tgetSleepResumeAt(correlationId) {\n\t\tconst scheduled = this.events(correlationId).find((event) => event.type === \"sleep_scheduled\");\n\t\tif (!scheduled) return;\n\t\tconst data = scheduled.data;\n\t\treturn data?.resumeAt ? new Date(data.resumeAt) : void 0;\n\t}\n\tgetHookToken(correlationId) {\n\t\treturn (this.events(correlationId).find((event) => event.type === \"hook_created\")?.data)?.token;\n\t}\n\tgetHookResult(correlationId) {\n\t\tconst resumed = this.events(correlationId).find((event) => event.type === \"hook_resumed\");\n\t\tif (!resumed) return { resolved: false };\n\t\treturn {\n\t\t\tresolved: true,\n\t\t\tpayload: resumed.data?.payload\n\t\t};\n\t}\n};\n//#endregion\n//#region src/replay/suspension.ts\n/** A promise that never settles — returned by a suspending primitive so the body parks. */\nfunction createPendingPromise() {\n\treturn new Promise(() => {});\n}\n/**\n* Collects pending items requested within a single tick and resolves once, so\n* parallel suspensions (e.g. Promise.all of two sleeps) batch into one suspension.\n*/\nvar SuspensionCoordinator = class {\n\titems = /* @__PURE__ */ new Map();\n\tscheduled = false;\n\tresolve;\n\tpromise;\n\tconstructor() {\n\t\tthis.promise = new Promise((resolve) => {\n\t\t\tthis.resolve = resolve;\n\t\t});\n\t}\n\trequest(item) {\n\t\tthis.items.set(item.correlationId, item);\n\t\tif (!this.scheduled) {\n\t\t\tthis.scheduled = true;\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tthis.resolve([...this.items.values()]);\n\t\t\t});\n\t\t}\n\t}\n\twaitForSuspension() {\n\t\treturn this.promise;\n\t}\n};\n//#endregion\n//#region src/replay/replay-context.ts\nfunction createReplayState(params) {\n\treturn {\n\t\trunId: params.runId,\n\t\tconsumer: params.consumer,\n\t\tcoordinator: params.coordinator,\n\t\teventLog: params.eventLog,\n\t\tnewEvents: [],\n\t\tnow: params.now ?? /* @__PURE__ */ new Date(),\n\t\thookBaseUrl: params.hookBaseUrl,\n\t\tsleepCounter: 0,\n\t\thookCounter: 0,\n\t\tstepOccurrences: /* @__PURE__ */ new Map(),\n\t\tstepCorrelationIds: /* @__PURE__ */ new Set()\n\t};\n}\n/**\n* Allocate the correlation id for a step. An explicit `.stepId(x)` maps to\n* `step:x` (and must be unique within a run); otherwise the key is\n* `step:<actionKey>#<occurrence>` so that two calls to the same action get\n* distinct, replay-stable ids and inserting an unrelated call never shifts the\n* ids of later calls (unlike a single global ordinal).\n*/\nfunction nextStepCorrelationId(state, actionKey, explicitId) {\n\tif (explicitId !== void 0) {\n\t\tconst correlationId = `step:${explicitId}`;\n\t\tif (state.stepCorrelationIds.has(correlationId)) throw new Error(`Duplicate step id \"${explicitId}\" in workflow run ${state.runId}`);\n\t\tstate.stepCorrelationIds.add(correlationId);\n\t\treturn correlationId;\n\t}\n\tconst occurrence = state.stepOccurrences.get(actionKey) ?? 0;\n\tstate.stepOccurrences.set(actionKey, occurrence + 1);\n\tconst correlationId = `step:${actionKey}#${occurrence}`;\n\tstate.stepCorrelationIds.add(correlationId);\n\treturn correlationId;\n}\nfunction createSleep(state) {\n\treturn function sleep(duration) {\n\t\tconst correlationId = `sleep#${state.sleepCounter++}`;\n\t\tif (state.consumer.isSleepCompleted(correlationId)) return Promise.resolve();\n\t\tconst scheduledResumeAt = state.consumer.getSleepResumeAt(correlationId);\n\t\tconst resumeAt = scheduledResumeAt ?? resolveResumeAt(duration, state.now);\n\t\tif (scheduledResumeAt && resumeAt.getTime() <= state.now.getTime()) {\n\t\t\tstate.newEvents.push({\n\t\t\t\tid: `sleep_completed:${state.runId}:${correlationId}`,\n\t\t\t\trunId: state.runId,\n\t\t\t\ttype: \"sleep_completed\",\n\t\t\t\tcorrelationId\n\t\t\t});\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\tif (!scheduledResumeAt) state.newEvents.push({\n\t\t\tid: `sleep_scheduled:${state.runId}:${correlationId}`,\n\t\t\trunId: state.runId,\n\t\t\ttype: \"sleep_scheduled\",\n\t\t\tcorrelationId,\n\t\t\tdata: { resumeAt: resumeAt.toISOString() }\n\t\t});\n\t\tstate.coordinator.request({\n\t\t\tkind: \"sleep\",\n\t\t\tcorrelationId,\n\t\t\tresumeAt\n\t\t});\n\t\treturn createPendingPromise();\n\t};\n}\nfunction createHook(state) {\n\treturn function hook(options) {\n\t\tconst correlationId = `hook#${state.hookCounter++}`;\n\t\tconst token = options?.token ?? state.consumer.getHookToken(correlationId) ?? `hook_${crypto.randomUUID()}`;\n\t\treturn {\n\t\t\ttoken,\n\t\t\tresumeUrl: state.hookBaseUrl ? `${state.hookBaseUrl}/hooks/${token}/resume` : `/hooks/${token}/resume`,\n\t\t\tthen(onFulfilled, onRejected) {\n\t\t\t\tconst result = state.consumer.getHookResult(correlationId);\n\t\t\t\tif (result.resolved) {\n\t\t\t\t\tconst payload = options?.schema ? options.schema.parse(result.payload) : result.payload;\n\t\t\t\t\treturn Promise.resolve(payload).then(onFulfilled, onRejected);\n\t\t\t\t}\n\t\t\t\tif (!state.consumer.hasEventType(correlationId, \"hook_created\")) state.newEvents.push({\n\t\t\t\t\tid: `hook_created:${state.runId}:${correlationId}`,\n\t\t\t\t\trunId: state.runId,\n\t\t\t\t\ttype: \"hook_created\",\n\t\t\t\t\tcorrelationId,\n\t\t\t\t\tdata: { token }\n\t\t\t\t});\n\t\t\t\tstate.coordinator.request({\n\t\t\t\t\tkind: \"hook\",\n\t\t\t\t\tcorrelationId,\n\t\t\t\t\ttoken\n\t\t\t\t});\n\t\t\t\treturn createPendingPromise().then(onFulfilled, onRejected);\n\t\t\t}\n\t\t};\n\t};\n}\n//#endregion\n//#region src/create-action-runner.ts\nfunction withCredentialChainOverride(requirements, chain) {\n\tif (!requirements || !chain) return requirements;\n\treturn normalizeCredentialList(requirements).map((requirement) => ({\n\t\t...requirement,\n\t\tchain\n\t}));\n}\n/**\n* Builds the per-run action runner. Each action call resolves a stable\n* `correlation_id`, short-circuits from the durable event log on a cache hit,\n* and otherwise executes and appends `step_completed` immediately (preserving\n* per-step crash durability). A thrown step appends `step_retrying` (non-fatal,\n* re-run on the next attempt) and rethrows; the terminal `step_failed` is\n* written by the job handler once the queue exhausts retries.\n*/\nfunction createActionRunner(state, options = {}) {\n\tconst { runId, consumer, eventLog } = state;\n\treturn async (action, input, runOptions) => {\n\t\tconst correlationId = nextStepCorrelationId(state, action.key, runOptions?.id);\n\t\tconst cached = consumer.getStepResult(correlationId);\n\t\tif (cached.completed) {\n\t\t\tawait withSpan({\n\t\t\t\tkind: \"action\",\n\t\t\t\tname: action.key,\n\t\t\t\trefId: `${runId}:${correlationId}`,\n\t\t\t\tmetadata: {\n\t\t\t\t\trunId,\n\t\t\t\t\tactionKey: action.key,\n\t\t\t\t\tcorrelationId,\n\t\t\t\t\treplayed: true\n\t\t\t\t}\n\t\t\t}, async () => {\n\t\t\t\tawait logSystem(\"info\", \"action replayed from checkpoint\", {\n\t\t\t\t\trunId,\n\t\t\t\t\tactionKey: action.key,\n\t\t\t\t\tcorrelationId\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn action.output.parse(cached.result);\n\t\t}\n\t\treturn withSpan({\n\t\t\tkind: \"action\",\n\t\t\tname: action.key,\n\t\t\trefId: `${runId}:${correlationId}`,\n\t\t\tmetadata: {\n\t\t\t\trunId,\n\t\t\t\tactionKey: action.key,\n\t\t\t\tcorrelationId\n\t\t\t}\n\t\t}, async () => captureConsole(async () => {\n\t\t\ttry {\n\t\t\t\tconst requirements = withCredentialChainOverride(getActionCredentialRequirements(action), runOptions?.credentialChain);\n\t\t\t\tconst contextOverride = runOptions?.credentialSelection ? { selection: runOptions.credentialSelection } : void 0;\n\t\t\t\tconst validatedOutput = await executeAction(action, input, requirements?.length ? await resolveActionCredentials(requirements, {\n\t\t\t\t\tresolveCredentials: options.resolveCredentials,\n\t\t\t\t\tcontext: options.credentialContext,\n\t\t\t\t\toauthAdapter: options.oauthAdapter,\n\t\t\t\t\tconsumer: {\n\t\t\t\t\t\tkind: \"action\",\n\t\t\t\t\t\tname: action.key\n\t\t\t\t\t},\n\t\t\t\t\tcontextOverride\n\t\t\t\t}) : {});\n\t\t\t\tawait eventLog.append({\n\t\t\t\t\tid: `step_completed:${runId}:${correlationId}`,\n\t\t\t\t\trunId,\n\t\t\t\t\ttype: \"step_completed\",\n\t\t\t\t\tcorrelationId,\n\t\t\t\t\tdata: validatedOutput\n\t\t\t\t});\n\t\t\t\treturn validatedOutput;\n\t\t\t} catch (error) {\n\t\t\t\tconst attempt = consumer.countRetrying(correlationId);\n\t\t\t\tawait eventLog.append({\n\t\t\t\t\tid: `step_retrying:${runId}:${correlationId}:${attempt}`,\n\t\t\t\t\trunId,\n\t\t\t\t\ttype: \"step_retrying\",\n\t\t\t\t\tcorrelationId,\n\t\t\t\t\tdata: serializeWorkflowError(error)\n\t\t\t\t});\n\t\t\t\tstate.failedCorrelationId = correlationId;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}));\n\t};\n}\n//#endregion\n//#region src/run-context.ts\nconst storage = new AsyncLocalStorage();\nregisterWorkflowRunGetter(() => {\n\tconst store = storage.getStore();\n\tif (!store) return;\n\treturn { actionRunner: store.actionRunner };\n});\nfunction runWithWorkflowContext(store, fn) {\n\treturn storage.run(store, fn);\n}\n//#endregion\n//#region src/replay/memory-event-log.ts\n/** In-memory durable log for inline execution and tests. */\nvar MemoryEventLog = class {\n\tevents = [];\n\tids = /* @__PURE__ */ new Set();\n\tasync append(event) {\n\t\tconst id = event.id ?? crypto.randomUUID();\n\t\tif (this.ids.has(id)) return false;\n\t\tthis.ids.add(id);\n\t\tthis.events.push({\n\t\t\tid,\n\t\t\trunId: event.runId,\n\t\t\tseq: this.events.length,\n\t\t\ttype: event.type,\n\t\t\tcorrelationId: event.correlationId ?? null,\n\t\t\tdata: event.data ?? null\n\t\t});\n\t\treturn true;\n\t}\n\tasync listReplay(runId) {\n\t\treturn this.events.filter((event) => event.runId === runId).map((event) => ({ ...event }));\n\t}\n};\n//#endregion\n//#region src/execute-workflow.ts\n/**\n* The single way to run a workflow: replay its event log from the top, execute\n* un-cached primitives, and either complete/fail or suspend at the first\n* un-satisfied sleep/hook. New events (sleep_scheduled/sleep_completed/\n* hook_created/run_completed/run_failed) are flushed before returning.\n*\n* Durability comes entirely from the log — a suspended run resumes by calling\n* this again with the same `runId` and event log once the sleep is due or the\n* hook is resumed.\n*/\nasync function executeWorkflow(workflow, input, options = {}) {\n\tconst runId = options.runId ?? crypto.randomUUID();\n\tconst eventLog = options.eventLog ?? new MemoryEventLog();\n\tconst consumer = new EventsConsumer(await eventLog.listReplay(runId));\n\tconst coordinator = new SuspensionCoordinator();\n\tconst state = createReplayState({\n\t\trunId,\n\t\tconsumer,\n\t\tcoordinator,\n\t\teventLog,\n\t\thookBaseUrl: options.hookBaseUrl,\n\t\tnow: options.now\n\t});\n\tconst actionRunner = createActionRunner(state, {\n\t\tresolveCredentials: options.resolveCredentials,\n\t\tcredentialContext: options.credentialContext,\n\t\toauthAdapter: options.oauthAdapter\n\t});\n\tconst ctx = {\n\t\trunId,\n\t\tsleep: createSleep(state),\n\t\thook: createHook(state),\n\t\t...options.context\n\t};\n\tconst validatedInput = workflow.input.parse(input);\n\tconst bodyPromise = runWithWorkflowContext({\n\t\tactionRunner,\n\t\trunId\n\t}, () => captureConsole(async () => workflow.run(validatedInput, ctx)));\n\tconst outcome = await Promise.race([bodyPromise.then((output) => ({\n\t\ttype: \"done\",\n\t\toutput\n\t}), (error) => ({\n\t\ttype: \"error\",\n\t\terror\n\t})), coordinator.waitForSuspension().then((items) => ({\n\t\ttype: \"suspended\",\n\t\titems\n\t}))]);\n\tlet result;\n\tif (outcome.type === \"suspended\") {\n\t\tbodyPromise.catch(() => {});\n\t\tresult = {\n\t\t\tstatus: \"suspended\",\n\t\t\titems: outcome.items\n\t\t};\n\t} else if (outcome.type === \"done\") {\n\t\tconst output = workflow.output.parse(outcome.output);\n\t\tstate.newEvents.push({\n\t\t\tid: `run_completed:${runId}`,\n\t\t\trunId,\n\t\t\ttype: \"run_completed\",\n\t\t\tdata: { output }\n\t\t});\n\t\tresult = {\n\t\t\tstatus: \"completed\",\n\t\t\toutput\n\t\t};\n\t} else result = {\n\t\tstatus: \"failed\",\n\t\terror: outcome.error,\n\t\tfailedCorrelationId: state.failedCorrelationId\n\t};\n\tfor (const event of state.newEvents) await eventLog.append(event);\n\treturn result;\n}\n//#endregion\nexport { MemoryEventLog, defineWorkflow, deserializeWorkflowError, executeWorkflow, isWorkflow, serializeWorkflowError };\n\n//# sourceMappingURL=index.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"dist-DKGeSeMa.cjs","names":["z","SandboxDefinitionSchema","normalizeCredentialList","withSpan","logSystem","captureConsole","getActionCredentialRequirements","executeAction","resolveActionCredentials","AsyncLocalStorage","registerWorkflowRunGetter"],"sources":["../../workflow/dist/index.mjs"],"sourcesContent":["import { z } from \"zod\";\nimport { SandboxDefinitionSchema } from \"@keystrokehq/sandbox\";\nimport { captureConsole, logSystem, withSpan } from \"@keystrokehq/tracing\";\nimport { executeAction, getActionCredentialRequirements, normalizeCredentialList, registerWorkflowRunGetter } from \"@keystrokehq/action\";\nimport { resolveActionCredentials } from \"@keystrokehq/credentials\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n//#region src/workflow-definition.ts\nconst zodSchema = z.custom((v) => v instanceof z.ZodType, \"must be a Zod schema\");\n/** Runtime validation for an unbranded workflow definition. */\nconst workflowCoreSchema = z.object({\n\tkey: z.string().trim().min(1),\n\tname: z.string().optional(),\n\tdescription: z.string().optional(),\n\tsubscription: z.object({ mode: z.enum([\"system\", \"subscribable\"]).optional() }).optional(),\n\tsandbox: SandboxDefinitionSchema.optional(),\n\tinput: zodSchema,\n\toutput: zodSchema,\n\trun: z.function()\n});\nconst WORKFLOW = Symbol.for(\"keystroke.workflow\");\n/**\n* Validates brand + shape via `workflowCoreSchema` so discovery and guards\n* reject malformed definitions.\n*/\nfunction isWorkflow(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (!(WORKFLOW in value) || value[WORKFLOW] !== true) return false;\n\treturn workflowCoreSchema.safeParse(value).success;\n}\n//#endregion\n//#region src/define-workflow.ts\nfunction defineWorkflow(def) {\n\tconst result = workflowCoreSchema.safeParse(def);\n\tif (!result.success) throw new Error(`Invalid workflow definition: ${formatIssues(result.error.issues)}`);\n\treturn {\n\t\t...result.data,\n\t\t[WORKFLOW]: true\n\t};\n}\nfunction formatIssues(issues) {\n\treturn issues.map((issue) => {\n\t\treturn `${issue.path.length > 0 ? `${issue.path.join(\".\")}: ` : \"\"}${issue.message}`;\n\t}).join(\"; \");\n}\n//#endregion\n//#region src/replay/error.ts\nfunction serializeWorkflowError(error) {\n\tif (error instanceof Error) return {\n\t\tname: error.name,\n\t\tmessage: error.message\n\t};\n\treturn { message: String(error) };\n}\n/** Rebuild an Error from a recorded error so replay re-raises the same failure. */\nfunction deserializeWorkflowError(data) {\n\tconst serialized = data;\n\tconst error = new Error(serialized?.message ?? \"Workflow step failed\");\n\tif (serialized?.name) error.name = serialized.name;\n\treturn error;\n}\n//#endregion\n//#region src/replay/duration.ts\nconst UNIT_MS = {\n\tms: 1,\n\ts: 1e3,\n\tm: 6e4,\n\th: 36e5,\n\td: 864e5\n};\n/** Resolve a sleep duration to an absolute resume time. */\nfunction resolveResumeAt(duration, now = /* @__PURE__ */ new Date()) {\n\tif (duration instanceof Date) return duration;\n\tif (typeof duration === \"number\") return new Date(now.getTime() + Math.max(0, duration));\n\treturn new Date(now.getTime() + parseDurationToMs(duration));\n}\nfunction parseDurationToMs(value) {\n\tconst match = /^(\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h|d)$/.exec(value.trim());\n\tif (!match) throw new Error(`Invalid sleep duration \"${value}\". Use a number of ms, a Date, or a string like \"5s\", \"10m\", \"1h\".`);\n\tconst amount = Number(match[1]);\n\tconst unit = match[2];\n\treturn Math.round(amount * UNIT_MS[unit]);\n}\n//#endregion\n//#region src/replay/events-consumer.ts\n/** Indexes replay events by correlationId for O(1) cache-hit checks during replay. */\nvar EventsConsumer = class {\n\tbyCorrelationId = /* @__PURE__ */ new Map();\n\tconstructor(events) {\n\t\tfor (const event of events) {\n\t\t\tif (!event.correlationId) continue;\n\t\t\tconst list = this.byCorrelationId.get(event.correlationId);\n\t\t\tif (list) list.push(event);\n\t\t\telse this.byCorrelationId.set(event.correlationId, [event]);\n\t\t}\n\t}\n\tevents(correlationId) {\n\t\treturn this.byCorrelationId.get(correlationId) ?? [];\n\t}\n\thasEventType(correlationId, type) {\n\t\treturn this.events(correlationId).some((event) => event.type === type);\n\t}\n\t/**\n\t* Cache lookup for a step. Returns the recorded output on a `step_completed`,\n\t* re-raises the recorded error on a terminal `step_failed` (so a permanently\n\t* failed step is not re-executed), and otherwise reports a miss — including\n\t* when only `step_retrying` events exist (the step re-runs on the next pass).\n\t*/\n\tgetStepResult(correlationId) {\n\t\tconst events = this.events(correlationId);\n\t\tconst failed = events.find((event) => event.type === \"step_failed\");\n\t\tif (failed) throw deserializeWorkflowError(failed.data);\n\t\tconst completed = events.find((event) => event.type === \"step_completed\");\n\t\tif (completed) return {\n\t\t\tcompleted: true,\n\t\t\tresult: completed.data\n\t\t};\n\t\treturn { completed: false };\n\t}\n\t/** Number of prior `step_retrying` events recorded for a step (= failed attempts so far). */\n\tcountRetrying(correlationId) {\n\t\treturn this.events(correlationId).filter((event) => event.type === \"step_retrying\").length;\n\t}\n\tisSleepCompleted(correlationId) {\n\t\treturn this.hasEventType(correlationId, \"sleep_completed\");\n\t}\n\t/** Returns the persisted resumeAt for a scheduled-but-not-completed sleep, if any. */\n\tgetSleepResumeAt(correlationId) {\n\t\tconst scheduled = this.events(correlationId).find((event) => event.type === \"sleep_scheduled\");\n\t\tif (!scheduled) return;\n\t\tconst data = scheduled.data;\n\t\treturn data?.resumeAt ? new Date(data.resumeAt) : void 0;\n\t}\n\tgetHookToken(correlationId) {\n\t\treturn (this.events(correlationId).find((event) => event.type === \"hook_created\")?.data)?.token;\n\t}\n\tgetHookResult(correlationId) {\n\t\tconst resumed = this.events(correlationId).find((event) => event.type === \"hook_resumed\");\n\t\tif (!resumed) return { resolved: false };\n\t\treturn {\n\t\t\tresolved: true,\n\t\t\tpayload: resumed.data?.payload\n\t\t};\n\t}\n};\n//#endregion\n//#region src/replay/suspension.ts\n/** A promise that never settles — returned by a suspending primitive so the body parks. */\nfunction createPendingPromise() {\n\treturn new Promise(() => {});\n}\n/**\n* Collects pending items requested within a single tick and resolves once, so\n* parallel suspensions (e.g. Promise.all of two sleeps) batch into one suspension.\n*/\nvar SuspensionCoordinator = class {\n\titems = /* @__PURE__ */ new Map();\n\tscheduled = false;\n\tresolve;\n\tpromise;\n\tconstructor() {\n\t\tthis.promise = new Promise((resolve) => {\n\t\t\tthis.resolve = resolve;\n\t\t});\n\t}\n\trequest(item) {\n\t\tthis.items.set(item.correlationId, item);\n\t\tif (!this.scheduled) {\n\t\t\tthis.scheduled = true;\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tthis.resolve([...this.items.values()]);\n\t\t\t});\n\t\t}\n\t}\n\twaitForSuspension() {\n\t\treturn this.promise;\n\t}\n};\n//#endregion\n//#region src/replay/replay-context.ts\nfunction createReplayState(params) {\n\treturn {\n\t\trunId: params.runId,\n\t\tconsumer: params.consumer,\n\t\tcoordinator: params.coordinator,\n\t\teventLog: params.eventLog,\n\t\tnewEvents: [],\n\t\tnow: params.now ?? /* @__PURE__ */ new Date(),\n\t\thookBaseUrl: params.hookBaseUrl,\n\t\tsleepCounter: 0,\n\t\thookCounter: 0,\n\t\tstepOccurrences: /* @__PURE__ */ new Map(),\n\t\tstepCorrelationIds: /* @__PURE__ */ new Set()\n\t};\n}\n/**\n* Allocate the correlation id for a step. An explicit `.stepId(x)` maps to\n* `step:x` (and must be unique within a run); otherwise the key is\n* `step:<actionKey>#<occurrence>` so that two calls to the same action get\n* distinct, replay-stable ids and inserting an unrelated call never shifts the\n* ids of later calls (unlike a single global ordinal).\n*/\nfunction nextStepCorrelationId(state, actionKey, explicitId) {\n\tif (explicitId !== void 0) {\n\t\tconst correlationId = `step:${explicitId}`;\n\t\tif (state.stepCorrelationIds.has(correlationId)) throw new Error(`Duplicate step id \"${explicitId}\" in workflow run ${state.runId}`);\n\t\tstate.stepCorrelationIds.add(correlationId);\n\t\treturn correlationId;\n\t}\n\tconst occurrence = state.stepOccurrences.get(actionKey) ?? 0;\n\tstate.stepOccurrences.set(actionKey, occurrence + 1);\n\tconst correlationId = `step:${actionKey}#${occurrence}`;\n\tstate.stepCorrelationIds.add(correlationId);\n\treturn correlationId;\n}\nfunction createSleep(state) {\n\treturn function sleep(duration) {\n\t\tconst correlationId = `sleep#${state.sleepCounter++}`;\n\t\tif (state.consumer.isSleepCompleted(correlationId)) return Promise.resolve();\n\t\tconst scheduledResumeAt = state.consumer.getSleepResumeAt(correlationId);\n\t\tconst resumeAt = scheduledResumeAt ?? resolveResumeAt(duration, state.now);\n\t\tif (scheduledResumeAt && resumeAt.getTime() <= state.now.getTime()) {\n\t\t\tstate.newEvents.push({\n\t\t\t\tid: `sleep_completed:${state.runId}:${correlationId}`,\n\t\t\t\trunId: state.runId,\n\t\t\t\ttype: \"sleep_completed\",\n\t\t\t\tcorrelationId\n\t\t\t});\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\tif (!scheduledResumeAt) state.newEvents.push({\n\t\t\tid: `sleep_scheduled:${state.runId}:${correlationId}`,\n\t\t\trunId: state.runId,\n\t\t\ttype: \"sleep_scheduled\",\n\t\t\tcorrelationId,\n\t\t\tdata: { resumeAt: resumeAt.toISOString() }\n\t\t});\n\t\tstate.coordinator.request({\n\t\t\tkind: \"sleep\",\n\t\t\tcorrelationId,\n\t\t\tresumeAt\n\t\t});\n\t\treturn createPendingPromise();\n\t};\n}\nfunction createHook(state) {\n\treturn function hook(options) {\n\t\tconst correlationId = `hook#${state.hookCounter++}`;\n\t\tconst token = options?.token ?? state.consumer.getHookToken(correlationId) ?? `hook_${crypto.randomUUID()}`;\n\t\treturn {\n\t\t\ttoken,\n\t\t\tresumeUrl: state.hookBaseUrl ? `${state.hookBaseUrl}/hooks/${token}/resume` : `/hooks/${token}/resume`,\n\t\t\tthen(onFulfilled, onRejected) {\n\t\t\t\tconst result = state.consumer.getHookResult(correlationId);\n\t\t\t\tif (result.resolved) {\n\t\t\t\t\tconst payload = options?.schema ? options.schema.parse(result.payload) : result.payload;\n\t\t\t\t\treturn Promise.resolve(payload).then(onFulfilled, onRejected);\n\t\t\t\t}\n\t\t\t\tif (!state.consumer.hasEventType(correlationId, \"hook_created\")) state.newEvents.push({\n\t\t\t\t\tid: `hook_created:${state.runId}:${correlationId}`,\n\t\t\t\t\trunId: state.runId,\n\t\t\t\t\ttype: \"hook_created\",\n\t\t\t\t\tcorrelationId,\n\t\t\t\t\tdata: { token }\n\t\t\t\t});\n\t\t\t\tstate.coordinator.request({\n\t\t\t\t\tkind: \"hook\",\n\t\t\t\t\tcorrelationId,\n\t\t\t\t\ttoken\n\t\t\t\t});\n\t\t\t\treturn createPendingPromise().then(onFulfilled, onRejected);\n\t\t\t}\n\t\t};\n\t};\n}\n//#endregion\n//#region src/create-action-runner.ts\nfunction withCredentialChainOverride(requirements, chain) {\n\tif (!requirements || !chain) return requirements;\n\treturn normalizeCredentialList(requirements).map((requirement) => ({\n\t\t...requirement,\n\t\tchain\n\t}));\n}\n/**\n* Builds the per-run action runner. Each action call resolves a stable\n* `correlation_id`, short-circuits from the durable event log on a cache hit,\n* and otherwise executes and appends `step_completed` immediately (preserving\n* per-step crash durability). A thrown step appends `step_retrying` (non-fatal,\n* re-run on the next attempt) and rethrows; the terminal `step_failed` is\n* written by the job handler once the queue exhausts retries.\n*/\nfunction createActionRunner(state, options = {}) {\n\tconst { runId, consumer, eventLog } = state;\n\treturn async (action, input, runOptions) => {\n\t\tconst correlationId = nextStepCorrelationId(state, action.key, runOptions?.id);\n\t\tconst cached = consumer.getStepResult(correlationId);\n\t\tif (cached.completed) {\n\t\t\tawait withSpan({\n\t\t\t\tkind: \"action\",\n\t\t\t\tname: action.key,\n\t\t\t\trefId: `${runId}:${correlationId}`,\n\t\t\t\tmetadata: {\n\t\t\t\t\trunId,\n\t\t\t\t\tactionKey: action.key,\n\t\t\t\t\tcorrelationId,\n\t\t\t\t\treplayed: true\n\t\t\t\t}\n\t\t\t}, async () => {\n\t\t\t\tawait logSystem(\"info\", \"action replayed from checkpoint\", {\n\t\t\t\t\trunId,\n\t\t\t\t\tactionKey: action.key,\n\t\t\t\t\tcorrelationId\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn action.output.parse(cached.result);\n\t\t}\n\t\treturn withSpan({\n\t\t\tkind: \"action\",\n\t\t\tname: action.key,\n\t\t\trefId: `${runId}:${correlationId}`,\n\t\t\tmetadata: {\n\t\t\t\trunId,\n\t\t\t\tactionKey: action.key,\n\t\t\t\tcorrelationId\n\t\t\t}\n\t\t}, async () => captureConsole(async () => {\n\t\t\ttry {\n\t\t\t\tconst requirements = withCredentialChainOverride(getActionCredentialRequirements(action), runOptions?.credentialChain);\n\t\t\t\tconst contextOverride = runOptions?.credentialSelection ? { selection: runOptions.credentialSelection } : void 0;\n\t\t\t\tconst validatedOutput = await executeAction(action, input, requirements?.length ? await resolveActionCredentials(requirements, {\n\t\t\t\t\tresolveCredentials: options.resolveCredentials,\n\t\t\t\t\tcontext: options.credentialContext,\n\t\t\t\t\toauthAdapter: options.oauthAdapter,\n\t\t\t\t\tconsumer: {\n\t\t\t\t\t\tkind: \"action\",\n\t\t\t\t\t\tname: action.key\n\t\t\t\t\t},\n\t\t\t\t\tcontextOverride\n\t\t\t\t}) : {});\n\t\t\t\tawait eventLog.append({\n\t\t\t\t\tid: `step_completed:${runId}:${correlationId}`,\n\t\t\t\t\trunId,\n\t\t\t\t\ttype: \"step_completed\",\n\t\t\t\t\tcorrelationId,\n\t\t\t\t\tdata: validatedOutput\n\t\t\t\t});\n\t\t\t\treturn validatedOutput;\n\t\t\t} catch (error) {\n\t\t\t\tconst attempt = consumer.countRetrying(correlationId);\n\t\t\t\tawait eventLog.append({\n\t\t\t\t\tid: `step_retrying:${runId}:${correlationId}:${attempt}`,\n\t\t\t\t\trunId,\n\t\t\t\t\ttype: \"step_retrying\",\n\t\t\t\t\tcorrelationId,\n\t\t\t\t\tdata: serializeWorkflowError(error)\n\t\t\t\t});\n\t\t\t\tstate.failedCorrelationId = correlationId;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}));\n\t};\n}\n//#endregion\n//#region src/run-context.ts\nconst storage = new AsyncLocalStorage();\nregisterWorkflowRunGetter(() => {\n\tconst store = storage.getStore();\n\tif (!store) return;\n\treturn { actionRunner: store.actionRunner };\n});\nfunction runWithWorkflowContext(store, fn) {\n\treturn storage.run(store, fn);\n}\n//#endregion\n//#region src/replay/memory-event-log.ts\n/** In-memory durable log for inline execution and tests. */\nvar MemoryEventLog = class {\n\tevents = [];\n\tids = /* @__PURE__ */ new Set();\n\tasync append(event) {\n\t\tconst id = event.id ?? crypto.randomUUID();\n\t\tif (this.ids.has(id)) return false;\n\t\tthis.ids.add(id);\n\t\tthis.events.push({\n\t\t\tid,\n\t\t\trunId: event.runId,\n\t\t\tseq: this.events.length,\n\t\t\ttype: event.type,\n\t\t\tcorrelationId: event.correlationId ?? null,\n\t\t\tdata: event.data ?? null\n\t\t});\n\t\treturn true;\n\t}\n\tasync listReplay(runId) {\n\t\treturn this.events.filter((event) => event.runId === runId).map((event) => ({ ...event }));\n\t}\n};\n//#endregion\n//#region src/execute-workflow.ts\n/**\n* The single way to run a workflow: replay its event log from the top, execute\n* un-cached primitives, and either complete/fail or suspend at the first\n* un-satisfied sleep/hook. New events (sleep_scheduled/sleep_completed/\n* hook_created/run_completed/run_failed) are flushed before returning.\n*\n* Durability comes entirely from the log — a suspended run resumes by calling\n* this again with the same `runId` and event log once the sleep is due or the\n* hook is resumed.\n*/\nasync function executeWorkflow(workflow, input, options = {}) {\n\tconst runId = options.runId ?? crypto.randomUUID();\n\tconst eventLog = options.eventLog ?? new MemoryEventLog();\n\tconst consumer = new EventsConsumer(await eventLog.listReplay(runId));\n\tconst coordinator = new SuspensionCoordinator();\n\tconst state = createReplayState({\n\t\trunId,\n\t\tconsumer,\n\t\tcoordinator,\n\t\teventLog,\n\t\thookBaseUrl: options.hookBaseUrl,\n\t\tnow: options.now\n\t});\n\tconst actionRunner = createActionRunner(state, {\n\t\tresolveCredentials: options.resolveCredentials,\n\t\tcredentialContext: options.credentialContext,\n\t\toauthAdapter: options.oauthAdapter\n\t});\n\tconst ctx = {\n\t\trunId,\n\t\tsleep: createSleep(state),\n\t\thook: createHook(state),\n\t\t...options.context\n\t};\n\tconst validatedInput = workflow.input.parse(input);\n\tconst bodyPromise = runWithWorkflowContext({\n\t\tactionRunner,\n\t\trunId\n\t}, () => captureConsole(async () => workflow.run(validatedInput, ctx)));\n\tconst outcome = await Promise.race([bodyPromise.then((output) => ({\n\t\ttype: \"done\",\n\t\toutput\n\t}), (error) => ({\n\t\ttype: \"error\",\n\t\terror\n\t})), coordinator.waitForSuspension().then((items) => ({\n\t\ttype: \"suspended\",\n\t\titems\n\t}))]);\n\tlet result;\n\tif (outcome.type === \"suspended\") {\n\t\tbodyPromise.catch(() => {});\n\t\tresult = {\n\t\t\tstatus: \"suspended\",\n\t\t\titems: outcome.items\n\t\t};\n\t} else if (outcome.type === \"done\") {\n\t\tconst output = workflow.output.parse(outcome.output);\n\t\tstate.newEvents.push({\n\t\t\tid: `run_completed:${runId}`,\n\t\t\trunId,\n\t\t\ttype: \"run_completed\",\n\t\t\tdata: { output }\n\t\t});\n\t\tresult = {\n\t\t\tstatus: \"completed\",\n\t\t\toutput\n\t\t};\n\t} else result = {\n\t\tstatus: \"failed\",\n\t\terror: outcome.error,\n\t\tfailedCorrelationId: state.failedCorrelationId\n\t};\n\tfor (const event of state.newEvents) await eventLog.append(event);\n\treturn result;\n}\n//#endregion\nexport { MemoryEventLog, defineWorkflow, deserializeWorkflowError, executeWorkflow, isWorkflow, serializeWorkflowError };\n\n//# sourceMappingURL=index.mjs.map"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Bn as __require, Ln as __commonJSMin, Vn as __toESM } from "./dist-f_JGyGWx.mjs";
2
- import { b as normalizeCredentialList, m as CREDENTIAL_SCOPE_LEVEL_TO_SCOPE_TYPE } from "./dist-B1fqDXYa.mjs";
2
+ import { b as normalizeCredentialList, m as CREDENTIAL_SCOPE_LEVEL_TO_SCOPE_TYPE } from "./dist-CAGgGvND.mjs";
3
3
  import { AsyncLocalStorage } from "node:async_hooks";
4
4
  import "node:fs";
5
5
  import { ZodFirstPartyTypeKind } from "zod/v3";
@@ -13255,7 +13255,7 @@ async function connectMcpServer(name, options) {
13255
13255
  }
13256
13256
  async function createTransport(url, transport, requestInit, fetchImpl) {
13257
13257
  if (transport === "sse") {
13258
- const { SSEClientTransport } = await import("./sse-Bxvdniu5.mjs");
13258
+ const { SSEClientTransport } = await import("./sse-CcbP5P9d.mjs");
13259
13259
  return new SSEClientTransport(url, {
13260
13260
  requestInit,
13261
13261
  fetch: fetchImpl
@@ -15756,6 +15756,16 @@ function and(...unfilteredConditions) {
15756
15756
  new StringChunk(")")
15757
15757
  ]);
15758
15758
  }
15759
+ function or(...unfilteredConditions) {
15760
+ const conditions = unfilteredConditions.filter((c) => c !== void 0);
15761
+ if (conditions.length === 0) return;
15762
+ if (conditions.length === 1) return new SQL(conditions);
15763
+ return new SQL([
15764
+ new StringChunk("("),
15765
+ sql.join(conditions, new StringChunk(" or ")),
15766
+ new StringChunk(")")
15767
+ ]);
15768
+ }
15759
15769
  function isNull(value) {
15760
15770
  return sql`${value} is null`;
15761
15771
  }
@@ -16334,6 +16344,41 @@ function index(name) {
16334
16344
  function uniqueIndex(name) {
16335
16345
  return new IndexBuilderOn(name, true);
16336
16346
  }
16347
+ const traceContextStorage = new AsyncLocalStorage();
16348
+ function getTraceContext() {
16349
+ return traceContextStorage.getStore();
16350
+ }
16351
+ const CONSOLE_LEVELS = [
16352
+ "log",
16353
+ "debug",
16354
+ "info",
16355
+ "warn",
16356
+ "error"
16357
+ ];
16358
+ async function captureConsole(fn) {
16359
+ const originals = /* @__PURE__ */ new Map();
16360
+ for (const level of CONSOLE_LEVELS) {
16361
+ originals.set(level, console[level].bind(console));
16362
+ console[level] = (...args) => {
16363
+ originals.get(level)?.(...args);
16364
+ getTraceContext();
16365
+ };
16366
+ }
16367
+ try {
16368
+ return await fn();
16369
+ } finally {
16370
+ for (const level of CONSOLE_LEVELS) {
16371
+ const original = originals.get(level);
16372
+ if (original) console[level] = original;
16373
+ }
16374
+ }
16375
+ }
16376
+ async function logSystem(level, message, data) {
16377
+ getTraceContext();
16378
+ }
16379
+ async function withSpan(input, fn) {
16380
+ return await fn();
16381
+ }
16337
16382
  //#endregion
16338
16383
  //#region ../database/dist/index.mjs
16339
16384
  const tenantScopeStorage = new AsyncLocalStorage();
@@ -16393,6 +16438,8 @@ const agentSessions = pgTable("agent_sessions", {
16393
16438
  id: text$1("id").primaryKey(),
16394
16439
  projectId: text$1("project_id").notNull(),
16395
16440
  agentId: text$1("agent_id").notNull().references(() => agents.id),
16441
+ sourceKind: text$1("source_kind").$type().notNull().default("api"),
16442
+ sourceId: text$1("source_id"),
16396
16443
  parentSpanId: text$1("parent_span_id"),
16397
16444
  createdAt: timestamp("created_at", { withTimezone: true }).notNull(),
16398
16445
  updatedAt: timestamp("updated_at", { withTimezone: true }).notNull(),
@@ -16402,6 +16449,8 @@ const agentSessionsSqlite = sqliteTable("agent_sessions", {
16402
16449
  id: text("id").primaryKey(),
16403
16450
  projectId: text("project_id").notNull(),
16404
16451
  agentId: text("agent_id").notNull().references(() => agentsSqlite.id),
16452
+ sourceKind: text("source_kind").$type().notNull().default("api"),
16453
+ sourceId: text("source_id"),
16405
16454
  parentSpanId: text("parent_span_id"),
16406
16455
  createdAt: integer("created_at", { mode: "timestamp_ms" }).notNull(),
16407
16456
  updatedAt: integer("updated_at", { mode: "timestamp_ms" }).notNull(),
@@ -16429,7 +16478,9 @@ const triggerAttachments = pgTable("trigger_attachments", {
16429
16478
  id: text$1("id").primaryKey(),
16430
16479
  projectId: text$1("project_id").notNull(),
16431
16480
  key: text$1("key").notNull(),
16432
- workflowKey: text$1("workflow_key").notNull(),
16481
+ targetKind: text$1("target_kind").$type().notNull().default("workflow"),
16482
+ workflowKey: text$1("workflow_key"),
16483
+ agentKey: text$1("agent_key"),
16433
16484
  moduleFile: text$1("module_file").notNull(),
16434
16485
  source: jsonb("source").$type().notNull(),
16435
16486
  registeredAt: timestamp("registered_at", { withTimezone: true }).notNull(),
@@ -16440,7 +16491,9 @@ const triggerAttachmentsSqlite = sqliteTable("trigger_attachments", {
16440
16491
  id: text("id").primaryKey(),
16441
16492
  projectId: text("project_id").notNull(),
16442
16493
  key: text("key").notNull(),
16443
- workflowKey: text("workflow_key").notNull(),
16494
+ targetKind: text("target_kind").$type().notNull().default("workflow"),
16495
+ workflowKey: text("workflow_key"),
16496
+ agentKey: text("agent_key"),
16444
16497
  moduleFile: text("module_file").notNull(),
16445
16498
  source: text("source", { mode: "json" }).$type().notNull(),
16446
16499
  registeredAt: integer("registered_at", { mode: "timestamp_ms" }).notNull(),
@@ -16512,6 +16565,8 @@ const workflowRuns = pgTable("workflow_runs", {
16512
16565
  triggerRunId: text$1("trigger_run_id").references(() => triggerRuns.id),
16513
16566
  parentWorkflowRunId: text$1("parent_workflow_run_id"),
16514
16567
  parentSpanId: text$1("parent_span_id"),
16568
+ sourceKind: text$1("source_kind").$type().notNull().default("api"),
16569
+ sourceId: text$1("source_id"),
16515
16570
  status: text$1("status").$type().notNull(),
16516
16571
  trigger: text$1("trigger").$type().notNull(),
16517
16572
  triggeredAt: timestamp("triggered_at", { withTimezone: true }).notNull(),
@@ -16530,6 +16585,8 @@ const workflowRunsSqlite = sqliteTable("workflow_runs", {
16530
16585
  triggerRunId: text("trigger_run_id").references(() => triggerRunsSqlite.id),
16531
16586
  parentWorkflowRunId: text("parent_workflow_run_id"),
16532
16587
  parentSpanId: text("parent_span_id"),
16588
+ sourceKind: text("source_kind").$type().notNull().default("api"),
16589
+ sourceId: text("source_id"),
16533
16590
  status: text("status").$type().notNull(),
16534
16591
  trigger: text("trigger").$type().notNull(),
16535
16592
  triggeredAt: integer("triggered_at", { mode: "timestamp_ms" }).notNull(),
@@ -16937,6 +16994,10 @@ function scopedAnd$1(table, ...conditions) {
16937
16994
  function projectScopeId() {
16938
16995
  return getProjectScopeId();
16939
16996
  }
16997
+ /** Use with left joins on workflowRuns/triggerRuns/agentSessions keyed by trace or ref id. */
16998
+ function traceRootProjectScopeFilter() {
16999
+ return or(eq(workflowRuns.projectId, getProjectScopeId()), eq(triggerRuns.projectId, getProjectScopeId()), eq(agentSessions.projectId, getProjectScopeId()));
17000
+ }
16940
17001
  async function selectActiveAgentByRoute(route) {
16941
17002
  return (await getDb$1().select({
16942
17003
  id: agents.id,
@@ -16946,6 +17007,8 @@ async function selectActiveAgentByRoute(route) {
16946
17007
  async function insertAgentSession(values) {
16947
17008
  await getDb$1().insert(agentSessions).values({
16948
17009
  ...values,
17010
+ sourceKind: values.sourceKind ?? "api",
17011
+ sourceId: values.sourceId ?? null,
16949
17012
  projectId: projectScopeId()
16950
17013
  });
16951
17014
  }
@@ -16983,16 +17046,61 @@ async function selectCredentialInstancesForScope$1(key, scopeType, scopeId) {
16983
17046
  const scopeCondition = scopeId === null ? and(eq(credentialInstances.scopeType, scopeType), isNull(credentialInstances.scopeId)) : and(eq(credentialInstances.scopeType, scopeType), eq(credentialInstances.scopeId, scopeId));
16984
17047
  return db.select().from(credentialInstances).where(credentialScopeAnd(scopeType, eq(credentialInstances.key, key), scopeCondition));
16985
17048
  }
17049
+ async function selectTraceSpanById(id) {
17050
+ const db = getDb$1();
17051
+ const rows = await db.select({ span: traceSpans }).from(traceSpans).leftJoin(workflowRuns, eq(workflowRuns.id, traceSpans.traceId)).leftJoin(triggerRuns, eq(triggerRuns.id, traceSpans.traceId)).leftJoin(agentSessions, eq(agentSessions.id, traceSpans.traceId)).where(and(eq(traceSpans.id, id), traceRootProjectScopeFilter())).limit(1);
17052
+ if (rows[0]) return rows[0].span;
17053
+ return (await db.select({ span: traceSpans }).from(traceSpans).leftJoin(workflowRuns, eq(workflowRuns.id, traceSpans.refId)).leftJoin(triggerRuns, eq(triggerRuns.id, traceSpans.refId)).leftJoin(agentSessions, eq(agentSessions.id, traceSpans.refId)).where(and(eq(traceSpans.id, id), traceRootProjectScopeFilter())).limit(1))[0]?.span;
17054
+ }
17055
+ function runSource(kind, id) {
17056
+ return {
17057
+ kind,
17058
+ id: id ?? null
17059
+ };
17060
+ }
17061
+ function sourceFromSpan(span) {
17062
+ switch (span.kind) {
17063
+ case "workflow_run": return runSource("workflow", span.refId);
17064
+ case "agent_session": return runSource("agent", span.refId);
17065
+ case "trigger_run": return runSource("trigger", span.refId);
17066
+ case "gateway_event": {
17067
+ const metadata = span.metadata;
17068
+ if (metadata && typeof metadata === "object" && "gatewayAttachmentId" in metadata) {
17069
+ const attachmentId = metadata.gatewayAttachmentId;
17070
+ if (typeof attachmentId === "string") return runSource("gateway", attachmentId);
17071
+ }
17072
+ return;
17073
+ }
17074
+ case "action": {
17075
+ const metadata = span.metadata;
17076
+ if (metadata && typeof metadata === "object" && "runId" in metadata) {
17077
+ const runId = metadata.runId;
17078
+ if (typeof runId === "string") return runSource("workflow", runId);
17079
+ }
17080
+ return;
17081
+ }
17082
+ default: return;
17083
+ }
17084
+ }
17085
+ async function resolveRunSourceFromTraceContext() {
17086
+ const parent = getTraceContext();
17087
+ if (!parent?.spanId) return runSource("api");
17088
+ const span = await selectTraceSpanById(parent.spanId);
17089
+ if (!span) return runSource("api");
17090
+ return sourceFromSpan(span) ?? runSource("api");
17091
+ }
16986
17092
  async function getAgentByRoute(route) {
16987
17093
  return selectActiveAgentByRoute(route);
16988
17094
  }
16989
17095
  const MESSAGE_EVENT_TYPE = "message";
16990
- async function createSession(agentId, id) {
17096
+ async function createSession(agentId, id, source = runSource("api")) {
16991
17097
  const now = /* @__PURE__ */ new Date();
16992
17098
  const sessionId = id ?? crypto.randomUUID();
16993
17099
  await insertAgentSession({
16994
17100
  id: sessionId,
16995
17101
  agentId,
17102
+ sourceKind: source.kind,
17103
+ sourceId: source.id,
16996
17104
  createdAt: now,
16997
17105
  updatedAt: now,
16998
17106
  deletedAt: null
@@ -17992,42 +18100,7 @@ async function resolveActionCredentials(requirements, options) {
17992
18100
  });
17993
18101
  return parseResolvedCredentials(requirements, await resolveCredentials(requirements, options.consumer, options.contextOverride));
17994
18102
  }
17995
- const traceContextStorage = new AsyncLocalStorage();
17996
- function getTraceContext() {
17997
- return traceContextStorage.getStore();
17998
- }
17999
- const CONSOLE_LEVELS = [
18000
- "log",
18001
- "debug",
18002
- "info",
18003
- "warn",
18004
- "error"
18005
- ];
18006
- async function captureConsole(fn) {
18007
- const originals = /* @__PURE__ */ new Map();
18008
- for (const level of CONSOLE_LEVELS) {
18009
- originals.set(level, console[level].bind(console));
18010
- console[level] = (...args) => {
18011
- originals.get(level)?.(...args);
18012
- getTraceContext();
18013
- };
18014
- }
18015
- try {
18016
- return await fn();
18017
- } finally {
18018
- for (const level of CONSOLE_LEVELS) {
18019
- const original = originals.get(level);
18020
- if (original) console[level] = original;
18021
- }
18022
- }
18023
- }
18024
- async function logSystem(level, message, data) {
18025
- getTraceContext();
18026
- }
18027
- async function withSpan(input, fn) {
18028
- return await fn();
18029
- }
18030
18103
  //#endregion
18031
- export { JSONRPCMessageSchema as A, createParser as C, createFetchWithInit as D, extractWWWAuthenticateParams as E, normalizeHeaders as O, isMcp as S, auth as T, touchSession as _, buildCredentialRunContext as a, connectMcpStdio as b, isCredentialError as c, MESSAGE_EVENT_TYPE as d, appendEvent as f, listMessageEvents as g, getSession as h, withSpan as i, zodToJsonSchema as k, resolveActionCredentials as l, getAgentByRoute as m, getTraceContext as n, captureCredentialToolErrors as o, createSession as p, logSystem as r, createCredentialResolver as s, captureConsole as t, resolveMcpTools as u, connectMcpDefinition as v, UnauthorizedError as w, defineMcp as x, connectMcpServer as y };
18104
+ export { zodToJsonSchema as A, isMcp as C, extractWWWAuthenticateParams as D, auth as E, createFetchWithInit as O, defineMcp as S, UnauthorizedError as T, logSystem as _, resolveActionCredentials as a, connectMcpServer as b, appendEvent as c, getSession as d, listMessageEvents as f, getTraceContext as g, captureConsole as h, isCredentialError as i, JSONRPCMessageSchema as j, normalizeHeaders as k, createSession as l, touchSession as m, captureCredentialToolErrors as n, resolveMcpTools as o, resolveRunSourceFromTraceContext as p, createCredentialResolver as r, MESSAGE_EVENT_TYPE as s, buildCredentialRunContext as t, getAgentByRoute as u, withSpan as v, createParser as w, connectMcpStdio as x, connectMcpDefinition as y };
18032
18105
 
18033
- //# sourceMappingURL=dist-BML_gJSh.mjs.map
18106
+ //# sourceMappingURL=dist-DzfOPx7X.mjs.map