@sema-agent/core 7.18.0 → 7.20.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 (137) hide show
  1. package/CHANGELOG.md +276 -2
  2. package/dist/agents/subagent.js +12 -20
  3. package/dist/agents/teacher.js +2 -5
  4. package/dist/agents/verify.js +21 -10
  5. package/dist/brain/anthropic.js +8 -3
  6. package/dist/brain/open-responses.js +12 -4
  7. package/dist/brain/openai.js +7 -2
  8. package/dist/brain/reasoning.d.ts +13 -13
  9. package/dist/brain/reasoning.js +2 -2
  10. package/dist/brain/stream-engine.d.ts +4 -0
  11. package/dist/brain/stream-engine.js +6 -1
  12. package/dist/brain/stream-shared.d.ts +3 -0
  13. package/dist/brain/stream-shared.js +1 -0
  14. package/dist/core/ask-origin.d.ts +16 -0
  15. package/dist/core/ask-origin.js +8 -0
  16. package/dist/core/auto-mode-arming.d.ts +6 -0
  17. package/dist/core/auto-mode-arming.js +5 -5
  18. package/dist/core/auto-mode-defaults.d.ts +43 -15
  19. package/dist/core/auto-mode-defaults.js +4 -1
  20. package/dist/core/auto-mode.d.ts +74 -26
  21. package/dist/core/auto-mode.js +80 -11
  22. package/dist/core/checkpoint-store.d.ts +7 -0
  23. package/dist/core/checkpoint-store.js +2 -2
  24. package/dist/core/child-clamp-seats.d.ts +79 -0
  25. package/dist/core/child-clamp-seats.js +29 -0
  26. package/dist/core/engine-notice.d.ts +89 -41
  27. package/dist/core/fs-write-gate-policy.d.ts +17 -9
  28. package/dist/core/fs-write-gate-policy.js +51 -4
  29. package/dist/core/gate-bounded-await.d.ts +38 -0
  30. package/dist/core/gate-bounded-await.js +53 -0
  31. package/dist/core/gate-fold.js +20 -48
  32. package/dist/core/gate-lanes.js +17 -9
  33. package/dist/core/gate-outcome.d.ts +34 -6
  34. package/dist/core/gate-outcome.js +7 -0
  35. package/dist/core/governance-codes.d.ts +16 -1
  36. package/dist/core/governance-codes.js +18 -0
  37. package/dist/core/hooks.d.ts +8 -8
  38. package/dist/core/memory-engine/engine.d.ts +14 -9
  39. package/dist/core/memory-engine/engine.js +21 -8
  40. package/dist/core/memory-engine/layout.d.ts +31 -0
  41. package/dist/core/memory-engine/layout.js +68 -3
  42. package/dist/core/memory-engine/types.d.ts +24 -0
  43. package/dist/core/memory.d.ts +19 -0
  44. package/dist/core/memory.js +12 -0
  45. package/dist/core/read-root-candidate.d.ts +12 -0
  46. package/dist/core/read-root-candidate.js +24 -0
  47. package/dist/core/remote-env.d.ts +32 -0
  48. package/dist/core/remote-env.js +4 -1
  49. package/dist/core/roles.d.ts +9 -1
  50. package/dist/core/roles.js +4 -0
  51. package/dist/core/runner/advertised-writable-dirs.d.ts +59 -1
  52. package/dist/core/runner/advertised-writable-dirs.js +51 -3
  53. package/dist/core/runner/announce-once-ledger.d.ts +15 -0
  54. package/dist/core/runner/announce-once-ledger.js +8 -0
  55. package/dist/core/runner/classifier-ladder.d.ts +154 -11
  56. package/dist/core/runner/classifier-ladder.js +170 -10
  57. package/dist/core/runner/contracts.d.ts +46 -1
  58. package/dist/core/runner/denial-limit-arms.d.ts +14 -1
  59. package/dist/core/runner/denial-limit-arms.js +7 -6
  60. package/dist/core/runner/env-capability-census.d.ts +30 -0
  61. package/dist/core/runner/env-capability-census.js +38 -0
  62. package/dist/core/runner/forward-sink.d.ts +32 -0
  63. package/dist/core/runner/forward-sink.js +41 -0
  64. package/dist/core/runner/gate-exit.d.ts +4 -0
  65. package/dist/core/runner/gate-exit.js +4 -1
  66. package/dist/core/runner/git-status-frame.d.ts +0 -9
  67. package/dist/core/runner/listing-fold.d.ts +57 -0
  68. package/dist/core/runner/listing-fold.js +75 -0
  69. package/dist/core/runner/prepare-ask-lane.js +1 -0
  70. package/dist/core/runner/prepare-caps-and-workflow.js +20 -31
  71. package/dist/core/runner/prepare-config-doors.d.ts +6 -0
  72. package/dist/core/runner/prepare-config-doors.js +8 -10
  73. package/dist/core/runner/prepare-execution-env.d.ts +1 -1
  74. package/dist/core/runner/prepare-execution-env.js +2 -0
  75. package/dist/core/runner/prepare-gate-stations.d.ts +8 -0
  76. package/dist/core/runner/prepare-gate-stations.js +6 -2
  77. package/dist/core/runner/prepare-hands-readface.d.ts +4 -0
  78. package/dist/core/runner/prepare-hands-readface.js +3 -5
  79. package/dist/core/runner/prepare-listings.d.ts +3 -0
  80. package/dist/core/runner/prepare-listings.js +4 -2
  81. package/dist/core/runner/prepare-memory.js +7 -1
  82. package/dist/core/runner/prepare-policy-chain.js +5 -5
  83. package/dist/core/runner/prepare-project-context.d.ts +5 -1
  84. package/dist/core/runner/prepare-project-context.js +3 -2
  85. package/dist/core/runner/prepare-prompt-inputs.d.ts +2 -2
  86. package/dist/core/runner/prepare-run-refs.d.ts +4 -2
  87. package/dist/core/runner/prepare-run-refs.js +5 -4
  88. package/dist/core/runner/prepare-task.js +8 -6
  89. package/dist/core/runner/resume-apply.js +3 -3
  90. package/dist/core/runner/run-clock-and-content.js +3 -7
  91. package/dist/core/runner/run-harness-handlers.js +10 -10
  92. package/dist/core/runner/run-leg.js +31 -16
  93. package/dist/core/runner/run-settle-and-teardown.js +2 -5
  94. package/dist/core/runner/run-turn-boundary.js +44 -25
  95. package/dist/core/runner/runtask.js +2 -1
  96. package/dist/core/runner/synthetic-tools.d.ts +41 -29
  97. package/dist/core/runner/synthetic-tools.js +25 -40
  98. package/dist/core/runner/task-root-canonical.d.ts +45 -0
  99. package/dist/core/runner/task-root-canonical.js +18 -0
  100. package/dist/core/runner/turn-attachments.d.ts +160 -53
  101. package/dist/core/runner/turn-attachments.js +153 -51
  102. package/dist/core/safe-notify.d.ts +5 -0
  103. package/dist/core/safe-notify.js +24 -2
  104. package/dist/core/sensitive-path-policy.d.ts +84 -17
  105. package/dist/core/sensitive-path-policy.js +37 -19
  106. package/dist/core/skill-listing-budget.d.ts +106 -0
  107. package/dist/core/skill-listing-budget.js +57 -0
  108. package/dist/core/skills-directory.js +17 -10
  109. package/dist/core/task-registry.js +2 -1
  110. package/dist/core/task-spec.d.ts +29 -2
  111. package/dist/core/tool-policy.d.ts +31 -5
  112. package/dist/core/tool-policy.js +45 -32
  113. package/dist/core/tool-spec.d.ts +37 -4
  114. package/dist/core/types.d.ts +1 -1
  115. package/dist/core/write-protect.d.ts +105 -20
  116. package/dist/core/write-protect.js +89 -32
  117. package/dist/index.d.ts +8 -7
  118. package/dist/index.js +6 -5
  119. package/dist/orchestration/workflow-primitives.js +10 -20
  120. package/dist/stores/file/memory-store.d.ts +5 -2
  121. package/dist/stores/file/memory-store.js +8 -4
  122. package/dist/tools/fs/bash-readonly-classifier.d.ts +40 -2
  123. package/dist/tools/fs/bash-readonly-classifier.js +376 -41
  124. package/dist/tools/fs/fs-bash.d.ts +1 -1
  125. package/dist/tools/fs/fs-bash.js +19 -28
  126. package/dist/tools/fs/fs-shared.d.ts +22 -0
  127. package/dist/tools/fs/fs-shared.js +30 -0
  128. package/dist/tools/fs/index.d.ts +1 -1
  129. package/dist/tools/fs/index.js +1 -1
  130. package/dist/tools/fs/read-deny.d.ts +4 -3
  131. package/dist/tools/fs/safety.d.ts +15 -0
  132. package/dist/tools/fs/safety.js +7 -0
  133. package/package.json +2 -1
  134. package/test/export-surface.snapshot.json +31 -5
  135. package/wire-changes/core@7.18.0.json +1273 -0
  136. package/wire-changes/core@7.19.0.json +457 -0
  137. package/wire-changes/core@7.20.0.json +568 -0
