@sema-agent/client-core 0.111.0 → 0.112.0

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 (106) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +15 -6
  3. package/dist/agentSession/engineSessionBackgroundStop.js +2 -2
  4. package/dist/checkpointRowVerdict.d.ts +3 -0
  5. package/dist/checkpointRowVerdict.js +14 -1
  6. package/dist/consoleCaPin.d.ts +136 -0
  7. package/dist/consoleCaPin.js +827 -0
  8. package/dist/decideReceipt.d.ts +2 -1
  9. package/dist/deviceRebind.js +3 -3
  10. package/dist/effectiveFacts.d.ts +9 -0
  11. package/dist/effectiveFacts.js +33 -0
  12. package/dist/engineAddress.d.ts +1 -0
  13. package/dist/engineAddress.js +4 -1
  14. package/dist/engineCredentialRelease.d.ts +54 -0
  15. package/dist/engineCredentialRelease.js +146 -0
  16. package/dist/engineErrorCodes.d.ts +1 -0
  17. package/dist/engineErrorCodes.js +1 -0
  18. package/dist/engineHealthFacts.d.ts +0 -11
  19. package/dist/engineHealthFacts.js +0 -21
  20. package/dist/engineHealthProbeVerdict.d.ts +1 -0
  21. package/dist/engineHealthProbeVerdict.js +21 -13
  22. package/dist/engineUnavailable.d.ts +3 -2
  23. package/dist/engineUnavailable.js +16 -12
  24. package/dist/engineUrl.js +4 -2
  25. package/dist/gateFailureCodes.js +2 -2
  26. package/dist/generated/sdkFactTables.d.ts +1 -0
  27. package/dist/generated/sdkFactTables.js +13 -0
  28. package/dist/generated/settingsSchemaFns.d.ts +1 -0
  29. package/dist/generated/settingsSchemaFns.js +3 -0
  30. package/dist/generated/settingsSchemaHooksClassifier.js +38 -9
  31. package/dist/generated/settingsSchemaTables.d.ts +52 -0
  32. package/dist/generated/settingsSchemaTables.js +18 -0
  33. package/dist/generated/settingsSchemaTypes.d.ts +23 -13
  34. package/dist/generated/settingsSchemaUrlShape.d.ts +1 -0
  35. package/dist/generated/settingsSchemaUrlShape.js +17 -0
  36. package/dist/hitl/decisionRefusal.d.ts +4 -0
  37. package/dist/hitl/decisionRefusal.js +12 -2
  38. package/dist/hitl/localAllowRedemption.d.ts +9 -6
  39. package/dist/hitl/localAllowRedemption.js +20 -0
  40. package/dist/hitl/parkOwnership.js +2 -1
  41. package/dist/hitl/parkResolver.js +7 -0
  42. package/dist/hitl/screenDecisionCards.js +3 -2
  43. package/dist/hitl/sessionPolicyWire.js +2 -2
  44. package/dist/hitl/standingRows.d.ts +4 -2
  45. package/dist/hitl/standingRows.js +10 -3
  46. package/dist/hooksReaderGenerations.js +1 -1
  47. package/dist/i18n/messages.en.d.ts +163 -0
  48. package/dist/i18n/messages.en.js +163 -0
  49. package/dist/i18n/messages.zh.js +174 -0
  50. package/dist/index.d.ts +30 -5
  51. package/dist/index.js +15 -2
  52. package/dist/liveModelCatalog.d.ts +4 -0
  53. package/dist/liveModelCatalog.js +10 -1
  54. package/dist/localConfig/documents.d.ts +61 -0
  55. package/dist/localConfig/documents.js +51 -0
  56. package/dist/localConfig/kernel.d.ts +149 -0
  57. package/dist/localConfig/kernel.js +597 -0
  58. package/dist/localConfig/mcp/edit.d.ts +161 -0
  59. package/dist/localConfig/mcp/edit.js +846 -0
  60. package/dist/localConfig/mcp/servers.d.ts +165 -0
  61. package/dist/localConfig/mcp/servers.js +776 -0
  62. package/dist/localConfig/mcp/views.d.ts +170 -0
  63. package/dist/localConfig/mcp/views.js +429 -0
  64. package/dist/localConfig/modelPool.d.ts +262 -0
  65. package/dist/localConfig/modelPool.js +1489 -0
  66. package/dist/localConfig/modelPoolWords.d.ts +13 -0
  67. package/dist/localConfig/modelPoolWords.js +20 -0
  68. package/dist/localConfig/receiptShape.d.ts +7 -0
  69. package/dist/localConfig/receiptShape.js +135 -0
  70. package/dist/localConfig/settingsWrite.d.ts +127 -0
  71. package/dist/localConfig/settingsWrite.js +237 -0
  72. package/dist/localConfig/skills.d.ts +124 -0
  73. package/dist/localConfig/skills.js +397 -0
  74. package/dist/localConfig/skillsWords.d.ts +10 -0
  75. package/dist/localConfig/skillsWords.js +5 -0
  76. package/dist/mcpProbeWire.js +2 -1
  77. package/dist/mcpWireCaps.js +1 -1
  78. package/dist/memoryVerbsWire.js +3 -2
  79. package/dist/model/onboardJudgement.d.ts +14 -4
  80. package/dist/model/onboardJudgement.js +91 -139
  81. package/dist/modelConfigGapNotice.d.ts +20 -0
  82. package/dist/modelConfigGapNotice.js +102 -0
  83. package/dist/modsKernelIdentity.js +2 -47
  84. package/dist/ownKey.d.ts +1 -0
  85. package/dist/ownKey.js +40 -8
  86. package/dist/permissionsDeclaration.d.ts +2 -1
  87. package/dist/permissionsDeclaration.js +31 -17
  88. package/dist/promptBlockedCopy.js +2 -2
  89. package/dist/resumeRefusalCopy.d.ts +3 -1
  90. package/dist/resumeRefusalCopy.js +12 -4
  91. package/dist/runLedgerSnapshot.js +3 -3
  92. package/dist/runPermissionModeSwitch.js +2 -3
  93. package/dist/seatContract.d.ts +154 -4
  94. package/dist/seatContract.js +228 -2
  95. package/dist/sessionIdSegment.d.ts +1 -0
  96. package/dist/sessionIdSegment.js +4 -1
  97. package/dist/sessionMemoryErase.js +2 -1
  98. package/dist/sha256Bytes.d.ts +1 -0
  99. package/dist/sha256Bytes.js +46 -0
  100. package/dist/skillOverrideChain.d.ts +83 -0
  101. package/dist/skillOverrideChain.js +378 -0
  102. package/dist/skillsWireCaps.d.ts +3 -0
  103. package/dist/skillsWireCaps.js +16 -1
  104. package/dist/turnFailurePresentation.js +4 -10
  105. package/docs/INTEGRATION-CLIENTS.md +614 -14
  106. package/package.json +3 -3
