omnius 1.0.843 → 1.0.846

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.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/dist/index.js
3
- size: 37064391 bytes
4
- sha256: 1c020e46538ba5a79d1d2b7586f2f8922b0f4bab36354bd878b49939461d8d9b
3
+ size: 37075842 bytes
4
+ sha256: f568a8a54e037eb22f21193f7f589f8769b6b94369c0e9dfa7446ca6e8a5f87b
package/dist/library.js CHANGED
@@ -349062,7 +349062,23 @@ function routeKey(route) {
349062
349062
  return `${new URL(route.baseUrl).origin}\0${route.model}`;
349063
349063
  }
349064
349064
  function errorStatus(error) {
349065
- return object4(error) && typeof error.status === "number" ? error.status : void 0;
349065
+ for (const value of errorChain(error)) {
349066
+ if (object4(value) && typeof value.status === "number" && Number.isInteger(value.status) && value.status >= 100 && value.status <= 599)
349067
+ return value.status;
349068
+ }
349069
+ return void 0;
349070
+ }
349071
+ function errorChain(error) {
349072
+ const chain = [];
349073
+ for (let current = error; current && chain.length < 8 && !chain.includes(current); current = object4(current) ? current.cause : void 0)
349074
+ chain.push(current);
349075
+ return chain;
349076
+ }
349077
+ function safeFailure(error) {
349078
+ const status = errorStatus(error);
349079
+ const chain = errorChain(error);
349080
+ const category = status === 429 ? "rate_limit" : status === 401 || status === 403 ? "authentication" : status !== void 0 && status >= 400 && status < 500 ? "request_rejected" : status !== void 0 && status >= 500 ? "upstream_unavailable" : chain.some((value) => value instanceof AttemptTimeout || object4(value) && (value.name === "TimeoutError" || value.name === "AbortError" || value.code === "ETIMEDOUT")) ? "timeout" : chain.some((value) => value instanceof EmptyInferenceResponse) ? "empty_response" : chain.some((value) => value instanceof SyntaxError) ? "invalid_response" : "transport";
349081
+ return { category, ...status === void 0 ? {} : { status } };
349066
349082
  }
