@mindot/will 0.1.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.
Files changed (178) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +777 -0
  3. package/dist/index.d.ts +8144 -0
  4. package/dist/index.js +26231 -0
  5. package/dist/index.js.map +1 -0
  6. package/package.json +73 -0
  7. package/src/cognition/agency/access.grants.ts +59 -0
  8. package/src/cognition/agency/competence.codec.ts +89 -0
  9. package/src/cognition/agency/engines/action.selector.ts +462 -0
  10. package/src/cognition/agency/engines/affordance.synthesizer.ts +384 -0
  11. package/src/cognition/agency/engines/deliberation.engine.ts +241 -0
  12. package/src/cognition/agency/engines/instruction.intake.ts +54 -0
  13. package/src/cognition/agency/engines/motor.schema.executor.ts +532 -0
  14. package/src/cognition/agency/engines/reafference.engine.ts +241 -0
  15. package/src/cognition/agency/execution.primitives.ts +118 -0
  16. package/src/cognition/agency/index.ts +58 -0
  17. package/src/cognition/agency/proactive.communicator.ts +274 -0
  18. package/src/cognition/agency/reconcile.learning.ts +82 -0
  19. package/src/cognition/agency/schemas/external.ts +59 -0
  20. package/src/cognition/agency/schemas/innate.ts +111 -0
  21. package/src/cognition/agency/schemas/repertoire.ts +246 -0
  22. package/src/cognition/agency/selection.scoring.ts +191 -0
  23. package/src/cognition/agency/types.ts +165 -0
  24. package/src/cognition/bus.ts +391 -0
  25. package/src/cognition/completion.inbox.ts +86 -0
  26. package/src/cognition/config.mirror.entities.ts +475 -0
  27. package/src/cognition/conversation.memory.ts +81 -0
  28. package/src/cognition/event.log.ts +116 -0
  29. package/src/cognition/event.schemas.ts +568 -0
  30. package/src/cognition/faculties/aesthetic.evaluator.ts +313 -0
  31. package/src/cognition/faculties/affective.blender.ts +562 -0
  32. package/src/cognition/faculties/attachment.evaluator.ts +432 -0
  33. package/src/cognition/faculties/attention.allocator.ts +422 -0
  34. package/src/cognition/faculties/autobiographical.narrator.ts +300 -0
  35. package/src/cognition/faculties/bias.detector.ts +363 -0
  36. package/src/cognition/faculties/circadian.oscillator.ts +294 -0
  37. package/src/cognition/faculties/confidence.calibrator.ts +324 -0
  38. package/src/cognition/faculties/dream.simulator.ts +251 -0
  39. package/src/cognition/faculties/empathy.simulator.ts +253 -0
  40. package/src/cognition/faculties/energy.regulator.ts +320 -0
  41. package/src/cognition/faculties/episodic.consolidator.ts +728 -0
  42. package/src/cognition/faculties/executive.engine/commands.ts +459 -0
  43. package/src/cognition/faculties/executive.engine/config.ts +46 -0
  44. package/src/cognition/faculties/executive.engine/context.ts +605 -0
  45. package/src/cognition/faculties/executive.engine/deferred.effects.ts +104 -0
  46. package/src/cognition/faculties/executive.engine/deliberate.reasoning.ts +60 -0
  47. package/src/cognition/faculties/executive.engine/effort.gate.ts +114 -0
  48. package/src/cognition/faculties/executive.engine/engine.ts +1028 -0
  49. package/src/cognition/faculties/executive.engine/escalation.buffer.ts +90 -0
  50. package/src/cognition/faculties/executive.engine/facet.supervisor.ts +271 -0
  51. package/src/cognition/faculties/executive.engine/facet.ts +628 -0
  52. package/src/cognition/faculties/executive.engine/gating.ts +222 -0
  53. package/src/cognition/faculties/executive.engine/index.ts +6 -0
  54. package/src/cognition/faculties/executive.engine/messages.ts +102 -0
  55. package/src/cognition/faculties/executive.engine/parser.ts +380 -0
  56. package/src/cognition/faculties/executive.engine/prompt.factory.ts +1053 -0
  57. package/src/cognition/faculties/executive.engine/types.ts +323 -0
  58. package/src/cognition/faculties/exteroception.ts +338 -0
  59. package/src/cognition/faculties/forgetting.curve.ts +202 -0
  60. package/src/cognition/faculties/frustration.evaluator.ts +280 -0
  61. package/src/cognition/faculties/goal.manager.ts +1008 -0
  62. package/src/cognition/faculties/inhibition.controller.ts +351 -0
  63. package/src/cognition/faculties/interoception.ts +417 -0
  64. package/src/cognition/faculties/introspection.engine.ts +246 -0
  65. package/src/cognition/faculties/known.entity.tracker.ts +439 -0
  66. package/src/cognition/faculties/loss.evaluator.ts +224 -0
  67. package/src/cognition/faculties/moral.evaluator.ts +437 -0
  68. package/src/cognition/faculties/novelty.detector.ts +254 -0
  69. package/src/cognition/faculties/persona.consolidator.ts +845 -0
  70. package/src/cognition/faculties/planning.engine/engine.ts +859 -0
  71. package/src/cognition/faculties/planning.engine/plan.frontier.ts +83 -0
  72. package/src/cognition/faculties/planning.engine/plan.store.ts +174 -0
  73. package/src/cognition/faculties/planning.engine/plan.supervision.ts +494 -0
  74. package/src/cognition/faculties/planning.engine/types.ts +143 -0
  75. package/src/cognition/faculties/reputation.tracker.ts +294 -0
  76. package/src/cognition/faculties/reward.evaluator.ts +304 -0
  77. package/src/cognition/faculties/self.model.updater.ts +677 -0
  78. package/src/cognition/faculties/semantic.engine/clustering.ts +673 -0
  79. package/src/cognition/faculties/semantic.engine/index.ts +6 -0
  80. package/src/cognition/faculties/semantic.engine/integrator.ts +750 -0
  81. package/src/cognition/faculties/semantic.engine/types.ts +53 -0
  82. package/src/cognition/faculties/sleep.pressure.regulator.ts +262 -0
  83. package/src/cognition/faculties/social.perception.ts +333 -0
  84. package/src/cognition/faculties/spaced.repetition.ts +605 -0
  85. package/src/cognition/faculties/stress.regulator.ts +375 -0
  86. package/src/cognition/faculties/task.switcher.ts +239 -0
  87. package/src/cognition/faculties/theory.of.mind.ts +333 -0
  88. package/src/cognition/faculties/threat.evaluator.ts +312 -0
  89. package/src/cognition/faculties/working.memory.ts +406 -0
  90. package/src/cognition/generative.model.ts +344 -0
  91. package/src/cognition/heartbeat.ts +70 -0
  92. package/src/cognition/index.ts +291 -0
  93. package/src/cognition/instruction.handler.ts +146 -0
  94. package/src/cognition/memory/index.ts +35 -0
  95. package/src/cognition/memory/vector.adapter.ts +316 -0
  96. package/src/cognition/memory/vector.content.ts +47 -0
  97. package/src/cognition/memory/vector.embedder.ts +212 -0
  98. package/src/cognition/memory/vector.index.ts +459 -0
  99. package/src/cognition/memory/vector.types.ts +65 -0
  100. package/src/cognition/orchestrator.ts +142 -0
  101. package/src/cognition/persona.prior.ts +265 -0
  102. package/src/cognition/schema.registry.ts +145 -0
  103. package/src/cognition/senses/audition.engine/engine.ts +976 -0
  104. package/src/cognition/senses/audition.engine/salience.ts +59 -0
  105. package/src/cognition/senses/base.sense.engine.ts +117 -0
  106. package/src/cognition/senses/gustation.engine.ts +24 -0
  107. package/src/cognition/senses/index.ts +172 -0
  108. package/src/cognition/senses/olfaction.engine.ts +24 -0
  109. package/src/cognition/senses/somatosensation.engine.ts +23 -0
  110. package/src/cognition/senses/vision.engine.ts +23 -0
  111. package/src/cognition/types.ts +63 -0
  112. package/src/cognition/utilities/token.tracker.ts +492 -0
  113. package/src/core/abstracts.ts +60 -0
  114. package/src/core/async.engine.ts +539 -0
  115. package/src/core/clock.ts +196 -0
  116. package/src/core/completion.recorder.ts +122 -0
  117. package/src/core/conflict.detector.ts +140 -0
  118. package/src/core/distributed.ts +626 -0
  119. package/src/core/event.bus.ts +292 -0
  120. package/src/core/inbound.recorder.ts +100 -0
  121. package/src/core/index.ts +167 -0
  122. package/src/core/logger.ts +85 -0
  123. package/src/core/metrics.ts +107 -0
  124. package/src/core/orchestrator.ts +625 -0
  125. package/src/core/replay.ts +589 -0
  126. package/src/core/scenario.ts +120 -0
  127. package/src/core/serialization.ts +448 -0
  128. package/src/core/simulation.ts +197 -0
  129. package/src/core/snapshot.manager.ts +293 -0
  130. package/src/core/state.manager.ts +283 -0
  131. package/src/core/types.ts +274 -0
  132. package/src/core/utils.ts +82 -0
  133. package/src/core/wall.clock.ts +23 -0
  134. package/src/extensions/livestream.ext.ts +570 -0
  135. package/src/extensions/time.ext.ts +339 -0
  136. package/src/index.ts +91 -0
  137. package/src/llm/gate.ts +140 -0
  138. package/src/llm/index.ts +716 -0
  139. package/src/llm/summarizer.ts +170 -0
  140. package/src/llm/wire.contracts.ts +67 -0
  141. package/src/pma/eval.ts +651 -0
  142. package/src/pma/index.ts +1082 -0
  143. package/src/profiles/built-in.ts +7 -0
  144. package/src/profiles/companion.ts +28 -0
  145. package/src/profiles/company-brain.ts +54 -0
  146. package/src/profiles/customer-service.ts +30 -0
  147. package/src/profiles/game-npc.ts +20 -0
  148. package/src/profiles/index.ts +42 -0
  149. package/src/profiles/smart-home.ts +34 -0
  150. package/src/runners/coherence.runner.ts +49 -0
  151. package/src/runners/outreach.runner.ts +158 -0
  152. package/src/runners/social.runner.ts +182 -0
  153. package/src/runners/thin-shim.runner.ts +195 -0
  154. package/src/sdk/will.ts +334 -0
  155. package/src/stem/assembly.audit.ts +88 -0
  156. package/src/stem/distribution.ts +203 -0
  157. package/src/stem/guards/identity.coherence.ts +152 -0
  158. package/src/stem/guards/identity.guard.ts +227 -0
  159. package/src/stem/index.ts +1145 -0
  160. package/src/stem/mind.ts +1090 -0
  161. package/src/stem/tracts/ack.reconciler.ts +55 -0
  162. package/src/stem/tracts/biography.writer.ts +190 -0
  163. package/src/stem/tracts/effector.controller.ts +143 -0
  164. package/src/stem/tracts/health.reporter.ts +113 -0
  165. package/src/stem/tracts/inbound.queue.ts +54 -0
  166. package/src/stem/tracts/outbox.controller.ts +167 -0
  167. package/src/stem/tracts/outbox.writer.ts +133 -0
  168. package/src/stem/tracts/pma.controller.ts +109 -0
  169. package/src/stem/tracts/replay.controller.ts +177 -0
  170. package/src/stem/tracts/sensory.controller.ts +168 -0
  171. package/src/stem/tracts/session.logger.ts +157 -0
  172. package/src/stem/tracts/transport/index.ts +38 -0
  173. package/src/stem/tracts/transport/loopback.transport.ts +86 -0
  174. package/src/stem/tracts/transport/socketio.transport.ts +200 -0
  175. package/src/stem/tracts/transport/stream.transport.ts +152 -0
  176. package/src/stem/tracts/transport/types.ts +193 -0
  177. package/src/stem/tracts/transport.controller.ts +380 -0
  178. package/src/types.ts +116 -0
