Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Questions and ideas
url: https://github.com/codeyogi911/morrow/discussions
url: https://github.com/codeyogi911/able/discussions
about: Ask questions and discuss ideas in Discussions rather than issues.
- name: Security vulnerability
url: https://github.com/codeyogi911/morrow/security/advisories/new
url: https://github.com/codeyogi911/able/security/advisories/new
about: Report vulnerabilities privately. Never open a public issue for security problems.
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ body:
- type: markdown
attributes:
value: |
Read docs/roadmap.md and ADR 0001 first — Morrow Desk deliberately builds deep modules behind small agent interfaces and declines speculative plug-in frameworks. Proposals that fit the architecture land much faster.
Read docs/roadmap.md and ADR 0001 first — Able Desk deliberately builds deep modules behind small agent interfaces and declines speculative plug-in frameworks. Proposals that fit the architecture land much faster.
- type: textarea
id: problem
attributes:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
- run: npm ci
- run: npm run check
env:
MORROW_PRIVATE_DENYLIST: ${{ secrets.MORROW_PRIVATE_DENYLIST }}
ABLE_PRIVATE_DENYLIST: ${{ secrets.ABLE_PRIVATE_DENYLIST }}
- name: Build deploy artifact without publishing
run: npx wrangler deploy --dry-run --config apps/desk/wrangler.jsonc --outdir apps/desk/dist/worker

Expand All @@ -39,7 +39,7 @@ jobs:
- name: Scan private identifiers across complete main history
if: github.event_name == 'push'
env:
PUBLIC_HISTORY_DENYLIST: ${{ secrets.MORROW_PRIVATE_DENYLIST }}
PUBLIC_HISTORY_DENYLIST: ${{ secrets.ABLE_PRIVATE_DENYLIST }}
run: npm run scan:history
- name: Install pinned Gitleaks
env:
Expand Down
8 changes: 6 additions & 2 deletions .github/workflows/visual-baseline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,14 @@ jobs:
cache: npm
- run: npm ci
- name: Generate Linux goldens
run: npm run test:visual --workspace @morrow/desk -- --update-snapshots
# --update-snapshots defaults to "changed", which leaves a golden in
# place whenever the rendered diff stays under maxDiffPixelRatio. A
# brand or copy change can hide there. This workflow exists to produce
# the reviewed goldens, so it always rewrites all of them.
run: npm run test:visual --workspace @able/desk -- --update-snapshots=all
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: morrow-linux-visual-baselines
name: able-linux-visual-baselines
path: apps/desk/test/visual/snapshots/linux/
if-no-files-found: error
retention-days: 7
6 changes: 3 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Morrow
# Able

## Goal

Build a trustworthy, agent-first ERP for service businesses. Morrow Desk is the first application: a single-tenant Desk + CRM foundation on Cloudflare Workers where MCP is the normal operator interface, customers use accessible approved channels, and `/ops` is a small Cloudflare Access-protected recovery surface. Grow through deep business modules with small agent interfaces—not generic CRUD, a plug-in framework, or a universal object model.
Build a trustworthy, agent-first ERP for service businesses. Able Desk is the first application: a single-tenant Desk + CRM foundation on Cloudflare Workers where MCP is the normal operator interface, customers use accessible approved channels, and `/ops` is a small Cloudflare Access-protected recovery surface. Grow through deep business modules with small agent interfaces—not generic CRUD, a plug-in framework, or a universal object model.

## Operating model

Expand All @@ -17,7 +17,7 @@ For an in-scope local change, implement it and run relevant non-destructive vali
- Keep business policy, lifecycle, state, audit, idempotency, and outbox behavior inside the owning deep module. Adapters authenticate, translate transport, and render results; cross-module work uses public interfaces.
- Follow [CONTRIBUTING.md](CONTRIBUTING.md), including its package-first, latest-compatible-stable dependency policy. Use compatible maintained packages for standard protocols and security primitives.
- For behavioral or architectural changes, cover the affected public seam and run `npm run check`. Changes to voice prompts or tool descriptions also require `npm run eval:voice`.
- Keep the public repository generic. Proving-ground deployments consume exact Morrow commits; their secrets, identifiers, content, data, and runbooks never enter this repository. Generalize discoveries upstream instead of creating a tenant fork.
- Keep the public repository generic. Proving-ground deployments consume exact Able commits; their secrets, identifiers, content, data, and runbooks never enter this repository. Generalize discoveries upstream instead of creating a tenant fork.
- Never commit secrets, real customer data, production identifiers, private tenant configuration, or raw migration exports.

## Canonical references
Expand Down
8 changes: 4 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Changelog

All notable changes to Morrow are documented in this file. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
All notable changes to Able are documented in this file. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

