@statelyai/sdk 0.34.0 → 0.34.2

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.
package/README.md CHANGED
@@ -223,6 +223,12 @@ Resource operations always require a credential.
223
223
  Stream live actor-system state to the hosted Stately inspector. Zero-config
224
224
  inspection needs no API key or local relay.
225
225
 
226
+ For an app that only needs actor inspection, install
227
+ [`@statelyai/inspector`](../inspector) instead. It provides the same
228
+ `createInspector` API without installing the SDK's source-sync, graph, and Node
229
+ relay dependencies. In the examples below, import from `@statelyai/inspector`
230
+ when using that package.
231
+
226
232
  `selectedSessionId` takes the exact session id: `actor.sessionId` for runtime
227
233
  actors (or your `resolveSessionId` result), and `${producerId}:${id}` for manual
228
234
  actors. For example, with `producerId: 'demo'`, select `inspector.actor('root')`
@@ -236,9 +242,14 @@ const inspector = createInspector();
236
242
  const { inspect } = inspector;
237
243
 
238
244
  const actor = createActor(machine, { inspect });
245
+ // With XState v6, the inspector shows this actor's graph before start().
239
246
  actor.start();
240
247
  ```
241
248
 
249
+ Before `start()`, the XState v6 actor view has no active-state highlight. The
250
+ first runtime transition updates that same actor view. An initial error is
251
+ shown immediately, even if `start()` produces no transition.
252
+
242
253
  The inspector also accepts read-only `documents`, panel configuration, initial
243
254
  `viewMode`, and typed display `settings`. Use `selectActor(sessionId)`,
244
255
  `setTheme(theme)`, `setViewMode(mode)`, and `setSettings(settings)` to control the
@@ -278,6 +289,12 @@ original IDs. Hover an actor label in the viewer to see its runtime ID.
278
289
  Actors without a machine state value show their snapshot status (Active, Done,
279
290
  Error, or Stopped); “Awaiting snapshot” means no snapshot has arrived.
280
291
 
292
+ <!-- default snapshot serialization from packages/sdk/src/inspect.ts -->
293
+
294
+ The default snapshot serializer includes state value, status, and active tags
295
+ when the runtime supplies them. Custom serializers should preserve `tags` as
296
+ a string array to show them in actor details.
297
+
281
298
  For persisted actors, `resolveSessionId` can keep one producer-local identity
282
299
  across sequential restore/resume incarnations. Generate a new id for a new
283
300
  logical invocation, persist it beside the actor snapshot, and reuse it after
@@ -301,7 +318,12 @@ replacement; late observations from a displaced actor are ignored.
301
318
 
302
319
  The resolver's third argument is the parent's resolved id, so recreated child
303
320
  actors can use stable paths instead of accumulating runtime session ids. IDs
304
- must still be unique within one live actor tree.
321
+ must be unique along each parent-child path. Sibling actors may reuse one id
322
+ after its previous owner reaches `done`, `stopped`, or `error`; setting
323
+ `sessionIdReuse: "always"` also permits explicit replacement of an active
324
+ sibling. The displaced actor's later observations are ignored. Inspector
325
+ callback errors emit `on('error', ...)` with code `inspection_failed` and do not
326
+ interrupt the actor system.
305
327
 
306
328
  To present a stopped request-scoped runtime as waiting for its next resume, map
307
329
  its serialized status to a non-terminal value such as `suspended` in
@@ -326,6 +348,9 @@ keep it private. Hosted replay expires after 24
326
348
  hours without activity. Only actor checkpoints and observations are replayed;
327
349
  export traffic is live-only, and auth/upload/embed-control messages are rejected.
328
350
  AI-backed features remain separately authenticated.
351
+ The relay keeps a complete current actor checkpoint while bounding recent
352
+ observation history, so joining after many actor registrations still initializes
353
+ the viewer.
329
354
 
330
355
  After successful registration, hosted Sky records coarse connection analytics:
331
356
  role, normalized browser origin or `unknown`, localhost status, runtime,
@@ -393,10 +418,14 @@ regeneration when the source cannot be reconciled safely.
393
418
  <!-- graph conversion and codegen exports from src/graph.ts and src/index.ts -->
394
419
 
395
420
  Convert between Studio graph data, XState machine configs, and TypeScript
396
- source with `graphToXStateTS`. Use `graphToXStateFSM` for a flat `createFSM`
397
- projection and `getXStateFSMCompatibilityIssues` before exporting to report
398
- semantics that the compact FSM cannot represent. Generate types from JSON
399
- Schema.
421
+ source with `graphToXStateTS`. `graphToXStateTSResult` also reports code leaves
422
+ that a profile replaced to keep an export syntactically valid;
423
+ `getProfileCodeIssues` inspects them without exporting, and
424
+ `recoverInvalidProfileCode` applies the profile's exact fallback functions to a
425
+ copy. Source-location documents retain authored code instead of applying these
426
+ export-only stubs. Use `graphToXStateFSM` for a flat `createFSM` projection and
427
+ `getXStateFSMCompatibilityIssues` before exporting to report semantics that the
428
+ compact FSM cannot represent. Generate types from JSON Schema.
400
429
 
401
430
  ## Support
402
431
 
@@ -1,4 +1,4 @@
1
- import { Gt as UploadResult } from "./protocol-AeHm956D.mjs";
1
+ import { Gt as UploadResult } from "./protocol-CCf9j_SZ.mjs";
2
2
 
3
3
  //#region src/assetStorage.d.ts
4
4
  interface AssetUploadContext {
@@ -3832,12 +3832,18 @@ function actionCodeExpression(expr, source) {
3832
3832
  }]
3833
3833
  };
3834
3834
  }
3835
- function inlineCodeExpression$1(expr) {
3836
- return {
3835
+ function inlineCodeExpression$1(expr, sourceValue) {
3836
+ const result = {
3837
3837
  "@type": "code",
3838
3838
  lang: "ts",
3839
3839
  expr: stripExportDefault(expr)
3840
3840
  };
3841
+ const sourceId = sourceValue?.__stately_source_id__;
3842
+ if (sourceId !== void 0) Object.defineProperty(result, "__stately_source_id__", {
3843
+ value: sourceId,
3844
+ enumerable: true
3845
+ });
3846
+ return result;
3841
3847
  }
3842
3848
  /**
3843
3849
  * Serialize an edge guard for a machine config. Codegen emits inline guards as
@@ -3850,7 +3856,7 @@ function serializeGuard(guard, asTypeRef) {
3850
3856
  type: guard.type,
3851
3857
  params: guard.params
3852
3858
  } : { type: guard.type };
3853
- return guard.code ? inlineCodeExpression$1(guard.code) : guard;
3859
+ return guard.code ? inlineCodeExpression$1(guard.code, guard) : guard;
3854
3860
  }
3855
3861
  /**
3856
3862
  * Converts a built-in xstate ActionItem to a code expression directive,
@@ -3862,13 +3868,13 @@ function serializeActionItem(action, keepChooseStructured = false) {
3862
3868
  type,
3863
3869
  params
3864
3870
  };
3865
- if (type === "xstate.enqueue" && typeof params?.code === "string") return inlineCodeExpression$1(params.code);
3871
+ if (type === "xstate.enqueue" && typeof params?.code === "string") return inlineCodeExpression$1(params.code, action);
3866
3872
  const exprCode = type === "xstate.expr" && typeof params?.code === "string" ? params.code : void 0;
3867
3873
  if (isBuiltInActionType(type)) {
3868
3874
  const builtInAction = XSTATE_BUILT_IN_ACTIONS[type];
3869
3875
  return actionCodeExpression(emitBuiltInAction(type, params), builtInAction);
3870
3876
  }
3871
- if (exprCode) return inlineCodeExpression$1(exprCode);
3877
+ if (exprCode) return inlineCodeExpression$1(exprCode, action);
3872
3878
  if (!params || Object.keys(params).length === 0) return { type };
3873
3879
  return {
3874
3880
  type,
@@ -4310,6 +4316,135 @@ const XSTATE_AUTHORING = {
4310
4316
  supportsTargetlessEdges: true,
4311
4317
  supportsReenterEdges: true
4312
4318
  };
4319
+ function hasNoParseErrors(source) {
4320
+ return (ts.createSourceFile("profile-code.ts", source, ts.ScriptTarget.Latest, false, ts.ScriptKind.TS).parseDiagnostics?.length ?? 0) === 0;
4321
+ }
4322
+ function isExpression(code) {
4323
+ return code.trim().length > 0 && hasNoParseErrors(`(${code})`);
4324
+ }
4325
+ function isImplementation(code) {
4326
+ return isExpression(stripExportDefault(code)) || hasNoParseErrors(`function implementation() {\n${code}\n}`);
4327
+ }
4328
+ function isAsyncImplementation(code) {
4329
+ return isExpression(stripExportDefault(code)) || hasNoParseErrors(`async function implementation() {\n${code}\n}`);
4330
+ }
4331
+ function pathEndsWith(location, suffix) {
4332
+ return suffix.every((segment, index) => location.path[location.path.length - suffix.length + index] === segment);
4333
+ }
4334
+ function commented(code) {
4335
+ return code.replace(/\r\n?|\u2028|\u2029/g, "\n").split("\n").map((line) => `// ${line}`).join("\n");
4336
+ }
4337
+ function indent(code, spaces) {
4338
+ const prefix = " ".repeat(spaces);
4339
+ return code.split("\n").map((line) => `${prefix}${line}`).join("\n");
4340
+ }
4341
+ function indentAfterFirstLine(code, spaces) {
4342
+ const [first = "", ...rest] = code.split("\n");
4343
+ if (rest.length === 0) return first;
4344
+ return `${first}\n${indent(rest.join("\n"), spaces)}`;
4345
+ }
4346
+ const throwingBody = (invalidCode) => `// FIXME(stately): authored code does not compile\n${commented(invalidCode)}\nthrow new Error('Invalid authored code');`;
4347
+ const falseBody = (invalidCode) => `// FIXME(stately): authored code does not compile\n${commented(invalidCode)}\nreturn false;`;
4348
+ const throwingExpression = (invalidCode) => `(() => {\n${indent(throwingBody(invalidCode), 2)}\n})()`;
4349
+ const functionThrowingExpression = (invalidCode) => `() => {\n${indent(throwingBody(invalidCode), 2)}\n}`;
4350
+ const functionFalseExpression = (invalidCode) => `() => {\n${indent(falseBody(invalidCode), 2)}\n}`;
4351
+ const throwingImplementationBody = (invalidCode) => indentAfterFirstLine(throwingBody(invalidCode), 2);
4352
+ const falseImplementationBody = (invalidCode) => indentAfterFirstLine(falseBody(invalidCode), 2);
4353
+ function implementationTarget(location, collection) {
4354
+ const index = location.path[3];
4355
+ const implementations = location.graph.data.implementations?.[collection];
4356
+ const implementation = typeof index === "number" ? implementations?.[index] : void 0;
4357
+ if (!implementation?.id) return void 0;
4358
+ return {
4359
+ kind: "source",
4360
+ sourceType: collection === "actors" ? "actor" : collection.slice(0, -1),
4361
+ id: implementation.id,
4362
+ label: implementation.name || implementation.id
4363
+ };
4364
+ }
4365
+ function entityTarget(location) {
4366
+ const [collection, index] = location.path;
4367
+ const isNode = collection === "nodes" && typeof index === "number";
4368
+ const isEdge = collection === "edges" && typeof index === "number";
4369
+ const owner = isNode ? location.graph.nodes[index] : isEdge ? location.graph.edges[index] : void 0;
4370
+ if (!owner) return void 0;
4371
+ const dataOffset = location.path.indexOf("data");
4372
+ const field = location.path[dataOffset + 1];
4373
+ const itemIndex = location.path[dataOffset + 2];
4374
+ if ((field === "entry" || field === "exit" || field === "actions") && typeof itemIndex === "number") {
4375
+ const action = owner.data[field]?.[itemIndex];
4376
+ if (action?.id) return {
4377
+ kind: "entity",
4378
+ id: `action:${action.id}`,
4379
+ label: action.type ? `Action: ${action.type}` : "Action"
4380
+ };
4381
+ }
4382
+ if (field === "invokes" && typeof itemIndex === "number") {
4383
+ const invoke = owner.data.invokes?.[itemIndex];
4384
+ if (invoke?.id) return {
4385
+ kind: "entity",
4386
+ id: `invoke:${invoke.id}`,
4387
+ label: invoke.src ? `Invoke: ${invoke.src}` : "Invoke"
4388
+ };
4389
+ }
4390
+ if (isEdge && field === "guard") return {
4391
+ kind: "entity",
4392
+ id: `guard:${owner.id}`,
4393
+ label: "Guard"
4394
+ };
4395
+ if (isEdge && field === "context") return {
4396
+ kind: "entity",
4397
+ id: `context:${owner.id}`,
4398
+ label: "Context"
4399
+ };
4400
+ if (field === "meta") return {
4401
+ kind: "entity",
4402
+ id: `meta:${owner.id}`,
4403
+ label: "Meta"
4404
+ };
4405
+ }
4406
+ const implementationBlock = (name, collection, exportInvalid, isValid = isImplementation) => ({
4407
+ name,
4408
+ matches: ({ path }) => path.length === 6 && path[0] === "data" && path[1] === "implementations" && path[2] === collection && typeof path[3] === "number" && path[4] === "code" && path[5] === "body",
4409
+ isValid,
4410
+ exportInvalid,
4411
+ getTarget: (location) => implementationTarget(location, collection)
4412
+ });
4413
+ const XSTATE_CODE_BLOCKS = [
4414
+ implementationBlock("action implementation", "actions", throwingImplementationBody),
4415
+ implementationBlock("guard implementation", "guards", falseImplementationBody),
4416
+ implementationBlock("actor implementation", "actors", throwingImplementationBody, isAsyncImplementation),
4417
+ implementationBlock("delay implementation", "delays", throwingImplementationBody),
4418
+ {
4419
+ name: "inline guard",
4420
+ matches: (location) => pathEndsWith(location, ["guard", "code"]),
4421
+ isValid: isExpression,
4422
+ exportInvalid: functionFalseExpression,
4423
+ getTarget: entityTarget
4424
+ },
4425
+ {
4426
+ name: "inline action",
4427
+ matches: (location) => {
4428
+ if (!pathEndsWith(location, ["params", "code"])) return false;
4429
+ const owner = location.ancestors.at(-2);
4430
+ return !!owner && typeof owner === "object" && owner.type === "xstate.expr";
4431
+ },
4432
+ isValid: isExpression,
4433
+ exportInvalid: functionThrowingExpression,
4434
+ getTarget: entityTarget,
4435
+ getSourceValue: (location) => {
4436
+ const owner = location.ancestors.at(-2);
4437
+ return owner && typeof owner === "object" ? owner : void 0;
4438
+ }
4439
+ },
4440
+ {
4441
+ name: "code expression",
4442
+ matches: (location) => pathEndsWith(location, ["expr"]) && !!location.parent && typeof location.parent === "object" && location.parent["@type"] === "code",
4443
+ isValid: isExpression,
4444
+ exportInvalid: throwingExpression,
4445
+ getTarget: entityTarget
4446
+ }
4447
+ ];
4313
4448
  const XSTATE_PROFILE_MANIFESTS = [{
4314
4449
  profile: XSTATE_V5_PROFILE,
4315
4450
  namespace: "@statelyai.xstate",
@@ -4318,6 +4453,7 @@ const XSTATE_PROFILE_MANIFESTS = [{
4318
4453
  name: "XState v5",
4319
4454
  formats: [...XSTATE_FORMATS],
4320
4455
  authoring: XSTATE_AUTHORING,
4456
+ code: { blocks: XSTATE_CODE_BLOCKS },
4321
4457
  operations: {
4322
4458
  simulate: true,
4323
4459
  validate: true,
@@ -4331,6 +4467,7 @@ const XSTATE_PROFILE_MANIFESTS = [{
4331
4467
  name: "XState v6 alpha",
4332
4468
  formats: [...XSTATE_FORMATS],
4333
4469
  authoring: XSTATE_AUTHORING,
4470
+ code: { blocks: XSTATE_CODE_BLOCKS },
4334
4471
  operations: {
4335
4472
  simulate: true,
4336
4473
  validate: true,
@@ -5924,6 +6061,78 @@ function extractXStateMachineConfigEntries(source, options = {}) {
5924
6061
  visit(file);
5925
6062
  return found;
5926
6063
  }
6064
+ function getProfileCodeIssues(graph, profile) {
6065
+ return visitProfileCode(graph, profile).issues;
6066
+ }
6067
+ function recoverInvalidProfileCode(graph, profile) {
6068
+ const result = visitProfileCode(graph, profile, true);
6069
+ return {
6070
+ graph: result.value,
6071
+ issues: result.issues
6072
+ };
6073
+ }
6074
+ function visitProfileCode(graph, profile, recover = false) {
6075
+ const blocks = profile?.code?.blocks ?? [];
6076
+ const issues = [];
6077
+ const occurrences = [];
6078
+ const visit = (value, path, ancestors) => {
6079
+ const parent = ancestors.at(-1);
6080
+ if (typeof value === "string") {
6081
+ const location = {
6082
+ graph,
6083
+ path,
6084
+ parent,
6085
+ ancestors
6086
+ };
6087
+ const block = blocks.find((candidate) => candidate.matches(location));
6088
+ if (!block) return value;
6089
+ const issue = toIssue(graph, block, location, value);
6090
+ const valid = block.isValid(value);
6091
+ occurrences.push({
6092
+ ...issue,
6093
+ sourceValue: block.getSourceValue?.(location) ?? (parent && typeof parent === "object" ? parent : void 0),
6094
+ valid
6095
+ });
6096
+ if (valid) return value;
6097
+ issues.push(issue);
6098
+ return recover ? block.exportInvalid(value) : value;
6099
+ }
6100
+ if (!value || typeof value !== "object") return value;
6101
+ if (!recover) {
6102
+ for (const key of Reflect.ownKeys(value)) {
6103
+ if (typeof key === "symbol") continue;
6104
+ visit(value[key], [...path, Array.isArray(value) ? Number(key) : String(key)], [...ancestors, value]);
6105
+ }
6106
+ return value;
6107
+ }
6108
+ const clone = Array.isArray(value) ? [] : {};
6109
+ for (const key of Reflect.ownKeys(value)) {
6110
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
6111
+ if (!descriptor) continue;
6112
+ if ("value" in descriptor && typeof key !== "symbol") descriptor.value = visit(descriptor.value, [...path, Array.isArray(value) ? Number(key) : String(key)], [...ancestors, value]);
6113
+ Object.defineProperty(clone, key, descriptor);
6114
+ }
6115
+ return clone;
6116
+ };
6117
+ return {
6118
+ value: visit(graph, [], []),
6119
+ issues,
6120
+ occurrences
6121
+ };
6122
+ }
6123
+ function toIssue(graph, block, location, invalidCode) {
6124
+ const { path } = location;
6125
+ const nodeIndex = path[0] === "nodes" ? path[1] : void 0;
6126
+ const edgeIndex = path[0] === "edges" ? path[1] : void 0;
6127
+ return {
6128
+ block: block.name,
6129
+ path,
6130
+ invalidCode,
6131
+ nodeIds: typeof nodeIndex === "number" && graph.nodes[nodeIndex] ? [graph.nodes[nodeIndex].id] : [],
6132
+ edgeIds: typeof edgeIndex === "number" && graph.edges[edgeIndex] ? [graph.edges[edgeIndex].id] : [],
6133
+ target: block.getTarget?.(location)
6134
+ };
6135
+ }
5927
6136
  function jsonSchemaToTSType(schema) {
5928
6137
  if (!schema) return "unknown";
5929
6138
  if (schema.enum) return schema.enum.map((v) => typeof v === "string" ? `'${v}'` : String(v)).join(" | ");
@@ -6127,8 +6336,19 @@ function isRequiredProperty(key, definition, required) {
6127
6336
  return typeof definition === "object" && definition !== null && definition.required === true;
6128
6337
  }
6129
6338
  function graphToXStateTS(graph, options = {}) {
6130
- const inferredXStateVersion = isXStateV6ProfileRef(graph.data.profile ?? "xstate-v5") ? 6 : 5;
6131
- const { exportStyle = "named", targetLanguage = "typescript", xstateVersion = inferredXStateVersion, xstateV6SchemaFormat = "types", ...configOptions } = options;
6339
+ return graphToXStateTSResult(graph, options).source;
6340
+ }
6341
+ function graphToXStateTSResult(inputGraph, options = {}) {
6342
+ const inferredXStateVersion = isXStateV6ProfileRef(inputGraph.data.profile ?? "xstate-v5") ? 6 : 5;
6343
+ const { exportStyle = "named", targetLanguage = "typescript", xstateVersion = inferredXStateVersion, xstateV6SchemaFormat = "types", profile: profileOverride, recoverInvalidCode = true, ...configOptions } = options;
6344
+ const graphProfile = getProfileManifest(normalizeProfileRef(inputGraph.data.profile ?? "xstate-v5"));
6345
+ const profile = profileOverride ?? graphProfile ?? getProfileManifest(xstateVersion === 6 ? XSTATE_V6_PROFILE : XSTATE_V5_PROFILE);
6346
+ const profileGraph = inputGraph;
6347
+ const recovered = recoverInvalidCode ? recoverInvalidProfileCode(profileGraph, profile) : {
6348
+ graph: profileGraph,
6349
+ issues: getProfileCodeIssues(profileGraph, profile)
6350
+ };
6351
+ const graph = recovered.graph;
6132
6352
  const schemas = graph.data.schemas;
6133
6353
  const impls = filterInlineImplementations$1(graph.data.implementations);
6134
6354
  const supportsTypeSyntax = targetLanguage === "typescript";
@@ -6188,7 +6408,14 @@ function graphToXStateTS(graph, options = {}) {
6188
6408
  lines.push("");
6189
6409
  lines.push("export default machine;");
6190
6410
  }
6191
- return lines.join("\n") + "\n";
6411
+ return {
6412
+ source: lines.join("\n") + "\n",
6413
+ diagnostics: recovered.issues
6414
+ };
6415
+ }
6416
+ function markDiagnosticSource(value, code) {
6417
+ const id = value && typeof value === "object" ? value[SERIALIZED_SOURCE_ID] : void 0;
6418
+ return id === void 0 ? code : `/*__stately_diagnostic_${id}_start__*/${code}/*__stately_diagnostic_${id}_end__*/`;
6192
6419
  }
6193
6420
  function stripStateSchemas(config) {
6194
6421
  delete config.schemas;
@@ -6375,13 +6602,13 @@ function guardCondition(value) {
6375
6602
  if (arrow < 0) return null;
6376
6603
  const params = expression.slice(0, arrow).trim();
6377
6604
  const body = expression.slice(arrow + 2).trim();
6378
- const callCondition = `(${expression})({ context, event, input, output, actions, guards, children, self, system })`;
6605
+ const callCondition = `(${markDiagnosticSource(value, expression)})({ context, event, input, output, actions, guards, children, self, system })`;
6379
6606
  if (body.startsWith("{")) return {
6380
6607
  condition: callCondition,
6381
6608
  callCondition
6382
6609
  };
6383
6610
  return {
6384
- condition: body,
6611
+ condition: markDiagnosticSource(value, body),
6385
6612
  callCondition,
6386
6613
  firstParam: params.startsWith("(") && params.endsWith(")") ? params.slice(1, -1).trim() : params
6387
6614
  };
@@ -6555,7 +6782,7 @@ function buildV6TransitionFunction(transitions) {
6555
6782
  function toV6ActionField(actions) {
6556
6783
  if (actions.length === 1) {
6557
6784
  const expr = inlineExpr(actions[0]);
6558
- if (expr && isCompleteFunctionExpression(stripExportDefault(expr))) return raw(stripExportDefault(expr));
6785
+ if (expr && isCompleteFunctionExpression(stripExportDefault(expr))) return raw(stripExportDefault(expr), actions[0] && typeof actions[0] === "object" ? actions[0] : void 0);
6559
6786
  }
6560
6787
  return buildV6ActionFunction(actions) ?? actions;
6561
6788
  }
@@ -6654,14 +6881,14 @@ function actionToV6Effect(action) {
6654
6881
  const expr = inlineExpr(action);
6655
6882
  if (expr) {
6656
6883
  const assignment = getV6AssignmentContextValue(expr);
6657
- if (assignment) return { contextValue: assignment };
6658
- if (expr.startsWith("enq(") || expr.startsWith("enq.")) return { statements: [expr] };
6884
+ if (assignment) return { contextValue: markDiagnosticSource(action, assignment) };
6885
+ if (expr.startsWith("enq(") || expr.startsWith("enq.")) return { statements: [markDiagnosticSource(action, expr)] };
6659
6886
  const builtIn = expr.match(/^(raise|emit|sendTo|cancel|log|spawnChild|stopChild)\(([\s\S]*)\)$/);
6660
6887
  if (builtIn) {
6661
6888
  const [, name, args] = builtIn;
6662
- return { statements: [`enq.${name === "spawnChild" ? "spawn" : name === "stopChild" ? "stop" : name}(${args})`] };
6889
+ return { statements: [markDiagnosticSource(action, `enq.${name === "spawnChild" ? "spawn" : name === "stopChild" ? "stop" : name}(${args})`)] };
6663
6890
  }
6664
- return { statements: [`enq(${expr})`] };
6891
+ return { statements: [markDiagnosticSource(action, `enq(${expr})`)] };
6665
6892
  }
6666
6893
  if (!action || typeof action !== "object" || Array.isArray(action)) return null;
6667
6894
  const record = action;
@@ -6922,7 +7149,7 @@ function buildTypesBlock(schemas, options) {
6922
7149
  const contextType = contextSchemaToTSType(schemas.context);
6923
7150
  if (contextType) types.context = raw(`{} as ${contextType}`);
6924
7151
  const eventsType = eventsSchemaToTSType(schemas.events);
6925
- if (eventsType) types.events = raw(`{} as\n | ${eventsType}`);
7152
+ if (eventsType) types.events = raw(`{} as\n | ${eventsType}`);
6926
7153
  if (schemas.input) types.input = raw(`{} as ${jsonSchemaToTSType(schemas.input)}`);
6927
7154
  if (schemas.output) types.output = raw(`{} as ${jsonSchemaToTSType(schemas.output)}`);
6928
7155
  return Object.keys(types).length > 0 ? types : void 0;
@@ -1,6 +1,6 @@
1
1
  import { c as object, f as unknown, i as custom, l as record, n as array, o as literal, r as boolean, s as number, t as _enum, u as string } from "./openapi-BTDjYWXd.mjs";
2
2
  import { t as EDITOR_PROTOCOL_VERSION } from "./editorHostProtocol-B2_t3Le7.mjs";
3
- import { p as graphChangeToPatchesResult } from "./dist-NJFkDQjK.mjs";
3
+ import { p as graphChangeToPatchesResult } from "./dist-DsOTTfYv.mjs";
4
4
  import * as ts$1 from "typescript";
5
5
 
6
6
  //#region ../api-contract/dist/editor-sync.mjs
@@ -1,4 +1,4 @@
1
- import { Q as ProjectEmbedMachine, an as EmbedPanelConfig, lt as ProjectWorkspaceConfig } from "./protocol-AeHm956D.mjs";
1
+ import { Q as ProjectEmbedMachine, an as EmbedPanelConfig, lt as ProjectWorkspaceConfig } from "./protocol-CCf9j_SZ.mjs";
2
2
  import { a as EditorSyncParseRequest, d as EditorSyncTextReplacement, f as MachineSourceLocations, i as EditorSyncApplyResponse, n as EditorSyncAccess, o as EditorSyncParseResponse, r as EditorSyncApplyRequest, s as EditorSyncSourceDocument, t as EditorCapabilities } from "./editor-sync-types-D7YYz6fb.mjs";
3
3
 
4
4
  //#region src/editorHostProtocol.d.ts
@@ -1,2 +1,2 @@
1
- import { _ as EditorHostOutboundMessage, a as EditorHostWorkspaceSessionOptions, c as EditorSyncError, d as fetchEditorSyncAccess, f as EDITOR_PROTOCOL_VERSION, g as EditorHostInitOptions, h as EditorHostInboundMessage, i as EditorHostWorkspaceSession, l as RemoteEditorSyncBackendOptions, m as EditorHostExportFormat, n as EditorHostSessionOptions, o as EditorSourceHost, p as EditorHostDiagnostic, r as EditorHostWorkspaceMachine, s as EditorSyncBackend, t as EditorHostSession, u as createRemoteEditorSyncBackend, v as EditorHostValidationIssue } from "./editorHostSession-DwD_9cER.mjs";
1
+ import { _ as EditorHostOutboundMessage, a as EditorHostWorkspaceSessionOptions, c as EditorSyncError, d as fetchEditorSyncAccess, f as EDITOR_PROTOCOL_VERSION, g as EditorHostInitOptions, h as EditorHostInboundMessage, i as EditorHostWorkspaceSession, l as RemoteEditorSyncBackendOptions, m as EditorHostExportFormat, n as EditorHostSessionOptions, o as EditorSourceHost, p as EditorHostDiagnostic, r as EditorHostWorkspaceMachine, s as EditorSyncBackend, t as EditorHostSession, u as createRemoteEditorSyncBackend, v as EditorHostValidationIssue } from "./editorHostSession-yGUKdLjq.mjs";
2
2
  export { EDITOR_PROTOCOL_VERSION, EditorHostDiagnostic, EditorHostExportFormat, EditorHostInboundMessage, EditorHostInitOptions, EditorHostOutboundMessage, EditorHostSession, EditorHostSessionOptions, EditorHostValidationIssue, EditorHostWorkspaceMachine, EditorHostWorkspaceSession, EditorHostWorkspaceSessionOptions, EditorSourceHost, EditorSyncBackend, EditorSyncError, RemoteEditorSyncBackendOptions, createRemoteEditorSyncBackend, fetchEditorSyncAccess };
@@ -1,6 +1,6 @@
1
1
  import "./openapi-BTDjYWXd.mjs";
2
2
  import { t as EDITOR_PROTOCOL_VERSION } from "./editorHostProtocol-B2_t3Le7.mjs";
3
- import { a as fetchEditorSyncAccess, i as createRemoteEditorSyncBackend, n as EditorHostWorkspaceSession, r as EditorSyncError, t as EditorHostSession } from "./editorHostSession-Bj5YcijC.mjs";
4
- import "./dist-NJFkDQjK.mjs";
3
+ import { a as fetchEditorSyncAccess, i as createRemoteEditorSyncBackend, n as EditorHostWorkspaceSession, r as EditorSyncError, t as EditorHostSession } from "./editorHostSession-DCTHhBqC.mjs";
4
+ import "./dist-DsOTTfYv.mjs";
5
5
 
6
6
  export { EDITOR_PROTOCOL_VERSION, EditorHostSession, EditorHostWorkspaceSession, EditorSyncError, createRemoteEditorSyncBackend, fetchEditorSyncAccess };
package/dist/embed.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import { i as ProfileManifest } from "./index-DZivqh0u.mjs";
2
- import { i as StatelyGraph } from "./graph-Ciocekxl.mjs";
3
- import { D as ExportCallOptions, F as InitOptions, G as MachineInitOptions, Gt as UploadResult, J as MachineVersionAutoSaveOptions, O as ExportFormat, Q as ProjectEmbedMachine, S as EmbedExtensionsManifest, Yt as ViewerOptions, _ as EmbedDocumentLanguage, an as EmbedPanelConfig, at as ProjectWorkspaceAction, b as EmbedEventName, ct as ProjectWorkspaceCapabilities, d as CommentsConfig, dt as ProjectWorkspaceMachineOrigin, et as ProjectInitOptions, g as EmbedDocument, k as ExportFormatMap, lt as ProjectWorkspaceConfig, m as EditorCapabilities, on as EmbedPanelPosition, ot as ProjectWorkspaceActionIcon, pt as ProjectWorkspaceProject, q as MachineSourceLocations, r as CapabilityDeniedEvent, ut as ProjectWorkspaceMachine, v as EmbedEventHandler, w as EmbedMode, y as EmbedEventMap } from "./protocol-AeHm956D.mjs";
1
+ import { i as ProfileManifest } from "./index-A5CMACoO.mjs";
2
+ import { i as StatelyGraph } from "./graph-DVfx7FwN.mjs";
3
+ import { D as ExportCallOptions, F as InitOptions, G as MachineInitOptions, Gt as UploadResult, J as MachineVersionAutoSaveOptions, O as ExportFormat, Q as ProjectEmbedMachine, S as EmbedExtensionsManifest, Yt as ViewerOptions, _ as EmbedDocumentLanguage, an as EmbedPanelConfig, at as ProjectWorkspaceAction, b as EmbedEventName, ct as ProjectWorkspaceCapabilities, d as CommentsConfig, dt as ProjectWorkspaceMachineOrigin, et as ProjectInitOptions, g as EmbedDocument, k as ExportFormatMap, lt as ProjectWorkspaceConfig, m as EditorCapabilities, on as EmbedPanelPosition, ot as ProjectWorkspaceActionIcon, pt as ProjectWorkspaceProject, q as MachineSourceLocations, r as CapabilityDeniedEvent, ut as ProjectWorkspaceMachine, v as EmbedEventHandler, w as EmbedMode, y as EmbedEventMap } from "./protocol-CCf9j_SZ.mjs";
4
4
  import { AssetUploadAdapter } from "./assetStorage.mjs";
5
5
 
6
6
  //#region src/embed.d.ts
package/dist/embed.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import "./protocol-BsBGRISR.mjs";
2
- import { c as createPendingExportManager, l as settingsWithViewMode, r as createPostMessageTransport, s as createEventRegistry, t as SDK_VERSION, u as toInitMessage } from "./version-DxDSBJta.mjs";
2
+ import { c as createPendingExportManager, l as settingsWithViewMode, r as createPostMessageTransport, s as createEventRegistry, t as SDK_VERSION, u as toInitMessage } from "./version-CUFh-PYe.mjs";
3
3
  import { t as EDITOR_PROTOCOL_VERSION } from "./editorHostProtocol-B2_t3Le7.mjs";
4
4
 
5
5
  //#region src/embed.ts
@@ -1,4 +1,4 @@
1
- import { t as CodeExpression } from "./index-DZivqh0u.mjs";
1
+ import { t as CodeExpression } from "./index-A5CMACoO.mjs";
2
2
  import * as _statelyai_graph0 from "@statelyai/graph";
3
3
  import { Graph } from "@statelyai/graph";
4
4
 
package/dist/graph.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { _ as studioMachineConverter, a as StatelyGraphData, c as StatelyInvoke, d as StudioAction, f as StudioEdge, g as fromStudioMachine, h as StudioNode, i as StatelyGraph, l as StatelyNodeData, m as StudioMachine, n as StatelyActorImplementation, o as StatelyGuard, p as StudioEventTypeData, r as StatelyEdgeData, s as StatelyImplementation, t as StatelyAction, u as StatelyTagImplementation, v as toStudioMachine } from "./graph-Ciocekxl.mjs";
1
+ import { _ as studioMachineConverter, a as StatelyGraphData, c as StatelyInvoke, d as StudioAction, f as StudioEdge, g as fromStudioMachine, h as StudioNode, i as StatelyGraph, l as StatelyNodeData, m as StudioMachine, n as StatelyActorImplementation, o as StatelyGuard, p as StudioEventTypeData, r as StatelyEdgeData, s as StatelyImplementation, t as StatelyAction, u as StatelyTagImplementation, v as toStudioMachine } from "./graph-DVfx7FwN.mjs";
2
2
  export { StatelyAction, StatelyActorImplementation, StatelyEdgeData, StatelyGraph, StatelyGraphData, StatelyGuard, StatelyImplementation, StatelyInvoke, StatelyNodeData, StatelyTagImplementation, StudioAction, StudioEdge, StudioEventTypeData, StudioMachine, StudioNode, fromStudioMachine, studioMachineConverter, toStudioMachine };
@@ -3000,6 +3000,30 @@ type ProfileMigration = {
3000
3000
  migrate: (data: Readonly<ProfileDataSet>, context: ProfileProjectionContext) => ProfileProjectionResult;
3001
3001
  };
3002
3002
  type FormatId = string;
3003
+ type ProfileCodeLocation = {
3004
+ graph: Readonly<ProfileGraph>;
3005
+ path: readonly (string | number)[];
3006
+ parent: unknown;
3007
+ ancestors: readonly unknown[];
3008
+ };
3009
+ type ProfileCodeTarget = {
3010
+ kind: 'entity';
3011
+ id: string;
3012
+ label: string;
3013
+ } | {
3014
+ kind: 'source';
3015
+ id: string;
3016
+ label: string;
3017
+ sourceType: string;
3018
+ };
3019
+ type ProfileCodeBlock = {
3020
+ name: string;
3021
+ matches: (location: ProfileCodeLocation) => boolean;
3022
+ isValid: (code: string) => boolean;
3023
+ exportInvalid: (invalidCode: string) => string; /** Editor destination used to surface and navigate code diagnostics. */
3024
+ getTarget?: (location: ProfileCodeLocation) => ProfileCodeTarget | undefined; /** Object used by source generation to locate this block in a full document. */
3025
+ getSourceValue?: (location: ProfileCodeLocation) => object | undefined;
3026
+ };
3003
3027
  type ProfileFormatManifest = {
3004
3028
  format: FormatId;
3005
3029
  import?: boolean;
@@ -3053,7 +3077,10 @@ type ProfileManifest = {
3053
3077
  graph?: {
3054
3078
  dataSchema?: JSONSchema7;
3055
3079
  }; /** Profile-owned editor vocabulary. The canvas itself only assumes a graph. */
3056
- authoring?: ProfileAuthoringManifest;
3080
+ authoring?: ProfileAuthoringManifest; /** Profile-owned authored code locations and syntax-safe export fallbacks. */
3081
+ code?: {
3082
+ blocks: readonly ProfileCodeBlock[];
3083
+ };
3057
3084
  operations?: Partial<Record<'simulate' | 'validate' | 'export', boolean>>;
3058
3085
  restrictFormatsToListed?: boolean;
3059
3086
  features?: Record<string, boolean | Record<string, unknown>>;
@@ -3072,6 +3099,10 @@ interface XStateTSOptions extends MachineConfigOptions {
3072
3099
  targetLanguage?: 'typescript' | 'javascript';
3073
3100
  xstateVersion?: 5 | 6;
3074
3101
  xstateV6SchemaFormat?: 'types' | 'zod';
3102
+ /** Overrides the selected XState profile's code validation/export policy. */
3103
+ profile?: ProfileManifest;
3104
+ /** Keep authored invalid code for virtual source documents with edit slices. */
3105
+ recoverInvalidCode?: boolean;
3075
3106
  }
3076
3107
  declare function graphToXStateTS(graph: CodeGenGraph, options?: XStateTSOptions): string;
3077
3108
  //#endregion
package/dist/index.d.mts CHANGED
@@ -1,13 +1,13 @@
1
1
  import { StatelyApiClientOptions, StatelyApiError, StatelyApiUrlOptions, createStatelyApiClient, createStatelyApiUrl } from "./api.mjs";
2
- import { S as GraphPatch, _ as raw, a as RawCode, c as XStateV4TSOptions, d as getXStateFSMCompatibilityIssues, f as graphToMachineConfig, g as jsonSchemaToTSType, h as graphToXStateV4TS, l as contextSchemaToTSType, m as graphToXStateTS, n as CodeGenGraph, o as XStateFSMOptions, p as graphToXStateFSM, r as MachineConfigOptions, s as XStateTSOptions, u as eventsSchemaToTSType, v as serializeJS, y as ActionLocation } from "./index-DZivqh0u.mjs";
3
- import { C as EventTypeData, S as DigraphNodeConfig, _ as studioMachineConverter, a as StatelyGraphData, b as DigraphConfig, c as StatelyInvoke, d as StudioAction, f as StudioEdge, g as fromStudioMachine, h as StudioNode, i as StatelyGraph, l as StatelyNodeData, m as StudioMachine, o as StatelyGuard, r as StatelyEdgeData, t as StatelyAction, v as toStudioMachine, w as StateNodeJSONData, x as DigraphEdgeConfig, y as DigraphAction } from "./graph-Ciocekxl.mjs";
4
- import { $t as createInspectionRoomUrls, B as InspectionSentEvent, D as ExportCallOptions, F as InitOptions, Gt as UploadResult, H as InspectorLoadedEvent, J as MachineVersionAutoSaveOptions, L as InspectionAction, M as INSPECTION_PROTOCOL_VERSION, N as INSPECTION_ROOM_QUERY_PARAM, O as ExportFormat, Q as ProjectEmbedMachine, Qt as createInspectionActorId, U as InspectorSettings, V as InspectionTakenTransition, Yt as ViewerOptions, Zt as assertEmbedExamples, _ as EmbedDocumentLanguage, an as EmbedPanelConfig, at as ProjectWorkspaceAction, b as EmbedEventName, ct as ProjectWorkspaceCapabilities, d as CommentsConfig, dt as ProjectWorkspaceMachineOrigin, en as getInspectionRoomId, f as EMBED_DOCUMENT_LANGUAGES, g as EmbedDocument, in as resolveInspectorSettings, k as ExportFormatMap, lt as ProjectWorkspaceConfig, m as EditorCapabilities, n as CapabilityDeniedCapability, nn as isEmbedExampleMachine, on as EmbedPanelPosition, ot as ProjectWorkspaceActionIcon, p as EMBED_DOCUMENT_LIMITS, pt as ProjectWorkspaceProject, r as CapabilityDeniedEvent, rn as mergeInspectorSettings, tn as isEmbedExample, ut as ProjectWorkspaceMachine, v as EmbedEventHandler, w as EmbedMode, x as EmbedExample, y as EmbedEventMap } from "./protocol-AeHm956D.mjs";
2
+ import { S as GraphPatch, _ as raw, a as RawCode, c as XStateV4TSOptions, d as getXStateFSMCompatibilityIssues, f as graphToMachineConfig, g as jsonSchemaToTSType, h as graphToXStateV4TS, l as contextSchemaToTSType, m as graphToXStateTS, n as CodeGenGraph, o as XStateFSMOptions, p as graphToXStateFSM, r as MachineConfigOptions, s as XStateTSOptions, u as eventsSchemaToTSType, v as serializeJS, y as ActionLocation } from "./index-A5CMACoO.mjs";
3
+ import { C as EventTypeData, S as DigraphNodeConfig, _ as studioMachineConverter, a as StatelyGraphData, b as DigraphConfig, c as StatelyInvoke, d as StudioAction, f as StudioEdge, g as fromStudioMachine, h as StudioNode, i as StatelyGraph, l as StatelyNodeData, m as StudioMachine, o as StatelyGuard, r as StatelyEdgeData, t as StatelyAction, v as toStudioMachine, w as StateNodeJSONData, x as DigraphEdgeConfig, y as DigraphAction } from "./graph-DVfx7FwN.mjs";
4
+ import { $t as createInspectionRoomUrls, B as InspectionSentEvent, D as ExportCallOptions, F as InitOptions, Gt as UploadResult, H as InspectorLoadedEvent, J as MachineVersionAutoSaveOptions, L as InspectionAction, M as INSPECTION_PROTOCOL_VERSION, N as INSPECTION_ROOM_QUERY_PARAM, O as ExportFormat, Q as ProjectEmbedMachine, Qt as createInspectionActorId, U as InspectorSettings, V as InspectionTakenTransition, Yt as ViewerOptions, Zt as assertEmbedExamples, _ as EmbedDocumentLanguage, an as EmbedPanelConfig, at as ProjectWorkspaceAction, b as EmbedEventName, ct as ProjectWorkspaceCapabilities, d as CommentsConfig, dt as ProjectWorkspaceMachineOrigin, en as getInspectionRoomId, f as EMBED_DOCUMENT_LANGUAGES, g as EmbedDocument, in as resolveInspectorSettings, k as ExportFormatMap, lt as ProjectWorkspaceConfig, m as EditorCapabilities, n as CapabilityDeniedCapability, nn as isEmbedExampleMachine, on as EmbedPanelPosition, ot as ProjectWorkspaceActionIcon, p as EMBED_DOCUMENT_LIMITS, pt as ProjectWorkspaceProject, r as CapabilityDeniedEvent, rn as mergeInspectorSettings, tn as isEmbedExample, ut as ProjectWorkspaceMachine, v as EmbedEventHandler, w as EmbedMode, x as EmbedExample, y as EmbedEventMap } from "./protocol-CCf9j_SZ.mjs";
5
5
  import { AssetUploadAdapter, AssetUploadContext, AssetUploadRequest, CreateS3AssetUploadAdapterOptions, CreateSupabaseAssetUploadAdapterOptions, S3UploadTarget, SupabaseStorageClient, createS3AssetUploadAdapter, createSupabaseAssetUploadAdapter } from "./assetStorage.mjs";
6
6
  import { i as getCredentialToken, n as StatelyCredential, r as createAuthorizationHeader, t as StatelyAuthMode } from "./auth-CVFc85uF.mjs";
7
- import { _ as EditorHostOutboundMessage, a as EditorHostWorkspaceSessionOptions, d as fetchEditorSyncAccess, f as EDITOR_PROTOCOL_VERSION, g as EditorHostInitOptions, h as EditorHostInboundMessage, i as EditorHostWorkspaceSession, l as RemoteEditorSyncBackendOptions, m as EditorHostExportFormat, n as EditorHostSessionOptions, o as EditorSourceHost, p as EditorHostDiagnostic, r as EditorHostWorkspaceMachine, s as EditorSyncBackend, t as EditorHostSession, u as createRemoteEditorSyncBackend, v as EditorHostValidationIssue } from "./editorHostSession-DwD_9cER.mjs";
7
+ import { _ as EditorHostOutboundMessage, a as EditorHostWorkspaceSessionOptions, d as fetchEditorSyncAccess, f as EDITOR_PROTOCOL_VERSION, g as EditorHostInitOptions, h as EditorHostInboundMessage, i as EditorHostWorkspaceSession, l as RemoteEditorSyncBackendOptions, m as EditorHostExportFormat, n as EditorHostSessionOptions, o as EditorSourceHost, p as EditorHostDiagnostic, r as EditorHostWorkspaceMachine, s as EditorSyncBackend, t as EditorHostSession, u as createRemoteEditorSyncBackend, v as EditorHostValidationIssue } from "./editorHostSession-yGUKdLjq.mjs";
8
8
  import { AssetConfig, EmbedEntity, EmbedFormatContext, EmbedFormatDefinition, EmbedGraph, EmbedProfileDefinition, StatelyEmbed, StatelyEmbedOptions, createStatelyEmbed } from "./embed.mjs";
9
- import { _ as createWebSocketTransport, a as InspectedTransition, c as InspectorDiscoveryEntry, d as ManualActorOptions, f as createInspector, g as createPostMessageTransport, h as TransportFailure, i as InspectedSnapshot, l as InspectorEvents, m as Transport, n as CreateInspectorOptions, o as Inspector, p as createStatelyInspector, r as InspectedEvent, s as InspectorConnection, t as AdoptedActor, u as InspectorInspectionEvent } from "./inspect-D-L0qj9L.mjs";
10
- import { A as Machine, C as StudioMachineRecord, D as VerifyApiKeyResponse, E as UpdateProjectInput, F as ProjectVisibility, I as VerifyResult, L as XStateVersion, M as Project, N as ProjectMachineSummary, O as createStatelyClient, P as ProjectSummary, R as ResourceErrorCode, S as StudioClientOptions, T as UpdateMachineInput, _ as ProjectMachine, a as CreateMachineTemplate, b as StudioApiErrorOptions, c as EnsureProjectInput, d as ExtractedMachine, f as GetMachineOptions, g as ProjectData, h as LegacyUpdateMachineInput, i as CreateMachineInput, j as MachineVersion, k as ExtractedMachines, l as ExtractMachinesInput, m as LegacyProjectVisibility, n as CreateMachineFromDefinitionInput, o as CreateProjectInput, r as CreateMachineFromTemplateInput, s as DEFAULT_STATELY_BASE_URL, t as ConnectedRepo, u as ExtractMachinesResponse, v as RepoType, w as StudioRequestOptions, x as StudioClient, y as StudioApiError } from "./studio-CKdEPGKY.mjs";
9
+ import { _ as createWebSocketTransport, a as InspectedTransition, c as InspectorDiscoveryEntry, d as ManualActorOptions, f as createInspector, g as createPostMessageTransport, h as TransportFailure, i as InspectedSnapshot, l as InspectorEvents, m as Transport, n as CreateInspectorOptions, o as Inspector, p as createStatelyInspector, r as InspectedEvent, s as InspectorConnection, t as AdoptedActor, u as InspectorInspectionEvent } from "./inspect-DBH9oOAd.mjs";
10
+ import { A as Machine, C as StudioMachineRecord, D as VerifyApiKeyResponse, E as UpdateProjectInput, F as ProjectVisibility, I as VerifyResult, L as XStateVersion, M as Project, N as ProjectMachineSummary, O as createStatelyClient, P as ProjectSummary, R as ResourceErrorCode, S as StudioClientOptions, T as UpdateMachineInput, _ as ProjectMachine, a as CreateMachineTemplate, b as StudioApiErrorOptions, c as EnsureProjectInput, d as ExtractedMachine, f as GetMachineOptions, g as ProjectData, h as LegacyUpdateMachineInput, i as CreateMachineInput, j as MachineVersion, k as ExtractedMachines, l as ExtractMachinesInput, m as LegacyProjectVisibility, n as CreateMachineFromDefinitionInput, o as CreateProjectInput, r as CreateMachineFromTemplateInput, s as DEFAULT_STATELY_BASE_URL, t as ConnectedRepo, u as ExtractMachinesResponse, v as RepoType, w as StudioRequestOptions, x as StudioClient, y as StudioApiError } from "./studio-CFN3-0-2.mjs";
11
11
  import { OAuthAuthorizationServerMetadata, OAuthClientRegistrationResponse, OAuthProtectedResourceMetadata, OAuthTokenResponse, PkcePair, buildAuthorizeUrl, createPkcePair, discoverAuthorizationServer, discoverProtectedResource, exchangeCodeForToken, refreshToken, registerOAuthClient } from "./oauth.mjs";
12
12
  import { PlanSyncOptions, PullSyncResult, PushLocalMachineLinksResult, PushSyncOptions, PushSyncProjectOptions, PushSyncResult, ResolvedSyncInput, SyncInputFormat, SyncPlan, SyncPlanSummary } from "./sync.mjs";
13
13
  import { CreateInspectionRelayOptions, InspectionRelay, InspectionRelayEffect, InspectionRelayPeer, InspectionRelayRole, InspectionRelaySnapshot, createInspectionRelay } from "./relay.mjs";
package/dist/index.mjs CHANGED
@@ -1,13 +1,13 @@
1
1
  import "./openapi-BTDjYWXd.mjs";
2
2
  import { c as createInspectionRoomUrls, d as isEmbedExampleMachine, f as mergeInspectorSettings, i as INSPECTION_ROOM_QUERY_PARAM, l as getInspectionRoomId, n as EMBED_DOCUMENT_LIMITS, o as assertEmbedExamples, p as resolveInspectorSettings, r as INSPECTION_PROTOCOL_VERSION, s as createInspectionActorId, t as EMBED_DOCUMENT_LANGUAGES, u as isEmbedExample } from "./protocol-BsBGRISR.mjs";
3
- import { i as createWebSocketTransport, r as createPostMessageTransport } from "./version-DxDSBJta.mjs";
3
+ import { i as createWebSocketTransport, r as createPostMessageTransport } from "./version-CUFh-PYe.mjs";
4
4
  import { t as EDITOR_PROTOCOL_VERSION } from "./editorHostProtocol-B2_t3Le7.mjs";
5
5
  import { createStatelyEmbed } from "./embed.mjs";
6
- import { a as fetchEditorSyncAccess, i as createRemoteEditorSyncBackend, n as EditorHostWorkspaceSession, t as EditorHostSession } from "./editorHostSession-Bj5YcijC.mjs";
6
+ import { a as fetchEditorSyncAccess, i as createRemoteEditorSyncBackend, n as EditorHostWorkspaceSession, t as EditorHostSession } from "./editorHostSession-DCTHhBqC.mjs";
7
7
  import { n as StudioApiError, r as createStatelyClient, t as DEFAULT_STATELY_BASE_URL } from "./studio-BZP6DaIO.mjs";
8
- import { S as serializeJS, _ as graphToXStateV4TS, f as getXStateFSMCompatibilityIssues, g as graphToXStateTS, h as graphToXStateFSM, l as eventsSchemaToTSType, m as graphToMachineConfig, n as RawCode, o as contextSchemaToTSType, x as raw, y as jsonSchemaToTSType } from "./dist-NJFkDQjK.mjs";
8
+ import { S as serializeJS, _ as graphToXStateV4TS, f as getXStateFSMCompatibilityIssues, g as graphToXStateTS, h as graphToXStateFSM, l as eventsSchemaToTSType, m as graphToMachineConfig, n as RawCode, o as contextSchemaToTSType, x as raw, y as jsonSchemaToTSType } from "./dist-DsOTTfYv.mjs";
9
9
  import { createS3AssetUploadAdapter, createSupabaseAssetUploadAdapter } from "./assetStorage.mjs";
10
- import { n as createStatelyInspector, t as createInspector } from "./inspect-0dMcaOz_.mjs";
10
+ import { n as createStatelyInspector, t as createInspector } from "./inspect-ZVDq9tK2.mjs";
11
11
  import { createAuthorizationHeader, getCredentialToken } from "./auth.mjs";
12
12
  import { buildAuthorizeUrl, createPkcePair, discoverAuthorizationServer, discoverProtectedResource, exchangeCodeForToken, refreshToken, registerOAuthClient } from "./oauth.mjs";
13
13
  import { StatelyApiError, createStatelyApiClient, createStatelyApiUrl } from "./api.mjs";
@@ -1,4 +1,4 @@
1
- import { B as InspectionSentEvent, D as ExportCallOptions, H as InspectorLoadedEvent, K as MachinePayload, L as InspectionAction, O as ExportFormat, R as InspectionClientMetadata, U as InspectorSettings, V as InspectionTakenTransition, Yt as ViewerOptions, k as ExportFormatMap, mt as ProtocolMessage, y as EmbedEventMap } from "./protocol-AeHm956D.mjs";
1
+ import { B as InspectionSentEvent, D as ExportCallOptions, H as InspectorLoadedEvent, K as MachinePayload, L as InspectionAction, O as ExportFormat, R as InspectionClientMetadata, U as InspectorSettings, V as InspectionTakenTransition, Yt as ViewerOptions, k as ExportFormatMap, mt as ProtocolMessage, y as EmbedEventMap } from "./protocol-CCf9j_SZ.mjs";
2
2
 
3
3
  //#region src/transport.d.ts
4
4
  interface TransportFailure {
@@ -53,6 +53,7 @@ interface MinimalSnapshot {
53
53
  value: unknown;
54
54
  status: unknown;
55
55
  context?: unknown;
56
+ tags?: Iterable<string>;
56
57
  children?: Record<string, MinimalActorRef>;
57
58
  }
58
59
  /** Cross-version event envelope accepted by {@link Inspector.inspect}. */
@@ -1,5 +1,5 @@
1
1
  import { c as createInspectionRoomUrls, f as mergeInspectorSettings, l as getInspectionRoomId, p as resolveInspectorSettings, r as INSPECTION_PROTOCOL_VERSION } from "./protocol-BsBGRISR.mjs";
2
- import { a as assertEmbedDocuments, c as createPendingExportManager, i as createWebSocketTransport, n as inspectionRuntime, o as assertEmbedPanels, s as createEventRegistry, t as SDK_VERSION } from "./version-DxDSBJta.mjs";
2
+ import { a as assertEmbedDocuments, c as createPendingExportManager, i as createWebSocketTransport, n as inspectionRuntime, o as assertEmbedPanels, s as createEventRegistry, t as SDK_VERSION } from "./version-CUFh-PYe.mjs";
3
3
 
4
4
  //#region src/openBrowser.ts
5
5
  async function openBrowser(url) {
@@ -51,7 +51,8 @@ function deriveActorDisplayName(parentLogic, actorId) {
51
51
  //#region src/inspect.ts
52
52
  const defaultSerializeSnapshot = (snapshot) => ({
53
53
  value: snapshot?.value,
54
- status: snapshot?.status
54
+ status: snapshot?.status,
55
+ ...snapshot?.tags && { tags: Array.from(snapshot.tags) }
55
56
  });
56
57
  const defaultExtractMachineConfig = (actor, source) => actor?.logic?.config ?? source?.config ?? null;
57
58
  function isStoppedSnapshot(snapshot) {
@@ -251,12 +252,19 @@ function createInspector(options = {}) {
251
252
  function emitLocal(event, data) {
252
253
  const set = localListeners[event];
253
254
  if (!set) return;
254
- for (const handler of set) handler(data);
255
+ for (const handler of set) try {
256
+ handler(data);
257
+ } catch (cause) {
258
+ if (event === "error") console.error("Inspector error listener failed:", cause);
259
+ else emitLocal("error", {
260
+ code: "inspection_failed",
261
+ message: cause instanceof Error ? cause.message : String(cause)
262
+ });
263
+ }
255
264
  }
256
265
  const actors = /* @__PURE__ */ new Map();
257
266
  const resolvedSessionIds = /* @__PURE__ */ new WeakMap();
258
267
  const actorsByResolvedSessionId = /* @__PURE__ */ new Map();
259
- const runtimeRoots = /* @__PURE__ */ new WeakMap();
260
268
  const terminatedActors = /* @__PURE__ */ new WeakSet();
261
269
  const reboundActors = /* @__PURE__ */ new WeakSet();
262
270
  const manualSessionIds = /* @__PURE__ */ new Map();
@@ -264,28 +272,21 @@ function createInspector(options = {}) {
264
272
  const locallyRegistered = /* @__PURE__ */ new Set();
265
273
  /** v5 emits transition facets separately; accumulate them until snapshot. */
266
274
  const pendingTransitions = /* @__PURE__ */ new Map();
267
- function runtimeRootOf(actorRef, parentRef) {
268
- const known = runtimeRoots.get(actorRef);
269
- if (known) return known;
270
- let rootRef = parentRef ?? actorRef;
271
- while (rootRef._parent) rootRef = rootRef._parent;
272
- runtimeRoots.set(actorRef, rootRef);
273
- return rootRef;
274
- }
275
- function sessionIdOf(actorRef, parentRef = actorRef._parent, runtimeRoot) {
275
+ function sessionIdOf(actorRef, parentRef = actorRef._parent) {
276
276
  const existing = resolvedSessionIds.get(actorRef);
277
277
  if (existing) return existing;
278
- const parentSessionId = parentRef ? sessionIdOf(parentRef, parentRef._parent, runtimeRoot) : null;
278
+ const parentSessionId = parentRef ? sessionIdOf(parentRef, parentRef._parent) : null;
279
279
  const resolved = options.resolveSessionId?.(actorRef, actorRef.sessionId, parentSessionId) ?? actorRef.sessionId;
280
280
  if (typeof resolved !== "string" || resolved.length === 0) throw new Error("createInspector(): resolveSessionId must return a non-empty string.");
281
- assertSessionIdAvailable(actorRef, resolved, runtimeRoot ?? runtimeRootOf(actorRef, parentRef));
281
+ for (let ancestor = parentRef; ancestor; ancestor = ancestor._parent) if (sessionIdOf(ancestor, ancestor._parent) === resolved) throw new Error(`createInspector(): resolveSessionId returned duplicate id "${resolved}".`);
282
+ assertSessionIdAvailable(actorRef, resolved);
282
283
  return claimSessionId(actorRef, resolved);
283
284
  }
284
- function assertSessionIdAvailable(actorRef, resolved, nextRoot) {
285
+ function assertSessionIdAvailable(actorRef, resolved) {
285
286
  const claimedBy = actorsByResolvedSessionId.get(resolved);
286
287
  const claimedEntry = actors.get(resolved);
287
288
  if (claimedBy !== void 0 && claimedBy !== actorRef) {
288
- if (runtimeRootOf(claimedBy) === nextRoot || !terminatedActors.has(claimedBy) && sessionIdReuse !== "always") throw new Error(`createInspector(): resolveSessionId returned duplicate id "${resolved}".`);
289
+ if (!terminatedActors.has(claimedBy) && !isStoppedSnapshot(readSnapshot(claimedBy)) && sessionIdReuse !== "always") throw new Error(`createInspector(): resolveSessionId returned duplicate id "${resolved}".`);
289
290
  }
290
291
  if (claimedBy === void 0 && claimedEntry) throw new Error(`createInspector(): resolveSessionId returned duplicate id "${resolved}".`);
291
292
  }
@@ -309,7 +310,7 @@ function createInspector(options = {}) {
309
310
  function rootSessionIdOf(runtimeRootId, actorRef) {
310
311
  let rootRef = actorRef;
311
312
  while (rootRef._parent) rootRef = rootRef._parent;
312
- return rootRef.sessionId === runtimeRootId ? sessionIdOf(rootRef, void 0, rootRef) : runtimeRootId;
313
+ return rootRef.sessionId === runtimeRootId ? sessionIdOf(rootRef, void 0) : runtimeRootId;
313
314
  }
314
315
  function emitRegisterOnce(entry) {
315
316
  if (locallyRegistered.has(entry.sessionId)) return;
@@ -334,9 +335,9 @@ function createInspector(options = {}) {
334
335
  function toEntry(actorRef, rootActorId, details) {
335
336
  const parentRef = details?.parentRef ?? actorRef._parent;
336
337
  const sessionId = sessionIdOf(actorRef, parentRef);
337
- const snapshot = details?.snapshot ?? readSnapshot(actorRef);
338
- const serialized = snapshot === void 0 ? null : serializeSnapshot(snapshot);
339
- if (snapshot !== void 0) trackTermination(actorRef, snapshot);
338
+ const snapshot = details?.snapshot === null ? null : details?.snapshot ?? readSnapshot(actorRef);
339
+ const serialized = snapshot == null ? null : serializeSnapshot(snapshot);
340
+ if (snapshot != null) trackTermination(actorRef, snapshot);
340
341
  return {
341
342
  sessionId,
342
343
  actorId: details?.id ?? actorRef.id ?? sessionId,
@@ -363,27 +364,30 @@ function createInspector(options = {}) {
363
364
  function resolveActorTreeSessionIds(rootRef) {
364
365
  const pending = /* @__PURE__ */ new Map();
365
366
  const owners = /* @__PURE__ */ new Map();
366
- function visit(actorRef, parentRef) {
367
+ function visit(actorRef, parentRef, ancestorIds = /* @__PURE__ */ new Set()) {
367
368
  const existing = resolvedSessionIds.get(actorRef);
368
369
  const parentSessionId = parentRef ? resolvedSessionIds.get(parentRef) ?? pending.get(parentRef)?.resolved : null;
369
370
  const resolved = existing ?? options.resolveSessionId?.(actorRef, actorRef.sessionId, parentSessionId ?? null) ?? actorRef.sessionId;
370
371
  if (typeof resolved !== "string" || resolved.length === 0) throw new Error("createInspector(): resolveSessionId must return a non-empty string.");
372
+ if (ancestorIds.has(resolved)) throw new Error(`createInspector(): resolveSessionId returned duplicate id "${resolved}".`);
371
373
  const localOwner = owners.get(resolved);
372
- if (localOwner && localOwner !== actorRef) throw new Error(`createInspector(): resolveSessionId returned duplicate id "${resolved}".`);
374
+ if (localOwner && localOwner !== actorRef) {
375
+ if (sessionIdReuse !== "always" && !isStoppedSnapshot(readSnapshot(localOwner))) throw new Error(`createInspector(): resolveSessionId returned duplicate id "${resolved}".`);
376
+ }
373
377
  owners.set(resolved, actorRef);
374
378
  if (!existing) pending.set(actorRef, {
375
379
  resolved,
376
380
  parentRef
377
381
  });
378
- assertSessionIdAvailable(actorRef, resolved, rootRef);
382
+ assertSessionIdAvailable(actorRef, resolved);
379
383
  const children = actorRef.getSnapshot()?.children ?? {};
380
- for (const child of Object.values(children)) if (child) visit(child, actorRef);
384
+ const childAncestorIds = new Set(ancestorIds);
385
+ childAncestorIds.add(resolved);
386
+ for (const child of Object.values(children)) if (child) visit(child, actorRef, childAncestorIds);
381
387
  }
382
388
  visit(rootRef);
383
- for (const [actorRef, { resolved }] of pending) {
384
- runtimeRoots.set(actorRef, rootRef);
385
- claimSessionId(actorRef, resolved);
386
- }
389
+ for (const [actorRef, { resolved }] of pending) if (owners.get(resolved) === actorRef) claimSessionId(actorRef, resolved);
390
+ else resolvedSessionIds.set(actorRef, resolved);
387
391
  }
388
392
  /**
389
393
  * Walk the actor tree and populate the local `actors` map. Idempotent —
@@ -408,6 +412,7 @@ function createInspector(options = {}) {
408
412
  }
409
413
  function backfillActorTree(actorRef, rootActorId, publish = false) {
410
414
  const sessionId = sessionIdOf(actorRef);
415
+ if (!isCurrentOwner(actorRef)) return;
411
416
  const existing = actors.get(sessionId);
412
417
  const replaces = reboundActors.delete(actorRef);
413
418
  const entry = !existing || replaces ? toEntry(actorRef, rootActorId) : existing;
@@ -584,14 +589,16 @@ function createInspector(options = {}) {
584
589
  const isNewRoot = !observedRootIds.has(rootActorId);
585
590
  observedRootIds.add(rootActorId);
586
591
  switch (event.type) {
587
- case "@xstate.actor":
592
+ case "@xstate.actor": {
593
+ const initialSnapshot = event.snapshot ?? readSnapshot(event.actorRef);
588
594
  handleActor(event.actorRef, rootActorId, {
589
595
  parentRef: event.parentRef,
590
596
  id: event.id,
591
597
  source: event.src,
592
- snapshot: event.snapshot
598
+ snapshot: isStoppedSnapshot(initialSnapshot) ? initialSnapshot : null
593
599
  });
594
600
  break;
601
+ }
595
602
  case "@xstate.event": {
596
603
  const sessionId = sessionIdOf(event.actorRef);
597
604
  if (!actors.has(sessionId)) handleActor(event.actorRef, rootActorId);
@@ -625,6 +632,16 @@ function createInspector(options = {}) {
625
632
  }
626
633
  if (isNewRoot && !initSent) sendInit();
627
634
  }
635
+ function safelyHandleInspectionEvent(event) {
636
+ try {
637
+ handleInspectionEvent(event);
638
+ } catch (cause) {
639
+ emitLocal("error", {
640
+ code: "inspection_failed",
641
+ message: cause instanceof Error ? cause.message : String(cause)
642
+ });
643
+ }
644
+ }
628
645
  function attachActor(actor) {
629
646
  const root = actor;
630
647
  resolveActorTreeSessionIds(root);
@@ -637,7 +654,7 @@ function createInspector(options = {}) {
637
654
  }
638
655
  materializePendingInit();
639
656
  observedRootIds.add(rootActorId);
640
- const subscription = root.system.inspect(handleInspectionEvent);
657
+ const subscription = root.system.inspect(safelyHandleInspectionEvent);
641
658
  inspectedRoots.set(rootActorId, {
642
659
  actor: root,
643
660
  subscription
@@ -763,7 +780,7 @@ function createInspector(options = {}) {
763
780
  },
764
781
  inspectorUrl,
765
782
  ready,
766
- inspect: handleInspectionEvent,
783
+ inspect: safelyHandleInspectionEvent,
767
784
  attach: attachActor,
768
785
  on(event, handler) {
769
786
  if (!localListeners[event]) localListeners[event] = /* @__PURE__ */ new Set();
@@ -1,3 +1,3 @@
1
- import { B as InspectionSentEvent, D as ExportCallOptions, H as InspectorLoadedEvent, K as MachinePayload, L as InspectionAction, O as ExportFormat, U as InspectorSettings, V as InspectionTakenTransition, Yt as ViewerOptions, an as EmbedPanelConfig, b as EmbedEventName, g as EmbedDocument, k as ExportFormatMap, m as EditorCapabilities, v as EmbedEventHandler, w as EmbedMode, y as EmbedEventMap } from "./protocol-AeHm956D.mjs";
2
- import { a as InspectedTransition, c as InspectorDiscoveryEntry, d as ManualActorOptions, f as createInspector, i as InspectedSnapshot, l as InspectorEvents, m as Transport, n as CreateInspectorOptions, o as Inspector, p as createStatelyInspector, r as InspectedEvent, s as InspectorConnection, t as AdoptedActor, u as InspectorInspectionEvent } from "./inspect-D-L0qj9L.mjs";
1
+ import { B as InspectionSentEvent, D as ExportCallOptions, H as InspectorLoadedEvent, K as MachinePayload, L as InspectionAction, O as ExportFormat, U as InspectorSettings, V as InspectionTakenTransition, Yt as ViewerOptions, an as EmbedPanelConfig, b as EmbedEventName, g as EmbedDocument, k as ExportFormatMap, m as EditorCapabilities, v as EmbedEventHandler, w as EmbedMode, y as EmbedEventMap } from "./protocol-CCf9j_SZ.mjs";
2
+ import { a as InspectedTransition, c as InspectorDiscoveryEntry, d as ManualActorOptions, f as createInspector, i as InspectedSnapshot, l as InspectorEvents, m as Transport, n as CreateInspectorOptions, o as Inspector, p as createStatelyInspector, r as InspectedEvent, s as InspectorConnection, t as AdoptedActor, u as InspectorInspectionEvent } from "./inspect-DBH9oOAd.mjs";
3
3
  export { AdoptedActor, CreateInspectorOptions, EditorCapabilities, EmbedDocument, EmbedEventHandler, EmbedEventMap, EmbedEventName, EmbedMode, EmbedPanelConfig, ExportCallOptions, ExportFormat, ExportFormatMap, InspectedEvent, InspectedSnapshot, InspectedTransition, InspectionAction, InspectionSentEvent, InspectionTakenTransition, Inspector, InspectorConnection, InspectorDiscoveryEntry, InspectorEvents, InspectorInspectionEvent, InspectorLoadedEvent, InspectorSettings, MachinePayload, ManualActorOptions, Transport, ViewerOptions, createInspector, createStatelyInspector };
package/dist/inspect.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import "./protocol-BsBGRISR.mjs";
2
- import "./version-DxDSBJta.mjs";
3
- import { n as createStatelyInspector, t as createInspector } from "./inspect-0dMcaOz_.mjs";
2
+ import "./version-CUFh-PYe.mjs";
3
+ import { n as createStatelyInspector, t as createInspector } from "./inspect-ZVDq9tK2.mjs";
4
4
 
5
5
  export { createInspector, createStatelyInspector };
@@ -1,2 +1,2 @@
1
- import { C as ImplementationSourceType, S as GraphPatch, b as CanvasColor, x as EditorStateType, y as ActionLocation } from "./index-DZivqh0u.mjs";
1
+ import { C as ImplementationSourceType, S as GraphPatch, b as CanvasColor, x as EditorStateType, y as ActionLocation } from "./index-A5CMACoO.mjs";
2
2
  export { type ActionLocation, type CanvasColor, type EditorStateType, type GraphPatch, type ImplementationSourceType };
@@ -1,5 +1,5 @@
1
- import { i as ProfileManifest } from "./index-DZivqh0u.mjs";
2
- import { i as StatelyGraph } from "./graph-Ciocekxl.mjs";
1
+ import { i as ProfileManifest } from "./index-A5CMACoO.mjs";
2
+ import { i as StatelyGraph } from "./graph-DVfx7FwN.mjs";
3
3
  import { c as EditorSyncSourceLocation, f as MachineSourceLocations$1, l as EditorSyncSourceRange, t as EditorCapabilities$1, u as EditorSyncStateSourceLocation } from "./editor-sync-types-D7YYz6fb.mjs";
4
4
 
5
5
  //#region src/embedPanel.d.ts
@@ -530,6 +530,8 @@ interface ToastDismissMessage {
530
530
  }
531
531
  interface InspectSnapshotMessage {
532
532
  type: '@statelyai.inspectSnapshot';
533
+ /** Taken transitions, when supplied by the producer. */
534
+ transitions?: InspectionTakenTransition[];
533
535
  snapshot: unknown;
534
536
  event: unknown | null;
535
537
  /** Producer-local actor session id, when this snapshot belongs to an actor. */
@@ -1,2 +1,2 @@
1
- import { $ as ProjectInitMessage, $t as createInspectionRoomUrls, A as ExtensionCallMessage, At as StateSourceLocation, B as InspectionSentEvent, Bt as UpdateMessage, C as EmbedFormatManifest, Ct as SessionMessage, D as ExportCallOptions, Dt as SetThemeMessage, E as ErrorMessage, Et as SetSettingsMessage, F as InitOptions, Ft as SystemInitMessage, G as MachineInitOptions, Gt as UploadResult, H as InspectorLoadedEvent, Ht as UploadFileInfo, I as InspectSnapshotMessage, It as SystemLoadedMessage, J as MachineVersionAutoSaveOptions, Jt as ViewModeChangedMessage, K as MachinePayload, Kt as ValidationIssue, L as InspectionAction, Lt as SystemSelectActorMessage, M as INSPECTION_PROTOCOL_VERSION, Mt as SystemActorRegisteredMessage, N as INSPECTION_ROOM_QUERY_PARAM, Nt as SystemActorSnapshotMessage, O as ExportFormat, Ot as SourceLocation, P as InitMessage, Pt as SystemActorStoppedMessage, Q as ProjectEmbedMachine, Qt as createInspectionActorId, R as InspectionClientMetadata, Rt as ToastDismissMessage, S as EmbedExtensionsManifest, St as SavedMessage, T as ErrorCode, Tt as SetModeMessage, U as InspectorSettings, Ut as UploadRequestMessage, V as InspectionTakenTransition, Vt as UploadCapabilitiesMessage, W as LoadedMessage, Wt as UploadResponseMessage, X as PREFIX, Xt as VizMessage, Y as ModeChangedMessage, Yt as ViewerOptions, Z as PanelChangedMessage, Zt as assertEmbedExamples, _ as EmbedDocumentLanguage, _t as RegisterMessage, a as ChangeMessage, an as EmbedPanelConfig, at as ProjectWorkspaceAction, b as EmbedEventName, bt as RetrievedMessage, c as ClipboardReadResponseMessage, ct as ProjectWorkspaceCapabilities, d as CommentsConfig, dt as ProjectWorkspaceMachineOrigin, en as getInspectionRoomId, et as ProjectInitOptions, f as EMBED_DOCUMENT_LANGUAGES, ft as ProjectWorkspaceOpenChangedMessage, g as EmbedDocument, gt as ReadyMessage, h as EditorHandshakeMessage, ht as ReadOnlyReason, i as CapabilityDeniedMessage, in as resolveInspectorSettings, it as ProjectUpdateMessage, j as ExtensionResultMessage, jt as SystemActorEventMessage, k as ExportFormatMap, kt as SourceRange, l as ClipboardWriteMessage, lt as ProjectWorkspaceConfig, m as EditorCapabilities, mt as ProtocolMessage, n as CapabilityDeniedCapability, nn as isEmbedExampleMachine, nt as ProjectSelectMachineMessage, o as ClientMessage, on as EmbedPanelPosition, ot as ProjectWorkspaceActionIcon, p as EMBED_DOCUMENT_LIMITS, pt as ProjectWorkspaceProject, q as MachineSourceLocations, qt as VersionSaveRequestedMessage, r as CapabilityDeniedEvent, rn as mergeInspectorSettings, rt as ProjectSetWorkspaceOpenMessage, s as ClipboardReadMessage, st as ProjectWorkspaceActionMessage, t as ActorSystemEntry, tn as isEmbedExample, tt as ProjectMachineSelectedMessage, u as ClipboardWriteResponseMessage, ut as ProjectWorkspaceMachine, v as EmbedEventHandler, vt as RegisteredMessage, w as EmbedMode, wt as SetApiKeyMessage, x as EmbedExample, xt as SaveMessage, y as EmbedEventMap, yt as RetrieveMessage, z as InspectionRoomUrls, zt as ToastMessage } from "./protocol-AeHm956D.mjs";
1
+ import { $ as ProjectInitMessage, $t as createInspectionRoomUrls, A as ExtensionCallMessage, At as StateSourceLocation, B as InspectionSentEvent, Bt as UpdateMessage, C as EmbedFormatManifest, Ct as SessionMessage, D as ExportCallOptions, Dt as SetThemeMessage, E as ErrorMessage, Et as SetSettingsMessage, F as InitOptions, Ft as SystemInitMessage, G as MachineInitOptions, Gt as UploadResult, H as InspectorLoadedEvent, Ht as UploadFileInfo, I as InspectSnapshotMessage, It as SystemLoadedMessage, J as MachineVersionAutoSaveOptions, Jt as ViewModeChangedMessage, K as MachinePayload, Kt as ValidationIssue, L as InspectionAction, Lt as SystemSelectActorMessage, M as INSPECTION_PROTOCOL_VERSION, Mt as SystemActorRegisteredMessage, N as INSPECTION_ROOM_QUERY_PARAM, Nt as SystemActorSnapshotMessage, O as ExportFormat, Ot as SourceLocation, P as InitMessage, Pt as SystemActorStoppedMessage, Q as ProjectEmbedMachine, Qt as createInspectionActorId, R as InspectionClientMetadata, Rt as ToastDismissMessage, S as EmbedExtensionsManifest, St as SavedMessage, T as ErrorCode, Tt as SetModeMessage, U as InspectorSettings, Ut as UploadRequestMessage, V as InspectionTakenTransition, Vt as UploadCapabilitiesMessage, W as LoadedMessage, Wt as UploadResponseMessage, X as PREFIX, Xt as VizMessage, Y as ModeChangedMessage, Yt as ViewerOptions, Z as PanelChangedMessage, Zt as assertEmbedExamples, _ as EmbedDocumentLanguage, _t as RegisterMessage, a as ChangeMessage, an as EmbedPanelConfig, at as ProjectWorkspaceAction, b as EmbedEventName, bt as RetrievedMessage, c as ClipboardReadResponseMessage, ct as ProjectWorkspaceCapabilities, d as CommentsConfig, dt as ProjectWorkspaceMachineOrigin, en as getInspectionRoomId, et as ProjectInitOptions, f as EMBED_DOCUMENT_LANGUAGES, ft as ProjectWorkspaceOpenChangedMessage, g as EmbedDocument, gt as ReadyMessage, h as EditorHandshakeMessage, ht as ReadOnlyReason, i as CapabilityDeniedMessage, in as resolveInspectorSettings, it as ProjectUpdateMessage, j as ExtensionResultMessage, jt as SystemActorEventMessage, k as ExportFormatMap, kt as SourceRange, l as ClipboardWriteMessage, lt as ProjectWorkspaceConfig, m as EditorCapabilities, mt as ProtocolMessage, n as CapabilityDeniedCapability, nn as isEmbedExampleMachine, nt as ProjectSelectMachineMessage, o as ClientMessage, on as EmbedPanelPosition, ot as ProjectWorkspaceActionIcon, p as EMBED_DOCUMENT_LIMITS, pt as ProjectWorkspaceProject, q as MachineSourceLocations, qt as VersionSaveRequestedMessage, r as CapabilityDeniedEvent, rn as mergeInspectorSettings, rt as ProjectSetWorkspaceOpenMessage, s as ClipboardReadMessage, st as ProjectWorkspaceActionMessage, t as ActorSystemEntry, tn as isEmbedExample, tt as ProjectMachineSelectedMessage, u as ClipboardWriteResponseMessage, ut as ProjectWorkspaceMachine, v as EmbedEventHandler, vt as RegisteredMessage, w as EmbedMode, wt as SetApiKeyMessage, x as EmbedExample, xt as SaveMessage, y as EmbedEventMap, yt as RetrieveMessage, z as InspectionRoomUrls, zt as ToastMessage } from "./protocol-CCf9j_SZ.mjs";
2
2
  export { ActorSystemEntry, CapabilityDeniedCapability, CapabilityDeniedEvent, CapabilityDeniedMessage, ChangeMessage, ClientMessage, ClipboardReadMessage, ClipboardReadResponseMessage, ClipboardWriteMessage, ClipboardWriteResponseMessage, CommentsConfig, EMBED_DOCUMENT_LANGUAGES, EMBED_DOCUMENT_LIMITS, EditorCapabilities, EditorHandshakeMessage, EmbedDocument, EmbedDocumentLanguage, EmbedEventHandler, EmbedEventMap, EmbedEventName, EmbedExample, EmbedExtensionsManifest, EmbedFormatManifest, EmbedMode, EmbedPanelConfig, EmbedPanelPosition, ErrorCode, ErrorMessage, ExportCallOptions, ExportFormat, ExportFormatMap, ExtensionCallMessage, ExtensionResultMessage, INSPECTION_PROTOCOL_VERSION, INSPECTION_ROOM_QUERY_PARAM, InitMessage, InitOptions, InspectSnapshotMessage, InspectionAction, InspectionClientMetadata, InspectionRoomUrls, InspectionSentEvent, InspectionTakenTransition, InspectorLoadedEvent, InspectorSettings, LoadedMessage, MachineInitOptions, MachinePayload, MachineSourceLocations, MachineVersionAutoSaveOptions, ModeChangedMessage, PREFIX, PanelChangedMessage, ProjectEmbedMachine, ProjectInitMessage, ProjectInitOptions, ProjectMachineSelectedMessage, ProjectSelectMachineMessage, ProjectSetWorkspaceOpenMessage, ProjectUpdateMessage, ProjectWorkspaceAction, ProjectWorkspaceActionIcon, ProjectWorkspaceActionMessage, ProjectWorkspaceCapabilities, ProjectWorkspaceConfig, ProjectWorkspaceMachine, ProjectWorkspaceMachineOrigin, ProjectWorkspaceOpenChangedMessage, ProjectWorkspaceProject, ProtocolMessage, ReadOnlyReason, ReadyMessage, RegisterMessage, RegisteredMessage, RetrieveMessage, RetrievedMessage, SaveMessage, SavedMessage, SessionMessage, SetApiKeyMessage, SetModeMessage, SetSettingsMessage, SetThemeMessage, SourceLocation, SourceRange, StateSourceLocation, SystemActorEventMessage, SystemActorRegisteredMessage, SystemActorSnapshotMessage, SystemActorStoppedMessage, SystemInitMessage, SystemLoadedMessage, SystemSelectActorMessage, ToastDismissMessage, ToastMessage, UpdateMessage, UploadCapabilitiesMessage, UploadFileInfo, UploadRequestMessage, UploadResponseMessage, UploadResult, ValidationIssue, VersionSaveRequestedMessage, ViewModeChangedMessage, ViewerOptions, VizMessage, assertEmbedExamples, createInspectionActorId, createInspectionRoomUrls, getInspectionRoomId, isEmbedExample, isEmbedExampleMachine, mergeInspectorSettings, resolveInspectorSettings };
package/dist/relay.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { mt as ProtocolMessage } from "./protocol-AeHm956D.mjs";
1
+ import { mt as ProtocolMessage } from "./protocol-CCf9j_SZ.mjs";
2
2
 
3
3
  //#region src/relay.d.ts
4
4
  type InspectionRelayRole = 'producer' | 'viewer';
package/dist/relay.mjs CHANGED
@@ -64,6 +64,41 @@ function errorMessage(code, message) {
64
64
  function compactReplay(replay, message, max) {
65
65
  const record = message;
66
66
  const type = record.type;
67
+ const checkpoint = type === "@statelyai.system.actorRegistered" || type === "@statelyai.system.actorSnapshot" || type === "@statelyai.system.actorStopped" ? replay.find((entry) => entry.type === "@statelyai.system.init") : void 0;
68
+ if (checkpoint && typeof record.sessionId === "string") {
69
+ const actorIndex = checkpoint.actors.findIndex((actor) => actor.sessionId === record.sessionId);
70
+ if (type === "@statelyai.system.actorRegistered") {
71
+ const nextActor = {
72
+ sessionId: record.sessionId,
73
+ actorId: record.actorId,
74
+ ...typeof record.displayName === "string" && { displayName: record.displayName },
75
+ parentSessionId: record.parentSessionId,
76
+ machine: record.machine,
77
+ snapshot: record.snapshot
78
+ };
79
+ if (actorIndex >= 0) checkpoint.actors[actorIndex] = nextActor;
80
+ else checkpoint.actors.push(nextActor);
81
+ for (let index = replay.length - 1; index >= 0; index--) {
82
+ const previous = replay[index];
83
+ if (previous.sessionId === record.sessionId && typeof previous.type === "string" && previous.type.startsWith("@statelyai.system.actor")) replay.splice(index, 1);
84
+ }
85
+ return;
86
+ }
87
+ const actor = checkpoint.actors[actorIndex];
88
+ if (actor) {
89
+ if (type === "@statelyai.system.actorSnapshot") checkpoint.actors[actorIndex] = {
90
+ ...actor,
91
+ snapshot: record.snapshot
92
+ };
93
+ else if (type === "@statelyai.system.actorStopped") {
94
+ checkpoint.actors[actorIndex] = {
95
+ ...actor,
96
+ stopped: true
97
+ };
98
+ return;
99
+ }
100
+ }
101
+ }
67
102
  if (type === "@statelyai.setSettings" || type === "@statelyai.system.selectActor") {
68
103
  const index = replay.findIndex((entry) => entry.type === "@statelyai.system.init");
69
104
  const init = replay[index];
@@ -97,7 +132,11 @@ function compactReplay(replay, message, max) {
97
132
  if (index >= 0) replay.splice(index, 1);
98
133
  }
99
134
  replay.push(message);
100
- if (replay.length > max) replay.splice(0, replay.length - max);
135
+ while (replay.length > max) {
136
+ const oldestDelta = replay.findIndex((entry) => entry.type !== "@statelyai.system.init" && entry.type !== "@statelyai.init");
137
+ if (oldestDelta < 0) break;
138
+ replay.splice(oldestDelta, 1);
139
+ }
101
140
  }
102
141
  /**
103
142
  * Runtime-neutral implementation of one inspection room.
@@ -1,4 +1,4 @@
1
- import { A as ZodObject, D as ZodLiteral, E as ZodEnum, F as ZodUnknown, I as output, L as $loose, M as ZodRecord, N as ZodString, O as ZodNullable, P as ZodUnion, R as $strip, T as ZodBoolean, j as ZodOptional, k as ZodNumber, w as ZodArray } from "./index-DZivqh0u.mjs";
1
+ import { A as ZodObject, D as ZodLiteral, E as ZodEnum, F as ZodUnknown, I as output, L as $loose, M as ZodRecord, N as ZodString, O as ZodNullable, P as ZodUnion, R as $strip, T as ZodBoolean, j as ZodOptional, k as ZodNumber, w as ZodArray } from "./index-A5CMACoO.mjs";
2
2
  import { n as StatelyCredential, t as StatelyAuthMode } from "./auth-CVFc85uF.mjs";
3
3
 
4
4
  //#region ../api-contract/dist/errors.d.mts
package/dist/studio.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { A as Machine, C as StudioMachineRecord, D as VerifyApiKeyResponse, E as UpdateProjectInput, F as ProjectVisibility, I as VerifyResult, L as XStateVersion, M as Project, N as ProjectMachineSummary, O as createStatelyClient, P as ProjectSummary, R as ResourceErrorCode, S as StudioClientOptions, T as UpdateMachineInput, _ as ProjectMachine, a as CreateMachineTemplate, b as StudioApiErrorOptions, c as EnsureProjectInput, d as ExtractedMachine, f as GetMachineOptions, g as ProjectData, h as LegacyUpdateMachineInput, i as CreateMachineInput, j as MachineVersion, k as ExtractedMachines, l as ExtractMachinesInput, m as LegacyProjectVisibility, n as CreateMachineFromDefinitionInput, o as CreateProjectInput, p as LegacyExtractMachinesOptions, r as CreateMachineFromTemplateInput, s as DEFAULT_STATELY_BASE_URL, t as ConnectedRepo, u as ExtractMachinesResponse, v as RepoType, w as StudioRequestOptions, x as StudioClient, y as StudioApiError } from "./studio-CKdEPGKY.mjs";
1
+ import { A as Machine, C as StudioMachineRecord, D as VerifyApiKeyResponse, E as UpdateProjectInput, F as ProjectVisibility, I as VerifyResult, L as XStateVersion, M as Project, N as ProjectMachineSummary, O as createStatelyClient, P as ProjectSummary, R as ResourceErrorCode, S as StudioClientOptions, T as UpdateMachineInput, _ as ProjectMachine, a as CreateMachineTemplate, b as StudioApiErrorOptions, c as EnsureProjectInput, d as ExtractedMachine, f as GetMachineOptions, g as ProjectData, h as LegacyUpdateMachineInput, i as CreateMachineInput, j as MachineVersion, k as ExtractedMachines, l as ExtractMachinesInput, m as LegacyProjectVisibility, n as CreateMachineFromDefinitionInput, o as CreateProjectInput, p as LegacyExtractMachinesOptions, r as CreateMachineFromTemplateInput, s as DEFAULT_STATELY_BASE_URL, t as ConnectedRepo, u as ExtractMachinesResponse, v as RepoType, w as StudioRequestOptions, x as StudioClient, y as StudioApiError } from "./studio-CFN3-0-2.mjs";
2
2
  export { ConnectedRepo, CreateMachineFromDefinitionInput, CreateMachineFromTemplateInput, CreateMachineInput, CreateMachineTemplate, CreateProjectInput, DEFAULT_STATELY_BASE_URL, EnsureProjectInput, ExtractMachinesInput, ExtractMachinesResponse, ExtractedMachine, ExtractedMachines, GetMachineOptions, LegacyExtractMachinesOptions, LegacyProjectVisibility, LegacyUpdateMachineInput, Machine, MachineVersion, Project, ProjectData, ProjectMachine, ProjectMachineSummary, ProjectSummary, ProjectVisibility, RepoType, ResourceErrorCode, StudioApiError, StudioApiErrorOptions, StudioClient, StudioClientOptions, StudioMachineRecord, StudioRequestOptions, UpdateMachineInput, UpdateProjectInput, VerifyApiKeyResponse, VerifyResult, XStateVersion, createStatelyClient };
package/dist/sync.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { b as DigraphConfig, i as StatelyGraph } from "./graph-Ciocekxl.mjs";
2
- import { C as StudioMachineRecord, L as XStateVersion, g as ProjectData, o as CreateProjectInput, x as StudioClient } from "./studio-CKdEPGKY.mjs";
1
+ import { b as DigraphConfig, i as StatelyGraph } from "./graph-DVfx7FwN.mjs";
2
+ import { C as StudioMachineRecord, L as XStateVersion, g as ProjectData, o as CreateProjectInput, x as StudioClient } from "./studio-CFN3-0-2.mjs";
3
3
  import { GraphDiff } from "@statelyai/graph";
4
4
 
5
5
  //#region src/sync.d.ts
package/dist/sync.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import "./openapi-BTDjYWXd.mjs";
2
2
  import { r as createStatelyClient } from "./studio-BZP6DaIO.mjs";
3
- import { C as toXStateV6MachineConfig, S as serializeJS, a as alignCompareGraphIds, b as normalizeMachineProfile, c as diffGraphsSemantically, d as getDelayKeyFromEventType, g as graphToXStateTS, i as XSTATE_V6_FN_TRANSITION_META, m as graphToMachineConfig, p as graphChangeToPatchesResult, r as XSTATE_V6_BRANCH_DESCRIPTION_META, s as detectXStateSourceProfile, t as INLINE_EXPRESSION_DIRECTIVE_FIELDS, u as extractXStateMachineConfigEntries, v as isCodeExpression } from "./dist-NJFkDQjK.mjs";
3
+ import { C as toXStateV6MachineConfig, S as serializeJS, a as alignCompareGraphIds, b as normalizeMachineProfile, c as diffGraphsSemantically, d as getDelayKeyFromEventType, g as graphToXStateTS, i as XSTATE_V6_FN_TRANSITION_META, m as graphToMachineConfig, p as graphChangeToPatchesResult, r as XSTATE_V6_BRANCH_DESCRIPTION_META, s as detectXStateSourceProfile, t as INLINE_EXPRESSION_DIRECTIVE_FIELDS, u as extractXStateMachineConfigEntries, v as isCodeExpression } from "./dist-DsOTTfYv.mjs";
4
4
  import { n as getStatelyPragma, r as upsertStatelyPragma, t as findStatelyPragmaAttachments } from "./statelyPragma-YtVaBuIe.mjs";
5
5
  import { fromStudioMachine, toStudioMachine } from "./graph.mjs";
6
6
  import * as ts$1 from "typescript";
@@ -378,7 +378,7 @@ function createWebSocketTransport(options) {
378
378
 
379
379
  //#endregion
380
380
  //#region src/version.ts
381
- const SDK_VERSION = "0.34.0";
381
+ const SDK_VERSION = "0.34.2";
382
382
  function inspectionRuntime() {
383
383
  if (typeof window !== "undefined") return "browser";
384
384
  if (typeof process !== "undefined" && process.versions?.node) return "node";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@statelyai/sdk",
3
- "version": "0.34.0",
3
+ "version": "0.34.2",
4
4
  "license": "MIT",
5
5
  "bin": {
6
6
  "stately-sdk": "./dist/bin.mjs"
@@ -82,7 +82,6 @@
82
82
  },
83
83
  "dependencies": {
84
84
  "@statelyai/graph": "^2.1.0",
85
- "esbuild": "^0.27.0",
86
85
  "typescript": "^5.9.3",
87
86
  "ws": "^8.19.0",
88
87
  "xstate": "^5.0.0"
@@ -93,8 +92,9 @@
93
92
  "jsdom": "^27.4.0",
94
93
  "tsdown": "0.21.0-beta.2",
95
94
  "vitest": "^3.2.4",
96
- "@statelyai/api-contract": "0.5.1",
97
- "@statelyai/graph-tools": "0.8.4"
95
+ "xstate-v6": "npm:xstate@6.0.0-alpha.51",
96
+ "@statelyai/api-contract": "0.5.2",
97
+ "@statelyai/graph-tools": "0.9.0"
98
98
  },
99
99
  "engines": {
100
100
  "node": ">=22.4"