@a5c-ai/tasks-mux 5.0.1-staging.0cf58b544cb8

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 (175) hide show
  1. package/README.md +103 -0
  2. package/dist/auth/forge-interface.d.ts +67 -0
  3. package/dist/auth/forge-interface.d.ts.map +1 -0
  4. package/dist/auth/forge-interface.js +69 -0
  5. package/dist/auth/github-app.d.ts +64 -0
  6. package/dist/auth/github-app.d.ts.map +1 -0
  7. package/dist/auth/github-app.js +141 -0
  8. package/dist/auth/github-oauth.d.ts +27 -0
  9. package/dist/auth/github-oauth.d.ts.map +1 -0
  10. package/dist/auth/github-oauth.js +89 -0
  11. package/dist/auth/index.d.ts +8 -0
  12. package/dist/auth/index.d.ts.map +1 -0
  13. package/dist/auth/index.js +14 -0
  14. package/dist/auth/jwt.d.ts +24 -0
  15. package/dist/auth/jwt.d.ts.map +1 -0
  16. package/dist/auth/jwt.js +43 -0
  17. package/dist/auth/middleware.d.ts +22 -0
  18. package/dist/auth/middleware.d.ts.map +1 -0
  19. package/dist/auth/middleware.js +36 -0
  20. package/dist/auth/ssh-keys.d.ts +21 -0
  21. package/dist/auth/ssh-keys.d.ts.map +1 -0
  22. package/dist/auth/ssh-keys.js +59 -0
  23. package/dist/auth/types.d.ts +165 -0
  24. package/dist/auth/types.d.ts.map +1 -0
  25. package/dist/auth/types.js +53 -0
  26. package/dist/backend.d.ts +117 -0
  27. package/dist/backend.d.ts.map +1 -0
  28. package/dist/backend.js +15 -0
  29. package/dist/backends/git-native.d.ts +51 -0
  30. package/dist/backends/git-native.d.ts.map +1 -0
  31. package/dist/backends/git-native.js +324 -0
  32. package/dist/backends/github-issues.d.ts +77 -0
  33. package/dist/backends/github-issues.d.ts.map +1 -0
  34. package/dist/backends/github-issues.js +796 -0
  35. package/dist/backends/index.d.ts +48 -0
  36. package/dist/backends/index.d.ts.map +1 -0
  37. package/dist/backends/index.js +139 -0
  38. package/dist/backends/server.d.ts +41 -0
  39. package/dist/backends/server.d.ts.map +1 -0
  40. package/dist/backends/server.js +298 -0
  41. package/dist/cli/auth-store.d.ts +49 -0
  42. package/dist/cli/auth-store.d.ts.map +1 -0
  43. package/dist/cli/auth-store.js +150 -0
  44. package/dist/cli/client-config.d.ts +10 -0
  45. package/dist/cli/client-config.d.ts.map +1 -0
  46. package/dist/cli/client-config.js +87 -0
  47. package/dist/cli/commands/ask.d.ts +3 -0
  48. package/dist/cli/commands/ask.d.ts.map +1 -0
  49. package/dist/cli/commands/ask.js +171 -0
  50. package/dist/cli/commands/auth.d.ts +3 -0
  51. package/dist/cli/commands/auth.d.ts.map +1 -0
  52. package/dist/cli/commands/auth.js +510 -0
  53. package/dist/cli/commands/breakpoints.d.ts +3 -0
  54. package/dist/cli/commands/breakpoints.d.ts.map +1 -0
  55. package/dist/cli/commands/breakpoints.js +152 -0
  56. package/dist/cli/commands/responder-loop.d.ts +3 -0
  57. package/dist/cli/commands/responder-loop.d.ts.map +1 -0
  58. package/dist/cli/commands/responder-loop.js +78 -0
  59. package/dist/cli/commands/responders.d.ts +3 -0
  60. package/dist/cli/commands/responders.d.ts.map +1 -0
  61. package/dist/cli/commands/responders.js +74 -0
  62. package/dist/cli/commands/server.d.ts +3 -0
  63. package/dist/cli/commands/server.d.ts.map +1 -0
  64. package/dist/cli/commands/server.js +34 -0
  65. package/dist/cli/index.d.ts +4 -0
  66. package/dist/cli/index.d.ts.map +1 -0
  67. package/dist/cli/index.js +9 -0
  68. package/dist/cli/output.d.ts +26 -0
  69. package/dist/cli/output.d.ts.map +1 -0
  70. package/dist/cli/output.js +143 -0
  71. package/dist/cli/program.d.ts +6 -0
  72. package/dist/cli/program.d.ts.map +1 -0
  73. package/dist/cli/program.js +32 -0
  74. package/dist/client/answer-poller.d.ts +52 -0
  75. package/dist/client/answer-poller.d.ts.map +1 -0
  76. package/dist/client/answer-poller.js +199 -0
  77. package/dist/client/auth-client.d.ts +200 -0
  78. package/dist/client/auth-client.d.ts.map +1 -0
  79. package/dist/client/auth-client.js +309 -0
  80. package/dist/client/breakpoint-router.d.ts +45 -0
  81. package/dist/client/breakpoint-router.d.ts.map +1 -0
  82. package/dist/client/breakpoint-router.js +45 -0
  83. package/dist/client/index.d.ts +17 -0
  84. package/dist/client/index.d.ts.map +1 -0
  85. package/dist/client/index.js +16 -0
  86. package/dist/client/profile-validator.d.ts +34 -0
  87. package/dist/client/profile-validator.d.ts.map +1 -0
  88. package/dist/client/profile-validator.js +89 -0
  89. package/dist/client/responder-client.d.ts +39 -0
  90. package/dist/client/responder-client.d.ts.map +1 -0
  91. package/dist/client/responder-client.js +72 -0
  92. package/dist/client/responder-matcher.d.ts +49 -0
  93. package/dist/client/responder-matcher.d.ts.map +1 -0
  94. package/dist/client/responder-matcher.js +226 -0
  95. package/dist/client/server-client.d.ts +124 -0
  96. package/dist/client/server-client.d.ts.map +1 -0
  97. package/dist/client/server-client.js +266 -0
  98. package/dist/client/timeout-manager.d.ts +47 -0
  99. package/dist/client/timeout-manager.d.ts.map +1 -0
  100. package/dist/client/timeout-manager.js +77 -0
  101. package/dist/config.d.ts +20 -0
  102. package/dist/config.d.ts.map +1 -0
  103. package/dist/config.js +93 -0
  104. package/dist/harness/index.d.ts +4 -0
  105. package/dist/harness/index.d.ts.map +1 -0
  106. package/dist/harness/index.js +2 -0
  107. package/dist/harness/interaction-provider.d.ts +71 -0
  108. package/dist/harness/interaction-provider.d.ts.map +1 -0
  109. package/dist/harness/interaction-provider.js +124 -0
  110. package/dist/harness/routing-rules.d.ts +7 -0
  111. package/dist/harness/routing-rules.d.ts.map +1 -0
  112. package/dist/harness/routing-rules.js +37 -0
  113. package/dist/index.d.ts +19 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +26 -0
  116. package/dist/mcp/backend-resolver.d.ts +43 -0
  117. package/dist/mcp/backend-resolver.d.ts.map +1 -0
  118. package/dist/mcp/backend-resolver.js +111 -0
  119. package/dist/mcp/http-transport.d.ts +37 -0
  120. package/dist/mcp/http-transport.d.ts.map +1 -0
  121. package/dist/mcp/http-transport.js +103 -0
  122. package/dist/mcp/index.d.ts +14 -0
  123. package/dist/mcp/index.d.ts.map +1 -0
  124. package/dist/mcp/index.js +11 -0
  125. package/dist/mcp/server.d.ts +20 -0
  126. package/dist/mcp/server.d.ts.map +1 -0
  127. package/dist/mcp/server.js +121 -0
  128. package/dist/mcp/tools/answer-breakpoint.d.ts +32 -0
  129. package/dist/mcp/tools/answer-breakpoint.d.ts.map +1 -0
  130. package/dist/mcp/tools/answer-breakpoint.js +45 -0
  131. package/dist/mcp/tools/ask-breakpoint.d.ts +58 -0
  132. package/dist/mcp/tools/ask-breakpoint.d.ts.map +1 -0
  133. package/dist/mcp/tools/ask-breakpoint.js +78 -0
  134. package/dist/mcp/tools/check-status.d.ts +16 -0
  135. package/dist/mcp/tools/check-status.d.ts.map +1 -0
  136. package/dist/mcp/tools/check-status.js +18 -0
  137. package/dist/mcp/tools/claim-breakpoint.d.ts +18 -0
  138. package/dist/mcp/tools/claim-breakpoint.d.ts.map +1 -0
  139. package/dist/mcp/tools/claim-breakpoint.js +28 -0
  140. package/dist/mcp/tools/list-breakpoints.d.ts +16 -0
  141. package/dist/mcp/tools/list-breakpoints.d.ts.map +1 -0
  142. package/dist/mcp/tools/list-breakpoints.js +14 -0
  143. package/dist/mcp/tools/list-responders.d.ts +18 -0
  144. package/dist/mcp/tools/list-responders.d.ts.map +1 -0
  145. package/dist/mcp/tools/list-responders.js +37 -0
  146. package/dist/mcp/tools/poll-breakpoints.d.ts +18 -0
  147. package/dist/mcp/tools/poll-breakpoints.d.ts.map +1 -0
  148. package/dist/mcp/tools/poll-breakpoints.js +36 -0
  149. package/dist/mcp/tools/verify-answer.d.ts +16 -0
  150. package/dist/mcp/tools/verify-answer.d.ts.map +1 -0
  151. package/dist/mcp/tools/verify-answer.js +38 -0
  152. package/dist/proven/index.d.ts +5 -0
  153. package/dist/proven/index.d.ts.map +1 -0
  154. package/dist/proven/index.js +3 -0
  155. package/dist/proven/keys.d.ts +33 -0
  156. package/dist/proven/keys.d.ts.map +1 -0
  157. package/dist/proven/keys.js +117 -0
  158. package/dist/proven/sign.d.ts +16 -0
  159. package/dist/proven/sign.d.ts.map +1 -0
  160. package/dist/proven/sign.js +60 -0
  161. package/dist/proven/types.d.ts +26 -0
  162. package/dist/proven/types.d.ts.map +1 -0
  163. package/dist/proven/types.js +5 -0
  164. package/dist/proven/verify.d.ts +6 -0
  165. package/dist/proven/verify.d.ts.map +1 -0
  166. package/dist/proven/verify.js +58 -0
  167. package/dist/types.d.ts +4034 -0
  168. package/dist/types.d.ts.map +1 -0
  169. package/dist/types.js +244 -0
  170. package/package.json +86 -0
  171. package/responder/README.md +42 -0
  172. package/responder/backend-responder.json +9 -0
  173. package/responder/devops-responder.json +9 -0
  174. package/responder/frontend-responder.json +9 -0
  175. package/responder/schema.json +52 -0
