@ouro.bot/cli 0.1.0-alpha.767 → 0.1.0-alpha.769

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.
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSanctuaryCurrentStatusIntent = isSanctuaryCurrentStatusIntent;
3
4
  exports.sanctuaryFullVisibilityEmptyResponse = sanctuaryFullVisibilityEmptyResponse;
4
5
  exports.sanctuaryFullVisibilityRequiredToolCalls = sanctuaryFullVisibilityRequiredToolCalls;
6
+ exports.sanctuaryStaleDockerCareRequiredToolCalls = sanctuaryStaleDockerCareRequiredToolCalls;
7
+ const node_crypto_1 = require("node:crypto");
8
+ const cares_1 = require("../arc/cares");
5
9
  const runtime_1 = require("../nerves/runtime");
6
- const REQUIRED_TOOL_NAMES = ["query_active_work", "query_cares", "unraid_get_system", "unraid_list_containers", "unraid_get_storage", "sanctuary_get_download_queue"];
10
+ const REQUIRED_TOOL_NAMES = ["query_active_work", "query_cares", "unraid_get_system", "unraid_list_containers", "unraid_get_storage", "unraid_get_notifications", "sanctuary_get_download_queue"];
7
11
  const WHOLE_STATUS_REQUESTS = new Set(["what are you working on", "what's going on with sanctuary"]);
