@moxt-ai/mobius 0.0.177 → 0.0.179

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/acp/agent-connection.d.ts +1 -3
  2. package/dist/acp/agent-connection.d.ts.map +1 -1
  3. package/dist/acp/agent-connection.js +3 -4
  4. package/dist/acp/agent-connection.js.map +1 -1
  5. package/dist/acp/agent-runtime-manager.d.ts.map +1 -1
  6. package/dist/acp/agent-runtime-manager.js +1 -8
  7. package/dist/acp/agent-runtime-manager.js.map +1 -1
  8. package/dist/acp/agent-session.d.ts +1 -2
  9. package/dist/acp/agent-session.d.ts.map +1 -1
  10. package/dist/acp/agent-session.js +6 -12
  11. package/dist/acp/agent-session.js.map +1 -1
  12. package/dist/acp/codex/agent.d.ts.map +1 -1
  13. package/dist/acp/codex/agent.js +1 -1
  14. package/dist/acp/codex/agent.js.map +1 -1
  15. package/dist/acp/codex/app-server-protocol.d.ts +11 -0
  16. package/dist/acp/codex/app-server-protocol.d.ts.map +1 -1
  17. package/dist/acp/codex/app-server-protocol.js +16 -0
  18. package/dist/acp/codex/app-server-protocol.js.map +1 -1
  19. package/dist/acp/codex/items.d.ts.map +1 -1
  20. package/dist/acp/codex/items.js +23 -0
  21. package/dist/acp/codex/items.js.map +1 -1
  22. package/dist/cli.js +100 -26
  23. package/dist/cli.js.map +2 -2
  24. package/dist/index.js +99 -25
  25. package/dist/index.js.map +2 -2
  26. package/dist/relay-connection/session-event-publisher.d.ts +5 -0
  27. package/dist/relay-connection/session-event-publisher.d.ts.map +1 -1
  28. package/dist/relay-connection/session-event-publisher.js +48 -2
  29. package/dist/relay-connection/session-event-publisher.js.map +1 -1
  30. package/dist/run-daemon.js +1 -1
  31. package/dist/run-daemon.js.map +1 -1
  32. package/dist/runtime.js +99 -25
  33. package/dist/runtime.js.map +2 -2
  34. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -20954,6 +20954,7 @@ var MAX_CONTENT_LENGTH = 1e6;
20954
20954
  var MAX_JSON_DEPTH = 16;
20955
20955
  var MAX_JSON_KEYS = 1e3;
20956
20956
  var SESSION_EVENT_V2_KIND = "session.event.v2";
20957
+ var SESSION_EVENT_V2_BATCH_MAX_SIZE = 1e3;
20957
20958
  var boundedString = external_exports.string().max(MAX_CONTENT_LENGTH);
20958
20959
  var shortString = external_exports.string().max(2048);
20959
20960
  var externalContentKeySchema = external_exports.string().regex(/^[a-f0-9]{64}$/u);
@@ -21325,6 +21326,7 @@ var sessionEventV2Schema = external_exports.discriminatedUnion("type", [
21325
21326
  type: external_exports.literal("lifecycle-metadata")
21326
21327
  }).readonly()
21327
21328
  ]);
