@aiwg/cli 2026.7.19 → 2026.7.21

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 (88) hide show
  1. package/README.md +397 -385
  2. package/dist/src/api/index.d.ts +1 -0
  3. package/dist/src/api/index.js +1 -0
  4. package/dist/src/artifacts/browser-export.js +7 -0
  5. package/dist/src/artifacts/citation-parser.js +96 -35
  6. package/dist/src/artifacts/cli.js +59 -5
  7. package/dist/src/artifacts/discover-facets.js +15 -0
  8. package/dist/src/artifacts/discovery-eval.js +290 -0
  9. package/dist/src/artifacts/fortemi-core-query-adapter.js +1 -1
  10. package/dist/src/artifacts/fortemi-shard-export.js +1 -1
  11. package/dist/src/artifacts/index-builder.js +54 -17
  12. package/dist/src/artifacts/query-engine.js +10 -6
  13. package/dist/src/artifacts/state-transfer.js +27 -0
  14. package/dist/src/artifacts/stats.js +8 -0
  15. package/dist/src/cli/cli-extension-loader.js +73 -0
  16. package/dist/src/cli/handlers/help.js +2 -1
  17. package/dist/src/cli/handlers/index.js +6 -2
  18. package/dist/src/cli/handlers/resource-versions.js +247 -0
  19. package/dist/src/cli/handlers/sessions.js +966 -0
  20. package/dist/src/cli/handlers/skill-lint.js +49 -45
  21. package/dist/src/cli/handlers/subcommands.js +55 -3
  22. package/dist/src/cli/handlers/use.js +154 -59
  23. package/dist/src/cli/handlers/utilities.js +49 -34
  24. package/dist/src/cli/skill-usage.js +146 -24
  25. package/dist/src/config/cli.js +13 -9
  26. package/dist/src/config/project-artifacts-runtime.mjs +68 -0
  27. package/dist/src/config/project-artifacts.js +1 -68
  28. package/dist/src/extensions/commands/definitions.js +65 -2
  29. package/dist/src/extensions/manifest.js +29 -0
  30. package/dist/src/extensions/project-local-discovery.js +86 -2
  31. package/dist/src/extensions/project-local-remove.js +52 -56
  32. package/dist/src/extensions/shadow-resolver.js +3 -1
  33. package/dist/src/plugins/standalone-packager.js +143 -0
  34. package/dist/src/resources/cache-cleanup.js +67 -0
  35. package/dist/src/resources/doctor.js +107 -0
  36. package/dist/src/resources/lockfile.js +125 -0
  37. package/dist/src/resources/resolver.js +133 -0
  38. package/dist/src/resources/web-release.d.ts +8 -0
  39. package/dist/src/resources/web-release.js +159 -1
  40. package/dist/src/sessions/adapters/claude.js +357 -0
  41. package/dist/src/sessions/adapters/codex.js +521 -0
  42. package/dist/src/sessions/adapters/copilot.js +226 -0
  43. package/dist/src/sessions/adapters/cursor.js +372 -0
  44. package/dist/src/sessions/adapters/factory.js +345 -0
  45. package/dist/src/sessions/adapters/generic.js +225 -0
  46. package/dist/src/sessions/adapters/hermes.js +341 -0
  47. package/dist/src/sessions/adapters/openclaw.js +381 -0
  48. package/dist/src/sessions/adapters/opencode.js +454 -0
  49. package/dist/src/sessions/adapters/openhuman.js +315 -0
  50. package/dist/src/sessions/adapters/warp.js +160 -0
  51. package/dist/src/sessions/adapters/windsurf.js +212 -0
  52. package/dist/src/sessions/candidates.js +210 -0
  53. package/dist/src/sessions/contracts.js +310 -0
  54. package/dist/src/sessions/discovery.js +51 -0
  55. package/dist/src/sessions/fixtures.js +12 -0
  56. package/dist/src/sessions/importer.js +315 -0
  57. package/dist/src/sessions/index.js +25 -0
  58. package/dist/src/sessions/knowledge-shard.js +61 -0
  59. package/dist/src/sessions/optional-backends.js +238 -0
  60. package/dist/src/sessions/policy.js +192 -0
  61. package/dist/src/sessions/ports.js +2 -0
  62. package/dist/src/sessions/promotion.js +367 -0
  63. package/dist/src/sessions/readers.js +176 -0
  64. package/dist/src/sessions/repository.js +1551 -0
  65. package/dist/src/skills/adapters/agent-skills.js +59 -0
  66. package/dist/src/skills/adapters/local.js +19 -1
  67. package/dist/src/skills/agent-skills.js +249 -0
  68. package/dist/src/skills/cli.js +463 -7
  69. package/dist/src/skills/deployer.js +554 -0
  70. package/dist/src/skills/doctor.js +105 -0
  71. package/dist/src/skills/exporter.js +382 -0
  72. package/dist/src/skills/importer.js +921 -0
  73. package/dist/src/skills/registry.js +19 -0
  74. package/dist/src/skills/validator.js +323 -0
  75. package/dist/src/smiths/context-pipeline/aiwg-md.js +5 -1
  76. package/dist/src/smiths/context-pipeline/claude-hook.js +21 -1
  77. package/dist/src/smiths/context-pipeline/finalization.js +5 -3
  78. package/dist/src/smiths/context-pipeline/generator.js +4 -1
  79. package/dist/src/smiths/context-pipeline/parallelism-section.js +34 -1
  80. package/dist/src/smiths/context-pipeline/workspace-context.js +15 -3
  81. package/dist/src/smiths/mcpsmith/example.js +3 -1
  82. package/dist/src/smiths/mcpsmith/generator.js +3 -1
  83. package/dist/src/smiths/toolsmith/runtime-discovery.mjs +2 -1
  84. package/dist/src/storage/cli.js +3 -2
  85. package/dist/src/storage/subsystem-cli.js +7 -2
  86. package/dist/src/update/notifier.mjs +1 -1
  87. package/dist/src/update/service.mjs +123 -0
  88. package/package.json +3 -2
