@vibecodr/cli 0.2.11 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +57 -23
- package/MIGRATION.md +73 -0
- package/README.md +89 -72
- package/dist/auth/official-client.d.ts +6 -0
- package/dist/auth/official-client.d.ts.map +1 -0
- package/dist/auth/official-client.js +1 -0
- package/dist/auth/official-client.js.map +1 -0
- package/dist/auth/token-manager.d.ts +40 -0
- package/dist/auth/token-manager.d.ts.map +1 -0
- package/dist/auth/token-manager.js +1 -2
- package/dist/auth/token-manager.js.map +1 -0
- package/dist/bin/vc-tools.d.ts +3 -0
- package/dist/bin/vc-tools.d.ts.map +1 -0
- package/dist/bin/vc-tools.js +7 -0
- package/dist/bin/vc-tools.js.map +1 -0
- package/dist/bin/vibecodr-mcp.d.ts +3 -0
- package/dist/bin/vibecodr-mcp.d.ts.map +1 -0
- package/dist/bin/vibecodr-mcp.js +37 -0
- package/dist/bin/vibecodr-mcp.js.map +1 -0
- package/dist/cli/errors.d.ts +28 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/errors.js +1 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/output.d.ts +16 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +1 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/parse.d.ts +18 -0
- package/dist/cli/parse.d.ts.map +1 -0
- package/dist/cli/parse.js +1 -0
- package/dist/cli/parse.js.map +1 -0
- package/dist/clients/base.d.ts +20 -0
- package/dist/clients/base.d.ts.map +1 -0
- package/dist/clients/base.js +1 -0
- package/dist/clients/base.js.map +1 -0
- package/dist/clients/claude-code.d.ts +5 -0
- package/dist/clients/claude-code.d.ts.map +1 -0
- package/dist/clients/claude-code.js +88 -0
- package/dist/clients/claude-code.js.map +1 -0
- package/dist/clients/claude-desktop.d.ts +5 -0
- package/dist/clients/claude-desktop.d.ts.map +1 -0
- package/dist/clients/claude-desktop.js +97 -0
- package/dist/clients/claude-desktop.js.map +1 -0
- package/dist/clients/codex.d.ts +5 -0
- package/dist/clients/codex.d.ts.map +1 -0
- package/dist/clients/codex.js +1 -0
- package/dist/clients/codex.js.map +1 -0
- package/dist/clients/cursor.d.ts +5 -0
- package/dist/clients/cursor.d.ts.map +1 -0
- package/dist/clients/cursor.js +1 -1
- package/dist/clients/cursor.js.map +1 -0
- package/dist/clients/vscode.d.ts +5 -0
- package/dist/clients/vscode.d.ts.map +1 -0
- package/dist/clients/vscode.js +5 -1
- package/dist/clients/vscode.js.map +1 -0
- package/dist/clients/windsurf.d.ts +5 -0
- package/dist/clients/windsurf.d.ts.map +1 -0
- package/dist/clients/windsurf.js +1 -0
- package/dist/clients/windsurf.js.map +1 -0
- package/dist/commands/call.d.ts +9 -0
- package/dist/commands/call.d.ts.map +1 -0
- package/dist/commands/call.js +1 -0
- package/dist/commands/call.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +1 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/context.d.ts +15 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +2 -5
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +2 -1
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/help.d.ts +3 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +1 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +23 -5
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +1 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +1 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/pulse-publish.d.ts +3 -0
- package/dist/commands/pulse-publish.d.ts.map +1 -0
- package/dist/commands/pulse-publish.js +1 -0
- package/dist/commands/pulse-publish.js.map +1 -0
- package/dist/commands/pulse-setup.d.ts +3 -0
- package/dist/commands/pulse-setup.d.ts.map +1 -0
- package/dist/commands/pulse-setup.js +5 -3
- package/dist/commands/pulse-setup.js.map +1 -0
- package/dist/commands/pulse.d.ts +3 -0
- package/dist/commands/pulse.d.ts.map +1 -0
- package/dist/commands/pulse.js +1 -0
- package/dist/commands/pulse.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +1 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/tools.d.ts +3 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +1 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/uninstall.d.ts +3 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +12 -4
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/upload.d.ts +3 -0
- package/dist/commands/upload.d.ts.map +1 -0
- package/dist/commands/upload.js +1 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +82 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/core/interactive-input.d.ts +7 -0
- package/dist/core/interactive-input.d.ts.map +1 -0
- package/dist/core/interactive-input.js +1 -0
- package/dist/core/interactive-input.js.map +1 -0
- package/dist/core/mcp-client.d.ts +17 -0
- package/dist/core/mcp-client.d.ts.map +1 -0
- package/dist/core/mcp-client.js +1 -0
- package/dist/core/mcp-client.js.map +1 -0
- package/dist/core/redaction.d.ts +2 -0
- package/dist/core/redaction.d.ts.map +1 -0
- package/dist/core/redaction.js +36 -2
- package/dist/core/redaction.js.map +1 -0
- package/dist/core/renderers.d.ts +8 -0
- package/dist/core/renderers.d.ts.map +1 -0
- package/dist/core/renderers.js +1 -0
- package/dist/core/renderers.js.map +1 -0
- package/dist/doctor/run.d.ts +10 -0
- package/dist/doctor/run.d.ts.map +1 -0
- package/dist/doctor/run.js +12 -3
- package/dist/doctor/run.js.map +1 -0
- package/dist/legacy/cli/errors.d.ts +9 -0
- package/dist/legacy/cli/errors.d.ts.map +1 -0
- package/dist/legacy/cli/errors.js +23 -0
- package/dist/legacy/cli/errors.js.map +1 -0
- package/dist/legacy/cli/install.d.ts +24 -0
- package/dist/legacy/cli/install.d.ts.map +1 -0
- package/dist/legacy/cli/install.js +307 -0
- package/dist/legacy/cli/install.js.map +1 -0
- package/dist/legacy/cli/output.d.ts +17 -0
- package/dist/legacy/cli/output.d.ts.map +1 -0
- package/dist/legacy/cli/output.js +36 -0
- package/dist/legacy/cli/output.js.map +1 -0
- package/dist/legacy/cli/parser.d.ts +33 -0
- package/dist/legacy/cli/parser.d.ts.map +1 -0
- package/dist/legacy/cli/parser.js +177 -0
- package/dist/legacy/cli/parser.js.map +1 -0
- package/dist/legacy/cli/run.d.ts +11 -0
- package/dist/legacy/cli/run.d.ts.map +1 -0
- package/dist/legacy/cli/run.js +2947 -0
- package/dist/legacy/cli/run.js.map +1 -0
- package/dist/legacy/config/credential-store.d.ts +8 -0
- package/dist/legacy/config/credential-store.d.ts.map +1 -0
- package/dist/legacy/config/credential-store.js +52 -0
- package/dist/legacy/config/credential-store.js.map +1 -0
- package/dist/legacy/config/store.d.ts +63 -0
- package/dist/legacy/config/store.d.ts.map +1 -0
- package/dist/legacy/config/store.js +311 -0
- package/dist/legacy/config/store.js.map +1 -0
- package/dist/legacy/core/api-client.d.ts +45 -0
- package/dist/legacy/core/api-client.d.ts.map +1 -0
- package/dist/legacy/core/api-client.js +204 -0
- package/dist/legacy/core/api-client.js.map +1 -0
- package/dist/legacy/core/contracts.d.ts +488 -0
- package/dist/legacy/core/contracts.d.ts.map +1 -0
- package/dist/legacy/core/contracts.js +386 -0
- package/dist/legacy/core/contracts.js.map +1 -0
- package/dist/legacy/core/goal-coverage.d.ts +15 -0
- package/dist/legacy/core/goal-coverage.d.ts.map +1 -0
- package/dist/legacy/core/goal-coverage.js +169 -0
- package/dist/legacy/core/goal-coverage.js.map +1 -0
- package/dist/legacy/core/redaction.d.ts +4 -0
- package/dist/legacy/core/redaction.d.ts.map +1 -0
- package/dist/legacy/core/redaction.js +121 -0
- package/dist/legacy/core/redaction.js.map +1 -0
- package/dist/legacy/core/validators.d.ts +8 -0
- package/dist/legacy/core/validators.d.ts.map +1 -0
- package/dist/legacy/core/validators.js +102 -0
- package/dist/legacy/core/validators.js.map +1 -0
- package/dist/legacy/core/version.d.ts +3 -0
- package/dist/legacy/core/version.d.ts.map +1 -0
- package/dist/legacy/core/version.js +3 -0
- package/dist/legacy/core/version.js.map +1 -0
- package/dist/legacy/index.d.ts +8 -0
- package/dist/legacy/index.d.ts.map +1 -0
- package/dist/legacy/index.js +8 -0
- package/dist/legacy/index.js.map +1 -0
- package/dist/platform/browser.d.ts +7 -0
- package/dist/platform/browser.d.ts.map +1 -0
- package/dist/platform/browser.js +1 -0
- package/dist/platform/browser.js.map +1 -0
- package/dist/platform/exec.d.ts +3 -0
- package/dist/platform/exec.d.ts.map +1 -0
- package/dist/platform/exec.js +10 -1
- package/dist/platform/exec.js.map +1 -0
- package/dist/platform/paths.d.ts +9 -0
- package/dist/platform/paths.d.ts.map +1 -0
- package/dist/platform/paths.js +13 -0
- package/dist/platform/paths.js.map +1 -0
- package/dist/platform/prompt.d.ts +5 -0
- package/dist/platform/prompt.d.ts.map +1 -0
- package/dist/platform/prompt.js +1 -0
- package/dist/platform/prompt.js.map +1 -0
- package/dist/storage/config-store.d.ts +15 -0
- package/dist/storage/config-store.d.ts.map +1 -0
- package/dist/storage/config-store.js +1 -0
- package/dist/storage/config-store.js.map +1 -0
- package/dist/storage/file-lock.d.ts +7 -0
- package/dist/storage/file-lock.d.ts.map +1 -0
- package/dist/storage/file-lock.js +1 -0
- package/dist/storage/file-lock.js.map +1 -0
- package/dist/storage/install-manifest.d.ts +12 -0
- package/dist/storage/install-manifest.d.ts.map +1 -0
- package/dist/storage/install-manifest.js +1 -0
- package/dist/storage/install-manifest.js.map +1 -0
- package/dist/storage/secret-store.d.ts +36 -0
- package/dist/storage/secret-store.d.ts.map +1 -0
- package/dist/storage/secret-store.js +1 -0
- package/dist/storage/secret-store.js.map +1 -0
- package/dist/types/auth.d.ts +55 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +1 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/config.d.ts +29 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +1 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/install.d.ts +26 -0
- package/dist/types/install.d.ts.map +1 -0
- package/dist/types/install.js +1 -0
- package/dist/types/install.js.map +1 -0
- package/docs/API-CONTRACT.md +606 -0
- package/docs/CLOUDFLARE-PRIMITIVE-FIT.md +212 -0
- package/docs/RELEASE-CHECKLIST.md +297 -0
- package/docs/SECURITY.md +227 -0
- package/docs/VALIDATION-MATRIX.md +58 -0
- package/docs/commands.md +49 -29
- package/docs/legacy/AGENT-TOOLKIT-RFC.md +1395 -0
- package/docs/legacy/CLI-GUIDELINES-AUDIT.md +95 -0
- package/docs/legacy/COMPLETION-AUDIT.md +542 -0
- package/docs/legacy/vc-tools-finetune.md +982 -0
- package/docs/legacy/vc-tools-goal-browser-run-containers.md +465 -0
- package/docs/legacy/vc-tools-goal-original.md +249 -0
- package/package.json +37 -8
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# Cloudflare Primitive Fit
|
|
2
|
+
|
|
3
|
+
Last checked against Cloudflare docs: 2026-05-17.
|
|
4
|
+
|
|
5
|
+
This document records which current Cloudflare primitives belong in
|
|
6
|
+
`vc-tools`, and which ones are intentionally deferred. The goal is to avoid
|
|
7
|
+
shipping an older Durable Object mental model where Cloudflare now has a
|
|
8
|
+
better dynamic primitive, while also avoiding a novelty-driven replatform that
|
|
9
|
+
would weaken the hosted Tools Cloud boundary.
|
|
10
|
+
|
|
11
|
+
## Current Decision
|
|
12
|
+
|
|
13
|
+
`vc-tools` should use Cloudflare's newest dynamic offerings when it is loading
|
|
14
|
+
customer- or agent-authored Worker code at runtime. It should not use them as a
|
|
15
|
+
replacement for the platform-owned quota, audit, artifact, job, Browser Run, or
|
|
16
|
+
Sandbox control plane.
|
|
17
|
+
|
|
18
|
+
The v1 production substrate remains:
|
|
19
|
+
|
|
20
|
+
- Browser Run Quick Actions for stateless screenshots, PDFs, markdown, rendered
|
|
21
|
+
HTML, and first-class bounded crawl artifacts.
|
|
22
|
+
- Cloudflare Workflows for durable `browser.agent_task` execution. The Workflow
|
|
23
|
+
owns the long-running task lifecycle and retries, while Browser Run Sessions
|
|
24
|
+
remain the browser provider inside that lane: Creator up to 20 minutes and Pro
|
|
25
|
+
up to 1 hour per task, both with 10-minute idle closure and artifact output.
|
|
26
|
+
- Cloudflare Sandbox SDK for hosted shell/test command execution, with Creator
|
|
27
|
+
on `standard-1` and Pro on `standard-2` container lanes.
|
|
28
|
+
- D1 for actor-scoped job, usage, audit, retention, and artifact indexes.
|
|
29
|
+
- R2 for artifact bytes.
|
|
30
|
+
- Queues plus DLQ for bounded async dispatch and retry of stateless browser,
|
|
31
|
+
sandbox, scheduled QA, and other single-step jobs.
|
|
32
|
+
- The Sandbox SDK's required Durable Object and Container binding for sandbox
|
|
33
|
+
lifecycle and process isolation.
|
|
34
|
+
|
|
35
|
+
That is not a rejection of Dynamic Workers. It is a boundary decision: Dynamic
|
|
36
|
+
Workers are an execution substrate for dynamically loaded Worker modules, not a
|
|
37
|
+
ledger, not an artifact store, not a Browser Run substitute, and not a shell
|
|
38
|
+
container.
|
|
39
|
+
|
|
40
|
+
## Current Cloudflare Facts
|
|
41
|
+
|
|
42
|
+
Cloudflare Browser Run is the correct browser provider, but its lanes should be
|
|
43
|
+
split by workflow shape:
|
|
44
|
+
|
|
45
|
+
- Quick Actions remain the best default for `vc-tools` public-web browser work
|
|
46
|
+
because the hosted service can submit a bounded request, meter browser time,
|
|
47
|
+
store an artifact, and avoid local browser execution.
|
|
48
|
+
- Browser Sessions support direct browser control and session reuse. They carry
|
|
49
|
+
separate concurrency/pricing pressure and belong only inside the paid
|
|
50
|
+
`browser.agent_task` lane, not the stateless Quick Actions lane.
|
|
51
|
+
- `/crawl` is a Browser Run Quick Action, not a Dynamic Workers feature. It
|
|
52
|
+
starts an async provider crawl job and returns site records as a hosted
|
|
53
|
+
artifact under `vc-tools` quota, retention, and audit.
|
|
54
|
+
|
|
55
|
+
Cloudflare Workflows are the right durable primitive for long paid browser
|
|
56
|
+
tasks:
|
|
57
|
+
|
|
58
|
+
- Workflow classes extend `WorkflowEntrypoint` and are bound through Wrangler
|
|
59
|
+
with `name`, `binding`, and `class_name`.
|
|
60
|
+
- Workers create instances through the Workflow binding with an instance `id`
|
|
61
|
+
and typed `params`, which maps cleanly to the existing D1 job id and queued
|
|
62
|
+
job payload.
|
|
63
|
+
- `step.do()` provides durable execution, retry configuration, and resume from
|
|
64
|
+
the last successful step instead of relying on a Queue consumer invocation.
|
|
65
|
+
- Cloudflare Workers limits cap Queue Consumers at 15 minutes of wall-clock
|
|
66
|
+
time, while Workflows are designed for durable multi-step work. That makes
|
|
67
|
+
Queue consumers a poor owner for the 20-minute Creator and 1-hour Pro browser
|
|
68
|
+
agent-task lane.
|
|
69
|
+
|
|
70
|
+
Cloudflare Dynamic Workers provide a Worker Loader binding that can load Worker
|
|
71
|
+
code at runtime:
|
|
72
|
+
|
|
73
|
+
- `load(code)` creates a fresh Dynamic Worker for one-time execution.
|
|
74
|
+
- `get(id, callback)` caches a Dynamic Worker by ID so it can stay warm across
|
|
75
|
+
requests.
|
|
76
|
+
- Dynamic Workers can be given selected bindings and can have outbound network
|
|
77
|
+
disabled with `globalOutbound: null`.
|
|
78
|
+
- Dynamic Workers are priced by Dynamic Workers created daily, requests, and
|
|
79
|
+
CPU time.
|
|
80
|
+
|
|
81
|
+
Cloudflare Durable Object Facets build on Dynamic Workers:
|
|
82
|
+
|
|
83
|
+
- A platform-owned supervisor Durable Object loads dynamic code.
|
|
84
|
+
- The dynamically loaded facet runs as a child of the supervisor.
|
|
85
|
+
- Each facet gets its own isolated SQLite database.
|
|
86
|
+
- The supervisor controls access and decides what requests reach the facet.
|
|
87
|
+
|
|
88
|
+
Cloudflare Dynamic Workflows add durable steps to runtime-loaded code:
|
|
89
|
+
|
|
90
|
+
- Dynamic Worker code can create Workflow instances without pre-registering
|
|
91
|
+
each tenant's Workflow class.
|
|
92
|
+
- Workflow steps can retry, sleep, wait for events, and resume after isolate
|
|
93
|
+
restarts.
|
|
94
|
+
|
|
95
|
+
Cloudflare Sandbox SDK is different:
|
|
96
|
+
|
|
97
|
+
- The Sandbox SDK is explicitly built from Workers, Durable Objects, and
|
|
98
|
+
Containers.
|
|
99
|
+
- Its Wrangler configuration requires `containers`, a `durable_objects` binding,
|
|
100
|
+
and a migration for the `Sandbox` class.
|
|
101
|
+
- `getSandbox()` returns a Durable Object-backed sandbox whose container starts
|
|
102
|
+
lazily and can execute shell commands, manage files, expose ports, and be
|
|
103
|
+
destroyed after use.
|
|
104
|
+
|
|
105
|
+
## Fit Matrix
|
|
106
|
+
|
|
107
|
+
| Need | Preferred primitive | Why |
|
|
108
|
+
| --- | --- | --- |
|
|
109
|
+
| Screenshot, PDF, markdown, rendered page inspection, bounded crawl | Browser Run Quick Actions | Stateless, Cloudflare-hosted, no Worker code loading required |
|
|
110
|
+
| Paid browser agent task up to 20 minutes on Creator or 1 hour on Pro | Cloudflare Workflow plus Browser Run Session | Workflow owns durable job execution/retry; Browser Session provides browser-native control with explicit close/finally behavior, 10-minute idle closure, and saved JSON artifacts |
|
|
111
|
+
| Shell command or test execution | Sandbox SDK | Real isolated container/process/filesystem boundary; Creator uses `standard-1`, Pro uses `standard-2` |
|
|
112
|
+
| Agent-authored JavaScript tool code | Dynamic Workers `load(code)` | Runtime-loaded Worker module with controlled bindings and egress |
|
|
113
|
+
| Reused user-defined HTTP tool/app code | Dynamic Workers `get(id, callback)` | Stable ID can keep the Worker warm and avoid reloading every call |
|
|
114
|
+
| User-defined durable object/reducer with private storage | Durable Object Facets | Supervisor-owned dynamic code plus isolated facet SQLite |
|
|
115
|
+
| Long-running user-defined workflow steps | Dynamic Workflows | Runtime-loaded code with Workflow retry/sleep/event semantics |
|
|
116
|
+
| Product billing, quota, audit, grants, retention, artifact index | D1 plus platform Worker logic | Needs platform-owned authority and queryability, not dynamic user code |
|
|
117
|
+
| Artifact bytes | R2 | Large binary/object storage, not Durable Object storage |
|
|
118
|
+
| Cross-user reporting and dashboards | D1 or Analytics Engine | Cross-object query/reporting plane |
|
|
119
|
+
| Job dispatch and retries for single-step tools | Queues plus DLQ | Simple bounded retry and backpressure path for non-agent long-running jobs |
|
|
120
|
+
|
|
121
|
+
## vc-tools Invariants
|
|
122
|
+
|
|
123
|
+
- Dynamic Workers must not receive raw Cloudflare account tokens, Stripe
|
|
124
|
+
secrets, Vibecodr grant-signing secrets, D1 global authority, R2 bucket-wide
|
|
125
|
+
authority, or the Browser Run API token.
|
|
126
|
+
- Dynamic Workers, if added, must receive only a purpose-built host proxy with
|
|
127
|
+
explicit inputs, output size limits, egress policy, timeout, plan quota, and
|
|
128
|
+
audit context.
|
|
129
|
+
- Durable Object Facets, if added, must be children of a platform supervisor
|
|
130
|
+
Durable Object. The facet may own facet-local state, but it must not own
|
|
131
|
+
subscription authority, grant validation, global quota, or billing.
|
|
132
|
+
- Cloudflare Workflows are allowed as platform-owned durable execution for
|
|
133
|
+
`browser.agent_task`. Dynamic Workflows, if added later for runtime-loaded
|
|
134
|
+
user code, must persist only user-defined workflow state and step outputs.
|
|
135
|
+
Platform admission, quota reservation, audit, and cancellation must still
|
|
136
|
+
happen before dynamic code starts.
|
|
137
|
+
- The Sandbox SDK Durable Object is not optional ceremony. It is part of
|
|
138
|
+
Cloudflare's current Sandbox architecture and should remain while Sandbox SDK
|
|
139
|
+
is the shell/test execution provider.
|
|
140
|
+
- For the current v1 toolset, using Dynamic Workers to replace Browser Run
|
|
141
|
+
Quick Actions or Sandbox SDK would be a downgrade: Dynamic Workers do not
|
|
142
|
+
provide Chrome sessions and do not provide a shell/container boundary.
|
|
143
|
+
- Browser access should be liberal for public HTTPS targets and strict at trust
|
|
144
|
+
boundaries. Browser Run must not cross into private networks, authenticated
|
|
145
|
+
user accounts, Vibecodr infrastructure, or provider secrets without an
|
|
146
|
+
explicit future grant.
|
|
147
|
+
|
|
148
|
+
## Adoption Gate
|
|
149
|
+
|
|
150
|
+
Add Dynamic Workers only when at least one of these product capabilities exists:
|
|
151
|
+
|
|
152
|
+
1. `tool.dynamic_worker.run`: execute a bounded JavaScript/Worker module as a
|
|
153
|
+
hosted tool.
|
|
154
|
+
2. `tool.dynamic_worker.app`: reuse a stable user-defined Worker by ID.
|
|
155
|
+
3. `tool.facet.run`: run a user-defined durable reducer/object behind a
|
|
156
|
+
supervisor Durable Object.
|
|
157
|
+
4. `tool.dynamic_workflow.run`: run user-defined multi-step workflows that need
|
|
158
|
+
retries, sleep, waits, or approvals.
|
|
159
|
+
|
|
160
|
+
Before shipping any of those capabilities:
|
|
161
|
+
|
|
162
|
+
- Add a Worker Loader binding and generated Worker types.
|
|
163
|
+
- Add strict module/source validation and output limits.
|
|
164
|
+
- Disable outbound by default with `globalOutbound: null`.
|
|
165
|
+
- Pass only least-privilege bindings or host proxies.
|
|
166
|
+
- Reserve quota before loading dynamic code.
|
|
167
|
+
- Record audit before and after dynamic code execution.
|
|
168
|
+
- Add cancellation and timeout proof.
|
|
169
|
+
- Add tests proving no raw platform secret, binding, D1, R2, Browser Run, or
|
|
170
|
+
Sandbox authority leaks into the dynamic code.
|
|
171
|
+
|
|
172
|
+
## Current Conclusion
|
|
173
|
+
|
|
174
|
+
I agree that Cloudflare's dynamic offerings are the right future substrate for
|
|
175
|
+
agent-authored Worker code and user-defined durable logic. I disagree that they
|
|
176
|
+
should replace the current `vc-tools` v1 Browser Run/Sandbox/D1/R2/Queue shape.
|
|
177
|
+
|
|
178
|
+
The best production architecture is:
|
|
179
|
+
|
|
180
|
+
- Keep the current control plane on platform-owned Worker, D1, R2, Queue,
|
|
181
|
+
Workflows, and explicit provider bindings.
|
|
182
|
+
- Keep Browser Run Quick Actions as the default browser lane.
|
|
183
|
+
- Keep Cloudflare Workflows as the durable paid `browser.agent_task` execution
|
|
184
|
+
lane, with Browser Run Sessions as the browser provider inside that Workflow.
|
|
185
|
+
- Keep `browser.crawl_site` in that Quick Actions lane, with plan-owned page and
|
|
186
|
+
depth limits.
|
|
187
|
+
- Keep Queues plus DLQ for stateless browser, sandbox, scheduled QA, and other
|
|
188
|
+
single-step work; do not use a universal Queue fairness delay for interactive
|
|
189
|
+
tools.
|
|
190
|
+
- Keep Sandbox SDK for command/test execution, with the paid user-facing lane
|
|
191
|
+
split by plan: Creator `standard-1`, Pro `standard-2`.
|
|
192
|
+
- Add Dynamic Workers/Facets later as a separate, explicitly named capability
|
|
193
|
+
family for supervised user-defined code, with no ambient platform authority.
|
|
194
|
+
|
|
195
|
+
## Source Links
|
|
196
|
+
|
|
197
|
+
- Cloudflare Dynamic Workers:
|
|
198
|
+
https://developers.cloudflare.com/dynamic-workers/getting-started/
|
|
199
|
+
- Cloudflare Dynamic Workers API reference:
|
|
200
|
+
https://developers.cloudflare.com/dynamic-workers/api-reference/
|
|
201
|
+
- Cloudflare Dynamic Workers custom limits:
|
|
202
|
+
https://developers.cloudflare.com/dynamic-workers/usage/limits/
|
|
203
|
+
- Cloudflare Durable Object Facets:
|
|
204
|
+
https://developers.cloudflare.com/dynamic-workers/usage/durable-object-facets/
|
|
205
|
+
- Cloudflare Dynamic Workflows:
|
|
206
|
+
https://developers.cloudflare.com/dynamic-workers/usage/dynamic-workflows/
|
|
207
|
+
- Cloudflare Browser Run:
|
|
208
|
+
https://developers.cloudflare.com/browser-run/
|
|
209
|
+
- Cloudflare Sandbox SDK architecture:
|
|
210
|
+
https://developers.cloudflare.com/sandbox/concepts/architecture/
|
|
211
|
+
- Cloudflare Sandbox SDK Wrangler configuration:
|
|
212
|
+
https://developers.cloudflare.com/sandbox/configuration/wrangler/
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
# vc-tools Release Checklist
|
|
2
|
+
|
|
3
|
+
Use this checklist before publishing `@vibecodr/vc-tools`.
|
|
4
|
+
|
|
5
|
+
## Repository Boundary
|
|
6
|
+
|
|
7
|
+
- `git rev-parse --show-toplevel` prints the `tools/vc-tools` repository root.
|
|
8
|
+
- No files are staged or committed from the parent Vibecodr repository.
|
|
9
|
+
- The package name is `@vibecodr/vc-tools`.
|
|
10
|
+
- The binary name is `vc-tools`.
|
|
11
|
+
- Environment variables use the `VC_TOOLS_*` namespace.
|
|
12
|
+
- Stored credentials use the native credential store unless
|
|
13
|
+
`VC_TOOLS_CREDENTIAL_STORE=file` is explicitly set for tests.
|
|
14
|
+
|
|
15
|
+
## Required Verification
|
|
16
|
+
|
|
17
|
+
```powershell
|
|
18
|
+
npm ci
|
|
19
|
+
npm run check
|
|
20
|
+
npm run check:worker
|
|
21
|
+
npm test
|
|
22
|
+
npm run build
|
|
23
|
+
npm run verify:artifact
|
|
24
|
+
npm run verify:goal
|
|
25
|
+
npm run verify:release
|
|
26
|
+
npm run verify
|
|
27
|
+
node dist/bin/vc-tools.js --help
|
|
28
|
+
node dist/bin/vc-tools.js help agent
|
|
29
|
+
node dist/bin/vc-tools.js help computer
|
|
30
|
+
node dist/bin/vc-tools.js help browser
|
|
31
|
+
node dist/bin/vc-tools.js --quiet usage
|
|
32
|
+
node dist/bin/vc-tools.js --json plans
|
|
33
|
+
node dist/bin/vc-tools.js usage
|
|
34
|
+
node dist/bin/vc-tools.js --json limits
|
|
35
|
+
node dist/bin/vc-tools.js --json dashboard usage
|
|
36
|
+
node dist/bin/vc-tools.js --json inspect
|
|
37
|
+
node dist/bin/vc-tools.js --json browser render https://127.0.0.1
|
|
38
|
+
npx wrangler deploy --dry-run --outdir tmp\wrangler-dry-run
|
|
39
|
+
npx wrangler d1 migrations apply vc-tools-db --remote
|
|
40
|
+
VC_TOOLS_RELEASE_CHANNEL=live npm run verify:release
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Expected results:
|
|
44
|
+
|
|
45
|
+
- TypeScript exits `0`.
|
|
46
|
+
- Worker type generation and Worker TypeScript checks exit `0`.
|
|
47
|
+
- Tests exit `0`.
|
|
48
|
+
- Build exits `0`.
|
|
49
|
+
- Package artifact verifier exits `0`.
|
|
50
|
+
- Goal coverage verifier exits `0`.
|
|
51
|
+
- Release readiness verifier exits `0` for `VC_TOOLS_RELEASE_CHANNEL=cli-contract`.
|
|
52
|
+
- `VC_TOOLS_RELEASE_CHANNEL=live npm run verify:release` exits `0` only after
|
|
53
|
+
`live-hosted-production` is marked locally verified by fresh production smoke
|
|
54
|
+
evidence. It is expected to fail while that inspection is still
|
|
55
|
+
`hosted-required`.
|
|
56
|
+
- Help identifies `vc-tools`, not `vibecodr`.
|
|
57
|
+
- Help exposes examples, docs/support links, secure credential file/stdin
|
|
58
|
+
inputs, and command-specific help via both `vc-tools help <command>` and
|
|
59
|
+
`<command> --help`.
|
|
60
|
+
- `--quiet` suppresses non-essential human success output while `--json` remains
|
|
61
|
+
stable.
|
|
62
|
+
- `plans` works without auth using local launch packaging fallback.
|
|
63
|
+
- `plans` includes Free, Creator, Pro, overage meters, and launch safety
|
|
64
|
+
policies.
|
|
65
|
+
- `plans` fallback and `/v1/plans` are explicitly non-authoritative for actor
|
|
66
|
+
entitlement; `usage`/`limits` are the account-state surface and are marked
|
|
67
|
+
read-only/not client-mutable.
|
|
68
|
+
- `usage` renders allotted limits, numeric usage, and 0-100% quota bars; `limits`
|
|
69
|
+
returns the same hosted usage state and keeps stable JSON.
|
|
70
|
+
- `dashboard usage` and `dashboard cogs` return hosted dashboard URLs without
|
|
71
|
+
requiring or printing credentials.
|
|
72
|
+
- `inspect` reports one hosted-required check for CLI-contract releases and zero
|
|
73
|
+
hosted-required checks after live production smoke.
|
|
74
|
+
- Unsafe browser URL smoke exits non-zero before any hosted request.
|
|
75
|
+
- The Worker returns health, MCP metadata, and fail-closed auth responses; tests
|
|
76
|
+
keep contract-mode coverage for no-cost route validation.
|
|
77
|
+
- The contract-mode Worker supports MCP `initialize`, `tools/list`, and
|
|
78
|
+
`tools/call` JSON-RPC requests.
|
|
79
|
+
- Hosted dashboard sections render overview, usage, activity, artifacts, grants,
|
|
80
|
+
retention, billing, and internal COGS launch-contract data.
|
|
81
|
+
|
|
82
|
+
## Hosted Service Production Checks
|
|
83
|
+
|
|
84
|
+
Run these after hosted Worker, D1, R2, Queue, Browser Run, Sandbox,
|
|
85
|
+
`VC_TOOLS_BROWSER_RUN_ACCOUNT_ID`, `VC_TOOLS_BROWSER_RUN_API_TOKEN`, and the
|
|
86
|
+
hosted/Browser/Sandbox account-cap vars plus `VC_TOOLS_CLI_GRANT_PUBLIC_JWKS`
|
|
87
|
+
or the controlled static `VC_TOOLS_TOKEN_SHA256` secret are configured. Also configure
|
|
88
|
+
`VC_TOOLS_INTERNAL_ALERT_TOKEN` through the repo-owned
|
|
89
|
+
`scripts/vc-tools-secrets.ps1` flow; that script stores the managed alert signer
|
|
90
|
+
in WinCred and uploads the same value to `vibecodr-internal-api` as
|
|
91
|
+
`INTERNAL_BINDING_TOKEN_NEXT` so the current internal mesh token is not rotated
|
|
92
|
+
just to enable vc-tools alerting. Keep the `VC_TOOLS_INTERNAL_API_WORKER`
|
|
93
|
+
service binding deployed, confirm internal-api `ALERT_CODES` includes
|
|
94
|
+
`E-VIBECODR-VC-TOOLS-SOFT-CAP`, and confirm internal-api has `NTFY_TOPIC`
|
|
95
|
+
configured if ntfy delivery is expected. vc-tools operator emails are reserved
|
|
96
|
+
for account-wide hosted, Browser Run, and Sandbox capacity pressure; per-user
|
|
97
|
+
quota/usage pressure remains enforced and audit-visible without outbound
|
|
98
|
+
operator email.
|
|
99
|
+
For the public auth paths, also configure parent API Worker secrets
|
|
100
|
+
`CLERK_SECRET_KEY` and `CLI_GRANT_PRIVATE_JWK`, set the parent/hosted grant
|
|
101
|
+
audience to `vibecodr:vc-tools`, and set the hosted Worker
|
|
102
|
+
`VC_TOOLS_CLI_GRANT_PUBLIC_JWKS` to the matching public JWKS. Legacy HMAC grants
|
|
103
|
+
require `CLI_GRANT_LEGACY_HMAC_ENABLED="true"` and
|
|
104
|
+
`VC_TOOLS_CLI_GRANT_LEGACY_HMAC_ENABLED="true"`, are beta/internal-only, and
|
|
105
|
+
should be removed by 2026-06-30 after live ES256 smoke and migration:
|
|
106
|
+
|
|
107
|
+
```powershell
|
|
108
|
+
$env:VC_TOOLS_API_URL = "https://tools.vibecodr.space"
|
|
109
|
+
vc-tools login
|
|
110
|
+
vc-tools login --credential-file .\clerk-oauth-token.txt
|
|
111
|
+
vc-tools login --credential-file .\vc-tools-api-key.txt
|
|
112
|
+
vc-tools start --client codex
|
|
113
|
+
vc-tools auth diagnose
|
|
114
|
+
vc-tools agent connect --client codex
|
|
115
|
+
vc-tools tools list
|
|
116
|
+
vc-tools browser render https://example.com
|
|
117
|
+
vc-tools browser screenshot https://example.com --format png
|
|
118
|
+
vc-tools browser read https://example.com
|
|
119
|
+
vc-tools browser pdf https://example.com
|
|
120
|
+
vc-tools browser crawl https://example.com/docs --max-pages 5 --max-depth 1
|
|
121
|
+
vc-tools browser ask https://example.com --timeout-ms 1200000 --idle-timeout-ms 600000 --instructions "Inspect the page and save a concise snapshot."
|
|
122
|
+
vc-tools computer run "node --version"
|
|
123
|
+
vc-tools usage
|
|
124
|
+
vc-tools grants list
|
|
125
|
+
vc-tools retention show
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Expected hosted guarantees:
|
|
129
|
+
|
|
130
|
+
- Auth secrets are configured as Worker secrets, not committed config.
|
|
131
|
+
- Public human login uses `https://api.vibecodr.space/auth/vc-tools/device/*`;
|
|
132
|
+
the verification URI opens `/settings/vc-tools/approve?vc_tools_code=...`,
|
|
133
|
+
the browser approval response does not contain the grant, and the private
|
|
134
|
+
device code is not printed or persisted.
|
|
135
|
+
- Public automation login accepts generic credential files/stdin, identifies
|
|
136
|
+
Clerk OAuth tokens or scoped Clerk API keys, and exchanges them through
|
|
137
|
+
`https://api.vibecodr.space/auth/cli/exchange`; explicit login paths store
|
|
138
|
+
the durable local credential so short-lived vc-tools grants can refresh.
|
|
139
|
+
- 2026-05-15 live OAuth proof: Clerk PKCE from the production
|
|
140
|
+
`/agent/vibe` metadata completed through the in-app browser, and
|
|
141
|
+
`scripts/smoke-vc-tools-oauth-token.mjs` exchanged the returned Clerk access
|
|
142
|
+
token over stdin. Run `codex-oauth-20260515230549-tgn17r` passed
|
|
143
|
+
`login-oauth-token`, `whoami-oauth-token`, and `usage-oauth-token` with
|
|
144
|
+
`authMode=oauth`, `grantProfile=vc_tools`, scopes
|
|
145
|
+
`["vc-tools:use","vc-tools:*"]`, plan `Pro`, `providerMode=live`,
|
|
146
|
+
`secretPrinted=false`, and temporary config cleanup confirmed.
|
|
147
|
+
- Vibecodr CLI grants include the `vc-tools:use` scope, the requested tool
|
|
148
|
+
scope such as `vc-tools:browser.render_url` or `vc-tools:*`, current plan,
|
|
149
|
+
subject, `grant_profile`, `kid`, `iat`, `nbf`, `exp`, `jti`, and
|
|
150
|
+
`vibecodr:vc-tools` audience; static-token fallback is reserved for
|
|
151
|
+
controlled deployments.
|
|
152
|
+
- D1 migrations `0001_live_schema.sql`, `0002_actor_scope.sql`,
|
|
153
|
+
`0003_quota_reservations.sql`, and
|
|
154
|
+
`0004_sandbox_quota_reservations.sql`, and
|
|
155
|
+
`0005_operator_alert_dedupe.sql`, and
|
|
156
|
+
`0006_scheduled_qa.sql`, and `0007_job_queue_metadata.sql` are applied.
|
|
157
|
+
- Browser/Sandbox calls are quota checked by the API before cost-bearing
|
|
158
|
+
Cloudflare work.
|
|
159
|
+
- Operator kill switches must be known before launch: setting
|
|
160
|
+
`VC_TOOLS_PAUSE_COST_BEARING_JOBS=true` pauses all Browser/Sandbox work,
|
|
161
|
+
`VC_TOOLS_DISABLE_BROWSER_RUN=true` pauses Browser Run Quick Actions and
|
|
162
|
+
crawl, `VC_TOOLS_DISABLE_BROWSER_SESSIONS=true` pauses paid
|
|
163
|
+
`browser.agent_task`, and `VC_TOOLS_DISABLE_SANDBOX=true` pauses Sandbox.
|
|
164
|
+
Each pause returns `503 ops.cost_bearing_paused`, writes
|
|
165
|
+
`tools.cost_bearing_paused`, and avoids D1 job insertion and Queue/Workflow
|
|
166
|
+
dispatch.
|
|
167
|
+
- Crossing hosted, Browser Run, or Sandbox account-wide 70%, 85%, or 95%
|
|
168
|
+
pressure emits a sanitized `E-VIBECODR-VC-TOOLS-SOFT-CAP` operator alert.
|
|
169
|
+
User quota/usage thresholds do not emit operator emails. Alerts flow through
|
|
170
|
+
internal-api email/ntfy fanout; optional
|
|
171
|
+
`VC_TOOLS_OPERATOR_ALERT_WEBHOOK_URLS` and `VC_TOOLS_OPERATOR_NTFY_TOPIC`
|
|
172
|
+
secrets are additive fallback channels. D1 dedupe suppresses repeats in the
|
|
173
|
+
same reset window, and missing notifier bindings are audit-visible.
|
|
174
|
+
- Queue and DLQ backlog are checked by the scheduled Worker via
|
|
175
|
+
`JOB_QUEUE.metrics()` and `JOB_DLQ.metrics()` and emit sanitized
|
|
176
|
+
account-scoped `queue.backlog_messages` / `queue.dlq_messages` operator
|
|
177
|
+
alerts. Tune `VC_TOOLS_QUEUE_BACKLOG_SOFT_CAP`,
|
|
178
|
+
`VC_TOOLS_QUEUE_BACKLOG_HARD_CAP`, `VC_TOOLS_DLQ_MESSAGES_SOFT_CAP`, and
|
|
179
|
+
`VC_TOOLS_DLQ_MESSAGES_HARD_CAP` only as platform-level thresholds; do not
|
|
180
|
+
fan out per-user quota/usage alerts.
|
|
181
|
+
- Account-wide active artifact storage is checked by summing active,
|
|
182
|
+
non-expired artifact bytes in D1 during the scheduled Worker pass and emits a
|
|
183
|
+
sanitized account-scoped `artifact.storage_gb` operator alert. Tune
|
|
184
|
+
`VC_TOOLS_ARTIFACT_STORAGE_ACCOUNT_SOFT_GB` and
|
|
185
|
+
`VC_TOOLS_ARTIFACT_STORAGE_ACCOUNT_HARD_GB` as platform-level thresholds,
|
|
186
|
+
separate from the customer plan allotment SSOT.
|
|
187
|
+
- Expired-artifact cleanup failures emit the account-scoped
|
|
188
|
+
`E-VIBECODR-VC-TOOLS-RETENTION-CLEANUP-FAILED` /
|
|
189
|
+
`retention.cleanup_failed` operator alert. Keep this code in the parent
|
|
190
|
+
internal-api `ALERT_CODES` allowlist alongside
|
|
191
|
+
`E-VIBECODR-VC-TOOLS-SOFT-CAP`; internal-api filters all user-scoped
|
|
192
|
+
`source=vc-tools` payloads before email/ntfy fanout.
|
|
193
|
+
- Browser Run and Sandbox execution failure/timeout rates are checked from
|
|
194
|
+
recent terminal job rows during the scheduled Worker pass and emit the
|
|
195
|
+
account-scoped `E-VIBECODR-VC-TOOLS-EXECUTION-HEALTH-DEGRADED` alert with
|
|
196
|
+
`browser.failure_rate`, `browser.timeout_rate`, `sandbox.failure_rate`, or
|
|
197
|
+
`sandbox.timeout_rate`. Tune
|
|
198
|
+
`VC_TOOLS_EXECUTION_HEALTH_WINDOW_MINUTES`,
|
|
199
|
+
`VC_TOOLS_EXECUTION_HEALTH_MIN_TERMINAL_JOBS`,
|
|
200
|
+
`VC_TOOLS_FAILURE_RATE_ALERT_PERCENT`, and
|
|
201
|
+
`VC_TOOLS_TIMEOUT_RATE_ALERT_PERCENT` as platform-level thresholds.
|
|
202
|
+
- Unexpected hosted Worker HTTP 500s emit the account-scoped
|
|
203
|
+
`E-VIBECODR-VC-TOOLS-HOSTED-WORKER-5XX` /
|
|
204
|
+
`hosted.worker_5xx` operator alert through the same fanout path. Keep this
|
|
205
|
+
code in parent internal-api `ALERT_CODES`; payloads must stay sanitized to
|
|
206
|
+
method, path pattern, status, and redacted error text only.
|
|
207
|
+
- Hosted API/MCP auth failures write anonymous `auth.failed` audit rows. The
|
|
208
|
+
scheduled Worker aggregates them and emits the account-scoped
|
|
209
|
+
`E-VIBECODR-VC-TOOLS-AUTH-FAILURE-ANOMALY` /
|
|
210
|
+
`auth.failure_anomaly` operator alert when
|
|
211
|
+
`VC_TOOLS_AUTH_FAILURE_ALERT_THRESHOLD` is crossed inside
|
|
212
|
+
`VC_TOOLS_AUTH_FAILURE_WINDOW_MINUTES`. Keep this code in parent internal-api
|
|
213
|
+
`ALERT_CODES`; payloads must stay token/query/body/actor-free.
|
|
214
|
+
- Cloudflare spend anomaly checks are internal account-level early warnings,
|
|
215
|
+
not user notifications and not invoice-backed billing truth. The scheduled
|
|
216
|
+
Worker estimates current-month raw cost from vc-tools COGS meters and
|
|
217
|
+
env-configured assumptions, then emits the account-scoped
|
|
218
|
+
`E-VIBECODR-VC-TOOLS-CLOUDFLARE-SPEND-ANOMALY` /
|
|
219
|
+
`cloudflare.estimated_spend_usd` alert when
|
|
220
|
+
`VC_TOOLS_CLOUDFLARE_SPEND_SOFT_USD` is crossed. Keep this code in parent
|
|
221
|
+
internal-api `ALERT_CODES`, tune
|
|
222
|
+
`VC_TOOLS_CLOUDFLARE_SPEND_SOFT_USD` and
|
|
223
|
+
`VC_TOOLS_CLOUDFLARE_SPEND_HARD_USD` only as platform thresholds, and compare
|
|
224
|
+
any alert with Cloudflare Billable Usage / Budget Alerts before raising
|
|
225
|
+
capacity or changing pricing.
|
|
226
|
+
- Unsafe URL and quota denials write analytics-only D1 audit metrics as
|
|
227
|
+
`tools.denied_unsafe_url` and `tools.denied_quota`. These are intentionally
|
|
228
|
+
per-actor COGS/ops signals and must not be promoted into email/ntfy fanout.
|
|
229
|
+
- `/dashboard/cogs` renders internal-only cost pressure by actor, plan, surface,
|
|
230
|
+
warning threshold, and env-configured cost assumptions.
|
|
231
|
+
- Jobs, artifacts, usage, retention, and audit rows are scoped to the
|
|
232
|
+
authenticated actor.
|
|
233
|
+
- All tool calls are logged by the hosted service without secrets before
|
|
234
|
+
Queue/Workflow dispatch.
|
|
235
|
+
- Stateless browser jobs complete through Browser Run Quick Actions and produce
|
|
236
|
+
R2 artifacts with metered browser time; paid browser agent jobs complete
|
|
237
|
+
through Workflow-owned Browser Sessions with closure metadata.
|
|
238
|
+
- 2026-05-17 Workflow migration smoke: deployed `vc-tools-api`
|
|
239
|
+
`aeeaab85-93ab-4219-acf7-fffbe2be834e` at 100%, then completed synthetic
|
|
240
|
+
Creator `browser.agent_task`
|
|
241
|
+
`job_0e8b0cc2-9a3c-4791-8e77-ce0da1191a3c` with
|
|
242
|
+
`queue_delay_seconds=0`, `reserved_browser_seconds=120`, D1 audit event
|
|
243
|
+
`tools.workflow_started`, and R2 artifact
|
|
244
|
+
`art_466de507-1432-41eb-9253-c9f79aac8148` downloaded through
|
|
245
|
+
`vc-tools proof save`.
|
|
246
|
+
- Scheduled QA create/list/update/delete works for a paid actor; explicit
|
|
247
|
+
`--run-now` create/resume enqueues immediately, and due configs are enqueued
|
|
248
|
+
by the Worker cron into the same D1 jobs and Queue path as manual Browser
|
|
249
|
+
Quick Actions, with run/readback evidence and no cookies, credentials, or
|
|
250
|
+
private targets accepted. Monthly cap denial leaves `lastJobId=null` and a
|
|
251
|
+
skipped run row with `quota.scheduled_qa_monthly_runs_exceeded`. Natural
|
|
252
|
+
cron-tick readback should be captured at a real deployed trigger time because
|
|
253
|
+
Cloudflare's fire-now cron route is local Wrangler-dev-only.
|
|
254
|
+
- Creator browser agent tasks complete through the `BROWSER` Browser Session
|
|
255
|
+
binding at up to 20 minutes; Pro browser agent tasks complete through the
|
|
256
|
+
same binding at up to 1 hour. Both close in `finally`, record closure
|
|
257
|
+
metadata/audit, and produce R2 artifacts.
|
|
258
|
+
- Browser crawl jobs complete through Browser Run `/crawl`, produce R2 crawl
|
|
259
|
+
artifacts, and write crawl-page usage.
|
|
260
|
+
- Browser jobs reject unsafe initial URLs, DNS records without A/AAAA answers,
|
|
261
|
+
unsafe redirects/subrequests, and unsafe final URLs.
|
|
262
|
+
- Creator sandbox jobs complete through Sandbox SDK `standard-1`; Pro sandbox
|
|
263
|
+
jobs complete through the `ProSandbox` `standard-2` lane; Creator is capped
|
|
264
|
+
at 10 minutes, Pro at 30 minutes, both paid plans cap active sandbox tasks at
|
|
265
|
+
2 per user, and both produce R2 artifacts.
|
|
266
|
+
- Queue failures are bounded by the `vc-tools-jobs` consumer config:
|
|
267
|
+
`max_batch_size=1`, `max_retries=3`, and
|
|
268
|
+
`dead_letter_queue="vc-tools-jobs-dlq"`. A failed job message may rethrow only
|
|
269
|
+
inside that retry window so Cloudflare can move it to the DLQ; retry
|
|
270
|
+
deliveries of an already-failed job must not re-run Browser, Sandbox, R2, or
|
|
271
|
+
other cost-bearing provider work.
|
|
272
|
+
- DLQ replay is operator-controlled, not automatic. Before replaying a message
|
|
273
|
+
from `vc-tools-jobs-dlq`, fix the root cause, inspect and redact the message
|
|
274
|
+
body, correlate the job id and actor id against D1 `jobs` and `audit_events`,
|
|
275
|
+
confirm the payload is still a valid `ToolJobMessage`, and re-send only the
|
|
276
|
+
intended message body into `vc-tools-jobs` with a fresh audit note. Do not
|
|
277
|
+
attach a broad automatic DLQ consumer or replay unknown payloads.
|
|
278
|
+
- `/v1/usage` reflects browser and sandbox job usage after the smoke.
|
|
279
|
+
- Sandbox network remains disabled unless a grant and explicit request allow it.
|
|
280
|
+
- Browser recordings remain off by default.
|
|
281
|
+
- Authenticated browsing is not available to Creator or ordinary users by default.
|
|
282
|
+
|
|
283
|
+
## Publish Readiness
|
|
284
|
+
|
|
285
|
+
- `npm pack --dry-run` shows only intended package files.
|
|
286
|
+
- The public npm artifact contains only `dist`, `README.md`, `LICENSE`, and
|
|
287
|
+
`package.json`; repository-maintainer docs, hosted Worker source, migrations,
|
|
288
|
+
deployment config, tests, and scripts stay out of the package.
|
|
289
|
+
- Runtime `dependencies` contain only CLI-installed dependencies. Cloudflare
|
|
290
|
+
platform primitive packages stay in repository development dependencies for
|
|
291
|
+
hosted Worker verification and deployment.
|
|
292
|
+
- No token-like string appears in `dist`, docs, test fixtures, or package
|
|
293
|
+
metadata.
|
|
294
|
+
- `docs/API-CONTRACT.md` matches the hosted service route contract.
|
|
295
|
+
- `docs/VALIDATION-MATRIX.md` maps every goal-file command and safety gate to
|
|
296
|
+
implementation evidence.
|
|
297
|
+
- Release notes mention any hosted-service dependency that is degraded or paused.
|