21329
+ var sessionEventBatchV2Schema = external_exports.array(sessionEventV2Schema).min(1).max(SESSION_EVENT_V2_BATCH_MAX_SIZE).readonly();
21328
21330
  var sessionExportV2Schema = external_exports.object({
21329
21331
  binding: external_exports.object({
21330
21332
  bindingId: identifierStringSchema,
@@ -21367,7 +21369,7 @@ var mobiusSessionExportV2Schema = external_exports.object({
21367
21369
  formatVersion: external_exports.literal("2"),
21368
21370
  session: sessionExportV2Schema
21369
21371
  }).readonly();
21370
- var sessionEventEnvelopeV2Schema = external_exports.object({ event: sessionEventV2Schema, kind: external_exports.literal(SESSION_EVENT_V2_KIND) }).readonly();
21372
+ var sessionEventEnvelopeV2Schema = external_exports.object({ events: sessionEventBatchV2Schema, kind: external_exports.literal(SESSION_EVENT_V2_KIND) }).readonly();
21371
21373
  var sessionEventLogPageV2Schema = external_exports.object({
21372
21374
  daemonGenerationId: identifierStringSchema,
21373
21375
  events: external_exports.array(sessionEventV2Schema).max(MAX_EVENT_COUNT).readonly(),
@@ -23339,14 +23341,13 @@ var AgentConnection = class {
23339
23341
  get inProcessAgent() {
23340
23342
  return this.#process.kind === "in-process" ? this.#process.endpoint : null;
23341
23343
  }
23342
- captureProcessTree = async () => this.#process.kind === "child" ? await captureProcessTree(this.#process.child) : [];
23343
- closeProcess = async (capturedProcesses = []) => {
23344
+ closeProcess = async () => {
23344
23345
  try {
23345
23346
  if (this.#process.kind === "in-process") {
23346
23347
  await this.#process.endpoint.close();
23347
23348
  return;
23348
23349
  }
23349
- await stopProcessTree(this.#process.child, capturedProcesses);
23350
+ await stopProcessTree(this.#process.child);
23350
23351
  } finally {
23351
23352
  this.connection.close();
23352
23353
  }
@@ -30973,16 +30974,11 @@ var AgentSession = class _AgentSession {
30973
30974
  }
30974
30975
  };
30975
30976
  cancel = async () => {
30976
- const capturedProcesses = await this.#connection.captureProcessTree();
30977
- try {
30978
- await this.#interactions.cancelPendingInteractions();
30979
- if (this.#turn.running) {
30980
- await this.#connection.connection.agent.notify(methods3.agent.session.cancel, {
30981
- sessionId: this.#updates.sessionId()
30982
- });
30983
- }
30984
- } finally {
30985
- await this.closeProcess(capturedProcesses);
30977
+ await this.#interactions.cancelPendingInteractions();
30978
+ if (this.#turn.running) {
30979
+ await this.#connection.connection.agent.notify(methods3.agent.session.cancel, {
30980
+ sessionId: this.#updates.sessionId()
30981
+ });
30986
30982
  }
30987
30983
  };
30988
30984
  respondPermission = (options) => this.#interactions.respondPermission(options);
@@ -31182,7 +31178,7 @@ var AgentSession = class _AgentSession {
31182
31178
  await this.closeProcess();
31183
31179
  }
31184
31180
  };
31185
- closeProcess = (capturedProcesses = []) => this.#connection.closeProcess(capturedProcesses);
31181
+ closeProcess = () => this.#connection.closeProcess();
31186
31182
  race = (operation, exitMessage, signal) => this.#connection.race(operation, exitMessage, signal);
31187
31183
  assertNativeSession = (sessionId) => {
31188
31184
  if (sessionId !== this.#updates.sessionId()) {
@@ -32323,13 +32319,7 @@ var AgentRuntimeManager = class {
32323
32319
  await this.#executions.cancel(sessionId, async () => {
32324
32320
  const runtime = this.#executionProcesses.get(sessionId);
32325
32321
  if (runtime !== void 0) {
32326
- try {
32327
- await runtime.cancel();
32328
- } finally {
32329
- if (this.#executionProcesses.detach(sessionId, runtime)) {
32330
- this.#processes.releaseClosed(runtime);
32331
- }
32332
- }
32322
+ await runtime.cancel();
32333
32323
  }
32334
32324
  });
32335
32325
  };
@@ -33382,7 +33372,21 @@ var fileUpdateChangeSchema = external_exports.object({
33382
33372
  kind: external_exports.unknown(),
33383
33373
  path: boundedText(4096)
33384
33374
  });
33375
+ var imageGenerationItemSchema = external_exports.object({
33376
+ id: boundedText(256),
33377
+ type: external_exports.literal("imageGeneration"),
33378
+ status: boundedText(80),
33379
+ revisedPrompt: boundedText(32768).nullish(),
33380
+ // The app-server frame is bounded; media validation belongs to the content externalizer.
33381
+ result: external_exports.string(),
33382
+ failure: external_exports.object({
33383
+ type: external_exports.literal("usageLimitExceeded"),
33384
+ limitId: boundedText(256),
33385
+ resetsAt: external_exports.number().nullish()
33386
+ }).nullish()
33387
+ });
33385
33388
  var threadItemSchema = external_exports.discriminatedUnion("type", [
33389
+ imageGenerationItemSchema,
33386
33390
  external_exports.object({
33387
33391
  id: boundedText(256),
33388
33392
  text: boundedText(1e6),
@@ -33848,6 +33852,29 @@ function mcpStatus(status) {
33848
33852
  return status === "inProgress" ? "in_progress" : status === "completed" ? "completed" : "failed";
33849
33853
  }
33850
33854
  function presentToolItem(item) {
33855
+ if (item.type === "imageGeneration") {
33856
+ const failed = item.failure != null || item.status === "failed";
33857
+ const content = [];
33858
+ if (!failed && item.result.length > 0) {
33859
+ content.push({ type: "content", content: { type: "image", data: item.result, mimeType: "image/png" } });
33860
+ }
33861
+ if (failed) {
33862
+ content.push(
33863
+ textContent(
33864
+ item.failure?.type === "usageLimitExceeded" ? "Image generation usage limit reached." : "Image generation failed."
33865
+ )
33866
+ );
33867
+ }
33868
+ return {
33869
+ content,
33870
+ kind: "other",
33871
+ locations: [],
33872
+ rawInput: item.revisedPrompt == null ? null : { prompt: item.revisedPrompt },
33873
+ rawOutput: null,
33874
+ status: failed ? "failed" : item.status === "completed" ? "completed" : "in_progress",
33875
+ title: "Generate image"
33876
+ };
33877
+ }
33851
33878
  if (item.type === "commandExecution") {
33852
33879
  const output2 = item.aggregatedOutput ?? "";
33853
33880
  const content = [];
@@ -35117,7 +35144,7 @@ var CodexAcpAgent = class {
35117
35144
  };
35118
35145
  #completeTurn = async (turn) => {
35119
35146
  const active = this.#turn;
35120
- if (active === null) {
35147
+ if (active === null || active.turn.id !== turn.id) {
35121
35148
  return;
35122
35149
  }
35123
35150
  await this.#updateTail;
@@ -43007,24 +43034,33 @@ async function runRelayConnection({
43007
43034
  // src/relay-connection/session-event-publisher.ts
43008
43035
  import { WebSocket as WebSocket8 } from "undici";
43009
43036
  var MAX_BUFFERED_BYTES = 32 * 1024 * 1024;
43037
+ var SESSION_EVENT_V2_BATCH_WINDOW_MILLISECONDS = 200;
43010
43038
  var DaemonSessionEventPublisher = class {
43039
+ #pendingV2Events = [];
43040
+ #pendingV2Task = null;
43011
43041
  #socket = null;
43042
+ #timer;
43043
+ constructor(timer) {
43044
+ this.#timer = timer;
43045
+ }
43012
43046
  connect = (socket) => {
43047
+ this.dropPendingV2Events();
43013
43048
  this.#socket = socket;
43014
43049
  };
43015
43050
  disconnect = (socket) => {
43016
43051
  if (this.#socket === socket) {
43017
43052
  this.#socket = null;
43053
+ this.dropPendingV2Events();
43018
43054
  }
43019
43055
  };
43020
43056
  close = () => {
43021
43057
  this.#socket = null;
43058
+ this.dropPendingV2Events();
43022
43059
  };
43023
43060
  publishOperationFailure = (sessionId, requestId, code, message) => {
43024
43061
  this.#send({ kind: "session.operation.failed", sessionId, requestId, code, message });
43025
43062
  };
43026
43063
  publishStatus = (event) => this.#send(event);
43027
- publishV2 = (event) => this.#send({ event, kind: SESSION_EVENT_V2_KIND });
43028
43064
  #send = (message) => {
43029
43065
  const socket = this.#socket;
43030
43066
  if (socket === null || socket.readyState !== WebSocket8.OPEN) {
@@ -43040,6 +43076,44 @@ var DaemonSessionEventPublisher = class {
43040
43076
  } catch {
43041
43077
  }
43042
43078
  };
43079
+ publishV2 = (event) => {
43080
+ const socket = this.#socket;
43081
+ if (socket === null || socket.readyState !== WebSocket8.OPEN) {
43082
+ return;
43083
+ }
43084
+ this.#pendingV2Events.push(event);
43085
+ if (this.#pendingV2Events.length >= SESSION_EVENT_V2_BATCH_MAX_SIZE) {
43086
+ this.flushV2Events(socket);
43087
+ return;
43088
+ }
43089
+ this.#pendingV2Task ??= this.#timer.schedule(
43090
+ () => this.flushV2Events(socket),
43091
+ SESSION_EVENT_V2_BATCH_WINDOW_MILLISECONDS
43092
+ );
43093
+ };
43094
+ dropPendingV2Events = () => {
43095
+ this.#pendingV2Task?.cancel();
43096
+ this.#pendingV2Task = null;
43097
+ this.#pendingV2Events = [];
43098
+ };
43099
+ flushV2Events = (socket) => {
43100
+ this.#pendingV2Task?.cancel();
43101
+ this.#pendingV2Task = null;
43102
+ const events = this.#pendingV2Events;
43103
+ this.#pendingV2Events = [];
43104
+ if (events.length === 0 || this.#socket !== socket || socket.readyState !== WebSocket8.OPEN) {
43105
+ return;
43106
+ }
43107
+ const encoded = encodeDaemonToServiceMessage({ events, kind: SESSION_EVENT_V2_KIND });
43108
+ if (socket.bufferedAmount + Buffer.byteLength(encoded, "utf8") > MAX_BUFFERED_BYTES) {
43109
+ socket.close(1013, "Live event transport overloaded");
43110
+ return;
43111
+ }
43112
+ try {
43113
+ socket.send(encoded);
43114
+ } catch {
43115
+ }
43116
+ };
43043
43117
  };
43044
43118
 
43045
43119
  // src/relay-connection/timer.ts
@@ -43283,7 +43357,7 @@ async function runDaemon(config2, audit, signal, timer = systemDaemonTimer, opti
43283
43357
  const sessionStore = new SqliteAcpSessionStore(sessionDatabase, eventsV2);
43284
43358
  await using externalContent = new LocalExternalContentStore(stateDirectory);
43285
43359
  const operations = new DaemonOperationState();
43286
- const publisher = new DaemonSessionEventPublisher();
43360
+ const publisher = new DaemonSessionEventPublisher(timer);
43287
43361
  const eventLogV2 = new DaemonSessionEventLogV2(
43288
43362
  publisher,
43289
43363
  (sessionId, event) => agentRuntime.recordLifecycleEventV2(sessionId, event),