oasis_test_v2 2.2.71 → 2.2.72

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 +159 -51
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -6688,22 +6688,28 @@ function readCodexTokenCountLine(line2) {
6688
6688
  ...total ? { total } : {}
6689
6689
  };
6690
6690
  }
6691
+ function readCodexTurnContextModel(line2) {
6692
+ if (!line2 || line2.indexOf("turn_context") === -1) return void 0;
6693
+ let o;
6694
+ try {
6695
+ o = JSON.parse(line2);
6696
+ } catch {
6697
+ return void 0;
6698
+ }
6699
+ if (o?.type !== "turn_context") return void 0;
6700
+ return typeof o.payload?.model === "string" && o.payload.model ? o.payload.model : void 0;
6701
+ }
6691
6702
  function parseCodexModel(lines) {
6692
6703
  let model;
6693
- for (const line2 of lines) {
6694
- if (!line2 || line2.indexOf("turn_context") === -1) continue;
6695
- let o;
6696
- try {
6697
- o = JSON.parse(line2);
6698
- } catch {
6699
- continue;
6700
- }
6701
- if (o?.type === "turn_context" && typeof o.payload?.model === "string" && o.payload.model) {
6702
- model = o.payload.model;
6703
- }
6704
- }
6704
+ for (const line2 of lines) model = readCodexTurnContextModel(line2) ?? model;
6705
6705
  return model;
6706
6706
  }
