Skip to content

Add Bates installer: Core + Enhancement Wizard#1

Open
Kollerro wants to merge 108 commits intomainfrom
feature/installer-v1
Open

Add Bates installer: Core + Enhancement Wizard#1
Kollerro wants to merge 108 commits intomainfrom
feature/installer-v1

Conversation

@Kollerro
Copy link
Contributor

Summary

  • Step 1 (Bates Core): Windows Inno Setup installer that bootstraps WSL2/Ubuntu, installs OpenClaw gateway, configures AI auth (Claude/OpenAI), sets up Telegram channel, dashboard, cost tracker, and core workspace — working AI assistant in ~15 minutes
  • Step 2 (Bates Enhanced): Interactive bates-enhance.sh wizard with 14 optional integrations: Microsoft 365, Teams, Twilio voice calls, ElevenLabs TTS, search index, image generation, social media, Tailscale, on-demand agents (12 deputies), Google APIs, GitHub, DeepSeek, and web search
  • Build pipeline: Sanitization scanner (15 forbidden patterns), packaging script, patch management system for post-update gateway modifications

Stats

  • 189 files, 21,456 lines
  • 14 integration setup scripts with config merge, cron unlock, and state tracking
  • 8 documentation guides (M365, Telegram, Teams, Twilio, ElevenLabs, Google, Tailscale, troubleshooting)
  • 4 JavaScript/TypeScript patches (cost footer, adaptive cards, channel bridge, reapply script)

Test plan

  • Run sanitize-check.sh — verify 0/15 forbidden patterns
  • Test core-setup.sh + core-configure.sh + core-verify.sh on fresh WSL2 Ubuntu
  • Compile BatesCore.iss with Inno Setup 6 on Windows
  • Run bates-enhance.sh and test individual integrations
  • Verify template engine renders all {{PLACEHOLDER}} values correctly

🤖 Generated with Claude Code

Robert Koller and others added 30 commits February 17, 2026 22:13
…, dashboard, Telegram

Complete Step 1 "Bates Core" installer that gets a working AI assistant with
dashboard and Telegram in 15 minutes:

- Windows Inno Setup script (BatesCore.iss) + PowerShell WSL2 bootstrap (install.ps1)
- Linux setup scripts: core-setup.sh, core-configure.sh, core-verify.sh
- Shared libraries: common.sh, prerequisites.sh, template-engine.sh
- 7 core workspace rules, 2 skills, templatized SOUL.md/TOOLS.md
- Config templates: openclaw.json, auth-profiles.json, systemd service, crontab
- 8 sanitized core scripts (health-check, watchdog, archive, tmux, etc.)
- 2 plugins: cost-tracker + dashboard (glassmorphism UI, 14 panels, agent org chart)
- Step 2 enhancement wizard scaffold (bates-enhance.sh) with 5 shared libraries
- Build pipeline: sanitize-check.sh (15 forbidden patterns) + build-package.sh
- All personal data sanitized — 0 forbidden patterns detected

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Complete bates-enhance package with all 14 integration setup scripts:
- m365: 22 files (6 refs, 3 rules, 6 skills, 4 scripts, 14 cron jobs)
- agents: 15 files (12 deputy configs, 8 scripts, 15 cron jobs, delegation rules)
- search: 11 files (6 Python scripts, config.yaml template, Ollama setup)
- teams, twilio, social, tailscale, google: medium integrations with configs
- telegram, elevenlabs, image, github, deepseek, websearch: simple integrations

Also includes:
- Patch management: cost-footer, adaptive-cards, channel-bridge, reapply-patches.sh
- 8 documentation guides (manual-steps for each integration + troubleshooting)
- All sanitized — 0/15 forbidden patterns detected

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…hema

Found via Option B testing (fresh user install). 8 schema errors prevented
gateway startup: wrong key names (definitions→list, token→botToken,
ttlMinutes→ttl), misplaced sections (heartbeat, session), and missing
required fields (gateway.mode, model object format, subagents config).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add prominent disclaimer to README: experimental software, no warranty,
  use at your own risk, not affiliated with any third-party services
