@codexhost/cli-darwin-arm64 0.18.0-beta.3 → 0.18.0-beta.4

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 (48) hide show
  1. package/README.md +1 -1
  2. package/app/codexhost-distribution.json +1 -1
  3. package/app/console-server.mjs +9 -4
  4. package/app/console-web.js +9 -4
  5. package/app/desktop-controller.mjs +9 -4
  6. package/app/host-runtime.mjs +4751 -2746
  7. package/app/plugins/antigravity/plugin.mjs +9 -4
  8. package/app/plugins/claude-code/plugin.mjs +129 -58
  9. package/app/plugins/codebuddy/plugin.mjs +9 -4
  10. package/app/plugins/codex-usage/plugin.mjs +9 -4
  11. package/app/plugins/copilot/plugin.mjs +9 -4
  12. package/app/plugins/cursor-cli/plugin.mjs +9 -4
  13. package/app/plugins/deepseek-harness/plugin.mjs +9 -4
  14. package/app/plugins/devin/plugin.mjs +9 -4
  15. package/app/plugins/grok/plugin.mjs +9 -4
  16. package/app/plugins/hermes/plugin.mjs +9 -4
  17. package/app/plugins/kimi-code/plugin.mjs +9 -4
  18. package/app/plugins/kiro-cli/plugin.mjs +9 -4
  19. package/app/plugins/omp/plugin.mjs +9 -4
  20. package/app/plugins/opencode/plugin.mjs +9 -4
  21. package/app/plugins/pi/plugin.mjs +9 -4
  22. package/app/plugins/qoder/plugin.mjs +9 -4
  23. package/app/plugins/qoder-cn/plugin.mjs +9 -4
  24. package/app/plugins/qwen-code/plugin.mjs +9 -4
  25. package/app/plugins/workbuddy/plugin.mjs +9 -4
  26. package/app/plugins/zcode/plugin.mjs +9 -4
  27. package/app/renderer-extension.js +9 -4
  28. package/app/web/assets/{index-aKvkfNJN.js → index-D1dOzBMI.js} +2 -2
  29. package/app/web/codexhost-settings.js +9 -4
  30. package/app/web/index.html +1 -1
  31. package/app/web/plugins/deepseek-ai__dsh-api-gateway/client.js +1 -1
  32. package/app/web/plugins/deepseek-ai__dsh-api-remotes/client.js +1 -1
  33. package/app/web/plugins/deepseek-ai__dsh-api-session-controller/client.js +3 -3
  34. package/app/web/plugins/deepseek-ai__dsh-client-connection/client.js +1 -1
  35. package/app/web/plugins/deepseek-ai__dsh-client-ui-codexhost/client.js +63 -63
  36. package/app/web/plugins/deepseek-ai__dsh-client-ui-conversation/client.js +8 -8
  37. package/app/web/plugins/deepseek-ai__dsh-client-ui-layout/client.js +2 -2
  38. package/app/web/plugins/deepseek-ai__dsh-client-ui-settings/client.js +1 -1
  39. package/app/web/plugins/deepseek-ai__dsh-client-ui-settings-general/client.js +2 -2
  40. package/app/web/plugins/deepseek-ai__dsh-client-ui-sidebar/client.js +2 -2
  41. package/app/web/plugins/deepseek-ai__dsh-client-ui-tool/client.js +1 -1
  42. package/app/web/plugins/deepseek-ai__dsh-client-ui-workspace/client.js +8 -12
  43. package/app/web/plugins.json +4 -0
  44. package/app/web-modules/server.mjs +374 -154
  45. package/bin/codexhost +0 -0
  46. package/libexec/codexhost-shim +0 -0
  47. package/libexec/codexhost-updater +0 -0
  48. package/package.json +1 -1
@@ -15686,13 +15686,18 @@ var clientChannelResponseSchema = external_exports.object({
15686
15686
  });
15687
15687
 
15688
15688
  // ../../shared-contracts/dist/thread-catalog.js
15689
- var threadCatalogReadParamsSchema = external_exports.object({ includeArchived: external_exports.boolean().optional() }).strict();
15689
+ var threadCatalogReadParamsSchema = external_exports.object({
15690
+ includeArchived: external_exports.boolean().optional(),
15691
+ /** Absent means first page; null means this branch is exhausted. Native cursors only. */
15692
+ officialCursor: external_exports.object({ live: external_exports.string().nullable(), archived: external_exports.string().nullable().optional() }).strict().optional()
15693
+ }).strict();
15690
15694
  var threadCatalogReadResultSchema = external_exports.object({
15691
15695
  threads: external_exports.array(jsonObjectSchema),
15692
15696
  ownership: external_exports.array(threadOwnershipSchema),
15693
15697
  /** Known archived IDs, including visible local external records even when their rows are
15694
- * excluded. Native archived IDs are complete only when includeArchived is true. */
15695
- archivedThreadIds: external_exports.array(hostThreadIdSchema)
15698
+ * excluded. Native archived IDs describe only the returned page, never a complete set. */
15699
+ archivedThreadIds: external_exports.array(hostThreadIdSchema),
15700
+ officialCursor: external_exports.object({ live: external_exports.string().nullable(), archived: external_exports.string().nullable().optional() }).strict().optional()
15696
15701
  }).strict();
15697
15702
 
15698
15703
  // ../../shared-contracts/dist/voice.js
@@ -15907,7 +15912,7 @@ var idleReleaseSettingsSchema = external_exports.strictObject({
15907
15912
  });
15908
15913
  var DEFAULT_IDLE_RELEASE_SETTINGS = Object.freeze({
15909
15914
  enabled: false,
15910
- timeoutMinutes: 30
15915
+ timeoutMinutes: 10
15911
15916
  });
15912
15917
 
15913
15918
  // ../../shared-contracts/dist/harness-preferences.js
