@holostaff/sdk 0.4.1 → 0.9.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/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +102 -11
- package/dist/index.js.map +1 -1
- package/dist/presence/chip.d.ts +37 -0
- package/dist/presence/chip.d.ts.map +1 -0
- package/dist/presence/chip.js +348 -0
- package/dist/presence/chip.js.map +1 -0
- package/dist/presence/index.d.ts +35 -0
- package/dist/presence/index.d.ts.map +1 -0
- package/dist/presence/index.js +81 -0
- package/dist/presence/index.js.map +1 -0
- package/dist/presence/note.d.ts +47 -0
- package/dist/presence/note.d.ts.map +1 -0
- package/dist/presence/note.js +501 -0
- package/dist/presence/note.js.map +1 -0
- package/dist/presence/types.d.ts +69 -0
- package/dist/presence/types.d.ts.map +1 -0
- package/dist/presence/types.js +8 -0
- package/dist/presence/types.js.map +1 -0
- package/dist/stage/anamFace.d.ts +32 -0
- package/dist/stage/anamFace.d.ts.map +1 -0
- package/dist/stage/anamFace.js +95 -0
- package/dist/stage/anamFace.js.map +1 -0
- package/dist/stage/index.d.ts +39 -0
- package/dist/stage/index.d.ts.map +1 -0
- package/dist/stage/index.js +182 -0
- package/dist/stage/index.js.map +1 -0
- package/dist/stage/realtime.d.ts +50 -0
- package/dist/stage/realtime.d.ts.map +1 -0
- package/dist/stage/realtime.js +165 -0
- package/dist/stage/realtime.js.map +1 -0
- package/dist/stage/ui.d.ts +27 -0
- package/dist/stage/ui.d.ts.map +1 -0
- package/dist/stage/ui.js +176 -0
- package/dist/stage/ui.js.map +1 -0
- package/dist/theater/index.d.ts +46 -0
- package/dist/theater/index.d.ts.map +1 -0
- package/dist/theater/index.js +222 -0
- package/dist/theater/index.js.map +1 -0
- package/dist/transport.d.ts +6 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +26 -0
- package/dist/transport.js.map +1 -1
- package/dist/types.d.ts +46 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -2
- package/dist/widget.d.ts +0 -48
- package/dist/widget.d.ts.map +0 -1
- package/dist/widget.js +0 -311
- package/dist/widget.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -36,6 +36,6 @@ export interface HolostaffApi {
|
|
|
36
36
|
_destroy(): void;
|
|
37
37
|
}
|
|
38
38
|
export declare const holostaff: HolostaffApi;
|
|
39
|
-
export type { BowtieStage, InitOptions, InterventionOutcome, ObserveOptions } from './types.js';
|
|
39
|
+
export type { BowtieStage, InitOptions, InterventionOutcome, ObserveOptions, PresenceOptions, DockCorner, TheaterOptions, VoiceOptions, } from './types.js';
|
|
40
40
|
export { BOWTIE_STAGES } from './types.js';
|
|
41
41
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAgBH,OAAO,EAAiB,KAAK,WAAW,EAAmB,KAAK,WAAW,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAA;AA4EzH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,aAAa,IAAI,IAAI,CAAA;IACrB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;IACxC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACjE;;;;;;OAMG;IACH,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAA;IACzE,kCAAkC;IAClC,QAAQ,IAAI,IAAI,CAAA;CACjB;AAED,eAAO,MAAM,SAAS,EAAE,YAsQvB,CAAA;AAED,YAAY,EACV,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAC7D,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,GAC1D,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -22,8 +22,13 @@ import { resolveTransportConfig, postJson, postBeacon, openCommandStream } from
|
|
|
22
22
|
import { mintSessionId, bindUnload } from './session.js';
|
|
23
23
|
import { startSignals } from './signals.js';
|
|
24
24
|
import { startObservations } from './observations.js';
|
|
25
|
-
import {
|
|
25
|
+
import { startPresence } from './presence/index.js';
|
|
26
|
+
import { startNote } from './presence/note.js';
|
|
27
|
+
import { startTheater } from './theater/index.js';
|
|
28
|
+
import { startStage } from './stage/index.js';
|
|
26
29
|
import { BOWTIE_STAGES } from './types.js';
|
|
30
|
+
/** Public Theater service — overridable via init({ theater: { baseUrl } }). */
|
|
31
|
+
const DEFAULT_THEATER_URL = 'https://theater.holostaff.ai';
|
|
27
32
|
let state = null;
|
|
28
33
|
const preInitQueue = [];
|
|
29
34
|
function whenReady(fn) {
|
|
@@ -45,6 +50,21 @@ function commonBody(s, extras = {}) {
|
|
|
45
50
|
...extras,
|
|
46
51
|
};
|
|
47
52
|
}
|
|
53
|
+
/** The note's "Show me" CTA → open the Theater on the intervention's
|
|
54
|
+
* intent. Re-applied whenever the note binding is recreated. */
|
|
55
|
+
function wireNoteToTheater(note, theater) {
|
|
56
|
+
note.onShow(ctx => theater.present({
|
|
57
|
+
intent: ctx.goal || ctx.content,
|
|
58
|
+
context: ctx.content,
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
/** Chip click + note "Talk" → open the voice Stage. Re-applied whenever
|
|
62
|
+
* the presence/note bindings are recreated (presence is the chip's
|
|
63
|
+
* click source; note carries the "Talk" CTA). */
|
|
64
|
+
function wireStage(presence, note, stage) {
|
|
65
|
+
presence.onActivate(() => stage.open());
|
|
66
|
+
note.onTalk(ctx => stage.open({ intent: ctx.goal || ctx.content }));
|
|
67
|
+
}
|
|
48
68
|
export const holostaff = {
|
|
49
69
|
init(opts) {
|
|
50
70
|
if (state) {
|
|
@@ -92,15 +112,63 @@ export const holostaff = {
|
|
|
92
112
|
buildBody: () => commonBody(nextState),
|
|
93
113
|
observe: opts.observe,
|
|
94
114
|
});
|
|
95
|
-
//
|
|
96
|
-
//
|
|
97
|
-
//
|
|
98
|
-
|
|
115
|
+
// P2 — the living-portrait chip. Subscribes to the `presence` SSE
|
|
116
|
+
// event and renders the copilot as a presence in the corner. The
|
|
117
|
+
// note (P3) and Stage (P6) grow from this chip, so it's started
|
|
118
|
+
// before the widget.
|
|
119
|
+
nextState.presenceOpts = opts.presence;
|
|
120
|
+
nextState.presence = startPresence({
|
|
99
121
|
cfg: transport,
|
|
100
122
|
getSessionId: () => nextState.sessionId,
|
|
101
123
|
buildBody: () => commonBody(nextState),
|
|
102
124
|
source: nextState.commands,
|
|
125
|
+
options: opts.presence,
|
|
103
126
|
});
|
|
127
|
+
// P3 — the note. Renders `fire_intervention` events as a card that
|
|
128
|
+
// grows from the chip (attention-gated ignore timing). Replaces the
|
|
129
|
+
// v1 widget pill. Outcomes flow back to /outcome.
|
|
130
|
+
nextState.note = startNote({
|
|
131
|
+
cfg: transport,
|
|
132
|
+
getSessionId: () => nextState.sessionId,
|
|
133
|
+
buildBody: () => commonBody(nextState),
|
|
134
|
+
source: nextState.commands,
|
|
135
|
+
presence: nextState.presence,
|
|
136
|
+
dock: (opts.presence?.dock ?? 'bottom-right'),
|
|
137
|
+
});
|
|
138
|
+
// P5 — the Theater overlay. Opened from a note's "Show me" CTA (and
|
|
139
|
+
// the Stage's present() in P6). Session-agnostic (buildContext reads
|
|
140
|
+
// the live sessionId), so it persists across identity changes.
|
|
141
|
+
if (opts.theater?.enabled !== false) {
|
|
142
|
+
nextState.theater = startTheater({
|
|
143
|
+
baseUrl: opts.theater?.baseUrl ?? DEFAULT_THEATER_URL,
|
|
144
|
+
buildContext: () => ({
|
|
145
|
+
tenantId: nextState.tenantId,
|
|
146
|
+
sourceId: nextState.sourceId,
|
|
147
|
+
sessionId: nextState.sessionId,
|
|
148
|
+
}),
|
|
149
|
+
presence: nextState.presence,
|
|
150
|
+
onError: (err) => transport.onError?.(err, { method: 'THEATER', path: '(present)' }),
|
|
151
|
+
});
|
|
152
|
+
wireNoteToTheater(nextState.note, nextState.theater);
|
|
153
|
+
}
|
|
154
|
+
// P6 — the voice Stage. Opens on chip click + a note's "Talk".
|
|
155
|
+
// While open it reports conversationActive so the runtime suppresses
|
|
156
|
+
// autonomous fires (the copilot doesn't interrupt itself). The voice
|
|
157
|
+
// engine + Anam SDK load lazily on first open.
|
|
158
|
+
if (opts.voice?.enabled !== false) {
|
|
159
|
+
nextState.stage = startStage({
|
|
160
|
+
cfg: transport,
|
|
161
|
+
getSessionId: () => nextState.sessionId,
|
|
162
|
+
buildBody: () => commonBody(nextState),
|
|
163
|
+
presence: nextState.presence,
|
|
164
|
+
theater: nextState.theater ?? null,
|
|
165
|
+
dock: (opts.presence?.dock ?? 'bottom-right'),
|
|
166
|
+
reportConversationActive: (active) => {
|
|
167
|
+
void postJson(transport, `/api/runtime/sessions/${nextState.sessionId}/fastpath`, commonBody(nextState, { conversationActive: active }));
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
wireStage(nextState.presence, nextState.note, nextState.stage);
|
|
171
|
+
}
|
|
104
172
|
// Bind page-leave so we mark the session as closed for suppression
|
|
105
173
|
// accounting. Reason 'domain_leave' is the safe default; logout
|
|
106
174
|
// upgrades it (see clearIdentity).
|
|
@@ -170,18 +238,38 @@ export const holostaff = {
|
|
|
170
238
|
buildBody: () => commonBody(s),
|
|
171
239
|
observe: s.observeOpts,
|
|
172
240
|
});
|
|
173
|
-
//
|
|
174
|
-
// closed; reopen against the new id so future fire_intervention
|
|
175
|
-
// events reach the correct stream.
|
|
176
|
-
s.
|
|
241
|
+
// Same for the SSE channel + note + presence. The old session is
|
|
242
|
+
// closed; reopen against the new id so future fire_intervention /
|
|
243
|
+
// presence events reach the correct stream.
|
|
244
|
+
s.note?.dispose();
|
|
245
|
+
s.presence?.dispose();
|
|
177
246
|
s.commands?.close();
|
|
178
247
|
s.commands = openCommandStream(s.transport, s.sessionId, s.tenantId, s.sourceId);
|
|
179
|
-
s.
|
|
248
|
+
s.presence = startPresence({
|
|
249
|
+
cfg: s.transport,
|
|
250
|
+
getSessionId: () => s.sessionId,
|
|
251
|
+
buildBody: () => commonBody(s),
|
|
252
|
+
source: s.commands,
|
|
253
|
+
options: s.presenceOpts,
|
|
254
|
+
});
|
|
255
|
+
s.note = startNote({
|
|
180
256
|
cfg: s.transport,
|
|
181
257
|
getSessionId: () => s.sessionId,
|
|
182
258
|
buildBody: () => commonBody(s),
|
|
183
259
|
source: s.commands,
|
|
260
|
+
presence: s.presence,
|
|
261
|
+
dock: (s.presenceOpts?.dock ?? 'bottom-right'),
|
|
184
262
|
});
|
|
263
|
+
// Theater persists across identity changes; re-wire the new note's
|
|
264
|
+
// "Show me" CTA to it.
|
|
265
|
+
if (s.theater)
|
|
266
|
+
wireNoteToTheater(s.note, s.theater);
|
|
267
|
+
// Voice Stage persists too — end any open conversation (the session
|
|
268
|
+
// rotated) and re-wire chip-click + "Talk" to the new bindings.
|
|
269
|
+
if (s.stage) {
|
|
270
|
+
s.stage.close();
|
|
271
|
+
wireStage(s.presence, s.note, s.stage);
|
|
272
|
+
}
|
|
185
273
|
});
|
|
186
274
|
},
|
|
187
275
|
markStageEntry(stage) {
|
|
@@ -221,7 +309,10 @@ export const holostaff = {
|
|
|
221
309
|
state.unload?.dispose();
|
|
222
310
|
state.signals?.dispose();
|
|
223
311
|
state.observations?.dispose();
|
|
224
|
-
state.
|
|
312
|
+
state.note?.dispose();
|
|
313
|
+
state.presence?.dispose();
|
|
314
|
+
state.theater?.dispose();
|
|
315
|
+
state.stage?.dispose();
|
|
225
316
|
state.commands?.close();
|
|
226
317
|
state = null;
|
|
227
318
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAwB,MAAM,gBAAgB,CAAA;AACtH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAsB,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAuB,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAA4B,MAAM,mBAAmB,CAAA;AAC/E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The living portrait — chip magnitude (copilot-presence-design.md §2.1).
|
|
3
|
+
*
|
|
4
|
+
* A small living video portrait docked in a corner: idle loop (breathing,
|
|
5
|
+
* blinking) with gaze + greeting gestures crossfaded over it, a hover
|
|
6
|
+
* name-tag, and a strict liveness budget so it reads as a *presence*, not
|
|
7
|
+
* a toy. Three fidelity tiers degrade gracefully:
|
|
8
|
+
*
|
|
9
|
+
* 1. idle loop — seamless webm/mp4 (P0 asset)
|
|
10
|
+
* 2. poster — static first frame / avatar (also reduced-motion + load state)
|
|
11
|
+
* 3. monogram — initial-letter disc (no asset)
|
|
12
|
+
*
|
|
13
|
+
* Shadow-DOM isolated. Pauses on hidden tab + prefers-reduced-motion.
|
|
14
|
+
* Click activation routes to onActivate (the Stage, wired in P6).
|
|
15
|
+
*/
|
|
16
|
+
import type { DesignTokens, DockCorner, PresenceCopilot } from './types.js';
|
|
17
|
+
export type GestureName = 'meet' | 'nod' | 'wave' | 'glanceL' | 'glanceR';
|
|
18
|
+
export interface ChipDeps {
|
|
19
|
+
dock: DockCorner;
|
|
20
|
+
offset: number;
|
|
21
|
+
/** Click / Enter → open the Stage (P6). Until then, a no-op is fine. */
|
|
22
|
+
onActivate?: (copilot: PresenceCopilot) => void;
|
|
23
|
+
}
|
|
24
|
+
export interface ChipInstance {
|
|
25
|
+
/** Set / swap / clear the rendered copilot. Crossfades on identity change. */
|
|
26
|
+
setCopilot(copilot: PresenceCopilot | null, tokens: DesignTokens | null): void;
|
|
27
|
+
/** Play a one-shot gesture over the idle loop (user-meaningful moments). */
|
|
28
|
+
playGesture(name: GestureName): void;
|
|
29
|
+
/** The chip's viewport rect — the note (P3) grows from this anchor. */
|
|
30
|
+
getAnchorRect(): DOMRect | null;
|
|
31
|
+
/** Inward glance direction for this dock (note side). */
|
|
32
|
+
innerGlance(): 'glanceL' | 'glanceR';
|
|
33
|
+
getCopilot(): PresenceCopilot | null;
|
|
34
|
+
destroy(): void;
|
|
35
|
+
}
|
|
36
|
+
export declare function startChip(deps: ChipDeps): ChipInstance;
|
|
37
|
+
//# sourceMappingURL=chip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chip.d.ts","sourceRoot":"","sources":["../../src/presence/chip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAgB,eAAe,EAAE,MAAM,YAAY,CAAA;AAEzF,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;AASzE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,UAAU,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,wEAAwE;IACxE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAA;CAChD;AAED,MAAM,WAAW,YAAY;IAC3B,8EAA8E;IAC9E,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAAA;IAC9E,4EAA4E;IAC5E,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IACpC,uEAAuE;IACvE,aAAa,IAAI,OAAO,GAAG,IAAI,CAAA;IAC/B,yDAAyD;IACzD,WAAW,IAAI,SAAS,GAAG,SAAS,CAAA;IACpC,UAAU,IAAI,eAAe,GAAG,IAAI,CAAA;IACpC,OAAO,IAAI,IAAI,CAAA;CAChB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,YAAY,CA8KtD"}
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The living portrait — chip magnitude (copilot-presence-design.md §2.1).
|
|
3
|
+
*
|
|
4
|
+
* A small living video portrait docked in a corner: idle loop (breathing,
|
|
5
|
+
* blinking) with gaze + greeting gestures crossfaded over it, a hover
|
|
6
|
+
* name-tag, and a strict liveness budget so it reads as a *presence*, not
|
|
7
|
+
* a toy. Three fidelity tiers degrade gracefully:
|
|
8
|
+
*
|
|
9
|
+
* 1. idle loop — seamless webm/mp4 (P0 asset)
|
|
10
|
+
* 2. poster — static first frame / avatar (also reduced-motion + load state)
|
|
11
|
+
* 3. monogram — initial-letter disc (no asset)
|
|
12
|
+
*
|
|
13
|
+
* Shadow-DOM isolated. Pauses on hidden tab + prefers-reduced-motion.
|
|
14
|
+
* Click activation routes to onActivate (the Stage, wired in P6).
|
|
15
|
+
*/
|
|
16
|
+
const CHIP_PX = 56; // chip diameter (design: 44–56px range)
|
|
17
|
+
const CONTAINER_ID = 'holostaff-presence-root';
|
|
18
|
+
const CROSSFADE_MS = 220;
|
|
19
|
+
/** Liveness budget — at most one autonomous gesture per 2 minutes. */
|
|
20
|
+
const MIN_AUTONOMOUS_GAP_MS = 120000;
|
|
21
|
+
const AUTONOMOUS_JITTER_MS = 45000;
|
|
22
|
+
export function startChip(deps) {
|
|
23
|
+
if (typeof window === 'undefined' || typeof document === 'undefined') {
|
|
24
|
+
return noopChip();
|
|
25
|
+
}
|
|
26
|
+
const reducedMotion = typeof window.matchMedia === 'function'
|
|
27
|
+
&& window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
28
|
+
const container = ensureContainer(deps);
|
|
29
|
+
const root = container.shadowRoot;
|
|
30
|
+
root.appendChild(styleNode(deps));
|
|
31
|
+
// -- Structure: chip (frame: idle video + gesture video + poster/mono)
|
|
32
|
+
// + name tag -------------------------------------------------------
|
|
33
|
+
const wrap = document.createElement('div');
|
|
34
|
+
wrap.className = 'wrap';
|
|
35
|
+
const chip = document.createElement('button');
|
|
36
|
+
chip.className = 'chip';
|
|
37
|
+
chip.type = 'button';
|
|
38
|
+
chip.setAttribute('aria-label', 'Copilot');
|
|
39
|
+
chip.style.display = 'none'; // hidden until a copilot arrives
|
|
40
|
+
const frame = document.createElement('div');
|
|
41
|
+
frame.className = 'frame';
|
|
42
|
+
const idleVideo = makeVideo('idle');
|
|
43
|
+
const gestureVideo = makeVideo('gesture');
|
|
44
|
+
const poster = document.createElement('img');
|
|
45
|
+
poster.className = 'poster';
|
|
46
|
+
poster.alt = '';
|
|
47
|
+
poster.referrerPolicy = 'no-referrer';
|
|
48
|
+
const mono = document.createElement('div');
|
|
49
|
+
mono.className = 'mono';
|
|
50
|
+
frame.append(poster, idleVideo, gestureVideo, mono);
|
|
51
|
+
chip.appendChild(frame);
|
|
52
|
+
const tag = document.createElement('div');
|
|
53
|
+
tag.className = 'tag';
|
|
54
|
+
const tagName = document.createElement('div');
|
|
55
|
+
tagName.className = 'tag-name';
|
|
56
|
+
const tagScope = document.createElement('div');
|
|
57
|
+
tagScope.className = 'tag-scope';
|
|
58
|
+
tag.append(tagName, tagScope);
|
|
59
|
+
wrap.append(chip, tag);
|
|
60
|
+
root.appendChild(wrap);
|
|
61
|
+
// -- State -----------------------------------------------------------
|
|
62
|
+
let copilot = null;
|
|
63
|
+
let autonomousTimer = null;
|
|
64
|
+
let gestureClearTimer = null;
|
|
65
|
+
let destroyed = false;
|
|
66
|
+
const innerGlance = () => deps.dock.endsWith('right') ? 'glanceL' : 'glanceR';
|
|
67
|
+
// -- Tier rendering --------------------------------------------------
|
|
68
|
+
const renderTiers = (c, tokens) => {
|
|
69
|
+
const portrait = c.portrait ?? {};
|
|
70
|
+
const posterUrl = portrait.poster ?? c.avatar ?? '';
|
|
71
|
+
const accent = tokens?.light?.primary || tokens?.dark?.primary || '';
|
|
72
|
+
if (accent)
|
|
73
|
+
frame.style.setProperty('--accent', accent);
|
|
74
|
+
// Monogram is the always-available floor.
|
|
75
|
+
mono.textContent = (c.name.trim()[0] ?? '?').toUpperCase();
|
|
76
|
+
const canVideo = !reducedMotion && Boolean(portrait.idle || portrait.idleMp4);
|
|
77
|
+
if (canVideo) {
|
|
78
|
+
setVideoSources(idleVideo, portrait.idle, portrait.idleMp4);
|
|
79
|
+
if (posterUrl)
|
|
80
|
+
idleVideo.poster = posterUrl;
|
|
81
|
+
idleVideo.style.display = 'block';
|
|
82
|
+
poster.style.display = 'none';
|
|
83
|
+
mono.style.display = 'none';
|
|
84
|
+
void idleVideo.play().catch(() => { });
|
|
85
|
+
}
|
|
86
|
+
else if (posterUrl) {
|
|
87
|
+
poster.src = posterUrl;
|
|
88
|
+
poster.style.display = 'block';
|
|
89
|
+
idleVideo.style.display = 'none';
|
|
90
|
+
mono.style.display = 'none';
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
mono.style.display = 'flex';
|
|
94
|
+
idleVideo.style.display = 'none';
|
|
95
|
+
poster.style.display = 'none';
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
const playGesture = (name) => {
|
|
99
|
+
if (destroyed || reducedMotion || document.hidden)
|
|
100
|
+
return;
|
|
101
|
+
const src = copilot?.portrait?.gestures?.[name];
|
|
102
|
+
if (!src)
|
|
103
|
+
return;
|
|
104
|
+
setVideoSources(gestureVideo, src, undefined);
|
|
105
|
+
gestureVideo.classList.add('show');
|
|
106
|
+
void gestureVideo.play().catch(() => { });
|
|
107
|
+
if (gestureClearTimer)
|
|
108
|
+
clearTimeout(gestureClearTimer);
|
|
109
|
+
const clear = () => { gestureVideo.classList.remove('show'); };
|
|
110
|
+
gestureVideo.onended = clear;
|
|
111
|
+
// Backstop in case 'ended' is swallowed (hidden tab mid-play).
|
|
112
|
+
gestureClearTimer = setTimeout(clear, 4000);
|
|
113
|
+
};
|
|
114
|
+
// -- Autonomous liveness (budgeted glances at rest) ------------------
|
|
115
|
+
const scheduleAutonomous = () => {
|
|
116
|
+
if (autonomousTimer)
|
|
117
|
+
clearTimeout(autonomousTimer);
|
|
118
|
+
const delay = MIN_AUTONOMOUS_GAP_MS + Math.random() * AUTONOMOUS_JITTER_MS;
|
|
119
|
+
autonomousTimer = setTimeout(() => {
|
|
120
|
+
if (!destroyed && !document.hidden && !reducedMotion && copilot) {
|
|
121
|
+
playGesture(innerGlance());
|
|
122
|
+
}
|
|
123
|
+
scheduleAutonomous();
|
|
124
|
+
}, delay);
|
|
125
|
+
};
|
|
126
|
+
// -- Interaction -----------------------------------------------------
|
|
127
|
+
const onEnter = () => { wrap.classList.add('open'); playGesture('meet'); };
|
|
128
|
+
const onLeave = () => { wrap.classList.remove('open'); };
|
|
129
|
+
chip.addEventListener('mouseenter', onEnter);
|
|
130
|
+
chip.addEventListener('mouseleave', onLeave);
|
|
131
|
+
chip.addEventListener('focus', onEnter);
|
|
132
|
+
chip.addEventListener('blur', onLeave);
|
|
133
|
+
chip.addEventListener('click', () => { if (copilot)
|
|
134
|
+
deps.onActivate?.(copilot); });
|
|
135
|
+
const onVisibility = () => {
|
|
136
|
+
if (document.hidden) {
|
|
137
|
+
idleVideo.pause();
|
|
138
|
+
}
|
|
139
|
+
else if (copilot && !reducedMotion && (copilot.portrait?.idle || copilot.portrait?.idleMp4)) {
|
|
140
|
+
void idleVideo.play().catch(() => { });
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
document.addEventListener('visibilitychange', onVisibility);
|
|
144
|
+
// -- Public API ------------------------------------------------------
|
|
145
|
+
const setCopilot = (next, tokens) => {
|
|
146
|
+
if (destroyed)
|
|
147
|
+
return;
|
|
148
|
+
if (!next) {
|
|
149
|
+
// Hide — copilot left this stage / cleared.
|
|
150
|
+
copilot = null;
|
|
151
|
+
chip.classList.add('leaving');
|
|
152
|
+
setTimeout(() => { if (!copilot)
|
|
153
|
+
chip.style.display = 'none'; }, reducedMotion ? 0 : CROSSFADE_MS);
|
|
154
|
+
if (autonomousTimer) {
|
|
155
|
+
clearTimeout(autonomousTimer);
|
|
156
|
+
autonomousTimer = null;
|
|
157
|
+
}
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const changed = copilot?.copilotId !== next.copilotId;
|
|
161
|
+
copilot = next;
|
|
162
|
+
tagName.textContent = `${next.name} · ${next.roleLine}`;
|
|
163
|
+
tagScope.textContent = next.scopeLine;
|
|
164
|
+
chip.setAttribute('aria-label', `${next.name}, ${next.roleLine}. ${next.scopeLine}`);
|
|
165
|
+
chip.style.display = 'block';
|
|
166
|
+
chip.classList.remove('leaving');
|
|
167
|
+
if (changed && !reducedMotion) {
|
|
168
|
+
// Light crossfade on identity swap (P4 adds the greeting ritual).
|
|
169
|
+
chip.classList.add('swap');
|
|
170
|
+
requestAnimationFrame(() => requestAnimationFrame(() => chip.classList.remove('swap')));
|
|
171
|
+
}
|
|
172
|
+
renderTiers(next, tokens);
|
|
173
|
+
scheduleAutonomous();
|
|
174
|
+
};
|
|
175
|
+
return {
|
|
176
|
+
setCopilot,
|
|
177
|
+
playGesture,
|
|
178
|
+
getAnchorRect: () => (chip.style.display === 'none' ? null : chip.getBoundingClientRect()),
|
|
179
|
+
innerGlance,
|
|
180
|
+
getCopilot: () => copilot,
|
|
181
|
+
destroy() {
|
|
182
|
+
destroyed = true;
|
|
183
|
+
if (autonomousTimer)
|
|
184
|
+
clearTimeout(autonomousTimer);
|
|
185
|
+
if (gestureClearTimer)
|
|
186
|
+
clearTimeout(gestureClearTimer);
|
|
187
|
+
document.removeEventListener('visibilitychange', onVisibility);
|
|
188
|
+
try {
|
|
189
|
+
container.remove();
|
|
190
|
+
}
|
|
191
|
+
catch { /* gone */ }
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
// -------------------------------------------------------------------------
|
|
196
|
+
// DOM helpers
|
|
197
|
+
// -------------------------------------------------------------------------
|
|
198
|
+
function makeVideo(cls) {
|
|
199
|
+
const v = document.createElement('video');
|
|
200
|
+
v.className = cls;
|
|
201
|
+
v.muted = true;
|
|
202
|
+
v.loop = cls === 'idle';
|
|
203
|
+
v.autoplay = cls === 'idle';
|
|
204
|
+
v.playsInline = true;
|
|
205
|
+
v.setAttribute('playsinline', '');
|
|
206
|
+
v.setAttribute('aria-hidden', 'true');
|
|
207
|
+
v.preload = 'auto';
|
|
208
|
+
return v;
|
|
209
|
+
}
|
|
210
|
+
function setVideoSources(v, webm, mp4) {
|
|
211
|
+
while (v.firstChild)
|
|
212
|
+
v.removeChild(v.firstChild);
|
|
213
|
+
if (webm) {
|
|
214
|
+
const s = document.createElement('source');
|
|
215
|
+
s.src = webm;
|
|
216
|
+
s.type = webm.endsWith('.mp4') ? 'video/mp4' : 'video/webm';
|
|
217
|
+
v.appendChild(s);
|
|
218
|
+
}
|
|
219
|
+
if (mp4 && mp4 !== webm) {
|
|
220
|
+
const s = document.createElement('source');
|
|
221
|
+
s.src = mp4;
|
|
222
|
+
s.type = 'video/mp4';
|
|
223
|
+
v.appendChild(s);
|
|
224
|
+
}
|
|
225
|
+
v.load();
|
|
226
|
+
}
|
|
227
|
+
function ensureContainer(deps) {
|
|
228
|
+
let el = document.getElementById(CONTAINER_ID);
|
|
229
|
+
if (el)
|
|
230
|
+
return el;
|
|
231
|
+
el = document.createElement('div');
|
|
232
|
+
el.id = CONTAINER_ID;
|
|
233
|
+
const [v, h] = deps.dock.split('-');
|
|
234
|
+
const off = `${deps.offset}px`;
|
|
235
|
+
el.style.cssText = [
|
|
236
|
+
'position:fixed',
|
|
237
|
+
`${v}:${avoidCollision(deps, off)}`,
|
|
238
|
+
`${h}:${off}`,
|
|
239
|
+
'z-index:2147483646',
|
|
240
|
+
'pointer-events:none',
|
|
241
|
+
].join(';');
|
|
242
|
+
el.attachShadow({ mode: 'open' });
|
|
243
|
+
document.body.appendChild(el);
|
|
244
|
+
return el;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Collision courtesy (design §3): if a well-known chat-widget squats the
|
|
248
|
+
* docked corner, offset the chip above it rather than overlapping. Cheap
|
|
249
|
+
* id/selector check at mount; logs a hint so the deploy can pick a dock.
|
|
250
|
+
*/
|
|
251
|
+
function avoidCollision(deps, baseOffset) {
|
|
252
|
+
const KNOWN = [
|
|
253
|
+
'#intercom-container', '.intercom-lightweight-app',
|
|
254
|
+
'#launcher', // Zendesk
|
|
255
|
+
'#drift-widget', '.drift-frame-controller',
|
|
256
|
+
'#crisp-chatbox',
|
|
257
|
+
'#hubspot-messages-iframe-container',
|
|
258
|
+
];
|
|
259
|
+
try {
|
|
260
|
+
const occupied = KNOWN.some(sel => document.querySelector(sel));
|
|
261
|
+
if (occupied) {
|
|
262
|
+
console.info('[holostaff] presence: chat widget detected in the dock corner; offsetting the copilot above it. Set init({ presence: { dock } }) to choose a corner.');
|
|
263
|
+
return `calc(${baseOffset} + 76px)`;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch { /* selector / DOM not ready */ }
|
|
267
|
+
return baseOffset;
|
|
268
|
+
}
|
|
269
|
+
function noopChip() {
|
|
270
|
+
return {
|
|
271
|
+
setCopilot: () => { },
|
|
272
|
+
playGesture: () => { },
|
|
273
|
+
getAnchorRect: () => null,
|
|
274
|
+
innerGlance: () => 'glanceL',
|
|
275
|
+
getCopilot: () => null,
|
|
276
|
+
destroy: () => { },
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
// -------------------------------------------------------------------------
|
|
280
|
+
// Styles — shadow-DOM scoped. Name-tag grows toward viewport center.
|
|
281
|
+
// -------------------------------------------------------------------------
|
|
282
|
+
function styleNode(deps) {
|
|
283
|
+
const node = document.createElement('style');
|
|
284
|
+
const onRight = deps.dock.endsWith('right');
|
|
285
|
+
// Tag sits on the inner side (toward center) and slides out from the chip.
|
|
286
|
+
const tagSide = onRight ? 'right: calc(100% + 10px);' : 'left: calc(100% + 10px);';
|
|
287
|
+
const tagFrom = onRight ? 'translateX(8px)' : 'translateX(-8px)';
|
|
288
|
+
node.textContent = `
|
|
289
|
+
:host { all: initial; }
|
|
290
|
+
.wrap {
|
|
291
|
+
position: relative;
|
|
292
|
+
display: flex; align-items: center;
|
|
293
|
+
font: 13px/1.4 -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
|
|
294
|
+
}
|
|
295
|
+
.chip {
|
|
296
|
+
pointer-events: auto;
|
|
297
|
+
appearance: none; border: 0; padding: 0; margin: 0;
|
|
298
|
+
width: ${CHIP_PX}px; height: ${CHIP_PX}px; border-radius: 50%;
|
|
299
|
+
cursor: pointer; background: transparent;
|
|
300
|
+
transition: transform 160ms ease-out, opacity ${CROSSFADE_MS}ms ease-out;
|
|
301
|
+
opacity: 1;
|
|
302
|
+
}
|
|
303
|
+
.chip:hover { transform: scale(1.06); }
|
|
304
|
+
.chip:focus-visible { outline: none; }
|
|
305
|
+
.chip:focus-visible .frame { box-shadow: 0 0 0 3px var(--accent, #4f8bff); }
|
|
306
|
+
.chip.swap .frame { opacity: 0; }
|
|
307
|
+
.chip.leaving { opacity: 0; transform: scale(0.9); }
|
|
308
|
+
.frame {
|
|
309
|
+
position: relative; width: 100%; height: 100%;
|
|
310
|
+
border-radius: 50%; overflow: hidden;
|
|
311
|
+
background: #1a1a1a;
|
|
312
|
+
box-shadow: 0 4px 16px rgba(0,0,0,0.28), 0 0 0 2px var(--accent, rgba(255,255,255,0.18));
|
|
313
|
+
transition: opacity ${CROSSFADE_MS}ms ease-out, box-shadow 160ms ease-out;
|
|
314
|
+
}
|
|
315
|
+
.frame > * {
|
|
316
|
+
position: absolute; inset: 0;
|
|
317
|
+
width: 100%; height: 100%; object-fit: cover;
|
|
318
|
+
}
|
|
319
|
+
.idle, .poster { display: none; }
|
|
320
|
+
.gesture { opacity: 0; transition: opacity ${CROSSFADE_MS}ms ease-out; pointer-events: none; }
|
|
321
|
+
.gesture.show { opacity: 1; }
|
|
322
|
+
.mono {
|
|
323
|
+
display: none; align-items: center; justify-content: center;
|
|
324
|
+
background: #23262e; color: var(--accent, #9ab8ff);
|
|
325
|
+
font-weight: 600; font-size: 22px;
|
|
326
|
+
}
|
|
327
|
+
.tag {
|
|
328
|
+
pointer-events: none;
|
|
329
|
+
position: absolute; ${tagSide}
|
|
330
|
+
top: 50%;
|
|
331
|
+
transform: translateY(-50%) ${tagFrom};
|
|
332
|
+
opacity: 0;
|
|
333
|
+
transition: opacity 160ms ease-out, transform 160ms ease-out;
|
|
334
|
+
background: #111; color: #fafafa;
|
|
335
|
+
border-radius: 12px; padding: 8px 12px;
|
|
336
|
+
box-shadow: 0 8px 24px rgba(0,0,0,0.3);
|
|
337
|
+
white-space: nowrap; max-width: 260px;
|
|
338
|
+
}
|
|
339
|
+
.wrap.open .tag { opacity: 1; transform: translateY(-50%) translateX(0); }
|
|
340
|
+
.tag-name { font-weight: 600; font-size: 13px; }
|
|
341
|
+
.tag-scope { font-size: 12px; color: #c7c7c7; margin-top: 2px; white-space: normal; }
|
|
342
|
+
@media (prefers-reduced-motion: reduce) {
|
|
343
|
+
.chip, .frame, .gesture, .tag { transition: none; }
|
|
344
|
+
}
|
|
345
|
+
`;
|
|
346
|
+
return node;
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=chip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chip.js","sourceRoot":"","sources":["../../src/presence/chip.ts"],"names":[],"mappings":"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"}
|