@alan-ai-hq/agent-manager-linux-arm64 0.1.138 → 0.1.140

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/alan-holder.cjs CHANGED
@@ -20742,7 +20742,11 @@ var init_github_proxy = __esm({
20742
20742
  "github.com"
20743
20743
  ];
20744
20744
  gitHubProxyUpstreamSchema = external_exports.enum(GITHUB_PROXY_UPSTREAMS);
20745
- GITHUB_PROXY_REFUSAL_CODES = ["host_not_proxied", "machine_not_allowed"];
20745
+ GITHUB_PROXY_REFUSAL_CODES = [
20746
+ "host_not_proxied",
20747
+ "machine_not_allowed",
20748
+ "github_not_connected"
20749
+ ];
20746
20750
  gitHubProxyErrorSchema = external_exports.object({
20747
20751
  message: external_exports.string().min(1),
20748
20752
  documentation_url: external_exports.string(),
@@ -21954,13 +21958,9 @@ So when a turn depends on something the repository cannot tell you \u2014 a valu
21954
21958
  What comes back is the answer, not a step towards it. Carry its specifics into what you write or change \u2014 the value, the constraint, the reason, the person \u2014 and say plainly when the evidence contradicts what was asked for. Retrieving a decision and then producing work that ignores it is worse than never having searched, because it looks informed.
21955
21959
 
21956
21960
  Skip it when nothing team-specific is at stake: source-code questions, general knowledge, mechanical work fully specified in the request, or an exact ID already in hand.`;
21957
- ALAN_PLATFORM_TOOL_ROUTING_PROMPT = `## Alan platform tools
21958
-
21959
- Use the matching Alan MCP tool to retrieve or change canonical Alan records \u2014 tasks, sessions, documents, artifacts, and their relationships \u2014 to perform Alan platform actions such as managing runs or machines, or to act through a provider identity connected to Alan. This applies whether the agent runs locally or in the cloud. Do not use a shell CLI, browser, raw HTTP, or local files to bypass an unavailable or unauthorized Alan MCP action; those paths bypass Alan's identity, authorization, audit trail, and task linkage.
21960
-
21961
- Use computer use and browser tools for authorized product debugging and QA, including inspecting the authenticated Alan app, its transient DOM and CSS state, and exercising UI flows in development or test environments. These tools are also available for ordinary browser and computer tasks outside Alan. Use local tools for repository, process, and log diagnostics. Exercising a UI for QA is not a substitute for carrying out a blocked platform record action.
21961
+ ALAN_PLATFORM_TOOL_ROUTING_PROMPT = `## Alan platform and GitHub
21962
21962
 
21963
- A tool missing from the currently offered set is not proof that it is unavailable. Use the host's tool-discovery mechanism once. If the tool is still not exposed, or its call reports unavailable or unauthorized, name the blocked capability and stop that platform action only; continue independent debugging and testing. Do not bypass a workflow or role tool allowlist.`;
21963
+ Use Alan MCP tools for canonical Alan records and platform actions: tasks, sessions, documents, artifacts, runs, and machines. Use the available repository tools for GitHub work, including git and gh when useful. If a cloud GitHub request reports github_not_connected, call request_github_connection in the current conversation and end the turn. The chat will offer GitHub authorization and resume after the user connects. Continue other independent work when possible.`;
21964
21964
  ALAN_IDENTITY_PROMPT = `You are Alan, the software factory agent. Alan ships software end to end \u2014 plan, write, review, test, deploy.
21965
21965
 
21966
21966
  ## How Alan is structured
@@ -21998,10 +21998,10 @@ Team
21998
21998
 
21999
21999
  ${ALAN_PLATFORM_TOOL_ROUTING_PROMPT}
22000
22000
 
22001
- ## Record & Entity Resolution (Tasks, PRs, Docs, Epics)
22001
+ ## Record & Entity Resolution (Tasks, Docs, Epics)
22002
22002
 
22003
- When the user refers to a specific task, pull request, document, or epic by human identifier (e.g. \`AL-2980\`, \`2980\`, \`#45\`), title, or topic phrase:
22004
- - **Always resolve it with \`find_records\` first** (pass \`kinds: ["task"]\`, \`["document"]\`, \`["pull_request"]\`, or \`["epic"]\`).
22003
+ When the user refers to a specific task, document, or epic by human identifier (e.g. \`AL-2980\`, \`2980\`), title, or topic phrase:
22004
+ - **Always resolve it with \`find_records\` first** (pass \`kinds: ["task"]\`, \`["document"]\`, or \`["epic"]\`).
22005
22005
  - **Never scan with \`list_tasks\` or \`list_epics\`** to locate a specific item whose number or title you were already given \u2014 list tools are strictly for paginating browsable boards of work, not for lookup.
22006
22006
  - Once \`find_records\` returns the entity, call \`get_task\` / \`get_epic\` / \`get_document\` with the resolved identifier or UUID if full relational details, comments, or subtasks are required.
22007
22007
 
@@ -22477,8 +22477,8 @@ function decode3(bytes, start, end) {
22477
22477
  }
22478
22478
  async function linuxStartTicks(pid) {
22479
22479
  try {
22480
- const stat14 = await (0, import_promises5.readFile)(`/proc/${pid}/stat`, "utf8");
22481
- const fields = stat14.slice(stat14.lastIndexOf(")") + 2).split(" ");
22480
+ const stat15 = await (0, import_promises5.readFile)(`/proc/${pid}/stat`, "utf8");
22481
+ const fields = stat15.slice(stat15.lastIndexOf(")") + 2).split(" ");
22482
22482
  return fields[19];
22483
22483
  } catch {
22484
22484
  return void 0;
@@ -23723,9 +23723,12 @@ var init_reduce = __esm({
23723
23723
  });
23724
23724
 
23725
23725
  // ../shared/dist/agent/acp/conversation-messages.js
23726
+ var PROVIDER_PAYLOAD_META_KEY, PROVIDER_EVENT_META_KEY;
23726
23727
  var init_conversation_messages = __esm({
23727
23728
  "../shared/dist/agent/acp/conversation-messages.js"() {
23728
23729
  "use strict";
23730
+ PROVIDER_PAYLOAD_META_KEY = "alan.dev/providerPayload";
23731
+ PROVIDER_EVENT_META_KEY = "alan.dev/providerEvent";
23729
23732
  }
23730
23733
  });
23731
23734
 
@@ -23790,7 +23793,7 @@ var init_acp = __esm({
23790
23793
  }
23791
23794
  });
23792
23795
 
23793
- // ../agent-core/dist/chunk-UGRKZTAD.js
23796
+ // ../agent-core/dist/chunk-XC5676SG.js
23794
23797
  function textBlock(text2) {
23795
23798
  return { type: "text", text: text2 };
23796
23799
  }
@@ -24021,13 +24024,13 @@ function withoutInlineMedia(update) {
24021
24024
  };
24022
24025
  }
24023
24026
  var PROVIDER_PAYLOAD_META, TOOL_RESULT_ONLY_META, PARENT_TOOL_CALL_META, SUBAGENT_LAUNCHER_META, SUBAGENT_TASK_ID_META, SUBAGENT_OUTPUT_FILE_META, USAGE_META, TODOS_META, NOTICE_KIND_META, ASK_USER_QUESTIONS_META, USER_ANSWER_META, AWAITING_TOOL_CALLS_META, EXIT_PLAN_MODE_INPUT_META, BACKGROUND_TASK_META, TASK_PROGRESS_META, RATE_LIMIT_META, MODEL_META, TOOLS_META, SLASH_COMMANDS_META, TOOL_KIND_RULES, ANSWER_PREFIX, ACCEPT_WORDS, MIN_INLINE_MEDIA_CHARS, DATA_URL_PREFIX, BASE64_BODY;
24024
- var init_chunk_UGRKZTAD = __esm({
24025
- "../agent-core/dist/chunk-UGRKZTAD.js"() {
24027
+ var init_chunk_XC5676SG = __esm({
24028
+ "../agent-core/dist/chunk-XC5676SG.js"() {
24026
24029
  "use strict";
24027
24030
  init_chunk_YXWJW7I5();
24028
24031
  init_constants();
24029
24032
  init_acp();
24030
- PROVIDER_PAYLOAD_META = "alan.dev/providerPayload";
24033
+ PROVIDER_PAYLOAD_META = PROVIDER_PAYLOAD_META_KEY;
24031
24034
  TOOL_RESULT_ONLY_META = "alan.dev/toolResultOnly";
24032
24035
  PARENT_TOOL_CALL_META = "alan.dev/parentToolCallId";
24033
24036
  SUBAGENT_LAUNCHER_META = "alan.dev/subagentLauncher";
@@ -24072,17 +24075,17 @@ var init_chunk_UGRKZTAD = __esm({
24072
24075
  var init_acp2 = __esm({
24073
24076
  "../agent-core/dist/acp.js"() {
24074
24077
  "use strict";
24075
- init_chunk_UGRKZTAD();
24078
+ init_chunk_XC5676SG();
24076
24079
  init_chunk_YXWJW7I5();
24077
24080
  }
24078
24081
  });
24079
24082
 
24080
- // ../agent-core/dist/chunk-DALFHI4B.js
24083
+ // ../agent-core/dist/chunk-SBT5W7L4.js
24081
24084
  var import_fs3, NEWLINE2, TranscriptCursor, TranscriptLineLookup;
24082
- var init_chunk_DALFHI4B = __esm({
24083
- "../agent-core/dist/chunk-DALFHI4B.js"() {
24085
+ var init_chunk_SBT5W7L4 = __esm({
24086
+ "../agent-core/dist/chunk-SBT5W7L4.js"() {
24084
24087
  "use strict";
24085
- init_chunk_UGRKZTAD();
24088
+ init_chunk_XC5676SG();
24086
24089
  init_chunk_YXWJW7I5();
24087
24090
  import_fs3 = require("fs");
24088
24091
  NEWLINE2 = 10;
@@ -24626,7 +24629,7 @@ var init_chunk_54ZRJOQP = __esm({
24626
24629
  }
24627
24630
  });
24628
24631
 
24629
- // ../agent-core/dist/chunk-KHYYC5IN.js
24632
+ // ../agent-core/dist/chunk-VMGVHPBB.js
24630
24633
  function collectStrings(value, out) {
24631
24634
  if (typeof value === "string") out.push(value);
24632
24635
  else if (Array.isArray(value)) for (const item of value) collectStrings(item, out);
@@ -24718,8 +24721,8 @@ function readMediaFiles(candidates2, cwd, mimeByExt, maxBytes) {
24718
24721
  seen.add(path);
24719
24722
  const mimeType = mimeByExt[(0, import_path3.extname)(path).toLowerCase()];
24720
24723
  if (!mimeType) continue;
24721
- const stat14 = (0, import_fs4.statSync)(path);
24722
- if (!stat14.isFile() || stat14.size <= 0 || stat14.size > maxBytes) continue;
24724
+ const stat15 = (0, import_fs4.statSync)(path);
24725
+ if (!stat15.isFile() || stat15.size <= 0 || stat15.size > maxBytes) continue;
24723
24726
  files.push({ path, mimeType, buffer: (0, import_fs4.readFileSync)(path) });
24724
24727
  }
24725
24728
  return files;
@@ -24996,10 +24999,10 @@ function silentStartError(name, timeoutMs) {
24996
24999
  };
24997
25000
  }
24998
25001
  var import_crypto3, import_fs4, import_path3, IMAGE_MIME_BY_EXT, VIDEO_MIME_BY_EXT, IMAGE_EXTENSIONS, VIDEO_EXTENSIONS, MAX_IMAGE_BYTES, MAX_VIDEO_BYTES, AGENT_BROWSER_MENTION, LocalMediaReader, SessionOpenRefusal, JsonRpcError, ACP_PROTOCOL_VERSION, ACP_ERROR, STDERR_TAIL_LINES, RESULT_EXIT_GRACE_MS, PerTurnSession;
24999
- var init_chunk_KHYYC5IN = __esm({
25000
- "../agent-core/dist/chunk-KHYYC5IN.js"() {
25002
+ var init_chunk_VMGVHPBB = __esm({
25003
+ "../agent-core/dist/chunk-VMGVHPBB.js"() {
25001
25004
  "use strict";
25002
- init_chunk_UGRKZTAD();
25005
+ init_chunk_XC5676SG();
25003
25006
  init_chunk_54ZRJOQP();
25004
25007
  init_chunk_M6YHY2EZ();
25005
25008
  init_chunk_YXWJW7I5();
@@ -26664,6 +26667,9 @@ function classifyResultError(event, context) {
26664
26667
  if (classified.errorKind !== "unknown_cli_error" || !isApiError) return classified;
26665
26668
  return { ...specForErrorKind("provider_error"), message: classified.message };
26666
26669
  }
26670
+ function isIdleUpdate(update) {
26671
+ return isUpdate(update, "state_update") && update.state === "idle";
26672
+ }
26667
26673
  function isSettled2(update) {
26668
26674
  return update.status === "completed" || update.status === "failed" || update.status === "cancelled";
26669
26675
  }
@@ -26897,9 +26903,9 @@ var import_crypto6, import_fs5, import_path5, import_crypto7, import_promises14,
26897
26903
  var init_claude = __esm({
26898
26904
  "../agent-core/dist/providers/claude.js"() {
26899
26905
  "use strict";
26900
- init_chunk_DALFHI4B();
26901
- init_chunk_KHYYC5IN();
26902
- init_chunk_UGRKZTAD();
26906
+ init_chunk_SBT5W7L4();
26907
+ init_chunk_VMGVHPBB();
26908
+ init_chunk_XC5676SG();
26903
26909
  init_chunk_54ZRJOQP();
26904
26910
  init_chunk_J2KTV5FP();
26905
26911
  init_chunk_M6YHY2EZ();
@@ -27206,6 +27212,7 @@ var init_claude = __esm({
27206
27212
  #failure;
27207
27213
  #authFailure;
27208
27214
  #resultSeen = false;
27215
+ #heldIdle;
27209
27216
  constructor(options = {}) {
27210
27217
  this.#options = options;
27211
27218
  this.taskRecords = options.taskRecords ?? new TaskRecords(options.now ?? (() => systemClock2.now()));
@@ -27253,7 +27260,17 @@ var init_claude = __esm({
27253
27260
  readEvent(event) {
27254
27261
  const parsed = this.#revise(parseClaudeEvent(event, this.grammar), event);
27255
27262
  parsed.push(...this.#handle(event));
27256
- const updates = parsed.map((update) => this.taskRecords.stamp(update));
27263
+ const kept = parsed.filter((update) => {
27264
+ if (!isIdleUpdate(update)) return true;
27265
+ if (this.#finalized) return true;
27266
+ this.#heldIdle = update;
27267
+ return false;
27268
+ });
27269
+ if (this.#finalized && this.#heldIdle !== void 0) {
27270
+ if (!kept.some(isIdleUpdate)) kept.push(this.#heldIdle);
27271
+ this.#heldIdle = void 0;
27272
+ }
27273
+ const updates = kept.map((update) => this.taskRecords.stamp(update));
27257
27274
  for (const update of updates) this.#applyRunState(update);
27258
27275
  return updates;
27259
27276
  }
@@ -29030,9 +29047,9 @@ var import_fs6, import_path6, import_crypto8, import_crypto9, import_crypto10, T
29030
29047
  var init_codex = __esm({
29031
29048
  "../agent-core/dist/providers/codex.js"() {
29032
29049
  "use strict";
29033
- init_chunk_DALFHI4B();
29034
- init_chunk_KHYYC5IN();
29035
- init_chunk_UGRKZTAD();
29050
+ init_chunk_SBT5W7L4();
29051
+ init_chunk_VMGVHPBB();
29052
+ init_chunk_XC5676SG();
29036
29053
  init_chunk_54ZRJOQP();
29037
29054
  init_chunk_J2KTV5FP();
29038
29055
  init_chunk_M6YHY2EZ();
@@ -37800,8 +37817,8 @@ var require_dist = __commonJS({
37800
37817
  var init_dist = __esm({
37801
37818
  "../agent-core/dist/index.js"() {
37802
37819
  "use strict";
37803
- init_chunk_KHYYC5IN();
37804
- init_chunk_UGRKZTAD();
37820
+ init_chunk_VMGVHPBB();
37821
+ init_chunk_XC5676SG();
37805
37822
  init_chunk_54ZRJOQP();
37806
37823
  init_chunk_M6YHY2EZ();
37807
37824
  init_chunk_YXWJW7I5();
@@ -38547,8 +38564,8 @@ var import_promises22, import_path9, import_crypto12, import_promises23, CURSOR_
38547
38564
  var init_acp3 = __esm({
38548
38565
  "../agent-core/dist/providers/acp.js"() {
38549
38566
  "use strict";
38550
- init_chunk_KHYYC5IN();
38551
- init_chunk_UGRKZTAD();
38567
+ init_chunk_VMGVHPBB();
38568
+ init_chunk_XC5676SG();
38552
38569
  init_chunk_54ZRJOQP();
38553
38570
  init_chunk_J2KTV5FP();
38554
38571
  init_chunk_M6YHY2EZ();
@@ -39432,15 +39449,16 @@ function createPersistentDriver(provider4, options) {
39432
39449
  return void 0;
39433
39450
  };
39434
39451
  const resumeNotice = (spec, session, sink) => {
39452
+ if (spec.resumeFallbackContext) {
39453
+ log.info("holder.session_resume_fallback", { harness: provider4.harness, runId: spec.runId });
39454
+ return { session, contextPrefix: spec.resumeFallbackContext };
39455
+ }
39435
39456
  sink.onEvent({
39436
39457
  seq: 0,
39437
39458
  at: clock.now(),
39438
39459
  update: noticeUpdate("warning", "session_resume_failed", RESUME_UNAVAILABLE)
39439
39460
  });
39440
- return {
39441
- session,
39442
- ...spec.resumeFallbackContext ? { contextPrefix: spec.resumeFallbackContext } : {}
39443
- };
39461
+ return { session };
39444
39462
  };
39445
39463
  const managedMcpAccess = async (signal) => {
39446
39464
  const managed = options.managedMcp;
@@ -39515,6 +39533,7 @@ function createPersistentDriver(provider4, options) {
39515
39533
  };
39516
39534
  const _events = __using(_stack, session.onEvent(forward));
39517
39535
  live.turn = turn;
39536
+ record2({ sessionUpdate: "state_update", state: "running" });
39518
39537
  if (session.pid !== void 0) sink.onSpawned(session.pid);
39519
39538
  const onAbort = () => {
39520
39539
  void session.cancel();
@@ -40251,8 +40270,8 @@ var import_http4, import_crypto13, import_promises24, import_path10, import_path
40251
40270
  var init_opencode = __esm({
40252
40271
  "../agent-core/dist/providers/opencode.js"() {
40253
40272
  "use strict";
40254
- init_chunk_KHYYC5IN();
40255
- init_chunk_UGRKZTAD();
40273
+ init_chunk_VMGVHPBB();
40274
+ init_chunk_XC5676SG();
40256
40275
  init_chunk_54ZRJOQP();
40257
40276
  init_chunk_J2KTV5FP();
40258
40277
  init_chunk_M6YHY2EZ();
@@ -40267,6 +40286,7 @@ var init_opencode = __esm({
40267
40286
  import_path11 = require("path");
40268
40287
  import_url2 = require("url");
40269
40288
  init_acp();
40289
+ init_acp();
40270
40290
  import_crypto14 = require("crypto");
40271
40291
  init_agent2();
40272
40292
  IDLE_SOCKET_MS2 = 4e3;
@@ -40585,7 +40605,7 @@ var init_opencode = __esm({
40585
40605
  ["DataPolicyError", "model_mismatch"]
40586
40606
  ]);
40587
40607
  OPENCODE_ABORTED_ERROR = "MessageAbortedError";
40588
- PROVIDER_EVENT_META = "alan.dev/providerEvent";
40608
+ PROVIDER_EVENT_META = PROVIDER_EVENT_META_KEY;
40589
40609
  TASK_TOOL_NAME = "task";
40590
40610
  TASK_RESULT_TAG = /<task_result>\n?([\s\S]*?)\n?<\/task_result>/;
40591
40611
  TASK_ERROR_TAG = /<task_error>\n?([\s\S]*?)\n?<\/task_error>/;
@@ -41446,7 +41466,7 @@ function createAlanCodeHolderDriver(options) {
41446
41466
  open: open4,
41447
41467
  turnInput: async (spec, inputs, contextPrefix) => openCodeTurnInput(spec, {
41448
41468
  attachments: inputs.attachments,
41449
- skills: [],
41469
+ skills: inputs.skills,
41450
41470
  ...contextPrefix === void 0 ? {} : { contextPrefix }
41451
41471
  })
41452
41472
  },
@@ -42059,8 +42079,8 @@ var import_crypto15, import_promises25, FACTORY_API_VERSION, FACTORY_PROTOCOL_VE
42059
42079
  var init_droid = __esm({
42060
42080
  "../agent-core/dist/providers/droid.js"() {
42061
42081
  "use strict";
42062
- init_chunk_KHYYC5IN();
42063
- init_chunk_UGRKZTAD();
42082
+ init_chunk_VMGVHPBB();
42083
+ init_chunk_XC5676SG();
42064
42084
  init_chunk_54ZRJOQP();
42065
42085
  init_chunk_J2KTV5FP();
42066
42086
  init_chunk_M6YHY2EZ();
@@ -42462,7 +42482,7 @@ function createDroidHolderDriver(options) {
42462
42482
  },
42463
42483
  turnInput: (spec, inputs, contextPrefix) => droidTurnInput(spec, {
42464
42484
  attachments: inputs.attachments,
42465
- skills: [],
42485
+ skills: inputs.skills,
42466
42486
  ...contextPrefix === void 0 ? {} : { contextPrefix }
42467
42487
  })
42468
42488
  },
@@ -42510,7 +42530,7 @@ function createOpenCodeHolderDriver(options) {
42510
42530
  },
42511
42531
  turnInput: async (spec, inputs, contextPrefix) => openCodeTurnInput(spec, {
42512
42532
  attachments: inputs.attachments,
42513
- skills: [],
42533
+ skills: inputs.skills,
42514
42534
  ...contextPrefix === void 0 ? {} : { contextPrefix }
42515
42535
  })
42516
42536
  },
@@ -43161,9 +43181,9 @@ var import_promises26, import_path12, import_fs8, import_path13, import_path14,
43161
43181
  var init_antigravity = __esm({
43162
43182
  "../agent-core/dist/providers/antigravity.js"() {
43163
43183
  "use strict";
43164
- init_chunk_DALFHI4B();
43165
- init_chunk_KHYYC5IN();
43166
- init_chunk_UGRKZTAD();
43184
+ init_chunk_SBT5W7L4();
43185
+ init_chunk_VMGVHPBB();
43186
+ init_chunk_XC5676SG();
43167
43187
  init_chunk_54ZRJOQP();
43168
43188
  init_chunk_M6YHY2EZ();
43169
43189
  init_chunk_ITTV3UIM();
@@ -43866,8 +43886,8 @@ var import_promises27, import_path15, import_crypto17, COMMAND_CODE_GRAMMAR_NAME
43866
43886
  var init_command_code = __esm({
43867
43887
  "../agent-core/dist/providers/command-code.js"() {
43868
43888
  "use strict";
43869
- init_chunk_KHYYC5IN();
43870
- init_chunk_UGRKZTAD();
43889
+ init_chunk_VMGVHPBB();
43890
+ init_chunk_XC5676SG();
43871
43891
  init_chunk_54ZRJOQP();
43872
43892
  init_chunk_J2KTV5FP();
43873
43893
  init_chunk_M6YHY2EZ();
@@ -45435,9 +45455,9 @@ function isProcessAlive(pid) {
45435
45455
  }
45436
45456
  }
45437
45457
  async function linuxStartTime(pid) {
45438
- const stat14 = await (0, import_promises9.readFile)(`/proc/${pid}/stat`, "utf8").catch(() => null);
45439
- if (stat14 === null) return null;
45440
- const fields = stat14.slice(stat14.lastIndexOf(")") + 2).split(" ");
45458
+ const stat15 = await (0, import_promises9.readFile)(`/proc/${pid}/stat`, "utf8").catch(() => null);
45459
+ if (stat15 === null) return null;
45460
+ const fields = stat15.slice(stat15.lastIndexOf(")") + 2).split(" ");
45441
45461
  return fields[19] ?? null;
45442
45462
  }
45443
45463
  async function linuxCommand(pid) {
@@ -47699,11 +47719,16 @@ var indexRecordSchema = external_exports.object({
47699
47719
  runId: runIdSchema
47700
47720
  });
47701
47721
  var coverageSchema = external_exports.object({
47722
+ // Files written before ranges could start mid-conversation always started at turn 0.
47723
+ lowestOrdinal: external_exports.number().int().nonnegative().default(0),
47702
47724
  highestOrdinal: external_exports.number().int().nonnegative(),
47703
47725
  nextExpectedOrdinal: external_exports.number().int().positive()
47704
47726
  });
47727
+ function conversationsDirectory(runsDir) {
47728
+ return (0, import_node_path24.join)((0, import_node_path24.dirname)(runsDir), "conversations");
47729
+ }
47705
47730
  function indexDirectory(runsDir, conversationId) {
47706
- return (0, import_node_path24.join)((0, import_node_path24.dirname)(runsDir), "sessions", conversationId, "turn-index");
47731
+ return (0, import_node_path24.join)(conversationsDirectory(runsDir), conversationId, "turn-index");
47707
47732
  }
47708
47733
  function shardPath(runsDir, conversationId, ordinal) {
47709
47734
  return (0, import_node_path24.join)(
@@ -47721,11 +47746,16 @@ async function indexConversationRun(runsDir, conversationId, ordinal, assistantO
47721
47746
  const coveragePath = (0, import_node_path24.join)((0, import_node_path24.dirname)((0, import_node_path24.dirname)(path)), "coverage.json");
47722
47747
  const coverage = await readJsonFile(coveragePath, coverageSchema);
47723
47748
  const current = coverage.kind === "ok" ? coverage.value : null;
47724
- if (ordinal === 0 && current === null || current?.nextExpectedOrdinal === ordinal)
47725
- await writeJsonFileAtomic(coveragePath, {
47726
- highestOrdinal: ordinal,
47727
- nextExpectedOrdinal: nextOrdinal
47728
- });
47749
+ const next = nextCoverage(current, ordinal, nextOrdinal);
47750
+ if (next) await writeJsonFileAtomic(coveragePath, next);
47751
+ }
47752
+ function nextCoverage(current, ordinal, nextOrdinal) {
47753
+ if (current === null || ordinal > current.nextExpectedOrdinal)
47754
+ return { lowestOrdinal: ordinal, highestOrdinal: ordinal, nextExpectedOrdinal: nextOrdinal };
47755
+ if (ordinal === current.nextExpectedOrdinal)
47756
+ return { ...current, highestOrdinal: ordinal, nextExpectedOrdinal: nextOrdinal };
47757
+ if (ordinal === current.highestOrdinal) return { ...current, nextExpectedOrdinal: nextOrdinal };
47758
+ return null;
47729
47759
  }
47730
47760
 
47731
47761
  // src/run-log/tail.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alan-ai-hq/agent-manager-linux-arm64",
3
- "version": "0.1.138",
3
+ "version": "0.1.140",
4
4
  "description": "Alan machine runtime (alan-agent) for one platform: the official Node.js binary, the runtime bundle and its launcher. Installed by @alan-ai-hq/agent-manager.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "homepage": "https://tryalan.ai",