Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
4b400f6
feat(ui): Add better error messages for QR code authentication
Feb 17, 2026
e001de0
feat(ci): add pipeline scripts and update workflows
leeroybrun Feb 19, 2026
b7aa9df
feat(cli): emit JSON envelopes for control commands
leeroybrun Feb 19, 2026
187e0d6
chore(tauri): disable updater artifacts
leeroybrun Feb 19, 2026
d46b0a5
feat(stack): offline copy-from & runtime port handling
leeroybrun Feb 19, 2026
db8eba8
feat(protocol): add probed cache primitives and update feature gates
leeroybrun Feb 19, 2026
62b932b
feat(server): add machine revoke route and attachments upload feature…
leeroybrun Feb 19, 2026
25fdf78
feat(cli-rpc): add chunked attachments upload handlers
leeroybrun Feb 19, 2026
3acd3b1
feat(cli-rpc): add session log tail handler
leeroybrun Feb 19, 2026
3bdaa5d
feat(cli-acp): refactor thinking stream handling and tool-call finali…
leeroybrun Feb 19, 2026
d24d7e5
feat(cli-capabilities): cache ACP and model probe snapshots
leeroybrun Feb 19, 2026
e163227
refactor(cli-automations): drop existing-session target local gate
leeroybrun Feb 19, 2026
269d730
feat(cli-push): route notifications by per-device server URL
leeroybrun Feb 19, 2026
eec57fa
refactor(cli-session): centralize session fetch logic with v2 compat …
leeroybrun Feb 19, 2026
a727ab4
fix(cli-codex): await account-settings refresh before terminal start
leeroybrun Feb 19, 2026
b2cba74
fix(cli-daemon): redact auth headers in machine registration errors
leeroybrun Feb 19, 2026
f9ce510
feat(cli-session): set deterministic JSON command exit codes
leeroybrun Feb 19, 2026
e4a88b5
fix(cli-watcher): close startup race when watched files appear
leeroybrun Feb 19, 2026
5b6045f
build(cli): harden prepack dependency build and bundled dist sync
leeroybrun Feb 19, 2026
bfd360c
test(cli): serialize global build setup and relax unit test timeouts
leeroybrun Feb 19, 2026
248f54f
fix(cli-codex): prefer offline npx resolution for acp backend
leeroybrun Feb 19, 2026
80e15b3
fix(cli-claude): preserve main parent chain across sidechains
leeroybrun Feb 19, 2026
75ad31e
docs(cli-claude): instruct attachment reads in system prompt
leeroybrun Feb 19, 2026
f78ff64
docs(hstack): document force re-authentication commands
leeroybrun Feb 19, 2026
4445430
fix(website): parse release assets without awk line-length overflow
leeroybrun Feb 19, 2026
3824b17
feat(stack): default repo-local tui wrapper to dev mode
leeroybrun Feb 19, 2026
e5ab3fb
ci(pipeline): require and materialize ASC API key for iOS submit
leeroybrun Feb 19, 2026
538bf90
test(e2e): add streamed table ACP scenario and stabilize core suites
leeroybrun Feb 19, 2026
6f15301
fix(cli-codex): import zod v4 namespace in mcp elicitation handler
leeroybrun Feb 19, 2026
edd67ef
fix(cli-claude): accept executable wrapper entrypoints for SDK path
leeroybrun Feb 19, 2026
32d1748
fix(cli-acp): emit idle when prompt completes without update events
leeroybrun Feb 19, 2026
bfc1701
feat(cli-capabilities): add probeModes invoke support
leeroybrun Feb 19, 2026
2f38404
feat(stack-tui): default bare tui to dev and expand root script aliases
leeroybrun Feb 19, 2026
1c641e3
feat(ui-machine): add machine revoke flow and revoked-state handling
leeroybrun Feb 19, 2026
488665d
feat(ui-session): add session log tail screen and RPC reader
leeroybrun Feb 19, 2026
369e06b
feat(ui-session): add attachments uploads and preflight probe caching
leeroybrun Feb 19, 2026
14b96a4
feat(ui-settings): move web controls and add thinking display options
leeroybrun Feb 19, 2026
bde48c8
refactor(ui-diff): migrate diff rendering to fileOps tool renderer
leeroybrun Feb 19, 2026
c6c99cc
feat(ui-session): add session tags and transcript rendering refinements
leeroybrun Feb 19, 2026
cc24fca
chore(ui-i18n): update locale strings for session and settings features
leeroybrun Feb 19, 2026
7fed2e9
refactor(ui-runtime): apply async safety and navigation gating updates
leeroybrun Feb 19, 2026
a1e3467
chore(ui-web): add web shims and harden build-test configuration
leeroybrun Feb 19, 2026
8f10c20
feat(ui-sync): improve streaming merge and thinking reconciliation
leeroybrun Feb 19, 2026
560fdaa
feat(ui-sync): overhaul feature runtime, machine cache, and server or…
leeroybrun Feb 19, 2026
c22a4a9
feat(ui-voice): expand voice settings panels and surface controls
leeroybrun Feb 19, 2026
34e9ee0
fix(ui-session): carry preflight session mode id into new session pay…
leeroybrun Feb 19, 2026
06f1426
feat(ui-voice): add carrier session routing and local conversation ru…
leeroybrun Feb 19, 2026
e2a63d2
feat(ui-voice): expand kokoro runtime, downloads, and audio output
leeroybrun Feb 19, 2026
afb86a3
fix(ui-session): expose preflight session mode probe controls in simp…
leeroybrun Feb 19, 2026
166e822
fix(ui-session): expose preflight session mode probe controls in wiza…
leeroybrun Feb 19, 2026
1686925
test(ui-sync): cover out-of-order root stream chunk merging
leeroybrun Feb 19, 2026
a4a1b04
test(stack-tui): cover stack-name inference behavior
leeroybrun Feb 19, 2026
5c6b8aa
feat(stack-dev): support external server mode in local dev runner
leeroybrun Feb 19, 2026
feb168f
fix(ui-session): wire ACP session mode props through wizard controls
leeroybrun Feb 19, 2026
ab61406
fix(stack): disable implicit stack env loading in repo-local wrapper
leeroybrun Feb 19, 2026
906a931
fix(ui-sync): sort incoming message batches before reducer merge
leeroybrun Feb 19, 2026
fbf94d2
test(ui): cover terminal connect approval outcomes
leeroybrun Feb 19, 2026
07dd1eb
Merge pull request #33 from caseyjkey/auth-error-handling
leeroybrun Feb 19, 2026
11f0645
Merge branch 'dev' of https://github.com/happier-dev/happier into dev
leeroybrun Feb 19, 2026
2c34f02
fix(acp/ui): surface process exit & stream-key
leeroybrun Feb 19, 2026
8cc23a9
feat(stack): repo-local wrapper & TUI improvements
leeroybrun Feb 19, 2026
2adaa60
test(release): add EAS android track tests
leeroybrun Feb 19, 2026
2c14848
chore(scripts): add stop script to package.json
leeroybrun Feb 19, 2026
85f56f8
feat(sessions): add ACP mode refresh & seeding
leeroybrun Feb 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 11 additions & 0 deletions .daggerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
**/node_modules/
.env*
**/.env*
dist/
output/
test-results/
.git/
.DS_Store
.turbo/
.cache/
.yarn/cache/
4 changes: 2 additions & 2 deletions .github/feature-policy/preview.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@
"messages.thinkingVisibility",
"codex.resume.mcp",
"codex.resume.acp",
"voice"
"voice",
"attachments.uploads"
],
"deny": [
"automations",
"automations.existingSessionTarget",
"execution.runs",
"voice.agent",
"social.friends",
Expand Down
2 changes: 1 addition & 1 deletion .github/feature-policy/production.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"app.ui.storeReviewPrompts",
"app.ui.sessionGettingStartedGuidance",
"bugReports",
"attachments.uploads",
"session.typeSelector",
"zen.navigation",
"usage.reporting",
Expand All @@ -21,7 +22,6 @@
],
"deny": [
"automations",
"automations.existingSessionTarget",
"execution.runs",
"voice",
"voice.agent",
Expand Down
124 changes: 62 additions & 62 deletions .github/workflows/build-tauri.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,17 +144,7 @@ jobs:
if: inputs.environment == 'production'
run: |
set -euo pipefail
node - <<'NODE'
const fs = require('node:fs');
const conf = JSON.parse(fs.readFileSync('apps/ui/src-tauri/tauri.conf.json', 'utf8'));
const pubkey = conf?.plugins?.updater?.pubkey;
const placeholder = 'REPLACE_WITH_TAURI_UPDATER_PUBLIC_KEY_PEM';
if (typeof pubkey !== 'string' || pubkey.trim().length === 0 || pubkey.includes(placeholder)) {
console.error(`Invalid Tauri updater public key in apps/ui/src-tauri/tauri.conf.json (still contains "${placeholder}").`);
console.error('Refusing to build production desktop artifacts until a real updater public key is configured.');
process.exit(1);
}
NODE
node scripts/pipeline/tauri/validate-updater-pubkey.mjs

- name: Enable Corepack (Yarn)
run: |
Expand Down Expand Up @@ -261,17 +251,29 @@ jobs:
echo "ui_version=${ui_version}" >> "$GITHUB_OUTPUT"
echo "build_version=${build_version}" >> "$GITHUB_OUTPUT"

- name: Materialize Tauri signing key (if configured)
if: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY != '' }}
env:
TAURI_SIGNING_PRIVATE_KEY_RAW: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
run: |
set -euo pipefail
if [ -z "${RUNNER_TEMP:-}" ]; then
echo "RUNNER_TEMP is required to materialize signing key." >&2
exit 1
fi
key_path="${RUNNER_TEMP}/tauri.signing.key"
printf '%s' "${TAURI_SIGNING_PRIVATE_KEY_RAW}" > "${key_path}"
chmod 600 "${key_path}" || true
echo "TAURI_SIGNING_PRIVATE_KEY=${key_path}" >> "$GITHUB_ENV"
echo "TAURI_SIGNING_PRIVATE_KEY_PASSWORD=${TAURI_SIGNING_PRIVATE_KEY_PASSWORD}" >> "$GITHUB_ENV"

