ocuclaw 1.3.3 → 1.3.4

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 (83) hide show
  1. package/README.md +29 -1
  2. package/dist/config/runtime-config-session-title-model.test.js +0 -3
  3. package/dist/config/runtime-config.js +22 -33
  4. package/dist/domain/activity-status-adapter.js +0 -7
  5. package/dist/domain/activity-status-arbiter.js +3 -27
  6. package/dist/domain/activity-status-labels.js +8 -38
  7. package/dist/domain/code-span-regions.js +4 -24
  8. package/dist/domain/constant-time-equal.js +9 -0
  9. package/dist/domain/constant-time-equal.test.js +28 -0
  10. package/dist/domain/conversation-state.js +27 -138
  11. package/dist/domain/debug-bundle-cache.js +52 -0
  12. package/dist/domain/debug-bundle-format.js +60 -0
  13. package/dist/domain/debug-bundle-preview.js +123 -0
  14. package/dist/domain/debug-bundle-redaction.js +182 -0
  15. package/dist/domain/debug-bundle-save.js +11 -0
  16. package/dist/domain/debug-bundle-zip.js +15 -0
  17. package/dist/domain/debug-bundle.js +97 -0
  18. package/dist/domain/debug-store.js +6 -17
  19. package/dist/domain/debug-upload-preset.js +27 -0
  20. package/dist/domain/glasses-display-system-prompt.js +0 -5
  21. package/dist/domain/glasses-display-system-prompt.test.js +1 -1
  22. package/dist/domain/glasses-ui-content-summary.js +0 -6
  23. package/dist/domain/glasses-ui-system-prompt.test.js +1 -2
  24. package/dist/domain/message-emoji-allowlist.js +0 -7
  25. package/dist/domain/message-emoji-filter.js +3 -9
  26. package/dist/domain/neural-emoji-reactor-tag-config.js +3 -3
  27. package/dist/domain/prompt-channel-fragments.js +1 -10
  28. package/dist/domain/tagged-span-parser.js +3 -26
  29. package/dist/domain/tagged-span-strip.js +0 -7
  30. package/dist/even-ai/even-ai-endpoint.js +77 -24
  31. package/dist/even-ai/even-ai-run-waiter.js +0 -1
  32. package/dist/even-ai/even-ai-settings-store.js +11 -0
  33. package/dist/gateway/gateway-bridge.js +8 -9
  34. package/dist/gateway/gateway-timing-ledger.js +8 -6
  35. package/dist/gateway/openclaw-client.js +97 -297
  36. package/dist/gateway/sanitize-connect-reason.js +10 -0
  37. package/dist/gateway/sanitize-connect-reason.test.js +34 -0
  38. package/dist/index.js +3 -3
  39. package/dist/runtime/channel-two-hook.js +1 -6
  40. package/dist/runtime/container-env.js +1 -5
  41. package/dist/runtime/debug-bundle-handler.js +159 -0
  42. package/dist/runtime/display-toggle-states.js +6 -17
  43. package/dist/runtime/downstream-handler.js +682 -508
  44. package/dist/runtime/glasses-backpressure-latch.js +2 -24
  45. package/dist/runtime/ocuclaw-settings-store.js +10 -1
  46. package/dist/runtime/openclaw-host-version.js +5 -0
  47. package/dist/runtime/plugin-version-service.js +13 -6
  48. package/dist/runtime/provider-usage-select.js +0 -6
  49. package/dist/runtime/register-session-title-distiller.js +14 -16
  50. package/dist/runtime/relay-core.js +601 -290
  51. package/dist/runtime/relay-service.js +19 -47
  52. package/dist/runtime/relay-worker-approval-replay-cache.js +1 -1
  53. package/dist/runtime/relay-worker-entry.js +1 -2
  54. package/dist/runtime/relay-worker-health.js +2 -10
  55. package/dist/runtime/relay-worker-protocol.js +6 -1
  56. package/dist/runtime/relay-worker-supervisor.js +103 -41
  57. package/dist/runtime/relay-worker-transport.js +150 -17
  58. package/dist/runtime/session-context-service.js +5 -45
  59. package/dist/runtime/session-service.js +157 -175
  60. package/dist/runtime/session-title-distiller-budget.js +1 -5
  61. package/dist/runtime/session-title-distiller-helpers.js +14 -24
  62. package/dist/runtime/session-title-distiller.js +109 -122
  63. package/dist/runtime/session-title-record.js +0 -6
  64. package/dist/runtime/stable-prompt-snapshot.js +3 -14
  65. package/dist/runtime/upstream-runtime.js +600 -103
  66. package/dist/tools/device-info-tool.js +4 -21
  67. package/dist/tools/glasses-ui-cron.js +22 -77
  68. package/dist/tools/glasses-ui-descriptors.js +4 -33
  69. package/dist/tools/glasses-ui-limits.js +0 -13
  70. package/dist/tools/glasses-ui-paint-floor.js +5 -39
  71. package/dist/tools/glasses-ui-recipes.js +92 -101
  72. package/dist/tools/glasses-ui-surfaces.js +31 -163
  73. package/dist/tools/glasses-ui-template.js +7 -22
  74. package/dist/tools/glasses-ui-tool-description.test.js +2 -2
  75. package/dist/tools/glasses-ui-tool.js +87 -451
  76. package/dist/tools/glasses-ui-voicemail.js +6 -63
  77. package/dist/tools/glasses-ui-wake.js +9 -76
  78. package/dist/tools/session-title-tool.js +2 -7
  79. package/dist/tools/session-title-tool.test.js +1 -1
  80. package/dist/version.js +3 -2
  81. package/openclaw.plugin.json +60 -13
  82. package/package.json +3 -2
  83. package/dist/runtime/protocol-adapter.js +0 -387