Expand All @@ -12,12 +12,12 @@ All notable changes to Morrow are documented in this file. The format follows [K

### Added

- Initial public Morrow source tree with Morrow Desk as the first buildable workspace.
- Initial public Able source tree with Able Desk as the first buildable workspace.
- Agent-native Desk, Communications, Directory, CRM, Operations, and controlled-improvement modules behind task-shaped MCP tools.
- Accessible support portal, knowledge search, browser assistant, email delivery, signed WhatsApp text ingress, private attachments, and a small recovery console.
- Cloudflare Workers deployment configuration for D1, R2, Workers AI, Email Service, Access, Turnstile, queues, and Durable Objects.
- Neutral test fixtures, visual regression coverage, public-readiness scanning, full-history scanning, CodeQL, and pinned secret scanning.
- Apache-2.0 license, governance, security policy, contribution guide, architecture decisions, and public roadmap.

[Unreleased]: https://github.com/codeyogi911/morrow/compare/v0.1.0...HEAD
[0.1.0]: https://github.com/codeyogi911/morrow/releases/tag/v0.1.0
[Unreleased]: https://github.com/codeyogi911/able/compare/v0.1.0...HEAD
[0.1.0]: https://github.com/codeyogi911/able/releases/tag/v0.1.0
4 changes: 2 additions & 2 deletions CONTEXT.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Morrow Desk Business Suite
# Able Desk Business Suite

Morrow Desk is an agent-operated business suite in which distinct business modules share verified identity and evidence without collapsing their work into one generic record.
Able Desk is an agent-operated business suite in which distinct business modules share verified identity and evidence without collapsing their work into one generic record.

## Language

Expand Down
8 changes: 4 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Contributing

Morrow Desk welcomes focused changes that preserve its deep-module architecture and generic public repository.
Able Desk welcomes focused changes that preserve its deep-module architecture and generic public repository.

This repository is the canonical source for product development. Private proving deployments must consume an exact commit or release rather than carry a long-lived source fork. Bring discoveries back as generic issues, neutral fixtures, and upstream changes; never copy tenant data or operational evidence into a report or test.

Expand All @@ -17,13 +17,13 @@ Adapters may parse transport and render results, but case SQL, lifecycle policy,
## Dependencies and standards

- Prefer an official or mature, maintained package for standard protocols, formats, security primitives, and platform integrations. Do not hand-roll a standard when a compatible package exists.
- Use the latest stable version compatible with Morrow Desk's supported runtime. Keep runtime, types, and CI versions aligned; prereleases require a documented reason.
- Use the latest stable version compatible with Able Desk's supported runtime. Keep runtime, types, and CI versions aligned; prereleases require a documented reason.
- Check the package registry and upstream release notes before adding or updating a dependency. Major updates require focused compatibility tests plus `npm run check`.
- Keep Morrow Desk business behavior in its own modules, while packages own wire parsing, schema validation, content negotiation, and transport compliance.
- Keep Able Desk business behavior in its own modules, while packages own wire parsing, schema validation, content negotiation, and transport compliance.
- Run `npm outdated` during dependency maintenance and resolve compatible direct-dependency drift promptly.

## Releases

Morrow follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html); until 1.0.0, minor versions may contain breaking changes and each is called out in [CHANGELOG.md](CHANGELOG.md). To cut a release: update the root and affected workspace versions, move the relevant `Unreleased` entries under a dated version heading in the changelog, run `npm run check`, commit, tag `vX.Y.Z`, and publish a GitHub release whose notes mirror the changelog entry. Changes touching the voice prompt or tool descriptions additionally require a passing `npm run eval:voice` before the release, per the pin policy in [docs/voice-demo.md](docs/voice-demo.md).
Able follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html); until 1.0.0, minor versions may contain breaking changes and each is called out in [CHANGELOG.md](CHANGELOG.md). To cut a release: update the root and affected workspace versions, move the relevant `Unreleased` entries under a dated version heading in the changelog, run `npm run check`, commit, tag `vX.Y.Z`, and publish a GitHub release whose notes mirror the changelog entry. Changes touching the voice prompt or tool descriptions additionally require a passing `npm run eval:voice` before the release, per the pin policy in [docs/voice-demo.md](docs/voice-demo.md).

By submitting a contribution, you agree it is licensed under Apache-2.0.
2 changes: 1 addition & 1 deletion GOVERNANCE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Governance

Morrow Desk is a maintainer-led project.
Able Desk is a maintainer-led project.

## Roles

Expand Down
24 changes: 12 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
# Morrow
# Able

