agentrix 0.0.6 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/dist/api/auth.d.ts +11 -0
  2. package/dist/api/auth.d.ts.map +1 -1
  3. package/dist/api/auth.js +18 -3
  4. package/dist/api/auth.js.map +1 -1
  5. package/dist/api/automation.d.ts +27 -2
  6. package/dist/api/automation.d.ts.map +1 -1
  7. package/dist/api/automation.js +43 -15
  8. package/dist/api/automation.js.map +1 -1
  9. package/dist/api/base-handler.d.ts +9 -0
  10. package/dist/api/base-handler.d.ts.map +1 -1
  11. package/dist/api/base-handler.js +14 -12
  12. package/dist/api/base-handler.js.map +1 -1
  13. package/dist/api/create-plan.d.ts +11 -0
  14. package/dist/api/create-plan.d.ts.map +1 -1
  15. package/dist/api/create-plan.js +25 -10
  16. package/dist/api/create-plan.js.map +1 -1
  17. package/dist/api/git-status.d.ts +12 -0
  18. package/dist/api/git-status.d.ts.map +1 -1
  19. package/dist/api/git-status.js +20 -4
  20. package/dist/api/git-status.js.map +1 -1
  21. package/dist/api/plans.d.ts +18 -0
  22. package/dist/api/plans.d.ts.map +1 -1
  23. package/dist/api/plans.js +33 -14
  24. package/dist/api/plans.js.map +1 -1
  25. package/dist/api/ports.d.ts +20 -0
  26. package/dist/api/ports.d.ts.map +1 -0
  27. package/dist/api/ports.js +67 -0
  28. package/dist/api/ports.js.map +1 -0
  29. package/dist/api/repo-dashboard.d.ts.map +1 -1
  30. package/dist/api/repo-dashboard.js +4 -5
  31. package/dist/api/repo-dashboard.js.map +1 -1
  32. package/dist/api/repo-issue.d.ts.map +1 -1
  33. package/dist/api/repo-issue.js +6 -9
  34. package/dist/api/repo-issue.js.map +1 -1
  35. package/dist/api/repos.d.ts +5 -1
  36. package/dist/api/repos.d.ts.map +1 -1
  37. package/dist/api/repos.js +2 -2
  38. package/dist/api/repos.js.map +1 -1
  39. package/dist/api/sessions.d.ts +5 -1
  40. package/dist/api/sessions.d.ts.map +1 -1
  41. package/dist/api/sessions.js +2 -2
  42. package/dist/api/sessions.js.map +1 -1
  43. package/dist/api/tasks.d.ts +6 -1
  44. package/dist/api/tasks.d.ts.map +1 -1
  45. package/dist/api/tasks.js +7 -3
  46. package/dist/api/tasks.js.map +1 -1
  47. package/dist/api/terminal.d.ts +5 -2
  48. package/dist/api/terminal.d.ts.map +1 -1
  49. package/dist/api/terminal.js +2 -1
  50. package/dist/api/terminal.js.map +1 -1
  51. package/dist/api/worktrees.d.ts +5 -1
  52. package/dist/api/worktrees.d.ts.map +1 -1
  53. package/dist/api/worktrees.js +2 -2
  54. package/dist/api/worktrees.js.map +1 -1
  55. package/dist/cli/plans-command.d.ts +9 -0
  56. package/dist/cli/plans-command.d.ts.map +1 -1
  57. package/dist/cli/plans-command.js +17 -4
  58. package/dist/cli/plans-command.js.map +1 -1
  59. package/dist/cli/server-starter.d.ts +6 -0
  60. package/dist/cli/server-starter.d.ts.map +1 -1
  61. package/dist/cli/server-starter.js +14 -2
  62. package/dist/cli/server-starter.js.map +1 -1
  63. package/dist/core/agents.d.ts +11 -0
  64. package/dist/core/agents.d.ts.map +1 -1
  65. package/dist/core/agents.js +22 -8
  66. package/dist/core/agents.js.map +1 -1
  67. package/dist/core/auth.d.ts +10 -0
  68. package/dist/core/auth.d.ts.map +1 -1
  69. package/dist/core/auth.js +18 -4
  70. package/dist/core/auth.js.map +1 -1
  71. package/dist/core/automation/branch.d.ts.map +1 -1
  72. package/dist/core/automation/branch.js +1 -0
  73. package/dist/core/automation/branch.js.map +1 -1
  74. package/dist/core/automation/plan.d.ts.map +1 -1
  75. package/dist/core/automation/plan.js +1 -0
  76. package/dist/core/automation/plan.js.map +1 -1
  77. package/dist/core/automation/request-validation.d.ts.map +1 -1
  78. package/dist/core/automation/request-validation.js +1 -0
  79. package/dist/core/automation/request-validation.js.map +1 -1
  80. package/dist/core/automation/task-runner.d.ts.map +1 -1
  81. package/dist/core/automation/task-runner.js +1 -0
  82. package/dist/core/automation/task-runner.js.map +1 -1
  83. package/dist/core/branch-name.d.ts +10 -0
  84. package/dist/core/branch-name.d.ts.map +1 -1
  85. package/dist/core/branch-name.js +19 -6
  86. package/dist/core/branch-name.js.map +1 -1
  87. package/dist/core/plan-storage.js +2 -2
  88. package/dist/core/plan-storage.js.map +1 -1
  89. package/dist/core/ports.d.ts +47 -0
  90. package/dist/core/ports.d.ts.map +1 -0
  91. package/dist/core/ports.js +139 -0
  92. package/dist/core/ports.js.map +1 -0
  93. package/dist/core/terminal-sessions.d.ts +19 -0
  94. package/dist/core/terminal-sessions.d.ts.map +1 -1
  95. package/dist/core/terminal-sessions.js +44 -21
  96. package/dist/core/terminal-sessions.js.map +1 -1
  97. package/dist/core/tmux.d.ts.map +1 -1
  98. package/dist/core/tmux.js +1 -0
  99. package/dist/core/tmux.js.map +1 -1
  100. package/dist/repositories/git-repository.d.ts +6 -0
  101. package/dist/repositories/git-repository.d.ts.map +1 -1
  102. package/dist/repositories/git-repository.js +9 -1
  103. package/dist/repositories/git-repository.js.map +1 -1
  104. package/dist/repositories/git-status-repository.d.ts.map +1 -1
  105. package/dist/repositories/git-status-repository.js +1 -0
  106. package/dist/repositories/git-status-repository.js.map +1 -1
  107. package/dist/repositories/repository-repository.d.ts +13 -0
  108. package/dist/repositories/repository-repository.d.ts.map +1 -1
  109. package/dist/repositories/repository-repository.js +29 -7
  110. package/dist/repositories/repository-repository.js.map +1 -1
  111. package/dist/repositories/worktree-repository.d.ts +11 -0
  112. package/dist/repositories/worktree-repository.d.ts.map +1 -1
  113. package/dist/repositories/worktree-repository.js +8 -1
  114. package/dist/repositories/worktree-repository.js.map +1 -1
  115. package/dist/server/events.d.ts +13 -0
  116. package/dist/server/events.d.ts.map +1 -1
  117. package/dist/server/events.js +28 -12
  118. package/dist/server/events.js.map +1 -1
  119. package/dist/server/index.d.ts.map +1 -1
  120. package/dist/server/index.js +4 -0
  121. package/dist/server/index.js.map +1 -1
  122. package/dist/server/router.d.ts +40 -1
  123. package/dist/server/router.d.ts.map +1 -1
  124. package/dist/server/router.js +69 -20
  125. package/dist/server/router.js.map +1 -1
  126. package/dist/server/websocket.d.ts +12 -0
  127. package/dist/server/websocket.d.ts.map +1 -1
  128. package/dist/server/websocket.js +21 -6
  129. package/dist/server/websocket.js.map +1 -1
  130. package/dist/services/repository-service.d.ts +14 -0
  131. package/dist/services/repository-service.d.ts.map +1 -1
  132. package/dist/services/repository-service.js +36 -8
  133. package/dist/services/repository-service.js.map +1 -1
  134. package/dist/services/session-service.d.ts +15 -0
  135. package/dist/services/session-service.d.ts.map +1 -1
  136. package/dist/services/session-service.js +38 -8
  137. package/dist/services/session-service.js.map +1 -1
  138. package/dist/services/terminal-service.d.ts +10 -0
  139. package/dist/services/terminal-service.d.ts.map +1 -1
  140. package/dist/services/terminal-service.js +30 -6
  141. package/dist/services/terminal-service.js.map +1 -1
  142. package/dist/services/worktree-service.d.ts.map +1 -1
  143. package/dist/services/worktree-service.js +1 -0
  144. package/dist/services/worktree-service.js.map +1 -1
  145. package/dist/utils/repository-cache.d.ts +11 -0
  146. package/dist/utils/repository-cache.d.ts.map +1 -1
  147. package/dist/utils/repository-cache.js +17 -2
  148. package/dist/utils/repository-cache.js.map +1 -1
  149. package/package.json +5 -3
  150. package/ui/dist/assets/{index-BI2EZLfU.js → index-BHFYmdd_.js} +179 -149
  151. package/ui/dist/assets/index-P9e6bW7_.css +41 -0
  152. package/ui/dist/index.html +2 -2
  153. package/ui/dist/assets/index-CwB7gOl4.css +0 -41
