@piagent/platform 1.47.0 → 1.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +16 -3
  3. package/README.vi.md +16 -3
  4. package/docs/command-reference-vietnamese.md +4 -4
  5. package/docs/company-dev-commands.md +4 -4
  6. package/docs/distribution-standard.md +6 -6
  7. package/docs/languages.json +2 -2
  8. package/docs/operator-manual-vietnamese.md +7 -7
  9. package/docs/publishing-for-teams.md +1 -0
  10. package/docs/release-install-policy.md +2 -2
  11. package/docs/security-threat-model.md +3 -1
  12. package/docs/team-onboarding.md +2 -2
  13. package/docs-site/architecture.html +1 -1
  14. package/docs-site/assets/search-en.json +1 -1
  15. package/docs-site/assets/search-vi.json +1 -1
  16. package/docs-site/benchmark.html +1 -1
  17. package/docs-site/commands.html +1 -1
  18. package/docs-site/context-engine.html +1 -1
  19. package/docs-site/ecosystem.html +1 -1
  20. package/docs-site/en/architecture.html +1 -1
  21. package/docs-site/en/benchmark.html +1 -1
  22. package/docs-site/en/commands.html +1 -1
  23. package/docs-site/en/context-engine.html +1 -1
  24. package/docs-site/en/ecosystem.html +1 -1
  25. package/docs-site/en/index.html +9 -9
  26. package/docs-site/en/mcp-approval.html +1 -1
  27. package/docs-site/en/mcp-auth.html +1 -1
  28. package/docs-site/en/mcp-servers.html +1 -1
  29. package/docs-site/en/mcp.html +1 -1
  30. package/docs-site/en/permissions.html +1 -1
  31. package/docs-site/en/profiles.html +1 -1
  32. package/docs-site/en/quickstart.html +1 -1
  33. package/docs-site/en/runtime.html +1 -1
  34. package/docs-site/en/scope.html +1 -1
  35. package/docs-site/en/security.html +1 -1
  36. package/docs-site/en/team.html +1 -1
  37. package/docs-site/en/update.html +3 -3
  38. package/docs-site/en/whats-new.html +33 -18
  39. package/docs-site/en/windows.html +1 -1
  40. package/docs-site/en/workflows.html +1 -1
  41. package/docs-site/index.html +9 -9
  42. package/docs-site/mcp-approval.html +1 -1
  43. package/docs-site/mcp-auth.html +1 -1
  44. package/docs-site/mcp-servers.html +1 -1
  45. package/docs-site/mcp.html +1 -1
  46. package/docs-site/permissions.html +1 -1
  47. package/docs-site/profiles.html +1 -1
  48. package/docs-site/quickstart.html +1 -1
  49. package/docs-site/releases.json +51 -0
  50. package/docs-site/runtime.html +1 -1
  51. package/docs-site/scope.html +1 -1
  52. package/docs-site/security.html +1 -1
  53. package/docs-site/team.html +1 -1
  54. package/docs-site/update.html +3 -3
  55. package/docs-site/whats-new.html +33 -18
  56. package/docs-site/windows.html +1 -1
  57. package/docs-site/workflows.html +1 -1
  58. package/evals/private-holdout-v1/public-exposure.v2.json +2 -2
  59. package/package.json +2 -1
  60. package/packages/piagent-core/extensions/guard-types.ts +10 -2
  61. package/packages/piagent-core/extensions/piagent-guard.ts +104 -23
  62. package/packages/piagent-core/extensions/policy-core.js +7 -7
  63. package/packages/piagent-core/extensions/shell-ast.js +85 -0
  64. package/packages/piagent-core/extensions/shell-command-words.js +19 -0
  65. package/packages/piagent-core/managed/command-tools.mjs +54 -24
  66. package/packages/piagent-core/managed/fetch-guard.mjs +3 -3
  67. package/packages/piagent-core/managed/host-command.mjs +15 -7
  68. package/packages/piagent-core/managed/member-mcp.mjs +34 -9
  69. package/packages/piagent-core/managed/permission.mjs +19 -12
  70. package/packages/piagent-core/managed/repository-operation.mjs +1 -1
  71. package/packages/piagent-core/managed/session.mjs +2 -2
  72. package/packages/piagent-core/package.json +1 -1
  73. package/packages/piagent-core/runtime/hooks/session-start-hook.ts +1 -1
  74. package/packages/piagent-core/runtime/inspection/approval-broker.ts +33 -16
  75. package/packages/piagent-core/runtime/policy/handoff-policy.mjs +144 -0
  76. package/packages/piagent-core/runtime/registration/permission-commands.ts +2 -2
  77. package/packages/piagent-webui/dist/client/assets/{App-CiwY9VpU.js → App-fZeIRoaD.js} +1 -1
  78. package/packages/piagent-webui/dist/client/assets/{GatewayApp-DrNJW3v_.js → GatewayApp-CpC4lgYK.js} +17 -15
  79. package/packages/piagent-webui/dist/client/assets/{InspectionApp-BBiwSaV0.js → InspectionApp-pD-BqBXm.js} +1 -1
  80. package/packages/piagent-webui/dist/client/assets/{SessionAgentWorkspace-DwyPebIX.js → SessionAgentWorkspace-3tM7Q6HH.js} +1 -1
  81. package/packages/piagent-webui/dist/client/assets/{SessionInspectorDrawer-CpVzaf_G.js → SessionInspectorDrawer-BJ94aQ6y.js} +2 -2
  82. package/packages/piagent-webui/dist/client/assets/SettingsNavigation-BFfqMcuL.js +3 -0
  83. package/packages/piagent-webui/dist/client/assets/SettingsPage-CxpZ7cdM.js +1 -0
  84. package/packages/piagent-webui/dist/client/assets/{TerminalPanel-B8j_r6-y.js → TerminalPanel-CtZyb0tj.js} +1 -1
  85. package/packages/piagent-webui/dist/client/assets/{WorkspaceCodeEditor-BDTPvq-0.js → WorkspaceCodeEditor-BS_ZrjPN.js} +1 -1
  86. package/packages/piagent-webui/dist/client/assets/{WorkspaceExplorer-DVsNU0eu.js → WorkspaceExplorer-CkFBpcM7.js} +3 -3
  87. package/packages/piagent-webui/dist/client/assets/{index-uhJMXxqD.js → index-CNdhIouM.js} +2 -2
  88. package/packages/piagent-webui/dist/client/assets/{index-Dqb2hNan.css → index-CjM70M7D.css} +1 -1
  89. package/packages/piagent-webui/dist/client/assets/transcript-view-model-CpEMY1xb.js +3 -0
  90. package/packages/piagent-webui/dist/client/index.html +2 -2
  91. package/packages/piagent-webui/gateway/gateway-events.ts +5 -1
  92. package/packages/piagent-webui/server/gateway-websocket.ts +5 -1
  93. package/schemas/piagent-webui/approval-v1.schema.json +3 -1
  94. package/schemas/project-profile.schema.json +16 -0
  95. package/scripts/company-terminal.mjs +5 -5
  96. package/scripts/verify-release-identity.mjs +1 -1
  97. package/packages/piagent-core/runtime/policy/bypass-policy.mjs +0 -42
  98. package/packages/piagent-webui/dist/client/assets/SettingsNavigation-C-tO5iXn.js +0 -3
  99. package/packages/piagent-webui/dist/client/assets/SettingsPage-Ca-qRSZa.js +0 -1
  100. package/packages/piagent-webui/dist/client/assets/transcript-view-model-Bq0nkxyu.js +0 -3
