| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat(workbot): any connected connector as a source of Your agent (#6968) * feat(automations): decide per tool whether Your agent may call it Behind workbotAgentBrief, any connected connector can be a source, so a hand-reviewed list of services can't be what keeps the check read-only. decideAgentReadTool decides each tool: never one its provider marks destructive; then an admin's per-tool choice; then the reviewed lists (moved here unchanged from den-api); then readOnlyHint, unless the tool's own name or description clearly writes; then a conservative name/description classifier (a leading read verb and no write verb; unsure is no). Den's own operations read only on GET. Types: AgentToolOverride and decision reasons, sources.toolOverrides (per connection, per tool), the per-connection tools view, readTools on a member's source, and input bounds raised far above real org sizes. Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(den-api): any connected connector as an agent source (workbotAgentBrief) With the brief on, every connection is offered: each MCP (custom ones too) and Den's own providers for what isn't calendar, email or chat, under its own policy (members choose by default; a reviewed connection an admin had removed from Other context stays not allowed). The check lists each readable MCP connection's tools when it starts, decides them per tool, logs what it allowed per connection (workbot_agent_read_tools) and puts exactly those names on its token (openwork:agent-tools + openwork:agent-tool:<connection>:<tool>). Den's gateway then lets the token call only those, never one its provider now marks destructive; Den's own providers read any GET outside the core sources except operations an admin turned off. A source left with no read tools sits the check out and the check is told why. GET /v1/org/workbot-settings/proactive/sources/{id}/tools returns each tool's decision for the admin's review; sources.toolOverrides saves their choices. /v1/me/agent adds readTools per other source. Off, tokens carry no per-tool list and the reviewed lists decide as before. Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * test(den-api): any connector as a source; the check never gets a write tool Unit: every connection listed with no cap (44 in Other context), member sources and locked policies, carried-over removals, admin changes and tool choices, the token's per-tool scopes at the gateway (destructive at call time, other connections, Den's own reads and denials), the check's token holding only read tools with admin choices winning, a connector with none or unlisted tools sitting out, and the feature off keeping the reviewed lists. API, against a fake MCP service: the admin's review of a custom connector's tools, their overrides, a member switching it on from chat with readTools on the page, the admin's lock, and the check's token calling only its read tools while writes never reach the service. Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(den-web): every connection in What agents read, with its tools With Your agent's brief on, Manage › Workbot › What agents read lists every connection in Other context (no Add source, no cap), each with its policy select and, for MCP connections and Den's own providers, "Tools agents may use: N read tools" (DESIGN.md S3 disclosure, S2 rows): one row per tool with why, a switch for the admin's choice, and a lock with the reason where no one can allow it (P4). MCP connections behind calendar, email or chat get the same disclosure. Choices show at once and come back from the server. Library › My agent keeps any connector on the list; one with no read tools says "No read-only tools found. An admin can review its tools." Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * test(evals): a custom MCP connector, end to end in the brief replay New scenario custom-connector: Lumen Support Desk, a custom MCP nobody reviewed, lists two reads (one labelled read-only, one unlabelled) and four writes (one mislabelled read-only, one labelled, one destructive, one unlabelled). The brief's pipeline offers its check exactly the tools Den's per-tool decision allows (the same function the wake uses); a call to anything else gets insufficient_mcp_scope, as Den's gateway answers. Today's pipeline can't read the connector at all, as in production with the feature off. The report adds write tools offered / called. Live, 3 runs each (openai/gpt-6-luna, judge claude-sonnet-4.5): the $18,400 refund only Sam can approve was told 3/3 with the brief, 0/3 today; 0 unwanted; write tools offered / called 0 / 0. Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * test(evals): proof that any connector is listed and reviewed per tool A loopback MCP provider serves ten fictional custom connectors with annotated tools. With workbotAgentBrief on, Manage › Workbot lists all 11 connections in Other context with their read-tool counts; the admin opens Lumen Support Desk's tools (reads on, writes off, a destructive one locked) and allows ticket_report; a member turns the desk on from chat and My bot shows it on, a connector with no read tools saying so, and one the admin doesn't allow locked. No tool call reaches any connector. Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * docs(workbot): any connected connector as a source of Your agent What changes, the per-tool decision order, how the check's token carries only read tools (and why HEADLESS_MCP_TOOL_ALLOWLIST stays runner-wide), the API, the custom-connector replay eval, limits, and what retiring the reviewed-only path deletes. Screenshots from the proof, fictional names. Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * fix(den-api): declare the connection tools route for audit coverage GET /v1/org/workbot-settings/proactive/sources/{id}/tools is a tenant read: an upstream tools/list through the shared tool cache with the caller's own credential, no tool called. The PUT note mentions sources.toolOverrides. Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> --------- Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> | 2 天前 | |
fix(browser): stop the agent's browser work taking your focus (#6855) The agent using the built-in browser could pull focus from whatever the person was typing in, for two reasons. Every failed agent step is marked as needing attention, including routine ones the agent recovers from itself. With the browser popped out, that state focused its window, which activated OpenWork over other apps. It now only shows the tab: the window is already in view. Electron also focuses a page on every load, so agent navigations took the keyboard from the composer. Browser tabs now turn that off. Pages the person opens from the address bar or the New tab button still take the keyboard, as in any browser. A page that changes process commits unfocused, so they take it again at that point, but only if the person has not moved on, because focusing a page also raises its window. The proof now checks that a page the agent loads leaves the keyboard alone. Signed-off-by: Jalil <reachjalil@gmail.com> | 4 天前 | |
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> | 10 天前 | |
feat(computer-use): run computer programs as standard JavaScript behind a feature (#6942) With standardCodeMode on, computer_run programs run on the same standard engine and bridge as Workflows. The bridge moves into @openwork/codemode (StandardCodeMode.execute) so Den and computer use share its rules: a tool without an output schema still returns its result, and only a ToolError's message reaches a program. runComputerProgram takes the interpreter from its host, never the request. The desktop app window reports the feature like computerUse (computerSetStandardCodeMode); the OpenWork server on a cloud worker reads the organization's GET /v1/org features, reusing an answer for 30 s. Workbot computers keep OpenWork's Code Mode. A program's helpers now stop when it returns. The standard engine cancels an un-awaited call at return, but the helper's promise ran on and could send a click after the result reported no input. Signed-off-by: Jalil <reachjalil@gmail.com> | 3 天前 | |
fix(computer-use): keep the agent's outline under windows in front of its app (#7080) While the person followed a chat, the agent's presence overlay (outline, trail and cursor) was raised above every window. With OpenWork in front of PhotoCraft, the outline was drawn across the chat. The overlay now always rides right above the selected window, among the app windows, so a window in front of it covers the outline as it covers the window. When nothing covers the window it looks the same as before. The Take over pill still stays above everything, so the person can always reach it. Signed-off-by: Jalil <reachjalil@gmail.com> | 1 天前 | |
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). | 14 天前 | |
Revert "refactor(engine): remove OpenCode v1 and run only OpenCode v2 (#6515)" (#6559) This reverts commit cdc21843845df598d76e7f104038aa9dbea9f6b5. | 10 天前 | |
docs(providers): add tested per-member TrueFoundry setup guide (#7096) | 20 小时前 | |
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> | 10 天前 | |
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> | 9 天前 | |
feat(connectors): refine custom setup behind one rollout flag (#6700) * feat(connectors): show live server and sign-in discovery checks * feat(connectors): consolidate revised setup and review fixes behind one flag * test(connectors): use JSX for discovery checklist rendering * fix(connectors): declare web validation dependency and satisfy UI guardrails * fix(packaging): include connector validation dependency in Den web image * fix(connectors): declare production types for manual OAuth export | 8 天前 | |
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). | 14 天前 | |
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. | 15 天前 | |
feat(ai-gateway): add custom OpenAI-compatible providers (#7087) Admins add a provider by name, OpenAI-compatible base URL and one API key. Den fetches {url}/models, maps OpenRouter-style or plain OpenAI lists to models.dev-shaped model settings (matching the models.dev openrouter catalog), lets the admin pick, template or hand-configure models, tests one through AI Gateway and saves. Saved providers can be renamed, re-pointed, re-keyed, re-fetched and edited. - types: shared contract in @openwork/types/den/gateway-custom-providers - den-api: discover, test, create and edit routes behind gatewayCustomProviders; custom providers keep their own catalog (settings.custom) and one org api_key - gateway: tests and forwards to settings.upstreamBaseUrl (public HTTPS or operator-allowlisted only), prices from saved model cost - den-web: four-step wizard and manage screen; the Another provider row opens the wizard when the flag is on - evals: gateway-custom-provider proof | 22 小时前 | |
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> | 17 天前 | |
Revert "refactor(engine): remove OpenCode v1 and run only OpenCode v2 (#6515)" (#6559) This reverts commit cdc21843845df598d76e7f104038aa9dbea9f6b5. | 10 天前 | |
fix(automations): fail runs that could not use a connection (#7031) An Automation run was marked Completed whenever the agent finished, even when OpenWork Cloud told it a connection had to be connected or reconnected first. The owner only found out by reading the run's log. All three runners (Cloud, headless and Desktop) now check the run's tool results for OpenWork Cloud's connection status. When a connection needs the owner to connect or reconnect it, the run fails with connection_action_required, names the connection, and keeps the agent's own answer. Search results that only list connections do not count. Run history shows "Connection needed" with a Connect or Reconnect button that opens Your Connections on the signed-in Den. The link is built from the connection id, never taken from tool output. Signed-off-by: Jalil <reachjalil@gmail.com> | 2 天前 | |
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). | 14 天前 | |
feat(managed): adopt the shared GCP module with a guarded database upgrade (#6192) * feat(managed): adopt the shared Google Cloud module with a guarded migration handover Signed-off-by: Guillaume Loret <guillaume@openworklabs.com> * fix(managed): accept shared GCP bundles and wait for rollout completion Signed-off-by: Guillaume Loret <guillaume@openworklabs.com> * docs(managed): distinguish GCP operator and service-account IAM prerequisites Signed-off-by: Guillaume Loret <guillaume@openworklabs.com> * fix(managed): canonicalize Docker Hub digest references before mirroring Signed-off-by: Guillaume Loret <guillaume@openworklabs.com> * fix(managed): enable Cloud Resource Manager before GCP planning Signed-off-by: Guillaume Loret <guillaume@openworklabs.com> * docs(managed): require Google issuance in inherited CAA policies Signed-off-by: Guillaume Loret <guillaume@openworklabs.com> * fix(managed): verify maintained revisions through scoped Cloud Run API Signed-off-by: Guillaume Loret <guillaume@openworklabs.com> * fix(managed): accept omitted zero traffic percentages in GCP health Signed-off-by: Guillaume Loret <guillaume@openworklabs.com> * fix(managed): preserve the legacy Cloud SQL user host during adoption Signed-off-by: Guillaume Loret <guillaume@openworklabs.com> * docs(managed): explain Cloud Run revision tag removal on updates Signed-off-by: Guillaume Loret <guillaume@openworklabs.com> * fix(managed): recover fresh health reports and track the exact health execution Signed-off-by: Guillaume Loret <guillaume@openworklabs.com> * fix(managed): bound GCP maintenance commands and document update downtime Signed-off-by: Guillaume Loret <guillaume@openworklabs.com> --------- Signed-off-by: Guillaume Loret <guillaume@openworklabs.com> | 3 天前 | |
fix(deps): bump vite to 6.4.5 (#6745) Patch the server.fs.deny query bypass (Dependabot #676, #677) in the root and evals workspaces. Drop the vite@6.4.4 release-age exclusion; 6.4.5 is past the minimum release age. deepmerge (#668) still has no fixed release. Signed-off-by: OmarMcAdam <gh@mcadam.io> | 7 天前 | |
refactor(features): remove completed GA rollout flags (#6771) * refactor(features): retire completed GA rollout gates * fix(evals): repair inherited proof type errors * test(den): pin the upload relay fixture clock and verify expiry * test(den): arrange API security fixtures with hashed sessions * test(library): verify compact lists and wait for detail breadcrumbs | 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. | 15 天前 | |
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). | 14 天前 | |
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> | 14 天前 | |
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> | 1 个月前 | |
feat(remote-sessions): answer a remote task's question from the chat (#6753) * feat(remote-sessions): pending requests on reads and an answer action Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(remote-sessions): OpenCode plugin answers pending permissions; wire types for answers Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(desktop): read and answer a remote task's pending question or permission natively Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(den): remote-session:answer capability and POST /v1/remote-sessions/answer behind remoteSessionAnswers Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * feat(app): answer a remote task's question or permission from its panel and row Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * test(evals): proof that a person answers a remote task's question from the chat Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * docs: remote-session answers feature doc, architecture and route notes Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> * fix(app): readable chord hints on the answer card Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> --------- Signed-off-by: Benjamin Shafii <benjamin.shafii@gmail.com> | 7 天前 | |
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> | 10 天前 | |
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. | 11 天前 | |
fix(workbot): let people back in during a computer's idle pause (#6843) Someone returning while the runner was pausing an idle computer waited for the whole pause, three to five minutes, and the desktop request could run out first. Differently can now call a pause off, keeping the computer as it is, so that wait is no longer needed. A provider says so with callsOffPause, and vm() stops waiting once the provider's pause has begun. The idle checks and replacement before it are still waited for, and providers that can't call a pause off wait as before. A called-off pause leaves the due time vm() set, so the computer still pauses if the runner stops before releasing it. Signed-off-by: Jalil <reachjalil@gmail.com> | 4 天前 | |
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> | 16 天前 | |
fix(workbot): let people back in during a computer's idle pause (#6843) Someone returning while the runner was pausing an idle computer waited for the whole pause, three to five minutes, and the desktop request could run out first. Differently can now call a pause off, keeping the computer as it is, so that wait is no longer needed. A provider says so with callsOffPause, and vm() stops waiting once the provider's pause has begun. The idle checks and replacement before it are still waited for, and providers that can't call a pause off wait as before. A called-off pause leaves the due time vm() set, so the computer still pauses if the runner stops before releasing it. Signed-off-by: Jalil <reachjalil@gmail.com> | 4 天前 | |
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> | 14 天前 | |
fix(api): document custom provider discovery timestamps as date-time (#7095) The custom provider discovery schema introduced a nullable string timestamp without its date-time format. Spectral therefore counted 39 warnings against the baseline of 38 and failed the API Contract push check on dev. Use the date-time schema matching the ISO values already emitted by the routes, and cover runtime validation and JSON Schema output without weakening the warning baseline. | 21 小时前 | |
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. | 8 天前 | |
fix(documents): restore production workspace builds (#6105) Signed-off-by: Jalil <reachjalil@gmail.com> | 20 天前 | |
fix: bugs found recording the live artifact demo (empty Workflow Apps, Artifacts toolbar, failure reasons, workshop setup) (#6912) * fix(den): Workflow-bound App starters read the Workflow's value, not its receipt * fix(app): say why a script step failed instead of a bare red count * fix(app): keep the Artifacts toolbar fixed, move refresh state into it, and show the side-panel resize grip * fix(worlds): workshop handles a disabled first task, supports Claude and explicit allowances, enables Artifacts, reaps Daytona leftovers, names guests * fix(world): wait out a Daytona delete already in progress instead of reporting it skipped | 3 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 天前 | ||
| 4 天前 | ||
| 10 天前 | ||
| 3 天前 | ||
| 1 天前 | ||
| 14 天前 | ||
| 10 天前 | ||
| 20 小时前 | ||
| 10 天前 | ||
| 9 天前 | ||
| 8 天前 | ||
| 14 天前 | ||
| 15 天前 | ||
| 22 小时前 | ||
| 17 天前 | ||
| 10 天前 | ||
| 2 天前 | ||
| 14 天前 | ||
| 3 天前 | ||
| 7 天前 | ||
| 7 天前 | ||
| 15 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 1 个月前 | ||
| 7 天前 | ||
| 10 天前 | ||
| 11 天前 | ||
| 4 天前 | ||
| 16 天前 | ||
| 4 天前 | ||
| 14 天前 | ||
| 21 小时前 | ||
| 8 天前 | ||
| 20 天前 | ||
| 3 天前 |