Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
134 commits
Select commit Hold shift + click to select a range
e883bc1
fix(deepagent-code): skip settings-only deepagent pseudo entry in pro…
deepagent-ai Sep 20, 2026
46af4c4
fix(server): keep PTY routes on the control plane so terminal WebSock…
deepagent-ai Sep 20, 2026
9f53d7a
test(deepagent-code): cover /pty prefix boundary in workspace routing
deepagent-ai Sep 20, 2026
42418b3
fix(deepagent-code): decode rehydrated outbox events before compatibi…
deepagent-ai Sep 20, 2026
1fc1d45
fix(app): degrade missing session directory in pathKey instead of cra…
deepagent-ai Sep 20, 2026
4b5cf77
fix(deepagent-code): render reviews without a diagnosis in review list
deepagent-ai Sep 20, 2026
4acc1e1
fix(deepagent-code): stop npm 404 install storm on every instance boot
deepagent-ai Sep 20, 2026
f247693
fix(core): clamp fff picker log level at info
deepagent-ai Sep 20, 2026
d8143c5
fix(deepagent-code): do not warn on location-index shutdown interrupt
deepagent-ai Sep 20, 2026
cf458d3
fix(deepagent-code): terminally drop events of unregistered V2 types
deepagent-ai Sep 20, 2026
0b5b500
chore(core): bump @ff-labs/fff-bun to 0.10.6
deepagent-ai Sep 21, 2026
5dd7916
fix(core): drop redundant explicit fff git status refresh
deepagent-ai Sep 21, 2026
6405555
fix(core): fetch models.dev catalog via aly mirror chain, drop build-…
deepagent-ai Sep 21, 2026
065e866
refactor(app): remove dead routes, orphan panels, and duplicate MCP rail
deepagent-ai Sep 21, 2026
7444f64
fix(core): preserve permission denial wording through V2 tool failures
deepagent-ai Sep 21, 2026
56786b6
fix(core): rebuild failed local tool results from persisted state
deepagent-ai Sep 21, 2026
f6a0df7
fix(session): notify the model on user revert and autonomous rollback
deepagent-ai Sep 21, 2026
be431ca
feat(app): consolidate sidebars to left 6 / right 7 rails
deepagent-ai Sep 21, 2026
3243a4f
feat(sdk): unify session transcript export with Markdown enhancements
deepagent-ai Sep 21, 2026
ca0e397
feat(core): compaction survival guidance and context budget warnings
deepagent-ai Sep 21, 2026
32ee003
feat(core): add task oversight/merge tools and domain-pack manual chain
deepagent-ai Sep 21, 2026
a7d8ed2
feat(core): ship dac-manual pack, expand L0 catalog, rewrite task.txt
deepagent-ai Sep 21, 2026
2702293
feat(core): thread structured permission failure codes end to end
deepagent-ai Sep 21, 2026
14b9fa3
feat(core): add knowledge_propose and im_send tools
deepagent-ai Sep 21, 2026
001f5b1
test(core): repair plan-gate classification and re-pin manifest digest
deepagent-ai Sep 21, 2026
7785198
test(live-llm): add V2.0.1-001 acceptance suites, repair harness on t…
deepagent-ai Sep 21, 2026
00cc22a
fix(deepagent-code): degrade V2 task structured-output finalizer on b…
deepagent-ai Sep 22, 2026
145b49f
fix(core): close the manifest digest to committed inputs and gate rep…
deepagent-ai Sep 22, 2026
ec323b9
refactor(core): rename session.time_suspended to execution_claim_token
deepagent-ai Sep 22, 2026
d00e68a
fix(server): require explicit summary model identity for public sessi…
deepagent-ai Sep 22, 2026
6dc0bd0
chore(sdk): regenerate JS SDK and OpenAPI spec for the compact contract
deepagent-ai Sep 22, 2026
164e09e
feat(app): warn when the maintenance bootstrap gate is degraded
deepagent-ai Sep 22, 2026
35d62bc
fix(core): tolerate stringified numbers in model-facing tool input sc…
deepagent-ai Sep 22, 2026
0b338a9
fix(deepagent-code): tolerate stringified numbers in tool parameter s…
deepagent-ai Sep 22, 2026
1c05aa0
merge(wip): a1-core — execution_claim_token rename + V2 task finalize…
deepagent-ai Sep 22, 2026
e5004b8
merge(wip): a1-f1 — tolerant number schemas across tool surfaces
deepagent-ai Sep 22, 2026
a2b32db
merge(wip): k02-k03 — compact API model fields, SDK regen, degraded b…
deepagent-ai Sep 22, 2026
f5ecb31
merge(wip): k05 — manifest digest input convergence + reproducibility…
deepagent-ai Sep 22, 2026
5e26bcb
test(core): re-pin migration registry digest for execution_claim_toke…
deepagent-ai Sep 22, 2026
fc99ffb
chore(core): re-pin manifest head digests after wave-1 merges
deepagent-ai Sep 22, 2026
51f2e58
docs(core): align runtime-defaults header with post-M1 single-point g…
deepagent-ai Sep 22, 2026
3da78ea
test(core): re-record session-runner cassette against DeepSeek OpenAI…
deepagent-ai Sep 22, 2026
fbc81d3
fix(deps): bump electron 41.2.1 -> 41.10.3
deepagent-ai Sep 22, 2026
b4a1162
fix(deps): bump dompurify 3.4.11 -> 3.4.13
deepagent-ai Sep 22, 2026
073d3e6
fix(deps): bump @hono/node-server 2.0.8 -> 2.0.10
deepagent-ai Sep 22, 2026
348d7f2
fix(deepagent-code): route V2 permission asks through the V2 reply ro…
deepagent-ai Sep 22, 2026
926805d
fix(core): degrade CoreTaskTool structured-output finalizer on budget…
deepagent-ai Sep 22, 2026
c02ccb6
fix(deps): bump @ai-sdk/provider-utils to 4.0.33
deepagent-ai Sep 22, 2026
4ee23c7
fix(deepagent-code): skip plan-status injection when no plan-store ro…
deepagent-ai Sep 22, 2026
08c83e0
merge(wip): w2-acp-permission — A1-03 V2 permission routing in intera…
deepagent-ai Sep 22, 2026
672058f
fix(deepagent-code): wrap native LLM runtime stream in AgentGateway.m…
deepagent-ai Sep 22, 2026
d26b47f
fix(deps): bump astro 6.4.8 -> 7.3.3 and @astrojs/node 10.1.4 -> 11.1.6
deepagent-ai Sep 22, 2026
e5e0818
test(deepagent-code): wire the production V2 context-tool seam into t…
deepagent-ai Sep 22, 2026
1026d9c
merge(wip): w2-core-degrade — A1-08 comment errata + CoreTaskTool deg…
deepagent-ai Sep 22, 2026
ff0e1c8
merge(wip): w2-live-harness — A1-05 cassette re-record on DeepSeek en…
deepagent-ai Sep 22, 2026
292d694
feat(core): classify session_v2_compaction_request in the startup inv…
deepagent-ai Sep 22, 2026
07652da
feat(core): split Windows data/config homes per D-W1
deepagent-ai Sep 22, 2026
f77199e
docs(core): document the post-restore restart contract on Restore
deepagent-ai Sep 22, 2026
94a97ec
test(deepagent-code): register the v2-01 acceptance suite in the live…
deepagent-ai Sep 22, 2026
d338b56
feat(core): budget/threshold comparison gate for perf attribution
deepagent-ai Sep 22, 2026
432326e
test(core): skip the RI ledger check when git-ignored docs/ is absent
deepagent-ai Sep 22, 2026
0940956
merge(wip): w2-dependabot — A1-07 batch upgrades covering all 14 open…
deepagent-ai Sep 22, 2026
047925d
test(core): type-guard the perf-compare finding lookups
deepagent-ai Sep 22, 2026
4848237
feat(server): batch full-transcript MD exporter for V1→V2 migration (…
deepagent-ai Sep 22, 2026
ca001f0
test(core): gate the config field→consumer→refusal honesty contract
deepagent-ai Sep 22, 2026
7e48c2d
feat(deepagent-code): remove win32 validation gate and add shell dial…
deepagent-ai Sep 22, 2026
2cf61d8
feat(deepagent-code): embed fff native lib in win32 CLI builds
deepagent-ai Sep 22, 2026
4a7883c
feat(deepagent-code): real Windows DPAPI backend for the MCP secret s…
deepagent-ai Sep 22, 2026
27c0c45
merge(wip): w-b-fff-dpapi — G4 fff win32 prebuilt embed in CLI builds…
deepagent-ai Sep 22, 2026
eaeb3f7
feat(server): V1→V2 migration flow orchestrator (W-02 M-2)
deepagent-ai Sep 22, 2026
c31c37e
feat(core): stamp config origin provenance and typed-unavailable cata…
deepagent-ai Sep 22, 2026
e596c04
merge(wip): k04-provider-ingression — config provider origin provenan…
deepagent-ai Sep 22, 2026
e8011d9
merge(wip): m-b-migration — W-02 M-1 batch MD exporter + M-2 migratio…
deepagent-ai Sep 22, 2026
87ba24a
merge(wip): w-b G2+G1a — Windows data/config home split (D-W1) + vali…
deepagent-ai Sep 22, 2026
a066d6a
feat(core): persist task fan-out admission in a durable ledger
deepagent-ai Sep 22, 2026
daefc99
feat(core): share the shell approval scan between V1 ShellTool and V2…
deepagent-ai Sep 22, 2026
cd7b8b9
feat(core): add the confirm_settled durable execution exit (K-01 R-3)
deepagent-ai Sep 22, 2026
25dd95e
feat(deepagent-code): W-02 M-3 — post-migration compliance report
deepagent-ai Sep 22, 2026
421ab25
feat(desktop): load Windows user/system env from the registry (D-W3 G3)
deepagent-ai Sep 22, 2026
eb054d8
refactor(desktop): remove the WSL sidecar feature and route native-only
deepagent-ai Sep 22, 2026
30d4bb0
fix(core): enforce the strict D-W2 default shell chain and finish D-W…
deepagent-ai Sep 22, 2026
c82accb
refactor(app): remove the WSL server UI and its translations
deepagent-ai Sep 22, 2026
4c7fe80
feat(deepagent-code): W-02 M-4+M-5 — backups governance and disk reclaim
deepagent-ai Sep 22, 2026
f3bd95a
feat(core): reclaim stale retained task worktrees at startup
deepagent-ai Sep 22, 2026
38bda78
feat(deepagent-code): unify provider resolution behind the SessionPro…
deepagent-ai Sep 22, 2026
8b3fec2
merge(wip): c-p2-08 — durable task fan-out admission ledger + stale w…
deepagent-ai Sep 22, 2026
fd251d2
docs(web): rewrite the Windows guide for native installs across locales
deepagent-ai Sep 22, 2026
d5db77e
feat(app): W-02 M-6 — migration-in-progress shell view with phase pro…
deepagent-ai Sep 22, 2026
14c3b17
chore(core): re-pin manifest head digests over the c-p2-08 merge tree
deepagent-ai Sep 22, 2026
5e0ab40
test(core): add the compaction-request table to handcrafted inventory…
deepagent-ai Sep 22, 2026
acba66b
chore(core): drop wsl sidecar entries from the caller inventory and s…
deepagent-ai Sep 22, 2026
0ff2451
feat(desktop): NSIS guided installer with user-PATH management and si…
deepagent-ai Sep 22, 2026
9d25fcd
chore(deepagent-code): drop stale WSL references from the validation …
deepagent-ai Sep 22, 2026
c28aa51
feat(core): surface redrive-blocked Sessions with typed reason codes …
deepagent-ai Sep 22, 2026
2568f7e
chore(sdk): regenerate types for the provider-resolution command faca…
deepagent-ai Sep 22, 2026
41dadcc
test(core): create the injected config home in account tests
deepagent-ai Sep 22, 2026
3c2c702
fix(core): ensure the config home exists before Auth reads or writes it
deepagent-ai Sep 22, 2026
2d8528b
merge(wip): w-c-desktop — G3 registry env import + full WSL removal +…
deepagent-ai Sep 22, 2026
6d38365
merge(wip): w-b-shell-path G1b — shared V1/V2 shell approval scan + s…
deepagent-ai Sep 22, 2026
0933b79
test(core): re-freeze the legacy-zero counters and annotate the shell…
deepagent-ai Sep 22, 2026
c208cea
chore: ignore local provider-variant live-llm configs (live-llm.confi…
deepagent-ai Sep 22, 2026
6dab098
ci(desktop): extend packaging matrix with win-arm64 and windows typec…
deepagent-ai Sep 22, 2026
3271ac8
merge(wip): w-d-polish — windows typecheck matrix + dual-arch packagi…
deepagent-ai Sep 22, 2026
f73145f
fix(core,desktop): cross-review P0+P1 — migrate into scaffolded data …
deepagent-ai Sep 22, 2026
d2809ab
chore(core): close cross-review P2-11 and P2-1
deepagent-ai Sep 22, 2026
531c2f1
test(core): re-pin the caller-inventory, legacy-zero, and manifest ga…
deepagent-ai Sep 22, 2026
12f342e
test(core): add the compaction-request table to the post-verify handc…
deepagent-ai Sep 22, 2026
b808ad2
merge(wip): m3-m6 — W-02 compliance report + backups governance/disk …
deepagent-ai Sep 22, 2026
ac6db75
test(deepagent-code): expect the explicit-revert synthetic notice in …
deepagent-ai Sep 22, 2026
b5a0703
merge(wip): k01-recovery — unified provider-resolution facade + confi…
deepagent-ai Sep 22, 2026
74a98a8
chore(core): re-pin gates over the k01-recovery merge tree (registry …
deepagent-ai Sep 22, 2026
06fae7a
feat(deepagent-code): flip the activity facade ON by default (K-06/B-03)
deepagent-ai Sep 22, 2026
1fc41b1
chore: untrack leaked session export and test databases (cross-review…
deepagent-ai Sep 22, 2026
588dec2
fix(deepagent-code): close cross-review batch-2 P1s — advisory contai…
deepagent-ai Sep 22, 2026
6799927
test(deepagent-code): settle the final-suite stragglers
deepagent-ai Sep 22, 2026
7b2de47
fix(live-llm): pass HOME and the registry override through the runner…
deepagent-ai Sep 22, 2026
4a4f7df
test(live-llm): cover HOME and BUN_CONFIG_REGISTRY in the runner env …
deepagent-ai Sep 22, 2026
997bc8c
fix(core): emit the canonical exit-code trailer from the V2 bash tool
deepagent-ai Sep 22, 2026
4b751d9
fix(core): project durable tool structured metadata onto the V1 wire
deepagent-ai Sep 22, 2026
612d286
test(live-llm): qualify the headless CLI subprocess for the V2 runtime
deepagent-ai Sep 22, 2026
020aebc
merge(wip): live-nonsubagent — headless CLI V2 qualification + durabl…
deepagent-ai Sep 22, 2026
f01b6cf
fix(core): bind finalizer evidence to the child answer message
deepagent-ai Sep 23, 2026
f6a8e56
merge(wip): evidence-race — bind validated evidence to the answer mes…
deepagent-ai Sep 23, 2026
d199f75
fix(core): forward V1 narrowing semantics for task child permissions
deepagent-ai Sep 23, 2026
1b5bf61
test(live-llm): accept numeric-string task_read limit in subagent for…
deepagent-ai Sep 23, 2026
333d0d0
test(live-llm): align subagent foreground assertions with the durable…
deepagent-ai Sep 23, 2026
6905444
merge(wip): child-perm — port V1 subagent permission narrowing to cor…
deepagent-ai Sep 23, 2026
f8bb2e5
fix(core): share the process query-authority store through the Locati…
deepagent-ai Sep 23, 2026
714e194
test(live-llm): align the harness frame with production identity + qu…
deepagent-ai Sep 23, 2026
d54f3a0
merge(wip): code-intel-auth — share the query-authority store through…
deepagent-ai Sep 23, 2026
3239401
chore: untrack the root .tmp test-home tree leaked by agent worktree …
deepagent-ai Sep 23, 2026
93825ea
chore(release): bump version to 2.0.1 with public changelog
deepagent-ai Sep 23, 2026
0f17621
chore(core): drop intermediate migration snapshots from the PR
deepagent-ai Sep 23, 2026
63c837a
chore(core): re-pin manifest digests after dropping intermediate snap…
deepagent-ai Sep 23, 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
  •  
  •  
  •  
115 changes: 99 additions & 16 deletions .github/workflows/desktop-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,18 @@ name: desktop-build
#
# macOS signing/notarization is opt-in: if the APPLE_* / CSC_* secrets are present it
# signs, otherwise it builds an UNSIGNED package (testers right-click → Open to launch).
# Windows/Linux packages are unsigned here.
# Windows signing is likewise opt-in via the AZURE_TRUSTED_SIGNING_* secrets (W-c);
# Linux packages are unsigned here.

on:
push:
branches:
- main
# W-01 §2.2.6 trigger extension: exercise the Windows packaging path on
# the dev mainline too (windows targets only, no release publishing — the
# release job stays main-only), so NSIS + Trusted Signing + the packaged
# smoke regress on every dev push instead of only at release time.
- dev
workflow_dispatch:
inputs:
channel:
Expand Down Expand Up @@ -66,20 +72,31 @@ jobs:
shell: bash
env:
PLATFORMS: ${{ github.event.inputs.platforms || 'all' }}
EVENT_NAME: ${{ github.event_name }}
GIT_REF: ${{ github.ref }}
run: |
# Keep one artifact per OS to stay under the repo's tight artifact quota.
# macOS arm64 only - Apple Silicon covers current Macs. The Intel (macos-13)
# runner is queue-starved and the x64 cross-compile is unreliable, so it is dropped.
mac='{"host":"macos-14","target":"darwin-arm64","platform_flag":"--mac dmg zip --arm64","group":"mac"}'
linux='{"host":"ubuntu-24.04","target":"linux-amd64","platform_flag":"--linux deb --x64","group":"linux"}'
win='{"host":"windows-2025","target":"win-x64","platform_flag":"--win nsis --x64","group":"win"}'
case "$PLATFORMS" in
mac) items="$mac" ;;
linux) items="$linux" ;;
windows) items="$win" ;;
all) items="$mac,$linux,$win" ;;
*) items="$mac,$linux,$win" ;;
esac
# W-01 §2.2.6 win-arm64: both Windows arches are packaged in ONE electron-builder
# invocation so a single latest.yml lists both installers — electron-updater then
# serves x64 and arm64 machines from the same feed (a per-arch matrix split would
# produce two latest.yml files and silently drop one arch from the update feed).
win='{"host":"windows-2025","target":"win-x64-arm64","platform_flag":"--win nsis --x64 --arm64","group":"win"}'
# Dev mainline pushes exercise only the Windows packaging path (the newest and
# least-runner-covered one); everything else follows the platforms selection.
if [ "$EVENT_NAME" = "push" ] && [ "$GIT_REF" = "refs/heads/dev" ]; then
items="$win"
else
case "$PLATFORMS" in
mac) items="$mac" ;;
linux) items="$linux" ;;
windows) items="$win" ;;
*) items="$mac,$linux,$win" ;;
esac
fi
echo "matrix={\"include\":[$items]}" >> "$GITHUB_OUTPUT"

