Ctrl K
ComunidadGuías…

tests/support/schema-compatibility-guidance.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import assert from "node:assert/strict";
import type { SupabaseClient } from "@supabase/supabase-js";
import {
  deliverRunGuidance,
  loadRunGuidance,
  submitSlackRunGuidance,
} from "@/lib/slack/run-guidance-store";

// Copied into the archived release beside the contract. Slack thread guidance
// written by retained releases keeps working after the inbox gains workspace
// rows with no Slack thread.
const BEFORE_USER = "00000000-0000-4000-8000-000000000001";

const SLACK_THREAD = {
  teamId: "T-compat",
  channelId: "D-compat",
  threadTs: "1.2",
  slackUserId: "U-compat",
};

function slackGuidanceInput(
  userId: string,
  runId: string,
  aiCallId: string,
  phase: "seed" | "verify"
) {
  return {
    ...SLACK_THREAD,
    userId,
    runId,
    aiCallId,
    eventId: `Ev-compat-${phase}`,
    messageTs: "1.3",
    body: "Keep the desktop header unchanged.",
    attachments: null,
  };
}

// Retained releases accept Slack thread guidance through the old inbox RPC.
export async function seedSlackGuidance(
  client: SupabaseClient,
  userId: string,
  repoId: string,
  phase: "seed" | "verify"
) {
  const call = await client
    .from("ai_calls")
    .insert({
      user_id: userId,
      type: "agent",
      model: "harness:mogplex",
      status: "streaming",
      metadata: { compatibility: "slack-guidance" },
    })
    .select("id")
    .single();
  assert.equal(call.error, null, JSON.stringify(call.error));
  const aiCallId = (call.data as { id: string }).id;
  const run = await client
    .from("external_agent_runs")
    .insert({
      user_id: userId,
      repo_id: repoId,
      ai_call_id: aiCallId,
      idempotency_key: `compatibility-guidance-${phase}`,
      request_hash: "fixture",
      harness: "mogplex",
      status: "streaming",
      prompt: "Slack-thread request",
      base_branch: "main",
      working_branch: "fix/guidance-fixture",
      metadata: {
        slack_guidance_enabled: true,
        slack_user_id: SLACK_THREAD.slackUserId,
        slack_thread_ts: SLACK_THREAD.threadTs,
        slackRunControls: {
          teamId: SLACK_THREAD.teamId,
          channelId: SLACK_THREAD.channelId,
          messageTs: SLACK_THREAD.threadTs,
        },
      },
    })
    .select("id")
    .single();
  assert.equal(run.error, null, JSON.stringify(run.error));
  const runId = (run.data as { id: string }).id;
  const receipt = await submitSlackRunGuidance(
    slackGuidanceInput(userId, runId, aiCallId, phase),
    client
  );
  assert.equal(receipt?.status, "received");
}

export async function verifySlackGuidance(client: SupabaseClient) {
  const run = await client
    .from("external_agent_runs")
    .select("id,ai_call_id")
    .eq("user_id", BEFORE_USER)
    .eq("idempotency_key", "compatibility-guidance-seed")
    .single();
  assert.equal(run.error, null, JSON.stringify(run.error));
  const { id: runId, ai_call_id: aiCallId } = run.data as {
    id: string;
    ai_call_id: string;
  };
  const owned = { id: runId, user_id: BEFORE_USER, ai_call_id: aiCallId };
  const [saved] = await loadRunGuidance(owned, client);
  assert.deepEqual(
    { body: saved?.body, status: saved?.status },
    { body: "Keep the desktop header unchanged.", status: "received" }
  );
  // A Slack webhook retry after the migration still resolves to the same row.
  const retried = await submitSlackRunGuidance(
    slackGuidanceInput(BEFORE_USER, runId, aiCallId, "seed"),
    client
  );
  assert.deepEqual(retried, { id: saved.id, status: "received" });
  const delivered = await deliverRunGuidance(
    { runId, userId: BEFORE_USER, aiCallId, ids: [saved.id], step: 1 },
    client
  );
  assert.equal(delivered, 1);
}