oasis_test 0.1.70 → 0.1.71

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 +144 -69
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -138897,7 +138897,7 @@ function requiresMeReasonOf(model, artifact, viewer, facts) {
138897
138897
  function computeRequiresMe(model, artifact, viewer, facts) {
138898
138898
  return requiresMeReasonOf(model, artifact, viewer, facts) !== null;
138899
138899
  }
138900
- function buildWorkorderDetail(model, workspaceId, resolveActor, resolveProject, dispatchJournal = [], dispatchPausedOf, ops = [], reviewerPreview, dispatcherSignalsOf, viewer, roleDefaultOwnerOf) {
138900
+ function buildWorkorderDetail(model, workspaceId, resolveActor, resolveProject, dispatchJournal = [], dispatchPausedOf, ops = [], reviewerPreview, dispatcherSignalsOf, viewer, roleDefaultOwnerOf, roleLabelOf) {
138901
138901
  const arts = [...model.artifacts.values()].filter((a) => a.workspace === workspaceId);
138902
138902
  if (arts.length === 0) return null;
138903
138903
  const ref2 = (id) => {
@@ -138961,11 +138961,15 @@ function buildWorkorderDetail(model, workspaceId, resolveActor, resolveProject,
138961
138961
  quorum: pv.quorum,
138962
138962
  // 0089:每桶门槛后端给,前端别拿聚合 quorum 做减法。
138963
138963
  // 诊断 f1641dd3-abdaa869(改 B):给角色桶补**纯展示**的 defaultOwner(该角色 RoleDef.defaultOwner
138964
- // 解析成 ActorRef)。core 无岗位目录、算不出,故在此注入。未配 / 无解析器 → 不带该字段。
138964
+ // 解析成 ActorRef)与 roleLabel(RoleDef.label 中文名,annotation 6e3608ee)。core 无岗位目录、
138965
+ // 算不出,故在此注入。未配 / 无解析器 → 不带对应字段(前端各自兜底)。
138965
138966
  reviewerRequirements: pv.requirements.map((r) => {
138966
138967
  if (r.source !== "type") return r;
138967
- const owner = r.roles?.[0] ? roleDefaultOwnerOf?.(r.roles[0]) : void 0;
138968
- return owner ? { ...r, defaultOwner: ref2(owner) } : r;
138968
+ const role = r.roles?.[0];
138969
+ const owner = role ? roleDefaultOwnerOf?.(role) : void 0;
138970
+ const label = role ? roleLabelOf?.(role) : void 0;
138971
+ const withOwner = owner ? { ...r, defaultOwner: ref2(owner) } : r;
138972
+ return label ? { ...withOwner, roleLabel: label } : withOwner;
138969
138973
  }),
138970
138974
  // 0101:审核角色是否被覆盖过(替换了类型默认)——供详情页角色位徽标/复原判断。
138971
138975
  ...a.reviewRoles !== void 0 ? { reviewRolesOverridden: true } : {},
@@ -142560,13 +142564,13 @@ async function startOasisServer(opts) {
142560
142564
  const actorCtx = await opts.resolveActorContext(body.actorId).catch(() => null);
142561
142565
  if (actorCtx) {
142562
142566
  const { mkdtempSync: mkdtempSync5, mkdirSync: mkdirSync20, writeFileSync: writeFileSync13 } = await import("node:fs");
142563
- const { join: join28, dirname: dirname24 } = await import("node:path");
142567
+ const { join: join28, dirname: dirname25 } = await import("node:path");
142564
142568
  const { tmpdir: tmpdir9 } = await import("node:os");
142565
142569
  const dir = mkdtempSync5(join28(tmpdir9(), "oasis-chat-"));
142566
142570
  if (actorCtx.config?.prompt) {
142567
142571
  for (const [rel, content] of Object.entries(splitIdentityFiles2(actorCtx.config.prompt))) {
142568
142572
  const file = join28(dir, rel);
142569
- mkdirSync20(dirname24(file), { recursive: true });
142573
+ mkdirSync20(dirname25(file), { recursive: true });
142570
142574
  writeFileSync13(file, content);
142571
142575
  }
142572
142576
  }
@@ -142583,7 +142587,7 @@ async function startOasisServer(opts) {
142583
142587
  const skillFiles = await opts.materializeSkills(body.actorId, "claude").catch(() => ({}));
142584
142588
  for (const [rel, content] of Object.entries(skillFiles)) {
142585
142589
  const file = join28(dir, rel);
142586
- mkdirSync20(dirname24(file), { recursive: true });
142590
+ mkdirSync20(dirname25(file), { recursive: true });
142587
142591
  writeFileSync13(file, content);
142588
142592
  }
142589
142593
  }
@@ -151656,6 +151660,25 @@ export GITHUB_TOKEN=${shSingleQuote2(token)}
151656
151660
  }
151657
151661
  });
151658
151662
 
151663
+ // ../connectors/src/registry.ts
151664
+ function createConnectorBySlug(slug5) {
151665
+ switch (slug5) {
151666
+ case "feishu":
151667
+ return new FeishuConnector();
151668
+ case "github":
151669
+ return new GithubConnector();
151670
+ default:
151671
+ return null;
151672
+ }
151673
+ }
151674
+ var init_registry2 = __esm({
151675
+ "../connectors/src/registry.ts"() {
151676
+ "use strict";
151677
+ init_feishu();
151678
+ init_github();
151679
+ }
151680
+ });
151681
+
151659
151682
  // ../adapters/src/open-design/driver.ts
151660
151683
  function deriveBoardKey(artifactId) {
151661
151684
  const tail = artifactId.split(":").pop() ?? artifactId;
@@ -156137,15 +156160,17 @@ var init_logger = __esm({
156137
156160
  });
156138
156161
 
156139
156162
  // ../connectors/src/connector-adapter.ts
156140
- var import_promises3, import_node_os7, import_node_path10, ConnectorAwareAdapter;
156163
+ var import_promises3, import_node_fs8, import_node_os7, import_node_path10, ConnectorAwareAdapter;
156141
156164
  var init_connector_adapter = __esm({
156142
156165
  "../connectors/src/connector-adapter.ts"() {
156143
156166
  "use strict";
156144
156167
  import_promises3 = require("node:fs/promises");
156168
+ import_node_fs8 = require("node:fs");
156145
156169
  import_node_os7 = require("node:os");
156146
156170
  import_node_path10 = require("node:path");
156147
156171
  init_src5();
156148
156172
  init_base();
156173
+ init_registry2();
156149
156174
  init_logger();
156150
156175
  ConnectorAwareAdapter = class {
156151
156176
  constructor(baseOpts = {}) {
@@ -156158,13 +156183,39 @@ var init_connector_adapter = __esm({
156158
156183
  if (missing.length) log("[adapter]", ` connector tools still missing (agent may fail): ${missing.join(", ")}`);
156159
156184
  }
156160
156185
  const sentinelWrappers = Object.entries(job.env ?? {}).filter(([k2]) => k2.endsWith("_WRAPPER")).map(([, v2]) => v2);
156161
- const wrapperPaths = [...job.wrapperPaths ?? [], ...sentinelWrappers];
156186
+ const remoteWrappers = [...job.wrapperPaths ?? [], ...sentinelWrappers];
156187
+ const wrapperPaths = remoteWrappers.filter((p2) => (0, import_node_fs8.existsSync)(p2));
156188
+ const droppedWrappers = remoteWrappers.length - wrapperPaths.length;
156162
156189
  const strippedEnv = Object.fromEntries(
156163
156190
  Object.entries(job.env ?? {}).filter(([k2]) => !k2.endsWith("_WRAPPER"))
156164
156191
  );
156165
156192
  let extraEnv = { ...strippedEnv };
156166
156193
  const toolsBin = connectorToolsBinDir();
156167
156194
  const inheritedPath = process.env["PATH"] ?? "";
156195
+ const localBinDirs = [];
156196
+ const localCleanups = [];
156197
+ for (const { slug: slug5, credentials } of job.connectorCreds ?? []) {
156198
+ const connector = createConnectorBySlug(slug5);
156199
+ if (!connector) {
156200
+ log("[adapter]", ` unknown connector slug from server: ${slug5}\uFF08\u8DF3\u8FC7\uFF09`);
156201
+ continue;
156202
+ }
156203
+ try {
156204
+ const sessionEnv = /* @__PURE__ */ new Map();
156205
+ await connector.inject(credentials, sessionEnv);
156206
+ for (const [k2, v2] of sessionEnv) extraEnv[k2] = v2;
156207
+ const staged = stageConnectorWrapper(connector);
156208
+ if (staged) localBinDirs.push((0, import_node_path10.dirname)(staged));
156209
+ localCleanups.push(() => connector.cleanup(sessionEnv));
156210
+ log("[adapter]", ` ${slug5} injected locally creds+wrapper on this node`);
156211
+ } catch (err) {
156212
+ log("[adapter]", ` ${slug5} local inject failed\uFF08\u8BE5 connector \u672C\u8F6E\u4E0D\u53EF\u7528\uFF09: ${String(err)}`);
156213
+ }
156214
+ }
156215
+ if (droppedWrappers > 0) {
156216
+ log("[adapter]", ` dropped ${droppedWrappers} wrapper path(s) not present on this node\uFF08server \u4FA7\u8DEF\u5F84\uFF0C\u5DF2\u7531\u672C\u5730\u6CE8\u5165\u63A5\u7BA1\uFF09`);
156217
+ }
156218
+ const pathParts = [...localBinDirs];
156168
156219
  if (wrapperPaths.length > 0) {
156169
156220
  const wrapperBinDir = await (0, import_promises3.mkdtemp)((0, import_node_path10.join)((0, import_node_os7.tmpdir)(), "oasis-wrappers-"));
156170
156221
  await (0, import_promises3.mkdir)(wrapperBinDir, { recursive: true });
@@ -156172,14 +156223,24 @@ var init_connector_adapter = __esm({
156172
156223
  const linkName = (0, import_node_path10.basename)(wp).replace(/\.sh$/, "");
156173
156224
  await (0, import_promises3.symlink)(wp, (0, import_node_path10.join)(wrapperBinDir, linkName));
156174
156225
  }
156175
- extraEnv = { ...extraEnv, PATH: [wrapperBinDir, toolsBin, inheritedPath].filter(Boolean).join(":") };
156176
- log("[adapter]", ` connectors injected +${Date.now() - t0}ms wrappers=${wrapperPaths.length} env_keys=${Object.keys(job.env ?? {}).join(",")}`);
156226
+ pathParts.push(wrapperBinDir);
156227
+ }
156228
+ pathParts.push(toolsBin, inheritedPath);
156229
+ extraEnv = { ...extraEnv, PATH: pathParts.filter(Boolean).join(":") };
156230
+ if (localBinDirs.length > 0 || wrapperPaths.length > 0) {
156231
+ log("[adapter]", ` connectors injected +${Date.now() - t0}ms local=${localBinDirs.length} remote_wrappers=${wrapperPaths.length} env_keys=${Object.keys(job.env ?? {}).join(",")}`);
156177
156232
  } else {
156178
- extraEnv = { ...extraEnv, PATH: [toolsBin, inheritedPath].filter(Boolean).join(":") };
156179
156233
  log("[adapter]", ` no connectors +${Date.now() - t0}ms`);
156180
156234
  }
156181
156235
  const jobAdapter = new ClaudeCodeAdapter({ ...this.baseOpts, env: extraEnv });
156182
- return jobAdapter.spawn(job);
156236
+ const handle = await jobAdapter.spawn(job);
156237
+ if (localCleanups.length > 0) {
156238
+ handle.onExit(() => {
156239
+ for (const fn of localCleanups) void fn().catch(() => {
156240
+ });
156241
+ });
156242
+ }
156243
+ return handle;
156183
156244
  }
156184
156245
  };
156185
156246
  }
@@ -156195,6 +156256,7 @@ var init_src6 = __esm({
156195
156256
  init_feishu();
156196
156257
  init_well_known_skills();
156197
156258
  init_github();
156259
+ init_registry2();
156198
156260
  init_connector_adapter();
156199
156261
  }
156200
156262
  });
@@ -157990,11 +158052,11 @@ var init_routes2 = __esm({
157990
158052
  });
157991
158053
 
157992
158054
  // ../server/src/domains/projects/postgres-documents.ts
157993
- var import_node_fs8, ident2, PostgresProjectDocumentStore;
158055
+ var import_node_fs9, ident2, PostgresProjectDocumentStore;
157994
158056
  var init_postgres_documents = __esm({
157995
158057
  "../server/src/domains/projects/postgres-documents.ts"() {
157996
158058
  "use strict";
157997
- import_node_fs8 = __toESM(require("node:fs"), 1);
158059
+ import_node_fs9 = __toESM(require("node:fs"), 1);
157998
158060
  init_service2();
157999
158061
  ident2 = (s2) => {
158000
158062
  if (!/^[a-z_][a-z0-9_]*$/.test(s2)) throw new Error(`invalid schema name: ${s2}`);
@@ -158032,10 +158094,10 @@ var init_postgres_documents = __esm({
158032
158094
  async backfillFromFile(file) {
158033
158095
  const counted = await this.sql.query(`SELECT count(*) AS n FROM ${this.s}.project_document_spaces`);
158034
158096
  if (Number(counted.rows[0]?.["n"] ?? 0) > 0) return;
158035
- if (!import_node_fs8.default.existsSync(file)) return;
158097
+ if (!import_node_fs9.default.existsSync(file)) return;
158036
158098
  let snap;
158037
158099
  try {
158038
- snap = JSON.parse(import_node_fs8.default.readFileSync(file, "utf8"));
158100
+ snap = JSON.parse(import_node_fs9.default.readFileSync(file, "utf8"));
158039
158101
  } catch {
158040
158102
  console.warn(`[projectdoc-backfill] ${file} \u89E3\u6790\u5931\u8D25\uFF0C\u8DF3\u8FC7\u56DE\u586B\uFF08\u7A7A\u95F4\u5C06\u6309\u9700\u91CD\u65B0\u521D\u59CB\u5316\uFF09`);
158041
158103
  return;
@@ -159399,7 +159461,7 @@ function nodesDomain(deps) {
159399
159461
  const here = (0, import_node_path12.dirname)((0, import_node_url4.fileURLToPath)(__esm_import_meta_url));
159400
159462
  for (const rel of ["../../../../node-daemon/package.json", "../../../../../node-daemon/package.json"]) {
159401
159463
  try {
159402
- const raw = (0, import_node_fs9.readFileSync)((0, import_node_path12.resolve)(here, rel), "utf8");
159464
+ const raw = (0, import_node_fs10.readFileSync)((0, import_node_path12.resolve)(here, rel), "utf8");
159403
159465
  const pkg = JSON.parse(raw);
159404
159466
  if (pkg.version) return { version: pkg.version, source: "monorepo" };
159405
159467
  } catch {
@@ -159753,12 +159815,12 @@ function nodesDomain(deps) {
159753
159815
  });
159754
159816
  };
159755
159817
  }
159756
- var import_node_crypto24, import_node_fs9, import_node_url4, import_node_path12;
159818
+ var import_node_crypto24, import_node_fs10, import_node_url4, import_node_path12;
159757
159819
  var init_routes4 = __esm({
159758
159820
  "../server/src/domains/nodes/routes.ts"() {
159759
159821
  "use strict";
159760
159822
  import_node_crypto24 = require("node:crypto");
159761
- import_node_fs9 = require("node:fs");
159823
+ import_node_fs10 = require("node:fs");
159762
159824
  import_node_url4 = require("node:url");
159763
159825
  import_node_path12 = require("node:path");
159764
159826
  init_src5();
@@ -160807,11 +160869,11 @@ function nameKey(name) {
160807
160869
  function cleanName(name) {
160808
160870
  return name.trim().replace(/\s+/g, " ");
160809
160871
  }
160810
- var import_node_fs10, import_node_path13, import_node_crypto25, SEP, keyOf, prefixOf, MemoryWorkorderTagStore, FileWorkorderTagStore;
160872
+ var import_node_fs11, import_node_path13, import_node_crypto25, SEP, keyOf, prefixOf, MemoryWorkorderTagStore, FileWorkorderTagStore;
160811
160873
  var init_tags = __esm({
160812
160874
  "../server/src/domains/collab/tags.ts"() {
160813
160875
  "use strict";
160814
- import_node_fs10 = __toESM(require("node:fs"), 1);
160876
+ import_node_fs11 = __toESM(require("node:fs"), 1);
160815
160877
  import_node_path13 = __toESM(require("node:path"), 1);
160816
160878
  import_node_crypto25 = __toESM(require("node:crypto"), 1);
160817
160879
  SEP = "::";
@@ -160889,7 +160951,7 @@ var init_tags = __esm({
160889
160951
  super();
160890
160952
  this.file = file;
160891
160953
  try {
160892
- const raw = JSON.parse(import_node_fs10.default.readFileSync(file, "utf8"));
160954
+ const raw = JSON.parse(import_node_fs11.default.readFileSync(file, "utf8"));
160893
160955
  for (const [k2, v2] of Object.entries(raw)) {
160894
160956
  if (v2 && typeof v2 === "object" && typeof v2.id === "string" && typeof v2.name === "string") this.map.set(k2, v2);
160895
160957
  }
@@ -160898,10 +160960,10 @@ var init_tags = __esm({
160898
160960
  }
160899
160961
  persist() {
160900
160962
  try {
160901
- import_node_fs10.default.mkdirSync(import_node_path13.default.dirname(this.file), { recursive: true });
160963
+ import_node_fs11.default.mkdirSync(import_node_path13.default.dirname(this.file), { recursive: true });
160902
160964
  const tmp = `${this.file}.tmp`;
160903
- import_node_fs10.default.writeFileSync(tmp, JSON.stringify(Object.fromEntries(this.map), null, 2));
160904
- import_node_fs10.default.renameSync(tmp, this.file);
160965
+ import_node_fs11.default.writeFileSync(tmp, JSON.stringify(Object.fromEntries(this.map), null, 2));
160966
+ import_node_fs11.default.renameSync(tmp, this.file);
160905
160967
  } catch {
160906
160968
  }
160907
160969
  }
@@ -161080,11 +161142,12 @@ function collabDomain(opts) {
161080
161142
  const wsArts = [...kernel.model.artifacts.values()].filter((a) => a.workspace === req.params.id);
161081
161143
  const ops = (await Promise.all(wsArts.map((a) => oplog.read(a.id)))).flat();
161082
161144
  const signalsForThisCompany = opts.dispatcherSignalsOf ? (id) => opts.dispatcherSignalsOf(req.auth.companyId, id) : void 0;
161083
- const roleDefaultOwners = opts.roles ? new Map((await opts.roles.list()).map((r) => [r.name, r.defaultOwner])) : void 0;
161084
- const roleDefaultOwnerOf = roleDefaultOwners ? (role) => {
161085
- const o = roleDefaultOwners.get(role);
161145
+ const roleDefsByName = opts.roles ? new Map((await opts.roles.list()).map((r) => [r.name, { label: r.label, defaultOwner: r.defaultOwner }])) : void 0;
161146
+ const roleDefaultOwnerOf = roleDefsByName ? (role) => {
161147
+ const o = roleDefsByName.get(role)?.defaultOwner;
161086
161148
  return o ? o : void 0;
161087
161149
  } : void 0;
161150
+ const roleLabelOf = roleDefsByName ? (role) => roleDefsByName.get(role)?.label : void 0;
161088
161151
  const detail = buildWorkorderDetail(
161089
161152
  kernel.model,
161090
161153
  req.params.id,
@@ -161096,7 +161159,8 @@ function collabDomain(opts) {
161096
161159
  (id) => kernel.reviewerPreview(id),
161097
161160
  signalsForThisCompany,
161098
161161
  req.auth.actor,
161099
- roleDefaultOwnerOf
161162
+ roleDefaultOwnerOf,
161163
+ roleLabelOf
161100
161164
  );
161101
161165
  if (detail) return { status: 200, body: detail };
161102
161166
  const draft = await opts.workorderDrafts?.forWorkspace(req.params.id);
@@ -171187,7 +171251,7 @@ async function caseManifests(root) {
171187
171251
  return output.sort();
171188
171252
  }
171189
171253
  async function optionalResolvedFile(allowedRoot, referenceBase, value) {
171190
- if (typeof value !== "string" || ![".md", ".yaml", ".yml", ".json"].includes((0, import_node_path14.extname)(value))) return void 0;
171254
+ if (typeof value !== "string" || (0, import_node_path14.isAbsolute)(value) || ![".md", ".yaml", ".yml", ".json"].includes((0, import_node_path14.extname)(value))) return void 0;
171191
171255
  const referenced = (0, import_node_path14.resolve)(referenceBase, value);
171192
171256
  const path28 = inside(allowedRoot, referenced, "Referenced file");
171193
171257
  try {
@@ -171198,7 +171262,7 @@ async function optionalResolvedFile(allowedRoot, referenceBase, value) {
171198
171262
  return void 0;
171199
171263
  }
171200
171264
  }
171201
- async function resolvedEvaluator(caseDirectory, caseSpecialPath, input) {
171265
+ async function resolvedEvaluator(repositoryRoot, caseDirectory, caseSpecialPath, input) {
171202
171266
  const evaluator = structuredClone(object2(input, "caseSpecial.items[].evaluator"));
171203
171267
  const configPath = text(evaluator["config"], "caseSpecial.items[].evaluator.config");
171204
171268
  const absoluteConfig = inside((0, import_node_path14.dirname)(caseSpecialPath), configPath, "Evaluator config");
@@ -171208,14 +171272,14 @@ async function resolvedEvaluator(caseDirectory, caseSpecialPath, input) {
171208
171272
  if (!value || typeof value !== "object") return;
171209
171273
  for (const [key, child] of Object.entries(value)) {
171210
171274
  const childPath = keyPath ? `${keyPath}.${key}` : key;
171211
- const resolved = await optionalResolvedFile(caseDirectory, (0, import_node_path14.dirname)(absoluteConfig), child);
171275
+ const resolved = await optionalResolvedFile(repositoryRoot, (0, import_node_path14.dirname)(absoluteConfig), child);
171212
171276
  if (resolved !== void 0) resolvedFiles[childPath] = resolved;
171213
171277
  await walk(child, childPath);
171214
171278
  }
171215
171279
  };
171216
171280
  await walk(config2, "");
171217
171281
  const promptRef = config2["prompt"] ?? object2(config2["protocol"] ?? {}, "evaluator.protocol")["judge_prompt"];
171218
- const resolvedPrompt = await optionalResolvedFile(caseDirectory, (0, import_node_path14.dirname)(absoluteConfig), promptRef);
171282
+ const resolvedPrompt = await optionalResolvedFile(repositoryRoot, (0, import_node_path14.dirname)(absoluteConfig), promptRef);
171219
171283
  return {
171220
171284
  ...evaluator,
171221
171285
  resolved_config: {
@@ -171226,7 +171290,7 @@ async function resolvedEvaluator(caseDirectory, caseSpecialPath, input) {
171226
171290
  resolved_config_path: (0, import_node_path14.relative)(caseDirectory, absoluteConfig)
171227
171291
  };
171228
171292
  }
171229
- async function resolveCaseSpecial(caseDirectory, manifest) {
171293
+ async function resolveCaseSpecial(repositoryRoot, caseDirectory, manifest) {
171230
171294
  const evaluation = object2(manifest["evaluation"], "case.evaluation");
171231
171295
  const caseSpecialPath = inside(
171232
171296
  caseDirectory,
@@ -171242,7 +171306,7 @@ async function resolveCaseSpecial(caseDirectory, manifest) {
171242
171306
  const oraclePath = item["oracle"];
171243
171307
  return {
171244
171308
  ...item,
171245
- evaluator: await resolvedEvaluator(caseDirectory, caseSpecialPath, item["evaluator"]),
171309
+ evaluator: await resolvedEvaluator(repositoryRoot, caseDirectory, caseSpecialPath, item["evaluator"]),
171246
171310
  ...typeof oraclePath === "string" ? { resolved_oracle: await yaml(inside(caseDirectory, oraclePath, "Case oracle")) } : {}
171247
171311
  };
171248
171312
  }))
@@ -171278,7 +171342,7 @@ async function loadCase(root, manifestPath, commonRubric, registry2) {
171278
171342
  stages: Array.isArray(classification["stages"]) ? classification["stages"].map((stage) => text(stage, "case.classification.stages[]")) : [],
171279
171343
  commonRubric,
171280
171344
  specialtyRubric: await (0, import_promises5.readFile)(inside(root, text(rubricEntry["path"], `S rubric ${scopeType}.path`), "S rubric path"), "utf8"),
171281
- caseSpecial: await resolveCaseSpecial(caseDirectory, manifest),
171345
+ caseSpecial: await resolveCaseSpecial(root, caseDirectory, manifest),
171282
171346
  task: await task(caseDirectory, manifest),
171283
171347
  evaluatorVersion: `oasis-bench/${version2}`,
171284
171348
  rubricVersion: `oasis-bench/${version2}`
@@ -171647,7 +171711,7 @@ function resolvePlaybook2(ref2, ctx) {
171647
171711
  return def ? def.resolve(ctx) : null;
171648
171712
  }
171649
171713
  var BUG_FIX_INPUTS, BUG_FIX_STRUCTURE, ADOPT_EXTERNAL_INPUTS, ADOPT_EXTERNAL_STRUCTURE, BUILTIN2, PLAYBOOK_REFS;
171650
- var init_registry2 = __esm({
171714
+ var init_registry3 = __esm({
171651
171715
  "../server/src/domains/playbooks/registry.ts"() {
171652
171716
  "use strict";
171653
171717
  init_src();
@@ -172031,7 +172095,7 @@ var init_routes8 = __esm({
172031
172095
  "use strict";
172032
172096
  import_node_crypto29 = require("node:crypto");
172033
172097
  init_router();
172034
- init_registry2();
172098
+ init_registry3();
172035
172099
  init_planner();
172036
172100
  init_config_audit();
172037
172101
  init_migrate();
@@ -172050,11 +172114,11 @@ function normalize(patch) {
172050
172114
  ...reviewRoles !== void 0 ? { reviewRoles: [...new Set(reviewRoles.map((r) => r.trim()).filter(Boolean))] } : {}
172051
172115
  };
172052
172116
  }
172053
- var import_node_fs11, import_node_path15, SEP2, keyOf2, prefixOf2, MemoryPlaybookOverrideStore, FilePlaybookOverrideStore;
172117
+ var import_node_fs12, import_node_path15, SEP2, keyOf2, prefixOf2, MemoryPlaybookOverrideStore, FilePlaybookOverrideStore;
172054
172118
  var init_overrides = __esm({
172055
172119
  "../server/src/domains/playbooks/overrides.ts"() {
172056
172120
  "use strict";
172057
- import_node_fs11 = __toESM(require("node:fs"), 1);
172121
+ import_node_fs12 = __toESM(require("node:fs"), 1);
172058
172122
  import_node_path15 = __toESM(require("node:path"), 1);
172059
172123
  SEP2 = "::";
172060
172124
  keyOf2 = (companyId, ref2, nodeKey) => `${companyId}${SEP2}${ref2}${SEP2}${nodeKey}`;
@@ -172085,7 +172149,7 @@ var init_overrides = __esm({
172085
172149
  super();
172086
172150
  this.file = file;
172087
172151
  try {
172088
- const raw = JSON.parse(import_node_fs11.default.readFileSync(file, "utf8"));
172152
+ const raw = JSON.parse(import_node_fs12.default.readFileSync(file, "utf8"));
172089
172153
  for (const [k2, v2] of Object.entries(raw)) {
172090
172154
  if (v2 && typeof v2 === "object") this.map.set(k2, v2);
172091
172155
  }
@@ -172094,10 +172158,10 @@ var init_overrides = __esm({
172094
172158
  }
172095
172159
  persist() {
172096
172160
  try {
172097
- import_node_fs11.default.mkdirSync(import_node_path15.default.dirname(this.file), { recursive: true });
172161
+ import_node_fs12.default.mkdirSync(import_node_path15.default.dirname(this.file), { recursive: true });
172098
172162
  const tmp = `${this.file}.tmp`;
172099
- import_node_fs11.default.writeFileSync(tmp, JSON.stringify(Object.fromEntries(this.map), null, 2));
172100
- import_node_fs11.default.renameSync(tmp, this.file);
172163
+ import_node_fs12.default.writeFileSync(tmp, JSON.stringify(Object.fromEntries(this.map), null, 2));
172164
+ import_node_fs12.default.renameSync(tmp, this.file);
172101
172165
  } catch {
172102
172166
  }
172103
172167
  }
@@ -172125,7 +172189,7 @@ var init_playbooks2 = __esm({
172125
172189
  "../server/src/domains/playbooks/index.ts"() {
172126
172190
  "use strict";
172127
172191
  init_routes8();
172128
- init_registry2();
172192
+ init_registry3();
172129
172193
  init_routes8();
172130
172194
  init_overrides();
172131
172195
  }
@@ -172451,17 +172515,17 @@ var init_daemon_adapter = __esm({
172451
172515
  });
172452
172516
 
172453
172517
  // ../server/src/side-map.ts
172454
- var import_node_fs12, import_node_path16, FileSideMap;
172518
+ var import_node_fs13, import_node_path16, FileSideMap;
172455
172519
  var init_side_map = __esm({
172456
172520
  "../server/src/side-map.ts"() {
172457
172521
  "use strict";
172458
- import_node_fs12 = __toESM(require("node:fs"), 1);
172522
+ import_node_fs13 = __toESM(require("node:fs"), 1);
172459
172523
  import_node_path16 = __toESM(require("node:path"), 1);
172460
172524
  FileSideMap = class {
172461
172525
  constructor(file) {
172462
172526
  this.file = file;
172463
172527
  try {
172464
- const raw = JSON.parse(import_node_fs12.default.readFileSync(file, "utf8"));
172528
+ const raw = JSON.parse(import_node_fs13.default.readFileSync(file, "utf8"));
172465
172529
  for (const [k2, v2] of Object.entries(raw)) if (typeof v2 === "string") this.map.set(k2, v2);
172466
172530
  } catch {
172467
172531
  }
@@ -172483,10 +172547,10 @@ var init_side_map = __esm({
172483
172547
  }
172484
172548
  persist() {
172485
172549
  try {
172486
- import_node_fs12.default.mkdirSync(import_node_path16.default.dirname(this.file), { recursive: true });
172550
+ import_node_fs13.default.mkdirSync(import_node_path16.default.dirname(this.file), { recursive: true });
172487
172551
  const tmp = `${this.file}.tmp`;
172488
- import_node_fs12.default.writeFileSync(tmp, JSON.stringify(Object.fromEntries(this.map), null, 2));
172489
- import_node_fs12.default.renameSync(tmp, this.file);
172552
+ import_node_fs13.default.writeFileSync(tmp, JSON.stringify(Object.fromEntries(this.map), null, 2));
172553
+ import_node_fs13.default.renameSync(tmp, this.file);
172490
172554
  } catch {
172491
172555
  }
172492
172556
  }
@@ -173880,7 +173944,8 @@ ${ctx.nodeFault}
173880
173944
  // OASIS_STAGE=1:本会话里 link/spawn/unlink/seal/cancel-part 进编辑缓冲、apply 才提交(react 攒事务)。
173881
173945
  env: { ...prov?.env ?? {}, OASIS_STAGE: "1", ...workspace ? { OASIS_WORKSPACE: workspace } : {} },
173882
173946
  ...prov?.wrapperPaths && prov.wrapperPaths.length > 0 ? { wrapperPaths: prov.wrapperPaths } : {},
173883
- ...prov?.requiredTools && prov.requiredTools.length > 0 ? { requiredTools: prov.requiredTools } : {}
173947
+ ...prov?.requiredTools && prov.requiredTools.length > 0 ? { requiredTools: prov.requiredTools } : {},
173948
+ ...prov?.connectorCreds && prov.connectorCreds.length > 0 ? { connectorCreds: prov.connectorCreds } : {}
173884
173949
  };
173885
173950
  this.deps.log?.(`[coordinator] ${logMsg}`);
173886
173951
  const handle = await this.deps.adapter.spawn(job);
@@ -183371,10 +183436,10 @@ var init_postgres_model_prices = __esm({
183371
183436
  // ../storage/src/postgres-type-registry.ts
183372
183437
  async function backfillTypeRegistryFromFile(store, file) {
183373
183438
  if ((await store.list()).length > 0) return { filled: 0 };
183374
- if (!import_node_fs13.default.existsSync(file)) return { filled: 0 };
183439
+ if (!import_node_fs14.default.existsSync(file)) return { filled: 0 };
183375
183440
  let defs;
183376
183441
  try {
183377
- defs = JSON.parse(import_node_fs13.default.readFileSync(file, "utf8"));
183442
+ defs = JSON.parse(import_node_fs14.default.readFileSync(file, "utf8"));
183378
183443
  } catch {
183379
183444
  console.warn(`[type-registry-backfill] ${file} \u89E3\u6790\u5931\u8D25\uFF0C\u8DF3\u8FC7\u56DE\u586B\uFF08serve \u5C06\u7528\u4EE3\u7801\u5E38\u91CF\u64AD\u79CD\uFF09`);
183380
183445
  return { filled: 0 };
@@ -183384,11 +183449,11 @@ async function backfillTypeRegistryFromFile(store, file) {
183384
183449
  console.log(`[type-registry-backfill] \u51B3\u7B56 0062 \u56DE\u586B\uFF1A${defs.length} \u4E2A\u4EA7\u7269\u7C7B\u578B\u5DF2\u8FC1\u5165 Postgres`);
183385
183450
  return { filled: defs.length };
183386
183451
  }
183387
- var import_node_fs13, ident13, PostgresTypeRegistryStore;
183452
+ var import_node_fs14, ident13, PostgresTypeRegistryStore;
183388
183453
  var init_postgres_type_registry = __esm({
183389
183454
  "../storage/src/postgres-type-registry.ts"() {
183390
183455
  "use strict";
183391
- import_node_fs13 = __toESM(require("node:fs"), 1);
183456
+ import_node_fs14 = __toESM(require("node:fs"), 1);
183392
183457
  init_esm2();
183393
183458
  ident13 = (s2) => {
183394
183459
  if (!/^[a-z_][a-z0-9_]*$/.test(s2)) throw new Error(`invalid schema name: ${s2}`);
@@ -184502,6 +184567,7 @@ async function buildActorProvision(service, actorId) {
184502
184567
  const raw = await service.resolveActorEnv(actorId);
184503
184568
  const env = { ...raw };
184504
184569
  const wrapperPaths = [oasisWrapperScript()];
184570
+ const connectorCreds = [];
184505
184571
  const requiredTools = /* @__PURE__ */ new Set();
184506
184572
  const cleanupFns = [];
184507
184573
  const SENSITIVE_KEYS = [
@@ -184519,11 +184585,13 @@ async function buildActorProvision(service, actorId) {
184519
184585
  try {
184520
184586
  const feishu = new FeishuConnector();
184521
184587
  const sessionEnv = /* @__PURE__ */ new Map();
184522
- await feishu.inject({
184588
+ const feishuCreds = {
184523
184589
  app_id: raw["FEISHU_APP_ID"],
184524
184590
  app_secret: raw["FEISHU_APP_SECRET"],
184525
184591
  ...raw["FEISHU_USER_ACCESS_TOKEN"] ? { user_access_token: raw["FEISHU_USER_ACCESS_TOKEN"] } : {}
184526
- }, sessionEnv);
184592
+ };
184593
+ connectorCreds.push({ slug: feishu.config.slug, credentials: feishuCreds });
184594
+ await feishu.inject(feishuCreds, sessionEnv);
184527
184595
  for (const [k2, v2] of sessionEnv) env[k2] = v2;
184528
184596
  const staged = stageConnectorWrapper(feishu);
184529
184597
  if (staged) wrapperPaths.push(staged);
@@ -184537,7 +184605,12 @@ async function buildActorProvision(service, actorId) {
184537
184605
  try {
184538
184606
  const github = new GithubConnector();
184539
184607
  const sessionEnv = /* @__PURE__ */ new Map();
184540
- await github.inject({ access_token: raw["GITHUB_TOKEN"], actor_name: raw["GIT_AUTHOR_NAME"] ?? actorId.split(":").pop() ?? "oasis-agent" }, sessionEnv);
184608
+ const githubCreds = {
184609
+ access_token: raw["GITHUB_TOKEN"],
184610
+ actor_name: raw["GIT_AUTHOR_NAME"] ?? actorId.split(":").pop() ?? "oasis-agent"
184611
+ };
184612
+ connectorCreds.push({ slug: github.config.slug, credentials: githubCreds });
184613
+ await github.inject(githubCreds, sessionEnv);
184541
184614
  for (const [k2, v2] of sessionEnv) env[k2] = v2;
184542
184615
  const staged = stageConnectorWrapper(github);
184543
184616
  if (staged) wrapperPaths.push(staged);
@@ -184551,7 +184624,7 @@ async function buildActorProvision(service, actorId) {
184551
184624
  for (const fn of cleanupFns) await fn().catch(() => {
184552
184625
  });
184553
184626
  };
184554
- return { env, wrapperPaths, requiredTools: [...requiredTools], cleanup };
184627
+ return { env, wrapperPaths, requiredTools: [...requiredTools], connectorCreds, cleanup };
184555
184628
  }
184556
184629
  async function buildActorContext(service, actorId) {
184557
184630
  const [config2, connectors, installedSkills, record6] = await Promise.all([
@@ -185318,7 +185391,8 @@ async function startServe(opts) {
185318
185391
  limits,
185319
185392
  env: provision.env,
185320
185393
  wrapperPaths: provision.wrapperPaths,
185321
- ...provision.requiredTools.length > 0 ? { requiredTools: provision.requiredTools } : {}
185394
+ ...provision.requiredTools.length > 0 ? { requiredTools: provision.requiredTools } : {},
185395
+ ...provision.connectorCreds.length > 0 ? { connectorCreds: provision.connectorCreds } : {}
185322
185396
  });
185323
185397
  const chunks = [];
185324
185398
  handle.onOutput?.((chunk) => chunks.push(chunk));
@@ -185669,7 +185743,8 @@ async function startServe(opts) {
185669
185743
  ...workspace ? { OASIS_WORKSPACE: workspace } : {}
185670
185744
  },
185671
185745
  wrapperPaths: provision.wrapperPaths,
185672
- ...provision.requiredTools.length > 0 ? { requiredTools: provision.requiredTools } : {}
185746
+ ...provision.requiredTools.length > 0 ? { requiredTools: provision.requiredTools } : {},
185747
+ ...provision.connectorCreds.length > 0 ? { connectorCreds: provision.connectorCreds } : {}
185673
185748
  });
185674
185749
  const chatJobKey = `chat::${artifactId}`;
185675
185750
  chatLiveSessions.set(chatJobKey, { artifactId, sessionId: traceRunId, dispatchId: handle.id, kill: () => handle.kill() });
@@ -187230,7 +187305,7 @@ var RuntimeRouterAdapter = class {
187230
187305
  };
187231
187306
 
187232
187307
  // ../cli/src/daemon/reap-claude-projects.ts
187233
- var import_node_fs14 = __toESM(require("node:fs"), 1);
187308
+ var import_node_fs15 = __toESM(require("node:fs"), 1);
187234
187309
  var import_node_os9 = __toESM(require("node:os"), 1);
187235
187310
  var import_node_path18 = __toESM(require("node:path"), 1);
187236
187311
  function claudeProjectSlug(cwd) {
@@ -187243,9 +187318,9 @@ function claudeProjectsRoot() {
187243
187318
  function reapClaudeProjects(workdir, runtimeKind) {
187244
187319
  if (runtimeKind !== "claude" && runtimeKind !== "claude-code") return;
187245
187320
  const dir = import_node_path18.default.join(claudeProjectsRoot(), claudeProjectSlug(workdir));
187246
- if (!import_node_fs14.default.existsSync(dir)) return;
187321
+ if (!import_node_fs15.default.existsSync(dir)) return;
187247
187322
  try {
187248
- import_node_fs14.default.rmSync(dir, { recursive: true, force: true });
187323
+ import_node_fs15.default.rmSync(dir, { recursive: true, force: true });
187249
187324
  } catch {
187250
187325
  }
187251
187326
  }
@@ -187346,13 +187421,13 @@ async function startNode(opts) {
187346
187421
 
187347
187422
  // ../cli/src/daemon/machine-id.ts
187348
187423
  var import_node_child_process16 = require("node:child_process");
187349
- var import_node_fs15 = require("node:fs");
187424
+ var import_node_fs16 = require("node:fs");
187350
187425
  var import_node_crypto38 = require("node:crypto");
187351
187426
  var import_node_os11 = require("node:os");
187352
187427
  function linuxMachineId() {
187353
187428
  for (const p2 of ["/etc/machine-id", "/var/lib/dbus/machine-id"]) {
187354
187429
  try {
187355
- const v2 = (0, import_node_fs15.readFileSync)(p2, "utf8").trim();
187430
+ const v2 = (0, import_node_fs16.readFileSync)(p2, "utf8").trim();
187356
187431
  if (v2) return v2;
187357
187432
  } catch {
187358
187433
  }
@@ -189577,7 +189652,7 @@ ${res.warning}`);
189577
189652
  init_src6();
189578
189653
 
189579
189654
  // src/index.ts
189580
- var PKG_VERSION = true ? "0.1.70" : "dev";
189655
+ var PKG_VERSION = true ? "0.1.71" : "dev";
189581
189656
  var OASIS_DIR = path27.join(os9.homedir(), ".oasis");
189582
189657
  var CONFIG_FILE = path27.join(OASIS_DIR, "node-config.json");
189583
189658
  var PID_FILE = path27.join(OASIS_DIR, "node.pid");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oasis_test",
3
- "version": "0.1.70",
3
+ "version": "0.1.71",
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": "20ad053a32c3636f94509e06767e7bbb49b1bb8f"
29
+ "sourceHead": "d0ee4c4d3e4ff3fb73c414c8a84c9eab1b20916d"
30
30
  }
31
31
  }