@nanmicoder/dsh-agent-teams 0.1.17-rc.1 → 0.1.18

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/lib/state.js CHANGED
@@ -419,9 +419,14 @@ export async function readMailbox(stateRoot, teamId, agentKey, onMalformedLine)
419
419
  }
420
420
  /** Read only messages that have not been acknowledged by their recipient. */
421
421
  export async function readUnreadMailbox(stateRoot, teamId, agentKey, onMalformedLine) {
422
- const now = Date.now();
423
422
  return (await readMailbox(stateRoot, teamId, agentKey, onMalformedLine))
424
- .filter(message => message.readAt === undefined
423
+ .filter(message => message.readAt === undefined && message.discardedAt === undefined);
424
+ }
425
+ /** Pending delivery is distinct from delivered-but-not-yet-read input. */
426
+ export async function readPendingMailbox(stateRoot, teamId, agentKey) {
427
+ const now = Date.now();
428
+ return (await readUnreadMailbox(stateRoot, teamId, agentKey))
429
+ .filter(message => message.deliveredAt === undefined
425
430
  && (message.deliveryClaimedAt === undefined
426
431
  || now - message.deliveryClaimedAt >= MAILBOX_DELIVERY_LEASE_MS));
427
432
  }
@@ -485,6 +490,16 @@ export async function acknowledgeMailbox(stateRoot, teamId, agentKey, messageIds
485
490
  };
486
491
  });
487
492
  }
493
+ /** Acceptance by Harness is not evidence that a model step consumed input. */
494
+ export async function markMailboxDelivered(stateRoot, teamId, agentKey, ids) {
495
+ await mutateMailbox(stateRoot, teamId, agentKey, ids, (message) => {
496
+ const { deliveryClaimedAt: _claimed, ...rest } = message;
497
+ return { ...rest, deliveredAt: message.deliveredAt ?? Date.now() };
498
+ });
499
+ }
500
+ export async function discardMailboxMessages(stateRoot, teamId, agentKey, ids) {
501
+ await mutateMailbox(stateRoot, teamId, agentKey, ids, message => ({ ...message, discardedAt: message.discardedAt ?? Date.now() }));
502
+ }
488
503
  /** Remove the optional UTF-8 BOM some editors prepend to JSON text. */
489
504
  function stripLeadingBom(value) {
490
505
  return value.charCodeAt(0) === 0xFEFF ? value.slice(1) : value;
@@ -591,6 +606,7 @@ function isTeamMember(value) {
591
606
  && typeof value['name'] === 'string'
592
607
  && value['name'].trim() !== ''
593
608
  && isOptionalString(value['role'])
609
+ && (value['stopping'] === undefined || typeof value['stopping'] === 'boolean')
594
610
  && isOptionalString(value['provider'])
595
611
  && isOptionalString(value['model'])
596
612
  && isOptionalString(value['reasoningEffort'])
@@ -691,6 +707,7 @@ export function isTeamTask(value) {
691
707
  || (Number.isSafeInteger(value['attempt']) && value['attempt'] >= 0))
692
708
  && isOptionalString(value['attemptId'])
693
709
  && isOptionalString(value['handoffId'])
710
+ && isOptionalString(value['handoffFromMemberId'])
694
711
  && (value['reassigning'] === undefined || typeof value['reassigning'] === 'boolean')
695
712
  && isFiniteNumber(value['createdAt'])
696
713
  && isFiniteNumber(value['updatedAt'])
@@ -729,10 +746,9 @@ function isTeamState(value, expectedId) {
729
746
  const tasks = value['tasks'];
730
747
  const memberIds = new Set();
731
748
  const memberKeys = new Set();
732
- const staged = value['phase'] === 'staged';
733
749
  for (const member of members) {
734
750
  const key = sanitizeKey(member.name);
735
- if ((!staged && member.id === '') || key === CAPTAIN_KEY || memberKeys.has(key))
751
+ if (key === CAPTAIN_KEY || memberKeys.has(key))
736
752
  return false;
737
753
  if (member.id !== '') {
738
754
  if (memberIds.has(member.id))
@@ -760,7 +776,10 @@ function isTeamMessage(value) {
760
776
  && isFiniteNumber(value['ts'])
761
777
  && (value['deliveryClaimedAt'] === undefined || isFiniteNumber(value['deliveryClaimedAt']))
762
778
  && (value['deliveredAt'] === undefined || isFiniteNumber(value['deliveredAt']))
763
- && (value['readAt'] === undefined || isFiniteNumber(value['readAt']));
779
+ && (value['readAt'] === undefined || isFiniteNumber(value['readAt']))
780
+ && (value['discardedAt'] === undefined || isFiniteNumber(value['discardedAt']))
781
+ && (value['taskId'] === undefined || typeof value['taskId'] === 'string')
782
+ && (value['attemptId'] === undefined || typeof value['attemptId'] === 'string');
764
783
  }
765
784
  /**
766
785
  * Remove a team's whole directory (members should be interrupted first).