{"_id":"@danmestas/orch-executor-cf-worker","name":"@danmestas/orch-executor-cf-worker","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@danmestas/orch-executor-cf-worker","version":"0.1.0","description":"orch executor backend: provisions Cloudflare Worker open-agent bridges from a SpawnSpec YAML on stdin and emits a WorkerHandle YAML on stdout. Implements orch proposal 0002 / executor-protocol.","license":"Apache-2.0","type":"module","repository":{"type":"git","url":"git+https://github.com/danmestas/orch-executor-cf-worker.git"},"bugs":"https://github.com/danmestas/orch-executor-cf-worker/issues","homepage":"https://github.com/danmestas/orch-executor-cf-worker#readme","bin":{"orch-executor-cf-worker":"bin/orch-executor-cf-worker"},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","test":"vitest run","test:watch":"vitest","version-probe":"node dist/cli.js --version","prepublishOnly":"npm run build"},"dependencies":{"ajv":"8.17.1","ajv-formats":"3.0.1","yaml":"2.6.1"},"devDependencies":{"@types/node":"20.16.10","typescript":"5.6.3","vitest":"2.1.9"},"engines":{"node":">=18"},"_id":"@danmestas/orch-executor-cf-worker@0.1.0","_integrity":"sha512-7i/YetezpZ+RD3OU1m4brjORvENBEWaDEmSkSwyhlBhCGtYWo46f3hbLXJvkOkE6c1mofv5nggWfXQpXtbYc4g==","_nodeVersion":"24.3.0","_npmVersion":"10.8.3","shasum":"fbf9d24e1ea6819b2e4d8774ddbefe2a87d8a87b","dist":{"integrity":"sha512-7i/YetezpZ+RD3OU1m4brjORvENBEWaDEmSkSwyhlBhCGtYWo46f3hbLXJvkOkE6c1mofv5nggWfXQpXtbYc4g==","shasum":"fbf9d24e1ea6819b2e4d8774ddbefe2a87d8a87b","tarball":"https://registry.npmjs.org/@danmestas/orch-executor-cf-worker/-/orch-executor-cf-worker-0.1.0.tgz","fileCount":14,"unpackedSize":57832,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD744qwmnfX/UArUtvnWTlkxChTCZuHPbp6WIwI9ZaR5QIhAIXpvOPANg6tRFCiIFvpXC49DroCjjsFj8WExGvIW1qn"}]},"_npmUser":{"name":"danmestas","email":"daniel.mestas@craftdesign.group"},"directories":{},"maintainers":[{"name":"danmestas","email":"daniel.mestas@craftdesign.group"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/orch-executor-cf-worker_0.1.0_1779641150138_0.4289039913717436"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-24T16:45:49.869Z","0.1.0":"2026-05-24T16:45:50.300Z","modified":"2026-05-24T16:45:50.557Z"},"maintainers":[{"name":"danmestas","email":"daniel.mestas@craftdesign.group"}],"description":"orch executor backend: provisions Cloudflare Worker open-agent bridges from a SpawnSpec YAML on stdin and emits a WorkerHandle YAML on stdout. Implements orch proposal 0002 / executor-protocol.","homepage":"https://github.com/danmestas/orch-executor-cf-worker#readme","repository":{"type":"git","url":"git+https://github.com/danmestas/orch-executor-cf-worker.git"},"bugs":"https://github.com/danmestas/orch-executor-cf-worker/issues","license":"Apache-2.0","readme":"# orch-executor-cf-worker\n\nCloudflare Worker executor backend for [orch](https://github.com/danmestas/orch).\nReads a [SpawnSpec][spawn-spec] YAML on stdin, provisions a Cloudflare Worker\nrunning the open-agent NATS bridge, and emits a [WorkerHandle][worker-handle]\nYAML on stdout.\n\n[spawn-spec]: https://github.com/danmestas/orch/blob/main/docs/spawn-spec.md\n[worker-handle]: https://github.com/danmestas/orch/blob/main/dist/schema/worker-handle.v1.json\n\n## Status\n\n**Phase B — real implementation.** Wraps the open-agent Worker\n([`src/worker/index.ts`](src/worker/index.ts)) with the executor-protocol\ncontract from [orch proposal 0002][0002] / [orch proposal 0003][0003].\n\n[0002]: https://github.com/danmestas/orch/blob/main/docs/proposals/0002-typed-executor-contract.md\n[0003]: https://github.com/danmestas/orch/blob/main/docs/proposals/0003-extract-executor-backends.md\n\n## Contract\n\n```\n$ orch-executor-cf-worker\n  stdin:  SpawnSpec v1 YAML\n  stdout: WorkerHandle v1 YAML on success\n  stderr: human-readable diagnostics\n  exit:   0  success (a handle was emitted — note: a handle with\n             status=failed still exits 0 because the dispatcher\n             interprets the field)\n          64 usage error (bad args, empty stdin)\n          65 input error (invalid YAML or schema validation failure)\n          70 runtime error (provisioning aborted before a handle\n             could be assembled)\n```\n\nSchemas are pinned at v1 (committed copies in `schemas/`, generated\nfrom `orch/internal/spawnspec/types.go`). Validation runs on both the\ninput SpawnSpec and the emitted WorkerHandle.\n\n## How orch-spawn finds this binary\n\norch-spawn uses hybrid discovery (per orch#142):\n\n1. **Env override:** `ORCH_EXECUTOR_CF_WORKER_CMD` — full command path.\n2. **PATH lookup:** `orch-executor-cf-worker` on `$PATH`.\n3. **In-tree fallback:** orch's bundled `~/.local/share/orch/executors/cf-worker/spawn`\n   (only when the published binary isn't installed).\n\nInstall via npm:\n\n```bash\nnpm install -g @danmestas/orch-executor-cf-worker\norch-executor-cf-worker --version\n```\n\nThe npm postinstall step is implicit: npm wires the `bin/` entry on\n`PATH`. Discovery then resolves automatically.\n\n## Releasing\n\nReleases are driven by tag pushes to `main`.\n\n```bash\n# 1. From main with a clean tree, tag the release commit:\ngit tag v1.0.0\ngit push origin v1.0.0\n```\n\nThe push triggers\n[`.github/workflows/release.yml`](.github/workflows/release.yml), which:\n\n1. Builds + typechecks + tests against Node 20.\n2. Derives the npm version from the tag (`v1.0.0` → `1.0.0`) and rewrites\n   `package.json` in place (release-time only — never committed back).\n3. Runs `npm publish --access public` to upload\n   `@danmestas/orch-executor-cf-worker@<version>`.\n\nThe dry-run gate on `ci.yml` (`npm publish --dry-run`) catches packaging\nbreakage (missing `files`, bad `bin` path) on every PR — so a tag push\nshouldn't surprise you.\n\n**One-time secret setup** (operator):\n\n```bash\ngh secret set NPM_TOKEN --repo danmestas/orch-executor-cf-worker\n# Paste an npm automation token with publish rights to\n# @danmestas/orch-executor-cf-worker.\n```\n\n**Rehearse without publishing** via the `workflow_dispatch` trigger\n(\"Run workflow\" in the GitHub Actions UI) with `dry_run: true` — the\npublish step runs as `npm publish --dry-run` and uploads nothing.\n\n## Environment variables\n\n| Variable                              | Purpose                                                                                  | Default                          |\n| ------------------------------------- | ---------------------------------------------------------------------------------------- | -------------------------------- |\n| `CF_WORKER_URL`                       | Override the deployed Worker base URL (wins over `cf-worker.script`).                    | unset                            |\n| `CF_WORKER_HEALTHCHECK`               | Set to `0` / `false` / `off` to skip the readiness probe (handle emits `status=pending`). | enabled                          |\n| `CF_WORKER_HEALTHCHECK_TIMEOUT_MS`    | Per-attempt timeout for `GET /health`.                                                   | `5000`                           |\n| `CF_WORKER_HEALTHCHECK_RETRIES`       | Number of healthcheck attempts before giving up.                                         | `3`                              |\n| `OPEN_AGENT_OWNER`                    | Owner token used in the `agents.prompt.open-agent.<owner>.<session>` bus pattern.        | `SpawnSpec.owner` ∨ `worker`     |\n\n## SpawnSpec example\n\n```yaml\nspec_version: v1\nname: lead-engineer\nagent: claude-code\nsession: lead-engineer\nowner: dmestas\n\ncf-worker:\n  script: https://orch-cf-agent.example.workers.dev\n  abort_endpoint: /control/abort\n```\n\nWhen `cf-worker.script` is a URL, it's used as the deployed Worker base.\nWhen it's a relative path (e.g. `src/worker/index.ts`), the backend\nassumes wrangler-dev on `http://127.0.0.1:8787` and emits a stderr\ndiagnostic — set `CF_WORKER_URL` to be explicit.\n\n## WorkerHandle example\n\n```yaml\nspec_version: v1\nname: lead-engineer\nagent: claude-code\nsession: lead-engineer\ncreated_at: 2026-05-24T15:30:00.000Z\nexecutor: cf-worker\nid: https://orch-cf-agent.example.workers.dev\nbus:\n  prompt: agents.prompt.open-agent.dmestas.lead-engineer\n  status: agents.status.open-agent.dmestas.lead-engineer\n  hb: agents.hb.open-agent.dmestas.lead-engineer\n  signal: orch.signal.>.open-agent.dmestas.lead-engineer\nabort:\n  kind: http-post\n  target: https://orch-cf-agent.example.workers.dev/control/abort\nstatus: ready\n```\n\nThe bus subjects follow the open-agent / Synadia microservice convention:\n\n```\nagents.<verb>.open-agent.<owner>.<session>\n```\n\nThe abort verb is `http-post`: orch-spawn cancels the worker by POSTing\nto `abort.target`.\n\n## Deploying the Worker\n\nThe Worker source lives at `src/worker/`. To deploy:\n\n```bash\n# One-time:\nwrangler secret put NATS_WS_URL          # ws://your-hub:8080\nwrangler secret put OPENROUTER_API_KEY   # sk-or-...\n\n# Deploy:\nwrangler deploy\n\n# Verify:\ncurl https://<your-worker>.workers.dev/health\n```\n\nLocal development:\n\n```bash\nwrangler dev\n# Worker runs at http://127.0.0.1:8787\n# In another terminal:\necho \"$(cat <<'YAML'\nspec_version: v1\nname: dev-worker\nagent: claude-code\ncf-worker:\n  script: http://127.0.0.1:8787\nYAML\n)\" | CF_WORKER_URL=http://127.0.0.1:8787 orch-executor-cf-worker\n```\n\nSee `wrangler.toml` for full configuration. The Worker exposes:\n\n| Route                | Purpose                                                                  |\n| -------------------- | ------------------------------------------------------------------------ |\n| `GET /health`        | Liveness probe (used by this executor's healthcheck).                    |\n| `POST /agent/<name>` | Bootstrap an open-agent instance bound to the session token `<name>`.   |\n\nSynadia metadata advertised on the NATS bus:\n\n| Field      | Value       |\n| ---------- | ----------- |\n| `executor` | `wasm`      |\n| `location` | `edge`      |\n| `lifetime` | `ephemeral` |\n\n## Development\n\n```bash\nnpm install        # install ajv, yaml, vitest, typescript\nnpm run typecheck  # tsc --noEmit\nnpm run build      # tsc → dist/\nnpm test           # vitest run\n```\n\nThe integration test in `test/cli-integration.test.ts` exercises the\nfull SpawnSpec → WorkerHandle round-trip against a local HTTP stub\nthat simulates the deployed Worker. It does not require a Cloudflare\naccount or `wrangler dev`.\n\nFor an end-to-end check against the real worker, run `wrangler dev`\nfrom `src/worker/` and point `CF_WORKER_URL` at it manually (see\n\"Local development\" above).\n\n## Phases\n\n| Phase | What happens                                                                          | Status     |\n| ----- | ------------------------------------------------------------------------------------- | ---------- |\n| **A** | Repo scaffolded (README + MIGRATION + bin stub).                                      | done       |\n| **B** | TS sources moved from `orch/executors/wasm/cf-worker/`; CLI implements the contract.  | **this**   |\n| **C** | orch deletes `executors/wasm/cf-worker/`; bench installs this binary in Docker.       | next       |\n\n## License\n\nApache 2.0 (matches orch).\n","readmeFilename":"README.md","_rev":"1-19c400442245df647c5b0d7dcc4a701d"}