8697 Commits
Author SHA1 Message Date
zooqueenandHanzo Dev 7500206366 LLM.md: the Help Center serves under gunicorn
Hanzo CI/CD / cicd (push) Failing after 1h3m6s
CI/CD / cicd (push) Failing after 1h3m5s
The serving note named bench serve, which the entrypoint no longer runs.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-15 16:50:17 -07:00
zooqueenandHanzo Dev 9e0fbd66ea Carry the NLTK corpora the search index reads in the image
Hanzo CI/CD / cicd (push) Waiting to run
CI/CD / cicd (push) Waiting to run
helpdesk's after_migrate hook downloads the tagger, punkt_tab and brown
corpora when they are missing from the container. The image now holds
them, so a boot runs migrate without a network download.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-15 12:55:05 -07:00
zooqueenandHanzo Dev 93d133b285 Load the telemetry plugin for signed-in sessions only
Hanzo CI/CD / cicd (push) Waiting to run
CI/CD / cicd (push) Waiting to run
Frappe refuses the telemetry switch to guests, so a guest opening the
Help Center no longer sends a request that answers 403.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-15 12:20:30 -07:00
zooqueenandHanzo Dev db583d7833 Serve Help Center with gunicorn instead of the development server
gunicorn runs frappe.app with /assets and /files served in process, two
gthread workers as frappe_docker runs it. The Werkzeug debugger and
reloader are no longer in the request path. Frappe resolves the site from
the Host header.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-15 12:11:38 -07:00
zooqueenandHanzo Dev 2decd77580 Build the image on the forge from pinned public sources
The Frappe core (hanzoai/frappe) and telephony are fetched by commit from
GitHub, and helpdesk comes from the build context, so the build needs no
credential and the image holds exactly the commit it is named for.
hanzo.yml declares the amd64 image for the shared ci workflow, which the
develop push lane now calls at its .github path; the docker-action lane and
its GitHub notice are gone.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-15 12:11:38 -07:00
zooqueen 735cc12f0a Cut a semver image and move the pin
The build ended at ghcr.io/hanzoai/helpdesk:sha-<sha7> and stopped. A sha cannot
be read, ordered, or rolled back to by a human, and nothing moved the universe
pin afterward, so every build since 1.26.6 published bytes production had no way
to reach.

The next patch now comes from the REGISTRY, not from `git tag`: what is
published is the only authority on what has been used, and the tag is proven
unused (a 404 manifest probe) before anything is pushed. After the image is
proven to resolve, the run reads UNIVERSE_PIN_TOKEN from KMS and calls
charts/app/pin.sh, which resolves the tag and digest in one registry read and
refuses a non-semver version, an unpullable image, a rollback, or a repository
the caller chose.