8
- function unsupportedCurrentClaim(answer, queueUnavailable) {
12
+ function unsupportedCurrentClaim(answer, queueUnavailable, authorizedDockerClaims) {
9
13
  if (queueUnavailable && answer.trim().length === 0)
10
14
  return "Give Ari the current results that did complete and say plainly that the download queue is currently unavailable; do not return an empty answer.";
11
15
  if (queueUnavailable) {
@@ -21,6 +25,9 @@ function unsupportedCurrentClaim(answer, queueUnavailable) {
21
25
  const unsupported = answer.replace(/docker\.img/giu, "docker image").split(/[,;!?\n]|(?<!\d)\.(?!\d)/u).some((sentence) => {
22
26
  if (!/docker image(?: disk)?/iu.test(sentence))
23
27
  return false;
28
+ const normalizedSentence = sentence.normalize("NFKC").trim().toLocaleLowerCase("en-US");
29
+ if (authorizedDockerClaims.some((claim) => claim.normalize("NFKC").replace(/[.!?]+$/u, "").trim().toLocaleLowerCase("en-US") === normalizedSentence))
30
+ return false;
24
31
  const uncertaintyOnly = /\b(?:cannot|can't|unable to) (?:currently )?(?:verify|measure)\b|\b(?:unknown|unverified)\b|\bneeds? (?:a )?(?:fresh |authoritative )*(?:check|measurement)\b/iu.test(sentence);
25
32
  const stateClaim = /\b\d+(?:\.\d+)?\s*%|\bfull\b|\b(?:no|out of) space\b|\bwrites? (?:will |may )?fail\b|\b(?:healthy|unhealthy|running|stopped)\b/iu.test(sentence);
26
33
  return stateClaim || !uncertaintyOnly;
@@ -59,6 +66,19 @@ function successfulCurrentResult(name, result) {
59
66
  const parsed = JSON.parse(result);
60
67
  if (name === "query_cares")
61
68
  return { valid: Array.isArray(parsed), queueUnavailable: false };
69
+ if (name === "unraid_get_notifications") {
70
+ const root = parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
71
+ const error = root?.error && typeof root.error === "object" && !Array.isArray(root.error) ? root.error : null;
72
+ const unavailable = root?.ok === false
73
+ && JSON.stringify(Object.keys(root).sort()) === JSON.stringify(["error", "ok"])
74
+ && !!error && JSON.stringify(Object.keys(error).sort()) === JSON.stringify(["code", "degraded", "message"])
75
+ && ["unauthorized", "forbidden", "timeout", "transport", "graphql", "invalid_response"].includes(String(error.code))
76
+ && typeof error.message === "string" && Buffer.byteLength(error.message, "utf8") <= 512 && error.degraded === true;
77
+ if (unavailable)
78
+ return { valid: true, queueUnavailable: false };
79
+ const data = root?.data && typeof root.data === "object" && !Array.isArray(root.data) ? root.data : null;
80
+ return { valid: root?.ok === true && Array.isArray(data?.unacknowledged) && typeof data.truncated === "boolean", queueUnavailable: false };
81
+ }
62
82
  if (name === "sanctuary_get_download_queue") {
63
83
  if (exactQueueUnavailableResult(parsed))
64
84
  return { valid: true, queueUnavailable: true };
@@ -80,23 +100,37 @@ function successfulCurrentResult(name, result) {
80
100
  }
81
101
  }
82
102
  function normalizedRequest(request) {
83
- return request.normalize("NFKC").trim().toLocaleLowerCase("en-US").replaceAll("’", "'").replace(/[?!.\s]+$/gu, "");
103
+ return request.normalize("NFKC").trim().toLocaleLowerCase("en-US").replace(/[‘’]/gu, "'").replace(/[^a-z0-9']+/gu, " ").trim();
104
+ }
105
+ function isSanctuaryCurrentStatusIntent(request) {
106
+ const normalized = normalizedRequest(request);
107
+ if (WHOLE_STATUS_REQUESTS.has(normalized))
108
+ return true;
109
+ if (["what's up", "everything good", "anything wrong"].includes(normalized))
110
+ return true;
111
+ if (!normalized || /\b(?:yesterday|tomorrow|document|movie request)\b/u.test(normalized))
112
+ return false;
113
+ if (/^do you care about\b/u.test(normalized) || /\b(?:plex|jellyfin|sonarr|radarr|docker labels?)\b/u.test(normalized))
114
+ return false;
115
+ const wholeScope = /\b(?:anything|everything|what(?:'s| is)|things?)\b/u.test(normalized);
116
+ const current = /\b(?:now|right now|currently|going on|status)\b/u.test(normalized);
117
+ const concern = /\b(?:care about|should (?:i|we) know about|working on|going on|status)\b/u.test(normalized);
118
+ return wholeScope && current && concern;
84
119
  }
85
120
  function sanctuaryFullVisibilityEmptyResponse(request) {
86
- return WHOLE_STATUS_REQUESTS.has(normalizedRequest(request))
121
+ return isSanctuaryCurrentStatusIntent(request)
87
122
  ? "I couldn't finish a trustworthy Sanctuary status check because a current check was unavailable. I won't guess or reuse old alerts; please try again shortly."
88
123
  : undefined;
89
124
  }
90
- function sanctuaryFullVisibilityRequiredToolCalls(request, advertisedToolNames) {
91
- const normalized = normalizedRequest(request);
92
- if (!WHOLE_STATUS_REQUESTS.has(normalized) || !REQUIRED_TOOL_NAMES.every((name) => advertisedToolNames.includes(name)))
125
+ function sanctuaryFullVisibilityRequiredToolCalls(request, _advertisedToolNames, authorizedDockerClaims = () => []) {
126
+ if (!isSanctuaryCurrentStatusIntent(request))
93
127
  return undefined;
94
128
  (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.sanctuary_full_visibility_reads_required", message: "required current Sanctuary visibility reads", meta: { toolCount: REQUIRED_TOOL_NAMES.length } });
95
129
  let queueUnavailable = false;
96
130
  const completed = new Set();
97
131
  return {
98
132
  names: REQUIRED_TOOL_NAMES,
99
- retryMessage: "Before answering, read current active work, cares, system health, service state, storage, and the download queue. Current tool facts outrank care history; a stale care is a recheck item, not a present-tense fact. Then give Ari one compact household summary; do not ask him to choose a status slice.",
133
+ retryMessage: "Before answering, read current active work, cares, system health, service state, storage, notifications, and the download queue. Current tool facts outrank care history; a stale care is a recheck item, not a present-tense fact. Then give Ari one compact household summary; do not ask him to choose a status slice.",
100
134
  requireSuccessfulResults: true,
101
135
  validateRequiredToolResult: (name, result) => {
102
136
  const validation = successfulCurrentResult(name, result);
@@ -106,7 +140,163 @@ function sanctuaryFullVisibilityRequiredToolCalls(request, advertisedToolNames)
106
140
  completed.add(name);
107
141
  return validation.valid;
108
142
  },
109
- validateTerminalAnswer: (answer) => unsupportedCurrentClaim(answer, queueUnavailable),
143
+ validateTerminalAnswer: (answer) => unsupportedCurrentClaim(answer, queueUnavailable, authorizedDockerClaims()),
110
144
  emptyResponseFallback: () => REQUIRED_TOOL_NAMES.every((name) => completed.has(name)) ? sanctuaryFullVisibilityEmptyResponse(request) : undefined,
111
145
  };
112
146
  }
147
+ const SAFE_LABEL = "Docker image disk utilization";
148
+ const INCONCLUSIVE_RISK = "Docker image disk utilization verification is inconclusive.";
149
+ const ACTIVE_RISK = "A fresh Unraid notification reports high Docker image disk utilization.";
150
+ function qualifyingDockerCare(care, now) {
151
+ if ((0, cares_1.projectCareEvidence)(care, now) === care)
152
+ return undefined;
153
+ const binding = care.incidentBindings?.find(cares_1.isManagedDockerCareIncidentBinding);
154
+ return binding ? {
155
+ id: care.id, updatedAt: care.updatedAt, currentRisk: care.currentRisk, nextCheckAt: care.nextCheckAt, salience: care.salience, steward: care.steward, binding: { ...binding },
156
+ hasOtherUnresolvedBindings: care.incidentBindings.some((candidate) => candidate !== binding && !candidate.resolvedAt),
157
+ } : undefined;
158
+ }
159
+ function canonicalNotification(value) {
160
+ if (!value || typeof value !== "object" || Array.isArray(value))
161
+ return undefined;
162
+ const notification = value;
163
+ return typeof notification.id === "string"
164
+ && typeof notification.createdAt === "string"
165
+ && Number.isFinite(Date.parse(notification.createdAt))
166
+ && new Date(notification.createdAt).toISOString() === notification.createdAt
167
+ && typeof notification.title === "string"
168
+ && typeof notification.summary === "string"
169
+ && typeof notification.severity === "string"
170
+ && typeof notification.degraded === "boolean"
171
+ ? notification
172
+ : undefined;
173
+ }
174
+ function notificationRevision(notification) {
175
+ return (0, node_crypto_1.createHash)("sha256").update(JSON.stringify({
176
+ id: notification.id,
177
+ createdAt: notification.createdAt,
178
+ severity: notification.severity,
179
+ title: notification.title,
180
+ summary: notification.summary,
181
+ degraded: notification.degraded,
182
+ })).digest("hex");
183
+ }
184
+ function dockerObservation(result, care) {
185
+ try {
186
+ const parsed = JSON.parse(result);
187
+ const data = parsed?.ok === true && parsed.data && typeof parsed.data === "object" && !Array.isArray(parsed.data) ? parsed.data : undefined;
188
+ if (!data || data.truncated !== false || !Array.isArray(data.unacknowledged))
189
+ return { outcome: "inconclusive" };
190
+ const boundary = Math.max(Date.parse(care.updatedAt), Date.parse(care.nextCheckAt));
191
+ const related = data.unacknowledged.map(canonicalNotification).filter((item) => !!item).filter((item) => {
192
+ const text = `${item.title} ${item.summary}`;
193
+ return item.degraded === false && Date.parse(String(item.createdAt)) > boundary && /docker/iu.test(text) && /image/iu.test(text) && /(?:disk|utilization)/iu.test(text);
194
+ });
195
+ if (related.length !== 1)
196
+ return { outcome: "inconclusive" };
197
+ const notification = related[0];
198
+ const text = `${notification.title} ${notification.summary}`;
199
+ const revision = notificationRevision(notification);
200
+ if (/\b(?:recover(?:ed|y)?|resolved|normal|healthy|cleared)\b/iu.test(text))
201
+ return { outcome: "fresh_recovered", revision };
202
+ if (/\b(?:critical|warning|error|full|high|9[0-9]%|100%)\b/iu.test(`${notification.severity} ${text}`)) {
203
+ return { outcome: "fresh_active", revision, risk: ACTIVE_RISK };
204
+ }
205
+ return { outcome: "inconclusive" };
206
+ }
207
+ catch {
208
+ return { outcome: "inconclusive" };
209
+ }
210
+ }
211
+ function mutationFor(care, observation, now) {
212
+ const common = {
213
+ id: care.id,
214
+ source: care.binding.source,
215
+ incidentKey: care.binding.incidentKey,
216
+ expectedUpdatedAt: care.updatedAt,
217
+ label: SAFE_LABEL,
218
+ why: observation.outcome === "inconclusive" ? "Current Unraid notification evidence was inconclusive." : "Current Unraid notification evidence was checked.",
219
+ };
220
+ if (observation.outcome === "fresh_recovered") {
221
+ const unresolvedContextRemains = care.hasOtherUnresolvedBindings;
222
+ return {
223
+ ...common,
224
+ action: "resolve_incident",
225
+ currentRisk: unresolvedContextRemains ? cares_1.CARE_INCIDENT_RECOVERY_REVIEW_RISK : "",
226
+ nextCheckAt: unresolvedContextRemains ? new Date(now + 15 * 60_000).toISOString() : "",
227
+ };
228
+ }
229
+ return {
230
+ ...common,
231
+ action: "upsert_incident",
232
+ kind: "system",
233
+ status: observation.outcome === "fresh_active" ? "active" : "watching",
234
+ salience: care.salience,
235
+ stewardship: care.steward,
236
+ classifiedRevision: observation.outcome === "fresh_active" ? observation.revision : care.binding.classifiedRevision,
237
+ currentRisk: observation.outcome === "fresh_active" ? observation.risk : INCONCLUSIVE_RISK,
238
+ nextCheckAt: new Date(now + 15 * 60_000).toISOString(),
239
+ };
240
+ }
241
+ function exactMutation(expected, actual) {
242
+ return Object.keys(expected).length === Object.keys(actual).length
243
+ && Object.entries(expected).every(([key, value]) => actual[key] === value);
244
+ }
245
+ function sanctuaryStaleDockerCareRequiredToolCalls(activeCares, now, _advertisedToolNames) {
246
+ const cares = activeCares.map((care) => qualifyingDockerCare(care, now)).filter((care) => !!care);
247
+ if (cares.length === 0)
248
+ return undefined;
249
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.sanctuary_stale_docker_care_verification_required", message: "stale Docker Care requires current notification verification", meta: { careCount: cares.length } });
250
+ let verifierComplete = false;
251
+ let mutations = [];
252
+ const completed = new Set();
253
+ return {
254
+ names: ["unraid_get_notifications"],
255
+ get retryMessage() {
256
+ return mutations.length === 0
257
+ ? "Recheck the stale Docker image disk Care from current notifications, then apply every exact evidence-bounded Care update before answering."
258
+ : `Apply these exact evidence-bounded care_manage arguments before answering: ${JSON.stringify(mutations)}.`;
259
+ },
260
+ requireSuccessfulResults: true,
261
+ validateRequiredToolResult: (name, result, args) => {
262
+ if (name === "unraid_get_notifications")
263
+ return Buffer.byteLength(result, "utf8") <= 1_000_000;
264
+ if (name !== "care_manage")
265
+ return false;
266
+ const expected = mutations.find((candidate) => exactMutation(candidate, args));
267
+ if (!expected)
268
+ return false;
269
+ try {
270
+ const care = JSON.parse(result);
271
+ const binding = care.incidentBindings?.find((candidate) => candidate.source === expected.source && candidate.incidentKey === expected.incidentKey);
272
+ const resolved = expected.action === "resolve_incident" ? !!binding?.resolvedAt : binding?.classifiedRevision === expected.classifiedRevision;
273
+ const updatedUnderCas = typeof care.updatedAt === "string" && Date.parse(care.updatedAt) > Date.parse(expected.expectedUpdatedAt);
274
+ const wholeCareResolutionValid = expected.action !== "resolve_incident" || expected.currentRisk !== "" || care.incidentBindings?.some((candidate) => !candidate.resolvedAt) || care.status === "resolved";
275
+ if (care.id !== expected.id || care.label !== SAFE_LABEL || care.why !== expected.why || care.currentRisk !== (expected.currentRisk || null) || care.nextCheckAt !== (expected.nextCheckAt || null) || (expected.status && care.status !== expected.status) || !resolved || !updatedUnderCas || !wholeCareResolutionValid)
276
+ return false;
277
+ completed.add(care.id);
278
+ return completed.size === mutations.length;
279
+ }
280
+ catch {
281
+ return false;
282
+ }
283
+ },
284
+ validateToolCallBeforeDispatch: (name, args) => {
285
+ if (name !== "care_manage")
286
+ return undefined;
287
+ if (!verifierComplete)
288
+ return "Read current Unraid notifications before mutating stale Docker Care.";
289
+ return mutations.some((candidate) => exactMutation(candidate, args)) ? undefined : `Only these exact evidence-bounded stale Docker Care mutations are authorized in this turn: ${JSON.stringify(mutations)}.`;
290
+ },
291
+ requiredToolCallsAfterResult: (name, _args, result) => {
292
+ if (name !== "unraid_get_notifications")
293
+ return [];
294
+ mutations = cares.map((care) => mutationFor(care, dockerObservation(result, care), now));
295
+ verifierComplete = true;
296
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.sanctuary_stale_docker_care_verification_completed", message: "current notification verification produced bounded Care outcomes", meta: { careCount: cares.length, mutationCount: mutations.length } });
297
+ return ["care_manage"];
298
+ },
299
+ expectedMutations: () => mutations.map((mutation) => ({ ...mutation })),
300
+ currentRiskClaims: () => mutations.filter((mutation) => mutation.currentRisk === ACTIVE_RISK).map((mutation) => mutation.currentRisk),
301
+ };
302
+ }
@@ -11,13 +11,12 @@ function normalizedRequest(request) {
11
11
  .replace(/[^a-z0-9']+/gu, " ")
12
12
  .trim();
13
13
  }
14
- function sanctuaryStorageOptimizationRequiredToolCalls(request, advertisedToolNames) {
14
+ function sanctuaryStorageOptimizationRequiredToolCalls(request, _advertisedToolNames) {
15
15
  const normalized = normalizedRequest(request);
16
16
  const hasStorageSubject = /\b(?:space|storage)\b/u.test(normalized);
17
17
  const hasUsageDiagnosis = /\b(?:using|taking up|find what|diagnos(?:e|is))\b/u.test(normalized);
18
18
  const hasShrinkIntent = /\b(?:make it smaller|shrink|reclaim|free up|reduce|optimi[sz])\b/u.test(normalized);
19
- const advertised = new Set(advertisedToolNames);
20
- if (!hasStorageSubject || !hasUsageDiagnosis || !hasShrinkIntent || !REQUIRED_TOOL_NAMES.every((name) => advertised.has(name)))
19
+ if (!hasStorageSubject || !hasUsageDiagnosis || !hasShrinkIntent)
21
20
  return undefined;
22
21
  const names = [...REQUIRED_TOOL_NAMES];
23
22
  (0, runtime_1.emitNervesEvent)({
@@ -1078,23 +1078,46 @@ function createTelegramSenseApp(options) {
1078
1078
  authorizeTool: async (name, args) => (await options.resolveRelationshipAuthorization(relationshipCoordinates)).authorizeTool(name, args),
1079
1079
  };
1080
1080
  };
1081
- return async ({ runAgentOptions }) => {
1081
+ return async ({ runAgentOptions, activeCares = [], careEvidenceNow = Date.now() }) => {
1082
1082
  const relationshipAuthorization = await resolveLiveRelationshipAuthorization();
1083
- const storageOptimization = options.agentName === "sanctuary" && relationshipAuthorization.profileId === "sanctuary-owner"
1083
+ const isSanctuaryOwner = options.agentName === "sanctuary" && relationshipAuthorization.profileId === "sanctuary-owner";
1084
+ const storageOptimization = isSanctuaryOwner
1084
1085
  ? (0, sanctuary_storage_optimization_contract_1.sanctuaryStorageOptimizationRequiredToolCalls)(input.userMessage, relationshipAuthorization.advertisedToolNames)
1085
1086
  : undefined;
1086
- const fullVisibility = options.agentName === "sanctuary" && relationshipAuthorization.profileId === "sanctuary-owner" && !storageOptimization
1087
- ? (0, sanctuary_full_visibility_contract_1.sanctuaryFullVisibilityRequiredToolCalls)(input.userMessage, relationshipAuthorization.advertisedToolNames)
1087
+ const staleDockerCare = isSanctuaryOwner
1088
+ ? (0, sanctuary_full_visibility_contract_1.sanctuaryStaleDockerCareRequiredToolCalls)(activeCares, careEvidenceNow, relationshipAuthorization.advertisedToolNames)
1089
+ : undefined;
1090
+ const fullVisibility = isSanctuaryOwner
1091
+ ? (0, sanctuary_full_visibility_contract_1.sanctuaryFullVisibilityRequiredToolCalls)(input.userMessage, relationshipAuthorization.advertisedToolNames, () => staleDockerCare?.currentRiskClaims() ?? [])
1088
1092
  : undefined;
1089
1093
  if (input.fullVisibilityProgress && fullVisibility)
1090
1094
  input.fullVisibilityProgress.fallback = fullVisibility.emptyResponseFallback;
1091
- const requiredToolCalls = storageOptimization ?? (fullVisibility ? {
1092
- names: fullVisibility.names,
1093
- retryMessage: fullVisibility.retryMessage,
1094
- requireSuccessfulResults: fullVisibility.requireSuccessfulResults,
1095
- validateRequiredToolResult: fullVisibility.validateRequiredToolResult,
1096
- validateTerminalAnswer: fullVisibility.validateTerminalAnswer,
1097
- } : undefined);
1095
+ const contracts = [storageOptimization, fullVisibility, staleDockerCare].filter(Boolean);
1096
+ const ownedNames = contracts.map((contract) => new Set(contract.names));
1097
+ const requiredToolCalls = contracts.length === 0 ? undefined : {
1098
+ names: [...new Set(contracts.flatMap((contract) => [...contract.names]))],
1099
+ get retryMessage() { return contracts.map((contract) => contract.retryMessage).join(" "); },
1100
+ requireSuccessfulResults: true,
1101
+ validateRequiredToolResult: (name, result, args) => contracts.every((contract, index) => {
1102
+ if (!ownedNames[index].has(name))
1103
+ return true;
1104
+ return contract.validateRequiredToolResult?.(name, result, args) ?? true;
1105
+ }),
1106
+ validateToolCallBeforeDispatch: (name, args) => contracts.map((contract) => contract.validateToolCallBeforeDispatch?.(name, args)).find((rejection) => rejection !== undefined),
1107
+ requiredToolCallsAfterResult: (name, args, result) => {
1108
+ const added = new Set();
1109
+ contracts.forEach((contract, index) => {
1110
+ if (!ownedNames[index].has(name) || !contract.requiredToolCallsAfterResult)
1111
+ return;
1112
+ for (const requiredName of contract.requiredToolCallsAfterResult(name, args, result)) {
1113
+ ownedNames[index].add(requiredName);
1114
+ added.add(requiredName);
1115
+ }
1116
+ });
1117
+ return [...added];
1118
+ },
1119
+ validateTerminalAnswer: (answer) => contracts.map((contract) => contract.validateTerminalAnswer?.(answer)).find((rejection) => rejection !== undefined),
1120
+ };
1098
1121
  return {
1099
1122
  ...runAgentOptions,
1100
1123
  ...(requiredToolCalls ? { requiredToolCalls } : {}),
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.767",
3
+ "version": "0.1.0-alpha.769",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@ouro.bot/cli",
9
- "version": "0.1.0-alpha.767",
9
+ "version": "0.1.0-alpha.769",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.78.0",
12
12
  "@azure/identity": "^4.13.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.767",
3
+ "version": "0.1.0-alpha.769",
4
4
  "engines": {
5
5
  "node": ">=22"
6
6
  },