@@ -0,0 +1,568 @@
1
+ // ─────────────────────────────────────────────────────────────
2
+ // src/cognition/event.schemas.ts
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ /**
6
+ * Central registration of all cognitive event schemas.
7
+ *
8
+ * Import this module once at application startup to register all
9
+ * event types with the globalSchemaRegistry. Importing it multiple
10
+ * times is safe — schemas are idempotent once registered.
11
+ *
12
+ * Schema naming follows the topic scheme: {engine}.{category}.{signal}
13
+ * All payloads are validated as plain objects (structural, not exhaustive).
14
+ */
15
+
16
+ import { globalSchemaRegistry } from '#cognition/schema.registry'
17
+
18
+ function isObj( v: unknown ): v is Record<string, unknown> {
19
+ return typeof v === 'object' && v !== null && !Array.isArray( v )
20
+ }
21
+ function hasNum( o: Record<string, unknown>, k: string ): string | null {
22
+ return typeof o[ k ] === 'number' ? null : `missing numeric field '${k}'`
23
+ }
24
+
25
+ // ── Regulatory ───────────────────────────────────────────────
26
+
27
+ globalSchemaRegistry.register({
28
+ type: 'stress.zone.transition', version: 1,
29
+ validate( p ){
30
+ if( !isObj(p) ) return 'payload must be object'
31
+ return hasNum( p, 'zone' ) ?? hasNum( p, 'load' )
32
+ },
33
+ })
34
+
35
+ globalSchemaRegistry.register({
36
+ type: 'energy.level.critical', version: 1,
37
+ validate( p ){
38
+ if( !isObj(p) ) return 'payload must be object'
39
+ return hasNum( p, 'level' )
40
+ },
41
+ })
42
+
43
+ globalSchemaRegistry.register({
44
+ type: 'sleep.pressure.critical', version: 1,
45
+ validate( p ){
46
+ if( !isObj(p) ) return 'payload must be object'
47
+ return hasNum( p, 'pressure' )
48
+ },
49
+ })
50
+
51
+ globalSchemaRegistry.register({
52
+ type: 'circadian.alertness.shifted', version: 1,
53
+ validate( p ){
54
+ if( !isObj(p) ) return 'payload must be object'
55
+ return hasNum( p, 'alertness' )
56
+ },
57
+ })
58
+
59
+ globalSchemaRegistry.register({
60
+ type: 'modulation.degradation.elevated', version: 1,
61
+ validate( p ){
62
+ if( !isObj(p) ) return 'payload must be object'
63
+ return hasNum( p, 'attentionDegradation' )
64
+ },
65
+ })
66
+
67
+ // ── Perceptual ───────────────────────────────────────────────
68
+
69
+ globalSchemaRegistry.register({
70
+ type: 'perception.novelty.spike', version: 1,
71
+ validate( p ){
72
+ if( !isObj(p) ) return 'payload must be object'
73
+ return hasNum( p, 'novelty' )
74
+ },
75
+ })
76
+
77
+ globalSchemaRegistry.register({
78
+ type: 'percept.batch.ingested', version: 1,
79
+ validate( p ){
80
+ if( !isObj(p) ) return 'payload must be object'
81
+ return hasNum( p, 'count' )
82
+ },
83
+ })
84
+
85
+ globalSchemaRegistry.register({
86
+ type: 'social.agents.present', version: 1,
87
+ validate( p ){
88
+ if( !isObj(p) ) return 'payload must be object'
89
+ return hasNum( p, 'activeAgents' )
90
+ },
91
+ })
92
+
93
+ globalSchemaRegistry.register({
94
+ type: 'interoception.state.updated', version: 1,
95
+ validate( p ){
96
+ if( !isObj(p) ) return 'payload must be object'
97
+ return hasNum( p, 'comfort' )
98
+ },
99
+ })
100
+
101
+ globalSchemaRegistry.register({
102
+ type: 'working_memory.capacity.reached', version: 1,
103
+ validate( p ){
104
+ if( !isObj(p) ) return 'payload must be object'
105
+ return hasNum( p, 'capacity' ) ?? hasNum( p, 'items' )
106
+ },
107
+ })
108
+
109
+ // ── Affective ────────────────────────────────────────────────
110
+
111
+ globalSchemaRegistry.register({
112
+ type: 'emotion.fear.elevated', version: 1,
113
+ validate( p ){
114
+ if( !isObj(p) ) return 'payload must be object'
115
+ return hasNum( p, 'fear' )
116
+ },
117
+ })
118
+
119
+ globalSchemaRegistry.register({
120
+ type: 'emotion.joy.peak', version: 1,
121
+ validate( p ){
122
+ if( !isObj(p) ) return 'payload must be object'
123
+ return hasNum( p, 'joy' )
124
+ },
125
+ })
126
+
127
+ globalSchemaRegistry.register({
128
+ type: 'emotion.awe.experienced', version: 1,
129
+ validate( p ){
130
+ if( !isObj(p) ) return 'payload must be object'
131
+ return hasNum( p, 'awe' )
132
+ },
133
+ })
134
+
135
+ globalSchemaRegistry.register({
136
+ type: 'emotion.frustration.elevated', version: 1,
137
+ validate( p ){
138
+ if( !isObj(p) ) return 'payload must be object'
139
+ return hasNum( p, 'frustration' )
140
+ },
141
+ })
142
+
143
+ globalSchemaRegistry.register({
144
+ type: 'emotion.guilt.elevated', version: 1,
145
+ validate( p ){
146
+ if( !isObj(p) ) return 'payload must be object'
147
+ return hasNum( p, 'guilt' )
148
+ },
149
+ })
150
+
151
+ globalSchemaRegistry.register({
152
+ type: 'emotion.love.significant', version: 1,
153
+ validate( p ){
154
+ if( !isObj(p) ) return 'payload must be object'
155
+ return hasNum( p, 'love' )
156
+ },
157
+ })
158
+
159
+ globalSchemaRegistry.register({
160
+ type: 'emotion.sadness.elevated', version: 1,
161
+ validate( p ){
162
+ if( !isObj(p) ) return 'payload must be object'
163
+ return hasNum( p, 'sadness' )
164
+ },
165
+ })
166
+
167
+ globalSchemaRegistry.register({
168
+ type: 'affect.state.shifted', version: 1,
169
+ validate( p ){
170
+ if( !isObj(p) ) return 'payload must be object'
171
+ return hasNum( p, 'valence' ) ?? hasNum( p, 'arousal' )
172
+ },
173
+ })
174
+
175
+ // ── Executive ────────────────────────────────────────────────
176
+
177
+ globalSchemaRegistry.register({
178
+ type: 'goal.state.changed', version: 1,
179
+ validate( p ){
180
+ if( !isObj(p) ) return 'payload must be object'
181
+ return hasNum( p, 'activeCount' )
182
+ },
183
+ })
184
+
185
+ globalSchemaRegistry.register({
186
+ type: 'decision.committed', version: 1,
187
+ validate( p ){
188
+ if( !isObj(p) ) return 'payload must be object'
189
+ if( typeof p['actionType'] !== 'string' ) return "missing string field 'actionType'"
190
+ return hasNum( p, 'confidence' )
191
+ },
192
+ })
193
+
194
+ globalSchemaRegistry.register({
195
+ type: 'inhibition.vetoed', version: 1,
196
+ validate( p ){
197
+ if( !isObj(p) ) return 'payload must be object'
198
+ if( !Array.isArray( p['vetoedActions'] ) ) return "missing array field 'vetoedActions'"
199
+ return null
200
+ },
201
+ })
202
+
203
+ globalSchemaRegistry.register({
204
+ type: 'planning.plan.created', version: 1,
205
+ validate( p ){
206
+ if( !isObj(p) ) return 'payload must be object'
207
+ return hasNum( p, 'totalPlans' )
208
+ },
209
+ })
210
+
211
+ globalSchemaRegistry.register({
212
+ type: 'task.focus.changed', version: 1,
213
+ validate( p ){
214
+ if( !isObj(p) ) return 'payload must be object'
215
+ return hasNum( p, 'focusTicks' )
216
+ },
217
+ })
218
+
219
+
220
+ globalSchemaRegistry.register({
221
+ type: 'action.executed', version: 1,
222
+ validate( p ){
223
+ if( !isObj(p) ) return 'payload must be object'
224
+ return hasNum( p, 'count' )
225
+ },
226
+ })
227
+
228
+ // ── Memory ───────────────────────────────────────────────────
229
+
230
+ globalSchemaRegistry.register({
231
+ type: 'episode.consolidated', version: 1,
232
+ validate( p ){
233
+ if( !isObj(p) ) return 'payload must be object'
234
+ return hasNum( p, 'total' )
235
+ },
236
+ })
237
+
238
+ globalSchemaRegistry.register({
239
+ type: 'belief.updated', version: 1,
240
+ validate( p ){
241
+ if( !isObj(p) ) return 'payload must be object'
242
+ return hasNum( p, 'total' )
243
+ },
244
+ })
245
+
246
+ globalSchemaRegistry.register({
247
+ type: 'memory.decay.applied', version: 1,
248
+ validate( p ){
249
+ if( !isObj(p) ) return 'payload must be object'
250
+ return hasNum( p, 'decayed' )
251
+ },
252
+ })
253
+
254
+ globalSchemaRegistry.register({
255
+ type: 'dream.active', version: 1,
256
+ validate( p ){
257
+ if( !isObj(p) ) return 'payload must be object'
258
+ return hasNum( p, 'reactivated' )
259
+ },
260
+ })
261
+
262
+ globalSchemaRegistry.register({
263
+ type: 'narrative.updated', version: 1,
264
+ validate( p ){
265
+ if( !isObj(p) ) return 'payload must be object'
266
+ return hasNum( p, 'version' )
267
+ },
268
+ })
269
+
270
+ // ── Meta-cognitive ───────────────────────────────────────────
271
+
272
+ globalSchemaRegistry.register({
273
+ type: 'self_model.updated', version: 1,
274
+ validate( p ){
275
+ if( !isObj(p) ) return 'payload must be object'
276
+ return hasNum( p, 'version' )
277
+ },
278
+ })
279
+
280
+ globalSchemaRegistry.register({
281
+ type: 'confidence.calibrated', version: 1,
282
+ validate( p ){
283
+ if( !isObj(p) ) return 'payload must be object'
284
+ return hasNum( p, 'calibrationBias' )
285
+ },
286
+ })
287
+
288
+ globalSchemaRegistry.register({
289
+ type: 'bias.detected', version: 1,
290
+ validate( p ){
291
+ if( !isObj(p) ) return 'payload must be object'
292
+ return hasNum( p, 'count' )
293
+ },
294
+ })
295
+
296
+ globalSchemaRegistry.register({
297
+ type: 'introspection.insight', version: 1,
298
+ validate( p ){
299
+ if( !isObj(p) ) return 'payload must be object'
300
+ return hasNum( p, 'total' )
301
+ },
302
+ })
303
+
304
+ globalSchemaRegistry.register({
305
+ type: 'theory_of_mind.model.updated', version: 1,
306
+ validate( p ){
307
+ if( !isObj(p) ) return 'payload must be object'
308
+ return hasNum( p, 'modelsActive' )
309
+ },
310
+ })
311
+
312
+ globalSchemaRegistry.register({
313
+ type: 'empathy.resonance', version: 1,
314
+ validate( p ){
315
+ if( !isObj(p) ) return 'payload must be object'
316
+ return hasNum( p, 'activeModels' )
317
+ },
318
+ })
319
+
320
+ globalSchemaRegistry.register({
321
+ type: 'reputation.updated', version: 1,
322
+ validate( p ){
323
+ if( !isObj(p) ) return 'payload must be object'
324
+ return hasNum( p, 'trackedAgents' )
325
+ },
326
+ })
327
+
328
+ // ── Infrastructure ───────────────────────────────────────────
329
+
330
+ globalSchemaRegistry.register({
331
+ type: 'executive.active', version: 1,
332
+ validate( p ){
333
+ if( !isObj(p) ) return 'payload must be object'
334
+ return hasNum( p, 'tick' )
335
+ },
336
+ })
337
+
338
+ globalSchemaRegistry.register({
339
+ type: 'communication.session.active', version: 1,
340
+ validate( p ){
341
+ if( !isObj(p) ) return 'payload must be object'
342
+ return hasNum( p, 'sessionCount' )
343
+ },
344
+ })
345
+
346
+ globalSchemaRegistry.register({
347
+ type: 'llm.cost.tick', version: 1,
348
+ validate( p ){
349
+ if( !isObj(p) ) return 'payload must be object'
350
+ return hasNum( p, 'costThisTick' )
351
+ },
352
+ })
353
+
354
+ // ── Phase D: cold-start and rich state-change events ─────────
355
+
356
+ // engine.snapshot — published by every CognitiveEngine on startup
357
+ globalSchemaRegistry.register({
358
+ type: 'engine.snapshot', version: 1,
359
+ validate( p ){ return typeof p === 'object' && p !== null ? null : 'payload must be object' },
360
+ })
361
+
362
+ // State-change events — published when a regulatory engine's value changes
363
+ // meaningfully. Carry full current state so subscribers can update local copies.
364
+
365
+ globalSchemaRegistry.register({
366
+ type: 'energy.state.changed', version: 1,
367
+ validate( p ){
368
+ if( !isObj(p) ) return 'payload must be object'
369
+ return hasNum( p, 'level' ) ?? hasNum( p, 'zoneCode' )
370
+ },
371
+ })
372
+
373
+ globalSchemaRegistry.register({
374
+ type: 'sleep.state.changed', version: 1,
375
+ validate( p ){
376
+ if( !isObj(p) ) return 'payload must be object'
377
+ return hasNum( p, 'pressure' ) ?? hasNum( p, 'intensity' )
378
+ },
379
+ })
380
+
381
+ globalSchemaRegistry.register({
382
+ type: 'stress.state.changed', version: 1,
383
+ validate( p ){
384
+ if( !isObj(p) ) return 'payload must be object'
385
+ return hasNum( p, 'load' ) ?? hasNum( p, 'zoneCode' )
386
+ },
387
+ })
388
+
389
+ globalSchemaRegistry.register({
390
+ type: 'circadian.state.changed', version: 1,
391
+ validate( p ){
392
+ if( !isObj(p) ) return 'payload must be object'
393
+ return hasNum( p, 'alertness' )
394
+ },
395
+ })
396
+
397
+ globalSchemaRegistry.register({
398
+ type: 'attention.state.changed', version: 1,
399
+ validate( p ){
400
+ if( !isObj(p) ) return 'payload must be object'
401
+ return hasNum( p, 'usage' )
402
+ },
403
+ })
404
+
405
+ globalSchemaRegistry.register({
406
+ type: 'attention.regulate', version: 1,
407
+ validate( p ){
408
+ if( !isObj(p) ) return 'payload must be object'
409
+ return hasNum( p, 'effortTarget' )
410
+ },
411
+ })
412
+
413
+ globalSchemaRegistry.register({
414
+ type: 'affect.state.changed', version: 1,
415
+ validate( p ){
416
+ if( !isObj(p) ) return 'payload must be object'
417
+ return hasNum( p, 'valence' ) ?? hasNum( p, 'arousal' )
418
+ },
419
+ })
420
+
421
+ globalSchemaRegistry.register({
422
+ type: 'interoception.state.changed', version: 1,
423
+ validate( p ){
424
+ if( !isObj(p) ) return 'payload must be object'
425
+ return hasNum( p, 'comfort' )
426
+ },
427
+ })
428
+
429
+ globalSchemaRegistry.register({
430
+ type: 'novelty.state.changed', version: 1,
431
+ validate( p ){
432
+ if( !isObj(p) ) return 'payload must be object'
433
+ return hasNum( p, 'novelty' )
434
+ },
435
+ })
436
+
437
+ globalSchemaRegistry.register({
438
+ type: 'memory.state.changed', version: 1,
439
+ validate( p ){
440
+ if( !isObj(p) ) return 'payload must be object'
441
+ return null
442
+ },
443
+ })
444
+
445
+ globalSchemaRegistry.register({
446
+ type: 'metacognition.state.changed', version: 1,
447
+ validate( p ){
448
+ if( !isObj(p) ) return 'payload must be object'
449
+ return null
450
+ },
451
+ })
452
+
453
+ // ── Phase E: Global Workspace (Executive broadcast events) ─────
454
+
455
+ globalSchemaRegistry.register({
456
+ type: 'executive.interpretation.formed', version: 1,
457
+ validate( p ){
458
+ if( !isObj(p) ) return 'payload must be object'
459
+ return hasNum( p, 'confidence' )
460
+ },
461
+ })
462
+
463
+ globalSchemaRegistry.register({
464
+ type: 'executive.goal.proposed', version: 1,
465
+ validate( p ){
466
+ if( !isObj(p) ) return 'payload must be object'
467
+ return hasNum( p, 'count' )
468
+ },
469
+ })
470
+
471
+ globalSchemaRegistry.register({
472
+ type: 'executive.self.reflection', version: 1,
473
+ validate( p ){
474
+ if( !isObj(p) ) return 'payload must be object'
475
+ return hasNum( p, 'confidence' )
476
+ },
477
+ })
478
+
479
+ globalSchemaRegistry.register({
480
+ type: 'executive.decision.rationale', version: 1,
481
+ validate( p ){
482
+ if( !isObj(p) ) return 'payload must be object'
483
+ return hasNum( p, 'confidence' )
484
+ },
485
+ })
486
+
487
+ globalSchemaRegistry.register({
488
+ type: 'executive.prediction.formed', version: 1,
489
+ validate( p ){
490
+ if( !isObj(p) ) return 'payload must be object'
491
+ return hasNum( p, 'confidence' )
492
+ },
493
+ })
494
+
495
+ // ── Conversion-enabling schemas ───────────────────────────────
496
+ // New events that give subscribers the context they need without
497
+ // reaching into shared state.
498
+
499
+ globalSchemaRegistry.register({
500
+ type: 'goal.blocked', version: 1,
501
+ validate( p ){
502
+ if( !isObj(p) ) return 'payload must be object'
503
+ if( typeof p['goalId'] !== 'string' ) return "missing string field 'goalId'"
504
+ return hasNum( p, 'ticksStuck' ) ?? hasNum( p, 'priority' )
505
+ },
506
+ })
507
+
508
+ globalSchemaRegistry.register({
509
+ type: 'goal.achieved', version: 1,
510
+ validate( p ){
511
+ if( !isObj(p) ) return 'payload must be object'
512
+ if( typeof p['goalId'] !== 'string' ) return "missing string field 'goalId'"
513
+ return hasNum( p, 'priority' ) ?? hasNum( p, 'timeToComplete' )
514
+ },
515
+ })
516
+
517
+ globalSchemaRegistry.register({
518
+ type: 'goal.abandoned', version: 1,
519
+ validate( p ){
520
+ if( !isObj(p) ) return 'payload must be object'
521
+ if( typeof p['goalId'] !== 'string' ) return "missing string field 'goalId'"
522
+ return null
523
+ },
524
+ })
525
+
526
+ globalSchemaRegistry.register({
527
+ type: 'action.outcome', version: 1,
528
+ validate( p ){
529
+ if( !isObj(p) ) return 'payload must be object'
530
+ if( typeof p['actionType'] !== 'string' ) return "missing string field 'actionType'"
531
+ if( typeof p['domain'] !== 'string' ) return "missing string field 'domain'"
532
+ return hasNum( p, 'outcomeQuality' )
533
+ },
534
+ })
535
+
536
+ globalSchemaRegistry.register({
537
+ type: 'sleep.begun', version: 1,
538
+ validate( p ){
539
+ if( !isObj(p) ) return 'payload must be object'
540
+ return hasNum( p, 'pressure' )
541
+ },
542
+ })
543
+
544
+ globalSchemaRegistry.register({
545
+ type: 'sleep.ended', version: 1,
546
+ validate( p ){
547
+ if( !isObj(p) ) return 'payload must be object'
548
+ return hasNum( p, 'tick' )
549
+ },
550
+ })
551
+
552
+ globalSchemaRegistry.register({
553
+ type: 'interaction.occurred', version: 1,
554
+ validate( p ){
555
+ if( !isObj(p) ) return 'payload must be object'
556
+ if( typeof p['keid'] !== 'string' ) return "missing string field 'keid'"
557
+ return hasNum( p, 'valence' ) ?? hasNum( p, 'intensity' )
558
+ },
559
+ })
560
+
561
+ globalSchemaRegistry.register({
562
+ type: 'percept.category.updated', version: 1,
563
+ validate( p ){
564
+ if( !isObj(p) ) return 'payload must be object'
565
+ if( typeof p['category'] !== 'string' ) return "missing string field 'category'"
566
+ return hasNum( p, 'count' )
567
+ },
568
+ })