@wowyuarm/dsh-agent-team 0.1.2 → 0.1.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.
- package/README.md +8 -1
- package/README.zh.md +9 -1
- package/package.json +12 -3
- package/packages/agent-team/README.md +3 -3
- package/packages/agent-team/README.zh.md +3 -3
- package/packages/agent-team/lib/attachments.js +11 -12
- package/packages/agent-team/lib/auto-compaction.js +163 -0
- package/packages/agent-team/lib/index.js +252 -139
- package/packages/agent-team/lib/ledger.js +344 -170
- package/packages/agent-team/lib/recovery.js +30 -35
- package/packages/agent-team/lib/spec.js +27 -11
- package/packages/agent-team/lib/typert.host.js +197 -88
- package/packages/agent-team/lib/typert.remote-client.d.ts +3 -1
- package/packages/agent-team/lib/typert.remote-client.d.ts.map +1 -1
- package/packages/agent-team/lib/typert.remote-client.js +139 -59
- package/packages/agent-team/lib/types/attachments.d.ts +2 -2
- package/packages/agent-team/lib/types/attachments.d.ts.map +1 -1
- package/packages/agent-team/lib/types/auto-compaction.d.ts +38 -0
- package/packages/agent-team/lib/types/auto-compaction.d.ts.map +1 -0
- package/packages/agent-team/lib/types/index.d.ts +52 -19
- package/packages/agent-team/lib/types/index.d.ts.map +1 -1
- package/packages/agent-team/lib/types/ledger.d.ts +29 -2
- package/packages/agent-team/lib/types/ledger.d.ts.map +1 -1
- package/packages/agent-team/lib/types/recovery.d.ts +15 -16
- package/packages/agent-team/lib/types/recovery.d.ts.map +1 -1
- package/packages/agent-team/lib/types/spec.d.ts.map +1 -1
- package/packages/agent-team/lib/types/types.d.ts +69 -30
- package/packages/agent-team/lib/types/types.d.ts.map +1 -1
- package/packages/agent-team/preset/team-member/agent.cordis.yml +7 -2
- package/packages/client-agent-team/README.md +2 -1
- package/packages/client-agent-team/README.zh.md +2 -1
- package/packages/client-agent-team/lib/client.js +1577 -863
- package/packages/client-agent-team/lib/client.js.map +1 -1
- package/packages/client-agent-team/lib/types/client/TeamAgentsPanel.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/TeamAgentsPanel.js +35 -174
- package/packages/client-agent-team/lib/types/client/TeamChannelPage.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/TeamChannelPage.js +20 -30
- package/packages/client-agent-team/lib/types/client/TeamChannelsPanel.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/TeamChannelsPanel.js +3 -2
- package/packages/client-agent-team/lib/types/client/TeamComposer.d.ts +6 -1
- package/packages/client-agent-team/lib/types/client/TeamComposer.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/TeamComposer.js +4 -5
- package/packages/client-agent-team/lib/types/client/TeamConversation.d.ts +1 -1
- package/packages/client-agent-team/lib/types/client/TeamConversation.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/TeamConversation.js +3 -3
- package/packages/client-agent-team/lib/types/client/TeamMemberEditor.d.ts +34 -0
- package/packages/client-agent-team/lib/types/client/TeamMemberEditor.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamMemberEditor.js +169 -0
- package/packages/client-agent-team/lib/types/client/TeamMemberSessionComposer.d.ts +17 -0
- package/packages/client-agent-team/lib/types/client/TeamMemberSessionComposer.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamMemberSessionComposer.js +120 -0
- package/packages/client-agent-team/lib/types/client/TeamMessage.d.ts +4 -1
- package/packages/client-agent-team/lib/types/client/TeamMessage.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/TeamMessage.js +94 -47
- package/packages/client-agent-team/lib/types/client/TeamThreadPage.d.ts +2 -1
- package/packages/client-agent-team/lib/types/client/TeamThreadPage.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/TeamThreadPage.js +81 -39
- package/packages/client-agent-team/lib/types/client/TeamWorkspaceBrowser.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/TeamWorkspaceBrowser.js +2 -1
- package/packages/client-agent-team/lib/types/client/index.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/index.js +72 -1
- package/packages/client-agent-team/lib/types/client/locales.d.ts +24 -0
- package/packages/client-agent-team/lib/types/client/locales.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/locales.js +24 -0
- package/packages/client-agent-team/lib/types/client/member-session-input.d.ts +22 -0
- package/packages/client-agent-team/lib/types/client/member-session-input.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/member-session-input.js +98 -0
- package/packages/client-agent-team/lib/types/client/navigation.d.ts +1 -1
- package/packages/client-agent-team/lib/types/client/navigation.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/navigation.js +12 -6
- package/packages/client-agent-team/lib/types/client/requests.d.ts +16 -0
- package/packages/client-agent-team/lib/types/client/requests.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/requests.js +22 -0
- package/packages/client-agent-team/lib/types/client/slots.d.ts +2 -1
- package/packages/client-agent-team/lib/types/client/slots.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/task-refs.d.ts +6 -1
- package/packages/client-agent-team/lib/types/client/task-refs.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/task-refs.js +19 -0
- package/packages/client-agent-team/lib/types/client/team-formatters.d.ts +52 -3
- package/packages/client-agent-team/lib/types/client/team-formatters.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/team-formatters.js +74 -4
- package/packages/client-agent-team/lib/types/client/team-membership.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/team-membership.js +2 -1
- package/packages/tool-agent-team/README.md +7 -7
- package/packages/tool-agent-team/README.zh.md +7 -7
- package/packages/tool-agent-team/lib/index.js +38 -28
- package/packages/tool-agent-team/lib/types/index.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/TeamInboxPanel.d.ts +0 -13
- package/packages/client-agent-team/lib/types/client/TeamInboxPanel.d.ts.map +0 -1
- package/packages/client-agent-team/lib/types/client/TeamInboxPanel.js +0 -90
|
@@ -8,59 +8,55 @@ export function classifyRecoverableError(message) {
|
|
|
8
8
|
return undefined;
|
|
9
9
|
}
|
|
10
10
|
export const RECOVERY_DELAY_MS = 120_000;
|
|
11
|
-
export const
|
|
11
|
+
export const RECOVERY_MAX_CONSECUTIVE_ERRORS = 3;
|
|
12
12
|
/**
|
|
13
|
-
* Per-member automatic recovery episodes.
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* the coordinator stands down and leaves the Member in error for the operator.
|
|
13
|
+
* Per-member automatic recovery episodes. An episode is every recoverable
|
|
14
|
+
* `agent/error` occurrence until a clean turn end, regardless of error text
|
|
15
|
+
* or family. Each of the first two occurrences schedules its own wakeup.
|
|
17
16
|
*/
|
|
18
17
|
export class RecoveryCoordinator {
|
|
19
18
|
episodes = new Map();
|
|
20
|
-
|
|
19
|
+
wake;
|
|
21
20
|
onStandDown;
|
|
22
21
|
delayMs;
|
|
23
|
-
|
|
22
|
+
maxConsecutiveErrors;
|
|
24
23
|
constructor(options) {
|
|
25
|
-
this.
|
|
24
|
+
this.wake = options.wake;
|
|
26
25
|
this.onStandDown = options.onStandDown;
|
|
27
26
|
this.delayMs = options.delayMs ?? RECOVERY_DELAY_MS;
|
|
28
|
-
this.
|
|
27
|
+
this.maxConsecutiveErrors = options.maxConsecutiveErrors ?? RECOVERY_MAX_CONSECUTIVE_ERRORS;
|
|
29
28
|
}
|
|
30
|
-
/** Observe one error occurrence for a Member. */
|
|
29
|
+
/** Observe one `agent/error` occurrence for a Member. */
|
|
31
30
|
onError(memberId, errorMessage) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// A non-retryable failure cancels anything pending: retrying cannot help.
|
|
31
|
+
if (classifyRecoverableError(errorMessage) === undefined) {
|
|
32
|
+
// A non-recoverable failure cancels anything pending: retrying cannot help.
|
|
35
33
|
this.stopTracking(memberId);
|
|
36
34
|
return;
|
|
37
35
|
}
|
|
38
36
|
let episode = this.episodes.get(memberId);
|
|
39
|
-
if (episode === undefined
|
|
40
|
-
|
|
41
|
-
episode = { kind, lastError: errorMessage, attempts: 0 };
|
|
37
|
+
if (episode === undefined) {
|
|
38
|
+
episode = { consecutiveFailures: 0, timers: new Set() };
|
|
42
39
|
this.episodes.set(memberId, episode);
|
|
43
40
|
}
|
|
44
|
-
|
|
45
|
-
// The same error survived every allowed injection — stand down once.
|
|
46
|
-
if (episode.stoodDown !== true) {
|
|
47
|
-
episode.stoodDown = true;
|
|
48
|
-
this.onStandDown?.(memberId, episode.attempts);
|
|
49
|
-
}
|
|
41
|
+
if (episode.stoodDown === true)
|
|
50
42
|
return;
|
|
51
|
-
|
|
52
|
-
if (episode.
|
|
43
|
+
episode.consecutiveFailures += 1;
|
|
44
|
+
if (episode.consecutiveFailures >= this.maxConsecutiveErrors) {
|
|
45
|
+
this.cancelTimers(episode);
|
|
46
|
+
episode.stoodDown = true;
|
|
47
|
+
this.onStandDown?.(memberId, episode.consecutiveFailures);
|
|
53
48
|
return;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
episode.
|
|
49
|
+
}
|
|
50
|
+
const timer = setTimeout(() => {
|
|
51
|
+
episode.timers.delete(timer);
|
|
57
52
|
try {
|
|
58
|
-
this.
|
|
53
|
+
this.wake(memberId);
|
|
59
54
|
}
|
|
60
55
|
catch {
|
|
61
56
|
this.stopTracking(memberId);
|
|
62
57
|
}
|
|
63
58
|
}, this.delayMs);
|
|
59
|
+
episode.timers.add(timer);
|
|
64
60
|
}
|
|
65
61
|
/** A turn ended cleanly (running→idle without an error): the episode is over. */
|
|
66
62
|
onCleanTurnEnd(memberId) {
|
|
@@ -70,18 +66,17 @@ export class RecoveryCoordinator {
|
|
|
70
66
|
const episode = this.episodes.get(memberId);
|
|
71
67
|
if (episode === undefined)
|
|
72
68
|
return;
|
|
73
|
-
this.
|
|
69
|
+
this.cancelTimers(episode);
|
|
74
70
|
this.episodes.delete(memberId);
|
|
75
71
|
}
|
|
76
72
|
dispose() {
|
|
77
73
|
for (const episode of this.episodes.values())
|
|
78
|
-
this.
|
|
74
|
+
this.cancelTimers(episode);
|
|
79
75
|
this.episodes.clear();
|
|
80
76
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
episode.timer = undefined;
|
|
77
|
+
cancelTimers(episode) {
|
|
78
|
+
for (const timer of episode.timers)
|
|
79
|
+
clearTimeout(timer);
|
|
80
|
+
episode.timers.clear();
|
|
86
81
|
}
|
|
87
82
|
}
|
|
@@ -60,18 +60,21 @@ const attachmentSchema = z.object({
|
|
|
60
60
|
byteSize: z.number().int().nonnegative(),
|
|
61
61
|
mediaType: z.string().min(1),
|
|
62
62
|
}).strict();
|
|
63
|
+
function omitUndefined(value) {
|
|
64
|
+
return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
|
|
65
|
+
}
|
|
63
66
|
const messageSchema = z.object({
|
|
64
67
|
messageRef: messageRefSchema,
|
|
65
68
|
channelRef: channelRefSchema,
|
|
66
69
|
threadRef: threadRefSchema,
|
|
67
|
-
taskRef: taskRefSchema,
|
|
70
|
+
taskRef: taskRefSchema.optional(),
|
|
68
71
|
sender: memberIdSchema,
|
|
69
72
|
body: z.string().min(1),
|
|
70
73
|
attachments: z.array(attachmentSchema).optional(),
|
|
71
74
|
topLevel: z.boolean(),
|
|
72
75
|
sequence: z.number().int().positive(),
|
|
73
76
|
occurredAt: z.string().datetime().optional(),
|
|
74
|
-
}).strict();
|
|
77
|
+
}).strict().transform(omitUndefined);
|
|
75
78
|
/** Stamp one bare stored message with the wrapping operation's occurrence instant; complete messages pass through unchanged. */
|
|
76
79
|
function stampMessage(occurredAt, message) {
|
|
77
80
|
const { occurredAt: stored } = message;
|
|
@@ -96,9 +99,9 @@ const taskSchema = z.object({
|
|
|
96
99
|
}).strict();
|
|
97
100
|
const threadSchema = z.object({
|
|
98
101
|
threadRef: threadRefSchema,
|
|
99
|
-
taskRef: taskRefSchema,
|
|
102
|
+
taskRef: taskRefSchema.optional(),
|
|
100
103
|
revision: z.number().int().positive(),
|
|
101
|
-
}).strict();
|
|
104
|
+
}).strict().transform(omitUndefined);
|
|
102
105
|
const attentionSchema = z.object({
|
|
103
106
|
memberId: memberIdSchema,
|
|
104
107
|
threadRef: threadRefSchema,
|
|
@@ -158,7 +161,7 @@ const claimActivitySchema = z.object({
|
|
|
158
161
|
}).strict();
|
|
159
162
|
const taskActivitySchema = z.object({
|
|
160
163
|
...activityBase,
|
|
161
|
-
kind: z.union([z.literal('accept'), z.literal('close'), z.literal('reopen')]),
|
|
164
|
+
kind: z.union([z.literal('promote'), z.literal('accept'), z.literal('close'), z.literal('reopen')]),
|
|
162
165
|
releasedClaimRefs: z.array(claimRefSchema).min(1).optional(),
|
|
163
166
|
completedClaimRefs: z.array(claimRefSchema).min(1).optional(),
|
|
164
167
|
}).strict();
|
|
@@ -275,10 +278,10 @@ const storedAgentTeamOperationSchema = z.discriminatedUnion('kind', [
|
|
|
275
278
|
workspaceId: workspaceIdSchema,
|
|
276
279
|
mentions: z.array(memberIdSchema),
|
|
277
280
|
message: messageSchema,
|
|
278
|
-
task: taskSchema,
|
|
281
|
+
task: taskSchema.optional(),
|
|
279
282
|
thread: threadSchema,
|
|
280
283
|
inbox: inboxDeltaSchema,
|
|
281
|
-
}).strict(),
|
|
284
|
+
}).strict().transform(omitUndefined),
|
|
282
285
|
}).strict(),
|
|
283
286
|
z.object({
|
|
284
287
|
...operationBase,
|
|
@@ -289,6 +292,19 @@ const storedAgentTeamOperationSchema = z.discriminatedUnion('kind', [
|
|
|
289
292
|
baseRevision: z.number().int().positive(),
|
|
290
293
|
mentions: z.array(memberIdSchema),
|
|
291
294
|
message: messageSchema,
|
|
295
|
+
task: taskSchema.optional(),
|
|
296
|
+
thread: threadSchema,
|
|
297
|
+
inbox: inboxDeltaSchema,
|
|
298
|
+
}).strict().transform(omitUndefined),
|
|
299
|
+
}).strict(),
|
|
300
|
+
z.object({
|
|
301
|
+
...operationBase,
|
|
302
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
303
|
+
kind: z.literal('team/thread-promoted'),
|
|
304
|
+
data: z.object({
|
|
305
|
+
workspaceId: workspaceIdSchema,
|
|
306
|
+
baseRevision: z.number().int().positive(),
|
|
307
|
+
activity: taskActivitySchema,
|
|
292
308
|
task: taskSchema,
|
|
293
309
|
thread: threadSchema,
|
|
294
310
|
inbox: inboxDeltaSchema,
|
|
@@ -319,10 +335,10 @@ const storedAgentTeamOperationSchema = z.discriminatedUnion('kind', [
|
|
|
319
335
|
workspaceId: workspaceIdSchema,
|
|
320
336
|
action: z.union([z.literal('follow'), z.literal('unfollow')]),
|
|
321
337
|
memberId: memberIdSchema,
|
|
322
|
-
task: taskSchema,
|
|
338
|
+
task: taskSchema.optional(),
|
|
323
339
|
thread: threadSchema,
|
|
324
340
|
inbox: inboxDeltaSchema,
|
|
325
|
-
}).strict(),
|
|
341
|
+
}).strict().transform(omitUndefined),
|
|
326
342
|
}).strict(),
|
|
327
343
|
z.object({
|
|
328
344
|
...operationBase,
|
|
@@ -331,7 +347,7 @@ const storedAgentTeamOperationSchema = z.discriminatedUnion('kind', [
|
|
|
331
347
|
data: z.object({
|
|
332
348
|
workspaceId: workspaceIdSchema,
|
|
333
349
|
memberId: memberIdSchema,
|
|
334
|
-
task: taskSchema,
|
|
350
|
+
task: taskSchema.optional(),
|
|
335
351
|
thread: threadSchema,
|
|
336
352
|
claims: z.array(claimSchema),
|
|
337
353
|
anchor: messageSchema,
|
|
@@ -341,7 +357,7 @@ const storedAgentTeamOperationSchema = z.discriminatedUnion('kind', [
|
|
|
341
357
|
remainingUnreadCount: z.number().int().nonnegative(),
|
|
342
358
|
attention: attentionSchema.optional(),
|
|
343
359
|
inbox: inboxDeltaSchema,
|
|
344
|
-
}).strict(),
|
|
360
|
+
}).strict().transform(omitUndefined),
|
|
345
361
|
}).strict(),
|
|
346
362
|
z.object({
|
|
347
363
|
...operationBase,
|