@@ -0,0 +1,457 @@
1
+ {
2
+ "repo": "core",
3
+ "version": "7.19.0",
4
+ "from": "a9ed817912e9808ec38a5b4f02231398d5ccc99f",
5
+ "to": "v7.19.0",
6
+ "added": [
7
+ {
8
+ "name": "AUTO_MODE_PARSE_FAILURES",
9
+ "kind": "variable",
10
+ "tier": "advanced",
11
+ "at": [
12
+ "src/core/auto-mode.ts:69",
13
+ "src/index.ts:1376"
14
+ ],
15
+ "criteriaCovered": false,
16
+ "breaking": false
17
+ },
18
+ {
19
+ "name": "AutoModeParseFailure",
20
+ "kind": "type",
21
+ "tier": "advanced",
22
+ "at": [
23
+ "src/core/auto-mode.ts:70",
24
+ "src/index.ts:1378"
25
+ ],
26
+ "criteriaCovered": false,
27
+ "breaking": false
28
+ },
29
+ {
30
+ "name": "RECOMMENDED_SENSITIVE_ASK_PATTERNS",
31
+ "kind": "variable",
32
+ "tier": "advanced",
33
+ "at": [
34
+ "src/core/sensitive-path-policy.ts:196",
35
+ "src/index.ts:914"
36
+ ],
37
+ "criteriaCovered": false,
38
+ "breaking": false
39
+ },
40
+ {
41
+ "name": "ReadRootGrantCandidate",
42
+ "kind": "interface",
43
+ "tier": "advanced",
44
+ "at": [
45
+ "src/core/tool-spec.ts:105",
46
+ "src/core/types.ts:24",
47
+ "src/index.ts:3300"
48
+ ],
49
+ "criteriaCovered": true,
50
+ "breaking": false
51
+ },
52
+ {
53
+ "name": "classifierParseFailureDenyMessage",
54
+ "kind": "function",
55
+ "tier": "advanced",
56
+ "at": [
57
+ "src/core/auto-mode.ts:247",
58
+ "src/index.ts:1375"
59
+ ],
60
+ "criteriaCovered": false,
61
+ "breaking": false
62
+ },
63
+ {
64
+ "name": "isAutoModeParseFailure",
65
+ "kind": "function",
66
+ "tier": "advanced",
67
+ "at": [
68
+ "src/core/auto-mode.ts:73",
69
+ "src/index.ts:1377"
70
+ ],
71
+ "criteriaCovered": false,
72
+ "breaking": false
73
+ },
74
+ {
75
+ "name": "thinkingOffSpelled",
76
+ "kind": "function",
77
+ "tier": "advanced",
78
+ "at": [
79
+ "src/brain/reasoning.ts:184",
80
+ "src/index.ts:2492"
81
+ ],
82
+ "criteriaCovered": false,
83
+ "breaking": false
84
+ }
85
+ ],
86
+ "removed": [
87
+ {
88
+ "name": "CLASSIFIER_PARSE_FAILURE_DENY_MESSAGE",
89
+ "kind": "variable",
90
+ "tier": "advanced",
91
+ "at": [
92
+ "src/core/auto-mode.ts:222",
93
+ "src/index.ts:1375"
94
+ ],
95
+ "breaking": true
96
+ },
97
+ {
98
+ "name": "thinkingOffExpressible",
99
+ "kind": "function",
100
+ "tier": "advanced",
101
+ "at": [
102
+ "src/brain/reasoning.ts:184",
103
+ "src/index.ts:2489"
104
+ ],
105
+ "breaking": true
106
+ }
107
+ ],
108
+ "changed": [],
109
+ "narrowed": [
110
+ {
111
+ "id": "F2",
112
+ "source": "behaviorFlips.summary",
113
+ "text": "NARROWING (durable-resume path) — a decider's note has ONE mint (#812 / B-123; car-812): `settledByPerson` + `decidersNote` in `gate-outcome.ts`; empty text folds to absence there, once, for the live resolver and the durable decide lane alike, so `reason: \"\"` is a bare refusal on both paths and the issuing batch's not-yet-started siblings halt (`gate.batch_halted`). Whitespace-only text stays a note (pinned current behaviour, not a promise)."
114
+ },
115
+ {
116
+ "id": "F3",
117
+ "source": "behaviorFlips.summary",
118
+ "text": "NARROWING + widening — write protection layered by what the file IS (#804; car-804, ruling (d)) and the write-protection judge anchors relative spellings (#815, security; B-124): the deny set's agent-config block derives from `READ_FACE_BUILTIN_DENY_TABLE`'s `agent-config` tier (one table, two judges; `RECOMMENDED_SENSITIVE_PATTERNS` 26 → 39 members: +8 third-party agent config files, +2 write-face-only rows `.claude/hooks` / `.sema/hooks` (host-executed command bodies, like `.git/hooks`; #824), −4 hand rows), the `.claude` / `.sema` DIRECTORIES leave the deny set and sit on an ask tier of the SAME canonical judge (`RECOMMENDED_SENSITIVE_ASK_PATTERNS` = [`.claude`, `.sema`]; `createSensitivePathPolicy({ askPatterns })` absent = that set, `[]` = no ask tier; the `dataRoot` exemption applies to both tiers); the always-on lexical `WriteProtectionMatcher.matchPath(path, cwd?)` joins a relative spelling onto the gate's tracked cwd BEFORE judging, so `cd ~/.ssh` + `Write(\"authorized_keys\")` is judged like the absolute spelling on every `segment` row."
119
+ }
120
+ ],
121
+ "closedSetMembers": [
122
+ {
123
+ "set": "AUTO_MODE_PARSE_FAILURES",
124
+ "at": [
125
+ "src/core/auto-mode.ts:69"
126
+ ],
127
+ "newSet": true,
128
+ "added": [
129
+ "conflict",
130
+ "missing"
131
+ ],
132
+ "removed": [],
133
+ "breaking": false,
134
+ "criteriaCovered": false
135
+ },
136
+ {
137
+ "set": "CLASSIFIER_ROLE_DEFAULT_REASONS",
138
+ "at": [
139
+ "src/core/runner/classifier-ladder.ts:86"
140
+ ],
141
+ "newSet": true,
142
+ "added": [
143
+ "main_only",
144
+ "role_fallback",
145
+ "role_unresolvable",
146
+ "tier_below_main",
147
+ "tier_table"
148
+ ],
149
+ "removed": [],
150
+ "breaking": false,
151
+ "criteriaCovered": false
152
+ },
153
+ {
154
+ "set": "ENGINE_NOTICE_CODES",
155
+ "at": [
156
+ "src/core/governance-codes.ts:323"
157
+ ],
158
+ "newSet": false,
159
+ "added": [
160
+ "classifier.contract_broken",
161
+ "classifier.role_defaulted",
162
+ "skills.listing_truncated"
163
+ ],
164
+ "removed": [],
165
+ "breaking": false,
166
+ "criteriaCovered": true
167
+ },
168
+ {
169
+ "set": "RECOMMENDED_SENSITIVE_ASK_PATTERNS",
170
+ "at": [
171
+ "src/core/sensitive-path-policy.ts:196"
172
+ ],
173
+ "newSet": true,
174
+ "added": [
175
+ ".claude",
176
+ ".sema"
177
+ ],
178
+ "removed": [],
179
+ "breaking": false,
180
+ "criteriaCovered": false
181
+ },
182
+ {
183
+ "set": "RECOMMENDED_SENSITIVE_PATTERNS",
184
+ "at": [
185
+ "src/core/sensitive-path-policy.ts:102"
186
+ ],
187
+ "newSet": false,
188
+ "added": [
189
+ ".ai-agent/.env",
190
+ ".aider.conf.yml",
191
+ ".claude.*",
192
+ ".claude/agents",
193
+ ".claude/hooks",
194
+ ".claude/settings.json",
195
+ ".claude/settings.local.json",
196
+ ".codex/config.toml",
197
+ ".continue/config.json",
198
+ ".continue/config.yaml",
199
+ ".cursor/mcp.json",
200
+ ".gemini/settings.json",
201
+ ".sema/agents",
202
+ ".sema/engine-data/.env",
203
+ ".sema/hooks",
204
+ ".sema/settings.json",
205
+ ".sema/settings.local.json"
206
+ ],
207
+ "removed": [
208
+ ".claude*",
209
+ ".sema"
210
+ ],
211
+ "persistedBy": "none",
212
+ "breaking": true,
213
+ "criteriaCovered": false
214
+ }
215
+ ],
216
+ "typeKeys": [
217
+ {
218
+ "type": "AskRequest",
219
+ "at": [
220
+ "src/core/tool-policy.ts:2571"
221
+ ],
222
+ "added": [
223
+ "readRootCandidate"
224
+ ],
225
+ "removed": [],
226
+ "breaking": false,
227
+ "criteriaCovered": true
228
+ },
229
+ {
230
+ "type": "AutoModeVerdict",
231
+ "at": [
232
+ "src/core/auto-mode.ts:123"
233
+ ],
234
+ "added": [
235
+ "parse_error.form"
236
+ ],
237
+ "removed": [],
238
+ "breaking": false,
239
+ "criteriaCovered": false
240
+ },
241
+ {
242
+ "type": "CompoundReadonlyVerdict",
243
+ "at": [
244
+ "src/tools/fs/bash-readonly-classifier.ts:585"
245
+ ],
246
+ "added": [
247
+ "outOfRootGrantCandidate"
248
+ ],
249
+ "removed": [],
250
+ "breaking": false,
251
+ "criteriaCovered": false
252
+ },
253
+ {
254
+ "type": "PermissionResult",
255
+ "at": [
256
+ "src/core/tool-policy.ts:412"
257
+ ],
258
+ "added": [
259
+ "probeReadRootCandidate"
260
+ ],
261
+ "removed": [],
262
+ "breaking": false,
263
+ "criteriaCovered": false
264
+ },
265
+ {
266
+ "type": "PreToolUseResult",
267
+ "at": [
268
+ "src/core/hooks.ts:1141"
269
+ ],
270
+ "added": [
271
+ "probeReadRootCandidate"
272
+ ],
273
+ "removed": [],
274
+ "breaking": false,
275
+ "criteriaCovered": false
276
+ },
277
+ {
278
+ "type": "ReversibilityVerdict",
279
+ "at": [
280
+ "src/core/tool-spec.ts:50"
281
+ ],
282
+ "added": [
283
+ "readRootCandidate"
284
+ ],
285
+ "removed": [],
286
+ "breaking": false,
287
+ "criteriaCovered": true
288
+ },
289
+ {
290
+ "type": "TaskSpec",
291
+ "at": [
292
+ "src/core/task-spec.ts:49"
293
+ ],
294
+ "added": [
295
+ "skillListingBudgetFraction",
296
+ "skillListingMaxDescChars"
297
+ ],
298
+ "removed": [],
299
+ "breaking": false,
300
+ "criteriaCovered": true
301
+ }
302
+ ],
303
+ "declarationMoves": [
304
+ {
305
+ "name": "SKILLS_BLOCK_MAX_BYTES",
306
+ "kind": null,
307
+ "onSurface": false,
308
+ "from": [
309
+ "src/core/runner/synthetic-tools.ts"
310
+ ],
311
+ "to": [
312
+ "src/core/runner/synthetic-tools.ts",
313
+ "src/core/skill-listing-budget.ts"
314
+ ]
315
+ }
316
+ ],
317
+ "mintMoves": [],
318
+ "criteriaObserves": [
319
+ {
320
+ "kind": "engineNoticeCode",
321
+ "name": "classifier.contract_broken",
322
+ "assertions": [
323
+ "G1.c"
324
+ ]
325
+ },
326
+ {
327
+ "kind": "engineNoticeCode",
328
+ "name": "classifier.role_defaulted",
329
+ "assertions": [
330
+ "G1.b"
331
+ ]
332
+ },
333
+ {
334
+ "kind": "engineNoticeCode",
335
+ "name": "skills.listing_truncated",
336
+ "assertions": [
337
+ "G4.b"
338
+ ]
339
+ },
340
+ {
341
+ "kind": "typeMember",
342
+ "name": "AskRequest.readRootCandidate",
343
+ "assertions": [
344
+ "G5.a"
345
+ ]
346
+ },
347
+ {
348
+ "kind": "typeMember",
349
+ "name": "AskRequest.toolName",
350
+ "assertions": [
351
+ "G3.b"
352
+ ]
353
+ },
354
+ {
355
+ "kind": "typeMember",
356
+ "name": "AssistantMessage.partialFinalized",
357
+ "assertions": [
358
+ "G1.d"
359
+ ]
360
+ },
361
+ {
362
+ "kind": "typeMember",
363
+ "name": "GateDisposition.classifier",
364
+ "assertions": [
365
+ "G1.a"
366
+ ]
367
+ },
368
+ {
369
+ "kind": "typeMember",
370
+ "name": "ReadRootGrantCandidate.dir",
371
+ "assertions": [
372
+ "G5.b"
373
+ ]
374
+ },
375
+ {
376
+ "kind": "typeMember",
377
+ "name": "ReversibilityVerdict.readRootCandidate",
378
+ "assertions": [
379
+ "G5.c"
380
+ ]
381
+ },
382
+ {
383
+ "kind": "typeMember",
384
+ "name": "Settlement.kind",
385
+ "assertions": [
386
+ "G2.b"
387
+ ]
388
+ },
389
+ {
390
+ "kind": "typeMember",
391
+ "name": "Settlement.note",
392
+ "assertions": [
393
+ "G2.a"
394
+ ]
395
+ },
396
+ {
397
+ "kind": "typeMember",
398
+ "name": "TaskSpec.skillListingBudgetFraction",
399
+ "assertions": [
400
+ "G4.a",
401
+ "G6.a"
402
+ ]
403
+ },
404
+ {
405
+ "kind": "typeMember",
406
+ "name": "TaskSpec.skillListingMaxDescChars",
407
+ "assertions": [
408
+ "G4.c"
409
+ ]
410
+ },
411
+ {
412
+ "kind": "typeMember",
413
+ "name": "WriteProtectionMatcher.matchPath",
414
+ "assertions": [
415
+ "G3.a"
416
+ ]
417
+ }
418
+ ],
419
+ "consumersHint": {
420
+ "cli": [
421
+ "AskRequest",
422
+ "CompoundReadonlyVerdict",
423
+ "ENGINE_NOTICE_CODES",
424
+ "PermissionResult",
425
+ "PreToolUseResult",
426
+ "RECOMMENDED_SENSITIVE_PATTERNS",
427
+ "TaskSpec"
428
+ ],
429
+ "server": [
430
+ "AskRequest",
431
+ "AutoModeVerdict",
432
+ "CLASSIFIER_PARSE_FAILURE_DENY_MESSAGE",
433
+ "CompoundReadonlyVerdict",
434
+ "ENGINE_NOTICE_CODES",
435
+ "PermissionResult",
436
+ "PreToolUseResult",
437
+ "RECOMMENDED_SENSITIVE_PATTERNS",
438
+ "ReversibilityVerdict",
439
+ "TaskSpec",
440
+ "thinkingOffExpressible"
441
+ ],
442
+ "sdk": [
443
+ "AskRequest",
444
+ "PermissionResult",
445
+ "PreToolUseResult",
446
+ "TaskSpec"
447
+ ],
448
+ "note": "scanned cli@116d081d server@565d02fc sdk@17a8533 — a name listed is MENTIONED there today, which is evidence of consumption, not proof of it"
449
+ },
450
+ "breakingCount": 3,
451
+ "breakingItems": [
452
+ "closed set lost members: RECOMMENDED_SENSITIVE_PATTERNS -.claude*,.sema",
453
+ "export removed: CLASSIFIER_PARSE_FAILURE_DENY_MESSAGE (variable)",
454
+ "export removed: thinkingOffExpressible (function)"
455
+ ],
456
+ "toResolvedAt": "0ef667ab5a0122c0c73b9635de5035dab4a472dc"
457
+ }