349067
349083
  function transportFailure(error) {
349068
349084
  if (parseProviderContextOverflow(error))
@@ -349159,9 +349175,12 @@ var RemoteInferenceFallback = class _RemoteInferenceFallback {
349159
349175
  if (!this.eligible(request))
349160
349176
  return local(request);
349161
349177
  this.fence(request);
349178
+ let localSelected = false;
349162
349179
  try {
349163
349180
  if (this.localAdmissionTimeoutMs(request) === 0)
349164
349181
  throw new AttemptTimeout();
349182
+ this.lifecycle(request, "selected");
349183
+ localSelected = true;
349165
349184
  const result = await this.attempt(request, this.policy.localTimeoutMs, async (bounded3) => {
349166
349185
  if (bounded3.localAdmissionFailure !== void 0)
349167
349186
  throw bounded3.localAdmissionFailure;
@@ -349170,16 +349189,19 @@ var RemoteInferenceFallback = class _RemoteInferenceFallback {
349170
349189
  if (!usableResult(result))
349171
349190
  throw new EmptyInferenceResponse();
349172
349191
  localCooldowns.delete(routeKey(this.primary));
349192
+ this.lifecycle(request, "succeeded");
349173
349193
  return result;
349174
349194
  } catch (error) {
349175
349195
  this.fence(request);
349196
+ if (localSelected)
349197
+ this.lifecycle(request, "failed", void 0, error);
349176
349198
  if (!transportFailure(error))
349177
349199
  throw error;
349178
349200
  this.localCooldown();
349179
349201
  }
349180
349202
  await this.approveRemoteFallback(request);
349181
349203
  const deadline = this.now() + this.policy.totalTimeoutMs;
349182
- for await (const candidate of this.candidates(request, deadline)) {
349204
+ for await (const candidate of this.retryableCandidates(request, deadline)) {
349183
349205
  if (this.now() >= deadline)
349184
349206
  break;
349185
349207
  try {
@@ -349193,9 +349215,11 @@ var RemoteInferenceFallback = class _RemoteInferenceFallback {
349193
349215
  if (!usableResult(result))
349194
349216
  throw new EmptyInferenceResponse();
349195
349217
  cooldowns.delete(routeKey(candidate));
349218
+ this.lifecycle(request, "succeeded", candidate);
349196
349219
  return this.scrubber(candidate)(result);
349197
349220
  } catch (error) {
349198
349221
  this.fence(request);
349222
+ this.lifecycle(request, "failed", candidate, error);
349199
349223
  this.cooldown(candidate, error);
349200
349224
  }
349201
349225
  }
@@ -349219,9 +349243,12 @@ var RemoteInferenceFallback = class _RemoteInferenceFallback {
349219
349243
  }
349220
349244
  this.fence(request);
349221
349245
  let emitted = false;
349246
+ let localSelected = false;
349222
349247
  try {
349223
349248
  if (this.localAdmissionTimeoutMs(request) === 0)
349224
349249
  throw new AttemptTimeout();
349250
+ this.lifecycle(request, "selected");
349251
+ localSelected = true;
349225
349252
  if (request.localAdmissionFailure !== void 0)
349226
349253
  throw request.localAdmissionFailure;
349227
349254
  for await (const chunk of this.requireUsableStream(this.boundedStream(request, this.policy.localTimeoutMs, local, true))) {
@@ -349229,9 +349256,12 @@ var RemoteInferenceFallback = class _RemoteInferenceFallback {
349229
349256
  yield chunk;
349230
349257
  }
349231
349258
  localCooldowns.delete(routeKey(this.primary));
349259
+ this.lifecycle(request, "succeeded");
349232
349260
  return;
349233
349261
  } catch (error) {
349234
349262
  this.fence(request);
349263
+ if (localSelected)
349264
+ this.lifecycle(request, "failed", void 0, error);
349235
349265
  if (emitted)
349236
349266
  throw new StreamInterruptedError();
349237
349267
  if (!transportFailure(error))
@@ -349240,7 +349270,7 @@ var RemoteInferenceFallback = class _RemoteInferenceFallback {
349240
349270
  }
349241
349271
  await this.approveRemoteFallback(request);
349242
349272
  const deadline = this.now() + this.policy.totalTimeoutMs;
349243
- for await (const candidate of this.candidates(request, deadline)) {
349273
+ for await (const candidate of this.retryableCandidates(request, deadline)) {
349244
349274
  if (this.now() >= deadline)
349245
349275
  break;
349246
349276
  try {
@@ -349264,9 +349294,11 @@ var RemoteInferenceFallback = class _RemoteInferenceFallback {
349264
349294
  yield chunk;
349265
349295
  }
349266
349296
  cooldowns.delete(routeKey(candidate));
349297
+ this.lifecycle(request, "succeeded", candidate);
349267
349298
  return;
349268
349299
  } catch (error) {
349269
349300
  this.fence(request);
349301
+ this.lifecycle(request, "failed", candidate, error);
349270
349302
  if (emitted)
349271
349303
  throw new StreamInterruptedError();
349272
349304
  this.cooldown(candidate, error);
@@ -349401,6 +349433,26 @@ var RemoteInferenceFallback = class _RemoteInferenceFallback {
349401
349433
  });
349402
349434
  request.onInferenceRoute?.({ ...this.lastRoute });
349403
349435
  this.options.onRoute?.({ providerId: this.lastRoute.providerId, model: this.lastRoute.model });
349436
+ this.lifecycle(request, "selected", route);
349437
+ }
349438
+ lifecycle(request, phase, route, error) {
349439
+ this.fence(request);
349440
+ if (!request.onInferenceRouteLifecycle)
349441
+ return;
349442
+ const receipt = {
349443
+ location: route ? "remote" : "local",
349444
+ phase,
349445
+ model: route?.model ?? this.primary.model,
349446
+ providerId: route ? route.keyless?.id ?? route.providerId ?? "remote" : this.primary.providerId ?? "ollama",
349447
+ backendType: route ? "vllm" : this.primary.backendType ?? "ollama",
349448
+ ...request.logicalRequestId ? { logicalRequestId: request.logicalRequestId } : {},
349449
+ ...phase === "failed" ? { failure: safeFailure(error) } : {}
349450
+ };
349451
+ try {
349452
+ request.onInferenceRouteLifecycle(this.scrubber(route)(receipt));
349453
+ } catch {
349454
+ this.fence(request);
349455
+ }
349404
349456
  }
349405
349457
  async prepare(route) {
349406
349458
  await this.validate(route.baseUrl);
@@ -349476,14 +349528,14 @@ var RemoteInferenceFallback = class _RemoteInferenceFallback {
349476
349528
  configuredEndpointOnly: true,
349477
349529
  disableEmptyContentRecovery: true,
349478
349530
  maxTokens: this.remoteOutputTokens(request, route),
349479
- ...route.contextWindow || route.maxOutputTokens ? { providerDefaultOutput: void 0 } : {},
349531
+ ...route.contextWindow || route.maxOutputTokens ? { providerDefaultOutput: void 0 } : route.keyless ? { providerDefaultOutput: true, remoteProviderDefaultOutput: true } : {},
349480
349532
  preferNativeOllamaChat: false,
349481
349533
  think: false,
349482
349534
  ...route.keyless?.directAnswer ? { chatTemplateKwargs: { enable_thinking: false } } : {},
349483
349535
  timeoutMs: Math.min(request.timeoutMs, this.policy.requestTimeoutMs)
349484
349536
  };
349485
349537
  }
349486
- compatible(request, route) {
349538
+ compatible(request, route, includeCooling = false) {
349487
349539
  if (this.scrubber(route)(route.model) !== route.model)
349488
349540
  return false;
349489
349541
  if (request.tools.length && !route.nativeToolsHint || hasImages(request) && !route.images)
@@ -349499,7 +349551,7 @@ var RemoteInferenceFallback = class _RemoteInferenceFallback {
349499
349551
  const minimum = route.contextWindow ? Math.min(request.maxTokens, minimumOutputTokens(route.contextWindow)) : 1;
349500
349552
  if (this.remoteOutputTokens(request, route) < minimum)
349501
349553
  return false;
349502
- return (cooldowns.get(routeKey(route)) ?? 0) <= this.now();
349554
+ return includeCooling || (cooldowns.get(routeKey(route))?.until ?? 0) <= this.now();
349503
349555
  }
349504
349556
  remoteOutputTokens(request, route) {
349505
349557
  let budget = Math.min(request.maxTokens, route.maxOutputTokens ?? Infinity);
@@ -349514,12 +349566,66 @@ var RemoteInferenceFallback = class _RemoteInferenceFallback {
349514
349566
  return Math.floor(budget);
349515
349567
  }
349516
349568
  cooldown(route, error) {
349517
- const hinted = object4(error) && typeof error.retryAfterMs === "number" && Number.isFinite(error.retryAfterMs) ? Math.max(0, Math.min(3e5, error.retryAfterMs)) : 0;
349569
+ const status = errorStatus(error);
349570
+ route.lastAttemptRateLimited = status === 429;
349571
+ if (status !== void 0 && status >= 400 && status < 500 && status !== 429)
349572
+ return;
349573
+ const hint = errorChain(error).find((value) => object4(value) && typeof value.retryAfterMs === "number" && Number.isFinite(value.retryAfterMs));
349574
+ const hinted = object4(hint) && typeof hint.retryAfterMs === "number" ? Math.max(1, Math.min(3e5, hint.retryAfterMs)) : void 0;
349518
349575
  if (cooldowns.size >= 256)
349519
349576
  cooldowns.delete(cooldowns.keys().next().value);
349520
- cooldowns.set(routeKey(route), this.now() + Math.max(15e3, hinted));
349577
+ cooldowns.set(routeKey(route), {
349578
+ until: this.now() + (status === 429 ? hinted ?? 15e3 : Math.max(15e3, hinted ?? 0)),
349579
+ rateLimited: status === 429
349580
+ });
349581
+ }
349582
+ async *retryableCandidates(request, deadline) {
349583
+ const waiting = /* @__PURE__ */ new Map();
349584
+ const attempts = /* @__PURE__ */ new Map();
349585
+ const defer = (candidate) => {
349586
+ const key = routeKey(candidate);
349587
+ if (candidate.lastAttemptRateLimited && (attempts.get(key) ?? 0) < 3)
349588
+ waiting.set(key, candidate);
349589
+ };
349590
+ for await (const candidate of this.candidates(request, deadline, true)) {
349591
+ const key = routeKey(candidate);
349592
+ if ((cooldowns.get(key)?.until ?? 0) > this.now()) {
349593
+ if (cooldowns.get(key)?.rateLimited)
349594
+ waiting.set(key, candidate);
349595
+ continue;
349596
+ }
349597
+ if (this.now() >= deadline)
349598
+ return;
349599
+ attempts.set(key, 1);
349600
+ yield candidate;
349601
+ defer(candidate);
349602
+ }
349603
+ while (waiting.size && this.now() < deadline) {
349604
+ this.fence(request);
349605
+ const [key, candidate] = [...waiting].sort(([a], [b]) => (cooldowns.get(a)?.until ?? 0) - (cooldowns.get(b)?.until ?? 0))[0];
349606
+ const delay2 = Math.max(0, (cooldowns.get(key)?.until ?? 0) - this.now());
349607
+ if (delay2 >= deadline - this.now())
349608
+ return;
349609
+ if (delay2) {
349610
+ let timer;
349611
+ try {
349612
+ const pause = new Promise((resolve38) => {
349613
+ timer = setTimeout(resolve38, delay2);
349614
+ });
349615
+ await (request.signal ? this.abortable(pause, request.signal) : pause);
349616
+ } finally {
349617
+ clearTimeout(timer);
349618
+ }
349619
+ this.fence(request);
349620
+ continue;
349621
+ }
349622
+ waiting.delete(key);
349623
+ attempts.set(key, (attempts.get(key) ?? 0) + 1);
349624
+ yield candidate;
349625
+ defer(candidate);
349626
+ }
349521
349627
  }
349522
- async *candidates(request, deadline) {
349628
+ async *candidates(request, deadline, includeCooling = false) {
349523
349629
  let count2 = 0;
349524
349630
  const seen = /* @__PURE__ */ new Set();
349525
349631
  for (const profile3 of this.policy.providers) {
@@ -349538,7 +349644,7 @@ var RemoteInferenceFallback = class _RemoteInferenceFallback {
349538
349644
  profile: profile3
349539
349645
  };
349540
349646
  const key = routeKey(route);
349541
- if (!seen.has(key) && this.compatible(request, route)) {
349647
+ if (!seen.has(key) && this.compatible(request, route, includeCooling)) {
349542
349648
  seen.add(key);
349543
349649
  yield route;
349544
349650
  if (++count2 >= MAX_ROUTES2 || this.now() >= deadline)
@@ -349578,7 +349684,7 @@ var RemoteInferenceFallback = class _RemoteInferenceFallback {
349578
349684
  keyless: provider,
349579
349685
  ...provider.anonymousAuthorization === "Bearer unused" ? { apiKey: "unused" } : {}
349580
349686
  };
349581
- if (seen.has(routeKey(route)) || !this.compatible(request, route))
349687
+ if (seen.has(routeKey(route)) || !this.compatible(request, route, includeCooling))
349582
349688
  continue;
349583
349689
  seen.add(routeKey(route));
349584
349690
  try {
@@ -349609,7 +349715,7 @@ var RemoteInferenceFallback = class _RemoteInferenceFallback {
349609
349715
  if (Array.isArray(selected.supported_parameters) && request.tools.length && !selected.supported_parameters.includes("tools"))
349610
349716
  continue;
349611
349717
  }
349612
- if (!route.model || !this.compatible(request, route))
349718
+ if (!route.model || !this.compatible(request, route, includeCooling))
349613
349719
  continue;
349614
349720
  const actualKey = routeKey(route);
349615
349721
  if (actualKey !== `${new URL(route.baseUrl).origin}\0${provider.model}` && seen.has(actualKey))
@@ -388269,7 +388375,7 @@ ${read.content}`;
388269
388375
  throw new Error("interruption_stale_model_dispatch");
388270
388376
  };
388271
388377
  assertCurrent();
388272
- const needsRouteHooks = typeof backend.canUseRemoteFallback === "function" || typeof this.backend.canUseRemoteFallback === "function" || outbound.assertCurrentAtDispatch !== void 0 || outbound.onInferenceRoute !== void 0;
388378
+ const needsRouteHooks = typeof backend.canUseRemoteFallback === "function" || typeof this.backend.canUseRemoteFallback === "function" || outbound.assertCurrentAtDispatch !== void 0 || outbound.onInferenceRoute !== void 0 || outbound.onInferenceRouteLifecycle !== void 0;
388273
388379
  const dispatchRequest = needsRouteHooks ? {
388274
388380
  ...outbound,
388275
388381
  assertCurrentAtDispatch: assertCurrent,
@@ -388282,6 +388388,17 @@ ${read.content}`;
388282
388388
  turn: operation.turn,
388283
388389
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
388284
388390
  });
388391
+ },
388392
+ onInferenceRouteLifecycle: (receipt) => {
388393
+ assertCurrent();
388394
+ outbound.onInferenceRouteLifecycle?.(receipt);
388395
+ this.emit({
388396
+ type: "inference_route",
388397
+ inferenceRoute: receipt,
388398
+ visibility: "telemetry",
388399
+ turn: operation.turn,
388400
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
388401
+ });
388285
388402
  }
388286
388403
  } : outbound;
388287
388404
  const response = await backend.chatCompletion(dispatchRequest);
@@ -421617,11 +421734,22 @@ var OllamaAgenticBackend = class _OllamaAgenticBackend {
421617
421734
  _knownTransportContextCapability;
421618
421735
  _remoteFallback;
421619
421736
  _inferenceFallbackApprovalHandler;
421737
+ _inferenceRouteLifecycleHandler;
421738
+ setInferenceRouteLifecycleHandler(handler) {
421739
+ this._inferenceRouteLifecycleHandler = handler;
421740
+ }
421620
421741
  setInferenceFallbackApprovalHandler(handler) {
421621
421742
  this._inferenceFallbackApprovalHandler = handler;
421622
421743
  }
421623
421744
  remoteFallback() {
421624
- return this._remoteFallback ??= new RemoteInferenceFallback({ baseUrl: this.baseUrl, model: this.model, apiKey: this.apiKey, additionalSecrets: () => this._keyPool }, (route) => new _OllamaAgenticBackend(route.baseUrl, route.model, route.apiKey, false, route.protocol, route.providerId));
421745
+ return this._remoteFallback ??= new RemoteInferenceFallback({
421746
+ baseUrl: this.baseUrl,
421747
+ model: this.model,
421748
+ apiKey: this.apiKey,
421749
+ additionalSecrets: () => this._keyPool,
421750
+ providerId: this._provider.providerId,
421751
+ backendType: this._provider.protocol === "ollama" ? "ollama" : "vllm"
421752
+ }, (route) => new _OllamaAgenticBackend(route.baseUrl, route.model, route.apiKey, false, route.protocol, route.providerId));
421625
421753
  }
421626
421754
  /** Remote endpoints never reserve a GPU on this host. */
421627
421755
  usesLocalGpuAdmission() {
@@ -421641,11 +421769,21 @@ var OllamaAgenticBackend = class _OllamaAgenticBackend {
421641
421769
  requestWithRunSignal(request) {
421642
421770
  const signal = mergeInferenceAbortSignals([request.signal, this._abortSignal]);
421643
421771
  const handler = this._inferenceFallbackApprovalHandler;
421644
- if (!signal && (request.onInferenceFallbackRequired || !handler))
421772
+ const routeHandler = this._inferenceRouteLifecycleHandler;
421773
+ if (!signal && !routeHandler && !request.onInferenceRouteLifecycle && (request.onInferenceFallbackRequired || !handler))
421645
421774
  return request;
421646
421775
  return {
421647
421776
  ...request,
421648
421777
  ...signal ? { signal } : {},
421778
+ ...routeHandler || request.onInferenceRouteLifecycle ? {
421779
+ logicalRequestId: request.logicalRequestId ?? crypto.randomUUID(),
421780
+ onInferenceRouteLifecycle: (receipt) => {
421781
+ signal?.throwIfAborted();
421782
+ request.assertCurrentAtDispatch?.();
421783
+ request.onInferenceRouteLifecycle?.(receipt);
421784
+ routeHandler?.(receipt);
421785
+ }
421786
+ } : {},
421649
421787
  ...request.onInferenceFallbackRequired || !handler ? {} : {
421650
421788
  onInferenceFallbackRequired: (receipt) => handler({ ...receipt, signal })
421651
421789
  }
@@ -421931,7 +422069,8 @@ var OllamaAgenticBackend = class _OllamaAgenticBackend {
421931
422069
  }
421932
422070
  brokerRequestOptions(request, body, signal) {
421933
422071
  const nativeContext = request.numCtx ?? request.num_ctx;
421934
- if (request.providerDefaultOutput === true && request.maxTokens === 16384 && request.contextAdmission !== true && !(Number.isFinite(nativeContext) && (nativeContext ?? 0) > 0) && this._provider.protocol !== "anthropic-messages") {
422072
+ const remoteDefault = request.remoteProviderDefaultOutput === true && request.configuredEndpointOnly === true && this._provider.protocol === "openai-chat";
422073
+ if (request.providerDefaultOutput === true && (remoteDefault || request.maxTokens === 16384 && request.contextAdmission !== true && !(Number.isFinite(nativeContext) && (nativeContext ?? 0) > 0)) && this._provider.protocol !== "anthropic-messages") {
421935
422074
  delete body["max_tokens"];
421936
422075
  const options = body["options"];
421937
422076
  if (options && typeof options === "object" && !Array.isArray(options))
@@ -32454,6 +32454,42 @@
32454
32454
  }
32455
32455
  ]
32456
32456
  },
32457
+ {
32458
+ "id": "guide.work-orders-active-inference-route-remote-probes-20261012",
32459
+ "kind": "guide",
32460
+ "title": "Active Inference Route Remote Probes 20261012",
32461
+ "summary": "Bundled Omnius documentation artifact: docs/work-orders/active-inference-route-remote-probes-20261012.json.",
32462
+ "keywords": [
32463
+ "work",
32464
+ "orders",
32465
+ "active",
32466
+ "inference",
32467
+ "route",
32468
+ "remote",
32469
+ "probes",
32470
+ "20261012",
32471
+ "json"
32472
+ ],
32473
+ "maturity": "internal",
32474
+ "audiences": [
32475
+ "maintainer",
32476
+ "large-context-agent"
32477
+ ],
32478
+ "layer": "documentation",
32479
+ "interfaces": [
32480
+ {
32481
+ "type": "file",
32482
+ "target": "docs/work-orders/active-inference-route-remote-probes-20261012.json"
32483
+ }
32484
+ ],
32485
+ "references": [
32486
+ {
32487
+ "type": "documentation",
32488
+ "target": "docs/work-orders/active-inference-route-remote-probes-20261012.json",
32489
+ "relation": "canonical-artifact"
32490
+ }
32491
+ ]
32492
+ },
32457
32493
  {
32458
32494
  "id": "guide.work-orders-daemon-hud-ui-overhaul",
32459
32495
  "kind": "guide",
@@ -37089,6 +37125,44 @@
37089
37125
  }
37090
37126
  ]
37091
37127
  },
37128
+ {
37129
+ "id": "guide.work-orders-wo-active-inference-route-and-telegram-review-20261012-uppercase",
37130
+ "kind": "guide",
37131
+ "title": "Active inference route and Telegram completion review",
37132
+ "summary": "Status: implementation complete and verified. Publication remains with the user.",
37133
+ "keywords": [
37134
+ "work",
37135
+ "orders",
37136
+ "WO",
37137
+ "active",
37138
+ "inference",
37139
+ "route",
37140
+ "and",
37141
+ "telegram",
37142
+ "review",
37143
+ "20261012",
37144
+ "md"
37145
+ ],
37146
+ "maturity": "internal",
37147
+ "audiences": [
37148
+ "maintainer",
37149
+ "large-context-agent"
37150
+ ],
37151
+ "layer": "documentation",
37152
+ "interfaces": [
37153
+ {
37154
+ "type": "file",
37155
+ "target": "docs/work-orders/WO-active-inference-route-and-telegram-review-20261012.md"
37156
+ }
37157
+ ],
37158
+ "references": [
37159
+ {
37160
+ "type": "documentation",
37161
+ "target": "docs/work-orders/WO-active-inference-route-and-telegram-review-20261012.md",
37162
+ "relation": "canonical-artifact"
37163
+ }
37164
+ ]
37165
+ },
37092
37166
  {
37093
37167
  "id": "guide.work-orders-wo-am-gaps-uppercase",
37094
37168
  "kind": "guide",
@@ -37156,6 +37230,42 @@
37156
37230
  }
37157
37231
  ]
37158
37232
  },
37233
+ {
37234
+ "id": "guide.work-orders-wo-native-transport-fresh-install-20261012-uppercase",
37235
+ "kind": "guide",
37236
+ "title": "Native transport failure in the fresh npm installation gate",
37237
+ "summary": "Status: implemented and verified. Publication remains with the user.",
37238
+ "keywords": [
37239
+ "work",
37240
+ "orders",
37241
+ "WO",
37242
+ "native",
37243
+ "transport",
37244
+ "fresh",
37245
+ "install",
37246
+ "20261012",
37247
+ "md"
37248
+ ],
37249
+ "maturity": "internal",
37250
+ "audiences": [
37251
+ "maintainer",
37252
+ "large-context-agent"
37253
+ ],
37254
+ "layer": "documentation",
37255
+ "interfaces": [
37256
+ {
37257
+ "type": "file",
37258
+ "target": "docs/work-orders/WO-native-transport-fresh-install-20261012.md"
37259
+ }
37260
+ ],
37261
+ "references": [
37262
+ {
37263
+ "type": "documentation",
37264
+ "target": "docs/work-orders/WO-native-transport-fresh-install-20261012.md",
37265
+ "relation": "canonical-artifact"
37266
+ }
37267
+ ]
37268
+ },
37159
37269
  {
37160
37270
  "id": "guide.work-orders-wo-primary-checkout-fallback-delivery-20261012-uppercase",
37161
37271
  "kind": "guide",
@@ -37226,6 +37336,42 @@
37226
37336
  }
37227
37337
  ]
37228
37338
  },
37339
+ {
37340
+ "id": "guide.work-orders-wo-telegram-unavailable-review-presentation-20261012-uppercase",
37341
+ "kind": "guide",
37342
+ "title": "Telegram reply presentation when an auxiliary review is unavailable",
37343
+ "summary": "Status: implemented and verified. Publication and runtime replacement remain with the user.",
37344
+ "keywords": [
37345
+ "work",
37346
+ "orders",
37347
+ "WO",
37348
+ "telegram",
37349
+ "unavailable",
37350
+ "review",
37351
+ "presentation",
37352
+ "20261012",
37353
+ "md"
37354
+ ],
37355
+ "maturity": "internal",
37356
+ "audiences": [
37357
+ "maintainer",
37358
+ "large-context-agent"
37359
+ ],
37360
+ "layer": "documentation",
37361
+ "interfaces": [
37362
+ {
37363
+ "type": "file",
37364
+ "target": "docs/work-orders/WO-telegram-unavailable-review-presentation-20261012.md"
37365
+ }
37366
+ ],
37367
+ "references": [
37368
+ {
37369
+ "type": "documentation",
37370
+ "target": "docs/work-orders/WO-telegram-unavailable-review-presentation-20261012.md",
37371
+ "relation": "canonical-artifact"
37372
+ }
37373
+ ]
37374
+ },
37229
37375
  {
37230
37376
  "id": "guide.work-orders-world-class-memory-compiler-readme-uppercase",
37231
37377
  "kind": "guide",
package/docs/DISCOVERY.md CHANGED
@@ -518,6 +518,7 @@ Daemon equivalents are `GET /v1/discovery/bootstrap`, `GET /v1/discovery?q=<inte
518
518
  | `guide.trajectory-grounding` | Trajectory Grounding | Trajectory Grounding gives a running agent a compact, evidence-bound account of where a project stands, what changed, what remains uncertain, and the safest next action. Before the first main-agent request, Omnius asks the selected model to form a specific, structured orientation from that evidence. This is a control-plane checkpoint, not free-form self-talk |
519
519
  | `guide.vitepress-config` | Config | Bundled Omnius documentation artifact: docs/.vitepress/config.mts. |
520
520
  | `guide.voice-flow-architecture` | Voice TTS Flow — Architecture &amp; Implementation Guide | This document describes the voice synthesis system in omnius: how it's built, how all the pieces connect, and how to add new voice features following the same patterns. |
521
+ | `guide.work-orders-active-inference-route-remote-probes-20261012` | Active Inference Route Remote Probes 20261012 | Bundled Omnius documentation artifact: docs/work-orders/active-inference-route-remote-probes-20261012.json. |
521
522
  | `guide.work-orders-daemon-hud-ui-overhaul` | Daemon HUD UI Overhaul Work Order | Overhaul the daemon web interface using /home/roko/Desktop/hud-ui-style-kit(6)/hud-ui-style-kit as the source of truth. Preserve current daemon behavior while replacing the OpenWebUI-like rounded dashboard styling with the cold tactical HUD visual system. |
522
523
  | `guide.work-orders-hermes-architecture-deltas-01-public-scrutiny-provenance-control-index-uppercase` | Public Scrutiny Provenance Control Index | Bundled Omnius documentation artifact: docs/work-orders/hermes-architecture-deltas/01-public-scrutiny-provenance-control/INDEX.md. |
523
524
  | `guide.work-orders-hermes-architecture-deltas-01-public-scrutiny-provenance-control-workorder-uppercase` | Workorder: Public Scrutiny Provenance Control | Add a public Telegram scrutiny control plane that can elevate completion provenance checks when public accuracy risk rises, without hard-coded scenario phrases or shortcut wording that teaches the model to satisfy the gate without evidence. |
@@ -640,10 +641,13 @@ Daemon equivalents are `GET /v1/discovery/bootstrap`, `GET /v1/discovery?q=<inte
640
641
  | `guide.work-orders-telegram-progress-browser-20261011-wo-04-download-desktop-handoff-uppercase` | WO-04: Acquire browser files and expose desktop save-dialog tools | Status: complete — integrated and verified offline |
641
642
  | `guide.work-orders-telegram-progress-browser-20261011-wo-05-verification-delivery-uppercase` | WO-05: Verify the integrated repair and deliver scoped commits | Status: complete — verified offline and delivered to origin/main |
642
643
  | `guide.work-orders-telegram-reliability-consolidation-2026-09-28` | Telegram Reliability Consolidation — 2026-09-28 | Rule: check a box only after the named behavior is implemented and its listed verification passes. A parent box stays open until every child box is checked. |
644
+ | `guide.work-orders-wo-active-inference-route-and-telegram-review-20261012-uppercase` | Active inference route and Telegram completion review | Status: implementation complete and verified. Publication remains with the user. |
643
645
  | `guide.work-orders-wo-am-gaps-uppercase` | Associative Memory Gap Work Orders | Generated: 2026-04-13 Source: Deep audit of multimodal associative memory systems Status: READY FOR IMPLEMENTATION |
644
646
  | `guide.work-orders-wo-inference-fallback-20261012-uppercase` | Local inference outage fallback | Status: source implementation complete and verified. Installed-runtime activation is separate; the running daemon has not been upgraded or restarted. |
647
+ | `guide.work-orders-wo-native-transport-fresh-install-20261012-uppercase` | Native transport failure in the fresh npm installation gate | Status: implemented and verified. Publication remains with the user. |
645
648
  | `guide.work-orders-wo-primary-checkout-fallback-delivery-20261012-uppercase` | Primary checkout delivery and remote output capacity | Status: implementation complete and verified in the primary checkout. Publication remains with the user. |
646
649
  | `guide.work-orders-wo-telegram-fallback-20261012-uppercase` | Telegram outage fallback and user-selected approval mode | Status: implementation complete; distributable verification recorded below. Publication and runtime installation are reserved for the user. |
650
+ | `guide.work-orders-wo-telegram-unavailable-review-presentation-20261012-uppercase` | Telegram reply presentation when an auxiliary review is unavailable | Status: implemented and verified. Publication and runtime replacement remain with the user. |
647
651
  | `guide.work-orders-world-class-memory-compiler-readme-uppercase` | World-Class Memory Compiler Program | Status: active implementation program Owner: Omnius orchestration and memory packages Last updated: 2026-07-13 |
648
652
  | `guide.work-orders-world-class-memory-compiler-tracker-uppercase` | Memory Compiler Implementation Tracker | Last reconciled: 2026-07-13 Authority: This file is the granular program tracker. The work-order documents define the contract and acceptance criteria; neither test output nor a model claim may check an item without the named evidence. |
649
653
  | `guide.work-orders-world-class-memory-compiler-wo-01-exact-request-budget-uppercase` | WO-01 — Exact Request and Budget Compiler | Status: in progress Primary modules: packages/orchestrator/src/agenticRunner.ts, contextWindowDump.ts, context-compiler.ts, context-fabric.ts Depends on: none |
@@ -0,0 +1,94 @@
1
+ # Active inference route and Telegram completion review
2
+
3
+ Status: implementation complete and verified. Publication remains with the user.
4
+
5
+ ## Observed behavior
6
+
7
+ The installed 1.0.843 runtime contains the repaired fallback bundle. At 23:36
8
+ UTC, Hermes answered Telegram input 3357. A subsequent native goal assessment
9
+ failed through the remote cascade, leaving the greeting with an incomplete-task
10
+ suffix. The TUI header still displayed the configured local model throughout
11
+ remote inference.
12
+
13
+ ## Work orders and acceptance
14
+
15
+ 1. Trace the actual running process and request artifacts. Separate the primary
16
+ reply from completion-review failures; reproduce the observed transport
17
+ incompatibility before repairing it.
18
+ 2. Display the actual selected provider model and Local/Remote location in the
19
+ TUI header for both terminal and Telegram inference. Keep configured local
20
+ credentials, endpoint and model unchanged. Fence stale request callbacks.
21
+ 3. Retry the original local route automatically after its bounded outage
22
+ cooldown on real work. Restore the local display only when local inference
23
+ produces usable output. Do not generate background probe requests.
24
+ 4. Make Telegram completion reviews usable through the remote fallback while
25
+ preserving the complete response schema and host validation. Do not bypass
26
+ evidence or provider acknowledgement checks to declare success.
27
+ 5. Keep request-specific provider incompatibilities from disabling unrelated
28
+ requests. Surface bounded diagnostic classes/statuses without provider error
29
+ bodies, endpoint credentials, environment values or prompt contents.
30
+ 6. Exercise native Telegram greeting and review, route changes, streaming and
31
+ unary recovery, stale owners, cancellation, manual fallback and exhaustion.
32
+ Rebuild and verify the actual publication bundle; commit and push only this
33
+ repair while preserving unrelated working-tree edits.
34
+
35
+ ## Constraints
36
+
37
+ No Telegram messages, local inference or CUDA workloads are required for the
38
+ regressions. Synthetic remote probes may use only public catalog routes and
39
+ non-sensitive fixture text. The user handles npm publication.
40
+
41
+ ## Diagnosis and implemented behavior
42
+
43
+ The original review's per-provider errors were not retained. Synthetic probes
44
+ accepted the exact strict assessment schema. Back-to-back streamed Hermes
45
+ requests reproduced a successful first request followed by an empty HTTP 429
46
+ response with `Retry-After: 1`. The prior code immediately exhausted the cascade
47
+ and imposed a minimum 15-second provider cooldown. The native Telegram
48
+ regression reproduced the incomplete suffix before the repair.
49
+
50
+ Fallback now tries other available compatible routes, then waits for a
51
+ throttled route within the same total request deadline. It honors Retry-After,
52
+ limits each route to three attempts, and retains cancellation, ownership and
53
+ the no-replay boundary after streamed output begins. Non-429 request rejections
54
+ do not suppress unrelated requests. A 429 followed by a deterministic rejection
55
+ does not cause another retry from stale throttle state.
56
+
57
+ LLM7's `default` selector is absent from its model catalog. For keyless routes
58
+ without output/context metadata, a host-only hint selects provider output
59
+ defaults at the actual pinned OpenAI wire boundary. Complete messages, tools
60
+ and response schemas remain intact. Known-capacity routes retain the explicit
61
+ bounded output ceiling. Local request capacity is unchanged.
62
+
63
+ Host route lifecycle receipts contain only model/provider identifiers,
64
+ location, phase, request identity and bounded diagnostic category/status. The
65
+ TUI and Telegram paths deliver these receipts to the header. Local selection
66
+ establishes ownership while retaining an active remote label; usable local
67
+ success restores the local label. The existing non-sliding 15-second local
68
+ cooldown permits recovery on subsequent real work without background generation.
69
+ Explicit configuration changes invalidate older UI handlers. Display observer
70
+ failures cannot discard successful inference or trigger replay.
71
+
72
+ Synthetic probe evidence is recorded in
73
+ `active-inference-route-remote-probes-20261012.json`.
74
+
75
+ ## Verification
76
+
77
+ - All 11 workspace projects passed a clean rebuild and the staging audit.
78
+ - 350 orchestrator checks passed. The CLI run passed 203 checks and exposed an
79
+ obsolete primary-telemetry fixture that also failed on clean `14db5c33`.
80
+ Updating only that fixture to the permitted action profile and one turn
81
+ preserved every assertion and passed, bringing the selected CLI checks to
82
+ 204. No production permission or completion guard was weakened.
83
+ - The actual tarball passed its 528-file audit with zero warnings. An isolated
84
+ installation with lifecycle scripts disabled passed all 12 bundled-backend
85
+ checks: automatic/manual unary and streaming, primary-to-review throttling,
86
+ successful local recovery, and unknown-selector output defaults on the wire.
87
+ HTTP and DNS were mocked throughout these bundled checks.
88
+ - Independent review reproduced and verified the fixes for stale throttle
89
+ eligibility, the actual output-omission gate and display-observer exceptions.
90
+
91
+ The isolated bundle check does not establish a working native installation:
92
+ the user's ordinary fresh-install gate subsequently reported a required
93
+ `node-datachannel` native-build failure. That installer repair is separate work
94
+ and remains necessary before publication.
@@ -0,0 +1,84 @@
1
+ # Native transport failure in the fresh npm installation gate
2
+
3
+ Status: implemented and verified. Publication remains with the user.
4
+
5
+ ## Observed failure
6
+
7
+ The user's publisher packed 1.0.844 and passed the 528-file tarball audit. Its
8
+ ordinary fresh global install then failed in `node-datachannel@0.27.0`: a
9
+ prebuilt download timed out, and the package's fallback `prebuild -r napi`
10
+ crashed with an undefined N-API target and `expected first argument to be an
11
+ array`. The gate requested `--omit=optional` and retained lifecycle scripts.
12
+
13
+ ## Work orders
14
+
15
+ 1. Establish the actual failing dependency path and compare global installation
16
+ with the successful local-prefix dependency projection. Do not assume that
17
+ a different nested version explains this failure.
18
+ 2. Repair the dependency/install boundary without suppressing failures from
19
+ required native dependencies or weakening SQLite startup verification.
20
+ Preserve transport behavior or state any actual unavailable optional
21
+ capability accurately.
22
+ 3. Add a regression for the discovered dependency/install behavior and rerun
23
+ the real fresh-install gate with lifecycle scripts enabled, normal startup
24
+ checks, required SQLite query, library exports and AIWG companion verification.
25
+ 4. Preserve unrelated package and lockfile edits, retain the inference-route
26
+ repair, and deliver a separate scoped, verified commit to the tracked branch.
27
+ 5. Coordinate staging with the user's active publisher. Keep diagnosis probes
28
+ in private prefixes and copy the tarball before testing it, so a rebuild
29
+ cannot replace the artifact under verification.
30
+
31
+ ## Scope constraints
32
+
33
+ No local inference, CUDA workload change, Telegram delivery, global host
34
+ installation, daemon activation or npm publication is required. Lifecycle
35
+ probes must use the existing gate's daemon/wrapper/bootstrap suppression.
36
+
37
+ ## Anchored diagnosis and repair
38
+
39
+ - The sole incoming edge to failing `node-datachannel@0.27.0` belongs to
40
+ `omnius-fabric@0.12.9`. Its optional metadata is already correct.
41
+ - A local-prefix install omits this dependency; a global tarball install on
42
+ npm 11.9.0 installs it despite `--omit=optional`. This matches
43
+ [npm/cli issue 8284](https://github.com/npm/cli/issues/8284). The global
44
+ `--install-links` folder variant and a root dependency override also failed
45
+ to exclude or replace the physical legacy addon in isolated probes.
46
+ - Commit `239dd998` added Fabric as one publish-manifest line, with no code
47
+ integration. Independent source, shipped-bundle, shim and Nexus checks
48
+ found no imports, commands or downstream dependency requiring Fabric.
49
+ Nexus independently uses the newer `node-datachannel@0.33.4` packaging.
50
+ - Remove the unused Fabric dependency, normalize old staging manifests at
51
+ build time, and regenerate the ordinary shrinkwrap. Preserve required
52
+ Nexus and SQLite and the exact global tarball install gate.
53
+ - Audit both staging and packed dependency graphs against stale Fabric and
54
+ legacy native-build entries. Keep Fabric autostart disabled in smoke-test
55
+ environments, alongside Omnius daemon/wrapper/bootstrap suppression.
56
+
57
+ ## Verification
58
+
59
+ - Full workspace rebuild and bundling passed. The packed 1.0.845 artifact
60
+ passed the tarball audit with 529 files and no warnings.
61
+ - The ordinary isolated `npm install -g <tarball> --omit=optional` passed
62
+ twice with lifecycle scripts enabled and compiler commands blocked. CLI
63
+ version, required in-memory SQLite query, library exports, AIWG companion
64
+ version and postinstall PATH guidance all passed. The second pass also
65
+ disabled the companion transcription package's optional Python/model
66
+ bootstrap, keeping model setup outside this compiler-free core check.
67
+ - Physical installation contains no Fabric or legacy `0.27.0` addon; Nexus's
68
+ newer `0.33.4` addon remains installed. No required dependency was made
69
+ optional and the normal global tarball installation was not substituted.
70
+ - All 48 publish-related tests passed, including 19 new dependency graph
71
+ regressions. Both audits share the same validation and retain required
72
+ SQLite checks.
73
+ - All 12 bundled inference fallback scenarios passed against the actual
74
+ lifecycle-installed artifact with mocked HTTP/DNS, no inference requests
75
+ and no Telegram sends.
76
+
77
+ Evidence logs: `/tmp/omnius-native-transport-publish-build.log`,
78
+ `/tmp/omnius-native-transport-tarball-audit.log`,
79
+ `/tmp/omnius-native-transport-fresh-install-final.log`,
80
+ `/tmp/omnius-native-transport-policy-tests.log`, and
81
+ `/tmp/omnius-native-transport-installed-fallback-verification.json`.
82
+ Private prefixes and copied artifacts isolated tests from the user's
83
+ publisher and running services. Release version and unrelated lockfile
84
+ metadata changes remain owned by the user.
@@ -0,0 +1,88 @@
1
+ # Telegram reply presentation when an auxiliary review is unavailable
2
+
3
+ Status: implemented and verified. Publication and runtime replacement remain
4
+ with the user.
5
+
6
+ ## Live incident
7
+
8
+ The user's 17:08 PDT `quick ping!` received `pong`, followed by an incorrect
9
+ generic assertion that the task remained incomplete. This was the repaired
10
+ 1.0.845 runtime, PID 2042875 started at 17:05:34 PDT, not stale code. Its
11
+ bundle SHA256 was
12
+ `a9cbdc655c3f3be3c254f09caaa9149c8677cb9858cb12940142e24dc9eb514e`.
13
+
14
+ Input 3360, update 666870213, runner `telegram:a0e3cbd0c36f1126`, finalization
15
+ `telegram-64ac9937dc7647a8-1791850093839-1` and conversation event line 1905
16
+ anchor the trace. The final text was acknowledged at 17:08:48 PDT. The
17
+ auxiliary native goal assessment was `unavailable`, not `incomplete`.
18
+ User-visible telemetry recorded local HTTP 503, LLM7 HTTP 429 and OVH empty
19
+ response. Detailed review errors were emitted to the live TUI, not retained
20
+ in the finalization's generic unavailable assessment.
21
+
22
+ The runner's earlier `incomplete_verification` receipt was awaiting the
23
+ visible-response provider acknowledgement. It did not demonstrate unfinished
24
+ work. The bridge appended the failure sentence for every assessment that
25
+ was not ready, conflating review transport failure with a negative verdict.
26
+
27
+ ## Work orders
28
+
29
+ 1. Exclude only unavailable auxiliary reviews from the generic incomplete
30
+ suffix when the current runner has not declared a partial answer. Keep
31
+ actual partial, incomplete and uncertain verdict behavior intact.
32
+ 2. Preserve current owner, input, epoch, steering, exact candidate and
33
+ physical evidence checks before sending useful text despite an unavailable
34
+ review. No failed or stale review grants completion or delivery authority.
35
+ 3. Preserve the unavailable assessment, retained goal and real receipts;
36
+ do not forge fulfillment, consume unresolved work, or automatically replay
37
+ object actions after the provider acknowledges the visible reply.
38
+ 4. Exercise real runner-to-delivery fixtures for ping, transport failure,
39
+ empty/truncated assessment, useful completed read work, genuine partial
40
+ work and stale owner/candidate/steering bindings. Include public native
41
+ replies as well as admin DMs.
42
+ 5. Rebuild all workspace packages, audit the actual artifact and deliver a
43
+ scoped verified commit to the tracked branch. Preserve unrelated bridge
44
+ edits and user-owned release versions. Publication remains with the user.
45
+
46
+ No greeting classifier, model assertion of external effects, live inference,
47
+ Telegram test sends, service restart or CUDA workload change is required.
48
+
49
+ ## Result and verification
50
+
51
+ Unavailable reviews no longer append the incomplete-task sentence to useful
52
+ current replies. Genuine partial answers and negative/uncertain verdicts
53
+ retain their existing reporting. The unavailable review and retained goal
54
+ remain unresolved internally; no new completion authority or automatic
55
+ object-work replay is created. Delivery additionally checks the unavailable
56
+ assessment's exact candidate, steering and physical evidence bindings.
57
+
58
+ - All 62 tests across private native closeout, private runner and public
59
+ runner suites passed. Cases include exact `pong` after HTTP 503, empty or
60
+ truncated auxiliary output, useful completed read work, genuine partial
61
+ file work, failed provider acknowledgement and stale owner/epoch/generation,
62
+ candidate and steering bindings.
63
+ - Broader native core, steering, initial-instruction, update adoption,
64
+ remote fallback and delivery checks passed 112 of 114 cases. The two panel
65
+ label assertions at update-adoption test lines 234 and 300 also fail on
66
+ clean prior commit `14db5c33`, before completion runs. Their test and panel
67
+ logic are unchanged; they are recorded as existing failures, not relaxed.
68
+ - All four bundle-policy tests passed, including rejection of the earlier
69
+ fallback bundle that lacked this unavailable-review repair.
70
+ - The full workspace rebuild, bundle audit and 530-file tarball audit passed.
71
+ The exact global tarball installation passed with lifecycle scripts enabled
72
+ and compilers blocked, including SQLite, CLI version, library exports,
73
+ AIWG companion and PATH guidance checks.
74
+ - All 12 mocked inference scenarios passed against the actual installed
75
+ bundle. Runtime bundle SHA256:
76
+ `f568a8a54e037eb22f21193f7f589f8769b6b94369c0e9dfa7446ca6e8a5f87b`.
77
+
78
+ Evidence logs: `/tmp/omnius-native-goal-review-closeout-tests-20261012.log`,
79
+ `/tmp/omnius-unavailable-review-integration.log`,
80
+ `/tmp/omnius-native-update-adoption-baseline-14db.log`,
81
+ `/tmp/omnius-unavailable-review-bundle-policy-tests.log`,
82
+ `/tmp/omnius-unavailable-review-publish-build.log`,
83
+ `/tmp/omnius-unavailable-review-tarball-audit.log`,
84
+ `/tmp/omnius-unavailable-review-fresh-install.log` and
85
+ `/tmp/omnius-unavailable-review-installed-verification.json`.
86
+
87
+ The live bot's earlier 1.0.845 process has not been replaced by these tests.
88
+ Its next user-owned publish/update and restart must load the rebuilt code.
@@ -0,0 +1,34 @@
1
+ {
2
+ "schema": "omnius.inference-route-incident-evidence.v1",
3
+ "date": "2026-10-12",
4
+ "installedVersion": "1.0.843",
5
+ "installedBundleSha256": "1c020e46538ba5a79d1d2b7586f2f8922b0f4bab36354bd878b49939461d8d9b",
6
+ "incident": {
7
+ "inputMessageId": 3357,
8
+ "runId": "telegram:e6eb632a9f3e0acd",
9
+ "primaryFallbackProvider": "hermes",
10
+ "primaryFallbackSucceededAt": "2026-10-12T23:36:17.680Z",
11
+ "nativeGoalAssessment": "unavailable",
12
+ "originalProviderFailureBodiesAvailable": false
13
+ },
14
+ "syntheticRemoteProbes": [
15
+ { "provider": "hermes", "transport": "unary", "format": "exact native assessment schema", "status": 200, "conformingJson": true },
16
+ { "provider": "hermes", "transport": "stream", "format": "exact native assessment schema", "status": 200, "sseFrames": 43, "done": true },
17
+ { "provider": "hermes", "transport": "stream", "timing": "immediately after successful identical request", "status": 429, "retryAfterSeconds": 1, "emptyBody": true },
18
+ { "provider": "llm7", "transport": "stream", "format": "small strict schema", "status": 200, "visibleContent": true, "done": true },
19
+ { "provider": "ovh_ai_endpoints", "transport": "stream", "format": "small strict schema", "status": 200, "visibleContent": false, "done": true, "outputCeiling": 128 }
20
+ ],
21
+ "catalogs": {
22
+ "hermes": { "model": "turboderp/Qwen3.8-27B-exl3", "max_model_len": 65536 },
23
+ "llm7": { "modelCount": 65, "selector": "default", "selectorPresentInCatalog": false },
24
+ "ovh_ai_endpoints": { "model": "gpt-oss-20b", "context_length": 131072, "max_completion_tokens": 131072 }
25
+ },
26
+ "limits": [
27
+ "The original review's per-provider HTTP errors were not durably retained; the throttling probe reproduces a concrete failure path without proving every original provider error.",
28
+ "The OVH probe used an intentionally small output ceiling and does not establish failure with a normal output allowance."
29
+ ],
30
+ "userContextSentByProbes": false,
31
+ "credentialsSentByProbes": false,
32
+ "localInferenceRequests": 0,
33
+ "telegramMessagesSent": 0
34
+ }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.843",
3
+ "version": "1.0.846",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omnius",
9
- "version": "1.0.843",
9
+ "version": "1.0.846",
10
10
  "bundleDependencies": [
11
11
  "image-to-ascii"
12
12
  ],
@@ -18,7 +18,6 @@
18
18
  "ignore": "^7.0.5",
19
19
  "image-to-ascii": "file:vendor/image-to-ascii",
20
20
  "nats.ws": "1.30.3",
21
- "omnius-fabric": "^0.12.8",
22
21
  "open-agents-nexus": "1.17.3",
23
22
  "ws": "^8.20.0",
24
23
  "zod": "^4.4.3"
@@ -430,15 +429,6 @@
430
429
  "uint8arrays": "^5.1.0"
431
430
  }
432
431
  },
433
- "node_modules/@helia/utils/node_modules/cborg": {
434
- "version": "5.1.11",
435
- "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.11.tgz",
436
- "integrity": "sha512-oc6Pzg/gkTobxHZNgMmny+G99dOeBMbAmnGHcZWMKtolxZBIVwfi0Pj0khxEtNU8HMFdbT5sK0HmtgecDUPP0A==",
437
- "license": "Apache-2.0",
438
- "bin": {
439
- "cborg": "lib/bin.js"
440
- }
441
- },
442
432
  "node_modules/@ipld/dag-cbor": {
443
433
  "version": "9.2.7",
444
434
  "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.2.7.tgz",
@@ -449,15 +439,6 @@
449
439
  "multiformats": "^13.1.0"
450
440
  }
451
441
  },
452
- "node_modules/@ipld/dag-cbor/node_modules/cborg": {
453
- "version": "5.1.11",
454
- "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.11.tgz",
455
- "integrity": "sha512-oc6Pzg/gkTobxHZNgMmny+G99dOeBMbAmnGHcZWMKtolxZBIVwfi0Pj0khxEtNU8HMFdbT5sK0HmtgecDUPP0A==",
456
- "license": "Apache-2.0",
457
- "bin": {
458
- "cborg": "lib/bin.js"
459
- }
460
- },
461
442
  "node_modules/@ipld/dag-json": {
462
443
  "version": "10.2.9",
463
444
  "resolved": "https://registry.npmjs.org/@ipld/dag-json/-/dag-json-10.2.9.tgz",
@@ -468,15 +449,6 @@
468
449
  "multiformats": "^13.1.0"
469
450
  }
470
451
  },
471
- "node_modules/@ipld/dag-json/node_modules/cborg": {
472
- "version": "5.1.11",
473
- "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.11.tgz",
474
- "integrity": "sha512-oc6Pzg/gkTobxHZNgMmny+G99dOeBMbAmnGHcZWMKtolxZBIVwfi0Pj0khxEtNU8HMFdbT5sK0HmtgecDUPP0A==",
475
- "license": "Apache-2.0",
476
- "bin": {
477
- "cborg": "lib/bin.js"
478
- }
479
- },
480
452
  "node_modules/@ipld/dag-pb": {
481
453
  "version": "4.2.0",
482
454
  "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.2.0.tgz",
@@ -1399,6 +1371,15 @@
1399
1371
  "uint8arrays": "^5.1.0"
1400
1372
  }
1401
1373
  },
1374
+ "node_modules/@libp2p/utils/node_modules/cborg": {
1375
+ "version": "4.5.8",
1376
+ "resolved": "https://registry.npmjs.org/cborg/-/cborg-4.5.8.tgz",
1377
+ "integrity": "sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==",
1378
+ "license": "Apache-2.0",
1379
+ "bin": {
1380
+ "cborg": "lib/bin.js"
1381
+ }
1382
+ },
1402
1383
  "node_modules/@libp2p/webrtc": {
1403
1384
  "version": "6.1.0",
1404
1385
  "resolved": "https://registry.npmjs.org/@libp2p/webrtc/-/webrtc-6.1.0.tgz",
@@ -1489,29 +1470,6 @@
1489
1470
  "integrity": "sha512-vbIm83F2yZ1pWJGS0yl0ysracIvv56LtbrIyiIQHoLdYDJOMoLfVFsXhh9DUH4SFdkdkFhucyWniihsNzVEjkQ==",
1490
1471
  "license": "Apache-2.0 OR MIT"
1491
1472
  },
1492
- "node_modules/@libp2p/webrtc/node_modules/node-datachannel": {
1493
- "version": "0.33.4",
1494
- "resolved": "https://registry.npmjs.org/node-datachannel/-/node-datachannel-0.33.4.tgz",
1495
- "integrity": "sha512-qiUrdh8vY9XhglEnx91HK0N2JEAAu8qTZl0fcR3yQd0fFrdO39NwDeJD/KpG+WKUb9/o4p2UwnP+/HftA/xMbQ==",
1496
- "license": "MPL 2.0",
1497
- "dependencies": {
1498
- "detect-libc": "^2.0.4"
1499
- },
1500
- "engines": {
1501
- "node": ">=18.20.0"
1502
- },
1503
- "optionalDependencies": {
1504
- "@node-datachannel/android-arm64": "0.33.4",
1505
- "@node-datachannel/darwin-arm64": "0.33.4",
1506
- "@node-datachannel/darwin-x64": "0.33.4",
1507
- "@node-datachannel/linux-arm64-gnu": "0.33.4",
1508
- "@node-datachannel/linux-arm64-musl": "0.33.4",
1509
- "@node-datachannel/linux-x64-gnu": "0.33.4",
1510
- "@node-datachannel/linux-x64-musl": "0.33.4",
1511
- "@node-datachannel/win32-arm64-msvc": "0.33.4",
1512
- "@node-datachannel/win32-x64-msvc": "0.33.4"
1513
- }
1514
- },
1515
1473
  "node_modules/@libp2p/webrtc/node_modules/protons-runtime": {
1516
1474
  "version": "7.1.2",
1517
1475
  "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-7.1.2.tgz",
@@ -1698,51 +1656,6 @@
1698
1656
  "is-ip": "^5.0.0"
1699
1657
  }
1700
1658
  },
1701
- "node_modules/@nats-io/nats-core": {
1702
- "version": "3.4.0",
1703
- "resolved": "https://registry.npmjs.org/@nats-io/nats-core/-/nats-core-3.4.0.tgz",
1704
- "integrity": "sha512-QMDM86EUNm+wudlKC67HLar/KHHQUvJGLfb4jbahje3pUk3K9afeck9fwsxBZF0eUFox6T/TA6m/t+lQqf+QsQ==",
1705
- "license": "Apache-2.0",
1706
- "dependencies": {
1707
- "@nats-io/nkeys": "2.0.3",
1708
- "@nats-io/nuid": "3.0.0"
1709
- }
1710
- },
1711
- "node_modules/@nats-io/nkeys": {
1712
- "version": "2.0.3",
1713
- "resolved": "https://registry.npmjs.org/@nats-io/nkeys/-/nkeys-2.0.3.tgz",
1714
- "integrity": "sha512-JVt56GuE6Z89KUkI4TXUbSI9fmIfAmk6PMPknijmuL72GcD+UgIomTcRWiNvvJKxA01sBbmIPStqJs5cMRBC3A==",
1715
- "license": "Apache-2.0",
1716
- "dependencies": {
1717
- "tweetnacl": "^1.0.3"
1718
- },
1719
- "engines": {
1720
- "node": ">=18.0.0"
1721
- }
1722
- },
1723
- "node_modules/@nats-io/nuid": {
1724
- "version": "3.0.0",
1725
- "resolved": "https://registry.npmjs.org/@nats-io/nuid/-/nuid-3.0.0.tgz",
1726
- "integrity": "sha512-QbXZDrxmYlrn5AD06gYcUTmEHwxn96HBQMIk7XTjDlEcx6FPzVBBPjp4AMRh1lEv6B4iJ6Xb/Uz61JugPXFRQg==",
1727
- "license": "Apache-2.0",
1728
- "engines": {
1729
- "node": ">= 22.x"
1730
- }
1731
- },
1732
- "node_modules/@nats-io/transport-node": {
1733
- "version": "3.4.0",
1734
- "resolved": "https://registry.npmjs.org/@nats-io/transport-node/-/transport-node-3.4.0.tgz",
1735
- "integrity": "sha512-hH7u7ejIBTFEJIZ8rIcMrHJI6wl+HhpO5sVFs1+ppmXa8RuB2+Lh1+UwTzZ5xTNNm1TKcRkYy+2qCV56qp8RxA==",
1736
- "license": "Apache-2.0",
1737
- "dependencies": {
1738
- "@nats-io/nats-core": "3.4.0",
1739
- "@nats-io/nkeys": "2.0.3",
1740
- "@nats-io/nuid": "3.0.0"
1741
- },
1742
- "engines": {
1743
- "node": ">= 18.0.0"
1744
- }
1745
- },
1746
1659
  "node_modules/@nkn/ncp": {
1747
1660
  "version": "1.1.2",
1748
1661
  "resolved": "https://registry.npmjs.org/@nkn/ncp/-/ncp-1.1.2.tgz",
@@ -2871,9 +2784,9 @@
2871
2784
  }
2872
2785
  },
2873
2786
  "node_modules/cborg": {
2874
- "version": "4.5.8",
2875
- "resolved": "https://registry.npmjs.org/cborg/-/cborg-4.5.8.tgz",
2876
- "integrity": "sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==",
2787
+ "version": "5.1.11",
2788
+ "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.11.tgz",
2789
+ "integrity": "sha512-oc6Pzg/gkTobxHZNgMmny+G99dOeBMbAmnGHcZWMKtolxZBIVwfi0Pj0khxEtNU8HMFdbT5sK0HmtgecDUPP0A==",
2877
2790
  "license": "Apache-2.0",
2878
2791
  "bin": {
2879
2792
  "cborg": "lib/bin.js"
@@ -3008,15 +2921,6 @@
3008
2921
  "node": ">= 0.8"
3009
2922
  }
3010
2923
  },
3011
- "node_modules/commander": {
3012
- "version": "14.0.3",
3013
- "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz",
3014
- "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==",
3015
- "license": "MIT",
3016
- "engines": {
3017
- "node": ">=20"
3018
- }
3019
- },
3020
2924
  "node_modules/convert-hrtime": {
3021
2925
  "version": "5.0.0",
3022
2926
  "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz",
@@ -3944,15 +3848,6 @@
3944
3848
  "uint8arrays": "^5.1.0"
3945
3849
  }
3946
3850
  },
3947
- "node_modules/ipns/node_modules/cborg": {
3948
- "version": "5.1.11",
3949
- "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.11.tgz",
3950
- "integrity": "sha512-oc6Pzg/gkTobxHZNgMmny+G99dOeBMbAmnGHcZWMKtolxZBIVwfi0Pj0khxEtNU8HMFdbT5sK0HmtgecDUPP0A==",
3951
- "license": "Apache-2.0",
3952
- "bin": {
3953
- "cborg": "lib/bin.js"
3954
- }
3955
- },
3956
3851
  "node_modules/ipns/node_modules/protons-runtime": {
3957
3852
  "version": "6.0.2",
3958
3853
  "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-6.0.2.tgz",
@@ -4470,12 +4365,6 @@
4470
4365
  "graceful-fs": "^4.1.6"
4471
4366
  }
4472
4367
  },
4473
- "node_modules/jsqr": {
4474
- "version": "1.4.0",
4475
- "resolved": "https://registry.npmjs.org/jsqr/-/jsqr-1.4.0.tgz",
4476
- "integrity": "sha512-dxLob7q65Xg2DvstYkRpkYtmKm2sPJ9oFhrhmudT1dZvNFFTlroai3AWSpLey/w5vMcLBXRgOJsbXpdN9HzU/A==",
4477
- "license": "Apache-2.0"
4478
- },
4479
4368
  "node_modules/kuler": {
4480
4369
  "version": "2.0.0",
4481
4370
  "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
@@ -4912,17 +4801,26 @@
4912
4801
  "optional": true
4913
4802
  },
4914
4803
  "node_modules/node-datachannel": {
4915
- "version": "0.27.0",
4916
- "resolved": "https://registry.npmjs.org/node-datachannel/-/node-datachannel-0.27.0.tgz",
4917
- "integrity": "sha512-RuClwcfRYJn0YqosgkAdocEM78jo7F3z9hSZzUiogB7QegD28mFOOjMoX/CAbU4ckHaLAoppfROwZXMro/EmNA==",
4918
- "hasInstallScript": true,
4804
+ "version": "0.33.4",
4805
+ "resolved": "https://registry.npmjs.org/node-datachannel/-/node-datachannel-0.33.4.tgz",
4806
+ "integrity": "sha512-qiUrdh8vY9XhglEnx91HK0N2JEAAu8qTZl0fcR3yQd0fFrdO39NwDeJD/KpG+WKUb9/o4p2UwnP+/HftA/xMbQ==",
4919
4807
  "license": "MPL 2.0",
4920
- "optional": true,
4921
4808
  "dependencies": {
4922
- "prebuild-install": "^7.1.3"
4809
+ "detect-libc": "^2.0.4"
4923
4810
  },
4924
4811
  "engines": {
4925
4812
  "node": ">=18.20.0"
4813
+ },
4814
+ "optionalDependencies": {
4815
+ "@node-datachannel/android-arm64": "0.33.4",
4816
+ "@node-datachannel/darwin-arm64": "0.33.4",
4817
+ "@node-datachannel/darwin-x64": "0.33.4",
4818
+ "@node-datachannel/linux-arm64-gnu": "0.33.4",
4819
+ "@node-datachannel/linux-arm64-musl": "0.33.4",
4820
+ "@node-datachannel/linux-x64-gnu": "0.33.4",
4821
+ "@node-datachannel/linux-x64-musl": "0.33.4",
4822
+ "@node-datachannel/win32-arm64-msvc": "0.33.4",
4823
+ "@node-datachannel/win32-x64-msvc": "0.33.4"
4926
4824
  }
4927
4825
  },
4928
4826
  "node_modules/node-fetch": {
@@ -4975,51 +4873,6 @@
4975
4873
  "node": ">=0.10.0"
4976
4874
  }
4977
4875
  },
4978
- "node_modules/omnius-fabric": {
4979
- "version": "0.12.9",
4980
- "resolved": "https://registry.npmjs.org/omnius-fabric/-/omnius-fabric-0.12.9.tgz",
4981
- "integrity": "sha512-A5nngGmYmajoQpBoQ0gBzc2vxsec3rXGoPJ430aQJeqy+cgfPjLM8bfzyO7p/Nfj9Mb8FPlg30F0tLk+w3aonQ==",
4982
- "hasInstallScript": true,
4983
- "license": "MIT",
4984
- "dependencies": {
4985
- "@chainsafe/libp2p-noise": "^17.0.0",
4986
- "@chainsafe/libp2p-yamux": "^8.0.1",
4987
- "@libp2p/autonat": "^3.0.20",
4988
- "@libp2p/bootstrap": "^12.0.22",
4989
- "@libp2p/circuit-relay-v2": "^4.2.5",
4990
- "@libp2p/crypto": "^5.1.18",
4991
- "@libp2p/dcutr": "^3.0.20",
4992
- "@libp2p/gossipsub": "^15.0.23",
4993
- "@libp2p/identify": "^4.1.6",
4994
- "@libp2p/kad-dht": "^16.3.0",
4995
- "@libp2p/mdns": "^12.0.22",
4996
- "@libp2p/peer-id": "^6.0.9",
4997
- "@libp2p/ping": "^3.1.5",
4998
- "@libp2p/pubsub-peer-discovery": "^12.0.0",
4999
- "@libp2p/tcp": "^11.0.20",
5000
- "@libp2p/upnp-nat": "^4.0.20",
5001
- "@libp2p/websockets": "^10.1.13",
5002
- "@multiformats/multiaddr": "^13.0.3",
5003
- "@nats-io/transport-node": "^3.4.0",
5004
- "commander": "^14.0.0",
5005
- "jsqr": "^1.4.0",
5006
- "libp2p": "^3.3.1",
5007
- "nkn-sdk": "^1.3.6",
5008
- "qrcode-terminal": "^0.12.0",
5009
- "ws": "^8.18.0"
5010
- },
5011
- "bin": {
5012
- "fabric": "dist/cli.js",
5013
- "omnius-fabric": "dist/cli.js"
5014
- },
5015
- "engines": {
5016
- "node": ">=20.10.0"
5017
- },
5018
- "optionalDependencies": {
5019
- "@achingbrain/nat-port-mapper": "^4.0.5",
5020
- "node-datachannel": "^0.27.0"
5021
- }
5022
- },
5023
4876
  "node_modules/once": {
5024
4877
  "version": "1.4.0",
5025
4878
  "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -5384,14 +5237,6 @@
5384
5237
  "node": ">=16.0.0"
5385
5238
  }
5386
5239
  },
5387
- "node_modules/qrcode-terminal": {
5388
- "version": "0.12.0",
5389
- "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz",
5390
- "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==",
5391
- "bin": {
5392
- "qrcode-terminal": "bin/qrcode-terminal.js"
5393
- }
5394
- },
5395
5240
  "node_modules/queue-microtask": {
5396
5241
  "version": "1.2.3",
5397
5242
  "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.843",
3
+ "version": "1.0.846",
4
4
  "description": "AI coding agent powered by open-source models (Ollama/vLLM) — interactive TUI with agentic tool-calling loop",
5
5
  "type": "module",
6
6
  "main": "./dist/library.js",
@@ -105,7 +105,6 @@
105
105
  },
106
106
  "dependencies": {
107
107
  "better-sqlite3": "^12.10.0",
108
- "omnius-fabric": "^0.12.8",
109
108
  "glob": "^13.0.6",
110
109
  "ignore": "^7.0.5",
111
110
  "image-to-ascii": "file:vendor/image-to-ascii",