dsh-team 0.2.5 → 0.2.7

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.
@@ -1 +1 @@
1
- {"version":3,"file":"client.ts","names":[],"sources":["../src/contract.d.ts","../src/client/TeamStage.d.ts","../src/client/locales.d.ts","../src/client/index.d.ts"],"sourcesContent":["/**\n * The team vocabulary shared by the host half and the browser half: the\n * durable projection value, the mailbox message source, and the relationship\n * model. Types only — the browser bundle imports this module type-only, so it\n * must never grow a runtime import of a host package.\n *\n * @module dsh-team/contract\n */\n/** The two relationship levels between the leader and a teammate. */\nexport type TeamRelation = 'managed' | 'peer';\n/** Lifecycle of one shared task. */\nexport type TeamTaskStatus = 'pending' | 'active' | 'done';\n/** What kind of traffic one mailbox row records. */\nexport type TeamMessageKind = \n/** Content one member addressed to another through `team_send`. */\n'message'\n/** A teammate's own result, delivered through the harness `report` tool. */\n | 'report'\n/** The runtime's account of a teammate's activation ending. */\n | 'settled';\n/** One teammate as the leader's log records it. */\nexport interface TeamMemberView {\n /** The teammate's session id; the address every team tool takes. */\n readonly memberId: string;\n readonly name: string;\n readonly role?: string;\n readonly relation: TeamRelation;\n /** Model route recorded at spawn, when the leader overrode its own. */\n readonly model?: string;\n /** Provider-owned reasoning effort recorded at spawn, when one was requested. */\n readonly effort?: string;\n /** Epoch ms of the spawn that added this member. */\n readonly joinedAt: number;\n}\n/** One shared task. */\nexport interface TeamTaskView {\n readonly taskId: string;\n readonly title: string;\n /** Assigned teammate; absent means unassigned (leader-held). */\n readonly assigneeId?: string;\n readonly status: TeamTaskStatus;\n /** Closing note recorded by whoever moved the task to `done`. */\n readonly note?: string;\n}\n/**\n * One mailbox row. `from`/`to` absent means the leader — the projection is\n * served per session, so the owning session needs no id of its own.\n */\nexport interface TeamMessageView {\n readonly messageId: string;\n readonly from?: string;\n readonly to?: string;\n readonly kind: TeamMessageKind;\n readonly text: string;\n readonly time: number;\n /**\n * Depth of this delivery in its conversation chain: 0 is a message the\n * leader started, and every teammate-to-teammate relay adds one. A row\n * without it was written before the plugin recorded chains.\n */\n readonly hop?: number;\n}\n/**\n * One entry of the team's shared workspace, as the leader's log last recorded\n * it. Only the shared area is ever projected: a member's private pad stays\n * private, including from this panel.\n */\nexport interface TeamBoardEntryView {\n readonly key: string;\n /** Session id of the member that wrote it last. */\n readonly authorId: string;\n readonly authorName: string;\n readonly updatedAt: number;\n /** First non-empty line, bounded — the projection never carries note bodies. */\n readonly preview: string;\n}\n/** The durable team state folded from one leader session's log. */\nexport interface TeamView {\n /** True once a spawn settled and the team was not ended afterwards. */\n readonly active: boolean;\n readonly members: readonly TeamMemberView[];\n readonly tasks: readonly TeamTaskView[];\n /** Bounded newest-last mailbox feed of leader-visible traffic. */\n readonly messages: readonly TeamMessageView[];\n /**\n * The shared workspace as of the last time the leader read or wrote it.\n * Teammates write straight to the durable workspace, which no session log\n * records, so this index is a snapshot rather than a live view.\n */\n readonly board: readonly TeamBoardEntryView[];\n /** When that snapshot was taken; absent while the leader has never looked. */\n readonly boardAt?: number;\n}\n/** The empty value every session without a team folds to. */\nexport declare const EMPTY_TEAM_VIEW: TeamView;\n/**\n * One delivery's place in a conversation chain. A chain begins whenever the\n * leader addresses a teammate and grows by one hop with every relay a teammate\n * makes off the message it is working from; escalation to the leader always\n * ends it. The pair is what bounds a peer conversation mechanically instead of\n * by prompt — see `src/service.ts`.\n */\nexport interface TeamChain {\n /** Identity of the conversation this delivery belongs to (per leader, per process). */\n readonly chainId: string;\n /** Relays between the chain's first delivery and this one. */\n readonly hop: number;\n}\n/**\n * Durable attribution for one team mailbox delivery, carried by the recipient's\n * own `user/message` event so the sender survives persistence on both sides.\n */\nexport interface TeamMessageSource extends TeamChain {\n readonly kind: 'team-message';\n /** A message another agent addressed to this one (`relay` context form). */\n readonly form: 'relay';\n /** Session id of the sending member, or of the leader. */\n readonly senderSessionId: string;\n /** Display name of the sender at delivery time. */\n readonly senderName: string;\n}\n/** The projection key this plugin owns. */\nexport declare const TEAM_PROJECTION_KEY = \"team\";\n","import type { PropsLocale, PropsRuntime, SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots';\nimport type { TeamBoardEntryView, TeamMemberView, TeamMessageView, TeamTaskView } from '../contract.ts';\n/** What the plugin's session follower publishes to this entry. */\nexport interface TeamPanelState {\n /** The session whose log owns the team; absent while no team is in view. */\n readonly leaderId?: string;\n /** The session currently open, so the stage can mark the one you are reading. */\n readonly currentId?: string;\n readonly members: readonly TeamMemberView[];\n readonly tasks: readonly TeamTaskView[];\n readonly messages: readonly TeamMessageView[];\n /** The shared workspace as the leader's log last recorded it. */\n readonly board: readonly TeamBoardEntryView[];\n /** When that snapshot was taken; absent while the leader has never looked. */\n readonly boardAt?: number;\n}\n/** Navigation and chrome the plugin body owns (it holds the client services). */\nexport interface TeamInjected {\n /** Open one teammate's transcript through its durable parent address. */\n readonly openMember: (leaderId: string, memberId: string) => void;\n /** Return to the leader's own conversation. */\n readonly openLeader: (leaderId: string) => void;\n /**\n * Take the composer seat for as long as the room is on screen; the returned\n * disposer hands it back. The room is a picture, not a place you type into,\n * and the tab is worth more than the strip of window the input card takes.\n */\n readonly holdComposer?: () => () => void;\n}\n/** Complete view-tab props: the root kit, the locale, and the inject face. */\nexport type TeamStageProps = PropsRuntime<'conversation.view'> & PropsLocale<'team'> & TeamInjected & {\n readonly useTeam: SnapshotSelectorHook<TeamPanelState>;\n};\n/**\n * The team stage. Rendered as one conversation view tab, so it exists only\n * while the surrounding session has a team — an ordinary conversation never\n * grows a tab it cannot fill.\n */\nexport declare function TeamStage(props: TeamStageProps): import(\"react\").JSX.Element;\n","/** Locale copy for the agent-team stage view. Product copy is Chinese. */\nexport declare const NS = \"team\";\nexport declare const zh: {\n readonly 'view.title': \"Agent 团队\";\n readonly 'stage.title': \"团队协作室\";\n readonly 'stage.room': \"协作室\";\n readonly 'stage.feed': \"消息流\";\n readonly 'stage.board': \"任务板\";\n readonly 'stage.workspace': \"共享工作区\";\n readonly 'stage.members': \"{count} 名成员\";\n readonly 'stage.running': \"{count} 名工作中\";\n readonly 'stage.idle': \"全部空闲\";\n readonly 'stage.tasks': \"{open}/{total} 项任务\";\n readonly 'stage.noTeam': \"这个会话还没有组建团队\";\n readonly 'stage.noTeamHint': \"让主会话调用 team_spawn 派生第一名队友。\";\n readonly 'stage.noMessages': \"还没有消息往来\";\n readonly 'stage.noTasks': \"还没有任务\";\n readonly 'stage.noNotes': \"共享工作区还是空的\";\n readonly 'stage.noNotesHint': \"成员用 team_note 把结论写在这里,不必互相发消息。\";\n readonly 'stage.boardAt': \"{time} 的快照\";\n readonly 'stage.boardStale': \"队友的写入直接进持久工作区,不经过主会话的日志——这里是主会话最后一次读写时的样子\";\n readonly 'stage.peerRing': \"同级成员可以直接走过去找对方;受管成员只找主会话\";\n readonly 'stage.roomHint': \"每个成员都有自己的工位;要说话就走过去说\";\n readonly 'stage.dock': \"协作面板\";\n readonly 'drawer.close': \"收起面板\";\n readonly 'feed.crew': \"成员状态\";\n readonly 'feed.log': \"往来记录\";\n readonly 'feed.open': \"在手 {count}\";\n readonly 'feed.quiet': \"还没有往来\";\n readonly 'screen.working': \"工作中…\";\n readonly 'member.leader': \"主会话\";\n readonly 'member.open': \"打开 {name} 的会话\";\n readonly 'member.openLeader': \"回到主会话\";\n readonly 'member.here': \"你正在看这个会话\";\n readonly 'relation.managed': \"受管\";\n readonly 'relation.peer': \"同级\";\n readonly 'status.running': \"工作中\";\n readonly 'status.idle': \"空闲\";\n readonly 'task.pending': \"待办\";\n readonly 'task.active': \"进行中\";\n readonly 'task.done': \"已完成\";\n readonly 'task.unassigned': \"未指派\";\n readonly 'message.report': \"汇报\";\n readonly 'message.settled': \"已收工\";\n readonly 'message.hop': \"第 {hop} 跳\";\n readonly 'message.hopHint': \"这条消息在一次队友间对话里的转发深度;深度用完只能回到主会话\";\n};\n/** The namespace's dictionary key union (literal keys, locale-typed seats). */\nexport type TeamKey = keyof typeof zh;\nexport declare const en: Record<TeamKey, string>;\n","/**\n * Browser half of dsh-team: follow the current session's `team` projection and\n * contribute the team stage as one conversation view tab.\n *\n * There is no client-side fold. The host computes the team value once and the\n * framework pushes it here (history tail baseline + `session/projection`\n * frames), so this module only tracks WHICH session's value is on screen — and\n * whether that session has a team at all, because the tab exists exactly while\n * it does: an ordinary conversation never grows a view it cannot fill.\n */\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client';\nimport { type TeamPanelState } from './TeamStage.tsx';\nimport { type TeamKey } from './locales.ts';\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** Agent-team stage copy. */\n team: TeamKey;\n }\n}\n/** Required services: the slot registry, the session domain, and locale. */\nexport declare const inject: string[];\n/**\n * Register the locale dictionary and the view tab, and keep the stage store\n * pointed at the right session.\n * @param ctx - client root context.\n */\nexport declare function apply(ctx: ClientContext): void;\nexport type { TeamPanelState };\n"],"mappings":";;;;;;AAAA,IAAW,CAAC,gBAAgB;CAAC;OAAU,CAAC;CAAG,CAAC;AAAC;AAC7C,IAAW,CAAC,kBAAkB;CAAC;OAAU,CAAC;CAAG,CAAC;AAAC;AAC/C,IAAW,CAAC,mBAAmB;CAAC;OAAU,CAAC;CAAG,CAAC;AAAC;AAChD,IAAW,CAAC,kBAAkB;CAAC;OAAU,CAAC,YAAY;CAAG;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;CAAE;AAAC;AACzF,IAAW,CAAC,gBAAgB;CAAC;OAAU,CAAC,cAAc;CAAG;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI;CAAE;AAAC;AACjF,IAAW,CAAC,mBAAmB;CAAC;OAAU,CAAC,eAAe;CAAG;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;CAAE;AAAC;AAC7F,IAAW,CAAC,sBAAsB;CAAC;OAAU,CAAC;CAAG;EAAC;EAAI;EAAI;EAAI;EAAI;CAAE;AAAC;;;;ACJrE,IAAW,CAAC,kBAAkB;CAAC;OAAS;EAAC;EAAgB;EAAc;EAAiB;CAAkB;CAAG;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;CAAE;AAAC;;;;ACDzJ,IAAW,CAAC,MAAM;CAAC;OAAS,CAAC;CAAG;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;CAAE;AAAC;AAC5M,IAAW,CAAC,WAAW;CAAC;OAAS,CAAC,EAAE;CAAG,CAAC,EAAE;AAAC;;;;ACC3C,IAAI,CAAC,MAAM;CAAC;OAAS,CAAC,OAAO;CAAG;EAAC;EAAI;EAAI;CAAE;CAAG,WAAW,EAAE;AAAC;AAC5D,IAAW,CAAC,UAAU;CAAC;OAAS,CAAC;CAAG,CAAC;AAAC;AACtC,IAAW,CAAC,SAAS;CAAC;OAAS,CAAC,aAAa;CAAG,CAAC,IAAI,EAAE;AAAC"}
1
+ {"version":3,"file":"client.ts","names":[],"sources":["../src/contract.d.ts","../src/client/TeamStage.d.ts","../src/client/locales.d.ts","../src/client/index.d.ts"],"sourcesContent":["/**\n * The team vocabulary shared by the host half and the browser half: the\n * durable projection value, the mailbox message source, and the relationship\n * model. Types only — the browser bundle imports this module type-only, so it\n * must never grow a runtime import of a host package.\n *\n * @module dsh-team/contract\n */\n/** The two relationship levels between the leader and a teammate. */\nexport type TeamRelation = 'managed' | 'peer';\n/** Lifecycle of one shared task. */\nexport type TeamTaskStatus = 'pending' | 'active' | 'done';\n/** What kind of traffic one mailbox row records. */\nexport type TeamMessageKind = \n/** Content one member addressed to another through `team_send`. */\n'message'\n/** A teammate's own result, delivered through the harness `report` tool. */\n | 'report'\n/** The runtime's account of a teammate's activation ending. */\n | 'settled';\n/** One teammate as the leader's log records it. */\nexport interface TeamMemberView {\n /** The teammate's session id; the address every team tool takes. */\n readonly memberId: string;\n readonly name: string;\n readonly role?: string;\n readonly relation: TeamRelation;\n /** Model route recorded at spawn, when the leader overrode its own. */\n readonly model?: string;\n /** Provider-owned reasoning effort recorded at spawn, when one was requested. */\n readonly effort?: string;\n /** Epoch ms of the spawn that added this member. */\n readonly joinedAt: number;\n}\n/** One shared task. */\nexport interface TeamTaskView {\n readonly taskId: string;\n readonly title: string;\n /** Assigned teammate; absent means unassigned (leader-held). */\n readonly assigneeId?: string;\n readonly status: TeamTaskStatus;\n /** Closing note recorded by whoever moved the task to `done`. */\n readonly note?: string;\n}\n/**\n * One mailbox row. `from`/`to` absent means the leader — the projection is\n * served per session, so the owning session needs no id of its own.\n */\nexport interface TeamMessageView {\n readonly messageId: string;\n readonly from?: string;\n readonly to?: string;\n readonly kind: TeamMessageKind;\n readonly text: string;\n readonly time: number;\n /**\n * Depth of this delivery in its conversation chain: 0 is a message the\n * leader started, and every teammate-to-teammate relay adds one. A row\n * without it was written before the plugin recorded chains.\n */\n readonly hop?: number;\n}\n/**\n * One entry of the team's shared workspace, as the leader's log last recorded\n * it. Only the shared area is ever projected: a member's private pad stays\n * private, including from this panel.\n */\nexport interface TeamBoardEntryView {\n readonly key: string;\n /** Session id of the member that wrote it last. */\n readonly authorId: string;\n readonly authorName: string;\n readonly updatedAt: number;\n /** First non-empty line, bounded — the projection never carries note bodies. */\n readonly preview: string;\n}\n/** The durable team state folded from one leader session's log. */\nexport interface TeamView {\n /** True once a spawn settled and the team was not ended afterwards. */\n readonly active: boolean;\n readonly members: readonly TeamMemberView[];\n readonly tasks: readonly TeamTaskView[];\n /** Bounded newest-last mailbox feed of leader-visible traffic. */\n readonly messages: readonly TeamMessageView[];\n /**\n * The shared workspace as of the last time the leader read or wrote it.\n * Teammates write straight to the durable workspace, which no session log\n * records, so this index is a snapshot rather than a live view.\n */\n readonly board: readonly TeamBoardEntryView[];\n /** When that snapshot was taken; absent while the leader has never looked. */\n readonly boardAt?: number;\n}\n/** The empty value every session without a team folds to. */\nexport declare const EMPTY_TEAM_VIEW: TeamView;\n/**\n * One delivery's place in a conversation chain. A chain begins whenever the\n * leader addresses a teammate and grows by one hop with every relay a teammate\n * makes off the message it is working from; escalation to the leader always\n * ends it. The pair is what bounds a peer conversation mechanically instead of\n * by prompt — see `src/service.ts`.\n */\nexport interface TeamChain {\n /** Identity of the conversation this delivery belongs to (per leader, per process). */\n readonly chainId: string;\n /** Relays between the chain's first delivery and this one. */\n readonly hop: number;\n}\n/**\n * Durable attribution for one team mailbox delivery, carried by the recipient's\n * own `user/message` event so the sender survives persistence on both sides.\n */\nexport interface TeamMessageSource extends TeamChain {\n readonly kind: 'team-message';\n /** A message another agent addressed to this one (`relay` context form). */\n readonly form: 'relay';\n /** Session id of the sending member, or of the leader. */\n readonly senderSessionId: string;\n /** Display name of the sender at delivery time. */\n readonly senderName: string;\n}\n/** The projection key this plugin owns. */\nexport declare const TEAM_PROJECTION_KEY = \"team\";\n","import type { PropsLocale, PropsRuntime, SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots';\nimport type { TeamBoardEntryView, TeamMemberView, TeamMessageView, TeamTaskView } from '../contract.ts';\n/** What the plugin's session follower publishes to this entry. */\nexport interface TeamPanelState {\n /** The session whose log owns the team; absent while no team is in view. */\n readonly leaderId?: string;\n /** The session currently open, so the stage can mark the one you are reading. */\n readonly currentId?: string;\n readonly members: readonly TeamMemberView[];\n readonly tasks: readonly TeamTaskView[];\n readonly messages: readonly TeamMessageView[];\n /** The shared workspace as the leader's log last recorded it. */\n readonly board: readonly TeamBoardEntryView[];\n /** When that snapshot was taken; absent while the leader has never looked. */\n readonly boardAt?: number;\n}\n/** Navigation and chrome the plugin body owns (it holds the client services). */\nexport interface TeamInjected {\n /** Open one teammate's transcript through its durable parent address. */\n readonly openMember: (leaderId: string, memberId: string) => void;\n /** Return to the leader's own conversation. */\n readonly openLeader: (leaderId: string) => void;\n /**\n * Take the composer seat for as long as the room is on screen; the returned\n * disposer hands it back. The room is a picture, not a place you type into,\n * and the tab is worth more than the strip of window the input card takes.\n */\n readonly holdComposer?: () => () => void;\n}\n/** Complete view-tab props: the root kit, the locale, and the inject face. */\nexport type TeamStageProps = PropsRuntime<'conversation.view'> & PropsLocale<'team'> & TeamInjected & {\n readonly useTeam: SnapshotSelectorHook<TeamPanelState>;\n};\n/**\n * The team stage. Rendered as one conversation view tab, so it exists only\n * while the surrounding session has a team — an ordinary conversation never\n * grows a tab it cannot fill.\n */\nexport declare function TeamStage(props: TeamStageProps): import(\"react\").JSX.Element;\n","/** Locale copy for the agent-team stage view. Product copy is Chinese. */\nexport declare const NS = \"team\";\nexport declare const zh: {\n readonly 'view.title': \"Agent 团队\";\n readonly 'stage.title': \"团队协作室\";\n readonly 'stage.room': \"协作室\";\n readonly 'stage.feed': \"消息流\";\n readonly 'stage.board': \"任务板\";\n readonly 'stage.workspace': \"共享工作区\";\n readonly 'stage.members': \"{count} 名成员\";\n readonly 'stage.running': \"{count} 名工作中\";\n readonly 'stage.idle': \"全部空闲\";\n readonly 'stage.tasks': \"{open}/{total} 项任务\";\n readonly 'stage.noTeam': \"这个会话还没有组建团队\";\n readonly 'stage.noTeamHint': \"让主会话调用 team_spawn 派生第一名队友。\";\n readonly 'stage.noMessages': \"还没有消息往来\";\n readonly 'stage.noTasks': \"还没有任务\";\n readonly 'stage.noNotes': \"共享工作区还是空的\";\n readonly 'stage.noNotesHint': \"成员用 team_note 把结论写在这里,不必互相发消息。\";\n readonly 'stage.boardAt': \"{time} 的快照\";\n readonly 'stage.boardStale': \"队友的写入直接进持久工作区,不经过主会话的日志——这里是主会话最后一次读写时的样子\";\n readonly 'stage.peerRing': \"同级成员可以直接走过去找对方;受管成员只找主会话\";\n readonly 'stage.roomHint': \"每个成员都有自己的工位;要说话就走过去说\";\n readonly 'stage.dock': \"协作面板\";\n readonly 'drawer.close': \"收起面板\";\n readonly 'feed.crew': \"成员状态\";\n readonly 'feed.log': \"往来记录\";\n readonly 'feed.open': \"在手 {count}\";\n readonly 'feed.quiet': \"还没有往来\";\n readonly 'screen.working': \"工作中…\";\n readonly 'member.leader': \"主会话\";\n readonly 'member.open': \"打开 {name} 的会话\";\n readonly 'member.openLeader': \"回到主会话\";\n readonly 'relation.managed': \"受管\";\n readonly 'relation.peer': \"同级\";\n readonly 'status.running': \"工作中\";\n readonly 'status.idle': \"空闲\";\n readonly 'task.pending': \"待办\";\n readonly 'task.active': \"进行中\";\n readonly 'task.done': \"已完成\";\n readonly 'task.unassigned': \"未指派\";\n readonly 'message.report': \"汇报\";\n readonly 'message.settled': \"已收工\";\n readonly 'message.hop': \"第 {hop} 跳\";\n readonly 'message.hopHint': \"这条消息在一次队友间对话里的转发深度;深度用完只能回到主会话\";\n};\n/** The namespace's dictionary key union (literal keys, locale-typed seats). */\nexport type TeamKey = keyof typeof zh;\nexport declare const en: Record<TeamKey, string>;\n","/**\n * Browser half of dsh-team: follow the current session's `team` projection and\n * contribute the team stage as one conversation view tab.\n *\n * There is no client-side fold. The host computes the team value once and the\n * framework pushes it here (history tail baseline + `session/projection`\n * frames), so this module only tracks WHICH session's value is on screen — and\n * whether that session has a team at all, because the tab exists exactly while\n * it does: an ordinary conversation never grows a view it cannot fill.\n */\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client';\nimport { type TeamPanelState } from './TeamStage.tsx';\nimport { type TeamKey } from './locales.ts';\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** Agent-team stage copy. */\n team: TeamKey;\n }\n}\n/** Required services: the slot registry, the session domain, and locale. */\nexport declare const inject: string[];\n/**\n * Register the locale dictionary and the view tab, and keep the stage store\n * pointed at the right session.\n * @param ctx - client root context.\n */\nexport declare function apply(ctx: ClientContext): void;\nexport type { TeamPanelState };\n"],"mappings":";;;;;;AAAA,IAAW,CAAC,gBAAgB;CAAC;OAAU,CAAC;CAAG,CAAC;AAAC;AAC7C,IAAW,CAAC,kBAAkB;CAAC;OAAU,CAAC;CAAG,CAAC;AAAC;AAC/C,IAAW,CAAC,mBAAmB;CAAC;OAAU,CAAC;CAAG,CAAC;AAAC;AAChD,IAAW,CAAC,kBAAkB;CAAC;OAAU,CAAC,YAAY;CAAG;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;CAAE;AAAC;AACzF,IAAW,CAAC,gBAAgB;CAAC;OAAU,CAAC,cAAc;CAAG;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI;CAAE;AAAC;AACjF,IAAW,CAAC,mBAAmB;CAAC;OAAU,CAAC,eAAe;CAAG;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;CAAE;AAAC;AAC7F,IAAW,CAAC,sBAAsB;CAAC;OAAU,CAAC;CAAG;EAAC;EAAI;EAAI;EAAI;EAAI;CAAE;AAAC;;;;ACJrE,IAAW,CAAC,kBAAkB;CAAC;OAAS;EAAC;EAAgB;EAAc;EAAiB;CAAkB;CAAG;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;CAAE;AAAC;;;;ACDzJ,IAAW,CAAC,MAAM;CAAC;OAAS,CAAC;CAAG;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;CAAE;AAAC;AACxM,IAAW,CAAC,WAAW;CAAC;OAAS,CAAC,EAAE;CAAG,CAAC,EAAE;AAAC;;;;ACC3C,IAAI,CAAC,MAAM;CAAC;OAAS,CAAC,OAAO;CAAG;EAAC;EAAI;EAAI;CAAE;CAAG,WAAW,EAAE;AAAC;AAC5D,IAAW,CAAC,UAAU;CAAC;OAAS,CAAC;CAAG,CAAC;AAAC;AACtC,IAAW,CAAC,SAAS;CAAC;OAAS,CAAC,aAAa;CAAG,CAAC,IAAI,EAAE;AAAC"}
package/dist/index.d.ts CHANGED
@@ -469,12 +469,20 @@ declare class TeamError extends Error {
469
469
  }
