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.
- package/dist/index.js +53 -15
- 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:
|
|
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
|
|
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:
|
|
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
|
|
273164
|
-
const
|
|
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
|
|
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
|
-
// ⚠️
|
|
273748
|
-
//
|
|
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 =
|
|
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.
|
|
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.
|
|
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": "
|
|
29
|
+
"sourceHead": "55454aeb4d2b4d5b0b530b8777cd1b62d86803c5"
|
|
30
30
|
}
|
|
31
31
|
}
|