Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ body:
id: version
attributes:
label: T4 Code version
placeholder: "0.1.28"
placeholder: "0.1.29"
validations:
required: true
- type: dropdown
Expand Down
36 changes: 18 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,31 @@ T4 Code is a free, open-source (MIT) desktop app for [Oh My Pi](https://github.c

![T4 Code main window](docs/assets/t4-code-main.png)

[**Download v0.1.28**](https://github.com/LycaonLLC/t4-code/releases/tag/v0.1.28) · [**Docs**](https://t4code.net/docs) · [**Get the source**](#build-from-source)
[**Download v0.1.29**](https://github.com/LycaonLLC/t4-code/releases/tag/v0.1.29) · [**Docs**](https://t4code.net/docs) · [**Get the source**](#build-from-source)

## Requirements

T4 Code needs an OMP build with desktop appserver support. For v0.1.28, use the public integration build below.
T4 Code needs an OMP build with desktop appserver support. For v0.1.29, use the public integration build below.

T4 Code v0.1.28 was verified with OMP 17.0.5 built from [`25295f6f`](https://github.com/lyc-aon/oh-my-pi/commit/25295f6f2e03033cb545c513f476e7e51532524c), tagged [`t4code-17.0.5-appserver-6`](https://github.com/lyc-aon/oh-my-pi/tree/t4code-17.0.5-appserver-6). That public integration is based on the official upstream [`v17.0.5`](https://github.com/can1357/oh-my-pi/tree/v17.0.5) tag at [`9fd6e971`](https://github.com/can1357/oh-my-pi/commit/9fd6e97113f5ed3a847e66d346970efdf8afcad9). It opens its socket before indexing session history, reads small previews for the session list, and loads a complete transcript only when that session is first used. It also includes cross-session attention and transcript search, the negotiated browser-preview command surface, redacted Codex transport diagnostics, the versioned Agent View lifecycle contract, session-owned cancellation, lock-aware session observation, complete transcript reconciliation, the cooperative `/continue-in-t4` handoff, and deterministic session ordering. Fork CI verifies the exact upstream base, ancestry, release gates, and published binaries. The official upstream v17.0.5 tag has no `appserver` command, so it cannot host T4 Code. The verified runtime is a normal build from the public `lyc-aon/oh-my-pi` source. T4 Code vendors `@oh-my-pi/app-wire` 0.6.1 from integration commit [`e3e15c03`](https://github.com/lyc-aon/oh-my-pi/commit/e3e15c03ae95ebbda5f26495cd21213cc53518b1), source tree `e0f32b279eb4b8cbc403e47d765a226bee99c99f`.
T4 Code v0.1.29 was verified with OMP 17.0.5 built from [`04229b1f`](https://github.com/lyc-aon/oh-my-pi/commit/04229b1f46547ac7c0617e55a993496ec9725f46), tagged [`t4code-17.0.5-appserver-7`](https://github.com/lyc-aon/oh-my-pi/tree/t4code-17.0.5-appserver-7). That public integration is based on the official upstream [`v17.0.5`](https://github.com/can1357/oh-my-pi/tree/v17.0.5) tag at [`9fd6e971`](https://github.com/can1357/oh-my-pi/commit/9fd6e97113f5ed3a847e66d346970efdf8afcad9). It adds a privacy-safe command that lets the desktop app reveal a known local project folder without exposing arbitrary paths. It also includes fast lazy session indexing, cross-session attention and transcript search, the negotiated browser-preview command surface, redacted Codex transport diagnostics, the versioned Agent View lifecycle contract, session-owned cancellation, lock-aware session observation, complete transcript reconciliation, the cooperative `/continue-in-t4` handoff, and deterministic session ordering. Fork CI verifies the exact upstream base, ancestry, release gates, and published binaries. The official upstream v17.0.5 tag has no `appserver` command, so it cannot host T4 Code. The verified runtime is a normal build from the public `lyc-aon/oh-my-pi` source. T4 Code vendors `@oh-my-pi/app-wire` 0.6.2 from integration commit [`04229b1f`](https://github.com/lyc-aon/oh-my-pi/commit/04229b1f46547ac7c0617e55a993496ec9725f46), source tree `8400a3af618e8af11cccf6b20aadcf3a22baf9a1`.

The current source tree advances the vendored contract to `@oh-my-pi/app-wire` 0.6.1 from integration commit [`e3e15c03`](https://github.com/lyc-aon/oh-my-pi/commit/e3e15c03ae95ebbda5f26495cd21213cc53518b1), source tree `e0f32b279eb4b8cbc403e47d765a226bee99c99f`. It supplies bounded cross-session transcript search, historical context, and the browser-preview wire contract.
The current source tree uses the same published `@oh-my-pi/app-wire` 0.6.2 contract. It supplies privacy-safe local project reveal, bounded cross-session transcript search, historical context, and the browser-preview wire contract.

| Platform | Arch | Package |
| -------- | --------------------- | ----------------------------------------- |
| Android | arm64, armv7, x86_64 | `.apk` (**signed**) |
| Linux | x86_64 | `.deb`, AppImage |
| macOS | Apple Silicon (arm64) | `.dmg`, `.zip` (**signed and notarized**) |

No Windows build and no Intel Mac build in v0.1.28. The iOS TestFlight build is coming soon.
No Windows build and no Intel Mac build in v0.1.29. The iOS TestFlight build is coming soon.

## What changed in v0.1.28
## What changed in v0.1.29

- Large session libraries no longer block backend startup. On the measured 831-session Mac profile, initial indexing fell from 59.2 seconds to 4.0 seconds; full transcripts still load when opened.
- The signed Mac app automatically installs the exact backend build recorded in its compatibility matrix, so users do not need a separate developer install.
- Phone access configured through the QR flow now restores itself whenever the desktop app launches, including after a reboot or gateway restart.
- The public site includes a no-install browser demo with fixture sessions, panes, agent views, and browser previews, so people can explore T4 Code before downloading it.
- The left rail has clearer information grouping and larger touch targets while keeping the existing layout and shortcuts.
- The session rail now matches the Codex desktop organization model: search, activity filters, sort controls, collapsible projects, flat and grouped views, and persistent preferences.
- Project menus can create sessions, open folders in the system file manager, collapse a group, or hide it from the rail. Hidden projects remain recoverable through the filter menu.
- The whole workspace received a visual polish pass, with denser information hierarchy, clearer transcript rows, and empty panes that keep their header and close control visible.
- macOS upgrades retry temporary service-stop failures instead of leaving the bundled backend half-updated.
- OMP app-wire 0.6.2 adds the narrow host command used to reveal only a project path already known to the session catalog.

![An OMP TUI session followed in T4 Code: the transcript fills in read-only under an "Active in another app" banner, /continue-in-t4 runs in the terminal, T4 takes over, and the composer accepts input again.](docs/assets/t4-code-tui-handoff.gif)

Expand All @@ -46,7 +46,7 @@ No Windows build and no Intel Mac build in v0.1.28. The iOS TestFlight build is
### Android

1. On the Android phone, sign in to Tailscale with an account that can reach the T4 Code host.
2. Download [`T4-Code-0.1.28-android.apk`](https://github.com/LycaonLLC/t4-code/releases/download/v0.1.28/T4-Code-0.1.28-android.apk).
2. Download [`T4-Code-0.1.29-android.apk`](https://github.com/LycaonLLC/t4-code/releases/download/v0.1.29/T4-Code-0.1.29-android.apk).
3. If Android asks, allow your browser or file manager to install unknown apps, then install the APK.
4. Open T4 Code and enter the host's HTTPS Tailscale address, including its port. The app saves the address; you can add more hosts later and switch between them.

Expand All @@ -55,23 +55,23 @@ The APK does not contain an appserver or expose one to the public internet. It c
### Linux (Debian/Ubuntu)

```sh
wget https://github.com/LycaonLLC/t4-code/releases/download/v0.1.28/T4-Code-0.1.28-linux-amd64.deb
sudo apt install ./T4-Code-0.1.28-linux-amd64.deb
wget https://github.com/LycaonLLC/t4-code/releases/download/v0.1.29/T4-Code-0.1.29-linux-amd64.deb
sudo apt install ./T4-Code-0.1.29-linux-amd64.deb
```

Use `apt install` rather than `dpkg -i` so system dependencies resolve automatically.

### Linux (AppImage)

```sh
wget https://github.com/LycaonLLC/t4-code/releases/download/v0.1.28/T4-Code-0.1.28-linux-x86_64.AppImage
chmod +x T4-Code-0.1.28-linux-x86_64.AppImage
./T4-Code-0.1.28-linux-x86_64.AppImage
wget https://github.com/LycaonLLC/t4-code/releases/download/v0.1.29/T4-Code-0.1.29-linux-x86_64.AppImage
chmod +x T4-Code-0.1.29-linux-x86_64.AppImage
./T4-Code-0.1.29-linux-x86_64.AppImage
```

### macOS (Apple Silicon)

1. Download [`T4-Code-0.1.28-mac-arm64.dmg`](https://github.com/LycaonLLC/t4-code/releases/download/v0.1.28/T4-Code-0.1.28-mac-arm64.dmg) (or [`T4-Code-0.1.28-mac-arm64.zip`](https://github.com/LycaonLLC/t4-code/releases/download/v0.1.28/T4-Code-0.1.28-mac-arm64.zip)).
1. Download [`T4-Code-0.1.29-mac-arm64.dmg`](https://github.com/LycaonLLC/t4-code/releases/download/v0.1.29/T4-Code-0.1.29-mac-arm64.dmg) (or [`T4-Code-0.1.29-mac-arm64.zip`](https://github.com/LycaonLLC/t4-code/releases/download/v0.1.29/T4-Code-0.1.29-mac-arm64.zip)).
2. Drag `T4 Code.app` into `/Applications`.
3. Open T4 Code normally. The release workflow verifies the pinned publisher, hardened runtime, secure timestamp, Apple notarization, stapled ticket, and Gatekeeper acceptance before publication.

Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,5 @@ We read every report and will reply to tell you what happens next. This is a sma

- T4 Code is a desktop client. The OMP runtime is a separate project; runtime vulnerabilities belong at <https://github.com/can1357/oh-my-pi>.
- Pairing credentials are encrypted with the OS keychain via Electron `safeStorage`. Reports about credential handling, the pairing flow, or the `t4-code://` deep-link handler are especially welcome.
- The macOS v0.1.28 build is signed with Apple Developer ID and notarized by Apple. Reports of certificate, Team ID, hardened-runtime, timestamp, Gatekeeper, or stapled-ticket drift are security-relevant.
- The macOS v0.1.29 build is signed with Apple Developer ID and notarized by Apple. Reports of certificate, Team ID, hardened-runtime, timestamp, Gatekeeper, or stapled-ticket drift are security-relevant.
- Starting with v0.1.24, the release workflow requires the pinned Developer ID identity, hardened runtime, Apple notarization, a stapled ticket, and a successful Gatekeeper assessment before publishing macOS artifacts.
2 changes: 1 addition & 1 deletion apps/desktop/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@t4-code/desktop",
"version": "0.1.28",
"version": "0.1.29",
"private": true,
"type": "module",
"main": "dist-electron/main.cjs",
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/target-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ export class DesktopTargetManager {
capabilities: requestedCapabilities,
requestedFeatures: REQUESTED_FEATURES,
compatibilityRequestedFeatures: COMPATIBILITY_FEATURES,
client: { name: "T4 Code", version: "0.1.28", build: "desktop", platform: process.platform },
client: { name: "T4 Code", version: "0.1.29", build: "desktop", platform: process.platform },
reconnect: { baseMs: 250, maxMs: 10_000 },
};
const client = createOmpClient(clientOptions);
Expand Down
2 changes: 1 addition & 1 deletion apps/mobile/capacitor.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"appName": "T4 Code",
"webDir": "dist",
"loggingBehavior": "debug",
"appendUserAgent": " T4CodeMobile/0.1.28",
"appendUserAgent": " T4CodeMobile/0.1.29",
"android": {
"path": "android",
"minWebViewVersion": 60,
Expand Down
2 changes: 1 addition & 1 deletion apps/mobile/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@t4-code/mobile",
"version": "0.1.28",
"version": "0.1.29",
"private": true,
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion apps/site/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@t4-code/site",
"version": "0.1.28",
"version": "0.1.29",
"private": true,
"type": "module",
"scripts": {
Expand Down
20 changes: 10 additions & 10 deletions apps/site/src/release.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ export const DOCS_URL = `${SITE_URL}/docs`;
export const REPO_URL = "https://github.com/LycaonLLC/t4-code";
export const OMP_URL = "https://github.com/can1357/oh-my-pi";
export const OMP_RUNTIME_VERSION = "17.0.5";
export const OMP_RUNTIME_COMMIT = "25295f6f2e03033cb545c513f476e7e51532524c";
export const OMP_RUNTIME_TAG = "t4code-17.0.5-appserver-6";
export const OMP_RUNTIME_COMMIT = "04229b1f46547ac7c0617e55a993496ec9725f46";
export const OMP_RUNTIME_TAG = "t4code-17.0.5-appserver-7";
export const OMP_RUNTIME_URL = `https://github.com/lyc-aon/oh-my-pi/tree/${OMP_RUNTIME_TAG}`;
export const OMP_UPSTREAM_TAG = "v17.0.5";
export const OMP_UPSTREAM_COMMIT = "9fd6e97113f5ed3a847e66d346970efdf8afcad9";
export const OMP_UPSTREAM_URL = `${OMP_URL}/tree/${OMP_UPSTREAM_TAG}`;
export const APP_WIRE_VERSION = "0.6.1";
export const RELEASE_TAG = "v0.1.28";
export const RELEASE_VERSION = "0.1.28";
export const APP_WIRE_VERSION = "0.6.2";
export const RELEASE_TAG = "v0.1.29";
export const RELEASE_VERSION = "0.1.29";
export const RELEASES_URL = `${REPO_URL}/releases/tag/${RELEASE_TAG}`;
export const RELEASE_MANIFEST_URL = `${SITE_URL}/releases/latest.json`;

Expand Down Expand Up @@ -49,11 +49,11 @@ function asset(
}

export const RELEASE_ASSETS: readonly ReleaseAsset[] = [
asset("android", "apk", "universal", "T4-Code-0.1.28-android.apk", "Android APK"),
asset("linux", "deb", "x86_64", "T4-Code-0.1.28-linux-amd64.deb", "Linux .deb"),
asset("linux", "appimage", "x86_64", "T4-Code-0.1.28-linux-x86_64.AppImage", "Linux AppImage"),
asset("mac", "dmg", "arm64", "T4-Code-0.1.28-mac-arm64.dmg", "macOS .dmg"),
asset("mac", "zip", "arm64", "T4-Code-0.1.28-mac-arm64.zip", "macOS .zip"),
asset("android", "apk", "universal", "T4-Code-0.1.29-android.apk", "Android APK"),
asset("linux", "deb", "x86_64", "T4-Code-0.1.29-linux-amd64.deb", "Linux .deb"),
asset("linux", "appimage", "x86_64", "T4-Code-0.1.29-linux-x86_64.AppImage", "Linux AppImage"),
asset("mac", "dmg", "arm64", "T4-Code-0.1.29-mac-arm64.dmg", "macOS .dmg"),
asset("mac", "zip", "arm64", "T4-Code-0.1.29-mac-arm64.zip", "macOS .zip"),
];

export function assetsFor(platform: Platform): readonly ReleaseAsset[] {
Expand Down
26 changes: 13 additions & 13 deletions apps/site/test/release.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Release contract guard: exact v0.1.28 asset names and URLs, and the
// Release contract guard: exact v0.1.29 asset names and URLs, and the
// platform-detection rule the hero download button relies on.
import { describe, expect, it } from "vite-plus/test";
import {
Expand All @@ -20,13 +20,13 @@ import {
} from "../src/release.ts";

describe("release assets", () => {
it("carries the five contracted v0.1.28 filenames", () => {
it("carries the five contracted v0.1.29 filenames", () => {
expect(RELEASE_ASSETS.map((a) => a.filename)).toEqual([
"T4-Code-0.1.28-android.apk",
"T4-Code-0.1.28-linux-amd64.deb",
"T4-Code-0.1.28-linux-x86_64.AppImage",
"T4-Code-0.1.28-mac-arm64.dmg",
"T4-Code-0.1.28-mac-arm64.zip",
"T4-Code-0.1.29-android.apk",
"T4-Code-0.1.29-linux-amd64.deb",
"T4-Code-0.1.29-linux-x86_64.AppImage",
"T4-Code-0.1.29-mac-arm64.dmg",
"T4-Code-0.1.29-mac-arm64.zip",
]);
});

Expand All @@ -38,8 +38,8 @@ describe("release assets", () => {

it("targets the public LycaonLLC repo", () => {
expect(REPO_URL).toBe("https://github.com/LycaonLLC/t4-code");
expect(RELEASE_TAG).toBe("v0.1.28");
expect(RELEASE_VERSION).toBe("0.1.28");
expect(RELEASE_TAG).toBe("v0.1.29");
expect(RELEASE_VERSION).toBe("0.1.29");
expect(RELEASE_MANIFEST_URL).toBe("https://t4code.net/releases/latest.json");
});

Expand All @@ -61,15 +61,15 @@ describe("release assets", () => {

describe("OMP integration contract", () => {
it("pins the verified runtime tag, commit, and app-wire package", () => {
expect(OMP_RUNTIME_TAG).toBe("t4code-17.0.5-appserver-6");
expect(OMP_RUNTIME_COMMIT).toBe("25295f6f2e03033cb545c513f476e7e51532524c");
expect(OMP_RUNTIME_TAG).toBe("t4code-17.0.5-appserver-7");
expect(OMP_RUNTIME_COMMIT).toBe("04229b1f46547ac7c0617e55a993496ec9725f46");
expect(OMP_RUNTIME_URL).toBe(
"https://github.com/lyc-aon/oh-my-pi/tree/t4code-17.0.5-appserver-6",
"https://github.com/lyc-aon/oh-my-pi/tree/t4code-17.0.5-appserver-7",
);
expect(OMP_UPSTREAM_TAG).toBe("v17.0.5");
expect(OMP_UPSTREAM_COMMIT).toBe("9fd6e97113f5ed3a847e66d346970efdf8afcad9");
expect(OMP_UPSTREAM_URL).toBe("https://github.com/can1357/oh-my-pi/tree/v17.0.5");
expect(APP_WIRE_VERSION).toBe("0.6.1");
expect(APP_WIRE_VERSION).toBe("0.6.2");
});
});

Expand Down
2 changes: 1 addition & 1 deletion apps/web/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@t4-code/web",
"version": "0.1.28",
"version": "0.1.29",
"private": true,
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/platform/browser-shell-port.ts
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ export function createBrowserShellPort(
},
client: {
name: "T4 Code",
version: "0.1.28",
version: "0.1.29",
build: mobilePlatform ?? "browser",
platform: mobilePlatform ?? (platform === "darwin" ? "darwin" : "linux"),
},
Expand Down
19 changes: 10 additions & 9 deletions compat/omp-app-matrix.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,23 +12,23 @@
},
"publishedAppWire": {
"package": "@oh-my-pi/app-wire",
"version": "0.6.1",
"version": "0.6.2",
"sourceRepository": "https://github.com/lyc-aon/oh-my-pi",
"sourceCommit": "e3e15c03ae95ebbda5f26495cd21213cc53518b1",
"sourceTreeHash": "e0f32b279eb4b8cbc403e47d765a226bee99c99f"
"sourceCommit": "04229b1f46547ac7c0617e55a993496ec9725f46",
"sourceTreeHash": "8400a3af618e8af11cccf6b20aadcf3a22baf9a1"
},
"publishedRuntime": {
"package": "omp",
"version": "17.0.5",
"sourceRepository": "https://github.com/lyc-aon/oh-my-pi",
"sourceCommit": "25295f6f2e03033cb545c513f476e7e51532524c",
"sourceUrl": "https://github.com/lyc-aon/oh-my-pi/commit/25295f6f2e03033cb545c513f476e7e51532524c",
"sourceTag": "t4code-17.0.5-appserver-6",
"sourceCommit": "04229b1f46547ac7c0617e55a993496ec9725f46",
"sourceUrl": "https://github.com/lyc-aon/oh-my-pi/commit/04229b1f46547ac7c0617e55a993496ec9725f46",
"sourceTag": "t4code-17.0.5-appserver-7",
"artifacts": {
"darwin-arm64": {
"name": "omp-darwin-arm64",
"size": 120777424,
"sha256": "0ab83485470562edbad3f7d828f31c6ce8ac6c19e28767d66a74e1a7b8d46877"
"sha256": "b57dd2c77bc7727a66df5bce8419e071300643d2a04fcba878e1b41cb0298fc0"
}
},
"upstreamRepository": "https://github.com/can1357/oh-my-pi",
Expand Down Expand Up @@ -95,7 +95,8 @@
"lazy-session-transcript-indexing",
"browser-preview-contract",
"hardened-preview-frame-decoding",
"complete-preview-command-surface"
"complete-preview-command-surface",
"privacy-safe-local-project-reveal"
],
"upstreamTagContainsIntegrationPatches": false
},
Expand Down Expand Up @@ -184,6 +185,6 @@
},
"desktop": {
"package": "@t4-code/protocol",
"version": "0.1.28"
"version": "0.1.29"
}
}
Loading
Loading