@@ -15280,13 +15280,18 @@ var clientChannelResponseSchema = external_exports.object({
15280
15280
  });
15281
15281
 
15282
15282
  // ../../shared-contracts/dist/thread-catalog.js
15283
- var threadCatalogReadParamsSchema = external_exports.object({ includeArchived: external_exports.boolean().optional() }).strict();
15283
+ var threadCatalogReadParamsSchema = external_exports.object({
15284
+ includeArchived: external_exports.boolean().optional(),
15285
+ /** Absent means first page; null means this branch is exhausted. Native cursors only. */
15286
+ officialCursor: external_exports.object({ live: external_exports.string().nullable(), archived: external_exports.string().nullable().optional() }).strict().optional()
15287
+ }).strict();
15284
15288
  var threadCatalogReadResultSchema = external_exports.object({
15285
15289
  threads: external_exports.array(jsonObjectSchema),
15286
15290
  ownership: external_exports.array(threadOwnershipSchema),
15287
15291
  /** Known archived IDs, including visible local external records even when their rows are
15288
- * excluded. Native archived IDs are complete only when includeArchived is true. */
15289
- archivedThreadIds: external_exports.array(hostThreadIdSchema)
15292
+ * excluded. Native archived IDs describe only the returned page, never a complete set. */
15293
+ archivedThreadIds: external_exports.array(hostThreadIdSchema),
15294
+ officialCursor: external_exports.object({ live: external_exports.string().nullable(), archived: external_exports.string().nullable().optional() }).strict().optional()
15290
15295
  }).strict();
15291
15296
 
15292
15297
  // ../../shared-contracts/dist/voice.js
@@ -15501,7 +15506,7 @@ var idleReleaseSettingsSchema = external_exports.strictObject({
15501
15506
  });
15502
15507
  var DEFAULT_IDLE_RELEASE_SETTINGS = Object.freeze({
15503
15508
  enabled: false,
15504
- timeoutMinutes: 30
15509
+ timeoutMinutes: 10
15505
15510
  });
15506
15511
 
15507
15512
  // ../../shared-contracts/dist/harness-preferences.js
@@ -55961,9 +55966,24 @@ function claudeTranscriptItemId(nativeTurnKey, kind, ordinal) {
55961
55966
  return hostItemIdSchema.parse(`claude-item-v2-${nativeTurnKey}-${kind}-${ordinal}`);
55962
55967
  }
55963
55968
 
55969
+ // dist/claude-queued-command.js
55970
+ function isRecord8(value) {
55971
+ return typeof value === "object" && value !== null && !Array.isArray(value);
55972
+ }
55973
+ function readClaudeQueuedCommand(value, sessionId) {
55974
+ const attachment = value.attachment;
55975
+ if (value.type !== "attachment" || !isRecord8(attachment) || attachment.type !== "queued_command" || attachment.commandMode !== "prompt" || !isRecord8(attachment.origin) || attachment.origin.kind !== "human" || attachment.humanTurn === false || attachment.isMeta === true || attachment.isSynthetic === true || value.isMeta === true || value.isSynthetic === true || value.isSidechain === true || isRecord8(value.origin) && value.origin.kind !== "human" || typeof value.parent_tool_use_id === "string" && value.parent_tool_use_id.length > 0 || value.sessionId !== void 0 && value.sessionId !== sessionId || value.session_id !== sessionId) {
55976
+ return null;
55977
+ }
55978
+ if (typeof value.uuid !== "string" || value.uuid.length === 0 || typeof attachment.source_uuid !== "string" || attachment.source_uuid.length === 0 || typeof attachment.prompt !== "string" || attachment.prompt.length === 0) {
55979
+ throw new Error("Claude queued human input has an invalid identity or text prompt");
55980
+ }
55981
+ return { uuid: value.uuid, sourceUuid: attachment.source_uuid, prompt: attachment.prompt };
55982
+ }
55983
+
55964
55984
  // dist/claude-history.js
55965
55985
  var claudeCodeHarnessId = harnessIdSchema.parse("claude-code");
