agent-relay 6.0.22 → 6.2.0

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.
Files changed (117) hide show
  1. package/dist/index.cjs +338 -49
  2. package/dist/src/cli/bootstrap.d.ts.map +1 -1
  3. package/dist/src/cli/bootstrap.js +62 -0
  4. package/dist/src/cli/bootstrap.js.map +1 -1
  5. package/dist/src/cli/commands/agent-management.d.ts +8 -0
  6. package/dist/src/cli/commands/agent-management.d.ts.map +1 -1
  7. package/dist/src/cli/commands/agent-management.js +34 -0
  8. package/dist/src/cli/commands/agent-management.js.map +1 -1
  9. package/dist/src/cli/commands/drive.d.ts +222 -0
  10. package/dist/src/cli/commands/drive.d.ts.map +1 -0
  11. package/dist/src/cli/commands/drive.js +565 -0
  12. package/dist/src/cli/commands/drive.js.map +1 -0
  13. package/dist/src/cli/commands/messaging.d.ts +25 -0
  14. package/dist/src/cli/commands/messaging.d.ts.map +1 -1
  15. package/dist/src/cli/commands/messaging.js +702 -138
  16. package/dist/src/cli/commands/messaging.js.map +1 -1
  17. package/dist/src/cli/commands/new.d.ts +112 -0
  18. package/dist/src/cli/commands/new.d.ts.map +1 -0
  19. package/dist/src/cli/commands/new.js +189 -0
  20. package/dist/src/cli/commands/new.js.map +1 -0
  21. package/dist/src/cli/commands/on/provision.d.ts +1 -1
  22. package/dist/src/cli/commands/on/provision.d.ts.map +1 -1
  23. package/dist/src/cli/commands/on/provision.js +1 -1
  24. package/dist/src/cli/commands/on/provision.js.map +1 -1
  25. package/dist/src/cli/commands/on/start.d.ts +1 -1
  26. package/dist/src/cli/commands/on/start.d.ts.map +1 -1
  27. package/dist/src/cli/commands/on/start.js +2 -2
  28. package/dist/src/cli/commands/on/start.js.map +1 -1
  29. package/dist/src/cli/commands/passthrough.d.ts +142 -0
  30. package/dist/src/cli/commands/passthrough.d.ts.map +1 -0
  31. package/dist/src/cli/commands/passthrough.js +398 -0
  32. package/dist/src/cli/commands/passthrough.js.map +1 -0
  33. package/dist/src/cli/commands/rm.d.ts +52 -0
  34. package/dist/src/cli/commands/rm.d.ts.map +1 -0
  35. package/dist/src/cli/commands/rm.js +96 -0
  36. package/dist/src/cli/commands/rm.js.map +1 -0
  37. package/dist/src/cli/commands/view.d.ts +98 -0
  38. package/dist/src/cli/commands/view.d.ts.map +1 -0
  39. package/dist/src/cli/commands/view.js +238 -0
  40. package/dist/src/cli/commands/view.js.map +1 -0
  41. package/dist/src/cli/lib/agent-management-listing.d.ts +35 -7
  42. package/dist/src/cli/lib/agent-management-listing.d.ts.map +1 -1
  43. package/dist/src/cli/lib/agent-management-listing.js +188 -40
  44. package/dist/src/cli/lib/agent-management-listing.js.map +1 -1
  45. package/dist/src/cli/lib/attach.d.ts +56 -0
  46. package/dist/src/cli/lib/attach.d.ts.map +1 -0
  47. package/dist/src/cli/lib/attach.js +73 -0
  48. package/dist/src/cli/lib/attach.js.map +1 -0
  49. package/dist/src/cli/lib/broker-connection.d.ts +40 -0
  50. package/dist/src/cli/lib/broker-connection.d.ts.map +1 -0
  51. package/dist/src/cli/lib/broker-connection.js +82 -0
  52. package/dist/src/cli/lib/broker-connection.js.map +1 -0
  53. package/dist/src/cli/lib/formatting.d.ts +4 -0
  54. package/dist/src/cli/lib/formatting.d.ts.map +1 -1
  55. package/dist/src/cli/lib/formatting.js +31 -1
  56. package/dist/src/cli/lib/formatting.js.map +1 -1
  57. package/dist/src/cli/lib/sdk-client.d.ts +9 -0
  58. package/dist/src/cli/lib/sdk-client.d.ts.map +1 -0
  59. package/dist/src/cli/lib/sdk-client.js +28 -0
  60. package/dist/src/cli/lib/sdk-client.js.map +1 -0
  61. package/dist/src/cli/lib/spawn-and-attach.d.ts +132 -0
  62. package/dist/src/cli/lib/spawn-and-attach.d.ts.map +1 -0
  63. package/dist/src/cli/lib/spawn-and-attach.js +334 -0
  64. package/dist/src/cli/lib/spawn-and-attach.js.map +1 -0
  65. package/package.json +12 -10
  66. package/dist/packages/cloud/src/api-client.d.ts +0 -33
  67. package/dist/packages/cloud/src/api-client.d.ts.map +0 -1
  68. package/dist/packages/cloud/src/api-client.js +0 -123
  69. package/dist/packages/cloud/src/api-client.js.map +0 -1
  70. package/dist/packages/cloud/src/auth.d.ts +0 -13
  71. package/dist/packages/cloud/src/auth.d.ts.map +0 -1
  72. package/dist/packages/cloud/src/auth.js +0 -299
  73. package/dist/packages/cloud/src/auth.js.map +0 -1
  74. package/dist/packages/cloud/src/connect.d.ts +0 -45
  75. package/dist/packages/cloud/src/connect.d.ts.map +0 -1
  76. package/dist/packages/cloud/src/connect.js +0 -166
  77. package/dist/packages/cloud/src/connect.js.map +0 -1
  78. package/dist/packages/cloud/src/index.d.ts +0 -10
  79. package/dist/packages/cloud/src/index.d.ts.map +0 -1
  80. package/dist/packages/cloud/src/index.js +0 -10
  81. package/dist/packages/cloud/src/index.js.map +0 -1
  82. package/dist/packages/cloud/src/lib/ssh-interactive.d.ts +0 -70
  83. package/dist/packages/cloud/src/lib/ssh-interactive.d.ts.map +0 -1
  84. package/dist/packages/cloud/src/lib/ssh-interactive.js +0 -440
  85. package/dist/packages/cloud/src/lib/ssh-interactive.js.map +0 -1
  86. package/dist/packages/cloud/src/lib/ssh-runtime.d.ts +0 -35
  87. package/dist/packages/cloud/src/lib/ssh-runtime.d.ts.map +0 -1
  88. package/dist/packages/cloud/src/lib/ssh-runtime.js +0 -52
  89. package/dist/packages/cloud/src/lib/ssh-runtime.js.map +0 -1
  90. package/dist/packages/cloud/src/proactive-runtime.d.ts +0 -24
  91. package/dist/packages/cloud/src/proactive-runtime.d.ts.map +0 -1
  92. package/dist/packages/cloud/src/proactive-runtime.js +0 -315
  93. package/dist/packages/cloud/src/proactive-runtime.js.map +0 -1
  94. package/dist/packages/cloud/src/types.d.ts +0 -200
  95. package/dist/packages/cloud/src/types.d.ts.map +0 -1
  96. package/dist/packages/cloud/src/types.js +0 -12
  97. package/dist/packages/cloud/src/types.js.map +0 -1
  98. package/dist/packages/cloud/src/workflows.d.ts +0 -65
  99. package/dist/packages/cloud/src/workflows.d.ts.map +0 -1
  100. package/dist/packages/cloud/src/workflows.js +0 -892
  101. package/dist/packages/cloud/src/workflows.js.map +0 -1
  102. package/dist/packages/cloud/src/workspaces.d.ts +0 -11
  103. package/dist/packages/cloud/src/workspaces.d.ts.map +0 -1
  104. package/dist/packages/cloud/src/workspaces.js +0 -146
  105. package/dist/packages/cloud/src/workspaces.js.map +0 -1
  106. package/dist/packages/sdk/src/provisioner/local-jwks.d.ts +0 -25
  107. package/dist/packages/sdk/src/provisioner/local-jwks.d.ts.map +0 -1
  108. package/dist/packages/sdk/src/provisioner/local-jwks.js +0 -70
  109. package/dist/packages/sdk/src/provisioner/local-jwks.js.map +0 -1
  110. package/dist/packages/sdk/src/provisioner/seeder.d.ts +0 -17
  111. package/dist/packages/sdk/src/provisioner/seeder.d.ts.map +0 -1
  112. package/dist/packages/sdk/src/provisioner/seeder.js +0 -419
  113. package/dist/packages/sdk/src/provisioner/seeder.js.map +0 -1
  114. package/dist/packages/sdk/src/provisioner/token.d.ts +0 -41
  115. package/dist/packages/sdk/src/provisioner/token.d.ts.map +0 -1
  116. package/dist/packages/sdk/src/provisioner/token.js +0 -77
  117. package/dist/packages/sdk/src/provisioner/token.js.map +0 -1
