gestalt-mobile 0.25.1 → 0.25.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/index-CFw8G97O.js +29 -0
- package/dist/client/assets/index-D3wXcWGp.css +1 -0
- package/dist/client/index.html +2 -2
- package/dist/server/server/composition.contracts.js +52 -62
- package/dist/server/server/composition.js +63 -4
- package/dist/server/server/features/agent-activity/model.js +27 -0
- package/dist/server/server/features/agent-activity/registry.js +24 -0
- package/dist/server/server/features/autopilot/application/policy.js +14 -12
- package/dist/server/server/features/autopilot/application/service.js +339 -17
- package/dist/server/server/features/autopilot/domain/autopilot-session.js +2 -0
- package/dist/server/server/features/autopilot/domain/supervised-lifecycle.js +255 -0
- package/dist/server/server/platform/codex/session-runtime.js +173 -2
- package/dist/server/server/platform/persistence/migrate.js +7 -2
- package/dist/server/server/platform/persistence/sqlite-autopilot-store.js +21 -3
- package/dist/server/server/platform/persistence/sqlite-event-journal.js +5 -0
- package/dist/server/shared/contracts/autopilot-audit.js +12 -0
- package/dist/server/shared/org-plan-position.js +12 -2
- package/package.json +1 -1
- package/dist/client/assets/index-BbmQ802n.js +0 -29
- package/dist/client/assets/index-Ds2GFV_A.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.session-path.svelte-t9laac{text-align:center;text-overflow:ellipsis;white-space:nowrap;flex:1 1 0;min-inline-size:0;margin:0;overflow:hidden}.session-model.svelte-t9laac{color:var(--theme-text-muted);font-family:var(--theme-font-code);margin-inline-start:clamp(.75rem,3vw,2rem)}.detach-chat.svelte-t9laac{min-block-size:44px;inline-size:44px;color:inherit;background:0 0;border:0;flex:none;place-items:center;padding:0;display:grid}.detach-chat.svelte-t9laac svg:where(.svelte-t9laac){fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.75px;block-size:1.25rem;inline-size:1.25rem}@media (width<=34rem){.session-path.svelte-t9laac{font-size:max(.625rem,12px)}.session-model.svelte-t9laac{display:none}}.chat-activity.svelte-thyolt,.live-activity.svelte-thyolt{--activity-gap:.4rem;--activity-type-color:var(--theme-text-muted)}.chat-activity.svelte-thyolt>summary:where(.svelte-thyolt){color:var(--activity-type-color);cursor:pointer;font-size:.875em}.live-activity.svelte-thyolt{margin-block-start:.5rem}.live-activity.svelte-thyolt>strong:where(.svelte-thyolt){color:var(--activity-type-color);font-size:.875em}.activity-list.svelte-thyolt{gap:var(--activity-gap);margin-block:.25rem 0;margin-inline:0;padding:0;list-style:none;display:grid}.activity-row.svelte-thyolt{flex-wrap:wrap;align-items:baseline;gap:.25rem .5rem;display:flex}.activity-row[data-activity-status=failed].svelte-thyolt{border-inline-start:.25rem solid var(--theme-error);padding-inline-start:.375rem}.activity-row[data-activity-status=completed].svelte-thyolt{border-inline-start:.25rem solid var(--theme-success);padding-inline-start:.375rem}.activity-row[data-activity-status].svelte-thyolt:not([data-activity-status=completed]):not([data-activity-status=failed]){border-inline-start:.25rem solid var(--theme-info);padding-inline-start:.375rem}.activity-type.svelte-thyolt{color:var(--activity-type-color);font-size:.75em;line-height:1.2}.activity-content.svelte-thyolt{overflow-wrap:anywhere;white-space:pre-wrap;min-inline-size:0}.app-control.svelte-6ey372{box-sizing:border-box;min-block-size:44px;min-inline-size:44px;color:var(--theme-text);font:inherit;text-align:center;background:var(--theme-surface);border:1px solid var(--theme-border);border-radius:var(--theme-radius);cursor:pointer;scroll-margin-block:var(--sticky-header-clearance) var(--bottom-navigation-clearance);justify-content:center;align-items:center;padding:.45rem .75rem;display:inline-flex}.app-control.svelte-6ey372:hover:not(:disabled,[aria-disabled=true]){background:var(--theme-control-hover)}.app-control.svelte-6ey372:active:not(:disabled,[aria-disabled=true]){color:var(--theme-control-pressed-contrast);background:var(--theme-control-pressed)}.app-control.svelte-6ey372:focus-visible{outline:3px solid var(--theme-accent);outline-offset:2px}.app-control.svelte-6ey372:disabled,.app-control[aria-disabled=true].svelte-6ey372{color:var(--theme-control-disabled);cursor:not-allowed;opacity:.65}.compact.svelte-6ey372{padding:.25rem .4rem;font-size:.8rem}.full.svelte-6ey372{inline-size:100%}.primary.svelte-6ey372{color:var(--theme-accent-contrast);background:var(--theme-accent);border-color:var(--theme-accent);box-shadow:inset 0 .15rem 0 var(--theme-accent-contrast);font-weight:700}.accentPressed[aria-pressed=true].svelte-6ey372{color:var(--theme-accent-contrast);background:var(--theme-accent);border-color:var(--theme-accent);font-weight:700}@media (prefers-reduced-motion:reduce){.app-control.svelte-6ey372{transition:none!important;animation:none!important}}.agent-activity.svelte-d9jh4j{overflow-wrap:anywhere;max-inline-size:100%}.chips.svelte-d9jh4j{flex-wrap:wrap;align-items:center;gap:.4rem;min-inline-size:0;display:flex}.chip.svelte-d9jh4j,.freshness.svelte-d9jh4j{border:1px solid var(--theme-border);overflow-wrap:anywhere;border-radius:999px;padding:.35rem .55rem;font-size:.85rem}.children.svelte-d9jh4j>summary:where(.svelte-d9jh4j){cursor:pointer;align-items:center;min-block-size:2.75rem;display:inline-flex}.children.svelte-d9jh4j ul:where(.svelte-d9jh4j){max-inline-size:min(38rem,100%);margin:.45rem 0 0;padding-inline-start:1.25rem}.children.svelte-d9jh4j small:where(.svelte-d9jh4j){color:var(--theme-text-muted)}.compact.svelte-d9jh4j .agents:where(.svelte-d9jh4j){inline-size:100%;position:relative}.compact.svelte-d9jh4j .agents:where(.svelte-d9jh4j) ul:where(.svelte-d9jh4j){z-index:10;box-sizing:border-box;overscroll-behavior:contain;background:var(--theme-surface);border:1px solid var(--theme-border);max-block-size:min(20rem,50vh);inline-size:min(22rem,100vw - max(2.5rem,48px));box-shadow:0 .35rem 1rem color-mix(in srgb, var(--theme-text) 18%, transparent);border-radius:.5rem;gap:.35rem;margin:0;padding:.45rem;list-style:none;display:grid;position:absolute;inset-block-end:calc(100% + .35rem);inset-inline-end:0;overflow-y:auto}.compact.align-start.svelte-d9jh4j .agents:where(.svelte-d9jh4j) ul:where(.svelte-d9jh4j){inset-inline:0 auto}.compact.svelte-d9jh4j .agents:where(.svelte-d9jh4j) li:where(.svelte-d9jh4j){border-block-end:1px solid var(--theme-border);gap:.1rem;min-inline-size:0;padding:.3rem;display:grid}.compact.svelte-d9jh4j .agents:where(.svelte-d9jh4j) time:where(.svelte-d9jh4j),.compact.svelte-d9jh4j .agents:where(.svelte-d9jh4j) .agent-metadata:where(.svelte-d9jh4j),.compact.svelte-d9jh4j .agents:where(.svelte-d9jh4j) .unavailable:where(.svelte-d9jh4j){color:var(--theme-text-muted);font-size:.78rem}[data-state=blocked].svelte-d9jh4j,[data-state=awaitingHuman].svelte-d9jh4j,[data-state=disconnected].svelte-d9jh4j{font-weight:700;text-decoration:underline}.visually-hidden.svelte-d9jh4j{clip-path:inset(50%);white-space:nowrap;block-size:1px;inline-size:1px;position:absolute;overflow:hidden}@media (prefers-reduced-motion:reduce){.svelte-d9jh4j{transition:none!important;animation:none!important}}main.svelte-iw6wrs{box-sizing:border-box;max-inline-size:100vw;padding:1rem}h1.svelte-iw6wrs{overflow-wrap:anywhere}.autopilot-control.svelte-1qf1ppf{min-inline-size:0;max-inline-size:100%;scroll-margin-block:var(--sticky-header-clearance) var(--bottom-navigation-clearance)}.control-row.svelte-1qf1ppf{flex-wrap:wrap;align-items:center;gap:.45rem;display:flex}.compact.svelte-1qf1ppf{inline-size:100%}.status.svelte-1qf1ppf{border:1px solid var(--theme-border);overflow-wrap:anywhere;border-radius:999px;padding:.35rem .55rem}.status[data-state=attentionRequired].svelte-1qf1ppf,.status[data-state=unavailable].svelte-1qf1ppf{font-weight:700;text-decoration:underline}p.svelte-1qf1ppf{color:var(--theme-text-muted);overflow-wrap:anywhere;margin:.25rem 0 0}.visually-hidden.svelte-1qf1ppf{clip-path:inset(50%);white-space:nowrap;border:0;block-size:1px;inline-size:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@media (prefers-reduced-motion:reduce){.svelte-1qf1ppf{transition:none!important;animation:none!important}}.attention.svelte-1hnxk0w{border:2px solid var(--theme-error);overflow-wrap:anywhere;scroll-margin-block:var(--sticky-header-clearance) var(--bottom-navigation-clearance);border-inline-start-width:.5rem;border-radius:.5rem;padding:.75rem}h3.svelte-1hnxk0w{margin:0}dl.svelte-1hnxk0w{gap:.35rem;display:grid}dl.svelte-1hnxk0w div:where(.svelte-1hnxk0w){gap:.15rem;display:grid}dt.svelte-1hnxk0w{font-weight:700}dd.svelte-1hnxk0w{margin:0}.actions.svelte-1hnxk0w{flex-wrap:wrap;gap:.5rem;display:flex}button.svelte-1hnxk0w{min-block-size:44px;font:inherit;scroll-margin-block:var(--sticky-header-clearance) var(--bottom-navigation-clearance);padding:.45rem .75rem}textarea.svelte-1hnxk0w{box-sizing:border-box;min-block-size:5rem;inline-size:100%;font:inherit;scroll-margin-block:var(--sticky-header-clearance) var(--bottom-navigation-clearance)}.guidance-help.svelte-1hnxk0w{color:var(--theme-text-muted);margin:.25rem 0}button.svelte-1hnxk0w:focus-visible{outline:3px solid var(--theme-accent);outline-offset:2px}.safety-stop.svelte-yp6bgs{border:2px solid var(--theme-error);overflow-wrap:anywhere;scroll-margin-block:var(--sticky-header-clearance) var(--bottom-navigation-clearance);border-inline-start-width:.5rem;border-radius:.5rem;padding:.75rem}h3.svelte-yp6bgs,p.svelte-yp6bgs{margin:0 0 .5rem}.actions.svelte-yp6bgs{flex-wrap:wrap;gap:.5rem;display:flex}button.svelte-yp6bgs{min-block-size:44px;font:inherit;padding:.45rem .75rem}button.svelte-yp6bgs:focus-visible{outline:3px solid var(--theme-accent);outline-offset:2px}@media (prefers-reduced-motion:reduce){.svelte-yp6bgs{transition:none!important;animation:none!important}}form.svelte-1264sfg>[role=status]:where(.svelte-1264sfg){text-align:start;margin-block:1rem .35rem}.writer-hint.svelte-1264sfg{color:var(--theme-text-muted);margin:.35rem 0}.writer-feedback.svelte-1264sfg{border-inline-start:.25rem solid var(--theme-danger,#b42318);background:var(--theme-control-hover);flex-wrap:wrap;align-items:center;gap:.5rem;margin-block:.5rem;padding:.5rem;display:flex}.writer-feedback.svelte-1264sfg p:where(.svelte-1264sfg){flex:16rem;margin:0}.command-menu.svelte-1264sfg{background:var(--theme-surface);border:1px solid var(--theme-border);border-radius:.375rem;gap:.125rem;max-inline-size:min(100%,32rem);margin:0 0 .35rem;padding:.25rem;list-style:none;display:grid}.command-menu.svelte-1264sfg button:where(.svelte-1264sfg){inline-size:100%;color:var(--theme-text);text-align:start;background:0 0;border:0;border-radius:.25rem;align-items:baseline;gap:.5rem;padding:.25rem .375rem;display:flex}.command-menu.svelte-1264sfg .command-selected:where(.svelte-1264sfg) button:where(.svelte-1264sfg),.command-menu.svelte-1264sfg button:where(.svelte-1264sfg):hover{background:var(--theme-control-hover)}.command-menu.svelte-1264sfg small:where(.svelte-1264sfg){color:var(--theme-text-muted);font-size:.8em}.command-menu.svelte-1264sfg button:where(.svelte-1264sfg):focus-visible{outline:2px solid var(--theme-focus);outline-offset:1px}.prompt-row.svelte-1264sfg{align-items:end;gap:.5rem;display:flex}textarea.svelte-1264sfg{resize:vertical;flex:auto;min-block-size:2.75rem}.prompt-row.svelte-1264sfg>button:where(.svelte-1264sfg),.prompt-action.svelte-1264sfg>button:where(.svelte-1264sfg){flex:none;place-items:center;min-block-size:3rem;inline-size:3rem;padding:0;display:grid}.prompt-row.svelte-1264sfg svg:where(.svelte-1264sfg){fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;block-size:1.35rem;inline-size:1.35rem}.prompt-action.svelte-1264sfg{flex:none;position:relative}.prompt-action.svelte-1264sfg>button:where(.svelte-1264sfg){color:var(--theme-text);background:var(--theme-surface);border:1px solid var(--theme-border);cursor:pointer;border-radius:.375rem}.prompt-action.svelte-1264sfg>button:where(.svelte-1264sfg):hover{background:var(--theme-control-hover)}.prompt-action.svelte-1264sfg>button:where(.svelte-1264sfg):focus-visible{outline:2px solid var(--theme-focus);outline-offset:2px}.action-panel.svelte-1264sfg{z-index:2;background:var(--theme-surface);border:1px solid var(--theme-border);border-radius:.375rem;gap:.125rem;min-inline-size:max-content;padding:.25rem;display:grid;position:absolute;inset-block-end:calc(100% + .35rem);inset-inline-end:0;box-shadow:0 .35rem 1rem #0000002e}.action-panel.svelte-1264sfg button:where(.svelte-1264sfg){inline-size:100%;color:var(--theme-text);text-align:start;white-space:nowrap;background:0 0;border:0;border-radius:.25rem;padding:.5rem .65rem}.action-panel.svelte-1264sfg button:where(.svelte-1264sfg):hover{background:var(--theme-control-hover)}.block-cursor.svelte-1264sfg{vertical-align:-.1em;background:var(--theme-accent);block-size:1em;inline-size:.55ch;animation:1s steps(2,start) infinite svelte-1264sfg-blink;display:inline-block}@media (prefers-reduced-motion:reduce){.block-cursor.svelte-1264sfg{animation:none}}@keyframes svelte-1264sfg-blink{50%{opacity:0}}.quiz-form.svelte-77f3gb{gap:1rem;display:grid}fieldset.svelte-77f3gb{border:0;min-inline-size:0;margin:0;padding:0}.questions.svelte-77f3gb{gap:1rem;display:grid}legend.svelte-77f3gb{gap:.25rem;max-inline-size:100%;display:grid}.choices.svelte-77f3gb{gap:.5rem;margin-block-start:.5rem;display:grid}.choice.svelte-77f3gb{position:relative}.choice.svelte-77f3gb>input:where(.svelte-77f3gb){opacity:0;cursor:pointer;block-size:100%;inline-size:100%;margin:0;position:absolute;inset:0}.choice.svelte-77f3gb>label:where(.svelte-77f3gb){background:var(--theme-surface);border:2px solid var(--theme-border);border-radius:.5rem;gap:.125rem;min-block-size:44px;padding:.75rem;display:grid}.choice.svelte-77f3gb>input:where(.svelte-77f3gb):checked+label:where(.svelte-77f3gb){border-width:3px;border-color:var(--theme-accent);background:var(--theme-surface-subtle)}.choice.svelte-77f3gb>input:where(.svelte-77f3gb):focus-visible+label:where(.svelte-77f3gb){outline:3px solid var(--theme-focus);outline-offset:2px}label.svelte-77f3gb span:where(.svelte-77f3gb),legend.svelte-77f3gb span:where(.svelte-77f3gb){color:var(--theme-text-muted)}.custom.svelte-77f3gb{margin-block-start:.25rem}.custom.svelte-77f3gb input:where(.svelte-77f3gb){box-sizing:border-box;min-block-size:44px;inline-size:100%;font:inherit;margin-block-start:.375rem}article.svelte-ajsqcq{background:var(--theme-surface-subtle);border-inline-start:.25rem solid var(--theme-info);border-radius:.375rem;margin-block:.75rem;padding:.75rem}.submitted-answers.svelte-ajsqcq{border-block-start:1px solid var(--theme-border);gap:.5rem;margin-block-start:.75rem;padding-block-start:.75rem;display:grid}.submitted-answers.svelte-ajsqcq p:where(.svelte-ajsqcq),.submitted-answers.svelte-ajsqcq ol:where(.svelte-ajsqcq){margin:0}.submitted-answers.svelte-ajsqcq ol:where(.svelte-ajsqcq){gap:.625rem;padding-inline-start:1.25rem;display:grid}.submitted-answers.svelte-ajsqcq li:where(.svelte-ajsqcq),.submitted-question.svelte-ajsqcq,.submitted-answer.svelte-ajsqcq{overflow-wrap:anywhere}.submitted-question.svelte-ajsqcq,.submitted-answer.svelte-ajsqcq{display:block}.submitted-answer.svelte-ajsqcq{white-space:pre-wrap;margin-block-start:.125rem}.submitted-note.svelte-ajsqcq{color:var(--theme-text-muted);font-size:.85rem}.interaction-kind.svelte-ajsqcq,.interaction-submitting.svelte-ajsqcq,.interaction-result.svelte-ajsqcq,.interaction-failed.svelte-ajsqcq{margin-block:0 .5rem}.interaction-result.svelte-ajsqcq{font-weight:600}.command-approval-command.svelte-ajsqcq{white-space:pre-wrap;max-inline-size:100%;font-family:var(--theme-font-code);background:var(--theme-code);border:1px solid var(--theme-border);border-radius:.375rem;margin-block:.5rem .75rem;padding:.625rem;overflow-x:auto}.command-approval-missing.svelte-ajsqcq{margin-block:.5rem .75rem}.file-change-approval-targets.svelte-ajsqcq{overflow-wrap:anywhere;margin-block:.5rem .75rem;padding-inline-start:1.5rem}.file-change-approval-missing.svelte-ajsqcq{margin-block:.5rem .75rem}.approval-actions.svelte-ajsqcq{flex-wrap:wrap;gap:clamp(.5rem,2vw,1rem);display:flex}.autopilot-audit.svelte-1im954t{border-inline-start:.25rem solid var(--theme-border);overflow-wrap:anywhere;padding-inline-start:.5rem}.audit-incomplete.svelte-1im954t{border-inline-start:.35rem solid var(--theme-border);color:var(--theme-text-muted);margin-block:.5rem;padding-inline-start:.65rem}.autopilot-audit.svelte-1im954t time:where(.svelte-1im954t){color:var(--theme-text-muted);margin-inline-start:.5rem}.autopilot-audit.svelte-1im954t summary:where(.svelte-1im954t){scroll-margin-block:var(--sticky-header-clearance) var(--bottom-navigation-clearance)}ol.svelte-1im954t{inline-size:100%;margin:0;padding:0;list-style:none}li.svelte-1im954t{box-sizing:border-box;white-space:pre-wrap;overflow-wrap:anywhere;inline-size:100%;margin-block-end:0}li.svelte-1im954t+li:where(.svelte-1im954t){margin-block-start:1rem}.prompt-turn.svelte-1im954t{background:var(--theme-surface-subtle);border-inline-start:.25rem solid var(--theme-accent);border-radius:.375rem;padding:.5rem .625rem}.answer-turn.svelte-1im954t{border-inline-start:.25rem solid var(--theme-border);padding-inline-start:.625rem}.commentary-turn.svelte-1im954t,.orphan-activity-turn.svelte-1im954t,.progress-turn.svelte-1im954t,.commentary-content.svelte-1im954t{background:var(--theme-surface-subtle);border-inline-start:.25rem solid var(--theme-info);border-radius:.375rem;padding:.5rem .625rem}.live-commentary.svelte-1im954t,.progress-turn.svelte-1im954t{background:0 0}.entry-heading.svelte-1im954t{align-items:baseline;gap:.75rem;display:flex}time.svelte-1im954t{color:var(--theme-text-muted);white-space:nowrap;margin-inline-start:auto;font-size:.875em}.commentary-toggle.svelte-1im954t{min-block-size:1.5rem;color:var(--theme-text-muted);background:0 0;border:0;padding:0 .125rem;font-size:.875em}.answer-history.svelte-1im954t{flex-wrap:wrap;align-items:baseline;gap:.25rem .75rem;margin-block:.2rem .35rem;display:flex}.file-changes.svelte-1im954t{background:var(--theme-surface-subtle);border-inline-start:.25rem solid var(--theme-success);border-radius:.375rem;margin-block:.5rem;padding:.5rem .625rem}.file-changes.svelte-1im954t>strong:where(.svelte-1im954t){font-size:.875em}.file-changes.svelte-1im954t ul:where(.svelte-1im954t){gap:.15rem;margin:.25rem 0 0;padding-inline-start:1.25rem;display:grid}.commentary-content.svelte-1im954t{margin-block:.25rem .5rem}.entry-content.svelte-1im954t{margin-block:.125rem 0;margin-inline:0}:is(h1.svelte-1im954t,h2.svelte-1im954t,h3.svelte-1im954t,h4.svelte-1im954t,h5.svelte-1im954t,h6.svelte-1im954t){text-wrap:balance;margin-block:.85em .3em;line-height:1.25}.svelte-1im954t:is(h1:where(.svelte-1im954t),h2:where(.svelte-1im954t),h3:where(.svelte-1im954t)):first-child{margin-block-start:.25em}h1.svelte-1im954t{font-size:1.5em}h2.svelte-1im954t{font-size:1.3em}h3.svelte-1im954t{font-size:1.15em}:is(h4.svelte-1im954t,h5.svelte-1im954t,h6.svelte-1im954t){font-size:1em}pre.svelte-1im954t,code.svelte-1im954t{font-family:var(--theme-font-code)}pre.svelte-1im954t{white-space:pre;background:var(--theme-code);border:1px solid var(--theme-border);border-radius:var(--theme-radius);padding:.625rem;overflow-x:auto}.svelte-1im954t:not(pre)>code:where(.svelte-1im954t){background:var(--theme-code);border-radius:.2rem;padding-inline:.2em}a.svelte-1im954t{color:var(--theme-info)}.table-scroll.svelte-1im954t{margin-block:.75rem;overflow-x:auto}table.svelte-1im954t{border-collapse:collapse;white-space:normal;width:max-content;min-width:100%}th.svelte-1im954t,td.svelte-1im954t{text-align:left;vertical-align:top;border:1px solid var(--theme-border);padding:.25rem .5rem}th.svelte-1im954t{background:var(--theme-surface-subtle);font-weight:600}.toast-viewport.svelte-1a0rutm{z-index:10;pointer-events:none;gap:.5rem;max-block-size:calc(100dvh - 7rem);inline-size:min(24rem,100vw - 1.5rem);display:grid;position:fixed;inset-block-start:calc(1rem + env(safe-area-inset-top));inset-inline-end:max(.75rem, env(safe-area-inset-right));overflow-y:auto}.toast.svelte-1a0rutm{box-sizing:border-box;min-inline-size:0;color:var(--theme-text);background:var(--theme-surface);border:1px solid var(--theme-info);box-shadow:0 .4rem 1.2rem var(--theme-shadow);pointer-events:auto;border-inline-start-width:.35rem;border-radius:.55rem;grid-template-columns:auto minmax(0,1fr) 44px;align-items:start;gap:.6rem;padding:.65rem;display:grid}.toast.error.svelte-1a0rutm{color:var(--theme-error);border-color:var(--theme-error);border-inline-start-style:double}.toast.success.svelte-1a0rutm{color:var(--theme-success);border-color:var(--theme-success);border-inline-start-style:solid}.toast-symbol.svelte-1a0rutm{box-sizing:border-box;border:2px solid;border-radius:50%;place-items:center;block-size:1.6rem;inline-size:1.6rem;font-weight:800;line-height:1;display:grid}.toast-copy.svelte-1a0rutm{overflow-wrap:anywhere;gap:.15rem;min-inline-size:0;padding-block:.1rem;display:grid}.toast-copy.svelte-1a0rutm strong:where(.svelte-1a0rutm){text-transform:capitalize}.toast-copy.svelte-1a0rutm small:where(.svelte-1a0rutm){opacity:.72}button.svelte-1a0rutm{min-block-size:44px;inline-size:44px;color:var(--theme-text);font:inherit;background:0 0;border:0;border-radius:.35rem;place-items:center;padding:0;font-size:1.5rem;display:grid}button.svelte-1a0rutm:hover{background:var(--theme-control-hover)}@media (width<=30rem){.toast-viewport.svelte-1a0rutm{max-block-size:none;inline-size:100%;margin-block:0 .75rem;position:static}.toast.svelte-1a0rutm{grid-template-columns:minmax(0,1fr) 44px;gap:.25rem;max-block-size:5rem;padding:.35rem;overflow-y:auto}.toast-symbol.svelte-1a0rutm{display:none}.toast-copy.svelte-1a0rutm strong:where(.svelte-1a0rutm){clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;block-size:1px;inline-size:1px;padding:0;position:absolute;overflow:hidden}}@media (forced-colors:active){.toast.svelte-1a0rutm,.toast-symbol.svelte-1a0rutm{border-color:canvastext}}.evidence-page.svelte-1j55xyh{box-sizing:border-box;min-block-size:100dvh;inline-size:100%;padding:1rem 1rem 7rem}h1.svelte-1j55xyh{margin-block:0 .5rem}.evidence-composer.svelte-1j55xyh{position:fixed;inset-block-end:2.75rem;inset-inline:1rem}.evidence-prompt.svelte-1j55xyh{box-sizing:border-box;inline-size:100%;margin-block-start:.35rem;display:block}.evidence-nav.svelte-1j55xyh{padding:.5rem 1rem calc(.5rem + env(safe-area-inset-bottom));background:var(--theme-surface);border-block-start:1px solid var(--theme-border);grid-template-columns:repeat(3,minmax(0,1fr));gap:.5rem;display:grid;position:fixed;inset-block-end:0;inset-inline:0}.evidence-nav.svelte-1j55xyh button:where(.svelte-1j55xyh){text-overflow:ellipsis;min-block-size:44px;min-inline-size:0;overflow:hidden}@media (width<=24rem){.evidence-page.svelte-1j55xyh{padding:.5rem .5rem 7rem}.evidence-composer.svelte-1j55xyh{inset-inline:.5rem}}.filesystem-tree.svelte-6z3q4v{box-sizing:border-box;overscroll-behavior:contain;scrollbar-gutter:stable;border:1px solid var(--theme-border);border-radius:.6rem;max-block-size:min(22rem,48vh);inline-size:100%;max-inline-size:100%;padding:.35rem;display:grid;overflow:clip auto}.tree-row.svelte-6z3q4v{min-inline-size:0;align-items:stretch;padding-inline-start:min(calc(var(--tree-level) * .75rem), 4.5rem);display:flex}.disclosure.svelte-6z3q4v,.disclosure-spacer.svelte-6z3q4v{flex:0 0 44px;min-block-size:44px;inline-size:44px}.disclosure.svelte-6z3q4v{color:inherit;font:inherit;background:0 0;border:0;border-radius:.35rem;place-items:center;padding:0;font-size:1.25rem;font-weight:700;display:grid}.disclosure.svelte-6z3q4v:hover{background:var(--theme-control-hover)}.tree-item.svelte-6z3q4v{min-block-size:44px;min-inline-size:0;color:inherit;font:inherit;text-align:start;background:0 0;border:1px solid #0000;border-radius:.35rem;flex:auto;align-items:center;gap:.5rem;padding:.3rem .5rem;display:flex;overflow:hidden}.tree-item.svelte-6z3q4v:hover{background:var(--theme-control-hover)}.tree-item.selected.svelte-6z3q4v{color:var(--theme-control-pressed-contrast);background:var(--theme-control-pressed);border-color:var(--theme-accent);font-weight:650}.tree-item[aria-disabled=true].svelte-6z3q4v{opacity:.58}.tree-item.repository.svelte-6z3q4v{border-inline-start-width:3px}.selection-mark.svelte-6z3q4v{text-align:center;flex:0 0 1rem;inline-size:1rem}.node-copy.svelte-6z3q4v{flex:auto;min-inline-size:0;display:grid}.node-name.svelte-6z3q4v,.node-path.svelte-6z3q4v{text-overflow:ellipsis;white-space:nowrap;min-inline-size:0;overflow:hidden}.node-path.svelte-6z3q4v{opacity:.72;font-size:.75em;font-weight:400}.repository-badge.svelte-6z3q4v{border:1px solid;border-radius:999px;flex:none;padding:.1rem .35rem;font-size:.72em;font-weight:700;line-height:1.2}@media (width<=24rem){.filesystem-tree.svelte-6z3q4v{padding:.2rem}.tree-row.svelte-6z3q4v{padding-inline-start:min(calc(var(--tree-level) * .25rem), 1.5rem)}.tree-item.svelte-6z3q4v{gap:.35rem;padding-inline:.35rem}.repository-badge.svelte-6z3q4v{display:none}}@media (forced-colors:active){.tree-item.selected.svelte-6z3q4v,.tree-item.repository.svelte-6z3q4v,.repository-badge.svelte-6z3q4v{border-color:canvastext}}.evidence-shell.svelte-1d6w4ti{box-sizing:border-box;inline-size:min(100%,48rem);min-inline-size:0;margin-inline:auto;padding:1rem}.eyebrow.svelte-1d6w4ti{letter-spacing:.08em;text-transform:uppercase;margin:0;font-size:.8rem;font-weight:750}h1.svelte-1d6w4ti{margin-block:.25rem .5rem;font-size:clamp(1.35rem,6vw,2rem);line-height:1.15}.instructions.svelte-1d6w4ti{max-inline-size:42rem;margin-block:0 1rem}@media (width<=24rem){.evidence-shell.svelte-1d6w4ti{padding:.5rem}}.git-view.svelte-pudr3t{gap:1.5rem;inline-size:100%;min-inline-size:0;display:grid}.git-tree.svelte-pudr3t,.repository-details.svelte-pudr3t{min-inline-size:0}.section-heading.svelte-pudr3t h3:where(.svelte-pudr3t),.repository-details.svelte-pudr3t h3:where(.svelte-pudr3t){margin-block:0 .35rem}.section-heading.svelte-pudr3t p:where(.svelte-pudr3t){color:var(--theme-text-muted);margin-block:0 .75rem}.clone-form.svelte-pudr3t{gap:.35rem;min-inline-size:0;display:grid}.clone-controls.svelte-pudr3t{grid-template-columns:minmax(10rem,.45fr) minmax(0,1fr) auto;align-items:end;gap:.5rem;display:grid}.clone-field.svelte-pudr3t{gap:.35rem;min-inline-size:0;display:grid}.field-label.svelte-pudr3t{font-weight:600}.clone-destination.svelte-pudr3t output:where(.svelte-pudr3t){overflow-wrap:anywhere;border:1px solid var(--theme-border);border-radius:.35rem;min-block-size:2.75rem;padding:.65rem .75rem}.clone-controls.svelte-pudr3t button:where(.svelte-pudr3t){min-inline-size:5.75rem}.clone-form.svelte-pudr3t p:where(.svelte-pudr3t){color:var(--theme-text-muted);margin:0;font-size:.875rem}.clone-status.svelte-pudr3t{font-weight:600;color:var(--theme-info)!important}.git-overview.svelte-pudr3t{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:1rem;display:grid}.git-status.svelte-pudr3t p:where(.svelte-pudr3t){margin-block:.5rem}.git-actions.svelte-pudr3t{gap:.5rem;display:grid}.git-actions.svelte-pudr3t button:where(.svelte-pudr3t){min-inline-size:6rem}.commit-history.svelte-pudr3t{margin-block-start:2rem}.commit-history.svelte-pudr3t h3:where(.svelte-pudr3t){margin-block-end:.75rem}.commit-list.svelte-pudr3t{gap:.5rem;margin:0;padding:0;list-style:none;display:grid}.commit-entry.svelte-pudr3t{border-block-end:1px solid var(--theme-border);gap:.35rem;min-inline-size:0;padding:.8rem 0;display:grid}.commit-subject.svelte-pudr3t,.commit-meta.svelte-pudr3t{gap:.65rem;min-inline-size:0;display:flex}.commit-subject.svelte-pudr3t{overflow-wrap:anywhere;align-items:baseline;font-weight:600}.commit-subject.svelte-pudr3t code:where(.svelte-pudr3t){color:var(--theme-text-muted);flex:none;font-size:.875em}.commit-meta.svelte-pudr3t{color:var(--theme-text-muted);flex-wrap:wrap;justify-content:space-between;font-size:.875rem}.commit-meta.svelte-pudr3t time:where(.svelte-pudr3t){overflow-wrap:anywhere;min-inline-size:0;max-inline-size:100%}@media (width<=28rem){.clone-controls.svelte-pudr3t{grid-template-columns:1fr}.clone-controls.svelte-pudr3t button:where(.svelte-pudr3t){inline-size:100%}}.plan-progress.svelte-hmxg46{gap:.5rem;min-inline-size:0;display:grid}.progress-heading.svelte-hmxg46{color:var(--theme-text-muted);font-variant-numeric:tabular-nums;justify-content:flex-end;font-size:.875rem;display:flex}progress.svelte-hmxg46{block-size:.5rem;inline-size:100%;accent-color:var(--theme-accent)}.step-markers.svelte-hmxg46{flex-wrap:wrap;gap:.25rem;margin:0;padding:0;list-style:none;display:flex}.step-markers.svelte-hmxg46 li:where(.svelte-hmxg46){border:1px solid var(--theme-border);border-radius:var(--theme-radius);min-inline-size:0;color:var(--theme-text-muted);background:var(--theme-surface);align-items:center;gap:.25rem;padding:.25rem .5rem;font-size:.75rem;line-height:1.2;display:inline-flex}.step-markers.svelte-hmxg46 li[data-state=DONE]:where(.svelte-hmxg46){color:var(--theme-control-pressed-contrast);background:var(--theme-control-pressed);border-color:var(--theme-control-pressed)}.step-markers.svelte-hmxg46 li[data-state=WIP]:where(.svelte-hmxg46){color:var(--theme-text);border-color:var(--theme-accent);font-weight:700}.step-markers.svelte-hmxg46 li[aria-current=step]:where(.svelte-hmxg46){outline:2px solid var(--theme-accent);outline-offset:1px}.position.svelte-hmxg46{font-variant-numeric:tabular-nums;font-weight:700}.compact.svelte-hmxg46{gap:.25rem}.compact.svelte-hmxg46 .progress-heading:where(.svelte-hmxg46){font-size:.6875rem}.compact.svelte-hmxg46 progress:where(.svelte-hmxg46){block-size:.375rem}.wip-steps.svelte-hmxg46{gap:.35rem;margin:0;padding:0;list-style:none;display:grid}.wip-steps.svelte-hmxg46 li:where(.svelte-hmxg46){grid-template-columns:max-content minmax(0,1fr);align-items:baseline;gap:.125rem .4rem;min-inline-size:0;font-size:.625rem;display:grid}.wip-position.svelte-hmxg46{border:1px solid var(--theme-accent);font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;grid-row:1/span 2;align-self:start;padding:.125rem .25rem;font-weight:700;line-height:1.2}.wip-title.svelte-hmxg46{overflow-wrap:anywhere;min-inline-size:0;color:var(--theme-text);font-weight:700}.wip-effort.svelte-hmxg46{color:var(--theme-text-muted)}.plan.svelte-3rmyvg{overflow-wrap:anywhere;min-inline-size:0}header.svelte-3rmyvg{justify-content:space-between;align-items:start;gap:1rem;display:flex}h2.svelte-3rmyvg,p.svelte-3rmyvg{margin-block:.4rem}ol.svelte-3rmyvg{padding-inline-start:1.25rem}details.svelte-3rmyvg{margin-block:.5rem}summary.svelte-3rmyvg{cursor:pointer;gap:.2rem;display:grid}.measurement.svelte-3rmyvg{color:var(--muted,currentColor);font-variant-numeric:tabular-nums}.position.svelte-3rmyvg{color:var(--theme-text-muted,currentColor);font-variant-numeric:tabular-nums}.metadata.svelte-3rmyvg{gap:.25rem;display:grid}.metadata.svelte-3rmyvg div:where(.svelte-3rmyvg){gap:.5rem;display:flex}.metadata.svelte-3rmyvg dd:where(.svelte-3rmyvg){margin:0}.close.svelte-3rmyvg{flex:none;block-size:2.75rem;inline-size:2.75rem;font-size:1.5rem}button.svelte-3rmyvg:focus-visible,summary.svelte-3rmyvg:focus-visible{outline-offset:2px;outline:3px solid}@media (prefers-reduced-motion:reduce){.svelte-3rmyvg{scroll-behavior:auto}}.org-document.svelte-h7gaqo{overflow-wrap:anywhere;gap:.85rem;min-inline-size:0;display:grid}header.svelte-h7gaqo,.section-heading.svelte-h7gaqo{justify-content:space-between;align-items:flex-start;gap:.65rem;display:flex}header.svelte-h7gaqo h2:where(.svelte-h7gaqo),.section-heading.svelte-h7gaqo :is(h3:where(.svelte-h7gaqo),h4:where(.svelte-h7gaqo)),p.svelte-h7gaqo,dl.svelte-h7gaqo,dd.svelte-h7gaqo{margin:0}code.svelte-h7gaqo{font:inherit;color:var(--theme-text-muted)}.close.svelte-h7gaqo{flex:none;min-inline-size:2.5rem;font-size:1.35rem;line-height:1}.metadata.svelte-h7gaqo,.descriptions.svelte-h7gaqo,.properties.svelte-h7gaqo dl:where(.svelte-h7gaqo){gap:.4rem;display:grid}.metadata.svelte-h7gaqo div:where(.svelte-h7gaqo),.descriptions.svelte-h7gaqo div:where(.svelte-h7gaqo),.properties.svelte-h7gaqo dl:where(.svelte-h7gaqo) div:where(.svelte-h7gaqo){grid-template-columns:minmax(6rem,.3fr) minmax(0,1fr);gap:.65rem;display:grid}dt.svelte-h7gaqo{font-weight:700}.sections.svelte-h7gaqo{gap:.65rem;display:grid}.org-section.svelte-h7gaqo{background:color-mix(in srgb, var(--theme-surface) 82%, transparent);border:1px solid var(--theme-border);border-inline-start:.3rem solid var(--theme-accent);border-radius:.65rem;gap:.55rem;margin-inline-start:min(calc(var(--org-depth) * .8rem), 2.4rem);padding:.8rem;display:grid}.section-heading.svelte-h7gaqo{flex-wrap:wrap;justify-content:flex-start}.section-heading.svelte-h7gaqo :is(h3:where(.svelte-h7gaqo),h4:where(.svelte-h7gaqo)){flex:14rem}.state.svelte-h7gaqo,.priority.svelte-h7gaqo{border:1px solid;border-radius:999px;padding:.15rem .45rem;font-size:.8rem;font-weight:700}.state-done.svelte-h7gaqo{color:var(--theme-success)}.state-wip.svelte-h7gaqo{color:var(--theme-accent)}.list-item.svelte-h7gaqo{padding-inline-start:.75rem}.properties.svelte-h7gaqo summary:where(.svelte-h7gaqo){cursor:pointer;font-weight:700}.properties.svelte-h7gaqo dl:where(.svelte-h7gaqo){margin-block-start:.5rem}button.svelte-h7gaqo:focus-visible,summary.svelte-h7gaqo:focus-visible{outline-offset:2px;outline:3px solid}@media (width<=32rem){.metadata.svelte-h7gaqo div:where(.svelte-h7gaqo),.descriptions.svelte-h7gaqo div:where(.svelte-h7gaqo),.properties.svelte-h7gaqo dl:where(.svelte-h7gaqo) div:where(.svelte-h7gaqo){grid-template-columns:1fr;gap:.1rem}.org-section.svelte-h7gaqo{margin-inline-start:min(calc(var(--org-depth) * .35rem), 1rem)}}.plans.svelte-x2ko9l{overflow-wrap:anywhere;min-inline-size:0}h2.svelte-x2ko9l{margin-block:.4rem}.scope.svelte-x2ko9l{margin-block:0 .75rem}ul.svelte-x2ko9l{gap:.5rem;margin:0;padding:0;list-style:none;display:grid}.plans.svelte-x2ko9l button:where(.svelte-x2ko9l){text-align:start;gap:.2rem;min-block-size:2.75rem;inline-size:100%;padding:.75rem;display:grid}button.svelte-x2ko9l:focus-visible{outline-offset:2px;outline:3px solid}code.svelte-x2ko9l{font:inherit}.session-list.svelte-hxb22h{gap:1rem;inline-size:100%;margin-block:0 1.5rem;padding-inline:0;list-style:none;display:grid}.current-session.svelte-hxb22h{outline:2px solid var(--theme-accent);outline-offset:2px}.managed-session.svelte-hxb22h{box-sizing:border-box;border:1px solid var(--theme-border);border-radius:.5rem;grid-template-columns:minmax(0,min(6rem,32%)) minmax(0,1fr);align-items:start;gap:.75rem;inline-size:100%;padding:.75rem;display:grid}.open-session.svelte-hxb22h{border-color:var(--theme-accent);background:var(--theme-control-hover)}.session-details.svelte-hxb22h{min-inline-size:0}.workspace-path.svelte-hxb22h{overflow-wrap:anywhere}.profile-badge.svelte-hxb22h{background:var(--theme-control-pressed);color:var(--theme-control-pressed-contrast);overflow-wrap:anywhere;border-radius:999px;margin-block-start:.35rem;padding:.15rem .4rem;font-size:.875rem;display:inline-block}.org-plan-metadata.svelte-hxb22h{gap:.125rem;margin-block-start:.35rem;display:grid}.org-plan-title.svelte-hxb22h{font-weight:600}.org-plan-filename.svelte-hxb22h{overflow-wrap:anywhere;color:var(--theme-text-muted)}.session-actions.svelte-hxb22h{flex-direction:column;gap:.5rem;min-inline-size:0;display:flex}.session-actions.svelte-hxb22h>*{inline-size:100%}.session-plan-progress.svelte-hxb22h{min-inline-size:0;margin-block-start:.5rem}.recent-session.svelte-hxb22h{grid-template-columns:minmax(0,1fr) max-content;align-items:start;gap:.75rem;display:grid}.session-base.svelte-hxb22h{gap:.65rem;min-inline-size:0;margin-block:1rem;display:grid}.session-base-heading.svelte-hxb22h h3:where(.svelte-hxb22h),.session-base-heading.svelte-hxb22h p:where(.svelte-hxb22h){margin:0}.session-base-heading.svelte-hxb22h p:where(.svelte-hxb22h){margin-block-start:.25rem}.session-settings.svelte-hxb22h{gap:.5rem;min-inline-size:0;margin-block-end:.75rem;display:grid}.session-setting-labels.svelte-hxb22h,.session-setting-controls.svelte-hxb22h{grid-template-columns:repeat(3,minmax(0,1fr));gap:.5rem;min-inline-size:0;display:grid}.session-setting-labels.svelte-hxb22h label:where(.svelte-hxb22h){overflow-wrap:anywhere;min-inline-size:0}.session-setting-controls.svelte-hxb22h select:where(.svelte-hxb22h){text-overflow:ellipsis;inline-size:100%;min-inline-size:0;max-inline-size:100%;overflow:hidden}.session-secondary-actions.svelte-hxb22h,.model-control.svelte-hxb22h{align-items:center;gap:.5rem;min-inline-size:0;display:flex}.session-secondary-actions.svelte-hxb22h{flex-wrap:wrap}.model-control.svelte-hxb22h{margin-inline-start:auto}.skills-profile-error.svelte-hxb22h{color:var(--theme-error);margin:0;font-size:.875rem}@media (width<=28rem){.model-control.svelte-hxb22h{margin-inline-start:0}}.skills-view.svelte-dg6sjj{min-inline-size:0;padding:1rem max(1rem, env(safe-area-inset-right)) calc(5rem + env(safe-area-inset-bottom)) max(1rem, env(safe-area-inset-left))}.intro.svelte-dg6sjj,.save-intent.svelte-dg6sjj,.summary.svelte-dg6sjj{max-inline-size:70ch}form.svelte-dg6sjj,.field-grid.svelte-dg6sjj{gap:.65rem;display:grid}.field-grid.svelte-dg6sjj{grid-template-columns:minmax(0,1fr)}label.svelte-dg6sjj{font-weight:650}select.svelte-dg6sjj,input.svelte-dg6sjj,button.svelte-dg6sjj{box-sizing:border-box;min-block-size:3rem;inline-size:100%;font:inherit}dialog.svelte-dg6sjj{max-inline-size:min(100% - 2rem,32rem)}.dialog-actions.svelte-dg6sjj{gap:.65rem;display:grid}input.svelte-dg6sjj,select.svelte-dg6sjj{padding-inline:.7rem;font-size:1rem}button.svelte-dg6sjj{padding-inline:1rem}.profile-actions.svelte-dg6sjj{grid-template-columns:repeat(2,minmax(0,1fr));gap:.65rem;display:grid}.skills-toolbar.svelte-dg6sjj{flex-wrap:wrap;align-items:center;gap:.65rem;margin-block:1rem;display:flex}.refresh-skills.svelte-dg6sjj{flex:none;min-block-size:2.25rem;inline-size:auto;padding-inline:.65rem}.refresh-skills.svelte-dg6sjj span:where(.svelte-dg6sjj):first-child{font-size:1.2em;line-height:1}.summary.svelte-dg6sjj{overflow-wrap:anywhere;min-inline-size:0;margin:0}.notice.svelte-dg6sjj{border-inline-start:.3rem solid var(--theme-warning);color:var(--theme-warning);padding-inline-start:.7rem}.error.svelte-dg6sjj{border-inline-start:.3rem solid var(--theme-error);color:var(--theme-error);padding-inline-start:.7rem}.skill-list.svelte-dg6sjj{gap:.75rem;padding:0;list-style:none;display:grid}.skill-card.svelte-dg6sjj{border:1px solid var(--theme-border);border-radius:.5rem;min-inline-size:0;padding:.75rem;scroll-margin-block:1rem}.skill-toggle.svelte-dg6sjj{flex-wrap:wrap;align-items:center;gap:.65rem;min-block-size:3rem;display:flex}.skill-toggle.svelte-dg6sjj>span:where(.svelte-dg6sjj){overflow-wrap:anywhere;min-inline-size:0}.skill-toggle.svelte-dg6sjj input:where(.svelte-dg6sjj){flex:none;min-block-size:1.25rem;inline-size:1.25rem}.state.svelte-dg6sjj{margin-inline-start:auto;font-weight:500}.skill-details.svelte-dg6sjj{overflow-wrap:anywhere;padding-inline-start:1.9rem}.skill-details.svelte-dg6sjj>:where(.svelte-dg6sjj):first-child{margin-block-start:.25rem}.skill-details.svelte-dg6sjj>:where(.svelte-dg6sjj):last-child{margin-block-end:0}dl.svelte-dg6sjj{grid-template-columns:minmax(7rem,auto) minmax(0,1fr);gap:.45rem .75rem;display:grid}dt.svelte-dg6sjj{font-weight:650}dd.svelte-dg6sjj{min-inline-size:0;margin:0}dd.svelte-dg6sjj ul:where(.svelte-dg6sjj){margin:0;padding-inline-start:1.25rem}.path.svelte-dg6sjj{overflow-wrap:anywhere}.svelte-dg6sjj:where(button:where(.svelte-dg6sjj),input:where(.svelte-dg6sjj),select:where(.svelte-dg6sjj)):focus-visible{outline:3px solid var(--theme-focus);outline-offset:2px}@media (width>=42rem){.field-grid.svelte-dg6sjj{grid-template-columns:minmax(10rem,1fr) minmax(0,2fr);align-items:center}}@media (width<=30rem){dl.svelte-dg6sjj{grid-template-columns:1fr;gap:.2rem}}.devices.svelte-1nygetn{max-inline-size:48rem;color:var(--theme-text);margin:auto;padding:1rem}.devices.svelte-1nygetn header:where(.svelte-1nygetn){align-items:center;gap:1rem;display:flex}.devices.svelte-1nygetn h1:where(.svelte-1nygetn),.devices.svelte-1nygetn h2:where(.svelte-1nygetn){font-family:var(--theme-font-display)}.devices.svelte-1nygetn ul:where(.svelte-1nygetn){padding:0;list-style:none}.devices.svelte-1nygetn li:where(.svelte-1nygetn),section.svelte-1nygetn{background:var(--theme-surface);border:1px solid var(--theme-border);border-radius:var(--theme-radius);box-shadow:0 .25rem .75rem var(--theme-shadow);margin-block:1rem;padding:1rem}.devices.svelte-1nygetn form:where(.svelte-1nygetn){gap:.65rem;display:grid}.devices.svelte-1nygetn p:where(.svelte-1nygetn){overflow-wrap:anywhere;margin:0}.devices.svelte-1nygetn input:where(.svelte-1nygetn),.devices.svelte-1nygetn textarea:where(.svelte-1nygetn),.devices.svelte-1nygetn button:where(.svelte-1nygetn){min-block-size:44px;font:inherit}.devices.svelte-1nygetn input:where(.svelte-1nygetn),.devices.svelte-1nygetn textarea:where(.svelte-1nygetn){min-inline-size:0;padding:.45rem}.devices.svelte-1nygetn textarea:where(.svelte-1nygetn){box-sizing:border-box;overflow-wrap:anywhere;resize:vertical;inline-size:100%;font-family:var(--theme-font-code)}.devices.svelte-1nygetn .actions:where(.svelte-1nygetn){flex-wrap:wrap;gap:.5rem;display:flex}.devices.svelte-1nygetn .actions:where(.svelte-1nygetn) button:where(.svelte-1nygetn){flex:11rem}.devices.svelte-1nygetn img:where(.svelte-1nygetn){background:var(--theme-canvas);inline-size:12rem;max-inline-size:100%;margin-block:.75rem;padding:.5rem;display:block}.feedback.svelte-1nygetn{color:var(--theme-error);font-weight:700}dialog.svelte-1nygetn{max-inline-size:min(32rem,100% - 2rem);color:var(--theme-text);background:var(--theme-surface);border:1px solid var(--theme-border);border-radius:var(--theme-radius);box-shadow:0 .5rem 1.5rem var(--theme-shadow)}dialog.svelte-1nygetn h2:where(.svelte-1nygetn){font-family:var(--theme-font-display)}dialog.svelte-1nygetn form:where(.svelte-1nygetn){flex-wrap:wrap;gap:.5rem;display:flex}@media (forced-colors:active){.devices.svelte-1nygetn li:where(.svelte-1nygetn),section.svelte-1nygetn,dialog.svelte-1nygetn{border-color:canvastext}}@media (prefers-reduced-motion:reduce){.svelte-1nygetn{transition-duration:.01ms!important;animation-duration:.01ms!important}}dialog.svelte-eu5bnq{box-sizing:border-box;max-block-size:calc(100dvh - 1rem);inline-size:min(52rem,100vw - 1rem);max-inline-size:none;color:var(--theme-text);background:var(--theme-surface);border:1px solid var(--theme-border);border-radius:var(--theme-radius);box-shadow:0 .75rem 2rem var(--theme-shadow);padding:0}dialog.svelte-eu5bnq::backdrop{background:color-mix(in srgb, var(--theme-canvas) 70%, transparent)}.scratchpad-shell.svelte-eu5bnq{box-sizing:border-box;min-block-size:min(42rem,100dvh - 1rem);max-block-size:calc(100dvh - 1rem);padding:max(1rem, env(safe-area-inset-top)) max(1rem, env(safe-area-inset-right)) max(1rem, env(safe-area-inset-bottom)) max(1rem, env(safe-area-inset-left));grid-template-rows:auto auto minmax(12rem,1fr) auto;gap:.75rem;display:grid}header.svelte-eu5bnq{justify-content:space-between;align-items:flex-start;gap:1rem;display:flex}h2.svelte-eu5bnq,p.svelte-eu5bnq{margin:0}h2.svelte-eu5bnq{font-family:var(--theme-font-display)}header.svelte-eu5bnq p:where(.svelte-eu5bnq){color:var(--theme-text-muted)}label.svelte-eu5bnq{font-weight:700}textarea.svelte-eu5bnq{box-sizing:border-box;resize:none;min-block-size:12rem;inline-size:100%;min-inline-size:0;color:var(--theme-text);background:var(--theme-canvas);border:1px solid var(--theme-border);border-radius:calc(var(--theme-radius) / 2);font:1rem/1.45 var(--theme-font-code);tab-size:2;padding:.75rem}button.svelte-eu5bnq{min-block-size:44px;font:inherit}.close.svelte-eu5bnq{inline-size:44px;color:inherit;background:0 0;border:0;flex:none;padding:0;font-size:2rem;line-height:1}.actions.svelte-eu5bnq{flex-wrap:wrap;gap:.5rem;display:flex}.actions.svelte-eu5bnq button:where(.svelte-eu5bnq){flex:7rem}.danger.svelte-eu5bnq{color:var(--theme-error)}.clear-confirmation.svelte-eu5bnq{border:1px solid var(--theme-error);border-radius:calc(var(--theme-radius) / 2);gap:.5rem;padding:.75rem;display:grid}.feedback.svelte-eu5bnq{color:var(--theme-error);font-weight:700}@media (width<=32rem){dialog.svelte-eu5bnq{border-inline:0;border-radius:0;max-block-size:100dvh;inline-size:100vw}.scratchpad-shell.svelte-eu5bnq{min-block-size:100dvh;max-block-size:100dvh}}@media (forced-colors:active){dialog.svelte-eu5bnq,textarea.svelte-eu5bnq,.clear-confirmation.svelte-eu5bnq{border-color:canvastext}}.file-tree.svelte-am0nvt{gap:.2rem;min-inline-size:0;display:grid;overflow-x:clip}.tree-row.svelte-am0nvt{min-inline-size:0;flex-wrap:wrap;padding-inline-start:min(calc((var(--level) - 1) * .75rem), 4rem);display:flex}button.svelte-am0nvt{overflow-wrap:anywhere;min-block-size:2.75rem;min-inline-size:2.75rem}.treeitem.svelte-am0nvt{text-align:start;overflow-wrap:anywhere;flex:1;min-block-size:2.75rem;min-inline-size:2.75rem}.tree-label.svelte-am0nvt{flex:1}.disclosure.svelte-am0nvt{flex:0 0 2.75rem}.unsupported.svelte-am0nvt{color:var(--theme-text-muted);font-size:.875rem}dialog.svelte-qx7639{box-sizing:border-box;border:1px solid var(--theme-border);max-block-size:100dvh;inline-size:min(100%,52rem);max-inline-size:100%;color:var(--theme-text);background:var(--theme-surface);border-radius:.75rem;padding:0;overflow-x:hidden}dialog.svelte-qx7639::backdrop{background:#0000008c}.file-browser-shell.svelte-qx7639{gap:1rem;max-block-size:calc(100dvh - 1rem);min-inline-size:0;padding:1rem;display:grid;overflow:hidden auto}header.svelte-qx7639{justify-content:space-between;align-items:start;gap:1rem;display:flex}header.svelte-qx7639>div:where(.svelte-qx7639),.picker.svelte-qx7639{min-inline-size:0}h2.svelte-qx7639,p.svelte-qx7639{overflow-wrap:anywhere;margin:0}header.svelte-qx7639 p:where(.svelte-qx7639){color:var(--theme-text-muted);margin-block-start:.35rem}button.svelte-qx7639{min-block-size:2.75rem;min-inline-size:2.75rem}.close.svelte-qx7639{font-size:1.5rem;line-height:1}.browser-actions.svelte-qx7639{flex-wrap:wrap;gap:.5rem;display:flex}.upload-actions.svelte-qx7639{gap:.5rem;display:grid}.upload-actions.svelte-qx7639 p:where(.svelte-qx7639){color:var(--theme-text-muted)}.visually-hidden.svelte-qx7639{clip:rect(0 0 0 0);white-space:nowrap;block-size:1px;inline-size:1px;position:absolute;overflow:hidden}.picker.svelte-qx7639{border:1px solid var(--theme-border);border-radius:.5rem;gap:.5rem;padding:.75rem;display:grid}@media (width<=40rem){dialog.svelte-qx7639{border-radius:0;min-block-size:100dvh;inline-size:100%}.file-browser-shell.svelte-qx7639{max-block-size:100dvh}}.chat-view.svelte-1d2e8zz{margin-inline:calc(.25rem - var(--page-inline-padding))}.detached-chat-header.svelte-1d2e8zz{z-index:2;box-sizing:border-box;inline-size:100vw;margin:calc(-1rem - env(safe-area-inset-top)) calc(50% - 50vw) 1.5rem;padding:calc(1rem + env(safe-area-inset-top)) max(1rem, env(safe-area-inset-right)) .75rem max(1rem, env(safe-area-inset-left));background:color-mix(in srgb, var(--theme-page) 88%, transparent);border-block-end:1px solid color-mix(in srgb, var(--theme-border) 72%, transparent);box-shadow:0 .35rem 1rem color-mix(in srgb, var(--theme-shadow) 28%, transparent);-webkit-backdrop-filter:blur(.75rem)saturate(1.2);backdrop-filter:blur(.75rem)saturate(1.2);justify-content:space-between;align-items:center;gap:1rem;display:flex;position:sticky;inset-block-start:0}.detached-chat-context.svelte-1d2e8zz{align-items:baseline;gap:.75rem;min-inline-size:0;display:flex}.detached-chat-context.svelte-1d2e8zz span:where(.svelte-1d2e8zz){font-family:var(--theme-font-display);flex:none;font-weight:700}.detached-chat-context.svelte-1d2e8zz strong:where(.svelte-1d2e8zz){text-overflow:ellipsis;white-space:nowrap;min-inline-size:0;font-size:.875rem;font-weight:500;overflow:hidden}.detached-chat-model.svelte-1d2e8zz{color:var(--theme-text-muted);font-family:var(--theme-font-code);flex:none;font-size:.75rem}main.svelte-1d2e8zz:has(.detached-chat-header:where(.svelte-1d2e8zz)){padding-block-end:max(1rem, env(safe-area-inset-bottom))}main.svelte-1d2e8zz:has(.detached-chat-header:where(.svelte-1d2e8zz)) .chat-tail:where(.svelte-1d2e8zz){scroll-margin-block-end:max(1rem, env(safe-area-inset-bottom))}@media (width<=32rem){.detached-chat-model.svelte-1d2e8zz{display:none}}.chat-tail.svelte-1d2e8zz{block-size:1px;scroll-margin-block-end:var(--bottom-navigation-clearance)}.chat-controls.svelte-1d2e8zz{flex-wrap:nowrap;align-items:flex-start;gap:.35rem;min-inline-size:0;margin-block-start:.625rem;display:flex}.chat-controls.svelte-1d2e8zz>*{flex:1 1 0;min-inline-size:0}.swipe-surface.svelte-1d2e8zz{touch-action:pan-y}.evidence-mode.svelte-1d2e8zz{box-sizing:border-box;inline-size:100%;min-inline-size:0;padding:0}.session-profile-manager-header.svelte-1d2e8zz{box-sizing:border-box;inline-size:100%;min-inline-size:0;padding-inline:max(1rem, env(safe-area-inset-left)) max(1rem, env(safe-area-inset-right));justify-content:space-between;align-items:safe center;gap:1rem;display:flex}.session-profile-manager-header.svelte-1d2e8zz h2:where(.svelte-1d2e8zz){overflow-wrap:anywhere;min-inline-size:0;margin:0}.close-profile-manager.svelte-1d2e8zz{min-block-size:2.5rem;inline-size:2.5rem;color:inherit;background:0 0;border:0;flex:none;padding:0;font-size:2rem;line-height:1}.enrollment.svelte-1c5qcm6{box-sizing:border-box;inline-size:100%;max-inline-size:none;background:var(--theme-page);min-height:100dvh;color:var(--theme-text);place-items:center;margin:0;padding:1rem;display:grid}.card.svelte-1c5qcm6{box-sizing:border-box;background:var(--theme-surface);border:1px solid var(--theme-border);border-radius:calc(var(--theme-radius) * 2);width:min(100%,42rem);box-shadow:0 .5rem 1.5rem var(--theme-shadow);padding:clamp(1.25rem,5vw,3rem)}.brand.svelte-1c5qcm6{color:var(--theme-info);font-family:var(--theme-font-display);letter-spacing:.08em;text-transform:uppercase;font-weight:700}h1.svelte-1c5qcm6{font-family:var(--theme-font-display);margin-block:.25rem 1rem;font-size:clamp(1.8rem,7vw,3rem)}.warning.svelte-1c5qcm6{border-left:.3rem solid var(--theme-warning);background:var(--theme-surface-subtle);padding:1rem}label.svelte-1c5qcm6,input.svelte-1c5qcm6{box-sizing:border-box;width:100%;display:block}label.svelte-1c5qcm6{margin-top:1.5rem;font-weight:700}input.svelte-1c5qcm6,button.svelte-1c5qcm6{min-height:44px;font:inherit}input.svelte-1c5qcm6{margin-top:.4rem;padding:.6rem}button.svelte-1c5qcm6{cursor:pointer;border-radius:.4rem;margin-top:1rem;padding:.55rem 1rem}.authorize.svelte-1c5qcm6{background:var(--theme-accent);width:100%;color:var(--theme-accent-contrast);border-color:var(--theme-accent);font-weight:700}.feedback.svelte-1c5qcm6{color:var(--theme-info);font-weight:700}.error.svelte-1c5qcm6{color:var(--theme-error);font-weight:700}.handoff.svelte-1c5qcm6{border-top:1px solid var(--theme-border);grid-template-columns:minmax(0,1fr);gap:1rem;margin-top:2rem;padding-top:1.5rem;display:grid}.handoff.svelte-1c5qcm6 img:where(.svelte-1c5qcm6){background:var(--theme-canvas);width:12rem;max-width:100%;padding:.5rem}a.svelte-1c5qcm6{color:var(--theme-info);overflow-wrap:anywhere}.copy.svelte-1c5qcm6{display:block}@media (width>=48rem){.handoff.svelte-1c5qcm6{grid-template-columns:12rem minmax(0,1fr);align-items:start}}@media (prefers-reduced-motion:reduce){.svelte-1c5qcm6,.svelte-1c5qcm6:before,.svelte-1c5qcm6:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important}}.login.svelte-1byekj9{box-sizing:border-box;inline-size:100%;max-inline-size:none;background:var(--theme-page);min-height:100dvh;color:var(--theme-text);place-items:center;margin:0;padding:1rem;display:grid}.card.svelte-1byekj9{box-sizing:border-box;background:var(--theme-surface);border:1px solid var(--theme-border);border-radius:calc(var(--theme-radius) * 2);width:min(100%,32rem);box-shadow:0 .5rem 1.5rem var(--theme-shadow);padding:clamp(1.25rem,5vw,3rem)}.brand.svelte-1byekj9{color:var(--theme-info);font-family:var(--theme-font-display);letter-spacing:.08em;text-transform:uppercase;font-weight:700}h1.svelte-1byekj9{font-family:var(--theme-font-display);margin-block:.25rem 1rem;font-size:clamp(1.8rem,7vw,3rem)}.sign-in.svelte-1byekj9{border-radius:var(--theme-radius);background:var(--theme-accent);width:100%;min-height:44px;color:var(--theme-accent-contrast);border-color:var(--theme-accent);font:inherit;margin-top:1rem;padding:.55rem 1rem;font-weight:700}.error.svelte-1byekj9{color:var(--theme-error);font-weight:700}@media (prefers-reduced-motion:reduce){.svelte-1byekj9,.svelte-1byekj9:before,.svelte-1byekj9:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important}}.auth-gate.svelte-y74n0s{max-width:32rem;color:var(--theme-text);background:var(--theme-surface);border:1px solid var(--theme-border);border-radius:var(--theme-radius);box-shadow:0 .5rem 1.5rem var(--theme-shadow);margin:12vh auto;padding:2rem}.auth-gate.svelte-y74n0s h1:where(.svelte-y74n0s){font-family:var(--theme-font-display)}button.svelte-y74n0s{margin-right:.75rem}@font-face{font-family:Syne;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/syne-greek-600-normal-BpFII5Ja.woff2)format("woff2"),url(/assets/syne-greek-600-normal-BJs4kvyH.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Syne;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/syne-latin-ext-600-normal-ZnizrDKU.woff2)format("woff2"),url(/assets/syne-latin-ext-600-normal-DEzBMW8B.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Syne;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/syne-latin-600-normal-BiwQbQXw.woff2)format("woff2"),url(/assets/syne-latin-600-normal-dRu9QuIh.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-cyrillic-ext-400-normal-C_uLvvQ5.woff2)format("woff2"),url(/assets/jetbrains-mono-cyrillic-ext-400-normal-Bh0R7Dhr.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2)format("woff2"),url(/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2)format("woff2"),url(/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-vietnamese-400-normal-ByoDsISC.woff2)format("woff2"),url(/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2)format("woff2"),url(/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2)format("woff2"),url(/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--theme-font-body:system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--theme-font-display:"Syne", var(--theme-font-body);--theme-font-code:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--theme-motion-fast:.12s;--theme-radius:.5rem}:root[data-theme=minimal-light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--theme-page:#fff;--theme-canvas:#fff;--theme-surface:#fff;--theme-surface-subtle:#f3f4f6;--theme-text:#171717;--theme-text-muted:#525252;--theme-border:#525252;--theme-focus:#005fcc;--theme-accent:#171717;--theme-accent-contrast:#fff;--theme-control-hover:#e5e7eb;--theme-control-pressed:#262626;--theme-control-pressed-contrast:#fff;--theme-control-disabled:#737373;--theme-success:#166534;--theme-warning:#854d0e;--theme-error:#b91c1c;--theme-info:#1d4ed8;--theme-code:#f3f4f6;--theme-shadow:#17171740}:root[data-theme=minimal-dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--theme-page:#171717;--theme-canvas:#171717;--theme-surface:#262626;--theme-surface-subtle:#404040;--theme-text:#fafafa;--theme-text-muted:#d4d4d4;--theme-border:#a3a3a3;--theme-focus:#93c5fd;--theme-accent:#fafafa;--theme-accent-contrast:#171717;--theme-control-hover:#404040;--theme-control-pressed:#fafafa;--theme-control-pressed-contrast:#171717;--theme-control-disabled:#a3a3a3;--theme-success:#86efac;--theme-warning:#fcd34d;--theme-error:#fca5a5;--theme-info:#93c5fd;--theme-code:#262626;--theme-shadow:#00000080}:root[data-theme=dyne-org]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--theme-page:#f4f0e8;--theme-canvas:#fffdf8;--theme-surface:#fffaf1;--theme-surface-subtle:#eee6d8;--theme-text:#171411;--theme-text-muted:#5f564c;--theme-border:#75695b;--theme-focus:#5e2ca5;--theme-accent:#c7460c;--theme-accent-contrast:#fffdf8;--theme-control-hover:#f4ddcf;--theme-control-pressed:#bd3d0d;--theme-control-pressed-contrast:#fffdf8;--theme-control-disabled:#93887b;--theme-success:#287a50;--theme-warning:#9a5a00;--theme-error:#b42318;--theme-info:#5e2ca5;--theme-code:#f1e9db;--theme-shadow:#17141138}:root{--bottom-navigation-clearance:calc(4rem + env(safe-area-inset-bottom));--sticky-header-clearance:calc(5rem + env(safe-area-inset-top));--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;font-family:var(--theme-font-body)}body{min-block-size:100dvh;color:var(--theme-text);background:var(--theme-page);accent-color:var(--theme-accent);margin:0}.visually-hidden{clip-path:inset(50%)!important;white-space:nowrap!important;border:0!important;block-size:1px!important;inline-size:1px!important;margin:-1px!important;padding:0!important;position:absolute!important;overflow:hidden!important}main{--page-inline-padding:1rem;box-sizing:border-box;min-block-size:100dvh;max-inline-size:42rem;padding:calc(1rem + env(safe-area-inset-top)) var(--page-inline-padding) calc(var(--bottom-navigation-clearance) + 1rem);margin-inline:auto}@media (width<=24rem){main{--page-inline-padding:.5rem}.bottom-navigation.bottom-navigation button{font-size:max(.453125rem,13px)}}.app-header{z-index:2;box-sizing:border-box;inline-size:100vw;margin:calc(-1rem - env(safe-area-inset-top)) calc(50% - 50vw) 1.5rem;padding:calc(1rem + env(safe-area-inset-top)) calc(var(--page-inline-padding) - .25rem) .75rem;background:var(--theme-page);background:color-mix(in srgb, var(--theme-page) 72%, transparent);-webkit-backdrop-filter:blur(.75rem)saturate(1.2);backdrop-filter:blur(.75rem)saturate(1.2);border-block-end:1px solid color-mix(in srgb, var(--theme-border) 72%, transparent);box-shadow:0 .35rem 1rem color-mix(in srgb, var(--theme-shadow) 28%, transparent);flex-wrap:nowrap;justify-content:space-between;align-items:center;gap:.5rem;display:flex;position:sticky;inset-block-start:0}.app-header [role=status]{overflow-wrap:anywhere;text-align:end;min-inline-size:0;margin:0}.brand{flex:none;align-items:center;gap:.4rem;display:flex}.header-actions{flex:none;align-items:center;gap:.25rem;margin-inline-start:auto;display:flex}.weekly-quota{font-variant-numeric:tabular-nums;white-space:nowrap;font-size:.875rem}.menu-trigger{min-block-size:44px;inline-size:44px;color:inherit;background:0 0;border:0;flex:none;place-items:center;padding:0;display:grid}.menu-lines{gap:.25rem;inline-size:1.25rem;display:grid}.menu-lines span{box-sizing:border-box;background:currentColor;block-size:1px;display:block}.menu-lines span:first-child,.menu-lines span:nth-child(2),.menu-lines span:last-child{block-size:2px}@media (width<=28rem){.app-header [role=status]{flex-basis:100%;margin-inline-start:0}}.brand-icon{block-size:2rem;inline-size:2rem}.brand-logotype{block-size:auto;inline-size:6.25rem}.dark-asset,:root[data-logo-tone=light] .light-asset{display:none}:root[data-logo-tone=light] .dark-asset{display:initial}.configuration-panel{box-sizing:border-box;overscroll-behavior:contain;max-block-size:calc(100dvh - 5.5rem);min-inline-size:min(13rem,100vw - 2rem);max-inline-size:calc(100vw - 2rem);color:var(--theme-text);background:var(--theme-surface);border:1px solid var(--theme-border);border-radius:var(--theme-radius);box-shadow:0 .5rem 1.5rem var(--theme-shadow);padding:.75rem;position:fixed;inset:4.5rem 1rem auto auto;overflow-y:auto}.configuration-logo{block-size:auto;inline-size:4.5rem;margin-block-end:.5rem;margin-inline-start:auto;display:block}.appearance-control{align-items:center;gap:.5rem;min-inline-size:0;display:flex}.appearance-control span{font-family:var(--theme-font-display);letter-spacing:-.08em;font-weight:700}.appearance-control select{field-sizing:content;flex:auto;min-block-size:2.25rem;inline-size:auto;min-inline-size:0;max-inline-size:100%;padding-inline:.5rem}.bottom-navigation{z-index:2;padding:.25rem calc(.375rem + env(safe-area-inset-right)) calc(.25rem + env(safe-area-inset-bottom)) calc(.375rem + env(safe-area-inset-left));background:var(--theme-surface);background:color-mix(in srgb, var(--theme-surface) 72%, transparent);-webkit-backdrop-filter:blur(.75rem)saturate(1.2);backdrop-filter:blur(.75rem)saturate(1.2);border-block-start:1px solid var(--theme-border);box-shadow:0 -.35rem 1rem color-mix(in srgb, var(--theme-shadow) 28%, transparent);grid-template-columns:repeat(4,minmax(0,1fr));gap:max(.03125rem,1px);display:grid;position:fixed;inset-block-end:0;inset-inline:0}.bottom-navigation button{text-overflow:clip;white-space:nowrap;min-inline-size:0;max-inline-size:100%;transition:color var(--theme-motion-fast) ease, background-color var(--theme-motion-fast) ease, box-shadow var(--theme-motion-fast) ease;padding-inline:0;font-size:max(.453125rem,18px);overflow:hidden}.bottom-navigation button:hover:not(:disabled){background:var(--theme-control-hover)}.bottom-navigation button:active:not(:disabled){background:var(--theme-control-pressed);color:var(--theme-control-pressed-contrast)}.bottom-navigation button[aria-pressed=true]{color:var(--theme-accent-contrast);background:var(--theme-accent);box-shadow:inset 0 .2rem 0 color-mix(in srgb, var(--theme-accent-contrast) 25%, transparent);font-weight:700}.bottom-navigation button:disabled{color:var(--theme-control-disabled);cursor:not-allowed;opacity:.65}@media (width<=30rem){.brand-logotype{display:none!important}}button{min-block-size:44px;font:inherit;color:var(--theme-text);background:var(--theme-surface);border:1px solid var(--theme-border);border-radius:var(--theme-radius);cursor:pointer}button:hover:not(:disabled){background:var(--theme-control-hover)}button:active:not(:disabled){background:var(--theme-control-pressed);color:var(--theme-control-pressed-contrast)}button:disabled{color:var(--theme-control-disabled);cursor:not-allowed}.git-view button{scroll-margin-block:var(--sticky-header-clearance) var(--bottom-navigation-clearance)}input,select,textarea{box-sizing:border-box;min-block-size:44px;inline-size:100%;font:inherit;color:var(--theme-text);background:var(--theme-surface);border:1px solid var(--theme-border);border-radius:var(--theme-radius);font-size:max(1rem,16px)}input::placeholder,textarea::placeholder{color:var(--theme-text-muted)}:focus-visible{outline:3px solid var(--theme-focus);outline-offset:3px}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important}}@media (forced-colors:active){button,input,select,textarea{border:1px solid canvastext}}
|
package/dist/client/index.html
CHANGED
|
@@ -16,8 +16,8 @@ SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
16
16
|
<link rel="icon" href="/icons/gestalt-mobile-192.png" />
|
|
17
17
|
<link rel="apple-touch-icon" href="/icons/gestalt-mobile-180.png" />
|
|
18
18
|
<title>Gestalt Mobile</title>
|
|
19
|
-
<script type="module" crossorigin src="/assets/index-
|
|
20
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
19
|
+
<script type="module" crossorigin src="/assets/index-CFw8G97O.js"></script>
|
|
20
|
+
<link rel="stylesheet" crossorigin href="/assets/index-D3wXcWGp.css">
|
|
21
21
|
</head>
|
|
22
22
|
<body>
|
|
23
23
|
<div id="app"></div>
|
|
@@ -49,6 +49,9 @@ function liveAppServer(handles) {
|
|
|
49
49
|
request: async (method, params) => {
|
|
50
50
|
handle.calls.push(method);
|
|
51
51
|
handle.requests.push({ method, params });
|
|
52
|
+
const overridden = await handle.respond?.(method, params);
|
|
53
|
+
if (overridden !== undefined)
|
|
54
|
+
return overridden;
|
|
52
55
|
if (method === 'thread/start')
|
|
53
56
|
return { thread: { id: `thread-${handles.length}` } };
|
|
54
57
|
if (method === 'turn/start')
|
|
@@ -363,7 +366,7 @@ describe('production composition', () => {
|
|
|
363
366
|
expect(messages.filter((message) => message.event.type === 'autopilot.updated').at(-1)?.event
|
|
364
367
|
.payload).toMatchObject({ enabled: true });
|
|
365
368
|
// This is production composition, not a coordinator fake: the scheduler reaches the
|
|
366
|
-
// real runtime adapter and can pass only
|
|
369
|
+
// real runtime adapter and can pass only policy-owned lifecycle context and an opaque ID.
|
|
367
370
|
await vi.waitFor(() => expect(handles.at(-1)?.calls.filter((call) => call === 'turn/start')).toHaveLength(1), { timeout: 2_500 });
|
|
368
371
|
const automaticStart = handles.at(-1)?.requests.find((call) => call.method === 'turn/start');
|
|
369
372
|
expect(automaticStart?.params).toEqual({
|
|
@@ -371,7 +374,7 @@ describe('production composition', () => {
|
|
|
371
374
|
input: [
|
|
372
375
|
{
|
|
373
376
|
type: 'text',
|
|
374
|
-
text: AUTOPILOT_CONTINUATION_PROMPT
|
|
377
|
+
text: `${AUTOPILOT_CONTINUATION_PROMPT} Launch task_name l1 for canonical L1; retain the canonical label in status and review output.`,
|
|
375
378
|
text_elements: [],
|
|
376
379
|
},
|
|
377
380
|
],
|
|
@@ -556,7 +559,7 @@ describe('production composition', () => {
|
|
|
556
559
|
expect(events.count).toBe(1);
|
|
557
560
|
await fixture.app.close();
|
|
558
561
|
});
|
|
559
|
-
it('production restart unexplained issued
|
|
562
|
+
it('production restart keeps unexplained issued state supervised while persisted activeTurn records one started audit without replay', async () => {
|
|
560
563
|
let coordinator;
|
|
561
564
|
const fixture = await createProductionAutopilotFixture({
|
|
562
565
|
onAutopilotCoordinator: (value) => {
|
|
@@ -577,11 +580,11 @@ describe('production composition', () => {
|
|
|
577
580
|
database.close();
|
|
578
581
|
coordinator.restore(fixture.sessionId);
|
|
579
582
|
await vi.waitFor(async () => expect((await fixture.app.inject(`/api/sessions/${fixture.sessionId}`)).json()).toMatchObject({
|
|
580
|
-
autopilot: { enabled:
|
|
583
|
+
autopilot: { enabled: true, state: 'monitoring', reason: 'reconcileFailed' },
|
|
581
584
|
}));
|
|
582
585
|
expect(fixture.handles.flatMap((handle) => handle.calls)).not.toContain('turn/start');
|
|
583
|
-
//
|
|
584
|
-
//
|
|
586
|
+
// Re-enabling is idempotent because runtime ambiguity remains under
|
|
587
|
+
// condition-based supervision rather than becoming synthetic attention.
|
|
585
588
|
expect((await fixture.app.inject({
|
|
586
589
|
method: 'PUT',
|
|
587
590
|
url: `/api/sessions/${fixture.sessionId}/autopilot`,
|
|
@@ -804,6 +807,37 @@ describe('production composition', () => {
|
|
|
804
807
|
it('production child-idle transition wakes an idle supervised autopilot', async () => {
|
|
805
808
|
const timers = [];
|
|
806
809
|
const fixture = await createProductionAutopilotFixture({
|
|
810
|
+
autopilotActivity: (sessionId) => {
|
|
811
|
+
const observedAt = new Date().toISOString();
|
|
812
|
+
return {
|
|
813
|
+
sessionId,
|
|
814
|
+
rootThreadId: 'thread-1',
|
|
815
|
+
root: {
|
|
816
|
+
state: 'idle',
|
|
817
|
+
reason: 'turnCompleted',
|
|
818
|
+
observedAt,
|
|
819
|
+
lastActivityAt: observedAt,
|
|
820
|
+
},
|
|
821
|
+
subagents: [
|
|
822
|
+
{
|
|
823
|
+
id: 'child-1',
|
|
824
|
+
threadId: 'child-1',
|
|
825
|
+
taskPath: '/root/l1',
|
|
826
|
+
canonicalTaskName: 'l1',
|
|
827
|
+
canonicalPosition: 'L1',
|
|
828
|
+
continuationGeneration: 1,
|
|
829
|
+
outcome: 'partial',
|
|
830
|
+
ownedProcesses: [],
|
|
831
|
+
state: 'idle',
|
|
832
|
+
reason: 'turnCompleted',
|
|
833
|
+
observedAt,
|
|
834
|
+
lastActivityAt: observedAt,
|
|
835
|
+
},
|
|
836
|
+
],
|
|
837
|
+
aggregateSubagents: 'idle',
|
|
838
|
+
confidence: 'fresh',
|
|
839
|
+
};
|
|
840
|
+
},
|
|
807
841
|
autopilotSchedule: (callback) => {
|
|
808
842
|
const timer = { callback, cancelled: false, fired: false };
|
|
809
843
|
timers.push(timer);
|
|
@@ -818,57 +852,17 @@ describe('production composition', () => {
|
|
|
818
852
|
payload: { enabled: false },
|
|
819
853
|
})).statusCode).toBe(200);
|
|
820
854
|
timers.length = 0;
|
|
821
|
-
const handle = fixture.handles.find((candidate) => candidate.notify);
|
|
822
|
-
handle.notify({
|
|
823
|
-
method: 'thread/started',
|
|
824
|
-
params: { thread: { id: 'thread-1', status: { type: 'active' } } },
|
|
825
|
-
});
|
|
826
|
-
handle.notify({
|
|
827
|
-
method: 'item/started',
|
|
828
|
-
params: {
|
|
829
|
-
item: {
|
|
830
|
-
type: 'collabToolCall',
|
|
831
|
-
tool: 'spawn_agent',
|
|
832
|
-
status: 'inProgress',
|
|
833
|
-
senderThreadId: 'thread-1',
|
|
834
|
-
receiverThreadId: 'child-1',
|
|
835
|
-
agentStatus: 'working',
|
|
836
|
-
},
|
|
837
|
-
},
|
|
838
|
-
});
|
|
839
|
-
handle.notify({
|
|
840
|
-
method: 'thread/status/changed',
|
|
841
|
-
params: { threadId: 'thread-1', status: { type: 'idle' } },
|
|
842
|
-
});
|
|
843
855
|
expect((await fixture.app.inject({
|
|
844
856
|
method: 'PUT',
|
|
845
857
|
url: `/api/sessions/${fixture.sessionId}/autopilot`,
|
|
846
858
|
payload: { enabled: true },
|
|
847
859
|
})).statusCode).toBe(200);
|
|
848
|
-
expect(timers).toHaveLength(0);
|
|
849
|
-
handle.notify({
|
|
850
|
-
method: 'item/completed',
|
|
851
|
-
params: {
|
|
852
|
-
item: {
|
|
853
|
-
type: 'collabToolCall',
|
|
854
|
-
tool: 'wait',
|
|
855
|
-
status: 'completed',
|
|
856
|
-
senderThreadId: 'thread-1',
|
|
857
|
-
receiverThreadId: 'child-1',
|
|
858
|
-
agentStatus: 'idle',
|
|
859
|
-
},
|
|
860
|
-
},
|
|
861
|
-
});
|
|
862
860
|
expect(timers.filter((timer) => !timer.cancelled && !timer.fired)).toHaveLength(1);
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
}
|
|
869
|
-
await vi.waitFor(() => expect(fixture.handles
|
|
870
|
-
.flatMap((candidate) => candidate.calls)
|
|
871
|
-
.filter((call) => call === 'turn/start')).toHaveLength(1));
|
|
861
|
+
const timer = timers.find((candidate) => !candidate.cancelled && !candidate.fired);
|
|
862
|
+
timer.fired = true;
|
|
863
|
+
timer.callback();
|
|
864
|
+
await vi.waitFor(() => expect(fixture.handles.flatMap((candidate) => candidate.requests.filter((call) => call.method === 'turn/start'))).toHaveLength(1));
|
|
865
|
+
expect(fixture.handles.flatMap((candidate) => candidate.requests.filter((call) => call.method === 'turn/start'))[0]?.params).toMatchObject({ threadId: 'child-1' });
|
|
872
866
|
await fixture.app.close();
|
|
873
867
|
});
|
|
874
868
|
it('production blocked child wakes the idle supervisor for bounded recovery', async () => {
|
|
@@ -929,8 +923,8 @@ describe('production composition', () => {
|
|
|
929
923
|
expect(quietTimer).toBeDefined();
|
|
930
924
|
quietTimer.fired = true;
|
|
931
925
|
quietTimer.callback();
|
|
926
|
+
await vi.waitFor(() => expect(timers.find((timer) => !timer.cancelled && !timer.fired)).toBeDefined());
|
|
932
927
|
const continuationTimer = timers.find((timer) => !timer.cancelled && !timer.fired);
|
|
933
|
-
expect(continuationTimer).toBeDefined();
|
|
934
928
|
continuationTimer.fired = true;
|
|
935
929
|
continuationTimer.callback();
|
|
936
930
|
await vi.waitFor(() => expect(fixture.handles
|
|
@@ -938,10 +932,9 @@ describe('production composition', () => {
|
|
|
938
932
|
.filter((call) => call === 'turn/start')).toHaveLength(1));
|
|
939
933
|
await fixture.app.close();
|
|
940
934
|
});
|
|
941
|
-
it('production incompatible
|
|
935
|
+
it('production incompatible reconcile remains supervised and schedules reinspection', async () => {
|
|
942
936
|
let reconciliations = 0;
|
|
943
937
|
const timers = [];
|
|
944
|
-
let coordinator;
|
|
945
938
|
const fixture = await createProductionAutopilotFixture({
|
|
946
939
|
autopilotActivity: () => null,
|
|
947
940
|
autopilotReconcile: async () => {
|
|
@@ -952,9 +945,6 @@ describe('production composition', () => {
|
|
|
952
945
|
timers.push(callback);
|
|
953
946
|
return () => undefined;
|
|
954
947
|
},
|
|
955
|
-
onAutopilotCoordinator: (value) => {
|
|
956
|
-
coordinator = value;
|
|
957
|
-
},
|
|
958
948
|
});
|
|
959
949
|
expect((await fixture.app.inject({
|
|
960
950
|
method: 'PUT',
|
|
@@ -962,14 +952,14 @@ describe('production composition', () => {
|
|
|
962
952
|
payload: { enabled: true },
|
|
963
953
|
})).statusCode).toBe(200);
|
|
964
954
|
await vi.waitFor(async () => expect((await fixture.app.inject(`/api/sessions/${fixture.sessionId}`)).json()).toMatchObject({
|
|
965
|
-
autopilot: { state: '
|
|
955
|
+
autopilot: { state: 'monitoring', enabled: true, reason: 'reconcileFailed' },
|
|
966
956
|
}));
|
|
967
957
|
const stableReconciliations = reconciliations;
|
|
968
958
|
const stableTimers = timers.length;
|
|
969
|
-
|
|
970
|
-
await
|
|
971
|
-
expect(reconciliations).
|
|
972
|
-
expect(timers).
|
|
959
|
+
expect(stableTimers).toBeGreaterThan(0);
|
|
960
|
+
await timers.at(-1)?.();
|
|
961
|
+
await vi.waitFor(() => expect(reconciliations).toBeGreaterThan(stableReconciliations));
|
|
962
|
+
expect(timers.length).toBeGreaterThanOrEqual(stableTimers);
|
|
973
963
|
await fixture.app.close();
|
|
974
964
|
});
|
|
975
965
|
it('production post-acceptance fault recovers one accepted control without a second turn or audit', async () => {
|
|
@@ -49,7 +49,7 @@ import { checkpointPlanMeasurement } from './platform/plans/plan-measurement-com
|
|
|
49
49
|
import { PlanMeasurementRefresh } from './platform/plans/plan-measurement-refresh.js';
|
|
50
50
|
import { SqliteAutopilotStore } from './platform/persistence/sqlite-autopilot-store.js';
|
|
51
51
|
import { AutopilotCoordinator } from './features/autopilot/application/service.js';
|
|
52
|
-
import { AUTOPILOT_CONTINUATION_PROMPT, defaultAutopilotPolicy, } from './features/autopilot/application/policy.js';
|
|
52
|
+
import { AUTOPILOT_CONTINUATION_PROMPT, AUTOPILOT_EXECUTOR_CONTINUATION_PROMPT, defaultAutopilotPolicy, } from './features/autopilot/application/policy.js';
|
|
53
53
|
import { createRelyingPartyConfig } from './config.js';
|
|
54
54
|
import { parseOrgPlanAttention } from '../shared/contracts/org-plan-attention.js';
|
|
55
55
|
const generatedProtocolVersion = 'codex-cli 0.144.3';
|
|
@@ -144,11 +144,18 @@ export async function composeRelayApp(options) {
|
|
|
144
144
|
...(history.activeTurnId ? { turnId: history.activeTurnId } : {}),
|
|
145
145
|
});
|
|
146
146
|
const children = await runtime.listDirectChildren(session);
|
|
147
|
+
const childProcesses = new Map();
|
|
148
|
+
await mapWithConcurrency([...children], 4, async (child) => {
|
|
149
|
+
childProcesses.set(child.id, await runtime.inspectChildProcesses(session, child));
|
|
150
|
+
});
|
|
147
151
|
// The writer read is also asynchronous; it cannot publish after the
|
|
148
152
|
// durable owner has gone away either.
|
|
149
153
|
if (!sessions.find(sessionId))
|
|
150
154
|
return;
|
|
151
|
-
activity.childrenReconciled(sessionId, occurredAt, children)
|
|
155
|
+
activity.childrenReconciled(sessionId, occurredAt, children.map((child) => ({
|
|
156
|
+
...child,
|
|
157
|
+
processes: childProcesses.get(child.id) ?? [],
|
|
158
|
+
})));
|
|
152
159
|
},
|
|
153
160
|
});
|
|
154
161
|
const autopilot = new AutopilotCoordinator({
|
|
@@ -165,6 +172,15 @@ export async function composeRelayApp(options) {
|
|
|
165
172
|
? options.autopilotActivity(sessionId)
|
|
166
173
|
: activity.snapshot(sessionId, new Date().toISOString()),
|
|
167
174
|
pendingInteraction: (sessionId) => interactions.list(sessionId).length > 0,
|
|
175
|
+
attention: (sessionId) => {
|
|
176
|
+
const interaction = interactions
|
|
177
|
+
.list(sessionId)
|
|
178
|
+
.find((candidate) => candidate.kind === 'orgPlanAttention');
|
|
179
|
+
const attention = interaction ? parseOrgPlanAttention(interaction.payload) : null;
|
|
180
|
+
return attention
|
|
181
|
+
? { reason: attention.reason, resumeCondition: attention.resumeCondition }
|
|
182
|
+
: null;
|
|
183
|
+
},
|
|
168
184
|
reconcile: async (sessionId) => {
|
|
169
185
|
if (options.autopilotReconcile)
|
|
170
186
|
return options.autopilotReconcile(sessionId);
|
|
@@ -180,7 +196,7 @@ export async function composeRelayApp(options) {
|
|
|
180
196
|
}),
|
|
181
197
|
nextControlId: (sessionId, generation) => `autopilot-${generation}-${createHash('sha256').update(`${sessionId}:${randomUUID()}`).digest('hex').slice(0, 16)}`,
|
|
182
198
|
turnStarter: {
|
|
183
|
-
start: async (sessionId, controlId, generation) => {
|
|
199
|
+
start: async (sessionId, controlId, generation, launchIdentity) => {
|
|
184
200
|
const current = () => {
|
|
185
201
|
const state = autopilotStore.find(sessionId);
|
|
186
202
|
return Boolean(state &&
|
|
@@ -200,7 +216,10 @@ export async function composeRelayApp(options) {
|
|
|
200
216
|
if (!current() || writer.session.activeTurnId || interactions.list(sessionId).length)
|
|
201
217
|
throw new Error('AUTOPILOT_START_UNAVAILABLE');
|
|
202
218
|
await options.autopilotBeforeTurnAccepted?.({ sessionId, controlId });
|
|
203
|
-
const
|
|
219
|
+
const continuationPrompt = launchIdentity
|
|
220
|
+
? `${AUTOPILOT_CONTINUATION_PROMPT} Launch task_name ${launchIdentity.taskName} for canonical ${launchIdentity.canonicalPosition}; retain the canonical label in status and review output.`
|
|
221
|
+
: AUTOPILOT_CONTINUATION_PROMPT;
|
|
222
|
+
const started = await runtime.startTurn(writer.session, continuationPrompt, controlId, new Date().toISOString());
|
|
204
223
|
if (!started.activeTurnId)
|
|
205
224
|
throw new Error('AUTOPILOT_START_UNAVAILABLE');
|
|
206
225
|
sessions.save(started);
|
|
@@ -218,6 +237,46 @@ export async function composeRelayApp(options) {
|
|
|
218
237
|
});
|
|
219
238
|
},
|
|
220
239
|
},
|
|
240
|
+
executorController: {
|
|
241
|
+
resume: async (sessionId, threadId, generation, trigger) => {
|
|
242
|
+
const session = sessions.find(sessionId);
|
|
243
|
+
if (!session || !runtime || interactions.list(sessionId).length)
|
|
244
|
+
throw new Error('AUTOPILOT_EXECUTOR_UNAVAILABLE');
|
|
245
|
+
const writer = await runtime.ensureWriter(session, new Date().toISOString());
|
|
246
|
+
if (interactions.list(sessionId).length)
|
|
247
|
+
throw new Error('AUTOPILOT_EXECUTOR_UNAVAILABLE');
|
|
248
|
+
const context = trigger.kind === 'processExited'
|
|
249
|
+
? ` Process result ${trigger.resultArtifact} exited and is ready in this executor history.`
|
|
250
|
+
: trigger.kind === 'processResourceLimit'
|
|
251
|
+
? ` Process ${trigger.processId} exceeded its explicit resource budget and was terminated; diagnose before retrying.`
|
|
252
|
+
: '';
|
|
253
|
+
const clientId = `autopilot-executor-${generation}-${createHash('sha256')
|
|
254
|
+
.update(`${sessionId}:${threadId}:${generation}:${randomUUID()}`)
|
|
255
|
+
.digest('hex')
|
|
256
|
+
.slice(0, 16)}`;
|
|
257
|
+
const turnId = await runtime.startExecutorTurn(writer.session, threadId, `${AUTOPILOT_EXECUTOR_CONTINUATION_PROMPT}${context}`, clientId);
|
|
258
|
+
activity.observe({
|
|
259
|
+
sessionId,
|
|
260
|
+
occurredAt: new Date().toISOString(),
|
|
261
|
+
kind: 'turnStarted',
|
|
262
|
+
threadId,
|
|
263
|
+
turnId,
|
|
264
|
+
});
|
|
265
|
+
},
|
|
266
|
+
refresh: (sessionId) => activity.refresh(sessionId),
|
|
267
|
+
transferProcess: (sessionId, threadId, processId) => {
|
|
268
|
+
activity.transferProcessOwnership(sessionId, threadId, processId, new Date().toISOString());
|
|
269
|
+
},
|
|
270
|
+
consumeProcess: (sessionId, threadId, processId) => {
|
|
271
|
+
runtime?.consumeChildProcessResult(sessionId, threadId, processId);
|
|
272
|
+
},
|
|
273
|
+
terminateProcess: async (sessionId, threadId, processId) => {
|
|
274
|
+
const session = sessions.find(sessionId);
|
|
275
|
+
return session && runtime
|
|
276
|
+
? runtime.terminateChildProcess(session, threadId, processId)
|
|
277
|
+
: false;
|
|
278
|
+
},
|
|
279
|
+
},
|
|
221
280
|
publish: (sessionId, type, payload, occurredAt, outboxId) => {
|
|
222
281
|
if (!sessions.find(sessionId))
|
|
223
282
|
return;
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Designed by Denis Roio <jaromil@dyne.org>
|
|
4
4
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
5
|
*/
|
|
6
|
+
import { parseOrgPlanAgentIdentity } from '../../../shared/org-plan-position.js';
|
|
6
7
|
const states = [
|
|
7
8
|
'blocked',
|
|
8
9
|
'awaitingHuman',
|
|
@@ -81,6 +82,9 @@ export function projectAgentActivity(current, fact) {
|
|
|
81
82
|
root.reason = 'missingCollaborationMetadata';
|
|
82
83
|
else {
|
|
83
84
|
const before = children.get(fact.childId);
|
|
85
|
+
const taskPath = fact.childTaskPath ?? before?.taskPath;
|
|
86
|
+
const identity = taskPath ? parseOrgPlanAgentIdentity(taskPath) : null;
|
|
87
|
+
const outcome = childOutcome(fact.childStatus, fact.collaborationAction, before?.outcome);
|
|
84
88
|
const child = Object.freeze({
|
|
85
89
|
id: fact.childId,
|
|
86
90
|
...(fact.childThreadId
|
|
@@ -99,6 +103,20 @@ export function projectAgentActivity(current, fact) {
|
|
|
99
103
|
: before?.model
|
|
100
104
|
? { model: before.model }
|
|
101
105
|
: {}),
|
|
106
|
+
...(taskPath ? { taskPath } : {}),
|
|
107
|
+
...(identity
|
|
108
|
+
? {
|
|
109
|
+
canonicalTaskName: identity.canonicalTaskName,
|
|
110
|
+
canonicalPosition: identity.canonicalPosition,
|
|
111
|
+
continuationGeneration: identity.generation,
|
|
112
|
+
}
|
|
113
|
+
: {}),
|
|
114
|
+
...(outcome ? { outcome } : {}),
|
|
115
|
+
...(fact.childOwnedProcesses
|
|
116
|
+
? { ownedProcesses: Object.freeze([...fact.childOwnedProcesses]) }
|
|
117
|
+
: before?.ownedProcesses
|
|
118
|
+
? { ownedProcesses: before.ownedProcesses }
|
|
119
|
+
: {}),
|
|
102
120
|
state: childState(fact.childStatus, fact.collaborationAction, before?.state),
|
|
103
121
|
reason: childReason(fact.childStatus, fact.collaborationAction),
|
|
104
122
|
observedAt: fact.occurredAt,
|
|
@@ -145,6 +163,15 @@ function applyStatus(root, status) {
|
|
|
145
163
|
else if (status === 'active' || status === 'working')
|
|
146
164
|
Object.assign(root, { state: 'working', reason: 'turnActive' });
|
|
147
165
|
}
|
|
166
|
+
function childOutcome(status, action, previous) {
|
|
167
|
+
if (status === 'error' || status === 'failed' || status === 'systemError' || status === 'errored')
|
|
168
|
+
return 'failed';
|
|
169
|
+
if (status === 'interrupted' || status === 'shutdown' || action === 'close_agent')
|
|
170
|
+
return 'cancelled';
|
|
171
|
+
if (status === 'completed' || status === 'idle')
|
|
172
|
+
return 'partial';
|
|
173
|
+
return previous;
|
|
174
|
+
}
|
|
148
175
|
function childState(status, action, previous = 'working') {
|
|
149
176
|
if (status === 'error' || status === 'failed' || status === 'systemError' || status === 'errored')
|
|
150
177
|
return 'blocked';
|
|
@@ -91,6 +91,8 @@ export class AgentActivityRegistry {
|
|
|
91
91
|
...(child.nickname ? { childNickname: child.nickname } : {}),
|
|
92
92
|
...(child.role ? { childRole: child.role } : {}),
|
|
93
93
|
...(child.model ? { childModel: child.model } : {}),
|
|
94
|
+
...(child.taskPath ? { childTaskPath: child.taskPath } : {}),
|
|
95
|
+
...(child.processes ? { childOwnedProcesses: child.processes } : {}),
|
|
94
96
|
});
|
|
95
97
|
for (const child of next.subagents)
|
|
96
98
|
if (!seen.has(child.id))
|
|
@@ -112,6 +114,28 @@ export class AgentActivityRegistry {
|
|
|
112
114
|
}
|
|
113
115
|
return next;
|
|
114
116
|
}
|
|
117
|
+
transferProcessOwnership(sessionId, childThreadId, processId, occurredAt) {
|
|
118
|
+
const current = this.snapshot(sessionId, occurredAt);
|
|
119
|
+
const child = current.subagents.find((candidate) => candidate.id === childThreadId);
|
|
120
|
+
if (!child?.ownedProcesses?.some((process) => process.processId === processId))
|
|
121
|
+
return current;
|
|
122
|
+
const next = withActivityConfidence(projectAgentActivity(current, {
|
|
123
|
+
sessionId,
|
|
124
|
+
occurredAt,
|
|
125
|
+
kind: 'collaboration',
|
|
126
|
+
childId: child.id,
|
|
127
|
+
childThreadId: child.threadId,
|
|
128
|
+
childTaskPath: child.taskPath,
|
|
129
|
+
childOwnedProcesses: child.ownedProcesses.map((process) => process.processId === processId
|
|
130
|
+
? { ...process, ownership: 'supervisor', state: 'detached-active' }
|
|
131
|
+
: process),
|
|
132
|
+
}), 'fresh');
|
|
133
|
+
if (next !== current) {
|
|
134
|
+
this.#snapshots.set(sessionId, next);
|
|
135
|
+
this.publish(next, occurredAt);
|
|
136
|
+
}
|
|
137
|
+
return next;
|
|
138
|
+
}
|
|
115
139
|
dispose(sessionId) {
|
|
116
140
|
this.#disposed.add(sessionId);
|
|
117
141
|
this.#snapshots.delete(sessionId);
|
|
@@ -3,14 +3,20 @@
|
|
|
3
3
|
* Designed by Denis Roio <jaromil@dyne.org>
|
|
4
4
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
5
|
*/
|
|
6
|
-
export const AUTOPILOT_PROMPT_VERSION = '
|
|
6
|
+
export const AUTOPILOT_PROMPT_VERSION = 'v3';
|
|
7
7
|
export const AUTOPILOT_CONTINUATION_PROMPT = 'Inspect the active supervised Org Plan. Refer to every L1 as L<a> and each nested L2 as L<a>.<b>, using one-based positions. For a subagent dedicated to that position, use the collaboration-safe task_name l<a> or l<a>_<b> and refer to it by its canonical L label. Invoke gestalt_org_plan_attention only for a decision-table blocker; otherwise immediately perform the next legal lifecycle action. Do not send a status-only response.';
|
|
8
|
+
export const AUTOPILOT_EXECUTOR_CONTINUATION_PROMPT = 'Continue the same assigned Org L1 from its durable state. A prior turn ending did not complete the objective. Consume any supplied process result, take the next legal L2 action, and report only at the L1 review boundary or through structured attention.';
|
|
8
9
|
export const defaultAutopilotPolicy = Object.freeze({
|
|
9
10
|
quiescenceMs: 1_000,
|
|
10
11
|
staleAfterMs: 30_000,
|
|
11
12
|
retryLimit: 3,
|
|
12
13
|
actionLimit: 12,
|
|
13
14
|
actionWindowMs: 10 * 60_000,
|
|
15
|
+
executorContinuationBaseMs: 1_000,
|
|
16
|
+
executorContinuationMaxMs: 60_000,
|
|
17
|
+
processPollMs: 1_000,
|
|
18
|
+
processMaxElapsedMs: 2 * 60 * 60_000,
|
|
19
|
+
processMaxRssBytes: 12 * 1024 * 1024 * 1024,
|
|
14
20
|
backoffMs: (attempt) => Math.min(60_000, 1_000 * 2 ** Math.max(0, attempt)),
|
|
15
21
|
promptVersion: AUTOPILOT_PROMPT_VERSION,
|
|
16
22
|
});
|
|
@@ -39,7 +45,7 @@ export function classifyAgentActivity(activity) {
|
|
|
39
45
|
/** A deliberately pure, exhaustive safety gate. Adapters may only enact this result. */
|
|
40
46
|
export function decideAutopilot(input) {
|
|
41
47
|
const { state, plan, activity, hasPendingInteraction, now, policy } = input;
|
|
42
|
-
if (input.hasActiveAttention
|
|
48
|
+
if (input.hasActiveAttention)
|
|
43
49
|
return {
|
|
44
50
|
kind: 'requestAttention',
|
|
45
51
|
reason: state.stopReason === 'noPlanProgress' ||
|
|
@@ -55,27 +61,23 @@ export function decideAutopilot(input) {
|
|
|
55
61
|
return { kind: 'disable', reason: 'planRequired' };
|
|
56
62
|
if (executionComplete(plan))
|
|
57
63
|
return { kind: 'complete' };
|
|
64
|
+
// Quiz, approval, and other held requests are ordinary session work. Only a
|
|
65
|
+
// validated Org attention record may turn an incomplete plan into a human stop.
|
|
58
66
|
if (hasPendingInteraction)
|
|
59
|
-
return { kind: '
|
|
67
|
+
return { kind: 'observe' };
|
|
60
68
|
if (!activity || activity.confidence !== 'fresh')
|
|
61
69
|
return { kind: 'reconcile' };
|
|
62
70
|
if (Date.parse(now) - Date.parse(activity.root.lastActivityAt) > policy.staleAfterMs)
|
|
63
71
|
return { kind: 'reconcile' };
|
|
64
72
|
const disposition = classifyAgentActivity(activity);
|
|
65
73
|
if (disposition === 'attention')
|
|
66
|
-
return { kind: '
|
|
74
|
+
return { kind: 'observe' };
|
|
67
75
|
if (disposition === 'reconcile')
|
|
68
76
|
return { kind: 'reconcile' };
|
|
69
77
|
if (disposition !== 'settled')
|
|
70
78
|
return { kind: 'observe' };
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
// The outcome is intentionally interpreted only through durable lack of plan
|
|
74
|
-
// progress: a failed or unknown automatic turn may retry within the same
|
|
75
|
-
// bounded budget, while a completed turn with no fingerprint change does too.
|
|
76
|
-
if (state.consecutiveNoProgress >= policy.retryLimit &&
|
|
77
|
-
['completed', 'failed', 'unknown', undefined].includes(input.lastTurnOutcome))
|
|
78
|
-
return { kind: 'requestAttention', reason: 'noPlanProgress' };
|
|
79
|
+
// Automatic action counts and partial generations pace continuation, but
|
|
80
|
+
// cannot manufacture a human blocker while durable Org state remains WIP.
|
|
79
81
|
return {
|
|
80
82
|
kind: 'scheduleContinuation',
|
|
81
83
|
at: new Date(Date.parse(now) + policy.backoffMs(state.consecutiveNoProgress)).toISOString(),
|