- Fix core-configure.sh: openclaw models auth setup-token requires an
  interactive TTY. Now falls back to manual credential storage when
  piped input is detected, with instructions to complete setup later.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Claude Code is essential for delegation (run-delegation.sh, claude-tmux.sh,
coding-agent skill) but was never installed. Also adds tmux which is needed
for the claude-tmux.sh persistent session wrapper.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All config fragments and setup scripts were using non-existent OpenClaw
config keys (mcp, features, assistant) and wrong key names/paths.
Fixed to match actual OpenClaw v2026.2 schema:

- telegram: token -> botToken, removed allowFrom, added dmPolicy/streamMode
- twilio: channels.voice -> plugins.entries.voice-call.config,
  maxConcurrent -> maxConcurrentCalls
- elevenlabs: channels.voice.tts -> plugins.entries.voice-call.config.tts.elevenlabs,
  model -> modelId, added talk section
- m365: removed assistant/mcp keys, use env.vars; fixed config_merge -> config_merge_inline
- github: removed mcp key, store token in env.vars
- google: removed mcp key, store credentials in env.vars
- websearch: removed mcp key, use tools.web.search for Brave,
  models.providers for Perplexity
- image: removed features key, store API keys in env.vars
- search: removed features key (search index uses own config.yaml)
- social: removed features key, store MixPost URL in env.vars
- deepseek: replaced {enabled:true} with full provider structure
  (baseUrl, apiKey, api, models array), added template rendering
- agents: added archiveAfterMinutes and model to subagents config
- config-merge.sh: fixed telegram and voice helper functions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- bates-icon.ico: Multi-size ICO (256/128/64/48/32/16) from app icon
- installer-banner.bmp: 164x314 wizard banner from splash screen
- installer-logo.bmp: 55x55 wizard logo from avatar
- installer-splash.png: Full splash screen for reference
- BatesCore.iss: Enable SetupIconFile, WizardSmallImageFile,
  WizardImageFile referencing the new assets

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- All 12 deputy heartbeat crons now include delivery config with
  {{PRIMARY_CHANNEL}}/{{DELIVERY_TARGET}} placeholders and bestEffort
- Heartbeat prompts reference deputy-specific HEARTBEAT.md paths
  ({{HOME}}/.openclaw/agents/{name}/HEARTBEAT.md) instead of generic
- message-router cron changed to sessionTarget: "isolated" to prevent
  main session pollution
- daily-standup-compile and weekly-strategy-review get proper delivery
- cron-unlock.sh resolves {{USER_TZ}}, {{PRIMARY_CHANNEL}},
  {{DELIVERY_TARGET}}, {{HOME}} from env vars or openclaw.json config

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- channel-bridge.patch.ts: add __openclawUpdateTeamsCard bridge + abort-signal blocking fix
- send-update.patch.ts: new patch for updateAdaptiveCardMSTeams function
- policy-dm.patch.ts: new patch fixing DM proxy revocation (replyStyle thread -> top-level)
- reapply-patches.sh: add sections 4-5 for send.ts and policy.ts auto-patching
- model-fallback.sh: expand from 2 to 4 provider options (+ Codex 5.3, Gemini, Sonnet)
- troubleshooting.md: add proxy revocation fix, channel auto-restart loop, 1M context warning

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sub-agent result cards, thinking bubbles, progress updates, and failure
cards now show the deputy's unique avatar image instead of a generic
robot emoji. Avatars are served from GitHub raw URLs (public repo) so
Teams servers can fetch them directly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- DISCLAIMER.txt: standalone file with full experimental/risk/autonomous-agent warnings
- BatesCore.iss: shows disclaimer as Inno Setup license page (must click "I accept"),
  Apache 2.0 license shown as info-before page
- install.ps1: shows disclaimer and requires "I ACCEPT" before Windows bootstrap;
  persists acceptance marker to avoid re-prompting after reboot
- core-setup.sh: shows disclaimer and requires "I ACCEPT" before Linux setup;
  supports BATES_ACCEPT_DISCLAIMER=yes for non-interactive/CI use

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add OpenAI Codex (GPT-5.3) as provider option 4 in core-configure.sh
- Update OpenAI default from GPT-4o to GPT-5.2
- Update Google default from Gemini 2.0 Pro to Gemini 3 Pro Preview
- Add cross-provider fallback chain to openclaw.json template

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ation

Extract all deployed patches from v2026.2.21 into a single reply-composite
patch that applies avatars, thinking bubble, progress/failure cards, announce
directive fixes, and agentId tracking. Previously these were manual edits
that reapply-patches.sh couldn't reproduce.