build:
Expand All @@ -98,6 +115,11 @@ jobs:
# needs the Apple ID + app-specific password + team id. electron-builder.config.ts treats
# mac signing as available when all three are set.
HAS_APPLE_NOTARY: ${{ secrets.APPLE_ID != '' && secrets.APPLE_APP_SPECIFIC_PASSWORD != '' && secrets.APPLE_TEAM_ID != '' }}
# Windows signing uses Azure Trusted Signing (script/sign-windows.ps1, wired through
# electron-builder's per-file sign hook). The script authenticates with the Azure CLI,
# so the pipeline needs a federated service principal in addition to the endpoint /
# account / profile names. When any piece is missing the build proceeds unsigned.
HAS_TRUSTED_SIGNING: ${{ secrets.AZURE_TRUSTED_SIGNING_ENDPOINT != '' && secrets.AZURE_TRUSTED_SIGNING_ACCOUNT_NAME != '' && secrets.AZURE_TRUSTED_SIGNING_CERTIFICATE_PROFILE != '' && secrets.AZURE_TRUSTED_SIGNING_CLIENT_ID != '' && secrets.AZURE_TRUSTED_SIGNING_TENANT_ID != '' && secrets.AZURE_TRUSTED_SIGNING_SUBSCRIPTION_ID != '' }}
steps:
- uses: actions/checkout@v4

