@shepai/cli 1.62.0 → 1.64.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/packages/core/src/application/ports/output/agents/agent-executor-factory.interface.d.ts +18 -0
- package/dist/packages/core/src/application/ports/output/agents/agent-executor-factory.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/agents/index.d.ts +1 -1
- package/dist/packages/core/src/application/ports/output/agents/index.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.js +7 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.js +3 -0
- package/dist/packages/core/src/infrastructure/services/filesystem/shep-directory.service.d.ts +7 -0
- package/dist/packages/core/src/infrastructure/services/filesystem/shep-directory.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/filesystem/shep-directory.service.js +9 -0
- package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +18 -4
- package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js +1 -1
- package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/daemon/start-daemon.js +24 -15
- package/dist/src/presentation/cli/commands/status.command.d.ts +7 -0
- package/dist/src/presentation/cli/commands/status.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/status.command.js +167 -3
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts +17 -0
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +23 -0
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts +22 -0
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.js +56 -0
- package/dist/src/presentation/web/components/common/base-drawer/index.d.ts +2 -0
- package/dist/src/presentation/web/components/common/base-drawer/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/base-drawer/index.js +1 -0
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +9 -16
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +14 -14
- package/dist/src/presentation/web/components/common/repository-node/index.d.ts +1 -0
- package/dist/src/presentation/web/components/common/repository-node/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/index.js +1 -0
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts +7 -0
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +12 -0
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts +9 -0
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +34 -0
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +4 -6
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +20 -2
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +3 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +4 -2
- package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.js +3 -6
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__dd5b62cb._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__dd5b62cb._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
- package/web/.next/server/chunks/ssr/_73d14b70._.js +3 -0
- package/web/.next/server/chunks/ssr/_73d14b70._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_7f386377._.js +3 -0
- package/web/.next/server/chunks/ssr/_7f386377._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_d3711354._.js +2 -2
- package/web/.next/server/chunks/ssr/_d3711354._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_a64b7b24._.js → _d81184e2._.js} +2 -2
- package/web/.next/server/chunks/ssr/_d81184e2._.js.map +1 -0
- package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_fe355030._.js → server/chunks/ssr/node_modules__pnpm_87f920e7._.js} +2 -2
- package/web/.next/server/chunks/ssr/{node_modules__pnpm_fe355030._.js.map → node_modules__pnpm_87f920e7._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -0
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +15 -15
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +14 -14
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__dd5b62cb._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_73d14b70._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_7f386377._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_d3711354._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_a64b7b24._.js → _d81184e2._.js} +2 -2
- package/web/.next/{server/chunks/ssr/node_modules__pnpm_fe355030._.js → standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_87f920e7._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +15 -15
- package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.stories.tsx +207 -0
- package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.tsx +90 -0
- package/web/.next/standalone/src/presentation/web/components/common/base-drawer/index.ts +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +143 -172
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +119 -133
- package/web/.next/standalone/src/presentation/web/components/common/repository-node/index.ts +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-drawer.stories.tsx +58 -0
- package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-drawer.tsx +82 -0
- package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.tsx +79 -96
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +30 -2
- package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +7 -0
- package/web/.next/standalone/src/presentation/web/components/features/skills/skill-detail-drawer.tsx +71 -77
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/04d22f0d67c6671b.js +10 -0
- package/web/.next/static/chunks/0c6654ec27f11c7e.js +1 -0
- package/web/.next/static/chunks/12c70bfd5951cf9b.js +1 -0
- package/web/.next/static/chunks/21541b346dd4dd28.js +1 -0
- package/web/.next/static/chunks/{cb1b27e4a21415d3.js → 3b941e59ac013e12.js} +2 -2
- package/web/.next/static/chunks/{09d898be63c54f20.js → 78919481e7c5ad4f.js} +1 -1
- package/web/.next/static/chunks/a5b6a22de303e877.css +2 -0
- package/web/.next/static/chunks/af7a5bcb7c49e46e.js +1 -0
- package/web/.next/static/chunks/bcd97add650ece51.js +1 -0
- package/web/.next/static/chunks/be784143669bb992.js +1 -0
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_9915d2a7._.js +0 -3
- package/web/.next/server/chunks/ssr/_9915d2a7._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a64b7b24._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_e7a4b0e4._.js +0 -3
- package/web/.next/server/chunks/ssr/_e7a4b0e4._.js.map +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9915d2a7._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_e7a4b0e4._.js +0 -3
- package/web/.next/static/chunks/13664c029245afc8.js +0 -1
- package/web/.next/static/chunks/25f42652257ff43d.js +0 -1
- package/web/.next/static/chunks/2934854f0378f815.js +0 -1
- package/web/.next/static/chunks/45f510f84c7c417d.css +0 -2
- package/web/.next/static/chunks/8e4c719503d9387e.js +0 -1
- package/web/.next/static/chunks/cd44f06f18e3425a.js +0 -10
- /package/web/.next/static/{2z-UoCok36_D1hh1-N88G → R37CbaEU-TK9xR6x4aI_Z}/_buildManifest.js +0 -0
- /package/web/.next/static/{2z-UoCok36_D1hh1-N88G → R37CbaEU-TK9xR6x4aI_Z}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{2z-UoCok36_D1hh1-N88G → R37CbaEU-TK9xR6x4aI_Z}/_ssgManifest.js +0 -0
package/dist/packages/core/src/application/ports/output/agents/agent-executor-factory.interface.d.ts
CHANGED
|
@@ -18,6 +18,17 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import type { AgentType, AgentConfig } from '../../../../domain/generated/output.js';
|
|
20
20
|
import type { IAgentExecutor } from './agent-executor.interface.js';
|
|
21
|
+
/**
|
|
22
|
+
* CLI binary info for an agent executor, used for version detection.
|
|
23
|
+
*/
|
|
24
|
+
export interface AgentCliInfo {
|
|
25
|
+
/** Agent type identifier (e.g. 'claude-code') */
|
|
26
|
+
agentType: AgentType;
|
|
27
|
+
/** CLI binary name (e.g. 'claude') */
|
|
28
|
+
cmd: string;
|
|
29
|
+
/** Arguments to get version (e.g. ['--version']) */
|
|
30
|
+
versionArgs: string[];
|
|
31
|
+
}
|
|
21
32
|
/**
|
|
22
33
|
* Port interface for creating agent executor instances.
|
|
23
34
|
*
|
|
@@ -41,5 +52,12 @@ export interface IAgentExecutorFactory {
|
|
|
41
52
|
* @returns Array of supported agent types
|
|
42
53
|
*/
|
|
43
54
|
getSupportedAgents(): AgentType[];
|
|
55
|
+
/**
|
|
56
|
+
* Get CLI binary info for each agent executor (for version detection).
|
|
57
|
+
* Excludes non-CLI agents (e.g. 'dev').
|
|
58
|
+
*
|
|
59
|
+
* @returns Array of CLI info for version-checkable agents
|
|
60
|
+
*/
|
|
61
|
+
getCliInfo(): AgentCliInfo[];
|
|
44
62
|
}
|
|
45
63
|
//# sourceMappingURL=agent-executor-factory.interface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-executor-factory.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/agent-executor-factory.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,GAAG,cAAc,CAAC;IAE9E;;;;OAIG;IACH,kBAAkB,IAAI,SAAS,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-executor-factory.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/agent-executor-factory.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,SAAS,EAAE,SAAS,CAAC;IACrB,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,oDAAoD;IACpD,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,GAAG,cAAc,CAAC;IAE9E;;;;OAIG;IACH,kBAAkB,IAAI,SAAS,EAAE,CAAC;IAElC;;;;;OAKG;IACH,UAAU,IAAI,YAAY,EAAE,CAAC;CAC9B"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Interfaces for agent execution, orchestration, and persistence.
|
|
5
5
|
*/
|
|
6
6
|
export type { IAgentExecutor, AgentExecutionResult, AgentExecutionStreamEvent, AgentExecutionOptions, } from './agent-executor.interface.js';
|
|
7
|
-
export type { IAgentExecutorFactory } from './agent-executor-factory.interface.js';
|
|
7
|
+
export type { IAgentExecutorFactory, AgentCliInfo } from './agent-executor-factory.interface.js';
|
|
8
8
|
export type { IAgentExecutorProvider } from './agent-executor-provider.interface.js';
|
|
9
9
|
export type { IAgentRegistry, AgentDefinitionWithFactory } from './agent-registry.interface.js';
|
|
10
10
|
export type { IAgentRunner, AgentRunOptions } from './agent-runner.interface.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACjG,YAAY,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACrF,YAAY,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChG,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACjF,YAAY,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,YAAY,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACrF,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC7F,YAAY,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACxF,YAAY,EACV,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EACV,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,yCAAyC,CAAC"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import type { AgentType, AgentConfig } from '../../../../domain/generated/output.js';
|
|
11
11
|
import type { IAgentExecutor } from '../../../../application/ports/output/agents/agent-executor.interface.js';
|
|
12
|
-
import type { IAgentExecutorFactory } from '../../../../application/ports/output/agents/agent-executor-factory.interface.js';
|
|
12
|
+
import type { IAgentExecutorFactory, AgentCliInfo } from '../../../../application/ports/output/agents/agent-executor-factory.interface.js';
|
|
13
13
|
import type { SpawnFunction } from './types.js';
|
|
14
14
|
/**
|
|
15
15
|
* Factory that creates and caches agent executor instances.
|
|
@@ -39,5 +39,6 @@ export declare class AgentExecutorFactory implements IAgentExecutorFactory {
|
|
|
39
39
|
* @returns Array of supported agent types
|
|
40
40
|
*/
|
|
41
41
|
getSupportedAgents(): AgentType[];
|
|
42
|
+
getCliInfo(): AgentCliInfo[];
|
|
42
43
|
}
|
|
43
44
|
//# sourceMappingURL=agent-executor-factory.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-executor-factory.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yEAAyE,CAAC;AAC9G,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"agent-executor-factory.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yEAAyE,CAAC;AAC9G,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACb,MAAM,iFAAiF,CAAC;AAKzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,qBAAqB;IAMpD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAE3D;;OAEG;gBAC0B,KAAK,EAAE,aAAa;IAEjD;;;;;;;OAOG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG,cAAc;IA6B9E;;;;OAIG;IACH,kBAAkB,IAAI,SAAS,EAAE;IASjC,UAAU,IAAI,YAAY,EAAE;CAO7B"}
|
|
@@ -72,4 +72,11 @@ export class AgentExecutorFactory {
|
|
|
72
72
|
'gemini-cli',
|
|
73
73
|
];
|
|
74
74
|
}
|
|
75
|
+
getCliInfo() {
|
|
76
|
+
return [
|
|
77
|
+
{ agentType: 'claude-code', cmd: 'claude', versionArgs: ['--version'] },
|
|
78
|
+
{ agentType: 'gemini-cli', cmd: 'gemini', versionArgs: ['--version'] },
|
|
79
|
+
{ agentType: 'cursor', cmd: 'cursor', versionArgs: ['--version'] },
|
|
80
|
+
];
|
|
81
|
+
}
|
|
75
82
|
}
|
|
@@ -6,10 +6,11 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { AgentType, AgentConfig } from '../../../../../domain/generated/output.js';
|
|
8
8
|
import type { IAgentExecutor } from '../../../../../application/ports/output/agents/agent-executor.interface.js';
|
|
9
|
-
import type { IAgentExecutorFactory } from '../../../../../application/ports/output/agents/agent-executor-factory.interface.js';
|
|
9
|
+
import type { IAgentExecutorFactory, AgentCliInfo } from '../../../../../application/ports/output/agents/agent-executor-factory.interface.js';
|
|
10
10
|
export declare class MockAgentExecutorFactory implements IAgentExecutorFactory {
|
|
11
11
|
private readonly executor;
|
|
12
12
|
createExecutor(_agentType: AgentType, _authConfig: AgentConfig): IAgentExecutor;
|
|
13
13
|
getSupportedAgents(): AgentType[];
|
|
14
|
+
getCliInfo(): AgentCliInfo[];
|
|
14
15
|
}
|
|
15
16
|
//# sourceMappingURL=mock-executor-factory.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-executor-factory.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4EAA4E,CAAC;AACjH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"mock-executor-factory.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4EAA4E,CAAC;AACjH,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACb,MAAM,oFAAoF,CAAC;AAG5F,qBAAa,wBAAyB,YAAW,qBAAqB;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAE3D,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG,cAAc;IAI/E,kBAAkB,IAAI,SAAS,EAAE;IAIjC,UAAU,IAAI,YAAY,EAAE;CAG7B"}
|
package/dist/packages/core/src/infrastructure/services/filesystem/shep-directory.service.d.ts
CHANGED
|
@@ -26,6 +26,13 @@ export declare function getShepDbPath(): string;
|
|
|
26
26
|
* @returns Path to daemon.json
|
|
27
27
|
*/
|
|
28
28
|
export declare function getDaemonStatePath(): string;
|
|
29
|
+
/**
|
|
30
|
+
* Gets the path to the daemon log file.
|
|
31
|
+
* Uses SHEP_HOME env var if set (for test isolation), otherwise ~/.shep/daemon.log
|
|
32
|
+
*
|
|
33
|
+
* @returns Path to daemon.log
|
|
34
|
+
*/
|
|
35
|
+
export declare function getDaemonLogPath(): string;
|
|
29
36
|
/**
|
|
30
37
|
* Ensures the shep home directory exists with correct permissions.
|
|
31
38
|
* Creates the directory if it doesn't exist.
|
package/dist/packages/core/src/infrastructure/services/filesystem/shep-directory.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shep-directory.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBzD"}
|
|
1
|
+
{"version":3,"file":"shep-directory.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBzD"}
|
|
@@ -43,6 +43,15 @@ export function getShepDbPath() {
|
|
|
43
43
|
export function getDaemonStatePath() {
|
|
44
44
|
return join(resolveShepHomeDir(), 'daemon.json');
|
|
45
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Gets the path to the daemon log file.
|
|
48
|
+
* Uses SHEP_HOME env var if set (for test isolation), otherwise ~/.shep/daemon.log
|
|
49
|
+
*
|
|
50
|
+
* @returns Path to daemon.log
|
|
51
|
+
*/
|
|
52
|
+
export function getDaemonLogPath() {
|
|
53
|
+
return join(resolveShepHomeDir(), 'daemon.log');
|
|
54
|
+
}
|
|
46
55
|
/**
|
|
47
56
|
* Ensures the shep home directory exists with correct permissions.
|
|
48
57
|
* Creates the directory if it doesn't exist.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAOlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAqBlB,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAOlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAqBlB,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAMzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAU9B"}
|
|
@@ -78,16 +78,30 @@ let WorktreeService = class WorktreeService {
|
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
async ensureGitRepository(repoPath) {
|
|
81
|
+
let isExistingRepo = false;
|
|
81
82
|
try {
|
|
82
83
|
await this.execFile('git', ['rev-parse', '--is-inside-work-tree'], { cwd: repoPath });
|
|
83
|
-
|
|
84
|
+
isExistingRepo = true;
|
|
84
85
|
}
|
|
85
86
|
catch {
|
|
86
|
-
// Not a git repo — initialize
|
|
87
|
+
// Not a git repo — will initialize below
|
|
88
|
+
}
|
|
89
|
+
if (isExistingRepo) {
|
|
90
|
+
// Repo exists but may have an unborn branch (no commits).
|
|
91
|
+
// git worktree add requires at least one commit as a start-point.
|
|
92
|
+
try {
|
|
93
|
+
await this.execFile('git', ['rev-parse', 'HEAD'], { cwd: repoPath });
|
|
94
|
+
return; // Has commits — nothing to do
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Unborn branch (no commits) — create initial commit below
|
|
98
|
+
}
|
|
87
99
|
}
|
|
88
100
|
try {
|
|
89
|
-
|
|
90
|
-
|
|
101
|
+
if (!isExistingRepo) {
|
|
102
|
+
mkdirSync(repoPath, { recursive: true });
|
|
103
|
+
await this.execFile('git', ['init'], { cwd: repoPath });
|
|
104
|
+
}
|
|
91
105
|
await this.execFile('git', ['config', 'user.name', GIT_AUTO_INIT_USER], { cwd: repoPath });
|
|
92
106
|
await this.execFile('git', ['config', 'user.email', GIT_AUTO_INIT_EMAIL], { cwd: repoPath });
|
|
93
107
|
await this.execFile('git', ['commit', '--allow-empty', '-m', 'Initial commit'], {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* repositoryPath for batch `gh pr list` queries.
|
|
11
11
|
*/
|
|
12
12
|
import { SdlcLifecycle, PrStatus, CiStatus, AgentRunStatus, NotificationEventType, NotificationSeverity, } from '../../../domain/generated/output.js';
|
|
13
|
-
const DEFAULT_POLL_INTERVAL_MS =
|
|
13
|
+
const DEFAULT_POLL_INTERVAL_MS = 30_000;
|
|
14
14
|
const TAG = '[PrSyncWatcher]';
|
|
15
15
|
const CI_STATUS_MAP = {
|
|
16
16
|
success: CiStatus.Success,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-daemon.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/daemon/start-daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"start-daemon.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/daemon/start-daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAoBH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+F9E"}
|
|
@@ -17,10 +17,12 @@
|
|
|
17
17
|
* 7. Open browser via BrowserOpenerService
|
|
18
18
|
*/
|
|
19
19
|
import { spawn } from 'node:child_process';
|
|
20
|
+
import { closeSync, openSync, renameSync, existsSync } from 'node:fs';
|
|
20
21
|
import http from 'node:http';
|
|
21
22
|
import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
|
|
22
23
|
import { findAvailablePort, DEFAULT_PORT } from '../../../../../packages/core/src/infrastructure/services/port.service.js';
|
|
23
24
|
import { BrowserOpenerService } from '../../../../../packages/core/src/infrastructure/services/browser-opener.service.js';
|
|
25
|
+
import { getDaemonLogPath } from '../../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.js';
|
|
24
26
|
import { fmt, messages, spinner } from '../../ui/index.js';
|
|
25
27
|
/** How long to wait (ms) after spawn to verify the child is still alive. */
|
|
26
28
|
const SPAWN_SETTLE_MS = 500;
|
|
@@ -46,17 +48,26 @@ export async function startDaemon(opts = {}) {
|
|
|
46
48
|
// Resolve the port
|
|
47
49
|
const startPort = opts.port ?? DEFAULT_PORT;
|
|
48
50
|
const port = await findAvailablePort(startPort);
|
|
51
|
+
// Rotate existing daemon.log → daemon.log.old (keep 1 backup)
|
|
52
|
+
const logPath = getDaemonLogPath();
|
|
53
|
+
try {
|
|
54
|
+
if (existsSync(logPath)) {
|
|
55
|
+
renameSync(logPath, `${logPath}.old`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Best-effort rotation — continue even if rename fails
|
|
60
|
+
}
|
|
61
|
+
// Open log file for daemon stdout+stderr redirection
|
|
62
|
+
const logFd = openSync(logPath, 'a', 0o600);
|
|
49
63
|
// Spawn the daemon as a detached child process.
|
|
50
64
|
// Propagate process.execArgv so tsx loader hooks (--require / --import) are
|
|
51
65
|
// available in dev mode. In production (compiled JS), execArgv is empty.
|
|
66
|
+
// stdout and stderr are both redirected to daemon.log.
|
|
52
67
|
const child = spawn(process.execPath, [...process.execArgv, process.argv[1], '_serve', '--port', String(port)], {
|
|
53
68
|
detached: true,
|
|
54
|
-
|
|
55
|
-
stdio: ['ignore', 'ignore', 'pipe'],
|
|
69
|
+
stdio: ['ignore', logFd, logFd],
|
|
56
70
|
});
|
|
57
|
-
// Collect stderr in case the child crashes during startup.
|
|
58
|
-
let stderrChunks = [];
|
|
59
|
-
child.stderr.on('data', (chunk) => stderrChunks.push(chunk));
|
|
60
71
|
// Wait briefly for the child to either settle or crash.
|
|
61
72
|
const exitCode = await Promise.race([
|
|
62
73
|
new Promise((resolve) => child.on('exit', (code) => resolve(code))),
|
|
@@ -64,21 +75,17 @@ export async function startDaemon(opts = {}) {
|
|
|
64
75
|
]);
|
|
65
76
|
if (exitCode !== undefined) {
|
|
66
77
|
// Child exited during the settle window — startup failed.
|
|
67
|
-
|
|
78
|
+
closeSync(logFd);
|
|
68
79
|
messages.newline();
|
|
69
80
|
messages.error(`Daemon failed to start (exit code ${exitCode ?? 'unknown'}).`);
|
|
70
|
-
|
|
71
|
-
console.error(stderr);
|
|
72
|
-
}
|
|
81
|
+
messages.info(`Check logs: ${fmt.code(logPath)}`);
|
|
73
82
|
messages.newline();
|
|
74
83
|
// Clean up stale daemon.json if it exists
|
|
75
84
|
await daemonService.delete();
|
|
76
85
|
return;
|
|
77
86
|
}
|
|
78
|
-
// Child is alive — detach fully.
|
|
79
|
-
|
|
80
|
-
child.stderr.destroy();
|
|
81
|
-
stderrChunks = [];
|
|
87
|
+
// Child is alive — close the log fd in the parent and detach fully.
|
|
88
|
+
closeSync(logFd);
|
|
82
89
|
child.unref();
|
|
83
90
|
// Write daemon.json atomically
|
|
84
91
|
await daemonService.write({
|
|
@@ -119,8 +126,10 @@ function waitForServer(url, timeoutMs) {
|
|
|
119
126
|
const probe = () => {
|
|
120
127
|
if (Date.now() > deadline)
|
|
121
128
|
return resolve(false);
|
|
122
|
-
const req = http.get(url, () => {
|
|
123
|
-
|
|
129
|
+
const req = http.get(url, (res) => {
|
|
130
|
+
// Drain the response so the socket doesn't keep the event loop alive
|
|
131
|
+
res.resume();
|
|
132
|
+
res.on('end', () => resolve(true));
|
|
124
133
|
});
|
|
125
134
|
req.on('error', () => {
|
|
126
135
|
setTimeout(probe, READY_POLL_MS);
|
|
@@ -7,10 +7,17 @@
|
|
|
7
7
|
* - PID, port, URL (from daemon.json)
|
|
8
8
|
* - Uptime (computed from startedAt)
|
|
9
9
|
* - CPU%, RSS memory (from ps shell-out via execFile — injection-safe)
|
|
10
|
+
* - Environment: paths, versions, agent executor versions
|
|
11
|
+
*
|
|
12
|
+
* Flags:
|
|
13
|
+
* --logs [N] Show last N lines of daemon.log (default 50)
|
|
14
|
+
* -f, --follow Follow daemon.log in real-time (like tail -f)
|
|
10
15
|
*
|
|
11
16
|
* Gracefully degrades if ps is unavailable (timeout or error).
|
|
12
17
|
*
|
|
13
18
|
* Usage: shep status
|
|
19
|
+
* shep status --logs
|
|
20
|
+
* shep status --logs 100 --follow
|
|
14
21
|
*/
|
|
15
22
|
import { Command } from 'commander';
|
|
16
23
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/status.command.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"status.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/status.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwLpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAqH7C"}
|
|
@@ -7,16 +7,29 @@
|
|
|
7
7
|
* - PID, port, URL (from daemon.json)
|
|
8
8
|
* - Uptime (computed from startedAt)
|
|
9
9
|
* - CPU%, RSS memory (from ps shell-out via execFile — injection-safe)
|
|
10
|
+
* - Environment: paths, versions, agent executor versions
|
|
11
|
+
*
|
|
12
|
+
* Flags:
|
|
13
|
+
* --logs [N] Show last N lines of daemon.log (default 50)
|
|
14
|
+
* -f, --follow Follow daemon.log in real-time (like tail -f)
|
|
10
15
|
*
|
|
11
16
|
* Gracefully degrades if ps is unavailable (timeout or error).
|
|
12
17
|
*
|
|
13
18
|
* Usage: shep status
|
|
19
|
+
* shep status --logs
|
|
20
|
+
* shep status --logs 100 --follow
|
|
14
21
|
*/
|
|
15
22
|
import { Command } from 'commander';
|
|
16
23
|
import { execFile } from 'node:child_process';
|
|
24
|
+
import { createReadStream, existsSync, statSync } from 'node:fs';
|
|
25
|
+
import { createInterface } from 'node:readline';
|
|
26
|
+
import { watch } from 'node:fs';
|
|
17
27
|
import { container } from '../../../../packages/core/src/infrastructure/di/container.js';
|
|
18
|
-
import {
|
|
28
|
+
import { getShepHomeDir, getShepDbPath, getDaemonStatePath, getDaemonLogPath, } from '../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.js';
|
|
29
|
+
import { renderDetailView, messages, colors } from '../ui/index.js';
|
|
19
30
|
const PS_TIMEOUT_MS = 2000;
|
|
31
|
+
const VERSION_CMD_TIMEOUT_MS = 3000;
|
|
32
|
+
const DEFAULT_LOG_LINES = 50;
|
|
20
33
|
/**
|
|
21
34
|
* Parse ps output: "pid cpu% rss_kb\n"
|
|
22
35
|
* Returns formatted strings for display.
|
|
@@ -75,13 +88,129 @@ function fetchPsMetrics(pid) {
|
|
|
75
88
|
});
|
|
76
89
|
});
|
|
77
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Detect the version of an agent executor CLI.
|
|
93
|
+
* Returns version string or 'not installed'.
|
|
94
|
+
*/
|
|
95
|
+
function detectAgentVersion(cmd, args) {
|
|
96
|
+
return new Promise((resolve) => {
|
|
97
|
+
execFile(cmd, args, { timeout: VERSION_CMD_TIMEOUT_MS }, (err, stdout) => {
|
|
98
|
+
if (err) {
|
|
99
|
+
resolve('not installed');
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Extract first line, strip leading labels like "claude-code v1.2.3" → "v1.2.3"
|
|
103
|
+
const line = stdout.trim().split('\n')[0] ?? '';
|
|
104
|
+
// Try to extract version-like string
|
|
105
|
+
const match = line.match(/v?\d+\.\d+[\w.-]*/);
|
|
106
|
+
resolve(match ? match[0] : line || 'unknown');
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Read the last N lines of a file.
|
|
113
|
+
*/
|
|
114
|
+
async function tailFile(filePath, lineCount) {
|
|
115
|
+
const lines = [];
|
|
116
|
+
const stream = createReadStream(filePath, { encoding: 'utf-8' });
|
|
117
|
+
const rl = createInterface({ input: stream, crlfDelay: Infinity });
|
|
118
|
+
for await (const line of rl) {
|
|
119
|
+
lines.push(line);
|
|
120
|
+
if (lines.length > lineCount) {
|
|
121
|
+
lines.shift();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return lines;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Follow a file in real-time (like tail -f).
|
|
128
|
+
* Reads new content as the file grows.
|
|
129
|
+
*/
|
|
130
|
+
function followFile(filePath) {
|
|
131
|
+
let position = 0;
|
|
132
|
+
try {
|
|
133
|
+
position = statSync(filePath).size;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// File doesn't exist yet, start from 0
|
|
137
|
+
}
|
|
138
|
+
const readNewContent = () => {
|
|
139
|
+
try {
|
|
140
|
+
const currentSize = statSync(filePath).size;
|
|
141
|
+
if (currentSize <= position) {
|
|
142
|
+
if (currentSize < position)
|
|
143
|
+
position = 0; // File was truncated
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const stream = createReadStream(filePath, {
|
|
147
|
+
encoding: 'utf-8',
|
|
148
|
+
start: position,
|
|
149
|
+
});
|
|
150
|
+
let buffer = '';
|
|
151
|
+
stream.on('data', (chunk) => {
|
|
152
|
+
buffer += chunk;
|
|
153
|
+
});
|
|
154
|
+
stream.on('end', () => {
|
|
155
|
+
position = currentSize;
|
|
156
|
+
if (buffer) {
|
|
157
|
+
process.stdout.write(buffer);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// File may have been deleted/rotated
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
const watcher = watch(filePath, () => {
|
|
166
|
+
readNewContent();
|
|
167
|
+
});
|
|
168
|
+
// Also poll every 1s as a fallback (fs.watch can miss events)
|
|
169
|
+
const interval = setInterval(readNewContent, 1000);
|
|
170
|
+
process.on('SIGINT', () => {
|
|
171
|
+
watcher.close();
|
|
172
|
+
clearInterval(interval);
|
|
173
|
+
process.exit(0);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
78
176
|
/**
|
|
79
177
|
* Create the status command.
|
|
80
178
|
*/
|
|
81
179
|
export function createStatusCommand() {
|
|
82
180
|
return new Command('status')
|
|
83
181
|
.description('Show the status of the Shep web UI daemon')
|
|
84
|
-
.
|
|
182
|
+
.option('--logs [lines]', 'Show last N lines of daemon log (default 50)')
|
|
183
|
+
.option('-f, --follow', 'Follow daemon log output in real-time')
|
|
184
|
+
.action(async (options) => {
|
|
185
|
+
const logPath = getDaemonLogPath();
|
|
186
|
+
// Handle --logs flag
|
|
187
|
+
if (options.logs !== undefined || options.follow) {
|
|
188
|
+
if (!existsSync(logPath)) {
|
|
189
|
+
messages.newline();
|
|
190
|
+
messages.info('No daemon log file found.');
|
|
191
|
+
messages.info(`Expected at: ${logPath}`);
|
|
192
|
+
messages.newline();
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// Show tail lines
|
|
196
|
+
const lineCount = typeof options.logs === 'string'
|
|
197
|
+
? parseInt(options.logs, 10) || DEFAULT_LOG_LINES
|
|
198
|
+
: DEFAULT_LOG_LINES;
|
|
199
|
+
const lines = await tailFile(logPath, lineCount);
|
|
200
|
+
if (lines.length > 0) {
|
|
201
|
+
console.log(lines.join('\n'));
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
messages.info('Log file is empty.');
|
|
205
|
+
}
|
|
206
|
+
// Follow mode
|
|
207
|
+
if (options.follow) {
|
|
208
|
+
console.log(colors.muted('--- following daemon.log (Ctrl+C to stop) ---'));
|
|
209
|
+
followFile(logPath);
|
|
210
|
+
return; // Block forever (followFile handles SIGINT)
|
|
211
|
+
}
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
85
214
|
const daemonService = container.resolve('IDaemonService');
|
|
86
215
|
const state = await daemonService.read();
|
|
87
216
|
if (!state || !daemonService.isAlive(state.pid)) {
|
|
@@ -95,7 +224,24 @@ export function createStatusCommand() {
|
|
|
95
224
|
const url = `http://localhost:${port}`;
|
|
96
225
|
const uptimeMs = Date.now() - Date.parse(startedAt);
|
|
97
226
|
const uptime = humanizeUptime(uptimeMs);
|
|
98
|
-
|
|
227
|
+
// Get agent CLI info from the factory
|
|
228
|
+
const factory = container.resolve('IAgentExecutorFactory');
|
|
229
|
+
const agentClis = factory.getCliInfo();
|
|
230
|
+
// Fetch ps metrics and agent versions in parallel
|
|
231
|
+
const [psMetrics, ...agentVersions] = await Promise.all([
|
|
232
|
+
fetchPsMetrics(pid),
|
|
233
|
+
...agentClis.map((a) => detectAgentVersion(a.cmd, a.versionArgs)),
|
|
234
|
+
]);
|
|
235
|
+
const { cpu, rssMb } = psMetrics;
|
|
236
|
+
// Get CLI version
|
|
237
|
+
let cliVersion = 'unknown';
|
|
238
|
+
try {
|
|
239
|
+
const versionService = container.resolve('IVersionService');
|
|
240
|
+
cliVersion = versionService.getVersion().version;
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// Version service not available
|
|
244
|
+
}
|
|
99
245
|
renderDetailView({
|
|
100
246
|
title: 'Shep Daemon Status',
|
|
101
247
|
sections: [
|
|
@@ -113,6 +259,24 @@ export function createStatusCommand() {
|
|
|
113
259
|
},
|
|
114
260
|
],
|
|
115
261
|
},
|
|
262
|
+
{
|
|
263
|
+
title: 'Environment',
|
|
264
|
+
fields: [
|
|
265
|
+
{ label: 'Shep Home', value: getShepHomeDir() },
|
|
266
|
+
{ label: 'CLI Version', value: cliVersion },
|
|
267
|
+
{ label: 'Node Version', value: process.version },
|
|
268
|
+
{ label: 'DB Path', value: getShepDbPath() },
|
|
269
|
+
{ label: 'Log File', value: logPath },
|
|
270
|
+
{ label: 'Daemon Config', value: getDaemonStatePath() },
|
|
271
|
+
],
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
title: 'Agent Executors',
|
|
275
|
+
fields: agentClis.map((agent, i) => ({
|
|
276
|
+
label: agent.agentType,
|
|
277
|
+
value: agentVersions[i],
|
|
278
|
+
})),
|
|
279
|
+
},
|
|
116
280
|
],
|
|
117
281
|
});
|
|
118
282
|
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
2
|
+
declare const drawerVariants: (props?: ({
|
|
3
|
+
size?: "md" | "sm" | null | undefined;
|
|
4
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
5
|
+
export interface BaseDrawerProps extends VariantProps<typeof drawerVariants> {
|
|
6
|
+
open: boolean;
|
|
7
|
+
onClose: () => void;
|
|
8
|
+
modal?: boolean;
|
|
9
|
+
header?: React.ReactNode;
|
|
10
|
+
children: React.ReactNode;
|
|
11
|
+
footer?: React.ReactNode;
|
|
12
|
+
className?: string;
|
|
13
|
+
'data-testid'?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function BaseDrawer({ open, onClose, modal, size, header, children, footer, className, 'data-testid': testId, }: BaseDrawerProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=base-drawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/base-drawer/base-drawer.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAUlE,QAAA,MAAM,cAAc;;8EAUlB,CAAC;AAEH,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,OAAO,cAAc,CAAC;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,OAAO,EACP,KAAa,EACb,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,aAAa,EAAE,MAAM,GACtB,EAAE,eAAe,2CA2CjB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { XIcon } from 'lucide-react';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
import { cn } from '../../../lib/utils.js';
|
|
6
|
+
import { Drawer, DrawerContent, DrawerHeader, DrawerFooter, DrawerOverlay, } from '../../ui/drawer.js';
|
|
7
|
+
const drawerVariants = cva('', {
|
|
8
|
+
variants: {
|
|
9
|
+
size: {
|
|
10
|
+
sm: 'w-96',
|
|
11
|
+
md: 'w-xl',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
defaultVariants: {
|
|
15
|
+
size: 'sm',
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
export function BaseDrawer({ open, onClose, modal = false, size, header, children, footer, className, 'data-testid': testId, }) {
|
|
19
|
+
return (_jsxs(Drawer, { direction: "right", modal: modal, handleOnly: true, open: open, onOpenChange: (isOpen) => {
|
|
20
|
+
if (!isOpen)
|
|
21
|
+
onClose();
|
|
22
|
+
}, children: [modal ? _jsx(DrawerOverlay, {}) : null, _jsxs(DrawerContent, { direction: "right", showCloseButton: false, className: cn(drawerVariants({ size }), className), "data-testid": testId, children: [_jsxs("button", { type: "button", "aria-label": "Close", onClick: onClose, className: "ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden", "data-testid": testId ? `${testId}-close-button` : undefined, children: [_jsx(XIcon, { className: "size-4" }), _jsx("span", { className: "sr-only", children: "Close" })] }), header ? _jsx(DrawerHeader, { children: header }) : null, _jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx("div", { className: "flex flex-col", children: children }) }), footer ? _jsx(DrawerFooter, { children: footer }) : null] })] }));
|
|
23
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { BaseDrawer } from './base-drawer.js';
|
|
3
|
+
declare const meta: Meta<typeof BaseDrawer>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof BaseDrawer>;
|
|
6
|
+
/** Default drawer with sm size, non-modal, children only. */
|
|
7
|
+
export declare const Default: Story;
|
|
8
|
+
/** Explicit sm size with inspector-style content. */
|
|
9
|
+
export declare const SmallSize: Story;
|
|
10
|
+
/** Medium size with content-rich review-style content. */
|
|
11
|
+
export declare const MediumSize: Story;
|
|
12
|
+
/** Modal drawer with overlay. */
|
|
13
|
+
export declare const Modal: Story;
|
|
14
|
+
/** Drawer with header slot containing DrawerTitle and DrawerDescription. */
|
|
15
|
+
export declare const WithHeader: Story;
|
|
16
|
+
/** Drawer with footer slot containing action buttons. */
|
|
17
|
+
export declare const WithFooter: Story;
|
|
18
|
+
/** Drawer with both header and footer slots populated. */
|
|
19
|
+
export declare const WithHeaderAndFooter: Story;
|
|
20
|
+
/** Drawer with content that exceeds viewport to demonstrate scroll behavior. */
|
|
21
|
+
export declare const ScrollableContent: Story;
|
|
22
|
+
//# sourceMappingURL=base-drawer.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/base-drawer/base-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAI3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAOjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,UAAU,CAAC,CAAC;AAuBzC,6DAA6D;AAC7D,eAAO,MAAM,OAAO,EAAE,KAQrB,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,SAAS,EAAE,KAkBvB,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,UAAU,EAAE,KAiBxB,CAAC;AAEF,iCAAiC;AACjC,eAAO,MAAM,KAAK,EAAE,KAUnB,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,UAAU,EAAE,KAexB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAiBxB,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,EAAE,KAsCjC,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,EAAE,KAsB/B,CAAC"}
|