rogee
b769b9a3e4
Phase 2: AutoReplyRule integration + AgentBot Captain type
...
AutoReplyRule complete integration:
- bootstrap.go: instantiate AutoReplyRuleService + AutoReplyListener,
register listener on channel dispatcher for message.created events
- router.go: register /captain/auto_reply_rules CRUD + /evaluate routes
- auto_reply_rule_handler.go: fix c.Param(id) → c.Param(account_id),
override evalCtx.AccountID from path param
- auto_reply_rule_service.go: add JSON tags to AutoReplyEvaluationContext
for correct request body binding
- auto_reply_listener.go (new): EventListener that triggers on incoming
messages, evaluates active rules, composes reply (static/LLM/mixed),
respects DelaySeconds and OneTimeOnly flags, sends via MessageService
- migration 000048: create captain_auto_reply_rules table
AgentBot + Captain integration:
- agent_bot_listener.go: add captainConvSvc field + SetCaptainConversationService
method. In HandleEvent loop, check bot.BotType == captain and route
to CaptainConversationService.BuildConversationResponseByAccount
instead of webhook push. Extract assistant_id from bot.Config JSONB,
extract conversation_id from event data.
- bootstrap.go: inject captainConversationService into agentBotListener
CaptainConversationService improvement:
- generateConversationResponse: use assistant config for system prompt,
model name, and temperature instead of hardcoded values
Verified:
- go build ./... passes
- go vet passes on all internal packages
- go test passes (service + repository + llm, SQLite mode)
- Auto-reply CRUD: create/get/update/delete all work
- Auto-reply evaluate: correctly matches hello → should_reply=true,
correctly rejects non-matching message
- Existing routes unaffected (assistants, RAG, conversation respond)
- Migration 000048 creates captain_auto_reply_rules table successfully
2026-07-08 15:38:08 +08:00
rogee
42b8b6c7f9
Activate Captain AI features: config, RAG routes, conversation handler
...
Phase 1 of AI_FEATURE_ROADMAP.md:
1. config.yaml: Add captain configuration section (llm_provider, llm_model,
llm_api_key, llm_base_url, embedding_model, embedding_dims, max_tokens,
temperature). Secrets injected via GOCHAT_CAPTAIN_LLM_API_KEY env var.
2. RAG route registration:
- bootstrap.go: instantiate RAGService + RAGHandler, add to Handlers
- router.go: register POST /captain/rag/query + /captain/rag/index/:response_id
- rag_handler.go: fix account_id param name (was "id", route uses "account_id")
3. CaptainConversationService activation:
- Remove "_ = captainConversationService" ignore in bootstrap.go
- Create CaptainConversationHandler with BuildResponse endpoint
- Register POST /captain/conversations/:conversation_id/respond route
- Fix account_id param name in handler
Verified:
- go build ./... passes
- go vet passes on all modified packages
- go test passes (llm + service packages)
- Server starts with captain config loaded
- RAG query/index routes return proper handler responses (not 404)
- Conversation respond route returns proper skip for non-pending conversations
- Existing captain routes unaffected (assistants list still works)
2026-07-08 15:38:08 +08:00
rogee
e8d1876478
Fix sidebar missing Bots/Campaigns: add all feature flags to seed data
...
The seed data only enabled 16 of 37 feature flags used by the frontend.
Two missing flags caused sidebar navigation bugs found during QA:
- agent_bots: the '机器人' settings link was hidden (isAllowed=false)
- campaigns: the '活动' (Campaigns) parent had no accessible children,
so clicking it did nothing instead of expanding to show sub-items
Add all 37 feature flags from FEATURE_FLAGS to the smoke seed data so
every sidebar menu item is visible and navigable.
Also includes QA test report for the full-page CDP testing session.
2026-07-08 15:11:11 +08:00
rogee
10cc300f31
Fix canned_responses 500: add missing SQL migration
...
The canned_responses table was registered in autoMigrate() (app.go) but
autoMigrate() is never called on the serve path (Bootstrap -> NewDatabase
-> RunMigrations only). With no SQL migration file, the table never
existed, so POST /api/v1/accounts/:id/canned_responses failed with
'relation does not exist' -> 500.
Add migration 000049 to create the table matching the GORM model
(id, account_id, content, short_code, timestamps) with the account+
short_code partial unique index and deleted_at index.
Also include two related fixes staged in the working tree:
- router.go: register notifications.GET("") alongside GET("/") to avoid
Gin 301 trailing-slash redirect that the Vite proxy doesn't follow
- notifications/actions.js: stop the infinite loader on fetch error to
prevent IntersectionObserver re-fire loop
2026-07-08 11:43:34 +08:00
rogee
fe0881c02b
Update TestAccountDefaultValues assertion to match zh_CN default locale
...
Account.Locale gorm default was changed from 'en' to 'zh_CN' in the
locale cleanup commit (a1ae852 ), but the default-values test still
asserted 'en', causing TestAccountDefaultValues to fail. Align the
assertion with the new default.
2026-07-08 10:13:58 +08:00
rogee
486d243617
Merge fix/frontend-bugs-2026-07-08: fix Reports 500, Settings white screen, SidebarGroup exceptions
2026-07-08 10:12:14 +08:00
rogee
be38051ac5
Fix Reports 500, Settings white screen, SidebarGroup exceptions
...
ISS-01: Fix reporting_events_rollups table schema mismatch
- The init migration (000001) created columns (dimension, dimension_value,
metric_name, value, value_in_business_hours, period) that do not match
the GORM model which expects (date, dimension_type, dimension_id, metric,
count, sum_value, sum_value_business_hours)
- Add migration 000048 to drop and recreate the table with correct schema
matching the GORM model and all Go code that references it
- Fixes: GET /api/v2/accounts/:id/reports returning HTTP 500 with
'column date does not exist (SQLSTATE 42703)'
ISS-02: Fix Settings > General page white screen
- AccountId.vue: add null-safe access for currentAccount.value.id before
calling toString() — currentAccount can be {} when account data not yet
loaded in store
- BuildInfo.vue: add null-safe access for globalConfig.value.gitSha and
globalConfig.value.appVersion; guard copyGitSha with existence check;
add v-if guard on gitSha span in template
ISS-04: Fix SidebarGroup mounted hook exceptions
- SidebarGroup.vue: Object.keys(child.to.params) throws TypeError when
child.to.params is undefined; add null-safe fallback Object.keys(child.to?.params ?? {})
- This was the source of the 29 recurring JS exceptions on every Settings
page navigation
ISS-05: Fix Vue Router root path warning
- Add root route { path: '/', redirect: '/app/login' } to silence
'No match found for location with path /' warning
2026-07-08 10:02:29 +08:00
rogee
37f8c01977
Exclude .worktrees from git tracking
2026-07-08 09:57:04 +08:00
rogee
a1ae852eb2
Fix widget i18n missing locale files and clean up unused locales
...
- widget/i18n/index.js: only import en.json and zh_CN.json (the only
locale files present); remove 40+ imports for missing locale JSONs
that caused Vite compile failure and global white screen
- dashboard/i18n/index.js: remove unused locale imports for consistency
- Remove 62 unused locale JSON files from widget/i18n/locale/
- Minor: update index.html, test helpers, e2e test, languages spec
2026-07-08 09:57:00 +08:00
rogee
9c74b83560
modify
2026-07-08 09:52:19 +08:00
rogee
e61b2acf6d
Bridge channel dispatcher events to WebSocket EventPublisher for real-time delivery
2026-07-08 09:02:44 +08:00
rogee
8aeee9ebc7
Fix frontend login flow: merge v3 auth routes, fix vite proxy, SPA redirect
2026-07-07 18:57:11 +08:00
rogee
82b460fe6f
Silence vendored SCSS @import and global-builtin deprecation warnings
2026-07-07 18:12:43 +08:00
rogee
f5fa6d0878
Bind Vite dev server to 0.0.0.0 for LAN access
2026-07-07 18:03:22 +08:00
rogee
8364048053
ok
2026-07-07 17:21:41 +08:00
rogee
4d167c3331
Fix hardcoded Rails direct_upload URLs in Vue upload components
...
Replace '/rails/active_storage/direct_uploads' with GoChat endpoint
'/api/v1/widget/direct_uploads' in two dashboard upload components:
- ActionButtons.vue (new conversation attachment upload)
- ReplyBottomPanel.vue (conversation reply attachment upload)
These data attributes are consumed by vue-upload-component; the actual
upload logic in useFileUpload/fileUploadMixin already used the correct
GoChat endpoints. Spotted by decoupling audit report.
2026-07-07 15:41:25 +08:00
rogee
1535e6cd55
Decouple frontend from Rails, establish pnpm workspace dev workflow
...
Strip the Chatwoot frontend down to a standalone Vite + Vue 3 SPA that talks
directly to the GoChat Go backend — no Ruby/Rails required.
Deleted from frontend/ (all Rails-only):
- Ruby: Gemfile, Gemfile.lock, config.ru, Capfile, Rakefile, bin/ (binstubs),
config/ (application/boot/environment/routes/initializers/environments/locales),
app/helpers/ (*.rb), app/views/ (ERB/jbuilder), app/assets/ (administrate scss)
- Enterprise overlay (enterprise/ — pure Ruby/jbuilder, zero JS)
- Infra: Procfile*, docker-compose*, docker/, deployment/, swagger/, .circleci/,
.devcontainer/, .qlty/, .codegraph/, .windsurf/, .github/, .vscode/, .husky/
- Lint/config: .rubocop.yml, .scss-lint.yml, .rspec, rubocop/, .bundler-audit.yml,
.annotaterb.yml, .all-contributorsrc, crowdin.yml, histoire.config.ts, etc.
- Stale frontend/pnpm-lock.yaml (replaced by root workspace lockfile)
Kept (frontend build essentials):
- app/javascript/ (all Vue SPA source — dashboard/widget/sdk/portal/superadmin/survey/v3)
- package.json, vite.config.ts, tailwind.config.js, postcss.config.js
- theme/, vitest.setup.js, .prettierrc
Key decoupling changes:
- vite.config.ts: removed vite-plugin-ruby, added explicit rollupOptions.input
for all 7 entrypoints + dev-server proxy (/api,/platform,/cable,/health → GoChat)
- index.html: created static SPA entry that injects window.chatwootConfig /
window.globalConfig (previously done by Rails ERB vueapp.html.erb)
- package.json: renamed @gochat/frontend, removed vite-plugin-ruby/histoire/husky,
scripts now use plain vite dev/build
- tailwind.config.js: removed enterprise ERB content paths
- markdownEmbeds.js: relocated markdown_embeds.yml into app/javascript/dashboard/config/
Root pnpm workspace:
- package.json: dev:backend (air), dev:frontend (vite), dev (concurrently)
- pnpm-workspace.yaml: frontend as workspace package
- .gitignore: node_modules/, frontend/dist/, frontend build artifacts
Verified: pnpm install + vite build succeeds (4446 modules, all 7 entrypoints
produce JS+CSS chunks in dist/).
2026-07-07 15:37:24 +08:00
rogee
321c61aaae
Vendor Chatwoot Vue 3 frontend into frontend/
...
Copy the Chatwoot (v4.14.0) frontend runnable subset into frontend/ for
customization:
- app/javascript/ (Vue SPA: dashboard, widget, sdk, portal, superadmin)
- app/views/ (ERB templates for vite-plugin-ruby entrypoint resolution)
- app/helpers/, app/assets/ (Rails view helpers, static assets)
- enterprise/ (Enterprise edition frontend overlay)
- config/vite.json, vite.config.ts, bin/vite (Vite-Rails toolchain)
- package.json, pnpm-lock.yaml, tailwind/postcss/eslint configs
- Gemfile, Gemfile.lock (vite_rails gem for bin/vite binstub)
Excluded Rails backend: controllers, models, services, jobs, mailers,
policies, db, lib, spec, public, node_modules.
Update references to the new frontend location:
- .gitignore: exclude frontend build artifacts (node_modules, tmp, packs),
keep frontend/bin/ and frontend/vendor/ via negation
- backend/scripts/parity_frontend_smoke.sh: CHATWOOT_DIR default
reference/chatwoot -> ../frontend
- backend/scripts/parity_frontend_browser_smoke.mjs: same default update
- AGENTS.md: add frontend section with Rails/Vite coupling notes
- README: architecture tree includes frontend/
2026-07-07 14:56:01 +08:00
rogee
aeddedf2a3
Reorganize repo: backend/, deploy/, docs/ layout + AGENTS.md
...
Restructure the monorepo into clear top-level directories:
- backend/: Go module root (cmd, internal, pkg, configs, migrations,
docs/swagger, scripts, tests, go.mod, Makefile, .air.toml)
- deploy/: Docker (Dockerfile, docker-compose*), quickstart, fluentd
- docs/: project documentation + reports/ (moved from repo root)
- AGENTS.md: new AI coding-agent guide at repo root
Update all references to the new layout:
- Dockerfile: COPY backend/go.mod, COPY backend/ (context = repo root)
- docker-compose files: context ../.., dockerfile deploy/docker/Dockerfile,
env_file ../../.env, volume mounts ../../backend:/app
- deploy/quickstart/compose.yaml: dockerfile deploy/docker/Dockerfile
- CI: working-directory: backend for go commands, file deploy/docker/Dockerfile,
coverage path backend/coverage.out, health_check backend/scripts/
- backend/Makefile: docker target uses -f ../deploy/docker/Dockerfile ../
- README: architecture tree, quickstart, config paths updated
Move root stray scripts (rename_models.*, run_m11_tests.sh, verify_build.sh,
gorm_bool_main.go) to backend/scripts/legacy/. All moves via git mv to
preserve history. Build, vet, SQLite tests, and docker compose config verified.
2026-07-07 14:44:12 +08:00
rogee
d4ef996f49
Add Docker Compose quickstart
2026-06-15 14:34:17 +08:00
rogee
d884fdda0a
Align GoChat with Chatwoot frontend contracts
2026-06-13 22:13:32 +08:00
rogee
71abf58636
docs: update Chatwoot parity alignment review
2026-06-11 09:57:09 +08:00
rogee
2bb54b21a5
1:1
2026-06-10 07:24:13 +08:00
rogee
ac7f351308
update
2026-06-09 18:03:16 +08:00
rogee
f45fbfd5f0
feat(captain): secure custom tool auth config
2026-06-07 16:32:13 +08:00
rogee
8f9adecd04
feat(captain): validate custom tools
2026-06-07 16:20:39 +08:00
rogee
dd7bcf4118
feat(captain): align custom tool limits
2026-06-07 16:06:19 +08:00
rogee
0d8de3be0b
feat(captain): gate custom tools
2026-06-07 15:50:23 +08:00
rogee
0aff792b40
feat(search): index csat surveys
2026-06-07 15:36:51 +08:00
rogee
8eabadc3fc
feat(search): index provider webhooks
2026-06-07 15:23:29 +08:00
rogee
28e7205410
feat(search): index message delivery
2026-06-07 15:11:42 +08:00
rogee
730481c99d
feat(search): index automation actions
2026-06-07 15:01:49 +08:00
rogee
140b17ed72
feat(search): index conversation maintenance
2026-06-07 14:40:13 +08:00
rogee
4ba1e6e847
feat(search): index conversation bulk actions
2026-06-07 14:29:39 +08:00
rogee
af624f7728
feat(search): index contact labels
2026-06-07 14:19:38 +08:00
rogee
74249d5bf5
feat(crm): queue contact bulk actions
2026-06-07 14:03:48 +08:00
rogee
64f36ad642
feat(enterprise): align account limits API
2026-06-07 13:46:17 +08:00
rogee
c28eb010c6
fix(webhooks): replace parity stubs
2026-06-07 13:18:25 +08:00
rogee
7ea4bf9362
fix(routes): align whatsapp call ids
2026-06-07 13:04:27 +08:00
rogee
5062acec61
fix(routes): align dashboard app ids
2026-06-07 12:39:23 +08:00
rogee
27f927327d
feat(conversations): align destroy job
2026-06-07 12:26:48 +08:00
rogee
bec65a86e4
feat(conversations): align transcript delivery
2026-06-07 12:08:53 +08:00
rogee
83878eb606
feat(conversations): align typing events
2026-06-07 11:43:59 +08:00
rogee
5ae2d7fec9
feat(conversations): align last seen reads
2026-06-07 11:33:08 +08:00
rogee
6b6289f896
feat(conversations): align mute semantics
2026-06-07 11:20:12 +08:00
rogee
148201905a
feat(conversations): align toggle priority fallback
2026-06-07 11:04:40 +08:00
rogee
e6c9660659
feat(conversations): align toggle status fallback
2026-06-07 10:56:29 +08:00
rogee
f7515b111d
feat(automation): align attachment uploads
2026-06-07 10:44:45 +08:00
rogee
f46bce7528
docs: land parity tracking handoff
2026-06-07 10:27:56 +08:00
rogee
168f12070e
feat(macros): align attachment uploads
2026-06-07 10:22:36 +08:00