6707
+ function pickCodexModel(sources) {
6708
+ for (const candidate of [sources.rollout, sources.thread, sources.requested]) {
6709
+ if (typeof candidate === "string" && candidate.trim().length > 0) return candidate;
6710
+ }
6711
+ return void 0;
6712
+ }
6707
6713
  function codexSessionsRoot() {
6708
6714
  const candidates = [];
6709
6715
  const ch = process.env["CODEX_HOME"];
@@ -7031,7 +7037,7 @@ function codexTurnErrorMessage(value2) {
7031
7037
  const detail = typeof error2?.additionalDetails === "string" ? error2.additionalDetails.trim() : "";
7032
7038
  return [summary, detail].filter(Boolean).join("\n").slice(0, 4e3);
7033
7039
  }
7034
- var import_node_child_process7, import_node_crypto9, fs8, os6, path10, readline2, CODEX_BLOCKED_FLAGS, CODEX_ARGV_PROMPT_MAX_BYTES, CodexRolloutUsageTail, CODEX_APP_SERVER_BLOCKED_FLAGS, CodexAdapter;
7040
+ var import_node_child_process7, import_node_crypto9, fs8, os6, path10, readline2, CODEX_BLOCKED_FLAGS, CODEX_ARGV_PROMPT_MAX_BYTES, CodexRolloutLineTail, CodexRolloutUsageTail, CodexRolloutModelTail, CODEX_APP_SERVER_BLOCKED_FLAGS, CodexAdapter;
7035
7041
  var init_codex = __esm({
7036
7042
  "../adapters/src/codex/index.ts"() {
7037
7043
  "use strict";
@@ -7069,25 +7075,21 @@ var init_codex = __esm({
7069
7075
  // Multica 实证:codex --listen stdio:// 是 daemon↔CLI 传输协议;改会断链
7070
7076
  ]);
7071
7077
  CODEX_ARGV_PROMPT_MAX_BYTES = 1e5;
7072
- CodexRolloutUsageTail = class {
7073
- constructor(file, sinceMs) {
7078
+ CodexRolloutLineTail = class {
7079
+ constructor(file) {
7074
7080
  this.file = file;
7075
- this.sinceMs = sinceMs;
7076
7081
  }
7077
7082
  offset = 0;
7078
7083
  rest = "";
7079
- acc = { input: 0, cacheRead: 0, cacheWrite: 0, output: 0 };
7080
- saw = false;
7081
- /** 读新追加的行,返回当前窗内累计;还没有任何窗内轮次返回 undefined。读失败抛给调用方(调用方吞)。 */
7082
- poll() {
7084
+ /** 读新追加的整行逐行回调;文件被截短时先回调 onReset 再从头读。读失败抛给调用方(调用方吞)。 */
7085
+ read(onLine, onReset) {
7083
7086
  const fd = fs8.openSync(this.file, "r");
7084
7087
  try {
7085
7088
  const size = fs8.fstatSync(fd).size;
7086
7089
  if (size < this.offset) {
7087
7090
  this.offset = 0;
7088
7091
  this.rest = "";
7089
- this.saw = false;
7090
- this.acc.input = this.acc.cacheRead = this.acc.cacheWrite = this.acc.output = 0;
7092
+ onReset?.();
7091
7093
  }
7092
7094
  if (size > this.offset) {
7093
7095
  const buf = Buffer.alloc(size - this.offset);
@@ -7096,19 +7098,62 @@ var init_codex = __esm({
7096
7098
  const text7 = this.rest + buf.subarray(0, n).toString("utf8");
7097
7099
  const lines = text7.split("\n");
7098
7100
  this.rest = lines.pop() ?? "";
7099
- for (const line2 of lines) {
7100
- const row = readCodexTokenCountLine(line2);
7101
- if (!row?.turn || !Number.isFinite(row.ts) || row.ts < this.sinceMs) continue;
7102
- addCodexBuckets(this.acc, row.turn);
7103
- this.saw = true;
7104
- }
7101
+ for (const line2 of lines) onLine(line2);
7105
7102
  }
7106
7103
  } finally {
7107
7104
  fs8.closeSync(fd);
7108
7105
  }
7106
+ }
7107
+ };
7108
+ CodexRolloutUsageTail = class {
7109
+ constructor(file, sinceMs) {
7110
+ this.file = file;
7111
+ this.sinceMs = sinceMs;
7112
+ this.tail = new CodexRolloutLineTail(file);
7113
+ }
7114
+ tail;
7115
+ acc = { input: 0, cacheRead: 0, cacheWrite: 0, output: 0 };
7116
+ saw = false;
7117
+ lastModel;
7118
+ /** 截至目前读到的**最后一条** `turn_context` 模型(与终值的 {@link parseCodexModel} 同判据)。 */
7119
+ get model() {
7120
+ return this.lastModel;
7121
+ }
7122
+ /** 读新追加的行,返回当前窗内累计;还没有任何窗内轮次返回 undefined。读失败抛给调用方(调用方吞)。 */
7123
+ poll() {
7124
+ this.tail.read((line2) => {
7125
+ const model = readCodexTurnContextModel(line2);
7126
+ if (model) this.lastModel = model;
7127
+ const row = readCodexTokenCountLine(line2);
7128
+ if (!row?.turn || !Number.isFinite(row.ts) || row.ts < this.sinceMs) return;
7129
+ addCodexBuckets(this.acc, row.turn);
7130
+ this.saw = true;
7131
+ }, () => {
7132
+ this.saw = false;
7133
+ this.lastModel = void 0;
7134
+ this.acc.input = this.acc.cacheRead = this.acc.cacheWrite = this.acc.output = 0;
7135
+ });
7109
7136
  return this.saw ? usageFromBuckets(this.acc) : void 0;
7110
7137
  }
7111
7138
  };
7139
+ CodexRolloutModelTail = class {
7140
+ constructor(file) {
7141
+ this.file = file;
7142
+ this.tail = new CodexRolloutLineTail(file);
7143
+ }
7144
+ tail;
7145
+ lastModel;
7146
+ /** 追读新行,返回截至目前**最后一条** `turn_context` 记的模型。读失败抛给调用方(调用方吞)。 */
7147
+ poll() {
7148
+ this.tail.read((line2) => {
7149
+ const model = readCodexTurnContextModel(line2);
7150
+ if (model) this.lastModel = model;
7151
+ }, () => {
7152
+ this.lastModel = void 0;
7153
+ });
7154
+ return this.lastModel;
7155
+ }
7156
+ };
7112
7157
  CODEX_APP_SERVER_BLOCKED_FLAGS = /* @__PURE__ */ new Map([
7113
7158
  ["app-server", "boolean"],
7114
7159
  ["--stdio", "boolean"],
@@ -7169,7 +7214,12 @@ var init_codex = __esm({
7169
7214
  // 只能从 resume 的响应里取(同上实测)。取不到它就读不到实际模型。
7170
7215
  rolloutPath: void 0,
7171
7216
  // thread/start / thread/resume 响应里 codex 报的线程模型:rollout 读不到时的兜底。
7172
- threadModel: void 0
7217
+ threadModel: void 0,
7218
+ // 运行中检查点的模型来源(Bug 0227):增量追读会话卷里逐轮记的实际模型。卷路径就位后才建。
7219
+ rolloutModelTail: void 0,
7220
+ rolloutModel: void 0,
7221
+ // 上一次报出去的用量指纹:只在用量真的变了的那一拍才去碰磁盘(runningUsage 每条协议消息都被调到)。
7222
+ lastUsageKey: ""
7173
7223
  }),
7174
7224
  initialCommand: () => ({
7175
7225
  jsonrpc: "2.0",
@@ -7311,14 +7361,14 @@ ${task}` : task;
7311
7361
  },
7312
7362
  runtimeSessionId: (state) => state.threadId,
7313
7363
  exitExtras: (state) => {
7314
- let model;
7364
+ let fromRollout;
7315
7365
  if (state.rolloutPath) {
7316
7366
  try {
7317
- model = parseCodexModel(fs8.readFileSync(state.rolloutPath, "utf8").split("\n"));
7367
+ fromRollout = parseCodexModel(fs8.readFileSync(state.rolloutPath, "utf8").split("\n"));
7318
7368
  } catch {
7319
7369
  }
7320
7370
  }
7321
- model ??= state.threadModel ?? resolvedModel2;
7371
+ const model = pickCodexModel({ rollout: fromRollout ?? state.rolloutModel, thread: state.threadModel, requested: resolvedModel2 });
7322
7372
  const usage = codexRunUsage(state.usageByTurn, state.runTurnIds);
7323
7373
  return {
7324
7374
  ...usage ? { usage } : {},
@@ -7331,7 +7381,18 @@ ${task}` : task;
7331
7381
  runningUsage: (state) => {
7332
7382
  const usage = codexRunUsage(state.usageByTurn, state.runTurnIds);
7333
7383
  if (!usage) return void 0;
7334
- const model = state.threadModel ?? resolvedModel2;
7384
+ const key2 = JSON.stringify(usage);
7385
+ if (key2 !== state.lastUsageKey) {
7386
+ state.lastUsageKey = key2;
7387
+ if (state.rolloutPath) {
7388
+ state.rolloutModelTail ??= new CodexRolloutModelTail(state.rolloutPath);
7389
+ try {
7390
+ state.rolloutModel = state.rolloutModelTail.poll() ?? state.rolloutModel;
7391
+ } catch {
7392
+ }
7393
+ }
7394
+ }
7395
+ const model = pickCodexModel({ rollout: state.rolloutModel, thread: state.threadModel, requested: resolvedModel2 });
7335
7396
  return { usage, ...model ? { model } : {} };
7336
7397
  },
7337
7398
  async append(input, state, send) {
@@ -7563,7 +7624,7 @@ ${task}` : task;
7563
7624
  const key2 = usage ? JSON.stringify(usage) : "";
7564
7625
  if (!usage || key2 === lastUsageKey) return;
7565
7626
  lastUsageKey = key2;
7566
- const model = job.model ?? this.opts.model;
7627
+ const model = pickCodexModel({ rollout: usageTail.model, requested: job.model ?? this.opts.model });
7567
7628
  for (const cb of usageCheckpointCbs) cb({ usage, ...model ? { model } : {} });
7568
7629
  } catch {
7569
7630
  }
@@ -7615,7 +7676,7 @@ ${task}` : task;
7615
7676
  clearTimeout(timer);
7616
7677
  const resumeSessionId = job.resumeRuntimeSession ? job.runtimeSessionId : void 0;
7617
7678
  const telemetry = scanCodexTelemetry(dir, startedAtMs, codexSessionsRoot(), job.runtimeSessionId);
7618
- const model = telemetry.model ?? job.model ?? this.opts.model;
7679
+ const model = pickCodexModel({ rollout: telemetry.model, requested: job.model ?? this.opts.model });
7619
7680
  const runtimeSessionId = telemetry.sessionId ?? resumeSessionId;
7620
7681
  const sawStreamError = streamErrorMessages.length > 0;
7621
7682
  const isError = !killReason && (code2 !== 0 || sawStreamError);
@@ -216136,7 +216197,9 @@ function systemHandoffFor(run, checkpoint = null, effects2 = []) {
216136
216197
  // 与 PG 触发器同口径(2026-08-18):risks / verificationGaps 只装业务语义的东西。会话怎么死的
216137
216198
  // 已在 summary 的 reason= 段里,不再冒充成「交付物的风险」;「没有断点」也不是「验证缺口」。
216138
216199
  risks: pendingEffects || failedEffects ? [`external effects: pending=${pendingEffects}, failed=${failedEffects}`] : [],
216139
- nextActions: structuredClone(checkpoint?.pendingSteps ?? []),
216200
+ // 与 PG 触发器同口径(2026-09-23):nextActions 是「下游怎么用这份成果」,不拿 pendingSteps
216201
+ //(执行人自己没做完的活)兜底——兜底会让下游交接出现 `[next] 提交并结案` 这种假的「上游建议」。
216202
+ nextActions: [],
216140
216203
  verificationGaps: [],
216141
216204
  userHandoff: null,
216142
216205
  createdAt: run.endedAt ?? run.updatedAt ?? (/* @__PURE__ */ new Date()).toISOString()
@@ -224789,9 +224852,15 @@ function createUsageLedgerResolver(deps) {
224789
224852
  return chatCid ? { runId: stable, store: await deps.storeFor(chatCid) } : null;
224790
224853
  };
224791
224854
  }
224855
+ function hasModelName(model) {
224856
+ return typeof model === "string" && model.trim().length > 0;
224857
+ }
224858
+ function frameTokenTotal(usage) {
224859
+ return (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0) + (usage.cacheReadTokens ?? 0) + (usage.cacheCreationTokens ?? 0);
224860
+ }
224792
224861
  async function backfillRunModel(target, run, model, warn) {
224793
- if (!model || model.trim().length === 0) return;
224794
- if (run.effectiveModel && run.effectiveModel.trim().length > 0) return;
224862
+ if (!hasModelName(model)) return;
224863
+ if (hasModelName(run.effectiveModel)) return;
224795
224864
  try {
224796
224865
  await target.store.updateRun(target.runId, { effectiveModel: model, modelSource: "runtime" });
224797
224866
  } catch (err) {
@@ -224808,6 +224877,13 @@ function createUsageLedgerFrameHandler(deps) {
224808
224877
  settledDispatch.add(dispatchId);
224809
224878
  if (settledDispatch.size > 1e4) settledDispatch.delete(settledDispatch.values().next().value);
224810
224879
  };
224880
+ const modelless = /* @__PURE__ */ new Set();
224881
+ const notedModelless = (runId) => {
224882
+ if (modelless.has(runId)) return true;
224883
+ modelless.add(runId);
224884
+ if (modelless.size > 1e4) modelless.delete(modelless.values().next().value);
224885
+ return false;
224886
+ };
224811
224887
  return async (msg) => {
224812
224888
  if (!RUNTIME_START_FRAME_TYPES.has(msg.type)) return;
224813
224889
  const dispatchId = msg.dispatchId;
@@ -224850,6 +224926,12 @@ function createUsageLedgerFrameHandler(deps) {
224850
224926
  warn(`[usage-ledger] session_usage dispatch=${dispatchId} usageSeq=${String(msg.usageSeq)} \u975E\u6CD5\uFF0C\u4E22\u5F03`);
224851
224927
  return;
224852
224928
  }
224929
+ if (!hasModelName(msg.model) && !hasModelName(run.effectiveModel)) {
224930
+ const tokens2 = frameTokenTotal(msg.usage);
224931
+ if (tokens2 > 0 && !notedModelless(target.runId)) {
224932
+ warn(`[usage-ledger] session_usage dispatch=${dispatchId} \u2192 run ${target.runId} \u5E26\u7740 ${tokens2} \u4E2A token \u5374\u6CA1\u6709\u6A21\u578B\u540D\uFF08run \u884C\u4E5F\u662F\u7A7A\u7684\uFF09\uFF0C\u8FD9\u6BB5\u7528\u91CF\u53EA\u80FD\u5F52\u8FDB\u300C\u672A\u77E5\u6A21\u578B\u300D`);
224933
+ }
224934
+ }
224853
224935
  await target.store.recordUsagePoint({
224854
224936
  runId: target.runId,
224855
224937
  seq: msg.usageSeq,
@@ -246223,7 +246305,7 @@ function renderResumePack(pack) {
246223
246305
  if (cp) lines.push(`- Recoverability: ${cp.recoverability}`);
246224
246306
  if (done.length > 0) lines.push(`- \u4E0A\u4E00\u8D9F\u5DF2\u5B8C\u6210\u7684\u6B65\u9AA4\uFF1A${done.join("\u3001")}`);
246225
246307
  for (const ref2 of durable) {
246226
- lines.push(` - durable: ${ref2.kind}:${ref2.id}${ref2.version ? `@${ref2.version}` : ""}${ref2.label ? ` \u2014 ${ref2.label}` : ""}`);
246308
+ lines.push(` - durable: ${renderRefId(ref2)}${ref2.version ? `@${ref2.version}` : ""}${ref2.label ? ` \u2014 ${ref2.label}` : ""}`);
246227
246309
  }
246228
246310
  if (cp && cp.pendingSteps.length > 0) {
246229
246311
  for (const step of cp.pendingSteps) lines.push(` - pending: ${step}`);
@@ -246268,6 +246350,11 @@ function parseResumePackSnapshot(content3) {
246268
246350
  return null;
246269
246351
  }
246270
246352
  }
246353
+ function renderRefId(ref2) {
246354
+ const kind = ref2.kind.trim();
246355
+ const id = ref2.id.trim();
246356
+ return kind && !id.startsWith(`${kind}:`) ? `${kind}:${id}` : id;
246357
+ }
246271
246358
  function renderWorkVersion(work) {
246272
246359
  const current = work.currentWorkId ?? "none";
246273
246360
  const delivered = work.acceptedWorkId ?? "none";
@@ -246365,20 +246452,29 @@ function renderCoordinatorView(view, taskBackground) {
246365
246452
  `- Actor: ${node2.actorId ?? "unassigned"}; role: ${node2.role ?? "unassigned"}`
246366
246453
  );
246367
246454
  if (node2.dependsOn.length > 0) lines.push(`- Depends on: ${node2.dependsOn.join(", ")}`);
246368
- if (node2.conclusion?.trim()) lines.push(`- Conclusion: ${node2.conclusion.trim()}`);
246455
+ if (node2.conclusion?.trim()) {
246456
+ lines.push(node2.work.acceptedWorkId ? `- Conclusion (delivered ${node2.work.acceptedWorkId}): ${node2.conclusion.trim()}` : `- Conclusion: ${node2.conclusion.trim()}`);
246457
+ }
246369
246458
  if (node2.recoverySource) {
246370
246459
  const source = node2.recoverySource;
246371
246460
  lines.push(
246372
246461
  `- Recovery source: Attempt ${source.recoveredFromAttempt.attemptNo ?? "?"} \u2192 Attempt ${source.currentAttempt.attemptNo ?? "?"}`
246373
246462
  );
246374
246463
  if (source.recoveryCheckpoint) {
246375
- lines.push(` - Recovery checkpoint: #${source.recoveryCheckpoint.seq} (${source.recoveryCheckpoint.recoverability})`);
246464
+ lines.push(
246465
+ ` - Recovery checkpoint: #${source.recoveryCheckpoint.seq} (${source.recoveryCheckpoint.recoverability}) from Attempt ${source.recoveredFromAttempt.attemptNo ?? "?"}`
246466
+ );
246376
246467
  for (const step of source.recoveryCheckpoint.pendingSteps) lines.push(` - Recovery pending: ${step}`);
246377
246468
  }
246378
- if (source.recoveryHandoff?.producedBy === "agent") {
246379
- lines.push(` - Recovery Agent handoff: ${source.recoveryHandoff.summary}`);
246380
- } else if (source.recoveryHandoff?.producedBy === "system_reconstructed") {
246381
- lines.push(` - Recovery system reconstruction (not an Agent conclusion): ${source.recoveryHandoff.summary}`);
246469
+ if (source.recoveryHandoff) {
246470
+ const handoffFrom = source.recoveryHandoff.attemptId === source.recoveredFromAttempt.id ? `Attempt ${source.recoveredFromAttempt.attemptNo ?? "?"}` : `attempt ${source.recoveryHandoff.attemptId}`;
246471
+ if (source.recoveryHandoff.producedBy === "agent") {
246472
+ lines.push(` - Recovery Agent handoff (${handoffFrom}): ${source.recoveryHandoff.summary}`);
246473
+ } else if (source.recoveryHandoff.producedBy === "system_reconstructed") {
246474
+ lines.push(
246475
+ ` - Recovery system reconstruction (${handoffFrom}, not an Agent conclusion): ${source.recoveryHandoff.summary}`
246476
+ );
246477
+ }
246382
246478
  }
246383
246479
  for (const risk of source.recoveryHandoff?.risks ?? []) lines.push(` - Recovery risk: ${risk}`);
246384
246480
  }
@@ -246388,11 +246484,12 @@ function renderCoordinatorView(view, taskBackground) {
246388
246484
  }
246389
246485
  if (node2.handoffProducer === "agent" && node2.summary.trim() && !sameCoordinatorText(node2.summary, node2.conclusion)) {
246390
246486
  lines.push(`- Technical notes: ${node2.summary}`);
246391
- } else if (node2.handoffProducer === "system_reconstructed" && node2.summary.startsWith("[system_reconstructed]")) {
246487
+ } else if (node2.handoffProducer === "system_reconstructed" && node2.summary.startsWith("[system_reconstructed]") && node2.status !== "succeeded") {
246392
246488
  lines.push(`- Execution diagnostic: ${node2.summary}`);
246393
246489
  }
246394
246490
  for (const output of node2.changedOutputs) {
246395
- lines.push(` - Durable output: ${output.kind}:${output.id}${output.version ? `@${output.version}` : ""}`);
246491
+ if (!output.version) continue;
246492
+ lines.push(` - Durable output: ${renderRefId(output)}@${output.version}`);
246396
246493
  }
246397
246494
  const openItems = [
246398
246495
  ...node2.unresolvedIssues.map((value2) => `[unresolved] ${value2}`),
@@ -247171,7 +247268,7 @@ function nodeCoordinatorFactsFromSnapshot(snapshot) {
247171
247268
  state: currentWorkId === null ? "not_started" : currentWork ? workState(currentWork, hasOutput(currentWork, artifactCountByWork.get(currentWork.id) ?? 0)) : "unavailable"
247172
247269
  };
247173
247270
  const accepted = node2.latestAcceptId ? workById.get(node2.latestAcceptId) : void 0;
247174
- const conclusion = accepted?.conclusion?.trim() || snapshot.works.filter((work2) => work2.nodeId === node2.id && work2.status === "success" && work2.conclusion?.trim()).sort((a, b2) => a.createdAt.localeCompare(b2.createdAt)).at(-1)?.conclusion?.trim();
247271
+ const conclusion = accepted?.conclusion?.trim();
247175
247272
  const sealed = node2.cancelledAt ? { reason: node2.sealReason ?? "cancelled", at: node2.cancelledAt } : null;
247176
247273
  out[node2.id] = {
247177
247274
  work,
@@ -259317,7 +259414,18 @@ var init_postgres_trace = __esm({
259317
259414
  (generated_handoff_id, NEW.id, COALESCE(NEW.job_key, NEW.trigger_ref, 'attempt:' || NEW.id), NEW.part,
259318
259415
  'system_reconstructed', mapped_outcome,
259319
259416
  reconstructed_summary, NEW.output_refs, '[]'::jsonb, reconstructed_risks,
259320
- COALESCE(latest_pending, '[]'::jsonb), reconstructed_gaps, NULL,
259417
+ -- \u2605 2026-09-23\uFF1Anext_actions \u4E0D\u518D\u7528 checkpoint \u7684 pendingSteps \u515C\u5E95\u3002
259418
+ --
259419
+ -- \u8FD9\u4E00\u680F\u7684\u8BED\u4E49\u662F\u300C\u4E0B\u6E38\u600E\u4E48\u7528\u8FD9\u4EFD\u6210\u679C\u300D\uFF08TASK.md \u539F\u6587\uFF1A--next\uFF1A\u4E0B\u6E38\u5982\u4F55\u4F7F\u7528\u6210\u679C\uFF0C\u4E0D\u662F\u4F60\u5269\u4F59
259420
+ -- \u6CA1\u505A\u7684\u5DE5\u4F5C\uFF09\uFF0C\u800C pendingSteps \u6070\u6070\u662F\u6267\u884C\u4EBA\u81EA\u5DF1\u6CA1\u505A\u5B8C\u7684\u6D3B\u3002\u515C\u5E95\u7684\u540E\u679C\uFF1A\u7EBF\u4E0A 114 \u4EFD\u4EA4\u4ED8\u8BB0\u5F55
259421
+ -- \u91CC 106 \u4EFD\u5E26 next\uFF0C\u5176\u4E2D 59 \u4EFD\u662F conclude / \u63D0\u4EA4\u5E76\u7ED3\u6848 \u8FD9\u7C7B\u81EA\u7559\u5F85\u529E\uFF0C\u8FD8\u88AB\u4E0B\u6E38\u4EA4\u63A5\u7684\u7ED3\u5C3E\u53E5
259422
+ -- \u58F0\u660E\u6210\u300C\u4EE5\u4E0A\u5F00\u653E\u9879\u662F\u4E0A\u6E38\u6267\u884C\u4EBA\u4EA4\u4F5C\u4E1A\u65F6\u81EA\u5DF1\u5199\u7684\u300D\u2014\u2014\u4E00\u53E5\u5047\u8BDD\uFF08\u5B9E\u8BC1\uFF1Aws:wo-2481b4cb \u7684\u4E0B\u6E38
259423
+ -- \u300C\u8C03\u7814\u62A5\u544A\u300D\u6536\u5230\u7684 _HANDOFF.md \u53EA\u6709\u4E00\u884C - [next] \u63D0\u4EA4\u5E76\u7ED3\u6848\uFF09\u3002\u6539\u6210\u7A7A\u4E4B\u540E\uFF0C\u8FD9\u4E00\u680F\u8981\u4E48\u662F
259424
+ -- \u6267\u884C\u4EBA propose --next \u4EB2\u624B\u5199\u7684\uFF0C\u8981\u4E48\u6CA1\u6709\u3002
259425
+ --
259426
+ -- pendingSteps \u4E0D\u4F1A\u56E0\u6B64\u4E22\u5931\uFF1A\u4E2D\u65AD\u7EED\u8DD1\u8BFB\u7684\u662F checkpoint \u672C\u8EAB\uFF08RESUME.md\uFF09\uFF0C\u534F\u8C03\u8005\u89C6\u56FE\u5BF9
259427
+ -- running/stalled/blocked/failed \u8282\u70B9\u5355\u72EC\u6E32\u67D3 Pending \u884C\uFF08progress \u6BB5\uFF09\uFF0C\u4E24\u5904\u90FD\u4E0D\u8BFB\u8FD9\u4E00\u680F\u3002
259428
+ '[]'::jsonb, reconstructed_gaps, NULL,
259321
259429
  COALESCE(NEW.ended_at, NEW.updated_at, NEW.started_at))
259322
259430
  -- \u2605 2026-08-17\uFF1A\u7EC8\u6001\u91CD\u5EFA\u4ECE\u300C\u6574\u884C\u8986\u76D6\u300D\u6539\u6210\u300C**\u53EA\u586B\u7A7A**\u300D\u3002
259323
259431
  --
@@ -289687,7 +289795,7 @@ async function waitForCommandAuthorization(base, headers, draftId, fallback) {
289687
289795
  }
289688
289796
  }
289689
289797
  }
289690
- var CLI_VERSION = "2.2.71" ? "2.2.71" : "dev";
289798
+ var CLI_VERSION = "2.2.72" ? "2.2.72" : "dev";
289691
289799
  function apiHeaders(token, company) {
289692
289800
  const headers = {
289693
289801
  authorization: `Bearer ${token}`,
@@ -293493,7 +293601,7 @@ function shimScript() {
293493
293601
  }
293494
293602
 
293495
293603
  // src/index.ts
293496
- var PKG_VERSION = true ? "2.2.71" : "dev";
293604
+ var PKG_VERSION = true ? "2.2.72" : "dev";
293497
293605
  var LOCAL_BIN = localBin();
293498
293606
  var NPM_PREFIX = npmPrefix();
293499
293607
  var INSTANCE = DEFAULT_INSTANCE;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oasis_test_v2",
3
- "version": "2.2.71",
3
+ "version": "2.2.72",
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": "1fa20ef71a94255f7bf67c0341e735072b2eb11b"
29
+ "sourceHead": "a2685bf486a798e1ecb309610a733841f1360d92"
30
30
  }
31
31
  }