@@ -1 +1 @@
1
- {"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../src/api/plans.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAqCvD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM;oBAC3B,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC;oBAmB9B,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC;EA0B5D"}
1
+ {"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../src/api/plans.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAmB,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,UAAU,iBAAiB;IACzB,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;IAClD,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;IAClD,qBAAqB,EAAE,OAAO,qBAAqB,CAAC;IACpD,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,mBAAmB,EAAE,OAAO,mBAAmB,CAAC;CACjD;AAaD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAMpF;AAqCD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM;oBAC3B,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC;oBAmB9B,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC;EA0B5D"}
package/dist/api/plans.js CHANGED
@@ -3,30 +3,49 @@ import { listPlansForWorktree, readPlanFromWorktree } from '../core/plan-storage
3
3
  import { sendJson } from '../utils/http.js';
4
4
  import { extractWorktreeParams } from '../validation/index.js';
5
5
  import { ValidationError, extractErrorMessage } from '../infrastructure/errors/index.js';
6
+ const defaultDependencies = {
7
+ getWorktreePath,
8
+ listPlansForWorktree,
9
+ readPlanFromWorktree,
10
+ extractWorktreeParams,
11
+ sendJson,
12
+ extractErrorMessage,
13
+ };
14
+ let activeDependencies = { ...defaultDependencies };
15
+ /**
16
+ * @internal Test hook to override plans dependencies
17
+ */
18
+ export function __setPlansTestOverrides(overrides) {
19
+ if (!overrides) {
20
+ activeDependencies = { ...defaultDependencies };
21
+ return;
22
+ }
23
+ activeDependencies = { ...activeDependencies, ...overrides };
24
+ }
6
25
  function parseCommonParams(context) {
7
26
  try {
8
- const { org, repo, branch } = extractWorktreeParams(context.url.searchParams);
27
+ const { org, repo, branch } = activeDependencies.extractWorktreeParams(context.url.searchParams);
9
28
  const limitParam = context.url.searchParams.get('limit');
10
29
  const limit = limitParam ? Number.parseInt(limitParam, 10) : undefined;
11
30
  if (limitParam && (Number.isNaN(limit) || (limit && limit < 1))) {
12
- sendJson(context.res, 400, { error: 'limit must be a positive integer' });
31
+ activeDependencies.sendJson(context.res, 400, { error: 'limit must be a positive integer' });
13
32
  return null;
14
33
  }
15
34
  return { org, repo, branch, limit };
16
35
  }
17
36
  catch (error) {
18
- const message = error instanceof ValidationError ? error.message : extractErrorMessage(error, 'Invalid parameters');
19
- sendJson(context.res, 400, { error: message });
37
+ const message = error instanceof ValidationError ? error.message : activeDependencies.extractErrorMessage(error, 'Invalid parameters');
38
+ activeDependencies.sendJson(context.res, 400, { error: message });
20
39
  return null;
21
40
  }
22
41
  }
