move pi-mono into companion-cloud as apps/companion-os

- Copy all pi-mono source into apps/companion-os/
- Update Dockerfile to COPY pre-built binary instead of downloading from GitHub Releases
- Update deploy-staging.yml to build pi from source (bun compile) before Docker build
- Add apps/companion-os/** to path triggers
- No more cross-repo dispatch needed

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Harivansh Rathi 2026-03-07 09:22:50 -08:00
commit 0250f72976
579 changed files with 206942 additions and 0 deletions

View file

@ -0,0 +1,56 @@
import { describe, expect, it } from "vitest";
import {
isThinkingPart,
retainThoughtSignature,
} from "../src/providers/google-shared.js";
describe("Google thinking detection (thoughtSignature)", () => {
it("treats part.thought === true as thinking", () => {
expect(isThinkingPart({ thought: true, thoughtSignature: undefined })).toBe(
true,
);
expect(
isThinkingPart({ thought: true, thoughtSignature: "opaque-signature" }),
).toBe(true);
});
it("does not treat thoughtSignature alone as thinking", () => {
// Per Google docs, thoughtSignature is for context replay and can appear on any part type.
// Only thought === true indicates thinking content.
// See: https://ai.google.dev/gemini-api/docs/thought-signatures
expect(
isThinkingPart({
thought: undefined,
thoughtSignature: "opaque-signature",
}),
).toBe(false);
expect(
isThinkingPart({ thought: false, thoughtSignature: "opaque-signature" }),
).toBe(false);
});
it("does not treat empty/missing signatures as thinking if thought is not set", () => {
expect(
isThinkingPart({ thought: undefined, thoughtSignature: undefined }),
).toBe(false);
expect(isThinkingPart({ thought: false, thoughtSignature: "" })).toBe(
false,
);
});
it("preserves the existing signature when subsequent deltas omit thoughtSignature", () => {
const first = retainThoughtSignature(undefined, "sig-1");
expect(first).toBe("sig-1");
const second = retainThoughtSignature(first, undefined);
expect(second).toBe("sig-1");
const third = retainThoughtSignature(second, "");
expect(third).toBe("sig-1");
});
it("updates the signature when a new non-empty signature arrives", () => {
const updated = retainThoughtSignature("sig-1", "sig-2");
expect(updated).toBe("sig-2");
});
});