@terminals-tech/sdk 1.0.0-rc.1 → 1.0.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 (82) hide show
  1. package/README.md +15 -19
  2. package/dist/WebContainerManager-4LIOGRVM.js +22 -0
  3. package/dist/browser-http-client-ZQLDWZMU.js +317 -0
  4. package/dist/cache-VKYSQRXX.js +45 -0
  5. package/dist/capabilities-MIPUMBLL.js +96 -0
  6. package/dist/chunk-2ESYSVXG.js +48 -0
  7. package/dist/chunk-2WTYE4SW.js +190 -0
  8. package/dist/chunk-3LFMIVJM.js +40 -0
  9. package/dist/chunk-ABCK4FWN.js +136 -0
  10. package/dist/chunk-AFDUOYHD.js +2060 -0
  11. package/dist/chunk-BCOQMFKT.js +265 -0
  12. package/dist/chunk-BYXBJQAS.js +0 -0
  13. package/dist/chunk-DKFJIILR.js +9798 -0
  14. package/dist/chunk-EXI3LJVJ.js +51 -0
  15. package/dist/chunk-FOXUEYWK.js +42 -0
  16. package/dist/chunk-GJWAJAX3.js +173 -0
  17. package/dist/chunk-H3POJCFA.js +333 -0
  18. package/dist/chunk-KASHT6C5.js +784 -0
  19. package/dist/chunk-KHR7ZYCX.js +4034 -0
  20. package/dist/chunk-L45BSQDJ.js +296 -0
  21. package/dist/chunk-LLGZTP3G.js +5521 -0
  22. package/dist/chunk-NTMBOESX.js +152 -0
  23. package/dist/chunk-OCLSAUCD.js +474 -0
  24. package/dist/chunk-OSSRZOGC.js +190 -0
  25. package/dist/chunk-PPFTKJDB.js +497 -0
  26. package/dist/chunk-PWAHFID5.js +381 -0
  27. package/dist/chunk-Q2VI6ICE.js +188 -0
  28. package/dist/chunk-QJFKEQHF.js +6460 -0
  29. package/dist/chunk-QWXPVB2L.js +320 -0
  30. package/dist/chunk-QWZRZKLZ.js +896 -0
  31. package/dist/chunk-STMI72WH.js +1005 -0
  32. package/dist/chunk-TSQ3BGLA.js +11945 -0
  33. package/dist/chunk-UJDUQNE2.js +79 -0
  34. package/dist/chunk-VZA2NUH3.js +118 -0
  35. package/dist/chunk-WGBCRNMB.js +1817 -0
  36. package/dist/chunk-WU4OTGJE.js +752 -0
  37. package/dist/chunk-XPJ63Y6T.js +70 -0
  38. package/dist/chunk-Y2EULKA2.js +172 -0
  39. package/dist/chunk-YJEZWCYV.js +94 -0
  40. package/dist/chunk-ZVO47SQV.js +150 -0
  41. package/dist/container-lite-QD3CRLS4.js +327 -0
  42. package/dist/core-H2UUDATO.js +146 -0
  43. package/dist/crypto-D4LMI2RN.js +45 -0
  44. package/dist/db-BWC2GGBN.js +50 -0
  45. package/dist/demo-T655Z5S4.js +87 -0
  46. package/dist/diagnostics-6RQTBR6I.js +113 -0
  47. package/dist/dist-OPDCWARF.js +727 -0
  48. package/dist/dist-VXJEKX3T.js +2441 -0
  49. package/dist/dist-VYGJXGUS.js +1008 -0
  50. package/dist/embeddings-7QXTXUMC.js +15 -0
  51. package/dist/embeddings-MAEWWUHW.js +9 -0
  52. package/dist/graph-RKMNE2X5.js +36 -0
  53. package/dist/hvm-CBEP3M4F.js +126 -0
  54. package/dist/index.cjs +49874 -8001
  55. package/dist/index.d.cts +1629 -1363
  56. package/dist/index.d.ts +1629 -1363
  57. package/dist/index.js +2462 -8130
  58. package/dist/mcp-NK34ZNM5.js +101 -0
  59. package/dist/mcp-client-service-browser-SGB2K3VZ.js +14 -0
  60. package/dist/neuro-state-XHRGIRVO.js +498 -0
  61. package/dist/nodes-K6GKI2FM.js +364 -0
  62. package/dist/package-EXUIU2RL.js +93 -0
  63. package/dist/package-VGL7HYTO.js +106 -0
  64. package/dist/package-XHMLOAQ4.js +98 -0
  65. package/dist/pg-events-QJAM2HIP.js +15 -0
  66. package/dist/pglite-adapter-43IOUBMV.js +50 -0
  67. package/dist/pgliteService-IUGNNOVU.js +258 -0
  68. package/dist/policy-IRJCM6FS.js +13 -0
  69. package/dist/registry-5WTDYQVQ.js +26 -0
  70. package/dist/registry-FW63E7FE.js +16 -0
  71. package/dist/registry-ZQ2IBLF6.js +9 -0
  72. package/dist/resolver-ALOJSOK5.js +24 -0
  73. package/dist/scheduler-B5CEYKWT.js +127 -0
  74. package/dist/secret-store-H7273UIT.js +18 -0
  75. package/dist/server-VW6DYDLH.js +18 -0
  76. package/dist/skills-VN7IN7SJ.js +6375 -0
  77. package/dist/stack-4KWCQQP7.js +103 -0
  78. package/dist/storage-L7MWNSPG.js +13 -0
  79. package/dist/supabaseService-6AYP2VY3.js +476 -0
  80. package/dist/topology-CIWWNVAN.js +13 -0
  81. package/dist/webcontainer-XWCE56F3.js +281 -0
  82. package/package.json +9 -3