@@ -1 +1 @@
1
- :root{color:var(--text);background:var(--bg);font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;--bg:var(--piagent-palette-background-default,#09090b);--surface:var(--piagent-palette-background-paper,#111114);--text:var(--piagent-palette-text-primary,#ededf0);--muted:var(--piagent-palette-text-secondary,#a3a3ad);--line:var(--piagent-palette-divider,#26262c);--accent:var(--piagent-palette-primary-main,#d8ff7a);--on-accent:var(--piagent-palette-primary-contrastText,#111300);--positive:var(--piagent-palette-secondary-main,#8be9c8);--warning:var(--piagent-palette-warning-main,#efba63);--danger:var(--piagent-palette-error-main,#ff7f86);--surface-strong:color-mix(in srgb, var(--text) 5%, var(--surface));--surface-2:color-mix(in srgb, var(--text) 4%, var(--surface));--line-strong:color-mix(in srgb, var(--text) 18%, var(--surface));--quiet:var(--muted);--accent-soft:color-mix(in srgb, var(--accent) 12%, transparent);--blue:color-mix(in srgb, #7aa2f7 38%, var(--text));--amber:var(--warning);--red:var(--danger);--page-glow:transparent;--radius:8px;--radius-sm:6px;font-family:system-ui,-apple-system,BlinkMacSystemFont,SF Pro Text,Segoe UI,Roboto,sans-serif}*{box-sizing:border-box}html{background:var(--bg)}body{min-width:320px;min-height:100vh;color:var(--text);background:radial-gradient(circle at 62% -20%, var(--page-glow) 0, transparent 36rem), var(--bg);margin:0}button,input,select,textarea{font:inherit}strong,h1,h2,h3,p{overflow-wrap:anywhere}button:focus-visible,a:focus-visible,summary:focus-visible{outline:2px solid var(--accent);outline-offset:3px}.skip-link{z-index:100;border-radius:var(--radius-sm);color:#08130f;background:var(--accent);padding:9px 12px;font-size:11px;font-weight:650;position:fixed;top:8px;left:8px;transform:translateY(-160%)}.skip-link:focus{transform:translateY(0)}.app-shell{min-height:100vh}.topbar{z-index:10;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);background:#090c12db;border-bottom:1px solid #354052b8;grid-template-columns:1fr minmax(220px,auto) 1fr;align-items:center;gap:24px;min-height:68px;padding:0 28px;display:grid;position:sticky;top:0}.brand,.session-title,.topbar-actions,.runtime-strip>div,.task-meta,.health-line{align-items:center;display:flex}.brand{gap:11px}.brand>div,.session-title{flex-direction:column;display:flex}.brand strong{letter-spacing:.01em;font-size:15px}.brand small,.session-title small{color:var(--quiet);letter-spacing:.04em;font-size:11px}.brand-mark{border-radius:var(--radius-sm);width:34px;height:34px;color:var(--accent);background:var(--accent-soft);border:1px solid #64e0b56b;place-items:center;font-family:Georgia,serif;font-size:21px;display:grid}.session-title{text-align:center;min-width:0}.session-title strong{text-overflow:ellipsis;white-space:nowrap;max-width:360px;font-size:13px;overflow:hidden}.topbar-actions{justify-content:flex-end;gap:10px}.read-only-badge{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--muted);text-transform:uppercase;letter-spacing:.08em;padding:5px 9px;font-size:11px;font-weight:600}.workspace{width:min(1460px,100% - 48px);margin:0 auto;padding:28px 0 64px}.runtime-strip{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-2);grid-template-columns:repeat(6,minmax(0,1fr));display:grid;overflow:hidden}.runtime-strip>div{border-right:1px solid var(--line);flex-direction:column;justify-content:center;align-items:flex-start;gap:7px;min-width:0;min-height:70px;padding:13px 16px}.runtime-strip>div:last-child{border-right:0}.runtime-strip span:first-child{color:var(--quiet);letter-spacing:.1em;text-transform:uppercase;font-size:11px;font-weight:650}.runtime-strip strong{max-width:100%;color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.content-grid{grid-template-columns:minmax(0,1fr) 290px;align-items:start;gap:18px;margin-top:18px;display:grid}.surface{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface);box-shadow:0 22px 60px #0000001f}.task-dashboard{padding:clamp(20px,3vw,34px)}.task-heading{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:24px;display:grid}.section-kicker{color:var(--accent);letter-spacing:.14em;text-transform:uppercase;margin:0 0 7px;font-size:11px;font-weight:650}.task-heading h2,.task-empty h2{max-width:900px;color:var(--text);letter-spacing:-.035em;margin:0;font-size:clamp(23px,3vw,38px);font-weight:650;line-height:1.18}.task-meta{color:var(--muted);flex-wrap:wrap;gap:12px;margin-top:15px;font-size:12px}.task-meta>span:not(.status-pill){border-left:1px solid var(--line-strong);padding-left:12px}.progress-number{text-align:right;min-width:116px}.progress-number strong{color:var(--accent);letter-spacing:-.05em;font-size:32px;font-weight:650;display:block}.progress-number span{color:var(--muted);font-size:11px}.progress-track{border-radius:var(--radius-sm);background:#242b36;height:5px;margin:26px 0 30px;overflow:hidden}.progress-track span{border-radius:inherit;background:linear-gradient(90deg,#45c89b,#7ee6bd);height:100%;transition:width .25s;display:block;box-shadow:0 0 20px #64e0b552}.status-pill{width:-moz-fit-content;width:fit-content;min-width:0;color:var(--text);white-space:nowrap;align-items:center;gap:6px;font-size:11px;font-weight:600;line-height:1.2;display:inline-flex}.status-dot{width:6px;height:6px;box-shadow:0 0 0 3px color-mix(in srgb, currentColor 13%, transparent);background:currentColor;border-radius:50%;flex:none}.tone-positive{color:var(--accent)}.tone-warning{color:var(--amber)}.tone-danger{color:var(--red)}.tone-info{color:var(--blue)}.tone-neutral{color:var(--muted)}.criteria-heading{justify-content:space-between;align-items:baseline;gap:16px;margin-bottom:12px;display:flex}.criteria-heading h2{letter-spacing:.01em;margin:0;font-size:13px}.criteria-heading>span{color:var(--quiet);font-size:11px}.criteria-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.criterion-card{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-2);grid-template-columns:38px minmax(0,1fr) auto;align-items:center;gap:14px;min-height:72px;padding:12px 15px;display:grid}.criterion-index{border:1px solid color-mix(in srgb, currentColor 28%, transparent);border-radius:var(--radius-sm);background:color-mix(in srgb, currentColor 7%, transparent);place-items:center;width:32px;height:32px;font-size:11px;font-weight:650;display:grid}.criterion-copy{min-width:0}.criterion-copy>div{align-items:center;gap:9px;display:flex}.criterion-copy p{color:var(--text);margin:0;font-size:13px;line-height:1.45}.criterion-copy small{color:var(--quiet);margin-top:4px;font-size:11px;display:block}.critical-tag{border-radius:var(--radius-sm);color:var(--amber);letter-spacing:.08em;text-transform:uppercase;border:1px solid #efba633d;flex:none;padding:3px 6px;font-size:10px;font-weight:650}.blocker{border-radius:var(--radius-sm);background:#ff7f8612;border:1px solid #ff7f8640;grid-template-columns:auto 1fr;gap:14px;margin:-9px 0 24px;padding:12px 14px;display:grid}.blocker span{color:var(--red);text-transform:uppercase;font-size:11px;font-weight:650}.blocker p{color:var(--text);margin:0;font-size:12px}.work-plan{border-top:1px solid var(--line);color:var(--muted);margin-top:16px;padding-top:15px}.work-plan summary{cursor:pointer;font-size:12px;font-weight:600}.work-plan ol{gap:9px;margin:14px 0 0;padding:0;list-style:none;display:grid}.work-plan li{grid-template-columns:100px 1fr;align-items:center;gap:12px;font-size:12px;display:grid}.context-rail{gap:18px;display:grid}.compact-panel{padding:18px}.compact-panel dl{margin:0}.compact-panel dl>div{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:16px;min-height:39px;display:flex}.compact-panel dl>div:last-child{border-bottom:0}.compact-panel dt{color:var(--muted);font-size:11px}.compact-panel dd{max-width:170px;color:var(--text);text-overflow:ellipsis;white-space:nowrap;margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;overflow:hidden}.health-line{justify-content:space-between;gap:12px}.health-line>span{color:var(--quiet);font-size:11px}.health-issue{border-top:1px solid var(--line);color:var(--muted);margin:13px 0 0;padding-top:12px;font-size:11px;line-height:1.5}.task-empty{grid-template-columns:auto minmax(0,620px);place-content:center;gap:24px;min-height:420px;padding:48px;display:grid}.task-empty .empty-mark{border-radius:var(--radius-sm);width:64px;height:64px;color:var(--accent);background:var(--accent-soft);border:1px solid #64e0b547;place-items:center;font-family:Georgia,serif;font-size:38px;display:grid}.task-empty p:last-child{color:var(--muted);margin:13px 0 0;font-size:13px;line-height:1.6}.chat-panel{margin-top:18px;position:relative;overflow:hidden}.chat-panel[data-dragging]{outline:2px dashed var(--accent);outline-offset:-4px}.chat-drop-overlay{z-index:4;border-radius:var(--radius-sm);background:color-mix(in srgb, var(--surface-strong) 88%, transparent);pointer-events:none;text-align:center;align-content:center;justify-items:center;gap:6px;padding:16px;display:grid;position:absolute;inset:0}.chat-drop-overlay strong{color:var(--accent);font-size:13px}.chat-drop-overlay small{color:var(--quiet);font-size:11px}@media (prefers-reduced-motion:no-preference){.chat-drop-overlay{animation:.12s ease-out chat-drop-in}}@keyframes chat-drop-in{0%{opacity:0}to{opacity:1}}.chat-heading{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:20px;min-height:78px;padding:17px 22px;display:flex}.chat-heading h2{letter-spacing:-.02em;margin:0;font-size:18px}.chat-heading>div:last-child{color:var(--quiet);align-items:center;gap:12px;font-size:11px;display:flex}.chat-read-state{border-radius:var(--radius-sm);color:var(--amber);background:#efba630f;border:1px solid #efba633b;padding:5px 8px}.chat-body{background:var(--surface-2);overscroll-behavior:contain;gap:11px;max-height:620px;padding:18px 20px;display:grid;overflow:auto}.chat-empty{color:var(--quiet);text-align:center;margin:0;padding:28px;font-size:11px}.load-older{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--muted);background:var(--surface);cursor:pointer;justify-self:center;padding:6px 10px;font-size:11px}.chat-message{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-2);width:min(82%,900px);padding:12px 14px}.chat-message>div{justify-content:space-between;align-items:center;gap:12px;display:flex}.chat-message strong{color:var(--text);letter-spacing:.04em;text-transform:uppercase;font-size:11px}.chat-message time,.chat-message small{color:var(--quiet);font-size:10.5px}.chat-message p{color:var(--text);white-space:pre-wrap;margin:7px 0 0;font-size:12px;line-height:1.6}.chat-message small{color:var(--amber);margin-top:7px;display:block}.chat-user{background:#75a7ff12;border-color:#75a7ff38;justify-self:end}.chat-assistant{justify-self:start}.chat-streaming{box-shadow:inset 2px 0 var(--accent);border-color:#64e0b542}.stream-indicator{color:var(--accent);font-size:10.5px}.chat-tool-live,.chat-tool-result{border:1px solid var(--line);border-radius:var(--radius-sm);width:-moz-fit-content;width:fit-content;max-width:82%;color:var(--quiet);background:var(--surface-2);align-items:center;gap:9px;padding:8px 11px;font-size:10.5px;display:flex}.chat-tool-live strong,.chat-tool-result strong{color:var(--text);font-family:ui-monospace,monospace;font-size:11px}.tool-spinner{border:1px solid var(--blue);border-right-color:#0000;border-radius:50%;width:7px;height:7px;animation:.8s linear infinite spin}.held-queue{border-top:1px solid var(--line);background:#efba6309;padding:12px 16px}.held-queue-heading{justify-content:space-between;align-items:center;gap:12px;margin-bottom:8px;display:flex}.held-queue-heading strong{color:var(--text);letter-spacing:.04em;text-transform:uppercase;font-size:11px}.held-queue-heading span{color:var(--amber);font-size:10.5px}.held-queue ol{gap:7px;max-height:260px;margin:0;padding:0;list-style:none;display:grid;overflow:auto}.held-queue li{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-2);grid-template-columns:minmax(0,1fr) auto;gap:7px 12px;padding:9px 10px;display:grid}.held-queue li[data-state=quarantined]{border-color:#efba6340}.held-queue p{color:var(--text);text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:11px;line-height:1.45;overflow:hidden}.held-queue textarea{resize:vertical;border:1px solid var(--line);border-radius:var(--radius-sm);min-width:0;color:var(--text);background:var(--surface-2);padding:8px 9px;font-size:11px}.held-queue li>div{align-items:start;gap:5px;display:flex}.held-queue button{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--muted);background:var(--surface);cursor:pointer;padding:4px 7px;font-size:10.5px}.held-queue button:disabled{cursor:not-allowed;opacity:.45}.held-queue small{color:var(--amber);grid-column:1/-1;font-size:10px}.chat-composer-preview{border-top:1px solid var(--line);background:var(--surface-2);grid-template-columns:minmax(0,1fr) auto;gap:10px;padding:14px 16px;display:grid}.attachment-list{flex-wrap:wrap;grid-column:1/-1;gap:7px;margin:0;padding:0;list-style:none;display:flex}.attachment-list li{border-radius:var(--radius-sm);background:#75a7ff0f;border:1px solid #75a7ff38;align-items:center;gap:8px;max-width:260px;padding:7px 8px;display:flex}.attachment-list span{flex-direction:column;min-width:0;display:flex}.attachment-list strong{color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;overflow:hidden}.attachment-list small{color:var(--quiet);font-size:10px}.attachment-list button{min-width:0;padding:3px 6px;font-size:10px}.chat-composer-preview textarea{resize:none;border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--quiet);background:var(--surface-2);padding:10px 12px;font-size:11px}.chat-composer-preview button{border:1px solid var(--line);border-radius:var(--radius-sm);min-width:76px;color:var(--quiet);background:var(--surface-strong)}.composer-actions{grid-template-columns:repeat(2,minmax(76px,auto));gap:6px;display:grid}.composer-actions .interrupt-send{color:var(--amber);grid-column:1/-1}.attachment-list li[data-kind=document]{background:#7ee7b212;border-color:#7ee7b24d}.attachment-picker{border:1px solid var(--line);border-radius:var(--radius-sm);width:-moz-fit-content;width:fit-content;color:var(--blue);cursor:pointer;align-items:center;padding:6px 9px;font-size:10.5px;display:inline-flex}.attachment-picker.disabled{cursor:not-allowed;opacity:.45}.attachment-picker input{opacity:0;width:1px;height:1px;position:absolute;overflow:hidden}.chat-composer-preview>small{color:var(--muted);grid-column:1/-1;font-size:10.5px}@keyframes spin{to{transform:rotate(360deg)}}.document-workspace{margin-top:0;overflow:hidden}.document-heading{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:18px;min-height:82px;padding:18px 22px;display:flex}.document-heading h2{letter-spacing:-.02em;margin:0;font-size:18px}.document-heading>span{color:var(--quiet);letter-spacing:.06em;text-transform:uppercase;font-size:11px;font-weight:600}.document-body{grid-template-columns:minmax(248px,320px) minmax(0,1fr);min-height:520px;display:grid}.document-list{border-right:1px solid var(--line);overscroll-behavior:contain;flex-direction:column;gap:10px;min-width:0;max-height:720px;padding:14px;display:flex;overflow:auto}.document-group{flex-direction:column;gap:2px;min-width:0;display:flex}.document-group-heading{flex-direction:column;padding:8px 6px 4px;display:flex}.document-group-heading strong{color:var(--quiet);letter-spacing:.08em;text-transform:uppercase;font-size:10.5px;font-weight:650}.document-group-heading span{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;overflow:hidden}.document-row{border-radius:var(--radius-sm);cursor:pointer;text-align:left;background:0 0;border:0;align-items:center;gap:9px;min-width:0;padding:7px 8px;display:flex}.document-row-copy{flex-direction:column;flex:1;min-width:0;display:flex}.document-row-copy strong{color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.document-row-copy small{color:var(--quiet);text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;font-size:10.5px;overflow:hidden}.document-row-meta{color:var(--muted);flex-shrink:0;font-size:10.5px}.document-viewer{overscroll-behavior:contain;flex-direction:column;min-width:0;max-height:720px;display:flex;overflow:auto}.document-toolbar{z-index:2;border-bottom:1px solid var(--line);background:var(--surface-strong);justify-content:space-between;align-items:center;gap:14px;padding:12px 18px;display:flex;position:sticky;top:0}.document-toolbar strong{font-size:12px;display:block}.document-toolbar small{color:var(--quiet);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;display:block;overflow:hidden}.document-badges{flex-shrink:0;gap:6px;display:flex}.document-content{min-width:0;color:var(--text);padding:18px 22px;font-size:12px}.document-plain{font-family:var(--mono,ui-monospace, SFMono-Regular, Menlo, monospace);white-space:pre-wrap;word-break:break-word;margin:0;font-size:11px;line-height:1.7;overflow-x:auto}.document-table{border-collapse:collapse;width:100%;font-size:11px}.document-table th,.document-table td{border:1px solid var(--line);text-overflow:ellipsis;white-space:nowrap;max-width:320px;padding:5px 9px;overflow:hidden}.document-table th{background:var(--surface-strong);text-align:left;font-weight:650;position:sticky;top:0}.document-placeholder{height:100%;color:var(--muted);text-align:center;align-content:center;justify-items:center;gap:8px;padding:48px 24px;display:grid}.document-placeholder .MuiSvgIcon-root{opacity:.5;font-size:30px}.document-empty{color:var(--muted);padding:14px;font-size:11px}.change-report{--report-mark:#ff5a5f;gap:22px;display:grid}.change-report-actions{justify-content:flex-end;margin-bottom:8px;display:flex}.change-report-full{min-height:100%;color:var(--text);background:var(--bg);padding:28px max(16px,4vw) 48px;font-size:13px;position:relative}.change-report-full .change-report{max-width:1400px;margin:0 auto}.change-report-close{z-index:3;top:12px;right:16px;background:var(--surface-strong)!important;position:fixed!important}.change-report h2{margin:0 0 4px;font-size:18px}.change-report h3{margin:0 0 10px;font-size:14px}.change-report h4{margin:0 0 4px;font-size:13px}.change-report h5{color:var(--quiet);letter-spacing:.08em;text-transform:uppercase;margin:16px 0 8px;font-size:10.5px;font-weight:650}.change-report ul{margin:0;padding-left:18px}.change-report-note{color:var(--muted);margin:0 0 10px}.change-report-chips{flex-wrap:wrap;gap:6px;display:flex}.change-report-chips span{border:1px solid var(--line);color:var(--muted);border-radius:999px;padding:2px 9px;font-size:11px}.change-report-card{border:1px solid var(--line);background:var(--surface-strong);border-radius:4px;margin-bottom:14px;padding:14px}.change-report-pair{grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:12px;display:grid}.change-report-pair.narrow{grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),300px));margin-top:10px}.change-report-figure{min-width:0;margin:0}.change-report-figure figcaption{margin-bottom:5px;font-weight:600}.change-report-shot{border:1px solid var(--line);border-radius:4px;line-height:0;position:relative}.change-report-shot img{border-radius:3px;width:100%;display:block}.change-report-box{box-sizing:border-box;border:3px solid var(--report-mark);border-radius:3px;position:absolute}.change-report-box b,.change-report-number{width:20px;height:20px;color:var(--text);background:var(--report-mark);border-radius:50%;flex:none;place-items:center;font-size:11px;line-height:1;display:inline-grid}.change-report-box b{box-shadow:0 0 0 2px var(--surface-strong);position:absolute;top:-11px;left:-11px}.change-report-zoom-row{gap:6px;margin-bottom:12px;display:grid}.change-report-zoom-row p{align-items:center;gap:8px;margin:0;display:flex}.change-report-zoom{min-width:0}.change-report-zoom span{color:var(--quiet);font-size:11px}.change-report-crop{box-sizing:border-box;border:3px solid var(--report-mark);background-repeat:no-repeat;border-radius:4px;width:100%}.change-report-missing{border:1px dashed var(--line);color:var(--muted);text-align:center;border-radius:4px;padding:22px}.change-report details{margin-top:12px}.change-report summary{cursor:pointer;font-weight:600}.change-report-scroll{overflow-x:auto}.change-report-table{border-collapse:collapse;width:100%;font-size:11px}.change-report-table th,.change-report-table td{border:1px solid var(--line);text-align:left;vertical-align:top;padding:6px 9px}.change-report-table th{color:var(--quiet);font-weight:650}.change-report-table code{word-break:break-all;display:block}.change-report-result{font-weight:650}.change-report-result.passed{color:var(--accent)}.change-report-result.failed{color:var(--muted)}.change-report-result.skipped{color:var(--text)}@media (max-width:900px){.document-body{grid-template-columns:1fr}.document-list{border-right:0;border-bottom:1px solid var(--line);max-height:300px}}:root[data-piagent-color-mode=light] .document-row-copy strong,:root[data-piagent-color-mode=light] .document-content{color:var(--text)}.source-workspace{margin-top:0;overflow:hidden}.source-heading{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:18px;min-height:82px;padding:18px 22px;display:flex}.source-heading h2{letter-spacing:-.02em;margin:0;font-size:18px}.source-heading>span{color:var(--quiet);letter-spacing:.06em;text-transform:uppercase;font-size:11px;font-weight:600}.source-tabs{border-bottom:1px solid var(--line);background:var(--surface-2);min-width:0;padding:0 14px;display:flex}.source-tabs button{min-width:0;color:var(--muted);cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:9px;padding:14px 15px 12px;font-size:11px;display:flex}.source-tabs button:hover{color:var(--text)}.source-tabs button[aria-selected=true]{border-bottom-color:var(--accent);color:var(--accent)}.source-tabs button b{border-radius:var(--radius-sm);min-width:20px;color:inherit;background:color-mix(in srgb, currentColor 10%, transparent);text-align:center;padding:2px 6px;font-size:10.5px}.source-body{grid-template-columns:minmax(248px,304px) minmax(0,1fr);min-height:480px;display:grid}.file-panel{border-right:1px solid var(--line);background:color-mix(in srgb, var(--bg) 72%, var(--surface));min-width:0}.file-panel-meta{border-bottom:1px solid var(--line);min-height:42px;color:var(--muted);justify-content:space-between;align-items:center;gap:14px;padding:0 14px;font-size:11px;display:flex}.file-panel-meta small{color:var(--quiet);letter-spacing:.08em;text-transform:uppercase;font-weight:650}.source-list-retry{border-radius:var(--radius-sm);color:var(--accent);font:inherit;background:0 0;border:1px solid;padding:4px 8px;font-weight:650}.file-list{overscroll-behavior:contain;max-height:620px;overflow:auto}.file-group-label{min-height:28px;color:var(--quiet);align-items:center;gap:6px;padding:5px 10px 3px}.file-group-label svg{width:14px;height:14px}.file-group-label span{min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10.5px;font-weight:600}.file-row{border-radius:var(--radius-sm);width:100%;min-height:54px;color:inherit;cursor:pointer;text-align:left;background:0 0;border:0;grid-template-columns:26px minmax(0,1fr) auto;align-items:center;gap:9px;margin:0;padding:8px 9px;display:grid}.file-row:hover{background:#75a7ff0d}.file-row[data-selected=true]{box-shadow:inset 2px 0 var(--accent);background:#64e0b513}.file-status{border:1px solid var(--line-strong);border-radius:var(--radius-sm);width:23px;height:23px;color:var(--muted);place-items:center;font-family:ui-monospace,monospace;font-size:11px;font-weight:650;display:grid}.status-A,.status-U{color:var(--accent);border-color:#64e0b54d}.status-M,.status-R{color:var(--blue);border-color:#75a7ff4d}.status-D,.status-C{color:var(--red);border-color:#ff7f864d}.file-name{flex-direction:column;min-width:0;display:flex}.file-name strong{color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;font-weight:600;overflow:hidden}.file-name small,.file-provenance,.file-evidence{color:var(--quiet);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;overflow:hidden}.file-provenance,.file-evidence{display:none}.file-stats{color:var(--muted);white-space:nowrap;font-family:ui-monospace,monospace;font-size:10.5px}.files-empty,.diff-empty{min-height:220px;color:var(--quiet);text-align:center;place-items:center;padding:28px;font-size:12px;display:grid}.diff-empty{background:repeating-linear-gradient(-45deg,#0000,#0000 13px,#ffffff03 13px 14px);min-height:100%}.error-state{color:var(--red)}.diff-viewer{background:var(--surface);min-width:0;overflow:auto}.diff-toolbar{border-bottom:1px solid var(--line);background:var(--surface);justify-content:space-between;align-items:center;gap:15px;min-height:55px;padding:9px 13px;display:flex}.diff-toolbar>div:first-child{align-items:center;gap:10px;min-width:0;display:flex}.diff-actions{align-items:center;gap:10px;display:flex}.review-state{color:var(--quiet);align-items:center;gap:8px;font-size:10.5px;display:flex}.review-state>span{white-space:nowrap}.review-state button{border:1px solid var(--line);border-radius:var(--radius-sm);min-height:28px;color:var(--text);background:#18202b;padding:0 9px;font-size:10.5px}.review-state button:disabled{cursor:not-allowed;opacity:.45}.review-reviewed>span{color:var(--accent)}.review-stale>span{color:var(--amber)}.source-mutation-preview{max-width:290px;color:var(--text);align-items:center;gap:8px;font-size:10.5px;display:flex}.source-mutation-preview>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.source-mutation-preview button{border-radius:var(--radius-sm);min-height:28px;color:var(--text);background:#42c2921a;border:1px solid #42c29266;flex:none;padding:0 10px;font-size:10.5px;font-weight:650}.source-mutation-preview button:disabled{cursor:not-allowed;opacity:.45}.source-revert-preview{max-width:290px;color:var(--text);align-items:center;gap:8px;font-size:10.5px;display:flex}.source-revert-preview>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.source-revert-preview button,.hunk-header .revert-action{border-radius:var(--radius-sm);min-height:28px;color:var(--text);background:#ff7f8617;border:1px solid #ff7f8661;flex:none;padding:0 10px;font-size:10.5px;font-weight:650}.source-revert-preview button:disabled{cursor:not-allowed;opacity:.45}.source-open-action button{border-radius:var(--radius-sm);min-height:28px;color:var(--text);white-space:nowrap;background:#75a7ff1a;border:1px solid #75a7ff61;padding:0 10px;font-size:10.5px;font-weight:650}.source-open-action button:disabled{cursor:wait;opacity:.55}.source-open-status{color:var(--text);background:#75a7ff14;border-bottom:1px solid #75a7ff38;padding:8px 14px;font-size:11px}.commit-summary-panel{border-bottom:1px solid var(--line);background:linear-gradient(120deg,#42c29214,#75a7ff0d);grid-template-columns:minmax(230px,.8fr) minmax(300px,1.5fr);align-items:start;gap:18px;padding:14px 16px;display:grid}.commit-summary-panel h3{color:var(--text);margin:1px 0 4px;font-size:14px}.commit-summary-panel>div>span{color:var(--quiet);font-size:10.5px}.commit-summary-panel>button{border-radius:var(--radius-sm);min-height:32px;color:var(--text);background:#42c2921a;border:1px solid #42c29266;justify-self:start;padding:0 12px;font-size:11px;font-weight:650}.commit-summary-output{border-radius:var(--radius-sm);background:#070a0f8c;border:1px solid #75a7ff33;gap:5px;padding:10px 12px;display:grid}.commit-summary-output>strong{color:var(--text);font:700 12px ui-monospace,monospace}.commit-summary-output>code{color:var(--text);white-space:pre-wrap;font-size:10.5px}.commit-summary-output>div{flex-wrap:wrap;gap:7px;margin-top:4px;display:flex}.commit-summary-output button{border:1px solid var(--line);border-radius:var(--radius-sm);min-height:28px;color:var(--text);background:#18202b;padding:0 10px;font-size:10.5px}.commit-summary-output button:last-child{color:var(--text);background:#ecb35b17;border-color:#ecb35b59}.commit-summary-status{color:var(--text);grid-column:1/-1;margin:0;font-size:11px}.model-summary-dialog{border-color:#ecb35b57}.review-error{color:var(--text);background:#ff687414;border-bottom:1px solid #ff68743d;padding:8px 14px;font-size:11px}.source-revert-error{color:var(--text);background:#ff687414;border-top:1px solid #ff68743d;padding:9px 14px;font-size:11px}.source-action-warning{color:var(--text);background:#f6be5214;border-top:1px solid #f6be523d;padding:9px 14px;font-size:11px}.detail-reconciliation-warning{color:var(--text);background:#f6be5214;border-bottom:1px solid #f6be523d;justify-content:space-between;align-items:center;gap:12px;padding:8px 14px;font-size:11px;display:flex}.detail-reconciliation-warning button{border-radius:var(--radius-sm);color:inherit;background:0 0;border:1px solid;padding:4px 8px}.diff-toolbar strong{color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,monospace;font-size:11px;overflow:hidden}.access-badge{text-transform:uppercase;font-size:10.5px;font-weight:650}.mode-switch{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--bg);padding:2px;display:flex}.mode-switch button{border-radius:var(--radius-sm);color:var(--quiet);cursor:pointer;background:0 0;border:0;padding:5px 8px;font-size:10.5px}.mode-switch button[aria-pressed=true]{color:var(--text);background:var(--surface-strong)}.mode-switch .MuiToggleButton-root.Mui-selected{color:var(--text);background:#293241;box-shadow:inset 0 0 0 1px #75a7ff4d}.diff-context{border-bottom:1px solid var(--line);min-height:37px;color:var(--quiet);align-items:center;gap:14px;padding:0 14px;font-size:10.5px;display:flex}.diff-context .additions{color:var(--accent);margin-left:auto}.diff-context .deletions{color:var(--red)}.diff-hunk{min-width:0;overflow:auto}.hunk-header{color:var(--blue);background:#75a7ff12;border-bottom:1px solid #75a7ff24;justify-content:space-between;align-items:center;gap:12px;padding:6px 12px;font-family:ui-monospace,monospace;font-size:10.5px;display:flex;position:sticky;left:0}.hunk-header button{border-radius:var(--radius-sm);min-height:25px;color:var(--text);background:#75a7ff1a;border:1px solid #75a7ff57;padding:0 9px;font:700 9px Inter,sans-serif}.hunk-header button:disabled{cursor:not-allowed;opacity:.45}.hunk-actions{align-items:center;gap:6px;display:inline-flex}.dialog-backdrop{z-index:80;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#030508c2;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.confirm-dialog{border-radius:var(--radius-sm);background:var(--surface-2);border:1px solid #ff7f8652;width:min(520px,100%);padding:24px;box-shadow:0 30px 100px #00000094}.confirm-dialog h3{color:var(--text);margin:0;font-size:21px}.confirm-dialog>p:not(.section-kicker){color:var(--text);margin:14px 0;font-size:12px;line-height:1.65}.confirm-dialog code{color:var(--text)}.revert-diff{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-2);max-height:min(300px,42vh);margin:14px 0;overflow:auto}.revert-diff section>div{color:var(--text);background:#182130;padding:6px 9px;font:9px ui-monospace,monospace;position:sticky;top:0}.revert-line{white-space:pre-wrap;min-height:19px;padding:2px 9px;font:10px/1.5 ui-monospace,monospace;display:block;color:var(--text)!important}.revert-line b{width:14px;color:inherit;display:inline-block}.revert-added{background:#42c29214;color:var(--text)!important}.revert-deleted{background:#ff687414;color:var(--text)!important}.revert-meta{color:var(--muted)!important}.revert-safety{border-radius:var(--radius-sm);background:#efba630f;border:1px solid #efba6338;gap:5px;padding:12px;display:grid}.revert-safety strong{color:var(--text);font-size:11px}.revert-safety span{color:var(--muted);font-size:11px}.confirm-actions{justify-content:flex-end;gap:9px;margin-top:20px;display:flex}.confirm-actions button{border:1px solid var(--line-strong);border-radius:var(--radius-sm);min-height:34px;color:var(--text);background:#1b222d;padding:0 14px;font-size:11px;font-weight:650}.confirm-actions .danger-action{color:var(--text);background:#ff7f8621;border-color:#ff7f866b}.confirm-actions button:disabled{cursor:not-allowed;opacity:.48}.diff-line{grid-template-columns:42px 42px 18px minmax(500px,1fr);min-width:max-content;min-height:21px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:21px;display:grid}.diff-line>span{color:#566173;text-align:right;-webkit-user-select:none;user-select:none;padding:0 7px}.diff-line b{color:var(--quiet);text-align:center;-webkit-user-select:none;user-select:none}.diff-line code,.split-line code{color:var(--text);white-space:pre;padding:0 8px}.syntax-keyword{color:var(--text);font-weight:650}.syntax-string,.syntax-number{color:var(--text)}.syntax-comment{color:var(--muted);font-style:italic}.syntax-literal,.syntax-property{color:var(--text)}.diff-added{background:#42c2921a}.diff-added code,.diff-added b{color:var(--text)}.diff-deleted{background:#ff68741a}.diff-deleted code,.diff-deleted b{color:var(--text)}.split-line{border-bottom:1px solid #242c394d;grid-template-columns:42px minmax(350px,1fr) 42px minmax(350px,1fr);min-width:860px;min-height:21px;font-family:ui-monospace,monospace;font-size:11px;line-height:21px;display:grid}.split-line>span{color:#566173;text-align:right;border-right:1px solid #242c39b3;padding:0 7px}.split-line code:nth-child(2){border-right:1px solid var(--line)}.unchanged-region{border-block:1px solid var(--line);color:var(--quiet);background:var(--surface-2);text-align:center;padding:7px 12px;font-size:10.5px}.diff-fallback{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--muted);background:var(--surface);gap:6px;margin:18px;padding:16px;font-size:11px;display:grid}.diff-fallback strong{color:var(--amber);text-transform:uppercase;font-size:11px}.activity-panel{margin-top:18px;overflow:hidden}.panel-heading{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:18px;min-height:82px;padding:18px 22px;display:flex}.panel-heading h2{letter-spacing:-.02em;margin:0;font-size:18px}.panel-heading>div:last-child{color:var(--quiet);align-items:center;gap:14px;font-size:11px;display:flex}.running-count{color:var(--blue)}.activity-list{display:grid}.activity-row{border-bottom:1px solid var(--line);background:var(--surface-2);grid-template-columns:10px minmax(0,1fr) 150px;align-items:start;gap:14px;padding:15px 18px;display:grid}.activity-row:last-child{border-bottom:0}.activity-state{width:7px;height:7px;box-shadow:0 0 0 4px color-mix(in srgb, currentColor 10%, transparent);background:currentColor;border-radius:50%;margin-top:5px}.activity-copy{min-width:0}.activity-copy>div{align-items:center;gap:9px;display:flex}.activity-copy strong{color:var(--text);font-size:12px}.activity-copy>div>span{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--quiet);letter-spacing:.06em;text-transform:uppercase;padding:2px 5px;font-size:10px;font-weight:650}.activity-copy>p{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;margin:4px 0 0;font-family:ui-monospace,monospace;font-size:11px;line-height:1.45;overflow:hidden}.activity-result{text-align:right;grid-template-columns:1fr auto;align-items:center;gap:4px 9px;display:grid}.activity-result strong{color:var(--text);font-size:11px}.activity-result>span{color:var(--quiet);font-family:ui-monospace,monospace;font-size:10.5px}.activity-result button{color:var(--blue);cursor:pointer;background:0 0;border:0;grid-column:1/-1;justify-self:end;padding:2px 0;font-size:10.5px}.log-preview{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--text);background:var(--surface-2);white-space:pre-wrap;margin-top:10px;padding:10px 12px;font-family:ui-monospace,monospace;font-size:10.5px;line-height:1.55}.log-preview small{color:var(--amber);margin-top:5px;display:block}.activity-empty{min-height:150px;color:var(--quiet);place-items:center;padding:24px;font-size:11px;display:grid}.panel-footnote{border-top:1px solid var(--line);color:var(--quiet);text-align:center;padding:9px 18px;font-size:10.5px}.evidence-section{margin-top:34px}.section-title-row{justify-content:space-between;align-items:end;gap:24px;margin-bottom:14px;padding:0 3px;display:flex}.section-title-row h2{letter-spacing:-.025em;margin:0;font-size:20px}.section-title-row>span{max-width:440px;color:var(--muted);text-align:right;text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.evidence-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;display:grid}.evidence-card{min-width:0;min-height:250px;padding:18px}.evidence-card h3{min-height:38px;color:var(--text);margin:0 0 16px;font-size:14px;line-height:1.35}.evidence-list{margin:0}.evidence-list>div{border-bottom:1px solid var(--line);grid-template-columns:88px minmax(0,1fr);align-items:center;gap:8px;min-height:38px;display:grid}.evidence-list>div:last-child{border-bottom:0}.evidence-list dt,.budget-grid dt{color:var(--quiet);font-size:10.5px}.evidence-list dd{color:var(--muted);text-align:right;text-overflow:ellipsis;white-space:nowrap;margin:0;font-family:ui-monospace,monospace;font-size:10.5px;overflow:hidden}.context-meter{border-radius:var(--radius-sm);background:#28303c;height:4px;margin:-3px 0 12px;overflow:hidden}.context-meter span{border-radius:inherit;background:linear-gradient(90deg, var(--blue), var(--accent));height:100%;display:block}.budget-grid{grid-template-columns:repeat(3,1fr);gap:7px;margin:0;display:grid}.budget-grid>div{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-2);padding:12px 8px}.budget-grid dt{margin-bottom:5px}.budget-grid dd{color:var(--text);margin:0;font-family:ui-monospace,monospace;font-size:12px}.card-note,.card-empty{color:var(--quiet);margin:14px 0 0;font-size:11px;line-height:1.5}.handoff-copy>p{color:var(--muted);margin:0 0 13px;font-size:11px;line-height:1.55}.handoff-blocker,.next-action{border-radius:var(--radius-sm);background:#ff7f860d;border:1px solid #ff7f8638;gap:4px;margin-top:9px;padding:9px 10px;display:grid}.next-action{background:#64e0b50d;border-color:#64e0b533}.handoff-blocker strong,.next-action strong{color:var(--red);letter-spacing:.08em;text-transform:uppercase;font-size:10px}.next-action strong{color:var(--accent)}.handoff-blocker span,.next-action span{color:var(--text);font-size:11px;line-height:1.4}.loading-shell{width:min(560px,100% - 40px);margin:0 auto;padding-top:22vh}.loading-shell .brand-mark{border-radius:var(--radius-sm);width:48px;height:48px;margin-bottom:25px;font-size:29px}.loading-shell h1{color:var(--text);letter-spacing:-.045em;margin:0;font-size:clamp(30px,6vw,50px);line-height:1.05}.loading-shell>p:not(.section-kicker){max-width:460px;color:var(--muted);margin:18px 0 22px;font-size:14px;line-height:1.6}.session-options{grid-template-columns:minmax(220px,.75fr) minmax(420px,1.25fr);gap:22px;padding:20px;display:grid}.session-options-copy h2{color:var(--text);margin:2px 0 8px;font-size:16px}.session-options-copy>p:last-child{max-width:520px;color:var(--quiet);margin:0;font-size:11px;line-height:1.55}.session-options-controls{grid-template-columns:minmax(0,1.4fr) minmax(130px,.6fr);align-items:end;gap:10px;display:grid}.session-options-controls>label:not(.effect-ack){color:var(--quiet);gap:5px;font-size:10.5px;display:grid}.session-options-controls select{border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;min-height:36px;color:var(--text);background:var(--surface-2);padding:0 10px}.effect-ack{color:var(--text);grid-column:1/-1;align-items:flex-start;gap:8px;font-size:11px;line-height:1.4;display:flex}.effect-ack input{accent-color:var(--accent);margin-top:1px}.session-option-actions{grid-column:1/-1;gap:8px;display:flex}.session-option-actions button{border:1px solid var(--line);border-radius:var(--radius-sm);min-height:34px;color:var(--text);background:#1a222d;padding:0 13px}.session-option-actions button:disabled{opacity:.42}.session-options-controls>small{color:var(--quiet);grid-column:1/-1;font-size:10.5px}.session-options-unavailable{color:var(--quiet);flex-direction:column;justify-content:center;gap:5px;font-size:11px;display:flex}.session-options-unavailable strong{color:var(--text);font-size:12px}.lifecycle-panel{grid-template-columns:minmax(260px,1fr) minmax(150px,auto) minmax(360px,auto);align-items:center;gap:20px;margin-top:18px;padding:18px 20px;display:grid}.lifecycle-copy h2{color:var(--text);margin:2px 0 7px;font-size:16px}.lifecycle-copy>p:last-child{max-width:620px;color:var(--quiet);margin:0;font-size:11px;line-height:1.55}.lifecycle-state{border-left:1px solid var(--line);gap:4px;min-width:150px;padding-left:18px;display:grid}.lifecycle-state>span{color:var(--quiet);text-transform:uppercase;font-size:10.5px;font-weight:650}.lifecycle-state strong{color:var(--text);font-size:12px}.lifecycle-state small{color:var(--quiet);font-size:10.5px}.lifecycle-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.lifecycle-actions button{border-radius:var(--radius-sm);cursor:pointer;min-height:36px;padding:0 13px;font-size:11px;font-weight:650}.lifecycle-actions button:disabled{cursor:not-allowed;opacity:.4}.primary-action{color:#07130f;background:var(--accent);border:1px solid #3cae88}.lifecycle-result{border-radius:var(--radius-sm);grid-column:1/-1;margin:-6px 0 0;padding:9px 11px;font-size:11px;line-height:1.45}.lifecycle-result.result-ok{color:var(--text);background:#64e0b512}.lifecycle-result.result-warning{color:var(--text);background:#efba6314}.approval-stack{gap:12px;display:grid}.approval-card{border-radius:var(--radius-sm);background:linear-gradient(135deg,#412518eb,#19181bf5);border:1px solid #70462e;padding:20px;overflow:hidden;box-shadow:0 16px 42px #00000038}.approval-card.risk-critical,.approval-card.risk-high{border-color:#9d4d3f}.approval-card>header,.approval-card>footer{justify-content:space-between;align-items:center;gap:12px;display:flex}.approval-card h2{color:var(--text);margin:2px 0 0;font-size:18px}.approval-risk{border-radius:var(--radius-sm);color:var(--text);text-transform:uppercase;border:1px solid #ffad7c59;padding:5px 9px;font-size:11px;font-weight:650}.approval-reason{color:var(--text);margin:13px 0;font-size:12px;line-height:1.55}.approval-preview{border-radius:var(--radius-sm);max-height:180px;color:var(--text);background:var(--surface-2);white-space:pre-wrap;word-break:break-word;border:1px solid #ffffff17;margin:0 0 14px;padding:12px;font:11px/1.55 ui-monospace,SFMono-Regular,Menlo,monospace;overflow:auto}.approval-facts{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:0 0 13px;display:grid}.approval-facts>div{border-radius:var(--radius-sm);background:#ffffff09;min-width:0;padding:9px}.approval-facts dt{color:var(--text);text-transform:uppercase;font-size:10.5px;font-weight:650}.approval-facts dd{color:var(--text);text-overflow:ellipsis;margin:4px 0 0;font-size:11px;overflow:hidden}.approval-targets,.approval-consequences{color:var(--text);font-size:11px;line-height:1.55}.approval-targets ul{margin:6px 0 12px;padding-left:18px}.approval-consequences{grid-template-columns:1fr 1fr;gap:10px;margin:12px 0;display:grid}.approval-consequences p{border-radius:var(--radius-sm);background:#ffffff09;margin:0;padding:10px}.approval-card>footer{justify-content:flex-end;padding-top:4px}.approval-card button{border-radius:var(--radius-sm);min-height:36px;padding:0 14px;font-weight:650}.secondary-action{border:1px solid var(--line);color:var(--text);background:#1a222d}.danger-action{color:var(--text);background:#8f3e31;border:1px solid #c56b52}.approval-card button:disabled{cursor:wait;opacity:.48}.question-stack{gap:12px;display:grid}.question-card{border-radius:var(--radius-sm);background:linear-gradient(135deg,#162e3af0,#16181ef7);border:1px solid #2f5f73;padding:20px;overflow:hidden;box-shadow:0 16px 42px #00000038}.question-card>header,.question-card>footer{justify-content:space-between;align-items:center;gap:12px;display:flex}.question-card h2{color:var(--text);margin:2px 0 0;font-size:18px}.question-hint{color:var(--text);font-size:11px;font-weight:600}.question-block{border:0;min-width:0;margin:14px 0 0;padding:0}.question-block legend{color:var(--text);flex-wrap:wrap;align-items:baseline;gap:6px;padding:0;font-size:15px;font-weight:600;line-height:1.5;display:flex}.question-number{color:var(--text)}.question-chip{border-radius:var(--radius-sm);color:var(--text);border:1px solid #7cc4e459;padding:2px 8px;font-size:11px;font-weight:650}.question-text{overflow-wrap:anywhere;min-width:0}.question-multi{color:var(--text);margin:4px 0 0;font-size:12px}.question-card:focus-visible,.question-block:focus-visible{outline-offset:3px;border-radius:var(--radius-sm);outline:2px solid #4fa3c7}.question-block.active .question-number{color:var(--text)}.question-options{gap:6px;margin:10px 0 0;padding:0;list-style:none;display:grid}.question-options label{border-radius:var(--radius-sm);cursor:pointer;background:#ffffff08;border:1px solid #ffffff14;align-items:flex-start;gap:10px;padding:10px 12px;display:flex}.question-options label:hover{border-color:#7cc4e459}.question-options label.selected{background:#4fa3c724;border-color:#4fa3c7}.question-options input[type=radio],.question-options input[type=checkbox]{opacity:0;pointer-events:none;position:absolute}.question-options label:focus-within{outline-offset:2px;outline:2px solid #4fa3c7}.option-number{border-radius:var(--radius-sm);color:#0d1d25;background:#8fc9e2;flex:none;place-items:center;width:24px;height:24px;font-size:12px;font-weight:650;display:inline-grid}.option-body{min-width:0;color:var(--text);gap:3px;font-size:14px;line-height:1.45;display:grid}.option-body small{color:var(--text);font-size:12.5px}.question-other input[type=text]{box-sizing:border-box;border-radius:var(--radius-sm);width:100%;color:var(--text);background:var(--surface-2);font:inherit;border:1px solid #4fa3c7;margin-top:6px;padding:9px 11px;font-size:14px}.question-card>footer{justify-content:flex-end;padding-top:14px}.question-card button{border-radius:var(--radius-sm);min-height:36px;padding:0 14px;font-weight:650}.question-card button:disabled{cursor:not-allowed;opacity:.48}.task-run-index,.release-monitor{margin-top:18px;overflow:hidden}.release-monitor .source-heading button{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--text);background:var(--surface-2);padding:8px 12px}.release-monitor .source-heading button:disabled{opacity:.55}.release-monitor-grid{border-top:1px solid var(--line);grid-template-columns:minmax(0,1.15fr) minmax(320px,.85fr);display:grid}.release-monitor-column+.release-monitor-column{border-left:1px solid var(--line)}.release-monitor-column>header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:14px;padding:16px 20px;display:flex}.release-monitor-column h3{margin:2px 0 0}.benchmark-run-card{border-bottom:1px solid var(--line);padding:14px 20px}.benchmark-run-card>div:first-child{justify-content:space-between;align-items:center;gap:12px;display:flex}.benchmark-run-card small{color:var(--muted);margin-top:4px;display:block}.benchmark-run-facts{color:var(--muted);flex-wrap:wrap;gap:8px 18px;margin-top:9px;font-size:12px;display:flex}.release-readiness-facts{margin:0;padding:4px 20px 12px}.release-readiness-facts>div{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:16px;padding:10px 0;display:flex}.release-readiness-facts dt{color:var(--muted)}.release-readiness-facts dd{text-align:right;margin:0}.release-blockers{border:1px solid color-mix(in srgb, var(--warning) 35%, var(--line));border-radius:var(--radius-sm);background:color-mix(in srgb, var(--warning) 7%, transparent);margin:0 20px 14px;padding:12px 14px}.release-blockers ul{color:var(--muted);margin:8px 0 0;padding-left:18px}.release-blockers li+li{margin-top:5px}.task-index-controls{border-bottom:1px solid var(--line);gap:8px;padding:0 20px 16px;display:flex}.task-index-controls button{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--muted);background:var(--surface-2);padding:7px 12px}.task-index-controls button[aria-pressed=true]{color:var(--text);border-color:var(--accent);background:color-mix(in srgb, var(--accent) 15%, var(--surface-2))}.task-run-list{display:grid}.task-run-card{border-bottom:1px solid var(--line);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:18px;padding:15px 20px;display:grid}.task-run-card[data-active=true]{box-shadow:inset 3px 0 var(--accent);background:color-mix(in srgb, var(--accent) 5%, transparent)}.task-run-card[data-selected=true]{outline:1px solid var(--accent);outline-offset:-1px}.task-run-main{min-width:0}.task-run-main>div{align-items:center;gap:9px;display:flex}.task-run-main strong,.task-run-main small{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.task-run-main small,.task-run-meta{color:var(--muted)}.active-run-tag{border:1px solid var(--accent);border-radius:var(--radius-sm);color:var(--accent);padding:2px 7px;font-size:11px}.task-run-meta{justify-content:flex-end;align-items:center;gap:12px;font-size:12px;display:flex}.task-index-empty,.task-index-warning{color:var(--muted);margin:0;padding:18px 20px}.task-index-warning{border-top:1px solid var(--line);color:var(--warning)}.task-run-meta button{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--text);background:var(--surface-2);padding:6px 9px}.task-run-meta button[aria-pressed=true]{border-color:var(--accent);color:var(--accent)}.task-timeline{border-top:1px solid var(--line)}.task-timeline>header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:16px;padding:18px 20px;display:flex}.task-timeline h3{margin:2px 0 0}.timeline-continuity{color:var(--muted);border-bottom:1px solid var(--line);flex-wrap:wrap;gap:10px 24px;padding:12px 20px;display:flex}.timeline-events{margin:0;padding:0;list-style:none}.timeline-events li{border-bottom:1px solid var(--line);grid-template-columns:12px minmax(0,1fr) auto;align-items:start;gap:12px;padding:13px 20px;display:grid}.timeline-events small,.timeline-events p{color:var(--muted);margin:3px 0 0;display:block}.timeline-dot{border-radius:var(--radius-sm);background:var(--muted);width:9px;height:9px;margin-top:5px}.timeline-dot.tone-positive{background:var(--positive)}.timeline-dot.tone-warning{background:var(--warning)}.timeline-dot.tone-danger{background:var(--danger)}.timeline-dot.tone-info{background:var(--accent)}.recovery-summary{grid-template-columns:repeat(4,minmax(0,1fr));display:grid}.retained-content-note{color:var(--muted);border-bottom:1px solid var(--line);margin:0;padding:10px 20px;font-size:12px}.next-action-card{border-bottom:1px solid var(--line);background:color-mix(in srgb, var(--accent) 7%, transparent);grid-template-columns:minmax(180px,.45fr) 1fr auto;align-items:center;gap:18px;padding:16px 20px;display:grid}.next-action-card span,.next-action-card strong{display:block}.next-action-card span,.next-action-card p,.next-action-card small{color:var(--muted)}.next-action-card p{margin:0}.handoff-summary{grid-template-columns:repeat(4,minmax(0,1fr));display:grid}.workspace-stack>.surface,.workspace-view>.surface,.workspace-stack>.evidence-section,.workspace-view>.evidence-section{margin-top:0}:root[data-piagent-color-mode=light] .task-heading h2,:root[data-piagent-color-mode=light] .task-empty h2,:root[data-piagent-color-mode=light] .criterion-copy p,:root[data-piagent-color-mode=light] .compact-panel dd,:root[data-piagent-color-mode=light] .chat-heading h2,:root[data-piagent-color-mode=light] .chat-message strong,:root[data-piagent-color-mode=light] .chat-message p,:root[data-piagent-color-mode=light] .attachment-list strong,:root[data-piagent-color-mode=light] .diff-toolbar strong,:root[data-piagent-color-mode=light] .activity-copy strong,:root[data-piagent-color-mode=light] .activity-result strong,:root[data-piagent-color-mode=light] .evidence-card h3,:root[data-piagent-color-mode=light] .budget-grid dd,:root[data-piagent-color-mode=light] .session-options-copy h2,:root[data-piagent-color-mode=light] .session-options-unavailable strong,:root[data-piagent-color-mode=light] .lifecycle-copy h2,:root[data-piagent-color-mode=light] .lifecycle-state strong{color:var(--text)}:root[data-piagent-color-mode=light] .chat-body,:root[data-piagent-color-mode=light] .activity-row{background:#62740006}:root[data-piagent-color-mode=light] .source-tabs{background:var(--surface)}:root[data-piagent-color-mode=light] .source-tabs button:hover{color:var(--text)}:root[data-piagent-color-mode=light] .source-action-warning,:root[data-piagent-color-mode=light] .detail-reconciliation-warning{color:var(--muted);background:#ab740014}:root[data-piagent-color-mode=light] .chat-message,:root[data-piagent-color-mode=light] .chat-tool-live,:root[data-piagent-color-mode=light] .chat-tool-result,:root[data-piagent-color-mode=light] .held-queue li,:root[data-piagent-color-mode=light] .log-preview{color:var(--text);background:var(--surface)}:root[data-piagent-color-mode=light] .chat-user{background:#506db712}:root[data-piagent-color-mode=light] .chat-composer-preview,:root[data-piagent-color-mode=light] .unchanged-region{background:var(--surface)}:root[data-piagent-color-mode=light] .chat-composer-preview textarea,:root[data-piagent-color-mode=light] .session-options-controls select{color:var(--text);background:var(--surface)}:root[data-piagent-color-mode=light] .review-state button,:root[data-piagent-color-mode=light] .commit-summary-output button,:root[data-piagent-color-mode=light] .confirm-actions button,:root[data-piagent-color-mode=light] .session-option-actions button{color:var(--text);background:var(--surface-strong)}:root[data-piagent-color-mode=light] .commit-summary-panel h3,:root[data-piagent-color-mode=light] .commit-summary-output>strong{color:var(--text)}:root[data-piagent-color-mode=light] .commit-summary-output{background:#ffffffbf}:root[data-piagent-color-mode=light] .diff-line code,:root[data-piagent-color-mode=light] .split-line code{color:var(--muted)}:root[data-piagent-color-mode=light] .diff-line>span,:root[data-piagent-color-mode=light] .split-line>span{color:#92988d}:root[data-piagent-color-mode=light] .syntax-keyword,:root[data-piagent-color-mode=light] .syntax-string,:root[data-piagent-color-mode=light] .syntax-number,:root[data-piagent-color-mode=light] .syntax-comment,:root[data-piagent-color-mode=light] .syntax-literal,:root[data-piagent-color-mode=light] .syntax-property{color:var(--muted)}:root[data-piagent-color-mode=light] .mode-switch .MuiToggleButton-root.Mui-selected{color:var(--text);background:var(--surface-2)}:root[data-piagent-color-mode=light] .diff-added{background:#14775f1a}:root[data-piagent-color-mode=light] .diff-added code,:root[data-piagent-color-mode=light] .diff-added b{color:var(--muted)}:root[data-piagent-color-mode=light] .diff-deleted{background:#c43f4c1a}:root[data-piagent-color-mode=light] .diff-deleted code,:root[data-piagent-color-mode=light] .diff-deleted b{color:var(--muted)}:root[data-piagent-color-mode=light] .confirm-dialog{color:var(--text);background:var(--surface)}:root[data-piagent-color-mode=light] .confirm-dialog h3,:root[data-piagent-color-mode=light] .confirm-dialog>p:not(.section-kicker){color:var(--text)}:root[data-piagent-color-mode=light] .revert-diff{background:var(--surface)}:root[data-piagent-color-mode=light] .approval-card{color:var(--text);background:linear-gradient(135deg,#fff7ef,#fff);border-color:#d7b18f}:root[data-piagent-color-mode=light] .question-card{color:var(--text);background:linear-gradient(135deg,#f1f9fc,#fff);border-color:#9cc8da}:root[data-piagent-color-mode=light] .question-card h2,:root[data-piagent-color-mode=light] .question-block legend,:root[data-piagent-color-mode=light] .option-body{color:var(--text)}:root[data-piagent-color-mode=light] .question-hint,:root[data-piagent-color-mode=light] .question-number,:root[data-piagent-color-mode=light] .question-multi,:root[data-piagent-color-mode=light] .option-body small{color:var(--muted)}:root[data-piagent-color-mode=light] .question-chip{color:var(--muted);border-color:#9cc8da}:root[data-piagent-color-mode=light] .question-options label{background:var(--surface);border-color:#d6e6ed}:root[data-piagent-color-mode=light] .question-options label.selected{background:var(--surface-2);border-color:#3b8fb3}:root[data-piagent-color-mode=light] .question-other input[type=text]{color:var(--text);background:var(--surface)}:root[data-piagent-color-mode=light] .question-options label.selected .option-number{color:#fff;background:#1e6f92}:root[data-piagent-color-mode=light] .question-card .secondary-action{color:var(--text);background:var(--surface);border-color:#b9d3de}:root[data-piagent-color-mode=light] .question-card .secondary-action:hover:not(:disabled){background:var(--surface);border-color:#3b8fb3}:root[data-piagent-color-mode=light] .approval-card h2,:root[data-piagent-color-mode=light] .approval-preview,:root[data-piagent-color-mode=light] .approval-facts dd{color:var(--text)}:root[data-piagent-color-mode=light] .approval-preview{background:var(--surface)}:root[data-piagent-color-mode=light] .approval-reason,:root[data-piagent-color-mode=light] .approval-targets,:root[data-piagent-color-mode=light] .approval-consequences{color:var(--muted)}@media (max-width:1080px){.lifecycle-panel{grid-template-columns:1fr auto}.lifecycle-actions{grid-column:1/-1;justify-content:flex-start}.lifecycle-result{grid-column:1/-1}.runtime-strip{grid-template-columns:repeat(3,1fr)}.runtime-strip>div:nth-child(3){border-right:0}.runtime-strip>div:nth-child(-n+3){border-bottom:1px solid var(--line)}.content-grid{grid-template-columns:1fr}.context-rail,.evidence-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width:899px){.source-body{grid-template-columns:1fr}.file-panel{border-right:0;border-bottom:1px solid var(--line)}.file-list{max-height:300px}.diff-empty{min-height:300px}}@media (max-width:720px){.release-monitor-grid{grid-template-columns:1fr}.release-monitor-column+.release-monitor-column{border-left:0;border-top:1px solid var(--line)}.recovery-summary{grid-template-columns:repeat(2,minmax(0,1fr))}.handoff-summary,.next-action-card,.commit-summary-panel,.approval-facts,.approval-consequences{grid-template-columns:1fr}.approval-card>header,.approval-card>footer{flex-direction:column;align-items:flex-start}.approval-card>footer button{width:100%}.question-card{padding:16px}.question-card>header,.question-card>footer{flex-direction:column;align-items:stretch}.question-card>footer{flex-direction:column-reverse}.question-card>footer button{width:100%}.session-options,.session-options-controls{grid-template-columns:1fr}.effect-ack,.session-option-actions,.session-options-controls>small{grid-column:1}.lifecycle-panel{grid-template-columns:1fr;align-items:stretch}.lifecycle-state{border-left:0;padding:0}.lifecycle-actions{grid-column:1}.lifecycle-actions button{flex:150px}.lifecycle-result{grid-column:1}.topbar{grid-template-columns:1fr auto;min-height:60px;padding:0 16px}.session-title,.read-only-badge{display:none}.workspace{width:min(100% - 24px,1460px);padding-top:12px}.runtime-strip{grid-template-columns:repeat(2,1fr)}.runtime-strip>div{border-bottom:1px solid var(--line);min-height:62px;padding:11px}.runtime-strip>div:nth-child(2n){border-right:0}.runtime-strip>div:nth-last-child(-n+2){border-bottom:0}.task-dashboard{padding:19px 14px}.chat-heading{flex-direction:column;align-items:flex-start;padding:15px}.chat-heading>div:last-child{flex-direction:column;align-items:flex-start}.chat-body{padding:13px}.chat-message{width:94%}.chat-composer-preview,.task-heading{grid-template-columns:1fr}.progress-number{text-align:left;align-items:baseline;gap:10px;display:flex}.progress-number strong{font-size:25px}.progress-track{margin:18px 0 24px}.criterion-card{grid-template-columns:32px minmax(0,1fr);gap:10px}.criterion-card>.status-pill{grid-column:2}.criterion-copy>div{flex-direction:column;align-items:flex-start;gap:5px}.context-rail{grid-template-columns:1fr}.task-empty{grid-template-columns:1fr;min-height:340px;padding:28px 22px}.source-tabs{padding:0 8px;overflow-x:auto}.source-tabs button{flex:none}.source-heading{padding:16px}.source-heading>span,.file-provenance,.file-evidence{display:none}.file-row{grid-template-columns:26px minmax(0,1fr) auto}.diff-toolbar{flex-direction:column;align-items:flex-start}.panel-heading{flex-direction:column;align-items:flex-start;padding:16px}.activity-row{grid-template-columns:10px minmax(0,1fr)}.activity-result{text-align:left;grid-column:2;grid-template-columns:auto auto 1fr}.activity-result button{grid-column:auto;justify-self:end}.section-title-row{flex-direction:column;align-items:flex-start;gap:8px}.section-title-row>span{text-align:left;max-width:100%}.evidence-grid{grid-template-columns:1fr}.evidence-card{min-height:auto}.task-run-card{grid-template-columns:1fr;gap:9px}.task-run-meta{flex-wrap:wrap;justify-content:flex-start}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}@media (forced-colors:active){.status-dot,.activity-state,.progress-track span,.context-meter span{forced-color-adjust:none;background:highlight}.file-row[data-selected=true],.source-tabs button[aria-selected=true]{outline:2px solid highlight}}@keyframes piagent-pulse{0%,to{opacity:1}50%{opacity:.3}}@media (prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important}}.decision-queue{gap:10px;display:grid}.decision-steps{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface);gap:8px;padding:10px 12px;display:grid}.decision-steps>strong{color:var(--warning);font-size:12px}.decision-steps ol{flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none;display:flex}.decision-steps li{min-width:0;max-width:100%}.decision-step{border:1px solid var(--line);border-radius:var(--radius-sm);max-width:100%;min-height:32px;color:var(--muted);background:var(--surface-2);font:inherit;cursor:pointer;align-items:center;gap:6px;padding:4px 10px 4px 5px;font-size:11px;display:inline-flex}.decision-step:hover{border-color:var(--line-strong);color:var(--text)}.decision-step.current{border-color:var(--warning);color:var(--text);background:color-mix(in srgb, var(--warning) 12%, var(--surface-2))}.decision-step:focus-visible{outline:2px solid var(--warning);outline-offset:2px}.decision-step-number{width:20px;height:20px;color:var(--bg);background:var(--muted);border-radius:50%;flex:none;place-items:center;font-size:11px;font-weight:650;display:inline-grid}.decision-step.current .decision-step-number{background:var(--warning)}.decision-step-kind{flex:none;font-weight:650}.decision-step-role{color:var(--quiet);flex:none}.decision-step-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:260px;overflow:hidden}.attention-toasts{z-index:1400;pointer-events:none;gap:8px;width:min(360px,100vw - 32px);display:grid;position:fixed;bottom:44px;right:16px}.attention-toast{border:1px solid var(--line-strong);border-radius:var(--radius-sm);color:var(--text);background:var(--surface);pointer-events:auto;align-items:flex-start;gap:10px;padding:11px 10px 11px 12px;animation:.22s ease-out attention-in;display:flex;box-shadow:0 14px 36px #00000047}.attention-toast-mark{background:var(--positive);border-radius:50%;flex:none;width:10px;height:10px;margin-top:4px}.attention-toast.tone-error .attention-toast-mark{background:var(--danger)}.attention-toast.tone-neutral .attention-toast-mark{background:var(--muted)}.attention-toast.tone-warning{border-color:var(--warning)}.attention-toast.tone-warning .attention-toast-mark{background:var(--warning);animation:1.4s ease-in-out infinite piagent-pulse}.attention-toast-body{flex:1;gap:3px;min-width:0;display:grid}.attention-toast-body strong{text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;overflow:hidden}.attention-toast-title{font-weight:600}.attention-toast-body small{color:var(--muted);font-size:11.5px;line-height:1.4}.attention-toast-actions{flex:none;align-items:center;gap:2px;display:flex}.attention-open{border:1px solid var(--line-strong);border-radius:var(--radius-sm);min-height:30px;color:var(--text);background:var(--surface-2);font:inherit;cursor:pointer;padding:0 11px;font-size:11.5px;font-weight:600}.attention-close{border-radius:var(--radius-sm);width:30px;height:30px;color:var(--muted);cursor:pointer;background:0 0;border:0;font-size:18px;line-height:1}.attention-open:focus-visible,.attention-close:focus-visible{outline:2px solid var(--warning);outline-offset:2px}.attention-more{color:var(--muted);text-align:right;margin:0;padding:0 4px;font-size:11px}@keyframes attention-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}.session-item.attention{box-shadow:inset 3px 0 0 var(--warning);animation:2.4s ease-in-out infinite attention-glow}.session-item.fresh{box-shadow:inset 3px 0 0 var(--positive)}@keyframes attention-glow{0%,to{background:0 0}50%{background:color-mix(in srgb, var(--warning) 9%, transparent)}}@media (prefers-reduced-motion:reduce){.attention-toast,.session-item.attention,.attention-toast.tone-warning .attention-toast-mark{animation:none}}@media (max-width:600px){.attention-toasts{width:calc(100vw - 16px);top:68px;right:8px}.decision-step-label{max-width:150px}}.line-comment-anchor{width:100%;color:inherit;font:inherit;text-align:right;cursor:pointer;background:0 0;border:0;padding:0}.line-comment-anchor:hover,.line-comment-anchor:focus-visible{color:var(--amber);text-decoration:underline}.line-notes{border-block:1px solid var(--line);background:var(--surface);gap:6px;min-width:max-content;max-width:100%;padding:7px 12px 8px 102px;font-size:11px;line-height:1.5;display:grid}.split-code .line-notes{padding-left:54px}.file-findings{margin:10px 0;padding-left:12px}.line-finding{border-radius:var(--radius-sm);white-space:normal;background:#e3a33f17;border-left:3px solid #e3a33f;gap:2px;max-width:760px;padding:6px 9px;display:grid}.line-finding.severity-blocking{background:#ff68741a;border-left-color:#ff6874}.line-finding.severity-minor{background:#6f9fe017;border-left-color:#6f9fe0}.line-finding strong{text-transform:uppercase;letter-spacing:.04em;color:var(--muted);font-size:11px}.line-comment{border-left:3px solid var(--amber);border-radius:var(--radius-sm);white-space:pre-wrap;background:#efbd7814;align-items:baseline;gap:10px;max-width:760px;padding:6px 9px;display:flex}.line-comment span{flex:1}.line-comment button,.line-comment-editor button,.line-comment-actions button{border:1px solid var(--line-strong);border-radius:var(--radius-sm);color:inherit;cursor:pointer;background:0 0;padding:3px 9px;font-size:11px}.line-comment-editor{gap:6px;max-width:760px;display:grid}.line-comment-editor textarea{border:1px solid var(--line-strong);border-radius:var(--radius-sm);width:100%;min-width:320px;color:inherit;background:var(--background,transparent);font:inherit;resize:vertical;padding:7px 9px}.line-comment-editor>div,.line-comment-actions{justify-content:flex-end;align-items:center;gap:8px;display:flex}.line-comment-editor button[type=submit],.line-comment-actions .primary{border-color:var(--amber);color:#1b1408;background:var(--amber);font-weight:650}.line-comment-editor button:disabled{opacity:.5;cursor:not-allowed}.line-comment-bar{border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--surface);gap:8px;margin:10px 0;padding:10px 12px;font-size:12px;display:grid}.line-comment-bar>div:first-child{flex-wrap:wrap;align-items:baseline;gap:10px;display:flex}.line-comment-bar small{color:var(--amber)}.line-comment-bar ul{gap:3px;max-height:160px;margin:0;padding:0;list-style:none;display:grid;overflow:auto}.line-comment-bar li{min-width:0;color:var(--muted);gap:8px;display:flex}.line-comment-bar li code{color:inherit;flex-shrink:0}.line-comment-bar li span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.line-comment-bar li.changed{opacity:.7}.line-comment-bar li em{color:var(--amber);font-style:normal}.streaming-answer .markdown-message>:last-child:after{content:"";vertical-align:-.15em;background:var(--accent);border-radius:1px;width:.5em;height:1.05em;margin-left:3px;animation:1s step-end infinite piagent-caret;display:inline-block}@keyframes piagent-caret{50%{opacity:0}}@media (prefers-reduced-motion:reduce){.streaming-answer .markdown-message>:last-child:after{animation:none}}.attention-toast{animation:.2s cubic-bezier(.2,.7,.2,1) piagent-toast-in}@keyframes piagent-toast-in{0%{opacity:0;transform:translateY(8px)}}@media (max-width:720px){.attention-toasts{top:60px;bottom:auto}}@media (prefers-reduced-motion:reduce){.attention-toast{animation:none}}
1
+ :root{color:var(--text);background:var(--bg);font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;--bg:var(--piagent-palette-background-default,#09090b);--surface:var(--piagent-palette-background-paper,#111114);--text:var(--piagent-palette-text-primary,#ededf0);--muted:var(--piagent-palette-text-secondary,#a3a3ad);--line:var(--piagent-palette-divider,#26262c);--accent:var(--piagent-palette-primary-main,#d8ff7a);--on-accent:var(--piagent-palette-primary-contrastText,#111300);--positive:var(--piagent-palette-secondary-main,#8be9c8);--warning:var(--piagent-palette-warning-main,#efba63);--danger:var(--piagent-palette-error-main,#ff7f86);--surface-strong:color-mix(in srgb, var(--text) 5%, var(--surface));--surface-2:color-mix(in srgb, var(--text) 4%, var(--surface));--line-strong:color-mix(in srgb, var(--text) 18%, var(--surface));--quiet:var(--muted);--accent-soft:color-mix(in srgb, var(--accent) 12%, transparent);--blue:color-mix(in srgb, #7aa2f7 38%, var(--text));--amber:var(--warning);--red:var(--danger);--page-glow:transparent;--radius:8px;--radius-sm:6px;font-family:system-ui,-apple-system,BlinkMacSystemFont,SF Pro Text,Segoe UI,Roboto,sans-serif}*{box-sizing:border-box}html{background:var(--bg)}body{min-width:320px;min-height:100vh;color:var(--text);background:radial-gradient(circle at 62% -20%, var(--page-glow) 0, transparent 36rem), var(--bg);margin:0}button,input,select,textarea{font:inherit}strong,h1,h2,h3,p{overflow-wrap:anywhere}button:focus-visible,a:focus-visible,summary:focus-visible{outline:2px solid var(--accent);outline-offset:3px}.skip-link{z-index:100;border-radius:var(--radius-sm);color:#08130f;background:var(--accent);padding:9px 12px;font-size:11px;font-weight:650;position:fixed;top:8px;left:8px;transform:translateY(-160%)}.skip-link:focus{transform:translateY(0)}.app-shell{min-height:100vh}.topbar{z-index:10;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);background:#090c12db;border-bottom:1px solid #354052b8;grid-template-columns:1fr minmax(220px,auto) 1fr;align-items:center;gap:24px;min-height:68px;padding:0 28px;display:grid;position:sticky;top:0}.brand,.session-title,.topbar-actions,.runtime-strip>div,.task-meta,.health-line{align-items:center;display:flex}.brand{gap:11px}.brand>div,.session-title{flex-direction:column;display:flex}.brand strong{letter-spacing:.01em;font-size:15px}.brand small,.session-title small{color:var(--quiet);letter-spacing:.04em;font-size:11px}.brand-mark{border-radius:var(--radius-sm);width:34px;height:34px;color:var(--accent);background:var(--accent-soft);border:1px solid #64e0b56b;place-items:center;font-family:Georgia,serif;font-size:21px;display:grid}.session-title{text-align:center;min-width:0}.session-title strong{text-overflow:ellipsis;white-space:nowrap;max-width:360px;font-size:13px;overflow:hidden}.topbar-actions{justify-content:flex-end;gap:10px}.read-only-badge{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--muted);text-transform:uppercase;letter-spacing:.08em;padding:5px 9px;font-size:11px;font-weight:600}.workspace{width:min(1460px,100% - 48px);margin:0 auto;padding:28px 0 64px}.runtime-strip{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-2);grid-template-columns:repeat(6,minmax(0,1fr));display:grid;overflow:hidden}.runtime-strip>div{border-right:1px solid var(--line);flex-direction:column;justify-content:center;align-items:flex-start;gap:7px;min-width:0;min-height:70px;padding:13px 16px}.runtime-strip>div:last-child{border-right:0}.runtime-strip span:first-child{color:var(--quiet);letter-spacing:.1em;text-transform:uppercase;font-size:11px;font-weight:650}.runtime-strip strong{max-width:100%;color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.content-grid{grid-template-columns:minmax(0,1fr) 290px;align-items:start;gap:18px;margin-top:18px;display:grid}.surface{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface);box-shadow:0 22px 60px #0000001f}.task-dashboard{padding:clamp(20px,3vw,34px)}.task-heading{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:24px;display:grid}.section-kicker{color:var(--accent);letter-spacing:.14em;text-transform:uppercase;margin:0 0 7px;font-size:11px;font-weight:650}.task-heading h2,.task-empty h2{max-width:900px;color:var(--text);letter-spacing:-.035em;margin:0;font-size:clamp(23px,3vw,38px);font-weight:650;line-height:1.18}.task-meta{color:var(--muted);flex-wrap:wrap;gap:12px;margin-top:15px;font-size:12px}.task-meta>span:not(.status-pill){border-left:1px solid var(--line-strong);padding-left:12px}.progress-number{text-align:right;min-width:116px}.progress-number strong{color:var(--accent);letter-spacing:-.05em;font-size:32px;font-weight:650;display:block}.progress-number span{color:var(--muted);font-size:11px}.progress-track{border-radius:var(--radius-sm);background:#242b36;height:5px;margin:26px 0 30px;overflow:hidden}.progress-track span{border-radius:inherit;background:linear-gradient(90deg,#45c89b,#7ee6bd);height:100%;transition:width .25s;display:block;box-shadow:0 0 20px #64e0b552}.status-pill{width:-moz-fit-content;width:fit-content;min-width:0;color:var(--text);white-space:nowrap;align-items:center;gap:6px;font-size:11px;font-weight:600;line-height:1.2;display:inline-flex}.status-dot{width:6px;height:6px;box-shadow:0 0 0 3px color-mix(in srgb, currentColor 13%, transparent);background:currentColor;border-radius:50%;flex:none}.tone-positive{color:var(--accent)}.tone-warning{color:var(--amber)}.tone-danger{color:var(--red)}.tone-info{color:var(--blue)}.tone-neutral{color:var(--muted)}.criteria-heading{justify-content:space-between;align-items:baseline;gap:16px;margin-bottom:12px;display:flex}.criteria-heading h2{letter-spacing:.01em;margin:0;font-size:13px}.criteria-heading>span{color:var(--quiet);font-size:11px}.criteria-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.criterion-card{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-2);grid-template-columns:38px minmax(0,1fr) auto;align-items:center;gap:14px;min-height:72px;padding:12px 15px;display:grid}.criterion-index{border:1px solid color-mix(in srgb, currentColor 28%, transparent);border-radius:var(--radius-sm);background:color-mix(in srgb, currentColor 7%, transparent);place-items:center;width:32px;height:32px;font-size:11px;font-weight:650;display:grid}.criterion-copy{min-width:0}.criterion-copy>div{align-items:center;gap:9px;display:flex}.criterion-copy p{color:var(--text);margin:0;font-size:13px;line-height:1.45}.criterion-copy small{color:var(--quiet);margin-top:4px;font-size:11px;display:block}.critical-tag{border-radius:var(--radius-sm);color:var(--amber);letter-spacing:.08em;text-transform:uppercase;border:1px solid #efba633d;flex:none;padding:3px 6px;font-size:10px;font-weight:650}.blocker{border-radius:var(--radius-sm);background:#ff7f8612;border:1px solid #ff7f8640;grid-template-columns:auto 1fr;gap:14px;margin:-9px 0 24px;padding:12px 14px;display:grid}.blocker span{color:var(--red);text-transform:uppercase;font-size:11px;font-weight:650}.blocker p{color:var(--text);margin:0;font-size:12px}.work-plan{border-top:1px solid var(--line);color:var(--muted);margin-top:16px;padding-top:15px}.work-plan summary{cursor:pointer;font-size:12px;font-weight:600}.work-plan ol{gap:9px;margin:14px 0 0;padding:0;list-style:none;display:grid}.work-plan li{grid-template-columns:100px 1fr;align-items:center;gap:12px;font-size:12px;display:grid}.context-rail{gap:18px;display:grid}.compact-panel{padding:18px}.compact-panel dl{margin:0}.compact-panel dl>div{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:16px;min-height:39px;display:flex}.compact-panel dl>div:last-child{border-bottom:0}.compact-panel dt{color:var(--muted);font-size:11px}.compact-panel dd{max-width:170px;color:var(--text);text-overflow:ellipsis;white-space:nowrap;margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;overflow:hidden}.health-line{justify-content:space-between;gap:12px}.health-line>span{color:var(--quiet);font-size:11px}.health-issue{border-top:1px solid var(--line);color:var(--muted);margin:13px 0 0;padding-top:12px;font-size:11px;line-height:1.5}.task-empty{grid-template-columns:auto minmax(0,620px);place-content:center;gap:24px;min-height:420px;padding:48px;display:grid}.task-empty .empty-mark{border-radius:var(--radius-sm);width:64px;height:64px;color:var(--accent);background:var(--accent-soft);border:1px solid #64e0b547;place-items:center;font-family:Georgia,serif;font-size:38px;display:grid}.task-empty p:last-child{color:var(--muted);margin:13px 0 0;font-size:13px;line-height:1.6}.chat-panel{margin-top:18px;position:relative;overflow:hidden}.chat-panel[data-dragging]{outline:2px dashed var(--accent);outline-offset:-4px}.chat-drop-overlay{z-index:4;border-radius:var(--radius-sm);background:color-mix(in srgb, var(--surface-strong) 88%, transparent);pointer-events:none;text-align:center;align-content:center;justify-items:center;gap:6px;padding:16px;display:grid;position:absolute;inset:0}.chat-drop-overlay strong{color:var(--accent);font-size:13px}.chat-drop-overlay small{color:var(--quiet);font-size:11px}@media (prefers-reduced-motion:no-preference){.chat-drop-overlay{animation:.12s ease-out chat-drop-in}}@keyframes chat-drop-in{0%{opacity:0}to{opacity:1}}.chat-heading{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:20px;min-height:78px;padding:17px 22px;display:flex}.chat-heading h2{letter-spacing:-.02em;margin:0;font-size:18px}.chat-heading>div:last-child{color:var(--quiet);align-items:center;gap:12px;font-size:11px;display:flex}.chat-read-state{border-radius:var(--radius-sm);color:var(--amber);background:#efba630f;border:1px solid #efba633b;padding:5px 8px}.chat-body{background:var(--surface-2);overscroll-behavior:contain;gap:11px;max-height:620px;padding:18px 20px;display:grid;overflow:auto}.chat-empty{color:var(--quiet);text-align:center;margin:0;padding:28px;font-size:11px}.load-older{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--muted);background:var(--surface);cursor:pointer;justify-self:center;padding:6px 10px;font-size:11px}.chat-message{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-2);width:min(82%,900px);padding:12px 14px}.chat-message>div{justify-content:space-between;align-items:center;gap:12px;display:flex}.chat-message strong{color:var(--text);letter-spacing:.04em;text-transform:uppercase;font-size:11px}.chat-message time,.chat-message small{color:var(--quiet);font-size:10.5px}.chat-message p{color:var(--text);white-space:pre-wrap;margin:7px 0 0;font-size:12px;line-height:1.6}.chat-message small{color:var(--amber);margin-top:7px;display:block}.chat-user{background:#75a7ff12;border-color:#75a7ff38;justify-self:end}.chat-assistant{justify-self:start}.chat-streaming{box-shadow:inset 2px 0 var(--accent);border-color:#64e0b542}.stream-indicator{color:var(--accent);font-size:10.5px}.chat-tool-live,.chat-tool-result{border:1px solid var(--line);border-radius:var(--radius-sm);width:-moz-fit-content;width:fit-content;max-width:82%;color:var(--quiet);background:var(--surface-2);align-items:center;gap:9px;padding:8px 11px;font-size:10.5px;display:flex}.chat-tool-live strong,.chat-tool-result strong{color:var(--text);font-family:ui-monospace,monospace;font-size:11px}.tool-spinner{border:1px solid var(--blue);border-right-color:#0000;border-radius:50%;width:7px;height:7px;animation:.8s linear infinite spin}.held-queue{border-top:1px solid var(--line);background:#efba6309;padding:12px 16px}.held-queue-heading{justify-content:space-between;align-items:center;gap:12px;margin-bottom:8px;display:flex}.held-queue-heading strong{color:var(--text);letter-spacing:.04em;text-transform:uppercase;font-size:11px}.held-queue-heading span{color:var(--amber);font-size:10.5px}.held-queue ol{gap:7px;max-height:260px;margin:0;padding:0;list-style:none;display:grid;overflow:auto}.held-queue li{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-2);grid-template-columns:minmax(0,1fr) auto;gap:7px 12px;padding:9px 10px;display:grid}.held-queue li[data-state=quarantined]{border-color:#efba6340}.held-queue p{color:var(--text);text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:11px;line-height:1.45;overflow:hidden}.held-queue textarea{resize:vertical;border:1px solid var(--line);border-radius:var(--radius-sm);min-width:0;color:var(--text);background:var(--surface-2);padding:8px 9px;font-size:11px}.held-queue li>div{align-items:start;gap:5px;display:flex}.held-queue button{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--muted);background:var(--surface);cursor:pointer;padding:4px 7px;font-size:10.5px}.held-queue button:disabled{cursor:not-allowed;opacity:.45}.held-queue small{color:var(--amber);grid-column:1/-1;font-size:10px}.chat-composer-preview{border-top:1px solid var(--line);background:var(--surface-2);grid-template-columns:minmax(0,1fr) auto;gap:10px;padding:14px 16px;display:grid}.attachment-list{flex-wrap:wrap;grid-column:1/-1;gap:7px;margin:0;padding:0;list-style:none;display:flex}.attachment-list li{border-radius:var(--radius-sm);background:#75a7ff0f;border:1px solid #75a7ff38;align-items:center;gap:8px;max-width:260px;padding:7px 8px;display:flex}.attachment-list span{flex-direction:column;min-width:0;display:flex}.attachment-list strong{color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;overflow:hidden}.attachment-list small{color:var(--quiet);font-size:10px}.attachment-list button{min-width:0;padding:3px 6px;font-size:10px}.chat-composer-preview textarea{resize:none;border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--quiet);background:var(--surface-2);padding:10px 12px;font-size:11px}.chat-composer-preview button{border:1px solid var(--line);border-radius:var(--radius-sm);min-width:76px;color:var(--quiet);background:var(--surface-strong)}.composer-actions{grid-template-columns:repeat(2,minmax(76px,auto));gap:6px;display:grid}.composer-actions .interrupt-send{color:var(--amber);grid-column:1/-1}.attachment-list li[data-kind=document]{background:#7ee7b212;border-color:#7ee7b24d}.attachment-picker{border:1px solid var(--line);border-radius:var(--radius-sm);width:-moz-fit-content;width:fit-content;color:var(--blue);cursor:pointer;align-items:center;padding:6px 9px;font-size:10.5px;display:inline-flex}.attachment-picker.disabled{cursor:not-allowed;opacity:.45}.attachment-picker input{opacity:0;width:1px;height:1px;position:absolute;overflow:hidden}.chat-composer-preview>small{color:var(--muted);grid-column:1/-1;font-size:10.5px}@keyframes spin{to{transform:rotate(360deg)}}.document-workspace{margin-top:0;overflow:hidden}.document-heading{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:18px;min-height:82px;padding:18px 22px;display:flex}.document-heading h2{letter-spacing:-.02em;margin:0;font-size:18px}.document-heading>span{color:var(--quiet);letter-spacing:.06em;text-transform:uppercase;font-size:11px;font-weight:600}.document-body{grid-template-columns:minmax(248px,320px) minmax(0,1fr);min-height:520px;display:grid}.document-list{border-right:1px solid var(--line);overscroll-behavior:contain;flex-direction:column;gap:10px;min-width:0;max-height:720px;padding:14px;display:flex;overflow:auto}.document-group{flex-direction:column;gap:2px;min-width:0;display:flex}.document-group-heading{flex-direction:column;padding:8px 6px 4px;display:flex}.document-group-heading strong{color:var(--quiet);letter-spacing:.08em;text-transform:uppercase;font-size:10.5px;font-weight:650}.document-group-heading span{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;overflow:hidden}.document-row{border-radius:var(--radius-sm);cursor:pointer;text-align:left;background:0 0;border:0;align-items:center;gap:9px;min-width:0;padding:7px 8px;display:flex}.document-row-copy{flex-direction:column;flex:1;min-width:0;display:flex}.document-row-copy strong{color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.document-row-copy small{color:var(--quiet);text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;font-size:10.5px;overflow:hidden}.document-row-meta{color:var(--muted);flex-shrink:0;font-size:10.5px}.document-viewer{overscroll-behavior:contain;flex-direction:column;min-width:0;max-height:720px;display:flex;overflow:auto}.document-toolbar{z-index:2;border-bottom:1px solid var(--line);background:var(--surface-strong);justify-content:space-between;align-items:center;gap:14px;padding:12px 18px;display:flex;position:sticky;top:0}.document-toolbar strong{font-size:12px;display:block}.document-toolbar small{color:var(--quiet);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;display:block;overflow:hidden}.document-badges{flex-shrink:0;gap:6px;display:flex}.document-content{min-width:0;color:var(--text);padding:18px 22px;font-size:12px}.document-plain{font-family:var(--mono,ui-monospace, SFMono-Regular, Menlo, monospace);white-space:pre-wrap;word-break:break-word;margin:0;font-size:11px;line-height:1.7;overflow-x:auto}.document-table{border-collapse:collapse;width:100%;font-size:11px}.document-table th,.document-table td{border:1px solid var(--line);text-overflow:ellipsis;white-space:nowrap;max-width:320px;padding:5px 9px;overflow:hidden}.document-table th{background:var(--surface-strong);text-align:left;font-weight:650;position:sticky;top:0}.document-placeholder{height:100%;color:var(--muted);text-align:center;align-content:center;justify-items:center;gap:8px;padding:48px 24px;display:grid}.document-placeholder .MuiSvgIcon-root{opacity:.5;font-size:30px}.document-empty{color:var(--muted);padding:14px;font-size:11px}.change-report{--report-mark:#ff5a5f;gap:22px;display:grid}.change-report-actions{justify-content:flex-end;margin-bottom:8px;display:flex}.change-report-full{min-height:100%;color:var(--text);background:var(--bg);padding:28px max(16px,4vw) 48px;font-size:13px;position:relative}.change-report-full .change-report{max-width:1400px;margin:0 auto}.change-report-close{z-index:3;top:12px;right:16px;background:var(--surface-strong)!important;position:fixed!important}.change-report h2{margin:0 0 4px;font-size:18px}.change-report h3{margin:0 0 10px;font-size:14px}.change-report h4{margin:0 0 4px;font-size:13px}.change-report h5{color:var(--quiet);letter-spacing:.08em;text-transform:uppercase;margin:16px 0 8px;font-size:10.5px;font-weight:650}.change-report ul{margin:0;padding-left:18px}.change-report-note{color:var(--muted);margin:0 0 10px}.change-report-chips{flex-wrap:wrap;gap:6px;display:flex}.change-report-chips span{border:1px solid var(--line);color:var(--muted);border-radius:999px;padding:2px 9px;font-size:11px}.change-report-card{border:1px solid var(--line);background:var(--surface-strong);border-radius:4px;margin-bottom:14px;padding:14px}.change-report-pair{grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:12px;display:grid}.change-report-pair.narrow{grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),300px));margin-top:10px}.change-report-figure{min-width:0;margin:0}.change-report-figure figcaption{margin-bottom:5px;font-weight:600}.change-report-shot{border:1px solid var(--line);border-radius:4px;line-height:0;position:relative}.change-report-shot img{border-radius:3px;width:100%;display:block}.change-report-box{box-sizing:border-box;border:3px solid var(--report-mark);border-radius:3px;position:absolute}.change-report-box b,.change-report-number{width:20px;height:20px;color:var(--text);background:var(--report-mark);border-radius:50%;flex:none;place-items:center;font-size:11px;line-height:1;display:inline-grid}.change-report-box b{box-shadow:0 0 0 2px var(--surface-strong);position:absolute;top:-11px;left:-11px}.change-report-zoom-row{gap:6px;margin-bottom:12px;display:grid}.change-report-zoom-row p{align-items:center;gap:8px;margin:0;display:flex}.change-report-zoom{min-width:0}.change-report-zoom span{color:var(--quiet);font-size:11px}.change-report-crop{box-sizing:border-box;border:3px solid var(--report-mark);background-repeat:no-repeat;border-radius:4px;width:100%}.change-report-missing{border:1px dashed var(--line);color:var(--muted);text-align:center;border-radius:4px;padding:22px}.change-report details{margin-top:12px}.change-report summary{cursor:pointer;font-weight:600}.change-report-scroll{overflow-x:auto}.change-report-table{border-collapse:collapse;width:100%;font-size:11px}.change-report-table th,.change-report-table td{border:1px solid var(--line);text-align:left;vertical-align:top;padding:6px 9px}.change-report-table th{color:var(--quiet);font-weight:650}.change-report-table code{word-break:break-all;display:block}.change-report-result{font-weight:650}.change-report-result.passed{color:var(--accent)}.change-report-result.failed{color:var(--muted)}.change-report-result.skipped{color:var(--text)}@media (max-width:900px){.document-body{grid-template-columns:1fr}.document-list{border-right:0;border-bottom:1px solid var(--line);max-height:300px}}:root[data-piagent-color-mode=light] .document-row-copy strong,:root[data-piagent-color-mode=light] .document-content{color:var(--text)}.source-workspace{margin-top:0;overflow:hidden}.source-heading{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:18px;min-height:82px;padding:18px 22px;display:flex}.source-heading h2{letter-spacing:-.02em;margin:0;font-size:18px}.source-heading>span{color:var(--quiet);letter-spacing:.06em;text-transform:uppercase;font-size:11px;font-weight:600}.source-tabs{border-bottom:1px solid var(--line);background:var(--surface-2);min-width:0;padding:0 14px;display:flex}.source-tabs button{min-width:0;color:var(--muted);cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:9px;padding:14px 15px 12px;font-size:11px;display:flex}.source-tabs button:hover{color:var(--text)}.source-tabs button[aria-selected=true]{border-bottom-color:var(--accent);color:var(--accent)}.source-tabs button b{border-radius:var(--radius-sm);min-width:20px;color:inherit;background:color-mix(in srgb, currentColor 10%, transparent);text-align:center;padding:2px 6px;font-size:10.5px}.source-body{grid-template-columns:minmax(248px,304px) minmax(0,1fr);min-height:480px;display:grid}.file-panel{border-right:1px solid var(--line);background:color-mix(in srgb, var(--bg) 72%, var(--surface));min-width:0}.file-panel-meta{border-bottom:1px solid var(--line);min-height:42px;color:var(--muted);justify-content:space-between;align-items:center;gap:14px;padding:0 14px;font-size:11px;display:flex}.file-panel-meta small{color:var(--quiet);letter-spacing:.08em;text-transform:uppercase;font-weight:650}.source-list-retry{border-radius:var(--radius-sm);color:var(--accent);font:inherit;background:0 0;border:1px solid;padding:4px 8px;font-weight:650}.file-list{overscroll-behavior:contain;max-height:620px;overflow:auto}.file-group-label{min-height:28px;color:var(--quiet);align-items:center;gap:6px;padding:5px 10px 3px}.file-group-label svg{width:14px;height:14px}.file-group-label span{min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10.5px;font-weight:600}.file-row{border-radius:var(--radius-sm);width:100%;min-height:54px;color:inherit;cursor:pointer;text-align:left;background:0 0;border:0;grid-template-columns:26px minmax(0,1fr) auto;align-items:center;gap:9px;margin:0;padding:8px 9px;display:grid}.file-row:hover{background:#75a7ff0d}.file-row[data-selected=true]{box-shadow:inset 2px 0 var(--accent);background:#64e0b513}.file-status{border:1px solid var(--line-strong);border-radius:var(--radius-sm);width:23px;height:23px;color:var(--muted);place-items:center;font-family:ui-monospace,monospace;font-size:11px;font-weight:650;display:grid}.status-A,.status-U{color:var(--accent);border-color:#64e0b54d}.status-M,.status-R{color:var(--blue);border-color:#75a7ff4d}.status-D,.status-C{color:var(--red);border-color:#ff7f864d}.file-name{flex-direction:column;min-width:0;display:flex}.file-name strong{color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;font-weight:600;overflow:hidden}.file-name small,.file-provenance,.file-evidence{color:var(--quiet);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;overflow:hidden}.file-provenance,.file-evidence{display:none}.file-stats{color:var(--muted);white-space:nowrap;font-family:ui-monospace,monospace;font-size:10.5px}.files-empty,.diff-empty{min-height:220px;color:var(--quiet);text-align:center;place-items:center;padding:28px;font-size:12px;display:grid}.diff-empty{background:repeating-linear-gradient(-45deg,#0000,#0000 13px,#ffffff03 13px 14px);min-height:100%}.error-state{color:var(--red)}.diff-viewer{background:var(--surface);min-width:0;overflow:auto}.diff-toolbar{border-bottom:1px solid var(--line);background:var(--surface);justify-content:space-between;align-items:center;gap:15px;min-height:55px;padding:9px 13px;display:flex}.diff-toolbar>div:first-child{align-items:center;gap:10px;min-width:0;display:flex}.diff-actions{align-items:center;gap:10px;display:flex}.review-state{color:var(--quiet);align-items:center;gap:8px;font-size:10.5px;display:flex}.review-state>span{white-space:nowrap}.review-state button{border:1px solid var(--line);border-radius:var(--radius-sm);min-height:28px;color:var(--text);background:#18202b;padding:0 9px;font-size:10.5px}.review-state button:disabled{cursor:not-allowed;opacity:.45}.review-reviewed>span{color:var(--accent)}.review-stale>span{color:var(--amber)}.source-mutation-preview{max-width:290px;color:var(--text);align-items:center;gap:8px;font-size:10.5px;display:flex}.source-mutation-preview>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.source-mutation-preview button{border-radius:var(--radius-sm);min-height:28px;color:var(--text);background:#42c2921a;border:1px solid #42c29266;flex:none;padding:0 10px;font-size:10.5px;font-weight:650}.source-mutation-preview button:disabled{cursor:not-allowed;opacity:.45}.source-revert-preview{max-width:290px;color:var(--text);align-items:center;gap:8px;font-size:10.5px;display:flex}.source-revert-preview>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.source-revert-preview button,.hunk-header .revert-action{border-radius:var(--radius-sm);min-height:28px;color:var(--text);background:#ff7f8617;border:1px solid #ff7f8661;flex:none;padding:0 10px;font-size:10.5px;font-weight:650}.source-revert-preview button:disabled{cursor:not-allowed;opacity:.45}.source-open-action button{border-radius:var(--radius-sm);min-height:28px;color:var(--text);white-space:nowrap;background:#75a7ff1a;border:1px solid #75a7ff61;padding:0 10px;font-size:10.5px;font-weight:650}.source-open-action button:disabled{cursor:wait;opacity:.55}.source-open-status{color:var(--text);background:#75a7ff14;border-bottom:1px solid #75a7ff38;padding:8px 14px;font-size:11px}.commit-summary-panel{border-bottom:1px solid var(--line);background:linear-gradient(120deg,#42c29214,#75a7ff0d);grid-template-columns:minmax(230px,.8fr) minmax(300px,1.5fr);align-items:start;gap:18px;padding:14px 16px;display:grid}.commit-summary-panel h3{color:var(--text);margin:1px 0 4px;font-size:14px}.commit-summary-panel>div>span{color:var(--quiet);font-size:10.5px}.commit-summary-panel>button{border-radius:var(--radius-sm);min-height:32px;color:var(--text);background:#42c2921a;border:1px solid #42c29266;justify-self:start;padding:0 12px;font-size:11px;font-weight:650}.commit-summary-output{border-radius:var(--radius-sm);background:#070a0f8c;border:1px solid #75a7ff33;gap:5px;padding:10px 12px;display:grid}.commit-summary-output>strong{color:var(--text);font:700 12px ui-monospace,monospace}.commit-summary-output>code{color:var(--text);white-space:pre-wrap;font-size:10.5px}.commit-summary-output>div{flex-wrap:wrap;gap:7px;margin-top:4px;display:flex}.commit-summary-output button{border:1px solid var(--line);border-radius:var(--radius-sm);min-height:28px;color:var(--text);background:#18202b;padding:0 10px;font-size:10.5px}.commit-summary-output button:last-child{color:var(--text);background:#ecb35b17;border-color:#ecb35b59}.commit-summary-status{color:var(--text);grid-column:1/-1;margin:0;font-size:11px}.model-summary-dialog{border-color:#ecb35b57}.review-error{color:var(--text);background:#ff687414;border-bottom:1px solid #ff68743d;padding:8px 14px;font-size:11px}.source-revert-error{color:var(--text);background:#ff687414;border-top:1px solid #ff68743d;padding:9px 14px;font-size:11px}.source-action-warning{color:var(--text);background:#f6be5214;border-top:1px solid #f6be523d;padding:9px 14px;font-size:11px}.detail-reconciliation-warning{color:var(--text);background:#f6be5214;border-bottom:1px solid #f6be523d;justify-content:space-between;align-items:center;gap:12px;padding:8px 14px;font-size:11px;display:flex}.detail-reconciliation-warning button{border-radius:var(--radius-sm);color:inherit;background:0 0;border:1px solid;padding:4px 8px}.diff-toolbar strong{color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,monospace;font-size:11px;overflow:hidden}.access-badge{text-transform:uppercase;font-size:10.5px;font-weight:650}.mode-switch{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--bg);padding:2px;display:flex}.mode-switch button{border-radius:var(--radius-sm);color:var(--quiet);cursor:pointer;background:0 0;border:0;padding:5px 8px;font-size:10.5px}.mode-switch button[aria-pressed=true]{color:var(--text);background:var(--surface-strong)}.mode-switch .MuiToggleButton-root.Mui-selected{color:var(--text);background:#293241;box-shadow:inset 0 0 0 1px #75a7ff4d}.diff-context{border-bottom:1px solid var(--line);min-height:37px;color:var(--quiet);align-items:center;gap:14px;padding:0 14px;font-size:10.5px;display:flex}.diff-context .additions{color:var(--accent);margin-left:auto}.diff-context .deletions{color:var(--red)}.diff-hunk{min-width:0;overflow:auto}.hunk-header{color:var(--blue);background:#75a7ff12;border-bottom:1px solid #75a7ff24;justify-content:space-between;align-items:center;gap:12px;padding:6px 12px;font-family:ui-monospace,monospace;font-size:10.5px;display:flex;position:sticky;left:0}.hunk-header button{border-radius:var(--radius-sm);min-height:25px;color:var(--text);background:#75a7ff1a;border:1px solid #75a7ff57;padding:0 9px;font:700 9px Inter,sans-serif}.hunk-header button:disabled{cursor:not-allowed;opacity:.45}.hunk-actions{align-items:center;gap:6px;display:inline-flex}.dialog-backdrop{z-index:80;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#030508c2;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.confirm-dialog{border-radius:var(--radius-sm);background:var(--surface-2);border:1px solid #ff7f8652;width:min(520px,100%);padding:24px;box-shadow:0 30px 100px #00000094}.confirm-dialog h3{color:var(--text);margin:0;font-size:21px}.confirm-dialog>p:not(.section-kicker){color:var(--text);margin:14px 0;font-size:12px;line-height:1.65}.confirm-dialog code{color:var(--text)}.revert-diff{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-2);max-height:min(300px,42vh);margin:14px 0;overflow:auto}.revert-diff section>div{color:var(--text);background:#182130;padding:6px 9px;font:9px ui-monospace,monospace;position:sticky;top:0}.revert-line{white-space:pre-wrap;min-height:19px;padding:2px 9px;font:10px/1.5 ui-monospace,monospace;display:block;color:var(--text)!important}.revert-line b{width:14px;color:inherit;display:inline-block}.revert-added{background:#42c29214;color:var(--text)!important}.revert-deleted{background:#ff687414;color:var(--text)!important}.revert-meta{color:var(--muted)!important}.revert-safety{border-radius:var(--radius-sm);background:#efba630f;border:1px solid #efba6338;gap:5px;padding:12px;display:grid}.revert-safety strong{color:var(--text);font-size:11px}.revert-safety span{color:var(--muted);font-size:11px}.confirm-actions{justify-content:flex-end;gap:9px;margin-top:20px;display:flex}.confirm-actions button{border:1px solid var(--line-strong);border-radius:var(--radius-sm);min-height:34px;color:var(--text);background:#1b222d;padding:0 14px;font-size:11px;font-weight:650}.confirm-actions .danger-action{color:var(--text);background:#ff7f8621;border-color:#ff7f866b}.confirm-actions button:disabled{cursor:not-allowed;opacity:.48}.diff-line{grid-template-columns:42px 42px 18px minmax(500px,1fr);min-width:max-content;min-height:21px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:21px;display:grid}.diff-line>span{color:#566173;text-align:right;-webkit-user-select:none;user-select:none;padding:0 7px}.diff-line b{color:var(--quiet);text-align:center;-webkit-user-select:none;user-select:none}.diff-line code,.split-line code{color:var(--text);white-space:pre;padding:0 8px}.syntax-keyword{color:var(--text);font-weight:650}.syntax-string,.syntax-number{color:var(--text)}.syntax-comment{color:var(--muted);font-style:italic}.syntax-literal,.syntax-property{color:var(--text)}.diff-added{background:#42c2921a}.diff-added code,.diff-added b{color:var(--text)}.diff-deleted{background:#ff68741a}.diff-deleted code,.diff-deleted b{color:var(--text)}.split-line{border-bottom:1px solid #242c394d;grid-template-columns:42px minmax(350px,1fr) 42px minmax(350px,1fr);min-width:860px;min-height:21px;font-family:ui-monospace,monospace;font-size:11px;line-height:21px;display:grid}.split-line>span{color:#566173;text-align:right;border-right:1px solid #242c39b3;padding:0 7px}.split-line code:nth-child(2){border-right:1px solid var(--line)}.unchanged-region{border-block:1px solid var(--line);color:var(--quiet);background:var(--surface-2);text-align:center;padding:7px 12px;font-size:10.5px}.diff-fallback{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--muted);background:var(--surface);gap:6px;margin:18px;padding:16px;font-size:11px;display:grid}.diff-fallback strong{color:var(--amber);text-transform:uppercase;font-size:11px}.activity-panel{margin-top:18px;overflow:hidden}.panel-heading{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:18px;min-height:82px;padding:18px 22px;display:flex}.panel-heading h2{letter-spacing:-.02em;margin:0;font-size:18px}.panel-heading>div:last-child{color:var(--quiet);align-items:center;gap:14px;font-size:11px;display:flex}.running-count{color:var(--blue)}.activity-list{display:grid}.activity-row{border-bottom:1px solid var(--line);background:var(--surface-2);grid-template-columns:10px minmax(0,1fr) 150px;align-items:start;gap:14px;padding:15px 18px;display:grid}.activity-row:last-child{border-bottom:0}.activity-state{width:7px;height:7px;box-shadow:0 0 0 4px color-mix(in srgb, currentColor 10%, transparent);background:currentColor;border-radius:50%;margin-top:5px}.activity-copy{min-width:0}.activity-copy>div{align-items:center;gap:9px;display:flex}.activity-copy strong{color:var(--text);font-size:12px}.activity-copy>div>span{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--quiet);letter-spacing:.06em;text-transform:uppercase;padding:2px 5px;font-size:10px;font-weight:650}.activity-copy>p{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;margin:4px 0 0;font-family:ui-monospace,monospace;font-size:11px;line-height:1.45;overflow:hidden}.activity-result{text-align:right;grid-template-columns:1fr auto;align-items:center;gap:4px 9px;display:grid}.activity-result strong{color:var(--text);font-size:11px}.activity-result>span{color:var(--quiet);font-family:ui-monospace,monospace;font-size:10.5px}.activity-result button{color:var(--blue);cursor:pointer;background:0 0;border:0;grid-column:1/-1;justify-self:end;padding:2px 0;font-size:10.5px}.log-preview{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--text);background:var(--surface-2);white-space:pre-wrap;margin-top:10px;padding:10px 12px;font-family:ui-monospace,monospace;font-size:10.5px;line-height:1.55}.log-preview small{color:var(--amber);margin-top:5px;display:block}.activity-empty{min-height:150px;color:var(--quiet);place-items:center;padding:24px;font-size:11px;display:grid}.panel-footnote{border-top:1px solid var(--line);color:var(--quiet);text-align:center;padding:9px 18px;font-size:10.5px}.evidence-section{margin-top:34px}.section-title-row{justify-content:space-between;align-items:end;gap:24px;margin-bottom:14px;padding:0 3px;display:flex}.section-title-row h2{letter-spacing:-.025em;margin:0;font-size:20px}.section-title-row>span{max-width:440px;color:var(--muted);text-align:right;text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.evidence-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;display:grid}.evidence-card{min-width:0;min-height:250px;padding:18px}.evidence-card h3{min-height:38px;color:var(--text);margin:0 0 16px;font-size:14px;line-height:1.35}.evidence-list{margin:0}.evidence-list>div{border-bottom:1px solid var(--line);grid-template-columns:88px minmax(0,1fr);align-items:center;gap:8px;min-height:38px;display:grid}.evidence-list>div:last-child{border-bottom:0}.evidence-list dt,.budget-grid dt{color:var(--quiet);font-size:10.5px}.evidence-list dd{color:var(--muted);text-align:right;text-overflow:ellipsis;white-space:nowrap;margin:0;font-family:ui-monospace,monospace;font-size:10.5px;overflow:hidden}.context-meter{border-radius:var(--radius-sm);background:#28303c;height:4px;margin:-3px 0 12px;overflow:hidden}.context-meter span{border-radius:inherit;background:linear-gradient(90deg, var(--blue), var(--accent));height:100%;display:block}.budget-grid{grid-template-columns:repeat(3,1fr);gap:7px;margin:0;display:grid}.budget-grid>div{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-2);padding:12px 8px}.budget-grid dt{margin-bottom:5px}.budget-grid dd{color:var(--text);margin:0;font-family:ui-monospace,monospace;font-size:12px}.card-note,.card-empty{color:var(--quiet);margin:14px 0 0;font-size:11px;line-height:1.5}.handoff-copy>p{color:var(--muted);margin:0 0 13px;font-size:11px;line-height:1.55}.handoff-blocker,.next-action{border-radius:var(--radius-sm);background:#ff7f860d;border:1px solid #ff7f8638;gap:4px;margin-top:9px;padding:9px 10px;display:grid}.next-action{background:#64e0b50d;border-color:#64e0b533}.handoff-blocker strong,.next-action strong{color:var(--red);letter-spacing:.08em;text-transform:uppercase;font-size:10px}.next-action strong{color:var(--accent)}.handoff-blocker span,.next-action span{color:var(--text);font-size:11px;line-height:1.4}.loading-shell{width:min(560px,100% - 40px);margin:0 auto;padding-top:22vh}.loading-shell .brand-mark{border-radius:var(--radius-sm);width:48px;height:48px;margin-bottom:25px;font-size:29px}.loading-shell h1{color:var(--text);letter-spacing:-.045em;margin:0;font-size:clamp(30px,6vw,50px);line-height:1.05}.loading-shell>p:not(.section-kicker){max-width:460px;color:var(--muted);margin:18px 0 22px;font-size:14px;line-height:1.6}.session-options{grid-template-columns:minmax(220px,.75fr) minmax(420px,1.25fr);gap:22px;padding:20px;display:grid}.session-options-copy h2{color:var(--text);margin:2px 0 8px;font-size:16px}.session-options-copy>p:last-child{max-width:520px;color:var(--quiet);margin:0;font-size:11px;line-height:1.55}.session-options-controls{grid-template-columns:minmax(0,1.4fr) minmax(130px,.6fr);align-items:end;gap:10px;display:grid}.session-options-controls>label:not(.effect-ack){color:var(--quiet);gap:5px;font-size:10.5px;display:grid}.session-options-controls select{border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;min-height:36px;color:var(--text);background:var(--surface-2);padding:0 10px}.effect-ack{color:var(--text);grid-column:1/-1;align-items:flex-start;gap:8px;font-size:11px;line-height:1.4;display:flex}.effect-ack input{accent-color:var(--accent);margin-top:1px}.session-option-actions{grid-column:1/-1;gap:8px;display:flex}.session-option-actions button{border:1px solid var(--line);border-radius:var(--radius-sm);min-height:34px;color:var(--text);background:#1a222d;padding:0 13px}.session-option-actions button:disabled{opacity:.42}.session-options-controls>small{color:var(--quiet);grid-column:1/-1;font-size:10.5px}.session-options-unavailable{color:var(--quiet);flex-direction:column;justify-content:center;gap:5px;font-size:11px;display:flex}.session-options-unavailable strong{color:var(--text);font-size:12px}.lifecycle-panel{grid-template-columns:minmax(260px,1fr) minmax(150px,auto) minmax(360px,auto);align-items:center;gap:20px;margin-top:18px;padding:18px 20px;display:grid}.lifecycle-copy h2{color:var(--text);margin:2px 0 7px;font-size:16px}.lifecycle-copy>p:last-child{max-width:620px;color:var(--quiet);margin:0;font-size:11px;line-height:1.55}.lifecycle-state{border-left:1px solid var(--line);gap:4px;min-width:150px;padding-left:18px;display:grid}.lifecycle-state>span{color:var(--quiet);text-transform:uppercase;font-size:10.5px;font-weight:650}.lifecycle-state strong{color:var(--text);font-size:12px}.lifecycle-state small{color:var(--quiet);font-size:10.5px}.lifecycle-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.lifecycle-actions button{border-radius:var(--radius-sm);cursor:pointer;min-height:36px;padding:0 13px;font-size:11px;font-weight:650}.lifecycle-actions button:disabled{cursor:not-allowed;opacity:.4}.primary-action{color:#07130f;background:var(--accent);border:1px solid #3cae88}.lifecycle-result{border-radius:var(--radius-sm);grid-column:1/-1;margin:-6px 0 0;padding:9px 11px;font-size:11px;line-height:1.45}.lifecycle-result.result-ok{color:var(--text);background:#64e0b512}.lifecycle-result.result-warning{color:var(--text);background:#efba6314}.approval-stack{gap:12px;display:grid}.approval-card{border-radius:var(--radius-sm);background:linear-gradient(135deg,#412518eb,#19181bf5);border:1px solid #70462e;padding:20px;overflow:hidden;box-shadow:0 16px 42px #00000038}.approval-card.risk-critical,.approval-card.risk-high{border-color:#9d4d3f}.approval-card>header,.approval-card>footer{justify-content:space-between;align-items:center;gap:12px;display:flex}.approval-card h2{color:var(--text);margin:2px 0 0;font-size:18px}.approval-risk{border-radius:var(--radius-sm);color:var(--text);text-transform:uppercase;border:1px solid #ffad7c59;padding:5px 9px;font-size:11px;font-weight:650}.approval-reason{color:var(--text);margin:13px 0;font-size:12px;line-height:1.55}.approval-preview{border-radius:var(--radius-sm);max-height:180px;color:var(--text);background:var(--surface-2);white-space:pre-wrap;word-break:break-word;border:1px solid #ffffff17;margin:0 0 14px;padding:12px;font:11px/1.55 ui-monospace,SFMono-Regular,Menlo,monospace;overflow:auto}.approval-facts{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:0 0 13px;display:grid}.approval-facts>div{border-radius:var(--radius-sm);background:#ffffff09;min-width:0;padding:9px}.approval-facts dt{color:var(--text);text-transform:uppercase;font-size:10.5px;font-weight:650}.approval-facts dd{color:var(--text);text-overflow:ellipsis;margin:4px 0 0;font-size:11px;overflow:hidden}.approval-targets,.approval-consequences{color:var(--text);font-size:11px;line-height:1.55}.approval-targets ul{margin:6px 0 12px;padding-left:18px}.approval-consequences{grid-template-columns:1fr 1fr;gap:10px;margin:12px 0;display:grid}.approval-consequences p{border-radius:var(--radius-sm);background:#ffffff09;margin:0;padding:10px}.approval-card>footer{justify-content:flex-end;padding-top:4px}.approval-card button{border-radius:var(--radius-sm);min-height:36px;padding:0 14px;font-weight:650}.secondary-action{border:1px solid var(--line);color:var(--text);background:#1a222d}.danger-action{color:var(--text);background:#8f3e31;border:1px solid #c56b52}.approval-card button:disabled{cursor:wait;opacity:.48}.question-stack{gap:12px;display:grid}.question-card{border-radius:var(--radius-sm);background:linear-gradient(135deg,#162e3af0,#16181ef7);border:1px solid #2f5f73;padding:20px;overflow:hidden;box-shadow:0 16px 42px #00000038}.question-card>header,.question-card>footer{justify-content:space-between;align-items:center;gap:12px;display:flex}.question-card h2{color:var(--text);margin:2px 0 0;font-size:18px}.question-hint{color:var(--text);font-size:11px;font-weight:600}.question-block{border:0;min-width:0;margin:14px 0 0;padding:0}.question-block legend{color:var(--text);flex-wrap:wrap;align-items:baseline;gap:6px;padding:0;font-size:15px;font-weight:600;line-height:1.5;display:flex}.question-number{color:var(--text)}.question-chip{border-radius:var(--radius-sm);color:var(--text);border:1px solid #7cc4e459;padding:2px 8px;font-size:11px;font-weight:650}.question-text{overflow-wrap:anywhere;min-width:0}.question-multi{color:var(--text);margin:4px 0 0;font-size:12px}.question-card:focus-visible,.question-block:focus-visible{outline-offset:3px;border-radius:var(--radius-sm);outline:2px solid #4fa3c7}.question-block.active .question-number{color:var(--text)}.question-options{gap:6px;margin:10px 0 0;padding:0;list-style:none;display:grid}.question-options label{border-radius:var(--radius-sm);cursor:pointer;background:#ffffff08;border:1px solid #ffffff14;align-items:flex-start;gap:10px;padding:10px 12px;display:flex}.question-options label:hover{border-color:#7cc4e459}.question-options label.selected{background:#4fa3c724;border-color:#4fa3c7}.question-options input[type=radio],.question-options input[type=checkbox]{opacity:0;pointer-events:none;position:absolute}.question-options label:focus-within{outline-offset:2px;outline:2px solid #4fa3c7}.option-number{border-radius:var(--radius-sm);color:#0d1d25;background:#8fc9e2;flex:none;place-items:center;width:24px;height:24px;font-size:12px;font-weight:650;display:inline-grid}.option-body{min-width:0;color:var(--text);gap:3px;font-size:14px;line-height:1.45;display:grid}.option-body small{color:var(--text);font-size:12.5px}.question-other input[type=text]{box-sizing:border-box;border-radius:var(--radius-sm);width:100%;color:var(--text);background:var(--surface-2);font:inherit;border:1px solid #4fa3c7;margin-top:6px;padding:9px 11px;font-size:14px}.question-card>footer{justify-content:flex-end;padding-top:14px}.question-card button{border-radius:var(--radius-sm);min-height:36px;padding:0 14px;font-weight:650}.question-card button:disabled{cursor:not-allowed;opacity:.48}.task-run-index,.release-monitor{margin-top:18px;overflow:hidden}.release-monitor .source-heading button{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--text);background:var(--surface-2);padding:8px 12px}.release-monitor .source-heading button:disabled{opacity:.55}.release-monitor-grid{border-top:1px solid var(--line);grid-template-columns:minmax(0,1.15fr) minmax(320px,.85fr);display:grid}.release-monitor-column+.release-monitor-column{border-left:1px solid var(--line)}.release-monitor-column>header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:14px;padding:16px 20px;display:flex}.release-monitor-column h3{margin:2px 0 0}.benchmark-run-card{border-bottom:1px solid var(--line);padding:14px 20px}.benchmark-run-card>div:first-child{justify-content:space-between;align-items:center;gap:12px;display:flex}.benchmark-run-card small{color:var(--muted);margin-top:4px;display:block}.benchmark-run-facts{color:var(--muted);flex-wrap:wrap;gap:8px 18px;margin-top:9px;font-size:12px;display:flex}.release-readiness-facts{margin:0;padding:4px 20px 12px}.release-readiness-facts>div{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:16px;padding:10px 0;display:flex}.release-readiness-facts dt{color:var(--muted)}.release-readiness-facts dd{text-align:right;margin:0}.release-blockers{border:1px solid color-mix(in srgb, var(--warning) 35%, var(--line));border-radius:var(--radius-sm);background:color-mix(in srgb, var(--warning) 7%, transparent);margin:0 20px 14px;padding:12px 14px}.release-blockers ul{color:var(--muted);margin:8px 0 0;padding-left:18px}.release-blockers li+li{margin-top:5px}.task-index-controls{border-bottom:1px solid var(--line);gap:8px;padding:0 20px 16px;display:flex}.task-index-controls button{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--muted);background:var(--surface-2);padding:7px 12px}.task-index-controls button[aria-pressed=true]{color:var(--text);border-color:var(--accent);background:color-mix(in srgb, var(--accent) 15%, var(--surface-2))}.task-run-list{display:grid}.task-run-card{border-bottom:1px solid var(--line);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:18px;padding:15px 20px;display:grid}.task-run-card[data-active=true]{box-shadow:inset 3px 0 var(--accent);background:color-mix(in srgb, var(--accent) 5%, transparent)}.task-run-card[data-selected=true]{outline:1px solid var(--accent);outline-offset:-1px}.task-run-main{min-width:0}.task-run-main>div{align-items:center;gap:9px;display:flex}.task-run-main strong,.task-run-main small{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.task-run-main small,.task-run-meta{color:var(--muted)}.active-run-tag{border:1px solid var(--accent);border-radius:var(--radius-sm);color:var(--accent);padding:2px 7px;font-size:11px}.task-run-meta{justify-content:flex-end;align-items:center;gap:12px;font-size:12px;display:flex}.task-index-empty,.task-index-warning{color:var(--muted);margin:0;padding:18px 20px}.task-index-warning{border-top:1px solid var(--line);color:var(--warning)}.task-run-meta button{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--text);background:var(--surface-2);padding:6px 9px}.task-run-meta button[aria-pressed=true]{border-color:var(--accent);color:var(--accent)}.task-timeline{border-top:1px solid var(--line)}.task-timeline>header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:16px;padding:18px 20px;display:flex}.task-timeline h3{margin:2px 0 0}.timeline-continuity{color:var(--muted);border-bottom:1px solid var(--line);flex-wrap:wrap;gap:10px 24px;padding:12px 20px;display:flex}.timeline-events{margin:0;padding:0;list-style:none}.timeline-events li{border-bottom:1px solid var(--line);grid-template-columns:12px minmax(0,1fr) auto;align-items:start;gap:12px;padding:13px 20px;display:grid}.timeline-events small,.timeline-events p{color:var(--muted);margin:3px 0 0;display:block}.timeline-dot{border-radius:var(--radius-sm);background:var(--muted);width:9px;height:9px;margin-top:5px}.timeline-dot.tone-positive{background:var(--positive)}.timeline-dot.tone-warning{background:var(--warning)}.timeline-dot.tone-danger{background:var(--danger)}.timeline-dot.tone-info{background:var(--accent)}.recovery-summary{grid-template-columns:repeat(4,minmax(0,1fr));display:grid}.retained-content-note{color:var(--muted);border-bottom:1px solid var(--line);margin:0;padding:10px 20px;font-size:12px}.next-action-card{border-bottom:1px solid var(--line);background:color-mix(in srgb, var(--accent) 7%, transparent);grid-template-columns:minmax(180px,.45fr) 1fr auto;align-items:center;gap:18px;padding:16px 20px;display:grid}.next-action-card span,.next-action-card strong{display:block}.next-action-card span,.next-action-card p,.next-action-card small{color:var(--muted)}.next-action-card p{margin:0}.handoff-summary{grid-template-columns:repeat(4,minmax(0,1fr));display:grid}.workspace-stack>.surface,.workspace-view>.surface,.workspace-stack>.evidence-section,.workspace-view>.evidence-section{margin-top:0}:root[data-piagent-color-mode=light] .task-heading h2,:root[data-piagent-color-mode=light] .task-empty h2,:root[data-piagent-color-mode=light] .criterion-copy p,:root[data-piagent-color-mode=light] .compact-panel dd,:root[data-piagent-color-mode=light] .chat-heading h2,:root[data-piagent-color-mode=light] .chat-message strong,:root[data-piagent-color-mode=light] .chat-message p,:root[data-piagent-color-mode=light] .attachment-list strong,:root[data-piagent-color-mode=light] .diff-toolbar strong,:root[data-piagent-color-mode=light] .activity-copy strong,:root[data-piagent-color-mode=light] .activity-result strong,:root[data-piagent-color-mode=light] .evidence-card h3,:root[data-piagent-color-mode=light] .budget-grid dd,:root[data-piagent-color-mode=light] .session-options-copy h2,:root[data-piagent-color-mode=light] .session-options-unavailable strong,:root[data-piagent-color-mode=light] .lifecycle-copy h2,:root[data-piagent-color-mode=light] .lifecycle-state strong{color:var(--text)}:root[data-piagent-color-mode=light] .chat-body,:root[data-piagent-color-mode=light] .activity-row{background:#62740006}:root[data-piagent-color-mode=light] .source-tabs{background:var(--surface)}:root[data-piagent-color-mode=light] .source-tabs button:hover{color:var(--text)}:root[data-piagent-color-mode=light] .source-action-warning,:root[data-piagent-color-mode=light] .detail-reconciliation-warning{color:var(--muted);background:#ab740014}:root[data-piagent-color-mode=light] .chat-message,:root[data-piagent-color-mode=light] .chat-tool-live,:root[data-piagent-color-mode=light] .chat-tool-result,:root[data-piagent-color-mode=light] .held-queue li,:root[data-piagent-color-mode=light] .log-preview{color:var(--text);background:var(--surface)}:root[data-piagent-color-mode=light] .chat-user{background:#506db712}:root[data-piagent-color-mode=light] .chat-composer-preview,:root[data-piagent-color-mode=light] .unchanged-region{background:var(--surface)}:root[data-piagent-color-mode=light] .chat-composer-preview textarea,:root[data-piagent-color-mode=light] .session-options-controls select{color:var(--text);background:var(--surface)}:root[data-piagent-color-mode=light] .review-state button,:root[data-piagent-color-mode=light] .commit-summary-output button,:root[data-piagent-color-mode=light] .confirm-actions button,:root[data-piagent-color-mode=light] .session-option-actions button{color:var(--text);background:var(--surface-strong)}:root[data-piagent-color-mode=light] .commit-summary-panel h3,:root[data-piagent-color-mode=light] .commit-summary-output>strong{color:var(--text)}:root[data-piagent-color-mode=light] .commit-summary-output{background:#ffffffbf}:root[data-piagent-color-mode=light] .diff-line code,:root[data-piagent-color-mode=light] .split-line code{color:var(--muted)}:root[data-piagent-color-mode=light] .diff-line>span,:root[data-piagent-color-mode=light] .split-line>span{color:#92988d}:root[data-piagent-color-mode=light] .syntax-keyword,:root[data-piagent-color-mode=light] .syntax-string,:root[data-piagent-color-mode=light] .syntax-number,:root[data-piagent-color-mode=light] .syntax-comment,:root[data-piagent-color-mode=light] .syntax-literal,:root[data-piagent-color-mode=light] .syntax-property{color:var(--muted)}:root[data-piagent-color-mode=light] .mode-switch .MuiToggleButton-root.Mui-selected{color:var(--text);background:var(--surface-2)}:root[data-piagent-color-mode=light] .diff-added{background:#14775f1a}:root[data-piagent-color-mode=light] .diff-added code,:root[data-piagent-color-mode=light] .diff-added b{color:var(--muted)}:root[data-piagent-color-mode=light] .diff-deleted{background:#c43f4c1a}:root[data-piagent-color-mode=light] .diff-deleted code,:root[data-piagent-color-mode=light] .diff-deleted b{color:var(--muted)}:root[data-piagent-color-mode=light] .confirm-dialog{color:var(--text);background:var(--surface)}:root[data-piagent-color-mode=light] .confirm-dialog h3,:root[data-piagent-color-mode=light] .confirm-dialog>p:not(.section-kicker){color:var(--text)}:root[data-piagent-color-mode=light] .revert-diff{background:var(--surface)}:root[data-piagent-color-mode=light] .approval-card{color:var(--text);background:linear-gradient(135deg,#fff7ef,#fff);border-color:#d7b18f}:root[data-piagent-color-mode=light] .question-card{color:var(--text);background:linear-gradient(135deg,#f1f9fc,#fff);border-color:#9cc8da}:root[data-piagent-color-mode=light] .question-card h2,:root[data-piagent-color-mode=light] .question-block legend,:root[data-piagent-color-mode=light] .option-body{color:var(--text)}:root[data-piagent-color-mode=light] .question-hint,:root[data-piagent-color-mode=light] .question-number,:root[data-piagent-color-mode=light] .question-multi,:root[data-piagent-color-mode=light] .option-body small{color:var(--muted)}:root[data-piagent-color-mode=light] .question-chip{color:var(--muted);border-color:#9cc8da}:root[data-piagent-color-mode=light] .question-options label{background:var(--surface);border-color:#d6e6ed}:root[data-piagent-color-mode=light] .question-options label.selected{background:var(--surface-2);border-color:#3b8fb3}:root[data-piagent-color-mode=light] .question-other input[type=text]{color:var(--text);background:var(--surface)}:root[data-piagent-color-mode=light] .question-options label.selected .option-number{color:#fff;background:#1e6f92}:root[data-piagent-color-mode=light] .question-card .secondary-action{color:var(--text);background:var(--surface);border-color:#b9d3de}:root[data-piagent-color-mode=light] .question-card .secondary-action:hover:not(:disabled){background:var(--surface);border-color:#3b8fb3}:root[data-piagent-color-mode=light] .approval-card h2,:root[data-piagent-color-mode=light] .approval-preview,:root[data-piagent-color-mode=light] .approval-facts dd{color:var(--text)}:root[data-piagent-color-mode=light] .approval-preview{background:var(--surface)}:root[data-piagent-color-mode=light] .approval-reason,:root[data-piagent-color-mode=light] .approval-targets,:root[data-piagent-color-mode=light] .approval-consequences{color:var(--muted)}@media (max-width:1080px){.lifecycle-panel{grid-template-columns:1fr auto}.lifecycle-actions{grid-column:1/-1;justify-content:flex-start}.lifecycle-result{grid-column:1/-1}.runtime-strip{grid-template-columns:repeat(3,1fr)}.runtime-strip>div:nth-child(3){border-right:0}.runtime-strip>div:nth-child(-n+3){border-bottom:1px solid var(--line)}.content-grid{grid-template-columns:1fr}.context-rail,.evidence-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width:899px){.source-body{grid-template-columns:1fr}.file-panel{border-right:0;border-bottom:1px solid var(--line)}.file-list{max-height:300px}.diff-empty{min-height:300px}}@media (max-width:720px){.release-monitor-grid{grid-template-columns:1fr}.release-monitor-column+.release-monitor-column{border-left:0;border-top:1px solid var(--line)}.recovery-summary{grid-template-columns:repeat(2,minmax(0,1fr))}.handoff-summary,.next-action-card,.commit-summary-panel,.approval-facts,.approval-consequences{grid-template-columns:1fr}.approval-card>header,.approval-card>footer{flex-direction:column;align-items:flex-start}.approval-card>footer button{width:100%}.question-card{padding:16px}.question-card>header,.question-card>footer{flex-direction:column;align-items:stretch}.question-card>footer{flex-direction:column-reverse}.question-card>footer button{width:100%}.session-options,.session-options-controls{grid-template-columns:1fr}.effect-ack,.session-option-actions,.session-options-controls>small{grid-column:1}.lifecycle-panel{grid-template-columns:1fr;align-items:stretch}.lifecycle-state{border-left:0;padding:0}.lifecycle-actions{grid-column:1}.lifecycle-actions button{flex:150px}.lifecycle-result{grid-column:1}.topbar{grid-template-columns:1fr auto;min-height:60px;padding:0 16px}.session-title,.read-only-badge{display:none}.workspace{width:min(100% - 24px,1460px);padding-top:12px}.runtime-strip{grid-template-columns:repeat(2,1fr)}.runtime-strip>div{border-bottom:1px solid var(--line);min-height:62px;padding:11px}.runtime-strip>div:nth-child(2n){border-right:0}.runtime-strip>div:nth-last-child(-n+2){border-bottom:0}.task-dashboard{padding:19px 14px}.chat-heading{flex-direction:column;align-items:flex-start;padding:15px}.chat-heading>div:last-child{flex-direction:column;align-items:flex-start}.chat-body{padding:13px}.chat-message{width:94%}.chat-composer-preview,.task-heading{grid-template-columns:1fr}.progress-number{text-align:left;align-items:baseline;gap:10px;display:flex}.progress-number strong{font-size:25px}.progress-track{margin:18px 0 24px}.criterion-card{grid-template-columns:32px minmax(0,1fr);gap:10px}.criterion-card>.status-pill{grid-column:2}.criterion-copy>div{flex-direction:column;align-items:flex-start;gap:5px}.context-rail{grid-template-columns:1fr}.task-empty{grid-template-columns:1fr;min-height:340px;padding:28px 22px}.source-tabs{padding:0 8px;overflow-x:auto}.source-tabs button{flex:none}.source-heading{padding:16px}.source-heading>span,.file-provenance,.file-evidence{display:none}.file-row{grid-template-columns:26px minmax(0,1fr) auto}.diff-toolbar{flex-direction:column;align-items:flex-start}.panel-heading{flex-direction:column;align-items:flex-start;padding:16px}.activity-row{grid-template-columns:10px minmax(0,1fr)}.activity-result{text-align:left;grid-column:2;grid-template-columns:auto auto 1fr}.activity-result button{grid-column:auto;justify-self:end}.section-title-row{flex-direction:column;align-items:flex-start;gap:8px}.section-title-row>span{text-align:left;max-width:100%}.evidence-grid{grid-template-columns:1fr}.evidence-card{min-height:auto}.task-run-card{grid-template-columns:1fr;gap:9px}.task-run-meta{flex-wrap:wrap;justify-content:flex-start}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}@media (forced-colors:active){.status-dot,.activity-state,.progress-track span,.context-meter span{forced-color-adjust:none;background:highlight}.file-row[data-selected=true],.source-tabs button[aria-selected=true]{outline:2px solid highlight}}@keyframes piagent-pulse{0%,to{opacity:1}50%{opacity:.3}}@media (prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important}}.decision-queue{gap:10px;display:grid}.decision-steps{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface);gap:8px;padding:10px 12px;display:grid}.decision-steps>strong{color:var(--warning);font-size:12px}.decision-steps ol{flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none;display:flex}.decision-steps li{min-width:0;max-width:100%}.decision-step{border:1px solid var(--line);border-radius:var(--radius-sm);max-width:100%;min-height:32px;color:var(--muted);background:var(--surface-2);font:inherit;cursor:pointer;align-items:center;gap:6px;padding:4px 10px 4px 5px;font-size:11px;display:inline-flex}.decision-step:hover{border-color:var(--line-strong);color:var(--text)}.decision-step.current{border-color:var(--warning);color:var(--text);background:color-mix(in srgb, var(--warning) 12%, var(--surface-2))}.decision-step:focus-visible{outline:2px solid var(--warning);outline-offset:2px}.decision-step-number{width:20px;height:20px;color:var(--bg);background:var(--muted);border-radius:50%;flex:none;place-items:center;font-size:11px;font-weight:650;display:inline-grid}.decision-step.current .decision-step-number{background:var(--warning)}.decision-step-kind{flex:none;font-weight:650}.decision-step-role{color:var(--quiet);flex:none}.decision-step-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:260px;overflow:hidden}.attention-toasts{z-index:1400;pointer-events:none;gap:8px;width:min(360px,100vw - 32px);display:grid;position:fixed;bottom:44px;right:16px}.attention-toast{border:1px solid var(--line-strong);border-radius:var(--radius-sm);color:var(--text);background:var(--surface);pointer-events:auto;align-items:flex-start;gap:10px;padding:11px 10px 11px 12px;animation:.22s ease-out attention-in;display:flex;box-shadow:0 14px 36px #00000047}.attention-toast-mark{background:var(--positive);border-radius:50%;flex:none;width:10px;height:10px;margin-top:4px}.attention-toast.tone-error .attention-toast-mark{background:var(--danger)}.attention-toast.tone-neutral .attention-toast-mark{background:var(--muted)}.attention-toast.tone-warning{border-color:var(--warning)}.attention-toast.tone-warning .attention-toast-mark{background:var(--warning);animation:1.4s ease-in-out infinite piagent-pulse}.attention-toast-body{flex:1;gap:3px;min-width:0;display:grid}.attention-toast-body strong{text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;overflow:hidden}.attention-toast-title{font-weight:600}.attention-toast-body small{color:var(--muted);font-size:11.5px;line-height:1.4}.attention-toast-actions{flex:none;align-items:center;gap:2px;display:flex}.attention-open{border:1px solid var(--line-strong);border-radius:var(--radius-sm);min-height:30px;color:var(--text);background:var(--surface-2);font:inherit;cursor:pointer;padding:0 11px;font-size:11.5px;font-weight:600}.attention-close{border-radius:var(--radius-sm);width:30px;height:30px;color:var(--muted);cursor:pointer;background:0 0;border:0;font-size:18px;line-height:1}.attention-open:focus-visible,.attention-close:focus-visible{outline:2px solid var(--warning);outline-offset:2px}.attention-more{color:var(--muted);text-align:right;margin:0;padding:0 4px;font-size:11px}@keyframes attention-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}.session-item.attention{box-shadow:inset 3px 0 0 var(--warning);animation:2.4s ease-in-out infinite attention-glow}.session-item.fresh{box-shadow:inset 3px 0 0 var(--positive)}@keyframes attention-glow{0%,to{background:0 0}50%{background:color-mix(in srgb, var(--warning) 9%, transparent)}}@media (prefers-reduced-motion:reduce){.attention-toast,.session-item.attention,.attention-toast.tone-warning .attention-toast-mark{animation:none}}@media (max-width:600px){.attention-toasts{width:calc(100vw - 16px);top:68px;right:8px}.decision-step-label{max-width:150px}}.line-comment-anchor{width:100%;color:inherit;font:inherit;text-align:right;cursor:pointer;background:0 0;border:0;padding:0}.line-comment-anchor:hover,.line-comment-anchor:focus-visible{color:var(--amber);text-decoration:underline}.line-notes{border-block:1px solid var(--line);background:var(--surface);gap:6px;min-width:max-content;max-width:100%;padding:7px 12px 8px 102px;font-size:11px;line-height:1.5;display:grid}.split-code .line-notes{padding-left:54px}.file-findings{margin:10px 0;padding-left:12px}.line-finding{border-radius:var(--radius-sm);white-space:normal;background:#e3a33f17;border-left:3px solid #e3a33f;gap:2px;max-width:760px;padding:6px 9px;display:grid}.line-finding.severity-blocking{background:#ff68741a;border-left-color:#ff6874}.line-finding.severity-minor{background:#6f9fe017;border-left-color:#6f9fe0}.line-finding strong{text-transform:uppercase;letter-spacing:.04em;color:var(--muted);font-size:11px}.line-comment{border-left:3px solid var(--amber);border-radius:var(--radius-sm);white-space:pre-wrap;background:#efbd7814;align-items:baseline;gap:10px;max-width:760px;padding:6px 9px;display:flex}.line-comment span{flex:1}.line-comment button,.line-comment-editor button,.line-comment-actions button{border:1px solid var(--line-strong);border-radius:var(--radius-sm);color:inherit;cursor:pointer;background:0 0;padding:3px 9px;font-size:11px}.line-comment-editor{gap:6px;max-width:760px;display:grid}.line-comment-editor textarea{border:1px solid var(--line-strong);border-radius:var(--radius-sm);width:100%;min-width:320px;color:inherit;background:var(--background,transparent);font:inherit;resize:vertical;padding:7px 9px}.line-comment-editor>div,.line-comment-actions{justify-content:flex-end;align-items:center;gap:8px;display:flex}.line-comment-editor button[type=submit],.line-comment-actions .primary{border-color:var(--amber);color:#1b1408;background:var(--amber);font-weight:650}.line-comment-editor button:disabled{opacity:.5;cursor:not-allowed}.line-comment-bar{border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--surface);gap:8px;margin:10px 0;padding:10px 12px;font-size:12px;display:grid}.line-comment-bar>div:first-child{flex-wrap:wrap;align-items:baseline;gap:10px;display:flex}.line-comment-bar small{color:var(--amber)}.line-comment-bar ul{gap:3px;max-height:160px;margin:0;padding:0;list-style:none;display:grid;overflow:auto}.line-comment-bar li{min-width:0;color:var(--muted);gap:8px;display:flex}.line-comment-bar li code{color:inherit;flex-shrink:0}.line-comment-bar li span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.line-comment-bar li.changed{opacity:.7}.line-comment-bar li em{color:var(--amber);font-style:normal}.streaming-answer .markdown-message:last-child>:last-child:after{content:"";vertical-align:-.15em;background:var(--accent);border-radius:1px;width:.5em;height:1.05em;margin-left:3px;animation:1s step-end infinite piagent-caret;display:inline-block}@keyframes piagent-caret{50%{opacity:0}}@media (prefers-reduced-motion:reduce){.streaming-answer .markdown-message:last-child>:last-child:after{animation:none}}.attention-toast{animation:.2s cubic-bezier(.2,.7,.2,1) piagent-toast-in}@keyframes piagent-toast-in{0%{opacity:0;transform:translateY(8px)}}@media (max-width:720px){.attention-toasts{top:60px;bottom:auto}}@media (prefers-reduced-motion:reduce){.attention-toast{animation:none}}
@@ -0,0 +1,3 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Dn as t,Fn as n}from"./vendor-CSDKB7mU.js";import{i as r,n as i}from"./ui-preferences-0waeSO-S.js";import{M as a,d as o,s}from"./api-BQS4Dtrr.js";import{r as c}from"./view-model-CWNiS4JN.js";function l(e){return Array.isArray(e)?`[${e.map(l).join(`,`)}]`:e&&typeof e==`object`?`{${Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${JSON.stringify(e)}:${l(t)}`).join(`,`)}}`:JSON.stringify(e)}async function u(e){let t=new TextEncoder().encode(typeof e==`string`?e:l(e)),n=await crypto.subtle.digest(`SHA-256`,t);return`sha256:${[...new Uint8Array(n)].map(e=>e.toString(16).padStart(2,`0`)).join(``)}`}async function d(e,t,n,r){let i=new Date,a=new Date(i.getTime()+3e5),o=r?.attachmentRefs??[],s={messageRequestId:r?.messageRequestId??`message-request.${crypto.randomUUID()}`,capabilityAction:n===`steer`?`interruptAndSend`:n===`hold`?`hold`:`send`,delivery:n,text:t,attachmentRefs:o,contentDigest:await u({attachmentRefs:o,text:t})},c={runtimeRevision:e.revision.runtimeRevision,taskRevision:e.revision.taskRevision,controlRevision:e.revision.controlRevision,workspaceRevision:e.revision.workspaceRevision,indexRevision:e.revision.indexRevision,approvalRevision:e.revision.approvalRevision,sessionOptionRevision:e.revision.sessionOptionRevision,queueRevision:e.revision.queueRevision,workspacePreimage:null,indexPreimage:null,patchPreimage:null},l={schemaVersion:1,version:`piagent-webui-control-v1`,messageType:`command`,commandId:`command.${crypto.randomUUID()}`,idempotencyKey:crypto.randomUUID(),requestedAt:i.toISOString(),expiresAt:a.toISOString(),capabilityScope:`control.chat`,action:`chat.send`,actionDigest:``,identity:structuredClone(e.identity),expectedRevisions:c,payload:s};return l.actionDigest=await u({action:l.action,identity:l.identity,expectedRevisions:c,payload:s}),l}async function ee(e,t,n){let r=new Date,i=new Date(r.getTime()+3e5);return{schemaVersion:1,version:`piagent-webui-attachment-v1`,messageType:`stage-command`,commandId:`attachment-command.${crypto.randomUUID()}`,idempotencyKey:crypto.randomUUID(),requestedAt:r.toISOString(),expiresAt:i.toISOString(),identity:{...structuredClone(e.identity),toolCallId:null},expectedRuntimeRevision:e.revision.runtimeRevision,messageRequestId:t,file:n}}function f(e,t,n){let r=new Date,i=new Date(r.getTime()+3e5);return{schemaVersion:1,version:`piagent-webui-attachment-v1`,messageType:`discard-command`,commandId:`attachment-command.${crypto.randomUUID()}`,idempotencyKey:crypto.randomUUID(),requestedAt:r.toISOString(),expiresAt:i.toISOString(),identity:{...structuredClone(e.identity),toolCallId:null},expectedRuntimeRevision:e.revision.runtimeRevision,messageRequestId:t,attachmentRef:n}}async function p(e,t,n){let r=new Date,i=new Date(r.getTime()+3e5),a={runtimeRevision:e.revision.runtimeRevision,taskRevision:e.revision.taskRevision,controlRevision:e.revision.controlRevision,workspaceRevision:e.revision.workspaceRevision,indexRevision:e.revision.indexRevision,approvalRevision:e.revision.approvalRevision,sessionOptionRevision:e.revision.sessionOptionRevision,queueRevision:e.revision.queueRevision,workspacePreimage:null,indexPreimage:null,patchPreimage:null},o={schemaVersion:1,version:`piagent-webui-control-v1`,messageType:`command`,commandId:`command.${crypto.randomUUID()}`,idempotencyKey:crypto.randomUUID(),requestedAt:r.toISOString(),expiresAt:i.toISOString(),capabilityScope:`control.chat`,action:t,actionDigest:``,identity:structuredClone(e.identity),expectedRevisions:a,payload:n};return o.actionDigest=await u({action:t,identity:o.identity,expectedRevisions:a,payload:n}),o}async function te(e,t){let n=[];return{queueItemRef:e,text:t,attachmentRefs:n,contentDigest:await u({attachmentRefs:n,text:t})}}async function ne(e,t,n){let r=new Date,i=new Date(r.getTime()+3e5),a={runtimeRevision:e.revision.runtimeRevision,taskRevision:e.revision.taskRevision,controlRevision:e.revision.controlRevision,workspaceRevision:e.revision.workspaceRevision,indexRevision:e.revision.indexRevision,approvalRevision:e.revision.approvalRevision,sessionOptionRevision:e.revision.sessionOptionRevision,queueRevision:e.revision.queueRevision,workspacePreimage:null,indexPreimage:null,patchPreimage:null},o=t===`session-options.set-model`?{modelRef:n,effectScopeAcknowledged:`session-and-user-default`}:{thinkingLevel:n,effectScopeAcknowledged:`session-and-user-default`},s={schemaVersion:1,version:`piagent-webui-control-v1`,messageType:`command`,commandId:`command.${crypto.randomUUID()}`,idempotencyKey:crypto.randomUUID(),requestedAt:r.toISOString(),expiresAt:i.toISOString(),capabilityScope:`control.sessionOptions`,action:t,actionDigest:``,identity:structuredClone(e.identity),expectedRevisions:a,payload:o};return s.actionDigest=await u({action:t,identity:s.identity,expectedRevisions:a,payload:o}),s}async function m(e,t){let n=new Date,r=new Date(n.getTime()+3e5),i={runtimeRevision:e.revision.runtimeRevision,taskRevision:e.revision.taskRevision,controlRevision:e.revision.controlRevision,workspaceRevision:e.revision.workspaceRevision,indexRevision:e.revision.indexRevision,approvalRevision:e.revision.approvalRevision,sessionOptionRevision:e.revision.sessionOptionRevision,queueRevision:e.revision.queueRevision,workspacePreimage:null,indexPreimage:null,patchPreimage:null},a=t===`lifecycle.stop`?{requestedScope:`current-agent-operation`}:t===`lifecycle.pause`?{safePointPolicy:`after-current-atomic-unit`}:{},o={schemaVersion:1,version:`piagent-webui-control-v1`,messageType:`command`,commandId:`command.${crypto.randomUUID()}`,idempotencyKey:crypto.randomUUID(),requestedAt:n.toISOString(),expiresAt:r.toISOString(),capabilityScope:`control.lifecycle`,action:t,actionDigest:``,identity:structuredClone(e.identity),expectedRevisions:i,payload:a};return o.actionDigest=await u({action:t,identity:o.identity,expectedRevisions:i,payload:a}),o}async function h(e,t,n){let r=new Date,i=new Date(r.getTime()+3e5),a=n?.attachmentRefs??[],o={messageRequestId:n?.messageRequestId??`message-request.${crypto.randomUUID()}`,capabilityAction:`send`,delivery:`new-operation`,text:t,attachmentRefs:a,contentDigest:await u({attachmentRefs:a,text:t})},s={runtimeRevision:e.revision.runtimeRevision,taskRevision:e.revision.taskRevision,controlRevision:e.revision.controlRevision,workspaceRevision:e.revision.workspaceRevision,indexRevision:e.revision.indexRevision,approvalRevision:e.revision.approvalRevision,sessionOptionRevision:e.revision.sessionOptionRevision,queueRevision:e.revision.queueRevision,workspacePreimage:null,indexPreimage:null,patchPreimage:null},c={schemaVersion:1,version:`piagent-webui-control-v1`,messageType:`command`,commandId:`command.${crypto.randomUUID()}`,idempotencyKey:crypto.randomUUID(),requestedAt:r.toISOString(),expiresAt:i.toISOString(),capabilityScope:`control.resumeAndContinue`,action:`lifecycle.resume-and-continue`,actionDigest:``,identity:structuredClone(e.identity),expectedRevisions:s,payload:o};return c.actionDigest=await u({action:c.action,identity:c.identity,expectedRevisions:s,payload:o}),c}var re=24;function g(e,t,n){for(e.delete(t),e.set(t,n);e.size>re;)e.delete(e.keys().next().value);return n}function _(e,t){return`data:${e};base64,${t}`}var v=new Map;function ie(e,t,n){g(v,e,_(t,n))}function y(e){return v.get(e)??null}var b=new Map,x=new Map;function S(e){return b.get(e)??null}function C(e,t){let n=b.get(e);if(n)return Promise.resolve(n);let r=x.get(e);return r||(r=t().then(t=>g(b,e,_(t.mimeType,t.dataBase64))).catch(()=>null).finally(()=>x.delete(e)),x.set(e,r)),r}function w(e,t,n){return e===`vi`?t:n}var T={txt:`text/plain`,text:`text/plain`,md:`text/markdown`,markdown:`text/markdown`,csv:`text/csv`,tsv:`text/tab-separated-values`,json:`application/json`,yaml:`application/yaml`,yml:`application/yaml`,pdf:`application/pdf`,docx:`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,xlsx:`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,xlsm:`application/vnd.ms-excel.sheet.macroenabled.12`,pptx:`application/vnd.openxmlformats-officedocument.presentationml.presentation`,odt:`application/vnd.oasis.opendocument.text`,ods:`application/vnd.oasis.opendocument.spreadsheet`,odp:`application/vnd.oasis.opendocument.presentation`,rtf:`application/rtf`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`,webp:`image/webp`,bmp:`image/bmp`},ae={xls:`sheet`,numbers:`sheet`,ppt:`slides`,key:`slides`,doc:`word`,pages:`word`,...Object.fromEntries(`zip.gz.tgz.bz2.xz.rar.7z.tar.jar.war.exe.dmg.pkg.msi.deb.rpm.apk.ipa.bin.so.dylib.dll.o.a.lib.class.pyc.wasm.node.iso.img.sqlite.sqlite3.db.mdb.mp3.mp4.m4a.m4v.mov.avi.mkv.wav.flac.ogg.webm.aac.woff.woff2.ttf.otf.eot.ico.icns.heic.heif.tif.tiff.psd.ai.sketch.fig.xd.avif.raw.cr2.nef.dng.blend.fbx.glb`.split(`.`).map(e=>[e,`binary`]))};function E(e){let t=e.lastIndexOf(`.`),n=t>0||t===0&&e.length>1?e.slice(t+1).toLowerCase():``,r=T[n];if(r)return{mime:r};let i=ae[n];return i?{refused:i}:{mime:`text/plain`}}var D=new Set([`application/pdf`,...Object.entries(T).filter(([e])=>[`docx`,`xlsx`,`xlsm`,`pptx`,`odt`,`ods`,`odp`,`rtf`].includes(e)).map(([,e])=>e)]);function oe(e){return w(e,`Code, văn bản, .pdf .docx .xlsx .pptx .odt .ods .odp .rtf và ảnh`,`Code, text, .pdf .docx .xlsx .pptx .odt .ods .odp .rtf and images`)}function O(e){return e>=1048576?`${(e/1024/1024).toFixed(1)} MiB`:`${(e/1024).toFixed(+(e<10240))} KiB`}function se(e,t){let n=e.truncated?` · ${w(t,`đã cắt bớt`,`truncated`)}`:``;return e.kind===`image`?`${w(t,`Ảnh`,`Image`)} · ${O(e.sizeBytes)}`:e.kind===`document`?`${w(t,`Tài liệu`,`Document`)} · ${O(e.sourceBytes)} → ${O(e.sizeBytes)} ${w(t,`văn bản`,`text`)}${n}`:`File · ${O(e.sizeBytes)}${n}`}function ce(e){return e.has(`text/plain`)?``:[...e,...Object.entries(T).filter(([,t])=>e.has(t)).map(([e])=>`.${e}`)].join(`,`)}function k(e){return!!(e&&[...e.types].includes(`Files`))}function A(e,t){switch(e){case`sheet`:return w(t,`định dạng bảng tính này chưa đọc trực tiếp được; hãy lưu sang .xlsx hoặc .csv rồi đính kèm.`,`this spreadsheet format cannot be read directly; save it as .xlsx or .csv and attach that.`);case`slides`:return w(t,`định dạng trình chiếu này chưa đọc trực tiếp được; hãy lưu sang .pptx hoặc .pdf rồi đính kèm.`,`this slide format cannot be read directly; save it as .pptx or .pdf and attach that.`);case`word`:return w(t,`định dạng này chưa đọc được; hãy lưu sang .docx, .pdf, .rtf hoặc .txt.`,`this format cannot be read; save it as .docx, .pdf, .rtf or .txt.`);default:return w(t,`file nhị phân không gửi vào chat được; hãy để file trong project để agent tự đọc bằng tool.`,`binary files cannot go into the chat; keep it in the project and the agent can use its tools on it.`)}}async function j(e){let{snapshot:t,locale:n}=e,r=[...e.existing],i=null,a=Math.max(0,4-r.length);e.files.length>a&&(i=w(n,`Chỉ nhận tối đa 4 file mỗi tin nhắn; đã bỏ qua ${e.files.length-a} file.`,`At most 4 files per message; ${e.files.length-a} skipped.`));for(let o of[...e.files].slice(0,a)){let a=E(o.name);if(`refused`in a){i=`${o.name}: ${A(a.refused,n)}`;continue}let s=a.mime;if(!e.allowed.has(s)){i=`${o.name}: ${s===`application/pdf`?w(n,`host chưa cài pdftotext (poppler) nên chưa đọc được .pdf.`,`this host has no pdftotext (poppler), so .pdf cannot be read.`):w(n,`phiên Pi hiện tại không nhận loại file này.`,`the current Pi session does not accept this file type.`)}`;continue}let l=s.startsWith(`image/`)||D.has(s)?Math.min(t.capabilities.limits.maxAttachmentFileBytes,8388608):262144;if(o.size<1||o.size>l||r.reduce((e,t)=>e+t.sourceBytes,0)+o.size>t.capabilities.limits.maxAttachmentTotalBytes){i=`${o.name}: ${D.has(s)?w(n,`vượt giới hạn gửi trực tiếp ${O(l)}. Hãy đặt tài liệu lớn trong project rồi mở ở mục Tài liệu; Pi sẽ đọc theo phần thay vì nhét cả file vào chat.`,`exceeds the ${O(l)} direct-send limit. Put a large document in the project and open Documents; Pi can read it in parts instead of placing the whole file in chat.`):w(n,`vượt giới hạn đính kèm (tối đa ${O(l)}).`,`attachment limit exceeded (max ${O(l)}).`)}`;continue}let u=new Uint8Array(await o.arrayBuffer()),d=``;for(let e=0;e<u.length;e+=32768)d+=String.fromCharCode(...u.subarray(e,e+32768));let f=btoa(d),p=await e.stage(await ee(t,e.messageRequestId,{displayName:o.name,declaredMimeType:s,dataBase64:f}));if(p.resultCode!==`staged`||!(`attachment`in p)||!p.attachment){i=`${o.name}: ${c(p.error?.code??p.resultCode,n)}`;continue}p.attachment.kind===`image`&&ie(p.attachment.attachmentRef,p.attachment.mimeType,f),r=[...r,p.attachment]}return{attachments:r,status:i}}async function M(e){let t=await e.stage(f(e.snapshot,e.messageRequestId,e.attachmentRef));return t.messageType===`discard-receipt`&&t.resultCode===`discarded`?{discarded:!0,status:null}:{discarded:!1,status:`${w(e.locale,`Chưa thể bỏ file`,`Unable to remove file`)} · ${c(t.error?.code??t.resultCode,e.locale)}`}}var N=e(n(),1),P=(e,t,n)=>e===`vi`?t:n,F={"workspace-patch":[`Sửa trong project`,`Change in the project`],"external-provider-action":[`Tác động ra bên ngoài`,`Reaches outside this machine`]},I={"one-shell-command":[`Đúng một lệnh`,`This one command`],"network-command-once":[`Đúng một lệnh, có mạng`,`This one command, with network`],"docker-command-once":[`Đúng một lệnh, có mạng và Docker`,`This one command, with network and Docker`],"host-command-once":[`Đúng một lệnh, chạy trên máy bạn (ngoài sandbox)`,`This one command, on your machine (outside the sandbox)`],"start-docker-once":[`Mở Docker trên máy`,`Start Docker on this machine`],"one-external-action":[`Đúng một hành động`,`This one action`],"one-handoff":[`Đúng một bước bàn giao ra ngoài`,`This one handoff`],"handoff-once":[`Đúng một bước bàn giao ra ngoài`,`This one handoff`],"mcp-handoff-once":[`Đúng một lệnh gọi MCP ghi ra ngoài`,`This one MCP call that writes outside`]},L={"Run this exact command once, after the guard checks the working tree again.":[`Chạy đúng lệnh này một lần, sau khi guard kiểm tra lại thư mục làm việc.`,``],"The command does not run; the agent is told you declined.":[`Lệnh không chạy; agent được báo là bạn đã từ chối.`,``],"Run this exact action once, after the guard checks its authority again.":[`Thực hiện đúng hành động này một lần, sau khi guard kiểm tra lại quyền.`,``],"The action does not run; nothing outside changes.":[`Hành động không chạy; không có gì bên ngoài bị thay đổi.`,``],"Run this exact command once, with internet access.":[`Chạy đúng lệnh này một lần, có mạng.`,``],"Run this exact command once, with internet access; a server it starts accepts connections while it runs.":[`Chạy đúng lệnh này một lần, có mạng; server mà lệnh mở nhận kết nối trong lúc chạy.`,``],"Run this exact command once, with internet access and the Docker engine; a container it starts can read folders Docker shares from this machine and may keep running.":[`Chạy đúng lệnh này một lần, có mạng và Docker; container mà lệnh tạo đọc được các thư mục Docker chia sẻ trên máy và có thể tiếp tục chạy.`,``],"Run this exact command once on this machine, outside the sandbox, as you: it can read and change your files and use your sign-ins.":[`Chạy đúng lệnh này một lần trên máy bạn, ngoài sandbox, bằng quyền của bạn: lệnh đọc/sửa được file và dùng được tài khoản đã đăng nhập trên máy.`,``],"Docker is not started; the agent is told you declined.":[`Không mở Docker; agent được báo là bạn đã từ chối.`,``]},R=(e,t,n)=>{let r=e[t];return r?P(n,r[0],r[1]||t):null};function z(e,t){return t===`vi`?e.split(`; `).map(e=>{let t=e.match(/^Confirmation required: the command runs (.+)$/);if(t)return`Lệnh có ${t[1]} nên cần bạn duyệt trước khi chạy.`;let n=e.match(/^External provider action (.+) requires confirmation$/);return n?`Hành động ra bên ngoài (${n[1]}) cần bạn duyệt.`:e}).join(` `):e}var B=(e,t)=>R(F,e.kind,t)??c(e.kind,t),V=(e,t)=>R(I,e.requestedScope,t)??c(e.requestedScope,t);function H(e,t){let n=t===`vi`?/^Start (.+) on this machine; it keeps running after the conversation\.$/.exec(e):null;return n?`Mở ${n[1]} trên máy; nó vẫn chạy sau cuộc trò chuyện.`:R(L,e,t)??e}var U=e=>!/handoff/.test(String(e.action.requestedScope));function W(e,t){let n=t===`allow`||t===`session`?`allow`:`deny`;return{schemaVersion:1,version:`piagent-webui-approval-v1`,recordType:`decision`,approvalRef:e.approvalRef,decisionId:`decision.${crypto.randomUUID()}`,decisionToken:e.decisionToken,identity:structuredClone(e.identity),actionDigest:e.action.actionDigest,expectedRevisions:structuredClone(e.expectedRevisions),decision:n,reason:null,decidedAt:new Date().toISOString(),expiresAt:e.expiresAt,decisionSurface:`webui`,executor:`pi-guard`,directExecution:!1,...t===`session`?{scope:`session`}:t===`stop`?{stop:!0}:{}}}var G=t();function K({state:e,setState:t,refreshSnapshot:n,locale:r,asker:a}){let o=e.request;if(!o)return(0,G.jsx)(`article`,{className:`approval-card`,children:(0,G.jsx)(`p`,{children:e.error??i(r,`Đang tải yêu cầu phê duyệt…`,`Loading approval request…`)})});let l=o.action,u=Math.max(0,Math.ceil((Date.parse(o.expiresAt)-Date.now())/1e3)),d=async e=>{t({request:o,deciding:e});try{await s(W(o,e)),await n?.()}catch{t({request:o,error:i(r,`Yêu cầu đã hết hạn, thay đổi hoặc được trả lời ở terminal. Hãy tải trạng thái mới.`,`The request expired, changed, or was answered in the terminal. Refresh status.`)})}};return(0,G.jsxs)(`article`,{className:`approval-card risk-${l.riskClass}`,"aria-labelledby":`approval-${o.approvalRef}`,children:[(0,G.jsxs)(`header`,{children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`p`,{className:`section-kicker`,children:a?i(r,`${a} cần bạn duyệt`,`${a} needs your approval`):i(r,`Cần phê duyệt`,`Approval required`)}),(0,G.jsx)(`h2`,{id:`approval-${o.approvalRef}`,children:l.toolName})]}),(0,G.jsx)(`span`,{className:`approval-risk`,children:c(l.riskClass,r)})]}),(0,G.jsx)(`p`,{className:`approval-reason`,children:z(l.reason,r)}),l.commandPreview&&(0,G.jsx)(`pre`,{className:`approval-preview`,children:(0,G.jsx)(`code`,{children:l.commandPreview})}),!l.commandPreview&&l.parameterPreview&&l.parameterPreview!==`No additional parameters`&&(0,G.jsx)(`p`,{className:`approval-preview`,children:l.parameterPreview}),(0,G.jsxs)(`dl`,{className:`approval-facts`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`dt`,{children:i(r,`Hành động`,`Action`)}),(0,G.jsx)(`dd`,{children:B(l,r)})]}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`dt`,{children:i(r,`Phạm vi`,`Scope`)}),(0,G.jsx)(`dd`,{children:V(l,r)})]}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`dt`,{children:i(r,`Thư mục`,`Directory`)}),(0,G.jsx)(`dd`,{children:l.cwdDisplay??i(r,`Đã ẩn`,`Hidden`)})]}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`dt`,{children:i(r,`Hết hạn`,`Expires`)}),(0,G.jsxs)(`dd`,{children:[u,`s`]})]})]}),l.targetPaths.length>0&&(0,G.jsxs)(`div`,{className:`approval-targets`,children:[(0,G.jsx)(`strong`,{children:i(r,`Đích tác động`,`Targets`)}),(0,G.jsx)(`ul`,{children:l.targetPaths.map(e=>(0,G.jsx)(`li`,{children:e===`.`?i(r,`Cả thư mục project`,`The whole project folder`):e},e))})]}),(0,G.jsxs)(`div`,{className:`approval-consequences`,children:[(0,G.jsxs)(`p`,{children:[(0,G.jsx)(`strong`,{children:i(r,`Nếu cho phép:`,`If allowed:`)}),` `,H(l.consequences.allow,r)]}),(0,G.jsxs)(`p`,{children:[(0,G.jsx)(`strong`,{children:i(r,`Nếu từ chối:`,`If denied:`)}),` `,H(l.consequences.deny,r)]})]}),e.error&&(0,G.jsx)(`p`,{className:`form-error`,role:`alert`,children:e.error}),(0,G.jsxs)(`footer`,{children:[(0,G.jsx)(`button`,{type:`button`,className:`secondary-action`,disabled:!!e.deciding,title:i(r,`Từ chối và kết thúc lượt này, agent không thử lại`,`Deny and end this turn so the agent does not retry`),onClick:()=>void d(`stop`),children:i(r,`Từ chối và dừng`,`Deny and stop`)}),(0,G.jsx)(`button`,{type:`button`,className:`secondary-action`,disabled:!!e.deciding,onClick:()=>void d(`deny`),children:i(r,`Từ chối`,`Deny`)}),U(o)&&(0,G.jsx)(`button`,{type:`button`,className:`secondary-action`,disabled:!!e.deciding,title:i(r,`Lệnh giống hệt sẽ chạy không hỏi lại cho tới hết session`,`The same exact command runs without asking until the session ends`),onClick:()=>void d(`session`),children:i(r,`Cho cả session`,`Allow for session`)}),(0,G.jsx)(`button`,{type:`button`,className:`danger-action`,disabled:!!e.deciding,onClick:()=>void d(`allow`),children:e.deciding===`allow`||e.deciding===`session`?i(r,`Đang kiểm tra lại…`,`Rechecking…`):i(r,`Cho phép đúng 1 lần`,`Allow once`)})]})]})}function q(e,t,n){let r=(0,N.useMemo)(()=>e,[e.join(`\0`)]),[s,c]=(0,N.useState)({});return(0,N.useEffect)(()=>{let e=new AbortController;for(let s of r)(t?a(t,s,e.signal):o(s,e.signal)).then(e=>c(t=>({...t,[s]:{request:e}})),()=>c(e=>({...e,[s]:{error:i(n,`Không thể tải yêu cầu phê duyệt hiện tại.`,`Unable to load the current approval request.`)}})));return()=>e.abort()},[n,t,r]),{refs:r,states:s,set:(e,t)=>c(n=>({...n,[e]:t}))}}function le({approvalRefs:e,sessionRef:t,refreshSnapshot:n}){let{locale:a}=r(),{refs:o,states:s,set:c}=q(e,t,a);return o.length===0?null:(0,G.jsx)(`section`,{className:`approval-stack`,"aria-label":i(a,`Yêu cầu phê duyệt đang chờ`,`Pending approval requests`),"aria-live":`polite`,children:o.map(e=>(0,G.jsx)(K,{state:s[e]??{},setState:t=>c(e,t),refreshSnapshot:n,locale:a},e))})}function ue({snapshot:e,refreshSnapshot:t}){let n=(0,N.useMemo)(()=>e.approvals.pending.map(e=>e.approvalRef),[e.approvals.pending]);return(0,G.jsx)(le,{approvalRefs:n,refreshSnapshot:t})}var J=16384,de=1e3;function fe(e,t){let n=new Map;for(let r of[...t,...e])n.has(r.messageRef)||n.set(r.messageRef,r);return[...n.values()].slice(0,de)}function pe(e){let t=new Map,n=new Map;for(let r of e.slice(-500)){let e=r.kind,i=r.payload??{},a=r.messageRef;if([`agent-operation.settled`,`session.replacement-pending`,`session.replacement-committed`,`session.shutdown`].includes(String(e))){t.clear(),n.clear();continue}if(e===`message.started`&&i.role===`assistant`&&typeof a==`string`)t.set(a,{messageRef:a,text:``,thinking:!1,truncated:!1});else if(e===`message.text-delta`&&typeof a==`string`&&typeof i.delta==`string`){let e=t.get(a);if(!e)continue;let n=`${e.text}${i.delta}`;t.set(a,{...e,text:n.slice(0,J),truncated:e.truncated||n.length>J})}else if(e===`message.thinking-state`&&typeof a==`string`){let e=t.get(a);if(!e)continue;t.set(a,{...e,thinking:i.state!==`completed`})}else[`message.completed`,`message.failed`].includes(String(e))&&typeof a==`string`&&t.delete(a);[`activity.started`,`activity.progress`,`activity.finished`,`activity.failed`,`activity.blocked`,`activity.aborted`].includes(String(e))&&typeof r.toolCallId==`string`&&typeof i.activityRef==`string`&&typeof i.toolName==`string`&&n.set(r.toolCallId,{toolCallId:r.toolCallId,activityRef:i.activityRef,toolName:i.toolName,state:String(i.state??`unknown`)})}return{assistants:[...t.values()].slice(-2),tools:[...n.values()].slice(-8)}}var me=/^(?:\p{White_Space}|\p{Cc}|\p{Default_Ignorable_Code_Point})$/u,he=/\u001b(?:\[[0-?]*[ -/]*[@-~]|[@-_])/g;function ge(e){for(let t of e.replace(he,``))if(!me.test(t))return!0;return!1}function _e(e,t,n){if(!n?.complete)return{key:`${e}:${t}:active`,completionKey:null,user:``,assistant:``,operationRef:null,messageRequestId:null,startedAt:null};let r=n.startedAt??null,i=n.messageRequestId??null,a=`${i??`unknown`}:${n.operationRef??`unknown`}:${r??`unknown`}:${n.user}:${n.assistant.length}`;return{key:`${e}:${t}:complete:${a}`,completionKey:a,user:n.user,assistant:n.assistant,operationRef:n.operationRef,messageRequestId:i,startedAt:r}}function Y(e){let t=/^\[Piagent completion gate: (CONTINUING|NOT APPROVED)\][\t ]*/i.exec(e);if(!t)return{text:e,completionGate:null};let n=t[1]?.toUpperCase()===`CONTINUING`?`continuing`:`not-approved`,r=e.indexOf(`
2
+
3
+ `,t[0].length);return{text:r<0?``:e.slice(r+2).trimStart(),completionGate:n}}var ve=new Set([`provider-auth-expired`,`provider-auth-required`,`provider-rate-limited`,`provider-unavailable`,`provider-response-failed`,`assistant-output-incomplete`]);function X(e){let t=e.content.reasonCode;return e.role===`assistant`&&e.toolCalls.length===0&&e.content.state===`unavailable`&&t&&(ve.has(t)||t.startsWith(`company-`))?t:null}function Z(e){let t=Y(e);return t.completionGate===null&&ge(t.text)?t.text:null}function Q(e,t){let n=e?.trim(),r=t.trim();return!!(n&&r&&(n===r||n.startsWith(`/`)&&n.endsWith(` ${r}`)))}function ye(e,t){if(e.agentOperationId&&t.operationRef&&e.agentOperationId!==t.operationRef)return!1;if(e.messageRequestId&&t.messageRequestId)return e.messageRequestId===t.messageRequestId;if(e.agentOperationId&&t.operationRef)return e.agentOperationId===t.operationRef;let n=Date.parse(e.recordedAt),r=Date.parse(t.startedAt??``);return Number.isFinite(n)&&Number.isFinite(r)&&n>=r}function $(e,t,n){let r=t.trim();if(!r)return-1;for(let t=e.length-1;t>=0;--t){let i=e[t];if(i?.role===`user`&&Q(i.content.text,r)&&ye(i,n))return t}return-1}function be(e,t,n){return $(e,t,n)>=0}function xe(e,t,n,r){let i=$(e,t,r);if(i<0)return!1;let a=Z(n)?.trim()??``;if(!a)return!0;let o=e[i]?.messageRef??null;for(let t=i+1;t<e.length;t+=1){let n=e[t];if(n?.role===`user`)return!1;if(!(n?.role!==`assistant`&&n?.role!==`custom`||n.toolCalls.length>0)&&!(o&&n.parentMessageRef&&n.parentMessageRef!==o)&&Z(n.content.text??``)?.trim()===a)return!0}return!1}function Se(e,t,n){let r=$(e,t,n);if(r<0)return!1;let i=e[r]?.messageRef??null;for(let t=r+1;t<e.length;t+=1){let n=e[t];if(n?.role===`user`)return!1;if(!(n?.role!==`assistant`&&n?.role!==`custom`||n.toolCalls.length>0)&&!(i&&n.parentMessageRef&&n.parentMessageRef!==i)&&(Z(n.content.text??``)||X(n)))return!0}return!1}function Ce(e){let t=[],n=new Map,r=new Set,i=null,a=!1,o=null;for(let s of e){if(s.role===`user`){n.clear(),r.add(s.messageRef),i=s.messageRef,t.push(s),a=!1,o=null;continue}if(s.role!==`assistant`&&s.role!==`custom`||(s.parentMessageRef?!r.has(s.parentMessageRef):i===null)||s.toolCalls.length>0)continue;if(X(s)){if(a)continue;o?t[t.indexOf(o)]=s:t.push(s),o=s;continue}let e=Z(s.content.text??``);if(!e)continue;a=!0,o&&=(t.splice(t.indexOf(o),1),null);let c=`${s.role}:${e.trim()}`,l=n.get(c);l===void 0?(n.set(c,t.length),t.push(s)):t[l]=s}return t}export{ne as A,C,m as D,d as E,p as O,j as S,y as T,E as _,xe as a,O as b,Z as c,K as d,ue as f,oe as g,se as h,Se as i,te as j,h as k,pe as l,ce as m,Ce as n,be as o,q as p,_e as r,Q as s,X as t,fe as u,M as v,S as w,A as x,k as y};
@@ -7,11 +7,11 @@
7
7
  <meta name="csp-nonce" content="__PIAGENT_CSP_NONCE__" />
8
8
  <meta name="piagent-webui-mode" content="__PIAGENT_WEBUI_MODE__" />
9
9
  <title>Piagent WebUI</title>
10
- <script type="module" crossorigin src="/assets/index-uhJMXxqD.js"></script>
10
+ <script type="module" crossorigin src="/assets/index-CNdhIouM.js"></script>
11
11
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-hePW80VL.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/vendor-CSDKB7mU.js">
13
13
  <link rel="modulepreload" crossorigin href="/assets/ui-preferences-0waeSO-S.js">
14
- <link rel="stylesheet" crossorigin href="/assets/index-Dqb2hNan.css">
14
+ <link rel="stylesheet" crossorigin href="/assets/index-CjM70M7D.css">
15
15
  </head>
16
16
  <body>
17
17
  <div id="root"></div>
@@ -49,6 +49,8 @@ function settlementReason(settlement: GatewayTerminalSettlement["settlement"], v
49
49
  return "operation-settlement-unknown";
50
50
  }
51
51
 
52
+ const MAX_REPLAY_EVENTS = 256;
53
+
52
54
  export class GatewayEventStore {
53
55
  readonly #maximumCount: number;
54
56
  readonly #maximumAgeMs: number;
@@ -172,7 +174,9 @@ export class GatewayEventStore {
172
174
  // Treat the next sequence as the retention boundary so a client one event
173
175
  // behind must resync instead of silently receiving an empty replay.
174
176
  const earliestSequence = this.#events[0]?.sequence ?? Math.min(Number.MAX_SAFE_INTEGER, this.#sequence + 1);
175
- if (after !== null && (after > this.#sequence || after < Math.max(0, earliestSequence - 1))) {
177
+ // A client far behind reloads the snapshot (one request) instead of
178
+ // receiving hundreds of frames in a burst after it reconnects.
179
+ if (after !== null && (after > this.#sequence || after < Math.max(0, earliestSequence - 1) || this.#sequence - after > MAX_REPLAY_EVENTS)) {
176
180
  return { state: "resync-required", events: [], earliestSequence, currentSequence: this.#sequence };
177
181
  }
178
182
  return { state: "current", events: after === null ? [] : this.#events.filter((event) => event.sequence > after), earliestSequence,
@@ -160,7 +160,11 @@ export function attachGatewayWebSocket(options: {
160
160
  catch (error) { replay?.abort(); send(socket, errorResponse(request, options.protocol.events.stateVersion, error)); }
161
161
  }).catch(() => socket.close(1011, "gateway-failure")).finally(() => { queued--; });
162
162
  });
163
- socket.once("close", () => { clearTimeout(timeout); unsubscribe?.(); terminalStream?.stop(); sockets.delete(socket); });
163
+ // A socket whose other end vanished (sleep, a dropped Wi-Fi) is noticed by
164
+ // a ping it does not answer, so the browser reconnects instead of waiting.
165
+ let alive = true; socket.on("pong", () => { alive = true; });
166
+ const liveness = setInterval(() => { if (!alive) { socket.terminate(); return; } alive = false; try { socket.ping(); } catch { socket.terminate(); } }, 20_000); liveness.unref();
167
+ socket.once("close", () => { clearTimeout(timeout); clearInterval(liveness); unsubscribe?.(); terminalStream?.stop(); sockets.delete(socket); });
164
168
  socket.once("error", () => socket.terminate());
165
169
  });
166
170
  return { close: async () => {
@@ -446,7 +446,9 @@
446
446
  "expiresAt": { "$ref": "common-v1.schema.json#/$defs/timestamp" },
447
447
  "decisionSurface": { "const": "webui" },
448
448
  "executor": { "const": "pi-guard" },
449
- "directExecution": { "const": false }
449
+ "directExecution": { "const": false },
450
+ "scope": { "description": "Optional. once allows this exact action one time; session also allows the same exact action for the rest of the session. Only with allow.", "enum": ["once", "session"] },
451
+ "stop": { "description": "Optional. true with deny also stops the current turn, so the agent does not retry.", "type": "boolean" }
450
452
  }
451
453
  },
452
454
  "receiptRevisions": {
@@ -550,6 +550,22 @@
550
550
  },
551
551
  "additionalProperties": false
552
552
  },
553
+ "autoDeny": {
554
+ "description": "Commands this project refuses in every permission mode, Bypass included. Each rule is matched like an exec-policy rule; terminate also ends the agent's turn so it does not retry.",
555
+ "type": "array",
556
+ "maxItems": 64,
557
+ "items": {
558
+ "type": "object",
559
+ "additionalProperties": false,
560
+ "required": ["pattern", "reason"],
561
+ "properties": {
562
+ "pattern": { "type": "string", "minLength": 1, "maxLength": 500 },
563
+ "match": { "enum": ["contains", "regex", "prefix"] },
564
+ "reason": { "type": "string", "minLength": 1, "maxLength": 300 },
565
+ "terminate": { "type": "boolean" }
566
+ }
567
+ }
568
+ },
553
569
  "runtimePolicy": {
554
570
  "type": "object",
555
571
  "properties": {
@@ -67,11 +67,11 @@ export const HELP_TEXT = [
67
67
  'Mở lại sau: piagent studio --project <thư mục>, rồi /resume. Đừng mở cuộc trò chuyện công ty bằng pi cá nhân.',
68
68
  ].join('\n');
69
69
  const PERMISSION_STATUS = 'agent-watch-permission';
70
- const ASK = 'Hỏi trước (mặc định)', FULL = 'Toàn quyền: chỉ hỏi việc bắt buộc', BYPASS = 'Bypass: không hỏi gì';
70
+ const ASK = 'Hỏi trước (mặc định)', FULL = 'Toàn quyền: hỏi việc bàn giao và việc phá huỷ', BYPASS = 'Bypass: chỉ hỏi việc bàn giao';
71
71
  const PERMISSION_TEXT = {
72
- 'workspace-write': 'Hỏi trước: mọi lệnh cần internet đều hỏi bạn.',
73
- 'trusted-full-access': 'Toàn quyền: lệnh cần internet chạy luôn; vẫn hỏi trước khi đẩy hoặc gửi dữ liệu ra ngoài, chạy migration, xoá không rõ đích hoặc dùng sudo.',
74
- bypass: 'Bypass: không hỏi gì nữa (internet, Docker, lệnh trên máy, push, deploy, migration đều chạy luôn); lệnh thường vẫn trong sandbox, /undo vẫn dùng được.',
72
+ 'workspace-write': 'Hỏi trước: mọi lệnh ra ngoài sandbox (internet, Docker, trên máy) đều hỏi bạn.',
73
+ 'trusted-full-access': 'Toàn quyền: lệnh cần internet hoặc Docker chạy luôn; vẫn hỏi việc bàn giao (push, PR, publish, deploy, upload, ssh), migration, xoá không rõ đích, sudo và từng lệnh trên máy.',
74
+ bypass: 'Bypass: việc làm chạy luôn (internet, Docker, lệnh trên máy, migration); việc bàn giao vẫn hỏi (push, PR, publish, deploy, upload, ssh, MCP ghi ra ngoài) cùng lệnh đụng thông tin đăng nhập. Lệnh thường vẫn trong sandbox, /undo vẫn dùng được.',
75
75
  };
76
76
  const PERMISSION_NAME = { 'workspace-write': 'Hỏi trước', 'trusted-full-access': 'Toàn quyền', bypass: 'Bypass' };
77
77
 
@@ -305,7 +305,7 @@ export function companyTerminalExtension({ managed, packageRoot, sdkRoot, bindin
305
305
  // The member's pick of look (/style); /settings is not offered here.
306
306
  registerStyleCommand(pi, { remember: true });
307
307
 
308
- // Ask first or Bypass, kept with the conversation like the dashboard's switch.
308
+ // Ask first, Full access or Bypass, kept with the conversation like the dashboard's switch.
309
309
  const showPermission = (ctx) => { const mode = managed() ? effectivePermission(managed()) : null; ctx.ui?.setStatus?.(PERMISSION_STATUS, mode && mode !== 'workspace-write' ? PERMISSION_NAME[mode] : undefined); };
310
310
  pi.on('session_start', async (_event, ctx) => showPermission(ctx));
311
311
  pi.registerCommand('bypass', {
@@ -75,7 +75,7 @@ if (!version?.includes("-") && rootPackage.publishConfig?.tag !== undefined) fai
75
75
  if (rootPackage.repository?.url !== "git+https://github.com/Vt-mmm/piagent.git") fail("root package repository URL is not canonical");
76
76
  if (corePackage.repository?.url !== rootPackage.repository.url) fail("core package repository URL does not match the root package");
77
77
  const runtimeDependencies = rootPackage.dependencies ?? {};
78
- if (JSON.stringify(runtimeDependencies) !== JSON.stringify({ "@babel/parser": "7.29.8", ws: "8.21.3" })) {
78
+ if (JSON.stringify(runtimeDependencies) !== JSON.stringify({ "@aliou/sh": "0.3.4", "@babel/parser": "7.29.8", ws: "8.21.3" })) {
79
79
  fail("root package runtime dependencies must contain only the pinned syntax parser and local Gateway WebSocket transport");
80
80
  }
81
81
  if (JSON.stringify(packageLock.packages?.[""]?.dependencies) !== JSON.stringify(runtimeDependencies)) fail("package-lock runtime dependencies do not match package.json");
@@ -1,42 +0,0 @@
1
- // What a company conversation in "Bypass" mode still asks the member about
2
- // (owner, 2026-10-07: a member who chose bypass is not asked again, except for
3
- // what must be confirmed). Everything else runs without asking.
4
- // Always asked: anything that changes or sends data outside this machine
5
- // (git push, publish, deploy, a request that uploads or writes, remote
6
- // shells, cloud and cluster tools), database migrations, deletes whose
7
- // target is only known at run time, removing Docker volumes, and sudo.
8
- import fs from 'node:fs';
9
- import { fileURLToPath } from 'node:url';
10
- import { evaluateExecPolicyCore } from '../../extensions/policy-core.js';
11
-
12
- const POLICY = JSON.parse(fs.readFileSync(fileURLToPath(new URL('../../policies/base-policy.json', import.meta.url)), 'utf8'));
13
- // Exec-policy prompts a member in bypass may skip: local, reversible.
14
- const BYPASSABLE_RULES = new Set(['prompt-git-add-broad']);
15
- // Tools that reach other machines or accounts; none runs without asking.
16
- const REMOTE = new Set(['ssh', 'scp', 'sftp', 'sudo', 'doas', 'vercel', 'netlify', 'fly', 'flyctl', 'heroku', 'firebase', 'aws', 'gcloud', 'gsutil', 'az',
17
- 'kubectl', 'helm', 'terraform', 'tofu', 'pulumi', 'eas', 'wrangler', 'supabase', 'railway', 'render', 'doctl']);
18
- const basename = word => String(word ?? '').split('/').pop();
19
- const WRAPPERS = new Set(['env', 'command', 'exec', 'time', 'nohup', 'npx', 'bunx', 'pnpx']);
20
- function executable(words) {
21
- let i = 0;
22
- while (i < words.length && (/^[A-Za-z_][A-Za-z0-9_]*=/.test(words[i]) || WRAPPERS.has(basename(words[i])) || words[i].startsWith('-'))) i += 1;
23
- return { name: basename(words[i]), args: words.slice(i + 1) };
24
- }
25
-
26
- // Why this command must still be confirmed, or null when bypass may run it.
27
- export async function mustConfirm(command) {
28
- const result = evaluateExecPolicyCore(String(command), { policy: POLICY, mode: 'enforce' });
29
- const kept = result.reasons.filter(reason => ![...BYPASSABLE_RULES].some(id => reason.startsWith(`Prompt required by exec policy ${id}:`)));
30
- if (result.decision !== 'allow' && kept.length) return kept[0];
31
- const { findShellExternalConfirmationReason } = await import('../../extensions/guard-shell-analysis.ts');
32
- const external = findShellExternalConfirmationReason(result.segments, { defaultMode: 'enforce', ...POLICY.externalActionPolicy });
33
- if (external) return external;
34
- for (const segment of result.segments) {
35
- const { name, args } = executable(segment.words);
36
- if (REMOTE.has(name)) return `${name} reaches another machine or account`;
37
- if (name === 'rsync' && args.some(arg => /^[^/\s]*:/.test(arg) && !arg.startsWith('-'))) return 'rsync to another machine';
38
- if (name === 'docker' && ['push', 'login'].includes(args.find(arg => !arg.startsWith('-')))) return `docker ${args.find(arg => !arg.startsWith('-'))} sends to a registry`;
39
- if (name === 'git' && args.some(arg => ['push', 'send-email', 'request-pull'].includes(arg))) return 'git sends to a remote';
40
- }
41
- return null;
42
- }