Expand All @@ -116,6 +138,29 @@ jobs:
p12-file-base64: ${{ secrets.APPLE_CERTIFICATE }}
p12-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}

# Trusted Signing authenticates through the Azure CLI credential chain
# (sign-windows.ps1 keeps only AzureCliCredential enabled), so log in with
# a federated workload identity before packaging.
- name: Azure login for Trusted Signing
if: matrix.group == 'win' && env.HAS_TRUSTED_SIGNING == 'true'
uses: azure/login@v2
with:
client-id: ${{ secrets.AZURE_TRUSTED_SIGNING_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TRUSTED_SIGNING_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_TRUSTED_SIGNING_SUBSCRIPTION_ID }}

# Cross-arch packaging: bun only installs the runner's own platform binaries,
# so the arm64 app asar would silently miss its prebuilt native modules
# (@lydell/node-pty-win32-arm64 for the terminal, @parcel/watcher-win32-arm64
# for file watching). electron-builder filters node_modules by the target
# os/cpu when copying, so installing both here yields each artifact its
# matching set. Versions must match packages/desktop/package.json
# optionalDependencies.
- name: Install arm64 Windows platform packages
if: matrix.group == 'win'
shell: pwsh
run: npm install --no-save --no-package-lock --no-audit --no-fund "@lydell/node-pty-win32-arm64@1.2.0-beta.12" "@parcel/watcher-win32-arm64@2.5.1"

