
My AX
A single-operator AI agent with a container workspace, browser and cloud runs
My AX is a self-hosted Manus alternative built on Cloudflare (Browser Rendering, Containers, D1, Durable Objects, KV). Paid services required. Inspect the source and license in the linked repository.
Source & license
Upstream license: MIT
License TL;DR
You can use it, change it, self-host it and sell it. Keep the original copyright and license notice with copies of the code. You don’t have to publish your changes. The authors don’t promise it will work.
Explain MIT in plain English →Summary of the main license. Separate packages and assets can have different terms.
Inspect repository ↗Read this project’s actual license ↗Repository owner
See the upstream repository for the original creator and contributors.
Maintain this project? Maintainer verification →Cloudflare hosting
Paid services required
Requires Workers Paid: the agent workspace and computer run on Cloudflare Containers, which are billed for active time beyond the allowance included with the $5/month plan. Browser Rendering, Workers AI, R2 and Durable Objects add metered usage, and model-provider charges are separate.
Hosting requirements
- Cloudflare Containers are only available on Workers Paid and bill for every 10 ms they run beyond included usage.
- The README requires putting the deployment behind Cloudflare Access; it is single-operator with one verified identity.
- The checked-in config also declares -dev containers and a legacy agent class; those are omitted from the diagram.
- Source and configuration review establishes a deployment path and conditional costs; this candidate was not executed or load-tested.
- Official Cloudflare pricing pages saved 31 Oct 2026 (Markdown editions of developers.cloudflare.com pricing documentation).
Review findings & limitations
- Cloudflare Containers are only available on Workers Paid and bill for every 10 ms they run beyond included usage.
- The README requires putting the deployment behind Cloudflare Access; it is single-operator with one verified identity.
- The checked-in config also declares -dev containers and a legacy agent class; those are omitted from the diagram.
- Competitor links describe the stated workflow overlap, not feature parity or a verified price saving.
- Source review at the pinned commit; deployment, workload CPU and application security have not been independently tested.
Sources checked 31/10/2026
Repository snapshot: efddb87. Hosting eligibility reflects the deployment documentation and listed assumptions.
- manus ↗
**My AX is a single-operator agent. It acts with your authority. It works in a container, on a machine you connect, and in bounded cloud runs. You deploy it into your own Cloudflare account. You put it behind your own Access login.**
- workers ↗
- CF_ACCESS_AUD # Access app AUD if you front this with Access // - CF_ACCESS_ISS # Access issuer(s), comma-separated during a domain migration // - BRIDGE_BASE_URL # public origin of this deploy // // MODELS: // - src/models.ts ships one curated list: Kimi K2.7 Code, GLM 5.3, // Opus 4.8, GPT-5.5, Kindle Alpha API, and Mercury Alpha. Routing stays hidden. // // CONNECTORS: // - Public engine ships an EMPTY built-in registry. Users add their own // MCP server
- d1 ↗
x — paired with the container // block above. Each instance (idFromName(email)) is one user's // persistent computer. { "name": "SANDBOX", "class_name": "Sandbox" }, { "name": "NAMED_COMPUTER", "class_name": "NamedComputer" }, { "name": "COMPUTER", "class_name": "ComputerWorkspace" }, { "name": "PI_CHAT", "class_name": "PiChatAgent" }, { "name": "WORKSPACE_HUB", "class_name": "WorkspaceHub" }, // Direct-routed voice DO; delegates turns into the MyAge
- kv ↗
_WITH_D1_DATABASE_ID" } ], // KV — audit receipts (90d TTL, see bridge.ts writeAuditReceipt). // Create with `wrangler kv namespace create AUDIT_KV`. "kv_namespaces": [ { "binding": "AUDIT_KV", "id": "REPLACE_WITH_KV_NAMESPACE_ID" } ], // Version metadata — gives the worker its own deploy version id at // runtime. Surfaced via GET /api/system so the Settings drawer can // show "Worker version: <id>". Auto-populated by Cloudflare on every // deploy; no manual bumping. See: /
- r2 ↗
raffic goes direct. "CLOUDFLARE_AI_GATEWAY_ID": "", // Required for R2 sandbox snapshot presigned URLs. "CLOUDFLARE_ACCOUNT_ID": "", "BACKUP_BUCKET_NAME": "my-ax-homes" }, // Workers AI binding. Account-level. The Worker's deployment identity // is the principal calling Workers AI — no per-user model key. "ai": { "binding": "AI" }, "unsafe": { "bindings": [{ "type": "websearch", "name": "WEBSEARCH" }] }, // Browser Run: hosted headless Chrome sessions for visual tool calls. "br
- durable-objects ↗
ndings": [ // Per-user root. Conversation MyAgent Think runtimes run as facets // inside this root, keyed by session id. { "name": "USER_AGENT", "class_name": "UserAgent" }, // Read-only migration bridge: direct pre-facet MyAgent namespace. // Remove after all legacy D1 session rows have been opened/imported. { "name": "LEGACY_MY_AGENT", "class_name": "MyAgent" }, { "name": "OAUTH_CLIENT", "class_name": "OAuthClientDO" }, // One outbound-connected local lapt
- workers-ai ↗
you front with Access. "CF_ACCESS_AUD": "", "CF_ACCESS_ISS": "", "BRIDGE_BASE_URL": "", "ENVIRONMENT": "production", // Optional AI Gateway id (creates one in dash → AI Gateway). Without // it, Workers AI traffic goes direct. "CLOUDFLARE_AI_GATEWAY_ID": "", // Required for R2 sandbox snapshot presigned URLs. "CLOUDFLARE_ACCOUNT_ID": "", "BACKUP_BUCKET_NAME": "my-ax-homes" }, // Workers AI binding. Account-level. The Worker's deployment identity // is
- browser-rendering ↗
[{ "type": "websearch", "name": "WEBSEARCH" }] }, // Browser Run: hosted headless Chrome sessions for visual tool calls. "browser": { "binding": "BROWSER" }, // Dynamic Worker loader for native Think Agent Skills script execution. // Runner defaults remain bounded: no network/tools and read-only workspace. "worker_loaders": [{ "binding": "LOADER" }], // Cloudflare Containers — Sandbox SDK runtime image (per-user shell). // The image is built from ./Dockerfile, which extends // docker.i
- containers ↗
class_name": "Sandbox", "scheduling_policy": "durable_object", "images": { "computer": { "dockerfile": "./Dockerfile" } }, "name": "my-ax-disk" }, { "class_name": "NamedComputer", "image": "./Dockerfile.computer", "name": "my-ax-computer", "max_instances": 10, "instance_type": "basic" } ], // R2 buckets — Sandbox workspace backups + user upload storage. // Create with: // wrangler r2 bucket create my-ax-homes // wrangler r2 bucket
- paid ↗
The Workers Paid plan includes Workers, Pages Functions, Workers KV, Hyperdrive, and Durable Objects usage for a minimum charge of $5 USD per month for an account. The plan includes increased initial usage allotments, with clear charges for usage that exceeds the base plan. There are no additional charges for data transfer (egress) or throughput (bandwidth).
- paid ↗
Containers are billed for every 10ms that they are actively running at the following rates, with included monthly usage as part of the $5 USD per month [Workers Paid plan](https://developers.cloudflare.com/workers/platform/pricing/): | | Memory | CPU | Disk
- paid ↗
| Rows read | 5 million / day | First 25 billion / month included + $0.001 / million rows |
- paid ↗
| Keys read | 100,000 / day | 10 million/month, + $0.50/million |
- paid ↗
| SQL Stored data <sup>5</sup> | 5 GB (total) | 5 GB-month, + $0.20/ GB-month |
- paid ↗
Our free allocation allows anyone to use a total of **10,000 Neurons per day at no charge**. To use more than 10,000 Neurons per day, you need to sign up for the [Workers Paid plan](https://developers.cloudflare.com/workers/platform/pricing/#workers). On Workers Paid, you will be charged at $0.011 / 1,000 Neurons for any usage above the free allocation of 10,000 Neurons per day.
- paid ↗
| Storage | 10 GB-month / month |
- MIT ↗
MIT License Copyright (c) 2026 Jordan Coeyman Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONN
- architecture ↗
You deploy it into your own Cloudflare account. You put it behind your own Access login.
- architecture ↗
- CF_ACCESS_AUD # Access app AUD if you front this with Access // - CF_ACCESS_ISS # Access issuer(s), comma-separated during a domain migration // - BRIDGE_BASE_URL # public origin of this deploy // // MODELS: // - src/models.ts ships one curated list: Kimi K2.7 Code, GLM 5.3, // Opus 4.8, GPT-5.5, Kindle Alpha API, and Mercury Alpha. Routing stays hidden. // // CONNECTORS: // - Public engine ships an EMPTY built-in registry. Users add their own // MCP server
- architecture ↗
x — paired with the container // block above. Each instance (idFromName(email)) is one user's // persistent computer. { "name": "SANDBOX", "class_name": "Sandbox" }, { "name": "NAMED_COMPUTER", "class_name": "NamedComputer" }, { "name": "COMPUTER", "class_name": "ComputerWorkspace" }, { "name": "PI_CHAT", "class_name": "PiChatAgent" }, { "name": "WORKSPACE_HUB", "class_name": "WorkspaceHub" }, // Direct-routed voice DO; delegates turns into the MyAge
- architecture ↗
_WITH_D1_DATABASE_ID" } ], // KV — audit receipts (90d TTL, see bridge.ts writeAuditReceipt). // Create with `wrangler kv namespace create AUDIT_KV`. "kv_namespaces": [ { "binding": "AUDIT_KV", "id": "REPLACE_WITH_KV_NAMESPACE_ID" } ], // Version metadata — gives the worker its own deploy version id at // runtime. Surfaced via GET /api/system so the Settings drawer can // show "Worker version: <id>". Auto-populated by Cloudflare on every // deploy; no manual bumping. See: /
- architecture ↗
raffic goes direct. "CLOUDFLARE_AI_GATEWAY_ID": "", // Required for R2 sandbox snapshot presigned URLs. "CLOUDFLARE_ACCOUNT_ID": "", "BACKUP_BUCKET_NAME": "my-ax-homes" }, // Workers AI binding. Account-level. The Worker's deployment identity // is the principal calling Workers AI — no per-user model key. "ai": { "binding": "AI" }, "unsafe": { "bindings": [{ "type": "websearch", "name": "WEBSEARCH" }] }, // Browser Run: hosted headless Chrome sessions for visual tool calls. "br
- architecture ↗
ndings": [ // Per-user root. Conversation MyAgent Think runtimes run as facets // inside this root, keyed by session id. { "name": "USER_AGENT", "class_name": "UserAgent" }, // Read-only migration bridge: direct pre-facet MyAgent namespace. // Remove after all legacy D1 session rows have been opened/imported. { "name": "LEGACY_MY_AGENT", "class_name": "MyAgent" }, { "name": "OAUTH_CLIENT", "class_name": "OAuthClientDO" }, // One outbound-connected local lapt
- architecture ↗
you front with Access. "CF_ACCESS_AUD": "", "CF_ACCESS_ISS": "", "BRIDGE_BASE_URL": "", "ENVIRONMENT": "production", // Optional AI Gateway id (creates one in dash → AI Gateway). Without // it, Workers AI traffic goes direct. "CLOUDFLARE_AI_GATEWAY_ID": "", // Required for R2 sandbox snapshot presigned URLs. "CLOUDFLARE_ACCOUNT_ID": "", "BACKUP_BUCKET_NAME": "my-ax-homes" }, // Workers AI binding. Account-level. The Worker's deployment identity // is
- architecture ↗
[{ "type": "websearch", "name": "WEBSEARCH" }] }, // Browser Run: hosted headless Chrome sessions for visual tool calls. "browser": { "binding": "BROWSER" }, // Dynamic Worker loader for native Think Agent Skills script execution. // Runner defaults remain bounded: no network/tools and read-only workspace. "worker_loaders": [{ "binding": "LOADER" }], // Cloudflare Containers — Sandbox SDK runtime image (per-user shell). // The image is built from ./Dockerfile, which extends // docker.i
- architecture ↗
class_name": "Sandbox", "scheduling_policy": "durable_object", "images": { "computer": { "dockerfile": "./Dockerfile" } }, "name": "my-ax-disk" }, { "class_name": "NamedComputer", "image": "./Dockerfile.computer", "name": "my-ax-computer", "max_instances": 10, "instance_type": "basic" } ], // R2 buckets — Sandbox workspace backups + user upload storage. // Create with: // wrangler r2 bucket create my-ax-homes // wrangler r2 bucket
Upstream screenshot · acoyfellow/my-ax repository contributors ↗. Depicts the upstream project. We have not deployed and tested a fresh installation here.
What it can replace
Compare the workflow you need. These mappings describe overlap; full feature parity requires a separate comparison.
Delegating multi-step work to a personal agent with a cloud workspace, browser and connected machine; it acts with the operator’s own authority and model accounts and is single-operator only
See supporting source ↗How it works
The shape of My AX on Cloudflare, and how it stacks up against the rented tools it replaces.
Architecture
Diagram of deployment declarations at the reviewed commit. Each app has its own entrypoint; declared resources do not prove runtime calls. Follow file and line sources below.
View upstream source ↗Configuration and workflow sources
Reviewed commit efddb870a2e5. This configuration evidence comes from reading source files. Execution checks, when available, appear in the project's runtime review.
Partial source coverage: 98 files outside collection bounds; 0 collection or parsing issues. Dynamic imports and generated entrypoints may need manual review.
Deployment configuration · 2 files
Cloudflare Workers · compatibility 2026-04-21
my-ax · default
Entrypoint: src/index.tsx
Static assets: public · none · Worker first: true
Cron triggers (UTC): */5 * * * *
DB→ D1AUDIT_KV→ KVBACKUP_BUCKET→ R2USER_UPLOADS→ R2USER_AGENT→ Durable Objects · class UserAgentLEGACY_MY_AGENT→ Durable Objects · class MyAgentOAUTH_CLIENT→ Durable Objects · class OAuthClientDOMACHINE_HOST→ Durable Objects · class MachineHostSANDBOX→ Durable Objects · class SandboxNAMED_COMPUTER→ Durable Objects · class NamedComputerCOMPUTER→ Durable Objects · class ComputerWorkspacePI_CHAT→ Durable Objects · class PiChatAgentWORKSPACE_HUB→ Durable Objects · class WorkspaceHubVoiceThinkAgent→ Durable Objects · class VoiceThinkAgentAI→ Workers AIBROWSER→ Browser Renderingmy-ax-disk→ Containers · class Sandboxmy-ax-computer→ Containers · class NamedComputerASSETS→ Static assets
my-ax-preview · env.preview
Inherited from default: main, triggers, routes, compatibility_date, compatibility_flags
Entrypoint: src/index.tsx
Static assets: public · none · Worker first: true
Cron triggers (UTC): */5 * * * *
DB→ D1AUDIT_KV→ KVBACKUP_BUCKET→ R2USER_UPLOADS→ R2USER_AGENT→ Durable Objects · class UserAgentLEGACY_MY_AGENT→ Durable Objects · class MyAgentOAUTH_CLIENT→ Durable Objects · class OAuthClientDOMACHINE_HOST→ Durable Objects · class MachineHostCOMPUTER→ Durable Objects · class ComputerWorkspaceVoiceThinkAgent→ Durable Objects · class VoiceThinkAgentAI→ Workers AIBROWSER→ Browser RenderingASSETS→ Static assets
my-ax-dev · env.dev
Inherited from default: main, triggers, routes, compatibility_date, compatibility_flags
Entrypoint: src/index.tsx
Static assets: public · none · Worker first: true
Cron triggers (UTC): */5 * * * *
DB→ D1AUDIT_KV→ KVBACKUP_BUCKET→ R2USER_UPLOADS→ R2USER_AGENT→ Durable Objects · class UserAgentLEGACY_MY_AGENT→ Durable Objects · class MyAgentOAUTH_CLIENT→ Durable Objects · class OAuthClientDOMACHINE_HOST→ Durable Objects · class MachineHostSANDBOX→ Durable Objects · class SandboxNAMED_COMPUTER→ Durable Objects · class NamedComputerCOMPUTER→ Durable Objects · class ComputerWorkspacePI_CHAT→ Durable Objects · class PiChatAgentWORKSPACE_HUB→ Durable Objects · class WorkspaceHubVoiceThinkAgent→ Durable Objects · class VoiceThinkAgentAI→ Workers AIBROWSER→ Browser Renderingmy-ax-sandbox-dev→ Containers · class Sandboxmy-ax-computer-dev→ Containers · class NamedComputerASSETS→ Static assets
Cloudflare Workers · compatibility 2026-04-21
my-ax-computer-integration · default
Entrypoint: test/computer-workspace.integration.worker.ts
COMPUTER→ Durable Objects · class ComputerWorkspace
Named environments are separate deployments. Bindings are shown only where declared. Configured routes are URL patterns, not verified application endpoints.
Runtime source · handlers, binding usage and workflow steps
Observed TypeScript/JavaScript declarations from Worker entrypoints and resolved relative imports. Calls and workflow steps may run conditionally; their listed order is not a proven end-to-end request flow. Router declarations may be mounted under a prefix or may not be registered. This shows code wiring, not a successful deployment or runtime test. Dynamic wiring, aliases and generated code may not resolve.
- L735 · fetch handler exported
- L736 · scheduled handler exported · references DB · calls ctx.waitUntil, scanDeadSessions, catch, pruneObserveEvents, console.error, String
- L108 · app.use("*")
- L127 · app.use("*")
- L128 · app.use("*")
- L138 · app.get("/api/health")
- L182 · app.get("/api/version")
- L188 · app.use("/api/*")
- L189 · app.use("/agents/*")
- L190 · app.use("/bridge/*")
- L191 · app.use("/machinectl/*")
- L198 · app.use("/")
- L199 · app.use("/beta")
- L205 · app.use("/attention")
- L206 · app.use("/attention/*")
- L207 · app.use("/runs/*")
- L208 · app.use("/runs")
- L209 · app.use("/jobs")
- L210 · app.use("/capabilities")
- L212 · app.get("/api")
- L332 · app.get("/api/system")
- L416 · app.all("/bridge/:connectorId/*")
- L431 · app.get("/agents/pi-chat/:id")
- L441 · app.all("/agents/*")
- L571 · app.get("/")
- L574 · app.get("/beta")
- L576 · app.get("/capabilities")
- L590 · app.get("/docs")
- L603 · app.get("/docs/:slug")
- L619 · app.get("/pwa-reset")
- L673 · app.get("/offline")
- L701 · app.get("/static/*")
- L702 · app.get("/favicon.ico")
- L708 · app.get("/sw.js")
- L15 · isVoiceEnabled calls (conditional paths may differ): String
- L97 · missingSecrets calls (conditional paths may differ): REQUIRED_SECRETS.filter
Environment references: env.CF_VERSION_METADATA · env.USER_AGENT · env.OAUTH_CLIENT · env.MACHINE_HOST · env.SANDBOX · env.COMPUTER · env.DB · env.AUDIT_KV · env.BACKUP_BUCKET · env.USER_UPLOADS · env.AI · env.BROWSER · env.LOADER · env.ENVIRONMENT · c.env.CF_VERSION_METADATA · c.env.MACHINE_HOST · c.env.PREVIEW_GIT_SHA · c.env.ENVIRONMENT · c.env.DB · c.env.USER_AGENT · c.env.LEGACY_MY_AGENT · c.env.VoiceThinkAgent · c.env.BRIDGE_BASE_URL · c.env.INTERNAL_SOURCE_HOSTS_JSON · c.env.ASSETS
- L41 · fetch handler exported · references COMPUTER · calls Response.json, parseWriteRequest, request.json, env.COMPUTER.idFromName, computerWorkspaceName, write, env.COMPUTER.get, ownerFrom, withOwnerComputerWorkspace, readComputerFileFromWorkspace, pathFrom, getComputerHealth, errorMessage
- L17 · errorMessage calls (conditional paths may differ): String
- L28 · ownerFrom calls (conditional paths may differ): url.searchParams.get
- L34 · pathFrom calls (conditional paths may differ): url.searchParams.get
Environment references: env.COMPUTER
- L36 · normalizeAccessIssuer calls (conditional paths may differ): replace, value.trim, url.toString
- L49 · unsafeJwtPayload calls (conditional paths may differ): token.split, JSON.parse, atob, replace, payload.replace
- L59 · resolveAccessIssuerForTest calls (conditional paths may differ): filter, map, configuredIssuer.split, normalizeAccessIssuer, unsafeJwtPayload, configured.includes
- L76 · getJWKS calls (conditional paths may differ): jwksCache.get, createRemoteJWKSet, jwksCache.set
- L84 · isLocalDevBypassAllowed calls (conditional paths may differ): hostname.toLowerCase, host.endsWith, req.headers.get, Boolean
- L103 · verifyAccessRequestEffect calls (conditional paths may differ): isLocalDevBypassAllowed, Effect.succeed, devUserEmail.toLowerCase, value.trim, req.headers.get, Effect.fail, resolveAccessIssuerForTest, pipe, Effect.tryPromise, jwtVerify, getJWKS, Effect.flatMap, payload.email.trim, payload.sub.trim, Array.isArray, rawGroups.some, toLowerCase
- L124 · verifyAccessRequest calls (conditional paths may differ): Effect.runPromise, verifyAccessRequestEffect
- L135 · accessMiddleware calls (conditional paths may differ): verifyAccessRequest, c.set, next, c.json
Environment references: env.MINIFLARE · env.ENVIRONMENT · env.CF_ACCESS_ISS · env.CF_ACCESS_AUD · env.DEV_USER_EMAIL · env.DEV_USER_GROUPS
- L46 · getKey calls (conditional paths may differ): atob, bin.charCodeAt
- L53 · mintBridgeTicket calls (conditional paths may differ): getKey, Math.floor, Date.now, sign, setJti, setExpirationTime, setIssuedAt, setProtectedHeader, crypto.randomUUID
- L77 · verifyBridgeTicket calls (conditional paths may differ): getKey, jwtVerify, Array.isArray, claims.scope.includes, JSON.stringify
- L116 · writeAuditReceipt calls (conditional paths may differ): crypto.randomUUID, env.AUDIT_KV.put, JSON.stringify, console.error, String, console.log
- L136 · handleBridgeRequest calls (conditional paths may differ): Date.now, request.headers.get, verifyBridgeTicket, auth.slice, claims.identity.email.toLowerCase, callerIdentity.email.toLowerCase, env.DB.batch, bind, env.DB.prepare, Math.floor, oauthStore.listUserMcps, getConnector, Response.json, resolveUpstreamAuth, k.toLowerCase, lk.startsWith, upstreamHeaders.has, upstreamHeaders.set, requirePublicHttpsUrl, toString
Environment references: env.BRIDGE_JWT_SECRET · env.AUDIT_KV · env.DB
- L72 · getBuiltinConnectors calls (conditional paths may differ): JSON.parse, Array.isArray, console.error, String
- L85 · callableConnectors calls (conditional paths may differ): getBuiltinConnectors
- L107 · getMergedRegistry calls (conditional paths may differ): getBuiltinConnectors
- L121 · getConnector calls (conditional paths may differ): getMergedRegistry, join, Object.keys
- L139 · resolveUpstreamAuth calls (conditional paths may differ): oauthStore.getValidAccessToken, h.set
- L25 · stopUserWorkspace calls (conditional paths may differ): stopContainer, workspaceFor
- L33 · snapshotUserWorkspace calls (conditional paths may differ): snapshotWorkspace
- L46 · workspaceDiskState calls (conditional paths may differ): diskState, workspaceFor
- L50 · saveWorkspaceDisk calls (conditional paths may differ): workspaceFor, catch, latestSnapshotRow, binding, workspace.homeBytes, homeLooksWiped, recordObserveEvent, isSaveBoundary, workspace.saveDiskAt, workspace.saveDisk, Date.now
- L63 · copyWorkspaceDisk calls (conditional paths may differ): catch, saveWorkspaceDisk, bootSnapshot, workspaceFor, bootFrom
- L70 · snapshotWorkspace calls (conditional paths may differ): latestSnapshotRow, binding, workspaceFor, catch, workspace.homeBytes, decideSnapshotPublish, console.error, recordObserveEvent, workspace.backup, Date.now, isSaveBoundary, takeBackup, Effect.runPromise, pipe, publishWorkspaceSnapshot, workspaceSnapshotKey, Effect.provide, databaseLayer
- L136 · seedUserWorkspaceFile calls (conditional paths may differ): assertSeedablePath, Date.now, workspaceFor, workspace.awake, workspace.write, snapshotUserWorkspace, workspace.stopContainer, workspace.read
- L170 · listWorkspaceSnapshots calls (conditional paths may differ): latestSnapshotRow, binding, all, bind, env.DB.prepare, workspaceSnapshotKey, Math.min, Math.max, map
- L178 · restoreWorkspaceSnapshot calls (conditional paths may differ): workspaceSnapshotKey, first, bind, env.DB.prepare, snapshotWorkspace, workspaceFor, verifyWorkspaceRestore, workspace.restore, Effect.runPromise, pipe, publishWorkspaceSnapshot, Effect.provide, databaseLayer
Environment references: env.DB
- L51 · resilientTokenFetch calls (conditional paths may differ): Effect.runPromise, pipe, Effect.tryPromise, fetch, Effect.timeout, Effect.retry, Effect.orElseSucceed
- L750 · makeOAuthClientStore calls (conditional paths may differ): binding.get, binding.idFromName, userEmail.toLowerCase, stubFor, stub.fetch, JSON.stringify, res.json
- L754 · stubFor calls (conditional paths may differ): binding.get, binding.idFromName, userEmail.toLowerCase
- L882 · base64UrlEncode calls (conditional paths may differ): String.fromCharCode, replace, btoa
- L889 · oauthStoreFor calls (conditional paths may differ): makeOAuthClientStore
Environment references: env.MASTER_KEY · c.env.OAUTH_CLIENT
- L30 · stableSessionName calls (conditional paths may differ): trim, value.replace, Array.from
- L48 · reportConversationSequenceIntegrity calls (conditional paths may differ): rows.map, filter, sequenceRows.map, checkSequenceIntegrity, Math.min, console.error
- L66 · registerSessionRoutes calls (conditional paths may differ): app.get, parseInt, url.searchParams.get, Math.min, Math.max, Number.isFinite, c.get, all, bind, c.env.DB.prepare, stmt.all, c.json, app.patch, c.req.param, catch, c.req.json, trim, trimmed.slice, run, String
- L690 · parseMetaJson calls (conditional paths may differ): JSON.parse
- L699 · renderMarkdownTranscript calls (conditional paths may differ): lines.push, toISOString, lines.join, formatRoleLabel, extractToolArgs, content.split, extractReasoning
- L803 · extractToolArgs calls (conditional paths may differ): JSON.parse, JSON.stringify
- L816 · extractReasoning calls (conditional paths may differ): JSON.parse, parsed.reasoning.trim
Environment references: c.env.DB · c.env.OAUTH_CLIENT
- L7 · recordObserveEvent calls (conditional paths may differ): run, bind, db.prepare, event.ownerEmail.toLowerCase, toISOString, event.message.slice
- L12 · pruneObserveEvents calls (conditional paths may differ): run, bind, db.prepare, toISOString, Date.now
- L18 · clampMinutes calls (conditional paths may differ): Number, Number.isFinite, Math.min
- L23 · recentObserveEvents calls (conditional paths may differ): toISOString, Date.now, clampMinutes, all, bind, db.prepare, ownerEmail.toLowerCase, Math.min, Math.max
- L12 · piChatObjectName calls (conditional paths may differ): ownerEmail.toLowerCase
- L18 · openPiChat calls (conditional paths may differ): ownerEmail.toLowerCase, getAgentByName, piChatObjectName, stub.bind
- L25 · ownedUnboundPiChat calls (conditional paths may differ): PI_CHAT_ID_PATTERN.test, email.toLowerCase, c.get, first, bind, c.env.DB.prepare, getAgentByName, piChatObjectName, Promise.all
- L34 · ownedPiChat calls (conditional paths may differ): ownedUnboundPiChat, owned.stub.bind
- L41 · forkPiChat calls (conditional paths may differ): email.toLowerCase, parseForkPoint, getAgentByName, piChatObjectName, source.bind, source.forkEntriesAt, crypto.randomUUID, slice, run, bind, env.DB.prepare, target.bind, target.seedFromFork, catch, copyWorkspaceDisk, console.error, String
- L63 · registerPiEngineRoutes calls (conditional paths may differ): app.post, email.toLowerCase, c.get, catch, c.req.json, crypto.randomUUID, slice, trim, run, bind, c.env.DB.prepare, c.json, ownedPiChat, c.req.param, stub.submit, text.replace, app.get, stub.wait, PI_ENGINE_MODEL_CHOICES.find, stub.setModel
Environment references: c.env.DB · env.DB
- L7 · registerUploadRoutes calls (conditional paths may differ): app.post, c.req.formData, form.get, String, storeImageUpload, c.get, c.json, app.get, getRasterArtifact, c.req.param, obj.writeHttpMetadata, headers.set, getAudioMessageObject, getUploadObject
- L8 · registerPushRoutes calls (conditional paths may differ): app.get, c.json, publicVapidKey, app.post, c.req.json, safePublicHttpUrl, email.toLowerCase, c.get, first, bind, c.env.DB.prepare, crypto.randomUUID, run, JSON.stringify, catch, notifyOwner, kinds.has
Environment references: c.env.DB
- L14 · escapeHtml calls (conditional paths may differ): replace, String
- L24 · jobRunLimitLabel calls (conditional paths may differ): Math.max
- L40 · renderJobsPage calls (conditional paths may differ): join, map, Array.from, formatRenderedJobsApiReceiptHref, Number, escapeHtml, input.jobs.map, jobThreadModeLabel, jobRunLimitLabel, jobStatusClass
- L55 · parseJobListQuery calls (conditional paths may differ): searchParams.get, JOB_STATUSES.has
- L62 · failure calls (conditional paths may differ): c.json, String
- L69 · registerJobRoutes calls (conditional paths may differ): catch, c.req.json, c.get, Number, c.req.header, c.json, app.get, parseJobListQuery, c.html, renderJobsPage, Promise.all, list, service, all, bind, c.env.DB.prepare, identity.email.toLowerCase, JOB_STATUSES.has, String, ok
Environment references: c.env.CF_VERSION_METADATA · c.env.DB
- L30 · isMcpNotificationKind calls (conditional paths may differ): MCP_NOTIFICATION_KIND_SET.has
- L138 · text calls (conditional paths may differ): JSON.stringify
- L139 · clamp calls (conditional paths may differ): Math.max, Math.min, Number
- L143 · ownedSession calls (conditional paths may differ): c.get, first, bind, c.env.DB.prepare
- L151 · coordinatorCall calls (conditional paths may differ): email.toLowerCase, c.get, method.startsWith, includes, jobs.list, jobs.create, jobs.update, jobs.setPaused, jobs.run, jobs.delete, jobs.history, clamp, args.kind.trim, filters.push, params.push, all, bind, c.env.DB.prepare, filters.join, args.id.trim
- L348 · sendAndWaitInSession calls (conditional paths may differ): parseSendAndWaitArgs, ownedSession, first, bind, c.env.DB.prepare, sendAndWaitPi, getSessionAgent, stub.seedIdentity, c.get, sendAndWait, Number, stub.injectUserMessage, crypto.randomUUID, run, stub.sessionTurnState, all, setTimeout, Date.now
- L374 · sendAndWaitPi calls (conditional paths may differ): openPiChat, stub.submit, crypto.randomUUID, run, bind, c.env.DB.prepare, setTimeout, resolve, finally, Promise.race, stub.wait, clearTimeout
- L385 · askOwner calls (conditional paths may differ): args.sessionId.trim, args.question.trim, args.title.trim, Array.isArray, slice, filter, args.options.map, trim, String, ownedSession, email.toLowerCase, c.get, createDecision, notifyOwner, question.slice
- L407 · observeConnectedSession calls (conditional paths may differ): args.runId.trim, toLowerCase, args.harness.trim, args.sessionId.trim, isValidSessionHarnessId, appendOwnedRunEvent, args.machineName.trim, args.label.trim, args.state.trim, args.note.trim
- L478 · coordinatorCodeFns calls (conditional paths may differ): Object.fromEntries, map, Object.entries, coordinatorCall, objectArgs
- L521 · registerMcpRoutes calls (conditional paths may differ): app.post, catch, c.req.json, c.json, error, rpc, text, readOwnerCheckIn, c.get, METHODS.includes, coordinatorCall, args.title.trim, args.body.trim, isMcpNotificationKind, notifyOwner, ownerDeskGet, ownerDeskUpsert, ownerDeskRemove, ownerDeskClear, askOwner
Environment references: c.env.DB · c.env.LOADER
- L6 · recordingUrl calls (conditional paths may differ): encodeURIComponent
- L19 · registerBrowserRoutes calls (conditional paths may differ): app.get, c.req.param, email.toLowerCase, c.get, first, bind, c.env.DB.prepare, c.json, fetch, recordingUrl, c.req.query, REPLAY_ID_RE.test, c.text, jsonForHtml, c.html
Environment references: env.CLOUDFLARE_ACCOUNT_ID · c.env.DB · c.env.BROWSER_API_TOKEN
- L16 · owner calls (conditional paths may differ): email.toLowerCase, c.get
- L23 · summarizeAttentionItems calls (conditional paths may differ): items.filter, byKind.get, byKind.set, bySession.get, bySession.set, values.sort, localeCompare, String, sortSummary, byKind.values, slice, bySession.values
- L47 · parseAttentionKindSummaryRows calls (conditional paths may differ): rows.map, Number
- L51 · parseAttentionSessionSummaryRows calls (conditional paths may differ): rows.map, Number
- L55 · escapeHtml calls (conditional paths may differ): replace, String
- L59 · formatRenderedAttentionViewSummary calls (conditional paths may differ): Math.max, Number
- L63 · formatRenderedAttentionKindSummary calls (conditional paths may differ): join, rows.map, encodeURIComponent, Math.max, Number, escapeHtml
- L68 · formatRenderedAttentionSessionSummary calls (conditional paths may differ): join, rows.map, encodeURIComponent, Math.max, Number, escapeHtml, row.sessionId.slice
- L73 · normalizeRenderedAttentionSourceHref calls (conditional paths may differ): trim, String, value.startsWith
- L81 · formatRenderedAttentionListItem calls (conditional paths may differ): escapeHtml, normalizeRenderedAttentionSourceHref
- L85 · formatRenderedAttentionFilterLabel calls (conditional paths may differ): filter, escapeHtml, parts.join
- L94 · formatRenderedAttentionErrorList calls (conditional paths may differ): escapeHtml
- L98 · formatRenderedAttentionApiReceiptHref calls (conditional paths may differ): params.set, params.toString
- L106 · formatRenderedAttentionReturnHref calls (conditional paths may differ): replace, formatRenderedAttentionApiReceiptHref
- L110 · formatRenderedAttentionSeenForm calls (conditional paths may differ): join, escapeHtml
- L118 · formatRenderedAttentionPageHtml calls (conditional paths may differ): escapeHtml, Number, formatRenderedAttentionViewSummary
- L123 · parseAttentionListQuery calls (conditional paths may differ): url.searchParams.get, test
- L130 · buildAttentionListFilter calls (conditional paths may differ): filters.push, bindValues.push, filters.join
- L144 · normalizeAttentionSeenIds calls (conditional paths may differ): Array.isArray, slice, ids.filter, test
- L149 · normalizeAttentionDismissalTags calls (conditional paths may differ): Array.isArray, slice, tags.filter
- L154 · queueAttentionDismissals calls (conditional paths may differ): join, tags.map, run, bind, c.env.DB.prepare, tags.flatMap
- L161 · registerAttentionRoutes calls (conditional paths may differ): app.post, c.req.header, c.text, owner, c.req.formData, trim, String, form.get, params.set, parseAttentionListQuery, params.toString, c.redirect, encodeURIComponent, buildAttentionListFilter, all, bind, c.env.DB.prepare, run, queueAttentionDismissals, normalizeAttentionDismissalTags
Environment references: c.env.DB
- L10 · readOwnerCheckIn calls (conditional paths may differ): ownerEmail.toLowerCase, Promise.all, all, bind, env.DB.prepare, first, composeOwnerCheckIn, toISOString
- L69 · registerCheckInRoutes calls (conditional paths may differ): app.get, c.json, readOwnerCheckIn, c.get
Environment references: env.DB · env.CF_VERSION_METADATA
- L19 · registerSystemRoutes calls (conditional paths may differ): app.post, c.get, crypto.randomUUID, Date.now, run, bind, c.env.DB.prepare, recordRecoveryExhaustion, first, JSON.parse, encodeURIComponent, c.json, String, catch, c.req.json, seedUserWorkspaceFile
Environment references: c.env.DB
- L13 · registerConnectorRoutes calls (conditional paths may differ): app.get, c.req.param, oauthStoreFor, c.get, store.listUserMcps, userMcps.find, getBuiltinConnectors, c.json, c.req.query, store.startAuthorization, c.redirect, toString, goBack, store.completeAuthorization, app.post, Object.keys, userMcps.map, knownIds.has, store.disconnect
- L15 · registerMcpsCrudRoutes calls (conditional paths may differ): app.post, c.req.json, c.json, Effect.runPromise, probeMcp, result.error.toUpperCase, app.get, oauthStoreFor, store.listUserMcps, c.get, String, probe.error.toUpperCase, store.addUserMcp, app.delete, c.req.param, store.removeUserMcp
- L16 · registerStarterRoutes calls (conditional paths may differ): app.get, Effect.runPromise, pipe, getConversationStarters, c.get, Effect.provide, databaseLayer, c.json, String, app.put, catch, c.req.json, setConversationStarters
Environment references: c.env.DB
- L21 · persistScreenshotToWorkspace calls (conditional paths may differ): dataUrl.indexOf, Uint8Array.from, atob, replace, dataUrl.slice, char.charCodeAt, workspaceFor, workspace.write
- L31 · hostFor calls (conditional paths may differ): email.toLowerCase, c.get, c.env.MACHINE_HOST.get, c.env.MACHINE_HOST.idFromName
- L36 · registerMachinectlRoutes calls (conditional paths may differ): app.get, headers.set, email.toLowerCase, c.get, fetch, hostFor, app.post, catch, c.req.json, c.json, isValidSessionHarnessId, then, response.json, appendOwnedRunEvent, body.session.label.trim, body.session.state.trim, body.note.trim, JSON.stringify, storeInlineMediaArtifact, persistScreenshotToWorkspace
- L117 · machineStatus calls (conditional paths may differ): ctx.identity.email.toLowerCase, machineStatusCache.get, Date.now, ctx.env.MACHINE_HOST.get, ctx.env.MACHINE_HOST.idFromName, then, host.fetch, response.json, machineStatusCache.set
- L127 · schemaType calls (conditional paths may differ): Array.isArray, join, value.enum.map, JSON.stringify, schemaType, value.required.map, map, Object.entries, required.has
- L143 · laptopTypes calls (conditional paths may differ): join, catalog.map, tool.description.replaceAll, sanitizeToolName, schemaType
- L147 · machineInvoke calls (conditional paths may differ): ctx.env.MACHINE_HOST.get, ctx.env.MACHINE_HOST.idFromName, ctx.identity.email.toLowerCase, host.fetch, JSON.stringify, response.json
- L154 · createMachineWorkProvider calls (conditional paths may differ): machineStatus, machineInvoke, machineBusyOutcome, storeInlineMediaArtifact, parseMachineShellContent, JSON.parse, withVerifiedCmuxDelivery
Environment references: c.env.MACHINE_HOST · ctx.env.MACHINE_HOST · ctx.env.LOADER · env.MACHINE_HOST
- L63 · nowIso calls (conditional paths may differ): toISOString
- L67 · compactRunId calls (conditional paths may differ): replace, replaceAll, date.toISOString, slice, crypto.randomUUID
- L73 · tryParseJson calls (conditional paths may differ): JSON.parse
- L78 · parseEvent calls (conditional paths may differ): tryParseJson
- L87 · claimSummary calls (conditional paths may differ): events.some
- L109 · parseRunListQuery calls (conditional paths may differ): parseInt, url.searchParams.get, Math.min, Math.max, Number.isFinite, includes
- L127 · registerRunRoutes calls (conditional paths may differ): app.post, c.get, catch, c.req.json, trim, c.json, errorResponse, compactRunId, nowIso, slice, run, bind, c.env.DB.prepare, JSON.stringify, runEventId, jsonResponse, app.get, parseRunListQuery, all, c.req.param
Environment references: c.env.DB · c.env.CF_VERSION_METADATA
- L8 · artifactPreview calls (conditional paths may differ): manifest.css.replace, encodeURIComponent, manifest.title.replace, JSON.stringify
- L16 · registerArtifactRoutes calls (conditional paths may differ): app.get, Number.parseInt, c.req.query, listOwnedArtifacts, c.get, c.json, app.patch, catch, c.req.json, renameOwnedArtifact, c.req.param, String, app.delete, deleteOwnedArtifact, readOwnedSvelteArtifact, c.html, artifactPreview
- L10 · proxyNovnc calls (conditional paths may differ): normalizeComputerId, String, c.req.param, novncContainerPath, c.json, getNamedComputer, c.get, ensureComputerDisplay, toLowerCase, c.req.header, sandbox.wsConnect, sandbox.containerFetch
- L43 · registerComputerRoutes calls (conditional paths may differ): app.get, listNamedComputers, c.get, c.json, app.all
- L28 · sameDecision calls (conditional paths may differ): bounds.options.every
- L32 · parseBounds calls (conditional paths may differ): JSON.parse, Array.isArray
- L41 · createDecision calls (conditional paths may differ): all, bind, env.DB.prepare, question.slice, map, parseBounds, candidates.find, sameDecision, crypto.randomUUID, run, JSON.stringify, candidates.filter, supersedeDecision
- L56 · supersedeDecision calls (conditional paths may differ): run, bind, env.DB.prepare, crypto.randomUUID, toISOString, JSON.stringify
- L86 · decisionPage calls (conditional paths may differ): s.replace, join, options.map, esc, jsonForHtml
- L98 · registerDecisionRoutes calls (conditional paths may differ): app.get, c.req.query, c.json, email.toLowerCase, c.get, first, bind, c.env.DB.prepare, c.req.param, ID_RE.test, c.text, JSON.parse, encodeURIComponent, c.redirect, replace, crypto.randomUUID, c.html, decisionPage, decisionPageCsp, app.post
Environment references: env.DB · c.env.DB
- L13 · readVersionedPreference calls (conditional paths may differ): first, bind, env.DB.prepare, fallback, parse, JSON.parse
- L28 · compareAndSetPreference calls (conditional paths may differ): toISOString, JSON.stringify, run, bind, env.DB.prepare
- L49 · ownerDeskAppGet calls (conditional paths may differ): readVersionedPreference, email.toLowerCase
- L54 · ownerDeskPromotionPreview calls (conditional paths may differ): getOwnedArtifactRow, ownerDeskAppGet, describePromotion
- L70 · ownerDeskPromote calls (conditional paths may differ): ownerDeskPromotionPreview, promotionConfirmed, ownerDeskAppWrite
- L84 · ownerDeskAppWrite calls (conditional paths may differ): email.toLowerCase, applyDeskAppWrite, emptyDeskApp, Effect.runPromise, writeWithCompareAndSet, readVersionedPreference, compareAndSetPreference, broadcastDeskApp
- L98 · broadcastDeskApp calls (conditional paths may differ): email.toLowerCase, all, bind, env.DB.prepare, getAgentByName, parent.broadcastDeskApp, map
- L107 · readBoard calls (conditional paths may differ): first, bind, env.DB.prepare, emptyDeskBoard, parseDeskBoard, JSON.parse
- L114 · broadcastBoard calls (conditional paths may differ): email.toLowerCase, all, bind, env.DB.prepare, getAgentByName, parent.broadcastDeskBoard, map
- L123 · writeBoard calls (conditional paths may differ): toISOString, run, bind, env.DB.prepare, JSON.stringify, email.toLowerCase, all, getAgentByName, parent.broadcastDeskBoard, map
- L137 · ownerDeskGet calls (conditional paths may differ): readBoard, email.toLowerCase
- L141 · ownerDeskUpsert calls (conditional paths may differ): email.toLowerCase, upsertDeskCard, emptyDeskBoard, Effect.runPromise, writeWithCompareAndSet, readVersionedBoard, compareAndSetBoard, broadcastBoard
- L155 · ownerDeskRemove calls (conditional paths may differ): email.toLowerCase, removeDeskCard, emptyDeskBoard, Effect.runPromise, writeWithCompareAndSet, readVersionedBoard, compareAndSetBoard, broadcastBoard
- L169 · ownerDeskClear calls (conditional paths may differ): emptyDeskBoard, writeBoard, email.toLowerCase
- L175 · registerDeskRoutes calls (conditional paths may differ): app.get, ownerDeskGet, c.get, c.json, app.put, catch, c.req.json, ownerDeskUpsert, app.delete, ownerDeskRemove, c.req.param, ownerDeskAppGet, c.req.query, ownerDeskPromotionPreview, app.post, ownerDeskPromote, ownerDeskAppWrite, ownerDeskClear
Environment references: env.DB · env.USER_AGENT
- L8 · registerTerminalRoutes calls (conditional paths may differ): app.post, c.get, snapshotUserWorkspace, c.json, String, app.get, listWorkspaceSnapshots, Number, c.req.query, catch, c.req.json, restoreWorkspaceSnapshot, Date.now, workspaceFor, Effect.runPromise, persistBeforeWorkspaceDestroy, workspace.stopContainer, workspace.shell, slice, trim
- L8 · directoryFor calls (conditional paths may differ): c.get, createWorkspaceDirectory, publishWorkspaceChange
- L13 · failure calls (conditional paths may differ): String, c.json
- L19 · registerWorkspaceDirectoryRoutes calls (conditional paths may differ): app.get, workspaceHub, c.get, c.json, c.req.header, hub.fetch, Number, c.req.query, hub.since, c.req.queries, list, directoryFor, app.post, catch, c.req.json, failure, directory.get, directory.message, c.req.param, fork
- L6 · registerErrorRoutes calls (conditional paths may differ): app.post, catch, c.req.json, fileOwnerErrorIssue, c.get, c.json
Environment references: c.env.CF_VERSION_METADATA
- L7 · registerCapabilityRoutes calls (conditional paths may differ): app.post, c.get, catch, c.req.json, Array.isArray, body.urls.filter, url.trim, c.json, parseInternalSourceHosts, createCapabilityBundle, runCapabilityReviewDemo, String
Environment references: c.env.INTERNAL_SOURCE_HOSTS_JSON
- L16 · body calls (conditional paths may differ): catch, c.req.json
- L20 · service calls (conditional paths may differ): c.get
- L24 · failure calls (conditional paths may differ): c.json, String
- L31 · ok calls (conditional paths may differ): c.json
- L35 · registerRecipeRoutes calls (conditional paths may differ): app.get, list, service, Effect.runPromise, listPantryRecipes, ok, failure, app.post, create, body, autoTrustMode, pipe, reusableToolApprovalMode, c.get, Effect.provide, databaseLayer, setReusableToolApprovalMode, request.sourceCode.trim, getByName, setTimeout
Environment references: c.env.DB
- L8 · registerCostSeriesRoutes calls (conditional paths may differ): app.get, c.req.query, c.json, Effect.runPromise, pipe, readCycleCostSeries, c.get, Effect.provide, databaseLayer
Environment references: c.env.DB
- L17 · summarizeConnectorError calls (conditional paths may differ): String, trim, text.replace, singleLine.slice
- L23 · internalizeLinks calls (conditional paths may differ): html.replace, pop, path.split, base.replace, KNOWN.has
- L8 · getSessionAgent calls (conditional paths may differ): getAgentByName, ownerEmail.toLowerCase, getSubAgentByName
Environment references: env.USER_AGENT
- L16 · registerSvelteServe calls (conditional paths may differ): attachSvelteRoutes, app.route
- L11 · makeDeadSessionDeps calls (conditional paths may differ): inject, sessionControl, getSessionAgent, stub.seedIdentity, stub.settleIfNoLiveTurn, notifyOwner, encodeURIComponent
- L35 · scanDeadSessions calls (conditional paths may differ): Effect.runPromise, runDeadSessionScan, makeDeadSessionDeps
Environment references: env.DB
- L92 · resolveWorkerOrigin calls (conditional paths may differ): resolveBridgeOrigin
- L98 · requireBridgeOrigin calls (conditional paths may differ): resolveBridgeOrigin
- L110 · textParts calls (conditional paths may differ): join, map, message.parts.filter
- L113 · reasoningParts calls (conditional paths may differ): join, map, message.parts.filter
- L116 · attachmentParts calls (conditional paths may differ): message.parts.flatMap
Environment references: env.BRIDGE_BASE_URL · env.DB · env.OAUTH_CLIENT
- L110 · createDelegateManyTool calls (conditional paths may differ): tool, delegateManyInputSchema.parse, requireDelegateIdentity, parent.delegateIdentity, parsed.tasks.map, delegateRunId, Date.now, runDelegatesInParallel, AbortSignal.timeout, AbortSignal.any, parent.runAgentTool, asAgentToolFailure, parent.clearAgentToolRuns
- L25 · delay calls (conditional paths may differ): setTimeout
- L43 · sessionEngine calls (conditional paths may differ): first, bind, env.DB.prepare, ownerEmail.toLowerCase
- L48 · runEngineVoiceTurn calls (conditional paths may differ): sessionEngine, openPiChat, chat.submit, chat.wait, getAgentByName, identity.email.toLowerCase, getSubAgentByName, facet.seedIdentity, facet.runVoiceTurn
- L98 · stream calls (conditional paths may differ): checkVoicePrompt, console.warn, console.error, String, runEngineVoiceTurn, Promise.race, delay, Date.now, checkins.markSpoken, checkins.tick
Environment references: env.DB · env.USER_AGENT · env.AI
- L59 · byteLength calls (conditional paths may differ): encode, JSON.stringify
- L63 · safeText calls (conditional paths may differ): byteLength, value.slice
- L72 · validateTools calls (conditional paths may differ): Array.isArray, byteLength, tools.every, test
- L83 · summarizeArgs calls (conditional paths may differ): includes, tool.startsWith, Object.keys, byteLength, some, allowedKeys.includes
Environment references: env.AUDIT_KV
- L62 · withOwnerComputerWorkspace calls (conditional paths may differ): env.COMPUTER.idFromName, computerWorkspaceName, withComputerWorkspace, getWorkspace, env.COMPUTER.get
- L74 · getComputerHealth calls (conditional paths may differ): env.COMPUTER.idFromName, computerWorkspaceName, health, env.COMPUTER.get
- L79 · createComputerWorkProvider calls (conditional paths may differ): withOwnerComputerWorkspace, ctx.env.COMPUTER.idFromName, computerWorkspaceName, ctx.env.COMPUTER.get, open, readComputerFileFromWorkspace, computer.write, listComputerFilesFromWorkspace, grepComputerFilesFromWorkspace
Environment references: env.COMPUTER · ctx.env.COMPUTER
- L47 · bytesToBase64 calls (conditional paths may differ): String.fromCharCode, bytes.subarray, btoa
- L78 · hasGatewayModels calls (conditional paths may differ): Boolean
Environment references: env.AI · env.DB · env.GITHUB_TOKEN
- L57 · resolveComputerPath calls (conditional paths may differ): encoder.encode, value.includes, value.startsWith, value.split, segments.some, value.endsWith, value.slice
- L72 · withComputerWorkspace calls (conditional paths may differ): openWorkspace, operation
- L84 · lstatOrNull calls (conditional paths may differ): fs.lstat
- L93 · parentPath calls (conditional paths may differ): path.lastIndexOf, path.slice
- L98 · childPath calls (conditional paths may differ): name.includes, resolveComputerPath
- L103 · assertFileSize calls (conditional paths may differ): Number.isSafeInteger
- L107 · assertExistingPathIsSafe calls (conditional paths may differ): filter, path.split, lstatOrNull
- L125 · ensureComputerHome calls (conditional paths may differ): lstatOrNull, fs.mkdir, assertExistingPathIsSafe
- L139 · prepareComputerWrite calls (conditional paths may differ): ensureComputerHome, filter, split, slice, parentPath, lstatOrNull, missingDirectories.push, assertExistingPathIsSafe, assertFileSize, computerUsage, assertOwnerWriteQuota
- L165 · requireBoundedString calls (conditional paths may differ): encoder.encode
- L171 · truncateUtf8 calls (conditional paths may differ): encoder.encode
- L183 · boundedItems calls (conditional paths may differ): toSafeValue, encoder.encode, JSON.stringify, result.push
- L202 · computerUsage calls (conditional paths may differ): directories.shift, slice, fs.readdir, childPath, lstatOrNull, directories.push, assertFileSize
- L245 · readComputerFileFromWorkspace calls (conditional paths may differ): resolveComputerPath, ensureComputerHome, assertExistingPathIsSafe, assertFileSize, workspace.fs.readFile, encoder.encode
- L263 · parseComputerWriteInput calls (conditional paths may differ): resolveComputerPath, requireBoundedString, encoder.encode
- L269 · writeComputerFileFromWorkspace calls (conditional paths may differ): parseComputerWriteInput, prepareComputerWrite, workspace.fs.mkdir, workspace.fs.writeFile, workspace.fs.rm
- L286 · listComputerFilesFromWorkspace calls (conditional paths may differ): resolveComputerPath, ensureComputerHome, assertExistingPathIsSafe, workspace.fs.readdir, boundedItems, truncateUtf8
- L299 · matchingLines calls (conditional paths may differ): query.toUpperCase, entries, content.split, includes, line.toUpperCase, matches.push, truncateUtf8
- L309 · grepComputerFilesFromWorkspace calls (conditional paths may differ): resolveComputerPath, requireBoundedString, ensureComputerHome, assertExistingPathIsSafe, Date.now, files.shift, Number.isSafeInteger, workspace.fs.readFile, encoder.encode, matchingLines, directories.shift, slice, workspace.fs.readdir, entries.slice, childPath, lstatOrNull, directories.push, files.push, boundedItems
- L390 · computerHealthFromWorkspace calls (conditional paths may differ): lstatOrNull, Boolean
- L10 · normalizeTimestamp calls (conditional paths may differ): value.trim, Date.parse, Number.isNaN, toISOString
- L16 · buildConversationSearchQuery calls (conditional paths may differ): slice, match, query.toLowerCase, join, tokens.map, ownerEmail.toLowerCase, normalizeTimestamp, filters.push, params.push, Math.max, Math.min
- L23 · createWorkCodeExecutionState calls (conditional paths may differ): executionStates.add
- L35 · resolveWorkCodeExecutionState calls (conditional paths may differ): executionStates.has, createWorkCodeExecutionState
- L41 · reserveSavedRecipeInvocation calls (conditional paths may differ): resolveWorkCodeExecutionState, Math.min
- L60 · byteLengthForWrite calls (conditional paths may differ): encoder.encode
- L67 · reservationForComputerMethod calls (conditional paths may differ): byteLengthForWrite
- L74 · applyComputerWorkBudget calls (conditional paths may differ): resolveWorkCodeExecutionState, Object.fromEntries, map, Object.entries, reservationForComputerMethod, Math.min, invoke
- L7 · isPrivateHostname calls (conditional paths may differ): replace, hostname.toLowerCase, host.endsWith, test, exec, Number, host.includes, host.startsWith
- L29 · safePublicHttpUrl calls (conditional paths may differ): isPrivateHostname
- L39 · requirePublicHttpsUrl calls (conditional paths may differ): safePublicHttpUrl
- L5 · publishWorkspaceSnapshot calls (conditional paths may differ): Effect.gen, createWorkspaceSnapshotManifest, database.run
- L24 · latestSnapshotRow calls (conditional paths may differ): first, bind, db.prepare, workspaceSnapshotKey
- L30 · workspaceSizeCommand calls (conditional paths may differ): join, REBUILDABLE_BACKUP_EXCLUDES.map, JSON.stringify
- L35 · measureHomeBytes calls (conditional paths may differ): catch, sandbox.exec, workspaceSizeCommand, Number.parseInt, Number.isFinite
- L41 · restoreCandidates calls (conditional paths may differ): latestSnapshotRow, catch, then, all, bind, db.prepare, workspaceSnapshotKey, filter, history.map, slice, ordered.filter, seen.has, seen.add
- L54 · restoreWithFallback calls (conditional paths may differ): restoreCandidates, verifyWorkspaceRestore, sandbox.restoreBackup, console.info, console.error, String, catch, sandbox.destroy, candidates.map
- L79 · bootWorkspace calls (conditional paths may differ): Date.now, catch, sandbox.exec, readyMarkerCheckCommand, recordObserveEvent, note, sandbox.restoredFromDiskSnapshot, latestSnapshotRow, measureHomeBytes, shouldRestoreDirectoryBackup, restoreWithFallback, homeLooksWiped, String, workspaceInitCommand
- L28 · fnv1a64Hex calls (conditional paths may differ): encode, BigInt, padStart, hash.toString
- L37 · workspaceSnapshotKey calls (conditional paths may differ): ownerEmail.toLowerCase, scope.chatId.toLowerCase
- L43 · workspaceSandboxId calls (conditional paths may differ): ownerEmail.toLowerCase, scope.chatId.toLowerCase, replace, slice, fnv1a64Hex, workspaceSnapshotKey
- L65 · homeLooksWiped calls (conditional paths may differ): decideSnapshotPublish
- L70 · shouldRestoreDirectoryBackup calls (conditional paths may differ): homeLooksWiped
- L26 · b64UrlEncode calls (conditional paths may differ): String.fromCharCode, replace, btoa
- L32 · b64UrlDecode calls (conditional paths may differ): repeat, replace, padded.replace, atob, bin.charCodeAt
- L44 · asBufferSource calls (conditional paths may differ): b.buffer.slice
- L49 · importMasterKey calls (conditional paths may differ): b64UrlDecode, replace, masterKeyBase64.replace, crypto.subtle.importKey, asBufferSource
- L57 · deriveUserKey calls (conditional paths may differ): encode, crypto.subtle.deriveKey, asBufferSource
- L79 · encryptToken calls (conditional paths may differ): importMasterKey, crypto.getRandomValues, encode, deriveUserKey, crypto.subtle.encrypt, asBufferSource, join, b64UrlEncode
- L100 · decryptToken calls (conditional paths may differ): blob.split, b64UrlDecode, importMasterKey, encode, deriveUserKey, crypto.subtle.decrypt, asBufferSource, decode
- L126 · looksEncrypted calls (conditional paths may differ): test
- L13 · clampEntriesLimit calls (conditional paths may differ): Number, Math.min, Math.max, Number.isFinite, Math.floor
- L18 · parseEntriesCursor calls (conditional paths may differ): test, Number, Number.isSafeInteger
- L25 · parseMeta calls (conditional paths may differ): JSON.parse
- L35 · isOwnerVisible calls (conditional paths may differ): isCompactionSummaryId, messageIdFromMeta, parseMeta
- L39 · mapRow calls (conditional paths may differ): parseMeta, String
- L44 · pageConversationEntries calls (conditional paths may differ): rows.slice, map, page.filter, page.at, String
- L51 · parseEntriesBeforeCursor calls (conditional paths may differ): test, Number, Number.isSafeInteger
- L68 · pageConversationEntriesDesc calls (conditional paths may differ): rows.slice, reverse, map, chronological.filter, page.at, String
- L40 · normalizedEmail calls (conditional paths may differ): identity.email.toLowerCase
- L44 · widgetStorageKey calls (conditional paths may differ): normalizedEmail
- L48 · assertSelfContainedSource calls (conditional paths may differ): test, source.matchAll
- L64 · sha256 calls (conditional paths may differ): crypto.subtle.digest, encode, join, map, padStart, byte.toString
- L69 · createSvelteArtifact calls (conditional paths may differ): slice, input.title.trim, replace, input.source.trim, encode, assertSelfContainedSource, normalizedEmail, first, bind, env.DB.prepare, sha256, compile, String, crypto.randomUUID, widgetStorageKey, toISOString, put, bucket, JSON.stringify, run
- L146 · getOwnedArtifactRow calls (conditional paths may differ): ARTIFACT_ID_RE.test, first, bind, env.DB.prepare, normalizedEmail
- L152 · listOwnedArtifacts calls (conditional paths may differ): Math.max, Math.min, Number.isFinite, Math.floor, all, bind, env.DB.prepare, normalizedEmail, map
- L159 · searchOwnedArtifacts calls (conditional paths may differ): toLowerCase, queryInput.trim, filter, query.match, listOwnedArtifacts, artifacts.map, artifact.title.toLowerCase, title.match, tokens.filter, titleTokens.has, title.includes, Math.max, slice, scored.sort, b.updatedAt.localeCompare, Math.min, Math.floor
- L175 · renameOwnedArtifact calls (conditional paths may differ): ARTIFACT_ID_RE.test, slice, titleInput.trim, run, bind, env.DB.prepare, toISOString, normalizedEmail, Number
- L184 · deleteOwnedArtifact calls (conditional paths may differ): getOwnedArtifactRow, run, bind, env.DB.prepare, normalizedEmail, catch, delete, bucket, console.error, String
- L194 · readOwnedSvelteArtifact calls (conditional paths may differ): getOwnedArtifactRow, get, bucket, object.json, isSvelteArtifactManifest
- L209 · deleteSessionArtifacts calls (conditional paths may differ): normalizedEmail, all, bind, env.DB.prepare, map, run, catch, delete, bucket, console.error, String
Environment references: env.DB
- L54 · normalizedEmail calls (conditional paths may differ): identity.email.toLowerCase
- L58 · normalizeVoice calls (conditional paths may differ): includes
- L65 · deriveTitle calls (conditional paths may differ): trim, text.replace, oneLine.slice
- L72 · synthesizeSpeech calls (conditional paths may differ): gatewayConfig, gateway.baseURL.replace, fetch, JSON.stringify, slice, catch, response.text, response.arrayBuffer
- L93 · createAudioMessage calls (conditional paths may differ): trim, String, normalizeVoice, normalizedEmail, first, bind, env.DB.prepare, synthesizeSpeech, crypto.randomUUID, now.toISOString, toISOString, now.getTime, put, bucket, run, catch, delete, deriveTitle
- L144 · getAudioMessageObject calls (conditional paths may differ): AUDIO_ID_RE.test, first, bind, env.DB.prepare, normalizedEmail, Date.parse, Date.now, catch, delete, bucket, run, get
- L158 · deleteSessionAudioMessages calls (conditional paths may differ): normalizedEmail, all, bind, env.DB.prepare, map, run, catch, delete, bucket, console.error, String
Environment references: env.DB
- L13 · sessionAgent calls (conditional paths may differ): getSessionAgent
- L20 · recurringRunSessionTitle calls (conditional paths may differ): now.toLocaleString, truncateUnicodeCodePoints
- L25 · resolveRecurringJobTargetSession calls (conditional paths may differ): crypto.randomUUID, run, bind, env.DB.prepare, recurringRunSessionTitle, now.toISOString
- L81 · computeNextRun calls (conditional paths may differ): toISOString, base.getTime
- L85 · remainingRecurringJobRuns calls (conditional paths may differ): Math.max
- L89 · claimRecurringJobRun calls (conditional paths may differ): first, bind, env.DB.prepare, ownerEmail.toLowerCase
- L105 · validateJobInput calls (conditional paths may differ): trim, Number, Number.isInteger, RECURRING_JOB_THREAD_MODES.includes, name.slice, prompt.slice
- L142 · runJobNow calls (conditional paths may differ): claimRecurringJobRun, remainingRecurringJobRuns, catch, cancelJobSchedule, resolveRecurringJobTargetSession, sessionControl, control.inject, scheduledJobRunPrompt, now.getTime, String, computeNextRun, run, bind, env.DB.prepare, now.toISOString, row.owner_email.toLowerCase, completeRecurringJobRun
- L214 · scheduleJob calls (conditional paths may differ): sessionAgent, stub.seedIdentity, requireScheduleId, stub.scheduleRecurringPrompt
- L221 · cancelJobSchedule calls (conditional paths may differ): sessionAgent, stub.cancelRecurringPrompt
Environment references: env.DB
- L14 · requireOwnedSession calls (conditional paths may differ): first, bind, env.DB.prepare, ownerEmail.toLowerCase
Environment references: env.DB
- L12 · currentPinned calls (conditional paths may differ): Effect.gen, database.all
- L22 · setSessionPinned calls (conditional paths may differ): Effect.gen, database.first, currentPinned, existing.some, Effect.fail, rankForNewPin, database.run
- L54 · reorderPinnedSession calls (conditional paths may differ): Effect.gen, currentPinned, ordered.some, computeMoveRank, database.run
- L20 · buildSessionTurnState calls (conditional paths may differ): sessionRowToTurnStatus
- L3 · truncateUnicodeCodePoints calls (conditional paths may differ): join, slice, Array.from
- L13 · anthropicGatewayBaseUrl calls (conditional paths may differ): test, baseURL.replace
- L17 · gatewayRequestHeaders calls (conditional paths may differ): some, Object.keys, name.toLowerCase, find, Object.entries
- L24 · installGatewayModels calls (conditional paths may differ): gatewayConfig, anthropicGatewayBaseUrl, gatewayRequestHeaders, filter, getModels, anthropicProvider, wanted.has, models.setProvider, withRefusalFallback, createProvider, catalog.map, anthropicMessagesApi
- L61 · isRefusal calls (conditional paths may differ): test
- L66 · hasToolCall calls (conditional paths may differ): Array.isArray, message.content.some
- L76 · withRefusalFallback calls (conditional paths may differ): createAssistantMessageEventStream, catch, provider.streamSimple, isRefusal, hasToolCall, refusalFallbackModel, find, provider.getModels, console.warn, buffered.push, buffered.splice, out.push, out.end, console.error, String
- L120 · resolvePiModelChoice calls (conditional paths may differ): PI_ENGINE_MODEL_CHOICES.find
- L18 · matchesSignature calls (conditional paths may differ): signature.every
- L22 · matchesImageSignature calls (conditional paths may differ): matchesSignature
- L41 · assertOwnedUploadKey calls (conditional paths may differ): identity.email.toLowerCase, key.startsWith, key.includes, UPLOAD_KEY_SUFFIX_RE.test, key.slice
- L47 · extForType calls (conditional paths may differ): type.split
- L53 · storeImageUpload calls (conditional paths may differ): IMAGE_TYPES.has, arrayBuffer, file.slice, matchesImageSignature, crypto.randomUUID, replace, encodeURIComponent, identity.email.toLowerCase, extForType, put, uploadsBucket, file.stream
- L75 · getUploadObject calls (conditional paths may differ): assertOwnedUploadKey, get, uploadsBucket
- L80 · readUploadBytes calls (conditional paths may differ): assertOwnedUploadKey, get, uploadsBucket, obj.arrayBuffer
- L89 · storeInlineRasterArtifact calls (conditional paths may differ): storeInlineMediaArtifact
- L94 · storeInlineMediaArtifact calls (conditional paths may differ): INLINE_MEDIA_RE.exec, Uint8Array.from, atob, replace, char.charCodeAt, mime.startsWith, crypto.randomUUID, identity.email.toLowerCase, extForType, put, uploadsBucket
- L117 · getRasterArtifact calls (conditional paths may differ): ARTIFACT_ID_RE.test, identity.email.toLowerCase, get, uploadsBucket
- L17 · decodeBase64Url calls (conditional paths may differ): replace, value.replace, atob, normalized.padEnd, Uint8Array.from, char.charCodeAt
- L22 · encodeBase64Url calls (conditional paths may differ): String.fromCharCode, replace, btoa
- L27 · concat calls (conditional paths may differ): parts.reduce, out.set
- L33 · utf8 calls (conditional paths may differ): encode
- L36 · exactBuffer calls (conditional paths may differ): bytes.buffer.slice
- L39 · hmac calls (conditional paths may differ): crypto.subtle.importKey, exactBuffer, crypto.subtle.sign
- L43 · hkdfExpand calls (conditional paths may differ): slice, hmac, concat
- L48 · vapidAuthorization calls (conditional paths may differ): decodeBase64Url, importJWK, encodeBase64Url, publicBytes.slice, sign, setExpirationTime, setSubject, setAudience, setProtectedHeader, Math.floor, Date.now
- L69 · encryptAes128Gcm calls (conditional paths may differ): decodeBase64Url, crypto.subtle.importKey, exactBuffer, crypto.subtle.generateKey, crypto.subtle.exportKey, crypto.subtle.deriveBits, crypto.getRandomValues, hmac, hkdfExpand, concat, utf8, crypto.subtle.encrypt, setUint32
- L95 · sendPush calls (conditional paths may differ): safePublicHttpUrl, encryptAes128Gcm, utf8, JSON.stringify, fetch, vapidAuthorization, vapid, String, exactBuffer
- L112 · sendTestPush calls (conditional paths may differ): sendPush
Environment references: env.VAPID_SUBJECT · env.VAPID_PUBLIC_KEY · env.VAPID_PRIVATE_KEY
- L34 · isActionableNotificationKind calls (conditional paths may differ): ACTIONABLE_KIND_SET.has
- L66 · cleanText calls (conditional paths may differ): slice, trim, value.replace
- L78 · addFailure calls (conditional paths may differ): receipt.failures.push
- L82 · rejectedReason calls (conditional paths may differ): catch, response.text, cleanText
- L115 · attentionDeepLink calls (conditional paths may differ): encodeURIComponent
- L122 · boundedPushPayload calls (conditional paths may differ): encode, JSON.stringify
- L132 · payloadFits calls (conditional paths may differ): encode, JSON.stringify
- L142 · decisionPushData calls (conditional paths may differ): Array.isArray, decision.options.slice, options.every, cleanText
- L150 · normalizeDismissalTags calls (conditional paths may differ): Array.isArray, slice, tags.filter
- L155 · buildOwnerPushPayload calls (conditional paths may differ): attentionDeepLink, cleanText, defaultPushActions, decisionPushData, decision.options.map, payloadFits, normalizeDismissalTags, boundedPushPayload
- L196 · reserveProgressPush calls (conditional paths may differ): run, bind, env.DB.prepare, Number
- L205 · clearProgressPush calls (conditional paths may differ): run, bind, env.DB.prepare
- L209 · pendingDismissalTags calls (conditional paths may differ): all, bind, env.DB.prepare, normalizeDismissalTags, map
- L215 · clearDeliveredDismissalTags calls (conditional paths may differ): join, tags.map, run, bind, env.DB.prepare
- L221 · isAllowedExternalHref calls (conditional paths may differ): test, externalHosts.has
- L231 · safeHref calls (conditional paths may differ): encodeURIComponent, isAllowedExternalHref, href.startsWith
- L257 · defaultDedupeKey calls (conditional paths may differ): notification.title.trim, notification.body.trim
- L270 · ensureNotificationSession calls (conditional paths may differ): slice, trim, stableName.replace, catch, first, bind, env.DB.prepare, crypto.randomUUID, run
- L281 · notifyOwner calls (conditional paths may differ): ownerEmail.toLowerCase, ensureNotificationSession, progressTag, reserveProgressPush, dedupedReceipt, defaultDedupeKey, replace, toISOString, Date.now, catch, first, bind, env.DB.prepare, clearProgressPush, all, safeHref, externalSourceHosts, parseInternalSourceHosts, crypto.randomUUID, run
Environment references: env.DB · env.BRIDGE_BASE_URL · env.INTERNAL_SOURCE_HOSTS_JSON
- L38 · isValidSessionHarnessId calls (conditional paths may differ): SESSION_HARNESS_ID_PATTERN.test
- L42 · runEventId calls (conditional paths may differ): slice, type.replace, crypto.randomUUID
- L47 · appendOwnedRunEvent calls (conditional paths may differ): c.get, first, bind, c.env.DB.prepare, includes, input.type.trim, runEventId, toISOString, run, JSON.stringify
Environment references: c.env.DB
- L37 · savedRecipeExecutionCode calls (conditional paths may differ): replace, recipeCode.trim, trimStart, trimmed.replace, JSON.stringify, test
- L56 · hasRetiredRecipeCapability calls (conditional paths may differ): capabilities.some, RETIRED_CAPABILITY_PATTERN.test
- L60 · assertObject calls (conditional paths may differ): Array.isArray
- L65 · cleanName calls (conditional paths may differ): value.trim, test
- L71 · validateSavedRecipeInput calls (conditional paths may differ): assertObject, cleanName, body.description.trim, body.code.trim, encode, Array.isArray, capabilities.map, capability.trim, cleanCapabilities.filter, CAPABILITY_PATTERN.test, invalid.join, body.sourceRunId.trim, sort
- L94 · publicRecipe calls (conditional paths may differ): JSON.parse
- L108 · jsonType calls (conditional paths may differ): Array.isArray
- L114 · validateSchemaValue calls (conditional paths may differ): jsonType, Array.isArray, type.includes, type.join, schema.enum.some, Object.is
- L129 · validateRecipeRunInput calls (conditional paths may differ): assertObject, Array.isArray, schema.required.filter, Object.entries, validateSchemaValue
- L145 · validateSavedRecipePatch calls (conditional paths may differ): assertObject, cleanName, body.description.trim, body.code.trim, encode, Array.isArray, capabilities.map, capability.trim, cleanCapabilities.filter, CAPABILITY_PATTERN.test, invalid.join, sort, body.sourceRunId.trim, Object.keys
Environment references: env.DB
- L29 · workspaceSandboxLayer calls (conditional paths may differ): Layer.succeed, WorkspaceSandbox.of
- L33 · validate calls (conditional paths may differ): Effect.try, String
- L43 · attempt calls (conditional paths may differ): Effect.tryPromise
- L50 · listWorkspace calls (conditional paths may differ): Effect.gen, validate, resolveWorkspacePath, Math.max, Math.min, Number, attempt, sandbox.exec, shellQuote, trim, Effect.fail, filter, map, split, line.trim, lines.slice, line.startsWith, line.slice, publicWorkspacePath, absPath.slice
- L76 · writeWorkspace calls (conditional paths may differ): Effect.gen, Effect.fail, validate, resolveWorkspacePath, assertSeedablePath, abs.slice, abs.lastIndexOf, attempt, sandbox.exec, shellQuote, publicWorkspacePath
- L105 · readWorkspace calls (conditional paths may differ): Effect.gen, validate, resolveWorkspacePath, Effect.fail, Math.max, Math.min, Number, attempt, readBoundedWorkspaceFile, publicWorkspacePath, content.slice
- L23 · parseSendAndWaitArgs calls (conditional paths may differ): args.sessionId.trim, args.content.trim, Number, Number.isFinite, Math.min
- L33 · sendAndWait calls (conditional paths may differ): deps.latestEntryId, deps.now, deps.inject, deps.entriesAfter, entries.filter, deps.isRunning, join, filter, assistant.map, entries.map, deps.sleep
- L15 · parseMeta calls (conditional paths may differ): JSON.parse
- L19 · toolError calls (conditional paths may differ): JSON.parse, error.slice, text.slice
- L30 · buildObservedTurns calls (conditional paths may differ): sort, slice, turns.push, parseMeta, toolError, current.tools.push, turn.usage.push
- L62 · observeSessionTurns calls (conditional paths may differ): all, bind, db.prepare, Math.max, Math.min, buildObservedTurns
- L74 · observeWorkspace calls (conditional paths may differ): all, bind, db.prepare, map
- L13 · sessionEngineOf calls (conditional paths may differ): first, bind, env.DB.prepare, ownerEmail.toLowerCase
- L18 · sessionControl calls (conditional paths may differ): sessionEngineOf, openPiChat, chat.submitInput, chat.abortAll, chat.isBusy, getSessionAgent, stub.seedIdentity, stub.injectUserMessage, stub.abortActiveTurn, stub.sessionTurnState
Environment references: env.DB
- L1 · jsonForHtml calls (conditional paths may differ): replace, JSON.stringify
- L46 · composeOwnerCheckIn calls (conditional paths may differ): Array.isArray, sources.attention.filter, isActionableNotificationKind, actionableSampleRaw.slice, informationalSampleRaw.slice, slice, sources.jobs.filter, sources.runs.filter, Date.parse, replace, String, includes, Number.isFinite, Date.now, needsOwner.find, informationalUpdates.find, suggestedSteers.some, suggestedSteers.push, encodeURIComponent, addSteer
- L16 · recordRecoveryExhaustion calls (conditional paths may differ): recoveryExhaustionContract, sequenceRecoveryExhaustion, dependencies.logAssistant, run, bind, env.DB.prepare, dependencies.notify
Environment references: env.DB
- L154 · hasModelGateway calls (conditional paths may differ): Boolean
- L163 · availableModels calls (conditional paths may differ): MODELS.filter, Boolean, hasModelGateway
- L176 · defaultModelId calls (conditional paths may differ): hasModelGateway, some, availableModels
- L183 · findModel calls (conditional paths may differ): MODELS.find
- L194 · resolveModelId calls (conditional paths may differ): currentModelId, findModel
- L203 · resolveAvailableModelId calls (conditional paths may differ): currentModelId, findModel, defaultModelId, some, availableModels
Environment references: env.LLM_GATEWAY_TOKEN · env.LLM_GATEWAY_SERVICE_TOKEN_ID · env.LLM_GATEWAY_SERVICE_TOKEN_SECRET · env.LLM_GATEWAY_URL · env.LLM_SPECIAL_GATEWAY_URL · env.LLM_SPECIAL_GATEWAY_TOKEN
- L53 · probeFetch calls (conditional paths may differ): pipe, Effect.tryPromise, fetch, Effect.timeout, Effect.retry, Effect.orElseSucceed
- L58 · safeHttpsUrl calls (conditional paths may differ): safePublicHttpUrl
- L100 · slugIdFromUrl calls (conditional paths may differ): u.hostname.toLowerCase, filter, host.split
- L120 · fetchOAuthMetadata calls (conditional paths may differ): Effect.gen, probeFetch, includes, response.headers.get, pipe, Effect.tryPromise, response.json, Effect.orElseSucceed
- L143 · tryInitialize calls (conditional paths may differ): Effect.gen, probeFetch, JSON.stringify, pipe, Effect.tryPromise, trim, response.text, body.startsWith, body.includes, join, map, filter, body.split, line.startsWith, line.slice, JSON.parse, Effect.orElseSucceed
- L179 · probeMcp calls (conditional paths may differ): Effect.gen, safeHttpsUrl, upstream.toString, fetchOAuthMetadata, tryInitialize, slugIdFromUrl
- L10 · ownerEmail calls (conditional paths may differ): toLowerCase, value.trim
- L14 · isMissingTable calls (conditional paths may differ): includes, String
- L18 · getConversationStarters calls (conditional paths may differ): Effect.gen, pipe, database.first, ownerEmail, Effect.catchTag, isMissingTable, Effect.succeed, Effect.fail, JSON.parse, normalizeStarters
- L34 · setConversationStarters calls (conditional paths may differ): Effect.gen, normalizeStarters, toISOString, database.run, ownerEmail, JSON.stringify
- L23 · record calls (conditional paths may differ): Array.isArray
- L35 · tailText calls (conditional paths may differ): record, stringField
- L41 · contentAfterCursor calls (conditional paths may differ): after.startsWith, after.slice, before.slice, after.lastIndexOf
- L49 · findFreshUserTurn calls (conditional paths may differ): message.trim, fresh.split, line.trim, trimmed.replace
- L59 · isVerifiedPromptTool calls (conditional paths may differ): PROMPT_TOOLS.has
- L63 · isFocusTool calls (conditional paths may differ): test
- L67 · promptMessage calls (conditional paths may differ): stringField
- L73 · verifiedPrompt calls (conditional paths may differ): record, promptMessage, tailText, readTail, send, Math.max, sleep, contentAfterCursor, findFreshUserTurn, fresh.trim
- L103 · frontmostWorkspaceId calls (conditional paths may differ): record, stringField, Array.isArray
- L116 · verifiedFocus calls (conditional paths may differ): record, stringField, send, frontmostWorkspaceId, readStatus
- L128 · withVerifiedCmuxDelivery calls (conditional paths may differ): Object.entries, isVerifiedPromptTool, verifiedPrompt, isFocusTool, verifiedFocus
- L3 · normalizeComputerId calls (conditional paths may differ): toLowerCase, raw.trim, ID_RE.test
- L9 · computerSandboxName calls (conditional paths may differ): ownerEmail.toLowerCase, normalizeComputerId
- L18 · novncContainerPath calls (conditional paths may differ): requestPath.startsWith, requestPath.slice, rest.startsWith, rest.includes
- L30 · computerPreviewSrc calls (conditional paths may differ): normalizeComputerId, encodeURIComponent
- L19 · handle calls (conditional paths may differ): sandboxStub, namespace, computerSandboxName
- L23 · latestSnapshot calls (conditional paths may differ): first, bind, env.DB.prepare, identity.email.toLowerCase
- L30 · getNamedComputer calls (conditional paths may differ): normalizeComputerId, handle, catch, sandbox.exec, shouldRestoreComputerSnapshot, latestSnapshot, verifyWorkspaceRestore, sandbox.restoreBackup, console.info
- L47 · processRunning calls (conditional paths may differ): catch, sandbox.listProcesses, listed.some, includes
- L52 · ensureComputerDisplay calls (conditional paths may differ): sandbox.exec, processRunning, sandbox.startProcess, x.waitForPort, novnc.waitForPort
- L73 · listNamedComputers calls (conditional paths may differ): all, bind, env.DB.prepare, identity.email.toLowerCase
- L80 · snapshotNamedComputer calls (conditional paths may differ): getNamedComputer, sandbox.createBackup, Date.now, run, bind, env.DB.prepare, identity.email.toLowerCase
- L103 · proveNamedComputerSleepWake calls (conditional paths may differ): getNamedComputer, opened.sandbox.writeFile, snapshotNamedComputer, opened.sandbox.exec, restored.sandbox.readFile
Environment references: env.DB
- L20 · decisionResponseLayer calls (conditional paths may differ): Layer.mergeAll, Layer.succeed, DecisionStore.of, DecisionResume.of, attempt
- L27 · decisionResponseLiveLayer calls (conditional paths may differ): Layer.mergeAll, decisionResponseLayer
- L31 · attempt calls (conditional paths may differ): Effect.tryPromise, String
- L45 · recordDecisionResponse calls (conditional paths may differ): Effect.gen, toISOString, attempt, store.insertEvent, pipe, store.completeRun, Result.isFailure, store.deleteEvent, Effect.catch, Effect.fail, resume.resume.pipe, Result.isSuccess, store.reopenRun, Effect.succeed
- L25 · emptyDeskBoard calls (conditional paths may differ): toISOString
- L29 · parseDeskBoard calls (conditional paths may differ): emptyDeskBoard, Array.isArray, parseDeskCard, cards.push, toISOString
- L44 · parseDeskCard calls (conditional paths may differ): id.trim, title.trim, ID_RE.test, STATUSES.has, cleanSourceHref, cleanDecisionHref, title.slice, slice, body.trim, toISOString
- L64 · upsertDeskCard calls (conditional paths may differ): toISOString, raw.id.trim, board.cards.find, parseDeskCard, Object.hasOwn, slice, board.cards.filter
- L84 · removeDeskCard calls (conditional paths may differ): toISOString, incomingId.trim, ID_RE.test, board.cards.filter
- L90 · sameOriginPath calls (conditional paths may differ): href.startsWith
- L95 · cleanRemoteHref calls (conditional paths may differ): value.trim, join
- L111 · cleanSourceHref calls (conditional paths may differ): cleanRemoteHref
- L115 · cleanDecisionHref calls (conditional paths may differ): value.trim, sameOriginPath, test, cleanRemoteHref
- L5 · readVersionedBoard calls (conditional paths may differ): first, bind, env.DB.prepare, emptyDeskBoard, parseDeskBoard, JSON.parse
- L14 · compareAndSetBoard calls (conditional paths may differ): toISOString, JSON.stringify, run, bind, env.DB.prepare
Environment references: env.DB
- L13 · emptyDeskApp calls (conditional paths may differ): toISOString
- L17 · stateByteLength calls (conditional paths may differ): encode, JSON.stringify
- L22 · parseDeskApp calls (conditional paths may differ): emptyDeskApp, ARTIFACT_ID_RE.test, row.updatedBy.slice, toISOString
- L32 · applyDeskAppWrite calls (conditional paths may differ): Array.isArray, Object.hasOwn, toISOString, ARTIFACT_ID_RE.test, stateByteLength, options.author.slice
- L7 · usableTerminalGrid calls (conditional paths may differ): Number.isInteger
- L13 · boundedDimension calls (conditional paths may differ): Number.parseInt, Number.isFinite, Math.min
- L19 · terminalDimensions calls (conditional paths may differ): boundedDimension
- L30 · encodeKeystrokes calls (conditional paths may differ): encode
- L34 · resizeFrame calls (conditional paths may differ): Number.isInteger, JSON.stringify
- L41 · isStatusFrame calls (conditional paths may differ): JSON.parse
- L9 · persistBeforeWorkspaceDestroy calls (conditional paths may differ): Effect.gen, Effect.tryPromise
- L36 · createWorkspaceDirectory calls (conditional paths may differ): ownerEmail.toLowerCase, first, bind, env.DB.prepare, resolveWorkspacePath, assertSeedablePath, entry, deps.workspace, scopeFor, all, Math.min, Math.max, map, submit, deps.openChat, siblingMessage, deps.forkChat, siblingPath, uploadedFilePath, write
Environment references: env.DB
- L23 · matches calls (conditional paths may differ): subscription.kinds.includes, subscription.workspaces.includes, changeTarget
- L29 · eventsSince calls (conditional paths may differ): recent.filter, matches
- L35 · workspaceHub calls (conditional paths may differ): namespace.get, namespace.idFromName, ownerEmail.toLowerCase
- L41 · publishWorkspaceChange calls (conditional paths may differ): workspaceHub, catch, hub.publish, console.error, String
- L18 · fileOwnerErrorIssue calls (conditional paths may differ): parseErrorReportInput, isTransientClientError, errorFingerprint, claimFingerprint, githubIssueIsOpen, catch, touchFingerprint, awaitClaimedIssue, createGithubIssue, rememberFingerprint, then, mod.ownerDeskUpsert, formatAutoIssueTitle, slice
- L59 · reportServerChatError calls (conditional paths may differ): String, catch, fileOwnerErrorIssue, console.error
- L79 · cutoffSql calls (conditional paths may differ): Date.now, replace, toISOString
- L83 · claimFingerprint calls (conditional paths may differ): ownerEmail.toLowerCase, run, bind, env.DB.prepare, first, cutoffSql
- L104 · awaitClaimedIssue calls (conditional paths may differ): ownerEmail.toLowerCase, setTimeout, first, bind, env.DB.prepare
- L122 · touchFingerprint calls (conditional paths may differ): run, bind, env.DB.prepare, ownerEmail.toLowerCase
- L128 · rememberFingerprint calls (conditional paths may differ): run, bind, env.DB.prepare, ownerEmail.toLowerCase
- L139 · githubIssueIsOpen calls (conditional paths may differ): post, catch, res.json
- L153 · createGithubIssue calls (conditional paths may differ): post, JSON.stringify, formatAutoIssueTitle, formatAutoIssueBody, catch, res.json, trim
Environment references: env.GITHUB_TOKEN · env.GITHUB_REPO · env.CF_VERSION_METADATA · env.DB
- L48 · stableHash calls (conditional paths may differ): digest, update, createHash, JSON.stringify
- L52 · parseResourceUrl calls (conditional paths may differ): raw.trim, url.pathname.match
- L95 · createCapabilityBundle calls (conditional paths may differ): map, urls.filter, url.trim, parseResourceUrl, parsed.map, randomUUID, stableHash
- L102 · fakeContentFor calls (conditional paths may differ): JSON.stringify
- L106 · runCapabilityReviewDemo calls (conditional paths may differ): map, bundle.capabilities.slice, fakeContentFor, stableHash, toISOString
- L62 · isSyntheticExecutionId calls (conditional paths may differ): id.startsWith
- L72 · connectorsFromCapabilities calls (conditional paths may differ): cap.indexOf, connectors.add, cap.slice, sort
- L81 · rowToSnippet calls (conditional paths may differ): JSON.parse, Array.isArray, parsed.filter, connectors.map
- L117 · projectSavedRecipe calls (conditional paths may differ): recipe.owner_email.toLowerCase, toISOString, first, bind, env.DB.prepare, JSON.parse, Array.isArray, parsed.filter, connectorsFromCapabilities, run, JSON.stringify, crypto.randomUUID, Date.parse, Date.now, syntheticExecutionId
- L174 · backfillOwnerSnippets calls (conditional paths may differ): ownerEmail.toLowerCase, all, bind, env.DB.prepare, JSON.parse, Array.isArray, parsed.filter, hasRetiredRecipeCapability, first, projectSavedRecipe
- L204 · listSnippetsDualRead calls (conditional paths may differ): ownerEmail.toLowerCase, all, bind, env.DB.prepare, filter, results.map, hasRetiredRecipeCapability, map, JSON.parse, Array.isArray, parsed.filter, connectorsFromCapabilities, Date.parse, Date.now, syntheticExecutionId
- L248 · getSnippetDualRead calls (conditional paths may differ): listSnippetsDualRead, all.find
- L261 · codemodeExecutionIdForRecipe calls (conditional paths may differ): catch, first, bind, env.DB.prepare, recipe.owner_email.toLowerCase, syntheticExecutionId
Environment references: env.DB
- L18 · isMissingTable calls (conditional paths may differ): includes, String
- L22 · reusableToolApprovalMode calls (conditional paths may differ): Effect.gen, pipe, database.first, reusableToolOwnerEmail, Effect.catchTag, isMissingTable, Effect.succeed, Effect.fail, parseApprovalMode
- L36 · setReusableToolApprovalMode calls (conditional paths may differ): Effect.gen, Effect.fail, toISOString, database.run, reusableToolOwnerEmail, JSON.stringify
- L50 · mapRecipeToPantryBody calls (conditional paths may differ): JSON.parse, Array.isArray, sort, filter, capabilities.map, cap.split, Date.parse, Date.now
- L99 · mapSnippetToPantryBody calls (conditional paths may differ): JSON.parse, Array.isArray, parsed.filter
- L134 · pushRecipe calls (conditional paths may differ): pantryConfig, mapRecipeToPantryBody, String, console.warn, postRecipeBody
- L162 · pushSnippet calls (conditional paths may differ): pantryConfig, mapSnippetToPantryBody, String, console.warn, postRecipeBody
- L186 · postRecipeBody calls (conditional paths may differ): pantryFetch, transport, JSON.stringify, catch, res.text, trim, console.warn, res.json, console.log, String
- L221 · syncRecipesToPantry calls (conditional paths may differ): pantryConfig, console.log, service.list, service.get, recipeByName.set, listSnippetsDualRead, seen.add, recipeByName.get, pushed.push, pushSnippet, seen.has, pushRecipe, String, console.warn
- L16 · request calls (conditional paths may differ): Effect.tryPromise, pantryFetch, headers
- L23 · listPantryRecipes calls (conditional paths may differ): pantryConfig, Effect.succeed, Effect.gen, request, Effect.fail, Effect.tryPromise, response.json, filter, map, String, Array.isArray, recipe.capabilities.filter, hasRetiredRecipeCapability
- L44 · getPantryRecipe calls (conditional paths may differ): pantryConfig, Effect.succeed, Effect.gen, request, encodeURIComponent, Effect.fail, Effect.tryPromise, response.json, Array.isArray, recipe.capabilities.filter, hasRetiredRecipeCapability, String
- L6 · cycleCostLayer calls (conditional paths may differ): Layer.mergeAll, databaseLayer
- L10 · owner calls (conditional paths may differ): ownerEmail.toLowerCase
- L14 · nextCycleIndex calls (conditional paths may differ): Effect.gen, database.first, owner
- L28 · recordCycleCost calls (conditional paths may differ): Effect.gen, toISOString, database.run, owner, JSON.stringify
- L59 · readCycleCostSeries calls (conditional paths may differ): Effect.gen, database.all, owner, rows.map
- L11 · ownerEmail calls (conditional paths may differ): toLowerCase, email.trim
- L15 · validateOwnerInstructions calls (conditional paths may differ): value.trim, Array.from
- L24 · storedInstructions calls (conditional paths may differ): JSON.parse, value.trim, validateOwnerInstructions
- L34 · getOwnerInstructions calls (conditional paths may differ): pipe, Effect.gen, db.first, ownerEmail, storedInstructions, Effect.catch, includes, String, Effect.succeed, Effect.fail, Effect.provide, databaseLayer
- L48 · setOwnerInstructions calls (conditional paths may differ): pipe, Effect.gen, Effect.try, validateOwnerInstructions, resetOwnerInstructions, Effect.sync, toISOString, db.run, ownerEmail, JSON.stringify, Effect.provide, databaseLayer
- L67 · resetOwnerInstructions calls (conditional paths may differ): pipe, Effect.gen, db.run, ownerEmail, Effect.provide, databaseLayer
- L78 · composeOwnerSystemPrompt calls (conditional paths may differ): cachedContext.trim, protectedPolicy.trim, parts.push, ownerInstructions.trim, parts.join
Environment references: env.DB
Build and deployment pipeline · 2 GitHub Actions workflows
Repository CI declarations, separate from runtime request processing. Job dependencies and conditions are shown as written; long commands are shortened with an ellipsis; a workflow file does not prove a recent successful run.
Triggers: workflow_dispatch, push
deploy · no job dependencies declared
- actions/checkout@v4
actions/checkout@v4 - actions/setup-node@v4
actions/setup-node@v4 - Install
npm ci - Refuse to deploy an empty production config
node scripts/verify-deployable-config.mjs - Verify public-clean
npm run verify:public - Build assets + typecheck + unit tests
npm run check - Verify no stale legacy surfaces
npm run verify:legacy-surface - Apply D1 migrations
npx wrangler d1 migrations apply my-ax-db --remoteCondition: ${{ github.event_name == 'push' || inputs.run_migrations }} - Deploy (Worker + Sandbox container image)
cloudflare/wrangler-action@v3Wrangler command: deploy - Record deployed sandbox image digest
# The fast-path (scripts/deploy-remote.mjs) pins to this digest so it # can deploy Worker-only changes without Docker. Persist it as a build # artifact for humans/agents to read back. npx wrangler containers list 2>/dev/null | tee sandbox-images.txt || trueCondition: ${{ always() }} - actions/upload-artifact@v4
actions/upload-artifact@v4Condition: ${{ always() }}
Triggers: push, pull_request
check · no job dependencies declared
- actions/checkout@v4
actions/checkout@v4 - actions/setup-node@v4
actions/setup-node@v4 - Shell command
npm ci - Shell command
npm run verify:public - Scan public issue and PR text
npm run verify:public-textCondition: github.event_name == 'pull_request' - Shell command
npm run check - Shell command
npm run verify:legacy-surface - Validate Wrangler bundle/config
npx wrangler deploy --dry-run --outdir /tmp/my-ax-worker - Build Sandbox container
docker build -t my-ax-ci . - Build named computer container
docker build -f Dockerfile.computer -t my-ax-computer-ci .
deploy: npm run build:assets && wrangler deploydeploy:dev: npm run build:assets && wrangler deploy --env devbuild:effect-workers: npm run build:assets && wrangler deploy --dry-run --env= --outdir .wrangler/effect-mainbuild:css: tailwindcss -i src/styles/app.css -o public/static/styles.css --minifybuild:brand: node scripts/build-brand.mjsbuild:assets: npm run build:css && npm run build:brand && npm run build:vendor && npm run build:docs && npm run build:sveltebuild:docs: node scripts/build-docs.mjsbuild:svelte: node src/ui/build.mjsbuild:vendor: node scripts/build-vendor.mjs
build: ./build.sh
Repository README
View original on GitHub ↗Full upstream document by @acoyfellow · README.md · snapshot efddb87
My AX
My AX is a single-operator agent. It acts with your authority. It works in a container, on a machine you connect, and in bounded cloud runs. You deploy it into your own Cloudflare account. You put it behind your own Access login.
You approve the agent. It is not a remote-access tool. It takes no inbound connection. You configure each path it uses. You gate each path with Cloudflare Access. You can stop each path.
The agent does these tasks:
- It writes files in a container workspace.
- It runs commands through a companion. You install the companion on a machine you choose.
- It starts bounded agent runs in the cloud.
- It opens public web pages in a headless browser.
The agent records the result when work finishes or needs a decision. You return to a check-in page. The page shows what needs you, what runs now, and what finished.
The agent acts with the authority you already hold. You approve the work. You direct the work. You stop the work. Each action writes a receipt you can read.
Security posture. My AX is single-operator. One verified Access identity owns every conversation, record, and tool call. The machine companion connects outbound only. It checks every caller at the Worker boundary. It runs as an OS account you choose. See the security posture for the trust model, the identity and network boundaries, and what My AX does not do.
In this 3.4s clip the agent writes a workspace file and runs a command on a connected machine. This is one configured path. It is not proof of every boundary. Open the MP4.
Verify before you trust.
npm run checkcovers the local build, the types, and the unit tests only. The deployment proof proves Access, containers, models, voice, push, and workspace restoration. A green local run does not prove them.
Where The Agent Acts
The agent uses more than one place. It picks the place for each task. Each place returns output you can read.
| Place | Mechanism | Authority | What you can read back |
|---|---|---|---|
| Persistent Sandbox | container-backed /home/user, snapshotted to R2 |
isolated per owner | files, command output, process state |
| A machine you connect | machine.* over an outbound companion (machinectl) |
the companion's OS account, which you choose | the exact command, its output |
| A public web page | browser_open in a headless browser |
no local cookies; public URLs only | rendered title, text, an rrweb replay |
| Your own live UI | page.* over the chat WebSocket |
only while your chat tab is open | session list, health, transcript tail |
| An artifact it builds | create_svelte_artifact + tools the artifact registers |
sandboxed iframe, no same-origin access | the artifact, driven in place |
The Sandbox does not need you or your machine present. The machine companion is the highest-authority path. It runs as a real OS account. Give it a dedicated account with least privilege. See the security posture for the boundary on each place.
The feature tour shows each capability with a real transcript or receipt.
The Owner Loop
You do not watch the agent work. You return to it.
- Check-in is the front door.
GET /api/check-inand MCPmy_ax_check_inbuild one response from Attention, jobs, and run receipts. The response shows what needs you, what runs now, what finished or failed, and a next step. The authenticated shell shows these as owner pages at/attention,/runs, and/jobs. Each rendered page keeps the raw API receipt href for proof:/attentionexposesdata-attention-api-receipt-href,/runsexposesdata-runs-api-receipt-href, and/jobsexposesdata-jobs-api-receipt-href. The/attentionpage also has a same-origindata-attention-seen-formyou use to mark the current filtered view seen. - Attention holds owner-scoped items with unread state. A finished job, an ended recovery attempt, or a question from the agent lands here. Web Push sends it when you are away. The item stays if push fails.
- Desk is the durable board at
/?action=desk. Agents upsert cards withdesk_upsertinstead of starting a new conversation or flattening Approve/Reject into a push body.desk_removeandDELETE /api/desk/:cardIdremove one card without changing the others. Open source stays a real GitLab or GitHub URL. Decide stays a same-origin decision link.desk_clearandDELETE /api/deskempty the board. A second open desk tab can stay stale until it reloads. A push that only wakes you should use href/?action=desk. - Live error issues file, classify, and open a ready PR. A client
pushErroror a server chat error mayPOST /api/errors. One fingerprint is one issue for 24 hours. Desk gets a card. The hook labels and writes one loop board. A 15-minute sweep closes same-fingerprint duplicates and queues missed issues. Ifbot/issue-<n>exists, the Worker opens a ready PR. Review and audit never approve or merge. You merge. - Run receipts record events the agent adds. A recurring job run, a saved-recipe run, and a delegated batch each write a start event and a terminal event you can open.
What The Agent Can Do
- Schedule recurring work. Native per-session alarms run saved prompts. HTTP routes, agent tools, Code Mode, and MCP share one owner-scoped job service. D1 holds the job state and the durable history.
- Delegate in parallel. A parent sends up to 1000 read-only child tasks in one call. They run at the same time by default, inside an adaptive window of 32. Work runs one step after another only when a later task needs an earlier result. A shared rate limit (3021) halves the window and retries the task after a backoff. It does not stop the batch. Each child runs at depth 1 for 120 seconds. Children get no application, MCP, browser, machine, or delegation tools. The parent keeps their results and writes the summary.
- Reuse a proven procedure. You approve a successful
work_coderun as a named reusable tool. Reuse runs the exact saved code. The code does not change between runs. Each run records a receipt and shows in Check-in. - Ask you a question.
ask_userwrites an owner-scoped decision and an Attention item. It waits. It then puts your approved answer back into the source conversation. - Put work on the desk.
desk_upsertwrites a card the owner can open later at/?action=desk. Pair it withask_useror MCPask_ownerwhen a decision is required. Do not flatten the choice intonotify_ownertext. - Build a UI.
create_svelte_artifactcompiles a self-contained Svelte 5 component. It stores the component. It shows the component in a sandboxed iframe. The artifact can register its own tools. The agent calls those tools to direct the artifact on a later turn.
Important Limits
The hard bounds, so you know what the agent cannot do.
| Surface | Boundary |
|---|---|
| Delegation | At most 1000 children per call, run in parallel inside an adaptive window (32, halved on 3021). Depth 1, 8 model or tool steps each, 120s per child, 10-minute batch deadline. A child that cannot start before the deadline, or that hits 3021 more than 4 times, is returned as deferred. Children make model-provider calls and create records that stay. The UI shows a final snapshot. It does not show live progress and has no cancel. |
| Recurring jobs | At most 10 active jobs per owner. Cadence 60 seconds to 30 days. Names 200 characters, prompts 4,000. D1 drives the UI. The native scheduler drives execution. The two can disagree. There is no automatic repair. If the state drifts, pause, delete, and create the job again. |
| Work Code Mode | The generated source has a limit of 32,000 bytes. Each run has a 60-second wall-clock limit and no ambient network. The limit does not reduce the authority of an allowlisted callback. |
| Workspace | All conversations for one owner share /home/user. My AX snapshots it to R2 and refuses a requested recycle if snapshot publication fails. Two conversations can edit the same files with no merge. |
| Machine | Commands run as the OS account that hosts the companion, with that account's permissions. My AX adds no privilege separation. |
| Page (live UI) | Works only while an owner chat tab is connected. Each verb returns page_unavailable at other times. Artifact-registered tools are per-artifact and capped. They are bound to the source window. They are checked against their schema. |
| Browser | browser_open accepts HTTP(S) URLs that pass public-address checks. It receives no local browser cookies. Authenticated local browsing works only when a connected machine gives access to it. |
| Voice and push | Need explicit browser permission and provider availability. A failed push does not remove its Attention record. |
Feature Status and Limits is the current-state inventory: what is real, where it lives, and the known limits.
Deploy
Requirements:
- Node.js 22 and npm 11
- Docker with Colima, Docker Desktop, or WSL2; native Windows shells are not tested
- Python 3, Bash, and OpenSSL
- A Cloudflare account authorized to create Workers, Containers, D1, KV, R2, Workers AI, Browser Rendering, and Dynamic Worker Loader resources; paid usage or product enablement may apply
setup.sh creates infrastructure. It does not make a verified service. Read Deploying My AX before you run it against an existing account or make the hostname public.
git clone https://github.com/acoyfellow/my-ax
cd my-ax
npm ci
npx wrangler login
npx wrangler whoami
# If more than one account is listed:
export MY_AX_ACCOUNT_ID=your_target_account_id
bash scripts/setup.sh
The script does these steps:
- It creates missing named resources.
- It binds existing resources you configured.
- It creates bridge and encryption secrets that are absent.
- It applies pending remote D1 migrations.
- It deploys.
On a fresh Worker the script replaces the historical Durable Object migration chain with one baseline. Existing deployments keep their append-only history. The script reuses keys when the secret source is still available. It does not rotate them. It cannot recover deleted keys.
Before you send a real turn:
- Put the hostname behind a Cloudflare Access self-hosted application.
- Set
CF_ACCESS_ISS,CF_ACCESS_AUD,BRIDGE_BASE_URL, andCLOUDFLARE_ACCOUNT_IDas the deployment guide describes. - Add bucket-scoped
R2_ACCESS_KEY_IDandR2_SECRET_ACCESS_KEYso workspace snapshots survive a container replacement. Without them, treat workspace files as disposable. - Confirm the default Workers AI model is available to the account.
- Redeploy, verify anonymous access is rejected, and verify authenticated
GET /api/healthreturnsok: true. - Open the hostname through Access and complete one model turn. Health proves routing and bindings only; run the documented snapshot and restore proof when workspace persistence matters.
Push needs VAPID secrets. Managed OAuth callbacks need an Access-gated HTTPS hostname. Loopback cannot complete that flow. Deploying My AX has copy-paste configuration, verification, and troubleshooting. Each installation must own separate Worker, D1, KV, R2, Durable Object, Access, and secret state. Installations can share a source revision. They must never share runtime resources.
Connect Tools
Open Settings, then Connectors, then Add. Enter an HTTPS MCP endpoint the Worker can reach. For OAuth-enabled servers, My AX tries metadata discovery. It stores grants encrypted with owner-bound context under the deployment-wide MASTER_KEY. A server with incompatible metadata or callback configuration will not connect. If you replace the key and do not keep the old value, you can never decrypt existing grants.
My AX checks connector URLs for embedded credentials and disallowed destinations. The operator allowlists exact MCP method identifiers for Code Mode. My AX does not prove that an allowlisted method has no side effect.
Optional providers:
- My Machine runs
machinectl. This gives terminal-equivalent access as the companion's OS user. Use a dedicated account with least privilege. - Web Push needs VAPID keys and browser notification permission.
- Pantry bridge needs
PANTRY_TOKENto push enabled reusable tools to a pantry. Other agents can then reuse them. You can also setPANTRY_URL; the default ishttps://pantry.coey.dev. The bridge is additive and enabled-only. It fails soft. It does nothing without the token.
Who Owns What
| Layer | Responsibility |
|---|---|
| Agents SDK | Durable identity, conversation facets, WebSockets, schedules, MCP, RPC, and child runs. |
| Think | Model and tool turns, message history, recovery, conversation memory, and compaction. |
| My AX | Single-operator authorization, UI, product policy, jobs, Attention, receipts, and work providers. |
Think is authoritative for conversation execution and history. D1 stores application records and derived indexes. R2 stores object bytes and workspace snapshots. Snapshots are not continuous backups. Code Mode has no direct database, secret, or network bindings. Its allowlisted server-side callbacks keep their normal authority.
Repository Map
src/agent.ts canonical Think agent and tool assembly
src/user-agent.ts owner root and conversation facets
src/check-in.ts owner-scoped check-in read model
src/jobs.ts native recurring schedules
src/job-service.ts owner-scoped job CRUD and evidence
src/saved-recipes.ts owner-approved reusable work_code tools
src/delegate-many.ts bounded agents-as-tools delegation
src/work-tools.ts workspace, machine, page, and codemode catalog
src/routes/ authenticated HTTP adapters
src/ui/ product UI and allowlisted result widgets
migrations/ D1 application and projection schemas
State ownership and request flow are in Architecture.
Development
npm ci
npm run check
npm run dev
Local Development documents loopback mode and the Access-gated tunnel needed for OAuth callbacks.
Documentation
- Feature Tour
- Architecture
- Feature Status and Limits
- Deploying My AX
- Deployment Proof
- Security Policy
- Contributing
- Changelog
Report bugs and feature requests in GitHub Issues. Put one checkable receipt in the issue (command output, file:line, or URL). The factory is a recurring My AX job that opens one chat per issue and proposes PRs. It never merges. You merge after you read the receipt. Hunt-only ticks follow docs/hunt.md: one new issue, then stop. Report vulnerabilities through the Security Policy, not a public issue.
See Contributing and the factory.
License
MIT
Frequently asked about My AX
What is My AX?+
My AX is a self-hosted Manus alternative built on the Cloudflare developer platform. A single-operator AI agent with a container workspace, browser and cloud runs
What does My AX replace?+
My AX is listed as an alternative to Manus. Compare the features and tradeoffs before migrating.
What Cloudflare primitives does My AX use?+
My AX is built on Browser Rendering, Containers, D1, Durable Objects, KV, R2, Workers, Workers AI.
How much does My AX cost to run?+
Requires Workers Paid: the agent workspace and computer run on Cloudflare Containers, which are billed for active time beyond the allowance included with the $5/month plan. Browser Rendering, Workers AI, R2 and Durable Objects add metered usage, and model-provider charges are separate. Cloudflare Containers are only available on Workers Paid and bill for every 10 ms they run beyond included usage. The README requires putting the deployment behind Cloudflare Access; it is single-operator with one verified identity. The checked-in config also declares -dev containers and a legacy agent class; those are omitted from the diagram. Source and configuration review establishes a deployment path and conditional costs; this candidate was not executed or load-tested. Official Cloudflare pricing pages saved 31 Oct 2026 (Markdown editions of developers.cloudflare.com pricing documentation). Check current Cloudflare pricing before deploying.
Is My AX open source?+
The upstream repository declares the MIT license. Read its terms at https://raw.githubusercontent.com/acoyfellow/my-ax/efddb870a2e5c3a666778f1efac3b81f1454ff2e/LICENSE. Source code and contributor credit are available at https://github.com/acoyfellow/my-ax.
Community rating
No ratings yet. Tried this project? Share your experience.
One rating per verified account. You can change or remove yours. Accounts are email verified; use of the software is self-reported.


Discussion · 0
sign in to comment →