@@ -0,0 +1,381 @@
1
+ import {
2
+ appendMeshEvent
3
+ } from "./chunk-Y2EULKA2.js";
4
+ import {
5
+ createAddress,
6
+ createInteractionWithEvents,
7
+ sanitizeTraceSegment,
8
+ transitionStatusWithEvent
9
+ } from "./chunk-BCOQMFKT.js";
10
+ import {
11
+ secureValidate
12
+ } from "./chunk-FOXUEYWK.js";
13
+ import {
14
+ DEFAULT_EMBEDDING_DIM
15
+ } from "./chunk-ZVO47SQV.js";
16
+ import {
17
+ isDatabaseReady
18
+ } from "./chunk-AFDUOYHD.js";
19
+
20
+ // ../../lib/terminals-tech/mesh/events.ts
21
+ var logs = /* @__PURE__ */ new Map();
22
+ function createEventLog(id) {
23
+ const log = {
24
+ id: id || crypto.randomUUID(),
25
+ events: [],
26
+ createdAt: Date.now()
27
+ };
28
+ logs.set(log.id, log);
29
+ return log;
30
+ }
31
+ function appendEvent(logId, type, payload, embedding, metadata) {
32
+ let log = logs.get(logId);
33
+ if (!log) {
34
+ log = createEventLog(logId);
35
+ }
36
+ const event = {
37
+ id: crypto.randomUUID(),
38
+ type,
39
+ payload,
40
+ timestamp: Date.now(),
41
+ embedding,
42
+ metadata
43
+ };
44
+ log.events = [...log.events, event];
45
+ log.lastEventAt = event.timestamp;
46
+ return event;
47
+ }
48
+ function queryEvents(logId, query = {}) {
49
+ const log = logs.get(logId);
50
+ if (!log) return [];
51
+ let events = log.events;
52
+ if (query.types && query.types.length > 0) {
53
+ const types = query.types;
54
+ events = events.filter((e) => types.includes(e.type));
55
+ }
56
+ if (query.since !== void 0) {
57
+ const since = query.since;
58
+ events = events.filter((e) => e.timestamp >= since);
59
+ }
60
+ if (query.until !== void 0) {
61
+ const until = query.until;
62
+ events = events.filter((e) => e.timestamp <= until);
63
+ }
64
+ if (query.withEmbedding === false) {
65
+ events = events.filter((e) => !e.embedding);
66
+ } else if (query.withEmbedding === true) {
67
+ events = events.filter((e) => !!e.embedding);
68
+ }
69
+ if (query.interactionId !== void 0) {
70
+ const interactionId = query.interactionId;
71
+ events = events.filter((e) => e.metadata?.interactionId === interactionId);
72
+ }
73
+ if (query.limit) {
74
+ events = events.slice(-query.limit);
75
+ }
76
+ return events;
77
+ }
78
+ function queryByInteraction(logId, interactionId, additionalQuery = {}) {
79
+ return queryEvents(logId, {
80
+ ...additionalQuery,
81
+ interactionId
82
+ });
83
+ }
84
+
85
+ // ../../lib/terminals-tech/mesh/interaction-store.ts
86
+ var INTERACTION_LOG_ID = "mesh-interactions";
87
+ var runToInteraction = /* @__PURE__ */ new Map();
88
+ var interactionSequences = /* @__PURE__ */ new Map();
89
+ var INTERACTION_CREATED_PAYLOAD_SCHEMA = {
90
+ type: "object",
91
+ required: ["interaction"],
92
+ properties: {
93
+ interaction: { type: "object" },
94
+ sequence: { type: "number" }
95
+ },
96
+ additionalProperties: true
97
+ };
98
+ var INTERACTION_STATUS_PAYLOAD_SCHEMA = {
99
+ type: "object",
100
+ required: ["interactionId", "to", "at"],
101
+ properties: {
102
+ interactionId: { type: "string" },
103
+ from: { type: "string" },
104
+ to: { type: "string" },
105
+ at: { type: "number" },
106
+ sequence: { type: "number" }
107
+ },
108
+ additionalProperties: true
109
+ };
110
+ function getDefaultCoordinator() {
111
+ return createAddress("L2", "orchestrator", "v0");
112
+ }
113
+ function nextSequence(interactionId) {
114
+ const current = interactionSequences.get(interactionId) ?? 0;
115
+ const next = current + 1;
116
+ interactionSequences.set(interactionId, next);
117
+ return next;
118
+ }
119
+ function buildInteractionTracePath(interactionId, eventType) {
120
+ const interaction = sanitizeTraceSegment(interactionId) || "unknown";
121
+ const event = sanitizeTraceSegment(eventType) || "event";
122
+ return `interactions.${interaction}.${event}`;
123
+ }
124
+ function attachSequence(interactionId, payload) {
125
+ const current = payload.sequence;
126
+ const sequence = current ?? nextSequence(interactionId);
127
+ return { ...payload, sequence };
128
+ }
129
+ function getInteractionForTransition(interactionId) {
130
+ const events = queryByInteraction(INTERACTION_LOG_ID, interactionId);
131
+ if (!events.length) return null;
132
+ let interaction = null;
133
+ let latestStatusPayload = null;
134
+ for (const event of events) {
135
+ if (event.type === "interaction:created") {
136
+ const validated = secureValidate(event.payload, INTERACTION_CREATED_PAYLOAD_SCHEMA);
137
+ if (validated) {
138
+ const payload = validated;
139
+ if (payload.interaction) {
140
+ interaction = payload.interaction;
141
+ }
142
+ }
143
+ }
144
+ if (event.type === "interaction:status_changed") {
145
+ const validated = secureValidate(event.payload, INTERACTION_STATUS_PAYLOAD_SCHEMA);
146
+ if (validated) {
147
+ latestStatusPayload = validated;
148
+ }
149
+ }
150
+ }
151
+ if (!interaction) return null;
152
+ if (latestStatusPayload) {
153
+ interaction = {
154
+ ...interaction,
155
+ status: latestStatusPayload.to,
156
+ startedAt: latestStatusPayload.to === "active" ? latestStatusPayload.at : interaction.startedAt,
157
+ completedAt: ["completed", "failed", "cancelled"].includes(latestStatusPayload.to) ? latestStatusPayload.at : interaction.completedAt
158
+ };
159
+ }
160
+ return interaction;
161
+ }
162
+ async function emitInteractionEvent(interactionId, type, payload, metadata) {
163
+ const payloadWithSequence = attachSequence(interactionId, payload);
164
+ const result = await appendMeshSinkEvent({
165
+ tracePath: buildInteractionTracePath(interactionId, type),
166
+ payload: payloadWithSequence,
167
+ metadata,
168
+ logId: INTERACTION_LOG_ID,
169
+ typeOverride: type
170
+ });
171
+ if (result.mode === "pglite") {
172
+ appendEvent(INTERACTION_LOG_ID, type, payloadWithSequence, void 0, metadata);
173
+ }
174
+ const enrichedMeta = metadata ?? {};
175
+ const userId = enrichedMeta.userId ?? enrichedMeta.user_id;
176
+ if (userId && typeof window !== "undefined") {
177
+ try {
178
+ const { appendSupabaseMeshEvent } = await import("./supabaseService-6AYP2VY3.js");
179
+ await appendSupabaseMeshEvent({
180
+ user_id: userId,
181
+ interaction_id: interactionId,
182
+ run_id: enrichedMeta.runId || null,
183
+ stack_id: enrichedMeta.stackId || null,
184
+ prev_hash: null,
185
+ trace_path: buildInteractionTracePath(interactionId, type),
186
+ type,
187
+ payload: payloadWithSequence,
188
+ metadata: enrichedMeta,
189
+ embedding: null,
190
+ span: null
191
+ });
192
+ } catch {
193
+ }
194
+ }
195
+ }
196
+ function emitLifecycleEvents(events, interactionId, meta) {
197
+ const metadata = { interactionId, ...meta };
198
+ events.forEach((event) => {
199
+ void emitInteractionEvent(interactionId, event.type, event.payload, metadata);
200
+ });
201
+ }
202
+ function ensureInteractionForRun(runId, stackId, interactionId) {
203
+ const existingId = interactionId || runToInteraction.get(runId);
204
+ if (existingId) {
205
+ runToInteraction.set(runId, existingId);
206
+ return existingId;
207
+ }
208
+ const result = createInteractionWithEvents({
209
+ type: "workflow",
210
+ status: "initiated",
211
+ context: { runId, stackId },
212
+ labels: ["orchestrator", "run"],
213
+ participants: [
214
+ {
215
+ address: getDefaultCoordinator(),
216
+ role: "coordinator",
217
+ metadata: { runId, stackId }
218
+ }
219
+ ]
220
+ });
221
+ runToInteraction.set(runId, result.interaction.id);
222
+ emitLifecycleEvents(result.events, result.interaction.id, { runId, stackId });
223
+ return result.interaction.id;
224
+ }
225
+ function recordRunStart(event, interactionId) {
226
+ const ensuredId = ensureInteractionForRun(event.runId, event.stackId, interactionId);
227
+ void emitInteractionEvent(
228
+ ensuredId,
229
+ "interaction:run_start",
230
+ { ...event, interactionId: ensuredId },
231
+ { interactionId: ensuredId, runId: event.runId, stackId: event.stackId }
232
+ );
233
+ const existing = getInteractionForTransition(ensuredId);
234
+ if (!existing) return ensuredId;
235
+ const { event: statusEvent } = transitionStatusWithEvent(existing, "active", {
236
+ timestamp: event.startedAt,
237
+ sequence: nextSequence(ensuredId)
238
+ });
239
+ void emitInteractionEvent(
240
+ ensuredId,
241
+ statusEvent.type,
242
+ statusEvent.payload,
243
+ { interactionId: ensuredId, runId: event.runId, stackId: event.stackId }
244
+ );
245
+ return ensuredId;
246
+ }
247
+ function recordNodeComplete(event) {
248
+ const interactionId = runToInteraction.get(event.runId);
249
+ if (!interactionId) return void 0;
250
+ void emitInteractionEvent(
251
+ interactionId,
252
+ "interaction:node_complete",
253
+ { ...event, interactionId },
254
+ { interactionId, runId: event.runId, nodeId: event.nodeId }
255
+ );
256
+ return interactionId;
257
+ }
258
+ function recordRunComplete(event) {
259
+ const interactionId = runToInteraction.get(event.runId);
260
+ if (!interactionId) return void 0;
261
+ void emitInteractionEvent(
262
+ interactionId,
263
+ "interaction:run_complete",
264
+ { ...event, interactionId },
265
+ { interactionId, runId: event.runId }
266
+ );
267
+ const existing = getInteractionForTransition(interactionId);
268
+ if (!existing) return interactionId;
269
+ const targetStatus = event.success ? "completed" : "failed";
270
+ const { event: statusEvent } = transitionStatusWithEvent(existing, targetStatus, {
271
+ timestamp: event.completedAt,
272
+ sequence: nextSequence(interactionId)
273
+ });
274
+ void emitInteractionEvent(
275
+ interactionId,
276
+ statusEvent.type,
277
+ statusEvent.payload,
278
+ { interactionId, runId: event.runId }
279
+ );
280
+ return interactionId;
281
+ }
282
+ function recordSystemPause(event) {
283
+ const interactionId = runToInteraction.get(event.runId);
284
+ if (!interactionId) return void 0;
285
+ void emitInteractionEvent(
286
+ interactionId,
287
+ "interaction:system_pause",
288
+ { ...event, interactionId },
289
+ { interactionId, runId: event.runId }
290
+ );
291
+ const existing = getInteractionForTransition(interactionId);
292
+ if (!existing) return interactionId;
293
+ const { event: statusEvent } = transitionStatusWithEvent(existing, "paused", {
294
+ timestamp: event.pausedAt,
295
+ sequence: nextSequence(interactionId)
296
+ });
297
+ void emitInteractionEvent(
298
+ interactionId,
299
+ statusEvent.type,
300
+ statusEvent.payload,
301
+ { interactionId, runId: event.runId }
302
+ );
303
+ return interactionId;
304
+ }
305
+ function recordSystemResume(event) {
306
+ const interactionId = runToInteraction.get(event.runId);
307
+ if (!interactionId) return void 0;
308
+ void emitInteractionEvent(
309
+ interactionId,
310
+ "interaction:system_resume",
311
+ { ...event, interactionId },
312
+ { interactionId, runId: event.runId }
313
+ );
314
+ const existing = getInteractionForTransition(interactionId);
315
+ if (!existing) return interactionId;
316
+ const { event: statusEvent } = transitionStatusWithEvent(existing, "active", {
317
+ timestamp: event.resumedAt,
318
+ sequence: nextSequence(interactionId)
319
+ });
320
+ void emitInteractionEvent(
321
+ interactionId,
322
+ statusEvent.type,
323
+ statusEvent.payload,
324
+ { interactionId, runId: event.runId }
325
+ );
326
+ return interactionId;
327
+ }
328
+
329
+ // ../../lib/terminals-tech/mesh/mesh-sink.ts
330
+ function normalizeEmbedding(embedding) {
331
+ if (!embedding) return void 0;
332
+ const arr = embedding instanceof Float32Array ? embedding : new Float32Array(embedding);
333
+ const target = arr.length === DEFAULT_EMBEDDING_DIM ? arr : (() => {
334
+ const fixed = new Float32Array(DEFAULT_EMBEDDING_DIM);
335
+ fixed.set(arr.subarray(0, Math.min(arr.length, DEFAULT_EMBEDDING_DIM)));
336
+ return fixed;
337
+ })();
338
+ for (let i = 0; i < target.length; i++) {
339
+ if (Number.isNaN(target[i])) target[i] = 0;
340
+ }
341
+ return target;
342
+ }
343
+ function deriveType(tracePath, override) {
344
+ if (override) return override;
345
+ const parts = tracePath.split(".");
346
+ return parts[parts.length - 1] || "event";
347
+ }
348
+ function deriveLogId(tracePath, fallback) {
349
+ if (fallback) return fallback;
350
+ return tracePath.replace(/[^\w]+/g, "_").slice(0, 120) || "mesh";
351
+ }
352
+ async function appendMeshSinkEvent(input) {
353
+ const { tracePath, payload, embedding, metadata, span, logId, typeOverride } = input;
354
+ if (isDatabaseReady()) {
355
+ const event2 = await appendMeshEvent(
356
+ tracePath,
357
+ payload,
358
+ embedding ? Array.from(normalizeEmbedding(embedding) || []) : void 0,
359
+ span,
360
+ metadata
361
+ );
362
+ return { mode: "pglite", event: event2 };
363
+ }
364
+ const event = appendEvent(
365
+ deriveLogId(tracePath, logId),
366
+ deriveType(tracePath, typeOverride),
367
+ payload,
368
+ normalizeEmbedding(embedding),
369
+ metadata
370
+ );
371
+ return { mode: "memory", event };
372
+ }
373
+
374
+ export {
375
+ appendMeshSinkEvent,
376
+ recordRunStart,
377
+ recordNodeComplete,
378
+ recordRunComplete,
379
+ recordSystemPause,
380
+ recordSystemResume
381
+ };
@@ -0,0 +1,188 @@
1
+ import {
2
+ recordNodeComplete,
3
+ recordRunComplete,
4
+ recordRunStart,
5
+ recordSystemPause,
6
+ recordSystemResume
7
+ } from "./chunk-PWAHFID5.js";
8
+ import {
9
+ getSignalBus
10
+ } from "./chunk-2WTYE4SW.js";
11
+
12
+ // ../../lib/terminals-tech/mesh/axon/bridges/layer-bridge.ts
13
+ function createLayerBridge(sourceLayer, targetLayer) {
14
+ const upHandlers = [];
15
+ const downHandlers = [];
16
+ return {
17
+ sourceLayer,
18
+ targetLayer,
19
+ sendUp(data) {
20
+ getSignalBus().emit("health_update", sourceLayer, targetLayer, {
21
+ direction: "up",
22
+ data
23
+ });
24
+ for (const handler of upHandlers) {
25
+ try {
26
+ handler(data);
27
+ } catch (error) {
28
+ console.error(`[Bridge ${sourceLayer}->${targetLayer}] Up handler error:`, error);
29
+ }
30
+ }
31
+ },
32
+ sendDown(data) {
33
+ getSignalBus().emit("health_update", targetLayer, sourceLayer, {
34
+ direction: "down",
35
+ data
36
+ });
37
+ for (const handler of downHandlers) {
38
+ try {
39
+ handler(data);
40
+ } catch (error) {
41
+ console.error(`[Bridge ${targetLayer}->${sourceLayer}] Down handler error:`, error);
42
+ }
43
+ }
44
+ },
45
+ onUp(handler) {
46
+ upHandlers.push(handler);
47
+ return () => {
48
+ const index = upHandlers.indexOf(handler);
49
+ if (index >= 0) {
50
+ upHandlers.splice(index, 1);
51
+ }
52
+ };
53
+ },
54
+ onDown(handler) {
55
+ downHandlers.push(handler);
56
+ return () => {
57
+ const index = downHandlers.indexOf(handler);
58
+ if (index >= 0) {
59
+ downHandlers.splice(index, 1);
60
+ }
61
+ };
62
+ }
63
+ };
64
+ }
65
+
66
+ // ../../lib/terminals-tech/mesh/axon/bridges/l2-l3-bridge.ts
67
+ var l2L3Bridge = createLayerBridge(
68
+ "L2",
69
+ "L3"
70
+ );
71
+ var orchestratorToMesh = {
72
+ /**
73
+ * Notify mesh that a run has started
74
+ */
75
+ onRunStart(runId, stackId) {
76
+ const event = {
77
+ runId,
78
+ stackId,
79
+ startedAt: Date.now()
80
+ };
81
+ l2L3Bridge.sendUp({
82
+ type: "run_start",
83
+ event
84
+ });
85
+ recordRunStart(event);
86
+ getSignalBus().emit("task_complete", "L2", "L3", {
87
+ action: "run_start",
88
+ runId,
89
+ stackId
90
+ });
91
+ },
92
+ /**
93
+ * Notify mesh that a node has completed
94
+ */
95
+ onNodeComplete(runId, nodeId, success, durationMs) {
96
+ const event = {
97
+ runId,
98
+ nodeId,
99
+ success,
100
+ durationMs,
101
+ completedAt: Date.now()
102
+ };
103
+ l2L3Bridge.sendUp({
104
+ type: "node_complete",
105
+ event
106
+ });
107
+ recordNodeComplete(event);
108
+ const signalType = success ? "task_complete" : "task_failed";
109
+ getSignalBus().emit(signalType, "L2", "L3", {
110
+ runId,
111
+ nodeId,
112
+ durationMs
113
+ });
114
+ },
115
+ /**
116
+ * Notify mesh that a run has completed
117
+ */
118
+ onRunComplete(runId, success, durationMs) {
119
+ const event = {
120
+ runId,
121
+ success,
122
+ durationMs,
123
+ completedAt: Date.now()
124
+ };
125
+ l2L3Bridge.sendUp({
126
+ type: "run_complete",
127
+ event
128
+ });
129
+ recordRunComplete(event);
130
+ const signalType = success ? "task_complete" : "task_failed";
131
+ getSignalBus().emit(signalType, "L2", "L3", {
132
+ action: "run_complete",
133
+ runId,
134
+ success,
135
+ durationMs
136
+ });
137
+ },
138
+ /**
139
+ * Notify mesh that system is pausing due to cognitive load
140
+ */
141
+ onSystemPause(runId, reason) {
142
+ const event = {
143
+ runId,
144
+ reason,
145
+ pausedAt: Date.now()
146
+ };
147
+ l2L3Bridge.sendUp({
148
+ type: "system_pause",
149
+ event
150
+ });
151
+ recordSystemPause(event);
152
+ getSignalBus().emit("backpressure_warning", "L2", "L3", {
153
+ action: "system_pause",
154
+ runId,
155
+ reason
156
+ });
157
+ },
158
+ /**
159
+ * Notify mesh that system is resuming execution
160
+ */
161
+ onSystemResume(runId) {
162
+ const event = {
163
+ runId,
164
+ resumedAt: Date.now()
165
+ };
166
+ l2L3Bridge.sendUp({
167
+ type: "system_resume",
168
+ event
169
+ });
170
+ recordSystemResume(event);
171
+ getSignalBus().emit("task_complete", "L2", "L3", {
172
+ action: "system_resume",
173
+ runId
174
+ });
175
+ }
176
+ };
177
+ function onOrchestratorEvent(handler) {
178
+ return l2L3Bridge.onUp(handler);
179
+ }
180
+ function onMeshFeedback(handler) {
181
+ return l2L3Bridge.onDown(handler);
182
+ }
183
+
184
+ export {
185
+ orchestratorToMesh,
186
+ onOrchestratorEvent,
187
+ onMeshFeedback
188
+ };