@@ -1,5 +1,9 @@
1
1
  export declare function formatRelativeTime(iso?: string): string;
2
+ /** Format an uptime expressed in whole seconds as a compact `1h 02m 03s`. */
3
+ export declare function formatUptimeSecs(totalSecs: number): string;
2
4
  export declare function parseSince(input?: string): number | undefined;
5
+ export declare function sanitizeForTerminal(input: string): string;
6
+ export declare function sanitizeForTerminalLine(input: string): string;
3
7
  export interface TableColumn {
4
8
  value: string;
5
9
  width?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/formatting.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAavD;AAED,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAqB7D;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAI7D"}
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/formatting.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAavD;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA6B7D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASzD;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAI7D"}
@@ -17,13 +17,27 @@ export function formatRelativeTime(iso) {
17
17
  const diffDays = Math.floor(diffHours / 24);
18
18
  return `${diffDays}d ago`;
19
19
  }
20
+ /** Format an uptime expressed in whole seconds as a compact `1h 02m 03s`. */
21
+ export function formatUptimeSecs(totalSecs) {
22
+ if (!Number.isFinite(totalSecs) || totalSecs < 0)
23
+ return '-';
24
+ const secs = Math.floor(totalSecs);
25
+ const h = Math.floor(secs / 3600);
26
+ const m = Math.floor((secs % 3600) / 60);
27
+ const s = secs % 60;
28
+ if (h > 0)
29
+ return `${h}h ${String(m).padStart(2, '0')}m ${String(s).padStart(2, '0')}s`;
30
+ if (m > 0)
31
+ return `${m}m ${String(s).padStart(2, '0')}s`;
32
+ return `${s}s`;
33
+ }
20
34
  export function parseSince(input) {
21
35
  if (!input)
22
36
  return undefined;
23
37
  const trimmed = String(input).trim();
24
38
  if (!trimmed)
25
39
  return undefined;
26
- const durationMatch = trimmed.match(/^(-?\d+)([smhd])$/i);
40
+ const durationMatch = trimmed.match(/^(\d+)([smhd])$/i);
27
41
  if (durationMatch) {
28
42
  const value = Number(durationMatch[1]);
29
43
  const unit = durationMatch[2].toLowerCase();
@@ -35,11 +49,27 @@ export function parseSince(input) {
35
49
  };
36
50
  return Date.now() - value * multipliers[unit];
37
51
  }
52
+ if (!/^\d{4}-\d{2}-\d{2}(?:[Tt ][0-2]\d:[0-5]\d(?::[0-5]\d(?:\.\d{1,9})?)?(?:[Zz]|[+-][0-2]\d:?[0-5]\d)?)?$/.test(trimmed)) {
53
+ return undefined;
54
+ }
38
55
  const parsed = Date.parse(trimmed);
39
56
  if (Number.isNaN(parsed))
40
57
  return undefined;
41
58
  return parsed;
42
59
  }
60
+ export function sanitizeForTerminal(input) {
61
+ /* eslint-disable no-control-regex -- intentionally matching ANSI/control bytes to strip them */
62
+ return input
63
+ .replace(/\x1B\][^\x07]*(?:\x07|\x1B\\)/g, '')
64
+ .replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, '')
65
+ .replace(/\x9B[0-?]*[ -/]*[@-~]/g, '')
66
+ .replace(/\x1B[@-Z\\-_]/g, '')
67
+ .replace(/[\x00-\x08\x0B\x0C\x0D\x0E-\x1F\x7F-\x9F]/g, '');
68
+ /* eslint-enable no-control-regex */
69
+ }
70
+ export function sanitizeForTerminalLine(input) {
71
+ return sanitizeForTerminal(input.replace(/[\r\n\t]+/g, ' '));
72
+ }
43
73
  export function formatTableRow(columns) {
44
74
  return columns
45
75
  .map((column) => (typeof column.width === 'number' ? column.value.padEnd(column.width) : column.value))
@@ -1 +1 @@
1
- {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../../../src/cli/lib/formatting.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IAC3C,IAAI,SAAS,GAAG,EAAE;QAAE,OAAO,GAAG,SAAS,OAAO,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;IAC5C,OAAO,GAAG,QAAQ,OAAO,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC1D,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,WAAW,GAA2B;YAC1C,CAAC,EAAE,IAAI;YACP,CAAC,EAAE,MAAM;YACT,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,UAAU;SACd,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,MAAM,CAAC;AAChB,CAAC;AAOD,MAAM,UAAU,cAAc,CAAC,OAAsB;IACnD,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACtG,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../../../src/cli/lib/formatting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { AgentRelayClient } from '@agent-relay/sdk';
2
+ import type { BrokerConnection } from './broker-connection.js';
3
+ export declare function createBrokerClient(connection: BrokerConnection, fetchFn?: typeof globalThis.fetch): AgentRelayClient;
4
+ export interface BrokerSdkFailure {
5
+ status: number;
6
+ message: string;
7
+ }
8
+ export declare function mapBrokerSdkFailure(error: unknown): BrokerSdkFailure;
9
+ //# sourceMappingURL=sdk-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-client.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/sdk-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA2B,MAAM,kBAAkB,CAAC;AAE7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,gBAAgB,EAC5B,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,GAChC,gBAAgB,CAMlB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAWpE"}
@@ -0,0 +1,28 @@
1
+ import { AgentRelayClient, AgentRelayProtocolError } from '@agent-relay/sdk';
2
+ export function createBrokerClient(connection, fetchFn) {
3
+ return new AgentRelayClient({
4
+ baseUrl: connection.url,
5
+ apiKey: connection.apiKey,
6
+ fetch: fetchFn,
7
+ });
8
+ }
9
+ export function mapBrokerSdkFailure(error) {
10
+ if (error instanceof AgentRelayProtocolError) {
11
+ return {
12
+ status: error.status ?? parseHttpStatus(error.code) ?? 0,
13
+ message: error.message,
14
+ };
15
+ }
16
+ return {
17
+ status: 0,
18
+ message: error instanceof Error ? error.message : String(error),
19
+ };
20
+ }
21
+ function parseHttpStatus(code) {
22
+ const match = /^http_(\d{3})$/.exec(code);
23
+ if (!match)
24
+ return undefined;
25
+ const status = Number(match[1]);
26
+ return Number.isInteger(status) ? status : undefined;
27
+ }
28
+ //# sourceMappingURL=sdk-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-client.js","sourceRoot":"","sources":["../../../../src/cli/lib/sdk-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAI7E,MAAM,UAAU,kBAAkB,CAChC,UAA4B,EAC5B,OAAiC;IAEjC,OAAO,IAAI,gBAAgB,CAAC;QAC1B,OAAO,EAAE,UAAU,CAAC,GAAG;QACvB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,KAAK,EAAE,OAAO;KACf,CAAC,CAAC;AACL,CAAC;AAOD,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,KAAK,YAAY,uBAAuB,EAAE,CAAC;QAC7C,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACxD,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Shared spawn-and-attach helper.
3
+ *
4
+ * Two entry points compose `new` + a session verb:
5
+ *
6
+ * 1. `agent-relay new NAME CLI --attach [--mode …] [--ephemeral]`
7
+ * — the explicit, flag-driven path.
8
+ * 2. `agent-relay -n NAME CLI [args...]` — the bare `-n` shorthand,
9
+ * hardcoded to `--mode passthrough --ephemeral`.
10
+ *
11
+ * Both call `runSpawnAndAttach()` here. There is one function that does
12
+ * the work, and the only difference between the two entry points is
13
+ * which `SpawnAndAttachOptions` they construct — so the shorthand and
14
+ * the explicit form produce identical broker calls and teardown
15
+ * behaviour by construction.
16
+ *
17
+ * This module lives in `src/cli/lib/` (not `src/cli/commands/`) because
18
+ * it's a helper consumed by multiple commands (`new --attach` action)
19
+ * and the bootstrap-layer alias dispatcher, not a verb registration in
20
+ * its own right.
21
+ */
22
+ import { type BrokerConnection } from './broker-connection.js';
23
+ import { type NewDependencies } from '../commands/new.js';
24
+ import { type DriveDependencies } from '../commands/drive.js';
25
+ import { type PassthroughDependencies } from '../commands/passthrough.js';
26
+ import { type ViewDependencies } from '../commands/view.js';
27
+ export type AttachMode = 'view' | 'drive' | 'passthrough';
28
+ /** Options the composition layer understands. */
29
+ export interface SpawnAndAttachOptions {
30
+ name: string;
31
+ cli: string;
32
+ args?: string[];
33
+ mode?: AttachMode;
34
+ ephemeral?: boolean;
35
+ task?: string;
36
+ channels?: string;
37
+ cwd?: string;
38
+ team?: string;
39
+ model?: string;
40
+ brokerUrl?: string;
41
+ apiKey?: string;
42
+ stateDir?: string;
43
+ }
44
+ /** Shared dependencies the composition needs. */
45
+ export interface SpawnAndAttachDependencies {
46
+ /** For the spawn step. */
47
+ newDeps: NewDependencies;
48
+ /** For `--mode drive` attach. */
49
+ driveDeps: DriveDependencies;
50
+ /** For `--mode passthrough` attach. */
51
+ passthroughDeps: PassthroughDependencies;
52
+ /** For `--mode view` attach. */
53
+ viewDeps: ViewDependencies;
54
+ /** Issue a release on ephemeral teardown. Default delegates to `rm.releaseAgent`. */
55
+ releaseAgent: (connection: BrokerConnection, name: string, fetchFn: typeof globalThis.fetch) => Promise<{
56
+ ok: boolean;
57
+ status: number;
58
+ message?: string;
59
+ }>;
60
+ /** Signal registrar so the ephemeral teardown fires on SIGINT/SIGTERM. */
61
+ onSignal: (signal: NodeJS.Signals, handler: () => void | Promise<void>) => void;
62
+ log: (...args: unknown[]) => void;
63
+ error: (...args: unknown[]) => void;
64
+ }
65
+ /** Bundle of child-module deps used by the production default factory. */
66
+ export interface AttachChildDependencies {
67
+ newDeps: NewDependencies;
68
+ driveDeps: DriveDependencies;
69
+ passthroughDeps: PassthroughDependencies;
70
+ viewDeps: ViewDependencies;
71
+ }
72
+ /**
73
+ * Build the default child-module deps (`new` / `drive` / `passthrough` /
74
+ * `view`) using the production defaults — global `fetch`, real
75
+ * WebSocket, real signal registration, real stdin/stdout. Exported so
76
+ * bootstrap-layer callers can wire production defaults without
77
+ * re-encoding every detail.
78
+ */
79
+ export declare function buildDefaultAttachChildDeps(): AttachChildDependencies;
80
+ /**
81
+ * Build the full `SpawnAndAttachDependencies` bundle from the child
82
+ * deps. Exposed so callers that already have child deps (e.g. tests)
83
+ * can opt into the default `releaseAgent` / `onSignal` wiring without
84
+ * re-implementing it.
85
+ */
86
+ export declare function buildSpawnAndAttachDeps(childDeps?: AttachChildDependencies): SpawnAndAttachDependencies;
87
+ /**
88
+ * Spawn an agent and immediately attach to it via the chosen session
89
+ * verb. Single code path for both `new -n NAME CLI --attach …` and the
90
+ * verbless `-n NAME CLI` alias.
91
+ *
92
+ * Returns the exit code the CLI should propagate.
93
+ */
94
+ export declare function runSpawnAndAttach(options: SpawnAndAttachOptions, deps: SpawnAndAttachDependencies): Promise<number>;
95
+ /**
96
+ * Tiny standalone entry point for the verbless `-n NAME CLI` shorthand
97
+ * dispatcher in `bootstrap.ts`. Hands off to `runSpawnAndAttach` with
98
+ * the shorthand's hardcoded preset (`--mode passthrough`, `--ephemeral`).
99
+ */
100
+ export declare function runVerblessAliasDispatch(parsedArgs: {
101
+ name: string;
102
+ cli: string;
103
+ args: string[];
104
+ }, childDeps?: AttachChildDependencies): Promise<number>;
105
+ /**
106
+ * Pre-parse `argv.slice(2)` to detect the `-n NAME CLI [args...]`
107
+ * shorthand. Returns the parsed shape when the arguments unambiguously
108
+ * fit the shorthand, or `null` to let Commander parse normally.
109
+ *
110
+ * Recognised forms:
111
+ *
112
+ * agent-relay -n NAME CLI [args...]
113
+ * agent-relay --name NAME CLI [args...]
114
+ * agent-relay -nNAME CLI [args...] (joined short flag)
115
+ * agent-relay --name=NAME CLI [args...] (equals form)
116
+ *
117
+ * Rejected (returns null — fall through to Commander):
118
+ * - any of the registered subcommand names ('view', 'drive', etc.)
119
+ * appears as the first non-flag token, even after `-n`
120
+ * - `-h`/`--help`/`-V`/`--version` present
121
+ * - `-n` without a CLI positional
122
+ *
123
+ * Exported for unit testing alongside the byte-equivalence test that
124
+ * proves the shorthand parse matches what `new NAME CLI --attach --mode passthrough --ephemeral`
125
+ * decomposes into at the action layer.
126
+ */
127
+ export declare function parseVerblessAlias(args: string[], knownVerbs: ReadonlySet<string>): {
128
+ name: string;
129
+ cli: string;
130
+ args: string[];
131
+ } | null;
132
+ //# sourceMappingURL=spawn-and-attach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-and-attach.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/spawn-and-attach.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,334 @@
1
+ /**
2
+ * Shared spawn-and-attach helper.
3
+ *
4
+ * Two entry points compose `new` + a session verb:
5
+ *
6
+ * 1. `agent-relay new NAME CLI --attach [--mode …] [--ephemeral]`
7
+ * — the explicit, flag-driven path.
8
+ * 2. `agent-relay -n NAME CLI [args...]` — the bare `-n` shorthand,
9
+ * hardcoded to `--mode passthrough --ephemeral`.
10
+ *
11
+ * Both call `runSpawnAndAttach()` here. There is one function that does
12
+ * the work, and the only difference between the two entry points is
13
+ * which `SpawnAndAttachOptions` they construct — so the shorthand and
14
+ * the explicit form produce identical broker calls and teardown
15
+ * behaviour by construction.
16
+ *
17
+ * This module lives in `src/cli/lib/` (not `src/cli/commands/`) because
18
+ * it's a helper consumed by multiple commands (`new --attach` action)
19
+ * and the bootstrap-layer alias dispatcher, not a verb registration in
20
+ * its own right.
21
+ */
22
+ import WebSocket from 'ws';
23
+ import { captureAndRenderSnapshot, } from './attach.js';
24
+ import { defaultStateDir, readConnectionFileFromDisk, resolveBrokerConnection, } from './broker-connection.js';
25
+ import { defaultExit, runSignalHandler } from './exit.js';
26
+ import { spawnAgent } from '../commands/new.js';
27
+ import { releaseAgent } from '../commands/rm.js';
28
+ import { runDriveSession, } from '../commands/drive.js';
29
+ import { runPassthroughSession, } from '../commands/passthrough.js';
30
+ import { runViewSession } from '../commands/view.js';
31
+ /**
32
+ * Build the default child-module deps (`new` / `drive` / `passthrough` /
33
+ * `view`) using the production defaults — global `fetch`, real
34
+ * WebSocket, real signal registration, real stdin/stdout. Exported so
35
+ * bootstrap-layer callers can wire production defaults without
36
+ * re-encoding every detail.
37
+ */
38
+ export function buildDefaultAttachChildDeps() {
39
+ const sharedConnectionDeps = {
40
+ readConnectionFile: readConnectionFileFromDisk,
41
+ getDefaultStateDir: defaultStateDir,
42
+ env: process.env,
43
+ };
44
+ const sharedFetch = (input, init) => fetch(input, init);
45
+ const sharedLog = (...args) => console.error(...args);
46
+ const sharedError = (...args) => console.error(...args);
47
+ const sharedExit = defaultExit;
48
+ const sharedWriteChunk = (chunk) => {
49
+ process.stdout.write(chunk);
50
+ };
51
+ const sharedOnSignal = (signal, handler) => {
52
+ process.on(signal, () => runSignalHandler(handler));
53
+ };
54
+ const sharedSnapshot = (connection, agentName, snapshotDeps) => captureAndRenderSnapshot(connection, agentName, snapshotDeps);
55
+ const stdinHandle = process.stdin;
56
+ const terminalHandle = {
57
+ getSize: () => {
58
+ const stdout = process.stdout;
59
+ if (!stdout.isTTY)
60
+ return null;
61
+ const rows = stdout.rows;
62
+ const cols = stdout.columns;
63
+ if (typeof rows !== 'number' || typeof cols !== 'number')
64
+ return null;
65
+ return { rows, cols };
66
+ },
67
+ onResize: (handler) => {
68
+ process.stdout.on('resize', handler);
69
+ return () => process.stdout.off('resize', handler);
70
+ },
71
+ };
72
+ const newDeps = {
73
+ ...sharedConnectionDeps,
74
+ fetch: sharedFetch,
75
+ log: (...args) => console.log(...args),
76
+ error: sharedError,
77
+ exit: sharedExit,
78
+ };
79
+ const driveDeps = {
80
+ ...sharedConnectionDeps,
81
+ createWebSocket: (url, headers) => new WebSocket(url, { headers }),
82
+ writeChunk: sharedWriteChunk,
83
+ onSignal: sharedOnSignal,
84
+ log: sharedLog,
85
+ error: sharedError,
86
+ exit: sharedExit,
87
+ fetch: sharedFetch,
88
+ captureAndRenderSnapshot: sharedSnapshot,
89
+ stdin: stdinHandle,
90
+ terminal: terminalHandle,
91
+ };
92
+ const passthroughDeps = {
93
+ ...sharedConnectionDeps,
94
+ createWebSocket: (url, headers) => new WebSocket(url, { headers }),
95
+ writeChunk: sharedWriteChunk,
96
+ onSignal: sharedOnSignal,
97
+ log: sharedLog,
98
+ error: sharedError,
99
+ exit: sharedExit,
100
+ fetch: sharedFetch,
101
+ captureAndRenderSnapshot: sharedSnapshot,
102
+ stdin: stdinHandle,
103
+ terminal: terminalHandle,
104
+ };
105
+ const viewDeps = {
106
+ ...sharedConnectionDeps,
107
+ createWebSocket: (url, headers) => new WebSocket(url, { headers }),
108
+ writeChunk: sharedWriteChunk,
109
+ onSignal: sharedOnSignal,
110
+ log: sharedLog,
111
+ error: sharedError,
112
+ exit: sharedExit,
113
+ fetch: sharedFetch,
114
+ captureAndRenderSnapshot: sharedSnapshot,
115
+ };
116
+ return { newDeps, driveDeps, passthroughDeps, viewDeps };
117
+ }
118
+ /**
119
+ * Build the full `SpawnAndAttachDependencies` bundle from the child
120
+ * deps. Exposed so callers that already have child deps (e.g. tests)
121
+ * can opt into the default `releaseAgent` / `onSignal` wiring without
122
+ * re-implementing it.
123
+ */
124
+ export function buildSpawnAndAttachDeps(childDeps = buildDefaultAttachChildDeps()) {
125
+ return {
126
+ newDeps: childDeps.newDeps,
127
+ driveDeps: childDeps.driveDeps,
128
+ passthroughDeps: childDeps.passthroughDeps,
129
+ viewDeps: childDeps.viewDeps,
130
+ releaseAgent: (conn, name, fetchFn) => releaseAgent(conn, name, fetchFn),
131
+ onSignal: childDeps.driveDeps.onSignal,
132
+ log: childDeps.driveDeps.log,
133
+ error: childDeps.driveDeps.error,
134
+ };
135
+ }
136
+ function buildSpawnBody(options) {
137
+ const channels = options.channels
138
+ ?.split(',')
139
+ .map((c) => c.trim())
140
+ .filter((c) => c.length > 0);
141
+ return {
142
+ name: options.name,
143
+ cli: options.cli,
144
+ ...(options.args && options.args.length > 0 ? { args: options.args } : {}),
145
+ ...(options.task !== undefined ? { task: options.task } : {}),
146
+ ...(channels && channels.length > 0 ? { channels } : {}),
147
+ ...(options.cwd !== undefined ? { cwd: options.cwd } : {}),
148
+ ...(options.team !== undefined ? { team: options.team } : {}),
149
+ ...(options.model !== undefined ? { model: options.model } : {}),
150
+ };
151
+ }
152
+ /**
153
+ * Spawn an agent and immediately attach to it via the chosen session
154
+ * verb. Single code path for both `new -n NAME CLI --attach …` and the
155
+ * verbless `-n NAME CLI` alias.
156
+ *
157
+ * Returns the exit code the CLI should propagate.
158
+ */
159
+ export async function runSpawnAndAttach(options, deps) {
160
+ const name = options.name?.trim();
161
+ if (!name) {
162
+ deps.error('Error: agent name is required');
163
+ return 1;
164
+ }
165
+ const cli = options.cli?.trim();
166
+ if (!cli) {
167
+ deps.error(`Error: CLI is required, e.g. \`agent-relay new ${name} claude --attach\``);
168
+ return 1;
169
+ }
170
+ const mode = options.mode ?? 'drive';
171
+ if (mode !== 'view' && mode !== 'drive' && mode !== 'passthrough') {
172
+ deps.error(`Error: --mode must be one of view|drive|passthrough (got '${String(options.mode)}')`);
173
+ return 1;
174
+ }
175
+ // Resolve the broker connection once. All three steps (spawn, attach,
176
+ // ephemeral teardown) need it and we don't want the file/env to be
177
+ // re-read between them.
178
+ const connection = resolveBrokerConnection(options, deps.newDeps);
179
+ if (!connection) {
180
+ deps.error('Error: could not locate broker connection. Pass --broker-url, set RELAY_BROKER_URL, ' +
181
+ 'or run from a directory containing .agent-relay/connection.json.');
182
+ return 1;
183
+ }
184
+ // Step 1: spawn.
185
+ const spawnResult = await spawnAgent(connection, buildSpawnBody({ ...options, name, cli }), deps.newDeps.fetch);
186
+ if (!spawnResult.ok) {
187
+ deps.error(`Error: could not spawn '${name}': ${spawnResult.message ?? 'unknown error'}`);
188
+ return 1;
189
+ }
190
+ deps.log(`Spawned agent: ${name}`);
191
+ // Step 2: register --ephemeral teardown BEFORE attach. The attach
192
+ // call blocks until detach, so signal handlers wired here are what
193
+ // fire on Ctrl+C / SIGTERM mid-session. The handlers are idempotent
194
+ // (best-effort releaseAgent → if it 404s, fine; the agent is gone).
195
+ const fireEphemeralRelease = async () => {
196
+ try {
197
+ const result = await deps.releaseAgent(connection, name, deps.newDeps.fetch);
198
+ if (!result.ok && result.status !== 404) {
199
+ deps.log(`[attach] ephemeral release of '${name}' returned ${result.status}: ${result.message ?? 'unknown'}`);
200
+ }
201
+ }
202
+ catch (err) {
203
+ // Never let teardown noise drown out whatever the user is trying to read.
204
+ const message = err instanceof Error ? err.message : String(err);
205
+ deps.log(`[attach] ephemeral release of '${name}' threw: ${message}`);
206
+ }
207
+ };
208
+ if (options.ephemeral) {
209
+ // Signal-based teardowns: in addition to the attach-runner's own
210
+ // SIGINT handler (which detaches cleanly), we want the ephemeral
211
+ // delete to also fire. The attach client closes the WS first and
212
+ // then we follow up with the DELETE.
213
+ deps.onSignal('SIGINT', () => fireEphemeralRelease());
214
+ deps.onSignal('SIGTERM', () => fireEphemeralRelease());
215
+ }
216
+ // Step 3: attach via the chosen mode runner. Inherit the same
217
+ // connection-resolution flags so the attach runner doesn't go re-read
218
+ // disk and get a different answer.
219
+ const attachOptions = {
220
+ brokerUrl: connection.url,
221
+ apiKey: connection.apiKey,
222
+ // Intentionally NOT passing stateDir — once we have a resolved URL
223
+ // we want the attach client to use it directly, not fall back to
224
+ // disk on a transient flag-parsing accident.
225
+ };
226
+ let attachCode = 0;
227
+ try {
228
+ switch (mode) {
229
+ case 'drive':
230
+ attachCode = await runDriveSession(name, attachOptions, deps.driveDeps);
231
+ break;
232
+ case 'passthrough':
233
+ attachCode = await runPassthroughSession(name, attachOptions, deps.passthroughDeps);
234
+ break;
235
+ case 'view':
236
+ attachCode = await runViewSession(name, attachOptions, deps.viewDeps);
237
+ break;
238
+ }
239
+ }
240
+ finally {
241
+ // Step 4: ephemeral teardown after clean detach. The attach runner
242
+ // returned (clean or otherwise); release the agent so the client's
243
+ // exit also ends the agent. Signal-path teardowns above are
244
+ // additive — `fireEphemeralRelease` is idempotent (broker returns
245
+ // 404 the second time, which we swallow).
246
+ if (options.ephemeral) {
247
+ await fireEphemeralRelease();
248
+ }
249
+ }
250
+ return attachCode;
251
+ }
252
+ /**
253
+ * Tiny standalone entry point for the verbless `-n NAME CLI` shorthand
254
+ * dispatcher in `bootstrap.ts`. Hands off to `runSpawnAndAttach` with
255
+ * the shorthand's hardcoded preset (`--mode passthrough`, `--ephemeral`).
256
+ */
257
+ export async function runVerblessAliasDispatch(parsedArgs, childDeps = buildDefaultAttachChildDeps()) {
258
+ return runSpawnAndAttach({
259
+ name: parsedArgs.name,
260
+ cli: parsedArgs.cli,
261
+ args: parsedArgs.args,
262
+ mode: 'passthrough',
263
+ ephemeral: true,
264
+ }, buildSpawnAndAttachDeps(childDeps));
265
+ }
266
+ /**
267
+ * Pre-parse `argv.slice(2)` to detect the `-n NAME CLI [args...]`
268
+ * shorthand. Returns the parsed shape when the arguments unambiguously
269
+ * fit the shorthand, or `null` to let Commander parse normally.
270
+ *
271
+ * Recognised forms:
272
+ *
273
+ * agent-relay -n NAME CLI [args...]
274
+ * agent-relay --name NAME CLI [args...]
275
+ * agent-relay -nNAME CLI [args...] (joined short flag)
276
+ * agent-relay --name=NAME CLI [args...] (equals form)
277
+ *
278
+ * Rejected (returns null — fall through to Commander):
279
+ * - any of the registered subcommand names ('view', 'drive', etc.)
280
+ * appears as the first non-flag token, even after `-n`
281
+ * - `-h`/`--help`/`-V`/`--version` present
282
+ * - `-n` without a CLI positional
283
+ *
284
+ * Exported for unit testing alongside the byte-equivalence test that
285
+ * proves the shorthand parse matches what `new NAME CLI --attach --mode passthrough --ephemeral`
286
+ * decomposes into at the action layer.
287
+ */
288
+ export function parseVerblessAlias(args, knownVerbs) {
289
+ if (args.length === 0)
290
+ return null;
291
+ // Bail on help/version — let commander show its built-in output.
292
+ for (const token of args) {
293
+ if (token === '-h' || token === '--help' || token === '-V' || token === '--version') {
294
+ return null;
295
+ }
296
+ }
297
+ let name = null;
298
+ let i = 0;
299
+ while (i < args.length) {
300
+ const token = args[i];
301
+ if (token === '-n' || token === '--name') {
302
+ if (i + 1 >= args.length)
303
+ return null;
304
+ name = args[i + 1];
305
+ // Splice out the flag + value and restart from the same index.
306
+ args = [...args.slice(0, i), ...args.slice(i + 2)];
307
+ continue;
308
+ }
309
+ if (token.startsWith('-n') && token.length > 2 && !token.startsWith('--')) {
310
+ name = token.slice(2);
311
+ args = [...args.slice(0, i), ...args.slice(i + 1)];
312
+ continue;
313
+ }
314
+ if (token.startsWith('--name=')) {
315
+ name = token.slice('--name='.length);
316
+ args = [...args.slice(0, i), ...args.slice(i + 1)];
317
+ continue;
318
+ }
319
+ i += 1;
320
+ }
321
+ if (!name || name.trim() === '')
322
+ return null;
323
+ if (args.length === 0)
324
+ return null;
325
+ // The first remaining positional must NOT be one of the known verbs
326
+ // — if it is, the user invoked e.g. `agent-relay -n foo drive bar`
327
+ // which we can't sanely route. Let commander show the error.
328
+ const cli = args[0];
329
+ if (knownVerbs.has(cli))
330
+ return null;
331
+ const rest = args.slice(1);
332
+ return { name: name.trim(), cli, args: rest };
333
+ }
334
+ //# sourceMappingURL=spawn-and-attach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-and-attach.js","sourceRoot":"","sources":["../../../../src/cli/lib/spawn-and-attach.ts"],"names":[],"mappings":"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"}