| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat(workbot): Your agent reads sources, not categories, in a new voice (#6629) * feat(types): sources and the admin's source policy for Your agent What agents read becomes sources, not categories: calendar, email and team chat (whichever of Google, Microsoft or Slack the member has connected), and every other connection as a source of its own. Admins set each to on for everyone, members choose, or not allowed (defaults: calendar, email and chat on for everyone; other connections up to members). Members see each source with its policy, whether it is on, their instruction and last read, and change it by id or name. Check records name the sources they were about. Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(automations): sources, not categories, and a new voice for Your agent Items are source + id (a Slack message, a Gmail thread, a calendar event, an issue), still delivered once each through the ledger; the four responsibilities become presets plus anything else worth catching, and a member's mutes still apply to them. The wake prompt lists each source it may read with the member's instruction and last read time, and what is on but can't be read. The instructions are rewritten: one finding per message (the morning brief up to three points), open with why it matters now, connect the sources before writing, say what wasn't checked, end with one concrete next step, link the source with a short label, follow up when something changes, and never sort things under labels like Today or FYI or offer to draft replies. Silence, caps and quiet hours are unchanged. Links may point at the services behind the sources it read, never elsewhere. Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(den-db): record which sources a check was about (0167) agent_member_check gets a nullable sources JSON column: what a message drew on, or what couldn't be read and the connection to fix. Generated with db:generate as the next free number. Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(connect): let Your agent's token read only its member's sources A member's background agent runs with a read-scoped token. Den now adds its sources to that token as scopes only Den mints: the core sources that are on and the connections behind them. With them, Connect lets the token call a connection's own tools for the first time, but only on those connections and only tools that read: a reviewed list for Slack, Linear, Notion, GitHub and Granola, otherwise a tool its provider marks read-only whose name reads, and never one whose name writes. Native Google and Microsoft reads are limited to the calendar, mail and Teams chats of sources that are on. Search shows the agent only what it may call. Plain read tokens and writing tokens keep their rules. A resumed turn's token comes from its grant without these scopes, so it falls back to a plain read token (no connection tools). Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(den-api): Your agent reads calendar, email, team chat and chosen connections The wake resolves the member's sources (the admin's policy, their own choices with My agent on, and whether their account on each connection is ready), gives the turn a token that may read only those, lists them in the prompt with the member's instruction and last read, and drops items from anywhere else. The calendar event source is skipped when the calendar is off. A source that is on but can't be read gets one DM with the action that fixes it ("Reconnect Google Workspace"), is paused, and is told again only after it worked; with nothing readable no turn runs. Check records name the sources. Manage › Workbot's settings take a policy per source and return the organization's connections behind each. /v1/me/agent lists the member's sources and takes on/off and an instruction by id or name, with undo; the server refuses anything the admin didn't allow or turning off a source that is on for everyone, and the chat reply adds one "Connect <name>" line per source it can't read yet. Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(den-web): What agents read, and a switch per source in My bot Manage › Workbot gets "What agents read": Calendar, Email and Team chat with the connections behind them, then "Other connections (n)" behind a disclosure, each On for everyone, Members choose or Not allowed, and "Read only. Agents never send, edit or delete through these." My bot's Uses becomes one switch per source: when it was last read, a Connect or Reconnect action when the member's account isn't ready, the admin's decision locked with the reason, and the member's instruction in their own words with where it was saved and Edit. A failed check links to the connection to reconnect. Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * test(evals): prove what agents read and a member's sources A proof world with Google Workspace (not yet connected by the member) and three shared connections. The spec drives the admin's "What agents read" (not allowing one connection), the member's Uses switches, a chat change ("Granola on, for …; Linear off") that the page shows, and the admin's refusal holding for chat. The chat helper moves out of the My agent world so both use it. Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * test(evals): replay recorded timelines against Your agent Five timelines (calendar, Gmail and Slack as Connect returns them, with fictional people): a customer's Slack ask for pricing before their call, a quiet afternoon, a proposed time that collides with the calendar, an ask already answered, and a meeting it flagged that was then cancelled. Each runs with the agent's real instructions, wake prompt and reply parser, and is scored on whether it messages, the sources it names, what it connects, and how it writes. The harness's tests use a scripted model; pnpm --dir evals agent:replay runs a real one. Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * docs(workbot): sources, how Your agent writes, and its read allowlist Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> --------- Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> | 3 天前 | |
fix(browser): keep the agent's page at the panel's size instead of zooming it (#6613) While the agent used the built-in browser, its page was locked to a 1280 x 800 desktop size and drawn shrunk to fit the side panel, about a third of its size in a narrow panel, then jumped back to full size when the turn ended. It looked like the page zoomed out and in on every turn. A new default page size, Panel, locks the page at the size it already has on screen, so nothing rescales when a turn starts or ends. A page the agent takes while it is off screen adopts the panel's size the first time it is shown. Desktop, Tablet and Phone stay available as fixed sizes. Signed-off-by: Jalil <reachjalil@gmail.com> | 3 天前 | |
feat(automations): every-few-hours and before/after-meeting triggers (#6546) * chore(features): declare automationIntervalSchedules, off Every-few-hours Automation schedules ship behind their own flag, cloud and self-hosted, default off. The internal doc says what changes, how older desktops are kept safe and what turning it off does. Signed-off-by: Benjamin Shafii <ben@prologe.io> * feat(automations): add interval schedules to the shared schedule math { kind: "interval", timezone, everyHours 1-24, daysOfWeek, startHour, endHour } runs every N hours on the hour, counted from the window start each listed day. Parsing fills the days and window so stored schedules carry every field. The resolver now walks each local day's wall times, so DST gaps that shift one time onto the next count once. Also adds the one shared schedule label (formatAutomationSchedule) and the schedule-kinds capability header released desktops are narrowed by. Signed-off-by: Benjamin Shafii <ben@prologe.io> * feat(den): store, gate and schedule interval Automations - schedule_kind gains 'interval' (migration 0160). - Creating or changing to an interval needs automationIntervalSchedules; keeping an Automation's current interval does not, so editors that send the whole definition still save. - While the feature is off the scheduler records each due occurrence as skipped and the schedule moves on; nothing is deleted. - First-party desktops that do not name 'interval' in x-openwork-automation-schedule-kinds never receive interval Automations (list omits them, detail answers 404); Den web, agents and API clients see everything. The agent index carries them in moreAutomations with a summary. Signed-off-by: Benjamin Shafii <ben@prologe.io> * feat(app): pick Every few hours in the Automation editor - The editor and Calendar schedule fields offer Every few hours (every N hours, a from/until window and days) when the feature is on. - The desktop names the schedule kinds it reads on every Automation request. - One shared label replaces the duplicate formatters in the app and Den web; the Calendar describes intervals in words. - The agent listing reads every schedule kind leniently and lists moreAutomations; automation.propose and the capability knowledge describe interval schedules. Signed-off-by: Benjamin Shafii <ben@prologe.io> * chore(features): declare automationCalendarTriggers, off Cloud Automations that run before or after each meeting on the owner's Google Calendar ship behind their own flag, cloud and self-hosted, default off. The internal doc says how Den reads calendars, what a run receives and what turning it off does. Signed-off-by: Benjamin Shafii <ben@prologe.io> * feat(automations): add calendar triggers to the shared model - schedule gains { kind: "calendar", timezone, edge, offsetMinutes ±120, rule: { withExternalAttendees, titleIncludes } }: one field per revision, no clock occurrences. - calendarTriggerOccurrences (pure) turns projected Google Calendar events and a window into occurrences with a stable key per meeting edge; only timed, accepted, non-cancelled meetings with someone else invited count. - projectGoogleCalendarEvents also reports accepted, the title and a safe Meet/Calendar link; the agent's wake prompt is unchanged. - calendarTriggerPrompt frames the meeting as JSON data the invite's sender wrote; a title cannot close the frame. - A claim nonce now identifies a scheduled occurrence on its own, so two meetings at one instant are two runs; existing keys are unchanged. - runs may carry triggerContext (the meeting) for calendar runs. Signed-off-by: Benjamin Shafii <ben@prologe.io> * feat(den): run Cloud Automations around meetings from the owner's calendar - schedule_kind gains 'calendar'; runs gain an encrypted trigger_context (migration 0161). - A calendar trigger needs automationCalendarTriggers and Cloud placement; keeping the current trigger through an edit does not need the feature. - The scheduler's calendar source reads each owner's primary Google Calendar (readMemberGoogleCalendar) at most every 5 minutes, only for owners with an active calendar-triggered Automation and the feature, and claims each due occurrence with its stable key as the claim nonce. Moments older than 10 minutes, or from before the trigger was saved, never run. - The run's prompt carries the meeting as framed JSON data after the person's instructions. - An unconnected calendar puts the Automation in needs attention; a Google API error is retried on the next read. - The tick's claim-and-dispatch is shared by clock and calendar occurrences. - Schedule kinds describe themselves in the API schema for agents. Signed-off-by: Benjamin Shafii <ben@prologe.io> * feat(app): choose Around my meetings in the Automation editor - The schedule fields offer Around my meetings (before a meeting starts or after it ends, and outside-attendees only) when automationCalendarTriggers is on; the editor saves it only for a cloud placement and says why. - Proposals with a meeting trigger explain when the organization lacks the feature or the desktop cannot create Cloud placement. - automation.propose and the capability knowledge describe calendar schedules, with the meeting reaching the run as data. - The agent listing renders calendar entries; Workbot's Calendar describes them. - The proof now covers both new schedule choices, and the feature docs show the editor. Signed-off-by: Benjamin Shafii <ben@prologe.io> * refactor(app): schedule choices use the shared Select The schedule menu and the new interval and meeting choices use the shared Select instead of native selects (DESIGN.md P5), which also retires this file's UI guardrail baseline entry. The proof picks options the way a person does, and the feature docs show the updated editor. Signed-off-by: Benjamin Shafii <ben@prologe.io> * fix(server): keep the packaged server off source-only schedule modules The packaged desktop loads the server's compiled output from app.asar, where Node cannot strip types from @openwork/types' source-only schedule module. The Automation listing renders Den's summary and keeps a small fallback for the schedule kinds older Dens send, instead of importing the shared label. Signed-off-by: Benjamin Shafii <ben@prologe.io> * fix(automations): keep invite-written text out of calendar-triggered prompts A meeting's title, description and invitee names are written by whoever sent the invite, and a calendar-triggered run is unattended. The run's prompt now carries only facts Google or the owner control (times, invitee domains checked as hostnames, a Google link) and never points the agent at the event to read it. The event id and title stay on the stored run for the owner, and the title still serves titleIncludes rules. Signed-off-by: Benjamin Shafii <ben@prologe.io> --------- Signed-off-by: Benjamin Shafii <ben@prologe.io> | 4 天前 | |
perf(build): reuse shared types and remove redundant build work (#5469) * perf(build): reuse shared types and remove redundant build work Den production builds rechecked workspace implementations after building their dependencies. Emit checked declarations per file, select them through an opt-in type export condition, and reject missing declarations before compiling the API. Keep source resolution for development and preserve the existing compiler heap override. Use the same declaration settings across eighteen shared packages. Build dependency graphs in order without the database rebuilding utilities, trim unconsumed JavaScript outputs from the shared types package, and include the build configuration in pruned Docker contexts. Focused validation: Den API, Gateway and Den Gateway builds; the Den API production compile reads no shared implementation files; shared package typechecks. Signed-off-by: Jalil <reachjalil@gmail.com> * fix(build): cover exports added since the declaration boundary The Den API production build now requires every workspace export it reads to publish a declaration through the openwork-build condition. Exports added on dev in the meantime did not: three den-db entry points and the new managed-deployments package, which had no declaration build at all. Give them the same declaration setup as the other shared packages. The telemetry analytics builders also published inferred drizzle types that name drizzle-orm, which the telemetry package does not depend on, so the API compile saw `any`. Declare their row types instead; the builders and their queries are unchanged. Signed-off-by: Jalil <reachjalil@gmail.com> --------- Signed-off-by: Jalil <reachjalil@gmail.com> | 18 天前 | |
feat(computer-use): type into Chromium and Electron in the background, and read Electron fully (#6635) Background sessions still brought Chromium, Electron and Catalyst windows to the front for every key and typing step, because those apps take a process-targeted key only with WindowServer's authentication envelope. On macOS 15 and later the helper now signs background keys for those apps with SLSEventAuthenticationMessage and posts them through SkyLight, the way cua-driver does. Typing and plain keys stay in the background. Menu shortcuts and macOS 14 still take the front. Foreground steps are unchanged. For Electron builds without AXManualAccessibility, the helper falls back to AXEnhancedUserInterface, which is never sent to native apps. After either request it waits up to two seconds for the web content to appear, so the first read of a covered window is complete. Signed-off-by: Jalil <reachjalil@gmail.com> | 3 天前 | |
chore(deps): patch zod, Sentry, DOMPurify and toml advisories (#6430) * chore(deps): patch zod, Sentry, DOMPurify, toml, ip-address and Vitest advisories Bumps zod to 4.6.6 everywhere (including the two MCP servers still on zod 3), @sentry/nextjs to 10.75.2, dompurify to 3.4.17, and pins toml 5.0.1 and ip-address 10.7.4 through overrides. Evals move to vitest 4.1.12. The .opencode npm lockfile picks up the patched zod and toml. Next.js is handled separately in #6416. * chore(den): regenerate API contract for zod 4.6 zod 4.6 emits nullable unions as type arrays and requires seconds in ISO date-time patterns (RFC 3339). | 7 天前 | |
Revert "refactor(engine): remove OpenCode v1 and run only OpenCode v2 (#6515)" (#6559) This reverts commit cdc21843845df598d76e7f104038aa9dbea9f6b5. | 4 天前 | |
docs(slack): add a step-by-step Connect Slack guide for the guided setup (#6690) Adds slack/connect-slack with the tutorial video and stills from a real run against OpenWork Cloud, puts it first in the Slack tab, points the overview, bot setup, troubleshooting and connector pages at it, and describes the Add Slack checklist as the default in OpenWork Cloud. | 2 天前 | |
feat(documents): show OneDrive files beside Google Drive in Documents (#6207) Workspaces that use Microsoft 365 could only see Google Drive files in Workbot's Documents. Documents now combines both: Recent and top-level search merge Google Drive and OneDrive newest first, and the top level lists My Drive, OneDrive and Shared with me. OneDrive PDFs and images preview, and Word, Excel and text files edit inline and save back to the same OneDrive file, refused if someone else saved in between. Den adds /v1/documents/microsoft-365/files routes for listing, details, preview and inline edits, using the member's Microsoft 365 connection and its OneDrive permissions. A OneDrive file id carries its drive and item, so shared files open from their owner's drive. Both document proxies allow the new routes. In packages/documents, combinedDocumentsProvider merges several providers and tags each item with its source. A provider that fails becomes a notice with its own connect button beside the files that did load; only an outage of every provider is an error. The editor wording follows the source ("Save to OneDrive"). OneDrive joins only where the workspace has a Microsoft 365 connector, so Google-only workspaces are unchanged. The full Office editor stays Google-only for now. Signed-off-by: Jalil <reachjalil@gmail.com> | 4 天前 | |
fix(deps): patch open Dependabot security alerts (#6631) Raise overrides for body-parser 2.4.0, fast-uri 3.1.9 and qs 6.16.1, bump happy-dom to 21.0.4, nodemailer to ^10.1.4 and rustls to 0.23.46, and regenerate both pnpm lockfiles. better-auth 1.7.7 is left for a separate migration: it replaces the SCIM plugin API and changes CIMD wiring. deepmerge has no fixed release. Signed-off-by: OmarMcAdam <gh@mcadam.io> | 3 天前 | |
fix(mcp): request Google offline access so MCP sign-ins renew (#6578) Google issues a refresh token only when the authorization request carries access_type=offline, and only on a fresh consent. Its metadata does not list offline_access, so the scope-based request never applied and every Google MCP sign-in expired after an hour. Sign-in URLs on accounts.google.com now get access_type=offline and prompt=consent unless the configured sign-in address already sets them. Fixes #5514 Signed-off-by: Jalil <reachjalil@gmail.com> | 4 天前 | |
chore(deps): patch zod, Sentry, DOMPurify and toml advisories (#6430) * chore(deps): patch zod, Sentry, DOMPurify, toml, ip-address and Vitest advisories Bumps zod to 4.6.6 everywhere (including the two MCP servers still on zod 3), @sentry/nextjs to 10.75.2, dompurify to 3.4.17, and pins toml 5.0.1 and ip-address 10.7.4 through overrides. Evals move to vitest 4.1.12. The .opencode npm lockfile picks up the patched zod and toml. Next.js is handled separately in #6416. * chore(den): regenerate API contract for zod 4.6 zod 4.6 emits nullable unions as type arrays and requires seconds in ISO date-time patterns (RFC 3339). | 7 天前 | |
fix(security): standardize standalone runtimes on Node 24.22.1 (#6365) * fix(security): standardize standalone runtimes on Node 24.22.1 Pin runtime images, CI and downloads to the October security release; preserve artifact verification and require patched Node 24 in standalone launchers. Update standalone Undici, add runtime baseline and Helm probe regression coverage, and document the separate rebuild/deployment and Electron follow-ups. * fix(security): pin setup-node in image publication workflow Resolve the security review by replacing the mutable v6 action ref with its verified full commit SHA. Add a regression check that rejects mutable setup-node refs in the package-write workflow; retain Warden's human-approval safeguard. | 9 天前 | |
feat(library): preserve detail context with breadcrumbs (#6693) | 2 天前 | |
feat(admin): add organization access and usage grants (#6254) * feat(admin): add organization access and usage grants Signed-off-by: Jalil <reachjalil@gmail.com> * fix(admin): satisfy organization grant API contract checks Signed-off-by: Jalil <reachjalil@gmail.com> --------- Signed-off-by: Jalil <reachjalil@gmail.com> | 11 天前 | |
Revert "refactor(engine): remove OpenCode v1 and run only OpenCode v2 (#6515)" (#6559) This reverts commit cdc21843845df598d76e7f104038aa9dbea9f6b5. | 4 天前 | |
Revert "refactor(engine): remove OpenCode v1 and run only OpenCode v2 (#6515)" (#6559) This reverts commit cdc21843845df598d76e7f104038aa9dbea9f6b5. | 4 天前 | |
chore(deps): patch zod, Sentry, DOMPurify and toml advisories (#6430) * chore(deps): patch zod, Sentry, DOMPurify, toml, ip-address and Vitest advisories Bumps zod to 4.6.6 everywhere (including the two MCP servers still on zod 3), @sentry/nextjs to 10.75.2, dompurify to 3.4.17, and pins toml 5.0.1 and ip-address 10.7.4 through overrides. Evals move to vitest 4.1.12. The .opencode npm lockfile picks up the patched zod and toml. Next.js is handled separately in #6416. * chore(den): regenerate API contract for zod 4.6 zod 4.6 emits nullable unions as type arrays and requires seconds in ISO date-time patterns (RFC 3339). | 7 天前 | |
chore(deps): patch zod, Sentry, DOMPurify and toml advisories (#6430) * chore(deps): patch zod, Sentry, DOMPurify, toml, ip-address and Vitest advisories Bumps zod to 4.6.6 everywhere (including the two MCP servers still on zod 3), @sentry/nextjs to 10.75.2, dompurify to 3.4.17, and pins toml 5.0.1 and ip-address 10.7.4 through overrides. Evals move to vitest 4.1.12. The .opencode npm lockfile picks up the patched zod and toml. Next.js is handled separately in #6416. * chore(den): regenerate API contract for zod 4.6 zod 4.6 emits nullable unions as type arrays and requires seconds in ISO date-time patterns (RFC 3339). | 7 天前 | |
chore(deps): patch zod, Sentry, DOMPurify and toml advisories (#6430) * chore(deps): patch zod, Sentry, DOMPurify, toml, ip-address and Vitest advisories Bumps zod to 4.6.6 everywhere (including the two MCP servers still on zod 3), @sentry/nextjs to 10.75.2, dompurify to 3.4.17, and pins toml 5.0.1 and ip-address 10.7.4 through overrides. Evals move to vitest 4.1.12. The .opencode npm lockfile picks up the patched zod and toml. Next.js is handled separately in #6416. * chore(den): regenerate API contract for zod 4.6 zod 4.6 emits nullable unions as type arrays and requires seconds in ISO date-time patterns (RFC 3339). | 7 天前 | |
fix(provider-sync): keep providers on unknown session checks (#6535) * test(provider-sync): reproduce providers dropped on a failed local session check * fix(provider-sync): keep providers when the local session check fails A slow, failed or malformed desktop session check was treated as a sign-out: every provider was withdrawn and the cache deleted, so a turn that resolved its model in that window failed with ModelUnavailableError. The check is now tri-state (session / signed_out / unknown). Only a 2xx JSON null is a sign-out; unknown keeps the session, providers, cache and inventory stream and retries on the next tick. * perf(provider-sync): share the local session check across Locations Every open Location polled the local session endpoint once a second on its own, so N Locations meant N loopback requests per second, which is what pushed those checks past their 1.5 s timeout under load. One poll per endpoint and capability now serves the whole process and fans each answer out to every Location; the last Location to unload stops it. * test(provider-sync): reproduce stalled session checks in the native engine Run the shipping V2 engine, production provider plugin, credential broker, and local session bridge with a loopback hop that stalls /session beyond the plugin timeout. On origin/dev the engine catalog loses the model and the turn fails; on the fixed branch the model stays available and answers. | 4 天前 | |
fix(security): standardize standalone runtimes on Node 24.22.1 (#6365) * fix(security): standardize standalone runtimes on Node 24.22.1 Pin runtime images, CI and downloads to the October security release; preserve artifact verification and require patched Node 24 in standalone launchers. Update standalone Undici, add runtime baseline and Helm probe regression coverage, and document the separate rebuild/deployment and Electron follow-ups. * fix(security): pin setup-node in image publication workflow Resolve the security review by replacing the mutable v6 action ref with its verified full commit SHA. Add a regression check that rejects mutable setup-node refs in the package-write workflow; retain Warden's human-approval safeguard. | 9 天前 | |
chore(deps): patch zod, Sentry, DOMPurify and toml advisories (#6430) * chore(deps): patch zod, Sentry, DOMPurify, toml, ip-address and Vitest advisories Bumps zod to 4.6.6 everywhere (including the two MCP servers still on zod 3), @sentry/nextjs to 10.75.2, dompurify to 3.4.17, and pins toml 5.0.1 and ip-address 10.7.4 through overrides. Evals move to vitest 4.1.12. The .opencode npm lockfile picks up the patched zod and toml. Next.js is handled separately in #6416. * chore(den): regenerate API contract for zod 4.6 zod 4.6 emits nullable unions as type arrays and requires seconds in ISO date-time patterns (RFC 3339). | 7 天前 | |
fix(desktop): match Windows environment variable names in any case (#6449) Windows treats PATH and Path as one variable, but plain objects copied from process.env do not. A saved PATH therefore replaced the inherited Path, and merged environments could carry two spellings of one name, leaving a child process to pick one by spelling instead of by precedence. Add envKey, setEnv, deleteEnv and mergeEnv to @openwork/paths and use them wherever the desktop runtime, the saved-variable store and both engine launchers merge or read environment layers. Reserved OPENWORK_ and OPENCODE_ names are blocked in any case on Windows. Other platforms keep exact, case-sensitive names. Signed-off-by: Jalil <reachjalil@gmail.com> | 7 天前 | |
chore(tests): remove unit tests, keep one app boot test (#5589) * chore(tests): remove unit tests, keep one app boot test Delete every unit test across apps/, packages/, ee/ and scripts/ along with the scripts, workflow steps, tsconfigs and deps that only ran them. E2E journeys in evals/ are the verification surface; unit tests that a journey still runs or imports are kept. The provider-tree mount test (providers.test.tsx) is kept and renamed to apps/app/tests/app-boot.test.tsx, run as `pnpm test:boot` in CI. The packaged Electron smoke gate is unchanged. Signed-off-by: Benjamin Shafii <ben@prologe.io> * fix(ci): raise gh api buffer for large PR file lists The proof selector and evidence presenter shell out to `gh api` with Node's default 1 MiB maxBuffer. A page of /pulls/:n/files on a large deletion PR exceeds that, spawnSync fails with ENOBUFS, and selection reports 'GitHub proof selection unavailable'. Signed-off-by: Benjamin Shafii <ben@prologe.io> * fix(ci): raise gh buffer in evidence publisher Signed-off-by: Benjamin Shafii <ben@prologe.io> * chore(tests): drop unit tests added on dev since the branch Signed-off-by: Benjamin Shafii <ben@prologe.io> --------- Signed-off-by: Benjamin Shafii <ben@prologe.io> | 28 天前 | |
Revert "refactor(engine): remove OpenCode v1 and run only OpenCode v2 (#6515)" (#6559) This reverts commit cdc21843845df598d76e7f104038aa9dbea9f6b5. | 4 天前 | |
feat(review): show what changed in each screenshot and the check behind it (#5571) A screenshot in the report now reads on its own: - its caption says what the person did and what appeared or went away ("Clicked “Share”. “Share link” … appeared."), and a repeat of the previous screen collapses to one line; - the thumbnail and viewer outline where the screen changed (dashed) and what the step verified on screen (solid, labelled in the viewer), with a toggle; - the step's own check line sits under its last image, or says nothing was checked; failure frames are labelled. The report schema gains optional step, size, change, focus, settled and failure fields; the assembler passes the record's measurements through leniently and reads each image's size so marks line up on cropped thumbnails. Older records render as before. Signed-off-by: Jalil <reachjalil@gmail.com> | 4 天前 | |
fix(remote-sessions): remove avoidable startup waits (#6510) Overlap independent provider and environment snapshots with four bounded env readers, draining in-flight reads before failure and preserving rollback order. Reuse request-scoped desktop ownership and runner lookups without caching permissions across requests. Resolve desktop and Cloud status sources concurrently and retry transient Cloud unavailability on scheduled checks. Use already-ready storage responses directly. Add deterministic regressions for concurrency, rollback, admission gates and wake visibility. | 5 天前 | |
feat(workbot): run computers through a flagged Differently sandbox gateway (#6649) * feat(sandbox): run Workbot computers through a self-hosted Differently control plane Add @openwork/sandbox-differently, an adapter for the shared sandbox contract backed by Differently's API. A runner holds one project-scoped Differently key; Differently holds the OpenSandbox, Daytona and Freestyle credentials and decides by policy where each computer runs. HEADLESS_COMPUTER=differently turns it on for one runner, with DIFFERENTLY_URL, DIFFERENTLY_API_KEY and HEADLESS_COMPUTER_SNAPSHOT as a Differently template. It stays off by default. The adapter passes the shared provider and block conformance cases against an in-memory Differently, and CI runs them with the other adapters. Signed-off-by: Jalil <reachjalil@gmail.com> * fix(sandbox): trim trailing slashes without a backtracking pattern CodeQL flagged /\/+$/ on caller-supplied URLs and paths as a polynomial regular expression. Trim with a linear loop instead. Signed-off-by: Jalil <reachjalil@gmail.com> * feat(workbot): run computers through a flagged sandbox gateway Differently is now a sandbox gateway with its own runner settings (SANDBOX_GATEWAY, SANDBOX_GATEWAY_URL, SANDBOX_GATEWAY_API_KEY, SANDBOX_GATEWAY_TEMPLATE) instead of a HEADLESS_COMPUTER provider. HEADLESS_COMPUTER stays off, freestyle or daytona. The per-organization sandboxGateway flag reaches the runner as a session setting. Flagged conversations run their computer through the gateway; the rest keep the runner's own provider. With the flag on and no gateway configured, the runner logs it and keeps its own provider; a configured gateway that fails is never bypassed. Older runners drop the setting and keep the conversation. Signed-off-by: Jalil <reachjalil@gmail.com> * feat(workbot): fall back from an unhealthy sandbox gateway A gateway conversation's computer is now placed when one is first needed: through the gateway while a cached health check (Differently's capabilities, an enabled healthy pool) passes, otherwise, or when the gateway cannot start it for infrastructure reasons, on the runner's own provider. The gateway's refusals still fail the call instead of being routed around, and conversations without the flag never use it. The runner records which side made each computer, keeps a computer where it was made, and moves a fallback conversation back through the gateway once its fallback computer is gone. A sandbox that failed to start is now a transient error rather than a capacity refusal. Signed-off-by: Jalil <reachjalil@gmail.com> * fix(workbot): size gateway computers and idle them as the pools allow Computers made through the sandbox gateway now ask for the same size as Daytona's instead of the gateway project's default profile. The Differently adapter reads what its enabled pools can do alongside each create (at most every five minutes) and stops claiming pause or stop where they can't, so idle computers on those pools keep running until their TTL instead of failing to pause. Signed-off-by: Jalil <reachjalil@gmail.com> * test(workbot): prove gateway computers on pools that cannot pause Signed-off-by: Jalil <reachjalil@gmail.com> * fix(workbot): stop gateway computers on pools that can stop but not pause The pause block's presence is copied by provider wrappers before the pools' lifecycle is discovered, so on pools that list stop-start but not pause-resume the adapter's pause now stops the sandbox (keeping its disk) instead of refusing. Signed-off-by: Jalil <reachjalil@gmail.com> --------- Signed-off-by: Jalil <reachjalil@gmail.com> | 2 天前 | |
feat(computer): run Workbot's desktop on Freestyle from a running-desktop snapshot (#6332) * feat(computer): run Workbot's desktop on Freestyle from a running-desktop snapshot Workbot's desktop only worked on Daytona: Freestyle had no way to publish the viewer port, and no desktop snapshot existed for it. - Freestyle publishes a spec's exposed ports over HTTPS at a random host under HEADLESS_COMPUTER_DOMAIN (default style.dev, no DNS needed); desktop computers expose only the viewer port. Guest tickets still gate every connection. - snapshot:build:freestyle-desktop installs the desktop on Freestyle's Ubuntu base and snapshots it while running, so new computers resume with the desktop up. The slug follows the desktop guest version. - HEADLESS_COMPUTER_PERSISTENT=true keeps each conversation's computer, paused with its memory, until removed, on Freestyle and Daytona. - A Freestyle desktop requires HEADLESS_COMPUTER_SNAPSHOT. Signed-off-by: Jalil <reachjalil@gmail.com> * fix(computer): install a pinned, checksummed Node in the Freestyle desktop snapshot Signed-off-by: Jalil <reachjalil@gmail.com> * fix(computer): pin the Freestyle builder's Node and fix its first live runs - Install an exact Node release (24.22.1) checked against the SHA-256 from its GPG-signed SHASUMS256.txt, instead of the moving latest-v24 channel. - Freestyle's Ubuntu has Python 3.12, so install the desktop lock's pinned versions as binary wheels into the system Python; the lock's hashes name Debian's 3.11 wheels. - Poll the desktop's health after starting it, as the runner does; the bridge returns before the guest listens. Print the guest log on failure. - Read each Freestyle VM's public host once per process. Signed-off-by: Jalil <reachjalil@gmail.com> --------- Signed-off-by: Jalil <reachjalil@gmail.com> | 9 天前 | |
feat(workbot): run computers through a flagged Differently sandbox gateway (#6649) * feat(sandbox): run Workbot computers through a self-hosted Differently control plane Add @openwork/sandbox-differently, an adapter for the shared sandbox contract backed by Differently's API. A runner holds one project-scoped Differently key; Differently holds the OpenSandbox, Daytona and Freestyle credentials and decides by policy where each computer runs. HEADLESS_COMPUTER=differently turns it on for one runner, with DIFFERENTLY_URL, DIFFERENTLY_API_KEY and HEADLESS_COMPUTER_SNAPSHOT as a Differently template. It stays off by default. The adapter passes the shared provider and block conformance cases against an in-memory Differently, and CI runs them with the other adapters. Signed-off-by: Jalil <reachjalil@gmail.com> * fix(sandbox): trim trailing slashes without a backtracking pattern CodeQL flagged /\/+$/ on caller-supplied URLs and paths as a polynomial regular expression. Trim with a linear loop instead. Signed-off-by: Jalil <reachjalil@gmail.com> * feat(workbot): run computers through a flagged sandbox gateway Differently is now a sandbox gateway with its own runner settings (SANDBOX_GATEWAY, SANDBOX_GATEWAY_URL, SANDBOX_GATEWAY_API_KEY, SANDBOX_GATEWAY_TEMPLATE) instead of a HEADLESS_COMPUTER provider. HEADLESS_COMPUTER stays off, freestyle or daytona. The per-organization sandboxGateway flag reaches the runner as a session setting. Flagged conversations run their computer through the gateway; the rest keep the runner's own provider. With the flag on and no gateway configured, the runner logs it and keeps its own provider; a configured gateway that fails is never bypassed. Older runners drop the setting and keep the conversation. Signed-off-by: Jalil <reachjalil@gmail.com> * feat(workbot): fall back from an unhealthy sandbox gateway A gateway conversation's computer is now placed when one is first needed: through the gateway while a cached health check (Differently's capabilities, an enabled healthy pool) passes, otherwise, or when the gateway cannot start it for infrastructure reasons, on the runner's own provider. The gateway's refusals still fail the call instead of being routed around, and conversations without the flag never use it. The runner records which side made each computer, keeps a computer where it was made, and moves a fallback conversation back through the gateway once its fallback computer is gone. A sandbox that failed to start is now a transient error rather than a capacity refusal. Signed-off-by: Jalil <reachjalil@gmail.com> * fix(workbot): size gateway computers and idle them as the pools allow Computers made through the sandbox gateway now ask for the same size as Daytona's instead of the gateway project's default profile. The Differently adapter reads what its enabled pools can do alongside each create (at most every five minutes) and stops claiming pause or stop where they can't, so idle computers on those pools keep running until their TTL instead of failing to pause. Signed-off-by: Jalil <reachjalil@gmail.com> * test(workbot): prove gateway computers on pools that cannot pause Signed-off-by: Jalil <reachjalil@gmail.com> * fix(workbot): stop gateway computers on pools that can stop but not pause The pause block's presence is copied by provider wrappers before the pools' lifecycle is discovered, so on pools that list stop-start but not pause-resume the adapter's pause now stops the sandbox (keeping its disk) instead of refusing. Signed-off-by: Jalil <reachjalil@gmail.com> --------- Signed-off-by: Jalil <reachjalil@gmail.com> | 2 天前 | |
refactor(api): generate contracts during builds (#6278) * refactor(api): generate contracts during builds Signed-off-by: Jalil <reachjalil@gmail.com> * fix(api): read live contract in connection policy test Signed-off-by: Jalil <reachjalil@gmail.com> --------- Signed-off-by: Jalil <reachjalil@gmail.com> | 7 天前 | |
fix(workbot): let admins pick the connections behind agent sources (#6692) Calendar, email and team chat read through the connections an admin picked (every matching one until they pick). The calendar is read per connection, a refusal holds up only that connection, and native reads are allowed per source and connection. My bot page: one row per source with the account it reads, one lock note, growing fields. | 2 天前 | |
fix(models): say OpenCode Zen is retired instead of implying Den controls it (#6663) The allowZenModel organization switch only controls the free Auto model; OpenCode Zen was retired unconditionally in #6504. Label the switch as the free starter model in Den, the policy catalog and the desktop permissions list, and show OpenCode Zen as 'No longer offered' in Connect a provider with a pointer to OpenCode Go. | 2 天前 | |
fix(documents): restore production workspace builds (#6105) Signed-off-by: Jalil <reachjalil@gmail.com> | 14 天前 | |
Revert "refactor(engine): remove OpenCode v1 and run only OpenCode v2 (#6515)" (#6559) This reverts commit cdc21843845df598d76e7f104038aa9dbea9f6b5. | 4 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 3 天前 | ||
| 3 天前 | ||
| 4 天前 | ||
| 18 天前 | ||
| 3 天前 | ||
| 7 天前 | ||
| 4 天前 | ||
| 2 天前 | ||
| 4 天前 | ||
| 3 天前 | ||
| 4 天前 | ||
| 7 天前 | ||
| 9 天前 | ||
| 2 天前 | ||
| 11 天前 | ||
| 4 天前 | ||
| 4 天前 | ||
| 7 天前 | ||
| 7 天前 | ||
| 7 天前 | ||
| 4 天前 | ||
| 9 天前 | ||
| 7 天前 | ||
| 7 天前 | ||
| 28 天前 | ||
| 4 天前 | ||
| 4 天前 | ||
| 5 天前 | ||
| 2 天前 | ||
| 9 天前 | ||
| 2 天前 | ||
| 7 天前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 14 天前 | ||
| 4 天前 |