@dg-kit/core 1.13.0 → 1.15.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 CHANGED
@@ -5,6 +5,8 @@
5
5
  * downstream apps (DG-Agent, DG-MCP, DG-Chat).
6
6
  */
7
7
  export type Channel = 'A' | 'B';
8
+ /** The two output families that can consume a waveform definition. */
9
+ export type WaveformModality = 'electrostimulation' | 'vibration';
8
10
  /** A single 25 ms wave step: `[encodedFrequency, intensity]`. */
9
11
  export type WaveFrame = [number, number];
10
12
  export interface WaveformDefinition {
@@ -13,7 +15,13 @@ export interface WaveformDefinition {
13
15
  description?: string;
14
16
  /** Sequence of 25 ms steps. */
15
17
  frames: WaveFrame[];
18
+ /** Intended output family; old definitions are treated as electrostimulation. */
19
+ modality?: WaveformModality;
20
+ /** UI-only marker used by browser libraries; ignored by device transports. */
21
+ custom?: boolean;
16
22
  }
23
+ export { DEFAULT_PLAY_INTERVAL_SEC, DEFAULT_WAVEFORM_MODALITY, getWaveformModality, isWaveformCompatibleWithDevice, startWaveformId, toggleQueueEntry, } from './waveform-playback.js';
24
+ export type { PlayMode } from './waveform-playback.js';
17
25
  export interface DeviceState {
18
26
  connected: boolean;
19
27
  deviceName?: string;
@@ -29,6 +37,14 @@ export interface DeviceState {
29
37
  currentWaveB?: string;
30
38
  }
31
39
  export declare function createEmptyDeviceState(): DeviceState;
40
+ /**
41
+ * Whether a Coyote is physically outputting on either channel.
42
+ *
43
+ * Strength is only the configured amplitude; without a running waveform no
44
+ * pulses are emitted. The two signals must also belong to the same channel —
45
+ * A strength plus a B waveform is still idle on both channels.
46
+ */
47
+ export declare function isCoyoteOutputActive(state: Pick<DeviceState, 'strengthA' | 'strengthB' | 'waveActiveA' | 'waveActiveB'>): boolean;
32
48
  export type DeviceCommand = {
33
49
  type: 'start';
34
50
  channel: Channel;
@@ -85,6 +101,26 @@ export interface ToolDefinition {
85
101
  * without a circular package dependency.
86
102
  */
87
103
  export type OpossumVibrationPatternName = 'constant' | 'pulse' | 'wave' | 'ramp' | 'heartbeat';
104
+ /**
105
+ * Portable, opt-in sensor-to-output linkage. The rule is deliberately small:
106
+ * one source event drives one Opossum channel (or both), with an explicit
107
+ * safety-capped intensity and rhythm. Transports/apps own persistence and UI.
108
+ */
109
+ export type DeviceLinkSource = 'civet-pressure' | 'paw-button' | 'opossum-button';
110
+ export type DeviceLinkChannel = Channel | 'both';
111
+ export interface DeviceLinkRule {
112
+ enabled: boolean;
113
+ source: DeviceLinkSource;
114
+ channel: DeviceLinkChannel;
115
+ intensity: number;
116
+ pattern: OpossumVibrationPatternName;
117
+ /** Civet pressure threshold in kPa; ignored for button sources. */
118
+ thresholdKPa: number;
119
+ /** Hysteresis release threshold in kPa; ignored for button sources. */
120
+ releaseKPa: number;
121
+ cooldownMs: number;
122
+ }
123
+ export declare const DEFAULT_DEVICE_LINK_RULE: DeviceLinkRule;
88
124
  /**
89
125
  * Commands for the Opossum vibrate controller. Separate from `DeviceCommand`
90
126
  * because Opossum's intensity model (0-200 direct set, no frequency/waveform
@@ -195,4 +231,25 @@ export interface SensorDeviceClient<TReading> {
195
231
  setIndicatorColor?(color: number): Promise<void>;
196
232
  }
197
233
  export declare function createEmptySensorState(): SensorState;
234
+ /**
235
+ * The message the Tauri BLE transport throws when the user backs out of the
236
+ * device picker.
237
+ *
238
+ * Exported so the check and the throw cannot drift: the transport raises it,
239
+ * and every module tests for it. They diverged once — Voice matched
240
+ * `/cancelled|user gesture/i`, which never matches this Chinese text, and
241
+ * Chat had no check at all. On Android, where this transport is the only one
242
+ * available, backing out of the picker therefore raised a red error banner in
243
+ * both. That is a bug the user cannot distinguish from a real failure, and
244
+ * Android has no hot update.
245
+ */
246
+ export declare const DEVICE_PICKER_CANCELLED_MESSAGE = "\u7528\u6237\u53D6\u6D88\u4E86\u8BBE\u5907\u9009\u62E9";
247
+ /**
248
+ * Whether an error is "the user closed the device picker" rather than a
249
+ * failure.
250
+ *
251
+ * It is a normal action and must not surface as an error: the browser and
252
+ * the Tauri transport just report it by throwing.
253
+ */
254
+ export declare function isDevicePickerCancelled(error: unknown): boolean;
198
255
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,MAAM,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC;AAEhC,sEAAsE;AACtE,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,GAAG,WAAW,CAAC;AAElE,iEAAiE;AACjE,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEzC,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,8EAA8E;IAC9E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,EACnB,8BAA8B,EAC9B,eAAe,EACf,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAMvD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,sBAAsB,IAAI,WAAW,CAWpD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,aAAa,CAAC,GAClF,OAAO,CAET;AAMD,MAAM,MAAM,aAAa,GACrB;IACE,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,IAAI,EAAE,OAAO,CAAC;CACf,GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACrF;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC;AAE9B,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,2BAA2B,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;AAE/F;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,YAAY,GAAG,gBAAgB,CAAC;AAClF,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,CAAC;AACjD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,2BAA2B,CAAC;IACrC,mEAAmE;IACnE,YAAY,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,wBAAwB,EAAE,cAStC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GACtB;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,sIAAsI;IACtI,OAAO,CAAC,EAAE,2BAA2B,CAAC;CACvC,GACD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAC5D,0HAA0H;GACxH;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,2BAA2B,CAAA;CAAE;AACvF,8HAA8H;GAC5H;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAsBtD;AAMD,MAAM,WAAW,YAAY;IAC3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IACjC,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC9D,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACpE;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACxD,IAAI,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACtC;;;;OAIG;IACH,IAAI,CAAC,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9D;AAMD,wEAAwE;AACxE,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,cAAc,GAAG,SAAS,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,2FAA2F;AAC3F,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAK/D,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB,CAAC,QAAQ;IAC1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IACjC,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC7D,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACnE,iBAAiB,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AAED,wBAAgB,sBAAsB,IAAI,WAAW,CAEpD;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,+BAA+B,2DAAc,CAAC;AAK3D;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAY/D"}
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@
4
4
  * Runtime-agnostic. Consumed by every other @dg-kit package and by the three
5
5
  * downstream apps (DG-Agent, DG-MCP, DG-Chat).
6
6
  */
7
+ export { DEFAULT_PLAY_INTERVAL_SEC, DEFAULT_WAVEFORM_MODALITY, getWaveformModality, isWaveformCompatibleWithDevice, startWaveformId, toggleQueueEntry, } from './waveform-playback.js';
7
8
  export function createEmptyDeviceState() {
8
9
  return {
9
10
  connected: false,
@@ -16,6 +17,26 @@ export function createEmptyDeviceState() {
16
17
  waveActiveB: false,
17
18
  };
18
19
  }
20
+ /**
21
+ * Whether a Coyote is physically outputting on either channel.
22
+ *
23
+ * Strength is only the configured amplitude; without a running waveform no
24
+ * pulses are emitted. The two signals must also belong to the same channel —
25
+ * A strength plus a B waveform is still idle on both channels.
26
+ */
27
+ export function isCoyoteOutputActive(state) {
28
+ return (state.strengthA > 0 && state.waveActiveA) || (state.strengthB > 0 && state.waveActiveB);
29
+ }
30
+ export const DEFAULT_DEVICE_LINK_RULE = {
31
+ enabled: false,
32
+ source: 'civet-pressure',
33
+ channel: 'A',
34
+ intensity: 20,
35
+ pattern: 'pulse',
36
+ thresholdKPa: 2,
37
+ releaseKPa: 1,
38
+ cooldownMs: 1500,
39
+ };
19
40
  export function isDeviceToolName(name) {
20
41
  return (name === 'shock_start' ||
21
42
  name === 'shock_stop' ||
@@ -47,4 +68,36 @@ export const DEVICE_KIND_DISPLAY_NAME = {
47
68
  export function createEmptySensorState() {
48
69
  return { connected: false, battery: 0 };
49
70
  }
71
+ /**
72
+ * The message the Tauri BLE transport throws when the user backs out of the
73
+ * device picker.
74
+ *
75
+ * Exported so the check and the throw cannot drift: the transport raises it,
76
+ * and every module tests for it. They diverged once — Voice matched
77
+ * `/cancelled|user gesture/i`, which never matches this Chinese text, and
78
+ * Chat had no check at all. On Android, where this transport is the only one
79
+ * available, backing out of the picker therefore raised a red error banner in
80
+ * both. That is a bug the user cannot distinguish from a real failure, and
81
+ * Android has no hot update.
82
+ */
83
+ export const DEVICE_PICKER_CANCELLED_MESSAGE = '用户取消了设备选择';
84
+ /** What Web Bluetooth throws for the same thing. */
85
+ const WEB_BLUETOOTH_CANCELLED_MESSAGE = 'User cancelled the requestDevice() chooser';
86
+ /**
87
+ * Whether an error is "the user closed the device picker" rather than a
88
+ * failure.
89
+ *
90
+ * It is a normal action and must not surface as an error: the browser and
91
+ * the Tauri transport just report it by throwing.
92
+ */
93
+ export function isDevicePickerCancelled(error) {
94
+ const raw = typeof error === 'string'
95
+ ? error
96
+ : error instanceof Error
97
+ ? error.message
98
+ : String(error ?? '');
99
+ const message = raw.trim().replace(/^(DOMException|TypeError|Error|AbortError):\s*/i, '');
100
+ return (message.includes(WEB_BLUETOOTH_CANCELLED_MESSAGE) ||
101
+ message.includes(DEVICE_PICKER_CANCELLED_MESSAGE));
102
+ }
50
103
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsCH,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,GAAG;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAwFD,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,CACL,IAAI,KAAK,aAAa;QACtB,IAAI,KAAK,YAAY;QACrB,IAAI,KAAK,cAAc;QACvB,IAAI,KAAK,mBAAmB;QAC5B,IAAI,KAAK,aAAa;QACtB,kEAAkE;QAClE,mEAAmE;QACnE,kDAAkD;QAClD,IAAI,KAAK,OAAO;QAChB,IAAI,KAAK,MAAM;QACf,IAAI,KAAK,iBAAiB;QAC1B,IAAI,KAAK,aAAa;QACtB,IAAI,KAAK,OAAO;QAChB,IAAI,KAAK,eAAe;QACxB,IAAI,KAAK,cAAc;QACvB,IAAI,KAAK,gBAAgB;QACzB,IAAI,KAAK,wBAAwB;QACjC,IAAI,KAAK,eAAe;QACxB,IAAI,KAAK,qBAAqB,CAC/B,CAAC;AACJ,CAAC;AAoDD,2FAA2F;AAC3F,MAAM,CAAC,MAAM,wBAAwB,GAA+B;IAClE,MAAM,EAAE,IAAI;IACZ,YAAY,EAAE,IAAI;IAClB,cAAc,EAAE,IAAI;IACpB,OAAO,EAAE,IAAI;CACd,CAAC;AAoBF,MAAM,UAAU,sBAAsB;IACpC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0BH,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,EACnB,8BAA8B,EAC9B,eAAe,EACf,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAsBhC,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,GAAG;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAmF;IAEnF,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;AAClG,CAAC;AA+ED,MAAM,CAAC,MAAM,wBAAwB,GAAmB;IACtD,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,gBAAgB;IACxB,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,OAAO;IAChB,YAAY,EAAE,CAAC;IACf,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,IAAI;CACjB,CAAC;AA+BF,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,CACL,IAAI,KAAK,aAAa;QACtB,IAAI,KAAK,YAAY;QACrB,IAAI,KAAK,cAAc;QACvB,IAAI,KAAK,mBAAmB;QAC5B,IAAI,KAAK,aAAa;QACtB,kEAAkE;QAClE,mEAAmE;QACnE,kDAAkD;QAClD,IAAI,KAAK,OAAO;QAChB,IAAI,KAAK,MAAM;QACf,IAAI,KAAK,iBAAiB;QAC1B,IAAI,KAAK,aAAa;QACtB,IAAI,KAAK,OAAO;QAChB,IAAI,KAAK,eAAe;QACxB,IAAI,KAAK,cAAc;QACvB,IAAI,KAAK,gBAAgB;QACzB,IAAI,KAAK,wBAAwB;QACjC,IAAI,KAAK,eAAe;QACxB,IAAI,KAAK,qBAAqB,CAC/B,CAAC;AACJ,CAAC;AAoDD,2FAA2F;AAC3F,MAAM,CAAC,MAAM,wBAAwB,GAA+B;IAClE,MAAM,EAAE,IAAI;IACZ,YAAY,EAAE,IAAI;IAClB,cAAc,EAAE,IAAI;IACpB,OAAO,EAAE,IAAI;CACd,CAAC;AAoBF,MAAM,UAAU,sBAAsB;IACpC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,WAAW,CAAC;AAE3D,oDAAoD;AACpD,MAAM,+BAA+B,GAAG,4CAA4C,CAAC;AAErF;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,MAAM,GAAG,GACP,OAAO,KAAK,KAAK,QAAQ;QACvB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,KAAK,YAAY,KAAK;YACtB,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,iDAAiD,EAAE,EAAE,CAAC,CAAC;IAC1F,OAAO,CACL,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QACjD,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAClD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { DeviceKind, WaveformDefinition, WaveformModality } from './index.js';
2
+ /** Legacy waveform records predate modalities and are electrostimulation waves. */
3
+ export declare const DEFAULT_WAVEFORM_MODALITY: WaveformModality;
4
+ /** Normalize legacy definitions before applying device-family rules. */
5
+ export declare function getWaveformModality(waveform: Pick<WaveformDefinition, 'modality'>): WaveformModality;
6
+ /** The wire/UI playback modes shared by Chat and the direct Control module. */
7
+ export type PlayMode = 'single' | 'list' | 'random';
8
+ export declare const DEFAULT_PLAY_INTERVAL_SEC = 30;
9
+ /** Pure queue operation used by every module that presents A/B playlists. */
10
+ export declare function toggleQueueEntry(queue: string[], id: string): string[];
11
+ /** Resolve a persisted index safely after queue edits. */
12
+ export declare function startWaveformId(queue: string[], index: number): string | null;
13
+ /** Whether a waveform can be offered by an output device of this kind. */
14
+ export declare function isWaveformCompatibleWithDevice(kind: DeviceKind, waveform: Pick<WaveformDefinition, 'modality'>): boolean;
15
+ //# sourceMappingURL=waveform-playback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waveform-playback.d.ts","sourceRoot":"","sources":["../src/waveform-playback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnF,mFAAmF;AACnF,eAAO,MAAM,yBAAyB,EAAE,gBAAuC,CAAC;AAEhF,wEAAwE;AACxE,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,GAC7C,gBAAgB,CAElB;AAED,+EAA+E;AAC/E,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEpD,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAEtE;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI7E;AAED,0EAA0E;AAC1E,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,GAC7C,OAAO,CAIT"}
@@ -0,0 +1,27 @@
1
+ /** Legacy waveform records predate modalities and are electrostimulation waves. */
2
+ export const DEFAULT_WAVEFORM_MODALITY = 'electrostimulation';
3
+ /** Normalize legacy definitions before applying device-family rules. */
4
+ export function getWaveformModality(waveform) {
5
+ return waveform.modality ?? DEFAULT_WAVEFORM_MODALITY;
6
+ }
7
+ export const DEFAULT_PLAY_INTERVAL_SEC = 30;
8
+ /** Pure queue operation used by every module that presents A/B playlists. */
9
+ export function toggleQueueEntry(queue, id) {
10
+ return queue.includes(id) ? queue.filter((entry) => entry !== id) : [...queue, id];
11
+ }
12
+ /** Resolve a persisted index safely after queue edits. */
13
+ export function startWaveformId(queue, index) {
14
+ if (queue.length === 0)
15
+ return null;
16
+ const safe = ((index % queue.length) + queue.length) % queue.length;
17
+ return queue[safe] ?? null;
18
+ }
19
+ /** Whether a waveform can be offered by an output device of this kind. */
20
+ export function isWaveformCompatibleWithDevice(kind, waveform) {
21
+ if (kind === 'coyote')
22
+ return getWaveformModality(waveform) === 'electrostimulation';
23
+ if (kind === 'opossum')
24
+ return getWaveformModality(waveform) === 'vibration';
25
+ return false;
26
+ }
27
+ //# sourceMappingURL=waveform-playback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waveform-playback.js","sourceRoot":"","sources":["../src/waveform-playback.ts"],"names":[],"mappings":"AAEA,mFAAmF;AACnF,MAAM,CAAC,MAAM,yBAAyB,GAAqB,oBAAoB,CAAC;AAEhF,wEAAwE;AACxE,MAAM,UAAU,mBAAmB,CACjC,QAA8C;IAE9C,OAAO,QAAQ,CAAC,QAAQ,IAAI,yBAAyB,CAAC;AACxD,CAAC;AAKD,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAE5C,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAAC,KAAe,EAAE,EAAU;IAC1D,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,eAAe,CAAC,KAAe,EAAE,KAAa;IAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACpE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAC7B,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,8BAA8B,CAC5C,IAAgB,EAChB,QAA8C;IAE9C,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,mBAAmB,CAAC,QAAQ,CAAC,KAAK,oBAAoB,CAAC;IACrF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,mBAAmB,CAAC,QAAQ,CAAC,KAAK,WAAW,CAAC;IAC7E,OAAO,KAAK,CAAC;AACf,CAAC"}
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@dg-kit/core",
3
- "version": "1.13.0",
3
+ "version": "1.15.0",
4
4
  "description": "Shared types and contract interfaces for DG-Lab Coyote control libraries",
5
5
  "license": "MIT",
6
6
  "author": "0xNullAI",
7
- "homepage": "https://github.com/0xNullAI/DG-Kit/tree/main/packages/core",
7
+ "homepage": "https://github.com/0xNullAI/0xNuller/tree/main/packages/kit/core",
8
8
  "repository": {
9
9
  "type": "git",
10
- "url": "git+https://github.com/0xNullAI/DG-Kit.git",
11
- "directory": "packages/core"
10
+ "url": "git+https://github.com/0xNullAI/0xNuller.git",
11
+ "directory": "packages/kit/core"
12
12
  },
13
13
  "type": "module",
14
14
  "main": "./dist/index.js",