@zihanw/pi-forge 0.5.3 → 0.5.4

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 (45) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/compile-cycle.d.ts +6 -1
  3. package/dist/compile-cycle.d.ts.map +1 -1
  4. package/dist/compile-cycle.js +2 -0
  5. package/dist/compile-cycle.js.map +1 -1
  6. package/dist/compiler.d.ts +7 -1
  7. package/dist/compiler.d.ts.map +1 -1
  8. package/dist/compiler.js +70 -2
  9. package/dist/compiler.js.map +1 -1
  10. package/dist/context-diff-history.d.ts +2 -0
  11. package/dist/context-diff-history.d.ts.map +1 -1
  12. package/dist/context-diff-history.js +9 -0
  13. package/dist/context-diff-history.js.map +1 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +4 -2
  16. package/dist/index.js.map +1 -1
  17. package/dist/lifecycle.d.ts.map +1 -1
  18. package/dist/lifecycle.js +12 -3
  19. package/dist/lifecycle.js.map +1 -1
  20. package/dist/preset-command.d.ts +2 -0
  21. package/dist/preset-command.d.ts.map +1 -1
  22. package/dist/preset-command.js +9 -1
  23. package/dist/preset-command.js.map +1 -1
  24. package/dist/preview.d.ts.map +1 -1
  25. package/dist/preview.js +2 -2
  26. package/dist/preview.js.map +1 -1
  27. package/dist/profile-command.d.ts +4 -1
  28. package/dist/profile-command.d.ts.map +1 -1
  29. package/dist/profile-command.js +9 -5
  30. package/dist/profile-command.js.map +1 -1
  31. package/dist/prompt-cache-warning.d.ts +23 -0
  32. package/dist/prompt-cache-warning.d.ts.map +1 -0
  33. package/dist/prompt-cache-warning.js +74 -0
  34. package/dist/prompt-cache-warning.js.map +1 -0
  35. package/dist/web-editor/client-script.generated.d.ts.map +1 -1
  36. package/dist/web-editor/client-script.generated.js +1 -1
  37. package/dist/web-editor/client-script.generated.js.map +1 -1
  38. package/dist/web-editor/client-styles.generated.d.ts.map +1 -1
  39. package/dist/web-editor/client-styles.generated.js +1 -1
  40. package/dist/web-editor/client-styles.generated.js.map +1 -1
  41. package/dist/web-editor/styles.d.ts.map +1 -1
  42. package/dist/web-editor/styles.js +79 -1
  43. package/dist/web-editor/styles.js.map +1 -1
  44. package/docs/design/pi-forge-system-update-design-notes.md +229 -0
  45. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client-script.generated.js","sourceRoot":"","sources":["../../src/web-editor/client-script.generated.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,oBAAoB,GAAW,4u5hBAA4u5hB,CAAC"}
