Files
simstudioai--sim/apps/sim/lib/workspace-events/constants.ts
T
wehub-resource-sync d25d482dc2
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:20:55 +08:00

171 lines
5.6 KiB
TypeScript

/**
* Shared constants for the Sim workspace-event trigger.
*
* This module is imported from both client code (trigger/block definitions)
* and server code (the event emitter), so it must stay free of server-only
* dependencies such as the database client.
*/
/** Provider string recorded on webhook rows and execution logs for Sim trigger runs. */
export const SIM_TRIGGER_PROVIDER = 'sim'
/** Trigger ID in the trigger registry. Must equal the block type for pure trigger blocks. */
export const SIM_WORKSPACE_EVENT_TRIGGER_ID = 'sim_workspace_event'
/** Events that fire 1:1 with their source occurrence (no rule evaluation, no cooldown). */
export const SIM_PLAIN_EVENT_TYPES = [
'execution_success',
'execution_error',
'workflow_deployed',
'workflow_undeployed',
] as const
/** Rule-based events ported from the legacy notification alert rules. */
export const SIM_RULE_EVENT_TYPES = [
'consecutive_failures',
'failure_rate',
'latency_threshold',
'latency_spike',
'cost_threshold',
'error_count',
'no_activity',
] as const
export const SIM_EVENT_TYPES = [...SIM_PLAIN_EVENT_TYPES, ...SIM_RULE_EVENT_TYPES] as const
export type SimPlainEventType = (typeof SIM_PLAIN_EVENT_TYPES)[number]
export type SimRuleEventType = (typeof SIM_RULE_EVENT_TYPES)[number]
export type SimEventType = (typeof SIM_EVENT_TYPES)[number]
/**
* Plain events that ARE a run completing. These carry the run summary fields
* (runId, durationMs, cost, finalOutput) at the top level.
*/
const SIM_PLAIN_RUN_EVENT_TYPES = ['execution_success', 'execution_error'] as const
/**
* Rule events tripped by a run completing. The run is evidence for the
* condition rather than the event itself, so its summary nests under
* `triggeringRun`. no_activity is excluded — it has no triggering run.
*/
const SIM_RUN_BACKED_RULE_EVENT_TYPES = SIM_RULE_EVENT_TYPES.filter(
(eventType) => eventType !== 'no_activity'
)
export function isSimRuleEventType(eventType: string): eventType is SimRuleEventType {
return (SIM_RULE_EVENT_TYPES as readonly string[]).includes(eventType)
}
/** Cooldown between firings of the same rule-based subscription. */
export const SIM_RULE_COOLDOWN_HOURS = 1
/** Minimum executions in the window before rate-based rules can fire. */
export const SIM_MIN_EXECUTIONS_FOR_RATE_RULES = 5
/** Default values for rule configuration subblocks, ported from the legacy alert rules. */
export const SIM_RULE_DEFAULTS = {
consecutiveFailures: 3,
failureRatePercent: 50,
windowHours: 24,
durationThresholdMs: 30000,
latencySpikePercent: 100,
/** 200 credits = $1 (1 credit = $0.005). */
costThresholdCredits: 200,
errorCountThreshold: 10,
inactivityHours: 24,
} as const
/** Maximum serialized size of the finalOutput payload field. */
export const SIM_FINAL_OUTPUT_MAX_BYTES = 64 * 1024
interface SimEventPayloadFieldCondition {
field: 'eventType'
value: SimEventType | SimEventType[]
}
interface SimEventPayloadField {
type: 'string' | 'number' | 'json' | 'boolean'
description: string
/** Restricts which event types surface this field in the tag dropdown. */
condition?: SimEventPayloadFieldCondition
/** Nested fields for json outputs, surfaced as dotted paths in the tag dropdown. */
properties?: Record<string, { type: 'string' | 'number' | 'json'; description: string }>
}
/** Run summary fields shared by top-level plain events and the nested triggeringRun. */
const RUN_SUMMARY_FIELDS = {
runId: {
type: 'string',
description: 'The source run ID',
},
durationMs: {
type: 'number',
description: 'Source run duration in milliseconds',
},
cost: {
type: 'number',
description: 'Source run cost in credits',
},
finalOutput: {
type: 'json',
description: 'Final output of the source run (truncated when large)',
},
} as const
/**
* Canonical payload shape delivered to Sim trigger workflows.
*
* The trigger's declared outputs and the runtime payload builder both derive
* from this map so the tag dropdown and the actual payload can never drift
* (enforced by tests on both sides). Conditions narrow the tag dropdown to
* the fields that are meaningful for the selected event type; the runtime
* payload always carries every key (null where not applicable).
*/
export const SIM_EVENT_PAYLOAD_FIELDS = {
event: {
type: 'string',
description: 'The workspace event type that fired this trigger',
},
timestamp: {
type: 'string',
description: 'Event timestamp in ISO format',
},
workflowId: {
type: 'string',
description: 'The source workflow ID',
},
workflowName: {
type: 'string',
description: 'The source workflow name',
},
runId: {
...RUN_SUMMARY_FIELDS.runId,
condition: { field: 'eventType', value: [...SIM_PLAIN_RUN_EVENT_TYPES] },
},
durationMs: {
...RUN_SUMMARY_FIELDS.durationMs,
condition: { field: 'eventType', value: [...SIM_PLAIN_RUN_EVENT_TYPES] },
},
cost: {
...RUN_SUMMARY_FIELDS.cost,
condition: { field: 'eventType', value: [...SIM_PLAIN_RUN_EVENT_TYPES] },
},
finalOutput: {
...RUN_SUMMARY_FIELDS.finalOutput,
condition: { field: 'eventType', value: [...SIM_PLAIN_RUN_EVENT_TYPES] },
},
triggeringRun: {
type: 'json',
description: 'The run that tripped this condition',
condition: { field: 'eventType', value: [...SIM_RUN_BACKED_RULE_EVENT_TYPES] },
properties: RUN_SUMMARY_FIELDS,
},
version: {
type: 'number',
description: 'The deployment version number that was activated',
condition: { field: 'eventType', value: 'workflow_deployed' },
},
} as const satisfies Record<string, SimEventPayloadField>
export type SimEventPayloadFieldKey = keyof typeof SIM_EVENT_PAYLOAD_FIELDS