sf-builder-agent 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Heartbeat — periodically pings the server so it knows we're alive.
3
+ * Uses /api/agent/heartbeat (flat route, not behind Easy Auth).
3
4
  */
4
- export declare function startHeartbeat(baseUrl: string, sessionId: string, token: string, intervalMs?: number): {
5
+ export declare function startHeartbeat(baseUrl: string, _sessionId: string, token: string, intervalMs?: number): {
5
6
  stop: () => void;
6
7
  };
package/dist/heartbeat.js CHANGED
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * Heartbeat — periodically pings the server so it knows we're alive.
3
+ * Uses /api/agent/heartbeat (flat route, not behind Easy Auth).
3
4
  */
4
- export function startHeartbeat(baseUrl, sessionId, token, intervalMs = 10_000) {
5
+ export function startHeartbeat(baseUrl, _sessionId, token, intervalMs = 10_000) {
5
6
  let timer = null;
6
7
  const tick = async () => {
7
8
  try {
8
- const res = await fetch(`${baseUrl}/api/sessions/${sessionId}/agent/heartbeat`, {
9
+ const res = await fetch(`${baseUrl}/api/agent/heartbeat`, {
9
10
  method: "POST",
10
11
  headers: { Authorization: `Bearer ${token}` },
11
12
  });
@@ -21,7 +22,6 @@ export function startHeartbeat(baseUrl, sessionId, token, intervalMs = 10_000) {
21
22
  }
22
23
  };
23
24
  timer = setInterval(tick, intervalMs);
24
- // Send an initial heartbeat immediately
25
25
  tick();
26
26
  return {
27
27
  stop() {
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,SAAiB,EACjB,KAAa,EACb,UAAU,GAAG,MAAM;IAEnB,IAAI,KAAK,GAA0C,IAAI,CAAC;IAExD,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,OAAO,iBAAiB,SAAS,kBAAkB,EACtD;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;aAC9C,CACF,CAAC;YACF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,yBAAyB,EACzB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEtC,wCAAwC;IACxC,IAAI,EAAE,CAAC;IAEP,OAAO;QACL,IAAI;YACF,IAAI,KAAK,EAAE,CAAC;gBACV,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,UAAkB,EAClB,KAAa,EACb,UAAU,GAAG,MAAM;IAEnB,IAAI,KAAK,GAA0C,IAAI,CAAC;IAExD,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,OAAO,sBAAsB,EAChC;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;aAC9C,CACF,CAAC;YACF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,yBAAyB,EACzB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACtC,IAAI,EAAE,CAAC;IAEP,OAAO;QACL,IAAI;YACF,IAAI,KAAK,EAAE,CAAC;gBACV,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/pairing.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * Pairing — exchange a one-time code for a persistent auth token.
3
+ * Uses /api/agent/pair (flat route, not behind Easy Auth).
3
4
  */
4
5
  export declare function pair(baseUrl: string, sessionId: string, code: string): Promise<{
5
6
  token: string;
package/dist/pairing.js CHANGED
@@ -1,12 +1,13 @@
1
1
  /**
2
2
  * Pairing — exchange a one-time code for a persistent auth token.
3
+ * Uses /api/agent/pair (flat route, not behind Easy Auth).
3
4
  */
4
5
  export async function pair(baseUrl, sessionId, code) {
5
- const url = `${baseUrl}/api/sessions/${sessionId}/agent/pair`;
6
+ const url = `${baseUrl}/api/agent/pair`;
6
7
  const res = await fetch(url, {
7
8
  method: "POST",
8
9
  headers: { "Content-Type": "application/json" },
9
- body: JSON.stringify({ code }),
10
+ body: JSON.stringify({ sessionId, code }),
10
11
  });
11
12
  if (!res.ok) {
12
13
  const body = await res.text().catch(() => "");
@@ -1 +1 @@
1
- {"version":3,"file":"pairing.js","sourceRoot":"","sources":["../src/pairing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAe,EACf,SAAiB,EACjB,IAAY;IAEZ,MAAM,GAAG,GAAG,GAAG,OAAO,iBAAiB,SAAS,aAAa,CAAC;IAE9D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;KAC/B,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,mBAAmB,GAAG,CAAC,MAAM,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAC5D,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA2C,CAAC;IAE1E,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;AACvE,CAAC"}
1
+ {"version":3,"file":"pairing.js","sourceRoot":"","sources":["../src/pairing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAe,EACf,SAAiB,EACjB,IAAY;IAEZ,MAAM,GAAG,GAAG,GAAG,OAAO,iBAAiB,CAAC;IAExC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KAC1C,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,mBAAmB,GAAG,CAAC,MAAM,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAC5D,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA2C,CAAC;IAE1E,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;AACvE,CAAC"}
@@ -1,4 +1,5 @@
1
1
  /**
2
2
  * Reporter — POST command results back to the web app.
3
+ * Uses /api/agent/result (flat route, not behind Easy Auth).
3
4
  */
4
- export declare function reportResult(baseUrl: string, sessionId: string, token: string, commandId: string, status: "success" | "error", result?: Record<string, unknown>): Promise<void>;
5
+ export declare function reportResult(baseUrl: string, _sessionId: string, token: string, commandId: string, status: "success" | "error", result?: Record<string, unknown>): Promise<void>;
package/dist/reporter.js CHANGED
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * Reporter — POST command results back to the web app.
3
+ * Uses /api/agent/result (flat route, not behind Easy Auth).
3
4
  */
4
- export async function reportResult(baseUrl, sessionId, token, commandId, status, result) {
5
- const url = `${baseUrl}/api/sessions/${sessionId}/agent/result`;
5
+ export async function reportResult(baseUrl, _sessionId, token, commandId, status, result) {
6
+ const url = `${baseUrl}/api/agent/result`;
6
7
  try {
7
8
  const res = await fetch(url, {
8
9
  method: "POST",
@@ -1 +1 @@
1
- {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,SAAiB,EACjB,KAAa,EACb,SAAiB,EACjB,MAA2B,EAC3B,MAAgC;IAEhC,MAAM,GAAG,GAAG,GAAG,OAAO,iBAAiB,SAAS,eAAe,CAAC;IAEhE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;SACpD,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,sBAAsB,EACtB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,UAAkB,EAClB,KAAa,EACb,SAAiB,EACjB,MAA2B,EAC3B,MAAgC;IAEhC,MAAM,GAAG,GAAG,GAAG,OAAO,mBAAmB,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;SACpD,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,sBAAsB,EACtB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * SSE client — listens for browser-automation commands from the server.
3
+ * Uses /api/agent/commands (flat route, not behind Easy Auth).
3
4
  */
4
5
  interface IncomingCommand {
5
6
  id: string;
@@ -7,7 +8,7 @@ interface IncomingCommand {
7
8
  stepKey: string | null;
8
9
  payload: Record<string, unknown>;
9
10
  }
10
- export declare function connectSSE(baseUrl: string, sessionId: string, token: string, onCommand: (command: IncomingCommand) => void, onError: (error: Error) => void): {
11
+ export declare function connectSSE(baseUrl: string, _sessionId: string, token: string, onCommand: (command: IncomingCommand) => void, onError: (error: Error) => void): {
11
12
  close: () => void;
12
13
  };
13
14
  export {};
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * SSE client — listens for browser-automation commands from the server.
3
+ * Uses /api/agent/commands (flat route, not behind Easy Auth).
3
4
  */
4
5
  import { EventSource } from "eventsource";
5
- export function connectSSE(baseUrl, sessionId, token, onCommand, onError) {
6
- const url = `${baseUrl}/api/sessions/${sessionId}/agent/commands?token=${encodeURIComponent(token)}`;
6
+ export function connectSSE(baseUrl, _sessionId, token, onCommand, onError) {
7
+ const url = `${baseUrl}/api/agent/commands?token=${encodeURIComponent(token)}`;
7
8
  let es = null;
8
9
  let closed = false;
9
10
  let retryDelay = 1_000;
@@ -16,7 +17,6 @@ export function connectSSE(baseUrl, sessionId, token, onCommand, onError) {
16
17
  try {
17
18
  const data = JSON.parse(evt.data);
18
19
  onCommand(data);
19
- // Reset backoff on successful message
20
20
  retryDelay = 1_000;
21
21
  }
22
22
  catch (err) {
@@ -38,7 +38,6 @@ export function connectSSE(baseUrl, sessionId, token, onCommand, onError) {
38
38
  : "SSE connection error";
39
39
  console.error(`\u274C SSE error: ${message} — reconnecting in ${retryDelay / 1_000}s`);
40
40
  onError(new Error(message));
41
- // Close the broken connection and schedule reconnect
42
41
  es?.close();
43
42
  es = null;
44
43
  setTimeout(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"sse-client.js","sourceRoot":"","sources":["../src/sse-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS1C,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,SAAiB,EACjB,KAAa,EACb,SAA6C,EAC7C,OAA+B;IAE/B,MAAM,GAAG,GAAG,GAAG,OAAO,iBAAiB,SAAS,yBAAyB,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;IAErG,IAAI,EAAE,GAAuB,IAAI,CAAC;IAClC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,SAAS,GAAG,MAAM,CAAC;IAEzB,SAAS,OAAO;QACd,IAAI,MAAM;YAAE,OAAO;QAEnB,EAAE,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;QAE1B,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,GAAiB,EAAE,EAAE;YACnD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAoB,CAAC;gBACrD,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChB,sCAAsC;gBACtC,UAAU,GAAG,KAAK,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CACX,iCAAiC,EACjC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YAC/B,6BAA6B;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,UAAU,GAAG,KAAK,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,OAAO,GAAG,CAAC,GAAU,EAAE,EAAE;YAC1B,IAAI,MAAM;gBAAE,OAAO;YAEnB,MAAM,OAAO,GACX,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,SAAS,IAAI,GAAG;gBAChD,CAAC,CAAE,GAAsC,CAAC,OAAO;gBACjD,CAAC,CAAC,sBAAsB,CAAC;YAE7B,OAAO,CAAC,KAAK,CAAC,qBAAqB,OAAO,uBAAuB,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC;YACxF,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAE5B,qDAAqD;YACrD,EAAE,EAAE,KAAK,EAAE,CAAC;YACZ,EAAE,GAAG,IAAI,CAAC;YAEV,UAAU,CAAC,GAAG,EAAE;gBACd,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;gBACjD,OAAO,EAAE,CAAC;YACZ,CAAC,EAAE,UAAU,CAAC,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;IAEV,OAAO;QACL,KAAK;YACH,MAAM,GAAG,IAAI,CAAC;YACd,EAAE,EAAE,KAAK,EAAE,CAAC;YACZ,EAAE,GAAG,IAAI,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"sse-client.js","sourceRoot":"","sources":["../src/sse-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS1C,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,UAAkB,EAClB,KAAa,EACb,SAA6C,EAC7C,OAA+B;IAE/B,MAAM,GAAG,GAAG,GAAG,OAAO,6BAA6B,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;IAE/E,IAAI,EAAE,GAAuB,IAAI,CAAC;IAClC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,SAAS,GAAG,MAAM,CAAC;IAEzB,SAAS,OAAO;QACd,IAAI,MAAM;YAAE,OAAO;QAEnB,EAAE,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;QAE1B,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,GAAiB,EAAE,EAAE;YACnD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAoB,CAAC;gBACrD,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChB,UAAU,GAAG,KAAK,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CACX,iCAAiC,EACjC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YAC/B,6BAA6B;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,UAAU,GAAG,KAAK,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,OAAO,GAAG,CAAC,GAAU,EAAE,EAAE;YAC1B,IAAI,MAAM;gBAAE,OAAO;YAEnB,MAAM,OAAO,GACX,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,SAAS,IAAI,GAAG;gBAChD,CAAC,CAAE,GAAsC,CAAC,OAAO;gBACjD,CAAC,CAAC,sBAAsB,CAAC;YAE7B,OAAO,CAAC,KAAK,CAAC,qBAAqB,OAAO,uBAAuB,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC;YACxF,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAE5B,EAAE,EAAE,KAAK,EAAE,CAAC;YACZ,EAAE,GAAG,IAAI,CAAC;YAEV,UAAU,CAAC,GAAG,EAAE;gBACd,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;gBACjD,OAAO,EAAE,CAAC;YACZ,CAAC,EAAE,UAAU,CAAC,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;IAEV,OAAO;QACL,KAAK;YACH,MAAM,GAAG,IAAI,CAAC;YACd,EAAE,EAAE,KAAK,EAAE,CAAC;YACZ,EAAE,GAAG,IAAI,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sf-builder-agent",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "Desktop agent for SalesForce Agent Creator — executes browser automation commands",
5
5
  "type": "module",
6
6
  "bin": {
package/src/heartbeat.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * Heartbeat — periodically pings the server so it knows we're alive.
3
+ * Uses /api/agent/heartbeat (flat route, not behind Easy Auth).
3
4
  */
4
5
 
5
6
  export function startHeartbeat(
6
7
  baseUrl: string,
7
- sessionId: string,
8
+ _sessionId: string,
8
9
  token: string,
9
10
  intervalMs = 10_000
10
11
  ): { stop: () => void } {
@@ -13,7 +14,7 @@ export function startHeartbeat(
13
14
  const tick = async () => {
14
15
  try {
15
16
  const res = await fetch(
16
- `${baseUrl}/api/sessions/${sessionId}/agent/heartbeat`,
17
+ `${baseUrl}/api/agent/heartbeat`,
17
18
  {
18
19
  method: "POST",
19
20
  headers: { Authorization: `Bearer ${token}` },
@@ -33,8 +34,6 @@ export function startHeartbeat(
33
34
  };
34
35
 
35
36
  timer = setInterval(tick, intervalMs);
36
-
37
- // Send an initial heartbeat immediately
38
37
  tick();
39
38
 
40
39
  return {
package/src/pairing.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * Pairing — exchange a one-time code for a persistent auth token.
3
+ * Uses /api/agent/pair (flat route, not behind Easy Auth).
3
4
  */
4
5
 
5
6
  export async function pair(
@@ -7,12 +8,12 @@ export async function pair(
7
8
  sessionId: string,
8
9
  code: string
9
10
  ): Promise<{ token: string; sessionId: string }> {
10
- const url = `${baseUrl}/api/sessions/${sessionId}/agent/pair`;
11
+ const url = `${baseUrl}/api/agent/pair`;
11
12
 
12
13
  const res = await fetch(url, {
13
14
  method: "POST",
14
15
  headers: { "Content-Type": "application/json" },
15
- body: JSON.stringify({ code }),
16
+ body: JSON.stringify({ sessionId, code }),
16
17
  });
17
18
 
18
19
  if (!res.ok) {
package/src/reporter.ts CHANGED
@@ -1,16 +1,17 @@
1
1
  /**
2
2
  * Reporter — POST command results back to the web app.
3
+ * Uses /api/agent/result (flat route, not behind Easy Auth).
3
4
  */
4
5
 
5
6
  export async function reportResult(
6
7
  baseUrl: string,
7
- sessionId: string,
8
+ _sessionId: string,
8
9
  token: string,
9
10
  commandId: string,
10
11
  status: "success" | "error",
11
12
  result?: Record<string, unknown>
12
13
  ): Promise<void> {
13
- const url = `${baseUrl}/api/sessions/${sessionId}/agent/result`;
14
+ const url = `${baseUrl}/api/agent/result`;
14
15
 
15
16
  try {
16
17
  const res = await fetch(url, {
package/src/sse-client.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * SSE client — listens for browser-automation commands from the server.
3
+ * Uses /api/agent/commands (flat route, not behind Easy Auth).
3
4
  */
4
5
 
5
6
  import { EventSource } from "eventsource";
@@ -13,12 +14,12 @@ interface IncomingCommand {
13
14
 
14
15
  export function connectSSE(
15
16
  baseUrl: string,
16
- sessionId: string,
17
+ _sessionId: string,
17
18
  token: string,
18
19
  onCommand: (command: IncomingCommand) => void,
19
20
  onError: (error: Error) => void
20
21
  ): { close: () => void } {
21
- const url = `${baseUrl}/api/sessions/${sessionId}/agent/commands?token=${encodeURIComponent(token)}`;
22
+ const url = `${baseUrl}/api/agent/commands?token=${encodeURIComponent(token)}`;
22
23
 
23
24
  let es: EventSource | null = null;
24
25
  let closed = false;
@@ -34,7 +35,6 @@ export function connectSSE(
34
35
  try {
35
36
  const data = JSON.parse(evt.data) as IncomingCommand;
36
37
  onCommand(data);
37
- // Reset backoff on successful message
38
38
  retryDelay = 1_000;
39
39
  } catch (err) {
40
40
  console.error(
@@ -64,7 +64,6 @@ export function connectSSE(
64
64
  console.error(`\u274C SSE error: ${message} — reconnecting in ${retryDelay / 1_000}s`);
65
65
  onError(new Error(message));
66
66
 
67
- // Close the broken connection and schedule reconnect
68
67
  es?.close();
69
68
  es = null;
70
69