@tpsdev-ai/cli 0.2.0 → 0.3.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 (228) hide show
  1. package/README.md +65 -0
  2. package/bin/tps.cjs +22 -0
  3. package/bin/tps.ts +435 -0
  4. package/package.json +29 -5
  5. package/dist/bin/tps.d.ts +0 -3
  6. package/dist/bin/tps.d.ts.map +0 -1
  7. package/dist/bin/tps.js +0 -414
  8. package/dist/bin/tps.js.map +0 -1
  9. package/dist/src/cli/hire.d.ts +0 -16
  10. package/dist/src/cli/hire.d.ts.map +0 -1
  11. package/dist/src/cli/hire.js +0 -176
  12. package/dist/src/cli/hire.js.map +0 -1
  13. package/dist/src/cli/office.d.ts +0 -7
  14. package/dist/src/cli/office.d.ts.map +0 -1
  15. package/dist/src/cli/office.js +0 -51
  16. package/dist/src/cli/office.js.map +0 -1
  17. package/dist/src/cli/review.d.ts +0 -9
  18. package/dist/src/cli/review.d.ts.map +0 -1
  19. package/dist/src/cli/review.js +0 -109
  20. package/dist/src/cli/review.js.map +0 -1
  21. package/dist/src/cli/roster.d.ts +0 -6
  22. package/dist/src/cli/roster.d.ts.map +0 -1
  23. package/dist/src/cli/roster.js +0 -60
  24. package/dist/src/cli/roster.js.map +0 -1
  25. package/dist/src/commands/backup.d.ts +0 -19
  26. package/dist/src/commands/backup.d.ts.map +0 -1
  27. package/dist/src/commands/backup.js +0 -595
  28. package/dist/src/commands/backup.js.map +0 -1
  29. package/dist/src/commands/bootstrap.d.ts +0 -7
  30. package/dist/src/commands/bootstrap.d.ts.map +0 -1
  31. package/dist/src/commands/bootstrap.js +0 -255
  32. package/dist/src/commands/bootstrap.js.map +0 -1
  33. package/dist/src/commands/branch.d.ts +0 -14
  34. package/dist/src/commands/branch.d.ts.map +0 -1
  35. package/dist/src/commands/branch.js +0 -395
  36. package/dist/src/commands/branch.js.map +0 -1
  37. package/dist/src/commands/context.d.ts +0 -9
  38. package/dist/src/commands/context.d.ts.map +0 -1
  39. package/dist/src/commands/context.js +0 -57
  40. package/dist/src/commands/context.js.map +0 -1
  41. package/dist/src/commands/git.d.ts +0 -8
  42. package/dist/src/commands/git.d.ts.map +0 -1
  43. package/dist/src/commands/git.js +0 -53
  44. package/dist/src/commands/git.js.map +0 -1
  45. package/dist/src/commands/identity.d.ts +0 -13
  46. package/dist/src/commands/identity.d.ts.map +0 -1
  47. package/dist/src/commands/identity.js +0 -231
  48. package/dist/src/commands/identity.js.map +0 -1
  49. package/dist/src/commands/mail.d.ts +0 -12
  50. package/dist/src/commands/mail.d.ts.map +0 -1
  51. package/dist/src/commands/mail.js +0 -251
  52. package/dist/src/commands/mail.js.map +0 -1
  53. package/dist/src/commands/office-manager.d.ts +0 -147
  54. package/dist/src/commands/office-manager.d.ts.map +0 -1
  55. package/dist/src/commands/office-manager.js +0 -171
  56. package/dist/src/commands/office-manager.js.map +0 -1
  57. package/dist/src/commands/office.d.ts +0 -12
  58. package/dist/src/commands/office.d.ts.map +0 -1
  59. package/dist/src/commands/office.js +0 -480
  60. package/dist/src/commands/office.js.map +0 -1
  61. package/dist/src/commands/roster.d.ts +0 -10
  62. package/dist/src/commands/roster.d.ts.map +0 -1
  63. package/dist/src/commands/roster.js +0 -143
  64. package/dist/src/commands/roster.js.map +0 -1
  65. package/dist/src/commands/secrets.d.ts +0 -9
  66. package/dist/src/commands/secrets.d.ts.map +0 -1
  67. package/dist/src/commands/secrets.js +0 -54
  68. package/dist/src/commands/secrets.js.map +0 -1
  69. package/dist/src/commands/status.d.ts +0 -33
  70. package/dist/src/commands/status.d.ts.map +0 -1
  71. package/dist/src/commands/status.js +0 -407
  72. package/dist/src/commands/status.js.map +0 -1
  73. package/dist/src/generators/brief.d.ts +0 -6
  74. package/dist/src/generators/brief.d.ts.map +0 -1
  75. package/dist/src/generators/brief.js +0 -33
  76. package/dist/src/generators/brief.js.map +0 -1
  77. package/dist/src/generators/claude-code.d.ts +0 -18
  78. package/dist/src/generators/claude-code.d.ts.map +0 -1
  79. package/dist/src/generators/claude-code.js +0 -85
  80. package/dist/src/generators/claude-code.js.map +0 -1
  81. package/dist/src/generators/codex.d.ts +0 -23
  82. package/dist/src/generators/codex.d.ts.map +0 -1
  83. package/dist/src/generators/codex.js +0 -83
  84. package/dist/src/generators/codex.js.map +0 -1
  85. package/dist/src/generators/ollama.d.ts +0 -18
  86. package/dist/src/generators/ollama.d.ts.map +0 -1
  87. package/dist/src/generators/ollama.js +0 -97
  88. package/dist/src/generators/ollama.js.map +0 -1
  89. package/dist/src/generators/openclaw.d.ts +0 -15
  90. package/dist/src/generators/openclaw.d.ts.map +0 -1
  91. package/dist/src/generators/openclaw.js +0 -107
  92. package/dist/src/generators/openclaw.js.map +0 -1
  93. package/dist/src/generators/registry.d.ts +0 -36
  94. package/dist/src/generators/registry.d.ts.map +0 -1
  95. package/dist/src/generators/registry.js +0 -99
  96. package/dist/src/generators/registry.js.map +0 -1
  97. package/dist/src/schema/manifest.d.ts +0 -287
  98. package/dist/src/schema/manifest.d.ts.map +0 -1
  99. package/dist/src/schema/manifest.js +0 -65
  100. package/dist/src/schema/manifest.js.map +0 -1
  101. package/dist/src/schema/report.d.ts +0 -166
  102. package/dist/src/schema/report.d.ts.map +0 -1
  103. package/dist/src/schema/report.js +0 -90
  104. package/dist/src/schema/report.js.map +0 -1
  105. package/dist/src/schema/sanitizer.d.ts +0 -30
  106. package/dist/src/schema/sanitizer.d.ts.map +0 -1
  107. package/dist/src/schema/sanitizer.js +0 -99
  108. package/dist/src/schema/sanitizer.js.map +0 -1
  109. package/dist/src/soundstage/mock-llm.d.ts +0 -3
  110. package/dist/src/soundstage/mock-llm.d.ts.map +0 -1
  111. package/dist/src/soundstage/mock-llm.js +0 -68
  112. package/dist/src/soundstage/mock-llm.js.map +0 -1
  113. package/dist/src/utils/agent-info.d.ts +0 -28
  114. package/dist/src/utils/agent-info.d.ts.map +0 -1
  115. package/dist/src/utils/agent-info.js +0 -102
  116. package/dist/src/utils/agent-info.js.map +0 -1
  117. package/dist/src/utils/archive.d.ts +0 -20
  118. package/dist/src/utils/archive.d.ts.map +0 -1
  119. package/dist/src/utils/archive.js +0 -108
  120. package/dist/src/utils/archive.js.map +0 -1
  121. package/dist/src/utils/config-inject.d.ts +0 -27
  122. package/dist/src/utils/config-inject.d.ts.map +0 -1
  123. package/dist/src/utils/config-inject.js +0 -83
  124. package/dist/src/utils/config-inject.js.map +0 -1
  125. package/dist/src/utils/config.d.ts +0 -30
  126. package/dist/src/utils/config.d.ts.map +0 -1
  127. package/dist/src/utils/config.js +0 -55
  128. package/dist/src/utils/config.js.map +0 -1
  129. package/dist/src/utils/connection-state.d.ts +0 -27
  130. package/dist/src/utils/connection-state.d.ts.map +0 -1
  131. package/dist/src/utils/connection-state.js +0 -81
  132. package/dist/src/utils/connection-state.js.map +0 -1
  133. package/dist/src/utils/context.d.ts +0 -14
  134. package/dist/src/utils/context.d.ts.map +0 -1
  135. package/dist/src/utils/context.js +0 -68
  136. package/dist/src/utils/context.js.map +0 -1
  137. package/dist/src/utils/github-webhook.d.ts +0 -3
  138. package/dist/src/utils/github-webhook.d.ts.map +0 -1
  139. package/dist/src/utils/github-webhook.js +0 -105
  140. package/dist/src/utils/github-webhook.js.map +0 -1
  141. package/dist/src/utils/identity.d.ts +0 -124
  142. package/dist/src/utils/identity.d.ts.map +0 -1
  143. package/dist/src/utils/identity.js +0 -434
  144. package/dist/src/utils/identity.js.map +0 -1
  145. package/dist/src/utils/internal-mail.d.ts +0 -18
  146. package/dist/src/utils/internal-mail.d.ts.map +0 -1
  147. package/dist/src/utils/internal-mail.js +0 -75
  148. package/dist/src/utils/internal-mail.js.map +0 -1
  149. package/dist/src/utils/loop-detector.d.ts +0 -27
  150. package/dist/src/utils/loop-detector.d.ts.map +0 -1
  151. package/dist/src/utils/loop-detector.js +0 -42
  152. package/dist/src/utils/loop-detector.js.map +0 -1
  153. package/dist/src/utils/mail-handler.d.ts +0 -19
  154. package/dist/src/utils/mail-handler.d.ts.map +0 -1
  155. package/dist/src/utils/mail-handler.js +0 -94
  156. package/dist/src/utils/mail-handler.js.map +0 -1
  157. package/dist/src/utils/mail.d.ts +0 -22
  158. package/dist/src/utils/mail.d.ts.map +0 -1
  159. package/dist/src/utils/mail.js +0 -111
  160. package/dist/src/utils/mail.js.map +0 -1
  161. package/dist/src/utils/manifest.d.ts +0 -36
  162. package/dist/src/utils/manifest.d.ts.map +0 -1
  163. package/dist/src/utils/manifest.js +0 -94
  164. package/dist/src/utils/manifest.js.map +0 -1
  165. package/dist/src/utils/noise-ik-transport.d.ts +0 -18
  166. package/dist/src/utils/noise-ik-transport.d.ts.map +0 -1
  167. package/dist/src/utils/noise-ik-transport.js +0 -357
  168. package/dist/src/utils/noise-ik-transport.js.map +0 -1
  169. package/dist/src/utils/nono.d.ts +0 -72
  170. package/dist/src/utils/nono.d.ts.map +0 -1
  171. package/dist/src/utils/nono.js +0 -166
  172. package/dist/src/utils/nono.js.map +0 -1
  173. package/dist/src/utils/outbox.d.ts +0 -10
  174. package/dist/src/utils/outbox.d.ts.map +0 -1
  175. package/dist/src/utils/outbox.js +0 -29
  176. package/dist/src/utils/outbox.js.map +0 -1
  177. package/dist/src/utils/output.d.ts +0 -17
  178. package/dist/src/utils/output.d.ts.map +0 -1
  179. package/dist/src/utils/output.js +0 -83
  180. package/dist/src/utils/output.js.map +0 -1
  181. package/dist/src/utils/plain-tcp-transport.d.ts +0 -10
  182. package/dist/src/utils/plain-tcp-transport.d.ts.map +0 -1
  183. package/dist/src/utils/plain-tcp-transport.js +0 -209
  184. package/dist/src/utils/plain-tcp-transport.js.map +0 -1
  185. package/dist/src/utils/provision.d.ts +0 -2
  186. package/dist/src/utils/provision.d.ts.map +0 -1
  187. package/dist/src/utils/provision.js +0 -193
  188. package/dist/src/utils/provision.js.map +0 -1
  189. package/dist/src/utils/relay.d.ts +0 -30
  190. package/dist/src/utils/relay.d.ts.map +0 -1
  191. package/dist/src/utils/relay.js +0 -539
  192. package/dist/src/utils/relay.js.map +0 -1
  193. package/dist/src/utils/sandbox.d.ts +0 -37
  194. package/dist/src/utils/sandbox.d.ts.map +0 -1
  195. package/dist/src/utils/sandbox.js +0 -126
  196. package/dist/src/utils/sandbox.js.map +0 -1
  197. package/dist/src/utils/transport.d.ts +0 -62
  198. package/dist/src/utils/transport.d.ts.map +0 -1
  199. package/dist/src/utils/transport.js +0 -75
  200. package/dist/src/utils/transport.js.map +0 -1
  201. package/dist/src/utils/vault.d.ts +0 -21
  202. package/dist/src/utils/vault.d.ts.map +0 -1
  203. package/dist/src/utils/vault.js +0 -67
  204. package/dist/src/utils/vault.js.map +0 -1
  205. package/dist/src/utils/wall.d.ts +0 -5
  206. package/dist/src/utils/wall.d.ts.map +0 -1
  207. package/dist/src/utils/wall.js +0 -51
  208. package/dist/src/utils/wall.js.map +0 -1
  209. package/dist/src/utils/wire-delivery.d.ts +0 -10
  210. package/dist/src/utils/wire-delivery.d.ts.map +0 -1
  211. package/dist/src/utils/wire-delivery.js +0 -57
  212. package/dist/src/utils/wire-delivery.js.map +0 -1
  213. package/dist/src/utils/wire-frame.d.ts +0 -10
  214. package/dist/src/utils/wire-frame.d.ts.map +0 -1
  215. package/dist/src/utils/wire-frame.js +0 -66
  216. package/dist/src/utils/wire-frame.js.map +0 -1
  217. package/dist/src/utils/wire-mail.d.ts +0 -54
  218. package/dist/src/utils/wire-mail.d.ts.map +0 -1
  219. package/dist/src/utils/wire-mail.js +0 -24
  220. package/dist/src/utils/wire-mail.js.map +0 -1
  221. package/dist/src/utils/workspace.d.ts +0 -14
  222. package/dist/src/utils/workspace.d.ts.map +0 -1
  223. package/dist/src/utils/workspace.js +0 -53
  224. package/dist/src/utils/workspace.js.map +0 -1
  225. package/dist/src/utils/ws-noise-transport.d.ts +0 -18
  226. package/dist/src/utils/ws-noise-transport.d.ts.map +0 -1
  227. package/dist/src/utils/ws-noise-transport.js +0 -356
  228. package/dist/src/utils/ws-noise-transport.js.map +0 -1
