@wowyuarm/dsh-agent-team 0.1.0
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/LICENSE +21 -0
- package/README.md +103 -0
- package/README.zh.md +103 -0
- package/cordis.patch.yml +36 -0
- package/package.json +152 -0
- package/packages/agent-team/README.md +58 -0
- package/packages/agent-team/README.zh.md +57 -0
- package/packages/agent-team/lib/index.js +841 -0
- package/packages/agent-team/lib/invariant.js +24 -0
- package/packages/agent-team/lib/ledger.js +2161 -0
- package/packages/agent-team/lib/member-context.js +69 -0
- package/packages/agent-team/lib/preset-roster.js +14 -0
- package/packages/agent-team/lib/spec.js +347 -0
- package/packages/agent-team/lib/typert.host.d.ts +3 -0
- package/packages/agent-team/lib/typert.host.js +2084 -0
- package/packages/agent-team/lib/typert.remote-client.d.ts +54 -0
- package/packages/agent-team/lib/typert.remote-client.d.ts.map +1 -0
- package/packages/agent-team/lib/typert.remote-client.js +1218 -0
- package/packages/agent-team/lib/types/index.d.ts +156 -0
- package/packages/agent-team/lib/types/index.d.ts.map +1 -0
- package/packages/agent-team/lib/types/invariant.d.ts +13 -0
- package/packages/agent-team/lib/types/invariant.d.ts.map +1 -0
- package/packages/agent-team/lib/types/ledger.d.ts +271 -0
- package/packages/agent-team/lib/types/ledger.d.ts.map +1 -0
- package/packages/agent-team/lib/types/member-context.d.ts +7 -0
- package/packages/agent-team/lib/types/member-context.d.ts.map +1 -0
- package/packages/agent-team/lib/types/preset-roster.d.ts +5 -0
- package/packages/agent-team/lib/types/preset-roster.d.ts.map +1 -0
- package/packages/agent-team/lib/types/spec.d.ts +13 -0
- package/packages/agent-team/lib/types/spec.d.ts.map +1 -0
- package/packages/agent-team/lib/types/types.d.ts +818 -0
- package/packages/agent-team/lib/types/types.d.ts.map +1 -0
- package/packages/agent-team/lib/types.js +1 -0
- package/packages/agent-team/preset/team-member/agent.cordis.yml +89 -0
- package/packages/client-agent-team/README.md +39 -0
- package/packages/client-agent-team/README.zh.md +39 -0
- package/packages/client-agent-team/lib/client.js +9633 -0
- package/packages/client-agent-team/lib/client.js.map +1 -0
- package/packages/client-agent-team/lib/index.js +5 -0
- package/packages/client-agent-team/lib/types/client/TeamAgentsPanel.d.ts +20 -0
- package/packages/client-agent-team/lib/types/client/TeamAgentsPanel.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamAgentsPanel.js +274 -0
- package/packages/client-agent-team/lib/types/client/TeamChannelPage.d.ts +19 -0
- package/packages/client-agent-team/lib/types/client/TeamChannelPage.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamChannelPage.js +243 -0
- package/packages/client-agent-team/lib/types/client/TeamChannelsPanel.d.ts +21 -0
- package/packages/client-agent-team/lib/types/client/TeamChannelsPanel.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamChannelsPanel.js +196 -0
- package/packages/client-agent-team/lib/types/client/TeamComposer.d.ts +15 -0
- package/packages/client-agent-team/lib/types/client/TeamComposer.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamComposer.js +144 -0
- package/packages/client-agent-team/lib/types/client/TeamConversation.d.ts +3 -0
- package/packages/client-agent-team/lib/types/client/TeamConversation.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamConversation.js +20 -0
- package/packages/client-agent-team/lib/types/client/TeamFooterAction.d.ts +3 -0
- package/packages/client-agent-team/lib/types/client/TeamFooterAction.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamFooterAction.js +19 -0
- package/packages/client-agent-team/lib/types/client/TeamInboxPanel.d.ts +13 -0
- package/packages/client-agent-team/lib/types/client/TeamInboxPanel.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamInboxPanel.js +90 -0
- package/packages/client-agent-team/lib/types/client/TeamMemberAvatar.d.ts +12 -0
- package/packages/client-agent-team/lib/types/client/TeamMemberAvatar.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamMemberAvatar.js +15 -0
- package/packages/client-agent-team/lib/types/client/TeamMembersAction.d.ts +5 -0
- package/packages/client-agent-team/lib/types/client/TeamMembersAction.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamMembersAction.js +32 -0
- package/packages/client-agent-team/lib/types/client/TeamMessage.d.ts +19 -0
- package/packages/client-agent-team/lib/types/client/TeamMessage.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamMessage.js +24 -0
- package/packages/client-agent-team/lib/types/client/TeamPresenceDot.d.ts +11 -0
- package/packages/client-agent-team/lib/types/client/TeamPresenceDot.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamPresenceDot.js +20 -0
- package/packages/client-agent-team/lib/types/client/TeamRowMenu.d.ts +15 -0
- package/packages/client-agent-team/lib/types/client/TeamRowMenu.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamRowMenu.js +23 -0
- package/packages/client-agent-team/lib/types/client/TeamSettings.d.ts +3 -0
- package/packages/client-agent-team/lib/types/client/TeamSettings.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamSettings.js +5 -0
- package/packages/client-agent-team/lib/types/client/TeamSidebarSection.d.ts +9 -0
- package/packages/client-agent-team/lib/types/client/TeamSidebarSection.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamSidebarSection.js +9 -0
- package/packages/client-agent-team/lib/types/client/TeamThreadPage.d.ts +22 -0
- package/packages/client-agent-team/lib/types/client/TeamThreadPage.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamThreadPage.js +464 -0
- package/packages/client-agent-team/lib/types/client/TeamWorkspaceBrowser.d.ts +3 -0
- package/packages/client-agent-team/lib/types/client/TeamWorkspaceBrowser.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamWorkspaceBrowser.js +39 -0
- package/packages/client-agent-team/lib/types/client/TeamWorkspaceRow.d.ts +11 -0
- package/packages/client-agent-team/lib/types/client/TeamWorkspaceRow.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/TeamWorkspaceRow.js +6 -0
- package/packages/client-agent-team/lib/types/client/index.d.ts +19 -0
- package/packages/client-agent-team/lib/types/client/index.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/index.js +113 -0
- package/packages/client-agent-team/lib/types/client/locales.d.ts +224 -0
- package/packages/client-agent-team/lib/types/client/locales.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/locales.js +222 -0
- package/packages/client-agent-team/lib/types/client/navigation.d.ts +39 -0
- package/packages/client-agent-team/lib/types/client/navigation.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/navigation.js +96 -0
- package/packages/client-agent-team/lib/types/client/slots.d.ts +74 -0
- package/packages/client-agent-team/lib/types/client/slots.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/slots.js +1 -0
- package/packages/client-agent-team/lib/types/client/team-changes.d.ts +28 -0
- package/packages/client-agent-team/lib/types/client/team-changes.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/team-changes.js +70 -0
- package/packages/client-agent-team/lib/types/client/team-formatters.d.ts +53 -0
- package/packages/client-agent-team/lib/types/client/team-formatters.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/team-formatters.js +128 -0
- package/packages/client-agent-team/lib/types/client/team-membership.d.ts +25 -0
- package/packages/client-agent-team/lib/types/client/team-membership.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/team-membership.js +39 -0
- package/packages/client-agent-team/lib/types/client/team-separators.d.ts +23 -0
- package/packages/client-agent-team/lib/types/client/team-separators.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/team-separators.js +52 -0
- package/packages/client-agent-team/lib/types/client/timeline-scroll.d.ts +18 -0
- package/packages/client-agent-team/lib/types/client/timeline-scroll.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/client/timeline-scroll.js +54 -0
- package/packages/client-agent-team/lib/types/index.d.ts +3 -0
- package/packages/client-agent-team/lib/types/index.d.ts.map +1 -0
- package/packages/client-agent-team/lib/types/index.js +2 -0
- package/packages/tool-agent-team/README.md +23 -0
- package/packages/tool-agent-team/README.zh.md +23 -0
- package/packages/tool-agent-team/lib/index.js +294 -0
- package/packages/tool-agent-team/lib/types/index.d.ts +5 -0
- package/packages/tool-agent-team/lib/types/index.d.ts.map +1 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { createUserMessage } from '@deepseek-ai/dsh-llm';
|
|
3
|
+
export const name = 'wowyuarm-agent-team-member-context';
|
|
4
|
+
const MAX_MEMORY_BYTES = 8 * 1024;
|
|
5
|
+
const BEGIN = '<team-member-private-memory>';
|
|
6
|
+
const END = '</team-member-private-memory>';
|
|
7
|
+
export function apply(ctx) {
|
|
8
|
+
ctx.on('agent/pre-step', async ({ agent, signal }, next) => {
|
|
9
|
+
const decision = await next();
|
|
10
|
+
if (decision.kind === 'reject' || signal.aborted)
|
|
11
|
+
return decision;
|
|
12
|
+
// The Host service is resolved at step time, never through plugin inject:
|
|
13
|
+
// this row mounts while the Host itself is still restoring Members, and a
|
|
14
|
+
// declared dependency on `agentTeam` would hold the preset mount open
|
|
15
|
+
// until the Host service is active, failing every startup restore.
|
|
16
|
+
const host = ctx.get('agentTeam');
|
|
17
|
+
if (host === undefined)
|
|
18
|
+
return decision;
|
|
19
|
+
const member = host.memberForAgent(agent);
|
|
20
|
+
if (member === undefined)
|
|
21
|
+
return decision;
|
|
22
|
+
let memory;
|
|
23
|
+
try {
|
|
24
|
+
memory = renderMemberMemory(await readFile(`${member.privateMemoryPath}/memory.md`), member.privateMemoryPath);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
memory = renderUnavailableMemory(member.privateMemoryPath, error.code === 'ENOENT'
|
|
28
|
+
? 'memory.md is absent; the private memory index is empty.'
|
|
29
|
+
: 'memory.md is currently unreadable; do not use any earlier private memory context.');
|
|
30
|
+
}
|
|
31
|
+
const text = `${renderMemberIdentity(member)}\n\n${memory}`;
|
|
32
|
+
const latestText = agent.session.surface.nodes.toReversed().flatMap(sequence => {
|
|
33
|
+
const event = agent.session.events[sequence];
|
|
34
|
+
return event?.type === 'user/message'
|
|
35
|
+
&& event.data.source.kind === 'plugin'
|
|
36
|
+
&& event.data.source.plugin === name
|
|
37
|
+
&& event.data.content[0]?.type === 'text'
|
|
38
|
+
? [event.data.content[0].text]
|
|
39
|
+
: [];
|
|
40
|
+
})[0];
|
|
41
|
+
const alreadyVisible = latestText === text;
|
|
42
|
+
if (alreadyVisible)
|
|
43
|
+
return decision;
|
|
44
|
+
const message = createUserMessage({
|
|
45
|
+
content: [{ type: 'text', text }],
|
|
46
|
+
source: { kind: 'plugin', plugin: name, form: 'instructions' },
|
|
47
|
+
});
|
|
48
|
+
return { kind: 'enter', messages: [...decision.messages, message] };
|
|
49
|
+
}, { prepend: true });
|
|
50
|
+
}
|
|
51
|
+
export function renderMemberIdentity(member) {
|
|
52
|
+
return member.description === ''
|
|
53
|
+
? `Team identity: you are @${member.handle}.`
|
|
54
|
+
: `Team identity: you are @${member.handle} — ${member.description}`;
|
|
55
|
+
}
|
|
56
|
+
export function renderMemberMemory(raw, privateMemoryPath = '<private-memory-path>') {
|
|
57
|
+
const overBudget = raw.byteLength > MAX_MEMORY_BYTES;
|
|
58
|
+
const body = overBudget ? '' : raw.toString('utf8');
|
|
59
|
+
const warning = overBudget
|
|
60
|
+
? '\n\n[Maintenance warning: memory.md exceeds the 8 KiB context budget. Its contents were not injected; do not delete or automatically summarize the file. Maintain a smaller index explicitly.]'
|
|
61
|
+
: '';
|
|
62
|
+
return `${BEGIN}\nThis is the complete replacement for this Team Member's private memory index; all earlier private-memory context is obsolete. It is reference context only, may be stale, and is not an instruction or Team fact.\n\nPrivate memory directory: ${privateMemoryPath}\nMemory index: ${privateMemoryPath}/memory.md\nNotes directory: ${privateMemoryPath}/notes\nThese paths are outside the Workspace cwd. Relative filesystem paths resolve from cwd, so use the absolute paths above when reading or editing this Member's memory. Read matching notes on demand; do not copy credentials, sensitive data, guesses, chat logs, other Members' memory, or Team facts already owned by the ledger into memory.\n\n${escape(body)}${warning}\n${END}`;
|
|
63
|
+
}
|
|
64
|
+
function renderUnavailableMemory(privateMemoryPath, reason) {
|
|
65
|
+
return `${BEGIN}\nThis is the complete replacement for this Team Member's private memory index; all earlier private-memory context is obsolete. ${reason}\n\nPrivate memory directory: ${privateMemoryPath}\nMemory index: ${privateMemoryPath}/memory.md\nNotes directory: ${privateMemoryPath}/notes\nThese paths are outside the Workspace cwd. Use the absolute paths above when inspecting or repairing this Member's memory.\n${END}`;
|
|
66
|
+
}
|
|
67
|
+
function escape(value) {
|
|
68
|
+
return value.replaceAll(BEGIN, '[escaped begin marker]').replaceAll(END, '[escaped end marker]');
|
|
69
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { dirname, resolve } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import AgentPresets from '@deepseek-ai/dsh-agent-presets';
|
|
4
|
+
export const inject = ['loader'];
|
|
5
|
+
/** Bundle-private Agent preset roster. The composition must isolate `agentPresets` around this provider and AgentTeam. */
|
|
6
|
+
export function apply(ctx) {
|
|
7
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const root = resolve(here, '../preset');
|
|
9
|
+
ctx.plugin(AgentPresets, {
|
|
10
|
+
default: 'team-member',
|
|
11
|
+
roots: [{ path: root, trust: 'system' }],
|
|
12
|
+
includeUserRoot: false,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { defineDomain, domainTable } from '@deepseek-ai/dsh-storage-domain';
|
|
3
|
+
const operationIdSchema = z.string().regex(/^operation:[^:]+$/).transform(value => value);
|
|
4
|
+
const requestIdSchema = z.string().min(1).transform(value => value);
|
|
5
|
+
const memberIdSchema = z.string().regex(/^member:[^:]+$/).transform(value => value);
|
|
6
|
+
const workspaceIdSchema = z.string().min(1).transform(value => value);
|
|
7
|
+
const sessionIdSchema = z.string().min(1).transform(value => value);
|
|
8
|
+
const channelRefSchema = z.string().regex(/^channel:[^:]+$/).transform(value => value);
|
|
9
|
+
const messageRefSchema = z.string().regex(/^message:[^:]+$/).transform(value => value);
|
|
10
|
+
const taskRefSchema = z.string().regex(/^task:[^:]+$/).transform(value => value);
|
|
11
|
+
const threadRefSchema = z.string().regex(/^thread:[^:]+$/).transform(value => value);
|
|
12
|
+
const claimRefSchema = z.string().regex(/^claim:[^:]+$/).transform(value => value);
|
|
13
|
+
const activityRefSchema = z.string().regex(/^activity:[^:]+$/).transform(value => value);
|
|
14
|
+
const actorSchema = z.discriminatedUnion('kind', [
|
|
15
|
+
z.object({ kind: z.literal('human'), memberId: memberIdSchema, handle: z.string().min(1) }).strict(),
|
|
16
|
+
z.object({ kind: z.literal('member'), memberId: memberIdSchema, handle: z.string().min(1) }).strict(),
|
|
17
|
+
]);
|
|
18
|
+
const operationBase = {
|
|
19
|
+
sequence: z.number().int().positive(),
|
|
20
|
+
operationId: operationIdSchema,
|
|
21
|
+
requestId: requestIdSchema,
|
|
22
|
+
occurredAt: z.string().datetime(),
|
|
23
|
+
actor: actorSchema,
|
|
24
|
+
};
|
|
25
|
+
const modelSelectionSchema = z.object({
|
|
26
|
+
provider: z.string().min(1),
|
|
27
|
+
model: z.string().min(1),
|
|
28
|
+
}).strict();
|
|
29
|
+
const memberSchema = z.object({
|
|
30
|
+
memberId: memberIdSchema,
|
|
31
|
+
sessionId: sessionIdSchema,
|
|
32
|
+
workspaceId: workspaceIdSchema,
|
|
33
|
+
handle: z.string().min(1),
|
|
34
|
+
description: z.string().min(1),
|
|
35
|
+
presetId: z.string().min(1),
|
|
36
|
+
// Ledgers written before per-Member model selection existed omit the field.
|
|
37
|
+
model: modelSelectionSchema.optional(),
|
|
38
|
+
privateMemoryPath: z.string().min(1),
|
|
39
|
+
state: z.union([z.literal('enabled'), z.literal('suspended'), z.literal('inactive')]),
|
|
40
|
+
}).strict();
|
|
41
|
+
const channelSchema = z.object({
|
|
42
|
+
channelRef: channelRefSchema,
|
|
43
|
+
workspaceId: workspaceIdSchema,
|
|
44
|
+
name: z.string().min(1),
|
|
45
|
+
description: z.string().min(1),
|
|
46
|
+
createdAtSequence: z.number().int().positive(),
|
|
47
|
+
}).strict();
|
|
48
|
+
// Ledgers written before message occurredAt existed store bare messages; the union schema below stamps them on load.
|
|
49
|
+
const messageSchema = z.object({
|
|
50
|
+
messageRef: messageRefSchema,
|
|
51
|
+
channelRef: channelRefSchema,
|
|
52
|
+
threadRef: threadRefSchema,
|
|
53
|
+
taskRef: taskRefSchema,
|
|
54
|
+
sender: memberIdSchema,
|
|
55
|
+
body: z.string().min(1),
|
|
56
|
+
topLevel: z.boolean(),
|
|
57
|
+
sequence: z.number().int().positive(),
|
|
58
|
+
occurredAt: z.string().datetime().optional(),
|
|
59
|
+
}).strict();
|
|
60
|
+
/** Stamp one bare stored message with the wrapping operation's occurrence instant; complete messages pass through unchanged. */
|
|
61
|
+
function stampMessage(occurredAt, message) {
|
|
62
|
+
const { occurredAt: stored } = message;
|
|
63
|
+
return stored === undefined ? { ...message, occurredAt } : { ...message, occurredAt: stored };
|
|
64
|
+
}
|
|
65
|
+
/** Stamp every bare stored message that carries its instant inside the same operation; Thread reads resolve cross-operation instants in the ledger. */
|
|
66
|
+
function stampOperationMessages(operation) {
|
|
67
|
+
if (operation.kind === 'team/message-sent') {
|
|
68
|
+
return { ...operation, data: { ...operation.data, message: stampMessage(operation.occurredAt, operation.data.message) } };
|
|
69
|
+
}
|
|
70
|
+
if (operation.kind === 'team/thread-replied') {
|
|
71
|
+
return { ...operation, data: { ...operation.data, message: stampMessage(operation.occurredAt, operation.data.message) } };
|
|
72
|
+
}
|
|
73
|
+
return operation;
|
|
74
|
+
}
|
|
75
|
+
const taskSchema = z.object({
|
|
76
|
+
taskRef: taskRefSchema,
|
|
77
|
+
channelRef: channelRefSchema,
|
|
78
|
+
threadRef: threadRefSchema,
|
|
79
|
+
status: z.union([z.literal('todo'), z.literal('in_progress'), z.literal('in_review'), z.literal('done'), z.literal('closed')]),
|
|
80
|
+
resolution: z.union([z.literal('open'), z.literal('accepted'), z.literal('closed')]),
|
|
81
|
+
}).strict();
|
|
82
|
+
const threadSchema = z.object({
|
|
83
|
+
threadRef: threadRefSchema,
|
|
84
|
+
taskRef: taskRefSchema,
|
|
85
|
+
revision: z.number().int().positive(),
|
|
86
|
+
}).strict();
|
|
87
|
+
const attentionSchema = z.object({
|
|
88
|
+
memberId: memberIdSchema,
|
|
89
|
+
threadRef: threadRefSchema,
|
|
90
|
+
startSequence: z.number().int().positive(),
|
|
91
|
+
readThroughSequence: z.number().int().nonnegative(),
|
|
92
|
+
}).strict();
|
|
93
|
+
const attentionKeySchema = z.object({
|
|
94
|
+
memberId: memberIdSchema,
|
|
95
|
+
threadRef: threadRefSchema,
|
|
96
|
+
}).strict();
|
|
97
|
+
const directMarkerSchema = z.object({
|
|
98
|
+
memberId: memberIdSchema,
|
|
99
|
+
threadRef: threadRefSchema,
|
|
100
|
+
messageRef: messageRefSchema,
|
|
101
|
+
sequence: z.number().int().positive(),
|
|
102
|
+
}).strict();
|
|
103
|
+
const activityMarkerSchema = z.object({
|
|
104
|
+
memberId: memberIdSchema,
|
|
105
|
+
threadRef: threadRefSchema,
|
|
106
|
+
activityRef: activityRefSchema,
|
|
107
|
+
sequence: z.number().int().positive(),
|
|
108
|
+
}).strict();
|
|
109
|
+
const inboxDeltaSchema = z.object({
|
|
110
|
+
attention: z.object({
|
|
111
|
+
set: z.array(attentionSchema),
|
|
112
|
+
removed: z.array(attentionKeySchema),
|
|
113
|
+
}).strict(),
|
|
114
|
+
directMarkers: z.object({
|
|
115
|
+
added: z.array(directMarkerSchema),
|
|
116
|
+
removed: z.array(directMarkerSchema),
|
|
117
|
+
}).strict(),
|
|
118
|
+
activityMarkers: z.object({
|
|
119
|
+
added: z.array(activityMarkerSchema),
|
|
120
|
+
removed: z.array(activityMarkerSchema),
|
|
121
|
+
}).strict(),
|
|
122
|
+
}).strict();
|
|
123
|
+
const claimSchema = z.object({
|
|
124
|
+
claimRef: claimRefSchema,
|
|
125
|
+
taskRef: taskRefSchema,
|
|
126
|
+
threadRef: threadRefSchema,
|
|
127
|
+
owner: memberIdSchema,
|
|
128
|
+
direction: z.string().min(1),
|
|
129
|
+
normalizedDirection: z.string().min(1),
|
|
130
|
+
state: z.union([z.literal('active'), z.literal('done'), z.literal('released')]),
|
|
131
|
+
}).strict();
|
|
132
|
+
const activityBase = {
|
|
133
|
+
activityRef: activityRefSchema,
|
|
134
|
+
taskRef: taskRefSchema,
|
|
135
|
+
threadRef: threadRefSchema,
|
|
136
|
+
actor: memberIdSchema,
|
|
137
|
+
sequence: z.number().int().positive(),
|
|
138
|
+
};
|
|
139
|
+
const claimActivitySchema = z.object({
|
|
140
|
+
...activityBase,
|
|
141
|
+
kind: z.union([z.literal('claim'), z.literal('done'), z.literal('release')]),
|
|
142
|
+
claimRef: claimRefSchema,
|
|
143
|
+
}).strict();
|
|
144
|
+
const taskActivitySchema = z.object({
|
|
145
|
+
...activityBase,
|
|
146
|
+
kind: z.union([z.literal('accept'), z.literal('close'), z.literal('reopen')]),
|
|
147
|
+
releasedClaimRefs: z.array(claimRefSchema).min(1).optional(),
|
|
148
|
+
}).strict();
|
|
149
|
+
const claimsReleasedActivitySchema = z.object({
|
|
150
|
+
...activityBase,
|
|
151
|
+
kind: z.literal('claims_released'),
|
|
152
|
+
claimRefs: z.array(claimRefSchema).min(1),
|
|
153
|
+
}).strict();
|
|
154
|
+
const activitySchema = z.discriminatedUnion('kind', [claimActivitySchema, taskActivitySchema, claimsReleasedActivitySchema]);
|
|
155
|
+
const threadFactSchema = z.discriminatedUnion('kind', [
|
|
156
|
+
z.object({ kind: z.literal('message'), sequence: z.number().int().positive(), message: messageSchema,
|
|
157
|
+
mentions: z.array(memberIdSchema) }).strict(),
|
|
158
|
+
z.object({ kind: z.literal('activity'), sequence: z.number().int().positive(), activity: activitySchema }).strict(),
|
|
159
|
+
]);
|
|
160
|
+
const readFactSchema = z.object({
|
|
161
|
+
fact: threadFactSchema,
|
|
162
|
+
unread: z.boolean(),
|
|
163
|
+
direct: z.boolean(),
|
|
164
|
+
}).strict();
|
|
165
|
+
const claimOperation = (kind) => z.object({
|
|
166
|
+
...operationBase,
|
|
167
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
168
|
+
kind: z.literal(kind),
|
|
169
|
+
data: z.object({
|
|
170
|
+
workspaceId: workspaceIdSchema,
|
|
171
|
+
baseRevision: z.number().int().positive(),
|
|
172
|
+
activity: claimActivitySchema,
|
|
173
|
+
claim: claimSchema,
|
|
174
|
+
task: taskSchema,
|
|
175
|
+
thread: threadSchema,
|
|
176
|
+
inbox: inboxDeltaSchema,
|
|
177
|
+
}).strict(),
|
|
178
|
+
}).strict();
|
|
179
|
+
/** Closed Agent Team operation union before occurrence stamping. */
|
|
180
|
+
const storedAgentTeamOperationSchema = z.discriminatedUnion('kind', [
|
|
181
|
+
z.object({
|
|
182
|
+
...operationBase,
|
|
183
|
+
previousOperationId: z.null(),
|
|
184
|
+
kind: z.literal('team/initialized'),
|
|
185
|
+
data: z.object({ humanMemberId: memberIdSchema }).strict(),
|
|
186
|
+
}).strict(),
|
|
187
|
+
z.object({
|
|
188
|
+
...operationBase,
|
|
189
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
190
|
+
kind: z.literal('team/channel-created'),
|
|
191
|
+
data: z.object({
|
|
192
|
+
workspaceId: workspaceIdSchema,
|
|
193
|
+
channel: channelSchema,
|
|
194
|
+
memberIds: z.array(memberIdSchema),
|
|
195
|
+
}).strict(),
|
|
196
|
+
}).strict(),
|
|
197
|
+
z.object({
|
|
198
|
+
...operationBase,
|
|
199
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
200
|
+
kind: z.literal('team/member-added'),
|
|
201
|
+
data: z.object({ member: memberSchema, channelRefs: z.array(channelRefSchema).min(1) }).strict(),
|
|
202
|
+
}).strict(),
|
|
203
|
+
z.object({
|
|
204
|
+
...operationBase,
|
|
205
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
206
|
+
kind: z.literal('team/member-suspended'),
|
|
207
|
+
data: z.object({ member: memberSchema }).strict(),
|
|
208
|
+
}).strict(),
|
|
209
|
+
z.object({
|
|
210
|
+
...operationBase,
|
|
211
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
212
|
+
kind: z.literal('team/member-resumed'),
|
|
213
|
+
data: z.object({ member: memberSchema }).strict(),
|
|
214
|
+
}).strict(),
|
|
215
|
+
z.object({
|
|
216
|
+
...operationBase,
|
|
217
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
218
|
+
kind: z.literal('team/channel-updated'),
|
|
219
|
+
data: z.object({ workspaceId: workspaceIdSchema, channel: channelSchema }).strict(),
|
|
220
|
+
}).strict(),
|
|
221
|
+
z.object({
|
|
222
|
+
...operationBase,
|
|
223
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
224
|
+
kind: z.literal('team/member-updated'),
|
|
225
|
+
data: z.object({ member: memberSchema }).strict(),
|
|
226
|
+
}).strict(),
|
|
227
|
+
z.object({
|
|
228
|
+
...operationBase,
|
|
229
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
230
|
+
kind: z.literal('team/channel-member-added'),
|
|
231
|
+
data: z.object({ workspaceId: workspaceIdSchema, channelRef: channelRefSchema, memberId: memberIdSchema }).strict(),
|
|
232
|
+
}).strict(),
|
|
233
|
+
z.object({
|
|
234
|
+
...operationBase,
|
|
235
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
236
|
+
kind: z.literal('team/channel-member-removed'),
|
|
237
|
+
data: z.object({
|
|
238
|
+
workspaceId: workspaceIdSchema,
|
|
239
|
+
channelRef: channelRefSchema,
|
|
240
|
+
memberId: memberIdSchema,
|
|
241
|
+
claims: z.array(claimSchema),
|
|
242
|
+
activities: z.array(claimsReleasedActivitySchema),
|
|
243
|
+
tasks: z.array(taskSchema),
|
|
244
|
+
threads: z.array(threadSchema),
|
|
245
|
+
inbox: inboxDeltaSchema,
|
|
246
|
+
}).strict(),
|
|
247
|
+
}).strict(),
|
|
248
|
+
z.object({
|
|
249
|
+
...operationBase,
|
|
250
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
251
|
+
kind: z.literal('team/message-sent'),
|
|
252
|
+
data: z.object({
|
|
253
|
+
workspaceId: workspaceIdSchema,
|
|
254
|
+
mentions: z.array(memberIdSchema),
|
|
255
|
+
message: messageSchema,
|
|
256
|
+
task: taskSchema,
|
|
257
|
+
thread: threadSchema,
|
|
258
|
+
inbox: inboxDeltaSchema,
|
|
259
|
+
}).strict(),
|
|
260
|
+
}).strict(),
|
|
261
|
+
z.object({
|
|
262
|
+
...operationBase,
|
|
263
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
264
|
+
kind: z.literal('team/thread-replied'),
|
|
265
|
+
data: z.object({
|
|
266
|
+
workspaceId: workspaceIdSchema,
|
|
267
|
+
baseRevision: z.number().int().positive(),
|
|
268
|
+
mentions: z.array(memberIdSchema),
|
|
269
|
+
message: messageSchema,
|
|
270
|
+
task: taskSchema,
|
|
271
|
+
thread: threadSchema,
|
|
272
|
+
inbox: inboxDeltaSchema,
|
|
273
|
+
}).strict(),
|
|
274
|
+
}).strict(),
|
|
275
|
+
claimOperation('team/claim-created'),
|
|
276
|
+
claimOperation('team/claim-done'),
|
|
277
|
+
claimOperation('team/claim-released'),
|
|
278
|
+
z.object({
|
|
279
|
+
...operationBase,
|
|
280
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
281
|
+
kind: z.literal('team/task-changed'),
|
|
282
|
+
data: z.object({
|
|
283
|
+
workspaceId: workspaceIdSchema,
|
|
284
|
+
baseRevision: z.number().int().positive(),
|
|
285
|
+
activity: taskActivitySchema,
|
|
286
|
+
task: taskSchema,
|
|
287
|
+
thread: threadSchema,
|
|
288
|
+
claims: z.array(claimSchema),
|
|
289
|
+
inbox: inboxDeltaSchema,
|
|
290
|
+
}).strict(),
|
|
291
|
+
}).strict(),
|
|
292
|
+
z.object({
|
|
293
|
+
...operationBase,
|
|
294
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
295
|
+
kind: z.literal('team/thread-attention-changed'),
|
|
296
|
+
data: z.object({
|
|
297
|
+
workspaceId: workspaceIdSchema,
|
|
298
|
+
action: z.union([z.literal('follow'), z.literal('unfollow')]),
|
|
299
|
+
memberId: memberIdSchema,
|
|
300
|
+
task: taskSchema,
|
|
301
|
+
thread: threadSchema,
|
|
302
|
+
inbox: inboxDeltaSchema,
|
|
303
|
+
}).strict(),
|
|
304
|
+
}).strict(),
|
|
305
|
+
z.object({
|
|
306
|
+
...operationBase,
|
|
307
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
308
|
+
kind: z.literal('team/thread-read'),
|
|
309
|
+
data: z.object({
|
|
310
|
+
workspaceId: workspaceIdSchema,
|
|
311
|
+
memberId: memberIdSchema,
|
|
312
|
+
task: taskSchema,
|
|
313
|
+
thread: threadSchema,
|
|
314
|
+
claims: z.array(claimSchema),
|
|
315
|
+
anchor: messageSchema,
|
|
316
|
+
anchorMentions: z.array(memberIdSchema),
|
|
317
|
+
facts: z.array(readFactSchema),
|
|
318
|
+
readThroughSequence: z.number().int().nonnegative(),
|
|
319
|
+
remainingUnreadCount: z.number().int().nonnegative(),
|
|
320
|
+
attention: attentionSchema.optional(),
|
|
321
|
+
inbox: inboxDeltaSchema,
|
|
322
|
+
}).strict(),
|
|
323
|
+
}).strict(),
|
|
324
|
+
z.object({
|
|
325
|
+
...operationBase,
|
|
326
|
+
previousOperationId: operationIdSchema.nullable(),
|
|
327
|
+
kind: z.literal('team/member-removed'),
|
|
328
|
+
data: z.object({
|
|
329
|
+
member: memberSchema,
|
|
330
|
+
claims: z.array(claimSchema),
|
|
331
|
+
activities: z.array(claimsReleasedActivitySchema),
|
|
332
|
+
tasks: z.array(taskSchema),
|
|
333
|
+
threads: z.array(threadSchema),
|
|
334
|
+
inbox: inboxDeltaSchema,
|
|
335
|
+
}).strict(),
|
|
336
|
+
}).strict(),
|
|
337
|
+
]);
|
|
338
|
+
/** Durable validator for the closed Agent Team operation union; ledgers written before message occurredAt existed normalize on load. */
|
|
339
|
+
export const agentTeamOperationSchema = storedAgentTeamOperationSchema.transform(stampOperationMessages);
|
|
340
|
+
/** Versioned durable Agent Team declaration; v1 is the first public ledger format and older local media reject at open. */
|
|
341
|
+
export const agentTeamDomainSpec = defineDomain({
|
|
342
|
+
name: 'agent_team',
|
|
343
|
+
version: 1,
|
|
344
|
+
tables: {
|
|
345
|
+
operations: domainTable(agentTeamOperationSchema),
|
|
346
|
+
},
|
|
347
|
+
});
|