- name: Build desktop updater artifacts
env:
CI: "true"
APP_ENV: ${{ inputs.environment }}
TAURI_TARGET: ${{ matrix.tauri_target }}
APPLE_SIGNING_IDENTITY: ${{ steps.apple_id.outputs.identity }}
# Optional: updater signing. Add secrets to enable signing:
# - TAURI_SIGNING_PRIVATE_KEY
# - TAURI_SIGNING_PRIVATE_KEY_PASSWORD
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
run: |
set -euo pipefail
cd apps/ui
Expand All @@ -287,6 +289,35 @@ jobs:

configs=()

# Updater artifacts are disabled by default in src-tauri/tauri.conf.json so local builds do not require
# a signing key. In CI, explicitly enable them only when the signing private key is available.
if [ -n "${TAURI_SIGNING_PRIVATE_KEY:-}" ]; then
updater_override=""
if [ -n "${RUNNER_TEMP:-}" ]; then
updater_override="${RUNNER_TEMP}/tauri.updater.override.json"
elif updater_override_tmp="$(mktemp 2>/dev/null)"; then
updater_override="${updater_override_tmp}"
else
updater_override="/tmp/tauri.updater.override.json"
fi
if [ -z "${updater_override:-}" ]; then
echo "Unable to allocate a temp file path for Tauri updater override." >&2
exit 1
fi
mkdir -p "$(dirname "${updater_override}")"
touch "${updater_override}" || {
echo "Updater override file path is not writable: ${updater_override}" >&2
exit 1
}
node -e '
const fs = require("node:fs");
const out = process.argv[1];
const payload = { bundle: { createUpdaterArtifacts: true } };
fs.writeFileSync(out, `${JSON.stringify(payload)}\n`, "utf8");
' "${updater_override}"
configs+=(--config "${updater_override}")
fi

