dsh-ptc-plus 0.5.1 → 0.5.3

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 (85) hide show
  1. package/README.en.md +10 -4
  2. package/README.md +10 -4
  3. package/client.cjs +1623 -104
  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 +4 -2
  8. package/docs/adr/0019-plugin-settings-and-kill-switch.md +2 -2
  9. package/docs/adr/0023-global-user-bindings.md +12 -0
  10. package/docs/adr/0027-run-the-session-kernel-in-a-killable-helper-process.md +11 -1
  11. package/docs/adr/0028-attach-to-the-host-ptc-execution-seam.md +1 -1
  12. package/docs/adr/0030-serve-both-typert-codec-generations-from-one-codec.md +2 -2
  13. package/docs/adr/0032-own-session-log-facts-in-a-host-only-projection.md +31 -1
  14. package/docs/adr/0044-coexist-with-the-official-persistent-repl.md +4 -4
  15. package/docs/adr/0045-customize-model-visible-prompt-text.md +38 -0
  16. package/docs/adr/0046-gate-the-commit-with-the-semantic-evidence-tier.md +35 -0
  17. package/docs/adr/0047-store-journal-argument-digests-in-the-projection.md +88 -0
  18. package/docs/adr/0048-supersede-a-rewritten-cell.md +48 -0
  19. package/docs/adr/0049-prove-a-settlement-against-its-published-record.md +53 -0
  20. package/docs/adr/0050-read-host-surfaces-through-their-published-contract.md +48 -0
  21. package/docs/adr/README.md +7 -1
  22. package/docs/architecture.md +3 -3
  23. package/docs/client-ui.md +5 -2
  24. package/docs/durability-design.md +15 -2
  25. package/docs/installation.md +9 -9
  26. package/docs/releases/v0.5.2.md +91 -0
  27. package/docs/releases/v0.5.3.md +77 -0
  28. package/docs/runtime-reference.md +43 -3
  29. package/docs/unmeasured-cell-recovery-repair-proposal.md +387 -0
  30. package/docs/user-bindings.en.md +15 -0
  31. package/docs/user-bindings.md +15 -0
  32. package/docs/v0.5.3-goals.md +117 -0
  33. package/docs/verification.md +7 -3
  34. package/index.js +100 -31
  35. package/internal/binding-adoption.js +136 -0
  36. package/internal/bounded-literal.js +85 -0
  37. package/internal/capability-command-receipt.js +18 -4
  38. package/internal/capability-delivery-proof.js +70 -0
  39. package/internal/capability-environment.js +200 -11
  40. package/internal/capability-plan.js +11 -8
  41. package/internal/cell-error.js +13 -0
  42. package/internal/config-spec.js +126 -6
  43. package/internal/cordis-tools-owner.js +2 -1
  44. package/internal/direct-surface-owner.js +39 -21
  45. package/internal/edit-transport-owner.js +81 -15
  46. package/internal/execution-provider-owner.js +6 -0
  47. package/internal/execution-seam-compat.js +25 -0
  48. package/internal/host-tool-sdk.js +308 -0
  49. package/internal/isolated-worker.js +134 -17
  50. package/internal/kernel-worker.js +167 -3
  51. package/internal/legacy-cell-analysis.js +14 -2
  52. package/internal/legacy-repl-convenience.js +16 -3
  53. package/internal/official-repl-priority.js +31 -10
  54. package/internal/program-bindings.js +12 -1
  55. package/internal/projection-retention.js +238 -0
  56. package/internal/prompt-text.js +858 -0
  57. package/internal/recovery-tips.js +50 -11
  58. package/internal/rejected-cell-editor.js +3 -2
  59. package/internal/repl-memory-projection.js +21 -2
  60. package/internal/runtime-bridge-owner.js +114 -9
  61. package/internal/runtime-config.js +2 -0
  62. package/internal/runtime-contexts.js +14 -5
  63. package/internal/runtime-messages.js +48 -15
  64. package/internal/session-cell-executor.js +132 -11
  65. package/internal/session-journal-recovery.js +1204 -116
  66. package/internal/session-journal-schema.js +10 -5
  67. package/internal/session-journal.js +214 -14
  68. package/internal/session-log-view.js +133 -26
  69. package/internal/session-runtime.js +746 -38
  70. package/internal/session-state.js +27 -0
  71. package/internal/stateful-root-compiler.js +11 -0
  72. package/internal/stateful-root-runtime.js +17 -0
  73. package/internal/user-binding-console.js +7 -0
  74. package/internal/user-bindings-owner.js +112 -6
  75. package/internal/user-bindings.js +2 -2
  76. package/internal/validated-parse-repair.js +6 -1
  77. package/internal/worker-client.js +27 -4
  78. package/package.json +16 -6
  79. package/src/client-activity.js +24 -4
  80. package/src/client-capabilities-view.js +504 -27
  81. package/src/client-copy.js +187 -2
  82. package/src/client-indicator-view.js +2 -1
  83. package/src/client-repl-view.js +35 -11
  84. package/src/client-styles.js +64 -2
  85. package/src/client.js +3 -1
