@agenticprimitives/collaboration 0.0.0-alpha.1

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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Agentic Trust Labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # @agenticprimitives/collaboration
2
+
3
+ The portable core of a governed collaboration activity — the **huddle** of spec 378: a call that belongs to a
4
+ Home context, whose admission is decided by the standing the substrate already derives, and whose media a
5
+ provider carries. This package holds the contracts (`HuddleScopeV1`, `HuddleRunV1`, `HuddleParticipantV1`,
6
+ `HuddleEventV1`), the lifecycle reducer, the admission rules as pure functions, and the `MediaProviderPort`
7
+ a provider adapter implements. It knows no provider SDK, no UI, no secrets.
@@ -0,0 +1,166 @@
1
+ import type { Address } from '@agenticprimitives/types';
2
+ /** WHERE a huddle belongs. The principal is the agent whose activity it is (a person for a conversation,
3
+ * the organization / team / workspace otherwise); `id` narrows within that agent — a conversation id, or
4
+ * a DISCUSSION TOPIC's id (`topic`): each topic of each team is its own room, judged by standing at that
5
+ * team, so two teams never see each other's huddle and a team's members meet where they already talk. */
6
+ export interface HuddleScopeV1 {
7
+ kind: 'conversation' | 'topic' | 'org' | 'team' | 'workspace';
8
+ principal: Address;
9
+ id?: string;
10
+ }
11
+ /** The scope's stable key — one serving-plane object per key (spec 378 §3). */
12
+ export declare function scopeKey(scope: HuddleScopeV1): string;
13
+ export type HuddleState = 'creating' | 'active' | 'ending' | 'ended';
14
+ export type HuddleRole = 'host' | 'participant';
15
+ export interface HuddleParticipantV1 {
16
+ /** The human (or service) actually taking part — the authenticated actor. */
17
+ actor: Address;
18
+ /** The principal they represent in this huddle, when not themselves. Frozen for the life of the join. */
19
+ represented?: Address;
20
+ role: HuddleRole;
21
+ /** WHY they were admitted: the standing the substrate derived, or an invitation on this run. */
22
+ admission: {
23
+ ground: 'steward' | 'member' | 'party' | 'invitation' | 'starter';
24
+ ref?: string;
25
+ at: number;
26
+ };
27
+ joinedAt?: number;
28
+ leftAt?: number;
29
+ removedAt?: number;
30
+ /** The provider's participant id — a binding for revocation, never an identity. */
31
+ providerParticipantId?: string;
32
+ }
33
+ export interface HuddleInvitationV1 {
34
+ invitee: Address;
35
+ by: Address;
36
+ at: number;
37
+ expiresAt: number;
38
+ /** An invitee with no standing at the scope is an OUTSIDER: admission waits on a steward's approval. */
39
+ outsider: boolean;
40
+ approvedBy?: Address;
41
+ }
42
+ export interface HuddleRunV1 {
43
+ runId: string;
44
+ scope: HuddleScopeV1;
45
+ state: HuddleState;
46
+ startedBy: Address;
47
+ startedAt: number;
48
+ endedAt?: number;
49
+ endedBy?: Address;
50
+ /** The provider binding — a meeting id, never a credential. A NEW meeting per run (spec 378 §3). */
51
+ provider?: {
52
+ kind: 'realtimekit';
53
+ meetingId: string;
54
+ deactivatedAt?: number;
55
+ kickedAt?: number;
56
+ };
57
+ participants: HuddleParticipantV1[];
58
+ invitations: HuddleInvitationV1[];
59
+ /** The policy revision admission was last judged under — a reference, never a cached verdict. */
60
+ policyVersion: string;
61
+ maxDurationMs: number;
62
+ /** When the room became empty; the object ends the run after the empty-room grace. */
63
+ emptySince?: number;
64
+ /** Idempotency: the keys of operations already applied, so a retry is a no-op. */
65
+ applied: string[];
66
+ }
67
+ export type HuddleEventV1 = {
68
+ type: 'started';
69
+ runId: string;
70
+ scope: HuddleScopeV1;
71
+ by: Address;
72
+ at: number;
73
+ policyVersion: string;
74
+ maxDurationMs: number;
75
+ key: string;
76
+ } | {
77
+ type: 'provider-bound';
78
+ meetingId: string;
79
+ at: number;
80
+ key: string;
81
+ } | {
82
+ type: 'admitted';
83
+ participant: Omit<HuddleParticipantV1, 'joinedAt' | 'leftAt' | 'removedAt'>;
84
+ at: number;
85
+ key: string;
86
+ } | {
87
+ type: 'joined';
88
+ actor: Address;
89
+ providerParticipantId?: string;
90
+ at: number;
91
+ key: string;
92
+ } | {
93
+ type: 'left';
94
+ actor: Address;
95
+ at: number;
96
+ key: string;
97
+ } | {
98
+ type: 'removed';
99
+ actor: Address;
100
+ by: Address;
101
+ at: number;
102
+ key: string;
103
+ } | {
104
+ type: 'invited';
105
+ invitation: HuddleInvitationV1;
106
+ key: string;
107
+ } | {
108
+ type: 'invitation-approved';
109
+ invitee: Address;
110
+ by: Address;
111
+ at: number;
112
+ key: string;
113
+ } | {
114
+ type: 'ending';
115
+ by: Address;
116
+ at: number;
117
+ key: string;
118
+ } | {
119
+ type: 'provider-deactivated';
120
+ at: number;
121
+ key: string;
122
+ } | {
123
+ type: 'provider-kicked';
124
+ at: number;
125
+ key: string;
126
+ } | {
127
+ type: 'ended';
128
+ at: number;
129
+ key: string;
130
+ };
131
+ export type ReduceResult = {
132
+ ok: true;
133
+ run: HuddleRunV1;
134
+ } | {
135
+ ok: false;
136
+ reason: string;
137
+ };
138
+ /** Apply one event. Illegal transitions are refused, never coerced; a key already applied is a no-op. */
139
+ export declare function applyHuddleEvent(run: HuddleRunV1 | null, e: HuddleEventV1): ReduceResult;
140
+ export type ScopeStanding = 'steward' | 'member' | 'party' | 'none';
141
+ export type HuddleOp = 'start' | 'join' | 'invite' | 'leave' | 'end' | 'removeParticipant' | 'get';
142
+ export type Admission = {
143
+ ok: true;
144
+ ground: HuddleParticipantV1['admission']['ground'];
145
+ ref?: string;
146
+ } | {
147
+ ok: false;
148
+ reason: string;
149
+ parks?: true;
150
+ };
151
+ export declare function admissionFor(op: HuddleOp, input: {
152
+ run: HuddleRunV1 | null;
153
+ actor: Address;
154
+ standing: ScopeStanding;
155
+ now: number;
156
+ }): Admission;
157
+ /** The room as a listing shows it — who is in it now, never the provider binding's secrets (there are none) and never a credential. */
158
+ export declare function roster(run: HuddleRunV1): Array<{
159
+ actor: Address;
160
+ represented?: Address;
161
+ role: HuddleRole;
162
+ joined: boolean;
163
+ }>;
164
+ /** Deadlines the serving-plane object arms: the max duration from the start, and the empty-room grace. */
165
+ export declare function nextDeadline(run: HuddleRunV1, emptyGraceMs: number): number | null;
166
+ //# sourceMappingURL=huddle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"huddle.d.ts","sourceRoot":"","sources":["../src/huddle.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD;;;0GAG0G;AAC1G,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,cAAc,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC;IAC9D,SAAS,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAErD;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AACrE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,aAAa,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IAClC,6EAA6E;IAC7E,KAAK,EAAE,OAAO,CAAC;IACf,yGAAyG;IACzG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,gGAAgG;IAChG,SAAS,EAAE;QAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3G,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,OAAO,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,wGAAwG;IACxG,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oGAAoG;IACpG,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjG,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,iGAAiG;IACjG,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC5I;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,EAAE,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC1H;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC3F;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,kBAAkB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACvF;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAI1F,yGAAyG;AACzG,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,EAAE,CAAC,EAAE,aAAa,GAAG,YAAY,CA4DxF;AAOD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpE,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,mBAAmB,GAAG,KAAK,CAAC;AAEnG,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAErJ,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;IAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAuC9I;AAED,uIAAuI;AACvI,wBAAgB,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAE5H;AAED,0GAA0G;AAC1G,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKlF"}
package/dist/huddle.js ADDED
@@ -0,0 +1,145 @@
1
+ /** The scope's stable key — one serving-plane object per key (spec 378 §3). */
2
+ export function scopeKey(scope) {
3
+ return `${scope.kind}:${scope.principal.toLowerCase()}${scope.id ? `:${scope.id}` : ''}`;
4
+ }
5
+ const lc = (a) => a.toLowerCase();
6
+ /** Apply one event. Illegal transitions are refused, never coerced; a key already applied is a no-op. */
7
+ export function applyHuddleEvent(run, e) {
8
+ if (run && run.applied.includes(e.key))
9
+ return { ok: true, run };
10
+ const stamp = (r) => ({ ...r, applied: [...r.applied, e.key].slice(-200) });
11
+ if (e.type === 'started') {
12
+ if (run && run.state !== 'ended')
13
+ return { ok: false, reason: `a huddle is already ${run.state} in this scope` };
14
+ return { ok: true, run: stamp({ runId: e.runId, scope: e.scope, state: 'creating', startedBy: lc(e.by), startedAt: e.at, participants: [], invitations: [], policyVersion: e.policyVersion, maxDurationMs: e.maxDurationMs, applied: [] }) };
15
+ }
16
+ if (!run)
17
+ return { ok: false, reason: 'no huddle in this scope' };
18
+ switch (e.type) {
19
+ case 'provider-bound':
20
+ if (run.state !== 'creating')
21
+ return { ok: false, reason: `cannot bind a provider to a run that is ${run.state}` };
22
+ return { ok: true, run: stamp({ ...run, state: 'active', provider: { kind: 'realtimekit', meetingId: e.meetingId } }) };
23
+ case 'admitted': {
24
+ if (run.state !== 'active')
25
+ return { ok: false, reason: `the huddle is ${run.state} — no admission` };
26
+ const actor = lc(e.participant.actor);
27
+ const others = run.participants.filter((p) => lc(p.actor) !== actor);
28
+ return { ok: true, run: stamp({ ...run, participants: [...others, { ...e.participant, actor }], emptySince: undefined }) };
29
+ }
30
+ case 'joined': {
31
+ if (run.state !== 'active')
32
+ return { ok: false, reason: `the huddle is ${run.state} — cannot join` };
33
+ const actor = lc(e.actor);
34
+ const p = run.participants.find((x) => lc(x.actor) === actor && !x.removedAt);
35
+ if (!p)
36
+ return { ok: false, reason: 'joined without admission' };
37
+ return { ok: true, run: stamp({ ...run, emptySince: undefined, participants: run.participants.map((x) => (x === p ? { ...x, joinedAt: e.at, leftAt: undefined, ...(e.providerParticipantId ? { providerParticipantId: e.providerParticipantId } : {}) } : x)) }) };
38
+ }
39
+ case 'left': {
40
+ const actor = lc(e.actor);
41
+ const next = run.participants.map((x) => (lc(x.actor) === actor && x.joinedAt && !x.leftAt ? { ...x, leftAt: e.at } : x));
42
+ const anyone = next.some((x) => x.joinedAt && !x.leftAt && !x.removedAt);
43
+ return { ok: true, run: stamp({ ...run, participants: next, ...(anyone ? {} : { emptySince: e.at }) }) };
44
+ }
45
+ case 'removed': {
46
+ const actor = lc(e.actor);
47
+ const next = run.participants.map((x) => (lc(x.actor) === actor && !x.removedAt ? { ...x, removedAt: e.at, leftAt: x.leftAt ?? e.at } : x));
48
+ const anyone = next.some((x) => x.joinedAt && !x.leftAt && !x.removedAt);
49
+ return { ok: true, run: stamp({ ...run, participants: next, ...(anyone ? {} : { emptySince: e.at }) }) };
50
+ }
51
+ case 'invited': {
52
+ if (run.state !== 'active')
53
+ return { ok: false, reason: `the huddle is ${run.state} — no invitations` };
54
+ const invitee = lc(e.invitation.invitee);
55
+ const others = run.invitations.filter((i) => lc(i.invitee) !== invitee);
56
+ return { ok: true, run: stamp({ ...run, invitations: [...others, { ...e.invitation, invitee }] }) };
57
+ }
58
+ case 'invitation-approved': {
59
+ const invitee = lc(e.invitee);
60
+ if (!run.invitations.some((i) => lc(i.invitee) === invitee))
61
+ return { ok: false, reason: 'no such invitation' };
62
+ return { ok: true, run: stamp({ ...run, invitations: run.invitations.map((i) => (lc(i.invitee) === invitee ? { ...i, approvedBy: lc(e.by) } : i)) }) };
63
+ }
64
+ case 'ending':
65
+ if (run.state === 'ended')
66
+ return { ok: false, reason: 'already ended' };
67
+ return { ok: true, run: stamp({ ...run, state: 'ending', endedBy: lc(e.by) }) };
68
+ case 'provider-deactivated':
69
+ return { ok: true, run: stamp({ ...run, provider: run.provider ? { ...run.provider, deactivatedAt: e.at } : run.provider }) };
70
+ case 'provider-kicked':
71
+ return { ok: true, run: stamp({ ...run, provider: run.provider ? { ...run.provider, kickedAt: e.at } : run.provider }) };
72
+ case 'ended':
73
+ return { ok: true, run: stamp({ ...run, state: 'ended', endedAt: e.at, participants: run.participants.map((x) => (x.joinedAt && !x.leftAt ? { ...x, leftAt: e.at } : x)) }) };
74
+ default:
75
+ return { ok: false, reason: 'unknown event' };
76
+ }
77
+ }
78
+ export function admissionFor(op, input) {
79
+ const { run, actor, standing, now } = input;
80
+ const a = lc(actor);
81
+ const me = run?.participants.find((p) => lc(p.actor) === a && !p.removedAt);
82
+ const removed = run?.participants.find((p) => lc(p.actor) === a && p.removedAt);
83
+ const standingGround = standing === 'steward' ? 'steward' : standing === 'member' ? 'member' : standing === 'party' ? 'party' : null;
84
+ switch (op) {
85
+ case 'start':
86
+ if (standingGround)
87
+ return { ok: true, ground: 'starter' };
88
+ return { ok: false, reason: 'only someone who belongs to this scope can start a huddle in it' };
89
+ case 'get':
90
+ if (standingGround)
91
+ return { ok: true, ground: standingGround };
92
+ return { ok: false, reason: 'nothing here' };
93
+ case 'join': {
94
+ if (!run || run.state !== 'active')
95
+ return { ok: false, reason: 'there is no active huddle here' };
96
+ if (removed && !me)
97
+ return { ok: false, reason: 'you were removed from this huddle' };
98
+ if (standingGround)
99
+ return { ok: true, ground: standingGround };
100
+ const inv = run.invitations.find((i) => lc(i.invitee) === a);
101
+ if (!inv)
102
+ return { ok: false, reason: 'this huddle is not one you belong to, and no invitation names you' };
103
+ if (inv.expiresAt <= now)
104
+ return { ok: false, reason: 'your invitation has expired' };
105
+ if (inv.outsider && !inv.approvedBy)
106
+ return { ok: false, reason: 'your invitation is waiting on a steward’s approval', parks: true };
107
+ return { ok: true, ground: 'invitation', ref: `${inv.by}:${inv.at}` };
108
+ }
109
+ case 'invite':
110
+ if (!run || run.state !== 'active')
111
+ return { ok: false, reason: 'there is no active huddle to invite to' };
112
+ if (!me?.joinedAt || me.leftAt)
113
+ return { ok: false, reason: 'only someone in the huddle can invite to it' };
114
+ return { ok: true, ground: me.admission.ground };
115
+ case 'leave':
116
+ if (!me?.joinedAt || me.leftAt)
117
+ return { ok: false, reason: 'you are not in this huddle' };
118
+ return { ok: true, ground: me.admission.ground };
119
+ case 'end':
120
+ if (!run || run.state === 'ended')
121
+ return { ok: false, reason: 'there is no huddle to end' };
122
+ if (standing === 'steward' || lc(run.startedBy) === a)
123
+ return { ok: true, ground: standing === 'steward' ? 'steward' : 'starter' };
124
+ return { ok: false, reason: 'only the person who started it, or a steward of this scope, can end a huddle for everyone' };
125
+ case 'removeParticipant':
126
+ if (!run || run.state !== 'active')
127
+ return { ok: false, reason: 'there is no active huddle' };
128
+ if (standing === 'steward' || lc(run.startedBy) === a)
129
+ return { ok: true, ground: standing === 'steward' ? 'steward' : 'starter' };
130
+ return { ok: false, reason: 'only a steward of this scope, or the person who started it, can remove someone' };
131
+ }
132
+ }
133
+ /** The room as a listing shows it — who is in it now, never the provider binding's secrets (there are none) and never a credential. */
134
+ export function roster(run) {
135
+ return run.participants.filter((p) => !p.removedAt).map((p) => ({ actor: p.actor, ...(p.represented ? { represented: p.represented } : {}), role: p.role, joined: !!p.joinedAt && !p.leftAt }));
136
+ }
137
+ /** Deadlines the serving-plane object arms: the max duration from the start, and the empty-room grace. */
138
+ export function nextDeadline(run, emptyGraceMs) {
139
+ if (run.state === 'ended')
140
+ return null;
141
+ const max = run.startedAt + run.maxDurationMs;
142
+ const empty = run.emptySince !== undefined ? run.emptySince + emptyGraceMs : null;
143
+ return empty !== null ? Math.min(max, empty) : max;
144
+ }
145
+ //# sourceMappingURL=huddle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"huddle.js","sourceRoot":"","sources":["../src/huddle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const PACKAGE_NAME = "@agenticprimitives/collaboration";
2
+ export declare const PACKAGE_STATUS = "w1-huddles";
3
+ export declare const SPEC_REF = "specs/378-huddles-governed-calls-in-home.md";
4
+ export { scopeKey, applyHuddleEvent, admissionFor, roster, nextDeadline } from './huddle.js';
5
+ export type { HuddleScopeV1, HuddleState, HuddleRole, HuddleParticipantV1, HuddleInvitationV1, HuddleRunV1, HuddleEventV1, ReduceResult, ScopeStanding, HuddleOp, Admission } from './huddle.js';
6
+ export type { ProviderMeeting, ProviderParticipant, MediaProviderPort, ProviderWebhookEvent } from './media-provider.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,qCAAqC,CAAC;AAC/D,eAAO,MAAM,cAAc,eAAe,CAAC;AAC3C,eAAO,MAAM,QAAQ,gDAAgD,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7F,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACjM,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export const PACKAGE_NAME = '@agenticprimitives/collaboration';
2
+ export const PACKAGE_STATUS = 'w1-huddles';
3
+ export const SPEC_REF = 'specs/378-huddles-governed-calls-in-home.md';
4
+ export { scopeKey, applyHuddleEvent, admissionFor, roster, nextDeadline } from './huddle.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,kCAAkC,CAAC;AAC/D,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAG,6CAA6C,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,42 @@
1
+ export interface ProviderMeeting {
2
+ meetingId: string;
3
+ }
4
+ export interface ProviderParticipant {
5
+ participantId: string;
6
+ /** The credential the browser SDK joins with. Returned ONCE to the participating browser; never stored,
7
+ * never logged, never placed where a model could read it (spec 378 §0.2). */
8
+ authToken: string;
9
+ }
10
+ export interface MediaProviderPort {
11
+ createMeeting(input: {
12
+ title: string;
13
+ scopeKey: string;
14
+ runId: string;
15
+ }): Promise<ProviderMeeting>;
16
+ addParticipant(input: {
17
+ meetingId: string;
18
+ displayName: string;
19
+ role: 'host' | 'participant';
20
+ correlationId: string;
21
+ }): Promise<ProviderParticipant>;
22
+ removeParticipant(input: {
23
+ meetingId: string;
24
+ participantId: string;
25
+ }): Promise<void>;
26
+ endSession(input: {
27
+ meetingId: string;
28
+ }): Promise<void>;
29
+ deactivateMeeting(input: {
30
+ meetingId: string;
31
+ }): Promise<void>;
32
+ }
33
+ /** A provider webhook, verified by the adapter before it reaches the object: the event, the meeting, and
34
+ * the participant's correlation id when the event names one. */
35
+ export interface ProviderWebhookEvent {
36
+ event: 'meeting.started' | 'meeting.ended' | 'meeting.participantJoined' | 'meeting.participantLeft' | string;
37
+ meetingId: string;
38
+ participantId?: string;
39
+ correlationId?: string;
40
+ at: number;
41
+ }
42
+ //# sourceMappingURL=media-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-provider.d.ts","sourceRoot":"","sources":["../src/media-provider.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAAG,SAAS,EAAE,MAAM,CAAA;CAAE;AAEtD,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB;kFAC8E;IAC9E,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACnG,cAAc,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrJ,iBAAiB,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtF,UAAU,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,iBAAiB,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE;AAED;iEACiE;AACjE,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,iBAAiB,GAAG,eAAe,GAAG,2BAA2B,GAAG,yBAAyB,GAAG,MAAM,CAAC;IAC9G,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=media-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-provider.js","sourceRoot":"","sources":["../src/media-provider.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@agenticprimitives/collaboration",
3
+ "version": "0.0.0-alpha.1",
4
+ "description": "Governed collaboration activities (spec 378 huddles): scope, run, participant and lifecycle contracts, admission rules as pure functions, and the media-provider port. No provider SDK, no UI.",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js"
10
+ }
11
+ },
12
+ "files": [
13
+ "LICENSE",
14
+ "dist",
15
+ "spec.md",
16
+ "README.md"
17
+ ],
18
+ "devDependencies": {
19
+ "vitest": "^4.1.8"
20
+ },
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/agentictrustlabs/agenticprimitives.git",
27
+ "directory": "packages/collaboration"
28
+ },
29
+ "license": "MIT",
30
+ "keywords": [
31
+ "agentic",
32
+ "primitives",
33
+ "collaboration",
34
+ "huddle",
35
+ "realtime"
36
+ ],
37
+ "dependencies": {
38
+ "@agenticprimitives/types": "1.0.0-alpha.22"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc -p tsconfig.build.json",
42
+ "typecheck": "tsc -p tsconfig.json --noEmit",
43
+ "test": "vitest run",
44
+ "test:unit": "vitest run test/unit --passWithNoTests",
45
+ "test:watch": "vitest",
46
+ "clean": "rm -rf dist"
47
+ }
48
+ }
package/spec.md ADDED
@@ -0,0 +1,4 @@
1
+ # @agenticprimitives/collaboration — spec pointer
2
+
3
+ The architect-of-record is [spec 378 — Huddles: a governed call inside a Home context](../../specs/378-huddles-governed-calls-in-home.md).
4
+ This package is its portable core: contracts, the lifecycle reducer, admission rules, the media-provider port.