470
470
  //#endregion
471
471
  //#region src/projection.d.ts
472
+ /**
473
+ * The `team` unit as the registry's client-visible overload takes it: the fold
474
+ * state is also the served value, so `wire` is present rather than optional and
475
+ * its `view` is the identity.
476
+ */
477
+ type TeamProjectionUnit = Omit<ProjectionDefinition<'team', TeamView>, 'wire'> & {
478
+ readonly wire: NonNullable<ProjectionDefinition<'team', TeamView>['wire']>;
479
+ };
472
480
  /**
473
481
  * Build the projection unit for one deployment's mailbox bound.
474
482
  * @param maxRecentMessages - feed ceiling from the row config.
475
483
  * @returns the registrable unit.
476
484
  */
477
- declare function teamProjection(maxRecentMessages: number): ProjectionDefinition<'team', TeamView>;
485
+ declare function teamProjection(maxRecentMessages: number): TeamProjectionUnit;
478
486
  //#endregion
479
487
  //#region src/workspace.d.ts
480
488
  /** The shared area's stable id; every other area id is a member's session id. */
package/dist/index.js CHANGED
@@ -345,7 +345,8 @@ function foldTeam(events, bound) {
345
345
  */
346
346
  /**
347
347
  * Wire validation for the served value. The unit's state IS the value, so one
348
- * schema covers the read side and the persisted-cache round trip.
348
+ * schema covers the fold state, the read side, and the persisted-cache round
349
+ * trip.
349
350
  */
350
351
  const teamViewSchema = z$1.object({
351
352
  active: z$1.boolean(),
@@ -399,10 +400,13 @@ const teamViewSchema = z$1.object({
399
400
  function teamProjection(maxRecentMessages) {
400
401
  return {
401
402
  key: "team",
402
- schema: teamViewSchema,
403
+ stateSchema: teamViewSchema,
403
404
  init: () => EMPTY_TEAM_VIEW,
404
405
  apply: (state, event) => applyTeamEvent(state, event, maxRecentMessages),
405
- view: (state) => state,
406
+ wire: {
407
+ viewSchema: teamViewSchema,
408
+ view: (state) => state
409
+ },
406
410
  stateVersion: 3
407
411
  };
408
412
  }
package/dsh-manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-team",
3
- "version": "0.2.5",
3
+ "version": "0.2.6",
4
4
  "description": "Agent teams for DeepSeek Harness: named long-lived teammates over ctx.subagents, a shared task list, a member-to-member mailbox, virtual workspaces, and a live team room in the conversation view",
5
5
  "license": "MIT",
6
6
  "author": "huxint",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-team",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "description": "Agent teams for DeepSeek Harness: named long-lived teammates over ctx.subagents, a shared task list, a member-to-member mailbox, virtual workspaces, and a live team room in the conversation view",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -44,39 +44,39 @@
44
44
  },
45
45
  "peerDependencies": {
46
46
  "@deepseek-ai/cordis": "^4.0.1",
47
- "@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
48
- "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6",
49
- "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6",
50
- "@deepseek-ai/dsh-client-ui-layout": "^0.1.0-rc.6",
51
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.6",
52
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6",
53
- "@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
54
- "@deepseek-ai/dsh-session": "^0.1.0-rc.6",
55
- "@deepseek-ai/dsh-session-projection": "^0.1.0-rc.6",
56
- "@deepseek-ai/dsh-storage-domain": "^0.1.0-rc.6",
57
- "@deepseek-ai/dsh-subagent": "^0.1.0-rc.6",
58
- "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
59
- "@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
47
+ "@deepseek-ai/dsh-agent": "^0.1.1-rc.2",
48
+ "@deepseek-ai/dsh-client-locale": "^0.1.1-rc.2",
49
+ "@deepseek-ai/dsh-client-runtime": "^0.1.1-rc.2",
50
+ "@deepseek-ai/dsh-client-ui-layout": "^0.1.1-rc.2",
51
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.1-rc.2",
52
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.1-rc.2",
53
+ "@deepseek-ai/dsh-llm": "^0.1.1-rc.2",
54
+ "@deepseek-ai/dsh-session": "^0.1.1-rc.2",
55
+ "@deepseek-ai/dsh-session-projection": "^0.1.1-rc.2",
56
+ "@deepseek-ai/dsh-storage-domain": "^0.1.1-rc.2",
57
+ "@deepseek-ai/dsh-subagent": "^0.1.1-rc.2",
58
+ "@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2",
59
+ "@deepseek-ai/dsh-tools": "^0.1.1-rc.2",
60
60
  "react": "^18.2.0"
61
61
  },
62
62
  "devDependencies": {
63
63
  "@deepseek-ai/cordis": "^4.0.1",
64
- "@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
65
- "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6",
66
- "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6",
67
- "@deepseek-ai/dsh-client-ui-conversation": "0.1.0-rc.6",
68
- "@deepseek-ai/dsh-client-ui-layout": "^0.1.0-rc.6",
69
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.6",
70
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6",
71
- "@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
72
- "@deepseek-ai/dsh-session": "^0.1.0-rc.6",
73
- "@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6",
74
- "@deepseek-ai/dsh-session-projection": "^0.1.0-rc.6",
75
- "@deepseek-ai/dsh-storage": "0.1.0-rc.6",
76
- "@deepseek-ai/dsh-storage-domain": "0.1.0-rc.6",
77
- "@deepseek-ai/dsh-subagent": "^0.1.0-rc.6",
78
- "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
79
- "@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
64
+ "@deepseek-ai/dsh-agent": "^0.1.1-rc.2",
65
+ "@deepseek-ai/dsh-client-locale": "^0.1.1-rc.2",
66
+ "@deepseek-ai/dsh-client-runtime": "^0.1.1-rc.2",
67
+ "@deepseek-ai/dsh-client-ui-conversation": "0.1.1-rc.2",
68
+ "@deepseek-ai/dsh-client-ui-layout": "^0.1.1-rc.2",
69
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.1-rc.2",
70
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.1-rc.2",
71
+ "@deepseek-ai/dsh-llm": "^0.1.1-rc.2",
72
+ "@deepseek-ai/dsh-session": "^0.1.1-rc.2",
73
+ "@deepseek-ai/dsh-session-persistence": "^0.1.1-rc.2",
74
+ "@deepseek-ai/dsh-session-projection": "^0.1.1-rc.2",
75
+ "@deepseek-ai/dsh-storage": "0.1.1-rc.2",
76
+ "@deepseek-ai/dsh-storage-domain": "0.1.1-rc.2",
77
+ "@deepseek-ai/dsh-subagent": "^0.1.1-rc.2",
78
+ "@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2",
79
+ "@deepseek-ai/dsh-tools": "^0.1.1-rc.2",
80
80
  "@testing-library/react": "^16.3.0",
81
81
  "@types/node": "^22.10.0",
82
82
  "@types/react": "~18.3.1",