gestalt-mobile 0.18.6 → 0.19.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.
- package/dist/client/assets/index-DXSIIlY0.js +29 -0
- package/dist/client/assets/index-DYERmevO.css +1 -0
- package/dist/client/index.html +2 -2
- package/dist/server/server/composition.contracts.js +2 -1
- package/dist/server/server/composition.js +12 -10
- package/dist/server/server/features/agent-activity/model.js +14 -5
- package/dist/server/server/features/autopilot/application/policy.js +40 -14
- package/dist/server/server/features/autopilot/application/service.js +85 -38
- package/dist/server/server/features/sessions/get-history/endpoint.js +2 -30
- package/dist/server/server/features/sessions/queue-turn-input/endpoint.js +25 -0
- package/dist/server/server/features/sessions/queue-turn-input/use-case.js +10 -0
- package/dist/server/server/features/sessions/register-routes.js +3 -0
- package/dist/server/server/platform/codex/activity-facts.js +100 -58
- package/dist/server/server/platform/codex/session-runtime.js +11 -0
- package/dist/server/server/platform/persistence/sqlite-autopilot-store.js +11 -2
- package/dist/server/server/platform/persistence/sqlite-event-journal.js +3 -6
- package/dist/server/shared/contracts/autopilot-audit.js +38 -0
- package/dist/server/shared/org-plan-position.js +13 -0
- package/package.json +1 -1
- package/dist/client/assets/index-CgSuVqbd.css +0 -1
- package/dist/client/assets/index-DoUX4ONm.js +0 -30
|
@@ -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)}@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}@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.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) .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}.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}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.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}progress.svelte-3rmyvg{inline-size:100%}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}.session-select.svelte-hxb22h{inline-size:100%;color:inherit;font:inherit;text-align:inherit;cursor:pointer;background:0 0;border:0;padding:0;display:block}.managed-session.svelte-hxb22h{box-sizing:border-box;border:1px solid var(--theme-border);border-radius:.5rem;grid-template-columns:max-content minmax(0,1fr);align-items:start;gap:.75rem;inline-size:100%;padding:.75rem;display:grid}.open-session.svelte-hxb22h{border-inline-start:.3rem solid 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-wrap:wrap;gap:.5rem;display:flex}.session-monitor-controls.svelte-hxb22h{flex-wrap:nowrap;align-items:flex-start;gap:.35rem;min-inline-size:0;margin-block-start:.625rem;display:flex}.session-monitor-controls.svelte-hxb22h>*{flex:1 1 0;min-inline-size:0}@media (width<=30rem){.managed-session.svelte-hxb22h{grid-template-columns:minmax(0,1fr)}}.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}}.chat-view.svelte-1d2e8zz{margin-inline:calc(.25rem - var(--page-inline-padding))}.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-DXSIIlY0.js"></script>
|
|
20
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DYERmevO.css">
|
|
21
21
|
</head>
|
|
22
22
|
<body>
|
|
23
23
|
<div id="app"></div>
|
|
@@ -11,6 +11,7 @@ import { join } from 'node:path';
|
|
|
11
11
|
import { describe, expect, it, onTestFinished, vi } from 'vitest';
|
|
12
12
|
import WebSocket from 'ws';
|
|
13
13
|
import { composeRelayApp } from './composition.js';
|
|
14
|
+
import { AUTOPILOT_CONTINUATION_PROMPT } from './features/autopilot/application/policy.js';
|
|
14
15
|
import { SqliteAuthorizationStore } from './platform/auth/sqlite-authorization-store.js';
|
|
15
16
|
import { authorizationSessionId, authorizedDeviceId, localOwnerId, webAuthnCredentialId, } from './features/auth/domain/identifiers.js';
|
|
16
17
|
import { deviceNickname } from './features/auth/domain/device-nickname.js';
|
|
@@ -370,7 +371,7 @@ describe('production composition', () => {
|
|
|
370
371
|
input: [
|
|
371
372
|
{
|
|
372
373
|
type: 'text',
|
|
373
|
-
text:
|
|
374
|
+
text: AUTOPILOT_CONTINUATION_PROMPT,
|
|
374
375
|
text_elements: [],
|
|
375
376
|
},
|
|
376
377
|
],
|
|
@@ -33,7 +33,7 @@ import { SessionSupervisor } from './platform/runtime/session-supervisor.js';
|
|
|
33
33
|
import { mapWithConcurrency } from './platform/runtime/concurrency.js';
|
|
34
34
|
import { RelaySession } from './features/sessions/model/relay-session.js';
|
|
35
35
|
import { AgentActivityRegistry } from './features/agent-activity/registry.js';
|
|
36
|
-
import {
|
|
36
|
+
import { decodeAgentActivityFacts } from './platform/codex/activity-facts.js';
|
|
37
37
|
import { resolvedServerRequestId, toPendingInteraction } from './platform/codex/server-request.js';
|
|
38
38
|
import { isValidInteractionResponse, isValidQuizInteractionResponse, } from './features/sessions/interaction/response-validator.js';
|
|
39
39
|
import { promoteRecentThread } from './features/sessions/promote-recent-thread/use-case.js';
|
|
@@ -90,7 +90,7 @@ export async function composeRelayApp(options) {
|
|
|
90
90
|
const planMeasurementHelperPath = options.planMeasurementHelperPath ?? process.env.GESTALT_MOBILE_ORG_PLAN_HELPER;
|
|
91
91
|
const withPendingInteractions = (session) => (session ? { ...session, pendingInteractions: interactions.list(session.id) } : null);
|
|
92
92
|
const events = new SessionEventBus();
|
|
93
|
-
let
|
|
93
|
+
let notifyAutopilotActivity = () => undefined;
|
|
94
94
|
const attentionTransitions = {
|
|
95
95
|
subscribe: (sessionId, listener) => events.subscribe(sessionId, (event) => {
|
|
96
96
|
if (event.type !== 'org-plan.attention-required' &&
|
|
@@ -113,10 +113,7 @@ export async function composeRelayApp(options) {
|
|
|
113
113
|
options.onAttentionTransitions?.(attentionTransitions);
|
|
114
114
|
const activity = new AgentActivityRegistry((snapshot, occurredAt) => {
|
|
115
115
|
events.publish(journal.append(snapshot.sessionId, 'agent.activity.updated', snapshot, occurredAt));
|
|
116
|
-
|
|
117
|
-
['idle', 'blocked'].includes(snapshot.root.state) &&
|
|
118
|
-
['idle', 'blocked'].includes(snapshot.aggregateSubagents))
|
|
119
|
-
notifyAutopilotSettled(snapshot.sessionId);
|
|
116
|
+
notifyAutopilotActivity(snapshot.sessionId);
|
|
120
117
|
}, {
|
|
121
118
|
// Evidence arms one bounded reconciliation; healthy sessions are never polled.
|
|
122
119
|
schedule: options.activitySchedule ??
|
|
@@ -216,7 +213,7 @@ export async function composeRelayApp(options) {
|
|
|
216
213
|
events.publish(journal.append(sessionId, type, payload, occurredAt, outboxId));
|
|
217
214
|
},
|
|
218
215
|
});
|
|
219
|
-
|
|
216
|
+
notifyAutopilotActivity = (sessionId) => autopilot.activityChanged(sessionId);
|
|
220
217
|
options.onAutopilotCoordinator?.(autopilot);
|
|
221
218
|
const workspaces = new FilesystemWorkspaceCatalog(root);
|
|
222
219
|
const models = new CodexModelCatalog(root, options.launchAppServer ?? launchCodexAppServer);
|
|
@@ -298,13 +295,12 @@ export async function composeRelayApp(options) {
|
|
|
298
295
|
}
|
|
299
296
|
events.publish(journal.append(sessionId, 'plan.updated', { plan: update.plan, reason: update.reason }, occurredAt));
|
|
300
297
|
}
|
|
301
|
-
autopilot.
|
|
298
|
+
autopilot.planStatusChanged(sessionId);
|
|
302
299
|
};
|
|
303
300
|
runtime = options.startAppServers
|
|
304
301
|
? new CodexSessionRuntime(options.launchAppServer ?? launchCodexAppServer, undefined, (sessionId, notification) => {
|
|
305
302
|
const occurredAt = new Date().toISOString();
|
|
306
|
-
const activityFact
|
|
307
|
-
if (activityFact)
|
|
303
|
+
for (const activityFact of decodeAgentActivityFacts(sessionId, occurredAt, notification))
|
|
308
304
|
activity.observe(activityFact);
|
|
309
305
|
const resolvedRequestId = resolvedServerRequestId(notification);
|
|
310
306
|
if (resolvedRequestId) {
|
|
@@ -550,6 +546,12 @@ export async function composeRelayApp(options) {
|
|
|
550
546
|
interruptTurn: runtime
|
|
551
547
|
? (session, turnId) => runtime.interruptTurn(session, turnId)
|
|
552
548
|
: undefined,
|
|
549
|
+
queueTurnInput: runtime
|
|
550
|
+
? (session, turnId, text, clientUserMessageId) => {
|
|
551
|
+
autopilot.manualSend(session.id);
|
|
552
|
+
return runtime.queueTurnInput(session, turnId, text, clientUserMessageId);
|
|
553
|
+
}
|
|
554
|
+
: undefined,
|
|
553
555
|
restore: runtime
|
|
554
556
|
? async (session) => {
|
|
555
557
|
const restored = await runtime.restoreWithOutcome(session, new Date().toISOString());
|
|
@@ -141,24 +141,33 @@ function applyStatus(root, status) {
|
|
|
141
141
|
Object.assign(root, { state: 'working', reason: 'turnActive' });
|
|
142
142
|
}
|
|
143
143
|
function childState(status, action, previous = 'working') {
|
|
144
|
-
if (status === 'error' || status === 'failed' || status === 'systemError')
|
|
144
|
+
if (status === 'error' || status === 'failed' || status === 'systemError' || status === 'errored')
|
|
145
145
|
return 'blocked';
|
|
146
146
|
if (status === 'completed' || status === 'idle' || action === 'close_agent')
|
|
147
147
|
return 'idle';
|
|
148
148
|
// `wait` belongs to the caller/root; it does not rewrite the child which may
|
|
149
149
|
// still be working. A child can explicitly report its own waiting status.
|
|
150
|
-
if (status === 'disconnected' ||
|
|
150
|
+
if (status === 'disconnected' ||
|
|
151
|
+
status === 'notLoaded' ||
|
|
152
|
+
status === 'shutdown' ||
|
|
153
|
+
status === 'notFound')
|
|
151
154
|
return 'disconnected';
|
|
152
155
|
return previous === 'idle' && action === 'resume_agent'
|
|
153
156
|
? 'working'
|
|
154
|
-
: status === 'working' ||
|
|
157
|
+
: status === 'working' ||
|
|
158
|
+
status === 'active' ||
|
|
159
|
+
status === 'running' ||
|
|
160
|
+
status === 'pendingInit'
|
|
155
161
|
? 'working'
|
|
156
162
|
: previous;
|
|
157
163
|
}
|
|
158
164
|
function childReason(status, action) {
|
|
159
|
-
if (status === 'error' || status === 'failed' || status === 'systemError')
|
|
165
|
+
if (status === 'error' || status === 'failed' || status === 'systemError' || status === 'errored')
|
|
160
166
|
return 'agentError';
|
|
161
|
-
if (status === 'disconnected' ||
|
|
167
|
+
if (status === 'disconnected' ||
|
|
168
|
+
status === 'notLoaded' ||
|
|
169
|
+
status === 'shutdown' ||
|
|
170
|
+
status === 'notFound')
|
|
162
171
|
return 'processExited';
|
|
163
172
|
if (action === 'wait')
|
|
164
173
|
return 'collaborationWait';
|
|
@@ -3,12 +3,14 @@
|
|
|
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 = '
|
|
7
|
-
export const AUTOPILOT_CONTINUATION_PROMPT = 'Inspect the active supervised Org Plan. 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.';
|
|
6
|
+
export const AUTOPILOT_PROMPT_VERSION = 'v2';
|
|
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
8
|
export const defaultAutopilotPolicy = Object.freeze({
|
|
9
9
|
quiescenceMs: 1_000,
|
|
10
10
|
staleAfterMs: 30_000,
|
|
11
11
|
retryLimit: 3,
|
|
12
|
+
actionLimit: 12,
|
|
13
|
+
actionWindowMs: 10 * 60_000,
|
|
12
14
|
backoffMs: (attempt) => Math.min(60_000, 1_000 * 2 ** Math.max(0, attempt)),
|
|
13
15
|
promptVersion: AUTOPILOT_PROMPT_VERSION,
|
|
14
16
|
});
|
|
@@ -18,32 +20,56 @@ export function executionComplete(plan) {
|
|
|
18
20
|
step.reviewStatus === 'REVIEWED' &&
|
|
19
21
|
step.children.every((child) => child.state === 'DONE')));
|
|
20
22
|
}
|
|
23
|
+
/** Classifies fresh actor topology; the caller owns freshness and durable interaction checks. */
|
|
24
|
+
export function classifyAgentActivity(activity) {
|
|
25
|
+
if (activity.root.state === 'awaitingHuman' || activity.aggregateSubagents === 'awaitingHuman')
|
|
26
|
+
return 'attention';
|
|
27
|
+
if (activity.root.state === 'disconnected' || activity.aggregateSubagents === 'disconnected')
|
|
28
|
+
return 'reconcile';
|
|
29
|
+
if (activity.root.state === 'working' ||
|
|
30
|
+
activity.aggregateSubagents === 'working' ||
|
|
31
|
+
activity.aggregateSubagents === 'awaitingAgent')
|
|
32
|
+
return 'active';
|
|
33
|
+
const rootSettled = activity.root.state === 'idle' ||
|
|
34
|
+
activity.root.state === 'blocked' ||
|
|
35
|
+
activity.root.state === 'awaitingAgent';
|
|
36
|
+
const subagentsSettled = activity.aggregateSubagents === 'idle' || activity.aggregateSubagents === 'blocked';
|
|
37
|
+
return rootSettled && subagentsSettled ? 'settled' : 'observe';
|
|
38
|
+
}
|
|
21
39
|
/** A deliberately pure, exhaustive safety gate. Adapters may only enact this result. */
|
|
22
40
|
export function decideAutopilot(input) {
|
|
23
41
|
const { state, plan, activity, hasPendingInteraction, now, policy } = input;
|
|
42
|
+
if (input.hasActiveAttention || state.state === 'attentionRequired')
|
|
43
|
+
return {
|
|
44
|
+
kind: 'requestAttention',
|
|
45
|
+
reason: state.stopReason === 'noPlanProgress' ||
|
|
46
|
+
state.stopReason === 'reconcileFailed' ||
|
|
47
|
+
state.stopReason === 'startUnavailable' ||
|
|
48
|
+
state.stopReason === 'actionRateExceeded'
|
|
49
|
+
? state.stopReason
|
|
50
|
+
: 'attentionRequired',
|
|
51
|
+
};
|
|
24
52
|
if (!state.requestedEnabled)
|
|
25
53
|
return { kind: 'disable', reason: 'manualDisabled' };
|
|
26
54
|
if (!plan)
|
|
27
55
|
return { kind: 'disable', reason: 'planRequired' };
|
|
28
56
|
if (executionComplete(plan))
|
|
29
57
|
return { kind: 'complete' };
|
|
30
|
-
if (hasPendingInteraction
|
|
58
|
+
if (hasPendingInteraction)
|
|
31
59
|
return { kind: 'requestAttention', reason: 'attentionRequired' };
|
|
32
|
-
if ((input.planIdentity && state.planIdentity && input.planIdentity !== state.planIdentity) ||
|
|
33
|
-
(input.planFingerprint &&
|
|
34
|
-
state.planFingerprint &&
|
|
35
|
-
input.planFingerprint !== state.planFingerprint))
|
|
36
|
-
return { kind: 'observe' };
|
|
37
60
|
if (!activity || activity.confidence !== 'fresh')
|
|
38
61
|
return { kind: 'reconcile' };
|
|
39
62
|
if (Date.parse(now) - Date.parse(activity.root.lastActivityAt) > policy.staleAfterMs)
|
|
40
63
|
return { kind: 'reconcile' };
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
64
|
+
const disposition = classifyAgentActivity(activity);
|
|
65
|
+
if (disposition === 'attention')
|
|
66
|
+
return { kind: 'requestAttention', reason: 'attentionRequired' };
|
|
67
|
+
if (disposition === 'reconcile')
|
|
68
|
+
return { kind: 'reconcile' };
|
|
69
|
+
if (disposition !== 'settled')
|
|
70
|
+
return { kind: 'observe' };
|
|
71
|
+
if ((input.automaticActionCount ?? 0) >= policy.actionLimit)
|
|
72
|
+
return { kind: 'requestAttention', reason: 'actionRateExceeded' };
|
|
47
73
|
// The outcome is intentionally interpreted only through durable lack of plan
|
|
48
74
|
// progress: a failed or unknown automatic turn may retry within the same
|
|
49
75
|
// bounded budget, while a completed turn with no fingerprint change does too.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
5
|
*/
|
|
6
6
|
import { autopilotSnapshot, disabledAutopilot, } from '../domain/autopilot-session.js';
|
|
7
|
-
import { decideAutopilot, executionComplete } from './policy.js';
|
|
7
|
+
import { classifyAgentActivity, decideAutopilot, executionComplete, } from './policy.js';
|
|
8
8
|
export class AutopilotCoordinator {
|
|
9
9
|
deps;
|
|
10
10
|
timers = new Map();
|
|
@@ -89,7 +89,6 @@ export class AutopilotCoordinator {
|
|
|
89
89
|
const nextFingerprint = fingerprint(currentPlan.plan);
|
|
90
90
|
if (prior.requestedEnabled &&
|
|
91
91
|
prior.planIdentity === currentPlan.identity &&
|
|
92
|
-
prior.planFingerprint === nextFingerprint &&
|
|
93
92
|
prior.state !== 'attentionRequired')
|
|
94
93
|
return this.snapshot(sessionId);
|
|
95
94
|
const next = {
|
|
@@ -111,7 +110,8 @@ export class AutopilotCoordinator {
|
|
|
111
110
|
disable(sessionId) {
|
|
112
111
|
const now = this.deps.now();
|
|
113
112
|
const prior = this.deps.store.find(sessionId) ?? disabledAutopilot(sessionId, now);
|
|
114
|
-
|
|
113
|
+
const cancelled = this.cancelScheduledControl(prior, now);
|
|
114
|
+
if (!prior.requestedEnabled && prior.state === 'disabled' && !cancelled)
|
|
115
115
|
return this.snapshot(sessionId);
|
|
116
116
|
const next = {
|
|
117
117
|
...prior,
|
|
@@ -119,10 +119,11 @@ export class AutopilotCoordinator {
|
|
|
119
119
|
requestedEnabled: false,
|
|
120
120
|
generation: prior.generation + 1,
|
|
121
121
|
nextEvaluationAt: null,
|
|
122
|
+
...(cancelled ? { lastControlId: null } : {}),
|
|
122
123
|
stopReason: 'manualDisabled',
|
|
123
124
|
updatedAt: now,
|
|
124
125
|
};
|
|
125
|
-
this.persist(next);
|
|
126
|
+
this.persist(next, cancelled);
|
|
126
127
|
this.cancelTimer(sessionId);
|
|
127
128
|
return this.snapshot(sessionId);
|
|
128
129
|
}
|
|
@@ -130,15 +131,18 @@ export class AutopilotCoordinator {
|
|
|
130
131
|
const prior = this.deps.store.find(sessionId);
|
|
131
132
|
if (!prior)
|
|
132
133
|
return;
|
|
134
|
+
const now = this.deps.now();
|
|
135
|
+
const cancelled = this.cancelScheduledControl(prior, now);
|
|
133
136
|
this.persist({
|
|
134
137
|
...prior,
|
|
135
138
|
state: 'disabled',
|
|
136
139
|
requestedEnabled: false,
|
|
137
140
|
generation: prior.generation + 1,
|
|
138
141
|
nextEvaluationAt: null,
|
|
142
|
+
...(cancelled ? { lastControlId: null } : {}),
|
|
139
143
|
stopReason: reason,
|
|
140
|
-
updatedAt:
|
|
141
|
-
});
|
|
144
|
+
updatedAt: now,
|
|
145
|
+
}, cancelled);
|
|
142
146
|
this.cancelTimer(sessionId);
|
|
143
147
|
}
|
|
144
148
|
evaluate(sessionId) {
|
|
@@ -241,41 +245,71 @@ export class AutopilotCoordinator {
|
|
|
241
245
|
decision.kind === 'complete' ||
|
|
242
246
|
decision.kind === 'disable')
|
|
243
247
|
this.cancelTimer(sessionId);
|
|
244
|
-
if (next !== prior)
|
|
245
|
-
|
|
248
|
+
if (next !== prior) {
|
|
249
|
+
const cancelled = decision.kind === 'requestAttention' ||
|
|
250
|
+
decision.kind === 'complete' ||
|
|
251
|
+
decision.kind === 'disable'
|
|
252
|
+
? this.cancelScheduledControl(prior, now)
|
|
253
|
+
: undefined;
|
|
254
|
+
this.persist(cancelled ? { ...next, lastControlId: null } : next, cancelled);
|
|
255
|
+
}
|
|
246
256
|
return this.snapshot(sessionId);
|
|
247
257
|
}
|
|
248
|
-
|
|
258
|
+
turnCompleted(sessionId) {
|
|
259
|
+
this.activitySettled(sessionId);
|
|
260
|
+
}
|
|
261
|
+
/** Handles only plan lifecycle safety; ordinary plan mutations are ignored. */
|
|
262
|
+
planStatusChanged(sessionId) {
|
|
249
263
|
const prior = this.deps.store.find(sessionId);
|
|
264
|
+
if (!prior?.requestedEnabled)
|
|
265
|
+
return;
|
|
250
266
|
const plan = this.deps.plan(sessionId);
|
|
251
|
-
if (!
|
|
267
|
+
if (!plan) {
|
|
268
|
+
this.cancel(sessionId, 'planRemoved');
|
|
252
269
|
return;
|
|
270
|
+
}
|
|
253
271
|
if (prior.planIdentity && prior.planIdentity !== plan.identity) {
|
|
254
272
|
this.cancel(sessionId, 'planReplaced');
|
|
255
273
|
return;
|
|
256
274
|
}
|
|
257
|
-
|
|
258
|
-
|
|
275
|
+
if (executionComplete(plan.plan))
|
|
276
|
+
this.evaluate(sessionId);
|
|
277
|
+
}
|
|
278
|
+
/** Reacts only to fresh actor status; plan mutations are not scheduling signals. */
|
|
279
|
+
activityChanged(sessionId) {
|
|
280
|
+
const prior = this.deps.store.find(sessionId);
|
|
281
|
+
if (!prior?.requestedEnabled)
|
|
282
|
+
return;
|
|
283
|
+
const activity = this.deps.activity(sessionId);
|
|
284
|
+
if (!activity || activity.confidence !== 'fresh')
|
|
285
|
+
return;
|
|
286
|
+
const disposition = classifyAgentActivity(activity);
|
|
287
|
+
if (disposition === 'attention') {
|
|
288
|
+
this.evaluate(sessionId);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
if (disposition === 'active') {
|
|
292
|
+
this.cancelTimer(sessionId);
|
|
259
293
|
const now = this.deps.now();
|
|
260
|
-
this.
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
{
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
294
|
+
const cancelled = this.cancelScheduledControl(prior, now);
|
|
295
|
+
const subagentsWorking = activity.aggregateSubagents === 'working' ||
|
|
296
|
+
activity.aggregateSubagents === 'awaitingAgent';
|
|
297
|
+
if (cancelled ||
|
|
298
|
+
prior.state !== 'monitoring' ||
|
|
299
|
+
prior.nextEvaluationAt ||
|
|
300
|
+
(subagentsWorking && prior.consecutiveNoProgress > 0))
|
|
301
|
+
this.persist({
|
|
302
|
+
...prior,
|
|
303
|
+
state: 'monitoring',
|
|
304
|
+
...(cancelled ? { generation: prior.generation + 1, lastControlId: null } : {}),
|
|
305
|
+
...(subagentsWorking ? { consecutiveNoProgress: 0 } : {}),
|
|
306
|
+
nextEvaluationAt: null,
|
|
307
|
+
updatedAt: now,
|
|
308
|
+
}, cancelled);
|
|
309
|
+
return;
|
|
274
310
|
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
turnCompleted(sessionId) {
|
|
278
|
-
this.activitySettled(sessionId);
|
|
311
|
+
if (disposition === 'settled')
|
|
312
|
+
this.activitySettled(sessionId);
|
|
279
313
|
}
|
|
280
314
|
activitySettled(sessionId) {
|
|
281
315
|
const prior = this.deps.store.find(sessionId);
|
|
@@ -295,14 +329,16 @@ export class AutopilotCoordinator {
|
|
|
295
329
|
const prior = this.deps.store.find(sessionId);
|
|
296
330
|
if (!prior || !prior.requestedEnabled)
|
|
297
331
|
return;
|
|
332
|
+
const now = this.deps.now();
|
|
333
|
+
const cancelled = this.cancelScheduledControl(prior, now);
|
|
298
334
|
this.persist({
|
|
299
335
|
...prior,
|
|
300
336
|
state: 'monitoring',
|
|
301
337
|
generation: prior.generation + 1,
|
|
302
338
|
nextEvaluationAt: null,
|
|
303
339
|
lastControlId: null,
|
|
304
|
-
updatedAt:
|
|
305
|
-
});
|
|
340
|
+
updatedAt: now,
|
|
341
|
+
}, cancelled);
|
|
306
342
|
}
|
|
307
343
|
recordControlIssued(sessionId, controlId) {
|
|
308
344
|
const prior = this.deps.store.find(sessionId);
|
|
@@ -357,12 +393,15 @@ export class AutopilotCoordinator {
|
|
|
357
393
|
if (session?.activeTurnId ||
|
|
358
394
|
this.deps.pendingInteraction(sessionId) ||
|
|
359
395
|
this.decision(sessionId, current).kind !== 'scheduleContinuation') {
|
|
396
|
+
const now = this.deps.now();
|
|
397
|
+
const cancelled = this.cancelScheduledControl(current, now);
|
|
360
398
|
this.persist({
|
|
361
399
|
...current,
|
|
362
400
|
state: 'monitoring',
|
|
401
|
+
...(cancelled ? { generation: current.generation + 1, lastControlId: null } : {}),
|
|
363
402
|
nextEvaluationAt: null,
|
|
364
|
-
updatedAt:
|
|
365
|
-
});
|
|
403
|
+
updatedAt: now,
|
|
404
|
+
}, cancelled);
|
|
366
405
|
this.evaluate(sessionId);
|
|
367
406
|
return;
|
|
368
407
|
}
|
|
@@ -398,7 +437,7 @@ export class AutopilotCoordinator {
|
|
|
398
437
|
requestedEnabled: false,
|
|
399
438
|
generation: latest.generation + 1,
|
|
400
439
|
nextEvaluationAt: null,
|
|
401
|
-
stopReason: '
|
|
440
|
+
stopReason: 'startUnavailable',
|
|
402
441
|
updatedAt: this.deps.now(),
|
|
403
442
|
});
|
|
404
443
|
return;
|
|
@@ -412,6 +451,14 @@ export class AutopilotCoordinator {
|
|
|
412
451
|
this.completionTimers.get(sessionId)?.();
|
|
413
452
|
this.completionTimers.delete(sessionId);
|
|
414
453
|
}
|
|
454
|
+
cancelScheduledControl(state, updatedAt) {
|
|
455
|
+
if (!state.lastControlId)
|
|
456
|
+
return undefined;
|
|
457
|
+
const control = this.deps.store.findControl(state.sessionId, state.lastControlId);
|
|
458
|
+
return control?.status === 'scheduled'
|
|
459
|
+
? { ...control, status: 'cancelled', updatedAt }
|
|
460
|
+
: undefined;
|
|
461
|
+
}
|
|
415
462
|
updateControl(sessionId, controlId, status, failureCode, turnId = null, eventType) {
|
|
416
463
|
const control = this.deps.store.findControl(sessionId, controlId);
|
|
417
464
|
if (!control)
|
|
@@ -503,16 +550,16 @@ export class AutopilotCoordinator {
|
|
|
503
550
|
}
|
|
504
551
|
decision(sessionId, state) {
|
|
505
552
|
const plan = this.deps.plan(sessionId);
|
|
553
|
+
const now = this.deps.now();
|
|
506
554
|
return decideAutopilot({
|
|
507
555
|
state,
|
|
508
556
|
plan: plan?.plan ?? null,
|
|
509
|
-
planIdentity: plan?.identity,
|
|
510
|
-
planFingerprint: plan ? fingerprint(plan.plan) : null,
|
|
511
557
|
activity: this.deps.activity(sessionId),
|
|
512
558
|
hasPendingInteraction: this.deps.pendingInteraction(sessionId),
|
|
513
559
|
hasActiveAttention: state.state === 'attentionRequired',
|
|
514
560
|
lastTurnOutcome: this.lastTurnOutcome(sessionId, state.lastControlId),
|
|
515
|
-
|
|
561
|
+
automaticActionCount: this.deps.store.automaticActionsSince?.(sessionId, new Date(Date.parse(now) - this.deps.policy.actionWindowMs).toISOString()) ?? 0,
|
|
562
|
+
now,
|
|
516
563
|
policy: this.deps.policy,
|
|
517
564
|
});
|
|
518
565
|
}
|