# macOS codesigning (optional). If APPLE_CERTIFICATE is configured, sign the app during the build.
if [ "${RUNNER_OS}" = "macOS" ] && [ -n "${APPLE_SIGNING_IDENTITY}" ]; then
codesign_override="${RUNNER_TEMP}/tauri.codesign.override.json"
Expand Down Expand Up @@ -337,8 +368,6 @@ jobs:
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
APPLE_API_ISSUER_ID: ${{ secrets.APPLE_API_ISSUER_ID }}
APPLE_API_PRIVATE_KEY: ${{ secrets.APPLE_API_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
TAURI_TARGET: ${{ matrix.tauri_target }}
run: |
set -euo pipefail
Expand Down Expand Up @@ -539,9 +568,9 @@ jobs:
esac

if [ "${ENVIRONMENT}" = "preview" ]; then
out_base="happier-ui-preview-${PLATFORM_KEY}"
out_base="happier-ui-desktop-preview-${PLATFORM_KEY}"
else
out_base="happier-ui-${PLATFORM_KEY}-v${UI_VERSION}"
out_base="happier-ui-desktop-${PLATFORM_KEY}-v${UI_VERSION}"
fi

out_dir="dist/tauri/updates/${PLATFORM_KEY}"
Expand Down Expand Up @@ -603,41 +632,12 @@ jobs:
ENVIRONMENT: ${{ inputs.environment }}
run: |
set -euo pipefail

ui_version="${{ steps.meta.outputs.ui_version }}"
if [ "${ENVIRONMENT}" = "preview" ]; then
version="${ui_version}-preview.${GITHUB_RUN_NUMBER}"
release_tag="ui-preview"
notes="Rolling preview build."
else
version="${ui_version}"
release_tag="ui-v${ui_version}"
notes="See the UI release notes for details."
fi

pub_date="$(date -u +'%Y-%m-%dT%H:%M:%SZ')"

mkdir -p dist/tauri/publish
node apps/ui/tools/tauri/make-latest-json.mjs \
--channel "${ENVIRONMENT}" \
--version "${version}" \
--pub-date "${pub_date}" \
--notes "${notes}" \
node scripts/pipeline/tauri/prepare-publish-assets.mjs \
--environment "${ENVIRONMENT}" \
--ui-version "${{ steps.meta.outputs.ui_version }}" \
--repo "${REPO}" \
--release-tag "${release_tag}" \
--artifacts-dir "dist/tauri/updates" \
--out "dist/tauri/publish/latest.json"

# Assemble per-release payloads.
if [ "${ENVIRONMENT}" = "preview" ]; then
mkdir -p dist/tauri/publish/ui-preview
cp dist/tauri/publish/latest.json dist/tauri/publish/ui-preview/latest.json
cp -R dist/tauri/updates/* dist/tauri/publish/ui-preview/
else
mkdir -p dist/tauri/publish/ui-v dist/tauri/publish/ui-stable
cp dist/tauri/publish/latest.json dist/tauri/publish/ui-stable/latest.json
cp -R dist/tauri/updates/* dist/tauri/publish/ui-v/
fi
--publish-dir "dist/tauri/publish"

- name: Upload publish assets artifact
uses: actions/upload-artifact@v4
Expand All @@ -652,16 +652,16 @@ jobs:
uses: ./.github/workflows/publish-ui-release.yml
secrets: inherit
with:
tag: ui-preview
title: Happier UI Preview
tag: ui-desktop-preview
title: Happier UI Desktop Preview
target_sha: ${{ needs.prepare_assets.outputs.target_sha }}
prerelease: true
rolling_tag: true
generate_notes: false
notes: Rolling preview build.
assets_artifact: ui-desktop-assets
assets_artifact_path: dist/ui-desktop-assets
assets_dir: dist/ui-desktop-assets/ui-preview
assets_dir: dist/ui-desktop-assets/ui-desktop-preview
clobber: true

publish_stable_release:
Expand All @@ -670,15 +670,15 @@ jobs:
uses: ./.github/workflows/publish-ui-release.yml
secrets: inherit
with:
tag: ui-v${{ needs.prepare_assets.outputs.ui_version }}
title: Happier UI v${{ needs.prepare_assets.outputs.ui_version }}
tag: ui-desktop-v${{ needs.prepare_assets.outputs.ui_version }}
title: Happier UI Desktop v${{ needs.prepare_assets.outputs.ui_version }}
target_sha: ${{ needs.prepare_assets.outputs.target_sha }}
prerelease: false
rolling_tag: false
generate_notes: true
assets_artifact: ui-desktop-assets
assets_artifact_path: dist/ui-desktop-assets
assets_dir: dist/ui-desktop-assets/ui-v
assets_dir: dist/ui-desktop-assets/ui-desktop-v
clobber: true

publish_stable_feed:
Expand All @@ -687,14 +687,14 @@ jobs:
uses: ./.github/workflows/publish-ui-release.yml
secrets: inherit
with:
tag: ui-stable
title: Happier UI Stable
tag: ui-desktop-stable
title: Happier UI Desktop Stable
target_sha: ${{ needs.prepare_assets.outputs.target_sha }}
prerelease: false
rolling_tag: true
generate_notes: false
notes: Stable update feed.
assets_artifact: ui-desktop-assets
assets_artifact_path: dist/ui-desktop-assets
assets_dir: dist/ui-desktop-assets/ui-stable
assets_dir: dist/ui-desktop-assets/ui-desktop-stable
clobber: true
Loading
Loading