1
+ {"version":3,"file":"client-script.generated.js","sourceRoot":"","sources":["../../src/web-editor/client-script.generated.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,oBAAoB,GAAW,gskiBAAgskiB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"client-styles.generated.d.ts","sourceRoot":"","sources":["../../src/web-editor/client-styles.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,oBAAoB,EAAE,MAAslpB,CAAC"}
1
+ {"version":3,"file":"client-styles.generated.d.ts","sourceRoot":"","sources":["../../src/web-editor/client-styles.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,oBAAoB,EAAE,MAA2ttB,CAAC"}
@@ -1,3 +1,3 @@
1
1
  // Generated by scripts/build-web-client.mjs. Do not edit.
2
- export const EDITOR_CLIENT_STYLES = "\n.profile-editor[data-v-9cfe5c37] {\n\tmax-width: 1050px;\n}\n.profile-editor-head[data-v-9cfe5c37] {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: wrap;\n\tgap: 8px;\n\tpadding-bottom: 12px;\n\tborder-bottom: 1px solid var(--line);\n}\n.profile-editor-title[data-v-9cfe5c37] {\n\tfont-size: 18px;\n\tfont-weight: 700;\n}\n.profile-editor-note[data-v-9cfe5c37],\n.profile-field small[data-v-9cfe5c37] {\n\tdisplay: block;\n\tcolor: var(--muted);\n\tfont-size: 12px;\n}\n.profile-form[data-v-9cfe5c37] {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n\tgap: 14px;\n\tmargin-top: 14px;\n}\n.profile-field[data-v-9cfe5c37] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 5px;\n\tmin-width: 0;\n}\n.profile-field > span[data-v-9cfe5c37] {\n\tfont-weight: 650;\n}\n.profile-field-wide[data-v-9cfe5c37] {\n\tgrid-column: 1 / -1;\n}\n.profile-field textarea[data-v-9cfe5c37] {\n\tmin-height: 90px;\n}\n.profile-field-warning[data-v-9cfe5c37] {\n\tcolor: var(--warning) !important;\n}\n.profile-check[data-v-9cfe5c37] {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 8px;\n\tpadding: 10px;\n\tborder: 1px solid var(--line);\n\tborder-radius: 6px;\n\tbackground: var(--pane-soft);\n}\n.profile-check input[data-v-9cfe5c37] {\n\twidth: auto;\n\tmargin-top: 3px;\n}\n.profile-check span[data-v-9cfe5c37] {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n.profile-editor-status[data-v-9cfe5c37],\n.profile-editor-validation[data-v-9cfe5c37] {\n\tmargin-top: 14px;\n}\n.profile-editor-status[data-v-9cfe5c37] {\n\tcolor: var(--success);\n}\n.profile-editor-status.error[data-v-9cfe5c37],\n.profile-editor-validation-summary.error[data-v-9cfe5c37] {\n\tcolor: var(--error);\n}\n.profile-editor-dirty[data-v-9cfe5c37] {\n\tborder: 1px solid var(--warning);\n\tborder-radius: 999px;\n\tpadding: 2px 8px;\n\tbackground: var(--warning-bg);\n\tcolor: var(--warning);\n\tfont-size: 12px;\n}\n.profile-editor-validation-summary.ready[data-v-9cfe5c37] {\n\tcolor: var(--success);\n}\n.profile-editor-validation-summary[data-v-9cfe5c37] {\n\tmargin-bottom: 8px;\n\tfont-weight: 650;\n}\n@media (max-width: 700px) {\n.profile-form[data-v-9cfe5c37] {\n\t\tgrid-template-columns: 1fr;\n}\n.profile-field-wide[data-v-9cfe5c37] {\n\t\tgrid-column: auto;\n}\n}\n\n.profile-surface[data-v-e0385a21] {\n\tflex: 1;\n\tmin-height: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground: var(--bg);\n}\n.profile-toolbar[data-v-e0385a21] {\n\tmin-height: 64px;\n\tpadding: 10px 12px;\n\tborder-bottom: 1px solid var(--line);\n\tbackground: var(--pane);\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n}\n.profile-toolbar .status[data-v-e0385a21] {\n\tflex: 1 1 120px;\n}\n#profileCreateScope[data-v-e0385a21] {\n\tflex: 0 0 auto;\n\twidth: 110px;\n}\n.profile-heading[data-v-e0385a21] {\n\tfont-size: 17px;\n\tfont-weight: 700;\n}\n.profile-subheading[data-v-e0385a21] {\n\tcolor: var(--muted);\n\tfont-size: 12px;\n}\n.profile-layout[data-v-e0385a21] {\n\tflex: 1;\n\tmin-height: 0;\n\tdisplay: grid;\n\tgrid-template-columns: minmax(260px, 330px) minmax(0, 1fr);\n}\n.profile-sidebar[data-v-e0385a21] {\n\tmin-width: 0;\n\tmin-height: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tborder-right: 1px solid var(--line);\n\tbackground: var(--pane);\n}\n.profile-list[data-v-e0385a21] {\n\tflex: 1;\n\tmin-height: 0;\n\tpadding: 8px;\n\toverflow: auto;\n}\n.profile-row[data-v-e0385a21] {\n\tposition: relative;\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: stretch;\n\twidth: 100%;\n\tmargin-bottom: 6px;\n\tpadding: 9px;\n\ttext-align: left;\n\tborder-color: transparent;\n\tbackground: transparent;\n}\n.profile-row[data-v-e0385a21]:hover {\n\tbackground: var(--control-muted);\n}\n.profile-row.selected[data-v-e0385a21] {\n\tborder-color: var(--accent);\n\tbackground: var(--accent-bg);\n}\n.profile-row-title[data-v-e0385a21] {\n\tfont-weight: 700;\n}\n.profile-row-name[data-v-e0385a21],\n.profile-row-meta[data-v-e0385a21] {\n\tcolor: var(--muted);\n\tfont-size: 12px;\n\toverflow-wrap: anywhere;\n}\n.profile-row-state[data-v-e0385a21] {\n\talign-self: flex-start;\n\tmargin-top: 6px;\n\tfont-size: 12px;\n}\n.profile-row-state.ready[data-v-e0385a21],\n.profile-applicability.ready[data-v-e0385a21] {\n\tcolor: var(--success);\n}\n.profile-row-state.warning[data-v-e0385a21] {\n\tcolor: var(--warning);\n}\n.profile-row-state.error[data-v-e0385a21],\n.profile-applicability.error[data-v-e0385a21] {\n\tcolor: var(--error);\n}\n.profile-main[data-v-e0385a21] {\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: auto;\n\tpadding: 16px;\n}\n.profile-card[data-v-e0385a21] {\n\tmax-width: 1050px;\n\tmargin: 0 auto 14px;\n\tpadding: 14px;\n\tborder: 1px solid var(--line);\n\tborder-radius: 8px;\n\tbackground: var(--pane);\n}\n.profile-summary-card[data-v-e0385a21] {\n\tdisplay: grid;\n\tgrid-template-columns: minmax(0, 1fr) auto;\n\tgap: 8px 16px;\n}\n.profile-title[data-v-e0385a21] {\n\tfont-size: 19px;\n\tfont-weight: 700;\n}\n.profile-selector[data-v-e0385a21],\n.profile-path[data-v-e0385a21],\n.profile-note[data-v-e0385a21] {\n\tcolor: var(--muted);\n\tfont-size: 12px;\n\toverflow-wrap: anywhere;\n}\n.profile-applicability[data-v-e0385a21] {\n\tfont-weight: 650;\n}\n.profile-summary-actions[data-v-e0385a21] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n}\n.profile-description[data-v-e0385a21] {\n\tgrid-column: 1 / -1;\n\tmargin: 4px 0 0;\n}\n.profile-card-title[data-v-e0385a21] {\n\tmargin-bottom: 10px;\n\tfont-weight: 700;\n}\n.profile-transition-grid[data-v-e0385a21] {\n\tdisplay: grid;\n\tgrid-template-columns: minmax(100px, .7fr) repeat(2, minmax(180px, 1fr));\n\tgap: 1px;\n\tborder: 1px solid var(--line);\n\tbackground: var(--line);\n}\n.profile-transition-grid > div[data-v-e0385a21] {\n\tmin-width: 0;\n\tpadding: 8px;\n\tbackground: var(--pane);\n\toverflow-wrap: anywhere;\n}\n.profile-transition-head[data-v-e0385a21] {\n\tcolor: var(--muted);\n\tfont-size: 12px;\n\tfont-weight: 650;\n}\n.profile-detail-row[data-v-e0385a21] {\n\tdisplay: grid;\n\tgrid-template-columns: minmax(180px, .8fr) minmax(0, 2fr);\n\tgap: 12px;\n\tmargin-top: 10px;\n}\n.profile-detail-row > span[data-v-e0385a21] {\n\tcolor: var(--muted);\n}\n.profile-detail-row code[data-v-e0385a21] {\n\toverflow-wrap: anywhere;\n\twhite-space: normal;\n}\n.profile-drift[data-v-e0385a21] {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 8px 16px;\n\tmargin-top: 10px;\n\tcolor: var(--muted);\n\tfont-size: 12px;\n}\n.profile-message[data-v-e0385a21],\n.profile-empty[data-v-e0385a21] {\n\tpadding: 20px;\n\tcolor: var(--muted);\n}\n.profile-message.error[data-v-e0385a21] {\n\tcolor: var(--error);\n}\n.profile-message.warning[data-v-e0385a21] {\n\tcolor: var(--warning);\n}\n@media (max-width: 800px) {\n.profile-layout[data-v-e0385a21] {\n\t\tdisplay: block;\n\t\toverflow: auto;\n}\n.profile-sidebar[data-v-e0385a21] {\n\t\tborder-right: 0;\n\t\tborder-bottom: 1px solid var(--line);\n}\n.profile-list[data-v-e0385a21] {\n\t\tflex: none;\n\t\tmax-height: 35vh;\n}\n.profile-main[data-v-e0385a21] {\n\t\toverflow: visible;\n}\n.profile-transition-grid[data-v-e0385a21] {\n\t\tgrid-template-columns: minmax(80px, .7fr) repeat(2, minmax(120px, 1fr));\n\t\tfont-size: 12px;\n}\n}\n\n.schema-record-row[data-v-f9733942] {\n\tgrid-template-columns: minmax(150px, 220px) repeat(auto-fit, minmax(150px, 1fr)) 92px;\n}\n.record-empty[data-v-f9733942] {\n\tcolor: var(--muted);\n\tfont-size: 12px;\n\tpadding: 8px 0;\n}\n.schema-field-error[data-v-f9733942] {\n\tcolor: var(--error);\n\tfont-size: 12px;\n\tmargin-top: 4px;\n}\n.record-cell-label[data-v-f9733942] {\n\tdisplay: none;\n}\n@media (max-width: 700px) {\n.schema-record-row[data-v-f9733942] {\n\t\tgrid-template-columns: minmax(0, 1fr);\n}\n.schema-record-row.header[data-v-f9733942] {\n\t\tdisplay: none;\n}\n.record-cell-label[data-v-f9733942] {\n\t\tdisplay: block;\n}\n}\n\n.context-diff-dock[data-v-21a80ca0] { height: 100%; min-height: 0; display: flex; flex-direction: column; gap: 10px;\n}\n.context-diff-mode-tabs[data-v-21a80ca0] { display: flex; gap: 6px; flex: 0 0 auto;\n}\n.context-diff-expand[data-v-21a80ca0] { margin-left: auto;\n}\n.context-diff-mode-tabs button.active[data-v-21a80ca0] { border-color: var(--accent); background: var(--accent-bg); color: var(--accent);\n}\n.context-diff-panel-head[data-v-21a80ca0] { display: flex; align-items: center; gap: 8px; flex: 0 0 auto;\n}\n.context-diff-title[data-v-21a80ca0] { font-weight: 700;\n}\n.context-diff-meta[data-v-21a80ca0] { color: var(--muted); font-size: 12px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n}\n.context-diff-meta .error[data-v-21a80ca0], .context-diff-error[data-v-21a80ca0] { color: var(--error);\n}\n.context-diff-refresh[data-v-21a80ca0] { margin-left: auto; min-height: 28px; font-size: 12px; padding: 2px 8px;\n}\n.context-diff-copy-full[data-v-21a80ca0], .context-diff-copy-section[data-v-21a80ca0] { min-height: 28px; font-size: 12px; padding: 2px 8px;\n}\n.context-diff-copy-section[data-v-21a80ca0] { margin-left: auto;\n}\n.context-diff-diagnostics[data-v-21a80ca0] { display: flex; flex-direction: column; gap: 4px; padding: 8px 10px; border: 1px solid var(--line); border-radius: 6px; background: var(--pane); font-size: 12px;\n}\n.context-diff-diagnostic.error[data-v-21a80ca0] { color: var(--error);\n}\n.context-diff-diagnostic.warning[data-v-21a80ca0] { color: var(--warning);\n}\n.context-diff-diagnostic.info[data-v-21a80ca0] { color: var(--muted);\n}\n.context-diff-compiled[data-v-21a80ca0], .context-diff-diff[data-v-21a80ca0] { flex: 1; min-height: 0; display: flex; flex-direction: column; gap: 8px; overflow: auto;\n}\n.context-diff-sections[data-v-21a80ca0], .context-diff-blocks[data-v-21a80ca0] { display: flex; flex-direction: column; gap: 8px;\n}\n.context-diff-section[data-v-21a80ca0] { border: 1px solid var(--line); border-radius: 6px; background: var(--pane); overflow: hidden;\n}\n.context-diff-section summary[data-v-21a80ca0] { display: flex; align-items: center; gap: 8px; padding: 8px 10px; cursor: pointer; list-style: none; border-bottom: 1px solid transparent;\n}\n.context-diff-section[open] summary[data-v-21a80ca0] { border-bottom-color: var(--line);\n}\n.section-title[data-v-21a80ca0] { font-weight: 650;\n}\n.section-meta[data-v-21a80ca0] { color: var(--muted); font-size: 12px;\n}\n.section-text[data-v-21a80ca0], .block-text[data-v-21a80ca0] { margin: 0; padding: 10px; background: var(--code-bg); color: var(--code-text); white-space: pre-wrap; overflow: auto; font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n}\n.context-diff-summary[data-v-21a80ca0] { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; padding: 8px 10px; border: 1px solid var(--line); border-radius: 6px; background: var(--pane); font-weight: 650;\n}\n.summary-delta.positive[data-v-21a80ca0] { color: var(--success);\n}\n.summary-delta.negative[data-v-21a80ca0] { color: var(--error);\n}\n.summary-delta.neutral[data-v-21a80ca0] { color: var(--muted);\n}\n.diff-view-controls[data-v-21a80ca0] { margin-left: auto; display: flex; align-items: center; gap: 8px;\n}\n.diff-view-controls label[data-v-21a80ca0] { display: flex; align-items: center; gap: 5px; color: var(--muted); font-size: 11px; font-weight: 500;\n}\n.diff-view-controls select[data-v-21a80ca0] { width: auto; min-height: 26px; padding: 2px 24px 2px 7px; font-size: 11px;\n}\n.diff-layout-buttons[data-v-21a80ca0] { display: inline-flex;\n}\n.diff-layout-buttons button[data-v-21a80ca0] { min-height: 26px; padding: 2px 7px; border-radius: 0; font-size: 11px;\n}\n.diff-layout-buttons button[data-v-21a80ca0]:first-child { border-radius: 4px 0 0 4px;\n}\n.diff-layout-buttons button[data-v-21a80ca0]:last-child { margin-left: -1px; border-radius: 0 4px 4px 0;\n}\n.diff-layout-buttons button.active[data-v-21a80ca0] { position: relative; border-color: var(--accent); background: var(--accent-bg); color: var(--accent);\n}\n.unchanged-toggle[data-v-21a80ca0] { display: flex; align-items: center; gap: 6px; color: var(--muted); font-size: 12px; font-weight: 400;\n}\n.unchanged-toggle input[data-v-21a80ca0] { width: auto;\n}\n.context-diff-details[data-v-21a80ca0] { border: 1px solid var(--line); border-radius: 6px; padding: 7px 10px; color: var(--muted); font-size: 12px; background: var(--pane-soft);\n}\n.context-diff-details summary[data-v-21a80ca0] { cursor: pointer; color: var(--text); font-weight: 650;\n}\n.context-diff-details[open] summary[data-v-21a80ca0] { margin-bottom: 6px;\n}\n.run-metadata-grid[data-v-21a80ca0] { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 4px 12px;\n}\n.run-metadata-grid strong[data-v-21a80ca0] { color: var(--text); overflow-wrap: anywhere;\n}\n.metadata-note[data-v-21a80ca0] { margin: 7px 0 0; line-height: 1.4;\n}\n.context-diff-block[data-v-21a80ca0] { display: grid; grid-template-columns: 4px minmax(0, 1fr); border: 1px solid var(--line); border-radius: 6px; background: var(--pane); overflow: hidden;\n}\n.block-gutter[data-v-21a80ca0] { background: var(--line);\n}\n.context-diff-block.added .block-gutter[data-v-21a80ca0] { background: var(--success);\n}\n.context-diff-block.removed .block-gutter[data-v-21a80ca0] { background: var(--error);\n}\n.context-diff-block.modified .block-gutter[data-v-21a80ca0] { background: var(--warning);\n}\n.block-content[data-v-21a80ca0] { min-width: 0; padding: 9px 10px 10px;\n}\n.block-head[data-v-21a80ca0] { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 10px; margin-bottom: 7px;\n}\n.block-status[data-v-21a80ca0] { text-transform: uppercase; font-size: 11px; font-weight: 750; letter-spacing: .03em;\n}\n.context-diff-block.added .block-status[data-v-21a80ca0] { color: var(--success);\n}\n.context-diff-block.removed .block-status[data-v-21a80ca0] { color: var(--error);\n}\n.context-diff-block.modified .block-status[data-v-21a80ca0] { color: var(--warning);\n}\n.block-key[data-v-21a80ca0] { font-weight: 650;\n}\n.block-role[data-v-21a80ca0] { color: var(--muted); font-size: 12px;\n}\n.block-token-chip[data-v-21a80ca0] { margin-left: auto; border: 1px solid var(--line); border-radius: 999px; padding: 1px 8px; font-size: 12px; background: var(--control-muted);\n}\n.metadata-only-change[data-v-21a80ca0] { padding: 9px 10px; border: 1px solid color-mix(in srgb, var(--warning) 55%, var(--line)); border-radius: 4px; background: color-mix(in srgb, var(--warning) 10%, var(--pane)); color: var(--text); font-size: 12px; line-height: 1.45;\n}\n.git-diff[data-v-21a80ca0] { overflow: auto; border: 1px solid var(--line); border-radius: 4px; background: var(--code-bg); font: 12px/1.55 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n}\n.git-line[data-v-21a80ca0] { min-width: max-content; color: var(--code-text);\n}\n.git-diff.unified .git-line[data-v-21a80ca0] { display: grid; grid-template-columns: 44px 44px 20px minmax(max-content, 1fr);\n}\n.git-line.added[data-v-21a80ca0] { background: color-mix(in srgb, var(--success) 12%, var(--code-bg));\n}\n.git-line.removed[data-v-21a80ca0] { background: color-mix(in srgb, var(--error) 12%, var(--code-bg));\n}\n.git-line.blank[data-v-21a80ca0] { min-height: 19px; background: var(--pane-soft);\n}\n.git-line code[data-v-21a80ca0] { display: block; min-height: 1.55em; padding: 0 8px; white-space: pre;\n}\n.git-line mark[data-v-21a80ca0] { border-radius: 2px; background: color-mix(in srgb, currentColor 22%, transparent); color: inherit; font: inherit;\n}\n.line-number[data-v-21a80ca0] { padding: 0 7px; border-right: 1px solid var(--line); color: var(--muted); text-align: right; user-select: none;\n}\n.line-marker[data-v-21a80ca0] { text-align: center; user-select: none;\n}\n.git-line.added .line-marker[data-v-21a80ca0] { color: var(--success);\n}\n.git-line.removed .line-marker[data-v-21a80ca0] { color: var(--error);\n}\n.git-line.note[data-v-21a80ca0] { color: var(--muted); font-style: italic;\n}\n.note-side[data-v-21a80ca0] { color: var(--text); font-style: normal; font-weight: 650;\n}\n.git-line-separator[data-v-21a80ca0] { min-width: max-content; padding: 1px 12px; border-block: 1px solid var(--line); background: var(--accent-bg); color: var(--muted); text-align: center;\n}\n.split-header[data-v-21a80ca0] { position: sticky; top: 0; z-index: 1; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); min-width: 720px; border-bottom: 1px solid var(--line); background: var(--pane); color: var(--muted); font: 600 11px/1.8 system-ui, sans-serif; text-transform: uppercase;\n}\n.split-header span[data-v-21a80ca0] { padding-left: 52px;\n}\n.split-header span + span[data-v-21a80ca0] { border-left: 1px solid var(--line);\n}\n.split-line[data-v-21a80ca0] { display: grid; grid-template-columns: repeat(2, minmax(360px, 1fr)); min-width: 720px;\n}\n.split-line > .git-line[data-v-21a80ca0] { display: grid; grid-template-columns: 44px 20px minmax(max-content, 1fr);\n}\n.split-line > .git-line + .git-line[data-v-21a80ca0] { border-left: 1px solid var(--line);\n}\n.split-separator[data-v-21a80ca0] { min-width: 720px;\n}\n.context-diff-empty[data-v-21a80ca0] { color: var(--muted); padding: 20px; border: 1px dashed var(--line); border-radius: 6px;\n}\n.context-diff-empty.compact[data-v-21a80ca0] { padding: 12px;\n}\n.context-diff-error[data-v-21a80ca0] { padding: 10px; border: 1px solid var(--error); border-radius: 6px; background: var(--error-bg);\n}\n@media (max-width: 1100px) {\n.diff-view-controls[data-v-21a80ca0] { order: 3; margin-left: 0; width: 100%;\n}\n}\n@media (max-width: 900px) {\n.context-diff-expand[data-v-21a80ca0] { display: none;\n}\n}\n\n.app-root {\n\theight: 100%;\n\tmin-height: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n.surface-nav {\n\tflex: none;\n\theight: 40px;\n\tpadding: 4px 10px;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tborder-bottom: 1px solid var(--line);\n\tbackground: var(--pane);\n}\n.surface-brand {\n\tmargin-right: 8px;\n\tfont-weight: 750;\n\tletter-spacing: .02em;\n}\n.surface-nav button {\n\tmin-height: 32px;\n\tborder-color: transparent;\n\tbackground: transparent;\n}\n.surface-nav button.active {\n\tborder-color: var(--accent);\n\tbackground: var(--accent-bg);\n\tcolor: var(--accent);\n}\n.surface-nav-spacer {\n\tflex: 1 1 auto;\n}\n.surface-nav .theme-toggle {\n\tmin-height: 32px;\n\tborder-color: var(--line);\n\tbackground: var(--pane);\n}\n\n/* The global form rule gives every select width:100%; the locale picker in the\n nav bar must hug the right edge instead of stretching across it. */\n.surface-nav .locale-select {\n\tflex: none;\n\twidth: auto;\n\tmin-width: 0;\n\tmin-height: 32px;\n}\n\n/* Keep nav tab labels on one line (zh-CN labels wrapped in narrow headers). */\n.surface-nav button {\n\twhite-space: nowrap;\n}\n.editor-surface {\n\tflex: 1;\n\tmin-height: 0;\n}\n.settings-surface {\n\tflex: 1;\n\tmin-height: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground: var(--pane-soft);\n}\n.settings-surface-head {\n\tflex: none;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 24px;\n\tpadding: 18px 24px;\n\tborder-bottom: 1px solid var(--line);\n\tbackground: var(--pane);\n}\n.settings-surface-head h1 {\n\tmargin: 0;\n\tfont-size: 20px;\n}\n.settings-surface-head p {\n\tmargin: 4px 0 0;\n\tcolor: var(--muted);\n}\n.settings-surface-status {\n\tmargin-left: auto;\n\tcolor: var(--muted);\n\tfont-size: 12px;\n}\n.settings-surface-body {\n\tflex: 1;\n\tmin-height: 0;\n\tdisplay: grid;\n\tgrid-template-columns: minmax(180px, 240px) minmax(0, 1fr);\n}\n.settings-nav {\n\tmin-width: 0;\n\tpadding: 14px 10px;\n\tborder-right: 1px solid var(--line);\n\tbackground: var(--pane);\n}\n.settings-nav button {\n\twidth: 100%;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-start;\n\tmargin-bottom: 6px;\n}\n.settings-nav button.active {\n\tborder-color: var(--accent);\n\tbackground: var(--accent-bg);\n\tcolor: var(--accent);\n}\n.settings-panel {\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: auto;\n\tpadding: 20px clamp(16px, 4vw, 48px);\n}\n.settings-panel > .schema-form {\n\twidth: min(100%, 1100px);\n\tmargin: 0 auto;\n}\n.legacy-editor-root {\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n.legacy-editor-root .topbar {\n\tflex: none;\n}\n.editor-surface .shell {\n\tflex: 1;\n\tmin-height: 0;\n\theight: auto;\n}\n@media (max-width: 700px) {\n.surface-nav {\n\t\toverflow-x: auto;\n}\n.surface-nav > * {\n\t\tflex-shrink: 0;\n}\n.surface-nav-spacer {\n\t\tdisplay: none;\n}\n.settings-surface-head {\n\t\talign-items: flex-start;\n\t\tpadding: 14px 16px;\n}\n.settings-surface-status {\n\t\tmargin-left: auto;\n}\n.settings-surface-body {\n\t\tgrid-template-columns: minmax(0, 1fr);\n}\n.settings-nav {\n\t\tdisplay: flex;\n\t\tgap: 6px;\n\t\toverflow-x: auto;\n\t\tpadding: 8px;\n\t\tborder-right: 0;\n\t\tborder-bottom: 1px solid var(--line);\n}\n.settings-nav button {\n\t\twidth: auto;\n\t\tflex: 0 0 auto;\n\t\tmargin: 0;\n}\n.settings-panel {\n\t\tpadding: 14px 10px;\n}\n}\n/*$vite$:1*/";
2
+ export const EDITOR_CLIENT_STYLES = "\n.profile-editor[data-v-9cfe5c37] {\n\tmax-width: 1050px;\n}\n.profile-editor-head[data-v-9cfe5c37] {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: wrap;\n\tgap: 8px;\n\tpadding-bottom: 12px;\n\tborder-bottom: 1px solid var(--line);\n}\n.profile-editor-title[data-v-9cfe5c37] {\n\tfont-size: 18px;\n\tfont-weight: 700;\n}\n.profile-editor-note[data-v-9cfe5c37],\n.profile-field small[data-v-9cfe5c37] {\n\tdisplay: block;\n\tcolor: var(--muted);\n\tfont-size: 12px;\n}\n.profile-form[data-v-9cfe5c37] {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n\tgap: 14px;\n\tmargin-top: 14px;\n}\n.profile-field[data-v-9cfe5c37] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 5px;\n\tmin-width: 0;\n}\n.profile-field > span[data-v-9cfe5c37] {\n\tfont-weight: 650;\n}\n.profile-field-wide[data-v-9cfe5c37] {\n\tgrid-column: 1 / -1;\n}\n.profile-field textarea[data-v-9cfe5c37] {\n\tmin-height: 90px;\n}\n.profile-field-warning[data-v-9cfe5c37] {\n\tcolor: var(--warning) !important;\n}\n.profile-check[data-v-9cfe5c37] {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 8px;\n\tpadding: 10px;\n\tborder: 1px solid var(--line);\n\tborder-radius: 6px;\n\tbackground: var(--pane-soft);\n}\n.profile-check input[data-v-9cfe5c37] {\n\twidth: auto;\n\tmargin-top: 3px;\n}\n.profile-check span[data-v-9cfe5c37] {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n.profile-editor-status[data-v-9cfe5c37],\n.profile-editor-validation[data-v-9cfe5c37] {\n\tmargin-top: 14px;\n}\n.profile-editor-status[data-v-9cfe5c37] {\n\tcolor: var(--success);\n}\n.profile-editor-status.error[data-v-9cfe5c37],\n.profile-editor-validation-summary.error[data-v-9cfe5c37] {\n\tcolor: var(--error);\n}\n.profile-editor-dirty[data-v-9cfe5c37] {\n\tborder: 1px solid var(--warning);\n\tborder-radius: 999px;\n\tpadding: 2px 8px;\n\tbackground: var(--warning-bg);\n\tcolor: var(--warning);\n\tfont-size: 12px;\n}\n.profile-editor-validation-summary.ready[data-v-9cfe5c37] {\n\tcolor: var(--success);\n}\n.profile-editor-validation-summary[data-v-9cfe5c37] {\n\tmargin-bottom: 8px;\n\tfont-weight: 650;\n}\n@media (max-width: 700px) {\n.profile-form[data-v-9cfe5c37] {\n\t\tgrid-template-columns: 1fr;\n}\n.profile-field-wide[data-v-9cfe5c37] {\n\t\tgrid-column: auto;\n}\n}\n\n.profile-surface[data-v-e0385a21] {\n\tflex: 1;\n\tmin-height: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground: var(--bg);\n}\n.profile-toolbar[data-v-e0385a21] {\n\tmin-height: 64px;\n\tpadding: 10px 12px;\n\tborder-bottom: 1px solid var(--line);\n\tbackground: var(--pane);\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n}\n.profile-toolbar .status[data-v-e0385a21] {\n\tflex: 1 1 120px;\n}\n#profileCreateScope[data-v-e0385a21] {\n\tflex: 0 0 auto;\n\twidth: 110px;\n}\n.profile-heading[data-v-e0385a21] {\n\tfont-size: 17px;\n\tfont-weight: 700;\n}\n.profile-subheading[data-v-e0385a21] {\n\tcolor: var(--muted);\n\tfont-size: 12px;\n}\n.profile-layout[data-v-e0385a21] {\n\tflex: 1;\n\tmin-height: 0;\n\tdisplay: grid;\n\tgrid-template-columns: minmax(260px, 330px) minmax(0, 1fr);\n}\n.profile-sidebar[data-v-e0385a21] {\n\tmin-width: 0;\n\tmin-height: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tborder-right: 1px solid var(--line);\n\tbackground: var(--pane);\n}\n.profile-list[data-v-e0385a21] {\n\tflex: 1;\n\tmin-height: 0;\n\tpadding: 8px;\n\toverflow: auto;\n}\n.profile-row[data-v-e0385a21] {\n\tposition: relative;\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: stretch;\n\twidth: 100%;\n\tmargin-bottom: 6px;\n\tpadding: 9px;\n\ttext-align: left;\n\tborder-color: transparent;\n\tbackground: transparent;\n}\n.profile-row[data-v-e0385a21]:hover {\n\tbackground: var(--control-muted);\n}\n.profile-row.selected[data-v-e0385a21] {\n\tborder-color: var(--accent);\n\tbackground: var(--accent-bg);\n}\n.profile-row-title[data-v-e0385a21] {\n\tfont-weight: 700;\n}\n.profile-row-name[data-v-e0385a21],\n.profile-row-meta[data-v-e0385a21] {\n\tcolor: var(--muted);\n\tfont-size: 12px;\n\toverflow-wrap: anywhere;\n}\n.profile-row-state[data-v-e0385a21] {\n\talign-self: flex-start;\n\tmargin-top: 6px;\n\tfont-size: 12px;\n}\n.profile-row-state.ready[data-v-e0385a21],\n.profile-applicability.ready[data-v-e0385a21] {\n\tcolor: var(--success);\n}\n.profile-row-state.warning[data-v-e0385a21] {\n\tcolor: var(--warning);\n}\n.profile-row-state.error[data-v-e0385a21],\n.profile-applicability.error[data-v-e0385a21] {\n\tcolor: var(--error);\n}\n.profile-main[data-v-e0385a21] {\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: auto;\n\tpadding: 16px;\n}\n.profile-card[data-v-e0385a21] {\n\tmax-width: 1050px;\n\tmargin: 0 auto 14px;\n\tpadding: 14px;\n\tborder: 1px solid var(--line);\n\tborder-radius: 8px;\n\tbackground: var(--pane);\n}\n.profile-summary-card[data-v-e0385a21] {\n\tdisplay: grid;\n\tgrid-template-columns: minmax(0, 1fr) auto;\n\tgap: 8px 16px;\n}\n.profile-title[data-v-e0385a21] {\n\tfont-size: 19px;\n\tfont-weight: 700;\n}\n.profile-selector[data-v-e0385a21],\n.profile-path[data-v-e0385a21],\n.profile-note[data-v-e0385a21] {\n\tcolor: var(--muted);\n\tfont-size: 12px;\n\toverflow-wrap: anywhere;\n}\n.profile-applicability[data-v-e0385a21] {\n\tfont-weight: 650;\n}\n.profile-summary-actions[data-v-e0385a21] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n}\n.profile-description[data-v-e0385a21] {\n\tgrid-column: 1 / -1;\n\tmargin: 4px 0 0;\n}\n.profile-card-title[data-v-e0385a21] {\n\tmargin-bottom: 10px;\n\tfont-weight: 700;\n}\n.profile-transition-grid[data-v-e0385a21] {\n\tdisplay: grid;\n\tgrid-template-columns: minmax(100px, .7fr) repeat(2, minmax(180px, 1fr));\n\tgap: 1px;\n\tborder: 1px solid var(--line);\n\tbackground: var(--line);\n}\n.profile-transition-grid > div[data-v-e0385a21] {\n\tmin-width: 0;\n\tpadding: 8px;\n\tbackground: var(--pane);\n\toverflow-wrap: anywhere;\n}\n.profile-transition-head[data-v-e0385a21] {\n\tcolor: var(--muted);\n\tfont-size: 12px;\n\tfont-weight: 650;\n}\n.profile-detail-row[data-v-e0385a21] {\n\tdisplay: grid;\n\tgrid-template-columns: minmax(180px, .8fr) minmax(0, 2fr);\n\tgap: 12px;\n\tmargin-top: 10px;\n}\n.profile-detail-row > span[data-v-e0385a21] {\n\tcolor: var(--muted);\n}\n.profile-detail-row code[data-v-e0385a21] {\n\toverflow-wrap: anywhere;\n\twhite-space: normal;\n}\n.profile-drift[data-v-e0385a21] {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 8px 16px;\n\tmargin-top: 10px;\n\tcolor: var(--muted);\n\tfont-size: 12px;\n}\n.profile-message[data-v-e0385a21],\n.profile-empty[data-v-e0385a21] {\n\tpadding: 20px;\n\tcolor: var(--muted);\n}\n.profile-message.error[data-v-e0385a21] {\n\tcolor: var(--error);\n}\n.profile-message.warning[data-v-e0385a21] {\n\tcolor: var(--warning);\n}\n@media (max-width: 800px) {\n.profile-layout[data-v-e0385a21] {\n\t\tdisplay: block;\n\t\toverflow: auto;\n}\n.profile-sidebar[data-v-e0385a21] {\n\t\tborder-right: 0;\n\t\tborder-bottom: 1px solid var(--line);\n}\n.profile-list[data-v-e0385a21] {\n\t\tflex: none;\n\t\tmax-height: 35vh;\n}\n.profile-main[data-v-e0385a21] {\n\t\toverflow: visible;\n}\n.profile-transition-grid[data-v-e0385a21] {\n\t\tgrid-template-columns: minmax(80px, .7fr) repeat(2, minmax(120px, 1fr));\n\t\tfont-size: 12px;\n}\n}\n\n.schema-record-row[data-v-f9733942] {\n\tgrid-template-columns: minmax(150px, 220px) repeat(auto-fit, minmax(150px, 1fr)) 92px;\n}\n.record-empty[data-v-f9733942] {\n\tcolor: var(--muted);\n\tfont-size: 12px;\n\tpadding: 8px 0;\n}\n.schema-field-error[data-v-f9733942] {\n\tcolor: var(--error);\n\tfont-size: 12px;\n\tmargin-top: 4px;\n}\n.record-cell-label[data-v-f9733942] {\n\tdisplay: none;\n}\n@media (max-width: 700px) {\n.schema-record-row[data-v-f9733942] {\n\t\tgrid-template-columns: minmax(0, 1fr);\n}\n.schema-record-row.header[data-v-f9733942] {\n\t\tdisplay: none;\n}\n.record-cell-label[data-v-f9733942] {\n\t\tdisplay: block;\n}\n}\n\n.context-diff-dock[data-v-136213cf] { height: 100%; min-height: 0; display: flex; flex-direction: column; gap: 10px;\n}\n.context-diff-mode-tabs[data-v-136213cf] { display: flex; gap: 6px; flex: 0 0 auto;\n}\n.context-diff-expand[data-v-136213cf] { margin-left: auto;\n}\n.context-diff-mode-tabs button.active[data-v-136213cf] { border-color: var(--accent); background: var(--accent-bg); color: var(--accent);\n}\n.context-diff-panel-head[data-v-136213cf] { display: flex; align-items: center; gap: 8px; flex: 0 0 auto;\n}\n.context-diff-title[data-v-136213cf] { font-weight: 700;\n}\n.context-diff-meta[data-v-136213cf] { color: var(--muted); font-size: 12px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n}\n.context-diff-meta .error[data-v-136213cf], .context-diff-error[data-v-136213cf] { color: var(--error);\n}\n.context-diff-refresh[data-v-136213cf] { margin-left: auto; min-height: 28px; font-size: 12px; padding: 2px 8px;\n}\n.context-diff-copy-full[data-v-136213cf], .context-diff-copy-section[data-v-136213cf] { min-height: 28px; font-size: 12px; padding: 2px 8px;\n}\n.context-diff-copy-section[data-v-136213cf] { margin-left: auto;\n}\n.context-diff-diagnostics[data-v-136213cf] { display: flex; flex-direction: column; gap: 4px; padding: 8px 10px; border: 1px solid var(--line); border-radius: 6px; background: var(--pane); font-size: 12px;\n}\n.context-diff-diagnostic.error[data-v-136213cf] { color: var(--error);\n}\n.context-diff-diagnostic.warning[data-v-136213cf] { color: var(--warning);\n}\n.context-diff-diagnostic.info[data-v-136213cf] { color: var(--muted);\n}\n.context-diff-compiled[data-v-136213cf], .context-diff-diff[data-v-136213cf] { flex: 1; min-height: 0; display: flex; flex-direction: column; gap: 8px; overflow: auto;\n}\n.context-diff-sections[data-v-136213cf], .context-diff-blocks[data-v-136213cf] { display: flex; flex-direction: column; gap: 8px;\n}\n.context-diff-group[data-v-136213cf] { border: 1px solid var(--line); border-radius: 6px; background: var(--pane-soft); overflow: hidden;\n}\n.context-diff-group-summary[data-v-136213cf] { display: flex; align-items: center; gap: 8px; padding: 8px 10px; cursor: pointer; list-style: none;\n}\n.context-diff-group-summary[data-v-136213cf]::-webkit-details-marker { display: none;\n}\n.context-diff-group-summary[data-v-136213cf]::before { content: \"▶\"; color: var(--muted); font-size: 10px;\n}\n.context-diff-group[open] > .context-diff-group-summary[data-v-136213cf] { border-bottom: 1px solid var(--line);\n}\n.context-diff-group[open] > .context-diff-group-summary[data-v-136213cf]::before { content: \"▼\";\n}\n.group-title[data-v-136213cf] { font-weight: 700;\n}\n.context-diff-group-messages[data-v-136213cf] { display: flex; flex-direction: column; gap: 8px; padding: 8px;\n}\n.context-diff-section[data-v-136213cf] { border: 1px solid var(--line); border-left-width: 3px; border-radius: 6px; background: var(--pane); overflow: hidden;\n}\n.context-diff-section summary[data-v-136213cf] { display: flex; align-items: center; gap: 8px; padding: 8px 10px; cursor: pointer; list-style: none; border-bottom: 1px solid transparent;\n}\n.context-diff-section summary[data-v-136213cf]::-webkit-details-marker { display: none;\n}\n.context-diff-section[open] summary[data-v-136213cf] { border-bottom-color: var(--line);\n}\n.section-title[data-v-136213cf] { font-weight: 650;\n}\n.section-role[data-v-136213cf] { border: 1px solid currentColor; border-radius: 999px; padding: 0 6px; font-size: 10px; line-height: 16px; font-weight: 700; text-transform: lowercase;\n}\n.section-meta[data-v-136213cf] { color: var(--muted); font-size: 12px;\n}\n.context-diff-section.role-system[data-v-136213cf] { border-left-color: var(--role-system);\n}\n.context-diff-section.role-user[data-v-136213cf] { border-left-color: var(--role-user);\n}\n.context-diff-section.role-assistant[data-v-136213cf] { border-left-color: var(--role-assistant);\n}\n.context-diff-section.role-toolresult[data-v-136213cf] { border-left-color: var(--role-tool-result);\n}\n.section-role.role-system[data-v-136213cf] { color: var(--role-system); background: color-mix(in srgb, var(--role-system) 12%, var(--pane));\n}\n.section-role.role-user[data-v-136213cf] { color: var(--role-user); background: color-mix(in srgb, var(--role-user) 12%, var(--pane));\n}\n.section-role.role-assistant[data-v-136213cf] { color: var(--role-assistant); background: color-mix(in srgb, var(--role-assistant) 12%, var(--pane));\n}\n.section-role.role-toolresult[data-v-136213cf] { color: var(--role-tool-result); background: color-mix(in srgb, var(--role-tool-result) 12%, var(--pane));\n}\n.section-text[data-v-136213cf], .block-text[data-v-136213cf] { margin: 0; padding: 10px; background: var(--code-bg); color: var(--code-text); white-space: pre-wrap; overflow: auto; font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n}\n.context-diff-summary[data-v-136213cf] { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; padding: 8px 10px; border: 1px solid var(--line); border-radius: 6px; background: var(--pane); font-weight: 650;\n}\n.summary-delta.positive[data-v-136213cf] { color: var(--success);\n}\n.summary-delta.negative[data-v-136213cf] { color: var(--error);\n}\n.summary-delta.neutral[data-v-136213cf] { color: var(--muted);\n}\n.diff-view-controls[data-v-136213cf] { margin-left: auto; display: flex; align-items: center; gap: 8px;\n}\n.diff-view-controls label[data-v-136213cf] { display: flex; align-items: center; gap: 5px; color: var(--muted); font-size: 11px; font-weight: 500;\n}\n.diff-view-controls select[data-v-136213cf] { width: auto; min-height: 26px; padding: 2px 24px 2px 7px; font-size: 11px;\n}\n.diff-layout-buttons[data-v-136213cf] { display: inline-flex;\n}\n.diff-layout-buttons button[data-v-136213cf] { min-height: 26px; padding: 2px 7px; border-radius: 0; font-size: 11px;\n}\n.diff-layout-buttons button[data-v-136213cf]:first-child { border-radius: 4px 0 0 4px;\n}\n.diff-layout-buttons button[data-v-136213cf]:last-child { margin-left: -1px; border-radius: 0 4px 4px 0;\n}\n.diff-layout-buttons button.active[data-v-136213cf] { position: relative; border-color: var(--accent); background: var(--accent-bg); color: var(--accent);\n}\n.unchanged-toggle[data-v-136213cf] { display: flex; align-items: center; gap: 6px; color: var(--muted); font-size: 12px; font-weight: 400;\n}\n.unchanged-toggle input[data-v-136213cf] { width: auto;\n}\n.context-diff-details[data-v-136213cf] { border: 1px solid var(--line); border-radius: 6px; padding: 7px 10px; color: var(--muted); font-size: 12px; background: var(--pane-soft);\n}\n.context-diff-details summary[data-v-136213cf] { cursor: pointer; color: var(--text); font-weight: 650;\n}\n.context-diff-details[open] summary[data-v-136213cf] { margin-bottom: 6px;\n}\n.run-metadata-grid[data-v-136213cf] { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 4px 12px;\n}\n.run-metadata-grid strong[data-v-136213cf] { color: var(--text); overflow-wrap: anywhere;\n}\n.metadata-note[data-v-136213cf] { margin: 7px 0 0; line-height: 1.4;\n}\n.context-diff-block[data-v-136213cf] { display: grid; grid-template-columns: 4px minmax(0, 1fr); border: 1px solid var(--line); border-radius: 6px; background: var(--pane); overflow: hidden;\n}\n.block-gutter[data-v-136213cf] { background: var(--line);\n}\n.context-diff-block.added .block-gutter[data-v-136213cf] { background: var(--success);\n}\n.context-diff-block.removed .block-gutter[data-v-136213cf] { background: var(--error);\n}\n.context-diff-block.modified .block-gutter[data-v-136213cf] { background: var(--warning);\n}\n.block-content[data-v-136213cf] { min-width: 0; padding: 9px 10px 10px;\n}\n.block-head[data-v-136213cf] { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 10px; margin-bottom: 7px;\n}\n.block-status[data-v-136213cf] { text-transform: uppercase; font-size: 11px; font-weight: 750; letter-spacing: .03em;\n}\n.context-diff-block.added .block-status[data-v-136213cf] { color: var(--success);\n}\n.context-diff-block.removed .block-status[data-v-136213cf] { color: var(--error);\n}\n.context-diff-block.modified .block-status[data-v-136213cf] { color: var(--warning);\n}\n.block-key[data-v-136213cf] { font-weight: 650;\n}\n.block-role[data-v-136213cf] { color: var(--muted); font-size: 12px;\n}\n.block-token-chip[data-v-136213cf] { margin-left: auto; border: 1px solid var(--line); border-radius: 999px; padding: 1px 8px; font-size: 12px; background: var(--control-muted);\n}\n.metadata-only-change[data-v-136213cf] { padding: 9px 10px; border: 1px solid color-mix(in srgb, var(--warning) 55%, var(--line)); border-radius: 4px; background: color-mix(in srgb, var(--warning) 10%, var(--pane)); color: var(--text); font-size: 12px; line-height: 1.45;\n}\n.git-diff[data-v-136213cf] { overflow: auto; border: 1px solid var(--line); border-radius: 4px; background: var(--code-bg); font: 12px/1.55 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n}\n.git-line[data-v-136213cf] { min-width: max-content; color: var(--code-text);\n}\n.git-diff.unified .git-line[data-v-136213cf] { display: grid; grid-template-columns: 44px 44px 20px minmax(max-content, 1fr);\n}\n.git-line.added[data-v-136213cf] { background: color-mix(in srgb, var(--success) 12%, var(--code-bg));\n}\n.git-line.removed[data-v-136213cf] { background: color-mix(in srgb, var(--error) 12%, var(--code-bg));\n}\n.git-line.blank[data-v-136213cf] { min-height: 19px; background: var(--pane-soft);\n}\n.git-line code[data-v-136213cf] { display: block; min-height: 1.55em; padding: 0 8px; white-space: pre;\n}\n.git-line mark[data-v-136213cf] { border-radius: 2px; background: color-mix(in srgb, currentColor 22%, transparent); color: inherit; font: inherit;\n}\n.line-number[data-v-136213cf] { padding: 0 7px; border-right: 1px solid var(--line); color: var(--muted); text-align: right; user-select: none;\n}\n.line-marker[data-v-136213cf] { text-align: center; user-select: none;\n}\n.git-line.added .line-marker[data-v-136213cf] { color: var(--success);\n}\n.git-line.removed .line-marker[data-v-136213cf] { color: var(--error);\n}\n.git-line.note[data-v-136213cf] { color: var(--muted); font-style: italic;\n}\n.note-side[data-v-136213cf] { color: var(--text); font-style: normal; font-weight: 650;\n}\n.git-line-separator[data-v-136213cf] { min-width: max-content; padding: 1px 12px; border-block: 1px solid var(--line); background: var(--accent-bg); color: var(--muted); text-align: center;\n}\n.split-header[data-v-136213cf] { position: sticky; top: 0; z-index: 1; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); min-width: 720px; border-bottom: 1px solid var(--line); background: var(--pane); color: var(--muted); font: 600 11px/1.8 system-ui, sans-serif; text-transform: uppercase;\n}\n.split-header span[data-v-136213cf] { padding-left: 52px;\n}\n.split-header span + span[data-v-136213cf] { border-left: 1px solid var(--line);\n}\n.split-line[data-v-136213cf] { display: grid; grid-template-columns: repeat(2, minmax(360px, 1fr)); min-width: 720px;\n}\n.split-line > .git-line[data-v-136213cf] { display: grid; grid-template-columns: 44px 20px minmax(max-content, 1fr);\n}\n.split-line > .git-line + .git-line[data-v-136213cf] { border-left: 1px solid var(--line);\n}\n.split-separator[data-v-136213cf] { min-width: 720px;\n}\n.context-diff-empty[data-v-136213cf] { color: var(--muted); padding: 20px; border: 1px dashed var(--line); border-radius: 6px;\n}\n.context-diff-empty.compact[data-v-136213cf] { padding: 12px;\n}\n.context-diff-error[data-v-136213cf] { padding: 10px; border: 1px solid var(--error); border-radius: 6px; background: var(--error-bg);\n}\n@media (max-width: 1100px) {\n.diff-view-controls[data-v-136213cf] { order: 3; margin-left: 0; width: 100%;\n}\n}\n@media (max-width: 900px) {\n.context-diff-expand[data-v-136213cf] { display: none;\n}\n}\n\n.app-root {\n\theight: 100%;\n\tmin-height: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n.surface-nav {\n\tflex: none;\n\theight: 40px;\n\tpadding: 4px 10px;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tborder-bottom: 1px solid var(--line);\n\tbackground: var(--pane);\n}\n.surface-brand {\n\tmargin-right: 8px;\n\tfont-weight: 750;\n\tletter-spacing: .02em;\n}\n.surface-nav button {\n\tmin-height: 32px;\n\tborder-color: transparent;\n\tbackground: transparent;\n}\n.surface-nav button.active {\n\tborder-color: var(--accent);\n\tbackground: var(--accent-bg);\n\tcolor: var(--accent);\n}\n.surface-nav-spacer {\n\tflex: 1 1 auto;\n}\n.surface-nav .theme-toggle {\n\tmin-height: 32px;\n\tborder-color: var(--line);\n\tbackground: var(--pane);\n}\n\n/* The global form rule gives every select width:100%; the locale picker in the\n nav bar must hug the right edge instead of stretching across it. */\n.surface-nav .locale-select {\n\tflex: none;\n\twidth: auto;\n\tmin-width: 0;\n\tmin-height: 32px;\n}\n\n/* Keep nav tab labels on one line (zh-CN labels wrapped in narrow headers). */\n.surface-nav button {\n\twhite-space: nowrap;\n}\n.editor-surface {\n\tflex: 1;\n\tmin-height: 0;\n}\n.settings-surface {\n\tflex: 1;\n\tmin-height: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground: var(--pane-soft);\n}\n.settings-surface-head {\n\tflex: none;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 24px;\n\tpadding: 18px 24px;\n\tborder-bottom: 1px solid var(--line);\n\tbackground: var(--pane);\n}\n.settings-surface-head h1 {\n\tmargin: 0;\n\tfont-size: 20px;\n}\n.settings-surface-head p {\n\tmargin: 4px 0 0;\n\tcolor: var(--muted);\n}\n.settings-surface-status {\n\tmargin-left: auto;\n\tcolor: var(--muted);\n\tfont-size: 12px;\n}\n.settings-surface-body {\n\tflex: 1;\n\tmin-height: 0;\n\tdisplay: grid;\n\tgrid-template-columns: minmax(180px, 240px) minmax(0, 1fr);\n}\n.settings-nav {\n\tmin-width: 0;\n\tpadding: 14px 10px;\n\tborder-right: 1px solid var(--line);\n\tbackground: var(--pane);\n}\n.settings-nav button {\n\twidth: 100%;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-start;\n\tmargin-bottom: 6px;\n}\n.settings-nav button.active {\n\tborder-color: var(--accent);\n\tbackground: var(--accent-bg);\n\tcolor: var(--accent);\n}\n.settings-panel {\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: auto;\n\tpadding: 20px clamp(16px, 4vw, 48px);\n}\n.settings-panel > .schema-form {\n\twidth: min(100%, 1100px);\n\tmargin: 0 auto;\n}\n.legacy-editor-root {\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n.legacy-editor-root .topbar {\n\tflex: none;\n}\n.editor-surface .shell {\n\tflex: 1;\n\tmin-height: 0;\n\theight: auto;\n}\n@media (max-width: 700px) {\n.surface-nav {\n\t\toverflow-x: auto;\n}\n.surface-nav > * {\n\t\tflex-shrink: 0;\n}\n.surface-nav-spacer {\n\t\tdisplay: none;\n}\n.settings-surface-head {\n\t\talign-items: flex-start;\n\t\tpadding: 14px 16px;\n}\n.settings-surface-status {\n\t\tmargin-left: auto;\n}\n.settings-surface-body {\n\t\tgrid-template-columns: minmax(0, 1fr);\n}\n.settings-nav {\n\t\tdisplay: flex;\n\t\tgap: 6px;\n\t\toverflow-x: auto;\n\t\tpadding: 8px;\n\t\tborder-right: 0;\n\t\tborder-bottom: 1px solid var(--line);\n}\n.settings-nav button {\n\t\twidth: auto;\n\t\tflex: 0 0 auto;\n\t\tmargin: 0;\n}\n.settings-panel {\n\t\tpadding: 14px 10px;\n}\n}\n/*$vite$:1*/";
3
3
  //# sourceMappingURL=client-styles.generated.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-styles.generated.js","sourceRoot":"","sources":["../../src/web-editor/client-styles.generated.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,oBAAoB,GAAW,6kpBAA6kpB,CAAC"}
1
+ {"version":3,"file":"client-styles.generated.js","sourceRoot":"","sources":["../../src/web-editor/client-styles.generated.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,oBAAoB,GAAW,kttBAAkttB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/web-editor/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,QAwuCzB,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/web-editor/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,QAszCzB,CAAC"}
@@ -14,6 +14,21 @@ export const EDITOR_STYLES = String.raw `
14
14
  --error: #b42318;
15
15
  --error-bg: #fde8e7;
16
16
  --success: #1f7a3a;
17
+ --role-system: #7564a8;
18
+ --role-user: #2f7d68;
19
+ --role-assistant: #3e76ad;
20
+ --role-tool-result: #b16b2e;
21
+ --item-block: #4f6f9f;
22
+ --item-slot: #8b5fa8;
23
+ --slot-chat-history: #2f8a78;
24
+ --slot-tools: #a36a2c;
25
+ --slot-tool-guidelines: #ad7a32;
26
+ --slot-skills: #4e7fa3;
27
+ --slot-project-context: #6977a8;
28
+ --slot-date: #8b6aa8;
29
+ --slot-date-cwd: #7b6095;
30
+ --slot-built-in: #5f7185;
31
+ --slot-custom: #8a667d;
17
32
  --control: #ffffff;
18
33
  --control-muted: #f3f5f8;
19
34
  --pane-soft: #fbfcfe;
@@ -37,6 +52,21 @@ body[data-theme="dark"] {
37
52
  --error: #f06f64;
38
53
  --error-bg: #3c1d1a;
39
54
  --success: #69c98c;
55
+ --role-system: #b8a8ec;
56
+ --role-user: #65c6a9;
57
+ --role-assistant: #82b9ef;
58
+ --role-tool-result: #e5ad70;
59
+ --item-block: #88a9dc;
60
+ --item-slot: #c59be0;
61
+ --slot-chat-history: #70d0ba;
62
+ --slot-tools: #e5aa68;
63
+ --slot-tool-guidelines: #e7bd74;
64
+ --slot-skills: #8fc5e8;
65
+ --slot-project-context: #a7b4eb;
66
+ --slot-date: #c6a8e9;
67
+ --slot-date-cwd: #b697dc;
68
+ --slot-built-in: #a9bacb;
69
+ --slot-custom: #d0a5c3;
40
70
  --control: #202327;
41
71
  --control-muted: #25292e;
42
72
  --pane-soft: #151719;
@@ -529,6 +559,7 @@ html, body {
529
559
  width: 100%;
530
560
  text-align: left;
531
561
  border: 1px solid var(--line);
562
+ border-left-width: 3px;
532
563
  background: var(--row);
533
564
  border-radius: 6px;
534
565
  padding: 8px;
@@ -543,10 +574,24 @@ html, body {
543
574
  .item-row:active {
544
575
  cursor: grabbing;
545
576
  }
577
+ .item-row.kind-block {
578
+ border-left-color: var(--item-block);
579
+ }
580
+ .item-row.kind-slot {
581
+ border-left-color: var(--item-slot);
582
+ }
546
583
  .item-row.selected {
547
- border-color: var(--accent);
584
+ border-top-color: var(--accent);
585
+ border-right-color: var(--accent);
586
+ border-bottom-color: var(--accent);
548
587
  background: var(--accent-bg);
549
588
  }
589
+ .item-row.selected.kind-block {
590
+ border-left-color: var(--item-block);
591
+ }
592
+ .item-row.selected.kind-slot {
593
+ border-left-color: var(--item-slot);
594
+ }
550
595
  .item-row.disabled {
551
596
  opacity: .62;
552
597
  }
@@ -617,6 +662,39 @@ html, body {
617
662
  background: var(--warning-bg);
618
663
  border-color: var(--warning);
619
664
  }
665
+ .item-kind-badge,
666
+ .item-slot-badge {
667
+ display: inline-block;
668
+ border: 1px solid currentColor;
669
+ border-radius: 999px;
670
+ padding: 0 6px;
671
+ line-height: 17px;
672
+ font-size: 11px;
673
+ font-weight: 650;
674
+ }
675
+ .item-kind-badge {
676
+ margin-right: 4px;
677
+ }
678
+ .item-kind-badge.block {
679
+ color: var(--item-block);
680
+ background: color-mix(in srgb, var(--item-block) 12%, var(--row));
681
+ }
682
+ .item-kind-badge.slot {
683
+ color: var(--item-slot);
684
+ background: color-mix(in srgb, var(--item-slot) 12%, var(--row));
685
+ }
686
+ .item-slot-badge {
687
+ margin-left: 2px;
688
+ }
689
+ .item-slot-badge.slot-chat-history { color: var(--slot-chat-history); background: color-mix(in srgb, var(--slot-chat-history) 12%, var(--row)); }
690
+ .item-slot-badge.slot-tools { color: var(--slot-tools); background: color-mix(in srgb, var(--slot-tools) 12%, var(--row)); }
691
+ .item-slot-badge.slot-tool-guidelines { color: var(--slot-tool-guidelines); background: color-mix(in srgb, var(--slot-tool-guidelines) 12%, var(--row)); }
692
+ .item-slot-badge.slot-skills { color: var(--slot-skills); background: color-mix(in srgb, var(--slot-skills) 12%, var(--row)); }
693
+ .item-slot-badge.slot-project-context { color: var(--slot-project-context); background: color-mix(in srgb, var(--slot-project-context) 12%, var(--row)); }
694
+ .item-slot-badge.slot-date { color: var(--slot-date); background: color-mix(in srgb, var(--slot-date) 12%, var(--row)); }
695
+ .item-slot-badge.slot-date-cwd { color: var(--slot-date-cwd); background: color-mix(in srgb, var(--slot-date-cwd) 12%, var(--row)); }
696
+ .item-slot-badge.slot-built-in { color: var(--slot-built-in); background: color-mix(in srgb, var(--slot-built-in) 12%, var(--row)); }
697
+ .item-slot-badge.slot-custom { color: var(--slot-custom); background: color-mix(in srgb, var(--slot-custom) 12%, var(--row)); }
620
698
  .item-title {
621
699
  font-weight: 650;
622
700
  overflow-wrap: anywhere;
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/web-editor/styles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwuCtC,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/web-editor/styles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAszCtC,CAAC"}
@@ -0,0 +1,229 @@
1
+ # pi-forge `system_update` Design Notes
2
+
3
+ **Status:** Current plan (revised 2026-09-12). Supersedes the 2026-09-10
4
+ exploration draft, which assumed pi-forge would implement the full
5
+ persistence/projection/transport stack itself. Upstream Pi has since started
6
+ building the primitive natively, so pi-forge's scope shrinks to the
7
+ workflow layer.
8
+
9
+ **Target:** 0.5.5+, blocked on an upstream Pi redo (see §2).
10
+
11
+ ---
12
+
13
+ ## 1. TL;DR — Current Plan
14
+
15
+ `system_update` is a **session-timeline event**, not a mutation of the
16
+ top-level system prompt. That core decision from the original draft survives.
17
+ What changed is who builds what:
18
+
19
+ - **Upstream Pi is building the primitive**: a first-class `SystemMessage`
20
+ (`role: "system"`) appended to the transcript, rendered natively on models
21
+ that support mid-conversation system messages and as a tagged user turn
22
+ elsewhere. Persistence, resume, compaction, and provider rendering are all
23
+ owned by the harness.
24
+ - **pi-forge builds only the workflow layer**: an append-only event log, a
25
+ reducer over it, the `/system-update` command family, preset-declared
26
+ dormant instruction blocks, and a permission-gated agent tool.
27
+ - **Integration is declarative**: pi-forge renders its active update set into
28
+ `systemPromptOptions.sections` and lets the harness diff engine emit the
29
+ deltas. pi-forge no longer returns a fully-compiled replacement string for
30
+ this path.
31
+
32
+ Discarded from the original draft: the custom-entry + self-written projector
33
+ design, the `custom_message` transport, the provider transport matrix, and
34
+ the six-phase rollout. See §5 for why.
35
+
36
+ ---
37
+
38
+ ## 2. Upstream Landscape (snapshot 2026-09-12)
39
+
40
+ ### 2.1 The PRs
41
+
42
+ - **PR #9116** (`system-role` branch, pi-ai layer): adds `SystemMessage` to
43
+ the `Message` union. Appended to the transcript, never folded into
44
+ `Context.systemPrompt`. Persisted as ordinary message entries; compaction
45
+ cut points and summaries understand them (rendered as `[System]:` in
46
+ summaries); interactive mode hides them.
47
+ - **PR #9117** (`system-tool-deltas` branch, stacked, coding-agent layer):
48
+ the first rendered prompt of a session becomes a stored **baseline**;
49
+ anything that changes afterwards is appended as a provider-neutral system
50
+ message delta. On resume/tree navigation the stored baseline is reinstated
51
+ so a resumed session sends byte-identical cached prefixes. After
52
+ compaction, the effective prompt folds into a fresh baseline at no extra
53
+ cost.
54
+
55
+ **Both PRs were closed by the author on 2026-09-11 with "I will redo this."**
56
+ Direction is alive; implementation is being redone; timeline unknown.
57
+ Community testing (13-scenario harness, all green) flagged two design
58
+ issues likely motivating the redo: ~10 KB per-prompt-entry session bloat
59
+ from storing rendered baselines, and silent tool disappearance on
60
+ non-supporting models across resume.
61
+
62
+ ### 2.2 Verified behavior of the PR branch (local clone: `~/programming/pi-pr9117`)
63
+
64
+ Measured against the actual `system-tool-deltas` build:
65
+
66
+ - `sections: Record<string, string>` on `systemPromptOptions` renders as
67
+ XML-wrapped blocks (`<name>\n...\n</name>`), diff-keyed as `section:name`.
68
+ - `diffSystemPrompts` behavior matrix:
69
+ - identical pieces → `unchanged` (no cost)
70
+ - section added → update delta: "The following `<name>` system guidance
71
+ now applies: ..."
72
+ - section removed → retraction: "The previous `<name>` system guidance no
73
+ longer applies."
74
+ - section content changed → "The `<name>` system guidance has changed. The
75
+ following supersedes..."
76
+ - literals changed or `forceSystemPrompt` changed → `replace`
77
+ (deliberate full cache miss)
78
+ - **`forceSystemPrompt` short-circuits everything**: when set, pieces are
79
+ only the forced prompt; sections are not rendered at all. Any extension
80
+ returning a full replacement string from `before_agent_start` gets this
81
+ path, and every content change is a full prefix miss.
82
+ - **`customPrompt` is a value piece** (keyed `customPrompt`, diff-friendly)
83
+ and does NOT short-circuit sections. This is pi-forge's integration point
84
+ for `mode = replace` stacks.
85
+ - Mid-run timing: the diff runs before every LLM request
86
+ (`agent-loop.ts`), including mid-tool-loop, so an agent tool that mutates
87
+ sections gets its delta delivered after the tool batch and before the next
88
+ inference. The tool-call adjacency problem from the original draft is
89
+ handled by the harness.
90
+ - Fallback rendering for unsupported providers:
91
+ `<system_update>\n{text}\n</system_update>` as a user-role message
92
+ (`pi-ai/utils/system-messages.ts`); Gemini confirmed user-role.
93
+ - Native support matrix (upstream compat flags): Anthropic Opus 4.8/5,
94
+ Fable 5/5.1, Mythos 5/5.1 get real system messages (Anthropic requires a
95
+ system message to directly precede an assistant turn; pending messages are
96
+ held). OpenAI transports get `developer`/`system` items. Everything else
97
+ gets the tagged user turn.
98
+ - `BeforeAgentStartEventResult.message` only accepts `CustomMessage`
99
+ (customType/content/display/details) — there is **no imperative
100
+ append-SystemMessage extension API** in the PR as written. The declarative
101
+ sections path is the intended extension surface.
102
+ - The PR branch itself had two TypeScript errors (`openrouter.ts`,
103
+ `xai.ts`) when we built it; dist artifacts were still produced.
104
+
105
+ ### 2.3 Trigger to resume this work
106
+
107
+ When the redone PR appears: verify the sections/diff semantics survived the
108
+ redo (re-run the §2.2 matrix), then wire pi-forge's workflow layer to it.
109
+ If the redo removes the declarative sections surface, reassess; the escape
110
+ hatch is splicing `SystemMessage` in the context hook (see §5).
111
+
112
+ ---
113
+
114
+ ## 3. pi-forge Design (workflow layer)
115
+
116
+ These decisions survive from the original draft and remain the plan.
117
+
118
+ ### 3.1 Event model
119
+
120
+ - Updates are **append-only custom session entries**
121
+ (`pi-forge-system-update`, schemaVersion 1), written via the existing
122
+ `session-adapter.ts` pattern (`pi.appendEntry` / `getCurrentBranchEntries`).
123
+ Branch semantics come for free.
124
+ - Entry payload: `{ updateId, op: "apply" | "revoke" | "reset", source,
125
+ presetId?, contentSnapshot, createdAt }`.
126
+ - **Snapshot content, not file paths**: file-backed presets are rendered at
127
+ activation time and the rendered text is persisted. Editing a preset file
128
+ tomorrow must not alter yesterday's session.
129
+ - Logical state is a **reducer view** over the branch's events, never
130
+ canonical mutable state. Powers `/system-update status`, badges, and
131
+ section rendering.
132
+ - Revoke/reset are new events, never history rewrites. In practice the
133
+ harness retraction wording ("no longer applies") is generated for us once
134
+ the section disappears; the event log only records intent.
135
+
136
+ ### 3.2 Rendering (the declarative bridge)
137
+
138
+ - The reducer's active set is rendered into
139
+ `systemPromptOptions.sections["pi-forge-update-<id>"]` during
140
+ `before_agent_start` (and picked up mid-run by the harness's per-request
141
+ diff).
142
+ - pi-forge's stack compilation moves off the legacy "return one big string"
143
+ path: `mode = replace` stacks go into `systemPromptOptions.customPrompt`,
144
+ additive content into keyed `sections`. This is a prerequisite refactor,
145
+ and it upgrades cache behavior for the whole stack system, not just
146
+ updates.
147
+ - Transport is not pi-forge's concern: native vs fallback rendering is the
148
+ harness's compatibility layer.
149
+
150
+ ### 3.3 Commands
151
+
152
+ - `/system-update <text>` — apply a freeform update (auto-id `update-N`).
153
+ - `/system-update status` — reducer view of active updates.
154
+ - `/system-update reset` — deactivate all (new event, append-only).
155
+ - 0.5.5+ with presets: `/system-update list|use <id>|off <id>`.
156
+ - No command deletes history. None of these trigger an agent turn.
157
+
158
+ ### 3.4 Presets and the agent tool
159
+
160
+ - Presets declare dormant runtime blocks:
161
+ `{ "systemUpdates": [{ "id", "name", "description", "modelCallable",
162
+ "content" | "file" }] }`.
163
+ - The base system prompt carries only a compact inventory; full blocks load
164
+ on activation (lazy privileged prompt loading).
165
+ - Agent-facing tool `forge_system_update({action, id})` references declared
166
+ preset IDs only. **No arbitrary file elevation, no arbitrary agent-provided
167
+ privileged text.** Repository content is untrusted; elevation requires an
168
+ explicit preset declaration.
169
+ - Source-aware deactivation: the agent may only deactivate agent-activated
170
+ modes; the user may deactivate anything.
171
+ - Mid-turn activation rides the harness's per-request diff — no
172
+ pending-commit machinery on our side.
173
+
174
+ ### 3.5 Compaction, resume, branching
175
+
176
+ All owned by the harness under the new architecture: update sections are part
177
+ of the effective prompt, folded into the post-compaction baseline; stored
178
+ baseline is reinstated on resume; events live on the branch. pi-forge's only
179
+ job is to re-derive the active set from the branch's event log on session
180
+ start/branch switch (same restore pattern as the active-stack state today).
181
+
182
+ ---
183
+
184
+ ## 4. Version Plan
185
+
186
+ - **0.5.4 (done, pushed):** web editor fixes and visual work; prompt-cache
187
+ features — cache-impact warning on `/preset use` / `/profile use`
188
+ (common-prefix estimate + last-request cacheRead), and compile-time
189
+ diagnostics for cache-sensitive content (`{{time}}`, date slots with
190
+ `includeTime`, `{{date}}` info).
191
+ - **0.5.5:** system update workflow layer per §3, gated on the upstream redo
192
+ landing in a released Pi. Build the upstream-touching code behind a small
193
+ isolated module so a redo API change rewrites one file, not the feature.
194
+
195
+ ---
196
+
197
+ ## 5. Discarded Designs (recorded so we don't re-litigate)
198
+
199
+ - **Custom entry + self-written projector** (original draft's main design):
200
+ required replicating Pi's session-entry→context translation rules
201
+ (compaction truncation, deferred-message filtering) to compute splice
202
+ positions, plus a compaction checkpoint synthesizer. Real maintenance
203
+ coupling to Pi internals. Killed by the upstream `SystemMessage`.
204
+ - **`pi.sendMessage` custom_message transport**: zero projection code, but
205
+ `custom_message` entries evaporate at compaction (the compaction path
206
+ doesn't recognize them) and render only as user-role. Viable fallback if
207
+ the upstream redo dies entirely; otherwise obsolete.
208
+ - **Provider transport matrix / native lowering in pi-forge**: the wire role
209
+ is the harness's compatibility layer. pi-forge stores semantics
210
+ (`op`, `presetId`) so a future transport change needs no data migration.
211
+ - **Context-hook SystemMessage splicing**: possible once upstream keeps
212
+ `role: "system"` messages, but brings back per-request projection, position
213
+ mapping, and Anthropic placement-rule handling. Escape hatch only.
214
+
215
+ ---
216
+
217
+ ## 6. Open Questions for the Redo
218
+
219
+ 1. Did sections survive the redo, and did their diff semantics change?
220
+ 2. Is there an imperative append path for extensions after all, or is
221
+ declarative sections still the only surface?
222
+ 3. How does the redo store baselines (the session-bloat feedback)?
223
+ 4. Does `customPrompt` remain a non-short-circuiting value piece?
224
+ 5. Timing: which Pi release carries it, and what's our minimum-version
225
+ dependency story for the feature?
226
+
227
+ Community posture: when the redo PR opens, comment as a downstream consumer
228
+ with the runtime-instruction-modes use case (do not file a new issue;
229
+ feature-request issues get auto-closed while a PR is in flight).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zihanw/pi-forge",
3
- "version": "0.5.3",
3
+ "version": "0.5.4",
4
4
  "description": "Pi extension for editable context presets, one-shot agent profiles, tool policy, and request debugging.",
5
5
  "repository": {
6
6
  "type": "git",