@sema-agent/cli 1.0.71 → 1.0.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@sema-agent/cli",
3
- "version": "1.0.71",
3
+ "version": "1.0.72",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@sema-agent/cli",
9
- "version": "1.0.71",
9
+ "version": "1.0.72",
10
10
  "license": "BUSL-1.1",
11
11
  "dependencies": {
12
- "@sema-agent/sdk": "6.11.0",
13
- "@sema-agent/server": "7.8.1"
12
+ "@sema-agent/sdk": "6.12.0",
13
+ "@sema-agent/server": "7.9.0"
14
14
  },
15
15
  "bin": {
16
16
  "sema": "sema.js"
@@ -660,18 +660,18 @@
660
660
  }
661
661
  },
662
662
  "node_modules/@sema-agent/sdk": {
663
- "version": "6.11.0",
664
- "resolved": "https://registry.npmjs.org/@sema-agent/sdk/-/sdk-6.11.0.tgz",
665
- "integrity": "sha512-xwtuR0FykfmvpA+23HbdQ70bqlVnPFmeePKxbDZQsky3IF/Kh6bYdlO0BOEMo8dAFMBn4zloaLae0brsDdkuFg==",
663
+ "version": "6.12.0",
664
+ "resolved": "https://registry.npmjs.org/@sema-agent/sdk/-/sdk-6.12.0.tgz",
665
+ "integrity": "sha512-ClQAUAV7i4Uz9CJfjvlczttTSfce1qEfwoyWXvZzFBWtL1GPgNCcQ90aY+GwqJGUHscpVgMlt3tPkfAjSZGE7A==",
666
666
  "license": "BUSL-1.1",
667
667
  "engines": {
668
668
  "node": ">=20"
669
669
  }
670
670
  },
