@kumbatio/energy-system 0.3.0 → 0.4.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/README.md +170 -6
- package/dist/defer.d.ts +40 -0
- package/dist/defer.d.ts.map +1 -0
- package/dist/defer.js +173 -0
- package/dist/defer.js.map +1 -0
- package/dist/engine.d.ts +5 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +48 -6
- package/dist/engine.js.map +1 -1
- package/dist/gate.d.ts +84 -0
- package/dist/gate.d.ts.map +1 -0
- package/dist/gate.js +224 -0
- package/dist/gate.js.map +1 -0
- package/dist/index.d.ts +12 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/presence.d.ts +56 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +122 -0
- package/dist/presence.js.map +1 -0
- package/dist/react.d.ts +48 -1
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +105 -6
- package/dist/react.js.map +1 -1
- package/dist/session.d.ts +67 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +197 -0
- package/dist/session.js.map +1 -0
- package/dist/strategies.d.ts +15 -0
- package/dist/strategies.d.ts.map +1 -1
- package/dist/strategies.js +41 -0
- package/dist/strategies.js.map +1 -1
- package/dist/types.d.ts +17 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +28 -2
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/src/energy.css +62 -0
package/dist/gate.d.ts
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { EnergyEngine, EnergyEngineOptions } from './engine.js';
|
|
2
|
+
import type { NotificationConfig } from './strategies.js';
|
|
3
|
+
import type { AdaptationStrategy, EnergyLevel } from './types.js';
|
|
4
|
+
/** Priority of a single notification intent */
|
|
5
|
+
export type NotificationPriority = 'normal' | 'high' | 'critical';
|
|
6
|
+
/** Validate that an unknown value is a valid NotificationPriority */
|
|
7
|
+
export declare function isNotificationPriority(value: unknown): value is NotificationPriority;
|
|
8
|
+
/** A single notification intent held or delivered by the gate */
|
|
9
|
+
export interface EnergyNotification {
|
|
10
|
+
readonly priority: NotificationPriority;
|
|
11
|
+
readonly payload: unknown;
|
|
12
|
+
/** When the intent was published (epoch ms, gate clock) */
|
|
13
|
+
readonly createdAt: number;
|
|
14
|
+
}
|
|
15
|
+
/** Why a delivery is happening */
|
|
16
|
+
export type NotificationDeliveryReason = 'immediate' | 'batch' | 'released';
|
|
17
|
+
/** Output channels permitted by the config active at delivery time */
|
|
18
|
+
export interface NotificationChannels {
|
|
19
|
+
readonly visual: boolean;
|
|
20
|
+
readonly sound: boolean;
|
|
21
|
+
readonly vibration: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** One call to `onDeliver`: one or more notifications plus delivery context */
|
|
24
|
+
export interface NotificationDelivery {
|
|
25
|
+
readonly notifications: readonly EnergyNotification[];
|
|
26
|
+
readonly reason: NotificationDeliveryReason;
|
|
27
|
+
readonly channels: NotificationChannels;
|
|
28
|
+
readonly level: EnergyLevel;
|
|
29
|
+
}
|
|
30
|
+
/** What happened to a published notification */
|
|
31
|
+
export type PublishOutcome = 'delivered' | 'batched' | 'deferred';
|
|
32
|
+
/**
|
|
33
|
+
* Pure gating decision: given the active config, an intent priority, and the
|
|
34
|
+
* suppression flag, decide the outcome. Extracted so apps can unit-test their
|
|
35
|
+
* notification policy without constructing a gate.
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveNotificationOutcome(config: NotificationConfig, priority: NotificationPriority, suppressed: boolean): PublishOutcome;
|
|
38
|
+
/** Timer contract so tests can drive batch windows deterministically */
|
|
39
|
+
export interface GateScheduler {
|
|
40
|
+
setTimeout(callback: () => void, ms: number): unknown;
|
|
41
|
+
clearTimeout(handle: unknown): void;
|
|
42
|
+
}
|
|
43
|
+
export interface NotificationGateOptions {
|
|
44
|
+
/** Delivery sink. Called with everything the gate decides to surface. */
|
|
45
|
+
onDeliver(delivery: NotificationDelivery): void;
|
|
46
|
+
/** Strategy resolving level -> NotificationConfig. Default: `notificationStrategy`. */
|
|
47
|
+
strategy?: AdaptationStrategy<NotificationConfig>;
|
|
48
|
+
/** Deterministic time source for tests/simulations */
|
|
49
|
+
clock?: EnergyEngineOptions['clock'];
|
|
50
|
+
/** Deterministic timer source for tests/simulations */
|
|
51
|
+
scheduler?: GateScheduler;
|
|
52
|
+
}
|
|
53
|
+
export interface NotificationGate {
|
|
54
|
+
/** Publish a notification intent. Returns what the gate did with it. */
|
|
55
|
+
publish(input: {
|
|
56
|
+
priority?: NotificationPriority;
|
|
57
|
+
payload?: unknown;
|
|
58
|
+
}): PublishOutcome;
|
|
59
|
+
/**
|
|
60
|
+
* Hard-suppress delivery (e.g. during a focus session). While suppressed,
|
|
61
|
+
* every publish defers; lifting suppression releases the deferred queue.
|
|
62
|
+
*/
|
|
63
|
+
setSuppressed(suppressed: boolean): void;
|
|
64
|
+
isSuppressed(): boolean;
|
|
65
|
+
/** Counts of undelivered notifications currently held by the gate */
|
|
66
|
+
pendingCount(): {
|
|
67
|
+
batched: number;
|
|
68
|
+
deferred: number;
|
|
69
|
+
};
|
|
70
|
+
/** Deliver the open batch now and release any deferred items that qualify */
|
|
71
|
+
flush(): void;
|
|
72
|
+
/**
|
|
73
|
+
* Release resources. Pending notifications are delivered as a final
|
|
74
|
+
* 'released' delivery first — a disposed gate never swallows intents.
|
|
75
|
+
*/
|
|
76
|
+
dispose(): void;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create a notification gate bound to an engine. The gate re-resolves its
|
|
80
|
+
* config on every energy change and releases deferred notifications the
|
|
81
|
+
* moment the new level's config (or lifted suppression) admits them.
|
|
82
|
+
*/
|
|
83
|
+
export declare function createNotificationGate(engine: EnergyEngine, options: NotificationGateOptions): NotificationGate;
|
|
84
|
+
//# sourceMappingURL=gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../src/gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAsBjE,+CAA+C;AAC/C,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;AAQjE,qEAAqE;AACrE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CAEpF;AAED,iEAAiE;AACjE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAA;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,kCAAkC;AAClC,MAAM,MAAM,0BAA0B,GAAG,WAAW,GAAG,OAAO,GAAG,UAAU,CAAA;AAE3E,sEAAsE;AACtE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAED,+EAA+E;AAC/E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,EAAE,SAAS,kBAAkB,EAAE,CAAA;IACrD,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAA;IAC3C,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAA;IACvC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAC5B;AAED,gDAAgD;AAChD,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAA;AAEjE;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE,oBAAoB,EAC9B,UAAU,EAAE,OAAO,GAClB,cAAc,CAiBhB;AAED,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAA;IACrD,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAA;CACpC;AAWD,MAAM,WAAW,uBAAuB;IACtC,yEAAyE;IACzE,SAAS,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAAA;IAC/C,uFAAuF;IACvF,QAAQ,CAAC,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,CAAA;IACjD,sDAAsD;IACtD,KAAK,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAA;IACpC,uDAAuD;IACvD,SAAS,CAAC,EAAE,aAAa,CAAA;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,OAAO,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,oBAAoB,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,cAAc,CAAA;IACtF;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,CAAA;IACxC,YAAY,IAAI,OAAO,CAAA;IACvB,qEAAqE;IACrE,YAAY,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IACrD,6EAA6E;IAC7E,KAAK,IAAI,IAAI,CAAA;IACb;;;OAGG;IACH,OAAO,IAAI,IAAI,CAAA;CAChB;AAQD;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,uBAAuB,GAC/B,gBAAgB,CAkLlB"}
|
package/dist/gate.js
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { notificationStrategy } from './strategies.js';
|
|
2
|
+
/**
|
|
3
|
+
* Notification gate — the runtime that ENFORCES `NotificationConfig` instead
|
|
4
|
+
* of leaving it as guidance. Apps publish notification intents through the
|
|
5
|
+
* gate; the gate resolves the current energy level's config and decides
|
|
6
|
+
* whether each intent is delivered now, batched, or deferred.
|
|
7
|
+
*
|
|
8
|
+
* Design rule inherited from field evidence (GingerMail's scheduler destroyed
|
|
9
|
+
* reminders that came due while suppressed): the gate NEVER silently drops a
|
|
10
|
+
* notification. Anything not deliverable now is deferred and released when
|
|
11
|
+
* energy rises, suppression lifts, or the gate is disposed.
|
|
12
|
+
*/
|
|
13
|
+
function logGateError(message, err) {
|
|
14
|
+
console.error(`[energy-system] ${message}`, err);
|
|
15
|
+
}
|
|
16
|
+
function freezeObject(value) {
|
|
17
|
+
return Object.freeze(value);
|
|
18
|
+
}
|
|
19
|
+
const NOTIFICATION_PRIORITIES = new Set([
|
|
20
|
+
'normal',
|
|
21
|
+
'high',
|
|
22
|
+
'critical',
|
|
23
|
+
]);
|
|
24
|
+
/** Validate that an unknown value is a valid NotificationPriority */
|
|
25
|
+
export function isNotificationPriority(value) {
|
|
26
|
+
return typeof value === 'string' && NOTIFICATION_PRIORITIES.has(value);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Pure gating decision: given the active config, an intent priority, and the
|
|
30
|
+
* suppression flag, decide the outcome. Extracted so apps can unit-test their
|
|
31
|
+
* notification policy without constructing a gate.
|
|
32
|
+
*/
|
|
33
|
+
export function resolveNotificationOutcome(config, priority, suppressed) {
|
|
34
|
+
if (suppressed)
|
|
35
|
+
return 'deferred';
|
|
36
|
+
switch (config.priorityThreshold) {
|
|
37
|
+
case 'none':
|
|
38
|
+
return 'deferred';
|
|
39
|
+
case 'critical':
|
|
40
|
+
if (priority !== 'critical')
|
|
41
|
+
return 'deferred';
|
|
42
|
+
break;
|
|
43
|
+
case 'high':
|
|
44
|
+
if (priority === 'normal')
|
|
45
|
+
return 'deferred';
|
|
46
|
+
break;
|
|
47
|
+
case 'all':
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
return config.batchInterval > 0 ? 'batched' : 'delivered';
|
|
51
|
+
}
|
|
52
|
+
const defaultScheduler = {
|
|
53
|
+
setTimeout(callback, ms) {
|
|
54
|
+
return setTimeout(callback, ms);
|
|
55
|
+
},
|
|
56
|
+
clearTimeout(handle) {
|
|
57
|
+
clearTimeout(handle);
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
function resolveNow(clock) {
|
|
61
|
+
if (typeof clock === 'function')
|
|
62
|
+
return clock;
|
|
63
|
+
if (clock?.now)
|
|
64
|
+
return () => clock.now();
|
|
65
|
+
return () => Date.now();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create a notification gate bound to an engine. The gate re-resolves its
|
|
69
|
+
* config on every energy change and releases deferred notifications the
|
|
70
|
+
* moment the new level's config (or lifted suppression) admits them.
|
|
71
|
+
*/
|
|
72
|
+
export function createNotificationGate(engine, options) {
|
|
73
|
+
const { onDeliver, strategy = notificationStrategy, clock, scheduler = defaultScheduler, } = options;
|
|
74
|
+
if (typeof onDeliver !== 'function') {
|
|
75
|
+
throw new TypeError('createNotificationGate requires an onDeliver callback');
|
|
76
|
+
}
|
|
77
|
+
const now = resolveNow(clock);
|
|
78
|
+
let disposed = false;
|
|
79
|
+
let suppressed = false;
|
|
80
|
+
let batch = [];
|
|
81
|
+
let deferred = [];
|
|
82
|
+
let batchTimer;
|
|
83
|
+
function currentConfig() {
|
|
84
|
+
return strategy.resolve(engine.getState().level);
|
|
85
|
+
}
|
|
86
|
+
function channelsFrom(config) {
|
|
87
|
+
return freezeObject({
|
|
88
|
+
visual: config.allowVisual,
|
|
89
|
+
sound: config.allowSound,
|
|
90
|
+
vibration: config.allowVibration,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function deliver(notifications, reason) {
|
|
94
|
+
if (notifications.length === 0)
|
|
95
|
+
return;
|
|
96
|
+
const config = currentConfig();
|
|
97
|
+
const delivery = freezeObject({
|
|
98
|
+
notifications: Object.freeze([...notifications]),
|
|
99
|
+
reason,
|
|
100
|
+
channels: channelsFrom(config),
|
|
101
|
+
level: engine.getState().level,
|
|
102
|
+
});
|
|
103
|
+
try {
|
|
104
|
+
onDeliver(delivery);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
logGateError('onDeliver callback threw', err);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function clearBatchTimer() {
|
|
111
|
+
if (batchTimer !== undefined) {
|
|
112
|
+
scheduler.clearTimeout(batchTimer);
|
|
113
|
+
batchTimer = undefined;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function deliverBatch() {
|
|
117
|
+
clearBatchTimer();
|
|
118
|
+
if (batch.length === 0)
|
|
119
|
+
return;
|
|
120
|
+
const toDeliver = batch;
|
|
121
|
+
batch = [];
|
|
122
|
+
deliver(toDeliver, 'batch');
|
|
123
|
+
}
|
|
124
|
+
function scheduleBatch(intervalMs) {
|
|
125
|
+
if (batchTimer !== undefined)
|
|
126
|
+
return;
|
|
127
|
+
batchTimer = scheduler.setTimeout(() => {
|
|
128
|
+
batchTimer = undefined;
|
|
129
|
+
deliverBatch();
|
|
130
|
+
}, intervalMs);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Re-evaluate the deferred queue against the active config. Anything no
|
|
134
|
+
* longer deferred is released immediately (not re-batched: these intents
|
|
135
|
+
* already waited once, adding a second batch delay would compound it).
|
|
136
|
+
*/
|
|
137
|
+
function releaseEligibleDeferred() {
|
|
138
|
+
if (disposed || deferred.length === 0)
|
|
139
|
+
return;
|
|
140
|
+
const config = currentConfig();
|
|
141
|
+
const stillDeferred = [];
|
|
142
|
+
const released = [];
|
|
143
|
+
for (const notification of deferred) {
|
|
144
|
+
if (resolveNotificationOutcome(config, notification.priority, suppressed) === 'deferred') {
|
|
145
|
+
stillDeferred.push(notification);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
released.push(notification);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
deferred = stillDeferred;
|
|
152
|
+
deliver(released, 'released');
|
|
153
|
+
}
|
|
154
|
+
const unsubscribe = engine.subscribe(() => {
|
|
155
|
+
releaseEligibleDeferred();
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
publish(input) {
|
|
159
|
+
if (disposed) {
|
|
160
|
+
throw new Error('Cannot publish through a disposed notification gate');
|
|
161
|
+
}
|
|
162
|
+
const priority = input.priority ?? 'normal';
|
|
163
|
+
if (!isNotificationPriority(priority)) {
|
|
164
|
+
throw new Error(`Invalid notification priority: ${String(priority)}`);
|
|
165
|
+
}
|
|
166
|
+
const notification = freezeObject({
|
|
167
|
+
priority,
|
|
168
|
+
payload: input.payload,
|
|
169
|
+
createdAt: now(),
|
|
170
|
+
});
|
|
171
|
+
const config = currentConfig();
|
|
172
|
+
const outcome = resolveNotificationOutcome(config, priority, suppressed);
|
|
173
|
+
switch (outcome) {
|
|
174
|
+
case 'delivered':
|
|
175
|
+
deliver([notification], 'immediate');
|
|
176
|
+
break;
|
|
177
|
+
case 'batched':
|
|
178
|
+
batch.push(notification);
|
|
179
|
+
scheduleBatch(config.batchInterval);
|
|
180
|
+
break;
|
|
181
|
+
case 'deferred':
|
|
182
|
+
deferred.push(notification);
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
return outcome;
|
|
186
|
+
},
|
|
187
|
+
setSuppressed(next) {
|
|
188
|
+
if (disposed)
|
|
189
|
+
return;
|
|
190
|
+
if (suppressed === next)
|
|
191
|
+
return;
|
|
192
|
+
suppressed = next;
|
|
193
|
+
if (!suppressed) {
|
|
194
|
+
releaseEligibleDeferred();
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
isSuppressed() {
|
|
198
|
+
return suppressed;
|
|
199
|
+
},
|
|
200
|
+
pendingCount() {
|
|
201
|
+
return { batched: batch.length, deferred: deferred.length };
|
|
202
|
+
},
|
|
203
|
+
flush() {
|
|
204
|
+
if (disposed)
|
|
205
|
+
return;
|
|
206
|
+
deliverBatch();
|
|
207
|
+
releaseEligibleDeferred();
|
|
208
|
+
},
|
|
209
|
+
dispose() {
|
|
210
|
+
if (disposed)
|
|
211
|
+
return;
|
|
212
|
+
// Surface everything still held before going inert: an intent that
|
|
213
|
+
// entered the gate must always exit through onDeliver.
|
|
214
|
+
clearBatchTimer();
|
|
215
|
+
const pending = [...batch, ...deferred];
|
|
216
|
+
batch = [];
|
|
217
|
+
deferred = [];
|
|
218
|
+
deliver(pending, 'released');
|
|
219
|
+
disposed = true;
|
|
220
|
+
unsubscribe();
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=gate.js.map
|
package/dist/gate.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../src/gate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
|
-
export type { AdaptationStrategy, CognitiveProfile, DecisionCapacity, EnergyClock, EnergyChangeListener, EnergyLevel, EnergyLevelDefinition, EnergyMetrics, EnergyPersistence, EnergySource, EnergyState, FocusDuration, InterruptionTolerance, TaskComplexity, } from './types.js';
|
|
2
|
-
export { ENERGY_LEVEL_VALUES, ENERGY_SOURCE_VALUES } from './types.js';
|
|
1
|
+
export type { AdaptationStrategy, CognitiveProfile, DecisionCapacity, EnergyClock, EnergyChangeListener, EnergyLevel, EnergyLevelDefinition, EnergyMetrics, EnergyPersistence, EnergyPresence, EnergyPresenceMap, EnergySource, EnergyState, FocusDuration, InterruptionTolerance, TaskComplexity, } from './types.js';
|
|
2
|
+
export { ENERGY_LEVEL_VALUES, ENERGY_PRESENCE_VALUES, ENERGY_SOURCE_VALUES } from './types.js';
|
|
3
3
|
export { createEnergyState, cycleEnergyLevel, getEnergyLevel, getEnergyLevels, isEnergyLevel, isEnergySource, isHigherEnergy, } from './levels.js';
|
|
4
4
|
export type { ExternalLevelCompatibility, ExternalLevelCompatibilityOptions } from './compat.js';
|
|
5
5
|
export { createExternalLevelCompatibility, cycleDiscreteLevel, mapToNearestDiscreteLevel, mapToNearestEnergyLevel, } from './compat.js';
|
|
6
6
|
export { getEnergyMetrics } from './metrics.js';
|
|
7
7
|
export type { EnergyEngine, EnergyEngineOptions } from './engine.js';
|
|
8
8
|
export { createEnergyEngine } from './engine.js';
|
|
9
|
-
export type { NotificationConfig, TaskComplexityConfig, UIVisibilityConfig } from './strategies.js';
|
|
10
|
-
export { notificationStrategy, taskComplexityStrategy, uiVisibilityStrategy } from './strategies.js';
|
|
9
|
+
export type { InteractionForgivenessConfig, NotificationConfig, TaskComplexityConfig, UIVisibilityConfig, } from './strategies.js';
|
|
10
|
+
export { interactionForgivenessStrategy, notificationStrategy, taskComplexityStrategy, uiVisibilityStrategy, } from './strategies.js';
|
|
11
|
+
export type { EnergyPresenceSpec } from './presence.js';
|
|
12
|
+
export { createPresenceStrategy, defineEnergyPresence, isEnergyPresence, isPresenceVisible, presenceAtOrAbove, presenceAtOrBelow, resolveEnergyPresence, } from './presence.js';
|
|
13
|
+
export type { FocusSession, FocusSessionController, FocusSessionControllerOptions, FocusSessionEvent, FocusSessionListener, FocusSuppressible, StartFocusSessionOptions, } from './session.js';
|
|
14
|
+
export { createFocusSessionController, isSessionExpired, sessionRemainingMs } from './session.js';
|
|
15
|
+
export type { DeferralConfig, DeferralPreset, DeferralPresetOptions } from './defer.js';
|
|
16
|
+
export { DEFERRAL_PRESET_IDS, createDeferralPresets, deferralStrategy, resolveDeferral, } from './defer.js';
|
|
17
|
+
export type { EnergyNotification, GateScheduler, NotificationChannels, NotificationDelivery, NotificationDeliveryReason, NotificationGate, NotificationGateOptions, NotificationPriority, PublishOutcome, } from './gate.js';
|
|
18
|
+
export { createNotificationGate, isNotificationPriority, resolveNotificationOutcome, } from './gate.js';
|
|
11
19
|
//# 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":"AACA,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,oBAAoB,EACpB,WAAW,EACX,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,cAAc,GACf,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,oBAAoB,EACpB,WAAW,EACX,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,cAAc,GACf,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAG9F,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAA;AAEpB,YAAY,EAAE,0BAA0B,EAAE,iCAAiC,EAAE,MAAM,aAAa,CAAA;AAChG,OAAO,EACL,gCAAgC,EAChC,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAG/C,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAGhD,YAAY,EACV,4BAA4B,EAC5B,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,8BAA8B,EAC9B,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AAGxB,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AAGtB,YAAY,EACV,YAAY,EACZ,sBAAsB,EACtB,6BAA6B,EAC7B,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAGjG,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AACvF,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAA;AAGnB,YAAY,EACV,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,EAC1B,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,cAAc,GACf,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,WAAW,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
export { ENERGY_LEVEL_VALUES, ENERGY_SOURCE_VALUES } from './types.js';
|
|
1
|
+
export { ENERGY_LEVEL_VALUES, ENERGY_PRESENCE_VALUES, ENERGY_SOURCE_VALUES } from './types.js';
|
|
2
2
|
// Level definitions and pure functions
|
|
3
3
|
export { createEnergyState, cycleEnergyLevel, getEnergyLevel, getEnergyLevels, isEnergyLevel, isEnergySource, isHigherEnergy, } from './levels.js';
|
|
4
4
|
export { createExternalLevelCompatibility, cycleDiscreteLevel, mapToNearestDiscreteLevel, mapToNearestEnergyLevel, } from './compat.js';
|
|
5
5
|
// Derived metrics
|
|
6
6
|
export { getEnergyMetrics } from './metrics.js';
|
|
7
7
|
export { createEnergyEngine } from './engine.js';
|
|
8
|
-
export { notificationStrategy, taskComplexityStrategy, uiVisibilityStrategy } from './strategies.js';
|
|
8
|
+
export { interactionForgivenessStrategy, notificationStrategy, taskComplexityStrategy, uiVisibilityStrategy, } from './strategies.js';
|
|
9
|
+
export { createPresenceStrategy, defineEnergyPresence, isEnergyPresence, isPresenceVisible, presenceAtOrAbove, presenceAtOrBelow, resolveEnergyPresence, } from './presence.js';
|
|
10
|
+
export { createFocusSessionController, isSessionExpired, sessionRemainingMs } from './session.js';
|
|
11
|
+
export { DEFERRAL_PRESET_IDS, createDeferralPresets, deferralStrategy, resolveDeferral, } from './defer.js';
|
|
12
|
+
export { createNotificationGate, isNotificationPriority, resolveNotificationOutcome, } from './gate.js';
|
|
9
13
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAE9F,uCAAuC;AACvC,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,gCAAgC,EAChC,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,aAAa,CAAA;AAEpB,kBAAkB;AAClB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAI/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAShD,OAAO,EACL,8BAA8B,EAC9B,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AAIxB,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AAYtB,OAAO,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAIjG,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAA;AAcnB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { AdaptationStrategy, EnergyLevel, EnergyPresence, EnergyPresenceMap } from './types.js';
|
|
2
|
+
/** Validate that an unknown value is a valid EnergyPresence */
|
|
3
|
+
export declare function isEnergyPresence(value: unknown): value is EnergyPresence;
|
|
4
|
+
/**
|
|
5
|
+
* Per-level presence spec. Unlisted levels fall back to `default`
|
|
6
|
+
* ('visible' when omitted).
|
|
7
|
+
*/
|
|
8
|
+
export type EnergyPresenceSpec = Partial<Record<EnergyLevel, EnergyPresence>> & {
|
|
9
|
+
default?: EnergyPresence;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Build a complete, frozen presence map from a partial spec.
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* // Hide the AI chat at 50 and below, keep it muted at 75:
|
|
16
|
+
* const aiChatPresence = defineEnergyPresence({
|
|
17
|
+
* default: 'visible',
|
|
18
|
+
* 75: 'muted',
|
|
19
|
+
* 50: 'hidden',
|
|
20
|
+
* 25: 'hidden',
|
|
21
|
+
* 0: 'hidden',
|
|
22
|
+
* })
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function defineEnergyPresence(spec?: EnergyPresenceSpec): EnergyPresenceMap;
|
|
26
|
+
/**
|
|
27
|
+
* Presence map for elements that need at least `min` energy.
|
|
28
|
+
* Below `min` the element is `below` ('hidden' by default).
|
|
29
|
+
*
|
|
30
|
+
* ```ts
|
|
31
|
+
* const composerToolbar = presenceAtOrAbove(50) // hidden at 25 and 0
|
|
32
|
+
* const aiSidebar = presenceAtOrAbove(75, 'muted') // muted below 75
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function presenceAtOrAbove(min: EnergyLevel, below?: EnergyPresence): EnergyPresenceMap;
|
|
36
|
+
/**
|
|
37
|
+
* Presence map for elements that only belong at low energy — recovery hints,
|
|
38
|
+
* "one thing at a time" affordances. Above `max` the element is `above`
|
|
39
|
+
* ('hidden' by default).
|
|
40
|
+
*/
|
|
41
|
+
export declare function presenceAtOrBelow(max: EnergyLevel, above?: EnergyPresence): EnergyPresenceMap;
|
|
42
|
+
/** Resolve the presence of an element for a given energy level */
|
|
43
|
+
export declare function resolveEnergyPresence(presence: EnergyPresenceMap, level: EnergyLevel): EnergyPresence;
|
|
44
|
+
/** True unless the presence is 'hidden' */
|
|
45
|
+
export declare function isPresenceVisible(presence: EnergyPresence): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Lift a presence map into an AdaptationStrategy so it can be resolved
|
|
48
|
+
* through the engine like any built-in strategy:
|
|
49
|
+
*
|
|
50
|
+
* ```ts
|
|
51
|
+
* const aiChat = createPresenceStrategy('ai-chat', presenceAtOrAbove(75))
|
|
52
|
+
* engine.resolve(aiChat) // 'visible' | 'muted' | 'hidden'
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function createPresenceStrategy(name: string, presence: EnergyPresenceMap): AdaptationStrategy<EnergyPresence>;
|
|
56
|
+
//# sourceMappingURL=presence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAOpG,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAExE;AAED;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,GAAG;IAC9E,OAAO,CAAC,EAAE,cAAc,CAAA;CACzB,CAAA;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,kBAAuB,GAAG,iBAAiB,CAkBrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,WAAW,EAChB,KAAK,GAAE,cAAyB,GAC/B,iBAAiB,CAanB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,WAAW,EAChB,KAAK,GAAE,cAAyB,GAC/B,iBAAiB,CAanB;AAED,kEAAkE;AAClE,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,WAAW,GACjB,cAAc,CAUhB;AAED,2CAA2C;AAC3C,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAEnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,iBAAiB,GAC1B,kBAAkB,CAAC,cAAc,CAAC,CAoBpC"}
|
package/dist/presence.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { getEnergyLevel, getEnergyLevels, isEnergyLevel } from './levels.js';
|
|
2
|
+
import { ENERGY_PRESENCE_VALUES } from './types.js';
|
|
3
|
+
function freezeObject(value) {
|
|
4
|
+
return Object.freeze(value);
|
|
5
|
+
}
|
|
6
|
+
/** Validate that an unknown value is a valid EnergyPresence */
|
|
7
|
+
export function isEnergyPresence(value) {
|
|
8
|
+
return typeof value === 'string' && ENERGY_PRESENCE_VALUES.has(value);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Build a complete, frozen presence map from a partial spec.
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* // Hide the AI chat at 50 and below, keep it muted at 75:
|
|
15
|
+
* const aiChatPresence = defineEnergyPresence({
|
|
16
|
+
* default: 'visible',
|
|
17
|
+
* 75: 'muted',
|
|
18
|
+
* 50: 'hidden',
|
|
19
|
+
* 25: 'hidden',
|
|
20
|
+
* 0: 'hidden',
|
|
21
|
+
* })
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function defineEnergyPresence(spec = {}) {
|
|
25
|
+
const fallback = spec.default ?? 'visible';
|
|
26
|
+
if (!isEnergyPresence(fallback)) {
|
|
27
|
+
throw new Error(`Invalid energy presence: ${String(fallback)}`);
|
|
28
|
+
}
|
|
29
|
+
const entries = {};
|
|
30
|
+
for (const definition of getEnergyLevels()) {
|
|
31
|
+
const declared = spec[definition.value];
|
|
32
|
+
if (declared !== undefined && !isEnergyPresence(declared)) {
|
|
33
|
+
throw new Error(`Invalid energy presence for level ${String(definition.value)}: ${String(declared)}`);
|
|
34
|
+
}
|
|
35
|
+
entries[definition.value] = declared ?? fallback;
|
|
36
|
+
}
|
|
37
|
+
return freezeObject(entries);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Presence map for elements that need at least `min` energy.
|
|
41
|
+
* Below `min` the element is `below` ('hidden' by default).
|
|
42
|
+
*
|
|
43
|
+
* ```ts
|
|
44
|
+
* const composerToolbar = presenceAtOrAbove(50) // hidden at 25 and 0
|
|
45
|
+
* const aiSidebar = presenceAtOrAbove(75, 'muted') // muted below 75
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export function presenceAtOrAbove(min, below = 'hidden') {
|
|
49
|
+
if (!isEnergyLevel(min)) {
|
|
50
|
+
throw new Error(`Invalid energy level: ${String(min)}`);
|
|
51
|
+
}
|
|
52
|
+
if (!isEnergyPresence(below)) {
|
|
53
|
+
throw new Error(`Invalid energy presence: ${String(below)}`);
|
|
54
|
+
}
|
|
55
|
+
const entries = {};
|
|
56
|
+
for (const definition of getEnergyLevels()) {
|
|
57
|
+
entries[definition.value] = definition.value >= min ? 'visible' : below;
|
|
58
|
+
}
|
|
59
|
+
return freezeObject(entries);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Presence map for elements that only belong at low energy — recovery hints,
|
|
63
|
+
* "one thing at a time" affordances. Above `max` the element is `above`
|
|
64
|
+
* ('hidden' by default).
|
|
65
|
+
*/
|
|
66
|
+
export function presenceAtOrBelow(max, above = 'hidden') {
|
|
67
|
+
if (!isEnergyLevel(max)) {
|
|
68
|
+
throw new Error(`Invalid energy level: ${String(max)}`);
|
|
69
|
+
}
|
|
70
|
+
if (!isEnergyPresence(above)) {
|
|
71
|
+
throw new Error(`Invalid energy presence: ${String(above)}`);
|
|
72
|
+
}
|
|
73
|
+
const entries = {};
|
|
74
|
+
for (const definition of getEnergyLevels()) {
|
|
75
|
+
entries[definition.value] = definition.value <= max ? 'visible' : above;
|
|
76
|
+
}
|
|
77
|
+
return freezeObject(entries);
|
|
78
|
+
}
|
|
79
|
+
/** Resolve the presence of an element for a given energy level */
|
|
80
|
+
export function resolveEnergyPresence(presence, level) {
|
|
81
|
+
if (!isEnergyLevel(level)) {
|
|
82
|
+
throw new Error(`Invalid energy level: ${String(level)}`);
|
|
83
|
+
}
|
|
84
|
+
const resolved = presence[level];
|
|
85
|
+
if (!isEnergyPresence(resolved)) {
|
|
86
|
+
throw new Error(`Presence map has no valid entry for level ${String(level)}`);
|
|
87
|
+
}
|
|
88
|
+
return resolved;
|
|
89
|
+
}
|
|
90
|
+
/** True unless the presence is 'hidden' */
|
|
91
|
+
export function isPresenceVisible(presence) {
|
|
92
|
+
return presence !== 'hidden';
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Lift a presence map into an AdaptationStrategy so it can be resolved
|
|
96
|
+
* through the engine like any built-in strategy:
|
|
97
|
+
*
|
|
98
|
+
* ```ts
|
|
99
|
+
* const aiChat = createPresenceStrategy('ai-chat', presenceAtOrAbove(75))
|
|
100
|
+
* engine.resolve(aiChat) // 'visible' | 'muted' | 'hidden'
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export function createPresenceStrategy(name, presence) {
|
|
104
|
+
if (typeof name !== 'string' || name.trim().length === 0) {
|
|
105
|
+
throw new Error(`Invalid presence strategy name: ${String(name)}`);
|
|
106
|
+
}
|
|
107
|
+
// Validate the full map once at creation so resolve() cannot fail later.
|
|
108
|
+
for (const definition of getEnergyLevels()) {
|
|
109
|
+
resolveEnergyPresence(presence, definition.value);
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
name,
|
|
113
|
+
describe(level) {
|
|
114
|
+
const def = getEnergyLevel(level);
|
|
115
|
+
return `${def.label}: ${name} is ${resolveEnergyPresence(presence, level)}`;
|
|
116
|
+
},
|
|
117
|
+
resolve(level) {
|
|
118
|
+
return resolveEnergyPresence(presence, level);
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=presence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.js","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAEnD,SAAS,YAAY,CAAmB,KAAQ;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC7B,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,sBAAsB,CAAC,GAAG,CAAC,KAAuB,CAAC,CAAA;AACzF,CAAC;AAUD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAI,GAAuB,EAAE;IAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,IAAI,SAAS,CAAA;IAC1C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACjE,CAAC;IAED,MAAM,OAAO,GAAG,EAAyC,CAAA;IACzD,KAAK,MAAM,UAAU,IAAI,eAAe,EAAE,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACvC,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CACb,qCAAqC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,CACrF,CAAA;QACH,CAAC;QACD,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,QAAQ,IAAI,QAAQ,CAAA;IAClD,CAAC;IAED,OAAO,YAAY,CAAC,OAAO,CAAC,CAAA;AAC9B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAgB,EAChB,KAAK,GAAmB,QAAQ;IAEhC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACzD,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,MAAM,OAAO,GAAG,EAAyC,CAAA;IACzD,KAAK,MAAM,UAAU,IAAI,eAAe,EAAE,EAAE,CAAC;QAC3C,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAA;IACzE,CAAC;IACD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAA;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAgB,EAChB,KAAK,GAAmB,QAAQ;IAEhC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACzD,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,MAAM,OAAO,GAAG,EAAyC,CAAA;IACzD,KAAK,MAAM,UAAU,IAAI,eAAe,EAAE,EAAE,CAAC;QAC3C,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAA;IACzE,CAAC;IACD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAA;AAC9B,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,qBAAqB,CACnC,QAA2B,EAC3B,KAAkB;IAElB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC3D,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAChC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,6CAA6C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC/E,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,iBAAiB,CAAC,QAAwB;IACxD,OAAO,QAAQ,KAAK,QAAQ,CAAA;AAC9B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,QAA2B;IAE3B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACpE,CAAC;IAED,yEAAyE;IACzE,KAAK,MAAM,UAAU,IAAI,eAAe,EAAE,EAAE,CAAC;QAC3C,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IACnD,CAAC;IAED,OAAO;QACL,IAAI;QACJ,QAAQ,CAAC,KAAK;YACZ,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;YACjC,OAAO,GAAG,GAAG,CAAC,KAAK,KAAK,IAAI,OAAO,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAA;QAC7E,CAAC;QACD,OAAO,CAAC,KAAK;YACX,OAAO,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAC/C,CAAC;KACF,CAAA;AACH,CAAC"}
|
package/dist/react.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EnergyEngine } from './engine.js';
|
|
2
|
-
import type { AdaptationStrategy, EnergyChangeListener, EnergyLevel, EnergyLevelDefinition, EnergyPersistence, EnergySource, EnergyState } from './types.js';
|
|
2
|
+
import type { AdaptationStrategy, EnergyChangeListener, EnergyLevel, EnergyLevelDefinition, EnergyPersistence, EnergyPresence, EnergyPresenceMap, EnergySource, EnergyState } from './types.js';
|
|
3
3
|
export interface EnergyProviderProps {
|
|
4
4
|
/** Pre-created engine. When provided, this engine is used directly. */
|
|
5
5
|
engine?: EnergyEngine;
|
|
@@ -29,6 +29,52 @@ export declare function useEnergyLevelCycler(): () => void;
|
|
|
29
29
|
export declare function useStrategy<T>(strategy: AdaptationStrategy<T>): T;
|
|
30
30
|
/** Returns true if current energy level meets or exceeds the given minimum */
|
|
31
31
|
export declare function useEnergyGate(minLevel: EnergyLevel): boolean;
|
|
32
|
+
/** Resolve a presence map against the current energy level */
|
|
33
|
+
export declare function useEnergyPresence(presence: EnergyPresenceMap): EnergyPresence;
|
|
34
|
+
interface EnergyGateBaseProps {
|
|
35
|
+
/** Rendered instead of children while hidden. Default: nothing. */
|
|
36
|
+
fallback?: React.ReactNode;
|
|
37
|
+
/**
|
|
38
|
+
* Content to gate. The function form receives the resolved presence so
|
|
39
|
+
* 'muted' can style itself differently from 'visible'.
|
|
40
|
+
*/
|
|
41
|
+
children: React.ReactNode | ((presence: EnergyPresence) => React.ReactNode);
|
|
42
|
+
}
|
|
43
|
+
export type EnergyGateProps = EnergyGateBaseProps & ({
|
|
44
|
+
/** Full presence declaration for this element */
|
|
45
|
+
presence: EnergyPresenceMap;
|
|
46
|
+
min?: never;
|
|
47
|
+
max?: never;
|
|
48
|
+
} | {
|
|
49
|
+
presence?: never;
|
|
50
|
+
/** Shorthand: visible at or above this level, hidden below */
|
|
51
|
+
min: EnergyLevel;
|
|
52
|
+
/** Optionally also hidden above this level (band gating) */
|
|
53
|
+
max?: EnergyLevel;
|
|
54
|
+
} | {
|
|
55
|
+
presence?: never;
|
|
56
|
+
min?: never;
|
|
57
|
+
/** Shorthand: visible at or below this level, hidden above */
|
|
58
|
+
max: EnergyLevel;
|
|
59
|
+
});
|
|
60
|
+
/**
|
|
61
|
+
* Declarative energy gating for a subtree.
|
|
62
|
+
*
|
|
63
|
+
* ```tsx
|
|
64
|
+
* // Hide the AI chat at 50 and below:
|
|
65
|
+
* <EnergyGate min={75}>
|
|
66
|
+
* <AiChatPanel />
|
|
67
|
+
* </EnergyGate>
|
|
68
|
+
*
|
|
69
|
+
* // Full presence map, muted state styled by the child:
|
|
70
|
+
* <EnergyGate presence={aiChatPresence}>
|
|
71
|
+
* {(presence) => <AiChatPanel muted={presence === 'muted'} />}
|
|
72
|
+
* </EnergyGate>
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* Headless: renders no wrapper element of its own.
|
|
76
|
+
*/
|
|
77
|
+
export declare function EnergyGate({ presence, min, max, fallback, children, }: EnergyGateProps): React.ReactNode;
|
|
32
78
|
export interface EnergyIndicatorRenderProps {
|
|
33
79
|
level: EnergyLevel;
|
|
34
80
|
label: string;
|
|
@@ -45,4 +91,5 @@ export interface EnergyIndicatorProps {
|
|
|
45
91
|
}
|
|
46
92
|
/** Headless energy indicator - bring your own UI */
|
|
47
93
|
export declare function EnergyIndicator({ children }: EnergyIndicatorProps): React.ReactNode;
|
|
94
|
+
export {};
|
|
48
95
|
//# sourceMappingURL=react.d.ts.map
|
package/dist/react.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"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"}
|