@nanobpm/nano-workforce 0.167.0 → 0.167.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -50,6 +50,32 @@ const DEFAULT_IMPORT_URL = new URL("../app/api/actions/delivery-graph/library/im
50
50
  // routes through the single `fillComposer()` seam below; keep new fill sources going through it.
51
51
  export const DG_COMPOSE_FILL_MESSAGE = "nano-delivery-graph-compose-fill";
52
52
 
53
+ // The ACK half of the reuse-fill bridge (issue #645). An optimistic "✓ Loaded…" toast printed
54
+ // synchronously after the Library posts the fill can never reflect the cross-frame OUTCOME — the fill
55
+ // message is relayed across App-Views (nano-ide #518) and could still be dropped (no relay, wrong
56
+ // origin, a compose view that isn't mounted), yet the toast claimed success regardless (the #645
57
+ // defect). So the delivery is now ACKNOWLEDGED: when THIS compose mount actually fills from a fill
58
+ // message, it posts this ack back UP to the host (relayed across to the Library sibling), echoing the
59
+ // producer's correlation `token`. The Library shows "✓ Loaded…" ONLY on that ack and a clear error on a
60
+ // short timeout — the success is earned, not assumed. The `type` is exported ONCE here as the single
61
+ // source of truth; the Library consumer imports it rather than re-declaring a synonym.
62
+ export const DG_COMPOSE_FILL_ACK_MESSAGE = "nano-delivery-graph-compose-fill-ack";
63
+
64
+ // The host acknowledgment of a `nano-navigate` (issue #645). "Preview generated DI" posts nano-navigate
65
+ // UP to the console; nano-ide #518 forwards it to the host explorer, but the host does not synchronously
66
+ // confirm, so an optimistic "✓ Opening…" toast printed right after the post claimed success even when the
67
+ // message was dropped (standalone, no relay, a console that never navigated). The compose view now treats
68
+ // Preview as fire-to-host with a bounded budget: it shows a NEUTRAL in-progress status, and only earns a
69
+ // "✓" when the host echoes this ack for the same `target`; if no host ack is observed within the budget it
70
+ // surfaces "Couldn't reach the console explorer" instead. Same-origin, from the parent (the console).
71
+ export const NANO_NAVIGATE_ACK_MESSAGE = "nano-navigate-ack";
72
+
73
+ // The bounded budget within which a cross-frame delivery (compose-fill relay, or a nano-navigate to the
74
+ // host) must be acknowledged before the producer surfaces an honest "couldn't reach …" error (#645). A
75
+ // couple of seconds is long enough for the App-View relay round-trip yet short enough that a dropped
76
+ // message fails fast instead of leaving a misleading toast up. Overridable via config for tests.
77
+ const ACK_TIMEOUT_MS = 2000;
78
+
53
79
  // A bounded timeout for every door request. Without it a hung endpoint leaves the fetch promise pending
54
80
  // forever, so the busy() lock never clears and the UI is stranded (buttons disabled, status stuck) with
55
81
  // no way to retry. On timeout the AbortController rejects the fetch, which surfaces as an error banner
@@ -230,6 +256,8 @@ export function mountDeliveryGraphs(host, config = {}) {
230
256
  const previewUrl = config.previewUrl ?? DEFAULT_PREVIEW_URL;
231
257
  const stageUrl = config.stageUrl ?? DEFAULT_STAGE_URL;
232
258
  const importUrl = config.importUrl ?? DEFAULT_IMPORT_URL;
259
+ const ackTimeoutMs =
260
+ typeof config.ackTimeoutMs === "number" && config.ackTimeoutMs > 0 ? config.ackTimeoutMs : ACK_TIMEOUT_MS;
233
261
  const headers = (url) => ({
234
262
  "content-type": "application/json",
235
263
  ...(config.hookSecret && isSameOrigin(url) ? { "x-hook-secret": config.hookSecret } : {}),
@@ -324,7 +352,23 @@ export function mountDeliveryGraphs(host, config = {}) {
324
352
  if (embedded && ev.source !== window.parent) return;
325
353
  const data = ev.data;
326
354
  if (!data || data.type !== DG_COMPOSE_FILL_MESSAGE || typeof data.graphJson !== "string") return;
327
- fillComposer(data.graphJson, { status: "Reused a saved graph \u2014 Preview or Stage it." });
355
+ const filled = fillComposer(data.graphJson, { status: "Reused a saved graph \u2014 Preview or Stage it." });
356
+ // ACK the fill back to the producer (issue #645): the Library shows "✓ Loaded…" ONLY on this ack,
357
+ // never optimistically. Post UP to the host, which nano-ide #518 relays across to the Library
358
+ // sibling App-View; echo the correlation `token` so a stale ack from a prior Reuse can't complete a
359
+ // newer one. Only when actually embedded (there is a parent to relay through) and only when the fill
360
+ // truly happened — a blank/bad payload earns no ack.
361
+ if (
362
+ filled &&
363
+ embedded &&
364
+ window.parent &&
365
+ typeof window.parent.postMessage === "function"
366
+ ) {
367
+ window.parent.postMessage(
368
+ { type: DG_COMPOSE_FILL_ACK_MESSAGE, token: typeof data.token === "string" ? data.token : null },
369
+ window.location.origin,
370
+ );
371
+ }
328
372
  }
329
373
  if (typeof window !== "undefined" && typeof window.addEventListener === "function") {
330
374
  window.addEventListener("message", onFillMessage);
@@ -446,6 +490,17 @@ export function mountDeliveryGraphs(host, config = {}) {
446
490
  // the path. Standalone (not embedded) there is no host explorer to drive, so we say so instead of
447
491
  // failing silently.
448
492
  const isEmbedded = typeof window !== "undefined" && window.parent && window.parent !== window;
493
+ // A single in-flight Preview→host handshake (issue #645). Posting nano-navigate is fire-to-host: the
494
+ // console does not synchronously confirm it navigated, so we must not claim success up front. We hold
495
+ // the pending target + its timeout timer here; a host ack for that target resolves it to "✓ Opened…",
496
+ // and the timeout resolves it to an honest "Couldn't reach the console explorer". A fresh Preview
497
+ // supersedes any pending one (its timer is cleared) so only the latest attempt is ever resolved.
498
+ const DEFINITION_PREVIEW_TARGET = "definitionPreview";
499
+ let pendingPreview = null;
500
+ function clearPendingPreview() {
501
+ if (pendingPreview && pendingPreview.timer) clearTimeout(pendingPreview.timer);
502
+ pendingPreview = null;
503
+ }
449
504
  function doPreviewDi() {
450
505
  if (lastBpmn.trim() === "") {
451
506
  setStatus("Preview a graph first — the laid-out BPMN comes from the preview.", "err");
@@ -455,11 +510,40 @@ export function mountDeliveryGraphs(host, config = {}) {
455
510
  setStatus("Open this page inside the console cockpit to preview the generated DI.", "err");
456
511
  return;
457
512
  }
513
+ clearPendingPreview();
458
514
  window.parent.postMessage(
459
515
  { type: "nano-navigate", target: "definitionPreview", params: { xml: lastBpmn } },
460
516
  window.location.origin,
461
517
  );
462
- setStatus("\u2713 Opening the generated DI in the process explorer…", "ok");
518
+ // NEUTRAL in-progress status (no "✓") the success is only earned on the host ack below (#645).
519
+ setStatus("Opening the generated DI in the process explorer…", "");
520
+ const timer = setTimeout(() => {
521
+ if (!pendingPreview || pendingPreview.target !== DEFINITION_PREVIEW_TARGET) return;
522
+ pendingPreview = null;
523
+ setStatus("Couldn't reach the console explorer — is this page open inside the console?", "err");
524
+ }, ackTimeoutMs);
525
+ pendingPreview = { target: DEFINITION_PREVIEW_TARGET, timer };
526
+ }
527
+ // The host's acknowledgment of a Preview nano-navigate (#645): a same-origin `nano-navigate-ack` from
528
+ // the parent (the console) for the target we're awaiting resolves the pending Preview to success. A
529
+ // foreign origin, a non-parent source, or an ack for a different/absent target is ignored — an
530
+ // unrelated page can't forge a success toast.
531
+ function onNavAck(ev) {
532
+ if (!ev || typeof window === "undefined") return;
533
+ if (ev.origin !== window.location.origin) return;
534
+ if (ev.source !== window.parent) return;
535
+ const data = ev.data;
536
+ if (!data || data.type !== NANO_NAVIGATE_ACK_MESSAGE) return;
537
+ // Require a string `target` that exactly matches the pending preview. A target-less (or
538
+ // mismatched) ack must NOT resolve the Preview — otherwise any same-origin parent ack could
539
+ // forge a "✓ Opened…" toast the target never actually rendered (#645).
540
+ if (!pendingPreview || typeof data.target !== "string" || data.target !== pendingPreview.target)
541
+ return;
542
+ clearPendingPreview();
543
+ setStatus("\u2713 Opened the generated DI in the process explorer.", "ok");
544
+ }
545
+ if (isEmbedded && typeof window !== "undefined" && typeof window.addEventListener === "function") {
546
+ window.addEventListener("message", onNavAck);
463
547
  }
464
548
  outputEl.addEventListener("click", (ev) => {
465
549
  const btn = ev.target && ev.target.closest ? ev.target.closest("[data-preview-di]") : null;
@@ -469,8 +553,10 @@ export function mountDeliveryGraphs(host, config = {}) {
469
553
  });
470
554
 
471
555
  return () => {
556
+ clearPendingPreview();
472
557
  if (typeof window !== "undefined" && typeof window.removeEventListener === "function") {
473
558
  window.removeEventListener("message", onFillMessage);
559
+ window.removeEventListener("message", onNavAck);
474
560
  }
475
561
  root.innerHTML = "";
476
562
  };
@@ -13,6 +13,9 @@
13
13
  <nano:extend name="featureKey" type="string" />
14
14
  <nano:extend name="question" type="string" optional="true" />
15
15
  </nano:shape>
16
+ <nano:shape id="RecordFeatureImplementingIn" name="Record feature implementing — input">
17
+ <nano:extend name="featureKey" type="string" />
18
+ </nano:shape>
16
19
  <nano:shape id="ConvergeFeatureIn" name="Converge feature PR — input">
17
20
  <nano:extend name="featureKey" type="string" />
18
21
  <nano:extend name="prKey" type="string" optional="true" />
@@ -183,9 +186,19 @@
183
186
  <zeebe:output source="=if (is defined(transcriptUrl)) then transcriptUrl else null" target="transcriptUrl" />
184
187
  </zeebe:ioMapping>
185
188
  </bpmn:extensionElements>
189
+ <bpmn:incoming>f_implementing</bpmn:incoming>
190
+ <bpmn:outgoing>w_toGw</bpmn:outgoing>
191
+ </bpmn:serviceTask>
192
+ <bpmn:serviceTask id="record-feature-implementing" name="Record implementing">
193
+ <bpmn:extensionElements>
194
+ <zeebe:taskDefinition type="pr.record-feature-implementing" />
195
+ <zeebe:properties>
196
+ <zeebe:property name="io.nanobpm.dataEnvelope.in" value="RecordFeatureImplementingIn" />
197
+ </zeebe:properties>
198
+ </bpmn:extensionElements>
186
199
  <bpmn:incoming>f_toImplement</bpmn:incoming>
187
200
  <bpmn:incoming>w_answerLoop</bpmn:incoming>
188
- <bpmn:outgoing>w_toGw</bpmn:outgoing>
201
+ <bpmn:outgoing>f_implementing</bpmn:outgoing>
189
202
  </bpmn:serviceTask>
190
203
  <bpmn:exclusiveGateway id="w_gw" name="escalated?" default="w_done">
191
204
  <bpmn:incoming>w_toGw</bpmn:incoming>
@@ -287,7 +300,8 @@
287
300
  </bpmn:sequenceFlow>
288
301
  <bpmn:sequenceFlow id="f_readiness_skip" name="no gate" sourceRef="gw-readiness" targetRef="ensure-base-branch" />
289
302
  <bpmn:sequenceFlow id="f_readiness_done" sourceRef="readiness-preflight" targetRef="ensure-base-branch" />
290
- <bpmn:sequenceFlow id="f_toImplement" sourceRef="ensure-base-branch" targetRef="implement-task" />
303
+ <bpmn:sequenceFlow id="f_toImplement" sourceRef="ensure-base-branch" targetRef="record-feature-implementing" />
304
+ <bpmn:sequenceFlow id="f_implementing" sourceRef="record-feature-implementing" targetRef="implement-task" />
291
305
  <bpmn:sequenceFlow id="w_toGw" sourceRef="implement-task" targetRef="w_gw" />
292
306
  <bpmn:sequenceFlow id="w_escalate" name="escalated" sourceRef="w_gw" targetRef="record-feature-escalation">
293
307
  <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=status = "escalated" and question != null and trim(question) != ""</bpmn:conditionExpression>
@@ -295,7 +309,7 @@
295
309
  <bpmn:sequenceFlow id="w_toEscalationTask" sourceRef="record-feature-escalation" targetRef="feature-escalation" />
296
310
  <bpmn:sequenceFlow id="w_done" name="done" sourceRef="w_gw" targetRef="record-feature" />
297
311
  <bpmn:sequenceFlow id="w_toAnswerGw" sourceRef="feature-escalation" targetRef="w_gw_answer" />
298
- <bpmn:sequenceFlow id="w_answerLoop" name="answer" sourceRef="w_gw_answer" targetRef="implement-task">
312
+ <bpmn:sequenceFlow id="w_answerLoop" name="answer" sourceRef="w_gw_answer" targetRef="record-feature-implementing">
299
313
  <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=resolution = "answer"</bpmn:conditionExpression>
300
314
  </bpmn:sequenceFlow>
301
315
  <bpmn:sequenceFlow id="w_abandon" name="abandon" sourceRef="w_gw_answer" targetRef="record-feature" />
@@ -334,60 +348,63 @@
334
348
  <dc:Bounds x="566" y="80" width="100" height="80" />
335
349
  </bpmndi:BPMNShape>
336
350
  <bpmndi:BPMNShape id="BPMNShape_implement-task" bpmnElement="implement-task">
351
+ <dc:Bounds x="966" y="80" width="100" height="80" />
352
+ </bpmndi:BPMNShape>
353
+ <bpmndi:BPMNShape id="BPMNShape_record-feature-implementing" bpmnElement="record-feature-implementing">
337
354
  <dc:Bounds x="766" y="80" width="100" height="80" />
338
355
  </bpmndi:BPMNShape>
339
356
  <bpmndi:BPMNShape id="BPMNShape_w_gw" bpmnElement="w_gw" isMarkerVisible="true">
340
- <dc:Bounds x="966" y="95" width="50" height="50" />
357
+ <dc:Bounds x="1166" y="95" width="50" height="50" />
341
358
  <bpmndi:BPMNLabel>
342
- <dc:Bounds x="954" y="76" width="74" height="14" />
359
+ <dc:Bounds x="1154" y="76" width="74" height="14" />
343
360
  </bpmndi:BPMNLabel>
344
361
  </bpmndi:BPMNShape>
345
362
  <bpmndi:BPMNShape id="BPMNShape_record-feature-escalation" bpmnElement="record-feature-escalation">
346
- <dc:Bounds x="1116" y="240" width="100" height="80" />
363
+ <dc:Bounds x="1316" y="240" width="100" height="80" />
347
364
  </bpmndi:BPMNShape>
348
365
  <bpmndi:BPMNShape id="BPMNShape_feature-escalation" bpmnElement="feature-escalation">
349
- <dc:Bounds x="1316" y="240" width="100" height="80" />
366
+ <dc:Bounds x="1516" y="240" width="100" height="80" />
350
367
  </bpmndi:BPMNShape>
351
368
  <bpmndi:BPMNShape id="BPMNShape_w_gw_answer" bpmnElement="w_gw_answer" isMarkerVisible="true">
352
- <dc:Bounds x="1516" y="255" width="50" height="50" />
369
+ <dc:Bounds x="1716" y="255" width="50" height="50" />
353
370
  <bpmndi:BPMNLabel>
354
- <dc:Bounds x="1513" y="236" width="56" height="14" />
371
+ <dc:Bounds x="1713" y="236" width="56" height="14" />
355
372
  </bpmndi:BPMNLabel>
356
373
  </bpmndi:BPMNShape>
357
374
  <bpmndi:BPMNShape id="BPMNShape_record-feature" bpmnElement="record-feature">
358
- <dc:Bounds x="1666" y="80" width="100" height="80" />
375
+ <dc:Bounds x="1866" y="80" width="100" height="80" />
359
376
  </bpmndi:BPMNShape>
360
377
  <bpmndi:BPMNShape id="BPMNShape_gw-blocked" bpmnElement="gw-blocked" isMarkerVisible="true">
361
- <dc:Bounds x="1866" y="95" width="50" height="50" />
378
+ <dc:Bounds x="2066" y="95" width="50" height="50" />
362
379
  <bpmndi:BPMNLabel>
363
- <dc:Bounds x="1861" y="76" width="60" height="14" />
380
+ <dc:Bounds x="2061" y="76" width="60" height="14" />
364
381
  </bpmndi:BPMNLabel>
365
382
  </bpmndi:BPMNShape>
366
383
  <bpmndi:BPMNShape id="BPMNShape_feature-blocked" bpmnElement="feature-blocked">
367
- <dc:Bounds x="2016" y="400" width="100" height="80" />
384
+ <dc:Bounds x="2216" y="400" width="100" height="80" />
368
385
  </bpmndi:BPMNShape>
369
386
  <bpmndi:BPMNShape id="BPMNShape_record-blocked-ack" bpmnElement="record-blocked-ack">
370
- <dc:Bounds x="2216" y="400" width="100" height="80" />
387
+ <dc:Bounds x="2416" y="400" width="100" height="80" />
371
388
  </bpmndi:BPMNShape>
372
389
  <bpmndi:BPMNShape id="BPMNShape_gw-converge" bpmnElement="gw-converge" isMarkerVisible="true">
373
- <dc:Bounds x="2041" y="95" width="50" height="50" />
390
+ <dc:Bounds x="2241" y="95" width="50" height="50" />
374
391
  <bpmndi:BPMNLabel>
375
- <dc:Bounds x="2033" y="76" width="67" height="14" />
392
+ <dc:Bounds x="2233" y="76" width="67" height="14" />
376
393
  </bpmndi:BPMNLabel>
377
394
  </bpmndi:BPMNShape>
378
395
  <bpmndi:BPMNShape id="BPMNShape_converge" bpmnElement="converge">
379
- <dc:Bounds x="2216" y="240" width="100" height="80" />
396
+ <dc:Bounds x="2416" y="240" width="100" height="80" />
380
397
  </bpmndi:BPMNShape>
381
398
  <bpmndi:BPMNShape id="BPMNShape_End" bpmnElement="End">
382
- <dc:Bounds x="2416" y="102" width="36" height="36" />
399
+ <dc:Bounds x="2616" y="102" width="36" height="36" />
383
400
  <bpmndi:BPMNLabel>
384
- <dc:Bounds x="2417" y="83" width="34" height="14" />
401
+ <dc:Bounds x="2617" y="83" width="34" height="14" />
385
402
  </bpmndi:BPMNLabel>
386
403
  </bpmndi:BPMNShape>
387
404
  <bpmndi:BPMNShape id="BPMNShape_be_feature_sla" bpmnElement="be_feature_sla">
388
- <dc:Bounds x="1348" y="302" width="36" height="36" />
405
+ <dc:Bounds x="1548" y="302" width="36" height="36" />
389
406
  <bpmndi:BPMNLabel>
390
- <dc:Bounds x="1324" y="383" width="84" height="14" />
407
+ <dc:Bounds x="1524" y="383" width="84" height="14" />
391
408
  </bpmndi:BPMNLabel>
392
409
  </bpmndi:BPMNShape>
393
410
  <bpmndi:BPMNEdge id="BPMNEdge_f_toReadinessGw" bpmnElement="f_toReadinessGw">
@@ -405,41 +422,45 @@
405
422
  <di:waypoint x="666" y="120" />
406
423
  <di:waypoint x="766" y="120" />
407
424
  </bpmndi:BPMNEdge>
408
- <bpmndi:BPMNEdge id="BPMNEdge_w_toGw" bpmnElement="w_toGw">
425
+ <bpmndi:BPMNEdge id="BPMNEdge_f_implementing" bpmnElement="f_implementing">
409
426
  <di:waypoint x="866" y="120" />
410
427
  <di:waypoint x="966" y="120" />
411
428
  </bpmndi:BPMNEdge>
429
+ <bpmndi:BPMNEdge id="BPMNEdge_w_toGw" bpmnElement="w_toGw">
430
+ <di:waypoint x="1066" y="120" />
431
+ <di:waypoint x="1166" y="120" />
432
+ </bpmndi:BPMNEdge>
412
433
  <bpmndi:BPMNEdge id="BPMNEdge_w_done" bpmnElement="w_done">
413
- <di:waypoint x="1016" y="120" />
414
- <di:waypoint x="1666" y="120" />
434
+ <di:waypoint x="1216" y="120" />
435
+ <di:waypoint x="1866" y="120" />
415
436
  <bpmndi:BPMNLabel>
416
- <dc:Bounds x="1325" y="98" width="32" height="14" />
437
+ <dc:Bounds x="1525" y="98" width="32" height="14" />
417
438
  </bpmndi:BPMNLabel>
418
439
  </bpmndi:BPMNEdge>
419
440
  <bpmndi:BPMNEdge id="BPMNEdge_f_toBlockedGw" bpmnElement="f_toBlockedGw">
420
- <di:waypoint x="1766" y="120" />
421
- <di:waypoint x="1866" y="120" />
441
+ <di:waypoint x="1966" y="120" />
442
+ <di:waypoint x="2066" y="120" />
422
443
  </bpmndi:BPMNEdge>
423
444
  <bpmndi:BPMNEdge id="BPMNEdge_f_notBlocked" bpmnElement="f_notBlocked">
424
- <di:waypoint x="1916" y="120" />
425
- <di:waypoint x="2041" y="120" />
445
+ <di:waypoint x="2116" y="120" />
446
+ <di:waypoint x="2241" y="120" />
426
447
  <bpmndi:BPMNLabel>
427
- <dc:Bounds x="1940" y="98" width="78" height="14" />
448
+ <dc:Bounds x="2140" y="98" width="78" height="14" />
428
449
  </bpmndi:BPMNLabel>
429
450
  </bpmndi:BPMNEdge>
430
451
  <bpmndi:BPMNEdge id="BPMNEdge_f_noConverge" bpmnElement="f_noConverge">
431
- <di:waypoint x="2091" y="120" />
432
- <di:waypoint x="2416" y="120" />
452
+ <di:waypoint x="2291" y="120" />
453
+ <di:waypoint x="2616" y="120" />
433
454
  <bpmndi:BPMNLabel>
434
- <dc:Bounds x="2218" y="98" width="71" height="14" />
455
+ <dc:Bounds x="2418" y="98" width="71" height="14" />
435
456
  </bpmndi:BPMNLabel>
436
457
  </bpmndi:BPMNEdge>
437
458
  <bpmndi:BPMNEdge id="BPMNEdge_w_abandon" bpmnElement="w_abandon">
438
- <di:waypoint x="1566" y="280" />
439
- <di:waypoint x="1716" y="280" />
440
- <di:waypoint x="1716" y="160" />
459
+ <di:waypoint x="1766" y="280" />
460
+ <di:waypoint x="1916" y="280" />
461
+ <di:waypoint x="1916" y="160" />
441
462
  <bpmndi:BPMNLabel>
442
- <dc:Bounds x="1615" y="258" width="53" height="14" />
463
+ <dc:Bounds x="1815" y="258" width="53" height="14" />
443
464
  </bpmndi:BPMNLabel>
444
465
  </bpmndi:BPMNEdge>
445
466
  <bpmndi:BPMNEdge id="BPMNEdge_f_readiness_gate" bpmnElement="f_readiness_gate">
@@ -451,27 +472,27 @@
451
472
  </bpmndi:BPMNLabel>
452
473
  </bpmndi:BPMNEdge>
453
474
  <bpmndi:BPMNEdge id="BPMNEdge_w_escalate" bpmnElement="w_escalate">
454
- <di:waypoint x="991" y="145" />
455
- <di:waypoint x="991" y="280" />
456
- <di:waypoint x="1116" y="280" />
475
+ <di:waypoint x="1191" y="145" />
476
+ <di:waypoint x="1191" y="280" />
477
+ <di:waypoint x="1316" y="280" />
457
478
  <bpmndi:BPMNLabel>
458
- <dc:Bounds x="996" y="206" width="67" height="14" />
479
+ <dc:Bounds x="1196" y="206" width="67" height="14" />
459
480
  </bpmndi:BPMNLabel>
460
481
  </bpmndi:BPMNEdge>
461
482
  <bpmndi:BPMNEdge id="BPMNEdge_f_blocked" bpmnElement="f_blocked">
462
- <di:waypoint x="1891" y="145" />
463
- <di:waypoint x="1891" y="440" />
464
- <di:waypoint x="2016" y="440" />
483
+ <di:waypoint x="2091" y="145" />
484
+ <di:waypoint x="2091" y="440" />
485
+ <di:waypoint x="2216" y="440" />
465
486
  <bpmndi:BPMNLabel>
466
- <dc:Bounds x="1896" y="286" width="53" height="14" />
487
+ <dc:Bounds x="2096" y="286" width="53" height="14" />
467
488
  </bpmndi:BPMNLabel>
468
489
  </bpmndi:BPMNEdge>
469
490
  <bpmndi:BPMNEdge id="BPMNEdge_f_converge" bpmnElement="f_converge">
470
- <di:waypoint x="2066" y="145" />
471
- <di:waypoint x="2066" y="280" />
472
- <di:waypoint x="2216" y="280" />
491
+ <di:waypoint x="2266" y="145" />
492
+ <di:waypoint x="2266" y="280" />
493
+ <di:waypoint x="2416" y="280" />
473
494
  <bpmndi:BPMNLabel>
474
- <dc:Bounds x="2071" y="206" width="60" height="14" />
495
+ <dc:Bounds x="2271" y="206" width="60" height="14" />
475
496
  </bpmndi:BPMNLabel>
476
497
  </bpmndi:BPMNEdge>
477
498
  <bpmndi:BPMNEdge id="BPMNEdge_f_readiness_done" bpmnElement="f_readiness_done">
@@ -480,43 +501,43 @@
480
501
  <di:waypoint x="616" y="160" />
481
502
  </bpmndi:BPMNEdge>
482
503
  <bpmndi:BPMNEdge id="BPMNEdge_w_toEscalationTask" bpmnElement="w_toEscalationTask">
483
- <di:waypoint x="1216" y="280" />
484
- <di:waypoint x="1316" y="280" />
485
- </bpmndi:BPMNEdge>
486
- <bpmndi:BPMNEdge id="BPMNEdge_w_toAnswerGw" bpmnElement="w_toAnswerGw">
487
504
  <di:waypoint x="1416" y="280" />
488
505
  <di:waypoint x="1516" y="280" />
489
506
  </bpmndi:BPMNEdge>
507
+ <bpmndi:BPMNEdge id="BPMNEdge_w_toAnswerGw" bpmnElement="w_toAnswerGw">
508
+ <di:waypoint x="1616" y="280" />
509
+ <di:waypoint x="1716" y="280" />
510
+ </bpmndi:BPMNEdge>
490
511
  <bpmndi:BPMNEdge id="BPMNEdge_f_toBlockedAck" bpmnElement="f_toBlockedAck">
491
- <di:waypoint x="2116" y="440" />
492
- <di:waypoint x="2216" y="440" />
512
+ <di:waypoint x="2316" y="440" />
513
+ <di:waypoint x="2416" y="440" />
493
514
  </bpmndi:BPMNEdge>
494
515
  <bpmndi:BPMNEdge id="BPMNEdge_f_blockedEnd" bpmnElement="f_blockedEnd">
495
- <di:waypoint x="2316" y="440" />
496
- <di:waypoint x="2434" y="440" />
497
- <di:waypoint x="2434" y="138" />
516
+ <di:waypoint x="2516" y="440" />
517
+ <di:waypoint x="2634" y="440" />
518
+ <di:waypoint x="2634" y="138" />
498
519
  </bpmndi:BPMNEdge>
499
520
  <bpmndi:BPMNEdge id="BPMNEdge_f_toEndConverged" bpmnElement="f_toEndConverged">
500
- <di:waypoint x="2316" y="280" />
501
- <di:waypoint x="2434" y="280" />
502
- <di:waypoint x="2434" y="138" />
521
+ <di:waypoint x="2516" y="280" />
522
+ <di:waypoint x="2634" y="280" />
523
+ <di:waypoint x="2634" y="138" />
503
524
  </bpmndi:BPMNEdge>
504
525
  <bpmndi:BPMNEdge id="BPMNEdge_w_sla" bpmnElement="w_sla">
505
- <di:waypoint x="1366" y="338" />
506
- <di:waypoint x="1366" y="358" />
507
- <di:waypoint x="1716" y="358" />
508
- <di:waypoint x="1716" y="160" />
526
+ <di:waypoint x="1566" y="338" />
527
+ <di:waypoint x="1566" y="358" />
528
+ <di:waypoint x="1916" y="358" />
529
+ <di:waypoint x="1916" y="160" />
509
530
  <bpmndi:BPMNLabel>
510
- <dc:Bounds x="1557" y="325" width="88" height="28" />
531
+ <dc:Bounds x="1757" y="325" width="88" height="28" />
511
532
  </bpmndi:BPMNLabel>
512
533
  </bpmndi:BPMNEdge>
513
534
  <bpmndi:BPMNEdge id="BPMNEdge_w_answerLoop" bpmnElement="w_answerLoop">
514
- <di:waypoint x="1541" y="305" />
515
- <di:waypoint x="1541" y="360" />
535
+ <di:waypoint x="1741" y="305" />
536
+ <di:waypoint x="1741" y="360" />
516
537
  <di:waypoint x="816" y="360" />
517
538
  <di:waypoint x="816" y="160" />
518
539
  <bpmndi:BPMNLabel>
519
- <dc:Bounds x="1154" y="338" width="49" height="14" />
540
+ <dc:Bounds x="1254" y="338" width="49" height="14" />
520
541
  </bpmndi:BPMNLabel>
521
542
  </bpmndi:BPMNEdge>
522
543
  </bpmndi:BPMNPlane>