55966
- function isRecord8(value) {
55986
+ function isRecord9(value) {
55967
55987
  return typeof value === "object" && value !== null && !Array.isArray(value);
55968
55988
  }
55969
55989
  function textParts(value) {
@@ -55971,12 +55991,12 @@ function textParts(value) {
55971
55991
  return value.length > 0 ? [value] : [];
55972
55992
  if (!Array.isArray(value))
55973
55993
  return [];
55974
- return value.flatMap((part) => isRecord8(part) && part.type === "text" && typeof part.text === "string" ? [part.text] : []);
55994
+ return value.flatMap((part) => isRecord9(part) && part.type === "text" && typeof part.text === "string" ? [part.text] : []);
55975
55995
  }
55976
55996
  function thinkingParts(value) {
55977
55997
  if (!Array.isArray(value))
55978
55998
  return [];
55979
- return value.flatMap((part) => isRecord8(part) && part.type === "thinking" && typeof part.thinking === "string" ? [part.thinking] : []);
55999
+ return value.flatMap((part) => isRecord9(part) && part.type === "thinking" && typeof part.thinking === "string" ? [part.thinking] : []);
55980
56000
  }
55981
56001
  var localCommandRecordPattern = /^\s*<(local-command-(?:stdout|caveat))>[\s\S]*<\/\1>\s*$/u;
55982
56002
  var taskNotificationRecordPattern = /^\s*<task-notification>[\s\S]*<\/task-notification>\s*$/u;
@@ -56026,7 +56046,7 @@ function localCommandStdoutText(text2) {
56026
56046
  return match[1] ?? "";
56027
56047
  }
56028
56048
  function isTaskNotificationOrigin(value) {
56029
- return isRecord8(value.origin) && value.origin.kind === "task-notification";
56049
+ return isRecord9(value.origin) && value.origin.kind === "task-notification";
56030
56050
  }
56031
56051
  function visibleUserTextParts(message) {
56032
56052
  if (message.type !== "user" || message.syntheticUser)
@@ -56037,13 +56057,13 @@ function visibleUserTextParts(message) {
56037
56057
  return parts.filter((part) => !isLocalCommandRecord(part) && !isTaskNotificationRecord(part));
56038
56058
  }
56039
56059
  function isInterruptionRecord(value, promptId) {
56040
- if (value.type !== "user" || promptId === null || value.promptId !== promptId || value.promptSource !== void 0 || !isRecord8(value.message))
56060
+ if (value.type !== "user" || promptId === null || value.promptId !== promptId || value.promptSource !== void 0 || !isRecord9(value.message))
56041
56061
  return false;
56042
56062
  const content = value.message.content;
56043
56063
  if (!Array.isArray(content) || content.length !== 1)
56044
56064
  return false;
56045
56065
  const part = content[0];
56046
- return isRecord8(part) && part.type === "text" && (part.text === "[Request interrupted by user]" || part.text === "[Request interrupted by user for tool use]");
56066
+ return isRecord9(part) && part.type === "text" && (part.text === "[Request interrupted by user]" || part.text === "[Request interrupted by user for tool use]");
56047
56067
  }
56048
56068
  function conversationMessages(values, sessionId) {
56049
56069
  const messages = [];
@@ -56054,11 +56074,31 @@ function conversationMessages(values, sessionId) {
56054
56074
  const sends = /* @__PURE__ */ new Map();
56055
56075
  let pendingNotification = false;
56056
56076
  for (const value of values) {
56057
- if (!isRecord8(value))
56077
+ if (!isRecord9(value))
56058
56078
  throw new Error("Claude history contains a malformed message");
56059
56079
  if (value.type === "system")
56060
56080
  continue;
56061
- if (value.type !== "user" && value.type !== "assistant" || typeof value.uuid !== "string" || value.uuid.length === 0 || value.session_id !== sessionId || !isRecord8(value.message) || value.message.role !== value.type) {
56081
+ if (value.type === "attachment") {
56082
+ const queued = readClaudeQueuedCommand(value, sessionId);
56083
+ if (!queued)
56084
+ continue;
56085
+ if (ids.has(queued.uuid))
56086
+ throw new Error("Claude history contains duplicate message IDs");
56087
+ ids.add(queued.uuid);
56088
+ messages.push({
56089
+ type: "steering",
56090
+ uuid: queued.uuid,
56091
+ sourceUuid: queued.sourceUuid,
56092
+ message: { role: "user", content: queued.prompt },
56093
+ failed: false,
56094
+ nested: false,
56095
+ syntheticUser: false,
56096
+ interrupted: false,
56097
+ startsTurn: false
56098
+ });
56099
+ continue;
56100
+ }
56101
+ if (value.type !== "user" && value.type !== "assistant" || typeof value.uuid !== "string" || value.uuid.length === 0 || value.session_id !== sessionId || !isRecord9(value.message) || value.message.role !== value.type) {
56062
56102
  throw new Error("Claude history contains an invalid message identity");
56063
56103
  }
56064
56104
  if (ids.has(value.uuid))
@@ -56074,6 +56114,7 @@ function conversationMessages(values, sessionId) {
56074
56114
  nested: typeof value.parent_tool_use_id === "string" && value.parent_tool_use_id.length > 0,
56075
56115
  interrupted,
56076
56116
  startsTurn: false,
56117
+ ...isRecord9(value.forkedFrom) && typeof value.forkedFrom.messageUuid === "string" ? { forkSourceUuid: value.forkedFrom.messageUuid } : {},
56077
56118
  syntheticUser: value.type === "user" && (interrupted || value.isSynthetic === true || value.isMeta === true || isTaskNotificationOrigin(value) || value.toolUseResult !== void 0 && value.toolUseResult !== null)
56078
56119
  };
56079
56120
  const notification = message.type === "user" && !message.nested && (isTaskNotificationOrigin(value) || textParts(message.message.content).some(isTaskNotificationRecord));
@@ -56120,7 +56161,21 @@ function conversationMessages(values, sessionId) {
56120
56161
  promptId = typeof value.promptId === "string" && value.promptId.length > 0 ? value.promptId : null;
56121
56162
  }
56122
56163
  }
56123
- return messages;
56164
+ const userIds = new Set(messages.flatMap((message) => isHumanUser(message) ? [message.uuid, ...message.forkSourceUuid ? [message.forkSourceUuid] : []] : []));
56165
+ const delivered = /* @__PURE__ */ new Map();
56166
+ return messages.filter((message) => {
56167
+ if (message.type !== "steering")
56168
+ return true;
56169
+ const id2 = message.sourceUuid;
56170
+ if (userIds.has(id2))
56171
+ return false;
56172
+ const prompt = message.message.content;
56173
+ const previous = delivered.get(id2);
56174
+ if (previous !== void 0 && previous !== prompt)
56175
+ throw new Error("Claude queued input UUID refers to different prompts");
56176
+ delivered.set(id2, prompt);
56177
+ return previous === void 0;
56178
+ });
56124
56179
  }
56125
56180
  function isHumanUser(message) {
56126
56181
  return visibleUserTextParts(message).length > 0;
@@ -56172,6 +56227,8 @@ function mapClaudeSnapshot(values, sessionId) {
56172
56227
  for (let index = 0; index < messages.length; ) {
56173
56228
  const user = messages[index];
56174
56229
  if (!user || !user.startsTurn) {
56230
+ if (user?.type === "steering")
56231
+ throw new Error("Claude queued input has no native Turn anchor");
56175
56232
  index += 1;
56176
56233
  continue;
56177
56234
  }
@@ -56181,7 +56238,9 @@ function mapClaudeSnapshot(values, sessionId) {
56181
56238
  const turnMessages = messages.slice(index, end);
56182
56239
  const outcome = turnOutcome(turnMessages);
56183
56240
  const results = toolResultBlocks(turnMessages);
56184
- const checkpointMessage = turnMessages.findLast(({ type, interrupted, nested }) => !nested && (type === "assistant" || interrupted));
56241
+ const checkpointIndex = turnMessages.findLastIndex(({ type, interrupted, nested }) => !nested && (type === "assistant" || interrupted));
56242
+ const lastSteering = turnMessages.findLastIndex(({ type }) => type === "steering");
56243
+ const checkpointMessage = checkpointIndex > lastSteering ? turnMessages[checkpointIndex] : void 0;
56185
56244
  let agentMessageOrdinal = 0;
56186
56245
  let reasoningOrdinal = 0;
56187
56246
  let toolOrdinal = 0;
@@ -56205,6 +56264,18 @@ function mapClaudeSnapshot(values, sessionId) {
56205
56264
  text: displayedUserText(text2)
56206
56265
  })),
56207
56266
  items: turnMessages.flatMap((message) => {
56267
+ if (message.type === "steering") {
56268
+ return [
56269
+ {
56270
+ item: {
56271
+ type: "userMessage",
56272
+ itemId: hostItemIdSchema.parse(message.uuid),
56273
+ input: [{ type: "text", text: message.message.content }]
56274
+ },
56275
+ outcome: { status: "succeeded" }
56276
+ }
56277
+ ];
56278
+ }
56208
56279
  if (message.type === "user") {
56209
56280
  const recapOutput = visibleUserTextParts(user).some((text3) => isNamedCommandEnvelope(text3, recapCommandNamePattern)) ? textParts(message.message.content).map(localCommandStdoutText).find((text3) => text3 !== null && text3.length > 0) : void 0;
56210
56281
  if (!recapOutput)
@@ -56242,7 +56313,7 @@ function mapClaudeSnapshot(values, sessionId) {
56242
56313
  let projectedReasoning = false;
56243
56314
  let projectedText = false;
56244
56315
  for (const [blockIndex, block] of content.entries()) {
56245
- if (!isRecord8(block))
56316
+ if (!isRecord9(block))
56246
56317
  continue;
56247
56318
  if (block.type === "thinking" && !projectedReasoning && reasoning.length > 0) {
56248
56319
  items.push({
@@ -56286,7 +56357,7 @@ function mapClaudeSnapshot(values, sessionId) {
56286
56357
  }
56287
56358
  } : { status: "succeeded" };
56288
56359
  const itemId = toolItem !== null ? claudeTranscriptItemId(user.uuid, "tool", toolItem) : hostItemIdSchema.parse(`claude-item-v1-${message.uuid}-tool-${blockIndex}`);
56289
- if (block.name === "Bash" && isRecord8(block.input) && typeof block.input.command === "string") {
56360
+ if (block.name === "Bash" && isRecord9(block.input) && typeof block.input.command === "string") {
56290
56361
  items.push({
56291
56362
  item: {
56292
56363
  type: "commandExecution",
@@ -56324,7 +56395,7 @@ function toolResultBlocks(messages) {
56324
56395
  if (message.type !== "user" || !Array.isArray(message.message.content))
56325
56396
  continue;
56326
56397
  for (const block of message.message.content) {
56327
- if (isRecord8(block) && block.type === "tool_result" && typeof block.tool_use_id === "string") {
56398
+ if (isRecord9(block) && block.type === "tool_result" && typeof block.tool_use_id === "string") {
56328
56399
  results.set(block.tool_use_id, block);
56329
56400
  }
56330
56401
  }
@@ -56339,7 +56410,7 @@ function toolResultOutput(block) {
56339
56410
  }
56340
56411
  function resultSubagentId(value, block) {
56341
56412
  const nativeResult = value.tool_use_result;
56342
- if (isRecord8(nativeResult)) {
56413
+ if (isRecord9(nativeResult)) {
56343
56414
  const structured = nativeResult.agentId ?? nativeResult.agent_id ?? nativeResult.task_id;
56344
56415
  if (typeof structured === "string" && structured.length > 0)
56345
56416
  return structured;
@@ -56350,13 +56421,13 @@ function resultSubagentId(value, block) {
56350
56421
  function subagentPrompt2(values, nativeSubagentId2) {
56351
56422
  const toolUses = /* @__PURE__ */ new Map();
56352
56423
  for (const value of values) {
56353
- if (!isRecord8(value) || !isRecord8(value.message) || !Array.isArray(value.message.content)) {
56424
+ if (!isRecord9(value) || !isRecord9(value.message) || !Array.isArray(value.message.content)) {
56354
56425
  continue;
56355
56426
  }
56356
56427
  for (const block of value.message.content) {
56357
- if (!isRecord8(block))
56428
+ if (!isRecord9(block))
56358
56429
  continue;
56359
- if (block.type === "tool_use" && typeof block.id === "string" && (block.name === "Agent" || block.name === "Task") && isRecord8(block.input) && typeof block.input.prompt === "string" && block.input.prompt.length > 0) {
56430
+ if (block.type === "tool_use" && typeof block.id === "string" && (block.name === "Agent" || block.name === "Task") && isRecord9(block.input) && typeof block.input.prompt === "string" && block.input.prompt.length > 0) {
56360
56431
  toolUses.set(block.id, block.input.prompt);
56361
56432
  continue;
56362
56433
  }
@@ -56370,7 +56441,7 @@ function subagentPrompt2(values, nativeSubagentId2) {
56370
56441
  return void 0;
56371
56442
  }
56372
56443
  function mapClaudeSubagentSnapshot(values, parentSessionId, nativeSubagentId2, parentValues = []) {
56373
- const messages = conversationMessages(values.map((value) => isRecord8(value) ? { ...value, session_id: parentSessionId } : value), parentSessionId);
56444
+ const messages = conversationMessages(values.map((value) => isRecord9(value) ? { ...value, session_id: parentSessionId } : value), parentSessionId);
56374
56445
  const turns = [];
56375
56446
  for (let index = 0; index < messages.length; ) {
56376
56447
  const first = messages[index];
@@ -56401,7 +56472,7 @@ function mapClaudeSubagentSnapshot(values, parentSessionId, nativeSubagentId2, p
56401
56472
  const content = Array.isArray(message.message.content) ? message.message.content : [{ type: "text", text: message.message.content }];
56402
56473
  for (let blockIndex = 0; blockIndex < content.length; blockIndex += 1) {
56403
56474
  const block = content[blockIndex];
56404
- if (!isRecord8(block))
56475
+ if (!isRecord9(block))
56405
56476
  continue;
56406
56477
  const itemId = hostItemIdSchema.parse(`claude-subagent-item-v2-${nativeSubagentId2}-${message.uuid}-${blockIndex}`);
56407
56478
  if (block.type === "thinking" && typeof block.thinking === "string") {
@@ -56438,7 +56509,7 @@ function mapClaudeSubagentSnapshot(values, parentSessionId, nativeSubagentId2, p
56438
56509
  retryable: false
56439
56510
  }
56440
56511
  } : { status: "succeeded" };
56441
- if (block.name === "Bash" && isRecord8(block.input) && typeof block.input.command === "string") {
56512
+ if (block.name === "Bash" && isRecord9(block.input) && typeof block.input.command === "string") {
56442
56513
  items.push({
56443
56514
  item: {
56444
56515
  type: "commandExecution",
@@ -56704,7 +56775,7 @@ async function findClaudeTranscript(input) {
56704
56775
  }
56705
56776
  return null;
56706
56777
  }
56707
- function isRecord9(value) {
56778
+ function isRecord10(value) {
56708
56779
  return typeof value === "object" && value !== null && !Array.isArray(value);
56709
56780
  }
56710
56781
  async function readClaudeTranscript(input) {
@@ -56722,7 +56793,7 @@ async function readClaudeTranscript(input) {
56722
56793
  } catch {
56723
56794
  continue;
56724
56795
  }
56725
- if (!isRecord9(entry) || entry.type !== "user" && entry.type !== "assistant" || typeof entry.uuid !== "string" || !isRecord9(entry.message)) {
56796
+ if (!isRecord10(entry) || entry.type !== "user" && entry.type !== "assistant" && entry.type !== "attachment" || typeof entry.uuid !== "string" || entry.type !== "attachment" && !isRecord10(entry.message)) {
56726
56797
  continue;
56727
56798
  }
56728
56799
  messages.set(entry.uuid, { ...entry, session_id: input.sessionId });
@@ -56731,7 +56802,7 @@ async function readClaudeTranscript(input) {
56731
56802
  }
56732
56803
 
56733
56804
  // dist/claude-fork-references.js
56734
- function isRecord10(value) {
56805
+ function isRecord11(value) {
56735
56806
  return typeof value === "object" && value !== null && !Array.isArray(value);
56736
56807
  }
56737
56808
  function parseEntry(line) {
@@ -56739,7 +56810,7 @@ function parseEntry(line) {
56739
56810
  return null;
56740
56811
  try {
56741
56812
  const entry = JSON.parse(line);
56742
- return isRecord10(entry) ? entry : null;
56813
+ return isRecord11(entry) ? entry : null;
56743
56814
  } catch {
56744
56815
  return null;
56745
56816
  }
@@ -56748,7 +56819,7 @@ function remapSameAs(value, copies) {
56748
56819
  if (Array.isArray(value)) {
56749
56820
  return value.reduce((count4, item) => count4 + remapSameAs(item, copies), 0);
56750
56821
  }
56751
- if (!isRecord10(value))
56822
+ if (!isRecord11(value))
56752
56823
  return 0;
56753
56824
  let count3 = 0;
56754
56825
  for (const [key, child] of Object.entries(value)) {
@@ -56774,7 +56845,7 @@ async function remapForkedSessionReferences(input) {
56774
56845
  const copies = /* @__PURE__ */ new Map();
56775
56846
  for (const entry of entries) {
56776
56847
  const source = entry?.forkedFrom;
56777
- if (typeof entry?.uuid === "string" && isRecord10(source) && typeof source.messageUuid === "string") {
56848
+ if (typeof entry?.uuid === "string" && isRecord11(source) && typeof source.messageUuid === "string") {
56778
56849
  copies.set(source.messageUuid, entry.uuid);
56779
56850
  }
56780
56851
  }
@@ -57409,17 +57480,17 @@ function rejectAfter(milliseconds, message) {
57409
57480
  function processExited(child) {
57410
57481
  return child.exitCode !== null || child.signalCode !== null;
57411
57482
  }
57412
- function isRecord11(value) {
57483
+ function isRecord12(value) {
57413
57484
  return typeof value === "object" && value !== null && !Array.isArray(value);
57414
57485
  }
57415
57486
  function permissionModeFromMessage(value) {
57416
- if (!isRecord11(value) || value.type !== "system" || value.subtype !== "init" && value.subtype !== "status" || !("permissionMode" in value) || value.permissionMode === void 0) {
57487
+ if (!isRecord12(value) || value.type !== "system" || value.subtype !== "init" && value.subtype !== "status" || !("permissionMode" in value) || value.permissionMode === void 0) {
57417
57488
  return void 0;
57418
57489
  }
57419
57490
  return isClaudePermissionMode(value.permissionMode) ? value.permissionMode : void 0;
57420
57491
  }
57421
57492
  function parseContextUsage(value) {
57422
- if (!isRecord11(value))
57493
+ if (!isRecord12(value))
57423
57494
  throw new Error("Claude SDK context Usage is invalid");
57424
57495
  const usedTokens = value.totalTokens;
57425
57496
  const maxTokens = value.maxTokens;
@@ -57436,7 +57507,7 @@ function parseQuestions(input) {
57436
57507
  const questions = [];
57437
57508
  const questionTexts = /* @__PURE__ */ new Set();
57438
57509
  for (const value of input.questions) {
57439
- if (!isRecord11(value))
57510
+ if (!isRecord12(value))
57440
57511
  return null;
57441
57512
  const question = value.question;
57442
57513
  const header = value.header;
@@ -57447,7 +57518,7 @@ function parseQuestions(input) {
57447
57518
  const labels = /* @__PURE__ */ new Set();
57448
57519
  const options = [];
57449
57520
  for (const option2 of value.options) {
57450
- if (!isRecord11(option2) || typeof option2.label !== "string" || option2.label.length === 0 || labels.has(option2.label) || typeof option2.description !== "string") {
57521
+ if (!isRecord12(option2) || typeof option2.label !== "string" || option2.label.length === 0 || labels.has(option2.label) || typeof option2.description !== "string") {
57451
57522
  return null;
57452
57523
  }
57453
57524
  labels.add(option2.label);
@@ -57489,7 +57560,7 @@ function permissionUpdateDestination(value) {
57489
57560
  return void 0;
57490
57561
  }
57491
57562
  function isPermissionUpdate(value) {
57492
- if (!isRecord11(value) || !permissionUpdateDestination(value.destination))
57563
+ if (!isRecord12(value) || !permissionUpdateDestination(value.destination))
57493
57564
  return false;
57494
57565
  if (value.type === "setMode") {
57495
57566
  return typeof value.mode === "string" && PERMISSION_MODES.has(value.mode);
@@ -57498,7 +57569,7 @@ function isPermissionUpdate(value) {
57498
57569
  return Array.isArray(value.directories) && value.directories.every((directory) => typeof directory === "string");
57499
57570
  }
57500
57571
  if (value.type === "addRules" || value.type === "replaceRules" || value.type === "removeRules") {
57501
- return typeof value.behavior === "string" && PERMISSION_BEHAVIORS.has(value.behavior) && Array.isArray(value.rules) && value.rules.every((rule) => isRecord11(rule) && typeof rule.toolName === "string" && (rule.ruleContent === void 0 || typeof rule.ruleContent === "string"));
57572
+ return typeof value.behavior === "string" && PERMISSION_BEHAVIORS.has(value.behavior) && Array.isArray(value.rules) && value.rules.every((rule) => isRecord12(rule) && typeof rule.toolName === "string" && (rule.ruleContent === void 0 || typeof rule.ruleContent === "string"));
57502
57573
  }
57503
57574
  return false;
57504
57575
  }
@@ -57752,15 +57823,15 @@ var ClaudeSdkTransport = class {
57752
57823
  return this.#idleLive && this.#idleHandler !== null;
57753
57824
  }
57754
57825
  #observeRootToolCalls(message) {
57755
- if (!isRecord11(message) || message.parent_tool_use_id != null)
57826
+ if (!isRecord12(message) || message.parent_tool_use_id != null)
57756
57827
  return;
57757
57828
  if (message.type !== "assistant" && message.type !== "user")
57758
57829
  return;
57759
57830
  const body = message.message;
57760
- if (!isRecord11(body) || !Array.isArray(body.content))
57831
+ if (!isRecord12(body) || !Array.isArray(body.content))
57761
57832
  return;
57762
57833
  for (const block of body.content) {
57763
- if (!isRecord11(block))
57834
+ if (!isRecord12(block))
57764
57835
  continue;
57765
57836
  if (message.type === "assistant" && block.type === "tool_use" && typeof block.id === "string") {
57766
57837
  this.#rootToolCalls.add(block.id);
@@ -57770,12 +57841,12 @@ var ClaudeSdkTransport = class {
57770
57841
  }
57771
57842
  }
57772
57843
  #observeNativeCapabilities(message) {
57773
- if (!isRecord11(message) || message.type !== "system" || message.subtype !== "init")
57844
+ if (!isRecord12(message) || message.type !== "system" || message.subtype !== "init")
57774
57845
  return;
57775
57846
  this.#nativeSteer = Array.isArray(message.capabilities) && message.capabilities.includes("msg_lifecycle_v1");
57776
57847
  }
57777
57848
  #observeSlashCommands(message) {
57778
- if (!isRecord11(message) || message.type !== "system")
57849
+ if (!isRecord12(message) || message.type !== "system")
57779
57850
  return;
57780
57851
  if (message.subtype === "init" && Array.isArray(message.skills)) {
57781
57852
  this.#skillNames = new Set(message.skills.filter((name) => typeof name === "string"));
@@ -58272,7 +58343,7 @@ var ClaudeSdkTransport = class {
58272
58343
  * without `started` means no native turn takes it over.
58273
58344
  */
58274
58345
  #observeSteer(message) {
58275
- if (this.#pendingSteers.size === 0 && this.#steerTakeovers.size === 0 || !isRecord11(message) || message.type !== "command_lifecycle") {
58346
+ if (this.#pendingSteers.size === 0 && this.#steerTakeovers.size === 0 || !isRecord12(message) || message.type !== "command_lifecycle") {
58276
58347
  return;
58277
58348
  }
58278
58349
  if (typeof message.command_uuid !== "string" || message.command_uuid.length === 0)
@@ -58286,10 +58357,10 @@ var ClaudeSdkTransport = class {
58286
58357
  }
58287
58358
  }
58288
58359
  #observeBackgroundTasks(message) {
58289
- if (!isRecord11(message) || message.type !== "system")
58360
+ if (!isRecord12(message) || message.type !== "system")
58290
58361
  return;
58291
58362
  if (message.subtype === "background_tasks_changed" && Array.isArray(message.tasks)) {
58292
- this.#backgroundTasks = new Set(message.tasks.flatMap((task) => isRecord11(task) && typeof task.task_id === "string" ? [task.task_id] : []));
58363
+ this.#backgroundTasks = new Set(message.tasks.flatMap((task) => isRecord12(task) && typeof task.task_id === "string" ? [task.task_id] : []));
58293
58364
  } else if (message.subtype === "task_started" && typeof message.task_id === "string") {
58294
58365
  this.#backgroundTasks.add(message.task_id);
58295
58366
  } else if (message.subtype === "task_notification" && typeof message.task_id === "string" && ["completed", "failed", "stopped"].includes(String(message.status))) {
@@ -58305,7 +58376,7 @@ var ClaudeSdkTransport = class {
58305
58376
  }
58306
58377
  /** Remembers Workflow agent labels so their approvals can name the agent asking. */
58307
58378
  #observeWorkflowAgents(message) {
58308
- if (!isRecord11(message) || message.type !== "system" || message.subtype !== "task_progress") {
58379
+ if (!isRecord12(message) || message.type !== "system" || message.subtype !== "task_progress") {
58309
58380
  return;
58310
58381
  }
58311
58382
  for (const agent of parseClaudeWorkflowAgents(message.workflow_progress) ?? []) {
@@ -58370,7 +58441,7 @@ var ClaudeSdkTransport = class {
58370
58441
  userMessageId: null,
58371
58442
  live: false
58372
58443
  });
58373
- if (autonomous.userMessageId === null && isRecord11(message) && message.type === "user" && (message.parent_tool_use_id === null || message.parent_tool_use_id === void 0) && typeof message.uuid === "string" && message.uuid.length > 0) {
58444
+ if (autonomous.userMessageId === null && isRecord12(message) && message.type === "user" && (message.parent_tool_use_id === null || message.parent_tool_use_id === void 0) && typeof message.uuid === "string" && message.uuid.length > 0) {
58374
58445
  autonomous.userMessageId = message.uuid;
58375
58446
  }
58376
58447
  const interpreted = autonomous.accumulator.consume(message);
@@ -58900,11 +58971,11 @@ var ClaudeWorkflowLifecycle = class {
58900
58971
  };
58901
58972
 
58902
58973
  // dist/task-tracker.js
58903
- function isRecord12(value) {
58974
+ function isRecord13(value) {
58904
58975
  return typeof value === "object" && value !== null && !Array.isArray(value);
58905
58976
  }
58906
58977
  function stringField(value, keys) {
58907
- if (!isRecord12(value))
58978
+ if (!isRecord13(value))
58908
58979
  return void 0;
58909
58980
  for (const key of keys) {
58910
58981
  const field2 = value[key];
@@ -58939,7 +59010,7 @@ var ClaudeTaskTracker = class {
58939
59010
  };
58940
59011
  }
58941
59012
  #create(args, result) {
58942
- if (!isRecord12(result) || !isRecord12(result.task))
59013
+ if (!isRecord13(result) || !isRecord13(result.task))
58943
59014
  return;
58944
59015
  const id2 = stringField(result.task, ["id"]);
58945
59016
  const subject = stringField(args, ["subject"]) ?? stringField(result.task, ["subject"]);
@@ -58957,7 +59028,7 @@ var ClaudeTaskTracker = class {
58957
59028
  const id2 = stringField(args, ["taskId", "id", "task_id"]);
58958
59029
  if (!id2)
58959
59030
  return;
58960
- const status = isRecord12(args) ? taskStatus2(args.status) : void 0;
59031
+ const status = isRecord13(args) ? taskStatus2(args.status) : void 0;
58961
59032
  if (status === "deleted") {
58962
59033
  this.#tasks.delete(id2);
58963
59034
  return;
@@ -58975,13 +59046,13 @@ var ClaudeTaskTracker = class {
58975
59046
  });
58976
59047
  }
58977
59048
  #replace(result) {
58978
- if (!isRecord12(result) || !Array.isArray(result.tasks))
59049
+ if (!isRecord13(result) || !Array.isArray(result.tasks))
58979
59050
  return;
58980
59051
  const next = /* @__PURE__ */ new Map();
58981
59052
  for (const value of result.tasks) {
58982
59053
  const id2 = stringField(value, ["id"]);
58983
59054
  const subject = stringField(value, ["subject"]);
58984
- const status = isRecord12(value) ? taskStatus2(value.status) : void 0;
59055
+ const status = isRecord13(value) ? taskStatus2(value.status) : void 0;
58985
59056
  if (!id2 || !subject || !status || status === "deleted")
58986
59057
  continue;
58987
59058
  const existing = this.#tasks.get(id2);
@@ -59148,11 +59219,11 @@ var ClaudeBackgroundCommandItems = class {
59148
59219
  };
59149
59220
 
59150
59221
  // dist/tool-lifecycle.js
59151
- function isRecord13(value) {
59222
+ function isRecord14(value) {
59152
59223
  return typeof value === "object" && value !== null && !Array.isArray(value);
59153
59224
  }
59154
59225
  function stringField2(value, key) {
59155
- return isRecord13(value) && typeof value[key] === "string" ? value[key] : void 0;
59226
+ return isRecord14(value) && typeof value[key] === "string" ? value[key] : void 0;
59156
59227
  }
59157
59228
  function toolFailure(toolName) {
59158
59229
  return {
@@ -59419,7 +59490,7 @@ var CONTEXT_USAGE_TTL_MS = 1e4;
59419
59490
  var CONTEXT_USAGE_FAILURE_COOLDOWN_MS = 5e3;
59420
59491
  var REQUEST_USAGE_RETRY_DELAYS_MS = [0, 100, 250, 500, 1e3];
59421
59492
  var DEFAULT_CONTINUATION_QUIESCENCE_MS = 2e3;
59422
- function isRecord14(value) {
59493
+ function isRecord15(value) {
59423
59494
  return typeof value === "object" && value !== null && !Array.isArray(value);
59424
59495
  }
59425
59496
  function safeNonNegativeInteger2(value) {
@@ -59428,7 +59499,7 @@ function safeNonNegativeInteger2(value) {
59428
59499
  function transcriptRequestUsage(messages, messageId) {
59429
59500
  for (let index = messages.length - 1; index >= 0; index -= 1) {
59430
59501
  const entry = messages[index];
59431
- if (!isRecord14(entry) || entry.type !== "assistant" || entry.parent_tool_use_id !== null && entry.parent_tool_use_id !== void 0 || !isRecord14(entry.message) || entry.message.id !== messageId || !isRecord14(entry.message.usage)) {
59502
+ if (!isRecord15(entry) || entry.type !== "assistant" || entry.parent_tool_use_id !== null && entry.parent_tool_use_id !== void 0 || !isRecord15(entry.message) || entry.message.id !== messageId || !isRecord15(entry.message.usage)) {
59432
59503
  continue;
59433
59504
  }
59434
59505
  const inputTokens = entry.message.usage.input_tokens;
@@ -59745,7 +59816,7 @@ var ClaudeHarnessSession = class {
59745
59816
  cwd: this.#cwd,
59746
59817
  sessionId: this.#sessionId
59747
59818
  }) ?? [];
59748
- const ids = new Set(messages.flatMap((message) => isRecord14(message) && typeof message.uuid === "string" ? [message.uuid] : []));
59819
+ const ids = new Set(messages.flatMap((message) => isRecord15(message) && typeof message.uuid === "string" ? [message.uuid] : []));
59749
59820
  if (this.#unpersistedMessageIds.every((id2) => ids.has(id2))) {
59750
59821
  this.#unpersistedMessageIds = [];
59751
59822
  break;
@@ -15756,13 +15756,18 @@ var clientChannelResponseSchema = external_exports.object({
15756
15756
  });
15757
15757
 
15758
15758
  // ../../shared-contracts/dist/thread-catalog.js
15759
- var threadCatalogReadParamsSchema = external_exports.object({ includeArchived: external_exports.boolean().optional() }).strict();
15759
+ var threadCatalogReadParamsSchema = external_exports.object({
15760
+ includeArchived: external_exports.boolean().optional(),
15761
+ /** Absent means first page; null means this branch is exhausted. Native cursors only. */
15762
+ officialCursor: external_exports.object({ live: external_exports.string().nullable(), archived: external_exports.string().nullable().optional() }).strict().optional()
15763
+ }).strict();
15760
15764
  var threadCatalogReadResultSchema = external_exports.object({
15761
15765
  threads: external_exports.array(jsonObjectSchema),
15762
15766
  ownership: external_exports.array(threadOwnershipSchema),
15763
15767
  /** Known archived IDs, including visible local external records even when their rows are
15764
- * excluded. Native archived IDs are complete only when includeArchived is true. */
15765
- archivedThreadIds: external_exports.array(hostThreadIdSchema)
15768
+ * excluded. Native archived IDs describe only the returned page, never a complete set. */
15769
+ archivedThreadIds: external_exports.array(hostThreadIdSchema),
15770
+ officialCursor: external_exports.object({ live: external_exports.string().nullable(), archived: external_exports.string().nullable().optional() }).strict().optional()
15766
15771
  }).strict();
15767
15772
 
15768
15773
  // ../../shared-contracts/dist/voice.js
@@ -15977,7 +15982,7 @@ var idleReleaseSettingsSchema = external_exports.strictObject({
15977
15982
  });
15978
15983
  var DEFAULT_IDLE_RELEASE_SETTINGS = Object.freeze({
15979
15984
  enabled: false,
15980
- timeoutMinutes: 30
15985
+ timeoutMinutes: 10
15981
15986
  });
15982
15987
 
15983
15988
  // ../../shared-contracts/dist/harness-preferences.js
@@ -15274,13 +15274,18 @@ var clientChannelResponseSchema = external_exports.object({
15274
15274
  });
15275
15275
 
15276
15276
  // ../../shared-contracts/dist/thread-catalog.js
15277
- var threadCatalogReadParamsSchema = external_exports.object({ includeArchived: external_exports.boolean().optional() }).strict();
15277
+ var threadCatalogReadParamsSchema = external_exports.object({
15278
+ includeArchived: external_exports.boolean().optional(),
15279
+ /** Absent means first page; null means this branch is exhausted. Native cursors only. */
15280
+ officialCursor: external_exports.object({ live: external_exports.string().nullable(), archived: external_exports.string().nullable().optional() }).strict().optional()
15281
+ }).strict();
15278
15282
  var threadCatalogReadResultSchema = external_exports.object({
15279
15283
  threads: external_exports.array(jsonObjectSchema),
15280
15284
  ownership: external_exports.array(threadOwnershipSchema),
15281
15285
  /** Known archived IDs, including visible local external records even when their rows are
15282
- * excluded. Native archived IDs are complete only when includeArchived is true. */
15283
- archivedThreadIds: external_exports.array(hostThreadIdSchema)
15286
+ * excluded. Native archived IDs describe only the returned page, never a complete set. */
15287
+ archivedThreadIds: external_exports.array(hostThreadIdSchema),
15288
+ officialCursor: external_exports.object({ live: external_exports.string().nullable(), archived: external_exports.string().nullable().optional() }).strict().optional()
15284
15289
  }).strict();
15285
15290
 
15286
15291
  // ../../shared-contracts/dist/voice.js
@@ -15495,7 +15500,7 @@ var idleReleaseSettingsSchema = external_exports.strictObject({
15495
15500
  });
15496
15501
  var DEFAULT_IDLE_RELEASE_SETTINGS = Object.freeze({
15497
15502
  enabled: false,
15498
- timeoutMinutes: 30
15503
+ timeoutMinutes: 10
15499
15504
  });
15500
15505
 
15501
15506
  // ../../shared-contracts/dist/harness-preferences.js