dsh-ptc-plus 0.5.0 → 0.5.2

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 (74) hide show
  1. package/README.en.md +15 -3
  2. package/README.md +15 -3
  3. package/client.cjs +1983 -234
  4. package/compiler-core.cjs +132 -132
  5. package/compiler-core.cjs.map +3 -3
  6. package/docs/adr/0005-temporary-rejected-cell-edit-transport.md +2 -0
  7. package/docs/adr/0017-track-the-latest-dsh-public-surface.md +2 -2
  8. package/docs/adr/0023-global-user-bindings.md +1 -1
  9. package/docs/adr/0027-run-the-session-kernel-in-a-killable-helper-process.md +11 -1
  10. package/docs/adr/0032-own-session-log-facts-in-a-host-only-projection.md +31 -1
  11. package/docs/adr/0038-freeze-session-capability-plans.md +1 -1
  12. package/docs/adr/0044-coexist-with-the-official-persistent-repl.md +35 -0
  13. package/docs/adr/0045-customize-model-visible-prompt-text.md +38 -0
  14. package/docs/adr/0046-gate-the-commit-with-the-semantic-evidence-tier.md +35 -0
  15. package/docs/adr/0047-store-journal-argument-digests-in-the-projection.md +88 -0
  16. package/docs/adr/README.md +2 -0
  17. package/docs/architecture.md +2 -2
  18. package/docs/capability-planning-components.md +2 -2
  19. package/docs/client-ui.md +13 -10
  20. package/docs/client-visual-contract.md +1 -1
  21. package/docs/durability-design.md +7 -1
  22. package/docs/installation.md +5 -3
  23. package/docs/publishing.md +2 -2
  24. package/docs/releases/v0.5.2.md +79 -0
  25. package/docs/runtime-reference.md +42 -3
  26. package/docs/unmeasured-cell-recovery-repair-proposal.md +387 -0
  27. package/docs/verification.md +6 -2
  28. package/index.js +63 -19
  29. package/internal/bounded-literal.js +85 -0
  30. package/internal/capability-command-receipt.js +3 -1
  31. package/internal/capability-environment.js +171 -13
  32. package/internal/capability-plan.js +11 -8
  33. package/internal/capability-statistics.js +6 -2
  34. package/internal/cell-error.js +13 -0
  35. package/internal/config-spec.js +122 -2
  36. package/internal/direct-surface-owner.js +14 -10
  37. package/internal/edit-transport-owner.js +96 -17
  38. package/internal/execution-provider-owner.js +25 -0
  39. package/internal/execution-seam-compat.js +18 -0
  40. package/internal/isolated-worker.js +134 -17
  41. package/internal/kernel-worker.js +167 -3
  42. package/internal/legacy-cell-analysis.js +14 -2
  43. package/internal/legacy-repl-convenience.js +16 -3
  44. package/internal/official-repl-priority.js +51 -0
  45. package/internal/projection-retention.js +238 -0
  46. package/internal/prompt-text.js +858 -0
  47. package/internal/recovery-tips.js +50 -11
  48. package/internal/rejected-cell-editor.js +3 -2
  49. package/internal/runtime-bridge-owner.js +11 -8
  50. package/internal/runtime-config.js +2 -0
  51. package/internal/runtime-contexts.js +14 -5
  52. package/internal/runtime-messages.js +43 -15
  53. package/internal/sdk-projection.js +2 -2
  54. package/internal/session-cell-executor.js +132 -11
  55. package/internal/session-journal-recovery.js +1009 -99
  56. package/internal/session-journal-schema.js +7 -5
  57. package/internal/session-journal.js +177 -14
  58. package/internal/session-log-view.js +111 -24
  59. package/internal/session-runtime.js +674 -33
  60. package/internal/session-state.js +27 -0
  61. package/internal/stateful-root-compiler.js +11 -0
  62. package/internal/stateful-root-runtime.js +17 -0
  63. package/internal/user-binding-console.js +7 -0
  64. package/internal/user-bindings-owner.js +8 -27
  65. package/internal/user-bindings.js +2 -2
  66. package/internal/validated-parse-repair.js +6 -1
  67. package/internal/worker-client.js +27 -4
  68. package/package.json +5 -2
  69. package/src/client-activity.js +27 -6
  70. package/src/client-capabilities-view.js +774 -125
  71. package/src/client-copy.js +231 -18
  72. package/src/client-repl-view.js +6 -1
  73. package/src/client-styles.js +68 -2
  74. package/src/client-tool-view.js +9 -2