@@ -0,0 +1,43 @@
1
+ import jwt from "jsonwebtoken";
2
+ import { JWTPayloadSchema } from "./types.js";
3
+ // ── Constants ─────────────────────────────────────────────────────────────
4
+ const ALGORITHM = "HS256";
5
+ const DEFAULT_ACCESS_TOKEN_EXPIRY = "1h";
6
+ const DEFAULT_REFRESH_TOKEN_EXPIRY = "7d";
7
+ // ── Sign / Verify ─────────────────────────────────────────────────────────
8
+ /**
9
+ * Sign a JWT access token with the given payload and secret.
10
+ */
11
+ export function signAccessToken(payload, secret, expiresIn = DEFAULT_ACCESS_TOKEN_EXPIRY) {
12
+ return jwt.sign({ ...payload, type: "access" }, secret, { algorithm: ALGORITHM, expiresIn });
13
+ }
14
+ /**
15
+ * Sign a JWT refresh token with the given payload and secret.
16
+ */
17
+ export function signRefreshToken(payload, secret, expiresIn = DEFAULT_REFRESH_TOKEN_EXPIRY) {
18
+ return jwt.sign({ ...payload, type: "refresh" }, secret, { algorithm: ALGORITHM, expiresIn });
19
+ }
20
+ /**
21
+ * Verify a JWT token and return its decoded payload.
22
+ * Throws if the token is invalid or expired.
23
+ */
24
+ export function verifyToken(token, secret) {
25
+ const decoded = jwt.verify(token, secret, { algorithms: [ALGORITHM] });
26
+ const result = JWTPayloadSchema.parse(decoded);
27
+ return result;
28
+ }
29
+ /**
30
+ * Refresh an access token using a valid refresh token.
31
+ * Returns a new access token and a new refresh token.
32
+ */
33
+ export function refreshAccessToken(refreshToken, secret) {
34
+ const payload = verifyToken(refreshToken, secret);
35
+ if (payload.type !== "refresh") {
36
+ throw new Error("Token is not a refresh token");
37
+ }
38
+ const tokenPayload = { sub: payload.sub, login: payload.login, name: payload.name };
39
+ return {
40
+ accessToken: signAccessToken(tokenPayload, secret),
41
+ refreshToken: signRefreshToken(tokenPayload, secret),
42
+ };
43
+ }
@@ -0,0 +1,22 @@
1
+ import type { Request, Response, NextFunction } from "express";
2
+ import type { JWTPayload } from "./types.js";
3
+ declare module "express" {
4
+ interface Request {
5
+ user?: JWTPayload;
6
+ }
7
+ }
8
+ export interface AuthMiddlewareOpts {
9
+ /** The secret used to verify JWT tokens. */
10
+ secret: string;
11
+ /** If true, returns 401 on missing or invalid token. Defaults to false. */
12
+ required?: boolean;
13
+ }
14
+ /**
15
+ * Create Express middleware that extracts and verifies a JWT from the
16
+ * Authorization: Bearer header.
17
+ *
18
+ * If `required` is true, returns 401 on missing or invalid tokens.
19
+ * If `required` is false (default), continues without auth when no token is present.
20
+ */
21
+ export declare function createAuthMiddleware(opts: AuthMiddlewareOpts): (req: Request, res: Response, next: NextFunction) => void;
22
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK7C,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,OAAO;QACf,IAAI,CAAC,EAAE,UAAU,CAAC;KACnB;CACF;AAID,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAID;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,kBAAkB,GACvB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CA6B3D"}
@@ -0,0 +1,36 @@
1
+ import { verifyToken } from "./jwt.js";
2
+ // ── Middleware ─────────────────────────────────────────────────────────────
3
+ /**
4
+ * Create Express middleware that extracts and verifies a JWT from the
5
+ * Authorization: Bearer header.
6
+ *
7
+ * If `required` is true, returns 401 on missing or invalid tokens.
8
+ * If `required` is false (default), continues without auth when no token is present.
9
+ */
10
+ export function createAuthMiddleware(opts) {
11
+ const { secret, required = false } = opts;
12
+ return (req, res, next) => {
13
+ const authHeader = req.headers.authorization;
14
+ if (!authHeader || !authHeader.startsWith("Bearer ")) {
15
+ if (required) {
16
+ res.status(401).json({ error: "Authorization header with Bearer token is required" });
17
+ return;
18
+ }
19
+ next();
20
+ return;
21
+ }
22
+ const token = authHeader.slice(7);
23
+ try {
24
+ const payload = verifyToken(token, secret);
25
+ req.user = payload;
26
+ next();
27
+ }
28
+ catch {
29
+ if (required) {
30
+ res.status(401).json({ error: "Invalid or expired token" });
31
+ return;
32
+ }
33
+ next();
34
+ }
35
+ };
36
+ }
@@ -0,0 +1,21 @@
1
+ import type { SSHKeyPair } from "./types.js";
2
+ /**
3
+ * Generate an Ed25519 SSH key pair.
4
+ */
5
+ export declare function generateSSHKeyPair(): SSHKeyPair;
6
+ /**
7
+ * Parse a public key string and return its algorithm and fingerprint.
8
+ */
9
+ export declare function parsePublicKey(key: string): {
10
+ algorithm: string;
11
+ fingerprint: string;
12
+ };
13
+ /**
14
+ * Calculate the SHA256 fingerprint of a public key (base64 encoded).
15
+ */
16
+ export declare function calculateFingerprint(publicKey: string): string;
17
+ /**
18
+ * Format a public key as an authorized_keys entry with an optional comment.
19
+ */
20
+ export declare function formatAuthorizedKey(publicKey: string, comment?: string): string;
21
+ //# sourceMappingURL=ssh-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-keys.d.ts","sourceRoot":"","sources":["../../src/auth/ssh-keys.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQ7C;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,UAAU,CAe/C;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CActF;AAID;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG9D;AAID;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAM/E"}
@@ -0,0 +1,59 @@
1
+ import { generateKeyPairSync, createHash } from "node:crypto";
2
+ // ── Constants ─────────────────────────────────────────────────────────────
3
+ const DEFAULT_ALGORITHM = "ed25519";
4
+ // ── Key Generation ────────────────────────────────────────────────────────
5
+ /**
6
+ * Generate an Ed25519 SSH key pair.
7
+ */
8
+ export function generateSSHKeyPair() {
9
+ const { publicKey, privateKey } = generateKeyPairSync("ed25519", {
10
+ publicKeyEncoding: { type: "spki", format: "pem" },
11
+ privateKeyEncoding: { type: "pkcs8", format: "pem" },
12
+ });
13
+ const fingerprint = calculateFingerprint(publicKey);
14
+ return {
15
+ publicKey,
16
+ privateKey,
17
+ fingerprint,
18
+ algorithm: DEFAULT_ALGORITHM,
19
+ createdAt: new Date().toISOString(),
20
+ };
21
+ }
22
+ // ── Key Parsing ───────────────────────────────────────────────────────────
23
+ /**
24
+ * Parse a public key string and return its algorithm and fingerprint.
25
+ */
26
+ export function parsePublicKey(key) {
27
+ const fingerprint = calculateFingerprint(key);
28
+ // Detect algorithm from key content
29
+ let algorithm = "unknown";
30
+ if (key.includes("ssh-ed25519") || key.includes("ED25519")) {
31
+ algorithm = "ed25519";
32
+ }
33
+ else if (key.includes("ssh-rsa") || key.includes("RSA")) {
34
+ algorithm = "rsa";
35
+ }
36
+ else if (key.includes("ecdsa") || key.includes("EC")) {
37
+ algorithm = "ecdsa";
38
+ }
39
+ return { algorithm, fingerprint };
40
+ }
41
+ // ── Fingerprint ───────────────────────────────────────────────────────────
42
+ /**
43
+ * Calculate the SHA256 fingerprint of a public key (base64 encoded).
44
+ */
45
+ export function calculateFingerprint(publicKey) {
46
+ const hash = createHash("sha256").update(publicKey.trim()).digest("base64");
47
+ return `SHA256:${hash}`;
48
+ }
49
+ // ── Formatting ────────────────────────────────────────────────────────────
50
+ /**
51
+ * Format a public key as an authorized_keys entry with an optional comment.
52
+ */
53
+ export function formatAuthorizedKey(publicKey, comment) {
54
+ const trimmed = publicKey.trim();
55
+ if (comment) {
56
+ return `${trimmed} ${comment}`;
57
+ }
58
+ return trimmed;
59
+ }
@@ -0,0 +1,165 @@
1
+ import { z } from "zod";
2
+ export declare const UserSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ login: z.ZodString;
5
+ name: z.ZodString;
6
+ email: z.ZodString;
7
+ avatarUrl: z.ZodString;
8
+ provider: z.ZodLiteral<"github">;
9
+ }, "strip", z.ZodTypeAny, {
10
+ id: string;
11
+ name: string;
12
+ login: string;
13
+ email: string;
14
+ avatarUrl: string;
15
+ provider: "github";
16
+ }, {
17
+ id: string;
18
+ name: string;
19
+ login: string;
20
+ email: string;
21
+ avatarUrl: string;
22
+ provider: "github";
23
+ }>;
24
+ export type User = z.infer<typeof UserSchema>;
25
+ export declare const AuthTokenSchema: z.ZodObject<{
26
+ accessToken: z.ZodString;
27
+ refreshToken: z.ZodString;
28
+ expiresAt: z.ZodString;
29
+ user: z.ZodObject<{
30
+ id: z.ZodString;
31
+ login: z.ZodString;
32
+ name: z.ZodString;
33
+ email: z.ZodString;
34
+ avatarUrl: z.ZodString;
35
+ provider: z.ZodLiteral<"github">;
36
+ }, "strip", z.ZodTypeAny, {
37
+ id: string;
38
+ name: string;
39
+ login: string;
40
+ email: string;
41
+ avatarUrl: string;
42
+ provider: "github";
43
+ }, {
44
+ id: string;
45
+ name: string;
46
+ login: string;
47
+ email: string;
48
+ avatarUrl: string;
49
+ provider: "github";
50
+ }>;
51
+ }, "strip", z.ZodTypeAny, {
52
+ expiresAt: string;
53
+ user: {
54
+ id: string;
55
+ name: string;
56
+ login: string;
57
+ email: string;
58
+ avatarUrl: string;
59
+ provider: "github";
60
+ };
61
+ accessToken: string;
62
+ refreshToken: string;
63
+ }, {
64
+ expiresAt: string;
65
+ user: {
66
+ id: string;
67
+ name: string;
68
+ login: string;
69
+ email: string;
70
+ avatarUrl: string;
71
+ provider: "github";
72
+ };
73
+ accessToken: string;
74
+ refreshToken: string;
75
+ }>;
76
+ export type AuthToken = z.infer<typeof AuthTokenSchema>;
77
+ export declare const JWTPayloadSchema: z.ZodObject<{
78
+ sub: z.ZodString;
79
+ login: z.ZodString;
80
+ name: z.ZodString;
81
+ iat: z.ZodNumber;
82
+ exp: z.ZodNumber;
83
+ type: z.ZodEnum<["access", "refresh"]>;
84
+ }, "strip", z.ZodTypeAny, {
85
+ type: "access" | "refresh";
86
+ name: string;
87
+ sub: string;
88
+ login: string;
89
+ iat: number;
90
+ exp: number;
91
+ }, {
92
+ type: "access" | "refresh";
93
+ name: string;
94
+ sub: string;
95
+ login: string;
96
+ iat: number;
97
+ exp: number;
98
+ }>;
99
+ export type JWTPayload = z.infer<typeof JWTPayloadSchema>;
100
+ export declare const SSHKeyPairSchema: z.ZodObject<{
101
+ publicKey: z.ZodString;
102
+ privateKey: z.ZodString;
103
+ fingerprint: z.ZodString;
104
+ algorithm: z.ZodString;
105
+ createdAt: z.ZodString;
106
+ }, "strip", z.ZodTypeAny, {
107
+ createdAt: string;
108
+ publicKey: string;
109
+ privateKey: string;
110
+ fingerprint: string;
111
+ algorithm: string;
112
+ }, {
113
+ createdAt: string;
114
+ publicKey: string;
115
+ privateKey: string;
116
+ fingerprint: string;
117
+ algorithm: string;
118
+ }>;
119
+ export type SSHKeyPair = z.infer<typeof SSHKeyPairSchema>;
120
+ export declare const GitForgeConfigSchema: z.ZodObject<{
121
+ type: z.ZodEnum<["github", "gitlab", "bitbucket"]>;
122
+ baseUrl: z.ZodString;
123
+ credentials: z.ZodRecord<z.ZodString, z.ZodString>;
124
+ }, "strip", z.ZodTypeAny, {
125
+ type: "github" | "gitlab" | "bitbucket";
126
+ baseUrl: string;
127
+ credentials: Record<string, string>;
128
+ }, {
129
+ type: "github" | "gitlab" | "bitbucket";
130
+ baseUrl: string;
131
+ credentials: Record<string, string>;
132
+ }>;
133
+ export type GitForgeConfig = z.infer<typeof GitForgeConfigSchema>;
134
+ export declare const GitHubOAuthConfigSchema: z.ZodObject<{
135
+ clientId: z.ZodString;
136
+ clientSecret: z.ZodString;
137
+ callbackUrl: z.ZodString;
138
+ scopes: z.ZodArray<z.ZodString, "many">;
139
+ }, "strip", z.ZodTypeAny, {
140
+ clientId: string;
141
+ clientSecret: string;
142
+ callbackUrl: string;
143
+ scopes: string[];
144
+ }, {
145
+ clientId: string;
146
+ clientSecret: string;
147
+ callbackUrl: string;
148
+ scopes: string[];
149
+ }>;
150
+ export type GitHubOAuthConfig = z.infer<typeof GitHubOAuthConfigSchema>;
151
+ export declare const GitHubAppConfigSchema: z.ZodObject<{
152
+ appId: z.ZodString;
153
+ privateKey: z.ZodString;
154
+ webhookSecret: z.ZodOptional<z.ZodString>;
155
+ }, "strip", z.ZodTypeAny, {
156
+ privateKey: string;
157
+ appId: string;
158
+ webhookSecret?: string | undefined;
159
+ }, {
160
+ privateKey: string;
161
+ appId: string;
162
+ webhookSecret?: string | undefined;
163
+ }>;
164
+ export type GitHubAppConfig = z.infer<typeof GitHubAppConfigSchema>;
165
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;EAOrB,CAAC;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAI9C,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAIxD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;EAO3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAI1D,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;EAM3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAI1D,eAAO,MAAM,oBAAoB;;;;;;;;;;;;EAI/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIlE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAKlC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAIxE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;EAIhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ // ── User ──────────────────────────────────────────────────────────────────
3
+ export const UserSchema = z.object({
4
+ id: z.string().min(1),
5
+ login: z.string().min(1),
6
+ name: z.string().min(1),
7
+ email: z.string().email(),
8
+ avatarUrl: z.string().url(),
9
+ provider: z.literal("github"),
10
+ });
11
+ // ── AuthToken ─────────────────────────────────────────────────────────────
12
+ export const AuthTokenSchema = z.object({
13
+ accessToken: z.string().min(1),
14
+ refreshToken: z.string().min(1),
15
+ expiresAt: z.string().datetime(),
16
+ user: UserSchema,
17
+ });
18
+ // ── JWTPayload ────────────────────────────────────────────────────────────
19
+ export const JWTPayloadSchema = z.object({
20
+ sub: z.string().min(1),
21
+ login: z.string().min(1),
22
+ name: z.string().min(1),
23
+ iat: z.number().int(),
24
+ exp: z.number().int(),
25
+ type: z.enum(["access", "refresh"]),
26
+ });
27
+ // ── SSHKeyPair ────────────────────────────────────────────────────────────
28
+ export const SSHKeyPairSchema = z.object({
29
+ publicKey: z.string().min(1),
30
+ privateKey: z.string().min(1),
31
+ fingerprint: z.string().min(1),
32
+ algorithm: z.string().min(1),
33
+ createdAt: z.string().datetime(),
34
+ });
35
+ // ── GitForgeConfig ────────────────────────────────────────────────────────
36
+ export const GitForgeConfigSchema = z.object({
37
+ type: z.enum(["github", "gitlab", "bitbucket"]),
38
+ baseUrl: z.string().url(),
39
+ credentials: z.record(z.string(), z.string()),
40
+ });
41
+ // ── GitHubOAuthConfig ─────────────────────────────────────────────────────
42
+ export const GitHubOAuthConfigSchema = z.object({
43
+ clientId: z.string().min(1),
44
+ clientSecret: z.string().min(1),
45
+ callbackUrl: z.string().url(),
46
+ scopes: z.array(z.string()),
47
+ });
48
+ // ── GitHubAppConfig ───────────────────────────────────────────────────────
49
+ export const GitHubAppConfigSchema = z.object({
50
+ appId: z.string().min(1),
51
+ privateKey: z.string().min(1),
52
+ webhookSecret: z.string().optional(),
53
+ });
@@ -0,0 +1,117 @@
1
+ import type { Breakpoint, BreakpointPublicAnswer, BreakpointContext, BreakpointRouting, BreakpointWaitResult, ResponderProfile } from "./types.js";
2
+ /**
3
+ * Parameters for submitting a new breakpoint to a backend.
4
+ */
5
+ export interface SubmitBreakpointParams {
6
+ /** The breakpoint question text. */
7
+ text: string;
8
+ /** Rich context for the breakpoint. */
9
+ context: BreakpointContext;
10
+ /** Routing configuration. */
11
+ routing: BreakpointRouting;
12
+ /** Whether the requester requires a signed answer. */
13
+ proven?: boolean;
14
+ /** Optional project scope. */
15
+ projectId?: string;
16
+ /** Optional repository scope. */
17
+ repoId?: string;
18
+ }
19
+ /**
20
+ * Options for waiting for an answer from a backend.
21
+ */
22
+ export interface WaitForAnswerOptions {
23
+ /** Maximum time to wait in milliseconds. */
24
+ timeoutMs?: number;
25
+ /** Polling interval in milliseconds (for polling-based backends). */
26
+ pollIntervalMs?: number;
27
+ /** Whether to prefer event-based updates over polling. */
28
+ preferStreaming?: boolean;
29
+ /** AbortSignal for external cancellation. */
30
+ signal?: AbortSignal;
31
+ }
32
+ /**
33
+ * Parameters for submitting an answer to a breakpoint.
34
+ */
35
+ export interface SubmitAnswerParams {
36
+ /** ID of the responder submitting the answer. */
37
+ responderId: string;
38
+ /** Display name of the responder. */
39
+ responderName: string;
40
+ /** The answer text. */
41
+ text: string;
42
+ /** Whether the breakpoint action is approved (for approval-type breakpoints). */
43
+ approved?: boolean;
44
+ /** Confidence score 0-100. */
45
+ confidence?: number;
46
+ /** Reference links or file paths. */
47
+ references?: string[];
48
+ /** Follow-up questions to consider. */
49
+ followUpQuestions?: string[];
50
+ /** Decision memory for future reference. */
51
+ decisionMemory?: {
52
+ applicabilityContext: string;
53
+ reasoning: string;
54
+ };
55
+ /** Whether the responder explicitly requests signing. */
56
+ sign?: boolean;
57
+ /** Specific signing key fingerprint to use when signing. */
58
+ keyFingerprint?: string;
59
+ }
60
+ /**
61
+ * Options for listing responders.
62
+ */
63
+ export interface ListRespondersParams {
64
+ projectId?: string;
65
+ repoId?: string;
66
+ }
67
+ /**
68
+ * Backend-agnostic interface for breakpoint lifecycle operations.
69
+ *
70
+ * Implementations may target different transports (git filesystem,
71
+ * HTTP server, GitHub Issues, etc.) while presenting a uniform API.
72
+ */
73
+ export interface BreakpointBackend {
74
+ /** Human-readable name for this backend (e.g., "git-native", "server"). */
75
+ readonly name: string;
76
+ /**
77
+ * Submit a new breakpoint.
78
+ * Returns the created Breakpoint with a backend-assigned ID.
79
+ */
80
+ submitBreakpoint(params: SubmitBreakpointParams): Promise<Breakpoint>;
81
+ /**
82
+ * Retrieve a breakpoint by its ID.
83
+ */
84
+ getBreakpoint(id: string): Promise<Breakpoint>;
85
+ /**
86
+ * Wait for an answer to a breakpoint.
87
+ * Resolves when an answer arrives, the breakpoint reaches a terminal state,
88
+ * the timeout elapses, or the operation is aborted.
89
+ */
90
+ waitForAnswer(id: string, options?: WaitForAnswerOptions): Promise<BreakpointWaitResult>;
91
+ /**
92
+ * List pending breakpoints, optionally filtered by responder.
93
+ */
94
+ listPendingBreakpoints(responderId?: string): Promise<Breakpoint[]>;
95
+ /**
96
+ * Submit an answer for a breakpoint.
97
+ */
98
+ answerBreakpoint(id: string, answer: SubmitAnswerParams): Promise<BreakpointPublicAnswer>;
99
+ /**
100
+ * Cancel a pending breakpoint.
101
+ */
102
+ cancelBreakpoint(id: string): Promise<void>;
103
+ /**
104
+ * List available responder profiles.
105
+ * Optional -- backends that don't manage responder discovery may return [].
106
+ */
107
+ listResponders?(params?: ListRespondersParams): Promise<ResponderProfile[]>;
108
+ /**
109
+ * Claim a breakpoint, indicating intent to answer.
110
+ * Optional -- not all backends support explicit claiming.
111
+ */
112
+ claimBreakpoint?(id: string, responderId: string): Promise<Breakpoint>;
113
+ }
114
+ export declare function selectBreakpointAnswer(breakpoint: Pick<Breakpoint, "answers" | "selectedAnswer">): BreakpointPublicAnswer | undefined;
115
+ export declare function supportsProvenAnswers(backendName: string): boolean;
116
+ export declare function unsupportedBackendFeatureMessage(backendName: string, feature: string): string;
117
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export function selectBreakpointAnswer(breakpoint) {
2
+ if (breakpoint.answers.length === 0) {
3
+ return undefined;
4
+ }
5
+ if (breakpoint.selectedAnswer) {
6
+ return breakpoint.answers.find((answer) => answer.id === breakpoint.selectedAnswer);
7
+ }
8
+ return breakpoint.answers[0];
9
+ }
10
+ export function supportsProvenAnswers(backendName) {
11
+ return backendName === "git-native";
12
+ }
13
+ export function unsupportedBackendFeatureMessage(backendName, feature) {
14
+ return `Backend "${backendName}" does not support ${feature}. Proven signing is currently supported only by "git-native".`;
15
+ }
@@ -0,0 +1,51 @@
1
+ import type { BreakpointBackend, SubmitBreakpointParams, WaitForAnswerOptions, SubmitAnswerParams } from "../backend.js";
2
+ import type { Breakpoint, BreakpointPublicAnswer, BreakpointWaitResult, ProvenVerificationResult } from "../types.js";
3
+ export interface GitNativeBackendOptions {
4
+ /** Path to the .breakpoints directory. Defaults to `.breakpoints` in cwd. */
5
+ breakpointsDir?: string;
6
+ /** Default poll interval in ms. Defaults to 3000. */
7
+ pollIntervalMs?: number;
8
+ /** Default timeout in ms. Defaults to 30 minutes. */
9
+ timeoutMs?: number;
10
+ /** Path to a .key.json private key file for signing answers. Optional. */
11
+ signingKeyPath?: string;
12
+ }
13
+ export declare class GitNativeBackend implements BreakpointBackend {
14
+ readonly name = "git-native";
15
+ private breakpointsDir;
16
+ private defaultPollIntervalMs;
17
+ private defaultTimeoutMs;
18
+ private signingKeyPath;
19
+ constructor(options?: GitNativeBackendOptions);
20
+ private breakpointPath;
21
+ private answerPath;
22
+ private provenPath;
23
+ /**
24
+ * Load the signing key from the configured signingKeyPath.
25
+ * Returns null if no signing key is configured or the file cannot be read.
26
+ */
27
+ private loadSigningKey;
28
+ /**
29
+ * Load a proven answer file for a breakpoint, if it exists.
30
+ */
31
+ private loadProvenAnswer;
32
+ private loadStoredAnswer;
33
+ private loadPublicAnswer;
34
+ submitBreakpoint(params: SubmitBreakpointParams): Promise<Breakpoint>;
35
+ getBreakpoint(id: string): Promise<Breakpoint>;
36
+ waitForAnswer(id: string, options?: WaitForAnswerOptions): Promise<BreakpointWaitResult>;
37
+ listPendingBreakpoints(responderId?: string): Promise<Breakpoint[]>;
38
+ answerBreakpoint(id: string, answer: SubmitAnswerParams): Promise<BreakpointPublicAnswer>;
39
+ cancelBreakpoint(id: string): Promise<void>;
40
+ claimBreakpoint(id: string, responderId: string): Promise<Breakpoint>;
41
+ /**
42
+ * Verify the selected public answer against trusted public keys.
43
+ */
44
+ verifyAnswer(id: string): Promise<ProvenVerificationResult>;
45
+ /**
46
+ * Verify a loaded ProvenBreakpointAnswer against trusted keys in the
47
+ * breakpoints directory.
48
+ */
49
+ private verifyProvenFile;
50
+ }
51
+ //# sourceMappingURL=git-native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-native.d.ts","sourceRoot":"","sources":["../../src/backends/git-native.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EACV,UAAU,EAEV,sBAAsB,EACtB,oBAAoB,EAEpB,wBAAwB,EACzB,MAAM,aAAa,CAAC;AAgBrB,MAAM,WAAW,uBAAuB;IACtC,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,QAAQ,CAAC,IAAI,gBAAgB;IAE7B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,cAAc,CAAqB;gBAE/B,OAAO,CAAC,EAAE,uBAAuB;IAQ7C,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,UAAU;IAIlB;;;OAGG;YACW,cAAc;IAU5B;;OAEG;YACW,gBAAgB;YAShB,gBAAgB;YAShB,gBAAgB;IASxB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IAiCrE,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA4B9C,aAAa,CACjB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,oBAAoB,CAAC;IAuE1B,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA8CnE,gBAAgB,CACpB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,sBAAsB,CAAC;IA4E5B,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa3C,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAgB3E;;OAEG;IACG,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAcjE;;;OAGG;YACW,gBAAgB;CAK/B"}