@@ -211,6 +211,20 @@ const ZH = {
211
211
  'onboard.plan.envNotObject': '设置文件里的 "env" 不是对象 —— 不改写它。',
212
212
  'onboard.plan.envCatalogPresent': '引擎正按环境变量供模型 "{model}",目录里没有启用的模型;写下第一条目录模型会替换掉环境里的那几只。请先把它们放进目录。',
213
213
  'onboard.input.keyInFields': '模型 ID / 根地址里含着 API 钥匙 —— 请检查这几栏。',
214
+ 'model.pool.add.duplicate': '「{model}」在这一批里以同一个地址出现了两次 —— 只加一次。',
215
+ 'model.pool.add.probeFailed': '供应商拒绝了「{model}」(钥匙、模型名或应答格式不对)—— 改好后再核对一次。',
216
+ 'model.pool.add.probeUnverified': '「{model}」还没跟供应商核对过(或核对没做完)—— 请再核对一次,或按「未验证」保存。',
217
+ 'model.pool.add.pinMoved': '保存「{name}」时模型列表被改了(它的名字或存的钥匙变了)—— 什么都没加。请再试一次。',
218
+ 'model.pool.notFound': '模型列表里没有叫「{name}」的模型。',
219
+ 'model.pool.importEnv.notYet': '引擎正在用环境设置里的「{model}」。本应用暂时还不能把环境模型复制进模型列表 —— 请先手动把它们加进来(地址和钥匙),再加别的。',
220
+ 'model.pool.tier.badGroup': '档位组名要以字母或数字开头,只能用字母、数字、「.」「_」「-」。',
221
+ 'model.pool.tier.noGroup': '没有叫「{group}」的档位组。',
222
+ 'model.pool.tier.groupExists': '已经有叫「{group}」的档位组了。',
223
+ 'model.pool.channel.badPick': '在本应用从那个来源读到的内容里找不到选中的档案或模型。',
224
+ 'model.pool.discover.status': '拉模型列表的请求答了 HTTP {status}。',
225
+ 'model.pool.discover.notList': '端点没有答一份模型列表。',
226
+ 'model.pool.discover.timeout': '拉模型列表的请求超时了。',
227
+ 'model.pool.discover.unreachable': '连不上端点:{cause}',
214
228
  'onboard.refusal.input': '模型接入信息不全或形状不对 —— 什么都没保存。',
215
229
  'onboard.refusal.probeFailed': '供应商没有接受这套配置 —— 什么都没保存。',
216
230
  'onboard.refusal.probeUnverified': '查不了供应商,所以什么都没保存 —— 请重试,或按「未验证」保存。',
@@ -291,6 +305,7 @@ const ZH = {
291
305
  'approval.rowUnresumable.askNotSurfaced': '这条待决行(任务 {taskId})这台引擎续不了,所以没有呈成可作答的卡:{sentence}',
292
306
  'approval.park.stillParked': '{gate} 这道门没能作答:{reason} —— 这一跑仍停在这条审批上。',
293
307
  'approval.park.refusedNotResumable': '{gate} 这道门没能作答:{reason} —— 这台引擎目前续不了这条审批;若这一跑仍停着,请取消它。',
308
+ 'approval.park.newerWorker': '{gate} 这道门没能作答:{reason} —— 这一跑仍停在这条审批上,但{wayOut}。',
294
309
  'approval.park.resume.card': '{gate} 这道门没能作答:{reason} —— 这一跑仍停在这条审批上:卡再次出现时在卡上决,或取消这一跑。',
295
310
  'approval.park.resume.speak': '{gate} 这道门没能作答:{reason} —— 这一跑仍停在这条审批上:发一句话把这张卡重新打开,再在卡上决,或取消这一跑。',
296
311
  'approval.park.argsFromModelCall': '这条待决审批的记录里没有将执行的工具入参,下面显示的是对话里模型的原始调用 —— 若它在那之后被改写过(例如被钩子),实际执行的会与所见不同。这张卡不接受编辑后批准:所见入参不是将执行的那一份',
@@ -433,6 +448,9 @@ const ZH = {
433
448
  'resume.refusal.park.printHolds': '{head}{configMayReturn}parked 的那条 run 仍占着这个会话({code}):请取消它({cancel}),再把这项工作作为新任务重新提交。{blocked}',
434
449
  'resume.refusal.park.interactiveEnded': '{head}引擎已结束那条 parked 的 run,所以这段对话空出来了:请把这项工作作为新消息重新发一次。',
435
450
  'resume.refusal.park.interactiveBusy': '{head}{configMayReturn}parked 的那条 run 会一直占着这段对话,直到它被取消。',
451
+ 'resume.refusal.park.whyNewerEngine': '它是由比这一版更新的引擎版本 parked 的',
452
+ 'resume.refusal.park.interactiveNewerWorker': '{head}{configMayReturn}parked 的那条 run 仍占着这段对话,但{wayOut}。',
453
+ 'resume.refusal.park.printNewerWorker': '{head}{configMayReturn}parked 的那条 run 仍占着这个会话({code}),但{wayOut}({cancel})。{blocked}',
436
454
  'resume.refusal.park.blockedPrint': 'sema 不会自己把 run {run} 的卡放回屏幕:这一版引擎拒绝续跑它。请取消这条 run({cancel}),再把这项工作作为新任务重新提交。',
437
455
  'resume.refusal.park.blockedInteractive': 'sema 不会自己把 run {run} 的卡放回屏幕:这一版引擎拒绝续跑它。要空出这段对话,请发一条消息 —— sema 随后会提出取消那条 run(若卡反而回来了,先作答),之后你就可以把这项工作作为新消息重新发一次。',
438
456
  'session.selfHeal.wayOut.interactive': '运行 /clear,在全新会话里继续工作',
@@ -687,6 +705,21 @@ const ZH = {
687
705
  'session.hostSettings.styleSafeMode': '安全模式已开启,设置里的输出风格不套用。',
688
706
  'session.hostSettings.styleOversize': '你的输出风格这一次请求没有套用:加上内置的产品背景说明后超过了 {limit} 个字符的上限。请缩短风格正文后再用。',
689
707
  'session.hostSettings.styleUnreadable': '输出风格的正文读不成文本,这一次请求不套用它。',
708
+ 'session.hostSettings.allowKept.managed.inProgress.one': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是你账号的托管策略还没有收到(sema 会继续拉取;收到后 allow 规则就会生效)。请等它收到后再运行一次(deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
709
+ 'session.hostSettings.allowKept.managed.inProgress.other': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是你账号的托管策略还没有收到(sema 会继续拉取;收到后 allow 规则就会生效)。请等它收到后再运行一次(deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
710
+ 'session.hostSettings.allowKept.managed.failed.one': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是你账号的托管策略还没有收到(这一次运行不会再拉取;下一次运行会重试)。请再运行一次以重新拉取(deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
711
+ 'session.hostSettings.allowKept.managed.failed.other': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是你账号的托管策略还没有收到(这一次运行不会再拉取;下一次运行会重试)。请再运行一次以重新拉取(deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
712
+ 'session.hostSettings.allowKept.managed.unknown.one': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是你账号的托管策略还没有收到。请等它收到后再运行一次(deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
713
+ 'session.hostSettings.allowKept.managed.unknown.other': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是你账号的托管策略还没有收到。请等它收到后再运行一次(deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
714
+ 'session.hostSettings.allowKept.generic.one': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是{why};设置文件里的 allow 规则只有在设置读取没有任何问题时才会发出。请先修好报告的设置,再运行一次(这次读取里的 deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
715
+ 'session.hostSettings.allowKept.generic.other': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是{why};设置文件里的 allow 规则只有在设置读取没有任何问题时才会发出。请先修好报告的设置,再运行一次(这次读取里的 deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
716
+ 'session.hostSettings.allowKept.why.problems': '设置读取报告了问题',
717
+ 'session.hostSettings.allowKept.why.problemsWhere': '设置读取报告了问题({where})',
718
+ 'session.hostSettings.allowKept.why.counted.one': '设置读取报告了 {count} 个问题',
719
+ 'session.hostSettings.allowKept.why.counted.other': '设置读取报告了 {count} 个问题',
720
+ 'session.hostSettings.allowKept.why.countedWhere.one': '设置读取报告了 {count} 个问题({where})',
721
+ 'session.hostSettings.allowKept.why.countedWhere.other': '设置读取报告了 {count} 个问题({where})',
722
+ 'session.hostSettings.allowKept.why.unreadable': '没法检查这一次设置读取是否健康',
690
723
  'model.identity.lane.processEnv': '本客户端启动时的环境',
691
724
  'model.identity.lane.settingsEnv': '本客户端的设置文件',
692
725
  'model.identity.lane.modelCatalogFile': '本地模型目录文件',
@@ -698,6 +731,24 @@ const ZH = {
698
731
  'model.identity.catalogAdoption.refused': '{lane}里列了模型,但据报引擎会把这份目录按现状整个拒掉,所以其中任何一个都当不了缺省模型',
699
732
  'model.identity.catalogAdoption.notResolvable': '本机引擎没有配置可用来启动的模型名 —— {clause},而且引擎没有模型名就不会启动',
700
733
  'model.identity.catalogAdoption.notResolvableWithPartial': '本机引擎没有配置可用来启动的模型名 —— {clause};另外{partial},而且引擎没有模型名就不会启动',
734
+ 'model.configGap.head.model': '还没有配置模型',
735
+ 'model.configGap.head.gatewayUrl': '没有配置模型网关地址',
736
+ 'model.configGap.head.apiKey': '没有配置 API 钥匙',
737
+ 'model.configGap.head.anthropicKey': '没有配置 Anthropic 钥匙(ANTHROPIC_API_KEY 或 ANTHROPIC_AUTH_TOKEN)',
738
+ 'model.configGap.head.incomplete': '模型配置不完整',
739
+ 'model.configGap.item.model': '模型名(MODEL_ID)',
740
+ 'model.configGap.item.gatewayUrl': '网关地址(MODEL_GATEWAY_BASEURL)',
741
+ 'model.configGap.item.apiKey': '钥匙(MODEL_API_KEY)',
742
+ 'model.configGap.item.anthropicKey': '用于 Anthropic 的钥匙(ANTHROPIC_API_KEY 或 ANTHROPIC_AUTH_TOKEN)',
743
+ 'model.configGap.lead.one': '{a}还没有配置',
744
+ 'model.configGap.lead.two': '{a}和{b}都还没有配置',
745
+ 'model.configGap.lead.three': '{a}、{b}和{c}都还没有配置',
746
+ 'model.configGap.reason.noModel': '没有模型名,引擎就不会启动',
747
+ 'model.configGap.reason.anthropicCatalog.one': '模型目录里唯一启用的条目走 anthropic 通道,所以引擎无法使用它',
748
+ 'model.configGap.reason.anthropicCatalog.other': '模型目录里启用的 {count} 个条目都走 anthropic 通道,所以引擎一个也用不了',
749
+ 'model.configGap.reason.gatewayCatalog.one': '模型目录里唯一启用的条目没有自己的根地址,所以引擎无法使用它',
750
+ 'model.configGap.reason.gatewayCatalog.other': '模型目录里启用的 {count} 个条目都没有自己的根地址,所以引擎一个也用不了',
751
+ 'model.configGap.detail.withReason': '{missing} —— {reason}',
701
752
  'notice.injectionLane.sentence': '在这台引擎的 {lane} 车道上,工具跑在与引擎不同的机器上,所以随任务发送的{items}也在那里运行、而不是在本机 —— 依赖本机程序或凭据的会在那里失败',
702
753
  'notice.injectionLane.item.stdioMcp': '本机 stdio MCP 服务器',
703
754
  'notice.injectionLane.item.credentialedMcp': '使用本机凭据的 MCP 服务器',
@@ -1344,6 +1395,77 @@ const ZH = {
1344
1395
  'config.mods.session.unarmed': '这个对话在当前引擎上运行过之后,这里会显示 mod',
1345
1396
  'config.hooks.roster.unreadable': '读不出这个对话的 hooks 计划',
1346
1397
  'config.hooks.roster.unarmed': '这个应用打开这个对话之后,这里会显示 hooks',
1398
+ 'config.localConfig.refused.invalidRequest': '这次改动读不成有效的请求 —— 什么都没保存。',
1399
+ 'config.localConfig.refused.scopeUnreadable': '配置文件读不出,所以没有覆盖它 —— 什么都没保存。',
1400
+ 'config.localConfig.refused.scopeUnwritable': '这项设置不能存进那个文件 —— 存进去也不会生效。什么都没保存。',
1401
+ 'config.localConfig.refused.untrustedFolder': '这个文件夹未被信任,它的设置文件带不了这项设置 —— 什么都没保存。',
1402
+ 'config.localConfig.refused.policyDenied': '组织的托管设置不允许这次改动 —— 什么都没保存。',
1403
+ 'config.localConfig.refused.notFound': '要改的那一项不存在 —— 什么都没保存。',
1404
+ 'config.localConfig.refused.alreadyExists': '那一项已经存在 —— 什么都没保存。',
1405
+ 'config.localConfig.refused.lockBusy': '另一个程序正在改这份配置 —— 什么都没保存。请稍后再试。',
1406
+ 'config.localConfig.refused.lockFailed': '拿不到这份配置文件的写锁(权限或目录问题)—— 文件没有改动。',
1407
+ 'config.localConfig.refused.changedDuringWrite': '保存时这份配置被别的程序改了 —— 什么都没保存。请再试一次。',
1408
+ 'config.localConfig.refused.writeFailed': '配置文件写不进去 —— 文件没有改动。',
1409
+ 'config.localConfig.refused.notWritten': '这次改动没有保存。',
1410
+ 'config.localConfig.refused.skillLockedByHigherLayer': '更高优先级的配置定了这个技能的状态;这里改不了。',
1411
+ 'config.localConfig.refused.skillManagedByPlugin': '插件技能随插件管理,不在这里改。',
1412
+ 'config.localConfig.refused.skillLockedByAuthor': '这个技能自己的文件关掉了模型调用;它的状态在这里改不了。',
1413
+ 'config.localConfig.refused.skillNameUnstorable': '设置里存不下这个技能的名字;给它的文件夹或文件改个名再来配置。',
1414
+ 'config.localConfig.refused.entryInUse': '这个模型还在被使用(作缺省模型、被某个角色指着,或在旧档位设置里)—— 先把它们改指别的模型。什么都没保存。',
1415
+ 'config.localConfig.refused.credentialUnpaired': '这个模型用它现有的钥匙或地址连不上 —— 什么都没保存。',
1416
+ 'config.localConfig.refused.envCatalogPresent': '引擎正在用环境里设的模型;在这里加一条会让那几只退出使用。请先导入环境模型 —— 什么都没保存。',
1417
+ 'config.localConfig.refused.probeFailed': '供应商表明这次改动里有模型配错了(钥匙、模型名或应答格式)—— 什么都没保存。',
1418
+ 'config.localConfig.refused.probeUnverified': '这次改动里有模型还没跟供应商核对过(或核对没做完)—— 什么都没保存。请再核对一次,或按「未验证」保存。',
1419
+ 'config.localConfig.unavailable.engineIsRemote': '正在用 Cloud 引擎 —— 本机配置对它不起作用。请先切回本机引擎。',
1420
+ 'config.localConfig.unavailable.notSingleUser': '无法确认这台引擎只为你一个人服务,所以不对它使用本机配置。',
1421
+ 'config.localConfig.unavailable.configHomeUnpinned': '应用还没有确定用哪个配置目录,所以本机配置既不显示也不修改。',
1422
+ 'config.localConfig.unavailable.domainNotHosted': '这台设备上的应用暂时还不提供这类配置修改。',
1423
+ 'config.localConfig.unknown.commitUnconfirmed': '不确定这次改动有没有保存 —— 请刷新核对。',
1424
+ 'config.localConfig.unknown.reportUnreadable': '保存后应用的回答读不懂,不确定这次改动有没有保存 —— 请刷新核对。',
1425
+ 'config.localConfig.applied.nextTurn': '已保存。从下一轮起生效。',
1426
+ 'config.localConfig.applied.engineReload': '已保存。引擎下次重读配置时生效,通常在一分钟内。',
1427
+ 'config.localConfig.applied.nextEngineStart': '已保存。本机引擎下次启动时生效。',
1428
+ 'config.localConfig.applied.unchanged': '本来就是这样 —— 不需要改动。',
1429
+ 'config.localConfig.preview.nextTurn': '还没保存。保存后从下一轮起生效。',
1430
+ 'config.localConfig.preview.engineReload': '还没保存。保存后,引擎下次重读配置时生效。',
1431
+ 'config.localConfig.preview.nextEngineStart': '还没保存。保存后,本机引擎下次启动时生效。',
1432
+ 'config.localConfig.preview.unchanged': '本来就是这样 —— 保存也不会改动什么。',
1433
+ 'config.localConfig.residue.orphanKeySlot': '留下了一个没有模型使用的钥匙槽;它不起作用。',
1434
+ 'config.localConfig.residue.legacyTierGroupsLeft': '旧的档位设置还留在设置文件里;它们已不再被使用。',
1435
+ 'config.localConfig.disclosure.decidedBy': '生效的设置来自{layer}。',
1436
+ 'config.localConfig.disclosure.shadowed': '这项设置被{layer}盖住了,所以暂时不生效。',
1437
+ 'config.localConfig.disclosure.tierGroupOverridden': '旧设置里有几个档位组与{layer}里已有的组重名;已保留{layer}里的,旧的没有拷过去。',
1438
+ 'config.localConfig.disclosure.tierGroupOverriddenNamed': '旧设置里这几个档位组与{layer}里已有的组重名;已保留{layer}里的,旧的没有拷过去:{names}。',
1439
+ 'config.localConfig.layer.userSettings': '你的用户设置',
1440
+ 'config.localConfig.layer.projectSettings': '这个项目的共享设置',
1441
+ 'config.localConfig.layer.localSettings': '这个项目的本地设置',
1442
+ 'config.localConfig.layer.globalConfig': '应用的状态文件',
1443
+ 'config.localConfig.layer.projectMcp': '这个项目的 MCP 服务器文件',
1444
+ 'config.localConfig.layer.models': '模型目录',
1445
+ 'config.localConfig.layer.deploymentMcp': '引擎的 MCP 服务器声明',
1446
+ 'config.localConfig.layer.policySettings': '组织的托管设置',
1447
+ 'config.localConfig.layer.other': '另一个设置文件',
1448
+ 'config.localConfig.refused.nameUnusable': '这个服务器名不能用——没有保存。',
1449
+ 'config.localConfig.refused.nameReserved': '这个服务器名被本应用自带的内置服务器占用——没有保存。',
1450
+ 'config.localConfig.refused.mcpEntryInvalid': '这条服务器配置有会让它挂不上的问题——没有保存。',
1451
+ 'config.localConfig.refused.ambiguousScope': '同名服务器配置在不止一处;请选定要改哪一处——没有保存。',
1452
+ 'config.localConfig.refused.credentialsNeedReentry': '服务器的地址或命令改了,为它存的密钥要重新填写或删除——没有保存。',
1453
+ 'config.localConfig.refused.baseConflict': '这台服务器的配置在显示之后被改过——没有保存。请刷新后再试。',
1454
+ 'config.mcpServers.notice.shadowed': '{scope} 配置里的同名服务器优先于这一台。',
1455
+ 'config.mcpServers.notice.endpointDiffers': '{scope} 配置里的同名服务器指向别处。',
1456
+ 'config.mcpServers.notice.deploymentWins': '引擎所在部署自己声明了同名服务器;实际用的是部署那一台。',
1457
+ 'config.mcpServers.notice.envMissing': '这些变量没有设置,原样保留:{names}。',
1458
+ 'config.mcpServers.notice.narrowingWouldConflict': '其它位置({scopes})为这个名字声明了不同的工具清单;各处一致之前这台服务器不会挂载。',
1459
+ 'config.mcpServers.withheld.narrowingConflict': '未挂载:配置这台服务器的几处对工具清单的声明不一致。',
1460
+ 'config.mcpServers.withheld.narrowingInvalid': '未挂载:配置这台服务器的某一处把工具清单写坏了。',
1461
+ 'config.mcpServers.withheld.layerUnreadable': '未挂载:一份能添加或限制 MCP 服务器的配置文件读不出,修好之前不挂载任何 MCP 服务器。',
1462
+ 'config.mcpServers.withheld.policyLocked': '未挂载:组织的托管设置只允许它提供的 MCP 服务器。',
1463
+ 'config.mcpServers.problem.nameReserved': '这个名字属于本应用自带的内置服务器。',
1464
+ 'config.mcpServers.approvalsWithheld': '{layer} 里写的 MCP 批准不生效,因为这个文件夹未被信任。',
1465
+ 'config.mcpServers.probe.removed': '无需测试:这次改动会删除这台服务器。',
1466
+ 'config.mcpServers.probe.notActive': '无需测试:改动之后这台服务器不会处于启用状态。',
1467
+ 'config.mcpServers.probe.envMissing': '未测试:这台服务器用到的部分变量没有设置。',
1468
+ 'config.mcpServers.probe.editRefusal': '未测试:这次改动本身没有被接受。',
1347
1469
  'follow.notFollowed.headRun': '这块屏已不再跟着 run {taskId}{reason}{ending}{exit}',
1348
1470
  'follow.notFollowed.headTurn': '这块屏已不再跟着这一轮的 run{reason}{ending}{exit}',
1349
1471
  'follow.notFollowed.reason.exhaustedDraining': ':服务它的那台引擎实例在它最后一条事件流关闭时正在下线,而这个客户端的重新附着次数已经用完。',
@@ -1549,6 +1671,47 @@ const ZH = {
1549
1671
  'localEngine.health.answer.ok': '应答了,状态为 "ok"',
1550
1672
  'localEngine.health.answer.notOkHttp': '应答了 HTTP {http}',
1551
1673
  'localEngine.health.answer.notOkStatus': '应答了 HTTP {http},但状态不是 "ok"',
1674
+ 'centerTrust.refusal.badInput': '这道检查收到了读不出的入参;这是客户端的缺陷,不是你输入的问题。',
1675
+ 'centerTrust.refusal.empty': '没有给出地址。',
1676
+ 'centerTrust.refusal.tooLong': '地址太长(至多 {addressMax} 个字符,主机部分至多 {authorityMax} 个)。',
1677
+ 'centerTrust.refusal.unsafeCharacter': '地址里有空白、控制字符或反斜杠。',
1678
+ 'centerTrust.refusal.scheme': '地址必须写全:邀请链接以 `https://` 起头,中心地址以 `http://` 或 `https://` 起头。',
1679
+ 'centerTrust.refusal.userinfo': '地址的主机前不许带用户名或密码。',
1680
+ 'centerTrust.refusal.percentInHost': '地址的主机部分不许含百分号编码。',
1681
+ 'centerTrust.refusal.unparseable': '地址不是能解析的 http(s) URL。',
1682
+ 'centerTrust.refusal.query': '地址不许带查询串(`?`)。',
1683
+ 'centerTrust.refusal.fragment': '地址不许带片段(`#`);只有邀请链接可以以 `#ca=` 指纹列表结尾。',
1684
+ 'centerTrust.refusal.trailingDot': '主机名不许以点结尾。',
1685
+ 'centerTrust.refusal.ipNotCanonical': 'IP 地址必须用标准写法(例如 `127.0.0.1`,不用缩写或十六进制写法)。',
1686
+ 'centerTrust.refusal.plaintextRemote': '明文 `http://` 只许用于本机;远端中心必须用 `https://`。',
1687
+ 'centerTrust.refusal.path': '地址路径不合规:邀请链接不带路径,中心地址的路径不许以 `//` 起头,也不许含 `.` 或 `..` 段。',
1688
+ 'centerTrust.refusal.fingerprint': '指纹必须是 `sha256:` 后接 64 位十六进制数字(邀请链接里只收小写)。',
1689
+ 'centerTrust.refusal.tooManyFingerprints': '至多给 {fingerprintsMax} 个指纹。',
1690
+ 'centerTrust.refusal.prefix': '指纹必须以 `sha256:` 起头。',
1691
+ 'centerTrust.refusal.parserUnavailable': '这个客户端在当前平台上读不了证书,所以钉不住中心的证书。',
1692
+ 'centerTrust.refusal.bodyTooLarge': '中心的证书应答超过 {bodyMax} 字节。',
1693
+ 'centerTrust.refusal.bodyNotJson': '中心的证书应答不是有效的 UTF-8 JSON。',
1694
+ 'centerTrust.refusal.bodyShape': '中心的证书应答形状不对。',
1695
+ 'centerTrust.refusal.servedCount': '中心必须给出 1 至 {servedMax} 张证书。',
1696
+ 'centerTrust.refusal.certificateTooLarge': '中心给出的一张证书超过 {pemMax} 个字符。',
1697
+ 'centerTrust.refusal.certificateNotCanonical': '中心给出的一张证书不是恰一张、标准 PEM 形(每行 64 字符、LF 换行)且 DER 长度规范的证书。',
1698
+ 'centerTrust.refusal.certificateUnparseable': '中心给出的一张证书在本平台上读不出。',
1699
+ 'centerTrust.refusal.servedDuplicate': '中心把同一张证书给了不止一次。',
1700
+ 'centerTrust.refusal.namedNotServed': '你给的一个指纹与中心给出的证书都对不上。',
1701
+ 'centerTrust.refusal.anchorNotSelfSigned': '你点名的一张证书不是自签的,不能作信任锚钉住。',
1702
+ 'centerTrust.refusal.unconfiguredWithFingerprints': '你给了指纹,但中心说它没有配置证书颁发机构。',
1703
+ 'centerTrust.refusal.cancelled': '取中心证书已取消。',
1704
+ 'centerTrust.refusal.timedOut': '取中心证书超时(每次尝试至多等 {roundSec} 秒)。',
1705
+ 'centerTrust.refusal.transportFailed': '连不上中心,取不到它的证书。',
1706
+ 'centerTrust.refusal.contentType': '中心的证书应答不是 JSON(内容类型不对)。',
1707
+ 'centerTrust.refusal.caUnavailable': '中心报告它的证书颁发机构暂时不可用。',
1708
+ 'centerTrust.refusal.endpointMissing': '中心没有提供可钉的证书(可能是较旧的版本)。',
1709
+ 'centerTrust.refusal.unexpectedStatus': '中心对证书请求给了意料之外的状态。',
1710
+ 'centerTrust.refusal.retryAfterUnusable': '中心要求稍后再试但没给可用的等待时长,客户端已停止。',
1711
+ 'centerTrust.refusal.retryAfterTooLong': '中心要求等待超过 {waitCapSec} 秒再试,客户端已停止;请稍后再试。',
1712
+ 'centerTrust.refusal.retriesExhausted': '中心一直要求重试;客户端在 {attemptsMax} 次尝试后停止。',
1713
+ 'centerTrust.refusal.budgetExhausted': '取中心证书用完了 {budgetSec} 秒的时间预算。',
1714
+ 'centerTrust.refusal.unknown': '中心的证书核验没有通过。',
1552
1715
  };
1553
1716
  export const ZH_MESSAGES = Object.freeze(ZH);
1554
1717
  export const TERM_SLOTS = Object.freeze({
@@ -1619,6 +1782,9 @@ export const TERM_SLOTS = Object.freeze({
1619
1782
  'resume.refusal.park.printHolds': ['parked', 'run'],
1620
1783
  'resume.refusal.park.interactiveEnded': ['parked', 'run'],
1621
1784
  'resume.refusal.park.interactiveBusy': ['parked', 'run'],
1785
+ 'resume.refusal.park.whyNewerEngine': ['parked'],
1786
+ 'resume.refusal.park.interactiveNewerWorker': ['parked', 'run'],
1787
+ 'resume.refusal.park.printNewerWorker': ['parked', 'run'],
1622
1788
  'resume.refusal.park.blockedPrint': ['run'],
1623
1789
  'resume.refusal.park.blockedInteractive': ['run'],
1624
1790
  'approval.askPark.autoReopenBlocked.policyInteractive': ['run'],
@@ -1730,4 +1896,12 @@ export const TERM_SLOTS = Object.freeze({
1730
1896
  'notice.failure.settings.safety': ['turn'],
1731
1897
  'notice.wireRefusal.hostPosture.writeFace': ['bypassPermissions'],
1732
1898
  'notice.wireRefusal.hostPosture.both': ['bypassPermissions'],
1899
+ 'session.hostSettings.allowKept.managed.inProgress.one': ['permissions.allow', '--allowedTools'],
1900
+ 'session.hostSettings.allowKept.managed.inProgress.other': ['permissions.allow', '--allowedTools'],
1901
+ 'session.hostSettings.allowKept.managed.failed.one': ['permissions.allow', '--allowedTools'],
1902
+ 'session.hostSettings.allowKept.managed.failed.other': ['permissions.allow', '--allowedTools'],
1903
+ 'session.hostSettings.allowKept.managed.unknown.one': ['permissions.allow', '--allowedTools'],
1904
+ 'session.hostSettings.allowKept.managed.unknown.other': ['permissions.allow', '--allowedTools'],
1905
+ 'session.hostSettings.allowKept.generic.one': ['permissions.allow', '--allowedTools'],
1906
+ 'session.hostSettings.allowKept.generic.other': ['permissions.allow', '--allowedTools'],
1733
1907
  });
package/dist/index.d.ts CHANGED
@@ -100,7 +100,6 @@ export * from './postureKnob.js';
100
100
  export * from './engineIdentity.js';
101
101
  export { readEngineHealthFacts } from './engineHealthFacts.js';
102
102
  export { readModsDeploymentPackages, type ModsDeploymentPackagesReading } from './engineHealthFacts.js';
103
- export { readEngineHealthStore, type EngineHealthStoreReading } from './engineHealthFacts.js';
104
103
  export type { EngineHealthFacts, EngineHealthCenterFacts, EngineHealthAuthFacts, EngineHealthDrainingFacts, EngineHealthLeaseFacts, EngineHealthFirstAttachFacts, EngineHealthInflightFacts } from './engineHealthFacts.js';
105
104
  export { localEngineAnchorOf, localEnginePlanDriftOf, judgeLocalEngine, localEngineLaneOf, localEngineVerdictSentence } from './localEngineJudge.js';
106
105
  export type { LocalEngineAnchorReading, LocalEnginePlanFingerprint, LocalEnginePlanDrift, LocalEngineAnchorPidState, LocalEngineDataRootRelation, LocalEngineJudgeInput, LocalEngineRef, LocalEngineAnchoredProcess, LocalEngineVerdict, LocalEngineUpgradePath, } from './localEngineJudge.js';
@@ -151,6 +150,8 @@ export { preemptReceiptLine, type PreemptOutcome, type PreemptParkedStatus } fro
151
150
  export { readSteerReceipt, type SteerReceiptReading } from './steerReceipt.js';
152
151
  export * from './sseIdleTriage.js';
153
152
  export * from './engineWireSdk.js';
153
+ export { engineCredentialReleaseVerdictOf, makeLocalEngineWireClient, ENGINE_CREDENTIAL_WITHHOLD_REASONS } from './engineCredentialRelease.js';
154
+ export type { LocalEngineIdentityVerdict, EngineCredentialTransport, EngineCredentialReleaseInput, EngineCredentialWithholdReason, EngineCredentialReleaseVerdict, LocalEngineWireClientConfig, LocalEngineWireClient, } from './engineCredentialRelease.js';
154
155
  export * from './classifierVerdictWire.js';
155
156
  export { stripSystemReminderBlocks, unwrapSystemReminder } from './systemReminderTag.js';
156
157
  export { findSystemReminderOpenTag, type SystemReminderOpenTagSpan } from './systemReminderTag.js';
@@ -194,6 +195,7 @@ export * from './webSearchWireCaps.js';
194
195
  export * from './liveModelCatalog.js';
195
196
  export * from './modelBudgetRule.js';
196
197
  export * from './modelIdentityResolvability.js';
198
+ export * from './modelConfigGapNotice.js';
197
199
  export * from './sessionModelLatch.js';
198
200
  export * from './modelSwitchFallback.js';
199
201
  export * from './effortWire.js';
@@ -396,7 +398,7 @@ export * from './mcpStatusSupersetKeys.js';
396
398
  export type { ErrorSupplementRole, ErrorSupplementReader } from './errorSupplementRoles.js';
397
399
  export * from './hitl/persistedRulesWire.js';
398
400
  export * from './hitl/localAllowRule.js';
399
- export { LOCAL_ALLOW_NOT_REDEEMABLE_REASONS, LOCAL_ALLOW_UNKNOWN_CAUSES, LOCAL_ALLOW_REDEMPTION_REFUSALS, LOCAL_ALLOW_REDEMPTION_UNAVAILABLE_CAUSES, LOCAL_ALLOW_REDEMPTION_UNKNOWN_CAUSES, localAllowRedeemability, redeemReadOnlyRuleOffer, type LocalAllowNotRedeemableReason, type LocalAllowUnknownCause, type LocalAllowRedeemability, type LocalAllowOfferedFacts, type LocalAllowRedeemabilityInput, type LocalAllowRedemptionRefusal, type LocalAllowRedemptionUnavailableCause, type LocalAllowRedemptionUnknownCause, type LocalAllowRedemptionReceipt, type LocalAllowRedemptionFacade, type ReadOnlyRuleOfferRedemption, } from './hitl/localAllowRedemption.js';
401
+ export { LOCAL_ALLOW_NOT_REDEEMABLE_REASONS, LOCAL_ALLOW_UNKNOWN_CAUSES, LOCAL_ALLOW_REDEMPTION_REFUSALS, LOCAL_ALLOW_REDEMPTION_UNAVAILABLE_CAUSES, LOCAL_ALLOW_REDEMPTION_UNKNOWN_CAUSES, localAllowRedeemability, redeemReadOnlyRuleOffer, type LocalAllowNotRedeemableReason, type LocalAllowUnknownCause, type LocalAllowRedeemability, type LocalAllowOfferedFacts, type LocalAllowDeclaredFacts, type LocalAllowRedeemabilityInput, type LocalAllowRedemptionRefusal, type LocalAllowRedemptionUnavailableCause, type LocalAllowRedemptionUnknownCause, type LocalAllowRedemptionReceipt, type LocalAllowRedemptionFacade, type ReadOnlyRuleOfferRedemption, } from './hitl/localAllowRedemption.js';
400
402
  export * from './hitl/sessionPolicyWire.js';
401
403
  export * from './hitl/sessionPolicyDeliverable.js';
402
404
  export { observedSessionRulesNamespaceForms } from './sessionRulesNamespaceFormsCapability.js';
@@ -409,7 +411,7 @@ export { hasLedgerPositionKey } from './hitl/gateLedger.js';
409
411
  export { durableSeqOf } from './hitl/gateLedger.js';
410
412
  export { MODE_ARBITRATION, automaticAnswerVerdict, mandatedApprovalDetailOf, crossBoundaryTaintOf, crossBoundaryTaintWayOutOf, permissionRequestHookScope, type CrossBoundaryTaintReading, type AutomaticAnswerLane, type AutomaticAnswerAskFace, type AutomaticAnswerFacts, type AutomaticAnswerRoad, type AutomaticAnswerUnknownWhy, type AutomaticAnswerVerdict, type PermissionRequestHookScope, } from './hitl/automaticAnswerVerdict.js';
411
413
  export { standingRowsOf, type StandingRows, type StandingRowsWhy, type StandingRowWhy, type StandingPersistentRow, type StandingRowsHostFacts, rememberOfferable, localAllowRuleEnforceable, type RememberOffer, type RememberOfferable, type LocalAllowRuleEnforcement, } from './hitl/standingRows.js';
412
- export { classifyDecisionRefusal, liveAskPendingReading, decisionRefusalClosesOut, undeliverableDecisionContent, decideRowUnrevivableNotice, decisionRefusalAskReading, readDecisionRefusalReading, type DecisionRefusalReading, type RefusalRouteContext, type DecisionRefusalAskReading, type DecisionRefusalStanding, type DecisionRefusalClassified, type DecisionRefusalConflict, type LiveAskPendingReading, type UndeliverableDecisionEnd, type UndeliverableDecisionFacts, } from './hitl/decisionRefusal.js';
414
+ export { classifyDecisionRefusal, liveAskPendingReading, decisionRefusalClosesOut, undeliverableDecisionContent, decideRowUnrevivableNotice, type DecisionRefusalWayOut, decisionRefusalAskReading, readDecisionRefusalReading, type DecisionRefusalReading, type RefusalRouteContext, type DecisionRefusalAskReading, type DecisionRefusalStanding, type DecisionRefusalClassified, type DecisionRefusalConflict, type LiveAskPendingReading, type UndeliverableDecisionEnd, type UndeliverableDecisionFacts, } from './hitl/decisionRefusal.js';
413
415
  export { decisionGrantChangedContent } from './hitl/decisionConflict.js';
414
416
  export { decideFailureNote } from './decideFailureNote.js';
415
417
  export { decisionAnswerInvalidContent } from './hitl/decisionConflict.js';
@@ -460,8 +462,28 @@ export { devicesFaceOf, devicesWritesAllowed, devicesFaceDetail } from './device
460
462
  export type { DevicesFace, DevicesFaceInput, DevicesFaceUnavailableWhy } from './devicesFace.js';
461
463
  export { cloudLoginFailureOf, cloudLoginFailureText, engineTargetRefusalText, seatMcpReadingOf, watchEngineTarget } from './engineTargetSeat.js';
462
464
  export type { CloudLoginFailureContext, EngineTargetReading, EngineTargetWatch } from './engineTargetSeat.js';
463
- export { KEY_SLOT_PREFIX, keyEnvNameForEntry, onboardBaseUrlProblem, onboardRefusalText, onboardWritePlan, onboardWriteVerdict, poolEntryNameOf, probeModelEndpoint, } from './model/onboardJudgement.js';
464
- export type { OnboardJsonObject, OnboardPlanEntry, OnboardProbeBodyReader, OnboardProbeDeps, OnboardProbeFetch, OnboardProbeRequestInit, OnboardProbeResponse, OnboardProbeTarget, OnboardWritePlan, OnboardWritePlanInput, OnboardWriteVerdict, } from './model/onboardJudgement.js';
465
+ export { KEY_SLOT_PREFIX, keyEnvNameForEntry, onboardBaseUrlProblem, onboardRefusalText, onboardWriteVerdict, poolEntryNameOf, probeModelEndpoint, discoverEndpointModels, } from './model/onboardJudgement.js';
466
+ export type { OnboardJsonObject, OnboardPlanEntry, OnboardProbeBodyReader, OnboardProbeDeps, OnboardProbeFetch, OnboardProbeRequestInit, OnboardProbeResponse, OnboardProbeTarget, OnboardWritePlan, OnboardWritePlanInput, OnboardWriteVerdict, OnboardDiscoveryTarget, } from './model/onboardJudgement.js';
467
+ export { LOCAL_CONFIG_DOCUMENTS, globalStateFilePathOf } from './localConfig/documents.js';
468
+ export type { LocalConfigDocument, LocalConfigDocumentName, LocalConfigWritableDocumentName, GlobalStateFilePlace } from './localConfig/documents.js';
469
+ export { LOCAL_CONFIG_UNREADABLE_CAUSES, LOCAL_CONFIG_REFUSALS, LOCAL_CONFIG_NOT_WRITTEN_CAUSES, LOCAL_CONFIG_UNAVAILABLE_CAUSES, LOCAL_CONFIG_UNKNOWN_CAUSES, LOCAL_CONFIG_APPLIES_ON, LOCAL_CONFIG_RESIDUES, LOCAL_CONFIG_STEP_ROLES, LOCAL_CONFIG_WRITE_PRECONDITIONS, LOCAL_CONFIG_DISCLOSURE_KINDS, localConfigAccess, applyLocalConfigIntent, previewLocalConfigIntent, localConfigReceiptSentence, localConfigResidueSentence, localConfigDisclosureSentence, } from './localConfig/kernel.js';
470
+ export type { LocalConfigUnreadableCause, LocalConfigFileReading, LocalConfigFilesReading, LocalConfigRefusal, LocalConfigNotWrittenCause, LocalConfigUnavailableCause, LocalConfigUnknownCause, LocalConfigAppliesOn, LocalConfigResidue, LocalConfigStepRole, LocalConfigReceipt, LocalConfigPreview, LocalConfigWritePrecondition, LocalConfigDisclosureKind, LocalConfigDisclosure, LocalConfigHostFacts, LocalConfigAccessRequest, LocalConfigAccess, LocalConfigTransactStep, LocalConfigFileWrite, LocalConfigCommitReport, LocalConfigStorePort, LocalConfigStepInput, LocalConfigStepPlan, LocalConfigStep, LocalConfigIntent, } from './localConfig/kernel.js';
471
+ export { MODEL_POOL_EDIT_KINDS, MODEL_POOL_CHANNEL_SOURCES, MODEL_POOL_CREDENTIAL_KINDS, MODEL_POOL_COMPLETENESS, MODEL_POOL_MAX_BATCH, MODEL_POOL_PROBE_STATES, MODEL_POOL_DEFAULT_KEEP_REASONS, poolWritePlan, modelPoolIntentOf, editModelPoolWith, modelPoolViewOf, effectiveDefaultModelOf, defaultModelChoiceOf, modelPoolRowEditOf, channelProfilesOf, modelPoolEditOfSeat, onboardWritePlan, } from './localConfig/modelPool.js';
472
+ export type { ModelPoolEditKind, ModelPoolChannelSource, ModelPoolCredentialKind, ModelPoolCompleteness, ModelPoolProbeState, ModelPoolDefaultKeepReason, DefaultModelBatchRow, DefaultModelChoice, ModelPoolProbeReading, ModelPoolEntrySpec, ModelPoolChannelProfile, ModelPoolChannelData, ModelPoolModelRow, ModelPoolRoleRow, ModelPoolRowAction, ModelPoolEdit, ModelPoolProblem, ModelPoolPlannedEntry, ModelPoolPlan, EffectiveDefaultModel, EffectiveDefaultModelInput, ModelPoolIntentProbe, ModelPoolEditOutcome, ModelPoolViewEntry, ModelPoolViewTierGroup, ModelPoolProvider, ModelPoolView, ModelPoolReadings, } from './localConfig/modelPool.js';
473
+ export { LOCAL_CONFIG_WRITE_INTENTS, SETTINGS_WRITE_KEYS, settingsWritePlan, settingsWriteStep } from './localConfig/settingsWrite.js';
474
+ export type { LocalConfigWriteIntentRow, LocalConfigWriteIntent, SettingsWriteIntent, SettingsWriteEdit, SettingsWritePlanInput, SettingsWritePlan, SettingsWriteStepInput, } from './localConfig/settingsWrite.js';
475
+ export { MCP_SERVER_SCOPES, MCP_SERVER_ROW_STATES, MCP_SERVER_WITHHELD_CAUSES, mcpProjectChainOf, mcpPathWithinFence, expandMcpServerEntry, mcpServersReport } from './localConfig/mcp/servers.js';
476
+ export type { McpServerScope, McpServerFileReading, McpServerFilesReading, McpServerEnvFacts, McpServerHostFacts, McpSupplementarySlot, McpServerSupplementarySources, McpServerRowScope, McpServerRowState, McpServerWithheldCause, McpServerApprovedBy, McpServerSourceFile, McpServerProblem, McpServerRow, McpDeploymentRows, McpServersReport, McpExpansion, } from './localConfig/mcp/servers.js';
477
+ export { MCP_SERVER_EDIT_OPS, applyMcpServerEdit } from './localConfig/mcp/edit.js';
478
+ export type { McpSecretMapEdit, McpSecretKeep, McpServerEdit, McpServerEditOp, McpServerEditContext, McpServerRefusalDetail, McpServerRefusalWord, McpServerEditPlan, McpServerEditNotice, McpServerProbeTarget, McpServerEditOutcome, } from './localConfig/mcp/edit.js';
479
+ export { mcpServerReportView, mcpServerEditOutcomeView, mcpServerEditSentence, probeMcpServerEdit, checkMcpServerEditRequest, checkMcpServerReportView, checkMcpServerEditOutcomeView, checkMcpServerProbeView, } from './localConfig/mcp/views.js';
480
+ export type { McpArgView, McpSecretMemberView, McpServerEntryView, McpServerProblemView, McpServerRowView, McpServerReportView, McpServerRefusalDetailView, McpServerEditPlanView, McpServerEditNoticeView, McpServerEditOutcomeView, McpServerProbeView, McpViewCheck, McpApprovalWithheldView, McpImportedView, McpSkippedView, McpProbeServerRowView, } from './localConfig/mcp/views.js';
481
+ export { SKILL_OVERRIDE_STATES, SKILL_ORIGINS, SKILL_OVERRIDE_LAYERS, SKILL_OVERRIDE_DECIDERS, SKILL_OVERRIDE_LOCK_SOURCES, skillOverrideEffectiveOf, skillOverrideLockOf, } from './skillOverrideChain.js';
482
+ export type { SkillOverrideState, SkillOrigin, SkillOverrideLayer, SkillOverrideDecider, SkillOverrideLockSource, SkillSyncedName, SkillOverrideSubject, SkillOverrideLayers, SkillOverrideEffective, SkillOverrideLock, } from './skillOverrideChain.js';
483
+ export { SKILL_ROOT_LAYERS, SKILL_ROOT_KINDS, SKILLS_VIEW_EXCLUDED_REASONS, SKILLS_VIEW_LAYERS, SKILL_OVERRIDE_SCOPES } from './localConfig/skillsWords.js';
484
+ export type { SkillRootLayer, SkillRootKind, SkillsViewExcludedReason, SkillsViewLayer, SkillOverrideScope } from './localConfig/skillsWords.js';
485
+ export { skillRootsOf, skillsViewOf, skillsSetEditOf, skillsClearEditOf, skillOverrideWritePlan, skillCreatePlan, skillRemovePlan, } from './localConfig/skills.js';
486
+ export type { SkillRootHostFacts, SkillRoot, SkillRootsTable, SkillListing, SkillFrontmatter, SkillsViewEditable, SkillsViewEntryBase, SkillsViewAppliedEntry, SkillsViewExcludedEntry, SkillsViewEntry, SkillsView, SkillsEdit, SkillOverrideWriteContext, SkillOverrideWritePlan, SkillCreateIntent, SkillRemoveIntent, SkillFileEditPlan, } from './localConfig/skills.js';
465
487
  export * from './agentSession/contract.js';
466
488
  export * from './agentSession/backgroundView.js';
467
489
  export { readAssistantInbox } from './assistantInbox.js';
@@ -469,6 +491,7 @@ export type { AssistantInboxVerb, AssistantInboxEntry, AssistantInboxReading, As
469
491
  export { checkpointRowVerdictOf } from './checkpointRowVerdict.js';
470
492
  export type { CheckpointRowVerdictReading } from './checkpointRowVerdict.js';
471
493
  export { checkpointRowBarOf, checkpointRowBarSentence } from './checkpointRowVerdict.js';
494
+ export { decisionRefusalWayOutContent } from './checkpointRowVerdict.js';
472
495
  export type { CheckpointRowBar } from './checkpointRowVerdict.js';
473
496
  export { parkedUnresumableRowsOf, parkedUnresumableLine } from './hitl/parkedUnresumable.js';
474
497
  export type { ParkedUnresumableRow } from './hitl/parkedUnresumable.js';
@@ -536,3 +559,5 @@ export type { SessionEngineRepointResult } from './sessionEngine.js';
536
559
  export { PENDING_USER_ROW_ID_PREFIX, pendingUserRowIdOf, pendingUserRowUuidOf, isPendingUserRowId } from './pendingUserRow.js';
537
560
  export { BUILTIN_OUTPUT_STYLES, builtinOutputStyleOf } from './builtinOutputStyles.js';
538
561
  export type { BuiltinOutputStyle, BuiltinOutputStyleName } from './builtinOutputStyles.js';
562
+ export { CA_PIN_LIMITS, readCenterAddress, trustOriginOf, caFingerprintsOf, caFingerprintOfDer, caFingerprintDisplay, readCaBootstrapBody, caBootstrapOpen, caBootstrapStep, caPinRefusalSentence, } from './consoleCaPin.js';
563
+ export type { CenterAddressSeat, CenterAddressRefusal, CenterAddressReading, TrustOriginRefusal, TrustOriginReading, CaFingerprintsRefusal, CaFingerprintsReading, CaCertificateParser, CaCertificateFacts, CaBootstrapRequest, CaServedCertificate, CaBootstrapRefusal, CaBootstrapReading, CaBootstrapPhase, CaBootstrapStopReason, CaBootstrapStop, CaBootstrapDecision, CaBootstrapState, CaBootstrapEvent, CaBootstrapStep, CaPinRefusal, } from './consoleCaPin.js';
package/dist/index.js CHANGED
@@ -84,7 +84,6 @@ export * from './postureKnob.js';
84
84
  export * from './engineIdentity.js';
85
85
  export { readEngineHealthFacts } from './engineHealthFacts.js';
86
86
  export { readModsDeploymentPackages } from './engineHealthFacts.js';
87
- export { readEngineHealthStore } from './engineHealthFacts.js';
88
87
  export { localEngineAnchorOf, localEnginePlanDriftOf, judgeLocalEngine, localEngineLaneOf, localEngineVerdictSentence } from './localEngineJudge.js';
89
88
  export { countClientRegistry, fleetBackgroundLiveOf, localEngineSelfOf, localEngineRegistryStatusOf, localEngineIdle, localEngineDemandOf, localEngineExitFate, localEngineExitFateSentence, } from './localEngineOccupancy.js';
90
89
  export { LOCAL_ENGINE_SWAP_CAUSES, localEngineSwapAutoable, engineSwapCardOf, engineSwapCardText } from './localEngineSwapCard.js';
@@ -119,6 +118,7 @@ export { preemptReceiptLine } from './preemptWire.js';
119
118
  export { readSteerReceipt } from './steerReceipt.js';
120
119
  export * from './sseIdleTriage.js';
121
120
  export * from './engineWireSdk.js';
121
+ export { engineCredentialReleaseVerdictOf, makeLocalEngineWireClient, ENGINE_CREDENTIAL_WITHHOLD_REASONS } from './engineCredentialRelease.js';
122
122
  export * from './classifierVerdictWire.js';
123
123
  export { stripSystemReminderBlocks, unwrapSystemReminder } from './systemReminderTag.js';
124
124
  export { findSystemReminderOpenTag } from './systemReminderTag.js';
@@ -157,6 +157,7 @@ export * from './webSearchWireCaps.js';
157
157
  export * from './liveModelCatalog.js';
158
158
  export * from './modelBudgetRule.js';
159
159
  export * from './modelIdentityResolvability.js';
160
+ export * from './modelConfigGapNotice.js';
160
161
  export * from './sessionModelLatch.js';
161
162
  export * from './modelSwitchFallback.js';
162
163
  export * from './effortWire.js';
@@ -356,12 +357,23 @@ export { mcpToolTogglesToExcludeTools } from './mcpToolToggles.js';
356
357
  export { readThinkingLatch, writeThinkingLatch, thinkingLatchView, thinkingLatchSentence, thinkingLatchRowWordOf, readSeatThinkingLatch } from './thinkingLatch.js';
357
358
  export { devicesFaceOf, devicesWritesAllowed, devicesFaceDetail } from './devicesFace.js';
358
359
  export { cloudLoginFailureOf, cloudLoginFailureText, engineTargetRefusalText, seatMcpReadingOf, watchEngineTarget } from './engineTargetSeat.js';
359
- export { KEY_SLOT_PREFIX, keyEnvNameForEntry, onboardBaseUrlProblem, onboardRefusalText, onboardWritePlan, onboardWriteVerdict, poolEntryNameOf, probeModelEndpoint, } from './model/onboardJudgement.js';
360
+ export { KEY_SLOT_PREFIX, keyEnvNameForEntry, onboardBaseUrlProblem, onboardRefusalText, onboardWriteVerdict, poolEntryNameOf, probeModelEndpoint, discoverEndpointModels, } from './model/onboardJudgement.js';
361
+ export { LOCAL_CONFIG_DOCUMENTS, globalStateFilePathOf } from './localConfig/documents.js';
362
+ export { LOCAL_CONFIG_UNREADABLE_CAUSES, LOCAL_CONFIG_REFUSALS, LOCAL_CONFIG_NOT_WRITTEN_CAUSES, LOCAL_CONFIG_UNAVAILABLE_CAUSES, LOCAL_CONFIG_UNKNOWN_CAUSES, LOCAL_CONFIG_APPLIES_ON, LOCAL_CONFIG_RESIDUES, LOCAL_CONFIG_STEP_ROLES, LOCAL_CONFIG_WRITE_PRECONDITIONS, LOCAL_CONFIG_DISCLOSURE_KINDS, localConfigAccess, applyLocalConfigIntent, previewLocalConfigIntent, localConfigReceiptSentence, localConfigResidueSentence, localConfigDisclosureSentence, } from './localConfig/kernel.js';
363
+ export { MODEL_POOL_EDIT_KINDS, MODEL_POOL_CHANNEL_SOURCES, MODEL_POOL_CREDENTIAL_KINDS, MODEL_POOL_COMPLETENESS, MODEL_POOL_MAX_BATCH, MODEL_POOL_PROBE_STATES, MODEL_POOL_DEFAULT_KEEP_REASONS, poolWritePlan, modelPoolIntentOf, editModelPoolWith, modelPoolViewOf, effectiveDefaultModelOf, defaultModelChoiceOf, modelPoolRowEditOf, channelProfilesOf, modelPoolEditOfSeat, onboardWritePlan, } from './localConfig/modelPool.js';
364
+ export { LOCAL_CONFIG_WRITE_INTENTS, SETTINGS_WRITE_KEYS, settingsWritePlan, settingsWriteStep } from './localConfig/settingsWrite.js';
365
+ export { MCP_SERVER_SCOPES, MCP_SERVER_ROW_STATES, MCP_SERVER_WITHHELD_CAUSES, mcpProjectChainOf, mcpPathWithinFence, expandMcpServerEntry, mcpServersReport } from './localConfig/mcp/servers.js';
366
+ export { MCP_SERVER_EDIT_OPS, applyMcpServerEdit } from './localConfig/mcp/edit.js';
367
+ export { mcpServerReportView, mcpServerEditOutcomeView, mcpServerEditSentence, probeMcpServerEdit, checkMcpServerEditRequest, checkMcpServerReportView, checkMcpServerEditOutcomeView, checkMcpServerProbeView, } from './localConfig/mcp/views.js';
368
+ export { SKILL_OVERRIDE_STATES, SKILL_ORIGINS, SKILL_OVERRIDE_LAYERS, SKILL_OVERRIDE_DECIDERS, SKILL_OVERRIDE_LOCK_SOURCES, skillOverrideEffectiveOf, skillOverrideLockOf, } from './skillOverrideChain.js';
369
+ export { SKILL_ROOT_LAYERS, SKILL_ROOT_KINDS, SKILLS_VIEW_EXCLUDED_REASONS, SKILLS_VIEW_LAYERS, SKILL_OVERRIDE_SCOPES } from './localConfig/skillsWords.js';
370
+ export { skillRootsOf, skillsViewOf, skillsSetEditOf, skillsClearEditOf, skillOverrideWritePlan, skillCreatePlan, skillRemovePlan, } from './localConfig/skills.js';
360
371
  export * from './agentSession/contract.js';
361
372
  export * from './agentSession/backgroundView.js';
362
373
  export { readAssistantInbox } from './assistantInbox.js';
363
374
  export { checkpointRowVerdictOf } from './checkpointRowVerdict.js';
364
375
  export { checkpointRowBarOf, checkpointRowBarSentence } from './checkpointRowVerdict.js';
376
+ export { decisionRefusalWayOutContent } from './checkpointRowVerdict.js';
365
377
  export { parkedUnresumableRowsOf, parkedUnresumableLine } from './hitl/parkedUnresumable.js';
366
378
  export { checkpointRequirementsDamagedOf } from './checkpointRowVerdict.js';
367
379
  export { READ_CREDENTIAL_NOT_ACCEPTED_NOTICE, isReadCredentialRefusal } from './readCredentialRefusal.js';
@@ -403,3 +415,4 @@ export { repointEngine, deviceHelloReadingOf, engineRepointVerdictOf, engineRepo
403
415
  export { repointSessionEngine } from './sessionEngine.js';
404
416
  export { PENDING_USER_ROW_ID_PREFIX, pendingUserRowIdOf, pendingUserRowUuidOf, isPendingUserRowId } from './pendingUserRow.js';
405
417
  export { BUILTIN_OUTPUT_STYLES, builtinOutputStyleOf } from './builtinOutputStyles.js';
418
+ export { CA_PIN_LIMITS, readCenterAddress, trustOriginOf, caFingerprintsOf, caFingerprintOfDer, caFingerprintDisplay, readCaBootstrapBody, caBootstrapOpen, caBootstrapStep, caPinRefusalSentence, } from './consoleCaPin.js';
@@ -9,6 +9,7 @@ export interface LiveModelInfo {
9
9
  routePairing?: string;
10
10
  supportedEffortLevels?: string[];
11
11
  contextWindow?: number;
12
+ contextWindowSource?: string;
12
13
  maxOutputTokens?: number;
13
14
  atMentionable?: boolean;
14
15
  compat?: LiveModelCompat;
@@ -24,6 +25,7 @@ export interface LiveModelCatalog {
24
25
  candidateRejected?: unknown;
25
26
  modelPlane?: {} | null;
26
27
  aliases?: {} | null;
28
+ unreadableRows?: number;
27
29
  }
28
30
  export declare function setLiveModelCatalog(next: LiveModelCatalog | null): void;
29
31
  export declare function setLiveModelCatalogRefresher(fn: (() => Promise<LiveModelCatalog | null>) | null): void;
@@ -177,6 +179,7 @@ export interface LiveModelRowView {
177
179
  readonly provider?: string;
178
180
  readonly reasoning?: boolean;
179
181
  readonly contextWindow?: number;
182
+ readonly contextWindowSource?: ContextWindowSource;
180
183
  readonly maxOutputTokens?: number;
181
184
  readonly isDefault: boolean;
182
185
  readonly vision: ImageVision;
@@ -185,5 +188,6 @@ export interface LiveModelRowView {
185
188
  readonly atMention: AtMentionReading;
186
189
  readonly compat: ModelCompatReading;
187
190
  }
191
+ export type ContextWindowSource = 'declared' | 'assumed' | 'unknown';
188
192
  export declare function liveModelRowsOf(catalog?: LiveModelCatalog | null): readonly LiveModelRowView[] | null;
189
193
  export {};
@@ -179,6 +179,9 @@ function droppedDisabledNamed(dropped, name) {
179
179
  return dropped.entries.some((e) => e.identity !== undefined && e.identity.enabled === false && (e.identity.name === name || e.identity.id === name));
180
180
  }
181
181
  function catalogIncomplete(cat, rows, dropped) {
182
+ const carried = ownDataOf(cat, 'unreadableRows');
183
+ if (typeof carried === 'number' && Number.isFinite(carried) && carried > 0)
184
+ return true;
182
185
  const models = ownDataOf(cat, 'models');
183
186
  const n = Array.isArray(models) ? ownDataOf(models, 'length') : undefined;
184
187
  if (typeof n === 'number' && Number.isSafeInteger(n) && n > rows.length)
@@ -588,6 +591,8 @@ export function readLiveModelCatalog(body) {
588
591
  models.push(row);
589
592
  }
590
593
  const out = { models: Object.freeze(models) };
594
+ if (unreadableRows > 0)
595
+ out.unreadableRows = unreadableRows;
591
596
  let defaultModelMalformed = false;
592
597
  if (defaultModelKey.present && defaultModelKey.value !== undefined) {
593
598
  const dm = liveDefaultModelCopy(defaultModelKey.value);
@@ -744,6 +749,10 @@ export function modelCompatOf(model, catalog = getLiveModelCatalog()) {
744
749
  }
745
750
  }
746
751
  const positiveFinite = (v) => (typeof v === 'number' && Number.isFinite(v) && v > 0 ? v : undefined);
752
+ function contextWindowSourceOfRow(row) {
753
+ const v = ownDataOf(row, 'contextWindowSource');
754
+ return v === 'declared' || v === 'assumed' ? v : 'unknown';
755
+ }
747
756
  export function liveModelRowsOf(catalog = getLiveModelCatalog()) {
748
757
  try {
749
758
  if (catalog === null || typeof catalog !== 'object' || Array.isArray(catalog))
@@ -769,7 +778,7 @@ export function liveModelRowsOf(catalog = getLiveModelCatalog()) {
769
778
  ...(id !== undefined ? { id } : {}),
770
779
  ...(provider !== undefined ? { provider } : {}),
771
780
  ...(reasoning !== 'unknown' ? { reasoning: reasoning === 'yes' } : {}),
772
- ...(contextWindow !== undefined ? { contextWindow } : {}),
781
+ ...(contextWindow !== undefined ? { contextWindow, contextWindowSource: contextWindowSourceOfRow(row) } : {}),
773
782
  ...(maxOutputTokens !== undefined ? { maxOutputTokens } : {}),
774
783
  isDefault: def.kind === 'listed' && def.name === name,
775
784
  vision: imageVisionOf(name, catalog),
@@ -0,0 +1,61 @@
1
+ export declare const LOCAL_CONFIG_DOCUMENTS: readonly [Readonly<{
2
+ readonly name: "userSettings";
3
+ readonly template: "{configHome}/settings.json";
4
+ readonly schema: "units";
5
+ readonly lockRank: "userSettings";
6
+ readonly heat: "hot";
7
+ }>, Readonly<{
8
+ readonly name: "projectSettings";
9
+ readonly template: "{project}/.sema/settings.json";
10
+ readonly schema: "units";
11
+ readonly lockRank: "projectSettings";
12
+ readonly heat: "cold";
13
+ }>, Readonly<{
14
+ readonly name: "localSettings";
15
+ readonly template: "{project}/.sema/settings.local.json";
16
+ readonly schema: "units";
17
+ readonly lockRank: "localSettings";
18
+ readonly heat: "hot";
19
+ }>, Readonly<{
20
+ readonly name: "globalConfig";
21
+ readonly template: "{configHome}/.sema{oauthSuffix}.json";
22
+ readonly schema: "requested";
23
+ readonly lockRank: "globalConfig";
24
+ readonly heat: "hot";
25
+ }>, Readonly<{
26
+ readonly name: "projectMcp";
27
+ readonly template: "{project}/.mcp.json";
28
+ readonly schema: "requested";
29
+ readonly lockRank: "projectMcp";
30
+ readonly heat: "cold";
31
+ }>, Readonly<{
32
+ readonly name: "models";
33
+ readonly template: "{configHome}/config.d/models.json";
34
+ readonly schema: "whole";
35
+ readonly lockRank: "models";
36
+ readonly heat: "cold";
37
+ }>, Readonly<{
38
+ readonly name: "deploymentMcp";
39
+ readonly template: "{configHome}/config.d/mcp.json";
40
+ readonly schema: "whole";
41
+ readonly lockRank: null;
42
+ readonly heat: "cold";
43
+ }>, Readonly<{
44
+ readonly name: "policySettings";
45
+ readonly template: "{managed}/managed-settings.json";
46
+ readonly schema: "units";
47
+ readonly lockRank: null;
48
+ readonly heat: "cold";
49
+ }>];
50
+ export type LocalConfigDocument = (typeof LOCAL_CONFIG_DOCUMENTS)[number];
51
+ export type LocalConfigDocumentName = LocalConfigDocument['name'];
52
+ export type LocalConfigWritableDocumentName = Extract<LocalConfigDocument, {
53
+ readonly lockRank: string;
54
+ }>['name'];
55
+ export declare function localConfigDocumentOf<V>(name: V): LocalConfigDocument | undefined;
56
+ export declare function isWritableLocalConfigDocument<V>(name: V): name is V & LocalConfigWritableDocumentName;
57
+ export interface GlobalStateFilePlace {
58
+ readonly configHome: string;
59
+ readonly oauthSuffix?: string;
60
+ }
61
+ export declare function globalStateFilePathOf(place: GlobalStateFilePlace): string | undefined;
@@ -0,0 +1,51 @@
1
+ export const LOCAL_CONFIG_DOCUMENTS = Object.freeze([
2
+ Object.freeze({ name: 'userSettings', template: '{configHome}/settings.json', schema: 'units', lockRank: 'userSettings', heat: 'hot' }),
3
+ Object.freeze({ name: 'projectSettings', template: '{project}/.sema/settings.json', schema: 'units', lockRank: 'projectSettings', heat: 'cold' }),
4
+ Object.freeze({ name: 'localSettings', template: '{project}/.sema/settings.local.json', schema: 'units', lockRank: 'localSettings', heat: 'hot' }),
5
+ Object.freeze({ name: 'globalConfig', template: '{configHome}/.sema{oauthSuffix}.json', schema: 'requested', lockRank: 'globalConfig', heat: 'hot' }),
6
+ Object.freeze({ name: 'projectMcp', template: '{project}/.mcp.json', schema: 'requested', lockRank: 'projectMcp', heat: 'cold' }),
7
+ Object.freeze({ name: 'models', template: '{configHome}/config.d/models.json', schema: 'whole', lockRank: 'models', heat: 'cold' }),
8
+ Object.freeze({ name: 'deploymentMcp', template: '{configHome}/config.d/mcp.json', schema: 'whole', lockRank: null, heat: 'cold' }),
9
+ Object.freeze({ name: 'policySettings', template: '{managed}/managed-settings.json', schema: 'units', lockRank: null, heat: 'cold' }),
10
+ ]);
11
+ export function localConfigDocumentOf(name) {
12
+ if (typeof name !== 'string')
13
+ return undefined;
14
+ return LOCAL_CONFIG_DOCUMENTS.find((d) => d.name === name);
15
+ }
16
+ export function isWritableLocalConfigDocument(name) {
17
+ const row = localConfigDocumentOf(name);
18
+ return row !== undefined && row.lockRank !== null;
19
+ }
20
+ const OAUTH_SUFFIX_RE = /^(?:-[a-z0-9]+)*$/;
21
+ export function globalStateFilePathOf(place) {
22
+ try {
23
+ if (typeof place !== 'object' || place === null)
24
+ return undefined;
25
+ const homeDesc = Object.getOwnPropertyDescriptor(place, 'configHome');
26
+ const home = homeDesc !== undefined && Object.hasOwn(homeDesc, 'value') ? homeDesc.value : undefined;
27
+ if (typeof home !== 'string' || home.length === 0 || home.includes('\u0000'))
28
+ return undefined;
29
+ const suffixDesc = Object.getOwnPropertyDescriptor(place, 'oauthSuffix');
30
+ if (suffixDesc !== undefined && !Object.hasOwn(suffixDesc, 'value'))
31
+ return undefined;
32
+ const suffix = suffixDesc === undefined || suffixDesc.value === undefined ? '' : suffixDesc.value;
33
+ if (typeof suffix !== 'string' || !OAUTH_SUFFIX_RE.test(suffix))
34
+ return undefined;
35
+ const sep = home.includes('\\') && !home.includes('/') ? '\\' : '/';
36
+ const row = LOCAL_CONFIG_DOCUMENTS.find((d) => d.name === 'globalConfig');
37
+ if (row === undefined)
38
+ return undefined;
39
+ const slot = '{configHome}/';
40
+ if (!row.template.startsWith(slot))
41
+ return undefined;
42
+ const rest = row.template.slice(slot.length).replace('{oauthSuffix}', suffix);
43
+ let base = home;
44
+ while (base.length > 1 && (base.endsWith('/') || base.endsWith('\\')))
45
+ base = base.slice(0, -1);
46
+ return base === '/' || base === '\\' ? `${base}${rest}` : `${base}${sep}${rest}`;
47
+ }
48
+ catch {
49
+ return undefined;
50
+ }
51
+ }