Changes:
- New reply-composite.patch.js (replaces adaptive-cards.patch.js for reply-*.js)
  - Avatar map with 13 agent images + helper functions
  - Thinking card on sessions_spawn ("working on..." bubble)
  - Result card with avatar in runSubagentAnnounceFlow
  - Progress card updates for 2+ minute tasks
  - Failure cards at timeout/error/archive points
  - Announce directives: enforce incremental delivery, no NO_REPLY
  - agentId tracking in registerSubagentRun
- Updated reapply-patches.sh to use composite patch + deliver-file iteration
- Updated README.md with full patch documentation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The cost footer transform hook was the only patch that required manual
intervention. Now auto-applied by anchoring on the exact
`await options.deliver(normalized, { kind })` call site.

All 9/9 reply-composite patches now apply automatically.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
All 9/9 reply-composite patches apply cleanly on v2026.2.22-2.
Added tested versions section to patches README.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SOUL.md: delegation is now NON-NEGOTIABLE, coordinator-not-worker
  pattern, 1-tool-call rule, no 2+ turns before spawning
- model-routing: remove Gemini, add tiered agent model table
- subagent-policy: add three enforcement directives for immediate
  delegation, remove stale Gemini temporary override
- Google no longer supports OpenClaw — all Gemini references removed

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… main agent

Text-based delegation directives were insufficient — Bates was making 62 exec
calls and 22 process polls per session instead of spawning sub-agents (only 1
sessions_spawn in 138 turns).

Fix: deny runtime/filesystem tools on the main agent via tools.deny in
openclaw.json. Main session can only coordinate (sessions_spawn, messaging,
web_search). All actual work must go through sub-agents which have full tools.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
OpenClaw's tool restriction hierarchy means agent-level tools.deny
cascades to all sessions under that agentId, including sub-agents.
This broke sub-agent exec/read/write capabilities. Replaced with
behavioral rules in SOUL.md and subagent-policy.md instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace generic heuristic regex patterns with structural matching:
insert between normalizedPayloads flatMap closing and
getGlobalHookRunner(), which has been stable across v2026.2.19-2.24.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Teams card update/send calls in runSubagentAnnounceFlow were
awaited, blocking the announce flow for 3-5s on Teams API round-trips.
Combined with delivery retries, this exceeded the 10s gateway internal
timeout causing "Subagent announce failed: gateway timeout after 10000ms".

Wrap the card operations in an async IIFE (no await) so they run in the
background. Capture closure variables to avoid mutation issues.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All 9/9 reply-composite patches and cost-footer patches apply cleanly
on v2026.2.25 despite the announce flow state machine refactor —
function names and insertion points unchanged.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- send-update.patch.ts: rewrite to use simpler getMSTeamsRuntime() +
  createMSTeamsConversationStoreFs() approach instead of the heavier
  resolveMSTeamsSendContext() pattern. Matches what's actually deployed
  and working in production.

- channel-bridge.patch.ts: remove `return result;` (startAccount doesn't
  return), use `await result.shutdown()` after abort signal fires.
  Matches deployed channel.ts patch.

Both scripts verified against clean v2026.2.25 files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Complete deputy agent system: 12 heartbeat configs with Graph API
channel posting, shared memory templates for cross-deputy persistence,
deputy feedback loop, updated cron jobs with correct agentId routing,
rewritten collect-standups with all deputies. SOUL.md gains agentId
delegation rule and read-back-in-conversation directive. Patches
tested through v2026.2.26.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The edit/write tools enforce workspace root boundary checks that block
access to shared/ (symlink resolves outside agent workspace). Added
directive to all 12 HEARTBEAT.md files instructing deputies to use
exec (bash) for shared memory writes instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Teams channel message delivery requires RSC permissions that haven't
propagated in the Admin Center. This plugin bypasses that by using
Graph API change notifications (subscriptions) to receive real-time
channel messages and inject them into the gateway's agent pipeline.