@@ -1,387 +0,0 @@
1
- const V1_TO_INTERNAL = {
2
- send: "ocuclaw.message.send",
3
- newSession: "ocuclaw.session.create",
4
- switchSession: "ocuclaw.session.switch",
5
- newChat: "ocuclaw.session.reset",
6
- getSessions: "ocuclaw.session.list",
7
- deleteSessions: "ocuclaw.session.delete",
8
- setSessionPinned: "ocuclaw.session.pinned.set",
9
- getStatus: "ocuclaw.runtime.status.get",
10
- getModelsCatalog: "ocuclaw.model.catalog.get",
11
- getProviderUsageSnapshot: "ocuclaw.provider.usage.get",
12
- getSkills: "ocuclaw.skills.catalog.get",
13
- getSonioxModels: "ocuclaw.voice.soniox.models.get",
14
- getSessionModelConfig: "ocuclaw.session.config.get",
15
- setSessionModelConfig: "ocuclaw.session.config.set",
16
- getEvenAiSettings: "ocuclaw.evenai.settings.get",
17
- getEvenAiSessions: "ocuclaw.evenai.session.list",
18
- setEvenAiSettings: "ocuclaw.evenai.settings.set",
19
- getOcuClawSettings: "ocuclaw.settings.get",
20
- setOcuClawSettings: "ocuclaw.settings.set",
21
- slashCommand: "ocuclaw.command.slash",
22
- approvalResponse: "ocuclaw.approval.resolve",
23
- subscribeProtocol: "ocuclaw.protocol.tap.subscribe",
24
- eventDebug: "ocuclaw.debug.event",
25
- "debug-set": "ocuclaw.debug.config.set",
26
- "debug-dump": "ocuclaw.debug.events.query",
27
- resume: "ocuclaw.sync.resume",
28
- compactSession: "ocuclaw.session.compact",
29
- };
30
-
31
- const RESULT_TO_V1 = {
32
- "ocuclaw.message.send": "sendAck",
33
- "ocuclaw.message.send.ack": "sendAck",
34
- "ocuclaw.session.list.result": "sessions",
35
- "ocuclaw.session.config.snapshot": "sessionModelConfig",
36
- "ocuclaw.session.config.set.ack": "sessionModelConfigAck",
37
- "ocuclaw.evenai.settings.snapshot": "evenAiSettings",
38
- "ocuclaw.evenai.session.list.result": "evenAiSessions",
39
- "ocuclaw.evenai.settings.set.ack": "evenAiSettingsAck",
40
- "ocuclaw.settings.snapshot": "ocuClawSettings",
41
- "ocuclaw.settings.set.ack": "ocuClawSettingsAck",
42
- "ocuclaw.model.catalog.snapshot": "modelsCatalog",
43
- "ocuclaw.provider.usage.snapshot": "providerUsageSnapshot",
44
- "ocuclaw.skills.catalog.snapshot": "skillsCatalog",
45
- "ocuclaw.voice.soniox.models.snapshot": "sonioxModels",
46
- "ocuclaw.approval.resolve.ack": "approvalResponseAck",
47
- "ocuclaw.session.compact.ack": "compactSessionAck",
48
- };
49
-
50
- const EVENT_TO_V1 = {
51
- "ocuclaw.view.pages.snapshot": "pages",
52
- "ocuclaw.runtime.status": "status",
53
- "ocuclaw.activity.update": "activity",
54
- "ocuclaw.typing.update": "typing",
55
- "ocuclaw.message.stream.delta": "streaming",
56
- "ocuclaw.session.switch.applied": "sessionSwitched",
57
- "ocuclaw.sync.resume.ack": "resume-ack",
58
- "ocuclaw.approval.request": "approval",
59
- "ocuclaw.approval.resolved": "approvalResolved",
60
- "ocuclaw.remote.control": "remote-control",
61
- "ocuclaw.protocol.tap.frame": "protocol",
62
- "ocuclaw.provider.usage.snapshot": "providerUsageSnapshot",
63
- "ocuclaw.session.context.snapshot": "sessionContextSnapshot",
64
- };
65
-
66
- const INTERNAL_TO_V1 = Object.fromEntries(
67
- Object.entries(V1_TO_INTERNAL).map(([type, op]) => [op, type]),
68
- );
69
-
70
- const V1_TO_RESULT = Object.fromEntries(
71
- Object.entries(RESULT_TO_V1).map(([op, type]) => [type, op]),
72
- );
73
-
74
- const V1_TO_EVENT = Object.fromEntries(
75
- Object.entries(EVENT_TO_V1).map(([event, type]) => [type, event]),
76
- );
77
-
78
- function asRecord(value) {
79
- if (!value || typeof value !== "object" || Array.isArray(value)) {
80
- return null;
81
- }
82
- return value;
83
- }
84
-
85
- function frameRequestId(frame) {
86
- const value = frame.requestId ?? frame.id;
87
- return typeof value === "string" ? value : null;
88
- }
89
-
90
- function framePayload(frame) {
91
- const { type: _type, ...payload } = frame;
92
- return payload;
93
- }
94
-
95
- function clonePayload(value) {
96
- return { ...value };
97
- }
98
-
99
- function internalOpPayload(op) {
100
- const payload = clonePayload(op.payload || {});
101
- delete payload.requestId;
102
- delete payload.idempotencyKey;
103
- return payload;
104
- }
105
-
106
- function parseV1Inbound(raw) {
107
- try {
108
- const parsed = asRecord(JSON.parse(raw));
109
- if (!parsed || typeof parsed.type !== "string") {
110
- return null;
111
- }
112
- return parsed;
113
- } catch {
114
- return null;
115
- }
116
- }
117
-
118
- function serializeV1Outbound(frame) {
119
- return JSON.stringify(frame);
120
- }
121
-
122
- function parseV2Inbound(raw) {
123
- try {
124
- const parsed = asRecord(JSON.parse(raw));
125
- if (!parsed || typeof parsed.type !== "string") {
126
- return null;
127
- }
128
- if (!parsed.type.startsWith("ocuclaw.")) {
129
- return null;
130
- }
131
- const requestId =
132
- typeof parsed.requestId === "string" && parsed.requestId.trim()
133
- ? parsed.requestId.trim()
134
- : null;
135
- const idempotencyKey =
136
- typeof parsed.idempotencyKey === "string" && parsed.idempotencyKey.trim()
137
- ? parsed.idempotencyKey.trim()
138
- : null;
139
- const { type: op, requestId: _requestId, idempotencyKey: _idempotencyKey, ...payload } = parsed;
140
- return {
141
- op,
142
- requestId,
143
- idempotencyKey,
144
- payload,
145
- };
146
- } catch {
147
- return null;
148
- }
149
- }
150
-
151
- function mapV1InboundToInternalOps(frame, _ctx) {
152
- const op = V1_TO_INTERNAL[frame.type];
153
- if (!op) {
154
- return [];
155
- }
156
- const idempotencyKey = typeof frame.idempotencyKey === "string" ? frame.idempotencyKey : null;
157
- return [
158
- {
159
- op,
160
- requestId: frameRequestId(frame),
161
- idempotencyKey,
162
- payload: framePayload(frame),
163
- },
164
- ];
165
- }
166
-
167
- function mapInternalOpToV1Inbound(op, _ctx) {
168
- const type = INTERNAL_TO_V1[op.op];
169
- if (!type) {
170
- return [];
171
- }
172
-
173
- const payload = internalOpPayload(op);
174
- if (type === "send") {
175
- const id =
176
- op.requestId ||
177
- (typeof payload.id === "string" && payload.id.trim() ? payload.id.trim() : null);
178
- if (id) payload.id = id;
179
- delete payload.requestId;
180
- }
181
-
182
- if (type === "approvalResponse") {
183
- if (op.requestId && !payload.requestId) {
184
- payload.requestId = op.requestId;
185
- }
186
- }
187
-
188
- return [{ type, ...payload }];
189
- }
190
-
191
- function mapInternalResultToV1Outbound(result, _ctx) {
192
- const type = RESULT_TO_V1[result.op];
193
- if (!type) {
194
- return [];
195
- }
196
- if (type !== "sendAck") {
197
- return [{ type, ...result.result }];
198
- }
199
- const payload = clonePayload(result.result || {});
200
- const id =
201
- result.requestId ||
202
- (typeof payload.id === "string" && payload.id.trim() ? payload.id.trim() : null);
203
- const status =
204
- typeof payload.status === "string"
205
- ? payload.status
206
- : result.ok
207
- ? "accepted"
208
- : "rejected";
209
- const error =
210
- typeof payload.error === "string" && payload.error
211
- ? payload.error
212
- : !result.ok && result.message
213
- ? result.message
214
- : undefined;
215
- const errorCode =
216
- typeof payload.errorCode === "string" && payload.errorCode
217
- ? payload.errorCode
218
- : !result.ok && result.code
219
- ? result.code
220
- : undefined;
221
- return [
222
- {
223
- type: "sendAck",
224
- id,
225
- status,
226
- ...(error ? { error } : {}),
227
- ...(errorCode ? { errorCode } : {}),
228
- },
229
- ];
230
- }
231
-
232
- function mapInternalEventToV1Outbound(event, _ctx) {
233
- const type = EVENT_TO_V1[event.event];
234
- if (!type) {
235
- return [];
236
- }
237
- return [{ type, ...event.payload }];
238
- }
239
-
240
- function mapV1OutboundToInternalResult(frame, _ctx) {
241
- const op = V1_TO_RESULT[frame.type];
242
- if (!op) {
243
- return null;
244
- }
245
-
246
- const payload = framePayload(frame);
247
- if (frame.type === "sendAck") {
248
- return {
249
- op: "ocuclaw.message.send.ack",
250
- requestId:
251
- typeof frame.id === "string" && frame.id.trim() ? frame.id.trim() : null,
252
- ok: frame.status === "accepted",
253
- code:
254
- typeof frame.errorCode === "string" && frame.errorCode.trim()
255
- ? frame.errorCode.trim()
256
- : frame.status === "accepted"
257
- ? "ok"
258
- : "request_rejected",
259
- message:
260
- typeof frame.error === "string" && frame.error.trim()
261
- ? frame.error.trim()
262
- : null,
263
- result: payload,
264
- };
265
- }
266
-
267
- if (frame.type === "approvalResponseAck") {
268
- return {
269
- op,
270
- requestId:
271
- typeof frame.requestId === "string" && frame.requestId.trim()
272
- ? frame.requestId.trim()
273
- : null,
274
- ok: frame.status === "accepted",
275
- code:
276
- typeof frame.code === "string" && frame.code.trim() ? frame.code.trim() : null,
277
- message:
278
- typeof frame.message === "string" && frame.message.trim()
279
- ? frame.message.trim()
280
- : null,
281
- result: payload,
282
- };
283
- }
284
-
285
- if (
286
- frame.type === "sessionModelConfigAck" ||
287
- frame.type === "evenAiSettingsAck" ||
288
- frame.type === "ocuClawSettingsAck"
289
- ) {
290
- return {
291
- op,
292
- requestId: null,
293
- ok: frame.status === "accepted",
294
- code: frame.status === "accepted" ? "ok" : "request_rejected",
295
- message:
296
- typeof frame.error === "string" && frame.error.trim()
297
- ? frame.error.trim()
298
- : null,
299
- result: payload,
300
- };
301
- }
302
-
303
- return {
304
- op,
305
- requestId:
306
- typeof frame.requestId === "string" && frame.requestId.trim()
307
- ? frame.requestId.trim()
308
- : typeof frame.id === "string" && frame.id.trim()
309
- ? frame.id.trim()
310
- : null,
311
- ok: true,
312
- code: "ok",
313
- message: null,
314
- result: payload,
315
- };
316
- }
317
-
318
- function mapV1OutboundToInternalEvent(frame, _ctx) {
319
- const event = V1_TO_EVENT[frame.type];
320
- if (!event) {
321
- return null;
322
- }
323
- return {
324
- event,
325
- requestId:
326
- typeof frame.requestId === "string" && frame.requestId.trim()
327
- ? frame.requestId.trim()
328
- : null,
329
- payload: framePayload(frame),
330
- };
331
- }
332
-
333
- function serializeInternalResultToV2Outbound(result) {
334
- const payload = {
335
- type: result.op,
336
- ...(result.requestId ? { requestId: result.requestId } : {}),
337
- ...(result.result || {}),
338
- };
339
- if (result.code && payload.code === undefined) {
340
- payload.code = result.code;
341
- }
342
- if (result.message && payload.message === undefined) {
343
- payload.message = result.message;
344
- }
345
- return JSON.stringify(payload);
346
- }
347
-
348
- function serializeInternalEventToV2Outbound(event) {
349
- return JSON.stringify({
350
- type: event.event,
351
- ...(event.requestId ? { requestId: event.requestId } : {}),
352
- ...(event.payload || {}),
353
- });
354
- }
355
-
356
- function normalizeInternalError(input) {
357
- if (input instanceof Error) {
358
- return {
359
- code: input.name || "internal_error",
360
- message: input.message || "internal error",
361
- retryable: false,
362
- details: {},
363
- };
364
- }
365
- const value = asRecord(input);
366
- return {
367
- code: typeof value?.code === "string" ? value.code : "internal_error",
368
- message: typeof value?.message === "string" ? value.message : "internal error",
369
- retryable: value?.retryable === true,
370
- details: asRecord(value?.details) ?? {},
371
- };
372
- }
373
-
374
- export {
375
- mapInternalEventToV1Outbound,
376
- mapInternalOpToV1Inbound,
377
- mapInternalResultToV1Outbound,
378
- mapV1InboundToInternalOps,
379
- mapV1OutboundToInternalEvent,
380
- mapV1OutboundToInternalResult,
381
- normalizeInternalError,
382
- parseV1Inbound,
383
- parseV2Inbound,
384
- serializeInternalEventToV2Outbound,
385
- serializeInternalResultToV2Outbound,
386
- serializeV1Outbound,
387
- };