# bun run build invokes the package prebuild lifecycle before electron-vite.
- name: Build renderer
working-directory: packages/desktop
Expand All @@ -140,8 +185,43 @@ jobs:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
# Azure Trusted Signing (Windows). sign-windows.ps1 skips silently when
# these are unset, matching the opt-in unsigned behavior of the mac path.
AZURE_TRUSTED_SIGNING_ENDPOINT: ${{ secrets.AZURE_TRUSTED_SIGNING_ENDPOINT }}
AZURE_TRUSTED_SIGNING_ACCOUNT_NAME: ${{ secrets.AZURE_TRUSTED_SIGNING_ACCOUNT_NAME }}
AZURE_TRUSTED_SIGNING_CERTIFICATE_PROFILE: ${{ secrets.AZURE_TRUSTED_SIGNING_CERTIFICATE_PROFILE }}
run: npx electron-builder ${{ matrix.platform_flag }} --publish never --config electron-builder.config.ts

# W-01 §2.2.6 Windows smoke floor: the packaged exe launch below proves the
# x64 app boots, but NSIS-specific regressions (installer script, per-arch
# payload, signing hook) would otherwise only surface on a physical machine.
# Assert both per-arch installers exist, and when Trusted Signing ran,
# assert the installer signature actually validates on Windows.
- name: Assert NSIS installers and signatures
if: matrix.group == 'win'
working-directory: packages/desktop
shell: pwsh
run: |
$installers = Get-ChildItem -Path dist -Filter "deepagent-code-desktop-win-*.exe" -File
$x64 = $installers | Where-Object { $_.Name -eq "deepagent-code-desktop-win-x64.exe" }
$arm64 = $installers | Where-Object { $_.Name -eq "deepagent-code-desktop-win-arm64.exe" }
if (-not $x64 -or -not $arm64) {
Write-Error "NSIS installers missing: expected win-x64 and win-arm64, found: $($installers.Name -join ', ')"
exit 1
}
if ($env:HAS_TRUSTED_SIGNING -eq "true") {
foreach ($installer in @($x64, $arm64)) {
$signature = Get-AuthenticodeSignature -FilePath $installer.FullName
if ($signature.Status -ne "Valid") {
Write-Error "$($installer.Name) signature status '$($signature.Status)': $($signature.StatusMessage)"
exit 1
}
Write-Host "$($installer.Name) signed by $($signature.SignerCertificate.Subject)"
}
} else {
Write-Host "Trusted Signing not configured; asserting installer presence only"
}

