@shepai/cli 1.92.0 → 1.92.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 (138) hide show
  1. package/dist/packages/core/src/application/ports/output/agents/agent-registry.interface.d.ts +1 -1
  2. package/dist/packages/core/src/application/ports/output/agents/agent-registry.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/use-cases/agents/run-agent.use-case.js +2 -2
  4. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  5. package/dist/packages/core/src/infrastructure/di/container.js +24 -8
  6. package/dist/packages/core/src/infrastructure/services/agents/common/agent-registry.service.d.ts +3 -1
  7. package/dist/packages/core/src/infrastructure/services/agents/common/agent-registry.service.d.ts.map +1 -1
  8. package/dist/packages/core/src/infrastructure/services/agents/common/agent-registry.service.js +43 -11
  9. package/dist/packages/core/src/infrastructure/services/agents/common/agent-runner.service.d.ts +1 -3
  10. package/dist/packages/core/src/infrastructure/services/agents/common/agent-runner.service.d.ts.map +1 -1
  11. package/dist/packages/core/src/infrastructure/services/agents/common/agent-runner.service.js +19 -6
  12. package/dist/src/presentation/cli/index.js +2 -1
  13. package/dist/tsconfig.build.tsbuildinfo +1 -1
  14. package/package.json +1 -1
  15. package/web/.next/BUILD_ID +1 -1
  16. package/web/.next/build-manifest.json +2 -2
  17. package/web/.next/fallback-build-manifest.json +2 -2
  18. package/web/.next/prerender-manifest.json +3 -3
  19. package/web/.next/required-server-files.js +2 -2
  20. package/web/.next/required-server-files.json +2 -2
  21. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
  22. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  23. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  24. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +21 -21
  25. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  26. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  27. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +21 -21
  28. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  29. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  30. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  31. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  32. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  33. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +18 -18
  34. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  35. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  36. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +21 -21
  37. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  38. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  39. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +21 -21
  40. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  41. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  42. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  43. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  44. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  45. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  46. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/_global-error.html +2 -2
  49. package/web/.next/server/app/_global-error.rsc +1 -1
  50. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  51. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  52. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  53. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  54. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  55. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  56. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  58. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  59. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  60. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  62. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  64. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  65. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  66. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  67. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  68. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  69. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  70. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  71. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  72. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  73. package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js +1 -1
  74. package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js.map +1 -1
  75. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  76. package/web/.next/server/chunks/ssr/[root-of-the-server]__45aad79d._.js +1 -1
  77. package/web/.next/server/chunks/ssr/[root-of-the-server]__45aad79d._.js.map +1 -1
  78. package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
  79. package/web/.next/server/chunks/ssr/[root-of-the-server]__5cc4752a._.js +1 -1
  80. package/web/.next/server/chunks/ssr/[root-of-the-server]__5cc4752a._.js.map +1 -1
  81. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  82. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  83. package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js +1 -1
  84. package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js.map +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__e630cc47._.js +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__e630cc47._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  92. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  93. package/web/.next/server/chunks/ssr/_21c75883._.js +1 -1
  94. package/web/.next/server/chunks/ssr/_21c75883._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  96. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  97. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  98. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/{_b31870c9._.js → _f02f4210._.js} +2 -2
  100. package/web/.next/server/chunks/ssr/{_b31870c9._.js.map → _f02f4210._.js.map} +1 -1
  101. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  102. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  104. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  106. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  108. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
  110. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  112. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  114. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  116. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  117. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
  119. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +1 -1
  120. package/web/.next/server/pages/500.html +2 -2
  121. package/web/.next/server/server-reference-manifest.js +1 -1
  122. package/web/.next/server/server-reference-manifest.json +28 -28
  123. package/web/.next/static/chunks/{fb82a429c1efe88e.js → 1a2af08680037549.js} +1 -1
  124. package/web/.next/static/chunks/{641f22e428fcb3f9.js → 2d02a8deb3cfb404.js} +1 -1
  125. package/web/.next/static/chunks/{1fc219a4c715e4e5.js → 2ddedc7a1d0d0a35.js} +1 -1
  126. package/web/.next/static/chunks/{91cc5983165efe3c.js → 5b3dd4146a57ce02.js} +1 -1
  127. package/web/.next/static/chunks/{6c8e83b9a001e9f6.js → 8a174308ba4bd69d.js} +1 -1
  128. package/web/.next/static/chunks/{a5d2d001031a0d3c.js → bea7a5f44d99512f.js} +1 -1
  129. package/web/.next/static/chunks/{68e548df22ca41e8.js → d7f984a3e8043cb0.js} +1 -1
  130. package/web/.next/static/chunks/dac26a484f476f36.js +1 -0
  131. package/web/.next/static/chunks/dd04e12ee5ccb0ad.js +1 -0
  132. package/web/.next/static/chunks/{1178ab163c46f638.js → e1adbd3c092ccc3c.js} +2 -2
  133. package/web/.next/static/chunks/{a8ef40f9e1dd65a1.js → f54b972c149092b5.js} +1 -1
  134. package/web/.next/static/chunks/3f4e4bce2182fc78.js +0 -1
  135. package/web/.next/static/chunks/c8fb1f672ab599be.js +0 -1
  136. /package/web/.next/static/{VAODCOhDu1LYPg7Qpw6A2 → UOxWj8CnreBdyLxAYAGYQ}/_buildManifest.js +0 -0
  137. /package/web/.next/static/{VAODCOhDu1LYPg7Qpw6A2 → UOxWj8CnreBdyLxAYAGYQ}/_clientMiddlewareManifest.json +0 -0
  138. /package/web/.next/static/{VAODCOhDu1LYPg7Qpw6A2 → UOxWj8CnreBdyLxAYAGYQ}/_ssgManifest.js +0 -0