23
42
  function handleResolutionError(res, error) {
24
- const message = extractErrorMessage(error, 'Unknown error');
43
+ const message = activeDependencies.extractErrorMessage(error, 'Unknown error');
25
44
  if (/not found/i.test(message)) {
26
- sendJson(res, 404, { error: message });
45
+ activeDependencies.sendJson(res, 404, { error: message });
27
46
  return;
28
47
  }
29
- sendJson(res, 500, { error: message });
48
+ activeDependencies.sendJson(res, 500, { error: message });
30
49
  }
31
50
  export function createPlanArtifactHandlers(workdir) {
32
51
  async function list(context) {
@@ -35,13 +54,13 @@ export function createPlanArtifactHandlers(workdir) {
35
54
  return;
36
55
  }
37
56
  try {
38
- const { worktreePath } = await getWorktreePath(workdir, parsed.org, parsed.repo, parsed.branch);
39
- const plans = await listPlansForWorktree({
57
+ const { worktreePath } = await activeDependencies.getWorktreePath(workdir, parsed.org, parsed.repo, parsed.branch);
58
+ const plans = await activeDependencies.listPlansForWorktree({
40
59
  worktreePath,
41
60
  branch: parsed.branch,
42
61
  limit: parsed.limit,
43
62
  });
44
- sendJson(context.res, 200, { data: plans });
63
+ activeDependencies.sendJson(context.res, 200, { data: plans });
45
64
  }
46
65
  catch (error) {
47
66
  handleResolutionError(context.res, error);
@@ -54,17 +73,17 @@ export function createPlanArtifactHandlers(workdir) {
54
73
  }
55
74
  const planId = (context.url.searchParams.get('planId') || '').trim();
56
75
  if (!planId) {
57
- sendJson(context.res, 400, { error: 'planId is required' });
76
+ activeDependencies.sendJson(context.res, 400, { error: 'planId is required' });
58
77
  return;
59
78
  }
60
79
  try {
61
- const { worktreePath } = await getWorktreePath(workdir, parsed.org, parsed.repo, parsed.branch);
62
- const plan = await readPlanFromWorktree({
80
+ const { worktreePath } = await activeDependencies.getWorktreePath(workdir, parsed.org, parsed.repo, parsed.branch);
81
+ const plan = await activeDependencies.readPlanFromWorktree({
63
82
  worktreePath,
64
83
  branch: parsed.branch,
65
84
  id: planId,
66
85
  });
67
- sendJson(context.res, 200, { data: plan });
86
+ activeDependencies.sendJson(context.res, 200, { data: plan });
68
87
  }
69
88
  catch (error) {
70
89
  handleResolutionError(context.res, error);
@@ -1 +1 @@
1
- {"version":3,"file":"plans.js","sourceRoot":"","sources":["../../src/api/plans.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plans.js","sourceRoot":"","sources":["../../src/api/plans.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { listActivePorts } from '../core/ports.js';
2
+ import type { PortTunnelManager } from '../core/ports.js';
3
+ import type { RequestContext } from '../types/http.js';
4
+ interface PortApiDependencies {
5
+ listActivePorts: typeof listActivePorts;
6
+ }
7
+ /**
8
+ * @internal Test helper to override dependencies
9
+ */
10
+ export declare function __setPortsApiTestOverrides(overrides?: Partial<PortApiDependencies>): void;
11
+ interface CreatePortHandlersOptions {
12
+ portManager: PortTunnelManager;
13
+ }
14
+ export interface PortHandlers {
15
+ list: (context: RequestContext) => Promise<void>;
16
+ openTunnel: (context: RequestContext) => Promise<void>;
17
+ }
18
+ export declare function createPortHandlers({ portManager }: CreatePortHandlersOptions): PortHandlers;
19
+ export {};
20
+ //# sourceMappingURL=ports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/api/ports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,KAAK,EAAE,iBAAiB,EAAc,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,UAAU,mBAAmB;IAC3B,eAAe,EAAE,OAAO,eAAe,CAAC;CACzC;AAQD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI,CASzF;AAED,UAAU,yBAAyB;IACjC,WAAW,EAAE,iBAAiB,CAAC;CAChC;AAgCD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,UAAU,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,wBAAgB,kBAAkB,CAAC,EAAE,WAAW,EAAE,EAAE,yBAAyB,GAAG,YAAY,CAyB3F"}
@@ -0,0 +1,67 @@
1
+ import { listActivePorts } from '../core/ports.js';
2
+ import { ValidationError } from '../infrastructure/errors/index.js';
3
+ import { createHandler, createQueryHandler } from './base-handler.js';
4
+ const defaultDependencies = {
5
+ listActivePorts,
6
+ };
7
+ let activeDependencies = { ...defaultDependencies };
8
+ /**
9
+ * @internal Test helper to override dependencies
10
+ */
11
+ export function __setPortsApiTestOverrides(overrides) {
12
+ if (!overrides) {
13
+ activeDependencies = { ...defaultDependencies };
14
+ return;
15
+ }
16
+ activeDependencies = {
17
+ ...activeDependencies,
18
+ ...overrides,
19
+ };
20
+ }
21
+ function validateOpenTunnelPayload(payload) {
22
+ if (!payload || typeof payload !== 'object') {
23
+ throw new ValidationError('Port payload is required');
24
+ }
25
+ const candidate = payload.port;
26
+ let parsed;
27
+ if (typeof candidate === 'string') {
28
+ parsed = Number.parseInt(candidate, 10);
29
+ }
30
+ else if (typeof candidate === 'number') {
31
+ parsed = candidate;
32
+ }
33
+ else {
34
+ throw new ValidationError('Port must be an integer');
35
+ }
36
+ if (!Number.isInteger(parsed)) {
37
+ throw new ValidationError('Port must be an integer');
38
+ }
39
+ if (parsed < 1 || parsed > 65535) {
40
+ throw new ValidationError('Port must be between 1 and 65535');
41
+ }
42
+ return { port: parsed };
43
+ }
44
+ export function createPortHandlers({ portManager }) {
45
+ if (!portManager) {
46
+ throw new Error('portManager is required');
47
+ }
48
+ const list = createQueryHandler(async (context) => {
49
+ const ports = await activeDependencies.listActivePorts();
50
+ context.res.setHeader('Cache-Control', 'no-store');
51
+ return { ports };
52
+ });
53
+ const openTunnel = createHandler({
54
+ validator: validateOpenTunnelPayload,
55
+ successCode: 201,
56
+ handler: async ({ port }) => {
57
+ const tunnel = await portManager.open(port);
58
+ return tunnel;
59
+ },
60
+ responseTransformer: (tunnel) => ({ tunnel }),
61
+ });
62
+ return {
63
+ list,
64
+ openTunnel,
65
+ };
66
+ }
67
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/api/ports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAQtE,MAAM,mBAAmB,GAAwB;IAC/C,eAAe;CAChB,CAAC;AAEF,IAAI,kBAAkB,GAAwB,EAAE,GAAG,mBAAmB,EAAE,CAAC;AAEzE;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,SAAwC;IACjF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,kBAAkB,GAAG,EAAE,GAAG,mBAAmB,EAAE,CAAC;QAChD,OAAO;IACT,CAAC;IACD,kBAAkB,GAAG;QACnB,GAAG,kBAAkB;QACrB,GAAG,SAAS;KACU,CAAC;AAC3B,CAAC;AAcD,SAAS,yBAAyB,CAAC,OAAgB;IACjD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,SAAS,GAAI,OAA8B,CAAC,IAAI,CAAC;IACvD,IAAI,MAAc,CAAC;IACnB,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QACzC,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;QACjC,MAAM,IAAI,eAAe,CAAC,kCAAkC,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAOD,MAAM,UAAU,kBAAkB,CAAC,EAAE,WAAW,EAA6B;IAC3E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAChE,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,eAAe,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACnD,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,aAAa,CAA8B;QAC5D,SAAS,EAAE,yBAAyB;QACpC,WAAW,EAAE,GAAG;QAChB,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,mBAAmB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;KAC9C,CAAC,CAAC;IAEH,OAAO;QACL,IAAI;QACJ,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"repo-dashboard.d.ts","sourceRoot":"","sources":["../../src/api/repo-dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAKvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,OAAO,gBAAgB,CAAC;IACrC,eAAe,CAAC,EAAE,OAAO,mBAAmB,CAAC;IAC7C,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,sBAA2B;;EAkDlG"}
1
+ {"version":3,"file":"repo-dashboard.d.ts","sourceRoot":"","sources":["../../src/api/repo-dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAKvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,OAAO,gBAAgB,CAAC;IACrC,eAAe,CAAC,EAAE,OAAO,mBAAmB,CAAC;IAC7C,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,sBAA2B;;EAiDlG"}
@@ -1,9 +1,9 @@
1
1
  import { ensureRepository, countLocalWorktrees } from '../core/git.js';
2
2
  import { createGithubClient } from '../core/github.js';
3
- import { sendJson, handleHeadRequest } from '../utils/http.js';
3
+ import { handleHeadRequest } from '../utils/http.js';
4
4
  import { extractRepositoryParams } from '../validation/index.js';
5
5
  import { createQueryHandler } from './base-handler.js';
6
- import { extractErrorMessage } from '../infrastructure/errors/error-handler.js';
6
+ import { HttpError } from '../infrastructure/errors/index.js';
7
7
  export function createRepoDashboardHandlers(workdir, overrides = {}) {
8
8
  const { githubClient = createGithubClient(), ensureRepo = ensureRepository, worktreeCounter = countLocalWorktrees, now = () => new Date(), } = overrides;
9
9
  const read = createQueryHandler(async (context) => {
@@ -13,10 +13,9 @@ export function createRepoDashboardHandlers(workdir, overrides = {}) {
13
13
  ({ repositoryPath } = await ensureRepo(workdir, org, repo));
14
14
  }
15
15
  catch (error) {
16
- const message = extractErrorMessage(error, 'Repository not found');
16
+ const message = error instanceof Error ? error.message : String(error);
17
17
  const statusCode = message.includes('not found') ? 404 : 500;
18
- sendJson(context.res, statusCode, { error: message });
19
- return;
18
+ throw new HttpError(message, statusCode);
20
19
  }
21
20
  if (context.method === 'HEAD') {
22
21
  handleHeadRequest(context.res);
@@ -1 +1 @@
1
- {"version":3,"file":"repo-dashboard.js","sourceRoot":"","sources":["../../src/api/repo-dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAUhF,MAAM,UAAU,2BAA2B,CAAC,OAAe,EAAE,YAAoC,EAAE;IACjG,MAAM,EACJ,YAAY,GAAG,kBAAkB,EAAE,EACnC,UAAU,GAAG,gBAAgB,EAC7B,eAAe,GAAG,mBAAmB,EACrC,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,GACvB,GAAG,SAAS,CAAC;IAEd,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAChE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAExE,IAAI,cAAc,CAAC;QACnB,IAAI,CAAC;YACH,CAAC,EAAE,cAAc,EAAE,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;YACnE,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC7D,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,CAAC,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC3F,YAAY,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC;YAC7C,YAAY,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC;YACvC,YAAY,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC;YACtC,YAAY,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC;SAC9C,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QACpF,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAEtC,OAAO;YACL,IAAI,EAAE;gBACJ,GAAG;gBACH,IAAI;gBACJ,SAAS;gBACT,YAAY,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;gBACxC,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,EAAE;gBACrD,SAAS,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE;gBACxC,SAAS,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;aACpC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"repo-dashboard.js","sourceRoot":"","sources":["../../src/api/repo-dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAU9D,MAAM,UAAU,2BAA2B,CAAC,OAAe,EAAE,YAAoC,EAAE;IACjG,MAAM,EACJ,YAAY,GAAG,kBAAkB,EAAE,EACnC,UAAU,GAAG,gBAAgB,EAC7B,eAAe,GAAG,mBAAmB,EACrC,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,GACvB,GAAG,SAAS,CAAC;IAEd,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAChE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAExE,IAAI,cAAc,CAAC;QACnB,IAAI,CAAC;YACH,CAAC,EAAE,cAAc,EAAE,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC7D,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,CAAC,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC3F,YAAY,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC;YAC7C,YAAY,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC;YACvC,YAAY,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC;YACtC,YAAY,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC;SAC9C,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QACpF,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAEtC,OAAO;YACL,IAAI,EAAE;gBACJ,GAAG;gBACH,IAAI;gBACJ,SAAS;gBACT,YAAY,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;gBACxC,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,EAAE;gBACrD,SAAS,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE;gBACxC,SAAS,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;aACpC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"repo-issue.d.ts","sourceRoot":"","sources":["../../src/api/repo-issue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAKvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,OAAO,gBAAgB,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,kBAAuB;;EAkD1F"}
1
+ {"version":3,"file":"repo-issue.d.ts","sourceRoot":"","sources":["../../src/api/repo-issue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAKvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,OAAO,gBAAgB,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,kBAAuB;;EA+C1F"}
@@ -1,8 +1,8 @@
1
1
  import { ensureRepository } from '../core/git.js';
2
2
  import { createGithubClient } from '../core/github.js';
3
- import { sendJson, handleHeadRequest } from '../utils/http.js';
3
+ import { handleHeadRequest } from '../utils/http.js';
4
4
  import { extractRepositoryParams } from '../validation/index.js';
5
- import { extractErrorMessage } from '../infrastructure/errors/index.js';
5
+ import { HttpError, ValidationError } from '../infrastructure/errors/index.js';
6
6
  import { createQueryHandler } from './base-handler.js';
7
7
  export function createRepoIssueHandlers(workdir, overrides = {}) {
8
8
  const { githubClient = createGithubClient(), ensureRepo = ensureRepository, now = () => new Date(), } = overrides;
@@ -10,22 +10,19 @@ export function createRepoIssueHandlers(workdir, overrides = {}) {
10
10
  const { org, repo } = extractRepositoryParams(context.url.searchParams);
11
11
  const issueParam = context.url.searchParams.get('issue')?.trim() || '';
12
12
  if (!issueParam) {
13
- sendJson(context.res, 400, { error: 'issue query parameter is required' });
14
- return;
13
+ throw new ValidationError('issue query parameter is required');
15
14
  }
16
15
  const issueNumber = Number.parseInt(issueParam, 10);
17
16
  if (!Number.isInteger(issueNumber) || issueNumber <= 0) {
18
- sendJson(context.res, 400, { error: 'issue query parameter must be a positive integer' });
19
- return;
17
+ throw new ValidationError('issue query parameter must be a positive integer');
20
18
  }
21
19
  try {
22
20
  await ensureRepo(workdir, org, repo);
23
21
  }
24
22
  catch (error) {
25
- const message = extractErrorMessage(error, 'Repository not found');
23
+ const message = error instanceof Error ? error.message : String(error);
26
24
  const statusCode = message.includes('not found') ? 404 : 500;
27
- sendJson(context.res, statusCode, { error: message });
28
- return;
25
+ throw new HttpError(message, statusCode);
29
26
  }
30
27
  if (context.method === 'HEAD') {
31
28
  handleHeadRequest(context.res);
@@ -1 +1 @@
1
- {"version":3,"file":"repo-issue.js","sourceRoot":"","sources":["../../src/api/repo-issue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AASvD,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,YAAgC,EAAE;IACzF,MAAM,EACJ,YAAY,GAAG,kBAAkB,EAAE,EACnC,UAAU,GAAG,gBAAgB,EAC7B,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,GACvB,GAAG,SAAS,CAAC;IAEd,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAChE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAEvE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACvD,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,kDAAkD,EAAE,CAAC,CAAC;YAC1F,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;YACnE,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC7D,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAEtC,OAAO;YACL,IAAI,EAAE;gBACJ,GAAG;gBACH,IAAI;gBACJ,KAAK;gBACL,SAAS;aACV;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"repo-issue.js","sourceRoot":"","sources":["../../src/api/repo-issue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AASvD,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,YAAgC,EAAE;IACzF,MAAM,EACJ,YAAY,GAAG,kBAAkB,EAAE,EACnC,UAAU,GAAG,gBAAgB,EAC7B,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,GACvB,GAAG,SAAS,CAAC;IAEd,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAChE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAEvE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,eAAe,CAAC,mCAAmC,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,eAAe,CAAC,kDAAkD,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC7D,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAEtC,OAAO;YACL,IAAI,EAAE;gBACJ,GAAG;gBACH,IAAI;gBACJ,KAAK;gBACL,SAAS;aACV;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
@@ -1,5 +1,9 @@
1
+ import { type RepositoryService } from '../services/index.js';
1
2
  import type { RequestContext } from '../types/http.js';
2
- export declare function createRepoHandlers(workdir: string): {
3
+ export interface RepoHandlersOverrides {
4
+ repositoryService?: RepositoryService;
5
+ }
6
+ export declare function createRepoHandlers(workdir: string, overrides?: RepoHandlersOverrides): {
3
7
  list: (context: RequestContext) => Promise<void>;
4
8
  create: (context: RequestContext) => Promise<void>;
5
9
  delete: (context: RequestContext) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"repos.d.ts","sourceRoot":"","sources":["../../src/api/repos.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOvD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM;;;;;;EA8CjD"}
1
+ {"version":3,"file":"repos.d.ts","sourceRoot":"","sources":["../../src/api/repos.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIvF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOvD,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,qBAA0B;;;;;;EA8CxF"}
package/dist/api/repos.js CHANGED
@@ -3,8 +3,8 @@ import { handleHeadRequest } from '../utils/http.js';
3
3
  import { asyncHandler } from '../infrastructure/errors/index.js';
4
4
  import { createHandler } from './base-handler.js';
5
5
  import { validateRepositoryCreate, validateRepositoryDelete, validateInitCommandUpdate, } from '../validation/index.js';
6
- export function createRepoHandlers(workdir) {
7
- const repositoryService = createRepositoryService(workdir);
6
+ export function createRepoHandlers(workdir, overrides = {}) {
7
+ const repositoryService = overrides.repositoryService ?? createRepositoryService(workdir);
8
8
  const list = asyncHandler(async (context) => {
9
9
  if (context.method === 'HEAD') {
10
10
  handleHeadRequest(context.res);
@@ -1 +1 @@
1
- {"version":3,"file":"repos.js","sourceRoot":"","sources":["../../src/api/repos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAE3D,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,aAAa,CAAC;QAC3B,SAAS,EAAE,wBAAwB;QACnC,OAAO,EAAE,KAAK,EAAE,KAA2C,EAAE,EAAE,CAC7D,iBAAiB,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC;KAChE,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,aAAa,CAAC;QAC/B,SAAS,EAAE,wBAAwB;QACnC,OAAO,EAAE,KAAK,EAAE,KAAoC,EAAE,EAAE;YACtD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7E,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,aAAa,CAAC;QACtC,SAAS,EAAE,yBAAyB;QACpC,OAAO,EAAE,KAAK,EAAE,KAAyD,EAAE,EAAE;YAC3E,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACjG,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;KACF,CAAC,CAAC;IAEH,OAAO;QACL,IAAI;QACJ,MAAM;QACN,MAAM,EAAE,UAAU;QAClB,8CAA8C;QAC9C,OAAO,EAAE,UAAU;QACnB,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"repos.js","sourceRoot":"","sources":["../../src/api/repos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA0B,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAMhC,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,YAAmC,EAAE;IACvF,MAAM,iBAAiB,GAAG,SAAS,CAAC,iBAAiB,IAAI,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAE1F,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,aAAa,CAAC;QAC3B,SAAS,EAAE,wBAAwB;QACnC,OAAO,EAAE,KAAK,EAAE,KAA2C,EAAE,EAAE,CAC7D,iBAAiB,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC;KAChE,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,aAAa,CAAC;QAC/B,SAAS,EAAE,wBAAwB;QACnC,OAAO,EAAE,KAAK,EAAE,KAAoC,EAAE,EAAE;YACtD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7E,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,aAAa,CAAC;QACtC,SAAS,EAAE,yBAAyB;QACpC,OAAO,EAAE,KAAK,EAAE,KAAyD,EAAE,EAAE;YAC3E,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACjG,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;KACF,CAAC,CAAC;IAEH,OAAO;QACL,IAAI;QACJ,MAAM;QACN,MAAM,EAAE,UAAU;QAClB,8CAA8C;QAC9C,OAAO,EAAE,UAAU;QACnB,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
@@ -1,5 +1,9 @@
1
+ import { type SessionService } from '../services/session-service.js';
1
2
  import type { RequestContext } from '../types/http.js';
2
- export declare function createSessionHandlers(workdir: string): {
3
+ export interface SessionHandlersOverrides {
4
+ sessionService?: SessionService;
5
+ }
6
+ export declare function createSessionHandlers(workdir: string, overrides?: SessionHandlersOverrides): {
3
7
  list: (context: RequestContext) => Promise<void>;
4
8
  };
5
9
  //# sourceMappingURL=sessions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/api/sessions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM;;EAiBpD"}
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/api/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAG3F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,WAAW,wBAAwB;IACvC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,wBAA6B;;EAiB9F"}
@@ -1,8 +1,8 @@
1
1
  import { createSessionService } from '../services/session-service.js';
2
2
  import { handleHeadRequest } from '../utils/http.js';
3
3
  import { asyncHandler } from '../infrastructure/errors/index.js';
4
- export function createSessionHandlers(workdir) {
5
- const sessionService = createSessionService(workdir);
4
+ export function createSessionHandlers(workdir, overrides = {}) {
5
+ const sessionService = overrides.sessionService ?? createSessionService(workdir);
6
6
  const list = asyncHandler(async (context) => {
7
7
  if (context.method === 'HEAD') {
8
8
  handleHeadRequest(context.res);
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/api/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGjE,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,MAAM,cAAc,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAErD,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/api/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAuB,MAAM,gCAAgC,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAOjE,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,YAAsC,EAAE;IAC7F,MAAM,cAAc,GAAG,SAAS,CAAC,cAAc,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAEjF,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
@@ -1,5 +1,10 @@
1
+ import { getTaskById, listTasks } from '../core/tasks.js';
1
2
  import type { RequestContext } from '../types/http.js';
2
- export declare function createTaskHandlers(): {
3
+ export interface TaskHandlersOverrides {
4
+ listTasks?: typeof listTasks;
5
+ getTaskById?: typeof getTaskById;
6
+ }
7
+ export declare function createTaskHandlers(overrides?: TaskHandlersOverrides): {
3
8
  list: (context: RequestContext) => Promise<void>;
4
9
  read: (context: RequestContext, taskId: string) => Promise<void>;
5
10
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/api/tasks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,wBAAgB,kBAAkB;;oBAKH,cAAc,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;EAgB5E"}
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/api/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,WAAW,CAAC;CAClC;AAED,wBAAgB,kBAAkB,CAAC,SAAS,GAAE,qBAA0B;;oBAQzC,cAAc,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;EAgB5E"}
package/dist/api/tasks.js CHANGED
@@ -1,8 +1,12 @@
1
1
  import { getTaskById, listTasks } from '../core/tasks.js';
2
2
  import { sendJson } from '../utils/http.js';
3
3
  import { createSimpleHandler } from './base-handler.js';
4
- export function createTaskHandlers() {
5
- const list = createSimpleHandler(async () => ({ tasks: listTasks() }));
4
+ export function createTaskHandlers(overrides = {}) {
5
+ const dependencies = {
6
+ listTasks: overrides.listTasks ?? listTasks,
7
+ getTaskById: overrides.getTaskById ?? getTaskById,
8
+ };
9
+ const list = createSimpleHandler(async () => ({ tasks: dependencies.listTasks() }));
6
10
  async function read(context, taskId) {
7
11
  const ctx = context;
8
12
  const id = typeof taskId === 'string' && taskId ? taskId : ctx?.params?.id;
@@ -10,7 +14,7 @@ export function createTaskHandlers() {
10
14
  sendJson(context.res, 400, { error: 'Task identifier is required' });
11
15
  return;
12
16
  }
13
- const task = getTaskById(id);
17
+ const task = dependencies.getTaskById(id);
14
18
  if (!task) {
15
19
  sendJson(context.res, 404, { error: 'Task not found' });
16
20
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/api/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGxD,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,mBAAmB,CAC9B,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CACrC,CAAC;IAEF,KAAK,UAAU,IAAI,CAAC,OAAuB,EAAE,MAAc;QACzD,MAAM,GAAG,GAAG,OAAwD,CAAC;QACrE,MAAM,EAAE,GAAG,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;QAC3E,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/api/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAQxD,MAAM,UAAU,kBAAkB,CAAC,YAAmC,EAAE;IACtE,MAAM,YAAY,GAAG;QACnB,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,SAAS;QAC3C,WAAW,EAAE,SAAS,CAAC,WAAW,IAAI,WAAW;KAClD,CAAC;IAEF,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IAEpF,KAAK,UAAU,IAAI,CAAC,OAAuB,EAAE,MAAc;QACzD,MAAM,GAAG,GAAG,OAAwD,CAAC;QACrE,MAAM,EAAE,GAAG,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;QAC3E,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC"}
@@ -1,6 +1,9 @@
1
- export declare function createTerminalHandlers(workdir: string, options?: {
1
+ import { type TerminalService } from '../services/index.js';
2
+ export interface TerminalHandlerOptions {
2
3
  mode?: string;
3
- }): {
4
+ terminalService?: TerminalService;
5
+ }
6
+ export declare function createTerminalHandlers(workdir: string, options?: TerminalHandlerOptions): {
4
7
  open: (context: import("../types/http.js").RequestContext) => Promise<void>;
5
8
  send: (context: import("../types/http.js").RequestContext) => Promise<void>;
6
9
  };
@@ -1 +1 @@
1
- {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/api/terminal.ts"],"names":[],"mappings":"AAKA,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO;;;EActF"}
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/api/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAKnF,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;;;EAe3F"}
@@ -2,7 +2,8 @@ import { createTerminalService } from '../services/index.js';
2
2
  import { createHandler } from './base-handler.js';
3
3
  import { validateTerminalOpen, validateTerminalSend } from '../validation/index.js';
4
4
  export function createTerminalHandlers(workdir, options = {}) {
5
- const terminalService = createTerminalService(workdir, options);
5
+ const { mode, terminalService: providedTerminalService } = options;
6
+ const terminalService = providedTerminalService ?? createTerminalService(workdir, mode ? { mode } : {});
6
7
  const open = createHandler({
7
8
  validator: validateTerminalOpen,
8
9
  handler: async (input) => terminalService.openTerminal(input),
@@ -1 +1 @@
1
- {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/api/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGpF,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,UAA6B,EAAE;IACrF,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEhE,MAAM,IAAI,GAAG,aAAa,CAAC;QACzB,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,KAAK,EAAE,KAAwB,EAAE,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC;KACjF,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,aAAa,CAAC;QACzB,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,KAAK,EAAE,KAAwB,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC;KAC9E,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/api/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAwB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAQpF,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,UAAkC,EAAE;IAC1F,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC;IACnE,MAAM,eAAe,GAAG,uBAAuB,IAAI,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAExG,MAAM,IAAI,GAAG,aAAa,CAAC;QACzB,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,KAAK,EAAE,KAAwB,EAAE,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC;KACjF,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,aAAa,CAAC;QACzB,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,KAAK,EAAE,KAAwB,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC;KAC9E,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC"}
@@ -1,4 +1,8 @@
1
- export declare function createWorktreeHandlers(workdir: string, branchNameGenerator: unknown, defaultBranchConfig: unknown): {
1
+ import { type WorktreeService } from '../services/index.js';
2
+ export interface WorktreeHandlerOverrides {
3
+ worktreeService?: WorktreeService;
4
+ }
5
+ export declare function createWorktreeHandlers(workdir: string, branchNameGenerator: unknown, defaultBranchConfig: unknown, overrides?: WorktreeHandlerOverrides): {
2
6
  create: (context: import("../types/http.js").RequestContext) => Promise<void>;
3
7
  delete: (context: import("../types/http.js").RequestContext) => Promise<void>;
4
8
  upsert: (context: import("../types/http.js").RequestContext) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"worktrees.d.ts","sourceRoot":"","sources":["../../src/api/worktrees.ts"],"names":[],"mappings":"AAKA,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,mBAAmB,EAAE,OAAO,EAC5B,mBAAmB,EAAE,OAAO;;;;;EAyB7B"}
1
+ {"version":3,"file":"worktrees.d.ts","sourceRoot":"","sources":["../../src/api/worktrees.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAKnF,MAAM,WAAW,wBAAwB;IACvC,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,mBAAmB,EAAE,OAAO,EAC5B,mBAAmB,EAAE,OAAO,EAC5B,SAAS,GAAE,wBAA6B;;;;;EA0BzC"}
@@ -1,8 +1,8 @@
1
1
  import { createWorktreeService } from '../services/index.js';
2
2
  import { createHandler } from './base-handler.js';
3
3
  import { validateWorktreeCreate, validateWorktreeDelete } from '../validation/index.js';
4
- export function createWorktreeHandlers(workdir, branchNameGenerator, defaultBranchConfig) {
5
- const worktreeService = createWorktreeService(workdir, branchNameGenerator, defaultBranchConfig);
4
+ export function createWorktreeHandlers(workdir, branchNameGenerator, defaultBranchConfig, overrides = {}) {
5
+ const worktreeService = overrides.worktreeService ?? createWorktreeService(workdir, branchNameGenerator, defaultBranchConfig);
6
6
  const createWorktree = createHandler({
7
7
  validator: validateWorktreeCreate,
8
8
  handler: async (input) => worktreeService.createWorktree(input),
@@ -1 +1 @@
1
- {"version":3,"file":"worktrees.js","sourceRoot":"","sources":["../../src/api/worktrees.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGxF,MAAM,UAAU,sBAAsB,CACpC,OAAe,EACf,mBAA4B,EAC5B,mBAA4B;IAE5B,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IAEjG,MAAM,cAAc,GAAG,aAAa,CAAC;QACnC,SAAS,EAAE,sBAAsB;QACjC,OAAO,EAAE,KAAK,EAAE,KAA0B,EAAE,EAAE,CAAC,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC;QACpF,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,aAAa,CAAC;QACnC,SAAS,EAAE,sBAAsB;QACjC,OAAO,EAAE,KAAK,EAAE,KAA0B,EAAE,EAAE;YAC5C,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;KACF,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,cAAc;QACtB,gDAAgD;QAChD,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,cAAc;KACxB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"worktrees.js","sourceRoot":"","sources":["../../src/api/worktrees.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAwB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAOxF,MAAM,UAAU,sBAAsB,CACpC,OAAe,EACf,mBAA4B,EAC5B,mBAA4B,EAC5B,YAAsC,EAAE;IAExC,MAAM,eAAe,GACnB,SAAS,CAAC,eAAe,IAAI,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IAExG,MAAM,cAAc,GAAG,aAAa,CAAC;QACnC,SAAS,EAAE,sBAAsB;QACjC,OAAO,EAAE,KAAK,EAAE,KAA0B,EAAE,EAAE,CAAC,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC;QACpF,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,aAAa,CAAC;QACnC,SAAS,EAAE,sBAAsB;QACjC,OAAO,EAAE,KAAK,EAAE,KAA0B,EAAE,EAAE;YAC5C,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;KACF,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,cAAc;QACtB,gDAAgD;QAChD,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,cAAc;KACxB,CAAC;AACJ,CAAC"}
@@ -1,3 +1,12 @@
1
+ import { getWorktreePath } from '../core/git.js';
2
+ import { listPlansForWorktree, readPlanFromWorktree } from '../core/plan-storage.js';
1
3
  export declare function printPlansHelp(): void;
4
+ interface PlansDependencies {
5
+ getWorktreePath: typeof getWorktreePath;
6
+ listPlansForWorktree: typeof listPlansForWorktree;
7
+ readPlanFromWorktree: typeof readPlanFromWorktree;
8
+ }
9
+ export declare function __setPlansCommandTestOverrides(overrides?: Partial<PlansDependencies>): void;
2
10
  export declare function handlePlansCommand(argv: string[]): Promise<void>;
11
+ export {};
3
12
  //# sourceMappingURL=plans-command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plans-command.d.ts","sourceRoot":"","sources":["../../src/cli/plans-command.ts"],"names":[],"mappings":"AAKA,wBAAgB,cAAc,IAAI,IAAI,CAiBrC;AA2GD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CtE"}
1
+ {"version":3,"file":"plans-command.d.ts","sourceRoot":"","sources":["../../src/cli/plans-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAGrF,wBAAgB,cAAc,IAAI,IAAI,CAiBrC;AAED,UAAU,iBAAiB;IACzB,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;IAClD,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;CACnD;AAUD,wBAAgB,8BAA8B,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAM3F;AA2GD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CtE"}
@@ -19,6 +19,19 @@ Options:
19
19
  `;
20
20
  process.stdout.write(helpText);
21
21
  }
22
+ const defaultDependencies = {
23
+ getWorktreePath,
24
+ listPlansForWorktree,
25
+ readPlanFromWorktree,
26
+ };
27
+ let activeDependencies = { ...defaultDependencies };
28
+ export function __setPlansCommandTestOverrides(overrides) {
29
+ if (!overrides) {
30
+ activeDependencies = { ...defaultDependencies };
31
+ return;
32
+ }
33
+ activeDependencies = { ...activeDependencies, ...overrides };
34
+ }
22
35
  function parsePlansOptions(args) {
23
36
  const options = {
24
37
  org: '',
@@ -75,8 +88,8 @@ function parsePlansOptions(args) {
75
88
  return options;
76
89
  }
77
90
  async function handleListCommand(options) {
78
- const { worktreePath } = await getWorktreePath(options.workdir, options.org, options.repo, options.branch);
79
- const plans = await listPlansForWorktree({
91
+ const { worktreePath } = await activeDependencies.getWorktreePath(options.workdir, options.org, options.repo, options.branch);
92
+ const plans = await activeDependencies.listPlansForWorktree({
80
93
  worktreePath,
81
94
  branch: options.branch,
82
95
  limit: options.limit,
@@ -95,8 +108,8 @@ async function handleShowCommand(options) {
95
108
  process.exitCode = 1;
96
109
  return;
97
110
  }
98
- const { worktreePath } = await getWorktreePath(options.workdir, options.org, options.repo, options.branch);
99
- const plan = await readPlanFromWorktree({
111
+ const { worktreePath } = await activeDependencies.getWorktreePath(options.workdir, options.org, options.repo, options.branch);
112
+ const plan = await activeDependencies.readPlanFromWorktree({
100
113
  worktreePath,
101
114
  branch: options.branch,
102
115
  id: options.planId,