- name: Smoke test packaged macOS app
if: matrix.group == 'mac'
working-directory: packages/desktop
Expand All @@ -150,18 +230,21 @@ jobs:
test -n "$executable"
DEEPAGENT_CODE_DESKTOP_EXECUTABLE="$executable" bun run test:subagents-cold-start

# W9.3: first real Windows run of the local-first + WSL-fallback routing.
# Launches the packaged app and asserts GET /global/health with Basic auth
# (the desktop sidecar always configures a password, so the typed API route
# answers 401 to a credential-less curl — the auth'd fetch proves the full
# sidecar bootstrap path, not just a listening port).
# W9.3: first real Windows run of the native-only sidecar routing (local
# spawn, no platform fallback). Launches the packaged app and asserts
# GET /global/health with Basic auth (the desktop sidecar always
# configures a password, so the typed API route answers 401 to a
# credential-less curl — the auth'd fetch proves the full sidecar
# bootstrap path, not just a listening port).
- name: Smoke test packaged Windows sidecar health
if: matrix.group == 'win'
working-directory: packages/desktop
shell: pwsh
run: |
# Wildcard matches both prod ("DeepAgent Code.exe") and beta
# ("DeepAgent Code Beta.exe") artifact names so the beta build
# win-unpacked holds the x64 app (the arch the x64 runner can execute;
# arm64 lands in win-arm64-unpacked and is covered by the installer
# assertion above). Wildcard matches both prod ("DeepAgent Code.exe")
# and beta ("DeepAgent Code Beta.exe") artifact names so the beta build
# cannot silently fail this smoke because of an exact name filter.
$exe = Get-ChildItem -Path "dist/win-unpacked" -Filter "*DeepAgent Code*.exe" -Recurse -File | Select-Object -First 1
if (-not $exe) {
Expand Down
23 changes: 23 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,29 @@ jobs:
- name: Run test fixture gate
run: bun script/check-test-fixtures.ts

manifest-digest-gate:
name: manifest-digest-gate
# K-05/B-11: the C7-10 deterministic manifest must reproduce from the committed
# tree on any machine — byte-stable across runs, pinned to head-pin.ts, every
# digest input git-tracked, and git-ignored .artifacts/ residue unable to
# perturb the digest. Pure stateless gate, mirrors the test-fixture-gate pattern.
runs-on: blacksmith-4vcpu-ubuntu-2404
defaults:
run:
shell: bash
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
token: ${{ secrets.GITHUB_TOKEN }}

- name: Setup Bun
uses: ./.github/actions/setup-bun

- name: Run manifest digest reproducibility gate
working-directory: packages/core
run: bun run manifest:assert-reproducible

unit:
name: unit (${{ matrix.settings.name }})
strategy:
Expand Down
16 changes: 15 additions & 1 deletion .github/workflows/typecheck.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,21 @@ on:

jobs:
typecheck:
runs-on: blacksmith-4vcpu-ubuntu-2404
# W-01 §2.2.6: typecheck the Windows surface too — the win32 branches added
# by the native Windows work (shell dialect layer, data-directory split,
# registry env import, DPAPI, NSIS) must stay type-clean on the OS they
# target, and path/name casing errors only surface on a case-preserving
# filesystem.
name: typecheck (${{ matrix.settings.name }})
strategy:
fail-fast: false
matrix:
settings:
- name: linux
host: blacksmith-4vcpu-ubuntu-2404
- name: windows
host: blacksmith-4vcpu-windows-2025
runs-on: ${{ matrix.settings.host }}
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ logs/
tsconfig.tsbuildinfo
/packages/*/.artifacts/
/script/live-llm.config.local.json
/script/live-llm.config.local.*.json
.tmp/
kimi-export-*.md

# Internal design and release artifacts are local-only. Stable public documentation belongs in
# README files, language documentation, or the reviewed design/ tree.
Expand Down
35 changes: 35 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,41 @@

This changelog contains public, user-facing product changes. Internal incident identifiers, local paths, private environment topology, test credentials, release-gate evidence, and operational measurements are intentionally excluded.

## Core 2.0.1 / Desktop 2.0.1

Release labels: `core-v2.0.1` and `desktop-v2.0.1` (`2.0.1`).

### Windows native support

- Native Windows is now a first-class platform: data, caches and worktrees live under `%LOCALAPPDATA%`, config and credentials roam under `%APPDATA%`, and a one-time migration moves the legacy unified home on first start.
- Shell validation understands PowerShell semantics: commands run through a pwsh → powershell → cmd resolution chain, POSIX scripts resolve through Git Bash when present, and unrepresentable commands fail with typed guidance instead of a blanket platform refusal.
- The Windows desktop installer is a guided NSIS setup that adds the app to the user PATH (no system changes), and the desktop imports user/system environment variables from the registry at startup. The WSL requirement is removed across app, docs and packaging.
- Secrets on Windows are stored through DPAPI-backed encryption instead of plaintext fallbacks.

### Session migration and backup tooling

- Full-transcript Markdown export for every session, with a resumable batch exporter and a per-run content manifest.
- A guided V1→V2 migration flow: staged phases with progress in the maintenance shell, verified backups, a post-migration compliance report, backup retention governance, and an explicitly confirmed disk-reclaim step that never touches incident copies.

### Providers and models

- Custom config-defined providers now run on the V2 runtime end to end; undeclared pricing and limits surface as honestly unavailable instead of zero.
- Fixed custom providers being unresolvable in V2 sessions (origin-tracked catalog entries).

### Subagents and recovery

- Subagent permission inheritance keeps a restrictive parent from silently stripping child agents of every tool.
- Task fan-out accounting survives restarts; worktrees left by timed-out runs are reclaimed after a grace period while recovery-required runs are never touched.
- Provider recovery exposes one command surface across legacy and V2 receipts, including an evidence-bound confirm-settled exit; sessions blocked from redrive surface with explicit reasons.

### Fixes

- Tool result metadata (exit codes, truncation markers, output paths) is visible again on projected sessions.
- Bash results always end with a canonical `exit code: N` trailer; registry environment expansion cannot crash startup on circular values.
- Structured-output evidence from subagents is bound to the answer message as designed.
- Updated dependencies covering 14 published advisories (including a critical template RCE).
- `deepagent export --format md` writes a titled Markdown transcript next to the session.

## Core 2.0 / Desktop 2.0

Release labels: `core-v2.0` and `desktop-v2.0` (`2.0.0`).
Expand Down
Loading
Loading