@moxt-ai/mobius 0.0.154 → 0.0.155

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/dist/runtime.js CHANGED
@@ -20741,16 +20741,8 @@ function decodeSessionQueuedEvent(encoded) {
20741
20741
  function decodeRuntimeLivenessReadyEvent(encoded) {
20742
20742
  const value = parseJson2(encoded);
20743
20743
  assertKind(value, RUNTIME_LIVENESS_READY_KIND);
20744
- if (value["sessionEventDelivery"] === void 0) {
20745
- assertExactKeys(value, ["kind"]);
20746
- return { kind: RUNTIME_LIVENESS_READY_KIND };
20747
- }
20748
- assertExactKeys(value, ["kind", "sessionEventDelivery"]);
20749
- const sessionEventDelivery = readString(value, "sessionEventDelivery", 32);
20750
- if (sessionEventDelivery !== "reliable-v1") {
20751
- throw new ProtocolMessageError("Unsupported Session event delivery mode");
20752
- }
20753
- return { kind: RUNTIME_LIVENESS_READY_KIND, sessionEventDelivery };
20744
+ assertExactKeys(value, ["kind"]);
20745
+ return { kind: RUNTIME_LIVENESS_READY_KIND };
20754
20746
  }
20755
20747
  function decodeRuntimeHeartbeatEvent(encoded) {
20756
20748
  const value = parseJson2(encoded);
@@ -21217,60 +21209,13 @@ var encodeNativeSessionCancel = (value) => JSON.stringify(nativeSessionCancelSch
21217
21209
 
21218
21210
  // ../protocol/src/session-events.ts
21219
21211
  var SESSION_EVENT_KIND = "session.event";
21220
- var SESSION_EVENT_ACK_KIND = "session.event.ack";
21221
- var SESSION_EVENT_DEFERRED_KIND = "session.event.deferred";
21222
- var SESSION_EVENT_REJECTED_KIND = "session.event.rejected";
21223
21212
  var SESSION_FORKED_KIND = "session.forked";
21224
- var SessionEventRejectionCode = {
21225
- IdempotencyConflict: "idempotency_conflict",
21226
- InvalidEvent: "invalid_event",
21227
- RecordingRejected: "recording_rejected"
21228
- };
21229
21213
  var MAX_RECORDED_EVENT_LENGTH = 8 * 1024 * 1024;
21230
- var ephemeralEventEnvelopeSchema = external_exports.strictObject({
21231
- kind: external_exports.literal(SESSION_EVENT_KIND),
21232
- payload: external_exports.string().min(2).max(MAX_RECORDED_EVENT_LENGTH),
21233
- sessionId: identifierStringSchema
21234
- }).readonly();
21235
- var reliableDeliverySchema = external_exports.strictObject({
21236
- eventId: identifierStringSchema,
21237
- kind: external_exports.literal("reliable"),
21238
- sourceSeq: external_exports.string().regex(/^(?:0|[1-9][0-9]*)$/u).max(40),
21239
- streamId: identifierStringSchema
21240
- }).readonly();
21241
- var reliableSessionEventEnvelopeSchema = external_exports.strictObject({
21242
- delivery: reliableDeliverySchema,
21214
+ var sessionEventEnvelopeSchema = external_exports.strictObject({
21243
21215
  kind: external_exports.literal(SESSION_EVENT_KIND),
21244
21216
  payload: external_exports.string().min(2).max(MAX_RECORDED_EVENT_LENGTH),
21245
21217
  sessionId: identifierStringSchema
21246
21218
  }).readonly();
21247
- var eventEnvelopeSchema = external_exports.union([ephemeralEventEnvelopeSchema, reliableSessionEventEnvelopeSchema]).readonly();
21248
- var acknowledgementOutcomeSchema = external_exports.discriminatedUnion("kind", [
21249
- external_exports.strictObject({ kind: external_exports.literal("relayed") }).readonly(),
21250
- external_exports.strictObject({
21251
- kind: external_exports.literal("recorded"),
21252
- providerId: identifierStringSchema,
21253
- recordingEpoch: identifierStringSchema
21254
- }).readonly()
21255
- ]);
21256
- var eventAcknowledgementSchema = external_exports.strictObject({
21257
- eventId: identifierStringSchema,
21258
- kind: external_exports.literal(SESSION_EVENT_ACK_KIND),
21259
- outcome: acknowledgementOutcomeSchema,
21260
- sessionId: identifierStringSchema
21261
- }).readonly();
21262
- var eventDeferredSchema = external_exports.strictObject({
21263
- eventId: identifierStringSchema,
21264
- kind: external_exports.literal(SESSION_EVENT_DEFERRED_KIND),
21265
- retryAfterMilliseconds: external_exports.number().int().min(100).max(6e4),
21266
- sessionId: identifierStringSchema
21267
- }).readonly();
21268
- var eventRejectedSchema = external_exports.strictObject({
21269
- code: external_exports.enum(SessionEventRejectionCode),
21270
- eventId: identifierStringSchema,
21271
- kind: external_exports.literal(SESSION_EVENT_REJECTED_KIND),
21272
- sessionId: identifierStringSchema
21273
- }).readonly();
21274
21219
  var SESSION_QUEUE_CHANGED_KIND = "session.queue.changed";
21275
21220
  var sessionQueueChangedSchema = external_exports.strictObject({ kind: external_exports.literal(SESSION_QUEUE_CHANGED_KIND), sessionId: identifierStringSchema }).readonly();
21276
21221
  var sessionForkedSchema = external_exports.strictObject({
@@ -21303,14 +21248,8 @@ var encode4 = (message, schema) => {
21303
21248
  }
21304
21249
  return JSON.stringify(decoded.data);
21305
21250
  };
21306
- var decodeSessionEventEnvelope = (encoded) => decode5(encoded, eventEnvelopeSchema);
21307
- var encodeSessionEventEnvelope = (message) => encode4(message, eventEnvelopeSchema);
21308
- var decodeSessionEventAcknowledgement = (encoded) => decode5(encoded, eventAcknowledgementSchema);
21309
- var encodeSessionEventAcknowledgement = (message) => encode4(message, eventAcknowledgementSchema);
21310
- var decodeSessionEventDeferred = (encoded) => decode5(encoded, eventDeferredSchema);
21311
- var encodeSessionEventDeferred = (message) => encode4(message, eventDeferredSchema);
21312
- var decodeSessionEventRejected = (encoded) => decode5(encoded, eventRejectedSchema);
21313
- var encodeSessionEventRejected = (message) => encode4(message, eventRejectedSchema);
21251
+ var decodeSessionEventEnvelope = (encoded) => decode5(encoded, sessionEventEnvelopeSchema);
21252
+ var encodeSessionEventEnvelope = (message) => encode4(message, sessionEventEnvelopeSchema);
21314
21253
  function decodeRecordedSessionEvent(encoded) {
21315
21254
  const kind = decodeMessageKind(encoded);
21316
21255
  switch (kind) {
@@ -21484,21 +21423,6 @@ var serviceToDaemonSignatures = {
21484
21423
  encodeSessionElicitationRespondCommand,
21485
21424
  decodeSessionElicitationRespondCommand
21486
21425
  ),
21487
- [SESSION_EVENT_ACK_KIND]: defineMessageSignature(
21488
- SESSION_EVENT_ACK_KIND,
21489
- encodeSessionEventAcknowledgement,
21490
- decodeSessionEventAcknowledgement
21491
- ),
21492
- [SESSION_EVENT_DEFERRED_KIND]: defineMessageSignature(
21493
- SESSION_EVENT_DEFERRED_KIND,
21494
- encodeSessionEventDeferred,
21495
- decodeSessionEventDeferred
21496
- ),
21497
- [SESSION_EVENT_REJECTED_KIND]: defineMessageSignature(
21498
- SESSION_EVENT_REJECTED_KIND,
21499
- encodeSessionEventRejected,
21500
- decodeSessionEventRejected
21501
- ),
21502
21426
  [SESSION_LIVE_HISTORY_LOAD_KIND]: defineMessageSignature(
21503
21427
  SESSION_LIVE_HISTORY_LOAD_KIND,
21504
21428
  encodeSessionLiveHistoryLoad,
@@ -26793,7 +26717,7 @@ function createDaemonConfig(connection, agents = [], installableAgents = [], loc
26793
26717
  }
26794
26718
 
26795
26719
  // src/run-daemon.ts
26796
- import { createHash as createHash5, randomUUID as randomUUID7 } from "node:crypto";
26720
+ import { createHash as createHash5, randomUUID as randomUUID6 } from "node:crypto";
26797
26721
  import { join as join17 } from "node:path";
26798
26722
  import { styleText } from "node:util";
26799
26723
 
@@ -42479,7 +42403,6 @@ async function runRelayConnection({
42479
42403
  }) {
42480
42404
  const relayUrl = new URL(config2.relayUrl);
42481
42405
  relayUrl.searchParams.set("liveness", "1");
42482
- relayUrl.searchParams.set("sessionEventDelivery", "reliable-v1");
42483
42406
  const socket = await connectRelay(relayUrl, signal);
42484
42407
  diagnostics.connectionOpened(connectionEpoch);
42485
42408
  const connectionController = new AbortController();
@@ -42599,10 +42522,7 @@ async function runRelayConnection({
42599
42522
  const message = decodeServiceToDaemonMessage(encoded);
42600
42523
  const kind = message.kind;
42601
42524
  if (kind === RUNTIME_LIVENESS_READY_KIND) {
42602
- publisher.connect(
42603
- socket,
42604
- message.sessionEventDelivery === "reliable-v1" ? "reliable" : "ephemeral"
42605
- );
42525
+ publisher.connect(socket);
42606
42526
  connectionLiveness.start();
42607
42527
  return;
42608
42528
  }
@@ -42610,18 +42530,6 @@ async function runRelayConnection({
42610
42530
  connectionLiveness.acknowledge(message);
42611
42531
  return;
42612
42532
  }
42613
- if (kind === SESSION_EVENT_ACK_KIND) {
42614
- publisher.acknowledge(message);
42615
- return;
42616
- }
42617
- if (kind === SESSION_EVENT_DEFERRED_KIND) {
42618
- publisher.defer(message);
42619
- return;
42620
- }
42621
- if (kind === SESSION_EVENT_REJECTED_KIND) {
42622
- publisher.reject(message);
42623
- return;
42624
- }
42625
42533
  commands.handle(message);
42626
42534
  } catch (error62) {
42627
42535
  console.error("Mobius daemon rejected a message", error62);
@@ -42648,233 +42556,42 @@ async function runRelayConnection({
42648
42556
 
42649
42557
  // src/relay-connection/session-event-publisher.ts
42650
42558
  import { WebSocket as WebSocket9 } from "undici";
42651
-
42652
- // src/relay-connection/session-event-queue.ts
42653
- import { randomUUID as randomUUID6 } from "node:crypto";
42654
- var STANDARD_EVENT_BYTES = 96 * 1024 * 1024;
42655
- var CRITICAL_EVENT_BYTES = 128 * 1024 * 1024;
42656
- var SessionEventQueueCapacityError = class extends Error {
42657
- code = "session_event_queue_full";
42658
- constructor() {
42659
- super("The in-memory Session event queue is full");
42660
- this.name = "SessionEventQueueCapacityError";
42661
- }
42662
- };
42663
- var SessionEventQueue = class {
42664
- #streamId = randomUUID6();
42665
- #events = /* @__PURE__ */ new Map();
42666
- #nextSourceSeq = 1;
42667
- #totalBytes = 0;
42668
- enqueueBatch = (sessionId, payloads, critical) => {
42669
- if (payloads.length < 1 || payloads.length > 32) {
42670
- throw new Error("A Session event batch must contain between 1 and 32 events");
42671
- }
42672
- if (!Number.isSafeInteger(this.#nextSourceSeq + payloads.length)) {
42673
- throw new Error("The Session event source sequence is exhausted");
42674
- }
42675
- const entries = payloads.map((payload, index) => {
42676
- const envelope2 = {
42677
- delivery: {
42678
- eventId: randomUUID6(),
42679
- kind: "reliable",
42680
- sourceSeq: (this.#nextSourceSeq + index).toString(),
42681
- streamId: this.#streamId
42682
- },
42683
- kind: SESSION_EVENT_KIND,
42684
- payload,
42685
- sessionId
42686
- };
42687
- return { envelope: envelope2, byteLength: Buffer.byteLength(encodeSessionEventEnvelope(envelope2), "utf8") };
42688
- });
42689
- const byteLength = entries.reduce((total, entry) => total + entry.byteLength, 0);
42690
- if (this.#totalBytes + byteLength > (critical ? CRITICAL_EVENT_BYTES : STANDARD_EVENT_BYTES)) {
42691
- throw new SessionEventQueueCapacityError();
42692
- }
42693
- for (const entry of entries) {
42694
- this.#events.set(entry.envelope.delivery.eventId, entry);
42695
- }
42696
- this.#nextSourceSeq += entries.length;
42697
- this.#totalBytes += byteLength;
42698
- };
42699
- pending = (limit, excludedEventIds) => {
42700
- const result = [];
42701
- for (const [eventId, entry] of this.#events) {
42702
- if (!excludedEventIds.has(eventId)) {
42703
- result.push(entry.envelope);
42704
- if (result.length === limit) {
42705
- break;
42706
- }
42707
- }
42708
- }
42709
- return result;
42710
- };
42711
- remove = (eventId, sessionId) => {
42712
- const entry = this.#events.get(eventId);
42713
- if (entry === void 0 || entry.envelope.sessionId !== sessionId) {
42714
- return false;
42715
- }
42716
- this.#events.delete(eventId);
42717
- this.#totalBytes -= entry.byteLength;
42718
- return true;
42719
- };
42720
- clear = () => {
42721
- this.#events.clear();
42722
- this.#totalBytes = 0;
42723
- };
42724
- };
42725
-
42726
- // src/relay-connection/session-event-publisher.ts
42727
- var SESSION_EVENT_REPLAY_WINDOW = 16;
42728
- var SESSION_EVENT_REPLAY_BYTE_LIMIT = 32 * 1024 * 1024;
42729
- function reservesSessionEventCapacity(event) {
42730
- if (event.kind === SESSION_COMPLETED_KIND || event.kind === SESSION_FAILED_KIND || event.kind === SESSION_FORKED_KIND || event.kind === SESSION_READY_KIND) {
42731
- return true;
42732
- }
42733
- return event.kind === AGENT_ACTIVITY_KIND && (event.activityType === "progress" || event.activityType === "reasoning") && (event.status === "completed" || event.status === "failed");
42734
- }
42559
+ var MAX_BUFFERED_BYTES = 32 * 1024 * 1024;
42735
42560
  var DaemonSessionEventPublisher = class {
42736
- #inFlight = /* @__PURE__ */ new Map();
42737
- #queue = new SessionEventQueue();
42738
- #reportedCapacityKinds = /* @__PURE__ */ new Set();
42739
- #timer;
42740
- #connection = { kind: "disconnected" };
42741
- #deferredReplay = null;
42742
- #inFlightBytes = 0;
42743
- constructor(timer) {
42744
- this.#timer = timer;
42745
- }
42746
- acknowledge = (acknowledgement) => {
42747
- if (!this.#queue.remove(acknowledgement.eventId, acknowledgement.sessionId)) {
42748
- return;
42749
- }
42750
- this.#removeInFlight(acknowledgement.eventId);
42751
- this.#publishNextBatch();
42752
- };
42753
- close = () => {
42754
- this.#deferredReplay?.cancel();
42755
- this.#deferredReplay = null;
42756
- this.#connection = { kind: "disconnected" };
42757
- this.#clearInFlight();
42758
- this.#queue.clear();
42759
- };
42760
- connect = (socket, delivery) => {
42761
- this.#connection = { delivery, kind: "connected", socket };
42762
- this.#clearInFlight();
42763
- this.#publishNextBatch();
42764
- };
42765
- defer = (deferred) => {
42766
- if (!this.#inFlight.has(deferred.eventId)) {
42767
- return;
42768
- }
42769
- this.#clearInFlight();
42770
- if (this.#deferredReplay !== null) {
42771
- return;
42772
- }
42773
- this.#deferredReplay = this.#timer.schedule(() => {
42774
- this.#deferredReplay = null;
42775
- this.#publishNextBatch();
42776
- }, deferred.retryAfterMilliseconds);
42561
+ #socket = null;
42562
+ connect = (socket) => {
42563
+ this.#socket = socket;
42777
42564
  };
42778
42565
  disconnect = (socket) => {
42779
- if (this.#connection.kind !== "connected" || this.#connection.socket !== socket) {
42780
- return;
42781
- }
42782
- this.#connection = { kind: "disconnected" };
42783
- this.#clearInFlight();
42784
- };
42785
- publish = (sessionId, event) => {
42786
- try {
42787
- this.#queue.enqueueBatch(
42788
- sessionId,
42789
- [encodeRecordedSessionEvent(event)],
42790
- reservesSessionEventCapacity(event)
42791
- );
42792
- } catch (error62) {
42793
- if (!(error62 instanceof SessionEventQueueCapacityError)) {
42794
- throw error62;
42795
- }
42796
- if (!this.#reportedCapacityKinds.has(event.kind)) {
42797
- this.#reportedCapacityKinds.add(event.kind);
42798
- console.warn(`Mobius daemon could not buffer "${event.kind}" because the Session event queue is full`);
42799
- }
42800
- return;
42801
- }
42802
- this.#publishNextBatch();
42803
- };
42804
- publishBatch = (sessionId, events) => {
42805
- const critical = events.some(reservesSessionEventCapacity);
42806
- this.#queue.enqueueBatch(sessionId, events.map(encodeRecordedSessionEvent), critical);
42807
- this.#publishNextBatch();
42808
- };
42809
- reject = (rejection) => {
42810
- if (!this.#queue.remove(rejection.eventId, rejection.sessionId)) {
42811
- return;
42566
+ if (this.#socket === socket) {
42567
+ this.#socket = null;
42812
42568
  }
42813
- this.#removeInFlight(rejection.eventId);
42814
- console.error(`Mobius Relay rejected Session event ${rejection.eventId} with code ${rejection.code}`);
42815
- this.#publishNextBatch();
42816
42569
  };
42817
- #clearInFlight = () => {
42818
- this.#inFlight.clear();
42819
- this.#inFlightBytes = 0;
42570
+ close = () => {
42571
+ this.#socket = null;
42820
42572
  };
42821
- #publishNextBatch = () => {
42822
- if (this.#deferredReplay !== null || this.#connection.kind !== "connected") {
42573
+ publish = (sessionId, event) => {
42574
+ const socket = this.#socket;
42575
+ if (socket === null || socket.readyState !== WebSocket9.OPEN) {
42823
42576
  return;
42824
42577
  }
42825
- while (this.#inFlight.size < SESSION_EVENT_REPLAY_WINDOW) {
42826
- const batch = this.#queue.pending(
42827
- SESSION_EVENT_REPLAY_WINDOW - this.#inFlight.size,
42828
- new Set(this.#inFlight.keys())
42829
- );
42830
- let sent = 0;
42831
- for (const envelope2 of batch) {
42832
- const encoded = encodeDaemonToServiceMessage(
42833
- this.#connection.delivery === "reliable" ? envelope2 : {
42834
- kind: envelope2.kind,
42835
- payload: envelope2.payload,
42836
- sessionId: envelope2.sessionId
42837
- }
42838
- );
42839
- const byteLength = Buffer.byteLength(encoded, "utf8");
42840
- if (this.#inFlightBytes + byteLength > SESSION_EVENT_REPLAY_BYTE_LIMIT) {
42841
- return;
42842
- }
42843
- if (!this.#send(encoded)) {
42844
- this.#clearInFlight();
42845
- return;
42846
- }
42847
- if (this.#connection.delivery === "ephemeral") {
42848
- this.#queue.remove(envelope2.delivery.eventId, envelope2.sessionId);
42849
- sent += 1;
42850
- continue;
42851
- }
42852
- this.#inFlight.set(envelope2.delivery.eventId, { byteLength });
42853
- this.#inFlightBytes += byteLength;
42854
- sent += 1;
42855
- }
42856
- if (sent === 0) {
42857
- return;
42858
- }
42859
- }
42860
- };
42861
- #removeInFlight = (eventId) => {
42862
- const inFlight = this.#inFlight.get(eventId);
42863
- if (inFlight === void 0) {
42578
+ const encoded = encodeDaemonToServiceMessage({
42579
+ kind: SESSION_EVENT_KIND,
42580
+ payload: encodeRecordedSessionEvent(event),
42581
+ sessionId
42582
+ });
42583
+ if (socket.bufferedAmount + Buffer.byteLength(encoded, "utf8") > MAX_BUFFERED_BYTES) {
42584
+ socket.close(1013, "Live event transport overloaded");
42864
42585
  return;
42865
42586
  }
42866
- this.#inFlight.delete(eventId);
42867
- this.#inFlightBytes -= inFlight.byteLength;
42868
- };
42869
- #send = (encoded) => {
42870
- if (this.#connection.kind !== "connected" || this.#connection.socket.readyState !== WebSocket9.OPEN) {
42871
- return false;
42872
- }
42873
42587
  try {
42874
- this.#connection.socket.send(encoded);
42875
- return true;
42588
+ socket.send(encoded);
42876
42589
  } catch {
42877
- return false;
42590
+ }
42591
+ };
42592
+ publishBatch = (sessionId, events) => {
42593
+ for (const event of events) {
42594
+ this.publish(sessionId, event);
42878
42595
  }
42879
42596
  };
42880
42597
  };
@@ -42936,7 +42653,7 @@ async function installDetectedAgentIntegrations(config2, installations, signal)
42936
42653
  {
42937
42654
  agentId: agent.id,
42938
42655
  kind: AGENT_INSTALL_REQUEST_KIND,
42939
- requestId: `automatic-integration-${randomUUID7()}`
42656
+ requestId: `automatic-integration-${randomUUID6()}`
42940
42657
  },
42941
42658
  signal
42942
42659
  );
@@ -42958,7 +42675,7 @@ async function runDaemon(config2, audit, signal, timer = systemDaemonTimer, opti
42958
42675
  join17(stateDirectory, "sessions", `${createHash5("sha256").update(config2.channelId).digest("hex")}.sqlite`)
42959
42676
  );
42960
42677
  const operations = new DaemonOperationState();
42961
- const publisher = new DaemonSessionEventPublisher(timer);
42678
+ const publisher = new DaemonSessionEventPublisher();
42962
42679
  const activeTurns = new DaemonTurnRegistry(operations);
42963
42680
  const recordSessionEvent = (sessionId, event) => {
42964
42681
  publisher.publish(sessionId, activeTurns.recordEvent(event));
@@ -43150,7 +42867,7 @@ import { basename as basename7, resolve as resolve7 } from "node:path";
43150
42867
  import { fetch as fetch4 } from "undici";
43151
42868
 
43152
42869
  // src/storage/runtime-installation-store.ts
43153
- import { createHash as createHash6, randomUUID as randomUUID8 } from "node:crypto";
42870
+ import { createHash as createHash6, randomUUID as randomUUID7 } from "node:crypto";
43154
42871
  import { mkdir as mkdir4, open as open5, readdir as readdir3, rename as rename3, unlink, writeFile as writeFile3 } from "node:fs/promises";
43155
42872
  import { dirname as dirname5, join as join18, resolve as resolve6 } from "node:path";
43156
42873
  var APPLICATION_ID_PATTERN = /^[a-z][a-z0-9]*(?:[.-][a-z0-9]+){1,31}$/;
@@ -43280,10 +42997,10 @@ function parseRelayOrigin(value) {
43280
42997
  return origin;
43281
42998
  }
43282
42999
  function connectionId() {
43283
- return `mcn_${randomUUID8().replaceAll("-", "")}`;
43000
+ return `mcn_${randomUUID7().replaceAll("-", "")}`;
43284
43001
  }
43285
43002
  function installationId() {
43286
- return `min_${randomUUID8().replaceAll("-", "")}`;
43003
+ return `min_${randomUUID7().replaceAll("-", "")}`;
43287
43004
  }
43288
43005
  function channelIndexFileName(channelId) {
43289
43006
  return `mci_${createHash6("sha256").update(channelId).digest("hex")}.json`;
@@ -43395,7 +43112,7 @@ async function readJsonFile(path2, signal, missingCode) {
43395
43112
  async function writeJsonAtomically(path2, value, signal) {
43396
43113
  signal.throwIfAborted();
43397
43114
  const directory = dirname5(path2);
43398
- const temporaryPath = join18(directory, `.${randomUUID8()}.tmp`);
43115
+ const temporaryPath = join18(directory, `.${randomUUID7()}.tmp`);
43399
43116
  try {
43400
43117
  await mkdir4(directory, { mode: 448, recursive: true });
43401
43118
  signal.throwIfAborted();