@@ -0,0 +1,381 @@
1
+ import { z } from 'zod';
2
+ import { SessionContractError, assertSupportedSchemaMajor, } from '../contracts.js';
3
+ import { readBoundedJsonLines, streamBoundedJsonLines, } from '../readers.js';
4
+ export const OPENCLAW_ADAPTER_VERSION = '1.0.0';
5
+ export const OPENCLAW_SOURCE_SCHEMA_VERSION = '1.0.0';
6
+ export const OPENCLAW_NATIVE_SCHEMA_VERSION = '16.0.0';
7
+ export const OPENCLAW_EVENT_VERSION = '3.0.0';
8
+ const LineageSchema = z.object({
9
+ kind: z.enum(['reset', 'fork', 'rewind', 'compaction']),
10
+ fromSessionId: z.string().optional(),
11
+ checkpointId: z.string().optional(),
12
+ reason: z.string().optional(),
13
+ }).passthrough();
14
+ const EventSchema = z.object({
15
+ id: z.string().min(1),
16
+ parentId: z.string().nullable().optional(),
17
+ type: z.string().min(1),
18
+ timestamp: z.union([z.string(), z.number()]).optional(),
19
+ role: z.string().optional(),
20
+ text: z.string().optional(),
21
+ model: z.record(z.unknown()).optional(),
22
+ tool: z.record(z.unknown()).optional(),
23
+ media: z.record(z.unknown()).optional(),
24
+ usage: z.record(z.unknown()).optional(),
25
+ lineage: LineageSchema.optional(),
26
+ opaque: z.unknown().optional(),
27
+ idempotencyKey: z.string().optional(),
28
+ }).passthrough();
29
+ const SessionSchema = z.object({
30
+ id: z.string().min(1),
31
+ sessionKey: z.string().min(1),
32
+ conversationId: z.string().optional(),
33
+ agentId: z.string().optional(),
34
+ identityKey: z.string().optional(),
35
+ stateVersion: z.number().int().nonnegative().optional(),
36
+ startedAt: z.union([z.string(), z.number()]).optional(),
37
+ updatedAt: z.union([z.string(), z.number()]).optional(),
38
+ archivedAt: z.union([z.string(), z.number()]).nullable().optional(),
39
+ recovered: z.boolean().optional(),
40
+ active: z.boolean().optional(),
41
+ window: z.object({
42
+ firstSequence: z.number().int().nonnegative().optional(),
43
+ lastSequence: z.number().int().nonnegative().optional(),
44
+ historyGap: z.boolean().optional(),
45
+ }).passthrough().optional(),
46
+ events: z.array(EventSchema),
47
+ }).passthrough();
48
+ const SnapshotSchema = z.object({
49
+ schemaVersion: z.union([z.string(), z.number()]),
50
+ eventVersion: z.union([z.string(), z.number()]),
51
+ snapshotConsistency: z.enum(['sqlite-backup']).optional(),
52
+ gateway: z.object({
53
+ mode: z.enum(['local', 'remote']).optional(),
54
+ hostId: z.string().optional(),
55
+ expectedHostId: z.string().optional(),
56
+ }).passthrough().optional(),
57
+ incognito: z.boolean().optional(),
58
+ projection: z.object({
59
+ kind: z.enum(['canonical', 'bounded-history', 'html', 'trajectory']),
60
+ complete: z.boolean(),
61
+ omittedBefore: z.union([z.string(), z.number()]).optional(),
62
+ limitation: z.string().optional(),
63
+ }).passthrough().optional(),
64
+ sessions: z.array(SessionSchema),
65
+ providerDeletedAt: z.union([z.string(), z.number()]).nullable().optional(),
66
+ }).passthrough();
67
+ export class OpenClawSessionAdapter {
68
+ limits;
69
+ gateway;
70
+ provider = 'openclaw';
71
+ adapterVersion = OPENCLAW_ADAPTER_VERSION;
72
+ disposition = 'implemented';
73
+ supportedOperations = ['inspect', 'stream'];
74
+ acquisitionModes = ['api', 'sqlite-snapshot', 'jsonl'];
75
+ constructor(limits, gateway) {
76
+ this.limits = limits;
77
+ this.gateway = gateway;
78
+ }
79
+ async *discover(_scope) {
80
+ // Gateway and consistent snapshots require explicit operator selection.
81
+ }
82
+ async inspect(source) {
83
+ const parsed = await this.readSource(source, true);
84
+ return {
85
+ sourceSchemaVersion: parsed.schemaVersion,
86
+ consistency: parsed.consistency,
87
+ operationalState: parsed.operationalState,
88
+ };
89
+ }
90
+ async *stream(source, cursor) {
91
+ if (SOURCE_CLASSES.has(source.locatorClass)) {
92
+ const input = await streamBoundedJsonLines({
93
+ selectedPath: source.locator,
94
+ allowedRoots: source.authorizedScope.allowedRoots,
95
+ }, {
96
+ consistency: source.locatorClass === 'openclaw-consistent-snapshot-jsonl'
97
+ ? 'complete' : 'provisional',
98
+ limits: this.limits,
99
+ });
100
+ const start = parseCursor(cursor?.value);
101
+ let outputIndex = 0;
102
+ let nativeSchema = null;
103
+ let eventSchema = null;
104
+ let sawRecord = false;
105
+ for await (const line of input) {
106
+ sawRecord = true;
107
+ const parsed = SnapshotSchema.safeParse(line.value);
108
+ if (!parsed.success) {
109
+ throw new SessionContractError('MALFORMED_SOURCE', 'OpenClaw snapshot is malformed');
110
+ }
111
+ const snapshot = parsed.data;
112
+ const currentNative = nativeVersion(snapshot.schemaVersion);
113
+ const currentEvent = nativeVersion(snapshot.eventVersion);
114
+ if ((nativeSchema && nativeSchema !== currentNative)
115
+ || (eventSchema && eventSchema !== currentEvent)) {
116
+ throw new SessionContractError('SCHEMA_DRIFT', 'mixed OpenClaw snapshot schemas');
117
+ }
118
+ nativeSchema = currentNative;
119
+ eventSchema = currentEvent;
120
+ assertSupportedSchemaMajor(nativeSchema, 16);
121
+ assertSupportedSchemaMajor(eventSchema, 3);
122
+ if (source.locatorClass === 'openclaw-consistent-snapshot-jsonl'
123
+ && snapshot.snapshotConsistency !== 'sqlite-backup') {
124
+ throw new SessionContractError('SCHEMA_DRIFT', 'OpenClaw snapshot lacks sqlite3.backup() consistency evidence');
125
+ }
126
+ if (snapshot.incognito) {
127
+ throw new SessionContractError('OPERATION_NOT_AUTHORIZED', 'OpenClaw incognito session capture is unavailable by provider policy');
128
+ }
129
+ if (snapshot.gateway?.mode === 'remote'
130
+ && snapshot.gateway.hostId !== snapshot.gateway.expectedHostId) {
131
+ throw new SessionContractError('SOURCE_NOT_AUTHORIZED', 'OpenClaw remote Gateway identity does not match the authorized host');
132
+ }
133
+ for (const record of normalizeSnapshot(snapshot, line, source.locatorClass)) {
134
+ if (outputIndex++ >= start)
135
+ yield record;
136
+ }
137
+ }
138
+ if (!sawRecord)
139
+ throw new SessionContractError('MALFORMED_SOURCE', 'OpenClaw source is empty');
140
+ if (input.incompleteTail && source.locatorClass === 'openclaw-consistent-snapshot-jsonl') {
141
+ throw new SessionContractError('TRUNCATED_SOURCE', 'OpenClaw consistent snapshot is truncated');
142
+ }
143
+ return;
144
+ }
145
+ const parsed = await this.readSource(source, false);
146
+ const start = parseCursor(cursor?.value);
147
+ for (const record of parsed.records.slice(start))
148
+ yield record;
149
+ }
150
+ async readSource(source, inspection) {
151
+ if (source.locatorClass === 'openclaw-state-db') {
152
+ throw new SessionContractError('UNSUPPORTED_OPERATION', 'raw OpenClaw SQLite access is unsafe; use Gateway acquisition or a verified sqlite3.backup() projection');
153
+ }
154
+ let input;
155
+ if (source.locatorClass === 'openclaw-gateway-api') {
156
+ if (source.authorizedScope.networkOperation !== 'openclaw.gateway.sessions.read') {
157
+ throw new SessionContractError('OPERATION_NOT_AUTHORIZED', 'OpenClaw Gateway reads require explicit openclaw.gateway.sessions.read authorization');
158
+ }
159
+ if (!this.gateway) {
160
+ throw new SessionContractError('UNSUPPORTED_OPERATION', 'OpenClaw Gateway capability was not negotiated');
161
+ }
162
+ input = (await this.gateway.snapshot(source)).map(toRecord);
163
+ }
164
+ else if (SOURCE_CLASSES.has(source.locatorClass)) {
165
+ const result = await readBoundedJsonLines({
166
+ selectedPath: source.locator,
167
+ allowedRoots: source.authorizedScope.allowedRoots,
168
+ }, {
169
+ consistency: source.locatorClass === 'openclaw-consistent-snapshot-jsonl'
170
+ ? 'complete' : 'provisional',
171
+ limits: this.limits,
172
+ });
173
+ if (result.incompleteTail && source.locatorClass === 'openclaw-consistent-snapshot-jsonl') {
174
+ throw new SessionContractError('TRUNCATED_SOURCE', 'OpenClaw consistent snapshot is truncated');
175
+ }
176
+ input = result.records;
177
+ }
178
+ else {
179
+ throw new SessionContractError('UNSUPPORTED_OPERATION', 'unsupported OpenClaw source class');
180
+ }
181
+ if (input.length === 0)
182
+ throw new SessionContractError('MALFORMED_SOURCE', 'OpenClaw source is empty');
183
+ const parsed = input.map(({ value, ...line }) => {
184
+ const result = SnapshotSchema.safeParse(value);
185
+ if (!result.success)
186
+ throw new SessionContractError('MALFORMED_SOURCE', 'OpenClaw snapshot is malformed');
187
+ return { value: result.data, ...line };
188
+ });
189
+ const nativeSchemas = new Set(parsed.map(({ value }) => nativeVersion(value.schemaVersion)));
190
+ const eventSchemas = new Set(parsed.map(({ value }) => nativeVersion(value.eventVersion)));
191
+ if (nativeSchemas.size !== 1 || eventSchemas.size !== 1) {
192
+ throw new SessionContractError('SCHEMA_DRIFT', 'mixed OpenClaw snapshot schemas');
193
+ }
194
+ assertSupportedSchemaMajor([...nativeSchemas][0], 16);
195
+ assertSupportedSchemaMajor([...eventSchemas][0], 3);
196
+ if (source.locatorClass === 'openclaw-consistent-snapshot-jsonl'
197
+ && parsed.some(({ value }) => value.snapshotConsistency !== 'sqlite-backup')) {
198
+ throw new SessionContractError('SCHEMA_DRIFT', 'OpenClaw snapshot lacks sqlite3.backup() consistency evidence');
199
+ }
200
+ const incognito = parsed.some(({ value }) => value.incognito);
201
+ const remoteMismatch = parsed.some(({ value }) => value.gateway?.mode === 'remote'
202
+ && value.gateway.hostId !== value.gateway.expectedHostId);
203
+ if (!inspection && incognito) {
204
+ throw new SessionContractError('OPERATION_NOT_AUTHORIZED', 'OpenClaw incognito session capture is unavailable by provider policy');
205
+ }
206
+ if (!inspection && remoteMismatch) {
207
+ throw new SessionContractError('SOURCE_NOT_AUTHORIZED', 'OpenClaw remote Gateway identity does not match the authorized host');
208
+ }
209
+ const projectionIncomplete = parsed.some(({ value }) => value.projection && (value.projection.kind !== 'canonical' || !value.projection.complete));
210
+ return {
211
+ schemaVersion: OPENCLAW_SOURCE_SCHEMA_VERSION,
212
+ consistency: source.locatorClass === 'openclaw-consistent-snapshot-jsonl'
213
+ ? 'consistent-snapshot'
214
+ : parsed.every(({ value }) => value.sessions.every(sessionComplete)) && !projectionIncomplete
215
+ ? 'complete' : 'provisional',
216
+ operationalState: incognito ? 'inaccessible' : remoteMismatch || projectionIncomplete ? 'degraded' : 'available',
217
+ records: incognito || remoteMismatch
218
+ ? []
219
+ : parsed.flatMap(({ value, ...line }) => normalizeSnapshot(value, line, source.locatorClass)),
220
+ };
221
+ }
222
+ }
223
+ function normalizeSnapshot(snapshot, line, locatorClass) {
224
+ return snapshot.sessions.flatMap((session, sessionIndex) => {
225
+ const common = sessionExtensions(snapshot, session, locatorClass);
226
+ const base = line.sequence * 10_000_000 + sessionIndex * 100_000;
227
+ const header = {
228
+ nativeSessionId: session.id,
229
+ nativeEventId: `session:${session.id}`,
230
+ sequence: base,
231
+ kind: 'openclaw.session',
232
+ role: 'system',
233
+ occurredAt: timestamp(session.startedAt),
234
+ text: '',
235
+ rawReference: { locatorClass, offset: line.byteOffset },
236
+ extensions: common,
237
+ };
238
+ return [
239
+ header,
240
+ ...session.events.map((event, eventIndex) => normalizeEvent(session.id, event, base + eventIndex + 1, locatorClass, line, common)),
241
+ ];
242
+ });
243
+ }
244
+ function normalizeEvent(sessionId, event, sequence, locatorClass, line, common) {
245
+ return {
246
+ nativeSessionId: sessionId,
247
+ nativeEventId: event.id,
248
+ sequence,
249
+ kind: eventKind(event),
250
+ role: event.role,
251
+ participant: event.role,
252
+ model: typeof event.model === 'string' ? event.model : undefined,
253
+ toolName: typeof event.tool?.name === 'string' ? event.tool.name : undefined,
254
+ toolCallId: typeof event.tool?.id === 'string' ? event.tool.id : undefined,
255
+ occurredAt: timestamp(event.timestamp),
256
+ text: event.text ?? toolText(event.tool),
257
+ rawReference: { locatorClass, offset: line.byteOffset },
258
+ extensions: {
259
+ ...common,
260
+ eventTree: { parentId: event.parentId },
261
+ model: event.model,
262
+ tool: event.tool,
263
+ media: event.media,
264
+ usage: event.usage,
265
+ lineageEvent: event.lineage,
266
+ idempotencyKey: event.idempotencyKey,
267
+ opaqueEventJson: event.opaque,
268
+ unknownFields: unknownFields(event, EVENT_KEYS),
269
+ },
270
+ };
271
+ }
272
+ function sessionExtensions(snapshot, session, locatorClass) {
273
+ const projection = snapshot.projection ?? { kind: 'canonical', complete: true };
274
+ return {
275
+ lifecycle: snapshot.providerDeletedAt
276
+ ? 'deleted'
277
+ : session.archivedAt ? 'archived' : sessionComplete(session) ? 'complete' : 'active',
278
+ workspace: {
279
+ agentId: session.agentId,
280
+ conversationId: session.conversationId,
281
+ },
282
+ identity: {
283
+ sessionKey: session.sessionKey,
284
+ identityKey: session.identityKey,
285
+ stateVersion: session.stateVersion,
286
+ },
287
+ window: session.window,
288
+ recovered: session.recovered,
289
+ projection: {
290
+ kind: projection.kind,
291
+ complete: projection.complete,
292
+ lossless: projection.kind === 'canonical' && projection.complete,
293
+ omittedBefore: timestamp(projection.omittedBefore),
294
+ limitation: projection.limitation,
295
+ },
296
+ provenance: {
297
+ acquisition: locatorClass,
298
+ nativeSchema: nativeVersion(snapshot.schemaVersion),
299
+ eventSchema: nativeVersion(snapshot.eventVersion),
300
+ snapshotConsistency: snapshot.snapshotConsistency,
301
+ gateway: snapshot.gateway,
302
+ },
303
+ deletion: {
304
+ providerDeletedAt: timestamp(snapshot.providerDeletedAt),
305
+ aiwgDeletionDoesNotDeleteGatewayData: true,
306
+ resetPreservesHistoricalTranscript: true,
307
+ },
308
+ sessionUnknownFields: unknownFields(session, SESSION_KEYS),
309
+ snapshotUnknownFields: unknownFields(snapshot, SNAPSHOT_KEYS),
310
+ };
311
+ }
312
+ function eventKind(event) {
313
+ if (event.lineage)
314
+ return `lineage.${event.lineage.kind}`;
315
+ if (event.tool) {
316
+ const status = String(event.tool.status ?? '');
317
+ return ['completed', 'error', 'failed'].includes(status) ? 'tool-result' : 'tool-call';
318
+ }
319
+ if (event.media)
320
+ return 'media';
321
+ if (event.type === 'message')
322
+ return 'message';
323
+ return `openclaw.${event.type}`;
324
+ }
325
+ function toolText(tool) {
326
+ if (!tool)
327
+ return '';
328
+ if (typeof tool.output === 'string')
329
+ return tool.output;
330
+ return typeof tool.name === 'string' ? tool.name : '';
331
+ }
332
+ function sessionComplete(session) {
333
+ return session.active === false || Boolean(session.archivedAt);
334
+ }
335
+ function nativeVersion(value) {
336
+ if (typeof value === 'number')
337
+ return `${value}.0.0`;
338
+ return /^\d+$/.test(value) ? `${value}.0.0` : value;
339
+ }
340
+ function timestamp(value) {
341
+ if (typeof value === 'string') {
342
+ const date = new Date(value);
343
+ return Number.isNaN(date.getTime()) ? undefined : date.toISOString();
344
+ }
345
+ if (typeof value !== 'number')
346
+ return undefined;
347
+ const date = new Date(value < 10_000_000_000 ? value * 1_000 : value);
348
+ return Number.isNaN(date.getTime()) ? undefined : date.toISOString();
349
+ }
350
+ function unknownFields(value, keys) {
351
+ return Object.fromEntries(Object.entries(value).filter(([key]) => !keys.has(key)).sort(([a], [b]) => a.localeCompare(b)));
352
+ }
353
+ function parseCursor(value) {
354
+ if (!value)
355
+ return 0;
356
+ if (!/^\d+$/.test(value))
357
+ throw new SessionContractError('SCHEMA_DRIFT', 'invalid OpenClaw cursor');
358
+ return Number(value);
359
+ }
360
+ function toRecord(value, sequence) {
361
+ return { value, sequence, byteOffset: sequence, byteLength: Buffer.byteLength(JSON.stringify(value)) };
362
+ }
363
+ const SOURCE_CLASSES = new Set([
364
+ 'openclaw-consistent-snapshot-jsonl',
365
+ 'openclaw-bounded-history-jsonl',
366
+ 'openclaw-html-projection-jsonl',
367
+ 'openclaw-trajectory-jsonl',
368
+ ]);
369
+ const EVENT_KEYS = new Set([
370
+ 'id', 'parentId', 'type', 'timestamp', 'role', 'text', 'model', 'tool', 'media',
371
+ 'usage', 'lineage', 'opaque', 'idempotencyKey',
372
+ ]);
373
+ const SESSION_KEYS = new Set([
374
+ 'id', 'sessionKey', 'conversationId', 'agentId', 'identityKey', 'stateVersion',
375
+ 'startedAt', 'updatedAt', 'archivedAt', 'recovered', 'active', 'window', 'events',
376
+ ]);
377
+ const SNAPSHOT_KEYS = new Set([
378
+ 'schemaVersion', 'eventVersion', 'snapshotConsistency', 'gateway', 'incognito',
379
+ 'projection', 'sessions', 'providerDeletedAt',
380
+ ]);
381
+ //# sourceMappingURL=openclaw.js.map