The service is `help` — pin.sh resolves values/*/<service>.yaml and reads
image.repository out of the file it finds. Tags here are bare x.y.z, no leading
v, so the match is anchored to keep `stable`, `main` and `sha-*` out of the
ordering.

Still one build per commit: /hanzo.yml declares no `images:` on purpose, and
bench keeps its forge credential for the Frappe core clone.
2026-08-13 23:54:38 -07:00
zooqueen 5d7054c177 Carry the Hanzo mark across the Help Center
The desk SPA's titles, marks and install icons come from this repo's own
source, so they change here: the shell title and apple title, the PWA
manifest name, the sidebar and welcome-ticket copy, the fallback logo
component, the SPA favicon and the 180/192/512 install icons.

The login page, navbar, footer and favicon are rendered by the Frappe core,
which reads those marks from Website Settings / Navbar Settings / System
Settings at run time. helpdesk/brand.py writes them and the entrypoint runs
it per site on every boot, next to the SSO setup. Each field is set to a
constant and guarded on the field existing, so a boot against a site that
already exists restores the same values instead of failing.

The marks are served from this app's own public directory
(helpdesk/public -> /assets/helpdesk), so no page reaches a third-party host
for a logo.
2026-08-13 23:19:08 -07:00
zeekay 6827018615 Give bench a credential for the forge clones
The previous commit moved both Hanzo clones to the forge on the strength
of an anonymous ls-remote that only succeeded because the machine running
it had forge credentials cached. It does not serve anonymously:

  git ls-remote --heads --tags https://git.hanzo.ai/hanzoai/frappe develop
  fatal: could not read Username for 'https://git.hanzo.ai'

So supply one. A credential helper reads the token from the BuildKit
mount, and the two RUNs that clone from the forge mount it; the secret
never lands in a layer. Public remotes never reach the helper, because
git only asks when the server challenges it.

The token is the run's own GITHUB_TOKEN. If that turns out to be scoped
too narrowly to read hanzoai/frappe from hanzoai/helpdesk, the fix is to
point `forge=` at an org-level forge token — the Dockerfile side does not
change.
2026-08-12 20:32:41 -07:00
zeekay 4b0a0eb003 Read the Frappe core and this app from the forge, not GitHub
Every image build died in bench init:

  git ls-remote --heads --tags https://github.com/hanzoai/frappe develop
  fatal: could not read Username for 'https://github.com'
  bench.exceptions.InvalidRemoteException: Invalid frappe path

github.com/hanzoai/frappe answers "Repository not found" to an anonymous
clone — the repo moved off that org and the build had no credentials for
it. git.hanzo.ai/hanzoai/frappe is the same fork, public, and still has
the SQLite driver the bench is built around, so point FRAPPE_REPO there.
HELPDESK_REPO gets the same treatment: it still resolves on GitHub today,
but it is the same repo being built here and the same move will take it.

The build passed GH_PAT as the BuildKit secret GIT_AUTH_TOKEN, which the
Dockerfile never mounts. With both clones on the forge nothing in the
build needs a GitHub credential, so drop it.
2026-08-12 20:07:43 -07:00
zeekayandHanzo Dev d4be5d5b0c ci: canonical pair — hanzo.yml + forge caller
github.com has no runner for hanzo-build-linux-amd64, so a caller under
.github/workflows is a gate that can never be scheduled. This is the ~7-line
caller on the plane that can (git.hanzo.ai git-runner fleet), pinned @v1.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-06 02:26:57 -07:00
zeekay f5e19b574b ci: trigger on develop, this repo's default branch
The rewritten pipeline triggered on `main`. This repo's default branch
is `develop`, so pushes never matched and the workflow could not fire —
the same class of silent no-op it was rewritten to fix.
2026-07-27 05:09:24 -07:00
zeekay ba4a9ac703 ci: build an image that can actually be built
This pipeline could not work on this fleet and had not produced an image in
weeks, while looking idle rather than broken.

  buildctl-daemonless.sh: command not found (exit 127). Jobs run in
  catthehacker/ubuntu:act-24.04 per GIT_RUNNER_LABELS; there is no buildctl
  in it. It also read secrets.GIT_CLONE_TOKEN, which exists on neither the
  repo nor the hanzoai org on git.hanzo.ai.

  The kubectl patch step failed the same way (kubectl: command not found) and
  was futile anyway: cd.hanzo.ai selfHeal restores the App CR from the pin in
  hanzoai/universe on its next poll. Rollout is a reviewed pin there, never a
  CI side effect — so the deploy step is removed, not repaired.

Replaced with the shape proven on hanzoai/playground, the only one of these
whose build job has ever gone green here: setup-buildx + login-action +
build-push-action, using GHCR_USER/GHCR_TOKEN/GH_PAT which DO exist as org
secrets. Keeps playground's imagetools verification, because build-push-action
can exit 0 before the manifest resolves.
2026-07-27 05:05:58 -07:00
zeekay f383d80480 ci: target a runner pool that exists
runs-on named hanzo-linux-amd64. No runner on git.hanzo.ai advertises that
label — the four online git-runners offer hanzo-build-linux-amd64 (plus
ubuntu-latest/22.04/24.04). A job asking for an unavailable label does not
fail; it queues forever and cancels at the 24h timeout, which reads as
'CI is slow' rather than 'CI is broken'.

Latent while the forge repo had actions disabled and the pipeline could not
fire at all; enabling it made the bug reachable, so it is fixed in the same
pass.
2026-07-27 04:49:17 -07:00
zeekay c5341c5a77 ci(build): neutralize to sync-notice — native pipeline is .hanzo/workflows/deploy.yml 2026-07-24 15:15:41 -07:00
zeekay b4d5bfc3e1 ci(deploy): add native Hanzo deploy pipeline (BuildKit → ghcr → operator) 2026-07-24 15:15:18 -07:00
zeekay 3f474066c0 hanzo_sso: custom_base_url=1 (absolute OAuth URLs) + disable email-link login
- custom_base_url=1 so Frappe prepends https://hanzo.id to authorize/token/
  userinfo (relative paths were resolving to the Frappe host, breaking OAuth).
- login_with_email_link=0 removes the native passwordless path; IAM SSO is the
  ONLY login. CR mirror -> 1.26.6.
2026-07-02 08:04:38 -07:00
zeekay 685551a1e3 deploy: pin CR mirror to 1.26.5 2026-07-02 07:48:56 -07:00
zeekayandGitHub b893b0a93b Merge pull request #1 from hanzoai/batcha/iam-sso-only-per-org
IAM-SSO-only Help Center + per-org SQLite isolation
2026-07-02 07:48:17 -07:00
zeekay 302d08f1f4 hanzo_sso: set per-site redirect_url; always harden login
- Social Login Key (Custom) requires a Redirect URL; derive it per-site from
  frappe.utils.get_url so each org's site gets its correct callback host.
- Run _harden_login in a finally block so disabling native signup applies even
  if social-login provisioning fails. CR tag 1.26.4.
2026-07-02 07:34:57 -07:00
zeekay bff786f343 helpdesk: IAM-SSO-only (fix OIDC endpoints, disable native signup) + per-org SQLite isolation
- hanzo_sso.py: correct OAuth2 URLs to hanzo.id OIDC discovery (authorize
  /v1/iam/oauth/authorize, token /v1/iam/oauth/token, userinfo
  /v1/iam/oauth/userinfo). Prior /v1/iam/login/oauth/* 404'd.
- hanzo_sso.py: disable native signup (Website Settings.disable_signup) and
  force SSO-only login (System Settings.disable_user_pass_login, v15+ guarded)
  so IAM is the ONE identity authority.
- entrypoint.sh: org == tenant -> one SQLite site (== one DB) per org, resolved
  by Host header; HANZO_ORGS provisions the set. Structural cross-tenant
  isolation.
- help.service.yaml: tag 1.26.3, wire IAM_CLIENT_SECRET, add HANZO_ORGS.
- LLM.md: corrected endpoints + multi-tenant model.
2026-07-02 07:20:02 -07:00
zeekay b17338b99d Dockerfile: default HELPDESK_BRANCH=develop (post-merge) 2026-07-02 03:25:15 -07:00
zeekay 48c9423ac8 Merge blue/hanzo-deploy: Hanzo Help Center deploy (Dockerfile, SQLite entrypoint, hanzo_sso, FTS-index fix, manifests) 2026-07-02 03:24:59 -07:00
zeekay 6564142c76 entrypoint: cp -dR not -a (avoid utime EPERM on root-owned volume mount root) 2026-07-02 03:07:59 -07:00
zeekay ad1f099e8a install: add_fts_index MariaDB-only (SQLite uses FTS5 search_sqlite backend) 2026-07-02 02:52:54 -07:00
zeekay 5f957dc46b Dockerfile: install helpdesk via git get-app (local-path parsing broken in bench) 2026-07-02 02:03:37 -07:00
zeekay c11f229cc1 Dockerfile: install cron (bench init needs /usr/bin/crontab) 2026-07-02 02:00:08 -07:00
zeekay c299313a32 Dockerfile: node 24 (frappe v16 requires node>=24) 2026-07-02 01:57:17 -07:00
zeekay d9e76afaa5 Dockerfile: add frappe C-ext build headers (mysqlclient/psycopg2/ldap/lxml) 2026-07-02 01:53:23 -07:00
zeekay 870ab1b32a Dockerfile: install wkhtmltox static .deb (apt pkg dropped in trixie) 2026-07-02 01:39:36 -07:00
zeekay 7b25c279cf Hanzo Help Center: Frappe helpdesk on Base/SQLite + IAM SSO
- Dockerfile: self-contained bench build (hanzoai/frappe SQLite core +
  telephony + helpdesk), assets snapshotted as image template
- deploy/entrypoint.sh: in-pod redis, per-org SQLite site (org==tenant),
  IAM SSO wiring, bench serve (no nginx)
- helpdesk/hanzo_sso.py: idempotent hanzo.id OAuth2 Social Login Key from env
- deploy/help.service.yaml: operator-native Service CR (hanzo.ai/v1)
- deploy/help.ingress.yaml: help.hanzo.ai ingress + help-app-db PVC
- LLM.md/CLAUDE.md: fork + deploy docs
2026-07-02 01:36:30 -07:00
RitvikSardanaandGitHub 83a8adcf5f Merge pull request #3516 from RitvikSardana/editor-upload-fn
fix: pass uploadFunction prop
2026-06-30 03:16:48 +05:30
Ritvik Sardana 08530e1ace fix: null guard check 2026-06-30 01:04:45 +05:30
Ritvik Sardana 7e33405e77 fix: null guard check 2026-06-30 01:00:26 +05:30
Ritvik Sardana f5db77a443 fix: pass uploadFunction prop 2026-06-30 00:54:34 +05:30
RitvikSardanaandGitHub f239bdaefd Merge pull request #3515 from RitvikSardana/route-by-customer
fix: add auto set customer setting
2026-06-29 18:47:06 +05:30
RitvikSardanaandGitHub 34ca00989e Merge pull request #3514 from RitvikSardana/fix/lv-design
fix: listview column resize & phone column
2026-06-29 18:41:40 +05:30
Ritvik Sardana 70cd94dbcb fix: auto set customer setting 2026-06-29 18:32:42 +05:30
Ritvik Sardana 93b695cd76 fix: listview column resize, phone column & max capping 2026-06-29 18:02:33 +05:30
RitvikSardanaandGitHub e2bd604d5d Merge pull request #3513 from RitvikSardana/fix/restore-doctype-permissions
fix: restore doctype permissions reverted in #3512
2026-06-29 15:27:05 +05:30
Ritvik Sardana 3b89e8c268 fix: query HD Ticket instead of Issue in support hour distribution
Restores the report query change from #3502 (reverted in #3512),
matching the report's ref_doctype change to HD Ticket.
2026-06-29 15:13:49 +05:30
Ritvik Sardana 2986f93530 fix: use get_list for permission-aware article category queries
Restores the knowledge base API change from #3502 (reverted in #3512):
get_list enforces user permissions where get_all bypasses them.
2026-06-29 15:13:27 +05:30
Ritvik Sardana 4302b68058 fix: restore doctype permissions reverted in #3512
Re-applies the DocType permission changes that were bundled into #3502
and lost when it was reverted (#3512):

- HD Ticket: replace 'All' with 'HD Customer' and 'HD Customer Manager'
- HD View: replace 'Guest' with 'HD Customer' and 'HD Customer Manager'
- HD Article / HD Article Category / HD Ticket Type: add 'HD Customer Manager'
- HD Ticket Template: add 'Agent Manager'

Also restores the Support Hour Distribution report export.
2026-06-29 15:10:00 +05:30
RitvikSardanaandGitHub 481ce61c7b Merge pull request #3512 from frappe/revert-3502-fix/bump-frappe-ui
Revert "fix: bump frappe UI"
2026-06-29 15:00:00 +05:30
RitvikSardanaandGitHub 11224d4e3f Revert "fix: bump frappe UI" 2026-06-29 13:30:41 +05:30
RitvikSardanaandGitHub 3bc5498bb7 Merge pull request #3502 from RitvikSardana/fix/bump-frappe-ui
fix: bump frappe UI
2026-06-28 18:22:17 +05:30
RitvikSardanaandGitHub 8e4d902a04 Merge pull request #3504 from frappe/pot_develop_2026-06-28
chore: update POT file
2026-06-28 17:31:14 +05:30
RitvikSardanaandGitHub 00eeca68d0 Merge pull request #3497 from frappe/l10n_develop
chore: sync translations from crowdin
2026-06-28 17:30:57 +05:30
frappe-pr-bot def6eb08d5 chore: update POT file 2026-06-28 11:13:20 +00:00
Ritvik Sardana 582e8cf498 chore: code cleanup 2026-06-28 14:18:25 +05:30
Ritvik Sardana 6fd54a9e79 fix: better list view 2026-06-28 14:02:26 +05:30