[![CI](https://github.com/codeyogi911/morrow/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/codeyogi911/morrow/actions/workflows/ci.yml)
[![CI](https://github.com/codeyogi911/able/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/codeyogi911/able/actions/workflows/ci.yml)
[![License: Apache-2.0](https://img.shields.io/badge/License-Apache--2.0-blue.svg)](LICENSE)

Morrow is an open-source, agent-first ERP for service businesses. It is designed as a set of deep business modules that agents can operate through small, task-shaped interfaces without collapsing the business into generic CRUD.
Able is an open-source, agent-first ERP for service businesses. It is designed as a set of deep business modules that agents can operate through small, task-shaped interfaces without collapsing the business into generic CRUD.

Morrow Desk is the first application. It combines a support desk, customer directory, CRM, communications inbox, durable operations, and controlled improvement records on Cloudflare Workers. MCP is the normal operator interface; customers use an accessible support portal and approved channels; `/ops` is a small Cloudflare Access-protected recovery surface.
Able Desk is the first application. It combines a support desk, customer directory, CRM, communications inbox, durable operations, and controlled improvement records on Cloudflare Workers. MCP is the normal operator interface; customers use an accessible support portal and approved channels; `/ops` is a small Cloudflare Access-protected recovery surface.

> **Project status:** early V1. The architecture and core Desk flows are implemented and tested, but Morrow does not yet claim production readiness. A deployed Worker is not, by itself, an operational support desk.
> **Project status:** early V1. The architecture and core Desk flows are implemented and tested, but Able does not yet claim production readiness. A deployed Worker is not, by itself, an operational support desk.

[Project site](https://codeyogi911.github.io/morrow-site/) · [V1 contract](docs/product-v1.md) · [Roadmap](docs/roadmap.md) · [Architecture overview](docs/architecture-overview.md) · [Architecture reference](docs/architecture.md)
[Project site](https://codeyogi911.github.io/able-site/) · [V1 contract](docs/product-v1.md) · [Roadmap](docs/roadmap.md) · [Architecture overview](docs/architecture-overview.md) · [Architecture reference](docs/architecture.md)

![Morrow Desk architecture overview](docs/assets/architecture-overview.svg)
![Able Desk architecture overview](docs/assets/architecture-overview.svg)

## Why agent-first

The normal Desk loop is intentionally small:

1. `morrow_case_next` returns a complete decision workspace.
2. `morrow_case_reply` commits a reply against its exact opaque revision.
1. `able_case_next` returns a complete decision workspace.
2. `able_case_reply` commits a reply against its exact opaque revision.

The module—not the agent or transport adapter—owns lifecycle policy, authorization, audit evidence, idempotency, delivery intent, and concurrency checks. MCP, the portal, email, WhatsApp, and `/ops` authenticate, translate, and render.

Expand All @@ -39,7 +39,7 @@ The exact scope and exclusions are binding in [docs/product-v1.md](docs/product-
## Repository structure

```text
morrow/
able/
├── apps/
│ └── desk/ # Buildable Desk Worker, migrations, tests, assets, and configs
├── packages/ # Future reusable modules, extracted only behind proven interfaces
Expand Down Expand Up @@ -82,6 +82,6 @@ See [docs/development.md](docs/development.md) for the full workflow and [docs/d

## Community

Questions belong in [Discussions](https://github.com/codeyogi911/morrow/discussions); bugs and proposals belong in [issues](https://github.com/codeyogi911/morrow/issues/new/choose). See [CONTRIBUTING.md](CONTRIBUTING.md), [GOVERNANCE.md](GOVERNANCE.md), [SECURITY.md](SECURITY.md), and [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md).
Questions belong in [Discussions](https://github.com/codeyogi911/able/discussions); bugs and proposals belong in [issues](https://github.com/codeyogi911/able/issues/new/choose). See [CONTRIBUTING.md](CONTRIBUTING.md), [GOVERNANCE.md](GOVERNANCE.md), [SECURITY.md](SECURITY.md), and [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md).

Morrow is licensed under [Apache-2.0](LICENSE).
Able is licensed under [Apache-2.0](LICENSE).
6 changes: 3 additions & 3 deletions SUPPORT.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Getting help

- **Questions and ideas** — open a [GitHub Discussion](https://github.com/codeyogi911/morrow/discussions). Use Discussions rather than issues when you are not yet sure something is a defect.
- **Bugs and feature requests** — open a [GitHub issue](https://github.com/codeyogi911/morrow/issues/new/choose) using the matching template.
- **Questions and ideas** — open a [GitHub Discussion](https://github.com/codeyogi911/able/discussions). Use Discussions rather than issues when you are not yet sure something is a defect.
- **Bugs and feature requests** — open a [GitHub issue](https://github.com/codeyogi911/able/issues/new/choose) using the matching template.
- **Security problems** — never open a public issue. Follow [SECURITY.md](SECURITY.md) and use GitHub's private vulnerability reporting.
- **Deployment help** — read [docs/deployment.md](docs/deployment.md) first; a deploy is not an operational desk until every gated step there is complete.

When reporting anything, strip customer names, hostnames, resource identifiers, and secrets. Morrow Desk's repository is deliberately tenant-neutral, and reports must be too.
When reporting anything, strip customer names, hostnames, resource identifiers, and secrets. Able Desk's repository is deliberately tenant-neutral, and reports must be too.
4 changes: 2 additions & 2 deletions apps/desk/.dev.vars.example
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Deploy-button and local-development prompts. Replace every value privately.
MORROW_OPERATOR_HOSTNAME=operators.example.test
ABLE_OPERATOR_HOSTNAME=operators.example.test
CF_ACCESS_AUD=replace-with-access-audience
CF_ACCESS_TEAM_DOMAIN=your-team.cloudflareaccess.com
MORROW_OWNER_EMAIL=owner@example.com
ABLE_OWNER_EMAIL=owner@example.com
TURNSTILE_SECRET_KEY=replace-with-turnstile-secret
TURNSTILE_SITE_KEY=replace-with-turnstile-site-key
CUSTOMER_CAPABILITY_SECRET=replace-with-at-least-32-random-characters
4 changes: 2 additions & 2 deletions apps/desk/migrations/0001_v1_baseline.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ PRAGMA foreign_keys = ON;

CREATE TABLE workspace_settings (
id INTEGER PRIMARY KEY CHECK (id = 1),
display_name TEXT NOT NULL DEFAULT 'Morrow Desk',
display_name TEXT NOT NULL DEFAULT 'Able Desk',
portal_title TEXT NOT NULL DEFAULT 'How can we help?',
logo_url TEXT,
home_url TEXT,
support_email TEXT,
outbound_sender TEXT,
case_prefix TEXT NOT NULL DEFAULT 'MD' CHECK (length(case_prefix) BETWEEN 2 AND 8),
case_prefix TEXT NOT NULL DEFAULT 'AD' CHECK (length(case_prefix) BETWEEN 2 AND 8),
locale TEXT NOT NULL DEFAULT 'en',
timezone TEXT NOT NULL DEFAULT 'UTC',
support_hours_json TEXT NOT NULL DEFAULT '{}',
Expand Down
12 changes: 6 additions & 6 deletions apps/desk/package.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
{
"name": "@morrow/desk",
"name": "@able/desk",
"version": "0.1.0",
"private": true,
"description": "Morrow Desk: an agent-native support desk and CRM on Cloudflare Workers.",
"description": "Able Desk: an agent-native support desk and CRM on Cloudflare Workers.",
"license": "Apache-2.0",
"type": "module",
"engines": {
"node": "^22.22.0 || ^24.0.0"
},
"cloudflare": {
"bindings": {
"MORROW_OPERATOR_HOSTNAME": {
"ABLE_OPERATOR_HOSTNAME": {
"description": "Bare dedicated operator hostname carrying both /mcp and /ops behind one domain-wide Cloudflare Access application."
},
"CF_ACCESS_AUD": {
Expand All @@ -19,7 +19,7 @@
"CF_ACCESS_TEAM_DOMAIN": {
"description": "Your Access issuer host, such as your-team.cloudflareaccess.com."
},
"MORROW_OWNER_EMAIL": {
"ABLE_OWNER_EMAIL": {
"description": "The first Access-approved operator who should become the workspace administrator."
},
"TURNSTILE_SECRET_KEY": {
Expand Down Expand Up @@ -98,10 +98,10 @@
},
"repository": {
"type": "git",
"url": "git+https://github.com/codeyogi911/morrow.git",
"url": "git+https://github.com/codeyogi911/able.git",
"directory": "apps/desk"
},
"homepage": "https://github.com/codeyogi911/morrow/tree/main/apps/desk",
"homepage": "https://github.com/codeyogi911/able/tree/main/apps/desk",
"keywords": [
"support-desk",
"helpdesk",
Expand Down
4 changes: 2 additions & 2 deletions apps/desk/playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ const viewports = [
{ name: 'tablet-768', width: 768, height: 1024 },
{ name: 'desktop-1440', width: 1440, height: 1000 },
]
const visualPort = Number.parseInt(process.env.MORROW_VISUAL_PORT ?? '8791', 10)
if (!Number.isInteger(visualPort) || visualPort < 1024 || visualPort > 65535) throw new Error('MORROW_VISUAL_PORT must be an unprivileged TCP port')
const visualPort = Number.parseInt(process.env.ABLE_VISUAL_PORT ?? '8791', 10)
if (!Number.isInteger(visualPort) || visualPort < 1024 || visualPort > 65535) throw new Error('ABLE_VISUAL_PORT must be an unprivileged TCP port')
const baseURL = `http://127.0.0.1:${visualPort}`

export default defineConfig({
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion apps/desk/public/voice-demo.js

Large diffs are not rendered by default.

Loading
Loading