@@ -1,54 +0,0 @@
1
- import { z } from "zod";
2
- export declare const MSG_MAIL_DELIVER = 1;
3
- export declare const MSG_MAIL_ACK = 2;
4
- export declare const MSG_JOIN_COMPLETE = 15;
5
- export declare const MSG_HEARTBEAT = 16;
6
- export declare const MailDeliverBodySchema: z.ZodObject<{
7
- id: z.ZodString;
8
- from: z.ZodString;
9
- to: z.ZodString;
10
- content: z.ZodString;
11
- timestamp: z.ZodString;
12
- }, "strip", z.ZodTypeAny, {
13
- id: string;
14
- content: string;
15
- timestamp: string;
16
- from: string;
17
- to: string;
18
- }, {
19
- id: string;
20
- content: string;
21
- timestamp: string;
22
- from: string;
23
- to: string;
24
- }>;
25
- export type MailDeliverBody = z.infer<typeof MailDeliverBodySchema>;
26
- export declare const MailAckBodySchema: z.ZodObject<{
27
- id: z.ZodString;
28
- accepted: z.ZodBoolean;
29
- reason: z.ZodOptional<z.ZodString>;
30
- }, "strip", z.ZodTypeAny, {
31
- id: string;
32
- accepted: boolean;
33
- reason?: string | undefined;
34
- }, {
35
- id: string;
36
- accepted: boolean;
37
- reason?: string | undefined;
38
- }>;
39
- export type MailAckBody = z.infer<typeof MailAckBodySchema>;
40
- export declare const JoinCompleteBodySchema: z.ZodObject<{
41
- hostPubkey: z.ZodString;
42
- hostFingerprint: z.ZodString;
43
- hostId: z.ZodString;
44
- }, "strip", z.ZodTypeAny, {
45
- hostPubkey: string;
46
- hostFingerprint: string;
47
- hostId: string;
48
- }, {
49
- hostPubkey: string;
50
- hostFingerprint: string;
51
- hostId: string;
52
- }>;
53
- export type JoinCompleteBody = z.infer<typeof JoinCompleteBodySchema>;
54
- //# sourceMappingURL=wire-mail.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wire-mail.d.ts","sourceRoot":"","sources":["../../../src/utils/wire-mail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB,IAAO,CAAC;AACrC,eAAO,MAAM,YAAY,IAAO,CAAC;AACjC,eAAO,MAAM,iBAAiB,KAAO,CAAC;AACtC,eAAO,MAAM,aAAa,KAAO,CAAC;AAIlC,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;EAMhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAI5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAIjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -1,24 +0,0 @@
1
- import { z } from "zod";
2
- export const MSG_MAIL_DELIVER = 0x01;
3
- export const MSG_MAIL_ACK = 0x02;
4
- export const MSG_JOIN_COMPLETE = 0x0f;
5
- export const MSG_HEARTBEAT = 0x10;
6
- const SAFE_ID = /^[a-zA-Z0-9._-]{1,64}$/;
7
- export const MailDeliverBodySchema = z.object({
8
- id: z.string().uuid(),
9
- from: z.string().regex(SAFE_ID, "Invalid sender identifier"),
10
- to: z.string().regex(SAFE_ID, "Invalid recipient identifier"),
11
- content: z.string(),
12
- timestamp: z.string().min(1),
13
- });
14
- export const MailAckBodySchema = z.object({
15
- id: z.string().uuid(),
16
- accepted: z.boolean(),
17
- reason: z.string().optional(),
18
- });
19
- export const JoinCompleteBodySchema = z.object({
20
- hostPubkey: z.string(),
21
- hostFingerprint: z.string(),
22
- hostId: z.string(),
23
- });
24
- //# sourceMappingURL=wire-mail.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wire-mail.js","sourceRoot":"","sources":["../../../src/utils/wire-mail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AACrC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AAElC,MAAM,OAAO,GAAG,wBAAwB,CAAC;AAEzC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC5D,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,8BAA8B,CAAC;IAC7D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC7B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACrB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;IAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;CACnB,CAAC,CAAC"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Get the root directory where branch-office workspaces are stored.
3
- */
4
- export declare function branchRoot(): string;
5
- /**
6
- * Resolves the logical team ID for an agent. If the agent is part of a team,
7
- * returns the team's ID. If standalone, returns the agent's ID.
8
- */
9
- export declare function resolveTeamId(agentId: string): string;
10
- /**
11
- * Resolve the workspace path for an agent, accounting for team sidecars.
12
- */
13
- export declare function workspacePath(agentId: string): string;
14
- //# sourceMappingURL=workspace.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/utils/workspace.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA4BrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUrD"}
@@ -1,53 +0,0 @@
1
- import { existsSync, readdirSync, readFileSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { homedir } from "node:os";
4
- import { sanitizeIdentifier } from "../schema/sanitizer.js";
5
- /**
6
- * Get the root directory where branch-office workspaces are stored.
7
- */
8
- export function branchRoot() {
9
- return join(process.env.HOME || homedir(), ".tps", "branch-office");
10
- }
11
- /**
12
- * Resolves the logical team ID for an agent. If the agent is part of a team,
13
- * returns the team's ID. If standalone, returns the agent's ID.
14
- */
15
- export function resolveTeamId(agentId) {
16
- const safeId = sanitizeIdentifier(agentId);
17
- const root = branchRoot();
18
- const teamPath = join(root, safeId);
19
- const teamSidecar = join(teamPath, "team.json");
20
- if (existsSync(teamSidecar)) {
21
- return safeId; // The provided ID is already a team
22
- }
23
- try {
24
- const teams = readdirSync(root).filter((d) => {
25
- return existsSync(join(root, d, "team.json"));
26
- });
27
- for (const team of teams) {
28
- const sidecarPath = join(root, team, "team.json");
29
- const sidecar = JSON.parse(readFileSync(sidecarPath, "utf-8"));
30
- // Note: team.json uses 'members' for agent IDs
31
- if (Array.isArray(sidecar.members) && sidecar.members.includes(safeId)) {
32
- return team; // Agent is a member of this team
33
- }
34
- }
35
- }
36
- catch {
37
- // Fallback
38
- }
39
- return safeId; // Standalone agent
40
- }
41
- /**
42
- * Resolve the workspace path for an agent, accounting for team sidecars.
43
- */
44
- export function workspacePath(agentId) {
45
- const teamId = resolveTeamId(agentId);
46
- const teamPath = join(branchRoot(), teamId);
47
- // If it's a team directory, the actual workspace is in /workspace
48
- if (existsSync(join(teamPath, "team.json"))) {
49
- return join(teamPath, "workspace");
50
- }
51
- return teamPath;
52
- }
53
- //# sourceMappingURL=workspace.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/utils/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAE1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,CAAC,oCAAoC;IACrD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3C,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,+CAA+C;YAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvE,OAAO,IAAI,CAAC,CAAC,iCAAiC;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,WAAW;IACb,CAAC;IAED,OAAO,MAAM,CAAC,CAAC,mBAAmB;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC;IAE5C,kEAAkE;IAClE,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,18 +0,0 @@
1
- import { type BranchTarget, type TransportChannel, type TransportServer, type TpsMessage, type WireTransport } from "./transport.js";
2
- import { type TpsKeyPair } from "./identity.js";
3
- export declare class WsNoiseTransport implements WireTransport {
4
- private readonly localKeyPair;
5
- private readonly hostKeyPair?;
6
- constructor(localKeyPair: TpsKeyPair, hostKeyPair?: TpsKeyPair | undefined);
7
- listen(port: number): Promise<TransportServer>;
8
- connect(target: BranchTarget): Promise<TransportChannel>;
9
- }
10
- export declare function listenForJoinWs(branchKeyPair: TpsKeyPair, port: number, timeoutMs?: number): Promise<{
11
- channel: TransportChannel;
12
- server: TransportServer;
13
- hostPubkey: Uint8Array;
14
- hostFingerprint: string;
15
- hostId: string;
16
- }>;
17
- export declare function listenForHostWs(branchKeyPair: TpsKeyPair, expectedHostPubkey: Uint8Array, port: number, onMessage: (msg: TpsMessage, channel: TransportChannel) => void | Promise<void>): Promise<TransportServer>;
18
- //# sourceMappingURL=ws-noise-transport.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ws-noise-transport.d.ts","sourceRoot":"","sources":["../../../src/utils/ws-noise-transport.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAA+C,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAwI7F,qBAAa,gBAAiB,YAAW,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;gBADZ,YAAY,EAAE,UAAU,EACxB,WAAW,CAAC,EAAE,UAAU,YAAA;IAGrC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAsD9C,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAqE/D;AAED,wBAAsB,eAAe,CACnC,aAAa,EAAE,UAAU,EACzB,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAgB,GAC1B,OAAO,CAAC;IACT,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAmFD;AAED,wBAAsB,eAAe,CACnC,aAAa,EAAE,UAAU,EACzB,kBAAkB,EAAE,UAAU,EAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC9E,OAAO,CAAC,eAAe,CAAC,CAgE1B"}
@@ -1,356 +0,0 @@
1
- import { createServer } from "node:http";
2
- import { EventEmitter } from "node:events";
3
- import { WebSocketServer, WebSocket } from "ws";
4
- import Noise from "noise-handshake/noise.js";
5
- import Cipher from "noise-handshake/cipher.js";
6
- import { decodeWireMessage, encodeWireMessage } from "./wire-frame.js";
7
- import { fingerprint, loadHostIdentity, lookupBranch } from "./identity.js";
8
- import { JoinCompleteBodySchema, MSG_JOIN_COMPLETE } from "./wire-mail.js";
9
- import { handleGithubWebhook } from "./github-webhook.js";
10
- const PROLOGUE = Buffer.from("tps-v1");
11
- const HANDSHAKE_TIMEOUT_MS = 10_000;
12
- const MAX_MESSAGE_BYTES = 1024 * 1024 + 64;
13
- const WS_PATH = "/tps/wire";
14
- function toBuffer(data) {
15
- if (Buffer.isBuffer(data))
16
- return data;
17
- if (Array.isArray(data))
18
- return Buffer.concat(data.map((d) => Buffer.from(d)));
19
- if (data instanceof ArrayBuffer)
20
- return Buffer.from(data);
21
- return Buffer.from(data);
22
- }
23
- function waitForMessage(ws, timeoutMs) {
24
- return new Promise((resolve, reject) => {
25
- const cleanup = () => {
26
- ws.off("close", onClose);
27
- ws.off("error", onErr);
28
- };
29
- const timer = setTimeout(() => {
30
- cleanup();
31
- reject(new Error(`WebSocket message timeout after ${timeoutMs}ms`));
32
- }, timeoutMs);
33
- const onClose = () => {
34
- clearTimeout(timer);
35
- cleanup();
36
- reject(new Error("WebSocket closed before message received"));
37
- };
38
- const onErr = (err) => {
39
- clearTimeout(timer);
40
- cleanup();
41
- reject(err);
42
- };
43
- ws.once("message", (data) => {
44
- clearTimeout(timer);
45
- cleanup();
46
- resolve(toBuffer(data));
47
- });
48
- ws.once("close", onClose);
49
- ws.once("error", onErr);
50
- });
51
- }
52
- class WsNoiseChannel {
53
- ws;
54
- sendCipher;
55
- recvCipher;
56
- peerFp;
57
- alive = true;
58
- emitter = new EventEmitter();
59
- constructor(ws, sendCipher, recvCipher, peerFp) {
60
- this.ws = ws;
61
- this.sendCipher = sendCipher;
62
- this.recvCipher = recvCipher;
63
- this.peerFp = peerFp;
64
- ws.on("close", () => {
65
- this.alive = false;
66
- });
67
- ws.on("message", (data) => {
68
- try {
69
- const raw = toBuffer(data);
70
- if (raw.length > MAX_MESSAGE_BYTES) {
71
- ws.close(1008, "rejected");
72
- return;
73
- }
74
- const decrypted = Buffer.from(this.recvCipher.decrypt(raw));
75
- const msg = decodeWireMessage(decrypted);
76
- this.emitter.emit("message", msg);
77
- }
78
- catch {
79
- ws.close(1008, "rejected");
80
- }
81
- });
82
- }
83
- async send(msg) {
84
- const wire = encodeWireMessage(msg);
85
- const encrypted = Buffer.from(this.sendCipher.encrypt(wire));
86
- await new Promise((resolve, reject) => {
87
- this.ws.send(encrypted, (err) => (err ? reject(err) : resolve()));
88
- });
89
- }
90
- onMessage(handler) {
91
- this.emitter.on("message", handler);
92
- }
93
- offMessage(handler) {
94
- this.emitter.off("message", handler);
95
- }
96
- async close() {
97
- this.ws.close();
98
- this.alive = false;
99
- }
100
- isAlive() {
101
- return this.alive && this.ws.readyState === WebSocket.OPEN;
102
- }
103
- peerFingerprint() {
104
- return this.peerFp;
105
- }
106
- }
107
- class WsNoiseServer {
108
- httpServer;
109
- wss;
110
- onConn = null;
111
- constructor(httpServer, wss) {
112
- this.httpServer = httpServer;
113
- this.wss = wss;
114
- }
115
- port() {
116
- const addr = this.httpServer.address();
117
- if (!addr || typeof addr === "string")
118
- return 0;
119
- return addr.port;
120
- }
121
- onConnection(handler) {
122
- this.onConn = handler;
123
- }
124
- dispatch(channel) {
125
- this.onConn?.(channel);
126
- }
127
- async close() {
128
- await new Promise((resolve) => this.wss.close(() => resolve()));
129
- await new Promise((resolve, reject) => {
130
- this.httpServer.close((err) => (err ? reject(err) : resolve()));
131
- });
132
- }
133
- }
134
- export class WsNoiseTransport {
135
- localKeyPair;
136
- hostKeyPair;
137
- constructor(localKeyPair, hostKeyPair) {
138
- this.localKeyPair = localKeyPair;
139
- this.hostKeyPair = hostKeyPair;
140
- }
141
- async listen(port) {
142
- const host = this.hostKeyPair ?? await loadHostIdentity();
143
- const httpServer = createServer((_req, res) => {
144
- res.statusCode = 404;
145
- res.end();
146
- });
147
- const wss = new WebSocketServer({ server: httpServer, path: WS_PATH });
148
- const wrapper = new WsNoiseServer(httpServer, wss);
149
- const hostStatic = {
150
- publicKey: Buffer.from(host.encryption.publicKey),
151
- secretKey: Buffer.from(host.encryption.privateKey),
152
- };
153
- wss.on("connection", async (ws) => {
154
- try {
155
- const responder = new Noise("IK", false, hostStatic);
156
- responder.initialise(PROLOGUE);
157
- const msg1 = await waitForMessage(ws, HANDSHAKE_TIMEOUT_MS);
158
- const payload = Buffer.from(responder.recv(msg1));
159
- const branchId = payload.toString("utf-8");
160
- const known = lookupBranch(branchId);
161
- const expected = known?.encryptionKey ? Buffer.from(known.encryptionKey) : null;
162
- const got = Buffer.from(responder.rs);
163
- if (!expected || !got.equals(expected)) {
164
- ws.close(1008, "rejected");
165
- return;
166
- }
167
- const msg2 = Buffer.from(responder.send());
168
- ws.send(msg2);
169
- const channel = new WsNoiseChannel(ws, new Cipher(responder.tx), new Cipher(responder.rx), fingerprint(got));
170
- wrapper.dispatch(channel);
171
- }
172
- catch {
173
- ws.close(1008, "rejected");
174
- }
175
- });
176
- await new Promise((resolve, reject) => {
177
- httpServer.listen(port, "0.0.0.0", () => resolve());
178
- httpServer.once("error", reject);
179
- });
180
- return wrapper;
181
- }
182
- async connect(target) {
183
- const isLocal = target.host === "localhost" || target.host === "127.0.0.1" || target.host === "::1";
184
- const scheme = isLocal ? "ws" : "wss";
185
- const url = `${scheme}://${target.host}:${target.port}${WS_PATH}`;
186
- const ws = new WebSocket(url);
187
- // Track early close from server (rejection before handshake completes)
188
- let earlyClose = false;
189
- let earlyCloseReject = null;
190
- await new Promise((resolve, reject) => {
191
- ws.once("open", () => resolve());
192
- ws.once("error", reject);
193
- });
194
- // Attach close handler IMMEDIATELY after open, before any handshake
195
- ws.on("close", () => {
196
- earlyClose = true;
197
- earlyCloseReject?.(new Error("Connection rejected by server"));
198
- });
199
- const localStatic = {
200
- publicKey: Buffer.from(this.localKeyPair.encryption.publicKey),
201
- secretKey: Buffer.from(this.localKeyPair.encryption.privateKey),
202
- };
203
- const initiator = new Noise("IK", true, localStatic);
204
- initiator.initialise(PROLOGUE, Buffer.from(target.hostPublicKey));
205
- const msg1 = Buffer.from(initiator.send(Buffer.from(target.branchId)));
206
- ws.send(msg1);
207
- // Wait for msg2 OR early close
208
- let msg2;
209
- try {
210
- msg2 = await new Promise((resolve, reject) => {
211
- if (earlyClose) {
212
- reject(new Error("Connection rejected by server"));
213
- return;
214
- }
215
- earlyCloseReject = reject;
216
- const timer = setTimeout(() => {
217
- reject(new Error(`Handshake timeout after ${HANDSHAKE_TIMEOUT_MS}ms`));
218
- }, HANDSHAKE_TIMEOUT_MS);
219
- ws.once("message", (data) => {
220
- clearTimeout(timer);
221
- earlyCloseReject = null;
222
- resolve(toBuffer(data));
223
- });
224
- });
225
- }
226
- catch (e) {
227
- ws.close(1008, "rejected");
228
- throw e;
229
- }
230
- initiator.recv(msg2);
231
- const gotHost = Buffer.from(initiator.rs);
232
- const expectedHost = Buffer.from(target.hostPublicKey);
233
- if (!gotHost.equals(expectedHost)) {
234
- ws.close(1008, "rejected");
235
- throw new Error("Host key mismatch after Noise_IK handshake");
236
- }
237
- return new WsNoiseChannel(ws, new Cipher(initiator.tx), new Cipher(initiator.rx), fingerprint(gotHost));
238
- }
239
- }
240
- export async function listenForJoinWs(branchKeyPair, port, timeoutMs = 120_000) {
241
- // Join-mode WS server: raw Noise_IK handshake without registry lookup.
242
- // Analogous to listenForJoin() in noise-ik-transport.ts.
243
- const httpServer = createServer((_req, res) => { res.statusCode = 404; res.end(); });
244
- const wss = new WebSocketServer({ server: httpServer, path: WS_PATH });
245
- const branchStatic = {
246
- publicKey: Buffer.from(branchKeyPair.encryption.publicKey),
247
- secretKey: Buffer.from(branchKeyPair.encryption.privateKey),
248
- };
249
- await new Promise((resolve, reject) => {
250
- httpServer.once("error", reject);
251
- httpServer.listen(port, "0.0.0.0", () => resolve());
252
- });
253
- // Wrap as a TransportServer (for close(); onConnection not used in join mode)
254
- const serverWrapper = {
255
- onConnection: () => { },
256
- close: () => new Promise((resolve, reject) => {
257
- wss.close();
258
- httpServer.close((err) => (err ? reject(err) : resolve()));
259
- }),
260
- };
261
- const joined = new Promise((resolve, reject) => {
262
- const timeout = timeoutMs > 0
263
- ? setTimeout(() => reject(new Error("JOIN_COMPLETE timeout")), timeoutMs)
264
- : null;
265
- wss.once("connection", async (ws) => {
266
- try {
267
- const responder = new Noise("IK", false, branchStatic);
268
- responder.initialise(PROLOGUE);
269
- const msg1 = await waitForMessage(ws, HANDSHAKE_TIMEOUT_MS);
270
- responder.recv(msg1);
271
- const msg2 = Buffer.from(responder.send());
272
- ws.send(msg2);
273
- const channel = new WsNoiseChannel(ws, new Cipher(responder.tx), new Cipher(responder.rx), fingerprint(Buffer.from(responder.rs)));
274
- const handler = (msg) => {
275
- if (msg.type !== MSG_JOIN_COMPLETE)
276
- return;
277
- const parsed = JoinCompleteBodySchema.safeParse(msg.body);
278
- if (!parsed.success)
279
- return;
280
- const hostPub = new Uint8Array(Buffer.from(parsed.data.hostPubkey, "base64url"));
281
- const fp = fingerprint(hostPub);
282
- const claimed = parsed.data.hostFingerprint.replace(/^sha256:/, "");
283
- if (fp !== claimed) {
284
- channel.offMessage(handler);
285
- reject(new Error("Host fingerprint mismatch in JOIN_COMPLETE"));
286
- return;
287
- }
288
- if (timeout)
289
- clearTimeout(timeout);
290
- channel.offMessage(handler);
291
- resolve({ channel, hostPubkey: hostPub, hostFingerprint: fp, hostId: parsed.data.hostId });
292
- };
293
- channel.onMessage(handler);
294
- }
295
- catch (e) {
296
- ws.close(1011, "handshake failed");
297
- reject(e);
298
- }
299
- });
300
- });
301
- const result = await joined;
302
- return { ...result, server: serverWrapper };
303
- }
304
- export async function listenForHostWs(branchKeyPair, expectedHostPubkey, port, onMessage) {
305
- // Branch-side persistent listener: raw Noise_IK handshake without registry lookup.
306
- // After handshake, verify peer is the pinned host key.
307
- const httpServer = createServer((req, res) => {
308
- if (req.method === "POST" && req.url === "/github/webhook") {
309
- handleGithubWebhook(req, res).catch((e) => {
310
- res.statusCode = 500;
311
- res.end("Internal error");
312
- console.error("[webhook] error:", e.message);
313
- });
314
- return;
315
- }
316
- res.statusCode = 404;
317
- res.end();
318
- });
319
- const wss = new WebSocketServer({ server: httpServer, path: WS_PATH });
320
- const branchStatic = {
321
- publicKey: Buffer.from(branchKeyPair.encryption.publicKey),
322
- secretKey: Buffer.from(branchKeyPair.encryption.privateKey),
323
- };
324
- wss.on("connection", async (ws) => {
325
- try {
326
- const responder = new Noise("IK", false, branchStatic);
327
- responder.initialise(PROLOGUE);
328
- const msg1 = await waitForMessage(ws, HANDSHAKE_TIMEOUT_MS);
329
- responder.recv(msg1); // payload = branchId sent by host (ignored here)
330
- const peerKey = Buffer.from(responder.rs);
331
- if (!peerKey.equals(Buffer.from(expectedHostPubkey))) {
332
- ws.close(1008, "rejected");
333
- return;
334
- }
335
- const msg2 = Buffer.from(responder.send());
336
- ws.send(msg2);
337
- const channel = new WsNoiseChannel(ws, new Cipher(responder.tx), new Cipher(responder.rx), fingerprint(Buffer.from(responder.rs)));
338
- channel.onMessage((msg) => onMessage(msg, channel));
339
- }
340
- catch {
341
- ws.close(1011, "handshake failed");
342
- }
343
- });
344
- await new Promise((resolve, reject) => {
345
- httpServer.once("error", reject);
346
- httpServer.listen(port, "0.0.0.0", () => resolve());
347
- });
348
- return {
349
- onConnection: () => { },
350
- close: () => new Promise((resolve, reject) => {
351
- wss.close();
352
- httpServer.close((err) => (err ? reject(err) : resolve()));
353
- }),
354
- };
355
- }
356
- //# sourceMappingURL=ws-noise-transport.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ws-noise-transport.js","sourceRoot":"","sources":["../../../src/utils/ws-noise-transport.ts"],"names":[],"mappings":"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"}