Commit 25d8019
feat(pi): Babysit foundations — shared PR/push extraction, five GitHub tools, sandbox lifetime (#5962)
* feat(pi): optional multi-provider web search for the coding agent
Adds a search provider dropdown (Exa, Serper, Parallel, Firecrawl) to the Pi
block, off by default. The selected provider's key comes from the block field or
Workspace Settings → BYOK; a Sim-hosted key is never spent, so a missing key
fails the run with a setup message instead of quietly billing Sim.
Search is available in all three modes. Local Dev and Review Code register a
host-side tool that goes through the existing provider tools, while Create PR has
no host in the loop and gets a generated Pi extension in the sandbox. Both paths
derive their requests from one normalizer and are held together by a parity test,
since the sandbox copy cannot import Sim's code.
Results are normalized to title, URL, snippet, and publication date, capped per
field and per envelope, marked untrusted in the prompt, and limited to 20
searches per run so a tool loop cannot drain the workspace's quota.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(pi): drop the banned JSON round-trip from the search parity test
`check:utils` bans `JSON.parse(JSON.stringify(...))`. The round-trip was
normalizing the host body to its wire form, which buys nothing here: the bodies
are plain JSON and `toEqual` already ignores undefined members.
Co-authored-by: Cursor <cursoragent@cursor.com>
* chore(agents): add reviewed-development skill and the babysit implementation plan
Carries the plan and review protocol into the repository so a cloud agent
working from the remote can read them. Temporary: the plan is removed before
this branch goes for review.
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(pi): babysit foundations — shared PR/push extraction, GitHub tools, sandbox lifetime
Stage 1 of the Babysit plan (.agents/plans/pi-babysit-mode.plan.md), sections 0,
3, and 7 plus their tests. The Babysit mode itself lands in stage 2.
Section 0 — shared extraction and push hardening:
- Move PREPARE_SCRIPT, PUSH_SCRIPT, and the finalize path/size constants from
cloud-backend.ts into cloud-shared.ts.
- Move Review Code's PR snapshot helpers into pi/github-pr.ts, generalized off
PiCloudReviewRunParams to a plain PullRequestCoordinates, and split the raw
fetch from the "must be open" wrapper so a mode that has to report a closed PR
gracefully can build on the raw form.
- Harden the one token-bearing command: GIT_CONFIG_NOSYSTEM/GIT_CONFIG_GLOBAL on
its env, git by absolute path, and an explicit HEAD:refs/heads/$BRANCH refspec.
The clone script now emits a .git/config digest marker as its last line for
every mode; only Babysit will verify it.
Section 3 — five GitHub tools, registered but not wired into the block dropdown:
github_list_review_threads, github_reply_review_thread,
github_resolve_review_thread, github_status_check_rollup (GraphQL) and
github_job_logs (REST). Plus a nullable repo_full_name on the PR reader's branch
parse, declared on its own output rather than the shared BRANCH_REF_OUTPUT.
Section 7 — CreateSandboxOptions.lifetimeMs threaded to E2B's timeoutMs, clamped
below the one-hour Hobby ceiling and lowerable by PI_SANDBOX_LIFETIME_MS. Daytona
is deliberately untouched. The per-command Pi timeout is capped at the lifetime.
* fix(tools): correct the rollup CheckRun selection and stop leaking the token on redirect
Two defects found in review, both verified against the live GitHub API.
GraphQL's CheckRun has no `output` object — that is REST's shape. It exposes
`title`, `summary`, and `text` as flat nullable fields, confirmed by introspecting
the schema. The old selection made every github_status_check_rollup call fail with
"Field 'output' doesn't exist on type 'CheckRun'", delivered as an HTTP 200 errors
payload that no fixture-based test could catch. The corrected query was run against
a real PR and returns 18 check runs plus a Vercel status context, with title and
summary null on every Actions run exactly as the plan predicted.
github_job_logs redirects to third-party blob storage, and Sim's tool fetch follows
redirects itself rather than through the fetch spec, so it replayed the GitHub token
to that host. Tools can now declare `stripAuthOnRedirect`, and the log reader does.
Also from review: pin Review Code's "must be open" guard with a test now that it
lives in its own function, drop the stream reader in github_job_logs since the
executor already hands transformResponse a capped buffer, and correct three doc
comments that overstated what they guaranteed.
* test(tools): cover the stripAuthOnRedirect plumbing end to end
Asserting the flag on the tool config alone would not catch a regression in
formatRequestParams or in the executor's call into secureFetchWithPinnedIP, so
pin what the fetch layer actually receives, in both the opted-in and the default
case.
* fix(pi): correct the push-hardening claim, reserve finalize time, tighten isRequired
Three review findings, each verified rather than taken on faith.
PUSH_SCRIPT's comment claimed GIT_CONFIG_NOSYSTEM and GIT_CONFIG_GLOBAL close
config-driven URL rewriting. They do not: reproduced locally on git 2.43, a
repository-local url.*.insteadOf still rewrites the push URL and sends the token's
userinfo to another host. That is the scope a root agent in the checkout can
actually write, and it stays open until a mode verifies the config digest — which
is Babysit, per the plan. The comment now says that instead of the opposite.
PI_TIMEOUT_MS capped the Pi command at the whole sandbox lifetime, so the sandbox
always died first and the stated benefit — a clean timeout instead of an opaque
SDK error — could never happen. It now reserves the clone and finalize budgets it
shares the sandbox with, leaving the host time to commit and push whatever the
agent produced.
isRequired is Boolean! on both CheckRun and StatusContext (confirmed by schema
introspection), so the nullable parse modelled a value GitHub cannot send and left
stage 2 a tri-state to handle. It is required now, and an absent value fails loudly
rather than reading as "not required", which would let a failing required check
stop blocking the green verdict.
Also: a github-pr.test.ts pinning that the raw fetchPrSnapshot does not throw on a
closed PR (the entire reason for the wrapper split, previously untested), a
cloud-shared.test.ts for the timeout reserve and the digest line, the E2B lifetime
ceiling documented next to E2B_PI_TEMPLATE_ID as section 7 asks, and the new
registry tests no longer leaving their fake tools registered.
* fix(pi): reserve both finalize budgets in the Pi command timeout
Create PR dispatches two commands at FINALIZE_TIMEOUT_MS, not one — the commit
and the push — so reserving a single budget left the push unbudgeted and the
worst case overshot the sandbox lifetime by exactly that amount. Losing the
sandbox during the push is the most expensive moment to lose it: the work is
committed and unpushed, which is the outcome the reserve exists to prevent.
The comment no longer claims more than the arithmetic delivers. What is reserved
is each command's timeout ceiling rather than its measured elapsed time, so this
is a budget that adds up, not a guarantee. Two other comments described Babysit
verifying the config digest in the present tense, when no mode verifies it yet.
Also drops the digest-line test: it asserted a string constant contains its own
substrings, while cloud-backend.test.ts already pins the property that matters —
the marker being the clone's last line, after the remote rewrite.
* docs(pi): stop describing Babysit's digest check in the present tense
Three comments still read as statements of current behavior: the Create PR push
test's note beside the assertion that proves no verification happens, github-pr's
module doc naming a second consumer that does not exist yet, and the timeout
floor claiming a short-lifetime run was doomed regardless when the reserved
ceilings are pessimistic enough that it may well finish.
* fix(pi): scope the sandbox lifetime cap to E2B and harden the job-log path
Deriving PI_TIMEOUT_MS from the E2B lifetime applied it to every provider, so a
Daytona Create PR run lost its ~90-minute agent turn to a ceiling Daytona does
not have — it stops on inactivity instead. The reserve now only applies when the
provider imposes an absolute lifetime.
A configured PI_SANDBOX_LIFETIME_MS below the clone and finalize reserves left no
positive remainder for the turn, so E2B could reap the sandbox before the push.
Such a value is raised to a floor rather than rejected: a module-scope throw on a
config typo would take down every path that imports this, not just Pi.
github_job_logs returns its response body verbatim, so unlike its siblings that
parse a typed shape, a coordinate carrying URL syntax turned a bearer-authenticated
request into a general read. Path segments are now escaped and the job id checked.
Also corrects the plan's rollup field path: GraphQL's CheckRun has no output
object, and isRequired is Boolean!, so stage 2 needs neither the nested path nor
an unknown-required branch.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Add Pi Babysit mode
* fix(pi): wait on required checks before optional failures
* fix(pi): preserve Daytona babysit budget
* fix(pi): bound babysit round setup
* fix(pi): keep babysit sandboxes active
* fix(pi): report babysit round state accurately
* fix(pi): classify babysit finalize failures
* fix(pi): preserve babysit partial state
* fix(pi): retain post-push check state
* fix(pi): retain pending rereview state
* fix(pi): normalize empty sandbox provider
* Move Babysit into Create PR
* Fix Babysit wait-only budgeting
* Wait for reviews before skipped-thread exit
* Polish Babysit reviewer field spacing
* Fix duplicated Internet Search section from staging merge
The staging merge landed the branch's Internet Search section and
staging's reviewed replacement side by side, leaving two `### Internet
Search` headings and two `#internet-search` anchors. The branch's copy
also still claimed a Settings > BYOK fallback for the search key, which
staging deliberately removed.
Keep staging's section and fold the branch's only new fact — that the
Babysit continuation sandbox carries both keys — into its warning callout.
* fix(pi): correct Babysit check, budget, and push-guard accuracy
Correctness:
- The `.github/` push refusal compared raw `git diff --name-only` output,
which git C-quotes for non-ASCII paths. `.github/workflows/évil.yml`
arrived as `".github/workflows/\303\251vil.yml"` — leading quote included
— so neither `.github` nor `.github/` matched and the file pushed. Both
name-listing diffs now pin `core.quotePath=false`; Create PR's does too so
`changedFiles` reports real names.
- `CANCELLED` and `STALE` were counted as non-failing conclusions, so a
cancelled required check produced `checksGreen: true` and `stopReason:
'clean'` on a PR branch protection still blocks. Both now fall through to
failing, matching every other unknown conclusion.
- The per-round check bound counted optional checks, so a repo with a wide
optional matrix ended the run at `bounds_exceeded` before a single review
thread was addressed. Only required-check overflow is fatal now; the rest
trims, required checks first, and reports what was left out. This also
makes the prompt's existing slice reachable.
- A re-review request that posted nothing still re-armed `requestedAt` with
`landed: false`, leaving the loop waiting on a review nobody had asked
for — burning the remaining lifetime on a billed idle sandbox before
reporting `awaiting_review` on a clean PR. The previous request now stands.
- Prompt bounds threw where every other bound in the file trims, ending a
busy PR's run on round one after the PR and its review comments were
already posted. They now drop trailing entries and note the omission.
- `babysitMode` used a strict boolean compare; a `switch` input arriving as
the string 'true' silently opened a draft PR and skipped Babysit while the
editor showed it enabled. Matches `wait-handler`'s coercion now.
- The fork check compared head against the block's typed owner/repo, so a
renamed repository — which GitHub serves through a 301 while reporting the
canonical name — was reported as a fork. Compares head against base now.
- Each round's diff is capped like Create PR's. The cumulative guard measures
the net change, so a round that reverts an earlier addition passed it while
contributing a full-size diff.
- Reviewer mentions must start with `@`. Each entry becomes its own issue
comment re-posted every round, so a comma inside one left prose on the PR.
Efficiency:
- Thread and check reads per poll now run together; neither consumes the
other's result and both are paginating loops.
- `babysitReviewLandedSince` takes the `latestReview` the caller already
fetched instead of re-listing the PR for it.
- Actions log reads fan out in small batches rather than one at a time.
Cleanup:
- `BabysitFinalizeError` was a twin of `BabysitGitHubError`; folded together.
- Replaced the hand-inlined copies of `threadsAreClean`.
- Dropped `MEMORY_MODES`, a duplicate of `AUTHORING_MODES`, and the
`parsePiMode` tombstone for a mode that never shipped.
Adds regression tests for the quoted `.github` path, cancelled/stale required
checks, and the renamed-repository snapshot.
* fix(pi): budget Babysit against the run's real deadline
Three fixes that each needed to land a level below where the symptom showed.
Execution deadline. Babysit planned its wait loop against
`getMaxExecutionTimeout()`, which unconditionally returns the enterprise
async ceiling (90 min) with no regard for the run's plan or sync/async mode
— the sync ceiling is 300s on free, 3000s on pro. A synchronously triggered
run was therefore killed mid-loop with the PR already opened, its review
comments already posted, and none of the rounds/stopReason outputs produced.
Rather than thread a numeric deadline through ExecutionContext — five entry
points that would each have to remember it, and nothing to catch the one that
forgot — `createTimeoutAbortController` now records the deadline against the
signal it creates, and `getRemainingExecutionMs(signal)` reads it back. The
number cannot disagree with the timer that enforces it, because both are
established in the one place the timeout exists, and every entry point
already hands the executor that signal. `undefined` means unknown, not
unlimited: Babysit keeps the old ceiling as its fallback for an untimed run.
Job logs. The executor caps a response at 10 MB and throws rather than
truncating, so a verbose CI job produced no diagnostic at all — and GitHub
Actions reports null title/summary on every check run, leaving the agent a
bare URL it has no tool to follow. The tool now sends `Range: bytes=-N` so
the storage host returns only the tail. Since a suffix range is a request and
not a guarantee, a 200 still takes the local slice.
That made the old output dishonest, so the contract changed while the tool is
still new and has one consumer: `totalCharacters` (which a ranged read cannot
know) is replaced by `totalBytes`, sourced from the `Content-Range` total and
null when unreported. A ranged body is trimmed at its first line break, since
the byte window cuts mid-line and can split a multi-byte character.
Generated docs. `github.mdx` was missing the `repo_full_name` the PR reader
now returns, and regenerating deleted the head/base rows instead of adding it:
`scripts/generate-docs.ts` only expands a spread at depth 0 of a const, and
`PR_BRANCH_REF_OUTPUT` spread inline under `properties`. Restructured into a
named properties const in types.ts, next to the shapes it belongs with, which
the generator resolves the same way it already resolves BRANCH_REF_OUTPUT.
Only the github.mdx hunk is committed. The generator is lossy elsewhere —
it drops 126 lines of trigger configuration from jira.mdx — which is
pre-existing drift for whoever owns that surface, not this branch.
* fix(pi): refuse any Git-quoted path before the Babysit push
`core.quotePath=false` stopped Git escaping non-ASCII bytes, but it closed one
instance rather than the class. Git still quotes any path it cannot state on a
single line — one containing a newline, a double quote, a backslash, or a tab —
and such a path arrives with a leading `"`, so the `.github/` prefix test does
not match it and the refusal is bypassed exactly as before.
Refuse any quoted path outright. Unescaping instead would put a second
implementation of Git's quoting rules on the security-relevant side of the
push, and these characters have no legitimate place in a source path.
* fix(pi): harden the Babysit push against a repository the agent controls
Every host-side guard before the push was computed by a git invocation the
agent could influence from inside `.git/`, which is never committed and so is
covered by neither the config digest nor any content check.
- Diff measurement ignored `.git/info/attributes`. One line saying `* -diff`
reduced a 500 KB change to `Binary files differ`: verified locally as 119
bytes reported against a real 500,147, so the 200 KB cumulative bound never
fired, and the `diff` block output — the only record of what an unattended,
review-comment-steered agent pushed — recorded the same nothing. Both diffs
now run `--text --no-ext-diff --no-textconv` with an empty
`core.attributesFile`.
- `rev-list --count` and `merge-base --is-ancestor` answered about replaced
history. A `refs/replace/*` mapping makes a five-commit chain report one,
while the pushed SHA stays real. `GIT_NO_REPLACE_OBJECTS` is now set for
both the prepare and push commands.
- The push asserted HEAD's *shape* — right branch, one commit past the pin, a
descendant — every part of which survives `commit --amend` to a different
tree. So the bounds, the quoted-path refusal, the `.github/` refusal and the
reported diff could all describe a commit other than the one pushed. The
validated SHA is now passed in and the refspec names it.
- The digest comparison resolved `cat`, `sha256sum` and `cut` through `$PATH`
in the same script that invokes git absolutely for exactly that reason, and
was handed the expected digest in its own environment — so a shim could
print it. The utilities are now absolute.
- The clone left the token in `.git/config` when the pinned-SHA assertion
failed, because `set -e` aborted before `remote set-url`. Reordered.
- `changedFiles` reached the block output unscrubbed on the Babysit path,
where Create PR already scrubs it. Names are agent-chosen.
These reduce exposure; they do not bound it. E2B runs each command as
`bash -l`, so a login-shell profile the agent writes executes ahead of the
next host command with the token in its environment. Removing the token from
the sandbox entirely means pushing host-side through the Git Data API, which
the ≤50-file / ≤200 KB bound already makes practical.
* fix(pi): correct switch coercion for draft and tidy Babysit reporting
- `draft` had the same string-coercion bug that `babysitMode` was fixed for one
line above it. A switch arrives as `'true'`/`'false'` when its value came
through a variable reference, an API trigger payload, or a legacy serialized
workflow, and `inputs.draft !== false` read `'false'` as truthy — opening a
draft PR against the user's explicit setting. Both now go through one
`isSwitchEnabled` helper that handles either polarity and takes the field's
default, because the bug is opposite on each.
- `mergePhaseDiffs` joined two separately-capped diffs without re-capping, so
the combined output could reach twice MAX_DIFF_BYTES.
- The cancellation poller's `logger.warn` was the one message in these files
emitted unscrubbed. A Redis poll error is unlikely to carry a run credential,
but a uniform invariant is easier to keep than a per-call-site argument.
- Renamed `waitWithSandboxKeepalive` to `waitWithSandboxProbe`. E2B's `timeoutMs`
counts down from create and is reset only by `Sandbox.setTimeout`, never by
running a command, so `true` every four minutes proves liveness and buys no
time. The old name invited raising the round wait on the assumption that waits
extend the sandbox, which would let E2B reap it mid-wait.
- Dropped a `{@link}` to a symbol in another module that was never imported.
* docs(tools): record why the Babysit GitHub tools are registry-only
The same branch added four user-facing GitHub tools through the full
block-exposure recipe (v2 variant, tools.access, dropdown, subBlocks) and
five internal ones through none of it. The distinction is deliberate — the
five are called by the Pi Babysit handler via executeTool, which resolves
against the registry rather than any block's access list — but nothing in CI
encodes it, and `check-block-registry.ts` silently skips ids it cannot find.
Worth stating because the trap is non-obvious: `GitHubV2Block` builds its
access list by appending `_v2` to every entry, so adding one of these to
`tools.access` without first adding a v2 variant would point the block at an
id that does not exist.
* docs(pi): document the clean stop reason and Babysit's fixed bounds
The FAQ told readers to inspect `stopReason`, but the reference list never
named `clean` — the one value that means the PR actually reached the goal
state — and omitted `closed_or_merged`, `fork_pr`, and `check_read_failed`.
Also records the bounds that were previously undiscoverable, split by how
each one actually behaves: the reviewer-mention limits reject the block
before the run starts, the 30-thread limit trims a round, and only the
failing-check and cumulative-change limits produce `bounds_exceeded`.
Corrects step 6, which claimed Babysit reruns CI. It never does — the push
is what re-triggers checks.
Co-Authored-By: Claude <noreply@anthropic.com>
* docs(tools): correct and widen the registry-only note
The previous note contrasted these five with "the user-facing tools added
alongside them", implying this branch added both. It did not: the branch
never touches blocks/blocks/github.ts, and github_create_pr_review came from
#5471, which predates staging. The real contrast is with every user-facing
GitHub tool in the registry.
Also records the governance consequence, which was the part actually worth
writing down: the permission-group deny list is built from tools.access, so
an admin cannot deny these from the UI, and the allowedIntegrations gate
keys on block type while Babysit calls them with a tool id alone.
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(pi): size the sandbox to the run's own execution timeout
The Pi sandbox lifetime was a global constant while the execution timeout is
per-plan and per-mode, varying 18x (a free sync run gets 5 minutes, an async
run 90). Every Pi sandbox asked E2B for the same sub-hour ceiling, so a
five-minute run whose web process died left a sandbox billing for an hour.
PI_SANDBOX_LIFETIME_MS could not close the gap: its floor is 31 minutes.
resolvePiRunLifetimeMs lowers the provider ceiling to whatever the run's own
deadline leaves, read from the signal that enforces it. Untimed runs and
Daytona are unchanged, so no path gets a longer lifetime than before.
The turn cap had to move with it. PI_TIMEOUT_MS reserved the clone and both
finalize budgets out of the ceiling as a module constant; leaving it there
while shrinking the lifetime would re-open the exact bug its docs describe —
the sandbox dying first, taking the agent's finished work with it unpushed.
It is now resolvePiTimeoutMs(lifetimeMs), and each backend resolves the
lifetime once and feeds both, so the two cannot disagree.
Two things this surfaced:
Babysit had to read context.signal, not the cancellation signal it uses
everywhere else. createCancellationSignal returns a fresh controller that
only forwards aborts, so the deadline lookup answers "unknown" through it and
would have silently left the longest-lived mode on the ceiling. Covered by a
test that fails against the wrong signal.
The E2B adapter tested lifetimeMs for truthiness, so a run resolving to zero
would have had the key dropped and been handed the SDK's five-minute default
- longer than it asked for, on the run least entitled to it.
Options precede the callback in withPiSandbox so that adding one did not
re-indent every caller's sandbox body.
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(pi): raise the sandbox ceiling to the longest execution we allow
The ceiling was pinned just under E2B's one-hour *Hobby* session limit. Sim is
on Professional, where the limit is 24 hours, so the cap was enforcing a
restriction no plan imposes — and it sat below the 90-minute async execution
ceiling, which made the sandbox the binding constraint. A long Babysit run
could be handed a 90-minute budget and still lose its sandbox at 59.
Derived from getMaxExecutionTimeout rather than given a number of its own, so
the sandbox always outlasts the longest run the platform permits and an
operator who raises the async timeout does not have to know this file exists.
The provider session limit stays as a clamp, so the derivation can never ask
E2B for a lifetime it will refuse.
Effect: ceiling 59 -> 90 min, and the agent turn it funds 29 -> 60 min, since
resolvePiTimeoutMs reserves the clone and both finalize budgets out of it.
Runs with a shorter deadline are unaffected — resolvePiRunLifetimeMs already
lowers the ceiling to whatever the run itself has left.
Co-Authored-By: Claude <noreply@anthropic.com>
* docs(pi): describe the deadline-sized sandbox, not a fixed hour
Both facts in this paragraph were stale: the lifetime is no longer a single
sub-hour constant (it tracks the run's own remaining execution time), and the
ceiling was justified by E2B's Hobby limit on an account that is on
Professional.
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(pi): share the sandbox sizing and lift E2B off the base default
The two Pi images had drifted on exactly the axis their shared module exists to
prevent. Daytona asked for 4 CPU / 8 GB; the E2B template asked for nothing and
inherited its base default of 2 vCPU / 512 MB. That is a 16x memory gap between
the provider Pi normally runs on and the one it fails over to, so a failover
could be OOM-killed doing work that had just succeeded.
512 MB is too small independently of the drift: the Pi CLI is a Node process
holding an LLM context, running beside a clone of the user's repository, and
Node is OOM-killed rather than degraded at that ceiling — which reaches the
user as an opaque agent failure.
CPU and memory now come from pi-sandbox-packages.ts alongside the package
lists. Disk stays in the Daytona renderer: its 10 GB per-sandbox cap is a hard
provider limit with no E2B equivalent, so it is the one dimension where the
images legitimately differ.
E2B fixes resources at template build time, so this takes effect only when
build-pi-e2b-template.ts is re-run — nothing builds these images in CI.
Co-Authored-By: Claude <noreply@anthropic.com>
* chore(pi): remove internal planning files
* chore(pi): remove generated review commands
* fix(pi): align babysit toggle visibility
---------
Co-authored-by: Bill Leoutsakos <billleoutsakos@Bills-MacBook-Pro.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Bill Leoutsakos <billleoutsakos@Mac.localdomain>
Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
Co-authored-by: Claude <noreply@anthropic.com>1 parent 9edf892 commit 25d8019
58 files changed
Lines changed: 8367 additions & 237 deletions
File tree
- apps
- docs/content/docs/en
- integrations
- workflows/blocks
- sim
- app/workspace/[workspaceId]/w
- [workflowId]/components/panel/components/editor
- components/preview/components/preview-editor
- blocks
- blocks
- executor/handlers/pi
- search
- lib
- core
- config
- execution-limits
- execution/remote-sandbox
- scripts
- tools
- github
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
59 | 59 | | |
60 | 60 | | |
61 | 61 | | |
| 62 | + | |
62 | 63 | | |
63 | 64 | | |
64 | 65 | | |
65 | 66 | | |
| 67 | + | |
66 | 68 | | |
67 | 69 | | |
68 | 70 | | |
| |||
Large diffs are not rendered by default.
Lines changed: 18 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
650 | 650 | | |
651 | 651 | | |
652 | 652 | | |
653 | | - | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
654 | 663 | | |
655 | 664 | | |
656 | 665 | | |
| |||
707 | 716 | | |
708 | 717 | | |
709 | 718 | | |
710 | | - | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
711 | 727 | | |
712 | 728 | | |
713 | 729 | | |
| |||
Lines changed: 10 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1482 | 1482 | | |
1483 | 1483 | | |
1484 | 1484 | | |
1485 | | - | |
| 1485 | + | |
| 1486 | + | |
| 1487 | + | |
| 1488 | + | |
| 1489 | + | |
| 1490 | + | |
| 1491 | + | |
| 1492 | + | |
| 1493 | + | |
| 1494 | + | |
1486 | 1495 | | |
1487 | 1496 | | |
1488 | 1497 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
10 | 18 | | |
11 | 19 | | |
12 | 20 | | |
| |||
75 | 83 | | |
76 | 84 | | |
77 | 85 | | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
22 | 28 | | |
23 | 29 | | |
24 | 30 | | |
| |||
46 | 52 | | |
47 | 53 | | |
48 | 54 | | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
49 | 80 | | |
50 | 81 | | |
51 | 82 | | |
| |||
85 | 116 | | |
86 | 117 | | |
87 | 118 | | |
88 | | - | |
| 119 | + | |
89 | 120 | | |
90 | 121 | | |
| 122 | + | |
91 | 123 | | |
92 | 124 | | |
93 | 125 | | |
| |||
204 | 236 | | |
205 | 237 | | |
206 | 238 | | |
207 | | - | |
| 239 | + | |
208 | 240 | | |
209 | 241 | | |
210 | 242 | | |
| |||
216 | 248 | | |
217 | 249 | | |
218 | 250 | | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
219 | 272 | | |
220 | 273 | | |
221 | 274 | | |
| |||
230 | 283 | | |
231 | 284 | | |
232 | 285 | | |
233 | | - | |
| 286 | + | |
234 | 287 | | |
235 | 288 | | |
236 | 289 | | |
| |||
269 | 322 | | |
270 | 323 | | |
271 | 324 | | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
272 | 335 | | |
273 | 336 | | |
274 | 337 | | |
| |||
464 | 527 | | |
465 | 528 | | |
466 | 529 | | |
467 | | - | |
468 | | - | |
469 | | - | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
470 | 533 | | |
471 | 534 | | |
472 | 535 | | |
473 | 536 | | |
474 | 537 | | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
475 | 542 | | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
476 | 552 | | |
477 | 553 | | |
478 | 554 | | |
| |||
524 | 600 | | |
525 | 601 | | |
526 | 602 | | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + | |
| 625 | + | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
527 | 633 | | |
528 | 634 | | |
529 | 635 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
314 | 314 | | |
315 | 315 | | |
316 | 316 | | |
| 317 | + | |
317 | 318 | | |
318 | 319 | | |
319 | 320 | | |
| |||
0 commit comments