- Creates Graph subscriptions for all 8 Bates Operations channels
- Handles webhook validation and notification processing
- Fetches full message content, strips HTML, deduplicates
- Injects messages using finalizeInboundContext/dispatchReplyFromConfig
- Sends replies back via Bot Framework REST API
- Auto-renews subscriptions every 50 minutes
- Stores conversation references for proactive messaging
- Updated dashboard plugin to exclude /channel-bridge from SPA catch-all

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Cron heartbeat announces were sending redundant Adaptive Cards that
rendered as "Card - access it on go.skype.com/cards.unsupported" in
Teams DMs. The result card now only fires for sessions_spawn calls
(which have a registry entry) not for cron announce deliveries.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Session-continuity: persists conversational context across session resets
via handoff digests. Uses before_prompt_build hook to inject prior session
context into new sessions so Bates never loses awareness of recent
interactions, active tasks, or pending decisions. Rule-based summarization
(no LLM calls). Rolling buffer of last 5 interactions.

Channel-bridge: fix message ID extraction for delegated permission
subscriptions (resourceData.id is empty, parse from resource path instead),
add duplicate init guard, add Bates user ID to skip filter.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…n enforcer

Plugins:
- channel-bridge: add media download, voice channels, thread reply support
- cost-tracker: migrate to registerHttpRoute (v2026.3.2), add Codex subscription zero-cost
- dashboard: migrate to registerHttpRoute (v2026.3.2), restructure route handlers
- session-continuity: fix recursive handoff nesting, add sessionId dedup, artifact detection
- delegation-enforcer: new plugin — rate-limits main agent tool calls, forces delegation,
  anti-circumvention (3-layer enforcement), self-protection (integrity monitoring)

Scripts:
- post-to-channel.sh: Teams channel posting with thread reply support (secrets from config)
- lookup-deputy.sh: deputy agent routing (GPT-5.4 model refs)
- lookup-skill-file.sh: skill file lookup with plural aliases
- acp-health-check.sh: ACP runtime diagnostics

Workspace:
- SOUL.md: core personality and behavioral rules
- 21 workspace rules (delegation, heartbeat policy, teams channels, etc.)
- 12 deputy heartbeat configs (absolute paths for sandbox compatibility)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Install @openai/codex alongside @anthropic-ai/claude-code in core-setup.sh
- Update provider selection: openai-codex/gpt-5.3-codex → openai-codex/gpt-5.4
- Add CLI presence checks for both Claude Code and Codex in core-verify.sh

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Robert Koller and others added 30 commits March 15, 2026 12:57
core-setup.sh:
- UFW firewall: deny all incoming except Tailscale (100.64.0.0/10) + localhost
- SSH hardening: PasswordAuthentication no, PermitRootLogin no
- npm security: ignore-scripts=true (prevents supply-chain attacks)
- File permissions: chmod 700 ~/.openclaw, 600 openclaw.json, 700 agents/

openclaw.json.template:
- Add ssrfPolicy.dangerouslyAllowPrivateNetwork to browser config

Document Section 9 - Security Hardening:
- Network security (UFW rules)
- SSH hardening
- Filesystem restrictions (two-layer: SOUL.md + delegation-enforcer)
- File permissions
- npm security
- Browser relay security (gated approval, auto-revoke)
- API key management (subscription auth, env stripping, auto-generated token)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SOUL.md.template:
- Replace all Robert-specific references with {{USER_NAME}}, {{ASSISTANT_NAME}},
  {{USER_TZ}}, {{USER_CONTEXT}}, {{ASSISTANT_EMAIL}}, {{LINUX_USER}}
