dsh-ptc-plus 0.5.1 → 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 (58) hide show
  1. package/README.en.md +7 -3
  2. package/README.md +7 -3
  3. package/client.cjs +1467 -84
  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/0027-run-the-session-kernel-in-a-killable-helper-process.md +11 -1
  8. package/docs/adr/0032-own-session-log-facts-in-a-host-only-projection.md +31 -1
  9. package/docs/adr/0045-customize-model-visible-prompt-text.md +38 -0
  10. package/docs/adr/0046-gate-the-commit-with-the-semantic-evidence-tier.md +35 -0
  11. package/docs/adr/0047-store-journal-argument-digests-in-the-projection.md +88 -0
  12. package/docs/architecture.md +2 -2
  13. package/docs/client-ui.md +5 -2
  14. package/docs/durability-design.md +7 -1
  15. package/docs/releases/v0.5.2.md +79 -0
  16. package/docs/runtime-reference.md +36 -2
  17. package/docs/unmeasured-cell-recovery-repair-proposal.md +387 -0
  18. package/docs/verification.md +6 -2
  19. package/index.js +36 -15
  20. package/internal/bounded-literal.js +85 -0
  21. package/internal/capability-environment.js +162 -10
  22. package/internal/capability-plan.js +11 -8
  23. package/internal/cell-error.js +13 -0
  24. package/internal/config-spec.js +113 -2
  25. package/internal/direct-surface-owner.js +14 -10
  26. package/internal/edit-transport-owner.js +79 -14
  27. package/internal/isolated-worker.js +134 -17
  28. package/internal/kernel-worker.js +167 -3
  29. package/internal/legacy-cell-analysis.js +14 -2
  30. package/internal/legacy-repl-convenience.js +16 -3
  31. package/internal/projection-retention.js +238 -0
  32. package/internal/prompt-text.js +858 -0
  33. package/internal/recovery-tips.js +50 -11
  34. package/internal/rejected-cell-editor.js +3 -2
  35. package/internal/runtime-bridge-owner.js +1 -1
  36. package/internal/runtime-config.js +2 -0
  37. package/internal/runtime-contexts.js +14 -5
  38. package/internal/runtime-messages.js +43 -15
  39. package/internal/session-cell-executor.js +132 -11
  40. package/internal/session-journal-recovery.js +1009 -99
  41. package/internal/session-journal-schema.js +7 -5
  42. package/internal/session-journal.js +177 -14
  43. package/internal/session-log-view.js +111 -24
  44. package/internal/session-runtime.js +674 -33
  45. package/internal/session-state.js +27 -0
  46. package/internal/stateful-root-compiler.js +11 -0
  47. package/internal/stateful-root-runtime.js +17 -0
  48. package/internal/user-binding-console.js +7 -0
  49. package/internal/user-bindings-owner.js +3 -0
  50. package/internal/user-bindings.js +2 -2
  51. package/internal/validated-parse-repair.js +6 -1
  52. package/internal/worker-client.js +27 -4
  53. package/package.json +3 -1
  54. package/src/client-activity.js +24 -4
  55. package/src/client-capabilities-view.js +459 -24
  56. package/src/client-copy.js +163 -2
  57. package/src/client-repl-view.js +6 -1
  58. package/src/client-styles.js +64 -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": "已暂停",
@@ -222,7 +223,6 @@ const CHROME_COPY = Object.freeze({
222
223
  'capabilities.quick.apply': '提交并生效',
223
224
  'capabilities.quick.prefill': '填入命令草稿',
224
225
  'capabilities.card.recorded': '会话能力已更新。',
225
- 'capabilities.card.pending': '能力已准备,将在下一次获准的模型步骤生效。',
226
226
  'capabilities.card.paused': '能力与上下文已关闭;本会话沿用宿主能力。',
227
227
  'capabilities.card.off': '能力管理已关闭;本会话沿用宿主能力。',
228
228
  'capabilities.card.saved-only': '全局设置已保存,会话更新失败。{error}',
@@ -421,6 +421,88 @@ const CHROME_COPY = Object.freeze({
421
421
  'capabilities.refreshAcknowledged': 'DSH 已确认刷新操作。',
422
422
  'capabilities.settingsTabs': '能力设置页签',
423
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': "投影",
424
506
  'capabilities.tab.statistics': '使用统计',
425
507
  'capabilities.tab.budgets': '提示设置',
426
508
  'capabilities.tab.plans': '配置方案',
@@ -644,6 +726,7 @@ const CHROME_COPY = Object.freeze({
644
726
  "capabilities.combination.statistics": "Usage statistics",
645
727
  "capabilities.combination.recovery": "Prompt recovery",
646
728
  "capabilities.combination.preview": "Output excerpts",
729
+ "capabilities.combination.promptText": "Prompt text",
647
730
  "capabilities.combination.state.selected": "Selected",
648
731
  "capabilities.combination.state.unselected": "Not selected",
649
732
  "capabilities.combination.state.paused": "Paused",
@@ -854,7 +937,6 @@ const CHROME_COPY = Object.freeze({
854
937
  'capabilities.quick.apply': 'Submit and apply',
855
938
  'capabilities.quick.prefill': 'Fill command draft',
856
939
  'capabilities.card.recorded': 'Session capabilities updated.',
857
- 'capabilities.card.pending': 'Capabilities prepared; they take effect at the next accepted model step.',
858
940
  'capabilities.card.paused': 'Capabilities and context are off; this session stays with the Host capabilities.',
859
941
  'capabilities.card.off': 'Capability management is off; this session stays with the Host capabilities.',
860
942
  'capabilities.card.saved-only': 'Global settings saved; session update failed. {error}',
@@ -1053,6 +1135,85 @@ const CHROME_COPY = Object.freeze({
1053
1135
  'capabilities.refreshAcknowledged': 'DSH acknowledged the refresh operation.',
1054
1136
  'capabilities.settingsTabs': 'Capability settings tabs',
1055
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",
1056
1217
  'capabilities.tab.statistics': 'Usage statistics',
1057
1218
  'capabilities.tab.budgets': 'Prompt settings',
1058
1219
  'capabilities.tab.plans': 'Configurations',
@@ -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%}