@nanmicoder/dsh-agent-teams 0.1.17 → 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/README.md +5 -3
- package/README_ZH.md +6 -2
- package/lib/client/AgentTeamsCard.js +1 -1
- package/lib/client.js +1 -1
- package/lib/client.js.map +1 -1
- package/lib/harness-compat.js +22 -0
- package/lib/index.js +4 -4
- package/lib/mailbox.js +154 -0
- package/lib/members.js +90 -18
- package/lib/quality-gates.js +21 -6
- package/lib/scheduler.js +27 -15
- package/lib/snapshot.js +1 -1
- package/lib/state.js +24 -5
- package/lib/tools.js +205 -213
- package/lib/types/harness-compat.d.ts +2 -0
- package/lib/types/index.d.ts +1 -1
- package/lib/types/mailbox.d.ts +7 -0
- package/lib/types/members.d.ts +6 -4
- package/lib/types/scheduler.d.ts +1 -0
- package/lib/types/state.d.ts +5 -0
- package/lib/types/types.d.ts +9 -0
- package/package.json +2 -2
- package/release-notes/v0.1.18.md +21 -0
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 (
|
|
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).
|