- Add conditional M365 blocks: {{#IF_M365}}...{{/IF_M365}} for OneDrive/email rules,
  {{#IF_NO_M365}}...{{/IF_NO_M365}} for local file storage fallback
- Without M365: output files go to ~/.openclaw/workspace/drafts/ (local)
- With M365: output files upload to OneDrive via Graph API

template-engine.sh:
- Add conditional block support: {{#IF_NAME}}...{{/IF_NAME}}
- Keep block content if env var is set, remove if unset/empty

core-configure.sh:
- Set IF_M365/IF_NO_M365 flags based on M365 setup result
- Export LINUX_USER, USER_CONTEXT, ASSISTANT_EMAIL for template rendering

Document Section 9.7:
- Add "Operating Without Microsoft 365" table showing what works/doesn't
- Clarify 100.64.0.0/10 is standard Tailscale CGNAT range (generic)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Section 9.7 renamed to "Operating Without M365 Email/Calendar Sign-In"
to distinguish from Teams (which always works via embedded bot).
Updated table: Teams DM + channel posting both show "Fully works"
without M365 sign-in. Added note explaining the separation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
README.md:
- Add "Why two machines?" section with bates-two-machine-setup.png
  diagram (from fDesk OneDrive brand assets) between Architecture
  and Integrations sections
- Expand Credits into "Powered by OpenClaw" section with links to
  OpenClaw GitHub, docs, and Peter Steinberger
- Add note about OpenClaw's own security warnings and license terms

DISCLAIMER.txt:
- Add item 8: "POWERED BY OPENCLAW" with MIT license notice and
  link to OpenClaw repo
- Note that OpenClaw's own license terms apply

BatesCore.iss:
- Add "Powered by OpenClaw" section to installer finish page with
  Peter Steinberger credit

install.ps1:
- Add "Powered by OpenClaw" line to final success message

Assets:
- Add bates-two-machine-setup.png and .svg from fDesk OneDrive

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Installer now shows two pages:
1. OpenClaw MIT License (InfoBeforeFile) — displayed with credit to
   Peter Steinberger and link to github.com/openclaw/openclaw
2. Bates Disclaimer (LicenseFile) — requires "I accept" to proceed

No extra clicks — the OpenClaw license replaces the previously shown
Bates Apache LICENSE on the info page. Users see and acknowledge both.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the minimal MIT-only text with the full OpenClaw security notice
from docs.openclaw.ai/gateway/security, followed by the MIT license.

Users now see on the InfoBefore page:
- Security warnings: autonomous capabilities, prompt injection risk,
  personal assistant trust model, unencrypted data on disk
- MIT License by Peter Steinberger
- Link to full security guide

Then the Bates disclaimer on the License page (requires "I accept").

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Users now see both licenses during install:
- Page 1: OpenClaw security notice + MIT License (Peter Steinberger)
- Page 2: Bates disclaimer + Apache 2.0 license (getBates / Robert Koller)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Mirrors the OpenClaw page format: project name, URLs, creator name
prominently at the top.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Changed CreateCustomForm() to TForm.Create(nil) — CreateCustomForm is
not available in Inno Setup 6.7.1. Compiled successfully.

Output: build/output/BatesCore-2.0.0.exe (21MB)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
CRITICAL fixes:
- Fix deputy template_render: export AGENT_ID/AGENT_NAME per-agent before
  render (was passing ignored extra args). Fix agent-openclaw.json.template
  invalid JSON (unquoted {{AGENT_LAYER}}, missing vars).
- Fix BatesCore.iss: add recursesubdirs for templates/, add agents/,
  shared-memory/, patches/ to [Files]. Fix desktop app path.
- Fix WSL/systemd bootstrap: write /etc/wsl.conf with systemd=true and
  restart WSL BEFORE running systemd-dependent core-setup.sh.
- Fix M365 whitelist schema to match gateway.py expectations.
- Fix M365 safety fails-open: block write operations (PUT/POST/PATCH/DELETE)
  when safety gateway is unavailable. Reads still pass through.
- Remove Teams secret from repo: prompt user interactively instead of
  embedding base64-encoded secret in core-configure.sh.

HIGH fixes:
- Replace hardcoded /home/openclaw/ in delegation-enforcer, dashboard,
  m365-safety, channel-bridge plugins with os.homedir() / process.env.HOME.
- Fix gateway bind: change loopback to 0.0.0.0 (UFW restricts to Tailscale).
  Add token auth config.
- Fix Teams tenantId: add prompt + template placeholder.
- Fix desktop app path: point to dist-builds/ where .exe actually lives.
- Fix install success banner: track $installSuccess, gate final message.
- Add cron to apt install list in core-setup.sh.
- Fix broken workspace refs: make tool reference table conditional, remove
  hardcoded file paths for enhance-only refs.

MEDIUM fixes:
- Replace ALL "Robert" references with {{USER_NAME}} in SOUL.md.template
  and all 10 workspace rules files.
- Anonymise subagent-policy.md examples (rk@fdesk.tech -> user@example.com,
  Solatio -> ExampleCorp).
- Remove hardcoded Teams channel IDs from teams-channels.md, replace with
  generic template using script lookups.

LOW fixes:
- Add THIRD_PARTY_LICENSES.md (OpenClaw, Lossless Claw, Superpowers,
  Node.js, Inno Setup, Tauri).
- Fix telegram manual steps doc.

NEW:
- Add two-machine architecture diagram to installer role selection
  (shows PNG in Windows Form before Server/Client choice).
- Rewrite role selection text to explain the two-machine concept clearly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Publisher: "getBates (Robert Koller)"
- URL: https://getbates.ai
- Copyright: Robert Koller 2025-2026
- Version info embedded in exe properties

Note: "Publisher unknown" UAC warning persists until the exe is
code-signed with a certificate. Recommended: Azure Trusted Signing
(~$10/month) or SSL.com code signing cert (~$70/year).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Windows Forms approach failed silently because PowerShell runs
inside Inno Setup's console context where ShowDialog doesn't display.

New approach: open the PNG with the default Windows image viewer
(Start-Process), then pause with "Press Enter to continue". Simple,
reliable, works in any PowerShell context.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Users can now cancel at multiple points:
- Role selection: type Q to quit (no changes made)
- After role selection: "Continue? (Y/Q)" confirmation showing
  exactly what will be installed, before any system changes begin
- Inno Setup wizard pages: standard Cancel button (already existed)

Both cancel points confirm "No changes were made to your system."

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Server vs Client choice is now a proper wizard page inside Inno
Setup (with radio buttons and explanations), appearing right after
the license/disclaimer pages. The user sees:

1. Splash screen
2. OpenClaw security notice
3. Bates disclaimer (I accept)
4. "Which machine is this?" — Server/Client radio buttons with
   descriptions and Powered by OpenClaw note
5. Ready to install (with cancel option)
6. File extraction
7. PowerShell receives -Role server/client, skips console selection

The role is passed to install.ps1 via {code:GetSelectedRole}.
Fallback interactive selection preserved for standalone script use.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
CRITICAL fixes:
- C1/H6: Generate gateway token in core-configure.sh (openssl rand),
  save to gateway-token file, add to systemd drop-in, print for user
- C2: Add all 7 core plugins to plugins.load.paths + plugins.allow +
  plugins.entries in openclaw.json.template
- C3: Fix template engine conditional regex to match digits (IF_M365)

HIGH fixes:
- H1: Clean up deputy agent-soul.md.template (remove unresolved vars)
- H2: Set installSuccess=false when core-verify.sh fails
- H3: Anonymise /home/openclaw/ in 10 core scripts (use $HOME)
- H4: Fix workspace refs — replace table with "installed by enhance" note,
  create observations/file-index.md placeholder
- H5: Replace bates-enhance.sh references with "available separately"

MEDIUM fixes:
- M2: Fix agent-message.sh — use $HOME + OPENCLAW_GATEWAY_TOKEN env var
- M4: Replace teams-manifest.zip reference with actual instructions

Installer UX:
- Swap page order: Bates disclaimer first, OpenClaw security notice second
- Regenerate wizard logo (55x55) and banner (164x314) with better cropping

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 12 Sub-Agents with current role names
- Remove Docker/Ollama/ChromaDB references
- Generic hardware reference
- Fix quick start to match actual installer behavior

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
C1/H6 (dashboard token):
- dashboard/index.ts reads OPENCLAW_GATEWAY_TOKEN from env instead of
  config.gateway.auth.token
- Updated login hint to reference ~/.openclaw/gateway-token
- Updated browser extension README.md and options.html help text

H3 (anonymisation — deep pass):
- channel-bridge/index.ts: removed hardcoded conversation IDs, read from
  config/msteams-conversations.json dynamically
- post-to-channel.sh: removed hardcoded team/channel IDs, read from config
- cron-channel-router.sh: removed hardcoded channel mapping, read from config
- find-channel-thread.sh: removed hardcoded team ID, read from config
- collect-standups.sh: removed hardcoded paths
- rescue-bates.sh: fixed hardcoded path
- core-client-setup.ps1: fixed hardcoded reference

H4 (workspace refs):
- SOUL.md.template: removed references to non-existent skill paths
  (presentations, word-documents, spreadsheets, legal-docs)
- Removed Bates Prompt Stack section (references non-existent runtime kit)
- Made QUEUE.md references conditional ("if it exists")
- Made call-transcription skill reference generic

M3 (README):
- Fixed Quick Start to match actual installer behavior
- Removed "builds local search index" (that's enhance)
- Fixed manual steps (only Telegram needed, M365 optional)
- Removed business branding from footer

Mailing list subscribe: already present on finish page (getBates.ai/newsletter)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…tion

Inspired by openclaw_quick_installer (JustinBIBERRR):

install.ps1:
- Timestamped install logging to $InstallDir/logs/install-*.log
- Write-Step/Success/Warn/Fail all log with elapsed time
- Progress file (install-progress.txt) with step/total/label for
  future GUI integration (8 steps tracked)
- Final elapsed time shown on success and failure

core-configure.sh:
- Existing installation detection: detects ~/.openclaw/openclaw.json,
  offers upgrade/fresh/cancel with automatic backup
- API key validation: Anthropic token format check (20+ chars),
  API key prefix check (sk-ant-), Telegram bot token format
  (digits:alphanumeric), Telegram user ID (numeric only)

Also includes remaining anonymisation fixes from H3 agent:
- 62 files across plugins, scripts, agents, workspace, dashboard
- Removed hardcoded business names, channel IDs, email addresses
- All replaced with $HOME, config reads, or template variables

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Complete Tauri + React installer with 7 pages:
- Welcome: branded landing with feature highlights
- Role Selection: Server/Client with architecture diagram
- License: tabbed Bates disclaimer + OpenClaw security notice
- System Check: real-time prereq validation (OS, RAM, disk, internet, WSL)
- API Setup: AI provider selection, token validation, Telegram config
- Installing: real-time progress bar + log output streaming
- Success: next steps, dashboard link, GitHub/newsletter/share buttons

Tech stack: Tauri 2 (Rust backend), React 18, Tailwind CSS, Vite
Rust backend: syscheck via PowerShell, install process streaming,
progress file polling

Frontend builds successfully (vite build).
Rust build requires VS Build Tools on Windows (MSVC linker).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
M365-tools: exposes 13 email/calendar/tasks/OneDrive tools as native
gateway tools via mcporter, so sub-agents can access them directly.

Mixpost: social media management plugin with HTTP API for posts,
accounts, tags, and scheduling via Mixpost Pro Team.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Skill files that guide Bates on how to delegate document creation
(DOCX, XLSX, PPTX) to Claude Code / Codex sub-agents.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
CLI reminder manager with add/list/due/done/snooze/delete commands.
JSON-backed persistence with migration logic for older entries.
Integrated into heartbeat flow to surface due reminders automatically.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Use OPENCLAW_HOME env var or platform-specific default
  (Windows: %APPDATA%/openclaw, Linux: ~/.openclaw)
- Add reminders.py deployment to core-setup.sh installer

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New tools via direct Graph API calls:
- create_calendar_event (with attendees, Teams meeting link)
- update_calendar_event
- delete_calendar_event
- find_meeting_times (across multiple attendees)
- get_user_info (profile lookup by email)

Total: 18 native gateway tools for M365.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bates can now compose emails and place them in Robert's Drafts folder
for review. No email is sent without human action.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Email drafts now go directly to Outlook Drafts folder via draft_email
  tool instead of saving as MD files on OneDrive
- Calendar operations use native create/update/delete/find_meeting_times
  tools instead of ms365-assistant
- Updated SOUL.md and refs/email-ops.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
draft_email now takes an account parameter (vernot or fdesk) to create
drafts in the correct Outlook mailbox. Graph API token management
updated to support per-account tokens.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- All links open in external browser via Rust open::that() (Welcome,
  License, Success, AssistantEmail pages)
- License page: click handler intercepts <a> tags, routes through
  open_url Rust command
- Install backend: accepts full InstallConfig with all user settings,
  writes install-config.json, passes to install.ps1
- get_install_dir command: finds installer files next to exe or
  falls back to LocalAppData
- Streams both stdout and stderr to frontend via events

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
H4: Fix remaining broken references
- context-hygiene.md: remove hardcoded refs/mcp-servers.md and
  refs/email-ops.md examples (enhance-only), simplify to generic guidance
- proactive-philosophy.md: remove refs/onedrive.md reference, make
  OneDrive conditional. Remove hardcoded skill paths.
- Create observations/tasks.md and captures.md (referenced by
  quick-capture skill)
- TOOLS.md exists as .template (rendered during install) - not broken

M3: Fix README to accurately reflect core vs enhance
- Split "What Bates Does" into Core (ships with installer) and
  Optional Integrations (enhance)
- Update metrics table to show what actually ships in core
- Remove deployment-specific numbers (49 cron jobs, 6 MCP servers,
  4 email inboxes) that only apply to the dev deployment

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant