@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.
Files changed (90) hide show
  1. package/README.md +8 -1
  2. package/README.zh.md +9 -1
  3. package/package.json +12 -3
  4. package/packages/agent-team/README.md +3 -3
  5. package/packages/agent-team/README.zh.md +3 -3
  6. package/packages/agent-team/lib/attachments.js +11 -12
  7. package/packages/agent-team/lib/auto-compaction.js +163 -0
  8. package/packages/agent-team/lib/index.js +252 -139
  9. package/packages/agent-team/lib/ledger.js +344 -170
  10. package/packages/agent-team/lib/recovery.js +30 -35
  11. package/packages/agent-team/lib/spec.js +27 -11
  12. package/packages/agent-team/lib/typert.host.js +197 -88
  13. package/packages/agent-team/lib/typert.remote-client.d.ts +3 -1
  14. package/packages/agent-team/lib/typert.remote-client.d.ts.map +1 -1
  15. package/packages/agent-team/lib/typert.remote-client.js +139 -59
  16. package/packages/agent-team/lib/types/attachments.d.ts +2 -2
  17. package/packages/agent-team/lib/types/attachments.d.ts.map +1 -1
  18. package/packages/agent-team/lib/types/auto-compaction.d.ts +38 -0
  19. package/packages/agent-team/lib/types/auto-compaction.d.ts.map +1 -0
  20. package/packages/agent-team/lib/types/index.d.ts +52 -19
  21. package/packages/agent-team/lib/types/index.d.ts.map +1 -1
  22. package/packages/agent-team/lib/types/ledger.d.ts +29 -2
  23. package/packages/agent-team/lib/types/ledger.d.ts.map +1 -1
  24. package/packages/agent-team/lib/types/recovery.d.ts +15 -16
  25. package/packages/agent-team/lib/types/recovery.d.ts.map +1 -1
  26. package/packages/agent-team/lib/types/spec.d.ts.map +1 -1
  27. package/packages/agent-team/lib/types/types.d.ts +69 -30
  28. package/packages/agent-team/lib/types/types.d.ts.map +1 -1
  29. package/packages/agent-team/preset/team-member/agent.cordis.yml +7 -2
  30. package/packages/client-agent-team/README.md +2 -1
  31. package/packages/client-agent-team/README.zh.md +2 -1
  32. package/packages/client-agent-team/lib/client.js +1577 -863
  33. package/packages/client-agent-team/lib/client.js.map +1 -1
  34. package/packages/client-agent-team/lib/types/client/TeamAgentsPanel.d.ts.map +1 -1
  35. package/packages/client-agent-team/lib/types/client/TeamAgentsPanel.js +35 -174
  36. package/packages/client-agent-team/lib/types/client/TeamChannelPage.d.ts.map +1 -1
  37. package/packages/client-agent-team/lib/types/client/TeamChannelPage.js +20 -30
  38. package/packages/client-agent-team/lib/types/client/TeamChannelsPanel.d.ts.map +1 -1
  39. package/packages/client-agent-team/lib/types/client/TeamChannelsPanel.js +3 -2
  40. package/packages/client-agent-team/lib/types/client/TeamComposer.d.ts +6 -1
  41. package/packages/client-agent-team/lib/types/client/TeamComposer.d.ts.map +1 -1
  42. package/packages/client-agent-team/lib/types/client/TeamComposer.js +4 -5
  43. package/packages/client-agent-team/lib/types/client/TeamConversation.d.ts +1 -1
  44. package/packages/client-agent-team/lib/types/client/TeamConversation.d.ts.map +1 -1
  45. package/packages/client-agent-team/lib/types/client/TeamConversation.js +3 -3
  46. package/packages/client-agent-team/lib/types/client/TeamMemberEditor.d.ts +34 -0
  47. package/packages/client-agent-team/lib/types/client/TeamMemberEditor.d.ts.map +1 -0
  48. package/packages/client-agent-team/lib/types/client/TeamMemberEditor.js +169 -0
  49. package/packages/client-agent-team/lib/types/client/TeamMemberSessionComposer.d.ts +17 -0
  50. package/packages/client-agent-team/lib/types/client/TeamMemberSessionComposer.d.ts.map +1 -0
  51. package/packages/client-agent-team/lib/types/client/TeamMemberSessionComposer.js +120 -0
  52. package/packages/client-agent-team/lib/types/client/TeamMessage.d.ts +4 -1
  53. package/packages/client-agent-team/lib/types/client/TeamMessage.d.ts.map +1 -1
  54. package/packages/client-agent-team/lib/types/client/TeamMessage.js +94 -47
  55. package/packages/client-agent-team/lib/types/client/TeamThreadPage.d.ts +2 -1
  56. package/packages/client-agent-team/lib/types/client/TeamThreadPage.d.ts.map +1 -1
  57. package/packages/client-agent-team/lib/types/client/TeamThreadPage.js +81 -39
  58. package/packages/client-agent-team/lib/types/client/TeamWorkspaceBrowser.d.ts.map +1 -1
  59. package/packages/client-agent-team/lib/types/client/TeamWorkspaceBrowser.js +2 -1
  60. package/packages/client-agent-team/lib/types/client/index.d.ts.map +1 -1
  61. package/packages/client-agent-team/lib/types/client/index.js +72 -1
  62. package/packages/client-agent-team/lib/types/client/locales.d.ts +24 -0
  63. package/packages/client-agent-team/lib/types/client/locales.d.ts.map +1 -1
  64. package/packages/client-agent-team/lib/types/client/locales.js +24 -0
  65. package/packages/client-agent-team/lib/types/client/member-session-input.d.ts +22 -0
  66. package/packages/client-agent-team/lib/types/client/member-session-input.d.ts.map +1 -0
  67. package/packages/client-agent-team/lib/types/client/member-session-input.js +98 -0
  68. package/packages/client-agent-team/lib/types/client/navigation.d.ts +1 -1
  69. package/packages/client-agent-team/lib/types/client/navigation.d.ts.map +1 -1
  70. package/packages/client-agent-team/lib/types/client/navigation.js +12 -6
  71. package/packages/client-agent-team/lib/types/client/requests.d.ts +16 -0
  72. package/packages/client-agent-team/lib/types/client/requests.d.ts.map +1 -0
  73. package/packages/client-agent-team/lib/types/client/requests.js +22 -0
  74. package/packages/client-agent-team/lib/types/client/slots.d.ts +2 -1
  75. package/packages/client-agent-team/lib/types/client/slots.d.ts.map +1 -1
  76. package/packages/client-agent-team/lib/types/client/task-refs.d.ts +6 -1
  77. package/packages/client-agent-team/lib/types/client/task-refs.d.ts.map +1 -1
  78. package/packages/client-agent-team/lib/types/client/task-refs.js +19 -0
  79. package/packages/client-agent-team/lib/types/client/team-formatters.d.ts +52 -3
  80. package/packages/client-agent-team/lib/types/client/team-formatters.d.ts.map +1 -1
  81. package/packages/client-agent-team/lib/types/client/team-formatters.js +74 -4
  82. package/packages/client-agent-team/lib/types/client/team-membership.d.ts.map +1 -1
  83. package/packages/client-agent-team/lib/types/client/team-membership.js +2 -1
  84. package/packages/tool-agent-team/README.md +7 -7
  85. package/packages/tool-agent-team/README.zh.md +7 -7
  86. package/packages/tool-agent-team/lib/index.js +38 -28
  87. package/packages/tool-agent-team/lib/types/index.d.ts.map +1 -1
  88. package/packages/client-agent-team/lib/types/client/TeamInboxPanel.d.ts +0 -13
  89. package/packages/client-agent-team/lib/types/client/TeamInboxPanel.d.ts.map +0 -1
  90. 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 RECOVERY_MAX_ATTEMPTS = 3;