@@ -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}',
@@ -244,6 +244,17 @@ const CHROME_COPY = Object.freeze({
244
244
  'capabilities.receipt.off': '能力管理已关闭;会话 {session} 沿用宿主能力。',
245
245
  'capabilities.receipt.unavailable': '请选择仍活跃的 PTC 会话。',
246
246
  'capabilities.receipt.usage': '使用 /capabilities 查看,或 /capabilities refresh 同步已保存设置。',
247
+ 'capabilities.proof.title': '三层事实',
248
+ 'capabilities.proof.line': '已保存:{saved};已投递:{delivery};已可用:{usability}。',
249
+ 'capabilities.proof.saved.yes': '是,全局设置记录了这项选择',
250
+ 'capabilities.proof.saved.no': '否,这条命令没有改动全局设置',
251
+ 'capabilities.proof.delivery.delivered': '是,模型可见目录已在受理的步骤发布该项',
252
+ 'capabilities.proof.delivery.pending': '尚未,已保存的设置要到下一个受理步骤才进入目录',
253
+ 'capabilities.proof.delivery.absent': '否,目录没有列出该项,模型没有收到它',
254
+ 'capabilities.proof.usability.proven': '已证明,本会话有完成的执行取到了它',
255
+ 'capabilities.proof.usability.unproven': '未证明,本会话没有完成的执行取到过它;保存或发布都不构成证明',
256
+ 'capabilities.proof.observed': '来自 {command} 返回的收据。',
257
+ 'capabilities.proof.unobserved': '本面板还没有这项能力的投递与可用性证据;应用一次改动,或回到会话查看命令收据。',
247
258
  'bindings.toggleEnabled': '已保存“{name}”的启用选择;模型目录在下一次获准步骤更新,程序值尚未证明初始化。',
248
259
  'bindings.toggleDisabled': '已保存“{name}”的停用选择;模型目录在下一次获准步骤撤销,不撤销已经发生的效果。',
249
260
  'capabilities.observationGroup': '只读会话观察',
@@ -421,6 +432,88 @@ const CHROME_COPY = Object.freeze({
421
432
  'capabilities.refreshAcknowledged': 'DSH 已确认刷新操作。',
422
433
  'capabilities.settingsTabs': '能力设置页签',
423
434
  'capabilities.tab.manual': '能力配置',
435
+ 'capabilities.tab.prompt': "提示文本",
436
+ 'capabilities.title.prompt': "模型可见的固定提示文本",
437
+ 'capabilities.prompt.title': "能力与上下文 · 提示文本",
438
+ 'capabilities.prompt.subtitle': "模型可见上下文统一装配台 · 全部在册",
439
+ 'capabilities.prompt.bytesPair': "{bytes} B({kb} KB)",
440
+ 'capabilities.prompt.slotCounts': '已测 {bytes} B · 未测槽 {unmeasured} · 动态槽 {dynamic}',
441
+ 'capabilities.prompt.cardMetaAnchors': "{count} 个锚点",
442
+ 'capabilities.prompt.strip': "未纳管 {anchors} 个锚点 · 合计 {bytes} B({kb} KB)· 共 {total} 个锚点",
443
+ 'capabilities.prompt.rowExpand': "第 {index} 行展开",
444
+ 'capabilities.prompt.rowExpandHint': "选择上表的一行,在这里编辑它的槽位。",
445
+ 'capabilities.prompt.bytesOfLimit': "{used} / {max} B(槽上限)",
446
+ 'capabilities.prompt.unwiredTag': "通道未接通",
447
+ 'capabilities.prompt.diffEmpty': "还没有待保存的改动。",
448
+ 'capabilities.prompt.diffBytes': "{before} B → {after} B({delta})",
449
+ 'capabilities.prompt.save': "保存",
450
+ 'capabilities.prompt.cancel': "取消",
451
+ 'capabilities.prompt.intro': "按锚点与槽位覆盖插件写给模型的固定文本;每一行标注所属通道、存在条件与只读原因,生效时机随通道不同(下一次请求、新会话或下次触发)。编辑框留空表示恢复内置文本;“省略该段”只在可省略的槽位上出现,表示不投递那一段。协议文本、由配置或运行事实生成的句子,以及你自己写的绑定说明只读展示。",
452
+ 'capabilities.prompt.bytes': "{used} / {max} 字节",
453
+ 'capabilities.prompt.reset': "恢复内置",
454
+ 'capabilities.prompt.omit': "省略该段",
455
+ 'capabilities.prompt.omitted': "该段已省略(派生策略句仍会附加)",
456
+ 'capabilities.prompt.unreadable': "当前文档无法解析:{error};面板按内置文本显示,保存后可恢复。",
457
+ 'capabilities.prompt.reported': "{asset}:{reason}",
458
+ 'capabilities.prompt.ownerEditable': "可编辑",
459
+ 'capabilities.prompt.ownerReadOnly': "只读纳管",
460
+ 'capabilities.prompt.ownerOther': "他人所有",
461
+ 'capabilities.prompt.ownerMixed': "混合",
462
+ 'capabilities.prompt.cardBytes': "{bytes} B",
463
+ 'capabilities.prompt.cardMixed': "{count} 个混合锚点",
464
+ 'capabilities.prompt.templateBytes': "模板字节(孔在渲染时填充)",
465
+ 'capabilities.prompt.aggregateFrozen': "聚合冻结:条目文本可改,增删条目会移动相邻字节",
466
+ 'capabilities.prompt.totals': "已测 {bytes} B · 共 {anchors} 个锚点 · 未测槽 {unmeasured} · 动态槽 {dynamic}",
467
+ 'capabilities.prompt.cardDynamic': "{count} 个动态槽",
468
+ 'capabilities.prompt.aggregateSlot': "聚合容器(自身无字节)",
469
+ 'capabilities.prompt.cardUnwired': "—({count} 个槽未接通)",
470
+ 'capabilities.prompt.unwiredRow': "通道未接通 · {slots} 个槽未测",
471
+ 'capabilities.prompt.unwiredSummary': "{anchors} 个锚点、{slots} 个槽的通道尚未接通;它们不计入字节合计。",
472
+ 'capabilities.prompt.retention': '检查点保留:最近 {runs} 格 · 载荷 {bytes} · 簇上限 {clusters}。调大会让更早的计算可直接编辑,但检查点更大。',
473
+ 'capabilities.prompt.retentionUnlimited': '不限制',
474
+ 'capabilities.prompt.dynamicSlot': "动态(装配期实测,无字面默认)",
475
+ 'capabilities.prompt.anchorMeta': "{channel} · {presence} · {owner}",
476
+ 'capabilities.prompt.slotBytes': "{bytes} B · {owner} 类",
477
+ 'capabilities.prompt.unmeasuredSlot': "未测(无可核对字节)",
478
+ 'capabilities.prompt.readonlyReason': "{reason} · {kind}",
479
+ 'capabilities.prompt.slotSelector': "{slot}({bytes} B)",
480
+ 'capabilities.prompt.chipMeta': "槽位 {owner}",
481
+ 'capabilities.prompt.paused': "提示文本已暂停:配置里的提示文本开关关闭,改写的句子不会进入请求、工具说明、能力方案与提示;已保存的改写保留,重新开启后生效。",
482
+ 'capabilities.prompt.pausedBytes': "{bytes} B(已暂停,未应用)",
483
+ 'capabilities.prompt.columnBytesSplit': "字节(按槽拆分)",
484
+ 'capabilities.prompt.columnReason': "原因码",
485
+ 'capabilities.prompt.columnKind': "槽位种类",
486
+ 'capabilities.prompt.columnSlots': "槽位",
487
+ 'capabilities.prompt.anchorBytesSplit': "({parts})",
488
+ 'capabilities.prompt.diffTitle': "保存前差异预览",
489
+ 'capabilities.prompt.diffDelta': "{delta} 字节",
490
+ 'capabilities.prompt.effectPrompt': "待下次装配生效",
491
+ 'capabilities.prompt.effectInstall': "新会话安装时生效",
492
+ 'capabilities.prompt.effectPlan': "新会话或 refresh 生效",
493
+ 'capabilities.prompt.effectTrigger': "下次触发时生效",
494
+ 'capabilities.prompt.columnChannel': "通道",
495
+ 'capabilities.prompt.columnAnchor': "锚点",
496
+ 'capabilities.prompt.columnPresence': "存在条件",
497
+ 'capabilities.prompt.columnBytes': "字节",
498
+ 'capabilities.prompt.columnStatus': "状态",
499
+ 'capabilities.prompt.ownerHost': "DSH 宿主",
500
+ 'capabilities.prompt.hostSection': "宿主段落,只读:插件能看到段名与来源,不能在这里改写",
501
+ 'capabilities.prompt.hostUnavailable': "宿主系统提示(插件不可枚举)",
502
+ 'capabilities.prompt.hostPresenceEvery': "每个请求",
503
+ 'capabilities.prompt.hostPresenceCapabilities': "能力管理启用",
504
+ 'capabilities.prompt.readonlySummary': "{count} 个只读槽",
505
+ // Reason codes and slot kinds are registry identifiers; the pane shows a
506
+ // localized label and keeps the raw code in the element title, so a Chinese UI
507
+ // never reads like a dump of registry constants.
508
+ 'capabilities.prompt.reason.factDerived': "事实派生",
509
+ 'capabilities.prompt.reason.aggregateFrozen': "聚合冻结",
510
+ 'capabilities.prompt.reason.protocolExactText': "协议·精确文本",
511
+ 'capabilities.prompt.reason.protocolStructural': "协议·结构",
512
+ 'capabilities.prompt.reason.shadowsHost': "遮蔽宿主",
513
+ 'capabilities.prompt.reason.otherOwner': "他人所有",
514
+ 'capabilities.prompt.kind.literal': "字面量",
515
+ 'capabilities.prompt.kind.aggregate': "聚合",
516
+ 'capabilities.prompt.kind.projected': "投影",
424
517
  'capabilities.tab.statistics': '使用统计',
425
518
  'capabilities.tab.budgets': '提示设置',
426
519
  'capabilities.tab.plans': '配置方案',
@@ -602,6 +695,7 @@ const CHROME_COPY = Object.freeze({
602
695
  'memory.globalCount': '{count} 个全局条目',
603
696
  'memory.empty': '当前没有可复用绑定',
604
697
  'memory.unavailable': '当前绑定状态尚不可确认',
698
+ 'memory.previousRuntime': '这份清单来自上一个运行期,不再代表当前环境;执行一格即可重新观察',
605
699
  'memory.more': '另有 {count} 个绑定未显示',
606
700
  'memory.reuseCount': '复用 {count} 次',
607
701
  'memory.reuseTotal': '共复用 {count} 次',
@@ -644,6 +738,7 @@ const CHROME_COPY = Object.freeze({
644
738
  "capabilities.combination.statistics": "Usage statistics",
645
739
  "capabilities.combination.recovery": "Prompt recovery",
646
740
  "capabilities.combination.preview": "Output excerpts",
741
+ "capabilities.combination.promptText": "Prompt text",
647
742
  "capabilities.combination.state.selected": "Selected",
648
743
  "capabilities.combination.state.unselected": "Not selected",
649
744
  "capabilities.combination.state.paused": "Paused",
@@ -854,7 +949,6 @@ const CHROME_COPY = Object.freeze({
854
949
  'capabilities.quick.apply': 'Submit and apply',
855
950
  'capabilities.quick.prefill': 'Fill command draft',
856
951
  'capabilities.card.recorded': 'Session capabilities updated.',
857
- 'capabilities.card.pending': 'Capabilities prepared; they take effect at the next accepted model step.',
858
952
  'capabilities.card.paused': 'Capabilities and context are off; this session stays with the Host capabilities.',
859
953
  'capabilities.card.off': 'Capability management is off; this session stays with the Host capabilities.',
860
954
  'capabilities.card.saved-only': 'Global settings saved; session update failed. {error}',
@@ -876,6 +970,17 @@ const CHROME_COPY = Object.freeze({
876
970
  'capabilities.receipt.off': 'Capability management is off; session {session} stays with the Host capabilities.',
877
971
  'capabilities.receipt.unavailable': 'Select an active PTC session.',
878
972
  'capabilities.receipt.usage': 'Use /capabilities to inspect or /capabilities refresh to apply saved settings.',
973
+ 'capabilities.proof.title': 'Three separate facts',
974
+ 'capabilities.proof.line': 'Saved: {saved}; delivered: {delivery}; usable: {usability}.',
975
+ 'capabilities.proof.saved.yes': 'yes, the global configuration records this choice',
976
+ 'capabilities.proof.saved.no': 'no, this command did not change the global configuration',
977
+ 'capabilities.proof.delivery.delivered': 'yes, the model-visible catalog published it at an accepted step',
978
+ 'capabilities.proof.delivery.pending': 'not yet, the saved configuration reaches the catalog at the next accepted step',
979
+ 'capabilities.proof.delivery.absent': 'no, the catalog does not list it, so the model never received it',
980
+ 'capabilities.proof.usability.proven': 'proven, a completed execution in this session reached it',
981
+ 'capabilities.proof.usability.unproven': 'unproven, no completed execution in this session reached it; a save or a published entry does not prove it',
982
+ 'capabilities.proof.observed': 'From the receipt {command} returned.',
983
+ 'capabilities.proof.unobserved': 'This panel holds no delivery or usability evidence for this capability yet; apply a change, or read the command receipt in the conversation.',
879
984
  'bindings.toggleEnabled': 'Enabled “{name}” in saved configuration. The model catalog updates at the next accepted step; worker initialization is not yet established.',
880
985
  'bindings.toggleDisabled': 'Disabled “{name}” in saved configuration. The model catalog withdraws it at the next accepted step; earlier effects are unchanged.',
881
986
  'capabilities.observationGroup': 'Read-only session observation',
@@ -1053,6 +1158,85 @@ const CHROME_COPY = Object.freeze({
1053
1158
  'capabilities.refreshAcknowledged': 'DSH acknowledged the refresh operation.',
1054
1159
  'capabilities.settingsTabs': 'Capability settings tabs',
1055
1160
  'capabilities.tab.manual': 'Capability configuration',
1161
+ 'capabilities.tab.prompt': "Prompt text",
1162
+ 'capabilities.title.prompt': "Fixed prompt text the model reads",
1163
+ 'capabilities.prompt.title': "Capabilities & Context · Prompt text",
1164
+ 'capabilities.prompt.subtitle': "One surface for the model-visible context · everything on record",
1165
+ 'capabilities.prompt.bytesPair': "{bytes} B ({kb} KB)",
1166
+ 'capabilities.prompt.slotCounts': 'Measured {bytes} B · {unmeasured} unmeasured slots · {dynamic} dynamic slots',
1167
+ 'capabilities.prompt.cardMetaAnchors': "{count} anchors",
1168
+ 'capabilities.prompt.strip': "{anchors} anchors not wired · {bytes} B ({kb} KB) total · {total} anchors",
1169
+ 'capabilities.prompt.rowExpand': "Row {index} expanded",
1170
+ 'capabilities.prompt.rowExpandHint': "Select a row above to edit its slots here.",
1171
+ 'capabilities.prompt.bytesOfLimit': "{used} / {max} B (slot limit)",
1172
+ 'capabilities.prompt.unwiredTag': "channel not wired",
1173
+ 'capabilities.prompt.diffEmpty': "No pending changes.",
1174
+ 'capabilities.prompt.diffBytes': "{before} B → {after} B ({delta})",
1175
+ 'capabilities.prompt.save': "Save",
1176
+ 'capabilities.prompt.cancel': "Cancel",
1177
+ '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.",
1178
+ 'capabilities.prompt.bytes': "{used} / {max} bytes",
1179
+ 'capabilities.prompt.reset': "Use built-in",
1180
+ 'capabilities.prompt.omit': "Omit this paragraph",
1181
+ 'capabilities.prompt.omitted': "This paragraph is omitted; derived policy sentences are still appended",
1182
+ 'capabilities.prompt.unreadable': "The stored document cannot be parsed: {error}. The panel shows built-in text; saving restores it.",
1183
+ 'capabilities.prompt.reported': "{asset}: {reason}",
1184
+ 'capabilities.prompt.ownerEditable': "Editable",
1185
+ 'capabilities.prompt.ownerReadOnly': "Read-only, managed",
1186
+ 'capabilities.prompt.ownerOther': "Owned elsewhere",
1187
+ 'capabilities.prompt.ownerMixed': "Mixed",
1188
+ 'capabilities.prompt.cardBytes': "{bytes} B",
1189
+ 'capabilities.prompt.cardMixed': "{count} mixed anchor(s)",
1190
+ 'capabilities.prompt.templateBytes': "template bytes (holes filled at render time)",
1191
+ 'capabilities.prompt.aggregateFrozen': "Frozen item set: item text is editable, adding or removing an item moves neighbouring bytes",
1192
+ 'capabilities.prompt.totals': "measured {bytes} B · {anchors} anchors · unmeasured slots {unmeasured} · dynamic slots {dynamic}",
1193
+ 'capabilities.prompt.cardDynamic': "{count} dynamic slots",
1194
+ 'capabilities.prompt.aggregateSlot': "aggregate container (owns no bytes)",
1195
+ 'capabilities.prompt.cardUnwired': "— ({count} slots not connected)",
1196
+ 'capabilities.prompt.unwiredRow': "channel not connected · {slots} slots unmeasured",
1197
+ 'capabilities.prompt.unwiredSummary': "{anchors} anchors and {slots} slots have no connected channel; they are excluded from the byte total.",
1198
+ 'capabilities.prompt.retention': 'Checkpoint retention: newest {runs} cells · {bytes} payload · {clusters} clusters. A larger window keeps older cells editable but grows the checkpoint.',
1199
+ 'capabilities.prompt.retentionUnlimited': 'unlimited',
1200
+ 'capabilities.prompt.dynamicSlot': "dynamic (measured at assembly; no literal default)",
1201
+ 'capabilities.prompt.anchorMeta': "{channel} · {presence} · {owner}",
1202
+ 'capabilities.prompt.slotBytes': "{bytes} B · owner {owner}",
1203
+ 'capabilities.prompt.unmeasuredSlot': "unmeasured (no bytes to reconcile)",
1204
+ 'capabilities.prompt.readonlyReason': "{reason} · {kind}",
1205
+ 'capabilities.prompt.slotSelector': "{slot} ({bytes} B)",
1206
+ 'capabilities.prompt.chipMeta': "slot {owner}",
1207
+ '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.",
1208
+ 'capabilities.prompt.pausedBytes': "{bytes} B (paused, not applied)",
1209
+ 'capabilities.prompt.columnBytesSplit': "Bytes (per slot)",
1210
+ 'capabilities.prompt.columnReason': "Reason code",
1211
+ 'capabilities.prompt.columnKind': "Slot kind",
1212
+ 'capabilities.prompt.columnSlots': "Slots",
1213
+ 'capabilities.prompt.anchorBytesSplit': "({parts})",
1214
+ 'capabilities.prompt.diffTitle': "Pending changes before saving",
1215
+ 'capabilities.prompt.diffDelta': "{delta} bytes",
1216
+ 'capabilities.prompt.effectPrompt': "applies on the next assembly",
1217
+ 'capabilities.prompt.effectInstall': "applies at the next agent install",
1218
+ 'capabilities.prompt.effectPlan': "applies on a new session or refresh",
1219
+ 'capabilities.prompt.effectTrigger': "applies on the next trigger",
1220
+ 'capabilities.prompt.columnChannel': "Channel",
1221
+ 'capabilities.prompt.columnAnchor': "Anchor",
1222
+ 'capabilities.prompt.columnPresence': "Presence",
1223
+ 'capabilities.prompt.columnBytes': "Bytes",
1224
+ 'capabilities.prompt.columnStatus': "Status",
1225
+ 'capabilities.prompt.ownerHost': "DSH host",
1226
+ 'capabilities.prompt.hostSection': "Host-owned section, read-only: the plugin can name it and read its bytes, but cannot rewrite it here",
1227
+ 'capabilities.prompt.hostUnavailable': "Host system prompt (not enumerable by the plugin)",
1228
+ 'capabilities.prompt.hostPresenceEvery': "every request",
1229
+ 'capabilities.prompt.hostPresenceCapabilities': "capability management enabled",
1230
+ 'capabilities.prompt.readonlySummary': "{count} read-only slot(s)",
1231
+ 'capabilities.prompt.reason.factDerived': "fact-derived",
1232
+ 'capabilities.prompt.reason.aggregateFrozen': "aggregate-frozen",
1233
+ 'capabilities.prompt.reason.protocolExactText': "protocol-exact-text",
1234
+ 'capabilities.prompt.reason.protocolStructural': "protocol-structural",
1235
+ 'capabilities.prompt.reason.shadowsHost': "shadows-host",
1236
+ 'capabilities.prompt.reason.otherOwner': "other-owner",
1237
+ 'capabilities.prompt.kind.literal': "literal",
1238
+ 'capabilities.prompt.kind.aggregate': "aggregate",
1239
+ 'capabilities.prompt.kind.projected': "projected",
1056
1240
  'capabilities.tab.statistics': 'Usage statistics',
1057
1241
  'capabilities.tab.budgets': 'Prompt settings',
1058
1242
  'capabilities.tab.plans': 'Configurations',
@@ -1234,6 +1418,7 @@ const CHROME_COPY = Object.freeze({
1234
1418
  'memory.globalCount': '{count} global entries',
1235
1419
  'memory.empty': 'No reusable bindings',
1236
1420
  'memory.unavailable': 'Current binding state cannot be confirmed',
1421
+ 'memory.previousRuntime': 'This inventory came from a previous runtime and no longer describes the current environment; run a cell to observe it again',
1237
1422
  'memory.more': '{count} more bindings not shown',
1238
1423
  // Number-neutral so a single reuse stays grammatical without a plural rule.
1239
1424
  'memory.reuseCount': 'reused {count}\u00d7',
@@ -226,7 +226,7 @@ export function createIndicatorView(React, deps) {
226
226
  }
227
227
  }
228
228
  }, [cancelClose, cancelOpen, schedulePlacement])
229
- const memory = useObservedReplMemory({ sessionId, projected: projectionMemory,
229
+ const { memory, provenance } = useObservedReplMemory({ sessionId, projected: projectionMemory,
230
230
  active: expanded && sessionUsesPtcPreset(preset) && featureEnabled(settings, 'plugin'),
231
231
  elementRef: popoverRef, observeRepl })
232
232
  if (!sessionUsesPtcPreset(preset) || !featureEnabled(settings, 'plugin')) return null
@@ -251,6 +251,7 @@ export function createIndicatorView(React, deps) {
251
251
  }, h('span', { className: 'ptcPlusActiveLabel' }, 'PTC Plus')),
252
252
  h(ReplMemoryCard, {
253
253
  memory,
254
+ provenance,
254
255
  globalEnabled,
255
256
  globalBindings,
256
257
  loadGlobalBinding: id => callUserBindings('load', { id }),
@@ -7,7 +7,7 @@ import { isHostComponent, isHostIconComponent } from './client-host-compat.js'
7
7
  */
8
8
  export function createReplView(React, deps) {
9
9
  const {
10
- CodeBlock, Select, featureEnabled, normalizeReplMemorySnapshot,
10
+ CodeBlock, Select, featureEnabled, normalizeReplMemorySnapshot, normalizeReplMemoryView,
11
11
  unavailableReplMemorySnapshot, useSessionPreset, sessionUsesPtcPreset,
12
12
  useWorkbenchController, UserBindingsWorkbench,
13
13
  icons: { search: IconSearchOutline16, chevron: IconChevronDownOutline14 },
@@ -16,16 +16,37 @@ export function createReplView(React, deps) {
16
16
 
17
17
  function ReplComposer() { return null }
18
18
 
19
+ /**
20
+ * The projection's own observation, marked with the runtime that produced it.
21
+ *
22
+ * Freshness and provenance are different questions. A projection refresh inside
23
+ * one runtime can drop the memory while the observation still describes that
24
+ * runtime's environment, and falling back to the empty snapshot there would flip
25
+ * a populated panel to "cannot be confirmed" for no visible reason. A snapshot
26
+ * carrying a different runtime is the opposite case: the environment it describes
27
+ * no longer exists, so the panel must say that instead of showing it as current.
28
+ */
19
29
  function useObservedReplMemory({ sessionId, projected, active, elementRef, observeRepl }) {
20
- const memory = React.useMemo(() => {
21
- try { return normalizeReplMemorySnapshot(projected) } catch { return unavailableReplMemorySnapshot() }
30
+ const view = React.useMemo(() => {
31
+ try { return normalizeReplMemoryView(projected) } catch { return undefined }
22
32
  }, [projected])
33
+ const memory = view?.memory ?? unavailableReplMemorySnapshot()
23
34
  const [observed, setObserved] = React.useState(null)
24
35
  React.useEffect(() => active && typeof observeRepl === 'function'
25
36
  ? observeRepl(sessionId, elementRef.current, memory,
26
- value => setObserved({ sessionId, source: memory, value }))
27
- : undefined, [active, observeRepl, sessionId, memory, elementRef])
28
- return observed?.sessionId === sessionId && observed.source === memory ? observed.value : memory
37
+ value => setObserved({ sessionId, runtime: view?.runtime, source: memory, value }))
38
+ : undefined, [active, observeRepl, sessionId, memory, view, elementRef])
39
+ if (observed?.sessionId !== sessionId) return { memory, provenance: 'current' }
40
+ if (view !== undefined && observed.runtime !== view.runtime
41
+ && !(observed.runtime === undefined && view.runtime === undefined)) {
42
+ return { memory, provenance: 'previous-runtime' }
43
+ }
44
+ // Same runtime: the observation is a fresher reading of the same environment,
45
+ // so it outlives a projection refresh that lost the inventory.
46
+ if (observed.runtime === view?.runtime && !memory.available && observed.value?.available === true) {
47
+ return { memory: observed.value, provenance: 'refreshed' }
48
+ }
49
+ return { memory: observed.source === memory ? observed.value : memory, provenance: 'current' }
29
50
  }
30
51
 
31
52
  function ReplBindingInspector({ entry, preview, t }) {
@@ -45,7 +66,7 @@ export function createReplView(React, deps) {
45
66
  : h('p', { className: 'ptcPlusObservationUnavailable' }, t(preview === undefined ? 'console.unobservedValue' : 'console.unreadable')))
46
67
  }
47
68
 
48
- function ReplSessionBindings({ memory, t }) {
69
+ function ReplSessionBindings({ memory, provenance, t }) {
49
70
  const [query, setQuery] = React.useState('')
50
71
  const [kind, setKind] = React.useState('all')
51
72
  const [selectedName, setSelectedName] = React.useState(null)
@@ -65,7 +86,8 @@ export function createReplView(React, deps) {
65
86
  h('span', { className: 'ptcPlusObservationTime' }, observation === undefined
66
87
  ? t('console.unobserved') : t('console.observed', { time: new Date(observation.at).toLocaleString() }))),
67
88
  memory.entries.length === 0 ? h('div', { className: 'ptcPlusSessionEmpty' },
68
- t(memory.available ? 'memory.empty' : 'memory.unavailable'))
89
+ t(!memory.available ? provenance === 'previous-runtime' ? 'memory.previousRuntime' : 'memory.unavailable'
90
+ : 'memory.empty'))
69
91
  : h('div', { className: 'ptcPlusObservationGrid', 'data-empty': selected === undefined },
70
92
  h('div', { className: 'ptcPlusObservationCatalog' },
71
93
  h('div', { className: 'ptcPlusObservationFilters' },
@@ -110,13 +132,13 @@ export function createReplView(React, deps) {
110
132
  const workbench = useWorkbenchController({ enabled: globalEnabled, active: true, callUserBindings })
111
133
  const eligible = featureEnabled(settings, 'replView') && sessionUsesPtcPreset(preset)
112
134
  const observationRegion = React.useRef(null)
113
- const memory = useObservedReplMemory({ sessionId, projected, active: eligible,
135
+ const { memory, provenance } = useObservedReplMemory({ sessionId, projected, active: eligible,
114
136
  elementRef: observationRegion, observeRepl })
115
137
  React.useEffect(() => eligible ? hideComposer(sessionId) : undefined, [eligible, hideComposer, sessionId])
116
138
  if (!eligible) return null
117
139
  return h('div', { className: 'ptcPlusConsole', 'data-conversation-composer-overlay': '' },
118
140
  h('div', { className: 'ptcPlusConsoleSection', ref: observationRegion }, h(ReplSessionBindings, {
119
- key: sessionId, memory, t })),
141
+ key: sessionId, memory, provenance, t })),
120
142
  globalEnabled ? h('div', { className: 'ptcPlusConsoleSection ptcPlusBindingsSurface' },
121
143
  h(UserBindingsWorkbench, { controller: workbench, t, headingLabel: t('console.global') })) : null)
122
144
  }
@@ -156,6 +178,7 @@ export function createReplView(React, deps) {
156
178
 
157
179
  function ReplMemoryCard({
158
180
  memory,
181
+ provenance,
159
182
  globalEnabled,
160
183
  globalBindings,
161
184
  loadGlobalBinding,
@@ -241,7 +264,8 @@ export function createReplView(React, deps) {
241
264
  )))
242
265
  )
243
266
  : !memory.available
244
- ? h('span', { className: 'ptcPlusReplEmpty' }, t('memory.unavailable'))
267
+ ? h('span', { className: 'ptcPlusReplEmpty' }, t(provenance === 'previous-runtime'
268
+ ? 'memory.previousRuntime' : 'memory.unavailable'))
245
269
  : memory.entries.length === 0
246
270
  ? h('span', { className: 'ptcPlusReplEmpty' }, t('memory.empty'))
247
271
  : h('ul', { className: 'ptcPlusReplList' }, memory.entries.map((binding, index) => {
@@ -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%}
package/src/client.js CHANGED
@@ -24,6 +24,7 @@ import {
24
24
  } from './client-host-compat.js'
25
25
  import {
26
26
  normalizeReplMemorySnapshot,
27
+ normalizeReplMemoryView,
27
28
  unavailableReplMemorySnapshot,
28
29
  } from '../internal/repl-memory-projection.js'
29
30
  import { createBindingReviews } from './client-binding-review.js'
@@ -212,7 +213,8 @@ export function createClientPlugin(require) {
212
213
  icons: { search: IconSearchOutline16, chevron: IconChevronDownOutline14 },
213
214
  })
214
215
  const { ReplComposer, ReplConsole, ReplMemoryCard, replPopoverIsOpen, placeReplPopover, useObservedReplMemory } = createReplView(React, {
215
- CodeBlock, Select, featureEnabled, normalizeReplMemorySnapshot, unavailableReplMemorySnapshot,
216
+ CodeBlock, Select, featureEnabled, normalizeReplMemorySnapshot, normalizeReplMemoryView,
217
+ unavailableReplMemorySnapshot,
216
218
  useSessionPreset, sessionUsesPtcPreset, useWorkbenchController, UserBindingsWorkbench,
217
219
  icons: { search: IconSearchOutline16, chevron: IconChevronDownOutline14 },
218
220
  })