File size: 2,804 Bytes
39b3fb5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
const api = window.kitty;

const meshKind = document.querySelector("#mesh-kind");
const contextCount = document.querySelector("#context-count");
const taskCount = document.querySelector("#task-count");
const contexts = document.querySelector("#contexts");
const results = document.querySelector("#results");

let currentContextId = null;

function renderSnapshot(snapshot) {
  meshKind.textContent = snapshot.mesh;
  contextCount.textContent = String(snapshot.contexts.length);
  taskCount.textContent = String(snapshot.results.length);

  currentContextId = currentContextId ?? snapshot.contexts[0]?.id ?? null;

  contexts.replaceChildren(
    ...snapshot.contexts.map((context) => {
      const node = document.createElement("div");
      node.className = "item";
      node.innerHTML = `

        <strong>${context.label}</strong>

        <div class="subtle">${context.id}</div>

        <div>URL: ${context.url}</div>

        <div>VM: ${context.vmTarget} / IDE: ${context.ideTarget}</div>

        <div>Entropy: ${context.entropy}</div>

      `;
      node.addEventListener("click", () => {
        currentContextId = context.id;
      });
      return node;
    }),
  );

  results.replaceChildren(
    ...snapshot.results.map((result) => {
      const node = document.createElement("div");
      node.className = "item";
      node.innerHTML = `

        <strong class="status-${result.status}">${result.status}: ${result.id}</strong>

        <div>${result.message}</div>

        <div class="subtle">Entropy ${result.entropy}</div>

      `;
      return node;
    }),
  );
}

async function refresh() {
  const snapshot = await api.snapshot();
  renderSnapshot(snapshot);
}

document.querySelector("#new-context").addEventListener("click", async () => {
  const context = await api.createContext({
    label: `Agent Context ${Date.now().toString().slice(-4)}`,
    url: "kitty://task",
    vmTarget: document.querySelector("#vm-target").value,
    ideTarget: document.querySelector("#ide-target").value,
  });
  currentContextId = context.id;
  await refresh();
});

document.querySelector("#run-task").addEventListener("click", async () => {
  await api.submitTask({
    contextId: currentContextId,
    command: document.querySelector("#command").value,
    payload: { source: "renderer", pointer: "kitty://task" },
    dependencies: [],
    failRate: Number(document.querySelector("#fail-rate").value),
    latencyMs: Number(document.querySelector("#latency").value),
    vmTarget: document.querySelector("#vm-target").value,
    ideTarget: document.querySelector("#ide-target").value,
  });
  await new Promise((resolve) => setTimeout(resolve, 50));
  await refresh();
});

refresh();
setInterval(refresh, 1500);