@@ -12,6 +12,7 @@ const CHROME_COPY = Object.freeze({
12
12
  "capabilities.combination.statistics": "使用统计",
13
13
  "capabilities.combination.recovery": "提示恢复",
14
14
  "capabilities.combination.preview": "输出节选",
15
+ "capabilities.combination.promptText": "提示文本",
15
16
  "capabilities.combination.state.selected": "已选用",
16
17
  "capabilities.combination.state.unselected": "未选用",
17
18
  "capabilities.combination.state.paused": "已暂停",
@@ -67,7 +68,6 @@ const CHROME_COPY = Object.freeze({
67
68
  'capabilities.inheritedRules': '继承规则',
68
69
  'capabilities.inheritedRulesHelp': '设置默认、类别和 MCP 来源的持续规则,更改即保存。规则独立于当前筛选,单项设置按维度覆盖;MCP 来源停用优先。',
69
70
  'capabilities.batch.targets': '一次性修改 {count} 项真实能力',
70
- 'capabilities.batch.scope': '目标范围:{scope}',
71
71
  'capabilities.batch.excluded': '已排除 {count} 项当前不可用或未确认的条目。',
72
72
  'capabilities.batch.targetList': '本次批量目标',
73
73
  'capabilities.batch.empty': '当前筛选中没有可批量修改的真实能力。',
@@ -79,8 +79,14 @@ const CHROME_COPY = Object.freeze({
79
79
  'capabilities.batch.changedTargets': '{count} 项目标已不在最新完整目录中或可用性未确认;请取消并重新检查目标。',
80
80
  'capabilities.batch.failed': '保存未成功,目标和选择已保留,可再次确认重试。',
81
81
  'capabilities.batch.confirm': '确认修改 {count} 项',
82
- 'capabilities.batch.search': '搜索“{query}”',
83
82
  'capabilities.batch.all': '当前完整能力目录',
83
+ 'capabilities.batch.selected': '已选择 {count} 项能力',
84
+ 'capabilities.batch.stage': '暂存修改({count} 项)',
85
+ 'capabilities.batch.sessionStage': '确认后写入待应用更改;由底部按钮决定应用到会话或保存为全局默认。',
86
+ 'capabilities.batch.sessionInherit': '不改动(清除本会话修改)',
87
+ 'capabilities.selectForBatch': '选择 {name}',
88
+ 'capabilities.selectAllVisible': '选择当前筛选结果',
89
+ 'capabilities.selectionCount': '已选 {count} 项',
84
90
  'capabilities.typesColumn': '类型',
85
91
  'capabilities.sourceColumn': '来源',
86
92
  'capabilities.enabledColumn': '是否启用',
@@ -101,7 +107,7 @@ const CHROME_COPY = Object.freeze({
101
107
  'capabilities.eligibleFamilies': '可用家族数',
102
108
  'capabilities.coverageColumn': '覆盖率',
103
109
  'capabilities.coverageFor': '{name} 的覆盖率',
104
- 'capabilities.familyHint': '会话家族:一个主会话及其子代理合计一次。关闭采集仍可查看已有记录。',
110
+ 'capabilities.familyHint': '会话家族:一个主会话及其子代理合计一次,只有完成结算的家族计入统计。关闭采集仍可查看已有记录。',
105
111
  'capabilities.contextNavigation': '上下文功能',
106
112
  'capabilities.context.description': '初始提示',
107
113
  'capabilities.context.recovery': '提示恢复',
@@ -149,7 +155,7 @@ const CHROME_COPY = Object.freeze({
149
155
  'capabilities.observedUsage': "实际使用统计",
150
156
  'capabilities.budgetPreview': "当前能力分配预览",
151
157
  'capabilities.observationUnavailable': "无法读取能力预览,请重新读取。",
152
- 'capabilities.selectObservation': "选择一个活跃 PTC 会话,查看其工作区统计和当前配置的预算预览。",
158
+ 'capabilities.selectObservation': "选择一个活跃 PTC 会话作为观察锚点;统计和预算预览都按它的能力清单展示,统计范围可切换当前工作区或全部工作区。",
153
159
  'capabilities.quick.title': '会话能力控制',
154
160
  'capabilities.quick.modalTitle': '管理会话能力',
155
161
  'capabilities.quick.sessionIdentity': '当前会话:{session}',
@@ -168,7 +174,7 @@ const CHROME_COPY = Object.freeze({
168
174
  'capabilities.quick.applySession': '应用到会话',
169
175
  'capabilities.quick.applyGlobal': '应用到全局',
170
176
  'capabilities.quick.noOverride': '无覆盖',
171
- 'capabilities.quick.inheritSessionOnly': '撤销临时覆盖只适用于本会话。请用“应用到会话”提交。',
177
+ 'capabilities.quick.inheritSessionOnly': '撤销临时修改只适用于本会话。请用“应用到会话”提交。',
172
178
  'capabilities.quick.discard': '放弃更改',
173
179
  'capabilities.quick.applying': '正在应用…',
174
180
  'capabilities.quick.applied': '{count} 项会话能力已更新。',
@@ -184,8 +190,11 @@ const CHROME_COPY = Object.freeze({
184
190
  'capabilities.quick.pendingServerClose': 'MCP 服务 {server} 有待生效的关闭选择;子项选择仍保留。',
185
191
  'capabilities.quick.enabled': '已启用',
186
192
  'capabilities.quick.pending': '待生效',
193
+ 'capabilities.quick.temporaryState': '{state}(临时)',
187
194
  'capabilities.quick.sessionPaused': '本会话的能力与上下文已暂停;清单显示宿主默认,需在设置中重新开启并刷新后才会应用新的更改。',
188
- 'capabilities.quick.sessionManagementOff': '本会话未启用能力管理;能力沿用宿主配置。',
195
+ 'capabilities.quick.sessionManagementOff': '本会话未启用能力管理;能力沿用宿主配置。在设置的“能力与上下文”中开启能力管理并刷新后可修改本会话选择。',
196
+ 'capabilities.quick.savedPaused': '能力与上下文已在设置中关闭;重新开启并刷新后可修改本会话选择。',
197
+ 'capabilities.quick.savedManagementOff': '能力管理已在设置中关闭;重新开启并刷新后可修改本会话选择。',
189
198
  'capabilities.quick.scope': '生效范围',
190
199
  'capabilities.quick.session': '仅本会话',
191
200
  'capabilities.quick.global': '全局保存并更新本会话',
@@ -197,12 +206,25 @@ const CHROME_COPY = Object.freeze({
197
206
  'capabilities.quick.tools': '基础工具',
198
207
  'capabilities.quick.mcp': 'MCP 服务与资源',
199
208
  'capabilities.quick.mcp_tools': 'MCP Tools',
200
- 'capabilities.quick.inherit': '继承会话设置',
209
+ 'capabilities.quick.noChange': '不改动(当前:{state})',
210
+ 'capabilities.quick.undoTemp': '撤销本会话修改(恢复为:{state})',
211
+ 'capabilities.quick.keepUnchanged': '不改动',
212
+ 'capabilities.quick.undoChange': '撤销本会话修改',
213
+ 'capabilities.quick.upperRule': '由上一级规则决定',
214
+ 'capabilities.quick.impact': '本会话生效:{state} · 来源:{source}',
215
+ 'capabilities.quick.impactPending': '本会话生效:{state} · 来源:{source} · 待应用',
216
+ 'capabilities.quick.impactUpper': '本会话生效:按上一级规则决定',
217
+ 'capabilities.quick.impactUpperPending': '本会话生效:按上一级规则决定 · 待应用',
218
+ 'capabilities.quick.originPlan': '会话方案',
219
+ 'capabilities.quick.originSession': '本会话临时修改',
220
+ 'capabilities.action.enable': '启用',
221
+ 'capabilities.action.close': '关闭',
201
222
  'capabilities.quick.states': '已保存:{saved} · 临时:{temporary} · 生效:{effective}',
202
223
  'capabilities.quick.apply': '提交并生效',
203
224
  'capabilities.quick.prefill': '填入命令草稿',
204
225
  'capabilities.card.recorded': '会话能力已更新。',
205
- 'capabilities.card.pending': '能力已准备,将在下一次获准的模型步骤生效。',
226
+ 'capabilities.card.paused': '能力与上下文已关闭;本会话沿用宿主能力。',
227
+ 'capabilities.card.off': '能力管理已关闭;本会话沿用宿主能力。',
206
228
  'capabilities.card.saved-only': '全局设置已保存,会话更新失败。{error}',
207
229
  'capabilities.card.unavailable': '会话不可用,未应用更改。',
208
230
  'capabilities.card.usage': '命令未执行,请检查参数。',
@@ -218,6 +240,8 @@ const CHROME_COPY = Object.freeze({
218
240
  'capabilities.receipt.saved-only': '全局选择已保存,但会话 {session} 更新失败;请读取当前方案并重试。{error}',
219
241
  'capabilities.receipt.recorded': '会话 {session} 的能力已更新。',
220
242
  'capabilities.receipt.pending': '会话 {session} 的能力已准备,将在首次接受的模型步骤生效。',
243
+ 'capabilities.receipt.paused': '能力与上下文已关闭;会话 {session} 沿用宿主能力。',
244
+ 'capabilities.receipt.off': '能力管理已关闭;会话 {session} 沿用宿主能力。',
221
245
  'capabilities.receipt.unavailable': '请选择仍活跃的 PTC 会话。',
222
246
  'capabilities.receipt.usage': '使用 /capabilities 查看,或 /capabilities refresh 同步已保存设置。',
223
247
  'bindings.toggleEnabled': '已保存“{name}”的启用选择;模型目录在下一次获准步骤更新,程序值尚未证明初始化。',
@@ -240,6 +264,7 @@ const CHROME_COPY = Object.freeze({
240
264
  'capabilities.directoryUsage': "导航说明:{bytes} / {budget} UTF-8 bytes",
241
265
  'capabilities.statStatus.unavailable': "统计不可用",
242
266
  'capabilities.statStatus.no-samples': '暂无样本',
267
+ 'capabilities.statStatus.pending-settlement': '已有记录待结算',
243
268
  'capabilities.statStatus.incomplete-window': "窗口证据不完整",
244
269
  'capabilities.statStatus.capacity-exceeded': "统计容量已超限",
245
270
  'capabilities.savedConfigurations': '已保存配置',
@@ -286,7 +311,7 @@ const CHROME_COPY = Object.freeze({
286
311
  'capabilities.reason.workspace': '工作区统计',
287
312
  'capabilities.reason.global': '全局统计参考',
288
313
  'capabilities.host': '沿用 DSH',
289
- 'capabilities.policy.inheritRule': '沿用上层规则',
314
+ 'capabilities.policy.inheritRule': '不单独设置',
290
315
  'capabilities.policy.availabilityFilter': '已保存的可用性',
291
316
  'capabilities.policy.disclosureFilter': '已保存的说明方式',
292
317
  'capabilities.policy.frozenSource': '冻结来源的规则结果',
@@ -396,6 +421,88 @@ const CHROME_COPY = Object.freeze({
396
421
  'capabilities.refreshAcknowledged': 'DSH 已确认刷新操作。',
397
422
  'capabilities.settingsTabs': '能力设置页签',
398
423
  'capabilities.tab.manual': '能力配置',
424
+ 'capabilities.tab.prompt': "提示文本",
425
+ 'capabilities.title.prompt': "模型可见的固定提示文本",
426
+ 'capabilities.prompt.title': "能力与上下文 · 提示文本",
427
+ 'capabilities.prompt.subtitle': "模型可见上下文统一装配台 · 全部在册",
428
+ 'capabilities.prompt.bytesPair': "{bytes} B({kb} KB)",
429
+ 'capabilities.prompt.slotCounts': '已测 {bytes} B · 未测槽 {unmeasured} · 动态槽 {dynamic}',
430
+ 'capabilities.prompt.cardMetaAnchors': "{count} 个锚点",
431
+ 'capabilities.prompt.strip': "未纳管 {anchors} 个锚点 · 合计 {bytes} B({kb} KB)· 共 {total} 个锚点",
432
+ 'capabilities.prompt.rowExpand': "第 {index} 行展开",
433
+ 'capabilities.prompt.rowExpandHint': "选择上表的一行,在这里编辑它的槽位。",
434
+ 'capabilities.prompt.bytesOfLimit': "{used} / {max} B(槽上限)",
435
+ 'capabilities.prompt.unwiredTag': "通道未接通",
436
+ 'capabilities.prompt.diffEmpty': "还没有待保存的改动。",
437
+ 'capabilities.prompt.diffBytes': "{before} B → {after} B({delta})",
438
+ 'capabilities.prompt.save': "保存",
439
+ 'capabilities.prompt.cancel': "取消",
440
+ 'capabilities.prompt.intro': "按锚点与槽位覆盖插件写给模型的固定文本;每一行标注所属通道、存在条件与只读原因,生效时机随通道不同(下一次请求、新会话或下次触发)。编辑框留空表示恢复内置文本;“省略该段”只在可省略的槽位上出现,表示不投递那一段。协议文本、由配置或运行事实生成的句子,以及你自己写的绑定说明只读展示。",
441
+ 'capabilities.prompt.bytes': "{used} / {max} 字节",
442
+ 'capabilities.prompt.reset': "恢复内置",
443
+ 'capabilities.prompt.omit': "省略该段",
444
+ 'capabilities.prompt.omitted': "该段已省略(派生策略句仍会附加)",
445
+ 'capabilities.prompt.unreadable': "当前文档无法解析:{error};面板按内置文本显示,保存后可恢复。",
446
+ 'capabilities.prompt.reported': "{asset}:{reason}",
447
+ 'capabilities.prompt.ownerEditable': "可编辑",
448
+ 'capabilities.prompt.ownerReadOnly': "只读纳管",
449
+ 'capabilities.prompt.ownerOther': "他人所有",
450
+ 'capabilities.prompt.ownerMixed': "混合",
451
+ 'capabilities.prompt.cardBytes': "{bytes} B",
452
+ 'capabilities.prompt.cardMixed': "{count} 个混合锚点",
453
+ 'capabilities.prompt.templateBytes': "模板字节(孔在渲染时填充)",
454
+ 'capabilities.prompt.aggregateFrozen': "聚合冻结:条目文本可改,增删条目会移动相邻字节",
455
+ 'capabilities.prompt.totals': "已测 {bytes} B · 共 {anchors} 个锚点 · 未测槽 {unmeasured} · 动态槽 {dynamic}",
456
+ 'capabilities.prompt.cardDynamic': "{count} 个动态槽",
457
+ 'capabilities.prompt.aggregateSlot': "聚合容器(自身无字节)",
458
+ 'capabilities.prompt.cardUnwired': "—({count} 个槽未接通)",
459
+ 'capabilities.prompt.unwiredRow': "通道未接通 · {slots} 个槽未测",
460
+ 'capabilities.prompt.unwiredSummary': "{anchors} 个锚点、{slots} 个槽的通道尚未接通;它们不计入字节合计。",
461
+ 'capabilities.prompt.retention': '检查点保留:最近 {runs} 格 · 载荷 {bytes} · 簇上限 {clusters}。调大会让更早的计算可直接编辑,但检查点更大。',
462
+ 'capabilities.prompt.retentionUnlimited': '不限制',
463
+ 'capabilities.prompt.dynamicSlot': "动态(装配期实测,无字面默认)",
464
+ 'capabilities.prompt.anchorMeta': "{channel} · {presence} · {owner}",
465
+ 'capabilities.prompt.slotBytes': "{bytes} B · {owner} 类",
466
+ 'capabilities.prompt.unmeasuredSlot': "未测(无可核对字节)",
467
+ 'capabilities.prompt.readonlyReason': "{reason} · {kind}",
468
+ 'capabilities.prompt.slotSelector': "{slot}({bytes} B)",
469
+ 'capabilities.prompt.chipMeta': "槽位 {owner}",
470
+ 'capabilities.prompt.paused': "提示文本已暂停:配置里的提示文本开关关闭,改写的句子不会进入请求、工具说明、能力方案与提示;已保存的改写保留,重新开启后生效。",
471
+ 'capabilities.prompt.pausedBytes': "{bytes} B(已暂停,未应用)",
472
+ 'capabilities.prompt.columnBytesSplit': "字节(按槽拆分)",
473
+ 'capabilities.prompt.columnReason': "原因码",
474
+ 'capabilities.prompt.columnKind': "槽位种类",
475
+ 'capabilities.prompt.columnSlots': "槽位",
476
+ 'capabilities.prompt.anchorBytesSplit': "({parts})",
477
+ 'capabilities.prompt.diffTitle': "保存前差异预览",
478
+ 'capabilities.prompt.diffDelta': "{delta} 字节",
479
+ 'capabilities.prompt.effectPrompt': "待下次装配生效",
480
+ 'capabilities.prompt.effectInstall': "新会话安装时生效",
481
+ 'capabilities.prompt.effectPlan': "新会话或 refresh 生效",
482
+ 'capabilities.prompt.effectTrigger': "下次触发时生效",
483
+ 'capabilities.prompt.columnChannel': "通道",
484
+ 'capabilities.prompt.columnAnchor': "锚点",
485
+ 'capabilities.prompt.columnPresence': "存在条件",
486
+ 'capabilities.prompt.columnBytes': "字节",
487
+ 'capabilities.prompt.columnStatus': "状态",
488
+ 'capabilities.prompt.ownerHost': "DSH 宿主",
489
+ 'capabilities.prompt.hostSection': "宿主段落,只读:插件能看到段名与来源,不能在这里改写",
490
+ 'capabilities.prompt.hostUnavailable': "宿主系统提示(插件不可枚举)",
491
+ 'capabilities.prompt.hostPresenceEvery': "每个请求",
492
+ 'capabilities.prompt.hostPresenceCapabilities': "能力管理启用",
493
+ 'capabilities.prompt.readonlySummary': "{count} 个只读槽",
494
+ // Reason codes and slot kinds are registry identifiers; the pane shows a
495
+ // localized label and keeps the raw code in the element title, so a Chinese UI
496
+ // never reads like a dump of registry constants.
497
+ 'capabilities.prompt.reason.factDerived': "事实派生",
498
+ 'capabilities.prompt.reason.aggregateFrozen': "聚合冻结",
499
+ 'capabilities.prompt.reason.protocolExactText': "协议·精确文本",
500
+ 'capabilities.prompt.reason.protocolStructural': "协议·结构",
501
+ 'capabilities.prompt.reason.shadowsHost': "遮蔽宿主",
502
+ 'capabilities.prompt.reason.otherOwner': "他人所有",
503
+ 'capabilities.prompt.kind.literal': "字面量",
504
+ 'capabilities.prompt.kind.aggregate': "聚合",
505
+ 'capabilities.prompt.kind.projected': "投影",
399
506
  'capabilities.tab.statistics': '使用统计',
400
507
  'capabilities.tab.budgets': '提示设置',
401
508
  'capabilities.tab.plans': '配置方案',
@@ -602,6 +709,7 @@ const CHROME_COPY = Object.freeze({
602
709
  'tool.stopped': '执行已中断',
603
710
  'tool.source': '源码',
604
711
  'tool.result': '结果',
712
+ 'tool.descriptionGenerated': '自动摘要:模型未提供摘要,由插件生成',
605
713
  'tool.copy': '复制代码',
606
714
  'tool.copied': '已复制',
607
715
  'tool.inspect': '检查调用',
@@ -618,6 +726,7 @@ const CHROME_COPY = Object.freeze({
618
726
  "capabilities.combination.statistics": "Usage statistics",
619
727
  "capabilities.combination.recovery": "Prompt recovery",
620
728
  "capabilities.combination.preview": "Output excerpts",
729
+ "capabilities.combination.promptText": "Prompt text",
621
730
  "capabilities.combination.state.selected": "Selected",
622
731
  "capabilities.combination.state.unselected": "Not selected",
623
732
  "capabilities.combination.state.paused": "Paused",
@@ -673,7 +782,6 @@ const CHROME_COPY = Object.freeze({
673
782
  'capabilities.inheritedRules': 'Inherited rules',
674
783
  'capabilities.inheritedRulesHelp': 'Set persistent defaults, category and MCP source rules. Changes save immediately and are independent of current filters. Item preferences override each dimension; MCP source closure takes precedence.',
675
784
  'capabilities.batch.targets': 'One-time change to {count} catalog capabilities',
676
- 'capabilities.batch.scope': 'Target scope: {scope}',
677
785
  'capabilities.batch.excluded': 'Excluded {count} unavailable or unconfirmed entries.',
678
786
  'capabilities.batch.targetList': 'Targets for this batch',
679
787
  'capabilities.batch.empty': 'There are no confirmed catalog capabilities in the current filters.',
@@ -685,8 +793,14 @@ const CHROME_COPY = Object.freeze({
685
793
  'capabilities.batch.changedTargets': '{count} targets are absent from the latest complete catalog or unconfirmed. Cancel and review the targets again.',
686
794
  'capabilities.batch.failed': 'Save was not confirmed. Targets and choices are retained; confirm again to retry.',
687
795
  'capabilities.batch.confirm': 'Confirm {count} changes',
688
- 'capabilities.batch.search': 'Search “{query}”',
689
796
  'capabilities.batch.all': 'Current complete capability catalog',
797
+ 'capabilities.batch.selected': 'Selected {count} capabilities',
798
+ 'capabilities.batch.stage': 'Stage changes ({count})',
799
+ 'capabilities.batch.sessionStage': 'Confirm stages these changes; the footer decides whether they apply to this session or become global defaults.',
800
+ 'capabilities.batch.sessionInherit': 'No change (clears this session’s change)',
801
+ 'capabilities.selectForBatch': 'Select {name}',
802
+ 'capabilities.selectAllVisible': 'Select all visible results',
803
+ 'capabilities.selectionCount': '{count} selected',
690
804
  'capabilities.typesColumn': 'Type',
691
805
  'capabilities.sourceColumn': 'Source',
692
806
  'capabilities.enabledColumn': 'Enabled',
@@ -707,7 +821,7 @@ const CHROME_COPY = Object.freeze({
707
821
  'capabilities.eligibleFamilies': 'Eligible families',
708
822
  'capabilities.coverageColumn': 'Coverage',
709
823
  'capabilities.coverageFor': 'Coverage for {name}',
710
- 'capabilities.familyHint': 'A family counts one main session and its subagents together. Existing records remain available when collection is off.',
824
+ 'capabilities.familyHint': 'A family counts one main session and its subagents together; only settled families count toward statistics. Existing records remain available when collection is off.',
711
825
  'capabilities.contextNavigation': 'Context features',
712
826
  'capabilities.context.description': 'Initial prompt',
713
827
  'capabilities.context.recovery': 'Prompt recovery',
@@ -755,7 +869,7 @@ const CHROME_COPY = Object.freeze({
755
869
  'capabilities.observedUsage': "Observed usage",
756
870
  'capabilities.budgetPreview': "Current allocation preview",
757
871
  'capabilities.observationUnavailable': "Capability preview is unavailable; reload the observation.",
758
- 'capabilities.selectObservation': "Select an active PTC session to view its workspace statistics and allocation preview for the current configuration.",
872
+ 'capabilities.selectObservation': "Select an active PTC session as the observation anchor; statistics and budget preview follow its capability inventory, and the scope switches between its workspace and all workspaces.",
759
873
  'capabilities.quick.title': 'Session capability controls',
760
874
  'capabilities.quick.modalTitle': 'Manage session capabilities',
761
875
  'capabilities.quick.sessionIdentity': 'Current session: {session}',
@@ -774,7 +888,7 @@ const CHROME_COPY = Object.freeze({
774
888
  'capabilities.quick.applySession': 'Apply to session',
775
889
  'capabilities.quick.applyGlobal': 'Apply to global',
776
890
  'capabilities.quick.noOverride': 'None',
777
- 'capabilities.quick.inheritSessionOnly': 'Clearing a temporary override applies only to this session. Use Apply to session.',
891
+ 'capabilities.quick.inheritSessionOnly': 'Clearing a temporary change applies only to this session. Use Apply to session.',
778
892
  'capabilities.quick.discard': 'Discard changes',
779
893
  'capabilities.quick.applying': 'Applying…',
780
894
  'capabilities.quick.applied': '{count} session capabilities updated.',
@@ -790,8 +904,11 @@ const CHROME_COPY = Object.freeze({
790
904
  'capabilities.quick.pendingServerClose': 'MCP server {server} has a close choice awaiting effect; child choices are retained.',
791
905
  'capabilities.quick.enabled': 'Enabled',
792
906
  'capabilities.quick.pending': 'Pending',
907
+ 'capabilities.quick.temporaryState': '{state} (temporary)',
793
908
  'capabilities.quick.sessionPaused': 'Capabilities and context are paused for this session; the list shows Host defaults. Re-enable them in settings and refresh before changes can apply.',
794
- 'capabilities.quick.sessionManagementOff': 'Capability management is off for this session; capabilities stay with the Host.',
909
+ 'capabilities.quick.sessionManagementOff': 'Capability management is off for this session; capabilities stay with the Host. Enable it under Capabilities & Context in settings and refresh before changing this session\'s choices.',
910
+ 'capabilities.quick.savedPaused': 'Capabilities and context are off in settings; re-enable them and refresh before changing this session\'s choices.',
911
+ 'capabilities.quick.savedManagementOff': 'Capability management is off in settings; re-enable it and refresh before changing this session\'s choices.',
795
912
  'capabilities.quick.scope': 'Apply to',
796
913
  'capabilities.quick.session': 'This session only',
797
914
  'capabilities.quick.global': 'Save globally and update this session',
@@ -803,12 +920,25 @@ const CHROME_COPY = Object.freeze({
803
920
  'capabilities.quick.tools': 'Ordinary tools',
804
921
  'capabilities.quick.mcp': 'MCP servers and resources',
805
922
  'capabilities.quick.mcp_tools': 'MCP tools',
806
- 'capabilities.quick.inherit': 'Inherit session settings',
923
+ 'capabilities.quick.noChange': 'No change (currently: {state})',
924
+ 'capabilities.quick.undoTemp': 'Undo this session’s change (restores {state})',
925
+ 'capabilities.quick.keepUnchanged': 'No change',
926
+ 'capabilities.quick.undoChange': 'Undo this session’s change',
927
+ 'capabilities.quick.upperRule': 'Let the level above decide',
928
+ 'capabilities.quick.impact': 'Effective in this session: {state} · From: {source}',
929
+ 'capabilities.quick.impactPending': 'Effective in this session: {state} · From: {source} · Pending apply',
930
+ 'capabilities.quick.impactUpper': 'Effective in this session: decided by the level above',
931
+ 'capabilities.quick.impactUpperPending': 'Effective in this session: decided by the level above · Pending apply',
932
+ 'capabilities.quick.originPlan': 'the session plan',
933
+ 'capabilities.quick.originSession': 'this session’s change',
934
+ 'capabilities.action.enable': 'Enable',
935
+ 'capabilities.action.close': 'Close',
807
936
  'capabilities.quick.states': 'Saved: {saved} · Temporary: {temporary} · Effective: {effective}',
808
937
  'capabilities.quick.apply': 'Submit and apply',
809
938
  'capabilities.quick.prefill': 'Fill command draft',
810
939
  'capabilities.card.recorded': 'Session capabilities updated.',
811
- 'capabilities.card.pending': 'Capabilities prepared; they take effect at the next accepted model step.',
940
+ 'capabilities.card.paused': 'Capabilities and context are off; this session stays with the Host capabilities.',
941
+ 'capabilities.card.off': 'Capability management is off; this session stays with the Host capabilities.',
812
942
  'capabilities.card.saved-only': 'Global settings saved; session update failed. {error}',
813
943
  'capabilities.card.unavailable': 'Session unavailable; changes were not applied.',
814
944
  'capabilities.card.usage': 'Command not executed; check its arguments.',
@@ -824,6 +954,8 @@ const CHROME_COPY = Object.freeze({
824
954
  'capabilities.receipt.saved-only': 'Global choice saved, but session {session} could not be updated. Inspect its plan and retry. {error}',
825
955
  'capabilities.receipt.recorded': 'Capabilities updated for session {session}.',
826
956
  'capabilities.receipt.pending': 'Capabilities prepared for session {session}; they take effect at its first accepted model step.',
957
+ 'capabilities.receipt.paused': 'Capabilities and context are off; session {session} stays with the Host capabilities.',
958
+ 'capabilities.receipt.off': 'Capability management is off; session {session} stays with the Host capabilities.',
827
959
  'capabilities.receipt.unavailable': 'Select an active PTC session.',
828
960
  'capabilities.receipt.usage': 'Use /capabilities to inspect or /capabilities refresh to apply saved settings.',
829
961
  'bindings.toggleEnabled': 'Enabled “{name}” in saved configuration. The model catalog updates at the next accepted step; worker initialization is not yet established.',
@@ -846,6 +978,7 @@ const CHROME_COPY = Object.freeze({
846
978
  'capabilities.directoryUsage': "Navigation: {bytes} / {budget} UTF-8 bytes",
847
979
  'capabilities.statStatus.unavailable': "Statistics unavailable",
848
980
  'capabilities.statStatus.no-samples': 'No samples yet',
981
+ 'capabilities.statStatus.pending-settlement': 'Recorded, awaiting settlement',
849
982
  'capabilities.statStatus.incomplete-window': "Incomplete window evidence",
850
983
  'capabilities.statStatus.capacity-exceeded': "Statistics capacity exceeded",
851
984
  'capabilities.savedConfigurations': "Saved configurations",
@@ -892,7 +1025,7 @@ const CHROME_COPY = Object.freeze({
892
1025
  'capabilities.reason.workspace': 'Workspace statistics',
893
1026
  'capabilities.reason.global': 'Global statistics fallback',
894
1027
  'capabilities.host': 'Host defaults',
895
- 'capabilities.policy.inheritRule': 'Use parent rules',
1028
+ 'capabilities.policy.inheritRule': 'Not set here',
896
1029
  'capabilities.policy.availabilityFilter': 'Saved availability',
897
1030
  'capabilities.policy.disclosureFilter': 'Saved disclosure',
898
1031
  'capabilities.policy.frozenSource': 'Frozen source rule result',
@@ -1002,6 +1135,85 @@ const CHROME_COPY = Object.freeze({
1002
1135
  'capabilities.refreshAcknowledged': 'DSH acknowledged the refresh operation.',
1003
1136
  'capabilities.settingsTabs': 'Capability settings tabs',
1004
1137
  'capabilities.tab.manual': 'Capability configuration',
1138
+ 'capabilities.tab.prompt': "Prompt text",
1139
+ 'capabilities.title.prompt': "Fixed prompt text the model reads",
1140
+ 'capabilities.prompt.title': "Capabilities & Context · Prompt text",
1141
+ 'capabilities.prompt.subtitle': "One surface for the model-visible context · everything on record",
1142
+ 'capabilities.prompt.bytesPair': "{bytes} B ({kb} KB)",
1143
+ 'capabilities.prompt.slotCounts': 'Measured {bytes} B · {unmeasured} unmeasured slots · {dynamic} dynamic slots',
1144
+ 'capabilities.prompt.cardMetaAnchors': "{count} anchors",
1145
+ 'capabilities.prompt.strip': "{anchors} anchors not wired · {bytes} B ({kb} KB) total · {total} anchors",
1146
+ 'capabilities.prompt.rowExpand': "Row {index} expanded",
1147
+ 'capabilities.prompt.rowExpandHint': "Select a row above to edit its slots here.",
1148
+ 'capabilities.prompt.bytesOfLimit': "{used} / {max} B (slot limit)",
1149
+ 'capabilities.prompt.unwiredTag': "channel not wired",
1150
+ 'capabilities.prompt.diffEmpty': "No pending changes.",
1151
+ 'capabilities.prompt.diffBytes': "{before} B → {after} B ({delta})",
1152
+ 'capabilities.prompt.save': "Save",
1153
+ 'capabilities.prompt.cancel': "Cancel",
1154
+ 'capabilities.prompt.intro': "Override the fixed text the plugin writes, per anchor and slot. Each row names its channel, presence condition and read-only reason, and when an edit takes effect depends on that channel (next request, new session, or next trigger). Clearing the editor restores the built-in text; \u201comit this paragraph\u201d appears only on omittable slots and means the paragraph is not delivered. Protocol text, sentences generated from configuration or runtime facts, and the binding notes you wrote yourself stay read-only.",
1155
+ 'capabilities.prompt.bytes': "{used} / {max} bytes",
1156
+ 'capabilities.prompt.reset': "Use built-in",
1157
+ 'capabilities.prompt.omit': "Omit this paragraph",
1158
+ 'capabilities.prompt.omitted': "This paragraph is omitted; derived policy sentences are still appended",
1159
+ 'capabilities.prompt.unreadable': "The stored document cannot be parsed: {error}. The panel shows built-in text; saving restores it.",
1160
+ 'capabilities.prompt.reported': "{asset}: {reason}",
1161
+ 'capabilities.prompt.ownerEditable': "Editable",
1162
+ 'capabilities.prompt.ownerReadOnly': "Read-only, managed",
1163
+ 'capabilities.prompt.ownerOther': "Owned elsewhere",
1164
+ 'capabilities.prompt.ownerMixed': "Mixed",
1165
+ 'capabilities.prompt.cardBytes': "{bytes} B",
1166
+ 'capabilities.prompt.cardMixed': "{count} mixed anchor(s)",
1167
+ 'capabilities.prompt.templateBytes': "template bytes (holes filled at render time)",
1168
+ 'capabilities.prompt.aggregateFrozen': "Frozen item set: item text is editable, adding or removing an item moves neighbouring bytes",
1169
+ 'capabilities.prompt.totals': "measured {bytes} B · {anchors} anchors · unmeasured slots {unmeasured} · dynamic slots {dynamic}",
1170
+ 'capabilities.prompt.cardDynamic': "{count} dynamic slots",
1171
+ 'capabilities.prompt.aggregateSlot': "aggregate container (owns no bytes)",
1172
+ 'capabilities.prompt.cardUnwired': "— ({count} slots not connected)",
1173
+ 'capabilities.prompt.unwiredRow': "channel not connected · {slots} slots unmeasured",
1174
+ 'capabilities.prompt.unwiredSummary': "{anchors} anchors and {slots} slots have no connected channel; they are excluded from the byte total.",
1175
+ 'capabilities.prompt.retention': 'Checkpoint retention: newest {runs} cells · {bytes} payload · {clusters} clusters. A larger window keeps older cells editable but grows the checkpoint.',
1176
+ 'capabilities.prompt.retentionUnlimited': 'unlimited',
1177
+ 'capabilities.prompt.dynamicSlot': "dynamic (measured at assembly; no literal default)",
1178
+ 'capabilities.prompt.anchorMeta': "{channel} · {presence} · {owner}",
1179
+ 'capabilities.prompt.slotBytes': "{bytes} B · owner {owner}",
1180
+ 'capabilities.prompt.unmeasuredSlot': "unmeasured (no bytes to reconcile)",
1181
+ 'capabilities.prompt.readonlyReason': "{reason} · {kind}",
1182
+ 'capabilities.prompt.slotSelector': "{slot} ({bytes} B)",
1183
+ 'capabilities.prompt.chipMeta': "slot {owner}",
1184
+ 'capabilities.prompt.paused': "Prompt text is paused: the prompt text switch in configuration is off, so edited sentences do not reach requests, tool descriptions, the capability plan or tips. Saved edits are kept and apply again when you turn it back on.",
1185
+ 'capabilities.prompt.pausedBytes': "{bytes} B (paused, not applied)",
1186
+ 'capabilities.prompt.columnBytesSplit': "Bytes (per slot)",
1187
+ 'capabilities.prompt.columnReason': "Reason code",
1188
+ 'capabilities.prompt.columnKind': "Slot kind",
1189
+ 'capabilities.prompt.columnSlots': "Slots",
1190
+ 'capabilities.prompt.anchorBytesSplit': "({parts})",
1191
+ 'capabilities.prompt.diffTitle': "Pending changes before saving",
1192
+ 'capabilities.prompt.diffDelta': "{delta} bytes",
1193
+ 'capabilities.prompt.effectPrompt': "applies on the next assembly",
1194
+ 'capabilities.prompt.effectInstall': "applies at the next agent install",
1195
+ 'capabilities.prompt.effectPlan': "applies on a new session or refresh",
1196
+ 'capabilities.prompt.effectTrigger': "applies on the next trigger",
1197
+ 'capabilities.prompt.columnChannel': "Channel",
1198
+ 'capabilities.prompt.columnAnchor': "Anchor",
1199
+ 'capabilities.prompt.columnPresence': "Presence",
1200
+ 'capabilities.prompt.columnBytes': "Bytes",
1201
+ 'capabilities.prompt.columnStatus': "Status",
1202
+ 'capabilities.prompt.ownerHost': "DSH host",
1203
+ 'capabilities.prompt.hostSection': "Host-owned section, read-only: the plugin can name it and read its bytes, but cannot rewrite it here",
1204
+ 'capabilities.prompt.hostUnavailable': "Host system prompt (not enumerable by the plugin)",
1205
+ 'capabilities.prompt.hostPresenceEvery': "every request",
1206
+ 'capabilities.prompt.hostPresenceCapabilities': "capability management enabled",
1207
+ 'capabilities.prompt.readonlySummary': "{count} read-only slot(s)",
1208
+ 'capabilities.prompt.reason.factDerived': "fact-derived",
1209
+ 'capabilities.prompt.reason.aggregateFrozen': "aggregate-frozen",
1210
+ 'capabilities.prompt.reason.protocolExactText': "protocol-exact-text",
1211
+ 'capabilities.prompt.reason.protocolStructural': "protocol-structural",
1212
+ 'capabilities.prompt.reason.shadowsHost': "shadows-host",
1213
+ 'capabilities.prompt.reason.otherOwner': "other-owner",
1214
+ 'capabilities.prompt.kind.literal': "literal",
1215
+ 'capabilities.prompt.kind.aggregate': "aggregate",
1216
+ 'capabilities.prompt.kind.projected': "projected",
1005
1217
  'capabilities.tab.statistics': 'Usage statistics',
1006
1218
  'capabilities.tab.budgets': 'Prompt settings',
1007
1219
  'capabilities.tab.plans': 'Configurations',
@@ -1209,6 +1421,7 @@ const CHROME_COPY = Object.freeze({
1209
1421
  'tool.stopped': 'Stopped',
1210
1422
  'tool.source': 'Source',
1211
1423
  'tool.result': 'Result',
1424
+ 'tool.descriptionGenerated': 'Auto summary: generated because the model provided none',
1212
1425
  'tool.inspect': 'Inspect call',
1213
1426
  'feature.safeEdit': 'Safe edit execution',
1214
1427
  'feature.codeRun': 'Isolated code.run execution',
@@ -25,7 +25,12 @@ export function createReplView(React, deps) {
25
25
  ? observeRepl(sessionId, elementRef.current, memory,
26
26
  value => setObserved({ sessionId, source: memory, value }))
27
27
  : undefined, [active, observeRepl, sessionId, memory, elementRef])
28
- return observed?.sessionId === sessionId && observed.source === memory ? observed.value : memory
28
+ if (observed?.sessionId !== sessionId) return memory
29
+ // The projection can drop its REPL memory while a live observation still holds
30
+ // the last confirmed inventory; falling back to the empty snapshot there would
31
+ // flip a populated panel to "state cannot be confirmed" for no visible reason.
32
+ if (!memory.available && observed.value?.available === true) return observed.value
33
+ return observed.source === memory ? observed.value : memory
29
34
  }
30
35
 
31
36
  function ReplBindingInspector({ entry, preview, t }) {
@@ -1,6 +1,6 @@
1
1
  const CLIENT_STYLE_ID = 'ptc-plus-client-style'
2
2
  const CLIENT_CSS = `
3
- .ptcPlusCombination{margin-bottom:16px;padding:12px;border:1px solid var(--dsw-alias-border-l2);border-radius:10px;min-width:0}.ptcPlusCombination .ptcPlusTaskHead{margin-bottom:10px}.ptcPlusCombinationChoices{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,3fr) minmax(0,1fr);gap:12px}.ptcPlusCombinationGroup{display:flex;flex-direction:column;min-width:0;gap:6px}.ptcPlusCombinationGroupTitle{font-size:11px;line-height:18px;color:var(--dsw-alias-label-tertiary);font-weight:500}.ptcPlusCombinationGroupChoices{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);gap:6px;flex:1}.ptcPlusCombinationChoice{appearance:none;box-sizing:border-box;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;min-width:0;min-height:62px;padding:8px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;line-height:18px;text-align:center;overflow-wrap:anywhere;cursor:pointer}.ptcPlusCombinationChoice small{font-size:11px;color:var(--dsw-alias-label-tertiary)}.ptcPlusCombinationChoice[data-state=selected]{border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4d6bfe) 20%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4d6bfe) 6%,var(--dsw-alias-bg-layer-2))}.ptcPlusCombinationChoice[data-state=selected] small{color:var(--dsw-alias-state-business-primary,#4d6bfe)}.ptcPlusCombinationChoice[data-state=paused] small{color:var(--dsw-alias-state-warning-primary,#9b6e22)}.ptcPlusCombinationChoice:hover{background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusCombinationChoice:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:2px}.ptcPlusCombinationFacts{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:12px;line-height:20px}.ptcPlusCombinationSession{margin-top:10px;min-width:0;overflow-wrap:anywhere}.ptcPlusCombination .ptcPlusCapabilitySessionTools{margin-top:12px}.ptcPlusCombination .ptcPlusCapabilitySaveState{max-width:100%;overflow-wrap:anywhere}@media(max-width:720px){.ptcPlusCombinationChoices{grid-template-columns:minmax(0,1fr)}.ptcPlusCombinationGroupChoices{grid-auto-flow:row;grid-auto-columns:auto}.ptcPlusCombinationChoice{flex-direction:row;justify-content:space-between;min-height:40px;text-align:start;gap:10px}.ptcPlusCombinationChoice small{white-space:nowrap}.ptcPlusCombination{padding:10px}.ptcPlusCombination .ptcPlusTaskHead{align-items:flex-start;flex-wrap:wrap}}
3
+ .ptcPlusCombination{margin-bottom:16px;padding:12px;border:1px solid var(--dsw-alias-border-l2);border-radius:10px;min-width:0}.ptcPlusCombination .ptcPlusTaskHead{margin-bottom:10px}.ptcPlusCombinationChoices{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}.ptcPlusCombinationChoice{appearance:none;box-sizing:border-box;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;min-width:0;min-height:62px;padding:8px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;line-height:18px;text-align:center;overflow-wrap:anywhere;cursor:pointer}.ptcPlusCombinationChoice small{font-size:11px;color:var(--dsw-alias-label-tertiary)}.ptcPlusCombinationChoice[data-state=selected]{border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4d6bfe) 20%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4d6bfe) 6%,var(--dsw-alias-bg-layer-2))}.ptcPlusCombinationChoice[data-state=selected] small{color:var(--dsw-alias-state-business-primary,#4d6bfe)}.ptcPlusCombinationChoice[data-state=paused] small{color:var(--dsw-alias-state-warning-primary,#9b6e22)}.ptcPlusCombinationChoice:hover{background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusCombinationChoice:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:2px}.ptcPlusCombinationFacts{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:12px;line-height:20px}.ptcPlusCombinationSession{margin-top:10px;min-width:0;overflow-wrap:anywhere}.ptcPlusCombination .ptcPlusCapabilitySessionTools{margin-top:12px}.ptcPlusCombination .ptcPlusCapabilitySaveState{max-width:100%;overflow-wrap:anywhere}@media(max-width:720px){.ptcPlusCombinationChoices{grid-template-columns:minmax(0,1fr)}.ptcPlusCombinationChoice{flex-direction:row;justify-content:space-between;min-height:40px;text-align:start;gap:10px}.ptcPlusCombinationChoice small{white-space:nowrap}.ptcPlusCombination{padding:10px}.ptcPlusCombination .ptcPlusTaskHead{align-items:flex-start;flex-wrap:wrap}}
4
4
  .ptcPlusSelectTrigger{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:space-between;gap:12px;width:100%;min-width:0;height:34px;padding:0 11px;border:1px solid var(--dsw-alias-border-l4);border-radius:8px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font:inherit;font-size:13px;text-align:start;cursor:pointer}.ptcPlusSelectTrigger>span:first-child{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ptcPlusSelectTrigger:hover:not(:disabled){border-color:var(--dsw-alias-label-dimmed)}.ptcPlusSelectTrigger:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:1px}.ptcPlusSelectTrigger:disabled{opacity:.45;cursor:not-allowed}.ptcPlusSelectChevron{display:inline-flex;align-items:center;justify-content:center;flex:none;width:16px;height:16px;color:var(--dsw-alias-label-secondary);line-height:0}.ptcPlusSelectChevron svg{display:block}.ptcPlusSelectMenu{z-index:1100;box-sizing:border-box;min-width:var(--radix-select-trigger-width);max-width:min(380px,calc(100vw - 24px));max-height:min(360px,var(--radix-select-content-available-height));overflow:hidden;border:1px solid var(--dsw-alias-border-l3);border-radius:10px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);box-shadow:var(--dsw-elevation-prominent,0 12px 32px rgba(0,0,0,.18));font:13px/20px var(--dsw-font-family,system-ui,sans-serif)}.ptcPlusSelectViewport{max-height:inherit;overflow-y:auto;overscroll-behavior:contain;padding:5px}.ptcPlusSelectOption{position:relative;display:flex;align-items:center;min-height:32px;padding:5px 30px 5px 10px;outline:none;border-radius:6px;overflow-wrap:anywhere;cursor:pointer}.ptcPlusSelectOption[data-highlighted]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.ptcPlusSelectOption[data-state=checked]{color:var(--dsw-alias-state-business-primary,#4d6bfe)}.ptcPlusSelectOption[data-disabled]{opacity:.45;cursor:not-allowed}.ptcPlusSelectCheck{position:absolute;right:10px;color:var(--dsw-alias-state-business-primary,#4d6bfe)}
5
5
  .ptcPlusTool,.ptcPlusComposerBindingAnchor{--ptc-plus-warning-label:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#a15c00) 65%,var(--dsw-alias-label-primary,#18191c))}.ptcPlusTool{font-family:inherit;font-size:13px;line-height:18px}.ptcPlusTool .ptcPlusToolRow{box-sizing:border-box;height:auto;min-height:24px;align-items:flex-start;padding-block:3px}.ptcPlusToolDisclosureContent{min-width:0;flex:1}.ptcPlusTool .ptcPlusToolDisclosureLayout{min-width:0;align-items:flex-start}.ptcPlusTool .ptcPlusToolTitle,.ptcPlusTool .ptcPlusToolSummary,.ptcPlusTool .ptcPlusToolSummaryLine,.ptcPlusTool .ptcPlusToolState,.ptcPlusTool .ptcPlusToolDescription,.ptcPlusTool .ptcPlusToolSep{font-size:13px;line-height:18px}.ptcPlusTool .ptcPlusToolTitle{flex:none;margin-inline-end:6px}.ptcPlusTool .ptcPlusToolState{flex:none;white-space:nowrap}.ptcPlusTool .ptcPlusToolSep{display:inline-block;min-width:6px}.ptcPlusToolSummary{display:flex;min-width:0;align-items:baseline}.ptcPlusToolSummaryLine{display:flex;min-width:0;align-items:baseline;overflow:hidden}.ptcPlusToolDescription{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ptcPlusToolSummary .ptcPlusToolDescription{flex:1}.ptcPlusToolPreview{display:flex;flex:1;min-width:0;flex-direction:column;gap:4px;margin-inline-start:6px}.ptcPlusToolPreview .ptcPlusToolSummaryLine{display:block}.ptcPlusToolPreview .ptcPlusToolDescription{display:inline;white-space:normal;overflow-wrap:anywhere}.ptcPlusToolPreview .ptcPlusFeatures{margin:0}
6
6
  .ptcPlusToolHover{position:fixed;inset:auto;margin:0;box-sizing:border-box;z-index:100;width:420px;max-height:360px;padding:14px 16px 0;display:flex;flex-direction:column;gap:10px;overflow:clip;pointer-events:none;user-select:none;border:1px solid var(--dsw-alias-border-l2,rgba(127,127,127,.2));border-radius:12px;background:var(--dsw-alias-bg-layer-1,var(--dsw-alias-bg-base,#fff));color:var(--dsw-alias-label-primary,#18191c);box-shadow:0 12px 36px rgba(0,0,0,.16);font-family:var(--dsw-font-family,system-ui,sans-serif);font-size:13px;line-height:19px}.ptcPlusToolHover *{pointer-events:none}.ptcPlusToolHover[hidden]{display:none}.ptcPlusToolHover::backdrop{display:none}.ptcPlusToolHoverHeader{display:flex;align-items:center;justify-content:space-between;gap:12px;flex:none}.ptcPlusToolHoverHeading{font-weight:600;min-width:0}.ptcPlusToolHoverState{white-space:nowrap;font-size:12px;color:var(--dsw-alias-label-secondary)}.ptcPlusToolHoverHeader[data-state=error] .ptcPlusToolHoverState{color:var(--dsw-alias-state-error-primary)}.ptcPlusToolHoverHeader[data-state=stopped] .ptcPlusToolHoverState{color:var(--ptc-plus-warning-label,color-mix(in srgb,var(--dsw-alias-state-warn-primary,#a15c00) 65%,var(--dsw-alias-label-primary,#18191c)))}.ptcPlusToolHoverHeader[data-state=ok] .ptcPlusToolHoverState{color:var(--dsw-alias-state-success-primary,var(--dsw-alias-label-secondary))}.ptcPlusToolHoverContent{min-height:0;overflow:clip;display:flex;flex-direction:column;gap:10px}.ptcPlusToolHoverDescription{color:var(--dsw-alias-label-secondary);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:clip;overflow-wrap:anywhere}.ptcPlusToolHoverSection{min-height:0;overflow:clip;border-top:1px solid var(--dsw-alias-border-l2,rgba(127,127,127,.2));padding-top:8px}.ptcPlusToolHover .ptcPlusToolSectionLabel{display:block;margin-bottom:5px;color:var(--dsw-alias-label-secondary);font-size:12px}.ptcPlusToolHover .ptcPlusToolHoverCode{background:none;border:0;border-radius:0;margin:0;padding:0;overflow:clip}.ptcPlusToolHover .ptcPlusToolHoverCode pre,.ptcPlusToolHover pre.ptcPlusToolHoverCode,.ptcPlusToolHover .ptcPlusIoText{background:none;border:0;border-radius:0;margin:0!important;padding:0;max-height:none;overflow:clip;white-space:pre!important;word-break:normal;font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);font-size:12px;line-height:19px}.ptcPlusToolHover .ptcPlusFeatures{margin:0;max-height:19px;overflow:clip}.ptcPlusToolHoverFooter{display:flex;align-items:center;justify-content:space-between;gap:12px;flex:none;padding:9px 0;border-top:1px solid var(--dsw-alias-border-l2,rgba(127,127,127,.2));color:var(--dsw-alias-label-secondary);font-size:11px;line-height:16px}.ptcPlusToolHoverBounded{display:none;white-space:nowrap}.ptcPlusToolHoverBounded[data-truncated=true],.ptcPlusToolHover[data-clipped=true] .ptcPlusToolHoverBounded{display:block}
@@ -31,7 +31,69 @@ const CLIENT_CSS = `
31
31
  .ptcPlusCapabilityToolbar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:12px 0}.ptcPlusCapabilityToolbar>.ptcPlusSearch{flex:1 1 220px;min-width:0}.ptcPlusCapabilityTypes{display:flex;flex-wrap:wrap;gap:5px}.ptcPlusCapabilityTypes button{appearance:none;padding:6px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;text-align:center;cursor:pointer}.ptcPlusCapabilityTypes [aria-pressed=true]{border-color:transparent;background:var(--dsw-alias-state-business-primary,#4d6bfe);color:var(--dsw-alias-bg-base,#fff)}
32
32
  .ptcPlusCapabilityFilter{display:flex;flex-direction:column;min-width:0;gap:6px;font-size:12px;color:var(--dsw-alias-label-secondary)}.ptcPlusCapabilityFilter>.ptcPlusSelectTrigger{width:100%;max-width:100%;font-size:12px}.ptcPlusCapabilityFilterFields{display:flex;align-items:flex-end;flex-wrap:wrap;gap:12px;padding:12px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px}.ptcPlusCapabilityFilterFields>.ptcPlusCapabilityFilter{flex:1 1 160px}.ptcPlusCapabilityOnlyCommon{display:flex;align-items:center;gap:6px;font-size:12px}.ptcPlusCapabilityOnlyCommon input{width:16px;height:16px;margin:0}.ptcPlusCapabilityResultLine,.ptcPlusActiveFilters{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;margin:8px 0;color:var(--dsw-alias-label-secondary);font-size:11px}.ptcPlusCapabilityLink{appearance:none;padding:4px 0;border:0;background:transparent;color:var(--dsw-alias-state-business-primary,#4d6bfe);font:inherit;font-size:12px;cursor:pointer}.ptcPlusCapabilityLink:disabled{opacity:.5;cursor:default}
33
33
  .ptcPlusCapabilityTable{min-width:0;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;overflow:hidden}.ptcPlusCapabilityColumns,.ptcPlusCapabilityItem{display:grid;grid-template-columns:minmax(140px,1.6fr) 54px minmax(65px,.75fr) minmax(92px,1fr) minmax(104px,1fr);align-items:center;gap:10px;padding:10px 12px}.ptcPlusCapabilityColumns{color:var(--dsw-alias-label-tertiary);font-size:11px;background:var(--dsw-alias-bg-layer-2)}.ptcPlusCapabilitySort{appearance:none;display:inline-flex;align-items:center;justify-content:flex-start;gap:4px;width:100%;min-height:28px;padding:3px 0;border:0;border-radius:4px;background:transparent;color:inherit;font:inherit;text-align:start;cursor:pointer}.ptcPlusCapabilitySort>span{display:inline-flex;flex:none;align-items:center;justify-content:center;width:11px;height:11px;font-size:10px;line-height:1}.ptcPlusCapabilityColumns [aria-sort=ascending],.ptcPlusCapabilityColumns [aria-sort=descending]{color:var(--dsw-alias-state-business-primary,#4d6bfe)}.ptcPlusCapabilityContextCell>.ptcPlusCapabilityContext{width:100%}.ptcPlusCapabilityList{max-height:480px;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable}.ptcPlusCapabilityItem{border-bottom:1px solid var(--dsw-alias-border-l2)}.ptcPlusCapabilityItem:last-child{border-bottom:0}.ptcPlusCapabilityItem[data-selected=true]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4d6bfe) 6%,transparent)}.ptcPlusCapabilityItem:not([data-selected=true]){cursor:pointer}.ptcPlusCapabilityItem:not([data-selected=true]):hover{background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusCapabilityItem>*{min-width:0}.ptcPlusCapabilityIdentity{display:flex;flex-direction:column;gap:3px;min-width:0}.ptcPlusCapabilityName{font-size:13px;overflow-wrap:anywhere}.ptcPlusCapabilityIdentity code{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:15px;overflow-wrap:anywhere}.ptcPlusCapabilitySource{color:var(--dsw-alias-label-secondary);font-size:11px;overflow-wrap:anywhere}.ptcPlusCapabilityBadge{justify-self:start;padding:2px 6px;border-radius:4px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4d6bfe) 8%,transparent);color:var(--dsw-alias-state-business-primary,#4d6bfe);font-size:10px;line-height:17px}.ptcPlusCapabilityBadge[data-kind=skill]{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2)}.ptcPlusCapabilityAvailability{display:flex;align-items:center;gap:6px;font-size:11px}.ptcPlusCapabilityAvailability[data-state=closed],.ptcPlusCapabilityAvailability[data-state=unapplied],.ptcPlusCapabilityAvailability[data-state=source-closed],.ptcPlusCapabilityAvailability[data-state=unknown],.ptcPlusCapabilityAvailability[data-state=unavailable]{color:var(--dsw-alias-label-tertiary)}.ptcPlusCapabilityContext{appearance:none;display:flex;align-items:center;justify-content:center;gap:6px;padding:5px 2px;border:0;border-radius:5px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;text-align:center;cursor:pointer}.ptcPlusCapabilityContext{justify-content:space-between;text-align:start}.ptcPlusCapabilityContext svg{flex:none;color:var(--dsw-alias-label-tertiary)}.ptcPlusCapabilityWorkbench button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}
34
- .ptcPlusCapabilityEditorFields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:14px}.ptcPlusCapabilityField{display:flex;flex-direction:column;gap:6px;min-width:0;font-size:11px;color:var(--dsw-alias-label-secondary)}.ptcPlusCapabilityField>.ptcPlusSelectTrigger{width:100%;max-width:100%}.ptcPlusCapabilitySwitchRow{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px}.ptcPlusCapabilitySwitchText{display:flex;flex-direction:column;gap:3px;min-width:0}.ptcPlusCapabilitySwitchLabel{font-size:13px}.ptcPlusCapabilitySwitchHint{font-size:11px;color:var(--dsw-alias-label-tertiary)}@media(max-width:520px){.ptcPlusCapabilityEditorFields{grid-template-columns:minmax(0,1fr)}}.ptcPlusCapabilityNotice{padding:10px;border-radius:6px;background:var(--dsw-alias-bg-layer-2);font-size:12px;overflow-wrap:anywhere}.ptcPlusCapabilityEditorSection{margin-top:16px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2);min-width:0}.ptcPlusCapabilityEditorSection h5{margin:0 0 8px;font-size:11px;line-height:18px;font-weight:500;color:var(--dsw-alias-label-tertiary)}.ptcPlusCapabilityEditorSection>.ptcPlusCapabilityProse{margin:0;font-size:12px;line-height:20px;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusCapabilityEditorSection>.ptcPlusDetail{margin:0 0 8px}.ptcPlusCapabilityEmpty{padding:20px 10px;text-align:center}
34
+ .ptcPlusCapabilityEditorFields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:14px}
35
+ .ptcPlusPromptText{display:flex;flex-direction:column;gap:12px;min-width:0}
36
+ .ptcPlusPromptHeader{display:flex;align-items:flex-start;gap:8px;min-width:0}
37
+ .ptcPlusPromptHeaderIcon{display:inline-flex;align-items:center;justify-content:center;flex:none;width:20px;height:20px;color:var(--dsw-alias-label-secondary)}
38
+ .ptcPlusPromptHeaderBody{display:flex;flex-direction:column;gap:2px;min-width:0}
39
+ .ptcPlusPromptTitle{margin:0;font-size:15px;line-height:22px;font-weight:600;color:var(--dsw-alias-label-primary)}
40
+ .ptcPlusPromptSubtitle{margin:0;font-size:11px;line-height:18px;color:var(--dsw-alias-label-tertiary)}
41
+ .ptcPlusPromptCards{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
42
+ .ptcPlusPromptCard{display:flex;align-items:center;gap:10px;min-width:0;padding:10px 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-1)}
43
+ .ptcPlusPromptCardIcon{display:inline-flex;align-items:center;justify-content:center;flex:none;width:26px;height:26px;border-radius:6px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary)}
44
+ .ptcPlusPromptCardBody{display:flex;flex-direction:column;gap:1px;min-width:0}
45
+ .ptcPlusPromptCardLabel{font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary)}
46
+ .ptcPlusPromptCardValue,.ptcPlusPromptCardMeta{font-size:12px;line-height:18px;color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}
47
+ .ptcPlusPromptCardMeta{color:var(--dsw-alias-label-tertiary)}
48
+ .ptcPlusPromptStrip{margin:0;padding:6px 10px;border-radius:6px;background:var(--dsw-alias-bg-layer-2);font-size:11px;line-height:18px;color:var(--dsw-alias-label-secondary)}
49
+ .ptcPlusPromptIntro{margin:0;font-size:11px;line-height:17px;color:var(--dsw-alias-label-tertiary)}
50
+ .ptcPlusPromptTable{width:100%;border-collapse:collapse;table-layout:fixed;font-size:11.5px;line-height:18px;color:var(--dsw-alias-label-primary)}
51
+ .ptcPlusPromptTable th{padding:6px 8px;font-size:11px;font-weight:500;text-align:left;color:var(--dsw-alias-label-secondary);border-bottom:1px solid var(--dsw-alias-border-l2);white-space:nowrap}
52
+ .ptcPlusPromptTable td{padding:6.5px 8px;border-bottom:1px solid color-mix(in srgb,var(--dsw-alias-border-l2) 55%,transparent);vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
53
+ .ptcPlusPromptTable tbody tr:nth-child(even){background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 45%,transparent)}
54
+ .ptcPlusPromptTable tbody tr{cursor:pointer}
55
+ .ptcPlusPromptTable tbody tr:hover{background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 80%,transparent)}
56
+ .ptcPlusPromptTable tbody tr[data-selected=true]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4d6bfe) 10%,transparent)}
57
+ .ptcPlusPromptTable tbody tr:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:-2px}
58
+ .ptcPlusPromptColIndex{width:28px}.ptcPlusPromptColChannel{width:58px}.ptcPlusPromptColAnchor{width:24%}.ptcPlusPromptColPresence{width:11%}.ptcPlusPromptColBytes{width:28%}.ptcPlusPromptColReason{width:15%}.ptcPlusPromptColKind{width:12%}
59
+ .ptcPlusPromptIndex{font-family:var(--dsw-alias-font-mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace);font-size:10.5px;color:var(--dsw-alias-label-tertiary);text-align:right}
60
+ .ptcPlusPromptChannel{display:inline-flex;align-items:center;padding:0 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-2);font-size:10.5px;line-height:17px;color:var(--dsw-alias-label-secondary)}
61
+ .ptcPlusPromptAnchorId{font-family:var(--dsw-alias-font-mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace);font-size:11px;color:var(--dsw-alias-label-primary)}
62
+ .ptcPlusPromptPresence{display:inline-flex;align-items:center;padding:0 6px;border:1px solid var(--dsw-alias-border-l2);border-radius:4px;font-size:10.5px;line-height:16px;color:var(--dsw-alias-label-secondary)}
63
+ .ptcPlusPromptBytesCell{font-family:var(--dsw-alias-font-mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace);font-size:10.5px}
64
+ .ptcPlusPromptSplit{margin-left:4px;font-family:inherit;font-size:10px;color:var(--dsw-alias-label-tertiary)}
65
+ .ptcPlusPromptReasonCell,.ptcPlusPromptKindCell{font-size:10.5px;color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere}
66
+ .ptcPlusPromptTag{display:inline-flex;align-items:center;margin-left:6px;padding:0 5px;border:1px solid var(--dsw-alias-border-l2);border-radius:4px;font-size:10px;line-height:16px;color:var(--dsw-alias-label-secondary)}
67
+ .ptcPlusPromptHostRow{background:var(--dsw-alias-bg-layer-2);cursor:default}
68
+ .ptcPlusPromptPanels{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;align-items:stretch}
69
+ .ptcPlusPromptPanel{display:flex;flex-direction:column;gap:8px;min-width:0;padding:12px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px}
70
+ .ptcPlusPromptPanelTitle{margin:0;font-size:12px;line-height:18px;font-weight:600;color:var(--dsw-alias-label-primary)}
71
+ .ptcPlusPromptPanelBody,.ptcPlusPromptEditor{display:flex;flex-direction:column;gap:8px;min-width:0}
72
+ .ptcPlusPromptHint{margin:0;font-size:10.5px;line-height:17px;color:var(--dsw-alias-label-tertiary)}
73
+ .ptcPlusPromptChips{display:flex;flex-wrap:wrap;gap:6px;min-width:0}
74
+ .ptcPlusPromptChip{display:inline-flex;align-items:center;gap:4px;appearance:none;max-width:100%;padding:2px 8px;border:1px solid var(--dsw-alias-border-l2);border-radius:999px;background:var(--dsw-alias-bg-layer-1);font-size:10.5px;line-height:18px;color:var(--dsw-alias-label-primary);cursor:pointer}
75
+ .ptcPlusPromptChip[aria-pressed=true]{border-color:var(--dsw-alias-state-business-primary,#4d6bfe);background:var(--dsw-alias-state-business-primary,#4d6bfe);color:#fff}
76
+ .ptcPlusPromptChip[data-readonly=true]{cursor:default;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary)}
77
+ .ptcPlusPromptChipLabel{font-family:var(--dsw-alias-font-mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace);overflow-wrap:anywhere}
78
+ .ptcPlusPromptChipNote{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere}
79
+ .ptcPlusPromptChip[aria-pressed=true] .ptcPlusPromptChipNote{color:inherit;opacity:.85}
80
+ .ptcPlusPromptTextarea{width:100%;box-sizing:border-box;min-height:132px;resize:vertical;font-family:var(--dsw-alias-font-mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace);font-size:11px;line-height:18px;padding:8px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary)}
81
+ .ptcPlusPromptEditorFoot{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;min-width:0}
82
+ .ptcPlusPromptEditorActions{display:flex;gap:8px;margin-left:auto}
83
+ .ptcPlusPromptDiffList{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;min-width:0}
84
+ .ptcPlusPromptDiffRow{display:flex;align-items:flex-start;gap:8px;min-width:0}
85
+ .ptcPlusPromptDot{flex:none;width:7px;height:7px;margin-top:6px;border-radius:50%;background:var(--dsw-alias-state-success-primary,#22a06b)}
86
+ .ptcPlusPromptDot[data-tone="1"]{background:var(--dsw-alias-state-business-primary,#4d6bfe)}
87
+ .ptcPlusPromptDot[data-tone="2"]{background:var(--dsw-alias-state-warn-primary,#d98e04)}
88
+ .ptcPlusPromptDiffBody{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1 1 auto}
89
+ .ptcPlusPromptDiffHead{display:flex;align-items:baseline;justify-content:space-between;gap:8px;min-width:0}
90
+ .ptcPlusPromptDiffSlot{font-family:var(--dsw-alias-font-mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace);font-size:10.5px;color:var(--dsw-alias-label-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
91
+ .ptcPlusPromptDiffDelta{display:flex;align-items:center;gap:8px;font-family:var(--dsw-alias-font-mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace);font-size:10px;color:var(--dsw-alias-label-tertiary)}
92
+ .ptcPlusPromptDiffDelta button{font-family:inherit;font-size:10px}
93
+ .ptcPlusPromptActions{display:flex;justify-content:flex-end;gap:8px;margin-top:auto;padding-top:6px}
94
+
95
+ .ptcPlusPromptPaused{padding:8px 10px;border-radius:6px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-state-warn-primary);font-size:12px;line-height:18px;margin:0}
96
+ @media(max-width:900px){.ptcPlusPromptCards{grid-template-columns:repeat(2,minmax(0,1fr))}.ptcPlusPromptPanels{grid-template-columns:minmax(0,1fr)}}
35
97
  .ptcPlusPolicyRules{padding:14px;margin:12px 0;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-2)}.ptcPlusPolicyRules h4{margin:0}.ptcPlusPolicyRule{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:10px 0}.ptcPlusPolicyRule>strong{flex:1 1 100px;min-width:0;overflow-wrap:anywhere;font-size:12px}.ptcPlusPolicyRule>.ptcPlusCapabilityFilter{flex:1 1 160px}
36
98
  .ptcPlusContextLayout{display:grid;grid-template-columns:minmax(140px,27%) minmax(0,1fr);gap:20px;margin-top:16px}.ptcPlusContextNavigation{display:flex;flex-direction:column;gap:6px;padding:12px 12px 12px 0;border-right:1px solid var(--dsw-alias-border-l2)}.ptcPlusContextNavigation button{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:6px 10px;appearance:none;border:0;border-left:3px solid transparent;border-radius:4px;padding:14px 12px;background:transparent;color:var(--dsw-alias-label-primary);font:inherit;text-align:start;cursor:pointer}.ptcPlusContextNavigation [aria-selected=true]{border-left-color:var(--dsw-alias-state-business-primary,#4d6bfe);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4d6bfe) 6%,transparent);color:var(--dsw-alias-state-business-primary,#4d6bfe)}.ptcPlusContextState{font-size:11px;line-height:18px;white-space:nowrap;color:var(--dsw-alias-label-secondary)}.ptcPlusContextState[data-enabled=true]{color:var(--dsw-alias-state-success-primary)}.ptcPlusContextState[data-paused=true]{color:var(--dsw-alias-state-warn-primary)}.ptcPlusContextSummary{flex-basis:100%;min-width:0;font-size:11px;line-height:18px;color:var(--dsw-alias-label-secondary);white-space:normal;overflow-wrap:anywhere}.ptcPlusContextContent{min-width:0;padding:12px 0}.ptcPlusContextContent h4{font-size:16px;margin:0}.ptcPlusContextContent h5{font-size:13px;line-height:20px;margin:0 0 12px}.ptcPlusContextContent>.ptcPlusCapabilityFilter{margin-top:16px}.ptcPlusPolicyAllocation{margin:18px 0}.ptcPlusAllocationChoices{display:flex;flex-wrap:wrap;gap:16px}.ptcPlusAllocationChoices label{display:flex;align-items:center;gap:8px;font-size:12px}.ptcPlusContextQuota,.ptcPlusAllocationPreview{margin:16px 0;padding:12px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px}
37
99
  .ptcPlusCapabilityWorkbench .ptcPlusButton[data-kind=primary]{background:var(--dsw-alias-state-business-primary,#4d6bfe);color:var(--dsw-alias-bg-base,#fff);border-color:transparent}.ptcPlusCapabilityWorkbench summary{cursor:pointer;line-height:22px;font-size:12px}.ptcPlusCapabilityWorkbench summary:focus-visible,.ptcPlusCapabilityWorkbench button:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:2px}.ptcPlusCapabilitySessionTools{margin-top:18px;padding-top:10px;border-top:1px solid var(--dsw-alias-border-l2)}.ptcPlusCapabilityApply{display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px;margin:12px 0}.ptcPlusCapabilityApply>.ptcPlusCapabilityFilter{flex:1 1 200px}.ptcPlusCapabilityRefresh{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0}.ptcPlusCapabilityRefresh p{flex-basis:100%;margin:0;overflow-wrap:anywhere}.ptcPlusMenuUtilities .ptcPlusCapabilityRefresh{flex:1;align-self:stretch}.ptcPlusMenuUtilities .ptcPlusCapabilityRefresh>.ptcPlusMenuButton{width:100%}
@@ -207,6 +269,10 @@ const REPL_CONSOLE_CSS = `
207
269
  @media(max-width:560px){.ptcPlusConsole{padding:14px 12px}.ptcPlusBindingsModal.ptcPlusBindingsModal{width:calc(100vw - 16px);max-height:calc(100dvh - 16px)}.ptcPlusBindingsDialog{padding:16px;max-height:calc(100dvh - 16px)}.ptcPlusObservationFilters>.ptcPlusSelectTrigger{width:105px}.ptcPlusObservationTable th,.ptcPlusObservationTable td{padding:0 6px}.ptcPlusObservationValue{gap:3px}.ptcPlusObservationState{font-size:10px}.ptcPlusEditorHead{align-items:flex-start}.ptcPlusEditorHead>.ptcPlusBindingLifecycle{margin-left:auto}.ptcPlusSourceBody .cm-editor{height:300px}}
208
270
  .ptcPlusReplIdentity{grid-column:1}.ptcPlusReplReuse{flex:none;padding:0 5px;border-radius:999px;background:var(--dsw-alias-bg-layer-2,rgba(38,49,72,.06));color:var(--dsw-alias-label-tertiary,#74777d);font:500 10px/15px system-ui,sans-serif;white-space:nowrap}
209
271
  .ptcPlusObservationReuseTotal{font-size:13px;color:var(--dsw-alias-label-tertiary)}.ptcPlusObservationReuse{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-variant-numeric:tabular-nums}
272
+ .ptcPlusCapabilityIdentity{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:3px 8px;min-width:0}.ptcPlusCapabilityIdentityText{display:flex;flex-direction:column;gap:3px;min-width:0}.ptcPlusCapabilityPickHead{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:6px}.ptcPlusCapabilityPickHead .ptcPlusCapabilitySort{min-width:0}.ptcPlusPick{appearance:none;position:relative;flex:none;box-sizing:border-box;width:16px;height:16px;margin:0;border:1px solid var(--dsw-alias-border-l4);border-radius:4px;background:var(--dsw-alias-bg-layer-3);cursor:pointer}.ptcPlusPick:checked,.ptcPlusPick:indeterminate{border-color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-brand-primary)}.ptcPlusPick:checked::after{position:absolute;left:4px;top:1px;width:5px;height:9px;border:solid var(--dsw-alias-label-primary-foreground);border-width:0 2px 2px 0;content:'';transform:rotate(45deg)}.ptcPlusPick:indeterminate::after{position:absolute;left:3px;top:6px;width:8px;height:2px;border-radius:1px;background:var(--dsw-alias-label-primary-foreground);content:''}.ptcPlusPick:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:2px}.ptcPlusPick:disabled{cursor:not-allowed;opacity:.4}.ptcPlusCapabilityBatchCount{display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;padding:0 5px;border-radius:999px;background:var(--dsw-alias-state-business-primary,#4d6bfe);color:#fff;font-size:10px;line-height:16px}.ptcPlusCapabilityBlocked{display:flex;gap:8px;align-items:flex-start;margin:10px 24px 0;border:1px solid color-mix(in srgb,var(--dsw-alias-state-warn-primary,#a15c00) 30%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#a15c00) 8%,var(--dsw-alias-bg-layer-2));color:var(--dsw-alias-label-primary);font-weight:500}.ptcPlusCapabilityBlockedIcon{flex:none;margin-top:2px;color:var(--dsw-alias-state-warn-primary,#a15c00)}.ptcPlusSessionCapabilityDetail .ptcPlusCapabilityImpact{margin:6px 0 14px;font-size:12px;line-height:18px}
273
+ @media(max-width:650px){.ptcPlusCapabilityBlocked{margin-inline:14px}}@media(max-width:650px) and (max-height:480px){.ptcPlusCapabilityBlocked{margin:4px 6px 0;font-size:11px}}
274
+ @media(max-width:650px){.ptcPlusSessionCapabilityFooter button{font-size:11px;line-height:14px}}
275
+ @media(max-width:650px) and (max-height:480px){.ptcPlusSessionCapabilityFooter{grid-template-columns:repeat(4,minmax(0,1fr));gap:3px;padding:3px 6px}.ptcPlusSessionCapabilityFooter [role=status]{line-height:11px}.ptcPlusSessionCapabilityFooter button{font-size:10px;line-height:12px;padding:1px 10px}}
210
276
  `
211
277
 
212
278
  /**