11
+ export const RECOVERY_MAX_CONSECUTIVE_ERRORS = 3;
12
12
  /**
13
- * Per-member automatic recovery episodes. One episode covers a run of
14
- * identical errors; a changed error string starts a fresh one, and any clean
15
- * turn end clears the slate. After `maxAttempts` injections of the same error
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
- inject;
19
+ wake;
21
20
  onStandDown;
22
21
  delayMs;
23
- maxAttempts;
22
+ maxConsecutiveErrors;
24
23
  constructor(options) {
25
- this.inject = options.inject;
24
+ this.wake = options.wake;
26
25
  this.onStandDown = options.onStandDown;
27
26
  this.delayMs = options.delayMs ?? RECOVERY_DELAY_MS;
28
- this.maxAttempts = options.maxAttempts ?? RECOVERY_MAX_ATTEMPTS;
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
- const kind = classifyRecoverableError(errorMessage);
33
- if (kind === undefined) {
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 || episode.lastError !== errorMessage) {
40
- this.cancelTimer(episode);
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
- else if (episode.attempts >= this.maxAttempts) {
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.timer !== undefined)
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
- episode.timer = setTimeout(() => {
55
- episode.timer = undefined;
56
- episode.attempts += 1;
49
+ }
50
+ const timer = setTimeout(() => {
51
+ episode.timers.delete(timer);
57
52
  try {
58
- this.inject(memberId, episode.attempts, kind);
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.cancelTimer(episode);
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.cancelTimer(episode);
74
+ this.cancelTimers(episode);
79
75
  this.episodes.clear();
80
76
  }
81
- cancelTimer(episode) {
82
- if (episode?.timer === undefined)
83
- return;
84
- clearTimeout(episode.timer);
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,