@@ -80,7 +80,7 @@ export interface IAgentRegistry {
80
80
  * @param name - The unique agent name (e.g., 'analyze-repository')
81
81
  * @returns The agent definition, or undefined if not registered
82
82
  */
83
- get(name: string): AgentDefinitionWithFactory | undefined;
83
+ get(name: string): Promise<AgentDefinitionWithFactory | undefined>;
84
84
  /**
85
85
  * List all registered agent definitions.
86
86
  *
@@ -1 +1 @@
1
- {"version":3,"file":"agent-registry.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/agent-registry.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,WAAW,0BAA2B,SAAQ,eAAe;IACjE,4EAA4E;IAE5E,YAAY,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CACvC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAEvD;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,0BAA0B,GAAG,SAAS,CAAC;IAE1D;;;;OAIG;IACH,IAAI,IAAI,0BAA0B,EAAE,CAAC;CACtC"}
1
+ {"version":3,"file":"agent-registry.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/agent-registry.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,WAAW,0BAA2B,SAAQ,eAAe;IACjE,4EAA4E;IAE5E,YAAY,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CACvC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAEvD;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC,CAAC;IAEnE;;;;OAIG;IACH,IAAI,IAAI,0BAA0B,EAAE,CAAC;CACtC"}
@@ -45,7 +45,7 @@ let RunAgentUseCase = class RunAgentUseCase {
45
45
  * @throws Error if the agent name is not registered
46
46
  */
47
47
  async execute(input) {
48
- const definition = this.agentRegistry.get(input.agentName);
48
+ const definition = await this.agentRegistry.get(input.agentName);
49
49
  if (!definition) {
50
50
  const available = this.agentRegistry.list().map((a) => a.name);
51
51
  throw new Error(`Unknown agent: "${input.agentName}". Available agents: ${available.join(', ') || 'none'}`);
@@ -60,7 +60,7 @@ let RunAgentUseCase = class RunAgentUseCase {
60
60
  * @throws Error if the agent name is not registered
61
61
  */
62
62
  async *executeStream(input) {
63
- const definition = this.agentRegistry.get(input.agentName);
63
+ const definition = await this.agentRegistry.get(input.agentName);
64
64
  if (!definition) {
65
65
  const available = this.agentRegistry.list().map((a) => a.name);
66
66
  throw new Error(`Unknown agent: "${input.agentName}". Available agents: ${available.join(', ') || 'none'}`);
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAmHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAqRrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAgHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAsSrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -19,7 +19,6 @@ import { AgentValidatorService } from '../services/agents/common/agent-validator
19
19
  import { promisify } from 'node:util';
20
20
  import { execFile } from 'node:child_process';
21
21
  import { VersionService } from '../services/version.service.js';
22
- import { WebServerService } from '../services/web-server.service.js';
23
22
  import { WorktreeService } from '../services/git/worktree.service.js';
24
23
  import { ToolInstallerServiceImpl } from '../services/tool-installer/tool-installer.service.js';
25
24
  import { GitPrService } from '../services/git/git-pr.service.js';
@@ -40,7 +39,6 @@ import { SpecInitializerService } from '../services/spec/spec-initializer.servic
40
39
  import { DesktopNotifier } from '../services/notifications/desktop-notifier.js';
41
40
  import { NotificationService } from '../services/notifications/notification.service.js';
42
41
  import { getNotificationBus } from '../services/notifications/notification-bus.js';
43
- import { createCheckpointer } from '../services/agents/common/checkpointer.js';
44
42
  import { spawn } from 'node:child_process';
45
43
  // Use cases
46
44
  import { InitializeSettingsUseCase } from '../../application/use-cases/settings/initialize-settings.use-case.js';
@@ -131,8 +129,28 @@ export async function initializeContainer() {
131
129
  // Register services (singletons via @injectable + token)
132
130
  container.registerSingleton('IAgentValidator', AgentValidatorService);
133
131
  container.registerSingleton('IVersionService', VersionService);
132
+ // IWebServerService is registered as a lazy proxy to avoid importing `next`
133
+ // (~80ms) for non-web commands. The actual service is loaded on first method call.
134
134
  container.register('IWebServerService', {
135
- useFactory: () => new WebServerService(),
135
+ useFactory: () => {
136
+ let instance = null;
137
+ const getInstance = async () => {
138
+ if (!instance) {
139
+ const { WebServerService } = await import('../services/web-server.service.js');
140
+ instance = new WebServerService();
141
+ }
142
+ return instance;
143
+ };
144
+ return new Proxy({}, {
145
+ get: (_target, prop) => {
146
+ return async (...args) => {
147
+ const svc = await getInstance();
148
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
149
+ return svc[prop](...args);
150
+ };
151
+ },
152
+ });
153
+ },
136
154
  });
137
155
  container.registerSingleton('IWorktreeService', WorktreeService);
138
156
  container.registerSingleton('IToolInstallerService', ToolInstallerServiceImpl);
@@ -189,16 +207,14 @@ export async function initializeContainer() {
189
207
  container.register('IAgentRegistry', {
190
208
  useFactory: () => new AgentRegistryService(),
191
209
  });
192
- container.register('Checkpointer', {
193
- useFactory: () => createCheckpointer(':memory:'),
194
- });
195
210
  container.register('IAgentRunner', {
196
211
  useFactory: (c) => {
197
212
  const registry = c.resolve('IAgentRegistry');
198
213
  const executorProvider = c.resolve('IAgentExecutorProvider');
199
- const checkpointer = c.resolve('Checkpointer');
200
214
  const runRepository = c.resolve('IAgentRunRepository');
201
- return new AgentRunnerService(registry, executorProvider, checkpointer, runRepository);
215
+ // Checkpointer is lazy-loaded to avoid ~240ms startup cost from
216
+ // @langchain/langgraph-checkpoint-sqlite on every CLI invocation.
217
+ return new AgentRunnerService(registry, executorProvider, runRepository);
202
218
  },
203
219
  });
204
220
  container.register('IFeatureAgentProcessService', {
@@ -10,9 +10,11 @@
10
10
  import type { IAgentRegistry, AgentDefinitionWithFactory } from '../../../../application/ports/output/agents/agent-registry.interface.js';
11
11
  export declare class AgentRegistryService implements IAgentRegistry {
12
12
  private readonly agents;
13
+ private readonly lazyAgents;
13
14
  constructor();
15
+ private resolveLazy;
14
16
  register(definition: AgentDefinitionWithFactory): void;
15
- get(name: string): AgentDefinitionWithFactory | undefined;
17
+ get(name: string): Promise<AgentDefinitionWithFactory | undefined>;
16
18
  list(): AgentDefinitionWithFactory[];
17
19
  }
18
20
  //# sourceMappingURL=agent-registry.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-registry.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-registry.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,0BAA0B,EAC3B,MAAM,+DAA+D,CAAC;AAIvE,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiD;;IAiBxE,QAAQ,CAAC,UAAU,EAAE,0BAA0B,GAAG,IAAI;IAItD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,0BAA0B,GAAG,SAAS;IAIzD,IAAI,IAAI,0BAA0B,EAAE;CAGrC"}
1
+ {"version":3,"file":"agent-registry.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-registry.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,0BAA0B,EAC3B,MAAM,+DAA+D,CAAC;AAevE,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiD;IACxE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;;YAqB1C,WAAW;IAczB,QAAQ,CAAC,UAAU,EAAE,0BAA0B,GAAG,IAAI;IAIhD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC;IAMxE,IAAI,IAAI,0BAA0B,EAAE;CAiBrC"}
@@ -7,30 +7,62 @@
7
7
  *
8
8
  * Pre-registers built-in agents (analyze-repository) at construction time.
9
9
  */
10
- import { createAnalyzeRepositoryGraph } from '../analyze-repo/analyze-repository-graph.js';
11
- import { createFeatureAgentGraph } from '../feature-agent/feature-agent-graph.js';
12
10
  export class AgentRegistryService {
13
11
  agents = new Map();
12
+ lazyAgents = [];
14
13
  constructor() {
15
- // Register built-in agents
16
- this.register({
14
+ // Register built-in agents as lazy definitions to avoid importing
15
+ // @langchain/langgraph (~300ms) at CLI startup.
16
+ this.lazyAgents.push({
17
17
  name: 'analyze-repository',
18
18
  description: 'Analyze repository structure, dependencies, and architecture',
19
- graphFactory: createAnalyzeRepositoryGraph,
20
- });
21
- this.register({
19
+ importFn: () => import('../analyze-repo/analyze-repository-graph.js'),
20
+ factoryExport: 'createAnalyzeRepositoryGraph',
21
+ }, {
22
22
  name: 'feature-agent',
23
23
  description: 'Autonomous SDLC agent: analyze → requirements → research → plan → implement',
24
- graphFactory: createFeatureAgentGraph,
24
+ importFn: () => import('../feature-agent/feature-agent-graph.js'),
25
+ factoryExport: 'createFeatureAgentGraph',
25
26
  });
26
27
  }
28
+ async resolveLazy(name) {
29
+ const lazy = this.lazyAgents.find((a) => a.name === name);
30
+ if (!lazy)
31
+ return undefined;
32
+ const mod = await lazy.importFn();
33
+ const definition = {
34
+ name: lazy.name,
35
+ description: lazy.description,
36
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
+ graphFactory: mod[lazy.factoryExport],
38
+ };
39
+ this.agents.set(name, definition);
40
+ return definition;
41
+ }
27
42
  register(definition) {
28
43
  this.agents.set(definition.name, definition);
29
44
  }
30
- get(name) {
31
- return this.agents.get(name);
45
+ async get(name) {
46
+ const eager = this.agents.get(name);
47
+ if (eager)
48
+ return eager;
49
+ return this.resolveLazy(name);
32
50
  }
33
51
  list() {
34
- return Array.from(this.agents.values());
52
+ // Returns eagerly-registered + cached placeholder metadata for lazy agents.
53
+ const all = new Map(this.agents);
54
+ for (const lazy of this.lazyAgents) {
55
+ if (!all.has(lazy.name)) {
56
+ lazy.placeholder ??= {
57
+ name: lazy.name,
58
+ description: lazy.description,
59
+ graphFactory: () => {
60
+ throw new Error(`Agent '${lazy.name}' must be resolved via get() before use`);
61
+ },
62
+ };
63
+ all.set(lazy.name, lazy.placeholder);
64
+ }
65
+ }
66
+ return Array.from(all.values());
35
67
  }
36
68
  }
@@ -6,7 +6,6 @@
6
6
  * creating executors, compiling LangGraph workflows, and tracking runs
7
7
  * in the repository.
8
8
  */
9
- import type { BaseCheckpointSaver } from '@langchain/langgraph';
10
9
  import type { IAgentRunner, AgentRunOptions } from '../../../../application/ports/output/agents/agent-runner.interface.js';
11
10
  import type { IAgentRegistry } from '../../../../application/ports/output/agents/agent-registry.interface.js';
12
11
  import type { IAgentExecutorProvider } from '../../../../application/ports/output/agents/agent-executor-provider.interface.js';
@@ -15,9 +14,8 @@ import type { AgentRun, AgentRunEvent } from '../../../../domain/generated/outpu
15
14
  export declare class AgentRunnerService implements IAgentRunner {
16
15
  private readonly registry;
17
16
  private readonly executorProvider;
18
- private readonly checkpointer;
19
17
  private readonly runRepository;
20
- constructor(registry: IAgentRegistry, executorProvider: IAgentExecutorProvider, checkpointer: BaseCheckpointSaver, runRepository: IAgentRunRepository);
18
+ constructor(registry: IAgentRegistry, executorProvider: IAgentExecutorProvider, runRepository: IAgentRunRepository);
21
19
  runAgent(agentName: string, prompt: string, options?: AgentRunOptions): Promise<AgentRun>;
22
20
  runAgentStream(agentName: string, prompt: string, options?: AgentRunOptions): AsyncIterable<AgentRunEvent>;
23
21
  private setupRun;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runner.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-runner.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EAChB,MAAM,6DAA6D,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wEAAwE,CAAC;AACrH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qEAAqE,CAAC;AAE/G,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAM5E,qBAAa,kBAAmB,YAAW,YAAY;IAEnD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAHb,QAAQ,EAAE,cAAc,EACxB,gBAAgB,EAAE,sBAAsB,EACxC,YAAY,EAAE,mBAAmB,EACjC,aAAa,EAAE,mBAAmB;IAG/C,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAmBxF,cAAc,CACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,GACxB,aAAa,CAAC,aAAa,CAAC;YAwCjB,QAAQ;YAwCR,aAAa;YAUb,UAAU;CAQzB"}
1
+ {"version":3,"file":"agent-runner.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-runner.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EAChB,MAAM,6DAA6D,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wEAAwE,CAAC;AACrH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qEAAqE,CAAC;AAE/G,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAoB5E,qBAAa,kBAAmB,YAAW,YAAY;IAEnD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAFb,QAAQ,EAAE,cAAc,EACxB,gBAAgB,EAAE,sBAAsB,EACxC,aAAa,EAAE,mBAAmB;IAG/C,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAoBxF,cAAc,CACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,GACxB,aAAa,CAAC,aAAa,CAAC;YAyCjB,QAAQ;YAwCR,aAAa;YAUb,UAAU;CAQzB"}
@@ -11,21 +11,33 @@ import { AgentRunStatus } from '../../../../domain/generated/output.js';
11
11
  import { getSettings } from '../../../services/settings.service.js';
12
12
  import { EventChannel } from '../streaming/event-channel.js';
13
13
  import { StreamingExecutorProxy } from '../streaming/streaming-executor-proxy.js';
14
+ /**
15
+ * Lazy-loads the checkpointer to avoid ~240ms startup cost from
16
+ * @langchain/langgraph-checkpoint-sqlite on every CLI invocation.
17
+ * The import only happens when an agent is actually run.
18
+ */
19
+ let _checkpointer = null;
20
+ async function getCheckpointer() {
21
+ if (!_checkpointer) {
22
+ const { createCheckpointer } = await import('./checkpointer.js');
23
+ _checkpointer = createCheckpointer(':memory:');
24
+ }
25
+ return _checkpointer;
26
+ }
14
27
  export class AgentRunnerService {
15
28
  registry;
16
29
  executorProvider;
17
- checkpointer;
18
30
  runRepository;
19
- constructor(registry, executorProvider, checkpointer, runRepository) {
31
+ constructor(registry, executorProvider, runRepository) {
20
32
  this.registry = registry;
21
33
  this.executorProvider = executorProvider;
22
- this.checkpointer = checkpointer;
23
34
  this.runRepository = runRepository;
24
35
  }
25
36
  async runAgent(agentName, prompt, options) {
26
37
  const { definition, executor, runId, threadId } = await this.setupRun(agentName, prompt);
27
38
  try {
28
- const compiledGraph = definition.graphFactory(executor, this.checkpointer);
39
+ const checkpointer = await getCheckpointer();
40
+ const compiledGraph = definition.graphFactory(executor, checkpointer);
29
41
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
42
  const result = await compiledGraph.invoke({ repositoryPath: options?.repositoryPath ?? process.cwd() }, { configurable: { thread_id: threadId } });
31
43
  await this.markCompleted(runId, result);
@@ -42,7 +54,8 @@ export class AgentRunnerService {
42
54
  const channel = new EventChannel();
43
55
  const proxy = new StreamingExecutorProxy(executor, channel);
44
56
  // Compile graph with proxy (graph doesn't know about streaming)
45
- const compiledGraph = definition.graphFactory(proxy, this.checkpointer);
57
+ const checkpointer = await getCheckpointer();
58
+ const compiledGraph = definition.graphFactory(proxy, checkpointer);
46
59
  // Start graph invocation in background
47
60
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
61
  const graphPromise = compiledGraph
@@ -67,7 +80,7 @@ export class AgentRunnerService {
67
80
  await graphPromise;
68
81
  }
69
82
  async setupRun(agentName, prompt) {
70
- const definition = this.registry.get(agentName);
83
+ const definition = await this.registry.get(agentName);
71
84
  if (!definition) {
72
85
  throw new Error(`Agent '${agentName}' not found. Available: ${this.registry
73
86
  .list()
@@ -55,7 +55,6 @@ import { initializeContainer, container } from '../../../packages/core/src/infra
55
55
  import { InitializeSettingsUseCase } from '../../../packages/core/src/application/use-cases/settings/initialize-settings.use-case.js';
56
56
  import { initializeSettings } from '../../../packages/core/src/infrastructure/services/settings.service.js';
57
57
  import { CheckOnboardingStatusUseCase } from '../../../packages/core/src/application/use-cases/settings/check-onboarding-status.use-case.js';
58
- import { onboardingWizard } from '../tui/wizards/onboarding/onboarding.wizard.js';
59
58
  /**
60
59
  * Bootstrap function - initializes all dependencies before CLI starts.
61
60
  * Performs async initialization (database, settings) before parsing commands.
@@ -90,6 +89,8 @@ async function bootstrap() {
90
89
  const onboardingCheck = new CheckOnboardingStatusUseCase();
91
90
  const { isComplete } = await onboardingCheck.execute();
92
91
  if (!isComplete) {
92
+ // Lazy-import to avoid ~460ms startup cost when onboarding is already complete
93
+ const { onboardingWizard } = await import('../tui/wizards/onboarding/onboarding.wizard.js');
93
94
  await onboardingWizard();
94
95
  }
95
96
  }