oasis_test_v2 2.2.34 → 2.2.35

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 +234 -199
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -149,6 +149,9 @@ function normalizeGitRemote(remote) {
149
149
  function projectActorKind(actorId) {
150
150
  return actorId.startsWith("actor:human:") ? "human" : "agent";
151
151
  }
152
+ function projectIdFromUuid(uuid2) {
153
+ return `proj_${uuid2.replace(/-/g, "").slice(0, 8)}`;
154
+ }
152
155
  var init_project = __esm({
153
156
  "../contract/src/project.ts"() {
154
157
  "use strict";
@@ -205734,10 +205737,10 @@ async function startOasisServer(opts) {
205734
205737
  ...fp(p2)
205735
205738
  }))
205736
205739
  ] : [];
205737
- const { randomUUID: randomUUID41 } = await import("node:crypto");
205740
+ const { randomUUID: randomUUID42 } = await import("node:crypto");
205738
205741
  try {
205739
205742
  await store.enqueuePendingMessage({
205740
- id: randomUUID41(),
205743
+ id: randomUUID42(),
205741
205744
  chatSessionId: input.chatSessionId,
205742
205745
  text: input.text,
205743
205746
  createdAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -205770,11 +205773,11 @@ async function startOasisServer(opts) {
205770
205773
  ...f2?.mtime ? { srcMtime: f2.mtime } : {}
205771
205774
  };
205772
205775
  });
205773
- const { randomUUID: randomUUID41 } = await import("node:crypto");
205776
+ const { randomUUID: randomUUID42 } = await import("node:crypto");
205774
205777
  const nowIso = (/* @__PURE__ */ new Date()).toISOString();
205775
205778
  try {
205776
205779
  await store.enqueuePendingMessage({
205777
- id: randomUUID41(),
205780
+ id: randomUUID42(),
205778
205781
  chatSessionId: input.chatSessionId,
205779
205782
  text: "",
205780
205783
  createdAt: nowIso,
@@ -207102,7 +207105,7 @@ async function startOasisServer(opts) {
207102
207105
  const openRoom = async () => {
207103
207106
  let chatSessionId2;
207104
207107
  if (chatStore) {
207105
- const { randomUUID: randomUUID41 } = await import("node:crypto");
207108
+ const { randomUUID: randomUUID42 } = await import("node:crypto");
207106
207109
  const known = discussSessions.get(itemKey);
207107
207110
  const knownSession = known ? await chatStore.getSession(known) : null;
207108
207111
  if (knownSession && knownSession.workspace === ctx.workspace && knownSession.humanActorId === ctx.ownerId && (!body2.escalationId || knownSession.escalationId === body2.escalationId)) chatSessionId2 = known;
@@ -207111,7 +207114,7 @@ async function startOasisServer(opts) {
207111
207114
  chatSessionId2 = existing[0]?.id;
207112
207115
  }
207113
207116
  if (!chatSessionId2) {
207114
- chatSessionId2 = randomUUID41();
207117
+ chatSessionId2 = randomUUID42();
207115
207118
  const now = (/* @__PURE__ */ new Date()).toISOString();
207116
207119
  const title = `\u89E3\u51B3\uFF1A${ctx.seed.slice(ctx.seed.indexOf("\uFF1A") + 1, ctx.seed.indexOf("\uFF1A") + 25) || "\u5DE5\u5355\u5361\u70B9"}`;
207117
207120
  const reg0 = (await resolveEngine(currentCompanyId).catch(() => null))?.registry ?? opts.registry;
@@ -207980,14 +207983,14 @@ ${composed}`;
207980
207983
  runtimeSessionId: session.nativeSessionId ?? session.id
207981
207984
  }).catch(() => void 0);
207982
207985
  }
207983
- const { randomUUID: randomUUID42 } = await import("node:crypto");
207986
+ const { randomUUID: randomUUID43 } = await import("node:crypto");
207984
207987
  const persistAttachments = effectiveAttachments.map((a) => ({
207985
207988
  name: a.name,
207986
207989
  ...a.blobRef !== void 0 ? { blobRef: a.blobRef } : {},
207987
207990
  ...a.contentType !== void 0 ? { contentType: a.contentType } : {}
207988
207991
  }));
207989
207992
  await chatStore.appendMessage({
207990
- id: randomUUID42(),
207993
+ id: randomUUID43(),
207991
207994
  sessionId: persistTarget.id,
207992
207995
  role: "user",
207993
207996
  content: persistedUserMessage,
@@ -208462,8 +208465,8 @@ ${composed}`;
208462
208465
  }
208463
208466
  }
208464
208467
  const { spawn: spawn10 } = await import("node:child_process");
208465
- const { randomUUID: randomUUID41 } = await import("node:crypto");
208466
- const sessionId = body2.sessionId ?? randomUUID41();
208468
+ const { randomUUID: randomUUID42 } = await import("node:crypto");
208469
+ const sessionId = body2.sessionId ?? randomUUID42();
208467
208470
  const args = [
208468
208471
  "-p",
208469
208472
  body2.message,
@@ -208759,8 +208762,8 @@ ${composed}`;
208759
208762
  res.writeHead(400, { "content-type": "application/json" }).end(JSON.stringify({ error: `\u56DE\u8C03\u5730\u5740\u4E0D\u53EF\u7528\uFF0C\u5DF2\u4E2D\u6B62\uFF08\u907F\u514D\u5728 GitHub \u4E0A\u7559\u4E0B\u5B64\u513F App\uFF09\uFF1A${e.message}` }));
208760
208763
  return;
208761
208764
  }
208762
- const { randomUUID: randomUUID41 } = await import("node:crypto");
208763
- const state = randomUUID41();
208765
+ const { randomUUID: randomUUID42 } = await import("node:crypto");
208766
+ const state = randomUUID42();
208764
208767
  const nameSlug = (actorName || actorId?.split(":").pop() || owner?.login || "bot").toLowerCase().replace(/[^a-z0-9-]+/g, "-").replace(/^-|-$/g, "").slice(0, 24) || "bot";
208765
208768
  const manifest = buildAppManifest({
208766
208769
  employeeSlug: nameSlug,
@@ -212824,6 +212827,19 @@ var init_stats = __esm({
212824
212827
  }
212825
212828
  });
212826
212829
 
212830
+ // ../server/src/domains/projects/project-id.ts
212831
+ function randomProjectId() {
212832
+ return projectIdFromUuid((0, import_node_crypto41.randomUUID)());
212833
+ }
212834
+ var import_node_crypto41;
212835
+ var init_project_id = __esm({
212836
+ "../server/src/domains/projects/project-id.ts"() {
212837
+ "use strict";
212838
+ import_node_crypto41 = require("node:crypto");
212839
+ init_src();
212840
+ }
212841
+ });
212842
+
212827
212843
  // ../server/src/domains/projects/service.ts
212828
212844
  function sanitizeCreatorActorId(raw) {
212829
212845
  const id = raw?.trim();
@@ -212965,10 +212981,6 @@ function namedError(name, message) {
212965
212981
  err.name = name;
212966
212982
  return err;
212967
212983
  }
212968
- function slugProjectId(name) {
212969
- const slug6 = name.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
212970
- return `proj_${slug6 || Date.now()}`;
212971
- }
212972
212984
  function dirname24(path41) {
212973
212985
  const norm = path41.replace(/^\/+|\/+$/g, "");
212974
212986
  const idx = norm.lastIndexOf("/");
@@ -213165,6 +213177,7 @@ var init_service4 = __esm({
213165
213177
  init_uncategorized_project();
213166
213178
  init_workorders();
213167
213179
  init_stats();
213180
+ init_project_id();
213168
213181
  init_node_state();
213169
213182
  DEFAULT_AGENT_ACTOR = "actor:agent:system";
213170
213183
  CHAT_FOLDER_TASK_LABEL = "\u5BF9\u8BDD";
@@ -213454,9 +213467,14 @@ var init_service4 = __esm({
213454
213467
  async createProject(input) {
213455
213468
  if (!input.name.trim()) throw new Error("project name is required");
213456
213469
  const now = (/* @__PURE__ */ new Date()).toISOString();
213457
- const id = input.id ?? slugProjectId(input.name);
213458
- const existing = await this.projects.getProject(id);
213459
- if (existing) return this.withProjectDerivedState(existing);
213470
+ let id;
213471
+ if (input.id !== void 0 && input.id.trim() !== "") {
213472
+ id = input.id;
213473
+ const existing = await this.projects.getProject(id);
213474
+ if (existing) return this.withProjectDerivedState(existing);
213475
+ } else {
213476
+ id = await this.allocateProjectId();
213477
+ }
213460
213478
  const createdById = sanitizeCreatorActorId(input.createdBy);
213461
213479
  const project = {
213462
213480
  id,
@@ -213492,6 +213510,14 @@ var init_service4 = __esm({
213492
213510
  }
213493
213511
  return await this.getProject(id) ?? project;
213494
213512
  }
213513
+ /** 给「没带 id 的新建」挑一个本公司还没用过的随机 id(`randomProjectId`);连撞几次说明生成器坏了,直接报错。 */
213514
+ async allocateProjectId() {
213515
+ for (let attempt = 0; attempt < 5; attempt++) {
213516
+ const id = randomProjectId();
213517
+ if (!await this.projects.getProject(id)) return id;
213518
+ }
213519
+ throw new Error("project id allocation failed: random ids kept colliding");
213520
+ }
213495
213521
  async getProject(id) {
213496
213522
  if (isUncategorizedProjectId(id)) return this.buildUncategorizedProject();
213497
213523
  const project = await this.projects.getProject(id);
@@ -214834,12 +214860,12 @@ var init_service4 = __esm({
214834
214860
  });
214835
214861
 
214836
214862
  // ../server/src/dev-store.ts
214837
- var import_node_crypto41, fs20, path21, NdjsonOplogStore, DirBlobStore, MUTATORS, FileTypeRegistryStore, FileRoleRegistryStore, FileRegistryStore, FileAssistantBindStore, FileHumanPrefsStore, FileProjectStateStore, FileArtifactStateStore, FileTraceStore, MemoryChatSessionStore, FileChatSessionStore, MemoryChatTurnStore, FileChatTurnStore, MemoryReadMarkerStore, FileReadMarkerStore;
214863
+ var import_node_crypto42, fs20, path21, NdjsonOplogStore, DirBlobStore, MUTATORS, FileTypeRegistryStore, FileRoleRegistryStore, FileRegistryStore, FileAssistantBindStore, FileHumanPrefsStore, FileProjectStateStore, FileArtifactStateStore, FileTraceStore, MemoryChatSessionStore, FileChatSessionStore, MemoryChatTurnStore, FileChatTurnStore, MemoryReadMarkerStore, FileReadMarkerStore;
214838
214864
  var init_dev_store = __esm({
214839
214865
  "../server/src/dev-store.ts"() {
214840
214866
  "use strict";
214841
214867
  init_src();
214842
- import_node_crypto41 = require("node:crypto");
214868
+ import_node_crypto42 = require("node:crypto");
214843
214869
  fs20 = __toESM(require("node:fs"), 1);
214844
214870
  path21 = __toESM(require("node:path"), 1);
214845
214871
  init_src();
@@ -214893,7 +214919,7 @@ var init_dev_store = __esm({
214893
214919
  return path21.join(this.dir, hash2);
214894
214920
  }
214895
214921
  async put(bytes2) {
214896
- const hash2 = (0, import_node_crypto41.createHash)("sha256").update(bytes2).digest("hex");
214922
+ const hash2 = (0, import_node_crypto42.createHash)("sha256").update(bytes2).digest("hex");
214897
214923
  const file = this.fileOf(hash2);
214898
214924
  if (!fs20.existsSync(file)) fs20.writeFileSync(file, bytes2);
214899
214925
  return hash2;
@@ -216093,7 +216119,7 @@ var init_company_engine_router = __esm({
216093
216119
 
216094
216120
  // ../server/src/skill-market-client.ts
216095
216121
  function digestOf2(bytes2) {
216096
- return `sha256:${(0, import_node_crypto42.createHash)("sha256").update(bytes2).digest("hex")}`;
216122
+ return `sha256:${(0, import_node_crypto43.createHash)("sha256").update(bytes2).digest("hex")}`;
216097
216123
  }
216098
216124
  function createSkillMarketClientFromEnv(env = process.env) {
216099
216125
  const base = env["SKILL_MARKET_BASE_URL"];
@@ -216104,11 +216130,11 @@ function createSkillMarketClientFromEnv(env = process.env) {
216104
216130
  function sleep4(ms) {
216105
216131
  return new Promise((r) => setTimeout(r, ms));
216106
216132
  }
216107
- var import_node_crypto42, DisabledSkillMarketClient, HttpSkillMarketClient;
216133
+ var import_node_crypto43, DisabledSkillMarketClient, HttpSkillMarketClient;
216108
216134
  var init_skill_market_client = __esm({
216109
216135
  "../server/src/skill-market-client.ts"() {
216110
216136
  "use strict";
216111
- import_node_crypto42 = require("node:crypto");
216137
+ import_node_crypto43 = require("node:crypto");
216112
216138
  init_src();
216113
216139
  DisabledSkillMarketClient = class {
216114
216140
  async listSkills(_input) {
@@ -217030,11 +217056,11 @@ function typeDefError(def, mode) {
217030
217056
  }
217031
217057
  return null;
217032
217058
  }
217033
- var import_node_crypto43, RESERVED_FIELD_NAMES, ARTIFACT_TYPE_ACCENTS, TYPE_DEF_SCHEMA, TypesAdminService;
217059
+ var import_node_crypto44, RESERVED_FIELD_NAMES, ARTIFACT_TYPE_ACCENTS, TYPE_DEF_SCHEMA, TypesAdminService;
217034
217060
  var init_types_admin = __esm({
217035
217061
  "../server/src/types-admin.ts"() {
217036
217062
  "use strict";
217037
- import_node_crypto43 = require("node:crypto");
217063
+ import_node_crypto44 = require("node:crypto");
217038
217064
  init_zod();
217039
217065
  init_src5();
217040
217066
  init_config_audit();
@@ -217161,7 +217187,7 @@ var init_types_admin = __esm({
217161
217187
  async trace(change, target, by, detail) {
217162
217188
  try {
217163
217189
  await this.audit?.({
217164
- id: `reg_${(0, import_node_crypto43.randomUUID)()}`,
217190
+ id: `reg_${(0, import_node_crypto44.randomUUID)()}`,
217165
217191
  actor: by ?? SYSTEM_CONFIG_ACTOR,
217166
217192
  kind: "registry_change",
217167
217193
  target,
@@ -217309,11 +217335,11 @@ function roleDefError(def, mode) {
217309
217335
  }
217310
217336
  return null;
217311
217337
  }
217312
- var import_node_crypto44, ACCENTS, ROLE_DEF_SCHEMA, RolesAdminService;
217338
+ var import_node_crypto45, ACCENTS, ROLE_DEF_SCHEMA, RolesAdminService;
217313
217339
  var init_roles_admin = __esm({
217314
217340
  "../server/src/roles-admin.ts"() {
217315
217341
  "use strict";
217316
- import_node_crypto44 = require("node:crypto");
217342
+ import_node_crypto45 = require("node:crypto");
217317
217343
  init_zod();
217318
217344
  init_src5();
217319
217345
  init_config_audit();
@@ -217338,7 +217364,7 @@ var init_roles_admin = __esm({
217338
217364
  async trace(change, target, by, detail) {
217339
217365
  try {
217340
217366
  await this.deps.audit?.({
217341
- id: `reg_${(0, import_node_crypto44.randomUUID)()}`,
217367
+ id: `reg_${(0, import_node_crypto45.randomUUID)()}`,
217342
217368
  actor: by ?? SYSTEM_CONFIG_ACTOR,
217343
217369
  kind: "registry_change",
217344
217370
  target,
@@ -219589,7 +219615,7 @@ function wireRecoveredChatTurn(deps) {
219589
219615
  const segText = itemLedger.projectContent();
219590
219616
  const segParts = collectedParts();
219591
219617
  const closingId = currentMsgId;
219592
- const nextId = (0, import_node_crypto45.randomUUID)();
219618
+ const nextId = (0, import_node_crypto46.randomUUID)();
219593
219619
  currentMsgId = nextId;
219594
219620
  itemLedger.beginSegment();
219595
219621
  live.setAssistantMessageId(nextId);
@@ -219603,7 +219629,7 @@ function wireRecoveredChatTurn(deps) {
219603
219629
  ...segParts.length ? { parts: segParts } : {}
219604
219630
  }).catch(() => void 0);
219605
219631
  await store.appendMessage({
219606
- id: (0, import_node_crypto45.randomUUID)(),
219632
+ id: (0, import_node_crypto46.randomUUID)(),
219607
219633
  sessionId: plan.chatSessionId,
219608
219634
  role: "user",
219609
219635
  content: text5,
@@ -220042,11 +220068,11 @@ async function recoverChatTurnsAcrossCompanies(deps) {
220042
220068
  }
220043
220069
  return { ...result, recovered };
220044
220070
  }
220045
- var import_node_crypto45, asObj3, partsOf, maxPartSeq, exitFailed, exitErrorText, runTerminalPatch;
220071
+ var import_node_crypto46, asObj3, partsOf, maxPartSeq, exitFailed, exitErrorText, runTerminalPatch;
220046
220072
  var init_chat_recovery = __esm({
220047
220073
  "../server/src/chat-recovery.ts"() {
220048
220074
  "use strict";
220049
- import_node_crypto45 = require("node:crypto");
220075
+ import_node_crypto46 = require("node:crypto");
220050
220076
  init_chat_parts();
220051
220077
  init_sink();
220052
220078
  init_resilient_appender();
@@ -220076,8 +220102,8 @@ var init_chat_recovery = __esm({
220076
220102
 
220077
220103
  // ../server/src/auth/crypto.ts
220078
220104
  function hashPassword(password) {
220079
- const salt = (0, import_node_crypto46.randomBytes)(16);
220080
- const dk = (0, import_node_crypto46.scryptSync)(password, salt, SCRYPT_KEYLEN, { N: SCRYPT_N, maxmem: 64 * 1024 * 1024 });
220105
+ const salt = (0, import_node_crypto47.randomBytes)(16);
220106
+ const dk = (0, import_node_crypto47.scryptSync)(password, salt, SCRYPT_KEYLEN, { N: SCRYPT_N, maxmem: 64 * 1024 * 1024 });
220081
220107
  return `scrypt$${SCRYPT_N}$${salt.toString("base64url")}$${dk.toString("base64url")}`;
220082
220108
  }
220083
220109
  function verifyPassword(password, stored) {
@@ -220094,8 +220120,8 @@ function verifyPassword(password, stored) {
220094
220120
  return false;
220095
220121
  }
220096
220122
  if (expected.length === 0) return false;
220097
- const dk = (0, import_node_crypto46.scryptSync)(password, salt, expected.length, { N, maxmem: 64 * 1024 * 1024 });
220098
- return dk.length === expected.length && (0, import_node_crypto46.timingSafeEqual)(dk, expected);
220123
+ const dk = (0, import_node_crypto47.scryptSync)(password, salt, expected.length, { N, maxmem: 64 * 1024 * 1024 });
220124
+ return dk.length === expected.length && (0, import_node_crypto47.timingSafeEqual)(dk, expected);
220099
220125
  }
220100
220126
  function b64urlJson(value2) {
220101
220127
  return Buffer.from(JSON.stringify(value2)).toString("base64url");
@@ -220103,17 +220129,17 @@ function b64urlJson(value2) {
220103
220129
  function signSession(claims, secret) {
220104
220130
  const head = b64urlJson({ alg: "HS256", typ: "JWT" });
220105
220131
  const body2 = b64urlJson(claims);
220106
- const sig = (0, import_node_crypto46.createHmac)("sha256", secret).update(`${head}.${body2}`).digest("base64url");
220132
+ const sig = (0, import_node_crypto47.createHmac)("sha256", secret).update(`${head}.${body2}`).digest("base64url");
220107
220133
  return `${head}.${body2}.${sig}`;
220108
220134
  }
220109
220135
  function verifySession(token, secret, nowMs) {
220110
220136
  const parts = token.split(".");
220111
220137
  if (parts.length !== 3) return null;
220112
220138
  const [head, body2, sig] = parts;
220113
- const expected = (0, import_node_crypto46.createHmac)("sha256", secret).update(`${head}.${body2}`).digest("base64url");
220139
+ const expected = (0, import_node_crypto47.createHmac)("sha256", secret).update(`${head}.${body2}`).digest("base64url");
220114
220140
  const got = Buffer.from(sig);
220115
220141
  const exp = Buffer.from(expected);
220116
- if (got.length !== exp.length || !(0, import_node_crypto46.timingSafeEqual)(got, exp)) return null;
220142
+ if (got.length !== exp.length || !(0, import_node_crypto47.timingSafeEqual)(got, exp)) return null;
220117
220143
  let claims;
220118
220144
  try {
220119
220145
  claims = JSON.parse(Buffer.from(body2, "base64url").toString("utf8"));
@@ -220125,21 +220151,21 @@ function verifySession(token, secret, nowMs) {
220125
220151
  return claims;
220126
220152
  }
220127
220153
  function generateCode() {
220128
- return String((0, import_node_crypto46.randomInt)(0, 1e6)).padStart(6, "0");
220154
+ return String((0, import_node_crypto47.randomInt)(0, 1e6)).padStart(6, "0");
220129
220155
  }
220130
220156
  function hashCode(code2, secret) {
220131
- return (0, import_node_crypto46.createHmac)("sha256", secret).update(`code:${code2}`).digest("base64url");
220157
+ return (0, import_node_crypto47.createHmac)("sha256", secret).update(`code:${code2}`).digest("base64url");
220132
220158
  }
220133
220159
  function safeEqualHash(a, b2) {
220134
220160
  const ba = Buffer.from(a);
220135
220161
  const bb = Buffer.from(b2);
220136
- return ba.length === bb.length && (0, import_node_crypto46.timingSafeEqual)(ba, bb);
220162
+ return ba.length === bb.length && (0, import_node_crypto47.timingSafeEqual)(ba, bb);
220137
220163
  }
220138
- var import_node_crypto46, SCRYPT_N, SCRYPT_KEYLEN;
220164
+ var import_node_crypto47, SCRYPT_N, SCRYPT_KEYLEN;
220139
220165
  var init_crypto2 = __esm({
220140
220166
  "../server/src/auth/crypto.ts"() {
220141
220167
  "use strict";
220142
- import_node_crypto46 = require("node:crypto");
220168
+ import_node_crypto47 = require("node:crypto");
220143
220169
  SCRYPT_N = 16384;
220144
220170
  SCRYPT_KEYLEN = 32;
220145
220171
  }
@@ -221289,16 +221315,16 @@ function variableKeyFromEnv(env = process.env) {
221289
221315
  return buf;
221290
221316
  }
221291
221317
  if (env.NODE_ENV === "production") throw new Error("OASIS_VAR_KEY is required in production");
221292
- return (0, import_node_crypto47.createHash)("sha256").update("oasis-dev-only-variable-key").digest();
221318
+ return (0, import_node_crypto48.createHash)("sha256").update("oasis-dev-only-variable-key").digest();
221293
221319
  }
221294
221320
  function dedupe(ids2) {
221295
221321
  return [...new Set(ids2.filter((x2) => typeof x2 === "string" && x2.length > 0))];
221296
221322
  }
221297
- var import_node_crypto47, REDACTED_MARKER, ActorsService, mask, changedKeys;
221323
+ var import_node_crypto48, REDACTED_MARKER, ActorsService, mask, changedKeys;
221298
221324
  var init_service5 = __esm({
221299
221325
  "../server/src/domains/actors/service.ts"() {
221300
221326
  "use strict";
221301
- import_node_crypto47 = require("node:crypto");
221327
+ import_node_crypto48 = require("node:crypto");
221302
221328
  init_skill_fetcher();
221303
221329
  init_identity();
221304
221330
  init_migrate();
@@ -221862,7 +221888,7 @@ ${input.description}
221862
221888
  */
221863
221889
  buildSkillFile(skillId, path41, content3, now) {
221864
221890
  const bytes2 = new TextEncoder().encode(content3);
221865
- const blobHash = (0, import_node_crypto47.createHash)("sha256").update(bytes2).digest("hex");
221891
+ const blobHash = (0, import_node_crypto48.createHash)("sha256").update(bytes2).digest("hex");
221866
221892
  return { skillId, path: path41, content: content3, blobHash, size: bytes2.length, updatedAt: now };
221867
221893
  }
221868
221894
  /**
@@ -222514,15 +222540,15 @@ ${input.description}
222514
222540
  return hit ? { value: hit.value, ...hit.origin ? { origin: hit.origin } : {} } : null;
222515
222541
  }
222516
222542
  encrypt(plain) {
222517
- const iv = (0, import_node_crypto47.randomBytes)(12);
222518
- const cipher = (0, import_node_crypto47.createCipheriv)("aes-256-gcm", this.opts.variableKey, iv);
222543
+ const iv = (0, import_node_crypto48.randomBytes)(12);
222544
+ const cipher = (0, import_node_crypto48.createCipheriv)("aes-256-gcm", this.opts.variableKey, iv);
222519
222545
  const enc4 = Buffer.concat([cipher.update(plain, "utf8"), cipher.final()]);
222520
222546
  return [iv.toString("base64"), cipher.getAuthTag().toString("base64"), enc4.toString("base64")].join(".");
222521
222547
  }
222522
222548
  decrypt(packed) {
222523
222549
  const [iv, tag, data] = packed.split(".");
222524
222550
  if (!iv || !tag || typeof data !== "string") throw new Error("malformed ciphertext");
222525
- const decipher = (0, import_node_crypto47.createDecipheriv)("aes-256-gcm", this.opts.variableKey, Buffer.from(iv, "base64"));
222551
+ const decipher = (0, import_node_crypto48.createDecipheriv)("aes-256-gcm", this.opts.variableKey, Buffer.from(iv, "base64"));
222526
222552
  decipher.setAuthTag(Buffer.from(tag, "base64"));
222527
222553
  return Buffer.concat([decipher.update(Buffer.from(data, "base64")), decipher.final()]).toString("utf8");
222528
222554
  }
@@ -223140,7 +223166,7 @@ async function listSkillMetadataForActor(args) {
223140
223166
  usedDirs.add(dir);
223141
223167
  const sorted = [...metas].sort((a, b2) => a.path.localeCompare(b2.path));
223142
223168
  let latest = "1970-01-01T00:00:00.000Z";
223143
- const hasher = (0, import_node_crypto48.createHash)("sha256");
223169
+ const hasher = (0, import_node_crypto49.createHash)("sha256");
223144
223170
  for (const m2 of sorted) {
223145
223171
  if (m2.updatedAt > latest) latest = m2.updatedAt;
223146
223172
  hasher.update(m2.path);
@@ -223165,11 +223191,11 @@ async function listSkillMetadataForActor(args) {
223165
223191
  const dir = sanitizeSkillDir(c.name, c.slug);
223166
223192
  if (usedDirs.has(dir)) continue;
223167
223193
  usedDirs.add(dir);
223168
- const hasher = (0, import_node_crypto48.createHash)("sha256");
223194
+ const hasher = (0, import_node_crypto49.createHash)("sha256");
223169
223195
  for (const p2 of paths) {
223170
223196
  hasher.update(p2);
223171
223197
  hasher.update("\0");
223172
- hasher.update((0, import_node_crypto48.createHash)("sha256").update(c.files[p2]).digest("hex"));
223198
+ hasher.update((0, import_node_crypto49.createHash)("sha256").update(c.files[p2]).digest("hex"));
223173
223199
  hasher.update("\0");
223174
223200
  }
223175
223201
  out.push({
@@ -223190,11 +223216,11 @@ async function listSkillMetadataForActor(args) {
223190
223216
  const dir = sanitizeSkillDir(b2.name, b2.id);
223191
223217
  if (usedDirs.has(dir)) continue;
223192
223218
  usedDirs.add(dir);
223193
- const hasher = (0, import_node_crypto48.createHash)("sha256");
223219
+ const hasher = (0, import_node_crypto49.createHash)("sha256");
223194
223220
  for (const p2 of paths) {
223195
223221
  hasher.update(p2);
223196
223222
  hasher.update("\0");
223197
- hasher.update((0, import_node_crypto48.createHash)("sha256").update(b2.files[p2]).digest("hex"));
223223
+ hasher.update((0, import_node_crypto49.createHash)("sha256").update(b2.files[p2]).digest("hex"));
223198
223224
  hasher.update("\0");
223199
223225
  }
223200
223226
  out.push({
@@ -223214,7 +223240,7 @@ function builtinSkillToFiles(b2) {
223214
223240
  skillId: `builtin:${b2.id}`,
223215
223241
  path: path41,
223216
223242
  content: content3,
223217
- blobHash: (0, import_node_crypto48.createHash)("sha256").update(content3).digest("hex"),
223243
+ blobHash: (0, import_node_crypto49.createHash)("sha256").update(content3).digest("hex"),
223218
223244
  size: Buffer.byteLength(content3, "utf8"),
223219
223245
  updatedAt: "1970-01-01T00:00:00.000Z"
223220
223246
  }));
@@ -223238,7 +223264,7 @@ function sanitizeSkillDir(name, fallbackId) {
223238
223264
  if (byName) return byName;
223239
223265
  const byId = fallbackId ? fold2(fallbackId) : "";
223240
223266
  if (byId) return byId;
223241
- return `skill-${(0, import_node_crypto48.createHash)("sha256").update(name).digest("hex").slice(0, 8)}`;
223267
+ return `skill-${(0, import_node_crypto49.createHash)("sha256").update(name).digest("hex").slice(0, 8)}`;
223242
223268
  }
223243
223269
  async function materializeSkillFiles(args) {
223244
223270
  const skills = await args.service.listInstalledSkillsForActor(args.actorId);
@@ -223271,7 +223297,7 @@ function connectorSkillToFiles(c) {
223271
223297
  skillId: c.id,
223272
223298
  path: path41,
223273
223299
  content: content3,
223274
- blobHash: (0, import_node_crypto48.createHash)("sha256").update(content3).digest("hex"),
223300
+ blobHash: (0, import_node_crypto49.createHash)("sha256").update(content3).digest("hex"),
223275
223301
  size: Buffer.byteLength(content3, "utf8"),
223276
223302
  updatedAt: "1970-01-01T00:00:00.000Z"
223277
223303
  }));
@@ -223288,11 +223314,11 @@ function connectorSkillDisplayRows(connectorSkills, enabledConnectors) {
223288
223314
  ...s2.version !== void 0 ? { version: s2.version } : {}
223289
223315
  }));
223290
223316
  }
223291
- var import_node_crypto48;
223317
+ var import_node_crypto49;
223292
223318
  var init_skill_materializer = __esm({
223293
223319
  "../server/src/domains/actors/skill-materializer.ts"() {
223294
223320
  "use strict";
223295
- import_node_crypto48 = require("node:crypto");
223321
+ import_node_crypto49 = require("node:crypto");
223296
223322
  }
223297
223323
  });
223298
223324
 
@@ -224803,7 +224829,7 @@ function createActorsDomain(opts) {
224803
224829
  ...kernel !== void 0 ? { onRolesChanged: (a, r) => kernel.setActorRoles(a, r) } : {},
224804
224830
  audit: async (entry) => {
224805
224831
  await opts.audit?.({
224806
- id: `reg_${(0, import_node_crypto49.randomUUID)()}`,
224832
+ id: `reg_${(0, import_node_crypto50.randomUUID)()}`,
224807
224833
  actor: entry.by,
224808
224834
  kind: "registry_change",
224809
224835
  target: entry.actorId,
@@ -224843,11 +224869,11 @@ function createActorsDomain(opts) {
224843
224869
  register: actorsDomain({ resolveCtx, ...opts.resolveTrace ? { resolveTrace: opts.resolveTrace } : {}, ...opts.trace ? { trace: opts.trace } : {}, ...opts.listBuiltinSkills ? { listBuiltinSkills: opts.listBuiltinSkills } : {}, ...opts.getBuiltinSkills ? { getBuiltinSkills: opts.getBuiltinSkills } : {}, ...opts.getConnectorSkills ? { getConnectorSkills: opts.getConnectorSkills } : {}, ...opts.refreshConnectorSkills ? { refreshConnectorSkills: opts.refreshConnectorSkills } : {}, ...opts.memory ? { memory: opts.memory } : {}, ...opts.resolveDispatchScope ? { resolveDispatchScope: opts.resolveDispatchScope } : {}, ...opts.projectExists ? { projectExists: opts.projectExists } : {}, ...opts.isCompanyManager ? { isCompanyManager: opts.isCompanyManager } : {}, ...opts.credentialAudit ? { credentialAudit: opts.credentialAudit } : {}, ...opts.readCredentialAudit ? { readCredentialAudit: opts.readCredentialAudit } : {}, ...opts.credentialRevealLimits ? { credentialRevealLimits: opts.credentialRevealLimits } : {}, ...opts.skillMarket ? { skillMarket: opts.skillMarket } : {}, ...opts.resolveNodeTenancy ? { resolveNodeTenancy: opts.resolveNodeTenancy } : {} })
224844
224870
  };
224845
224871
  }
224846
- var import_node_crypto49;
224872
+ var import_node_crypto50;
224847
224873
  var init_actors = __esm({
224848
224874
  "../server/src/domains/actors/index.ts"() {
224849
224875
  "use strict";
224850
- import_node_crypto49 = require("node:crypto");
224876
+ import_node_crypto50 = require("node:crypto");
224851
224877
  init_service5();
224852
224878
  init_routes3();
224853
224879
  init_service5();
@@ -225222,7 +225248,7 @@ async function findMaterializedAttachmentCopies(messageItems, workdirItems, read
225222
225248
  if (!result?.ok) continue;
225223
225249
  const bytes2 = Buffer.from(result.contentBase64, "base64");
225224
225250
  if (bytes2.length !== file.size) continue;
225225
- const hash2 = (0, import_node_crypto50.createHash)("sha256").update(bytes2).digest("hex");
225251
+ const hash2 = (0, import_node_crypto51.createHash)("sha256").update(bytes2).digest("hex");
225226
225252
  if (candidates.some((attachment) => attachment.blob_ref === hash2)) copies.add(file.path);
225227
225253
  } catch {
225228
225254
  } finally {
@@ -225231,11 +225257,11 @@ async function findMaterializedAttachmentCopies(messageItems, workdirItems, read
225231
225257
  }
225232
225258
  return copies;
225233
225259
  }
225234
- var import_node_crypto50, WORKDIR_WALK_MAX_DEPTH, WORKDIR_WALK_MAX_ENTRIES, WORKDIR_WALK_MAX_LIST_CALLS, WORKDIR_WALK_BUDGET_MS, WORKDIR_TREE_MAX_ENTRIES;
225260
+ var import_node_crypto51, WORKDIR_WALK_MAX_DEPTH, WORKDIR_WALK_MAX_ENTRIES, WORKDIR_WALK_MAX_LIST_CALLS, WORKDIR_WALK_BUDGET_MS, WORKDIR_TREE_MAX_ENTRIES;
225235
225261
  var init_files_view = __esm({
225236
225262
  "../server/src/domains/chat-sessions/files-view.ts"() {
225237
225263
  "use strict";
225238
- import_node_crypto50 = require("node:crypto");
225264
+ import_node_crypto51 = require("node:crypto");
225239
225265
  init_chat_attachment_files();
225240
225266
  init_src();
225241
225267
  WORKDIR_WALK_MAX_DEPTH = 3;
@@ -228626,11 +228652,11 @@ function fromRow(row) {
228626
228652
  for (const [k2, v2] of opt) if (v2 !== void 0 && v2 !== null) r[k2] = v2;
228627
228653
  return r;
228628
228654
  }
228629
- var import_node_crypto51, import_node_fs14, DEFAULT_PAGE, MAX_PAGE, pageSize, MemoryNotificationStore, ident3, iso2, str2, PostgresNotificationStore;
228655
+ var import_node_crypto52, import_node_fs14, DEFAULT_PAGE, MAX_PAGE, pageSize, MemoryNotificationStore, ident3, iso2, str2, PostgresNotificationStore;
228630
228656
  var init_notification_store = __esm({
228631
228657
  "../server/src/domains/collab/notification-store.ts"() {
228632
228658
  "use strict";
228633
- import_node_crypto51 = require("node:crypto");
228659
+ import_node_crypto52 = require("node:crypto");
228634
228660
  import_node_fs14 = __toESM(require("node:fs"), 1);
228635
228661
  DEFAULT_PAGE = 50;
228636
228662
  MAX_PAGE = 200;
@@ -228663,7 +228689,7 @@ var init_notification_store = __esm({
228663
228689
  async insert(n) {
228664
228690
  const existing = this.findLive(n.recipient, n.sourceKey, n.category);
228665
228691
  if (existing) return existing;
228666
- const row = { ...n, id: `ntf:${(0, import_node_crypto51.randomUUID)()}`, updatedAt: n.enteredAt };
228692
+ const row = { ...n, id: `ntf:${(0, import_node_crypto52.randomUUID)()}`, updatedAt: n.enteredAt };
228667
228693
  this.rows.set(row.id, row);
228668
228694
  this.save();
228669
228695
  return row;
@@ -228786,7 +228812,7 @@ var init_notification_store = __esm({
228786
228812
  return new _PostgresNotificationStore(sql, schema);
228787
228813
  }
228788
228814
  async insert(n) {
228789
- const id = `ntf:${(0, import_node_crypto51.randomUUID)()}`;
228815
+ const id = `ntf:${(0, import_node_crypto52.randomUUID)()}`;
228790
228816
  const r = await this.sql.query(
228791
228817
  `INSERT INTO ${this.t} (id, recipient, category, source_key, kind, workorder_id, node_id, card_id, actor_id,
228792
228818
  title, workspace_title, entered_at, updated_at, status, read_at, item)
@@ -229737,13 +229763,13 @@ function nameKey(name) {
229737
229763
  function cleanName(name) {
229738
229764
  return name.trim().replace(/\s+/g, " ");
229739
229765
  }
229740
- var import_node_fs15, import_node_path20, import_node_crypto52, SEP, keyOf, prefixOf, MemoryWorkorderTagStore, FileWorkorderTagStore;
229766
+ var import_node_fs15, import_node_path20, import_node_crypto53, SEP, keyOf, prefixOf, MemoryWorkorderTagStore, FileWorkorderTagStore;
229741
229767
  var init_tags = __esm({
229742
229768
  "../server/src/domains/collab/tags.ts"() {
229743
229769
  "use strict";
229744
229770
  import_node_fs15 = __toESM(require("node:fs"), 1);
229745
229771
  import_node_path20 = __toESM(require("node:path"), 1);
229746
- import_node_crypto52 = __toESM(require("node:crypto"), 1);
229772
+ import_node_crypto53 = __toESM(require("node:crypto"), 1);
229747
229773
  SEP = "::";
229748
229774
  keyOf = (companyId, id) => `${companyId}${SEP}${id}`;
229749
229775
  prefixOf = (companyId) => `${companyId}${SEP}`;
@@ -229761,7 +229787,7 @@ var init_tags = __esm({
229761
229787
  if (!name) return null;
229762
229788
  if (this.entries(companyId).some((t) => nameKey(t.name) === nameKey(name))) return null;
229763
229789
  const tag = {
229764
- id: `tag-${import_node_crypto52.default.randomBytes(6).toString("hex")}`,
229790
+ id: `tag-${import_node_crypto53.default.randomBytes(6).toString("hex")}`,
229765
229791
  name,
229766
229792
  ...input.color?.trim() ? { color: input.color.trim() } : {},
229767
229793
  ...input.description?.trim() ? { description: input.description.trim() } : {}
@@ -231007,11 +231033,11 @@ async function isEmployedElsewhere(store, companyId, accountId) {
231007
231033
  const memberships = await store.listMembershipsForAccount(accountId);
231008
231034
  return memberships.some((m2) => m2.companyId !== companyId);
231009
231035
  }
231010
- var import_node_crypto53, ROLES, INVITABLE_ROLES, INVITATION_TTL_MS, INVITE_LINK_TTL_MS, INVITE_LINK_TOKEN_BYTES, INVITE_LINK_ROLE, SLUG_RE, CompanyError, CompaniesService;
231036
+ var import_node_crypto54, ROLES, INVITABLE_ROLES, INVITATION_TTL_MS, INVITE_LINK_TTL_MS, INVITE_LINK_TOKEN_BYTES, INVITE_LINK_ROLE, SLUG_RE, CompanyError, CompaniesService;
231011
231037
  var init_service6 = __esm({
231012
231038
  "../server/src/domains/companies/service.ts"() {
231013
231039
  "use strict";
231014
- import_node_crypto53 = require("node:crypto");
231040
+ import_node_crypto54 = require("node:crypto");
231015
231041
  init_console_url();
231016
231042
  ROLES = ["owner", "admin", "member"];
231017
231043
  INVITABLE_ROLES = ["admin", "member"];
@@ -231103,7 +231129,7 @@ var init_service6 = __esm({
231103
231129
  const existing = await this.store.getAccountByEmail(normalized4);
231104
231130
  if (existing) return existing;
231105
231131
  const account = {
231106
- id: `actor:human:${(0, import_node_crypto53.randomUUID)()}`,
231132
+ id: `actor:human:${(0, import_node_crypto54.randomUUID)()}`,
231107
231133
  email: normalized4,
231108
231134
  name: name ?? normalized4,
231109
231135
  status: "active"
@@ -231312,7 +231338,7 @@ var init_service6 = __esm({
231312
231338
  }
231313
231339
  const nowMs = Date.parse(this.now());
231314
231340
  const invitation = {
231315
- id: `invitation:${(0, import_node_crypto53.randomUUID)()}`,
231341
+ id: `invitation:${(0, import_node_crypto54.randomUUID)()}`,
231316
231342
  companyId,
231317
231343
  email: mail,
231318
231344
  role,
@@ -231443,7 +231469,7 @@ var init_service6 = __esm({
231443
231469
  const nowMs = Date.parse(this.now());
231444
231470
  const link = {
231445
231471
  companyId,
231446
- token: (0, import_node_crypto53.randomBytes)(INVITE_LINK_TOKEN_BYTES).toString("base64url"),
231472
+ token: (0, import_node_crypto54.randomBytes)(INVITE_LINK_TOKEN_BYTES).toString("base64url"),
231447
231473
  role: INVITE_LINK_ROLE,
231448
231474
  createdAt: new Date(nowMs).toISOString(),
231449
231475
  expiresAt: new Date(nowMs + INVITE_LINK_TTL_MS).toISOString(),
@@ -231500,7 +231526,7 @@ var init_service6 = __esm({
231500
231526
  const reusable = existing.find((inv) => !this.isExpired(inv));
231501
231527
  if (reusable) return reusable;
231502
231528
  const invitation = {
231503
- id: `invitation:${(0, import_node_crypto53.randomUUID)()}`,
231529
+ id: `invitation:${(0, import_node_crypto54.randomUUID)()}`,
231504
231530
  companyId: link.companyId,
231505
231531
  email: mail,
231506
231532
  role: link.role,
@@ -231738,11 +231764,11 @@ var init_service6 = __esm({
231738
231764
  });
231739
231765
 
231740
231766
  // ../server/src/domains/companies/offboarding.ts
231741
- var import_node_crypto54, MemberOffboardingService;
231767
+ var import_node_crypto55, MemberOffboardingService;
231742
231768
  var init_offboarding = __esm({
231743
231769
  "../server/src/domains/companies/offboarding.ts"() {
231744
231770
  "use strict";
231745
- import_node_crypto54 = require("node:crypto");
231771
+ import_node_crypto55 = require("node:crypto");
231746
231772
  init_service6();
231747
231773
  MemberOffboardingService = class {
231748
231774
  store;
@@ -231814,7 +231840,7 @@ var init_offboarding = __esm({
231814
231840
  const { ownedAgents, inFlight } = await this.snapshot(companyId, accountId);
231815
231841
  const at = this.now();
231816
231842
  const started = await this.store.startMemberOffboarding({
231817
- operationId: `off:${(0, import_node_crypto54.randomUUID)()}`,
231843
+ operationId: `off:${(0, import_node_crypto55.randomUUID)()}`,
231818
231844
  companyId,
231819
231845
  accountId,
231820
231846
  initiatedBy,
@@ -232324,18 +232350,18 @@ var init_routes6 = __esm({
232324
232350
 
232325
232351
  // ../server/src/domains/companies/agent-credentials.ts
232326
232352
  function hashAgentToken(token, secret) {
232327
- return HASH_PREFIX + (0, import_node_crypto55.createHmac)("sha256", secret).update(`agent-token:${token}`).digest("base64url");
232353
+ return HASH_PREFIX + (0, import_node_crypto56.createHmac)("sha256", secret).update(`agent-token:${token}`).digest("base64url");
232328
232354
  }
232329
232355
  function safeEqual(a, b2) {
232330
232356
  const ba = Buffer.from(a);
232331
232357
  const bb = Buffer.from(b2);
232332
- return ba.length === bb.length && (0, import_node_crypto55.timingSafeEqual)(ba, bb);
232358
+ return ba.length === bb.length && (0, import_node_crypto56.timingSafeEqual)(ba, bb);
232333
232359
  }
232334
- var import_node_crypto55, HASH_PREFIX, TOKEN_PREFIX, AgentCredentialService;
232360
+ var import_node_crypto56, HASH_PREFIX, TOKEN_PREFIX, AgentCredentialService;
232335
232361
  var init_agent_credentials = __esm({
232336
232362
  "../server/src/domains/companies/agent-credentials.ts"() {
232337
232363
  "use strict";
232338
- import_node_crypto55 = require("node:crypto");
232364
+ import_node_crypto56 = require("node:crypto");
232339
232365
  init_service6();
232340
232366
  HASH_PREFIX = "ac1$";
232341
232367
  TOKEN_PREFIX = "oak_";
@@ -232360,7 +232386,7 @@ var init_agent_credentials = __esm({
232360
232386
  if (employee.status !== "active") {
232361
232387
  throw new CompanyError(409, "AGENT_LEFT", `\u6570\u5B57\u5458\u5DE5\u5DF2\u79BB\u5F00\uFF0C\u4E0D\u80FD\u7B7E\u53D1\u51ED\u8BC1\uFF1A${agentId}`);
232362
232388
  }
232363
- const token = `${TOKEN_PREFIX}${(0, import_node_crypto55.randomBytes)(32).toString("base64url")}`;
232389
+ const token = `${TOKEN_PREFIX}${(0, import_node_crypto56.randomBytes)(32).toString("base64url")}`;
232364
232390
  const credential = {
232365
232391
  tokenHash: hashAgentToken(token, this.secret),
232366
232392
  companyId,
@@ -232780,7 +232806,7 @@ function gatewayInstanceSlug(gatewayUrl) {
232780
232806
  }
232781
232807
  function connectInstanceName(gatewayUrl, token, companyId) {
232782
232808
  const scope = companyId?.trim();
232783
- const suffix = scope ? `c${(0, import_node_crypto56.createHash)("sha256").update(`${gatewayUrl}\0${scope}`).digest("hex").slice(0, 10)}` : token.replace(/[^a-z0-9]/gi, "").slice(-8).toLowerCase() || "enroll";
232809
+ const suffix = scope ? `c${(0, import_node_crypto57.createHash)("sha256").update(`${gatewayUrl}\0${scope}`).digest("hex").slice(0, 10)}` : token.replace(/[^a-z0-9]/gi, "").slice(-8).toLowerCase() || "enroll";
232784
232810
  const base = gatewayInstanceSlug(gatewayUrl);
232785
232811
  return base.slice(0, Math.max(1, 64 - suffix.length - 1)) + "-" + suffix;
232786
232812
  }
@@ -233109,12 +233135,12 @@ function buildNpxCmd(p2) {
233109
233135
  const prefix = daemonNpmPrefix();
233110
233136
  return `npm install -g --prefer-online --prefix ${prefix} ${DAEMON_NPM_PACKAGE}@latest && ${prefix}/bin/oasis daemon start --instance ${shellQuote(instanceName)} --server-ws ${shellQuote(p2.gatewayUrl)}${companyPart}${namePart} --pkg ${shellQuote(DAEMON_NPM_PACKAGE)} --upgrade --enroll-token ${shellQuote(p2.token)}`;
233111
233137
  }
233112
- var import_node_crypto56;
233138
+ var import_node_crypto57;
233113
233139
  var init_connect_script = __esm({
233114
233140
  "../server/src/domains/nodes/connect-script.ts"() {
233115
233141
  "use strict";
233116
233142
  init_src();
233117
- import_node_crypto56 = require("node:crypto");
233143
+ import_node_crypto57 = require("node:crypto");
233118
233144
  }
233119
233145
  });
233120
233146
 
@@ -233675,7 +233701,7 @@ function nodesDomain(deps) {
233675
233701
  }
233676
233702
  deps.enrollTokens.setIssuedNodeId(enrollToken, nodeId);
233677
233703
  } else {
233678
- nodeId = `node-${(0, import_node_crypto57.randomUUID)().slice(0, 8)}`;
233704
+ nodeId = `node-${(0, import_node_crypto58.randomUUID)().slice(0, 8)}`;
233679
233705
  deps.enrollTokens.setIssuedNodeId(enrollToken, nodeId);
233680
233706
  }
233681
233707
  const existingNode = await deps.nodeStore.getNode(nodeId);
@@ -233858,13 +233884,13 @@ function normalizeGatewayUrl(raw) {
233858
233884
  }
233859
233885
  }
233860
233886
  function newNodeId() {
233861
- return "node-" + (0, import_node_crypto57.randomUUID)().replace(/-/g, "").slice(0, 12);
233887
+ return "node-" + (0, import_node_crypto58.randomUUID)().replace(/-/g, "").slice(0, 12);
233862
233888
  }
233863
- var import_node_crypto57, import_node_fs16, import_node_url6, import_node_path21;
233889
+ var import_node_crypto58, import_node_fs16, import_node_url6, import_node_path21;
233864
233890
  var init_routes7 = __esm({
233865
233891
  "../server/src/domains/nodes/routes.ts"() {
233866
233892
  "use strict";
233867
- import_node_crypto57 = require("node:crypto");
233893
+ import_node_crypto58 = require("node:crypto");
233868
233894
  import_node_fs16 = require("node:fs");
233869
233895
  import_node_url6 = require("node:url");
233870
233896
  import_node_path21 = require("node:path");
@@ -235055,7 +235081,7 @@ function createBundle(root, target, input) {
235055
235081
  }
235056
235082
  }
235057
235083
  const bytes2 = fs26.statSync(absBundle).size;
235058
- const digest = (0, import_node_crypto58.createHash)("sha256").update(fs26.readFileSync(absBundle)).digest("hex");
235084
+ const digest = (0, import_node_crypto59.createHash)("sha256").update(fs26.readFileSync(absBundle)).digest("hex");
235059
235085
  const relBase = `inputs/git-bundles/${safeRepo}-${commit.slice(0, 12)}`;
235060
235086
  return {
235061
235087
  absoluteBundlePath: absBundle,
@@ -235151,12 +235177,12 @@ function classifyGitError(fallback, err, where) {
235151
235177
  function oneLine(msg) {
235152
235178
  return msg.split("\n").map((s2) => s2.trim()).filter(Boolean).slice(0, 3).join(" ");
235153
235179
  }
235154
- var import_node_child_process17, import_node_crypto58, fs26, os7, path25, GitReadonlyBundleError, HEX40, FETCH_TIMEOUT_MS2;
235180
+ var import_node_child_process17, import_node_crypto59, fs26, os7, path25, GitReadonlyBundleError, HEX40, FETCH_TIMEOUT_MS2;
235155
235181
  var init_readonly_bundle = __esm({
235156
235182
  "../server/src/git/readonly-bundle.ts"() {
235157
235183
  "use strict";
235158
235184
  import_node_child_process17 = require("node:child_process");
235159
- import_node_crypto58 = require("node:crypto");
235185
+ import_node_crypto59 = require("node:crypto");
235160
235186
  fs26 = __toESM(require("node:fs"), 1);
235161
235187
  os7 = __toESM(require("node:os"), 1);
235162
235188
  path25 = __toESM(require("node:path"), 1);
@@ -235176,7 +235202,7 @@ var init_readonly_bundle = __esm({
235176
235202
 
235177
235203
  // ../server/src/domains/collab/create-seeded-workorder.ts
235178
235204
  function makeSeededWorkorderCreator(deps) {
235179
- const genWorkspace = deps.genWorkspace ?? (() => `ws:wo-${(0, import_node_crypto59.randomUUID)().slice(0, 8)}`);
235205
+ const genWorkspace = deps.genWorkspace ?? (() => `ws:wo-${(0, import_node_crypto60.randomUUID)().slice(0, 8)}`);
235180
235206
  return async (input) => {
235181
235207
  const company = input.companyId && deps.resolveCompany ? await deps.resolveCompany(input.companyId) : void 0;
235182
235208
  const kernel = company?.kernel ?? deps.kernel;
@@ -235269,7 +235295,7 @@ function makeSeededWorkorderCreator(deps) {
235269
235295
  };
235270
235296
  }
235271
235297
  function workspaceForKey(key) {
235272
- return `ws:wo-${(0, import_node_crypto59.createHash)("sha256").update(key).digest("hex").slice(0, 8)}`;
235298
+ return `ws:wo-${(0, import_node_crypto60.createHash)("sha256").update(key).digest("hex").slice(0, 8)}`;
235273
235299
  }
235274
235300
  function existingWorkorder(kernel, workspace) {
235275
235301
  const arts = [...kernel.model.artifacts.values()].filter((a) => a.workspace === workspace);
@@ -235282,11 +235308,11 @@ function existingWorkorder(kernel, workspace) {
235282
235308
  spawned: arts.map((a) => ({ id: a.id, type: a.type, owner: a.owner }))
235283
235309
  };
235284
235310
  }
235285
- var import_node_crypto59, enc2;
235311
+ var import_node_crypto60, enc2;
235286
235312
  var init_create_seeded_workorder = __esm({
235287
235313
  "../server/src/domains/collab/create-seeded-workorder.ts"() {
235288
235314
  "use strict";
235289
- import_node_crypto59 = require("node:crypto");
235315
+ import_node_crypto60 = require("node:crypto");
235290
235316
  init_uncategorized_project();
235291
235317
  init_src();
235292
235318
  init_planner();
@@ -236716,12 +236742,12 @@ function stateFromAttempt(attempt, handoff, checkpoint, now, stalledAfterMs, ope
236716
236742
  if (attempt.status === "no-output") return handoff?.unresolvedIssues.length ? "blocked" : "no_change";
236717
236743
  return "failed";
236718
236744
  }
236719
- var import_node_crypto60, BLOCKING_STATES, HANDOFF_OUTCOMES2, RESUME_EXTERNAL_EFFECT_LIMIT, RESUME_SNAPSHOT_PREFIX, RESUME_SNAPSHOT_SUFFIX, ExecutionContinuityService;
236745
+ var import_node_crypto61, BLOCKING_STATES, HANDOFF_OUTCOMES2, RESUME_EXTERNAL_EFFECT_LIMIT, RESUME_SNAPSHOT_PREFIX, RESUME_SNAPSHOT_SUFFIX, ExecutionContinuityService;
236720
236746
  var init_service8 = __esm({
236721
236747
  "../server/src/domains/execution-continuity/service.ts"() {
236722
236748
  "use strict";
236723
236749
  init_src();
236724
- import_node_crypto60 = require("node:crypto");
236750
+ import_node_crypto61 = require("node:crypto");
236725
236751
  init_src5();
236726
236752
  BLOCKING_STATES = /* @__PURE__ */ new Set(["stalled", "failed", "blocked"]);
236727
236753
  HANDOFF_OUTCOMES2 = /* @__PURE__ */ new Set(["succeeded", "no-output", "failed", "cancelled", "timeout", "orphaned"]);
@@ -236952,7 +236978,7 @@ var init_service8 = __esm({
236952
236978
  if (typeof expectedHash !== "string" || !this.readBundleFile) return null;
236953
236979
  const injectedResume = this.readBundleFile(attempt.id, "execution/RESUME.md");
236954
236980
  if (!injectedResume) return null;
236955
- const actualHash = (0, import_node_crypto60.createHash)("sha256").update(injectedResume).digest("hex");
236981
+ const actualHash = (0, import_node_crypto61.createHash)("sha256").update(injectedResume).digest("hex");
236956
236982
  if (actualHash !== expectedHash) return null;
236957
236983
  const recoverySnapshot = parseResumePackSnapshot(injectedResume);
236958
236984
  if (!recoverySnapshot || recoverySnapshot.scenario !== "redispatch" || !recoverySnapshot.previousAttempt || recoverySnapshot.node.nodeId !== attempt.nodeId || recoverySnapshot.jobKey !== attempt.jobKey || recoverySnapshot.part !== attempt.part) return null;
@@ -237879,6 +237905,10 @@ var init_project_bundle = __esm({
237879
237905
  });
237880
237906
 
237881
237907
  // ../server/src/domains/chat-sessions/index.ts
237908
+ function sessionProjectIdToStore(projectId2) {
237909
+ if (typeof projectId2 !== "string" || projectId2.trim() === "") return null;
237910
+ return isUncategorizedProjectId(projectId2) ? null : projectId2;
237911
+ }
237882
237912
  function parseDurationMs(raw) {
237883
237913
  if (!raw) return null;
237884
237914
  const m2 = /^(\d+)\s*(ms|s|m|h|d)?$/i.exec(raw.trim());
@@ -238052,7 +238082,7 @@ function createChatSessionsDomain(opts) {
238052
238082
  if (!text5.trim()) throw new ApiError(400, "BAD_REQUEST", "text required");
238053
238083
  const now = Date.now();
238054
238084
  sweepDrafts(now);
238055
- const id = `cd_${(0, import_node_crypto61.randomUUID)()}`;
238085
+ const id = `cd_${(0, import_node_crypto62.randomUUID)()}`;
238056
238086
  drafts.set(id, { text: text5, actor: req.auth.actor, expiresAt: now + DRAFT_TTL_MS });
238057
238087
  return { status: 201, body: { id, expiresInMs: DRAFT_TTL_MS } };
238058
238088
  });
@@ -238104,7 +238134,7 @@ function createChatSessionsDomain(opts) {
238104
238134
  const runtimeId = await currentRuntimeId(body2.aiActorId) ?? "unknown";
238105
238135
  const now = (/* @__PURE__ */ new Date()).toISOString();
238106
238136
  const session = {
238107
- id: (0, import_node_crypto61.randomUUID)(),
238137
+ id: (0, import_node_crypto62.randomUUID)(),
238108
238138
  humanActorId: req.auth.actor,
238109
238139
  // 注:这里**刻意不写 companyId**。新会话要不要带公司归属,按 ws:wo-6d588f8e 的 ADR
238110
238140
  // (每公司 schema、最终移除表内 company 列)统一定,不在本节点自行发明。
@@ -238117,7 +238147,7 @@ function createChatSessionsDomain(opts) {
238117
238147
  // 决策 0030 缝合:绑定是会话的语义属性(工单频道/问题会话给、脑暴省略)——发消息端据它带 workspace,
238118
238148
  // 两个入口页面行为一致。区别于 linkWorkOrder(出处关联,建单脑暴也有、不构成绑定)。
238119
238149
  workspace: body2.workspace ?? null,
238120
- projectId: body2.projectId ?? null,
238150
+ projectId: sessionProjectIdToStore(body2.projectId),
238121
238151
  // 会话级模型覆盖(口径 A):建会话时就带上选择;空串/空白归 null = 沿用旧解析,不写员工全局配置。
238122
238152
  model: normalizeModel(body2.model),
238123
238153
  // ADR-0058:分析会话指向被分析 run;非空即"这是分析会话"(不进主聊天列表、进 trace 分析视图)。
@@ -238186,7 +238216,7 @@ function createChatSessionsDomain(opts) {
238186
238216
  ...body2.runtimeId !== void 0 ? { runtimeId: body2.runtimeId } : {},
238187
238217
  ...Object.prototype.hasOwnProperty.call(body2, "runtimeSessionId") ? { runtimeSessionId: body2.runtimeSessionId } : {},
238188
238218
  ...body2.title !== void 0 ? { title: body2.title } : {},
238189
- ...Object.prototype.hasOwnProperty.call(body2, "projectId") ? { projectId: body2.projectId } : {},
238219
+ ...Object.prototype.hasOwnProperty.call(body2, "projectId") ? { projectId: sessionProjectIdToStore(body2.projectId) } : {},
238190
238220
  // 会话级模型覆盖:显式传 null / 空串 = 清除覆盖(回到旧解析);不传这一项 = 不动它。
238191
238221
  ...Object.prototype.hasOwnProperty.call(body2, "model") ? { model: normalizeModel(body2.model) } : {},
238192
238222
  // 只有显式传了才写——改标题 / 换项目 / 换模型都不是「有新动静」,不该顶掉列表顺序与已读水位。
@@ -238210,7 +238240,7 @@ function createChatSessionsDomain(opts) {
238210
238240
  if (body2.role !== "user" && body2.role !== "assistant") throw new ApiError(400, "BAD_REQUEST", "role must be user or assistant");
238211
238241
  const role = body2.role;
238212
238242
  const msg = await store2.appendMessage({
238213
- id: (0, import_node_crypto61.randomUUID)(),
238243
+ id: (0, import_node_crypto62.randomUUID)(),
238214
238244
  sessionId: req.params.id,
238215
238245
  role,
238216
238246
  content: role === "user" ? stripInjectedChatContext(body2.content) : body2.content,
@@ -238251,7 +238281,7 @@ function createChatSessionsDomain(opts) {
238251
238281
  const known = key ? cur.find((x2) => x2.clientKey === key) : void 0;
238252
238282
  if (!known && cur.length >= QUEUE_MAX) throw new ApiError(409, "QUEUE_FULL", `\u961F\u5217\u5DF2\u6EE1\uFF08\u4E0A\u9650 ${QUEUE_MAX} \u6761\uFF09`);
238253
238283
  const item = await store.enqueuePendingMessage({
238254
- id: (0, import_node_crypto61.randomUUID)(),
238284
+ id: (0, import_node_crypto62.randomUUID)(),
238255
238285
  chatSessionId: sid,
238256
238286
  text: text5,
238257
238287
  ...attachments.length ? { attachments } : {},
@@ -238702,11 +238732,11 @@ function createChatSessionsDomain(opts) {
238702
238732
  });
238703
238733
  };
238704
238734
  }
238705
- var import_node_crypto61, DEFAULT_SNAPSHOT_ITEMS, MAX_SNAPSHOT_ITEMS;
238735
+ var import_node_crypto62, DEFAULT_SNAPSHOT_ITEMS, MAX_SNAPSHOT_ITEMS;
238706
238736
  var init_chat_sessions2 = __esm({
238707
238737
  "../server/src/domains/chat-sessions/index.ts"() {
238708
238738
  "use strict";
238709
- import_node_crypto61 = require("node:crypto");
238739
+ import_node_crypto62 = require("node:crypto");
238710
238740
  init_src();
238711
238741
  init_chat_session();
238712
238742
  init_files_view();
@@ -238723,6 +238753,7 @@ var init_chat_sessions2 = __esm({
238723
238753
  init_company_data_store_router();
238724
238754
  init_workorder_terminal();
238725
238755
  init_session_workdir();
238756
+ init_uncategorized_project();
238726
238757
  init_project_bundle();
238727
238758
  DEFAULT_SNAPSHOT_ITEMS = 400;
238728
238759
  MAX_SNAPSHOT_ITEMS = 1e3;
@@ -240110,7 +240141,7 @@ function busyError(chatSessionId, blockedBy) {
240110
240141
  return `\u76EE\u6807\u4F1A\u8BDD ${chatSessionId} \u6B63\u6709\u4E00\u8F6E\u5728\u8DD1${blockedBy ? `\uFF08${blockedBy}\uFF09` : ""}\u2014\u2014\u672C\u6B21\u89E6\u53D1\u5DF2\u4E22\u5F03\uFF0C\u4E0D\u6392\u961F\u3001\u4E0D\u8865\u8DD1`;
240111
240142
  }
240112
240143
  function genWebhookToken() {
240113
- return `owt_${(0, import_node_crypto62.randomBytes)(32).toString("base64url")}`;
240144
+ return `owt_${(0, import_node_crypto63.randomBytes)(32).toString("base64url")}`;
240114
240145
  }
240115
240146
  function validateTitleTemplate(tpl) {
240116
240147
  const residue = tpl.replace(DATE_TOKEN, "");
@@ -240166,11 +240197,11 @@ function appendSourceNote(brief, automation, source, atIso) {
240166
240197
  ---
240167
240198
  \u672C\u5DE5\u5355\u7531\u81EA\u52A8\u5316\u300C${automation.name}\u300D\u4E8E ${atIso} \u89E6\u53D1\uFF08\u6765\u6E90\uFF1A${source}\uFF09\u3002\u5F00\u5DE5\u540E\u8BF7\u628A\u5DE5\u5355\u6807\u9898\u6539\u6210\u51C6\u786E\u53CD\u6620\u5B9E\u9645\u5DE5\u4F5C\u7684\u63CF\u8FF0\u3002`;
240168
240199
  }
240169
- var import_node_crypto62, DATE_TOKEN, AutomationsService, EVENT_RETRY_BASE_MS, EVENT_RETRY_MAX_MS, EVENT_RETRY_MAX_ATTEMPTS, eventAttempts, eventLastAttemptAt, eventLastError, CHAT_REPLY_MAX;
240200
+ var import_node_crypto63, DATE_TOKEN, AutomationsService, EVENT_RETRY_BASE_MS, EVENT_RETRY_MAX_MS, EVENT_RETRY_MAX_ATTEMPTS, eventAttempts, eventLastAttemptAt, eventLastError, CHAT_REPLY_MAX;
240170
240201
  var init_service9 = __esm({
240171
240202
  "../server/src/domains/automations/service.ts"() {
240172
240203
  "use strict";
240173
- import_node_crypto62 = require("node:crypto");
240204
+ import_node_crypto63 = require("node:crypto");
240174
240205
  init_src();
240175
240206
  init_registry3();
240176
240207
  init_attribution();
@@ -240984,11 +241015,11 @@ function verifySignature(rawBody, headers, secret) {
240984
241015
  if (!secret) return "not_required";
240985
241016
  const given = header1(headers, "x-hub-signature-256");
240986
241017
  if (!given) return "missing";
240987
- const expected = `sha256=${(0, import_node_crypto63.createHmac)("sha256", secret).update(rawBody).digest("hex")}`;
241018
+ const expected = `sha256=${(0, import_node_crypto64.createHmac)("sha256", secret).update(rawBody).digest("hex")}`;
240988
241019
  const a = Buffer.from(given);
240989
241020
  const b2 = Buffer.from(expected);
240990
241021
  if (a.length !== b2.length) return "invalid";
240991
- return (0, import_node_crypto63.timingSafeEqual)(a, b2) ? "valid" : "invalid";
241022
+ return (0, import_node_crypto64.timingSafeEqual)(a, b2) ? "valid" : "invalid";
240992
241023
  }
240993
241024
  function eventAllowed(filters, envelope) {
240994
241025
  if (!filters || filters.length === 0) return true;
@@ -241018,11 +241049,11 @@ function splitEvent(envelope) {
241018
241049
  }
241019
241050
  return { eventName, actionCandidates: candidates };
241020
241051
  }
241021
- var import_node_crypto63, MAX_BODY_BYTES, AutomationWebhookService, header1, PROVIDER_PREFIXES;
241052
+ var import_node_crypto64, MAX_BODY_BYTES, AutomationWebhookService, header1, PROVIDER_PREFIXES;
241022
241053
  var init_webhook = __esm({
241023
241054
  "../server/src/domains/automations/webhook.ts"() {
241024
241055
  "use strict";
241025
- import_node_crypto63 = require("node:crypto");
241056
+ import_node_crypto64 = require("node:crypto");
241026
241057
  MAX_BODY_BYTES = 256 * 1024;
241027
241058
  AutomationWebhookService = class {
241028
241059
  store;
@@ -242178,7 +242209,7 @@ function playbooksDomain(opts) {
242178
242209
  opts.overrides.set(companyOf(req), ref2, nodeKey, nextOverride);
242179
242210
  try {
242180
242211
  await opts.audit?.({
242181
- id: `reg_${(0, import_node_crypto64.randomUUID)()}`,
242212
+ id: `reg_${(0, import_node_crypto65.randomUUID)()}`,
242182
242213
  actor: req.auth.actor,
242183
242214
  kind: "registry_change",
242184
242215
  target: `playbook:${ref2}#${nodeKey}`,
@@ -242195,11 +242226,11 @@ function playbooksDomain(opts) {
242195
242226
  });
242196
242227
  };
242197
242228
  }
242198
- var import_node_crypto64;
242229
+ var import_node_crypto65;
242199
242230
  var init_routes12 = __esm({
242200
242231
  "../server/src/domains/playbooks/routes.ts"() {
242201
242232
  "use strict";
242202
- import_node_crypto64 = require("node:crypto");
242233
+ import_node_crypto65 = require("node:crypto");
242203
242234
  init_router();
242204
242235
  init_registry3();
242205
242236
  init_planner();
@@ -242313,17 +242344,17 @@ function completionFingerprint(workspace, members) {
242313
242344
  workspace,
242314
242345
  members: [...members].sort((a, b2) => a.artifactId < b2.artifactId ? -1 : a.artifactId > b2.artifactId ? 1 : 0).map((m2) => ({ artifactId: m2.artifactId, currentRevisionId: m2.currentRevisionId ?? null }))
242315
242346
  });
242316
- return (0, import_node_crypto65.createHash)("sha256").update(canonical).digest("hex");
242347
+ return (0, import_node_crypto66.createHash)("sha256").update(canonical).digest("hex");
242317
242348
  }
242318
242349
  function eventConsumptionKey(args) {
242319
242350
  const raw = `project-event:${EVENT_KEY_VERSION}:${args.triggerId}:${args.event}:${args.workspace}:${args.fingerprint}`;
242320
- return raw.length <= 200 ? raw : `project-event:${EVENT_KEY_VERSION}:sha256:${(0, import_node_crypto65.createHash)("sha256").update(raw).digest("hex")}`;
242351
+ return raw.length <= 200 ? raw : `project-event:${EVENT_KEY_VERSION}:sha256:${(0, import_node_crypto66.createHash)("sha256").update(raw).digest("hex")}`;
242321
242352
  }
242322
- var import_node_crypto65, EVENT_KEY_VERSION, EMPTY_METRICS, AUTOMATION_EVENT_HANDLERS, ProjectEventPoller;
242353
+ var import_node_crypto66, EVENT_KEY_VERSION, EMPTY_METRICS, AUTOMATION_EVENT_HANDLERS, ProjectEventPoller;
242323
242354
  var init_project_event_poller = __esm({
242324
242355
  "../server/src/automations/project-event-poller.ts"() {
242325
242356
  "use strict";
242326
- import_node_crypto65 = require("node:crypto");
242357
+ import_node_crypto66 = require("node:crypto");
242327
242358
  EVENT_KEY_VERSION = "v1";
242328
242359
  EMPTY_METRICS = () => ({
242329
242360
  scanDurationMs: 0,
@@ -242534,7 +242565,7 @@ function remoteAppendInput(hub, nodeId, dispatchId, entry, input, timeoutMs) {
242534
242565
  if (input.requireConsumptionReceipt && !hub.supportsInputConsumptionReceipts?.(dispatchId)) {
242535
242566
  return Promise.resolve({ accepted: false, reason: "consumption-unsupported" });
242536
242567
  }
242537
- const requestId = (0, import_node_crypto66.randomUUID)();
242568
+ const requestId = (0, import_node_crypto67.randomUUID)();
242538
242569
  const sent = routeToSession(hub, nodeId, dispatchId, { type: "append_input", dispatchId, input, requestId });
242539
242570
  if (!sent) return Promise.resolve({ accepted: false, reason: "session-closing", ...unknownIfInterrupting });
242540
242571
  return new Promise((resolve10) => {
@@ -242547,11 +242578,11 @@ function remoteAppendInput(hub, nodeId, dispatchId, entry, input, timeoutMs) {
242547
242578
  entry.appendWaiters.push({ requestId, requireConsumptionReceipt: input.requireConsumptionReceipt, resolve: resolve10, timer });
242548
242579
  });
242549
242580
  }
242550
- var import_node_crypto66, STASH_TTL_MS, STASH_MAX_FRAMES_PER_ID, STASH_MAX_IDS, DaemonHubAdapter, BindingRouterAdapter, WorkdirBridge;
242581
+ var import_node_crypto67, STASH_TTL_MS, STASH_MAX_FRAMES_PER_ID, STASH_MAX_IDS, DaemonHubAdapter, BindingRouterAdapter, WorkdirBridge;
242551
242582
  var init_daemon_adapter = __esm({
242552
242583
  "../server/src/daemon-adapter.ts"() {
242553
242584
  "use strict";
242554
- import_node_crypto66 = require("node:crypto");
242585
+ import_node_crypto67 = require("node:crypto");
242555
242586
  init_src();
242556
242587
  STASH_TTL_MS = 5 * 6e4;
242557
242588
  STASH_MAX_FRAMES_PER_ID = 500;
@@ -242901,7 +242932,7 @@ var init_daemon_adapter = __esm({
242901
242932
  async spawn(job) {
242902
242933
  const nodeId = job.binding?.nodeId;
242903
242934
  if (!nodeId) throw new Error("DaemonHubAdapter \u9700\u8981 job.binding.nodeId\uFF08\u8DEF\u7531\u9519\u8BEF\uFF09");
242904
- const dispatchId = job.dispatchId ?? `dispatch:${(0, import_node_crypto66.randomUUID)()}`;
242935
+ const dispatchId = job.dispatchId ?? `dispatch:${(0, import_node_crypto67.randomUUID)()}`;
242905
242936
  if (job.dispatchId && this.pending.has(dispatchId)) {
242906
242937
  return this.recover(dispatchId, nodeId, job.binding?.runtimeKind, job.actor);
242907
242938
  }
@@ -243138,7 +243169,7 @@ var init_daemon_adapter = __esm({
243138
243169
  return daemon?.meta.supportsWorkdirWalk === true;
243139
243170
  }
243140
243171
  request(nodeId, buildFrame) {
243141
- const requestId = (0, import_node_crypto66.randomUUID)();
243172
+ const requestId = (0, import_node_crypto67.randomUUID)();
243142
243173
  const sent = this.hub.dispatch(nodeId, buildFrame(requestId));
243143
243174
  if (!sent) return Promise.resolve({ ok: false, code: "NODE_OFFLINE" });
243144
243175
  return new Promise((resolve10) => {
@@ -243246,13 +243277,13 @@ function classifyPage(page, lastPushedHash, serviceAccount) {
243246
243277
  if (sha(body2) === lastPushedHash) return { kind: "echo" };
243247
243278
  return { kind: "human-edit", content: body2, updatedBy: page.updatedBy };
243248
243279
  }
243249
- var import_node_crypto67, sha, enc3, dec, MirrorEngine, MapMirrorIdentities;
243280
+ var import_node_crypto68, sha, enc3, dec, MirrorEngine, MapMirrorIdentities;
243250
243281
  var init_engine = __esm({
243251
243282
  "../server/src/mirror/engine.ts"() {
243252
243283
  "use strict";
243253
- import_node_crypto67 = require("node:crypto");
243284
+ import_node_crypto68 = require("node:crypto");
243254
243285
  init_src();
243255
- sha = (s2) => (0, import_node_crypto67.createHash)("sha256").update(s2, "utf8").digest("hex");
243286
+ sha = (s2) => (0, import_node_crypto68.createHash)("sha256").update(s2, "utf8").digest("hex");
243256
243287
  enc3 = (s2) => new TextEncoder().encode(s2);
243257
243288
  dec = (b2) => new TextDecoder().decode(b2);
243258
243289
  MirrorEngine = class {
@@ -243499,11 +243530,11 @@ function humanExitCause(exit3) {
243499
243530
  const base = (exit3.reason ? label[exit3.reason] : void 0) ?? `\u4F1A\u8BDD\u5F02\u5E38\u7ED3\u675F\uFF08${exit3.reason ?? "\u65E0\u9000\u51FA\u4FE1\u606F"}\uFF09`;
243500
243531
  return exit3.errorMessage ? `${base}\uFF1A${exit3.errorMessage.slice(0, 200)}` : base;
243501
243532
  }
243502
- var import_node_crypto68, AUTONOMOUS_ETHOS, CONVERSATIONAL_ETHOS, SHARED_GRAPH_BODY, AUTONOMOUS_RECOVERY_TOOLS, HIGH_RISK_COMMANDS, COORDINATOR_SYSTEM_PROMPT, CONVERSATIONAL_RECOVERY_TOOLS, CONVERSATIONAL_ESCALATION_TOOLS, CONVERSATIONAL_MANAGER_BODY, MACHINE_EXIT_CODES, CoordinatorWorker;
243533
+ var import_node_crypto69, AUTONOMOUS_ETHOS, CONVERSATIONAL_ETHOS, SHARED_GRAPH_BODY, AUTONOMOUS_RECOVERY_TOOLS, HIGH_RISK_COMMANDS, COORDINATOR_SYSTEM_PROMPT, CONVERSATIONAL_RECOVERY_TOOLS, CONVERSATIONAL_ESCALATION_TOOLS, CONVERSATIONAL_MANAGER_BODY, MACHINE_EXIT_CODES, CoordinatorWorker;
243503
243534
  var init_worker = __esm({
243504
243535
  "../server/src/coordinator/worker.ts"() {
243505
243536
  "use strict";
243506
- import_node_crypto68 = require("node:crypto");
243537
+ import_node_crypto69 = require("node:crypto");
243507
243538
  init_src5();
243508
243539
  init_identity();
243509
243540
  AUTONOMOUS_ETHOS = `\u4F60\u662F\u8FD9\u4E2A\u5DE5\u5355\u7684**\u7BA1\u7406\u8005**\u2014\u2014\u804C\u8D23\u662F\u8BA9\u5B83\u987A\u7545\u8DD1\u5B8C\u3002\u7CFB\u7EDF\u5728\u67D0\u4E2A\u8282\u70B9\u5361\u4F4F\u3001\u673A\u68B0\u5206\u8BCA\u786E\u8BA4"\u9700\u8981\u4F60"\u65F6\u5524\u8D77\u4F60\uFF08\u65E0\u4EBA\u5728\u573A\uFF0C\u4F60\u8FD9\u4E00\u8F6E\u628A\u80FD\u505A\u7684\u505A\u6389\uFF09\u3002\u4F60\u7684\u624B\u6BB5\u5F88\u5BBD\uFF1A
@@ -243772,7 +243803,7 @@ ${HIGH_RISK_COMMANDS}`;
243772
243803
  return this.deps.kernel.model.lastSeq.get(artifactId) ?? 0;
243773
243804
  }
243774
243805
  evaluationKey(kind, artifactId, evidence) {
243775
- const fingerprint2 = (0, import_node_crypto68.createHash)("sha256").update(JSON.stringify(evidence)).digest("hex");
243806
+ const fingerprint2 = (0, import_node_crypto69.createHash)("sha256").update(JSON.stringify(evidence)).digest("hex");
243776
243807
  return `${kind}:${artifactId}:${fingerprint2}`;
243777
243808
  }
243778
243809
  artifactEvidence(id) {
@@ -244151,8 +244182,8 @@ ${ctx.nodeFault}
244151
244182
  this.deps.log?.(`[coordinator] ${workspace} \u5168\u5C40\u4E0A\u4E0B\u6587\u8BFB\u53D6\u5931\u8D25\uFF0C\u7EE7\u7EED\u6CBF\u7528\u539F\u534F\u8C03\u8005\u4EFB\u52A1\uFF1A${String(error2)}`);
244152
244183
  }
244153
244184
  }
244154
- const runtimeSessionId = opts?.resumeSessionId ?? (0, import_node_crypto68.randomUUID)();
244155
- const coordinatorRunId = `coordinate:${(0, import_node_crypto68.randomUUID)()}`;
244185
+ const runtimeSessionId = opts?.resumeSessionId ?? (0, import_node_crypto69.randomUUID)();
244186
+ const coordinatorRunId = `coordinate:${(0, import_node_crypto69.randomUUID)()}`;
244156
244187
  const taskWithContext = coordinatorContext ? [
244157
244188
  task,
244158
244189
  ``,
@@ -244196,7 +244227,7 @@ ${ctx.nodeFault}
244196
244227
  const startedAtMs = Date.now();
244197
244228
  let trajectoryStarted = false;
244198
244229
  if (this.deps.trajectory) {
244199
- const bundleManifest = Object.fromEntries(Object.entries(job.bundle.files).map(([name, content3]) => [name, (0, import_node_crypto68.createHash)("sha256").update(content3).digest("hex")]));
244230
+ const bundleManifest = Object.fromEntries(Object.entries(job.bundle.files).map(([name, content3]) => [name, (0, import_node_crypto69.createHash)("sha256").update(content3).digest("hex")]));
244200
244231
  const session = {
244201
244232
  runId: coordinatorRunId,
244202
244233
  runtimeSessionId,
@@ -244401,11 +244432,11 @@ var init_pg_ident = __esm({
244401
244432
  });
244402
244433
 
244403
244434
  // ../storage/src/postgres.ts
244404
- var import_node_crypto69, ident4, isUniqueViolation, PostgresOplogStore, PostgresBlobStore;
244435
+ var import_node_crypto70, ident4, isUniqueViolation, PostgresOplogStore, PostgresBlobStore;
244405
244436
  var init_postgres = __esm({
244406
244437
  "../storage/src/postgres.ts"() {
244407
244438
  "use strict";
244408
- import_node_crypto69 = require("node:crypto");
244439
+ import_node_crypto70 = require("node:crypto");
244409
244440
  init_pg_ident();
244410
244441
  init_esm();
244411
244442
  init_src();
@@ -244585,7 +244616,7 @@ var init_postgres = __esm({
244585
244616
  return new _PostgresBlobStore(pool, schema);
244586
244617
  }
244587
244618
  async put(bytes2) {
244588
- const hash2 = (0, import_node_crypto69.createHash)("sha256").update(bytes2).digest("hex");
244619
+ const hash2 = (0, import_node_crypto70.createHash)("sha256").update(bytes2).digest("hex");
244589
244620
  await this.pool.query(
244590
244621
  `INSERT INTO ${this.t} (hash, bytes, size, content_type) VALUES ($1, $2, $3, $4) ON CONFLICT (hash) DO NOTHING`,
244591
244622
  [hash2, Buffer.from(bytes2), bytes2.byteLength, sniffContentType(bytes2) ?? null]
@@ -253212,11 +253243,11 @@ var init_postgres_delegations = __esm({
253212
253243
  });
253213
253244
 
253214
253245
  // ../storage/src/postgres-nodes.ts
253215
- var import_node_crypto70, ident13, PostgresNodeStore, PostgresNodeTokenStore, rowToNode, rowToRuntime;
253246
+ var import_node_crypto71, ident13, PostgresNodeStore, PostgresNodeTokenStore, rowToNode, rowToRuntime;
253216
253247
  var init_postgres_nodes = __esm({
253217
253248
  "../storage/src/postgres-nodes.ts"() {
253218
253249
  "use strict";
253219
- import_node_crypto70 = require("node:crypto");
253250
+ import_node_crypto71 = require("node:crypto");
253220
253251
  init_pg_ident();
253221
253252
  init_esm();
253222
253253
  ident13 = (s2) => {
@@ -253433,7 +253464,7 @@ var init_postgres_nodes = __esm({
253433
253464
  return store;
253434
253465
  }
253435
253466
  issue(nodeId) {
253436
- const token = `ont_${(0, import_node_crypto70.randomBytes)(24).toString("base64url")}`;
253467
+ const token = `ont_${(0, import_node_crypto71.randomBytes)(24).toString("base64url")}`;
253437
253468
  this.cache.set(token, nodeId);
253438
253469
  void this.pool.query(`INSERT INTO ${this.s}.node_tokens (token,node_id) VALUES ($1,$2)`, [token, nodeId]);
253439
253470
  return token;
@@ -253699,11 +253730,11 @@ var init_postgres_type_registry = __esm({
253699
253730
  });
253700
253731
 
253701
253732
  // ../storage/src/postgres-actor-memory.ts
253702
- var import_node_crypto71, matchClause, ident15, PostgresActorMemoryStore, rowToIndexEntry, rowToRecord;
253733
+ var import_node_crypto72, matchClause, ident15, PostgresActorMemoryStore, rowToIndexEntry, rowToRecord;
253703
253734
  var init_postgres_actor_memory = __esm({
253704
253735
  "../storage/src/postgres-actor-memory.ts"() {
253705
253736
  "use strict";
253706
- import_node_crypto71 = require("node:crypto");
253737
+ import_node_crypto72 = require("node:crypto");
253707
253738
  init_pg_ident();
253708
253739
  init_src();
253709
253740
  matchClause = (q2) => q2.requireMatch && q2.keywords.length > 0 ? " WHERE m > 0" : "";
@@ -253913,7 +253944,7 @@ var init_postgres_actor_memory = __esm({
253913
253944
  }
253914
253945
  async write(input, now) {
253915
253946
  if (input.memId === void 0) {
253916
- const memId = `mem:${(0, import_node_crypto71.randomUUID)()}`;
253947
+ const memId = `mem:${(0, import_node_crypto72.randomUUID)()}`;
253917
253948
  const r2 = await this.pool.query(
253918
253949
  `INSERT INTO ${this.s}.actor_memories
253919
253950
  (mem_id, actor_id, project_id, keywords, content, version, created_at, updated_at, accessed_at, source_artifact_id, source_session_id)
@@ -255360,14 +255391,14 @@ function companySchemaName(companyId) {
255360
255391
  if (typeof companyId !== "string" || !companyId.trim()) {
255361
255392
  throw new Error("company schema mapping \u9700\u8981\u975E\u7A7A companyId\uFF08fail-closed\uFF1A\u4E0D\u56DE\u9000\u9ED8\u8BA4\u516C\u53F8\uFF09");
255362
255393
  }
255363
- const hex = (0, import_node_crypto72.createHash)("sha256").update(companyId, "utf8").digest("hex");
255394
+ const hex = (0, import_node_crypto73.createHash)("sha256").update(companyId, "utf8").digest("hex");
255364
255395
  return `${COMPANY_SCHEMA_PREFIX}${hex.slice(0, DIGEST_HEX_LEN)}`;
255365
255396
  }
255366
- var import_node_crypto72, COMPANY_SCHEMA_PREFIX, DIGEST_HEX_LEN, SchemaMappingConflictError, TenantStorageLocationStore;
255397
+ var import_node_crypto73, COMPANY_SCHEMA_PREFIX, DIGEST_HEX_LEN, SchemaMappingConflictError, TenantStorageLocationStore;
255367
255398
  var init_tenant_schema_mapping = __esm({
255368
255399
  "../storage/src/tenant-schema-mapping.ts"() {
255369
255400
  "use strict";
255370
- import_node_crypto72 = require("node:crypto");
255401
+ import_node_crypto73 = require("node:crypto");
255371
255402
  init_esm();
255372
255403
  init_pg_ident();
255373
255404
  COMPANY_SCHEMA_PREFIX = "c_";
@@ -255441,7 +255472,7 @@ var init_tenant_schema_mapping = __esm({
255441
255472
 
255442
255473
  // ../storage/src/company-data-plane-schema.ts
255443
255474
  function canonicalTypeDefHash(def) {
255444
- return `sha256:${(0, import_node_crypto73.createHash)("sha256").update(JSON.stringify(def), "utf8").digest("hex")}`;
255475
+ return `sha256:${(0, import_node_crypto74.createHash)("sha256").update(JSON.stringify(def), "utf8").digest("hex")}`;
255445
255476
  }
255446
255477
  function defaultArtifactTypeTemplate() {
255447
255478
  return [
@@ -255623,11 +255654,11 @@ async function seedDefaultArtifactTypes(pool, schema, templates = defaultArtifac
255623
255654
  }
255624
255655
  return { inserted };
255625
255656
  }
255626
- var import_node_crypto73, DEFAULT_ARTIFACT_TYPE_TEMPLATE_VERSION;
255657
+ var import_node_crypto74, DEFAULT_ARTIFACT_TYPE_TEMPLATE_VERSION;
255627
255658
  var init_company_data_plane_schema = __esm({
255628
255659
  "../storage/src/company-data-plane-schema.ts"() {
255629
255660
  "use strict";
255630
- import_node_crypto73 = require("node:crypto");
255661
+ import_node_crypto74 = require("node:crypto");
255631
255662
  init_esm();
255632
255663
  init_pg_ident();
255633
255664
  DEFAULT_ARTIFACT_TYPE_TEMPLATE_VERSION = "4c368e5c-types-v1";
@@ -255707,11 +255738,11 @@ function rowToFile2(row) {
255707
255738
  updatedAt: new Date(row.updated_at).toISOString()
255708
255739
  };
255709
255740
  }
255710
- var import_node_crypto74, COMPANY_CONFLICT_MSG, CompanyIdentifierConflictError, CompanyOwnedRegistryStore;
255741
+ var import_node_crypto75, COMPANY_CONFLICT_MSG, CompanyIdentifierConflictError, CompanyOwnedRegistryStore;
255711
255742
  var init_company_owned_registry_store = __esm({
255712
255743
  "../storage/src/company-owned-registry-store.ts"() {
255713
255744
  "use strict";
255714
- import_node_crypto74 = require("node:crypto");
255745
+ import_node_crypto75 = require("node:crypto");
255715
255746
  init_esm();
255716
255747
  init_src();
255717
255748
  init_pg_ident();
@@ -256097,7 +256128,7 @@ var init_company_owned_registry_store = __esm({
256097
256128
  enabled: skill.enabled,
256098
256129
  files: files.map((f2) => ({ path: f2.path, blobHash: f2.blobHash }))
256099
256130
  });
256100
- return (0, import_node_crypto74.createHash)("sha256").update(body2).digest("hex");
256131
+ return (0, import_node_crypto75.createHash)("sha256").update(body2).digest("hex");
256101
256132
  }
256102
256133
  };
256103
256134
  }
@@ -258694,7 +258725,7 @@ function sourceSetConservation(input) {
258694
258725
  return input.sourceFinal === input.copied + input.approvedRuntimeConversion + input.approvedArchive + input.approvedDiscard;
258695
258726
  }
258696
258727
  function payloadChecksum(value2) {
258697
- return (0, import_node_crypto75.createHash)("sha256").update(JSON.stringify(value2)).digest("hex");
258728
+ return (0, import_node_crypto76.createHash)("sha256").update(JSON.stringify(value2)).digest("hex");
258698
258729
  }
258699
258730
  async function copyWorkorderDraftsIdempotent(pool, companyId, companySchema, manifestId, opts) {
258700
258731
  const cs = quoteIdent2(companySchema);
@@ -259082,11 +259113,11 @@ async function copyTraceFamilyIdempotent(pool, companyId, companySchema, manifes
259082
259113
  sequences
259083
259114
  };
259084
259115
  }
259085
- var import_node_crypto75, MissingInstallerActorsError, TypeCatalogNotCoveredError, ORG_REGISTRY_TABLES, TRACE_FAMILY;
259116
+ var import_node_crypto76, MissingInstallerActorsError, TypeCatalogNotCoveredError, ORG_REGISTRY_TABLES, TRACE_FAMILY;
259086
259117
  var init_tenant_migration_operator = __esm({
259087
259118
  "../storage/src/tenant-migration-operator.ts"() {
259088
259119
  "use strict";
259089
- import_node_crypto75 = require("node:crypto");
259120
+ import_node_crypto76 = require("node:crypto");
259090
259121
  init_esm();
259091
259122
  init_pg_ident();
259092
259123
  init_tenancy_attribution();
@@ -259318,8 +259349,8 @@ var init_tenant_new_company_provision = __esm({
259318
259349
  // ../storage/src/knowledge-snapshot-crypto.ts
259319
259350
  function sealSnapshot(snapshot, key) {
259320
259351
  if (snapshot.content.startsWith(PREFIX3)) return structuredClone(snapshot);
259321
- const iv = (0, import_node_crypto76.randomBytes)(12);
259322
- const cipher = (0, import_node_crypto76.createCipheriv)("aes-256-gcm", bytes(key), iv);
259352
+ const iv = (0, import_node_crypto77.randomBytes)(12);
259353
+ const cipher = (0, import_node_crypto77.createCipheriv)("aes-256-gcm", bytes(key), iv);
259323
259354
  cipher.setAAD(aad2(snapshot));
259324
259355
  const encrypted = Buffer.concat([cipher.update(snapshot.content, "utf8"), cipher.final()]);
259325
259356
  return { ...structuredClone(snapshot), content: `${PREFIX3}${iv.toString("base64url")}.${cipher.getAuthTag().toString("base64url")}.${encrypted.toString("base64url")}` };
@@ -259329,7 +259360,7 @@ function openSnapshot(snapshot, key) {
259329
259360
  const packed = snapshot.content.slice(PREFIX3.length).split(".");
259330
259361
  if (packed.length !== 3 || packed.some((part) => !part)) throw new Error(`knowledge snapshot ${snapshot.ref} ciphertext is malformed`);
259331
259362
  const [iv, tag, data] = packed;
259332
- const decipher = (0, import_node_crypto76.createDecipheriv)("aes-256-gcm", bytes(key), Buffer.from(iv, "base64url"));
259363
+ const decipher = (0, import_node_crypto77.createDecipheriv)("aes-256-gcm", bytes(key), Buffer.from(iv, "base64url"));
259333
259364
  decipher.setAAD(aad2(snapshot));
259334
259365
  decipher.setAuthTag(Buffer.from(tag, "base64url"));
259335
259366
  return {
@@ -259337,11 +259368,11 @@ function openSnapshot(snapshot, key) {
259337
259368
  content: Buffer.concat([decipher.update(Buffer.from(data, "base64url")), decipher.final()]).toString("utf8")
259338
259369
  };
259339
259370
  }
259340
- var import_node_crypto76, PREFIX3, bytes, aad2;
259371
+ var import_node_crypto77, PREFIX3, bytes, aad2;
259341
259372
  var init_knowledge_snapshot_crypto = __esm({
259342
259373
  "../storage/src/knowledge-snapshot-crypto.ts"() {
259343
259374
  "use strict";
259344
- import_node_crypto76 = require("node:crypto");
259375
+ import_node_crypto77 = require("node:crypto");
259345
259376
  PREFIX3 = "oasis-knowledge:v1:";
259346
259377
  bytes = (key) => {
259347
259378
  const value2 = Buffer.from(key);
@@ -261588,20 +261619,20 @@ var fs45 = __toESM(require("node:fs"));
261588
261619
  var os14 = __toESM(require("node:os"));
261589
261620
  var path40 = __toESM(require("node:path"));
261590
261621
  var import_node_child_process23 = require("node:child_process");
261591
- var import_node_crypto83 = require("node:crypto");
261622
+ var import_node_crypto84 = require("node:crypto");
261592
261623
 
261593
261624
  // ../cli/src/cli.ts
261594
261625
  var fs40 = __toESM(require("node:fs"), 1);
261595
261626
  var os12 = __toESM(require("node:os"), 1);
261596
261627
  var path35 = __toESM(require("node:path"), 1);
261597
- var import_node_crypto81 = require("node:crypto");
261628
+ var import_node_crypto82 = require("node:crypto");
261598
261629
 
261599
261630
  // ../cli/src/serve.ts
261600
261631
  var fs34 = __toESM(require("node:fs"), 1);
261601
261632
  var os8 = __toESM(require("node:os"), 1);
261602
261633
  var path29 = __toESM(require("node:path"), 1);
261603
261634
  var import_node_child_process18 = require("node:child_process");
261604
- var import_node_crypto77 = require("node:crypto");
261635
+ var import_node_crypto78 = require("node:crypto");
261605
261636
  var import_node_url7 = require("node:url");
261606
261637
 
261607
261638
  // ../cli/src/artifact-discovery-source.ts
@@ -262347,7 +262378,7 @@ init_src9();
262347
262378
  init_src();
262348
262379
  init_trajectory();
262349
262380
  function deterministicUuid2(seed) {
262350
- const h = (0, import_node_crypto77.createHash)("sha256").update(seed).digest();
262381
+ const h = (0, import_node_crypto78.createHash)("sha256").update(seed).digest();
262351
262382
  const b2 = Buffer.from(h.subarray(0, 16));
262352
262383
  b2[6] = b2[6] & 15 | 80;
262353
262384
  b2[8] = b2[8] & 63 | 128;
@@ -262547,7 +262578,7 @@ function oasisWrapperScript() {
262547
262578
  const repoRoot = (0, import_node_url7.fileURLToPath)(new URL("../../../", __esm_import_meta_url));
262548
262579
  const tsx = path29.join(repoRoot, "node_modules/.bin/tsx");
262549
262580
  const main = path29.join(repoRoot, "packages/cli/src/main.ts");
262550
- const key = (0, import_node_crypto77.createHash)("sha256").update(repoRoot).digest("hex").slice(0, 12);
262581
+ const key = (0, import_node_crypto78.createHash)("sha256").update(repoRoot).digest("hex").slice(0, 12);
262551
262582
  const uid = typeof process.getuid === "function" ? process.getuid() : "na";
262552
262583
  const stable = path29.join(os8.tmpdir(), `oasis-cli-wrapper-${uid}-${key}`);
262553
262584
  let dir;
@@ -262928,7 +262959,7 @@ async function startServe(opts) {
262928
262959
  if (!hub) return Promise.resolve({ ok: false, reason: "\u672C\u8FDB\u7A0B\u6CA1\u6709\u8282\u70B9\u7F51\u5173" });
262929
262960
  const online = hub.connectedDaemons().some((d) => d.daemonId === nodeId);
262930
262961
  if (!online) return Promise.resolve({ ok: false, reason: "\u8282\u70B9\u5F53\u524D\u4E0D\u5728\u7EBF\uFF0C\u7528\u7684\u662F\u5B83\u4E0A\u6B21\u62A5\u7684\u6E05\u5355" });
262931
- const requestId = (0, import_node_crypto77.randomUUID)();
262962
+ const requestId = (0, import_node_crypto78.randomUUID)();
262932
262963
  const task = new Promise((resolve10) => {
262933
262964
  const timer = setTimeout(() => {
262934
262965
  modelRefreshWaiters.delete(requestId);
@@ -263680,7 +263711,7 @@ async function startServe(opts) {
263680
263711
  const finishedAt = (/* @__PURE__ */ new Date()).toISOString();
263681
263712
  if (buf || session.runId) {
263682
263713
  await turnStore.appendMessage({
263683
- id: (0, import_node_crypto77.randomUUID)(),
263714
+ id: (0, import_node_crypto78.randomUUID)(),
263684
263715
  sessionId: chatSessionId,
263685
263716
  role: "assistant",
263686
263717
  content: buf,
@@ -263726,7 +263757,7 @@ async function startServe(opts) {
263726
263757
  chatTargets: {
263727
263758
  inspect: inspectChatTarget,
263728
263759
  createTargetSession: async ({ companyId, agentId, ownerHumanActorId, title }) => {
263729
- const sessionId = (0, import_node_crypto77.randomUUID)();
263760
+ const sessionId = (0, import_node_crypto78.randomUUID)();
263730
263761
  const nowIso = (/* @__PURE__ */ new Date()).toISOString();
263731
263762
  const binding = await registryStore.getBinding(agentId).catch(() => null);
263732
263763
  await (await chatStoreFor(companyId)).createSession({
@@ -264771,7 +264802,7 @@ async function startServe(opts) {
264771
264802
  }));
264772
264803
  }
264773
264804
  const limits = { wallClockMs: wallClockForKind("planner") };
264774
- const artifactId = `artifact:planner:${(0, import_node_crypto77.randomUUID)()}`;
264805
+ const artifactId = `artifact:planner:${(0, import_node_crypto78.randomUUID)()}`;
264775
264806
  const handle = await chatRemoteAdapter.spawn({
264776
264807
  actor: planner.id,
264777
264808
  // companyId 同协调者:planner 用的就是默认公司的 actors 服务,漏签会让它一调公司域端点就 404。
@@ -265673,10 +265704,10 @@ async function startServe(opts) {
265673
265704
  if (isDeletedActor(dispatchTarget)) {
265674
265705
  throw new ApiError(409, ACTOR_DELETED_ERROR_CODE, ACTOR_DELETED_CHAT_MESSAGE);
265675
265706
  }
265676
- const runtimeSessionId = sessionId ?? (requestDispatchId ? deterministicUuid2(`chat-runtime:${requestDispatchId}`) : (0, import_node_crypto77.randomUUID)());
265707
+ const runtimeSessionId = sessionId ?? (requestDispatchId ? deterministicUuid2(`chat-runtime:${requestDispatchId}`) : (0, import_node_crypto78.randomUUID)());
265677
265708
  const resumeRuntimeSession = Boolean(sessionId);
265678
- const traceRunId = requestDispatchId ? `chat-run:${deterministicUuid2(`chat-trace:${requestDispatchId}`)}` : `chat-run:${(0, import_node_crypto77.randomUUID)()}`;
265679
- const artifactId = requestDispatchId ? `artifact:chat:${deterministicUuid2(`chat-artifact:${requestDispatchId}`)}` : `artifact:chat:${(0, import_node_crypto77.randomUUID)()}`;
265709
+ const traceRunId = requestDispatchId ? `chat-run:${deterministicUuid2(`chat-trace:${requestDispatchId}`)}` : `chat-run:${(0, import_node_crypto78.randomUUID)()}`;
265710
+ const artifactId = requestDispatchId ? `artifact:chat:${deterministicUuid2(`chat-artifact:${requestDispatchId}`)}` : `artifact:chat:${(0, import_node_crypto78.randomUUID)()}`;
265680
265711
  let stableDispatch = requestDispatchId ? await resolveStableChatDispatch({ store: await traceStoreFor(runCompanyId), runId: traceRunId }) : null;
265681
265712
  if (stableDispatch && !stableDispatch.shouldDispatch) {
265682
265713
  return {
@@ -266803,7 +266834,7 @@ async function startServe(opts) {
266803
266834
  console.log(`[new-engine] dispatchWork ${workId} \u662F human work\u2014\u2014\u4E0D\u6D3E runtime\uFF0C\u7B49\u5F85\u4EBA\u5DE5\u5904\u7406`);
266804
266835
  return;
266805
266836
  }
266806
- const ledgerId = `dispatch:${(0, import_node_crypto77.randomUUID)()}`;
266837
+ const ledgerId = `dispatch:${(0, import_node_crypto78.randomUUID)()}`;
266807
266838
  try {
266808
266839
  await (await dispatchLedgerFor(companyId)).insertOpen({
266809
266840
  id: ledgerId,
@@ -266888,7 +266919,7 @@ async function startServe(opts) {
266888
266919
  const kernelModel = newKernel.model;
266889
266920
  const art = kernelModel.artifacts.get(nodeId);
266890
266921
  const revWid = art?.workspace ?? "";
266891
- const ledgerId = `dispatch:${(0, import_node_crypto77.randomUUID)()}`;
266922
+ const ledgerId = `dispatch:${(0, import_node_crypto78.randomUUID)()}`;
266892
266923
  try {
266893
266924
  await (await dispatchLedgerFor(companyId)).insertOpen({
266894
266925
  id: ledgerId,
@@ -267266,7 +267297,7 @@ async function startServe(opts) {
267266
267297
  resolveSupplementalContext: server.knowledgeGovernance ? async ({ actorId, artifactId, workOrderId, action, part, runtimeKind, taskMarkdown }) => {
267267
267298
  try {
267268
267299
  const governance = server.knowledgeGovernance;
267269
- const taskFingerprint = (0, import_node_crypto77.createHash)("sha256").update(JSON.stringify({ artifactId, workOrderId, action, part: part ?? null, taskMarkdown })).digest("hex");
267300
+ const taskFingerprint = (0, import_node_crypto78.createHash)("sha256").update(JSON.stringify({ artifactId, workOrderId, action, part: part ?? null, taskMarkdown })).digest("hex");
267270
267301
  const requestContext = {
267271
267302
  organizationId: companyId,
267272
267303
  actorId,
@@ -269214,7 +269245,7 @@ var SessionProcessState = class {
269214
269245
  // ../cli/src/daemon/ws-client.ts
269215
269246
  init_wrapper();
269216
269247
  var import_node_os9 = require("node:os");
269217
- var import_node_crypto78 = require("node:crypto");
269248
+ var import_node_crypto79 = require("node:crypto");
269218
269249
  init_src8();
269219
269250
  init_src6();
269220
269251
 
@@ -269986,7 +270017,7 @@ var DaemonWsClient = class {
269986
270017
  */
269987
270018
  async queryArtifactStates(artifactIds, timeoutMs = 15e3) {
269988
270019
  if (artifactIds.length === 0) return {};
269989
- const requestId = (0, import_node_crypto78.randomUUID)();
270020
+ const requestId = (0, import_node_crypto79.randomUUID)();
269990
270021
  return new Promise((resolve10, reject) => {
269991
270022
  const timer = setTimeout(() => {
269992
270023
  this.gcPending.delete(requestId);
@@ -270388,7 +270419,7 @@ function forwardSignal(child, sig, killGroup = (pgid, signal) => {
270388
270419
  // ../cli/src/daemon/machine-id.ts
270389
270420
  var import_node_child_process21 = require("node:child_process");
270390
270421
  var import_node_fs22 = require("node:fs");
270391
- var import_node_crypto79 = require("node:crypto");
270422
+ var import_node_crypto80 = require("node:crypto");
270392
270423
  var import_node_os12 = require("node:os");
270393
270424
  function linuxMachineId() {
270394
270425
  for (const p2 of ["/etc/machine-id", "/var/lib/dbus/machine-id"]) {
@@ -270454,7 +270485,7 @@ var defaultSources = {
270454
270485
  function resolveNodeId(sources = {}) {
270455
270486
  const s2 = { ...defaultSources, ...sources };
270456
270487
  const material = `${s2.machineFingerprint()}:${s2.osUser()}`;
270457
- const digest = (0, import_node_crypto79.createHash)("sha256").update(material).digest("hex").slice(0, 12);
270488
+ const digest = (0, import_node_crypto80.createHash)("sha256").update(material).digest("hex").slice(0, 12);
270458
270489
  return `node-${digest}`;
270459
270490
  }
270460
270491
 
@@ -271465,7 +271496,7 @@ var COMMAND_DECLS = {
271465
271496
  flags: [
271466
271497
  { name: "name", desc: "\u9879\u76EE\u540D", required: true },
271467
271498
  { name: "goal", desc: "\u9879\u76EE\u76EE\u6807" },
271468
- { name: "slug", desc: "URL slug" },
271499
+ { name: "slug", desc: "\u81EA\u5B9A\u4E49\u9879\u76EE id\uFF08\u53EF\u9009\uFF09\u3002\u4E0D\u7ED9\u5219\u968F\u673A\u751F\u6210 proj_xxxxxxxx\uFF1B\u7ED9\u4E86\u4E14\u8BE5 id \u5DF2\u5B58\u5728\uFF0C\u8FD4\u56DE\u7684\u662F\u5DF2\u6709\u9879\u76EE\uFF08\u4F1A\u63D0\u793A\uFF09" },
271469
271500
  { name: "members", desc: "\u6210\u5458 JSON \u6570\u7EC4" }
271470
271501
  ],
271471
271502
  examples: ['oasis project create --name "My Project" --goal "\u6784\u5EFA\u534F\u4F5C\u5E73\u53F0"']
@@ -272225,13 +272256,13 @@ function ownFlagsFromDecl(command) {
272225
272256
  }
272226
272257
 
272227
272258
  // ../cli/src/connector-effect-runner.ts
272228
- var import_node_crypto80 = require("node:crypto");
272259
+ var import_node_crypto81 = require("node:crypto");
272229
272260
  var import_node_child_process22 = require("node:child_process");
272230
272261
  init_src8();
272231
272262
  function stableKey(effect) {
272232
272263
  const keyFields = Object.fromEntries(Object.entries(effect.keyFields).sort(([a], [b2]) => a.localeCompare(b2)));
272233
272264
  const canonical = JSON.stringify({ kind: effect.kind, target: effect.target, keyFields });
272234
- return `sha256:${(0, import_node_crypto80.createHash)("sha256").update(canonical).digest("hex")}`;
272265
+ return `sha256:${(0, import_node_crypto81.createHash)("sha256").update(canonical).digest("hex")}`;
272235
272266
  }
272236
272267
  async function runConnectorEffect(connector, toolArgs, deps) {
272237
272268
  const effect = connector.describeExternalEffect?.(toolArgs) ?? null;
@@ -272467,7 +272498,7 @@ async function waitForCommandAuthorization(base, headers, draftId, fallback) {
272467
272498
  const timeoutMs = resolveAuthWaitMs();
272468
272499
  const controller = new AbortController();
272469
272500
  const timer = setTimeout(() => controller.abort(), timeoutMs);
272470
- const waiterId = (0, import_node_crypto81.randomUUID)();
272501
+ const waiterId = (0, import_node_crypto82.randomUUID)();
272471
272502
  process.stderr.write(
272472
272503
  `\u7B49\u5F85\u4EBA\u5DE5\u6388\u6743\u4E2D\u2026\u2026\u6700\u591A ${Math.round(timeoutMs / 1e3)} \u79D2\uFF0C\u8D85\u65F6\u4F1A\u81EA\u52A8\u8F6C\u4E3A\u5F85\u5BA1\uFF1B\u8FD9\u4E0D\u662F\u9519\u8BEF\uFF0C\u8BF7\u52FF\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\u3002
272473
272504
  `
@@ -272890,7 +272921,7 @@ async function runCli(argv, println = console.log, progressln = console.error) {
272890
272921
  const store = createNodeTokenStore(path35.join(dir, "node-tokens.json"));
272891
272922
  const sub = positional[0];
272892
272923
  if (sub === "issue") {
272893
- const id = flags.get("id") ?? `node-${(0, import_node_crypto81.randomUUID)()}`;
272924
+ const id = flags.get("id") ?? `node-${(0, import_node_crypto82.randomUUID)()}`;
272894
272925
  const token2 = store.issue(id);
272895
272926
  println(token2);
272896
272927
  process.stderr.write(
@@ -273914,7 +273945,8 @@ ${t.ref} ${t.name} [\u5267\u672C=${t.playbookRef}]`);
273914
273945
  const name = need(flags, "name").trim();
273915
273946
  if (!name) throw new Error("\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");
273916
273947
  const goal = flags.get("goal")?.trim();
273917
- const id = projectSlug(flags.get("slug") ?? name);
273948
+ const slug6 = flags.get("slug");
273949
+ const id = slug6 !== void 0 ? projectSlug(slug6) : projectIdFromUuid((0, import_node_crypto82.randomUUID)());
273918
273950
  const result = await api.request("POST", "/api/projects", {
273919
273951
  ...id ? { id } : {},
273920
273952
  name,
@@ -273922,6 +273954,9 @@ ${t.ref} ${t.name} [\u5267\u672C=${t.playbookRef}]`);
273922
273954
  ...flags.has("members") ? { member_ids: parseStringArrayFlag(flags.get("members"), "members") } : {}
273923
273955
  });
273924
273956
  println(JSON.stringify(result, null, 2));
273957
+ if (typeof result?.name === "string" && result.name !== name) {
273958
+ println(`\u26A0\uFE0F \u9879\u76EE id\u300C${result.project_id ?? id}\u300D\u5DF2\u88AB\u300C${result.name}\u300D\u5360\u7528\uFF0C\u4E0A\u9762\u8FD4\u56DE\u7684\u662F\u90A3\u4E2A\u5DF2\u6709\u9879\u76EE\uFF0C\u6CA1\u6709\u65B0\u5EFA\u3002\u6362\u4E00\u4E2A --slug \u6216\u53BB\u6389 --slug \u91CD\u8BD5\u3002`);
273959
+ }
273925
273960
  break;
273926
273961
  }
273927
273962
  if (positional[0] === "member") {
@@ -275903,13 +275938,13 @@ var LEGACY_SYSTEMD_UNIT = "oasis-node.service";
275903
275938
  var LEGACY_LAUNCHD_LABEL = "com.oasis.node";
275904
275939
 
275905
275940
  // src/install.ts
275906
- var import_node_crypto82 = require("node:crypto");
275941
+ var import_node_crypto83 = require("node:crypto");
275907
275942
  var fs44 = __toESM(require("node:fs"));
275908
275943
  var path39 = __toESM(require("node:path"));
275909
275944
  function versionLabel(sourceFile, pkgVersion, npmPrefixDir, pkgName = LEGACY_PKG_NAME) {
275910
275945
  const tag = pkgName === LEGACY_PKG_NAME ? "" : `+pkg.${pkgName.replace(/[^A-Za-z0-9-]/g, "-")}`;
275911
275946
  if (isFromNpmPrefix(sourceFile, npmPrefixDir)) return `${pkgVersion}${tag}`;
275912
- const digest = (0, import_node_crypto82.createHash)("sha256").update(fs44.readFileSync(sourceFile)).digest("hex").slice(0, 8);
275947
+ const digest = (0, import_node_crypto83.createHash)("sha256").update(fs44.readFileSync(sourceFile)).digest("hex").slice(0, 8);
275913
275948
  return tag ? `${pkgVersion}${tag}.local.${digest}` : `${pkgVersion}+local.${digest}`;
275914
275949
  }
275915
275950
  function isFromNpmPrefix(sourceFile, npmPrefixDir) {
@@ -276032,7 +276067,7 @@ function shimScript() {
276032
276067
  }
276033
276068
 
276034
276069
  // src/index.ts
276035
- var PKG_VERSION = true ? "2.2.34" : "dev";
276070
+ var PKG_VERSION = true ? "2.2.35" : "dev";
276036
276071
  var LOCAL_BIN = localBin();
276037
276072
  var NPM_PREFIX = npmPrefix();
276038
276073
  var INSTANCE = DEFAULT_INSTANCE;
@@ -276317,7 +276352,7 @@ function newInstanceName() {
276317
276352
  const existing = new Set(listInstances());
276318
276353
  if (!existing.has(DEFAULT_INSTANCE)) return DEFAULT_INSTANCE;
276319
276354
  for (; ; ) {
276320
- const n = `inst-${(0, import_node_crypto83.randomBytes)(3).toString("hex")}`;
276355
+ const n = `inst-${(0, import_node_crypto84.randomBytes)(3).toString("hex")}`;
276321
276356
  if (!existing.has(n)) return n;
276322
276357
  }
276323
276358
  }