oasis_test_v2 2.2.97 → 2.2.98

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 (2) hide show
  1. package/dist/index.js +33 -12
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -5838,7 +5838,7 @@ var init_binary = __esm({
5838
5838
  async function listModels(runtime, executablePath) {
5839
5839
  switch (runtime) {
5840
5840
  case "claude-code":
5841
- return discoverClaudeCatalog(executablePath);
5841
+ return withFallback(runtime, executablePath, () => discoverClaudeModels(executablePath), claudeStaticModels);
5842
5842
  case "codex":
5843
5843
  return discoverCodexCatalog(executablePath);
5844
5844
  case "gemini":
@@ -5924,13 +5924,6 @@ async function cachedDiscovery(key2, fn) {
5924
5924
  if (models.length > 0) modelCache.set(key2, { models, expiresAt: now + CACHE_TTL_MS });
5925
5925
  return models;
5926
5926
  }
5927
- async function discoverClaudeCatalog(bin) {
5928
- const models = await cachedDiscovery(discoveryCacheKey("claude-code", bin), () => discoverClaudeModels(bin));
5929
- if (models.length === 0) return claudeStaticModels();
5930
- if (models.some((m2) => m2.provider === "custom")) return models;
5931
- const present = new Set(models.map((m2) => m2.id));
5932
- return [...models, ...claudeStaticModels().filter((m2) => !present.has(m2.id))];
5933
- }
5934
5927
  async function withFallback(runtime, executablePath, discover, fallback) {
5935
5928
  const models = await cachedDiscovery(discoveryCacheKey(runtime, executablePath), discover);
5936
5929
  return models.length > 0 ? models : fallback();
@@ -230730,6 +230723,8 @@ var init_daemon_hub = __esm({
230730
230723
  frameWatermark = /* @__PURE__ */ new Map();
230731
230724
  /** 每 dispatch 上次回 ackSeq 的时刻——把流式期间的回执节流到 ~250ms 一次。 */
230732
230725
  lastAckSeqAt = /* @__PURE__ */ new Map();
230726
+ /** 收尾后那 60 秒延迟清理的定时器(换机器重派时要撤掉,否则会在新会话跑到一半时把它的帧号状态清掉)。 */
230727
+ frameCleanupTimers = /* @__PURE__ */ new Map();
230733
230728
  /**
230734
230729
  * 「这次派发归谁管、现在什么状态」的认领口。**必须由 hub 汇总,不能各 adapter 自己判**——
230735
230730
  * serve 里同时有两个 DaemonHubAdapter(chat 一个、dispatch 一个),一次派发只属于其中一个。
@@ -231084,14 +231079,36 @@ var init_daemon_hub = __esm({
231084
231079
  this.lastAckSeqAt.set(dispatchId, now);
231085
231080
  ws.send(JSON.stringify({ type: "ack", dispatchId, ackSeq: this.frameWatermark.get(dispatchId) ?? 0 }));
231086
231081
  }
231082
+ /**
231083
+ * 同一把派发键**换了一台机器重派**(Bug 0279 的换候选重试)时,清掉这把键的帧号状态。
231084
+ *
231085
+ * 帧号是按会话进程编的:新机器上的新进程从 1 重新编。不清的话,上一个进程留下的水位(收尾后还要
231086
+ * 保留 60 秒)会把新进程的帧**全部当成重复帧丢掉**,连收尾帧都到不了,这一轮就一直挂着
231087
+ * (2026-09-29 v2 run chat-run:d27ff875:第二台 1.3 秒就退出了,服务端一帧都没收到)。
231088
+ * 旧进程这时已经退出或被判死;它若还有迟到的帧,由认领那一步按机器对不上直接驱逐。
231089
+ */
231090
+ resetSessionFrameState(dispatchId) {
231091
+ const pending = this.frameCleanupTimers.get(dispatchId);
231092
+ if (pending) {
231093
+ clearTimeout(pending);
231094
+ this.frameCleanupTimers.delete(dispatchId);
231095
+ }
231096
+ this.frameSeqSupported.delete(dispatchId);
231097
+ this.frameWatermark.delete(dispatchId);
231098
+ this.lastAckSeqAt.delete(dispatchId);
231099
+ }
231087
231100
  /** `session_exited` 后延迟清帧号状态:给重连重放的收尾帧留一个去重窗口,之后回收避免无界增长。 */
231088
231101
  scheduleFrameStateCleanup(dispatchId) {
231102
+ const prior = this.frameCleanupTimers.get(dispatchId);
231103
+ if (prior) clearTimeout(prior);
231089
231104
  const t = setTimeout(() => {
231105
+ this.frameCleanupTimers.delete(dispatchId);
231090
231106
  this.frameSeqSupported.delete(dispatchId);
231091
231107
  this.frameWatermark.delete(dispatchId);
231092
231108
  this.lastAckSeqAt.delete(dispatchId);
231093
231109
  }, 6e4);
231094
231110
  t.unref?.();
231111
+ this.frameCleanupTimers.set(dispatchId, t);
231095
231112
  }
231096
231113
  /**
231097
231114
  * 注册一个认领判断。返回:
@@ -259448,7 +259465,7 @@ var init_daemon_adapter = __esm({
259448
259465
  appendWaiters: []
259449
259466
  };
259450
259467
  this.pending.set(dispatchId, entry);
259451
- this.settledDispatchIds.delete(dispatchId);
259468
+ if (this.settledDispatchIds.delete(dispatchId)) this.hub.resetSessionFrameState?.(dispatchId);
259452
259469
  const sessionAuth = this.sessionAuth ? { ...this.sessionAuth.issue({ nodeId, dispatchId }), gatewayUrl: this.sessionAuth.gatewayUrl } : void 0;
259453
259470
  let sent;
259454
259471
  try {
@@ -289503,7 +289520,7 @@ async function startServe(opts) {
289503
289520
  if (isDeletedActor(dispatchTarget)) {
289504
289521
  throw new ApiError(409, ACTOR_DELETED_ERROR_CODE, ACTOR_DELETED_CHAT_MESSAGE);
289505
289522
  }
289506
- const runtimeSessionId = sessionId ?? (requestDispatchId ? deterministicUuid(`chat-runtime:${requestDispatchId}`) : (0, import_node_crypto92.randomUUID)());
289523
+ const runtimeSessionId = sessionId ?? (requestDispatchId ? deterministicUuid(retargetClaimedDispatch ? `chat-runtime:${requestDispatchId}:retry:${(0, import_node_crypto92.randomUUID)()}` : `chat-runtime:${requestDispatchId}`) : (0, import_node_crypto92.randomUUID)());
289507
289524
  const resumeRuntimeSession = Boolean(sessionId);
289508
289525
  const traceRunId = requestDispatchId ? stableChatTraceRunId(requestDispatchId) : `chat-run:${(0, import_node_crypto92.randomUUID)()}`;
289509
289526
  const artifactId = requestDispatchId ? `artifact:chat:${deterministicUuid(`chat-artifact:${requestDispatchId}`)}` : `artifact:chat:${(0, import_node_crypto92.randomUUID)()}`;
@@ -289722,8 +289739,12 @@ async function startServe(opts) {
289722
289739
  旧机器那次失败的原文仍留在事件流里,也记进了故障标记与失败链。 */
289723
289740
  exitReason: null,
289724
289741
  errorMessage: null,
289742
+ // 这一次是新的一场 runtime 会话(见上面 runtimeSessionId),账本里的会话号跟着换。
289743
+ triggerRef: runtimeSessionId,
289744
+ jobKey: runtimeSessionId,
289725
289745
  metadata: {
289726
289746
  ...prior.metadata ?? {},
289747
+ runtimeSessionId,
289727
289748
  nodeId: binding.nodeId,
289728
289749
  runtimeKind: binding.runtimeKind,
289729
289750
  runtimeTargetSource: "session_override"
@@ -298211,7 +298232,7 @@ async function waitForCommandAuthorization(base, headers, draftId, fallback) {
298211
298232
  }
298212
298233
  }
298213
298234
  }
298214
- var CLI_VERSION = "2.2.97" ? "2.2.97" : "dev";
298235
+ var CLI_VERSION = "2.2.98" ? "2.2.98" : "dev";
298215
298236
  function apiHeaders(token2, company) {
298216
298237
  const headers = {
298217
298238
  authorization: `Bearer ${token2}`,
@@ -302182,7 +302203,7 @@ function shimScript() {
302182
302203
  }
302183
302204
 
302184
302205
  // src/index.ts
302185
- var PKG_VERSION = true ? "2.2.97" : "dev";
302206
+ var PKG_VERSION = true ? "2.2.98" : "dev";
302186
302207
  var LOCAL_BIN = localBin();
302187
302208
  var NPM_PREFIX = npmPrefix();
302188
302209
  var INSTANCE = DEFAULT_INSTANCE;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oasis_test_v2",
3
- "version": "2.2.97",
3
+ "version": "2.2.98",
4
4
  "description": "Oasis node daemon + CLI — background daemon, auto-start, full server CLI",
5
5
  "bin": {
6
6
  "oasis": "./dist/index.js"
@@ -26,6 +26,6 @@
26
26
  "node": ">=20"
27
27
  },
28
28
  "oasisRelease": {
29
- "sourceHead": "b58602b3836acf502fd5bfc644949eb355440ae0"
29
+ "sourceHead": "9232426433ddd120620c9d131d9f3fd247d726eb"
30
30
  }
31
31
  }