671
671
  "node_modules/@sema-agent/server": {
672
- "version": "7.8.1",
673
- "resolved": "https://registry.npmjs.org/@sema-agent/server/-/server-7.8.1.tgz",
674
- "integrity": "sha512-Ehe8+kW0k7mcdjpEq69uTl+A5b6itE3UI5bC/5wrZHVxtDMkWG3PrvLyx3NkbjQsnsUQqF7E5B+PdKSbx7u2MQ==",
672
+ "version": "7.9.0",
673
+ "resolved": "https://registry.npmjs.org/@sema-agent/server/-/server-7.9.0.tgz",
674
+ "integrity": "sha512-hV1WYbv9kjS+JlRRjxLY0L3ssFrSIBe2+sQ0TZ34cYGLMybYROWE8PvGAGWuVmMW5kxWuqXnty8gXCNOD698fg==",
675
675
  "license": "BUSL-1.1",
676
676
  "dependencies": {
677
677
  "@sema-agent/core": "^5.21.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/cli",
3
- "version": "1.0.71",
3
+ "version": "1.0.72",
4
4
  "description": "Sema — your own Claude Code-grade coding agent, in the terminal.",
5
5
  "license": "BUSL-1.1",
6
6
  "bin": {
@@ -22,14 +22,14 @@
22
22
  "sema"
23
23
  ],
24
24
  "dependencies": {
25
- "@sema-agent/sdk": "6.11.0",
26
- "@sema-agent/server": "7.8.1"
25
+ "@sema-agent/sdk": "6.12.0",
26
+ "@sema-agent/server": "7.9.0"
27
27
  },
28
28
  "overrides": {
29
29
  "@sema-agent/core": "5.21.1",
30
30
  "@sema-agent/registry-core": "0.16.0"
31
31
  },
32
- "semaEngineVersion": "server 7.8.1 / core 5.21.1 / registry-core 0.16.0",
32
+ "semaEngineVersion": "server 7.9.0 / core 5.21.1 / registry-core 0.16.0",
33
33
  "engines": {
34
34
  "node": ">=20.3"
35
35
  }
package/sema-main.js CHANGED
@@ -53482,6 +53482,7 @@ __export(settings_exports2, {
53482
53482
  loadManagedFileSettings: () => loadManagedFileSettings,
53483
53483
  parseSettingsFile: () => parseSettingsFile,
53484
53484
  rawSettingsContainsKey: () => rawSettingsContainsKey,
53485
+ settingsLoudNoticesActive: () => settingsLoudNoticesActive,
53485
53486
  settingsMergeCustomizer: () => settingsMergeCustomizer,
53486
53487
  updateSettingsForSource: () => updateSettingsForSource
53487
53488
  });
@@ -53543,17 +53544,22 @@ function noteInvalidSettingsJson(path28, content) {
53543
53544
  function invalidSettingsWarningActive() {
53544
53545
  return invalidSettingsDetail;
53545
53546
  }
53547
+ function settingsLoudNoticesActive() {
53548
+ return [...loudSettingsNotices];
53549
+ }
53546
53550
  function noteSettingsKeysRejected(path28, keyPaths) {
53547
- warnedRejectedKeyPaths.has(path28) || (warnedRejectedKeyPaths.add(path28), process.stderr.write(
53548
- `[sema] settings rejected key(s) ${keyPaths.map((k2) => `'${k2}'`).join(", ")} in ${path28} \u2014 invalid value(s); these keys are ignored, the rest of the file is kept
53549
- `
53550
- ));
53551
+ if (warnedRejectedKeyPaths.has(path28)) return;
53552
+ warnedRejectedKeyPaths.add(path28);
53553
+ let msg = `settings rejected key(s) ${keyPaths.map((k2) => `'${k2}'`).join(", ")} in ${path28} \u2014 invalid value(s); these keys are ignored, the rest of the file is kept`;
53554
+ loudSettingsNotices.push(msg), process.stderr.write(`[sema] ${msg}
53555
+ `);
53551
53556
  }
53552
53557
  function noteSettingsFileUnreadable(path28, code2) {
53553
- warnedUnreadableSettingsPaths.has(path28) || (warnedUnreadableSettingsPaths.add(path28), process.stderr.write(
53554
- `[sema] settings ValidationError: file unreadable (${code2}) \u2014 its settings (including permissions) are not applied: ${path28}
53555
- `
53556
- ));
53558
+ if (warnedUnreadableSettingsPaths.has(path28)) return;
53559
+ warnedUnreadableSettingsPaths.add(path28);
53560
+ let msg = `settings ValidationError: file unreadable (${code2}) \u2014 its settings (including permissions) are not applied: ${path28}`;
53561
+ loudSettingsNotices.push(msg), process.stderr.write(`[sema] ${msg}
53562
+ `);
53557
53563
  }
53558
53564
  function stripInvalidSettingsPaths(data, issues) {
53559
53565
  let dropped2 = [];
@@ -53997,7 +54003,7 @@ function rawSettingsContainsKey(key) {
53997
54003
  }
53998
54004
  return !1;
53999
54005
  }
54000
- var warnedInvalidSettingsPaths, invalidSettingsDetail, warnedRejectedKeyPaths, warnedUnreadableSettingsPaths, SALVAGEABLE_PERMISSION_SCALAR_KEYS, SALVAGEABLE_TOP_LEVEL_KEYS, isLoadingSettings, getSettings_DEPRECATED, init_settings2 = __esm({
54006
+ var warnedInvalidSettingsPaths, invalidSettingsDetail, loudSettingsNotices, warnedRejectedKeyPaths, warnedUnreadableSettingsPaths, SALVAGEABLE_PERMISSION_SCALAR_KEYS, SALVAGEABLE_TOP_LEVEL_KEYS, isLoadingSettings, getSettings_DEPRECATED, init_settings2 = __esm({
54001
54007
  "build-src/src/utils/settings/settings.ts"() {
54002
54008
  init_mergeWith();
54003
54009
  init_state();
@@ -54031,6 +54037,7 @@ var warnedInvalidSettingsPaths, invalidSettingsDetail, warnedRejectedKeyPaths, w
54031
54037
  return settings2 !== null && Object.keys(settings2).length > 0;
54032
54038
  });
54033
54039
  warnedInvalidSettingsPaths = /* @__PURE__ */ new Set(), invalidSettingsDetail = null;
54040
+ loudSettingsNotices = [];
54034
54041
  warnedRejectedKeyPaths = /* @__PURE__ */ new Set();
54035
54042
  warnedUnreadableSettingsPaths = /* @__PURE__ */ new Set();
54036
54043
  SALVAGEABLE_PERMISSION_SCALAR_KEYS = /* @__PURE__ */ new Set([
@@ -313186,7 +313193,7 @@ function useClaudeAiLimits() {
313186
313193
  }
313187
313194
  var import_react69, init_claudeAiLimitsHook = __esm({
313188
313195
  "build-src/src/services/claudeAiLimitsHook.ts"() {
313189
- import_react69 = __toESM(require_react());
313196
+ import_react69 = __toESM(require_react(), 1);
313190
313197
  init_claudeAiLimits();
313191
313198
  }
313192
313199
  });
@@ -396274,15 +396281,15 @@ var sema_brand_default, init_sema_brand = __esm({
396274
396281
  _doc: "displayName/email \u7559 null = \u8FD0\u884C\u65F6\u56DE\u9000(\u540D\u5B57\u53D6\u672C\u673A OS \u7528\u6237\u540D,\u90AE\u7BB1\u4E0D\u663E\u793A)\u3002\u522B\u70E7\u4E2A\u4EBA\u4FE1\u606F\u8FDB\u54C1\u724C\u6587\u4EF6(F-S1-1:\u65B0\u7528\u6237\u66FE\u770B\u5230 Welcome back Clay!)\u3002"
396275
396282
  },
396276
396283
  whatsNew: {
396277
- version: "1.0.71",
396284
+ version: "1.0.72",
396278
396285
  notes: [
396279
- "Engine 7.6.0: crash-restart fleet visibility, SQL normalization (breaking: fresh DB on upgrade), LSP chain revived",
396280
- "Six lost-update races serialized: tier bindings, Model Hub default, cloud scope switch, PID registry",
396281
- "31% smaller install: bundle minified (whitespace+syntax only \u2014 stack traces keep real names)"
396286
+ "Settings rejections now visible in the interactive session: trust-ceiling drops, per-key salvage, unreadable files and whole-file rejections all land as transcript notices (stderr stays for headless lanes)",
396287
+ "Engine 7.9.0: run journal gains additive provenance keys (SDK ^6.12.0 rides along)",
396288
+ "Invalid permissions.defaultMode words and salvaged bad keys announce themselves on screen instead of vanishing"
396282
396289
  ]
396283
396290
  },
396284
- productVersion: "1.0.71",
396285
- announcement: "sema 1.0.71 \u2014 Engine 7.8.1 rides in (\u26A0\uFE0F breaking: engine SQL naming normalized across three axes \u2014 wipe and rebuild engine data on upgrade; zero-legacy cut). Headless -p now mounts the scheduler tool family (CronCreate/CronDelete/CronList/ScheduleWakeup) matching the interactive lane, and the -p lane finally runs the settings resolver: trust-ceiling rejections speak on stderr and your permissions settings reach the engine. Identity hygiene: the shell no longer fabricates a placeholder principal on the wire \u2014 absent means absent, with the engine's narrow mutual-recognition keeping existing sessions fully readable and resumable. Core 5.21.x tightens remote-image intake (magic-byte checks) and refuses symlinked memory files."
396291
+ productVersion: "1.0.72",
396292
+ announcement: "sema 1.0.72 \u2014 Settings rejections become visible where you work: the interactive session now prints a transcript notice for every trust-ceiling drop, salvaged bad key, unreadable settings file and whole-file rejection (the alt-screen used to swallow these stderr warnings entirely; headless lanes keep the stderr form). Invalid permissions.defaultMode words announce themselves too. Engine 7.9.0 rides in with additive run-journal provenance keys (SDK ^6.12.0 in the same seat). Fully backward compatible \u2014 no data migration."
396286
396293
  };
396287
396294
  }
396288
396295
  });
@@ -400483,15 +400490,15 @@ var require_sema_brand = __commonJS({
400483
400490
  _doc: "displayName/email \u7559 null = \u8FD0\u884C\u65F6\u56DE\u9000(\u540D\u5B57\u53D6\u672C\u673A OS \u7528\u6237\u540D,\u90AE\u7BB1\u4E0D\u663E\u793A)\u3002\u522B\u70E7\u4E2A\u4EBA\u4FE1\u606F\u8FDB\u54C1\u724C\u6587\u4EF6(F-S1-1:\u65B0\u7528\u6237\u66FE\u770B\u5230 Welcome back Clay!)\u3002"
400484
400491
  },
400485
400492
  whatsNew: {
400486
- version: "1.0.71",
400493
+ version: "1.0.72",
400487
400494
  notes: [
400488
- "Engine 7.6.0: crash-restart fleet visibility, SQL normalization (breaking: fresh DB on upgrade), LSP chain revived",
400489
- "Six lost-update races serialized: tier bindings, Model Hub default, cloud scope switch, PID registry",
400490
- "31% smaller install: bundle minified (whitespace+syntax only \u2014 stack traces keep real names)"
400495
+ "Settings rejections now visible in the interactive session: trust-ceiling drops, per-key salvage, unreadable files and whole-file rejections all land as transcript notices (stderr stays for headless lanes)",
400496
+ "Engine 7.9.0: run journal gains additive provenance keys (SDK ^6.12.0 rides along)",
400497
+ "Invalid permissions.defaultMode words and salvaged bad keys announce themselves on screen instead of vanishing"
400491
400498
  ]
400492
400499
  },
400493
- productVersion: "1.0.71",
400494
- announcement: "sema 1.0.71 \u2014 Engine 7.8.1 rides in (\u26A0\uFE0F breaking: engine SQL naming normalized across three axes \u2014 wipe and rebuild engine data on upgrade; zero-legacy cut). Headless -p now mounts the scheduler tool family (CronCreate/CronDelete/CronList/ScheduleWakeup) matching the interactive lane, and the -p lane finally runs the settings resolver: trust-ceiling rejections speak on stderr and your permissions settings reach the engine. Identity hygiene: the shell no longer fabricates a placeholder principal on the wire \u2014 absent means absent, with the engine's narrow mutual-recognition keeping existing sessions fully readable and resumable. Core 5.21.x tightens remote-image intake (magic-byte checks) and refuses symlinked memory files."
400500
+ productVersion: "1.0.72",
400501
+ announcement: "sema 1.0.72 \u2014 Settings rejections become visible where you work: the interactive session now prints a transcript notice for every trust-ceiling drop, salvaged bad key, unreadable settings file and whole-file rejection (the alt-screen used to swallow these stderr warnings entirely; headless lanes keep the stderr form). Invalid permissions.defaultMode words announce themselves too. Engine 7.9.0 rides in with additive run-journal provenance keys (SDK ^6.12.0 in the same seat). Fully backward compatible \u2014 no data migration."
400495
400502
  };
400496
400503
  }
400497
400504
  });
@@ -447694,12 +447701,23 @@ var TRUST_RANK, UNIT_CATEGORY, KILL_SWITCHES, init_keyContracts = __esm({
447694
447701
  });
447695
447702
 
447696
447703
  // build-src/src/sema/settings/resolver.ts
447704
+ var resolver_exports = {};
447705
+ __export(resolver_exports, {
447706
+ OverrideLockViolation: () => OverrideLockViolation,
447707
+ permissionsLoosens: () => permissionsLoosens,
447708
+ resolveEffectiveSettings: () => resolveEffectiveSettings,
447709
+ resolverLoudNoticesActive: () => resolverLoudNoticesActive
447710
+ });
447711
+ function resolverLoudNoticesActive() {
447712
+ return [...resolverLoudNotices];
447713
+ }
447697
447714
  function warnInvalidDefaultMode(raw2, sourceTrust) {
447698
447715
  let key = `${sourceTrust}:${raw2}`;
447699
- warnedInvalidModes.has(key) || (warnedInvalidModes.add(key), process.stderr.write(
447700
- `[sema] settings: permissions.defaultMode '${raw2}' (from ${sourceTrust} settings) is not a valid mode \u2014 ignored, default tier kept. Allowed: ${USER_ADDRESSABLE_PERMISSION_MODES.join(", ")}
447701
- `
447702
- ));
447716
+ if (warnedInvalidModes.has(key)) return;
447717
+ warnedInvalidModes.add(key);
447718
+ let msg = `settings: permissions.defaultMode '${raw2}' (from ${sourceTrust} settings) is not a valid mode \u2014 ignored, default tier kept. Allowed: ${USER_ADDRESSABLE_PERMISSION_MODES.join(", ")}`;
447719
+ resolverLoudNotices.push(msg), process.stderr.write(`[sema] ${msg}
447720
+ `);
447703
447721
  }
447704
447722
  function warnTrustDowngrade(unit, layerTrust, required2) {
447705
447723
  let key = `${layerTrust}:${unit}`;
@@ -447842,7 +447860,7 @@ function foldEnv(base, next) {
447842
447860
  return { ...base, ...next };
447843
447861
  }
447844
447862
  function resolveEffectiveSettings(layers2) {
447845
- let trustSkipped = /* @__PURE__ */ new Set();
447863
+ let trustSkipped = /* @__PURE__ */ new Set(), rejections = [];
447846
447864
  for (let i = 0; i < layers2.length; i++) {
447847
447865
  let layer = layers2[i];
447848
447866
  for (let unit of UNITS) {
@@ -447850,7 +447868,7 @@ function resolveEffectiveSettings(layers2) {
447850
447868
  if (!isSet2(v2)) continue;
447851
447869
  let contract = contractFor(unit);
447852
447870
  if (TRUST_RANK[layer.sourceTrust] < TRUST_RANK[contract.minTrust]) {
447853
- warnTrustDowngrade(unit, layer.sourceTrust, contract.minTrust), trustSkipped.add(`${i}:${unit}`);
447871
+ warnTrustDowngrade(unit, layer.sourceTrust, contract.minTrust), rejections.push({ unit, layerTrust: layer.sourceTrust, requiredTrust: contract.minTrust }), trustSkipped.add(`${i}:${unit}`);
447854
447872
  continue;
447855
447873
  }
447856
447874
  if (unit === "permissionMode" && v2 === "bypassPermissions")
@@ -447865,7 +447883,8 @@ function resolveEffectiveSettings(layers2) {
447865
447883
  permissions: { allow: [], deny: [], ask: [] },
447866
447884
  additionalDirectories: [],
447867
447885
  env: {},
447868
- provenance: {}
447886
+ provenance: {},
447887
+ rejections
447869
447888
  };
447870
447889
  for (let unit of UNITS) {
447871
447890
  let contract = contractFor(unit), sourcesByLayer = [], winningLayer = "default", acc = unit === "permissions" ? { allow: [], deny: [], ask: [] } : unit === "additionalDirectories" ? [] : unit === "env" ? {} : void 0;
@@ -447946,7 +447965,7 @@ function mergeHooksRaw(base, next) {
447946
447965
  Array.isArray(matchers2) && (out6[event] = [...out6[event] ?? [], ...matchers2]);
447947
447966
  return out6;
447948
447967
  }
447949
- var OverrideLockViolation, warnedInvalidModes, warnedTrustDowngrades, UNITS, init_resolver2 = __esm({
447968
+ var OverrideLockViolation, warnedInvalidModes, resolverLoudNotices, warnedTrustDowngrades, UNITS, init_resolver2 = __esm({
447950
447969
  "build-src/src/sema/settings/resolver.ts"() {
447951
447970
  init_dist10();
447952
447971
  init_permissions();
@@ -447960,7 +447979,7 @@ var OverrideLockViolation, warnedInvalidModes, warnedTrustDowngrades, UNITS, ini
447960
447979
  }
447961
447980
  unit;
447962
447981
  detail;
447963
- }, warnedInvalidModes = /* @__PURE__ */ new Set();
447982
+ }, warnedInvalidModes = /* @__PURE__ */ new Set(), resolverLoudNotices = [];
447964
447983
  warnedTrustDowngrades = /* @__PURE__ */ new Set();
447965
447984
  UNITS = Object.keys(UNIT_CATEGORY);
447966
447985
  }
@@ -448004,6 +448023,7 @@ function toEffectiveConfig(eff, opts) {
448004
448023
  ), taskSpecOverrides = { toolPolicy };
448005
448024
  return handsReadOnly !== void 0 && (taskSpecOverrides.handsReadOnly = handsReadOnly), onAsk !== void 0 && (taskSpecOverrides.onAsk = onAsk), eff.model !== void 0 && (taskSpecOverrides.model = eff.model), {
448006
448025
  taskSpecOverrides,
448026
+ rejections: eff.rejections,
448007
448027
  hooks: eff.hooks,
448008
448028
  env: Object.keys(eff.env).length > 0 ? eff.env : void 0,
448009
448029
  model: eff.model,
@@ -522104,7 +522124,7 @@ Usage: sema --remote "your task description"`, () => gracefulShutdown(1));
522104
522124
  pendingHookMessages
522105
522125
  }, renderAndRun);
522106
522126
  }
522107
- }).version("sema 1.0.71", "-v, --version", "Output the version number"), program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)"), program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux."), canUserConfigureAdvisor() && program2.addOption(new Option("--advisor <model>", "Enable the server-side advisor tool with the specified model (alias or full ID).").hideHelp()), program2.addOption(new Option("--bg, --background", "Start the session as a background agent and return immediately (manage with `sema agents`)")), program2.command("ps").description("List background sessions").action(async () => {
522127
+ }).version("sema 1.0.72", "-v, --version", "Output the version number"), program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)"), program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux."), canUserConfigureAdvisor() && program2.addOption(new Option("--advisor <model>", "Enable the server-side advisor tool with the specified model (alias or full ID).").hideHelp()), program2.addOption(new Option("--bg, --background", "Start the session as a background agent and return immediately (manage with `sema agents`)")), program2.command("ps").description("List background sessions").action(async () => {
522108
522128
  await (await Promise.resolve().then(() => (init_bg2(), bg_exports))).psHandler([]), process.exit(process.exitCode ?? 0);
522109
522129
  }), program2.command("logs [id]").description("Print a background session's recent terminal output").action(async (id) => {
522110
522130
  await (await Promise.resolve().then(() => (init_bg2(), bg_exports))).logsHandler(id, []), process.exit(process.exitCode ?? 0);
@@ -529503,7 +529523,7 @@ async function launchReplProduction() {
529503
529523
  let offlineFallback = process.env.SEMA_LIVE_BASEURL ? "unknown" : "opus[1m]";
529504
529524
  initialState.mainLoopModel = resolved ?? offlineFallback;
529505
529525
  }
529506
- let bypassModeLaunch = !1;
529526
+ let bypassModeLaunch = !1, settingsRejectionNotices = [];
529507
529527
  try {
529508
529528
  let argv = process.argv.slice(2), allowDangerouslySkipPermissions = argv.includes("--dangerously-skip-permissions"), pmIdx = argv.indexOf("--permission-mode"), cliPermissionMode = pmIdx >= 0 ? argv[pmIdx + 1] : void 0, { PERMISSION_MODES: PERMISSION_MODES3 } = await Promise.resolve().then(() => (init_PermissionMode(), PermissionMode_exports)), launchMode = ((m2) => !!m2 && PERMISSION_MODES3.includes(m2))(cliPermissionMode) ? cliPermissionMode : allowDangerouslySkipPermissions ? "bypassPermissions" : void 0, settingsDisableBypass = !0;
529509
529529
  try {
@@ -529531,7 +529551,9 @@ async function launchReplProduction() {
529531
529551
  try {
529532
529552
  effectiveConfig = resolveSemaConfig({ launchMode });
529533
529553
  let dm = effectiveConfig.derivedMode;
529534
- tpc.mode = dm === "bypassPermissions" && !isBypassPermissionsModeAvailable ? "default" : dm, bypassModeLaunch = tpc.mode === "bypassPermissions", process.env.SEMA_DEBUG && console.error(
529554
+ tpc.mode = dm === "bypassPermissions" && !isBypassPermissionsModeAvailable ? "default" : dm, bypassModeLaunch = tpc.mode === "bypassPermissions", settingsRejectionNotices = effectiveConfig.rejections.map(
529555
+ (r) => `settings rejected key '${r.unit}' from ${r.layerTrust}-trust settings \u2014 requires trust '${r.requiredTrust}' or higher; this key is ignored, other keys in the same file are kept`
529556
+ ), process.env.SEMA_DEBUG && console.error(
529535
529557
  `[sema] resolver: derivedMode=${dm} \u2192 tpc.mode=${tpc.mode} \xB7 model=${effectiveConfig.model ?? "\u2205"} hooks=${effectiveConfig.hooks ? "set" : "\u2205"} envKeys=${Object.keys(effectiveConfig.env ?? {}).length}`
529536
529558
  );
529537
529559
  try {
@@ -529563,7 +529585,7 @@ async function launchReplProduction() {
529563
529585
  } catch (e) {
529564
529586
  let msg = e instanceof Error ? `${e.name}: ${e.message}` : String(e);
529565
529587
  process.stderr.write(`[sema] settings rejected \u2014 file ignored, launch-flag mode kept: ${msg}
529566
- `), process.env.SEMA_DEBUG && console.error("[sema] resolveSemaConfig soft-failed detail:", e);
529588
+ `), settingsRejectionNotices = [`settings rejected \u2014 file ignored, launch-flag mode kept: ${msg}`], process.env.SEMA_DEBUG && console.error("[sema] resolveSemaConfig soft-failed detail:", e);
529567
529589
  }
529568
529590
  process.env.SEMA_DEBUG && console.error(
529569
529591
  `[sema] permission flags: mode=${tpc.mode} bypassAvailable=${isBypassPermissionsModeAvailable} (--dangerously-skip-permissions=${allowDangerouslySkipPermissions} --permission-mode=${cliPermissionMode ?? "\u2205"})`
@@ -529835,7 +529857,17 @@ async function launchReplProduction() {
529835
529857
  let { emitStatusSignal: emitStatusSignal2 } = await Promise.resolve().then(() => (init_statusSignal(), statusSignal_exports)), { PRODUCT_VERSION: PRODUCT_VERSION4 } = await Promise.resolve().then(() => (init_productVersion(), productVersion_exports));
529836
529858
  emitStatusSignal2("shell_ready", { version: PRODUCT_VERSION4 });
529837
529859
  }
529838
- let { launchRepl: launchRepl2 } = await Promise.resolve().then(() => (init_replLauncher(), replLauncher_exports));
529860
+ let { launchRepl: launchRepl2 } = await Promise.resolve().then(() => (init_replLauncher(), replLauncher_exports)), { createSystemMessage: createSystemMessage3 } = await Promise.resolve().then(() => (init_messages4(), messages_exports2));
529861
+ try {
529862
+ let { settingsLoudNoticesActive: settingsLoudNoticesActive2 } = await Promise.resolve().then(() => (init_settings2(), settings_exports2)), { resolverLoudNoticesActive: resolverLoudNoticesActive2 } = await Promise.resolve().then(() => (init_resolver2(), resolver_exports));
529863
+ settingsRejectionNotices = [
529864
+ ...settingsRejectionNotices,
529865
+ ...settingsLoudNoticesActive2(),
529866
+ ...resolverLoudNoticesActive2()
529867
+ ];
529868
+ } catch (eN) {
529869
+ process.env.SEMA_DEBUG && console.error("[sema] settings notices merge soft-failed:", eN);
529870
+ }
529839
529871
  await launchRepl2(
529840
529872
  root2,
529841
529873
  {
@@ -529875,8 +529907,18 @@ async function launchReplProduction() {
529875
529907
  // RESUME wire (6b) — when a conversation was restored, seed the REPL the SAME way main.tsx's continue/
529876
529908
  // resume branches do (main.tsx:3174-3180): the restored messages + file-history/content-replacement
529877
529909
  // snapshots + agent identity. Omitted entirely on a fresh boot (resumeLoaded undefined ⇒ empty prompt).
529910
+ // #221:settings 拒绝转录行(system-informational level=warning)——fresh boot 单独注入,
529911
+ // resume 时 append 在恢复消息之后(同一 initialMessages 通道,CC REPL 原生渲染,零新组件)。
529912
+ ...settingsRejectionNotices.length > 0 && !resumeLoaded ? {
529913
+ initialMessages: settingsRejectionNotices.map(
529914
+ (n2) => createSystemMessage3(n2, "warning")
529915
+ )
529916
+ } : {},
529878
529917
  ...resumeLoaded ? {
529879
- initialMessages: resumeLoaded.messages,
529918
+ initialMessages: [
529919
+ ...resumeLoaded.messages,
529920
+ ...settingsRejectionNotices.map((n2) => createSystemMessage3(n2, "warning"))
529921
+ ],
529880
529922
  initialFileHistorySnapshots: resumeLoaded.fileHistorySnapshots,
529881
529923
  initialContentReplacements: resumeLoaded.contentReplacements,
529882
529924
  initialAgentName: resumeLoaded.agentName,
package/sema.js CHANGED
@@ -71,7 +71,7 @@ function installBootSignalTailFrame(argv2 = process.argv.slice(2)) {
71
71
  installBootSignalTailFrame();
72
72
 
73
73
  // build-src/src/sema/preludeEntry.ts
74
- var versionLine = "sema 1.0.71" ? "sema 1.0.71" : "";
74
+ var versionLine = "sema 1.0.72" ? "sema 1.0.72" : "";
75
75
  var argv = process.argv.slice(2);
76
76
  var wantsVersionFastPath = argv.length === 1 && (argv[0] === "--version" || argv[0] === "-v");
77
77
  if (wantsVersionFastPath && versionLine) {