oasis_test_v2 2.2.37 → 2.2.38

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 +53 -15
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -19656,7 +19656,7 @@ function groupRequirementsForPreview(rows) {
19656
19656
  const out = [];
19657
19657
  for (const [key, b2] of groups) {
19658
19658
  if (b2.source === "type") {
19659
- out.push({ source: "type", eligible: [], quorum: 1, roles: [key] });
19659
+ out.push({ source: "type", eligible: b2.eligible, quorum: 1, roles: [key] });
19660
19660
  } else {
19661
19661
  out.push({ source: b2.source, eligible: b2.eligible, quorum: 1 });
19662
19662
  }
@@ -20139,9 +20139,14 @@ var init_kernel_bridge = __esm({
20139
20139
  const nodeReqs = a.reviewers ?? [];
20140
20140
  if (nodeReqs.length > 0) {
20141
20141
  const requirements2 = groupRequirementsForPreview(nodeReqs);
20142
- const namedActors2 = nodeReqs.filter((r) => r.source !== "type").map((r) => ({ actor: r.actor, source: r.source }));
20142
+ const listed = nodeReqs.filter((r) => r.source !== "type").map((r) => ({ actor: r.actor, source: r.source }));
20143
+ for (const r of nodeReqs) {
20144
+ if (r.source === "type" && !listed.some((n) => n.actor === r.actor)) {
20145
+ listed.push({ actor: r.actor, source: "type" });
20146
+ }
20147
+ }
20143
20148
  return {
20144
- reviewers: namedActors2,
20149
+ reviewers: listed,
20145
20150
  quorum: requirements2.length,
20146
20151
  requirements: requirements2,
20147
20152
  typeName: a.type
@@ -203935,6 +203940,19 @@ function resolveCallbackBase(supplied, requestHost) {
203935
203940
  }
203936
203941
  return `${parsed.origin}${parsed.pathname.replace(/\/+$/, "")}`;
203937
203942
  }
203943
+ function companyAmbiguousError(actor, companies) {
203944
+ return new ApiError(
203945
+ 400,
203946
+ "COMPANY_AMBIGUOUS",
203947
+ `\u65E0\u6CD5\u786E\u5B9A\u5F53\u524D\u516C\u53F8\uFF1A${actor} \u5C5E\u4E8E\u591A\u5BB6\u516C\u53F8\uFF08${companies.join("\u3001")}\uFF09\uFF0C\u672C\u6B21\u8BF7\u6C42\u6CA1\u6709\u6307\u5B9A\u3002\u8BF7\u7528 x-oasis-company \u5934\u6307\u5B9A\u516C\u53F8 id \u6216 slug\uFF08CLI\uFF1A--company <\u516C\u53F8> \u6216 $OASIS_COMPANY\uFF09\u3002`,
203948
+ { companies: [...companies] }
203949
+ );
203950
+ }
203951
+ function writeApiError(res, err) {
203952
+ res.writeHead(err.status, { "content-type": "application/json" }).end(JSON.stringify({
203953
+ error: { code: err.code, message: err.message, ...err.details ?? {} }
203954
+ }));
203955
+ }
203938
203956
  function toApiError(err) {
203939
203957
  if (err instanceof ApiError) return err;
203940
203958
  const message = err instanceof Error ? err.message : String(err);
@@ -206280,6 +206298,10 @@ async function startOasisServer(opts) {
206280
206298
  }
206281
206299
  if (url.pathname.startsWith("/api/files/")) {
206282
206300
  const company = opts.resolveCompanyContext ? await opts.resolveCompanyContext(actor, req.headers, url.pathname) : void 0;
206301
+ if (company?.kind === "ambiguous") {
206302
+ writeApiError(res, companyAmbiguousError(actor, company.companies));
206303
+ return;
206304
+ }
206283
206305
  if (company && company.kind !== "ok") {
206284
206306
  res.writeHead(403, { "content-type": "application/json" }).end(JSON.stringify({
206285
206307
  error: { code: "FORBIDDEN", message: "\u65E0\u6743\u8BFB\u53D6\u8BE5\u516C\u53F8\u7684\u6587\u4EF6" }
@@ -206320,6 +206342,10 @@ async function startOasisServer(opts) {
206320
206342
  const rawBody = Buffer.concat(chunks).toString("utf8");
206321
206343
  const companyCtx = opts.resolveCompanyContext ? await opts.resolveCompanyContext(actor, req.headers, url.pathname) : void 0;
206322
206344
  const currentCompanyId = companyCtx?.kind === "ok" ? companyCtx.companyId : void 0;
206345
+ if (companyCtx?.kind === "ambiguous") {
206346
+ writeApiError(res, companyAmbiguousError(actor, companyCtx.companies));
206347
+ return;
206348
+ }
206323
206349
  const connectorActorsService = async (companyId) => opts.actors ? (await opts.actors.resolveCtx(companyId ?? currentCompanyId)).service : void 0;
206324
206350
  const wodrafts = opts.resolveWorkorderDrafts ? await opts.resolveWorkorderDrafts(currentCompanyId) : opts.workorderDrafts;
206325
206351
  const wodraftPlannerIssues = (opts.resolveWorkorderDraftPlannerIssues && await opts.resolveWorkorderDraftPlannerIssues(currentCompanyId)) ?? opts.workorderDraftPlannerIssues ?? defaultDraftPlannerIssuesStore;
@@ -264502,6 +264528,10 @@ async function startServe(opts) {
264502
264528
  const raw = headers["x-oasis-company"];
264503
264529
  const selector = typeof raw === "string" && raw ? raw : void 0;
264504
264530
  const me = await companies.currentUser({ actor }, headers);
264531
+ if (!selector && authz.startsWith("Bearer ")) {
264532
+ const active = (await companies.service.listForUser(me.accountId)).filter((c) => c.status === "active");
264533
+ if (active.length > 1) return { kind: "ambiguous", companies: active.map((c) => c.id) };
264534
+ }
264505
264535
  const ctx = await companies.service.resolveCurrentCompany(me.accountId, selector);
264506
264536
  if (!ctx) return { kind: "not-found", ...selector !== void 0 ? { selector } : {} };
264507
264537
  return ctx.isMember ? { kind: "ok", companyId: ctx.company.id } : { kind: "forbidden" };
@@ -271144,7 +271174,7 @@ function declaredBooleanFlags() {
271144
271174
  }
271145
271175
  return out;
271146
271176
  }
271147
- var GLOBAL_FLAGS = Object.freeze(/* @__PURE__ */ new Set(["server", "token", "dir", "workspace"]));
271177
+ var GLOBAL_FLAGS = Object.freeze(/* @__PURE__ */ new Set(["server", "token", "dir", "workspace", "company"]));
271148
271178
  var BEHAVIORAL_FLAGS = Object.freeze(/* @__PURE__ */ new Set(["set-json", "clear"]));
271149
271179
  var COMMAND_DECLS = {
271150
271180
  // —— 基础设施 ——
@@ -272918,8 +272948,9 @@ async function runConnectorEffectCli(argv) {
272918
272948
  var USAGE_HEADER = `oasis \u2014\u2014 artifact-centric \u534F\u4F5C\u5185\u6838 CLI\uFF08\u670D\u52A1\u7AEF\u7626\u5BA2\u6237\u7AEF\uFF09
272919
272949
 
272920
272950
  \u547D\u4EE4\u603B\u89C8\uFF08\u6309\u5206\u7EC4\u5217\u51FA\uFF1B\u5355\u6761\u8BE6\u60C5\u4E0E\u53C2\u6570\u7528 \`oasis help <\u547D\u4EE4>\` \u6216 \`oasis <\u547D\u4EE4> --help\`\uFF09\uFF1A`;
272921
- var USAGE_FOOTER = `\u901A\u7528\u53C2\u6570\uFF08\u6240\u6709\u547D\u4EE4\u901A\u7528\uFF09: [--server http://127.0.0.1:7320] [--token <t>] [--dir .oasis]
272922
- token \u89E3\u6790\u987A\u5E8F: --token > $OASIS_TOKEN > <dir>/operator-token\uFF08serve \u542F\u52A8\u65F6\u5199\u5230 <dir>/operator-token\uFF0C\u672C\u673A CLI \u81EA\u52A8\u8BFB\u53D6\uFF09`;
272951
+ var USAGE_FOOTER = `\u901A\u7528\u53C2\u6570\uFF08\u6240\u6709\u547D\u4EE4\u901A\u7528\uFF09: [--server http://127.0.0.1:7320] [--token <t>] [--dir .oasis] [--company <\u516C\u53F8 id \u6216 slug>]
272952
+ token \u89E3\u6790\u987A\u5E8F: --token > $OASIS_TOKEN > <dir>/operator-token\uFF08serve \u542F\u52A8\u65F6\u5199\u5230 <dir>/operator-token\uFF0C\u672C\u673A CLI \u81EA\u52A8\u8BFB\u53D6\uFF09
272953
+ \u516C\u53F8\u89E3\u6790\u987A\u5E8F: --company > $OASIS_COMPANY > \u670D\u52A1\u7AEF\u63A8\u65AD\uFF08token \u81EA\u5E26\u516C\u53F8\u7684\u6309 token\uFF1B\u8FD0\u7EF4/\u4EBA\u7C7B token \u6309\u8D26\u53F7\u6240\u5C5E\u516C\u53F8\uFF09`;
272923
272954
  var USAGE = `${USAGE_HEADER}
272924
272955
 
272925
272956
  ${buildCommandIndex()}
@@ -273160,8 +273191,13 @@ async function waitForCommandAuthorization(base, headers, draftId, fallback) {
273160
273191
  }
273161
273192
  }
273162
273193
  }
273163
- function makeClient(base, token) {
273164
- const baseHeaders = { authorization: `Bearer ${token}`, "content-type": "application/json" };
273194
+ function apiHeaders(token, company) {
273195
+ const headers = { authorization: `Bearer ${token}`, "content-type": "application/json" };
273196
+ if (company) headers["x-oasis-company"] = company;
273197
+ return headers;
273198
+ }
273199
+ function makeClient(base, token, opts = {}) {
273200
+ const baseHeaders = apiHeaders(token, opts.company);
273165
273201
  const chatSessionId = process.env["OASIS_CHAT_SESSION_ID"];
273166
273202
  if (chatSessionId) baseHeaders["x-chat-session-id"] = chatSessionId;
273167
273203
  const headers = baseHeaders;
@@ -273622,7 +273658,8 @@ async function runCli(argv, println = console.log, progressln = console.error) {
273622
273658
  if (!token) {
273623
273659
  throw new Error(`\u65E0 token\uFF1A\u5148 oasis serve\uFF08\u4F1A\u751F\u6210 ${tokenFile}\uFF09\uFF0C\u6216\u663E\u5F0F --token / $OASIS_TOKEN`);
273624
273660
  }
273625
- const api = makeClient(base, token);
273661
+ const companySelector = (flags.get("company") ?? process.env["OASIS_COMPANY"])?.trim() || void 0;
273662
+ const api = makeClient(base, token, companySelector ? { company: companySelector } : {});
273626
273663
  if (command === "reconcile-terminal-runs") {
273627
273664
  const runIds = flags.get("run-ids")?.split(",").map((x2) => x2.trim()).filter(Boolean);
273628
273665
  const rows = await api.post("/api/admin/reconcile-terminal-runs", { execute: flags.get("execute") === "true", ...runIds ? { runIds } : {} });
@@ -273744,8 +273781,9 @@ async function runCli(argv, println = console.log, progressln = console.error) {
273744
273781
  switch (command) {
273745
273782
  // 委派一位专家(提案 §7)。四个子形态共用一条命令,靠给了哪个 flag 分流。
273746
273783
  //
273747
- // ⚠️ **没有 `--company`**:公司与父会话身份一律从签名 claims 取(不变量 3 / §6.1.2)。
273748
- // 加一个 `--company` 就是把这份保证亲手拆掉——那等于允许 agent 写到别人名下。
273784
+ // ⚠️ **没有自己的 `--company`**:公司与父会话身份一律从签名 claims 取(不变量 3 / §6.1.2)。
273785
+ // 往请求体里加一个公司参数就是把这份保证亲手拆掉——那等于允许 agent 写到别人名下。
273786
+ // 全局 `--company` 只发 `x-oasis-company` 头,服务端对带公司 claims 的 token 不看这个头(见 apiHeaders)。
273749
273787
  // ⚠️ **没有 `--wait-ms`**:一期只做异步。理由不是墙钟不够(chat 墙钟 120 分钟),是三条:
273750
273788
  // 阻塞期间主会话那一轮一直挂着(用户看着「正在输入」十几分钟、他这期间说的话只能排队)、
273751
273789
  // 一个进程挂着空等不产出任何东西、这十几分钟里 serve 重启或节点掉线那一轮就白丢了
@@ -275199,7 +275237,7 @@ ${res.warning}`);
275199
275237
  throw forbidden(e) ?? e;
275200
275238
  }
275201
275239
  const where = scope === "project" ? `\u9879\u76EE ${projectId2}` : scope === "personal" ? `\u5458\u5DE5 ${actorId}` : "\u5168\u7EC4\u7EC7";
275202
- println(`\u5DF2\u5199\u5165 ${key}\uFF08${where}\uFF0C\u6295\u9012=${delivery}\uFF09`);
275240
+ println(`\u5DF2\u5199\u5165 ${key}\uFF08${companySelector ? `\u516C\u53F8 ${companySelector} \xB7 ` : ""}${where}\uFF0C\u6295\u9012=${delivery}\uFF09`);
275203
275241
  break;
275204
275242
  }
275205
275243
  if (sub === "rm") {
@@ -275215,7 +275253,7 @@ ${res.warning}`);
275215
275253
  } catch (e) {
275216
275254
  throw forbidden(e) ?? e;
275217
275255
  }
275218
- println(`\u5DF2\u5220\u9664 ${key}\uFF08${scope === "project" ? `\u9879\u76EE ${projectId2}` : scope === "personal" ? `\u5458\u5DE5 ${actorId}` : "\u5168\u7EC4\u7EC7"}\uFF09`);
275256
+ println(`\u5DF2\u5220\u9664 ${key}\uFF08${companySelector ? `\u516C\u53F8 ${companySelector} \xB7 ` : ""}${scope === "project" ? `\u9879\u76EE ${projectId2}` : scope === "personal" ? `\u5458\u5DE5 ${actorId}` : "\u5168\u7EC4\u7EC7"}\uFF09`);
275219
275257
  break;
275220
275258
  }
275221
275259
  throw new Error(`\u672A\u77E5\u5B50\u547D\u4EE4\uFF1Aoasis var ${sub ?? ""}
@@ -275603,7 +275641,7 @@ ${res.warning}`);
275603
275641
  // A3:成图事务(与 intervene 同管线、分语义命名——铺图不是手术)
275604
275642
  case "intervene": {
275605
275643
  const plan = JSON.parse(readFileArg(need(flags, "file")));
275606
- const headers = { authorization: `Bearer ${token}`, "content-type": "application/json" };
275644
+ const headers = apiHeaders(token, companySelector);
275607
275645
  const previewRes = await fetch(`${base}/api/intervention/preview`, {
275608
275646
  method: "POST",
275609
275647
  headers,
@@ -276646,7 +276684,7 @@ function shimScript() {
276646
276684
  }
276647
276685
 
276648
276686
  // src/index.ts
276649
- var PKG_VERSION = true ? "2.2.37" : "dev";
276687
+ var PKG_VERSION = true ? "2.2.38" : "dev";
276650
276688
  var LOCAL_BIN = localBin();
276651
276689
  var NPM_PREFIX = npmPrefix();
276652
276690
  var INSTANCE = DEFAULT_INSTANCE;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oasis_test_v2",
3
- "version": "2.2.37",
3
+ "version": "2.2.38",
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": "e9498c25c512b5edf75fde28c132f60d079b20a0"
29
+ "sourceHead": "55454aeb4d2b4d5b0b530b8777cd1b62d86803c5"
30
30
  }
31
31
  }