@12ui/design 0.2.76 → 0.2.78
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/SKILL.md +1 -1
- package/dist/cli-codex-readiness.d.ts +6 -0
- package/dist/cli-codex-readiness.d.ts.map +1 -1
- package/dist/cli-codex-readiness.js +12 -12
- package/dist/cli-codex-readiness.js.map +1 -1
- package/dist/cli-help/design.d.ts +2 -2
- package/dist/cli-help/design.d.ts.map +1 -1
- package/dist/cli-help/design.js +2 -0
- package/dist/cli-help/design.js.map +1 -1
- package/dist/cli-help/index.d.ts +2 -2
- package/dist/cli-review-command.d.ts.map +1 -1
- package/dist/cli-review-command.js +2 -0
- package/dist/cli-review-command.js.map +1 -1
- package/dist/cli-run.d.ts.map +1 -1
- package/dist/cli-run.js +6 -0
- package/dist/cli-run.js.map +1 -1
- package/dist/cli-workspace-draw.d.ts +1 -11
- package/dist/cli-workspace-draw.d.ts.map +1 -1
- package/dist/cli-workspace-draw.js +18 -18
- package/dist/cli-workspace-draw.js.map +1 -1
- package/dist/cli-workspace-runner.d.ts +30 -0
- package/dist/cli-workspace-runner.d.ts.map +1 -0
- package/dist/cli-workspace-runner.js +105 -0
- package/dist/cli-workspace-runner.js.map +1 -0
- package/dist/mcp-slate-image.js +1 -1
- package/dist/mcp-slate-image.js.map +1 -1
- package/dist/mcp-slate-tool-defs.js +1 -1
- package/dist/mcp-slate-tool-defs.js.map +1 -1
- package/dist/mcp-slate-ui-copy.d.ts +403 -33
- package/dist/mcp-slate-ui-copy.d.ts.map +1 -1
- package/dist/mcp-slate-ui-copy.js +247 -57
- package/dist/mcp-slate-ui-copy.js.map +1 -1
- package/dist/mcp-slate-ui-icu.d.ts +47 -0
- package/dist/mcp-slate-ui-icu.d.ts.map +1 -0
- package/dist/mcp-slate-ui-icu.js +229 -0
- package/dist/mcp-slate-ui-icu.js.map +1 -0
- package/dist/mcp-slate-ui-locale-match.d.ts +12 -0
- package/dist/mcp-slate-ui-locale-match.d.ts.map +1 -0
- package/dist/mcp-slate-ui-locale-match.js +34 -0
- package/dist/mcp-slate-ui-locale-match.js.map +1 -0
- package/dist/mcp-slate-ui-locales/de-DE.d.ts +9 -0
- package/dist/mcp-slate-ui-locales/de-DE.d.ts.map +1 -0
- package/dist/mcp-slate-ui-locales/de-DE.js +217 -0
- package/dist/mcp-slate-ui-locales/de-DE.js.map +1 -0
- package/dist/mcp-slate-ui-locales/es-419.d.ts +9 -0
- package/dist/mcp-slate-ui-locales/es-419.d.ts.map +1 -0
- package/dist/mcp-slate-ui-locales/es-419.js +217 -0
- package/dist/mcp-slate-ui-locales/es-419.js.map +1 -0
- package/dist/mcp-slate-ui-locales/es-ES.d.ts +9 -0
- package/dist/mcp-slate-ui-locales/es-ES.d.ts.map +1 -0
- package/dist/mcp-slate-ui-locales/es-ES.js +217 -0
- package/dist/mcp-slate-ui-locales/es-ES.js.map +1 -0
- package/dist/mcp-slate-ui-locales/fr-FR.d.ts +9 -0
- package/dist/mcp-slate-ui-locales/fr-FR.d.ts.map +1 -0
- package/dist/mcp-slate-ui-locales/fr-FR.js +217 -0
- package/dist/mcp-slate-ui-locales/fr-FR.js.map +1 -0
- package/dist/mcp-slate-ui-locales/hi-IN.d.ts +9 -0
- package/dist/mcp-slate-ui-locales/hi-IN.d.ts.map +1 -0
- package/dist/mcp-slate-ui-locales/hi-IN.js +217 -0
- package/dist/mcp-slate-ui-locales/hi-IN.js.map +1 -0
- package/dist/mcp-slate-ui-locales/index.d.ts +11 -0
- package/dist/mcp-slate-ui-locales/index.d.ts.map +1 -0
- package/dist/mcp-slate-ui-locales/index.js +34 -0
- package/dist/mcp-slate-ui-locales/index.js.map +1 -0
- package/dist/mcp-slate-ui-locales/it-IT.d.ts +9 -0
- package/dist/mcp-slate-ui-locales/it-IT.d.ts.map +1 -0
- package/dist/mcp-slate-ui-locales/it-IT.js +217 -0
- package/dist/mcp-slate-ui-locales/it-IT.js.map +1 -0
- package/dist/mcp-slate-ui-locales/ja-JP.d.ts +9 -0
- package/dist/mcp-slate-ui-locales/ja-JP.d.ts.map +1 -0
- package/dist/mcp-slate-ui-locales/ja-JP.js +217 -0
- package/dist/mcp-slate-ui-locales/ja-JP.js.map +1 -0
- package/dist/mcp-slate-ui-locales/ko-KR.d.ts +9 -0
- package/dist/mcp-slate-ui-locales/ko-KR.d.ts.map +1 -0
- package/dist/mcp-slate-ui-locales/ko-KR.js +217 -0
- package/dist/mcp-slate-ui-locales/ko-KR.js.map +1 -0
- package/dist/mcp-slate-ui-locales/pt-BR.d.ts +9 -0
- package/dist/mcp-slate-ui-locales/pt-BR.d.ts.map +1 -0
- package/dist/mcp-slate-ui-locales/pt-BR.js +217 -0
- package/dist/mcp-slate-ui-locales/pt-BR.js.map +1 -0
- package/dist/mcp-slate-ui-locales/zh-CN.d.ts +9 -0
- package/dist/mcp-slate-ui-locales/zh-CN.d.ts.map +1 -0
- package/dist/mcp-slate-ui-locales/zh-CN.js +217 -0
- package/dist/mcp-slate-ui-locales/zh-CN.js.map +1 -0
- package/dist/mcp-slate-ui-locales/zh-TW.d.ts +9 -0
- package/dist/mcp-slate-ui-locales/zh-TW.d.ts.map +1 -0
- package/dist/mcp-slate-ui-locales/zh-TW.js +217 -0
- package/dist/mcp-slate-ui-locales/zh-TW.js.map +1 -0
- package/dist/mcp-slate-ui-script-bridge.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-bridge.js +8 -9
- package/dist/mcp-slate-ui-script-bridge.js.map +1 -1
- package/dist/mcp-slate-ui-script-dialog.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-dialog.js +60 -30
- package/dist/mcp-slate-ui-script-dialog.js.map +1 -1
- package/dist/mcp-slate-ui-script-inline.d.ts +9 -6
- package/dist/mcp-slate-ui-script-inline.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-inline.js +91 -46
- package/dist/mcp-slate-ui-script-inline.js.map +1 -1
- package/dist/mcp-slate-ui-script-inspiration-collage.d.ts +20 -0
- package/dist/mcp-slate-ui-script-inspiration-collage.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-inspiration-collage.js +68 -0
- package/dist/mcp-slate-ui-script-inspiration-collage.js.map +1 -0
- package/dist/mcp-slate-ui-script-inspiration-grid.d.ts +26 -0
- package/dist/mcp-slate-ui-script-inspiration-grid.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-inspiration-grid.js +246 -0
- package/dist/mcp-slate-ui-script-inspiration-grid.js.map +1 -0
- package/dist/mcp-slate-ui-script-inspiration.d.ts +10 -9
- package/dist/mcp-slate-ui-script-inspiration.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-inspiration.js +161 -120
- package/dist/mcp-slate-ui-script-inspiration.js.map +1 -1
- package/dist/mcp-slate-ui-script-l10n.d.ts +29 -0
- package/dist/mcp-slate-ui-script-l10n.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-l10n.js +135 -0
- package/dist/mcp-slate-ui-script-l10n.js.map +1 -0
- package/dist/mcp-slate-ui-script-more.d.ts +3 -2
- package/dist/mcp-slate-ui-script-more.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-more.js +19 -18
- package/dist/mcp-slate-ui-script-more.js.map +1 -1
- package/dist/mcp-slate-ui-script-pause.d.ts +33 -0
- package/dist/mcp-slate-ui-script-pause.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-pause.js +217 -0
- package/dist/mcp-slate-ui-script-pause.js.map +1 -0
- package/dist/mcp-slate-ui-script-remote.d.ts +2 -0
- package/dist/mcp-slate-ui-script-remote.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-remote.js +47 -6
- package/dist/mcp-slate-ui-script-remote.js.map +1 -1
- package/dist/mcp-slate-ui-script-scribble.js +1 -1
- package/dist/mcp-slate-ui-script-select.js +6 -6
- package/dist/mcp-slate-ui-script-stage.d.ts +3 -2
- package/dist/mcp-slate-ui-script-stage.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-stage.js +31 -19
- package/dist/mcp-slate-ui-script-stage.js.map +1 -1
- package/dist/mcp-slate-ui-script-state.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-state.js +77 -57
- package/dist/mcp-slate-ui-script-state.js.map +1 -1
- package/dist/mcp-slate-ui-script.d.ts +2 -2
- package/dist/mcp-slate-ui-script.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script.js +21 -7
- package/dist/mcp-slate-ui-script.js.map +1 -1
- package/dist/mcp-slate-ui-styles-dialog.d.ts +6 -7
- package/dist/mcp-slate-ui-styles-dialog.d.ts.map +1 -1
- package/dist/mcp-slate-ui-styles-dialog.js +13 -29
- package/dist/mcp-slate-ui-styles-dialog.js.map +1 -1
- package/dist/mcp-slate-ui-styles-inspiration.d.ts +18 -0
- package/dist/mcp-slate-ui-styles-inspiration.d.ts.map +1 -0
- package/dist/mcp-slate-ui-styles-inspiration.js +43 -0
- package/dist/mcp-slate-ui-styles-inspiration.js.map +1 -0
- package/dist/mcp-slate-ui-styles-pause.d.ts +10 -0
- package/dist/mcp-slate-ui-styles-pause.d.ts.map +1 -0
- package/dist/mcp-slate-ui-styles-pause.js +25 -0
- package/dist/mcp-slate-ui-styles-pause.js.map +1 -0
- package/dist/mcp-slate-ui-styles-stage.d.ts +10 -6
- package/dist/mcp-slate-ui-styles-stage.d.ts.map +1 -1
- package/dist/mcp-slate-ui-styles-stage.js +24 -16
- package/dist/mcp-slate-ui-styles-stage.js.map +1 -1
- package/dist/mcp-slate-ui-styles.d.ts +12 -5
- package/dist/mcp-slate-ui-styles.d.ts.map +1 -1
- package/dist/mcp-slate-ui-styles.js +38 -21
- package/dist/mcp-slate-ui-styles.js.map +1 -1
- package/dist/mcp-slate-ui.d.ts +11 -3
- package/dist/mcp-slate-ui.d.ts.map +1 -1
- package/dist/mcp-slate-ui.js +24 -16
- package/dist/mcp-slate-ui.js.map +1 -1
- package/dist/mosaic-bands.d.ts +44 -0
- package/dist/mosaic-bands.d.ts.map +1 -0
- package/dist/mosaic-bands.js +153 -0
- package/dist/mosaic-bands.js.map +1 -0
- package/dist/review-discovery.d.ts.map +1 -1
- package/dist/review-discovery.js +36 -54
- package/dist/review-discovery.js.map +1 -1
- package/dist/review-page.d.ts.map +1 -1
- package/dist/review-page.js +2 -1
- package/dist/review-page.js.map +1 -1
- package/dist/review-run-roots.d.ts +40 -0
- package/dist/review-run-roots.d.ts.map +1 -0
- package/dist/review-run-roots.js +94 -0
- package/dist/review-run-roots.js.map +1 -0
- package/dist/review-server.d.ts +2 -0
- package/dist/review-server.d.ts.map +1 -1
- package/dist/review-server.js +2 -0
- package/dist/review-server.js.map +1 -1
- package/dist/review-types.d.ts +10 -0
- package/dist/review-types.d.ts.map +1 -1
- package/dist/slate-actions.d.ts +3 -3
- package/dist/slate-actions.d.ts.map +1 -1
- package/dist/slate-actions.js +9 -8
- package/dist/slate-actions.js.map +1 -1
- package/dist/slate-browser-host-script.d.ts +4 -0
- package/dist/slate-browser-host-script.d.ts.map +1 -1
- package/dist/slate-browser-host-script.js +25 -6
- package/dist/slate-browser-host-script.js.map +1 -1
- package/dist/slate-browser-host.d.ts +2 -1
- package/dist/slate-browser-host.d.ts.map +1 -1
- package/dist/slate-browser-host.js +18 -5
- package/dist/slate-browser-host.js.map +1 -1
- package/dist/slate-commit.js +7 -7
- package/dist/slate-commit.js.map +1 -1
- package/dist/slate-corpus.d.ts.map +1 -1
- package/dist/slate-corpus.js +3 -2
- package/dist/slate-corpus.js.map +1 -1
- package/dist/slate-edit-runner.d.ts.map +1 -1
- package/dist/slate-edit-runner.js +5 -4
- package/dist/slate-edit-runner.js.map +1 -1
- package/dist/slate-editability.d.ts +2 -0
- package/dist/slate-editability.d.ts.map +1 -1
- package/dist/slate-editability.js +1 -1
- package/dist/slate-editability.js.map +1 -1
- package/dist/slate-errors.d.ts +7 -1
- package/dist/slate-errors.d.ts.map +1 -1
- package/dist/slate-errors.js +3 -2
- package/dist/slate-errors.js.map +1 -1
- package/dist/slate-handoff-options.d.ts +2 -1
- package/dist/slate-handoff-options.d.ts.map +1 -1
- package/dist/slate-handoff-options.js +2 -2
- package/dist/slate-handoff-options.js.map +1 -1
- package/dist/slate-handoff.js +1 -1
- package/dist/slate-handoff.js.map +1 -1
- package/dist/slate-image-executor.d.ts +28 -3
- package/dist/slate-image-executor.d.ts.map +1 -1
- package/dist/slate-image-executor.js +55 -11
- package/dist/slate-image-executor.js.map +1 -1
- package/dist/slate-inspiration.js +2 -2
- package/dist/slate-inspiration.js.map +1 -1
- package/dist/slate-local-image.d.ts.map +1 -1
- package/dist/slate-local-image.js +4 -1
- package/dist/slate-local-image.js.map +1 -1
- package/dist/slate-lock.js +1 -1
- package/dist/slate-lock.js.map +1 -1
- package/dist/slate-resume.js +6 -6
- package/dist/slate-resume.js.map +1 -1
- package/dist/slate-round-params.d.ts +3 -0
- package/dist/slate-round-params.d.ts.map +1 -1
- package/dist/slate-round-params.js +5 -0
- package/dist/slate-round-params.js.map +1 -1
- package/dist/slate-round-prompt.d.ts +15 -3
- package/dist/slate-round-prompt.d.ts.map +1 -1
- package/dist/slate-round-prompt.js +14 -5
- package/dist/slate-round-prompt.js.map +1 -1
- package/dist/slate-round-queries.d.ts +18 -0
- package/dist/slate-round-queries.d.ts.map +1 -0
- package/dist/slate-round-queries.js +29 -0
- package/dist/slate-round-queries.js.map +1 -0
- package/dist/slate-round-runner.d.ts.map +1 -1
- package/dist/slate-round-runner.js +12 -9
- package/dist/slate-round-runner.js.map +1 -1
- package/dist/slate-round-search.js +5 -5
- package/dist/slate-round-search.js.map +1 -1
- package/dist/slate-run-action.d.ts.map +1 -1
- package/dist/slate-run-action.js +2 -1
- package/dist/slate-run-action.js.map +1 -1
- package/dist/slate-runner-context.d.ts +3 -1
- package/dist/slate-runner-context.d.ts.map +1 -1
- package/dist/slate-runner-context.js +4 -3
- package/dist/slate-runner-context.js.map +1 -1
- package/dist/slate-runner-failure.d.ts +7 -1
- package/dist/slate-runner-failure.d.ts.map +1 -1
- package/dist/slate-runner-failure.js +6 -5
- package/dist/slate-runner-failure.js.map +1 -1
- package/dist/slate-runtime.d.ts.map +1 -1
- package/dist/slate-runtime.js +1 -0
- package/dist/slate-runtime.js.map +1 -1
- package/dist/slate-versions.js +3 -3
- package/dist/slate-versions.js.map +1 -1
- package/dist/slate-view-contract.d.ts +62 -1
- package/dist/slate-view-contract.d.ts.map +1 -1
- package/dist/slate-view-contract.js +30 -0
- package/dist/slate-view-contract.js.map +1 -1
- package/dist/slate-view.d.ts.map +1 -1
- package/dist/slate-view.js +19 -3
- package/dist/slate-view.js.map +1 -1
- package/dist/slate-workspace-parse.d.ts.map +1 -1
- package/dist/slate-workspace-parse.js +22 -0
- package/dist/slate-workspace-parse.js.map +1 -1
- package/dist/slate-workspace-types.d.ts +3 -1
- package/dist/slate-workspace-types.d.ts.map +1 -1
- package/dist/workspace-draw-client.d.ts +58 -5
- package/dist/workspace-draw-client.d.ts.map +1 -1
- package/dist/workspace-draw-client.js +82 -9
- package/dist/workspace-draw-client.js.map +1 -1
- package/dist/workspace-draw-codex.d.ts +9 -4
- package/dist/workspace-draw-codex.d.ts.map +1 -1
- package/dist/workspace-draw-codex.js +17 -3
- package/dist/workspace-draw-codex.js.map +1 -1
- package/dist/workspace-draw-messages.d.ts +31 -0
- package/dist/workspace-draw-messages.d.ts.map +1 -1
- package/dist/workspace-draw-messages.js +30 -0
- package/dist/workspace-draw-messages.js.map +1 -1
- package/dist/workspace-draw-run.d.ts +19 -1
- package/dist/workspace-draw-run.d.ts.map +1 -1
- package/dist/workspace-draw-run.js +98 -5
- package/dist/workspace-draw-run.js.map +1 -1
- package/dist/workspace-draw-store.d.ts +2 -0
- package/dist/workspace-draw-store.d.ts.map +1 -1
- package/dist/workspace-draw-store.js +3 -1
- package/dist/workspace-draw-store.js.map +1 -1
- package/dist/workspace-draw-types.d.ts +2 -0
- package/dist/workspace-draw-types.d.ts.map +1 -1
- package/dist/workspace-draw-types.js +2 -0
- package/dist/workspace-draw-types.js.map +1 -1
- package/dist/workspace-origin.d.ts +15 -0
- package/dist/workspace-origin.d.ts.map +1 -0
- package/dist/workspace-origin.js +36 -0
- package/dist/workspace-origin.js.map +1 -0
- package/dist/workspace-runner-children.d.ts +39 -0
- package/dist/workspace-runner-children.d.ts.map +1 -0
- package/dist/workspace-runner-children.js +139 -0
- package/dist/workspace-runner-children.js.map +1 -0
- package/dist/workspace-runner-client.d.ts +43 -0
- package/dist/workspace-runner-client.d.ts.map +1 -0
- package/dist/workspace-runner-client.js +72 -0
- package/dist/workspace-runner-client.js.map +1 -0
- package/dist/workspace-runner-main.d.ts +56 -0
- package/dist/workspace-runner-main.d.ts.map +1 -0
- package/dist/workspace-runner-main.js +378 -0
- package/dist/workspace-runner-main.js.map +1 -0
- package/dist/workspace-runner-policy.d.ts +40 -0
- package/dist/workspace-runner-policy.d.ts.map +1 -0
- package/dist/workspace-runner-policy.js +47 -0
- package/dist/workspace-runner-policy.js.map +1 -0
- package/dist/workspace-runner-spawn.d.ts +42 -0
- package/dist/workspace-runner-spawn.d.ts.map +1 -0
- package/dist/workspace-runner-spawn.js +60 -0
- package/dist/workspace-runner-spawn.js.map +1 -0
- package/dist/workspace-runner-stop.d.ts +25 -0
- package/dist/workspace-runner-stop.d.ts.map +1 -0
- package/dist/workspace-runner-stop.js +44 -0
- package/dist/workspace-runner-stop.js.map +1 -0
- package/dist/workspace-runner-store.d.ts +26 -0
- package/dist/workspace-runner-store.d.ts.map +1 -0
- package/dist/workspace-runner-store.js +114 -0
- package/dist/workspace-runner-store.js.map +1 -0
- package/open-design.json +2 -2
- package/package.json +1 -1
- package/runtime/codex-conversion/src/images/native-frame.mjs +103 -0
- package/runtime/codex-conversion/src/images/native-invoke.mjs +24 -5
- package/runtime/codex-conversion/src/images/native.mjs +14 -5
- package/runtime/codex-conversion/src/run-store.mjs +21 -1
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { packageIdentity } from './client-version.js';
|
|
4
|
+
import { SlateError } from './slate-errors.js';
|
|
5
|
+
import { acquireLock, parseHolder, RUNNER_HEARTBEAT_INTERVAL_MS, staleWhenHeartbeatLapsed } from './slate-lock.js';
|
|
6
|
+
import { DrawHttpError, DrawTransportError } from './workspace-draw-client.js';
|
|
7
|
+
import { runWorkspaceDraw } from './workspace-draw-run.js';
|
|
8
|
+
import { defaultDataRoot, opLockIsLive, opRootOf } from './workspace-draw-store.js';
|
|
9
|
+
import { createRunnerClient } from './workspace-runner-client.js';
|
|
10
|
+
import { codexChildRecorder, opCodexAlive, reapCodexChildren } from './workspace-runner-children.js';
|
|
11
|
+
import { RUNNER_POLICY } from './workspace-runner-policy.js';
|
|
12
|
+
import { createRunnerLog, ensureRunnerDir, readRunnerToken, removeRunnerToken, runnerDirOf, runnerLockFile, runnerTokenWrittenAtMs, } from './workspace-runner-store.js';
|
|
13
|
+
/** The stops after which the token cannot speak to the server: no goodbye, and no lease kept while finishing. */
|
|
14
|
+
const SILENT_STOPS = new Set(['token_missing', 'token_invalid', 'token_expired']);
|
|
15
|
+
const interruptibleSleep = (milliseconds, signal) => new Promise((resolve) => {
|
|
16
|
+
if (signal.aborted) {
|
|
17
|
+
resolve();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const done = () => { clearTimeout(timer); signal.removeEventListener('abort', done); resolve(); };
|
|
21
|
+
const timer = setTimeout(done, milliseconds);
|
|
22
|
+
signal.addEventListener('abort', done, { once: true });
|
|
23
|
+
});
|
|
24
|
+
/** What one draw's outcome means for the runner: done with the request, retry it later, or stop altogether. */
|
|
25
|
+
const verdictOf = (result) => {
|
|
26
|
+
switch (result.output.code) {
|
|
27
|
+
case 'done':
|
|
28
|
+
case 'replayed':
|
|
29
|
+
case 'partial':
|
|
30
|
+
case 'failed':
|
|
31
|
+
case 'unknown_op':
|
|
32
|
+
return { kind: 'done' };
|
|
33
|
+
// Another run holds the request (this Mac's agent command, or a runner whose claim is in flight), or the server
|
|
34
|
+
// could not be reached or answered with a redirect: not drawn this time.
|
|
35
|
+
case 'op_in_progress':
|
|
36
|
+
case 'op_in_flight':
|
|
37
|
+
case 'needs_escalation':
|
|
38
|
+
case 'redirected':
|
|
39
|
+
return { kind: 'retry' };
|
|
40
|
+
case 'token_invalid': return { kind: 'stop', stop: 'token_invalid' };
|
|
41
|
+
case 'cli_outdated': return { kind: 'stop', stop: 'cli_outdated' };
|
|
42
|
+
// Codex cannot draw here (or stopped being able to): the agent's command will say why.
|
|
43
|
+
case 'no_engine': return { kind: 'stop', stop: 'no_engine' };
|
|
44
|
+
default: return { kind: 'stop', stop: 'fault' };
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* What a failed heartbeat or claim is logged as: the server's error code, `redirect` with its sentence (naming the
|
|
49
|
+
* origin that answered) for a redirect the client did not follow, else `otherwise`.
|
|
50
|
+
*/
|
|
51
|
+
const failureOf = (error, otherwise) => {
|
|
52
|
+
if (error instanceof DrawHttpError)
|
|
53
|
+
return { code: error.code };
|
|
54
|
+
if (error instanceof DrawTransportError && error.kind === 'redirect')
|
|
55
|
+
return { code: 'redirect', message: error.message };
|
|
56
|
+
return { code: otherwise };
|
|
57
|
+
};
|
|
58
|
+
export const runWorkspaceRunner = async (args) => {
|
|
59
|
+
const deps = args.deps ?? {};
|
|
60
|
+
const env = deps.env ?? process.env;
|
|
61
|
+
const policy = { ...RUNNER_POLICY, ...deps.policy };
|
|
62
|
+
const now = deps.now ?? Date.now;
|
|
63
|
+
const sleep = deps.sleep ?? interruptibleSleep;
|
|
64
|
+
const dataRoot = deps.dataRoot ?? defaultDataRoot(env);
|
|
65
|
+
const cliVersion = deps.cliVersion ?? packageIdentity().version;
|
|
66
|
+
const runnerId = deps.runnerId ?? randomUUID();
|
|
67
|
+
const draw = deps.draw ?? runWorkspaceDraw;
|
|
68
|
+
const dir = runnerDirOf(dataRoot, args.origin, args.workspace);
|
|
69
|
+
await ensureRunnerDir(dir);
|
|
70
|
+
const log = createRunnerLog(dir, () => new Date(now()));
|
|
71
|
+
let lock;
|
|
72
|
+
try {
|
|
73
|
+
lock = await acquireLock({ file: runnerLockFile(dir), policy: staleWhenHeartbeatLapsed, waitMs: 0 });
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (error instanceof SlateError && error.code === 'workspace_busy')
|
|
77
|
+
return { stop: 'already_running', runnerId, drawn: [], handedBack: [] };
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
const halt = new AbortController();
|
|
81
|
+
let stop = null;
|
|
82
|
+
const stopWith = (reason) => {
|
|
83
|
+
stop ??= reason;
|
|
84
|
+
halt.abort();
|
|
85
|
+
};
|
|
86
|
+
const onExternalStop = () => { stopWith('signal'); };
|
|
87
|
+
deps.stop?.addEventListener('abort', onExternalStop, { once: true });
|
|
88
|
+
if (deps.stop?.aborted)
|
|
89
|
+
stopWith('signal');
|
|
90
|
+
// The lock's heartbeat, and the check that it is still ours (a run after a long sleep may have taken it over).
|
|
91
|
+
const keepLock = setInterval(() => {
|
|
92
|
+
void (async () => {
|
|
93
|
+
const raw = await readFile(lock.file, 'utf8').catch(() => '');
|
|
94
|
+
if (parseHolder(raw)?.nonce !== lock.holder.nonce) {
|
|
95
|
+
stopWith('lock_lost');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
await lock.touch().catch(() => undefined);
|
|
99
|
+
})();
|
|
100
|
+
}, policy.lockTouchMs ?? RUNNER_HEARTBEAT_INTERVAL_MS);
|
|
101
|
+
keepLock.unref?.();
|
|
102
|
+
let token = '';
|
|
103
|
+
const client = createRunnerClient({
|
|
104
|
+
origin: args.origin,
|
|
105
|
+
cliVersion,
|
|
106
|
+
token: async () => token,
|
|
107
|
+
...(deps.fetch ? { fetch: deps.fetch } : {}),
|
|
108
|
+
});
|
|
109
|
+
const children = codexChildRecorder(dir, runnerId);
|
|
110
|
+
// Each call runs to its own end on a signal, and is recorded while it runs.
|
|
111
|
+
const processOptions = { interruptOnSignal: false, ...children };
|
|
112
|
+
const active = new Map();
|
|
113
|
+
const attempts = new Map();
|
|
114
|
+
const givenUp = new Set();
|
|
115
|
+
const drawn = [];
|
|
116
|
+
let lastActivity = now();
|
|
117
|
+
let failures = 0;
|
|
118
|
+
await log({ event: 'started', runnerId, origin: args.origin, workspace: args.workspace, cliVersion });
|
|
119
|
+
const drawOne = (opId) => {
|
|
120
|
+
const work = (async () => {
|
|
121
|
+
await log({ event: 'draw_started', opId });
|
|
122
|
+
let result;
|
|
123
|
+
try {
|
|
124
|
+
result = await draw({ opId, token, origin: args.origin, engine: 'auto', dryRun: false, runnerId }, { processOptions, ...deps.drawDeps, env, dataRoot, cliVersion, progress: (line) => { void log({ event: 'progress', opId, line }); } });
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
await log({ event: 'draw_fault', opId, message: error instanceof Error ? error.message : String(error) });
|
|
128
|
+
stopWith('fault');
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const verdict = verdictOf(result);
|
|
132
|
+
await log({ event: 'draw_finished', opId, code: result.output.code, exitCode: result.exitCode, message: result.output.message, record: result.output.record });
|
|
133
|
+
if (verdict.kind === 'done')
|
|
134
|
+
drawn.push(opId);
|
|
135
|
+
if (verdict.kind === 'retry') {
|
|
136
|
+
const tries = (attempts.get(opId) ?? 0) + 1;
|
|
137
|
+
attempts.set(opId, tries);
|
|
138
|
+
// A request the runner cannot get through is the agent's: the next heartbeat leaves it out, so it is released.
|
|
139
|
+
if (tries >= policy.attemptsPerOp)
|
|
140
|
+
givenUp.add(opId);
|
|
141
|
+
}
|
|
142
|
+
if (verdict.kind === 'stop')
|
|
143
|
+
stopWith(verdict.stop);
|
|
144
|
+
})().finally(() => {
|
|
145
|
+
active.delete(opId);
|
|
146
|
+
lastActivity = now();
|
|
147
|
+
});
|
|
148
|
+
active.set(opId, work);
|
|
149
|
+
};
|
|
150
|
+
/** Takes back a claim on a request this runner is still drawing; no second draw starts. */
|
|
151
|
+
const reclaim = async (opId) => {
|
|
152
|
+
try {
|
|
153
|
+
await client.claim(opId, runnerId);
|
|
154
|
+
await log({ event: 'reclaimed', opId });
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
if (error instanceof DrawHttpError && error.code === 'token_invalid') {
|
|
158
|
+
stopWith('token_invalid');
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
await log({ event: 'reclaim_refused', opId, ...failureOf(error, 'transport') });
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
const claimAndDraw = async (beat) => {
|
|
165
|
+
for (const op of beat.ops) {
|
|
166
|
+
if (stop)
|
|
167
|
+
return;
|
|
168
|
+
if (givenUp.has(op.opId))
|
|
169
|
+
continue;
|
|
170
|
+
// Drawing it already. Its claim outlives a lapsed lease (in flight on the server until its quiet window ends), so
|
|
171
|
+
// a long sleep leaves nothing to take back; a request whose window ended is the agent's and is not listed. One
|
|
172
|
+
// listed unheld while this runner still lists it as drawing was let go by someone else's goodbye in its name:
|
|
173
|
+
// take it back, inside its window, and keep drawing (a refused take-back leaves the draw to finish or be given up).
|
|
174
|
+
if (active.has(op.opId)) {
|
|
175
|
+
if (op.drawer === null)
|
|
176
|
+
await reclaim(op.opId);
|
|
177
|
+
if (stop)
|
|
178
|
+
return;
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
if (active.size >= policy.maxActive)
|
|
182
|
+
continue;
|
|
183
|
+
if (op.drawer !== null && op.drawer !== runnerId)
|
|
184
|
+
continue;
|
|
185
|
+
// Its round waits on the person: nobody draws it until they continue (or its countdown ends). It stays listed,
|
|
186
|
+
// so the runner stays for it.
|
|
187
|
+
if (op.waiting)
|
|
188
|
+
continue;
|
|
189
|
+
// The agent's own command is drawing it on this Mac: it is that run's. Its op lock goes quiet while the Mac
|
|
190
|
+
// sleeps, so a Codex call it recorded that is still alive keeps the request its run's as well.
|
|
191
|
+
const opRoot = opRootOf(dataRoot, op.opId);
|
|
192
|
+
if (await opLockIsLive(opRoot))
|
|
193
|
+
continue;
|
|
194
|
+
if (await opCodexAlive(opRoot)) {
|
|
195
|
+
await log({ event: 'left_to_live_call', opId: op.opId });
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
try {
|
|
199
|
+
await client.claim(op.opId, runnerId);
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
if (error instanceof DrawHttpError && error.code === 'token_invalid') {
|
|
203
|
+
stopWith('token_invalid');
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
await log({ event: 'claim_refused', opId: op.opId, ...failureOf(error, 'transport') });
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
// A stop that came while the claim was on its way: draw nothing new. The goodbye gives the claim back.
|
|
210
|
+
if (stop) {
|
|
211
|
+
await log({ event: 'claim_dropped', opId: op.opId, stop });
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
await log({ event: 'claimed', opId: op.opId, kind: op.kind });
|
|
215
|
+
drawOne(op.opId);
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
/**
|
|
219
|
+
* A dead runner's calls are stopped (reaped above), so its claims are over: its goodbye, sent for it, frees its
|
|
220
|
+
* requests at once, instead of leaving them in flight until their quiet window ends (on this Mac that is proven; a
|
|
221
|
+
* runner on another Mac cannot know it, so the server keeps them in flight).
|
|
222
|
+
*/
|
|
223
|
+
const releaseDeadRunners = async (reaped) => {
|
|
224
|
+
const dead = [...new Set(reaped.flatMap((entry) => (entry.runnerId && entry.runnerId !== runnerId ? [entry.runnerId] : [])))];
|
|
225
|
+
if (dead.length === 0)
|
|
226
|
+
return;
|
|
227
|
+
const fresh = await readRunnerToken(dir);
|
|
228
|
+
if (!fresh)
|
|
229
|
+
return;
|
|
230
|
+
token = fresh;
|
|
231
|
+
for (const deadId of dead) {
|
|
232
|
+
try {
|
|
233
|
+
await client.heartbeat({ runnerId: deadId, drawing: [], stopping: true });
|
|
234
|
+
await log({ event: 'released_dead_runner', runnerId: deadId });
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
await log({ event: 'release_dead_runner_failed', runnerId: deadId, ...failureOf(error, 'transport') });
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
const goodbye = async () => {
|
|
242
|
+
// Before the first token is read there is nothing to say it with, and nothing was ever claimed.
|
|
243
|
+
if (token === '') {
|
|
244
|
+
await log({ event: 'goodbye_skipped', reason: 'no_token' });
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
try {
|
|
248
|
+
return await client.heartbeat({ runnerId, drawing: [], stopping: true });
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
await log({ event: 'goodbye_failed', ...failureOf(error, 'transport') });
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
/**
|
|
256
|
+
* Stopping: claim nothing more, keep the lease (a heartbeat listing what is drawing) while the draws in hand finish,
|
|
257
|
+
* up to the stop deadline. Returns what is still drawing then, after stopping its Codex calls: the goodbye gives
|
|
258
|
+
* those requests back to the agent, and nothing is pushed for them.
|
|
259
|
+
*/
|
|
260
|
+
const finishDrawsInHand = async () => {
|
|
261
|
+
if (active.size === 0)
|
|
262
|
+
return [];
|
|
263
|
+
const deadline = now() + policy.stopDeadlineMs;
|
|
264
|
+
const settled = Promise.allSettled([...active.values()]);
|
|
265
|
+
const keepLease = !SILENT_STOPS.has(stop);
|
|
266
|
+
const never = new AbortController().signal;
|
|
267
|
+
await log({ event: 'finishing', stop, drawing: [...active.keys()], deadlineMs: policy.stopDeadlineMs });
|
|
268
|
+
while (active.size > 0 && now() < deadline) {
|
|
269
|
+
if (keepLease)
|
|
270
|
+
await client.heartbeat({ runnerId, drawing: [...active.keys()].filter((opId) => !givenUp.has(opId)) }).catch(() => null);
|
|
271
|
+
await Promise.race([settled, sleep(Math.max(1, Math.min(policy.pollMs, deadline - now())), never)]);
|
|
272
|
+
}
|
|
273
|
+
const left = [...active.keys()];
|
|
274
|
+
if (left.length > 0) {
|
|
275
|
+
const reaped = await reapCodexChildren(dir, { alsoOf: process.pid }).catch(() => []);
|
|
276
|
+
await log({ event: 'handed_back', opIds: left, codex: reaped.map((entry) => entry.pgid) });
|
|
277
|
+
}
|
|
278
|
+
return left;
|
|
279
|
+
};
|
|
280
|
+
try {
|
|
281
|
+
// A runner of this workspace killed outright may have left Codex calls running: they are nobody's now.
|
|
282
|
+
const reaped = await reapCodexChildren(dir).catch(() => []);
|
|
283
|
+
if (reaped.length > 0)
|
|
284
|
+
await log({ event: 'reaped', codex: reaped });
|
|
285
|
+
await releaseDeadRunners(reaped);
|
|
286
|
+
while (!stop) {
|
|
287
|
+
const fresh = await readRunnerToken(dir);
|
|
288
|
+
const writtenAtMs = fresh ? await runnerTokenWrittenAtMs(dir) : null;
|
|
289
|
+
if (!fresh || writtenAtMs === null) {
|
|
290
|
+
stopWith('token_missing');
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
// The token file is rewritten by every draw command; one older than the token's life holds a dead token.
|
|
294
|
+
if (now() - writtenAtMs >= policy.tokenLifetimeMs) {
|
|
295
|
+
stopWith('token_expired');
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
token = fresh;
|
|
299
|
+
let beat;
|
|
300
|
+
try {
|
|
301
|
+
beat = await client.heartbeat({ runnerId, drawing: [...active.keys()].filter((opId) => !givenUp.has(opId)) });
|
|
302
|
+
failures = 0;
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
if (error instanceof DrawHttpError) {
|
|
306
|
+
if (error.code === 'token_invalid') {
|
|
307
|
+
stopWith('token_invalid');
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
if (error.status === 426 || error.code === 'cli_outdated') {
|
|
311
|
+
stopWith('cli_outdated');
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
if (error.code === 'runner_busy' || error.status === 429) {
|
|
315
|
+
// Another runner's lease (a dead one lapses within one lease), or the edge limit: wait what it names.
|
|
316
|
+
await log({ event: 'wait', code: error.code, seconds: error.retryAfterSeconds });
|
|
317
|
+
if (active.size === 0 && now() - lastActivity >= policy.idleMs) {
|
|
318
|
+
stopWith('idle');
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
await sleep(Math.min(policy.leaseWaitMaxMs, Math.max(1, error.retryAfterSeconds ?? 5) * 1000), halt.signal);
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (error instanceof DrawTransportError && error.kind === 'malformed') {
|
|
326
|
+
stopWith('fault');
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
// Unreachable, a redirect or a server fault: back off and try again; idle time keeps counting.
|
|
330
|
+
failures += 1;
|
|
331
|
+
await log({ event: 'heartbeat_failed', ...failureOf(error, 'unreachable'), failures });
|
|
332
|
+
if (active.size === 0 && now() - lastActivity >= policy.idleMs) {
|
|
333
|
+
stopWith('idle');
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
336
|
+
await sleep(Math.min(policy.backoffMaxMs, policy.pollMs * 2 ** Math.min(failures, 6)), halt.signal);
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
if (beat.workspace !== args.workspace) {
|
|
340
|
+
stopWith('workspace_mismatch');
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
const open = beat.ops.filter((op) => !givenUp.has(op.opId));
|
|
344
|
+
if (open.length > 0 || active.size > 0)
|
|
345
|
+
lastActivity = now();
|
|
346
|
+
await claimAndDraw(beat);
|
|
347
|
+
if (stop)
|
|
348
|
+
break;
|
|
349
|
+
if (active.size === 0 && open.length === 0 && now() - lastActivity >= policy.idleMs) {
|
|
350
|
+
// Let the lease go; a click that raced the goodbye keeps the runner on.
|
|
351
|
+
const last = await goodbye();
|
|
352
|
+
if (last && last.ops.some((op) => op.drawer === null && !givenUp.has(op.opId))) {
|
|
353
|
+
lastActivity = now();
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
stop = 'idle';
|
|
357
|
+
await log({ event: 'stopped', stop, drawn });
|
|
358
|
+
return { stop, runnerId, drawn, handedBack: [] };
|
|
359
|
+
}
|
|
360
|
+
await sleep(policy.pollMs, halt.signal);
|
|
361
|
+
}
|
|
362
|
+
const handedBack = await finishDrawsInHand();
|
|
363
|
+
if (!SILENT_STOPS.has(stop))
|
|
364
|
+
await goodbye();
|
|
365
|
+
await log({ event: 'stopped', stop, drawn, ...(handedBack.length > 0 ? { handedBack } : {}) });
|
|
366
|
+
return { stop: stop ?? 'fault', runnerId, drawn, handedBack };
|
|
367
|
+
}
|
|
368
|
+
finally {
|
|
369
|
+
clearInterval(keepLock);
|
|
370
|
+
deps.stop?.removeEventListener('abort', onExternalStop);
|
|
371
|
+
// The token goes with the runner, unless another runner has taken the lock over (it is that runner's token now).
|
|
372
|
+
const holder = parseHolder(await readFile(lock.file, 'utf8').catch(() => ''));
|
|
373
|
+
if (holder?.nonce === lock.holder.nonce)
|
|
374
|
+
await removeRunnerToken(dir).catch(() => undefined);
|
|
375
|
+
await lock.release();
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
//# sourceMappingURL=workspace-runner-main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-runner-main.js","sourceRoot":"","sources":["../src/workspace-runner-main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The workspace runner's numbers and launch rule, in one module (CLAUDE.md item 9). The server's lease
|
|
3
|
+
* (`SLATE_RUNNER.leaseMs`, 60 s, renewed below 30 s) is what decides whether the screen tells the agent; these only
|
|
4
|
+
* pace and bound the runner itself.
|
|
5
|
+
*/
|
|
6
|
+
export declare const RUNNER_POLICY: Readonly<{
|
|
7
|
+
/** One heartbeat (which is also the poll for new clicks) every 5 s: a click starts drawing within about 5 s. */
|
|
8
|
+
pollMs: 5000;
|
|
9
|
+
/** An idle workspace lets its runner go after 30 minutes; the next click then goes to the agent, which starts one. */
|
|
10
|
+
idleMs: number;
|
|
11
|
+
/** The server allows at most three running requests per workspace; the runner draws at most that many at once. */
|
|
12
|
+
maxActive: 3;
|
|
13
|
+
/** A request the runner could not get through this many times (server unreachable mid-draw) is left to the agent. */
|
|
14
|
+
attemptsPerOp: 3;
|
|
15
|
+
/** Backoff ceiling while design.12ui.com cannot be reached. */
|
|
16
|
+
backoffMaxMs: 60000;
|
|
17
|
+
/** The longest single wait for another runner's lease to lapse (one lease). */
|
|
18
|
+
leaseWaitMaxMs: 60000;
|
|
19
|
+
/** The lock file's own heartbeat (its mtime); `null` keeps the lock module's default. */
|
|
20
|
+
lockTouchMs: number | null;
|
|
21
|
+
/**
|
|
22
|
+
* After SIGTERM or SIGINT the runner claims nothing new, keeps its lease, and lets the draws in hand finish: their
|
|
23
|
+
* Codex calls are not stopped by the signal (each is bounded by its own timeout), so their options land. This is the
|
|
24
|
+
* longest it waits: one image call's own timeout plus a minute for its pushes. What is still drawing then is given
|
|
25
|
+
* back to the agent, never marked failed.
|
|
26
|
+
*/
|
|
27
|
+
stopDeadlineMs: number;
|
|
28
|
+
/**
|
|
29
|
+
* The upload token lives 12 hours (the server's `SLATE_TIME.pushTokenTtlMs`). Every `12ui workspace draw` rewrites
|
|
30
|
+
* the token file, so a file older than this holds a dead token: the runner stops then on its own, whatever its
|
|
31
|
+
* server answers.
|
|
32
|
+
*/
|
|
33
|
+
tokenLifetimeMs: number;
|
|
34
|
+
}>;
|
|
35
|
+
/** Set to 1 and `12ui workspace draw` leaves no runner behind: every click then messages the agent, as before. */
|
|
36
|
+
export declare const RUNNER_OPT_OUT_ENV = "TWELVE_UI_NO_RUNNER";
|
|
37
|
+
export type RunnerLaunchRefusal = 'opted_out' | 'origin';
|
|
38
|
+
/** Why no runner may be left behind for this origin and environment, or null when one may. */
|
|
39
|
+
export declare const runnerLaunchRefusal: (origin: string, env: NodeJS.ProcessEnv) => RunnerLaunchRefusal | null;
|
|
40
|
+
//# sourceMappingURL=workspace-runner-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-runner-policy.d.ts","sourceRoot":"","sources":["../src/workspace-runner-policy.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,aAAa;IACxB,gHAAgH;;IAEhH,sHAAsH;;IAEtH,kHAAkH;;IAElH,qHAAqH;;IAErH,+DAA+D;;IAE/D,+EAA+E;;IAE/E,yFAAyF;iBACpE,MAAM,GAAG,IAAI;IAClC;;;;;OAKG;;IAEH;;;;OAIG;;EAEH,CAAC;AAEH,kHAAkH;AAClH,eAAO,MAAM,kBAAkB,wBAAwB,CAAC;AAExD,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEzD,8FAA8F;AAC9F,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,EAAE,KAAK,MAAM,CAAC,UAAU,KAAG,mBAAmB,GAAG,IAIlG,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { IMAGE_CALL_TIMEOUT_MS } from './slate-image-executor.js';
|
|
2
|
+
import { runnerOriginAllowed } from './workspace-origin.js';
|
|
3
|
+
/**
|
|
4
|
+
* The workspace runner's numbers and launch rule, in one module (CLAUDE.md item 9). The server's lease
|
|
5
|
+
* (`SLATE_RUNNER.leaseMs`, 60 s, renewed below 30 s) is what decides whether the screen tells the agent; these only
|
|
6
|
+
* pace and bound the runner itself.
|
|
7
|
+
*/
|
|
8
|
+
export const RUNNER_POLICY = Object.freeze({
|
|
9
|
+
/** One heartbeat (which is also the poll for new clicks) every 5 s: a click starts drawing within about 5 s. */
|
|
10
|
+
pollMs: 5_000,
|
|
11
|
+
/** An idle workspace lets its runner go after 30 minutes; the next click then goes to the agent, which starts one. */
|
|
12
|
+
idleMs: 30 * 60_000,
|
|
13
|
+
/** The server allows at most three running requests per workspace; the runner draws at most that many at once. */
|
|
14
|
+
maxActive: 3,
|
|
15
|
+
/** A request the runner could not get through this many times (server unreachable mid-draw) is left to the agent. */
|
|
16
|
+
attemptsPerOp: 3,
|
|
17
|
+
/** Backoff ceiling while design.12ui.com cannot be reached. */
|
|
18
|
+
backoffMaxMs: 60_000,
|
|
19
|
+
/** The longest single wait for another runner's lease to lapse (one lease). */
|
|
20
|
+
leaseWaitMaxMs: 60_000,
|
|
21
|
+
/** The lock file's own heartbeat (its mtime); `null` keeps the lock module's default. */
|
|
22
|
+
lockTouchMs: null,
|
|
23
|
+
/**
|
|
24
|
+
* After SIGTERM or SIGINT the runner claims nothing new, keeps its lease, and lets the draws in hand finish: their
|
|
25
|
+
* Codex calls are not stopped by the signal (each is bounded by its own timeout), so their options land. This is the
|
|
26
|
+
* longest it waits: one image call's own timeout plus a minute for its pushes. What is still drawing then is given
|
|
27
|
+
* back to the agent, never marked failed.
|
|
28
|
+
*/
|
|
29
|
+
stopDeadlineMs: IMAGE_CALL_TIMEOUT_MS + 60_000,
|
|
30
|
+
/**
|
|
31
|
+
* The upload token lives 12 hours (the server's `SLATE_TIME.pushTokenTtlMs`). Every `12ui workspace draw` rewrites
|
|
32
|
+
* the token file, so a file older than this holds a dead token: the runner stops then on its own, whatever its
|
|
33
|
+
* server answers.
|
|
34
|
+
*/
|
|
35
|
+
tokenLifetimeMs: 12 * 60 * 60_000,
|
|
36
|
+
});
|
|
37
|
+
/** Set to 1 and `12ui workspace draw` leaves no runner behind: every click then messages the agent, as before. */
|
|
38
|
+
export const RUNNER_OPT_OUT_ENV = 'TWELVE_UI_NO_RUNNER';
|
|
39
|
+
/** Why no runner may be left behind for this origin and environment, or null when one may. */
|
|
40
|
+
export const runnerLaunchRefusal = (origin, env) => {
|
|
41
|
+
if ((env[RUNNER_OPT_OUT_ENV] ?? '').trim() === '1')
|
|
42
|
+
return 'opted_out';
|
|
43
|
+
if (!runnerOriginAllowed(origin))
|
|
44
|
+
return 'origin';
|
|
45
|
+
return null;
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=workspace-runner-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-runner-policy.js","sourceRoot":"","sources":["../src/workspace-runner-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,gHAAgH;IAChH,MAAM,EAAE,KAAK;IACb,sHAAsH;IACtH,MAAM,EAAE,EAAE,GAAG,MAAM;IACnB,kHAAkH;IAClH,SAAS,EAAE,CAAC;IACZ,qHAAqH;IACrH,aAAa,EAAE,CAAC;IAChB,+DAA+D;IAC/D,YAAY,EAAE,MAAM;IACpB,+EAA+E;IAC/E,cAAc,EAAE,MAAM;IACtB,yFAAyF;IACzF,WAAW,EAAE,IAAqB;IAClC;;;;;OAKG;IACH,cAAc,EAAE,qBAAqB,GAAG,MAAM;IAC9C;;;;OAIG;IACH,eAAe,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM;CAClC,CAAC,CAAC;AAEH,kHAAkH;AAClH,MAAM,CAAC,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAIxD,8FAA8F;AAC9F,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAE,GAAsB,EAA8B,EAAE;IACxG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,GAAG;QAAE,OAAO,WAAW,CAAC;IACvE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type RunnerLaunchRefusal } from './workspace-runner-policy.js';
|
|
2
|
+
/**
|
|
3
|
+
* Leave the workspace runner behind (docs/slate-remote.md, "The workspace runner"). `12ui workspace draw` calls this
|
|
4
|
+
* once the token works (it read a plan, or was told the round waits on the person) and Codex can draw here. Nothing at
|
|
5
|
+
* all happens when the person opted out (`TWELVE_UI_NO_RUNNER=1`) or the origin is not design.12ui.com (or this
|
|
6
|
+
* machine); otherwise it stores the token it was given (the newest one reaches a running runner at its next
|
|
7
|
+
* heartbeat), and starts a runner only when no live one holds the workspace's lock on this Mac.
|
|
8
|
+
*
|
|
9
|
+
* The child gets its own session (`detached`, so `setsid`), no stdio, and is unref'd: Codex ends the shell command's
|
|
10
|
+
* process group when the command returns, and a child in its own session is not in that group. Its working
|
|
11
|
+
* directory is its own state folder. Its environment is an allowlist: what `codex exec` needs to find itself, its
|
|
12
|
+
* sign-in and its network, and where the 12ui data root is; no 12ui, OpenAI or other credential, and not the token.
|
|
13
|
+
*/
|
|
14
|
+
export declare const WORKSPACE_RUNNER_ENV_FLAG = "TWELVE_UI_WORKSPACE_RUNNER";
|
|
15
|
+
export declare const workspaceRunnerEnvironment: (parent: NodeJS.ProcessEnv) => NodeJS.ProcessEnv;
|
|
16
|
+
export type RunnerLaunch = {
|
|
17
|
+
state: 'started' | 'running';
|
|
18
|
+
pid: number | null;
|
|
19
|
+
dir: string;
|
|
20
|
+
}
|
|
21
|
+
/** No runner, and nothing written: the person opted out, or the origin may not have one. */
|
|
22
|
+
| {
|
|
23
|
+
state: 'off';
|
|
24
|
+
reason: RunnerLaunchRefusal;
|
|
25
|
+
};
|
|
26
|
+
export type RunnerLauncher = (args: {
|
|
27
|
+
origin: string;
|
|
28
|
+
token: string;
|
|
29
|
+
workspace: string;
|
|
30
|
+
dataRoot: string;
|
|
31
|
+
env: NodeJS.ProcessEnv;
|
|
32
|
+
}) => Promise<RunnerLaunch>;
|
|
33
|
+
export type RunnerSpawn = (args: {
|
|
34
|
+
origin: string;
|
|
35
|
+
workspace: string;
|
|
36
|
+
dir: string;
|
|
37
|
+
env: NodeJS.ProcessEnv;
|
|
38
|
+
}) => Promise<number | null>;
|
|
39
|
+
/** Start `12ui workspace runner` as a detached process of this same CLI build. Resolves with its PID once it spawned. */
|
|
40
|
+
export declare const spawnWorkspaceRunner: RunnerSpawn;
|
|
41
|
+
export declare const createRunnerLauncher: (spawnRunner?: RunnerSpawn) => RunnerLauncher;
|
|
42
|
+
//# sourceMappingURL=workspace-runner-spawn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-runner-spawn.d.ts","sourceRoot":"","sources":["../src/workspace-runner-spawn.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAG7F;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,yBAAyB,+BAA+B,CAAC;AAStE,eAAO,MAAM,0BAA0B,GAAI,QAAQ,MAAM,CAAC,UAAU,KAAG,MAAM,CAAC,UAI7E,CAAC;AAEF,MAAM,MAAM,YAAY,GACpB;IAAE,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AACnE,4FAA4F;GAC1F;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAElD,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAE5B,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAEvI,yHAAyH;AACzH,eAAO,MAAM,oBAAoB,EAAE,WAclC,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,cAAa,WAAkC,KAAG,cAUtF,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { runnerLaunchRefusal } from './workspace-runner-policy.js';
|
|
4
|
+
import { ensureRunnerDir, liveRunnerHolder, runnerDirOf, writeRunnerToken } from './workspace-runner-store.js';
|
|
5
|
+
/**
|
|
6
|
+
* Leave the workspace runner behind (docs/slate-remote.md, "The workspace runner"). `12ui workspace draw` calls this
|
|
7
|
+
* once the token works (it read a plan, or was told the round waits on the person) and Codex can draw here. Nothing at
|
|
8
|
+
* all happens when the person opted out (`TWELVE_UI_NO_RUNNER=1`) or the origin is not design.12ui.com (or this
|
|
9
|
+
* machine); otherwise it stores the token it was given (the newest one reaches a running runner at its next
|
|
10
|
+
* heartbeat), and starts a runner only when no live one holds the workspace's lock on this Mac.
|
|
11
|
+
*
|
|
12
|
+
* The child gets its own session (`detached`, so `setsid`), no stdio, and is unref'd: Codex ends the shell command's
|
|
13
|
+
* process group when the command returns, and a child in its own session is not in that group. Its working
|
|
14
|
+
* directory is its own state folder. Its environment is an allowlist: what `codex exec` needs to find itself, its
|
|
15
|
+
* sign-in and its network, and where the 12ui data root is; no 12ui, OpenAI or other credential, and not the token.
|
|
16
|
+
*/
|
|
17
|
+
export const WORKSPACE_RUNNER_ENV_FLAG = 'TWELVE_UI_WORKSPACE_RUNNER';
|
|
18
|
+
const INHERITED = [
|
|
19
|
+
'PATH', 'HOME', 'USER', 'LOGNAME', 'TMPDIR', 'TEMP', 'TMP', 'LANG', 'LC_ALL', 'SYSTEMROOT', 'APPDATA', 'LOCALAPPDATA',
|
|
20
|
+
'XDG_DATA_HOME', 'CODEX_HOME', 'CODEX_CLI_PATH', 'TWELVE_UI_CODEX_BIN', 'TWELVE_UI_INSTALL_SOURCE', 'TWELVE_UI_BUNDLE_ROOT',
|
|
21
|
+
'HTTPS_PROXY', 'HTTP_PROXY', 'NO_PROXY', 'ALL_PROXY', 'https_proxy', 'http_proxy', 'no_proxy', 'all_proxy',
|
|
22
|
+
'SSL_CERT_FILE', 'NODE_EXTRA_CA_CERTS',
|
|
23
|
+
];
|
|
24
|
+
export const workspaceRunnerEnvironment = (parent) => {
|
|
25
|
+
const environment = { [WORKSPACE_RUNNER_ENV_FLAG]: '1' };
|
|
26
|
+
for (const key of INHERITED)
|
|
27
|
+
if (parent[key])
|
|
28
|
+
environment[key] = parent[key];
|
|
29
|
+
return environment;
|
|
30
|
+
};
|
|
31
|
+
/** Start `12ui workspace runner` as a detached process of this same CLI build. Resolves with its PID once it spawned. */
|
|
32
|
+
export const spawnWorkspaceRunner = async (args) => {
|
|
33
|
+
const cliPath = fileURLToPath(new URL('./cli.js', import.meta.url));
|
|
34
|
+
const child = spawn(process.execPath, [cliPath, 'workspace', 'runner', '--origin', args.origin, '--workspace', args.workspace], {
|
|
35
|
+
detached: true,
|
|
36
|
+
stdio: 'ignore',
|
|
37
|
+
cwd: args.dir,
|
|
38
|
+
env: workspaceRunnerEnvironment(args.env),
|
|
39
|
+
});
|
|
40
|
+
await new Promise((resolve, reject) => {
|
|
41
|
+
child.once('spawn', () => { resolve(); });
|
|
42
|
+
child.once('error', reject);
|
|
43
|
+
});
|
|
44
|
+
child.unref();
|
|
45
|
+
return child.pid ?? null;
|
|
46
|
+
};
|
|
47
|
+
export const createRunnerLauncher = (spawnRunner = spawnWorkspaceRunner) => async (args) => {
|
|
48
|
+
const refusal = runnerLaunchRefusal(args.origin, args.env);
|
|
49
|
+
if (refusal)
|
|
50
|
+
return { state: 'off', reason: refusal };
|
|
51
|
+
const dir = runnerDirOf(args.dataRoot, args.origin, args.workspace);
|
|
52
|
+
await ensureRunnerDir(dir);
|
|
53
|
+
await writeRunnerToken(dir, args.token);
|
|
54
|
+
const live = await liveRunnerHolder(dir);
|
|
55
|
+
if (live)
|
|
56
|
+
return { state: 'running', pid: live.pid, dir };
|
|
57
|
+
// Two draws racing here may both spawn: the runner that loses the lock exits at once.
|
|
58
|
+
return { state: 'started', pid: await spawnRunner({ origin: args.origin, workspace: args.workspace, dir, env: args.env }), dir };
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=workspace-runner-spawn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-runner-spawn.js","sourceRoot":"","sources":["../src/workspace-runner-spawn.ts"],"names":[],"mappings":"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"}
|