@shepai/cli 1.130.1 → 1.131.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/apis/json-schema/WorkflowConfig.yaml +5 -0
- package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.js +2 -2
- package/dist/packages/core/src/application/use-cases/agents/reject-agent-run.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/agents/reject-agent-run.use-case.js +2 -2
- package/dist/packages/core/src/domain/generated/output.d.ts +4 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +5 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +17 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.d.ts +52 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.js +121 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts +6 -2
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js +139 -75
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js +19 -65
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.js +34 -3
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +31 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +48 -2
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.js +13 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts +12 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.js +50 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.js +13 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.js +13 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.js +13 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.js +24 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.js +4 -0
- package/dist/src/presentation/cli/ui/output.js +2 -2
- package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-feature-node-data.js +2 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +2 -1
- package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/open-action-menu/config.d.ts +3 -1
- package/dist/src/presentation/web/components/common/open-action-menu/config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.d.ts +1 -1
- package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.js +2 -2
- package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.js +9 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +2 -2
- package/web/.next/required-server-files.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +24 -24
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +24 -24
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +30 -30
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +30 -30
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +22 -22
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +24 -24
- package/web/.next/server/app/(dashboard)/create/page.js +2 -2
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +30 -30
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +30 -30
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +22 -22
- package/web/.next/server/app/(dashboard)/page.js +2 -2
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +22 -22
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +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 +3 -3
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/graph-data/route.js +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/settings/page.js +1 -1
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/skills/page.js +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 +8 -8
- package/web/.next/server/app/tools/page.js +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 +3 -3
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/{[root-of-the-server]__d1dc8fcd._.js → [root-of-the-server]__c6e32a23._.js} +2 -2
- package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2c791c42._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2c791c42._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__84f72684._.js → [root-of-the-server]__3ef34e4c._.js} +3 -3
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__84f72684._.js.map → [root-of-the-server]__3ef34e4c._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__755cfe02._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__755cfe02._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__96670392._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__96670392._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__57018345._.js → [root-of-the-server]__9c45d070._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9c45d070._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a628fb91._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a628fb91._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bfba58e6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bfba58e6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c3ab8422._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c3ab8422._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
- package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_60d96b77._.js → _1ff3035b._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_60d96b77._.js.map → _1ff3035b._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_4a4b4e1a._.js +3 -0
- package/web/.next/server/chunks/ssr/{_e44c1df8._.js.map → _4a4b4e1a._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
- package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
- package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
- package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{src_presentation_web_1b00ce26._.js → src_presentation_web_1769b67a._.js} +2 -2
- package/web/.next/server/chunks/ssr/{src_presentation_web_1b00ce26._.js.map → src_presentation_web_1769b67a._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- 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 +38 -38
- package/web/.next/static/chunks/{6a528a033ae55794.js → 1e7aa4fc00db4d85.js} +2 -2
- package/web/.next/static/chunks/{ceefd537b2a82fb5.js → 24ab1a6841758200.js} +1 -1
- package/web/.next/static/chunks/{1553f15c07eb7745.js → 431ebee69d487093.js} +1 -1
- package/web/.next/static/chunks/46488328b6d76dcf.js +1 -0
- package/web/.next/static/chunks/554010ffa090b3cb.js +1 -0
- package/web/.next/static/chunks/{c5019bfe2884e088.js → 5541ee6e8c3dfbc0.js} +1 -1
- package/web/.next/static/chunks/5f401fd30f6e8a29.js +1 -0
- package/web/.next/static/chunks/665bc0be216c6374.js +1 -0
- package/web/.next/static/chunks/81e8a59652c53338.js +1 -0
- package/web/.next/static/chunks/a90d02d0338ca269.js +2 -0
- package/web/.next/static/chunks/{499fe813285eb6b6.js → bd5910aa46e4f7f8.js} +1 -1
- package/web/.next/static/chunks/{7e5b7a8ca6303e76.js → ecfe17fa09ff543e.js} +1 -1
- package/web/next.config.mjs +1 -1
- package/web/package.json +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__d1dc8fcd._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5142820f._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5142820f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__57018345._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__99ab2519._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__99ab2519._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_e44c1df8._.js +0 -3
- package/web/.next/static/chunks/010e770e43094b0c.js +0 -1
- package/web/.next/static/chunks/2fc5168fdc6be797.js +0 -1
- package/web/.next/static/chunks/8057ebdc852674de.js +0 -2
- package/web/.next/static/chunks/ad8d9368ff2f152d.js +0 -1
- package/web/.next/static/chunks/c1bc8dbfa5d7fc35.js +0 -1
- package/web/.next/static/chunks/f3e3c98b0dbdb7c5.js +0 -1
- /package/web/.next/static/{JhvdO6haSso0T4F28qUg0 → fBDTRerkah3YOaOkhqEUT}/_buildManifest.js +0 -0
- /package/web/.next/static/{JhvdO6haSso0T4F28qUg0 → fBDTRerkah3YOaOkhqEUT}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{JhvdO6haSso0T4F28qUg0 → fBDTRerkah3YOaOkhqEUT}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidence.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"evidence.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAEpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAoDrD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,IAG3C,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAmJ7E"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js
CHANGED
|
@@ -13,17 +13,51 @@
|
|
|
13
13
|
* other nodes (createNodeLogger, buildExecutorOptions, retryExecute,
|
|
14
14
|
* getCompletedPhases, markPhaseComplete).
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* Includes a validation loop that inspects Evidence[] for quality and
|
|
17
|
+
* completeness after each collection attempt. If validation fails, the
|
|
18
|
+
* agent is retried with structured feedback about what's missing. After
|
|
19
|
+
* exhausting retries, the system proceeds with partial evidence (FR-8
|
|
20
|
+
* graceful degradation). Each attempt is recorded as a separate phase
|
|
21
|
+
* activity (evidence:attempt-N) for timing visibility.
|
|
18
22
|
*/
|
|
23
|
+
import yaml from 'js-yaml';
|
|
19
24
|
import { isGraphBubbleUp } from '@langchain/langgraph';
|
|
20
|
-
import { createNodeLogger, getCompletedPhases, markPhaseComplete, retryExecute, buildExecutorOptions, } from './node-helpers.js';
|
|
25
|
+
import { createNodeLogger, getCompletedPhases, markPhaseComplete, readSpecFile, retryExecute, buildExecutorOptions, } from './node-helpers.js';
|
|
21
26
|
import { reportNodeStart } from '../heartbeat.js';
|
|
22
27
|
import { recordPhaseStart, recordPhaseEnd } from '../phase-timing-context.js';
|
|
23
28
|
import { updateNodeLifecycle } from '../lifecycle-context.js';
|
|
24
|
-
import { buildEvidencePrompt } from './prompts/evidence-prompts.js';
|
|
25
|
-
import { parseEvidenceRecords, validateUiEvidenceHasAppProof } from './evidence-output-parser.js';
|
|
29
|
+
import { buildEvidencePrompt, buildEvidenceRetryPrompt } from './prompts/evidence-prompts.js';
|
|
30
|
+
import { parseEvidenceRecords, validateUiEvidenceHasAppProof, validateEvidence, } from './evidence-output-parser.js';
|
|
26
31
|
import { hasSettings, getSettings } from '../../../settings.service.js';
|
|
32
|
+
const DEFAULT_MAX_RETRIES = 3;
|
|
33
|
+
/**
|
|
34
|
+
* Parse tasks.yaml into TaskForValidation[] for evidence completeness checking.
|
|
35
|
+
* Returns empty array if tasks.yaml is missing or unparseable.
|
|
36
|
+
*/
|
|
37
|
+
function parseTasks(specDir) {
|
|
38
|
+
const content = readSpecFile(specDir, 'tasks.yaml');
|
|
39
|
+
if (!content)
|
|
40
|
+
return [];
|
|
41
|
+
try {
|
|
42
|
+
const data = yaml.load(content);
|
|
43
|
+
if (!data?.tasks || !Array.isArray(data.tasks))
|
|
44
|
+
return [];
|
|
45
|
+
return data.tasks
|
|
46
|
+
.filter((t) => t !== null && typeof t === 'object')
|
|
47
|
+
.map((t) => ({
|
|
48
|
+
id: String(t.id ?? ''),
|
|
49
|
+
title: String(t.title ?? ''),
|
|
50
|
+
description: String(t.description ?? ''),
|
|
51
|
+
acceptanceCriteria: Array.isArray(t.acceptanceCriteria)
|
|
52
|
+
? t.acceptanceCriteria.map(String)
|
|
53
|
+
: [],
|
|
54
|
+
tdd: t.tdd != null ? t.tdd : null,
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
27
61
|
/**
|
|
28
62
|
* Factory that creates the evidence collection node function.
|
|
29
63
|
*
|
|
@@ -47,79 +81,109 @@ export function createEvidenceNode(executor) {
|
|
|
47
81
|
_needsReexecution: false,
|
|
48
82
|
};
|
|
49
83
|
}
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
84
|
+
// --- Configuration ---
|
|
85
|
+
const settings = hasSettings() ? getSettings() : undefined;
|
|
86
|
+
const commitEvidence = settings?.workflow.commitEvidence ?? false;
|
|
87
|
+
const maxRetries = settings?.workflow.evidenceRetries ?? DEFAULT_MAX_RETRIES;
|
|
88
|
+
const options = buildExecutorOptions(state);
|
|
89
|
+
const tasks = parseTasks(state.specDir);
|
|
90
|
+
// --- Validation retry loop ---
|
|
91
|
+
let allEvidence = [];
|
|
92
|
+
const allMessages = [];
|
|
93
|
+
let attempt = 0;
|
|
94
|
+
let lastErrors = [];
|
|
95
|
+
while (attempt < maxRetries) {
|
|
96
|
+
attempt++;
|
|
97
|
+
const attemptStart = Date.now();
|
|
98
|
+
// Build prompt: base for first attempt, retry with feedback for subsequent
|
|
99
|
+
const prompt = attempt === 1
|
|
100
|
+
? buildEvidencePrompt(state, { commitEvidence })
|
|
101
|
+
: buildEvidenceRetryPrompt(state, lastErrors, { commitEvidence });
|
|
102
|
+
const timingId = await recordPhaseStart(`evidence:attempt-${attempt}`, {
|
|
103
|
+
prompt,
|
|
104
|
+
modelId: state.model,
|
|
105
|
+
agentType: executor.agentType,
|
|
106
|
+
});
|
|
68
107
|
try {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
evidence
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
log.error(`
|
|
83
|
-
|
|
108
|
+
log.info(`Attempt ${attempt}/${maxRetries}: executing agent at cwd=${options.cwd}`);
|
|
109
|
+
const result = await retryExecute(executor, prompt, options, { logger: log });
|
|
110
|
+
const durationMs = Date.now() - attemptStart;
|
|
111
|
+
const elapsed = (durationMs / 1000).toFixed(1);
|
|
112
|
+
log.info(`Attempt ${attempt}: agent complete (${result.result.length} chars, ${elapsed}s)`);
|
|
113
|
+
// --- Parse evidence records (graceful degradation) ---
|
|
114
|
+
let evidence;
|
|
115
|
+
try {
|
|
116
|
+
evidence = parseEvidenceRecords(result.result);
|
|
117
|
+
log.info(`Attempt ${attempt}: parsed ${evidence.length} evidence record(s)`);
|
|
118
|
+
}
|
|
119
|
+
catch (parseErr) {
|
|
120
|
+
const msg = parseErr instanceof Error ? parseErr.message : String(parseErr);
|
|
121
|
+
log.error(`Attempt ${attempt}: evidence parsing failed: ${msg} — continuing with empty evidence`);
|
|
122
|
+
evidence = [];
|
|
123
|
+
}
|
|
124
|
+
// Accumulate evidence from all attempts (FR-11)
|
|
125
|
+
allEvidence = [...allEvidence, ...evidence];
|
|
126
|
+
// --- Validate UI evidence (informational warnings) ---
|
|
127
|
+
const uiResult = validateUiEvidenceHasAppProof(evidence);
|
|
128
|
+
if (uiResult.warnings.length > 0) {
|
|
129
|
+
for (const warning of uiResult.warnings) {
|
|
130
|
+
log.error(`Evidence validation: ${warning}`);
|
|
131
|
+
allMessages.push(`[evidence] Warning: ${warning}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// --- Validate evidence completeness + file existence ---
|
|
135
|
+
const validationResult = await validateEvidence(allEvidence, tasks);
|
|
136
|
+
await recordPhaseEnd(timingId, Date.now() - attemptStart, {
|
|
137
|
+
inputTokens: result.usage?.inputTokens,
|
|
138
|
+
outputTokens: result.usage?.outputTokens,
|
|
139
|
+
cacheCreationInputTokens: result.usage?.cacheCreationInputTokens,
|
|
140
|
+
cacheReadInputTokens: result.usage?.cacheReadInputTokens,
|
|
141
|
+
costUsd: result.usage?.costUsd,
|
|
142
|
+
numTurns: result.usage?.numTurns,
|
|
143
|
+
durationApiMs: result.usage?.durationApiMs,
|
|
144
|
+
exitCode: validationResult.valid ? 'success' : 'error',
|
|
145
|
+
});
|
|
146
|
+
if (validationResult.valid) {
|
|
147
|
+
log.info(`Attempt ${attempt}: validation passed`);
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
// Validation failed
|
|
151
|
+
lastErrors = validationResult.errors;
|
|
152
|
+
const errorSummary = validationResult.errors.map((e) => e.message).join('; ');
|
|
153
|
+
if (attempt < maxRetries) {
|
|
154
|
+
log.error(`Attempt ${attempt}: validation failed (${validationResult.errors.length} errors), retrying — ${errorSummary}`);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// Exhausted retries — graceful degradation (FR-8)
|
|
158
|
+
log.error(`Attempt ${attempt}: validation failed after ${maxRetries} attempts — proceeding with partial evidence`);
|
|
159
|
+
allMessages.push(`[evidence] Warning: Validation failed after ${maxRetries} retries: ${errorSummary}`);
|
|
84
160
|
}
|
|
85
161
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
messages: [
|
|
101
|
-
`[evidence] Complete — ${evidence.length} evidence record(s) captured (${elapsed}s)`,
|
|
102
|
-
...(evidence.length === 0
|
|
103
|
-
? ['[evidence] Warning: no evidence records parsed from agent output']
|
|
104
|
-
: []),
|
|
105
|
-
...validationMessages,
|
|
106
|
-
],
|
|
107
|
-
_needsReexecution: false,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
catch (err) {
|
|
111
|
-
// Re-throw LangGraph control-flow exceptions (interrupt, Command, etc.)
|
|
112
|
-
if (isGraphBubbleUp(err))
|
|
113
|
-
throw err;
|
|
114
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
115
|
-
const durationMs = Date.now() - startTime;
|
|
116
|
-
const elapsed = (durationMs / 1000).toFixed(1);
|
|
117
|
-
log.error(`Evidence collection failed: ${message} (${elapsed}s)`);
|
|
118
|
-
await recordPhaseEnd(timingId, durationMs, {
|
|
119
|
-
exitCode: 'error',
|
|
120
|
-
errorMessage: message.slice(0, 1000),
|
|
121
|
-
});
|
|
122
|
-
throw new Error(`[evidence] ${message}`);
|
|
162
|
+
catch (err) {
|
|
163
|
+
const durationMs = Date.now() - attemptStart;
|
|
164
|
+
await recordPhaseEnd(timingId, durationMs, {
|
|
165
|
+
exitCode: 'error',
|
|
166
|
+
errorMessage: (err instanceof Error ? err.message : String(err)).slice(0, 1000),
|
|
167
|
+
});
|
|
168
|
+
// Re-throw LangGraph control-flow exceptions
|
|
169
|
+
if (isGraphBubbleUp(err))
|
|
170
|
+
throw err;
|
|
171
|
+
// Non-retryable executor error — propagate immediately
|
|
172
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
173
|
+
log.error(`Attempt ${attempt}: evidence collection failed: ${message}`);
|
|
174
|
+
throw new Error(`[evidence] ${message}`);
|
|
175
|
+
}
|
|
123
176
|
}
|
|
177
|
+
markPhaseComplete(state.specDir, 'evidence', log);
|
|
178
|
+
allMessages.unshift(`[evidence] Complete — ${allEvidence.length} evidence record(s) captured in ${attempt} attempt(s)`, ...(allEvidence.length === 0
|
|
179
|
+
? ['[evidence] Warning: no evidence records parsed from agent output']
|
|
180
|
+
: []));
|
|
181
|
+
return {
|
|
182
|
+
currentNode: 'evidence',
|
|
183
|
+
evidence: allEvidence,
|
|
184
|
+
evidenceRetries: attempt,
|
|
185
|
+
messages: allMessages,
|
|
186
|
+
_needsReexecution: false,
|
|
187
|
+
};
|
|
124
188
|
};
|
|
125
189
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"implement.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;
|
|
1
|
+
{"version":3,"file":"implement.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAqErD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,IAG5C,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAiQ7E"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js
CHANGED
|
@@ -7,16 +7,15 @@
|
|
|
7
7
|
* feature.yaml between phases.
|
|
8
8
|
*/
|
|
9
9
|
import yaml from 'js-yaml';
|
|
10
|
-
import { writeFileSync
|
|
11
|
-
import { join
|
|
10
|
+
import { writeFileSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
12
|
import { interrupt, isGraphBubbleUp } from '@langchain/langgraph';
|
|
13
|
-
import { createNodeLogger, readSpecFile, buildExecutorOptions, shouldInterrupt, safeYamlLoad, retryExecute, getCompletedPhases, markPhaseComplete, } from './node-helpers.js';
|
|
13
|
+
import { createNodeLogger, readSpecFile, buildExecutorOptions, shouldInterrupt, safeYamlLoad, safeYamlDump, retryExecute, getCompletedPhases, markPhaseComplete, } from './node-helpers.js';
|
|
14
14
|
import { reportNodeStart } from '../heartbeat.js';
|
|
15
15
|
import { recordPhaseStart, recordPhaseEnd, recordApprovalWaitStart, updatePhasePrompt, } from '../phase-timing-context.js';
|
|
16
16
|
import { updateNodeLifecycle } from '../lifecycle-context.js';
|
|
17
17
|
import { buildImplementPhasePrompt, } from './prompts/implement.prompt.js';
|
|
18
|
-
import {
|
|
19
|
-
import { parseEvidenceRecords } from './evidence-output-parser.js';
|
|
18
|
+
import { createEvidenceNode } from './evidence.node.js';
|
|
20
19
|
import { hasSettings, getSettings } from '../../../settings.service.js';
|
|
21
20
|
/**
|
|
22
21
|
* Update feature.yaml with current implementation progress.
|
|
@@ -43,7 +42,7 @@ function updateFeatureProgress(specDir, completedCount, totalCount, currentPhase
|
|
|
43
42
|
lastUpdated: new Date().toISOString(),
|
|
44
43
|
lastUpdatedBy: 'feature-agent:implement',
|
|
45
44
|
};
|
|
46
|
-
writeFileSync(join(specDir, 'feature.yaml'),
|
|
45
|
+
writeFileSync(join(specDir, 'feature.yaml'), safeYamlDump(data), 'utf-8');
|
|
47
46
|
}
|
|
48
47
|
catch (err) {
|
|
49
48
|
log.error(`Failed to update feature.yaml: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -193,11 +192,16 @@ export function createImplementNode(executor) {
|
|
|
193
192
|
messages.push(`[implement] Complete: ${totalTasks} tasks across ${totalPhases} phases (${elapsed}s)`);
|
|
194
193
|
// --- Evidence sub-agent: capture proof of completion (settings-gated) ---
|
|
195
194
|
const evidenceEnabled = hasSettings() && getSettings().workflow.enableEvidence;
|
|
196
|
-
|
|
197
|
-
if (
|
|
195
|
+
let evidenceResult = {};
|
|
196
|
+
if (evidenceEnabled) {
|
|
197
|
+
const evidenceNode = createEvidenceNode(executor);
|
|
198
|
+
evidenceResult = await evidenceNode(state);
|
|
199
|
+
messages.push(`[implement] Evidence: ${(evidenceResult.evidence ?? []).length} record(s) captured`);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
198
202
|
log.info('Evidence collection disabled via settings — skipping');
|
|
203
|
+
messages.push('[implement] Evidence: 0 record(s) captured');
|
|
199
204
|
}
|
|
200
|
-
messages.push(`[implement] Evidence: ${evidence.length} record(s) captured`);
|
|
201
205
|
// Record top-level implement phase completion
|
|
202
206
|
await recordPhaseEnd(implementTimingId, Date.now() - startTime, {
|
|
203
207
|
inputTokens: totalInputTokens || undefined,
|
|
@@ -215,7 +219,12 @@ export function createImplementNode(executor) {
|
|
|
215
219
|
message: `Implementation complete: ${totalTasks} tasks across ${totalPhases} phases. Approve to finish.`,
|
|
216
220
|
});
|
|
217
221
|
}
|
|
218
|
-
return {
|
|
222
|
+
return {
|
|
223
|
+
currentNode: 'implement',
|
|
224
|
+
evidence: evidenceResult.evidence ?? [],
|
|
225
|
+
evidenceRetries: evidenceResult.evidenceRetries ?? 0,
|
|
226
|
+
messages: [...messages, ...(evidenceResult.messages ?? [])],
|
|
227
|
+
};
|
|
219
228
|
}
|
|
220
229
|
catch (err) {
|
|
221
230
|
if (isGraphBubbleUp(err))
|
|
@@ -240,58 +249,3 @@ export function createImplementNode(executor) {
|
|
|
240
249
|
}
|
|
241
250
|
};
|
|
242
251
|
}
|
|
243
|
-
/**
|
|
244
|
-
* Sub-agent call to collect evidence after implementation completes.
|
|
245
|
-
* Graceful degradation: returns empty array on any failure so evidence
|
|
246
|
-
* collection never blocks the workflow.
|
|
247
|
-
*/
|
|
248
|
-
async function collectEvidence(executor, state, log) {
|
|
249
|
-
try {
|
|
250
|
-
log.info('Collecting evidence (sub-agent)');
|
|
251
|
-
const commitEvidence = hasSettings() && getSettings().workflow.commitEvidence;
|
|
252
|
-
const prompt = buildEvidencePrompt(state, { commitEvidence });
|
|
253
|
-
const options = buildExecutorOptions(state);
|
|
254
|
-
const result = await retryExecute(executor, prompt, options, { logger: log });
|
|
255
|
-
try {
|
|
256
|
-
const evidence = parseEvidenceRecords(result.result);
|
|
257
|
-
log.info(`Parsed ${evidence.length} evidence record(s)`);
|
|
258
|
-
saveEvidenceManifest(state, evidence, log);
|
|
259
|
-
return evidence;
|
|
260
|
-
}
|
|
261
|
-
catch (parseErr) {
|
|
262
|
-
const msg = parseErr instanceof Error ? parseErr.message : String(parseErr);
|
|
263
|
-
log.error(`Warning: evidence parsing failed: ${msg} — continuing with empty evidence`);
|
|
264
|
-
return [];
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
catch (err) {
|
|
268
|
-
// Re-throw LangGraph control-flow exceptions
|
|
269
|
-
if (isGraphBubbleUp(err))
|
|
270
|
-
throw err;
|
|
271
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
272
|
-
log.error(`Evidence collection failed: ${msg} — continuing without evidence`);
|
|
273
|
-
return [];
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Save evidence manifest to the shep home evidence folder so the
|
|
278
|
-
* merge review UI can read it without accessing graph state.
|
|
279
|
-
*/
|
|
280
|
-
function saveEvidenceManifest(state, evidence, log) {
|
|
281
|
-
if (evidence.length === 0)
|
|
282
|
-
return;
|
|
283
|
-
try {
|
|
284
|
-
const cwd = state.worktreePath || state.repositoryPath;
|
|
285
|
-
// Worktree path: ~/.shep/repos/<hash>/wt/<slug>
|
|
286
|
-
// Evidence dir: ~/.shep/repos/<hash>/evidence/<featureId>/
|
|
287
|
-
const repoHashDir = dirname(dirname(cwd));
|
|
288
|
-
const evidenceDir = join(repoHashDir, 'evidence', state.featureId);
|
|
289
|
-
mkdirSync(evidenceDir, { recursive: true });
|
|
290
|
-
writeFileSync(join(evidenceDir, 'manifest.json'), JSON.stringify(evidence, null, 2), 'utf-8');
|
|
291
|
-
log.info(`Saved evidence manifest to ${evidenceDir}/manifest.json`);
|
|
292
|
-
}
|
|
293
|
-
catch (err) {
|
|
294
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
295
|
-
log.error(`Failed to save evidence manifest: ${msg}`);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ci-watch-fix-loop.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iEAAiE,CAAC;AAKrG,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+DAA+D,CAAC;AAK3G,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,aAAa,CAAC;IAC5B,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,qBAAqB,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC/E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAEpG,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,WAAW,EAAE,gBAAgB,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"ci-watch-fix-loop.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iEAAiE,CAAC;AAKrG,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+DAA+D,CAAC;AAK3G,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,aAAa,CAAC;IAC5B,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,qBAAqB,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC/E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAEpG,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,WAAW,EAAE,gBAAgB,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAqL3B"}
|
|
@@ -106,9 +106,29 @@ export async function runCiWatchFixLoop(deps, params) {
|
|
|
106
106
|
const failureLogs = await gitPrService.getFailureLogs(cwd, runId, branch, logMaxChars);
|
|
107
107
|
const startedAt = new Date().toISOString();
|
|
108
108
|
log.info(`CI fix attempt ${ciFixAttempts + 1}/${maxAttempts} for run ${runId}`);
|
|
109
|
-
// Invoke fix executor
|
|
109
|
+
// Invoke fix executor — maxAttempts:1 prevents retryExecute's internal
|
|
110
|
+
// retry logic from consuming CI fix attempts behind the outer loop's back.
|
|
111
|
+
// Each CI fix is a unique attempt with distinct failure logs and prompt;
|
|
112
|
+
// the outer loop already handles iteration.
|
|
110
113
|
const fixPrompt = buildCiWatchFixPrompt(failureLogs, ciFixAttempts + 1, maxAttempts, branch);
|
|
111
|
-
|
|
114
|
+
try {
|
|
115
|
+
await retryExecute(executor, fixPrompt, options, { maxAttempts: 1, logger: log });
|
|
116
|
+
}
|
|
117
|
+
catch (execErr) {
|
|
118
|
+
// If the fix executor fails, count it as a failed attempt and continue
|
|
119
|
+
// the loop rather than killing the entire CI fix process.
|
|
120
|
+
const execMsg = execErr instanceof Error ? execErr.message : String(execErr);
|
|
121
|
+
log.info(`CI fix executor failed on attempt ${ciFixAttempts + 1}: ${execMsg}`);
|
|
122
|
+
ciFixAttempts++;
|
|
123
|
+
ciFixHistory.push({
|
|
124
|
+
attempt: ciFixAttempts,
|
|
125
|
+
startedAt,
|
|
126
|
+
failureSummary: `Executor error: ${execMsg.slice(0, 500)}`,
|
|
127
|
+
outcome: 'failed',
|
|
128
|
+
});
|
|
129
|
+
messages.push(`[merge] CI fix attempt ${ciFixAttempts}/${maxAttempts} — executor failed`);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
112
132
|
ciFixAttempts++;
|
|
113
133
|
// Get updated run URL (new run triggered by push in fix)
|
|
114
134
|
const updatedCiStatus = await gitPrService.getCiStatus(cwd, branch);
|
|
@@ -131,7 +151,18 @@ export async function runCiWatchFixLoop(deps, params) {
|
|
|
131
151
|
ciFixStatus = 'timeout';
|
|
132
152
|
break;
|
|
133
153
|
}
|
|
134
|
-
|
|
154
|
+
// For non-timeout watchCi errors (e.g. GIT_ERROR), treat as a failed
|
|
155
|
+
// attempt and continue the loop instead of killing it.
|
|
156
|
+
const watchMsg = err instanceof Error ? err.message : String(err);
|
|
157
|
+
log.info(`CI watch failed during fix attempt ${ciFixAttempts}: ${watchMsg}`);
|
|
158
|
+
ciFixHistory.push({
|
|
159
|
+
attempt: ciFixAttempts,
|
|
160
|
+
startedAt,
|
|
161
|
+
failureSummary: failureLogs.slice(0, 500),
|
|
162
|
+
outcome: 'failed',
|
|
163
|
+
});
|
|
164
|
+
messages.push(`[merge] CI fix attempt ${ciFixAttempts}/${maxAttempts} — watch failed`);
|
|
165
|
+
continue;
|
|
135
166
|
}
|
|
136
167
|
// Update runUrl to the run that was actually watched (avoids mismatch
|
|
137
168
|
// when multiple workflow runs exist for the same branch).
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts
CHANGED
|
@@ -43,6 +43,37 @@ export declare function buildExecutorOptions(state: FeatureAgentState, overrides
|
|
|
43
43
|
* in list items and retries.
|
|
44
44
|
*/
|
|
45
45
|
export declare function safeYamlLoad(content: string): unknown;
|
|
46
|
+
/**
|
|
47
|
+
* Serialize data to YAML with forced double-quoting for all string values.
|
|
48
|
+
*
|
|
49
|
+
* This helper ensures all YAML output uses consistent quoting to prevent
|
|
50
|
+
* parse failures from unescaped quotes, colons, hashes, and other special
|
|
51
|
+
* characters in AI-generated content.
|
|
52
|
+
*
|
|
53
|
+
* **When to use:**
|
|
54
|
+
* - Use `safeYamlDump` for all YAML serialization in feature-agent nodes,
|
|
55
|
+
* use cases, and CLI output to ensure consistency and reliability.
|
|
56
|
+
* - Do NOT use `yaml.dump` directly unless you have a specific need for
|
|
57
|
+
* unquoted strings (e.g., human-edited configuration files).
|
|
58
|
+
*
|
|
59
|
+
* **Options applied:**
|
|
60
|
+
* - `indent: 2` — 2-space indentation (codebase standard)
|
|
61
|
+
* - `lineWidth: -1` — Disable line wrapping to preserve formatting and reduce diff noise
|
|
62
|
+
* - `quotingType: '"'` — Use double quotes for all quoted strings
|
|
63
|
+
* - `forceQuotes: true` — Quote all string values, even those without special characters
|
|
64
|
+
*
|
|
65
|
+
* @param data - The data to serialize (objects, arrays, primitives)
|
|
66
|
+
* @returns YAML string with all strings double-quoted
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const yaml = safeYamlDump({ title: "it's working", description: "say \"hello\"" });
|
|
71
|
+
* // Output:
|
|
72
|
+
* // title: "it's working"
|
|
73
|
+
* // description: "say \"hello\""
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare function safeYamlDump(data: unknown): string;
|
|
46
77
|
/**
|
|
47
78
|
* Determine whether the current node should trigger an interrupt
|
|
48
79
|
* for human approval given the configured approval gates.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-helpers.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,+DAA+D,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAUrD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM;IAE7C,4DAA4D;gBAChD,IAAI;kBAGF,MAAM,GAAG,IAAI;mBAIZ,MAAM,GAAG,IAAI;EAK/B;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE7D;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMtE;AAoBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,iBAAiB,EACxB,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,EAC3D,QAAQ,CAAC,EAAE,MAAM,GAChB,qBAAqB,CAUvB;AAeD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQrD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAQ3F;AAMD,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,mBAAmB,GAAG,eAAe,GAAG,SAAS,CAAC;AAMhG;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,CAKjE;AAED,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,qBAAqB,EAC9B,SAAS,CAAC,EAAE,YAAY,GACvB,OAAO,CAAC,oBAAoB,CAAC,CA6B/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAW5D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"node-helpers.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js
CHANGED
|
@@ -119,6 +119,52 @@ export function safeYamlLoad(content) {
|
|
|
119
119
|
return yaml.load(sanitized);
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Serialization options for safeYamlDump.
|
|
124
|
+
* - indent: 2 spaces (consistent with codebase style)
|
|
125
|
+
* - lineWidth: -1 (disable line wrapping to preserve agent-written formatting)
|
|
126
|
+
* - quotingType: '"' (use double quotes for all quoted strings)
|
|
127
|
+
* - forceQuotes: true (quote all string values to prevent YAML parse errors from unescaped special characters)
|
|
128
|
+
*/
|
|
129
|
+
const SAFE_YAML_DUMP_OPTIONS = {
|
|
130
|
+
indent: 2,
|
|
131
|
+
lineWidth: -1,
|
|
132
|
+
quotingType: '"',
|
|
133
|
+
forceQuotes: true,
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Serialize data to YAML with forced double-quoting for all string values.
|
|
137
|
+
*
|
|
138
|
+
* This helper ensures all YAML output uses consistent quoting to prevent
|
|
139
|
+
* parse failures from unescaped quotes, colons, hashes, and other special
|
|
140
|
+
* characters in AI-generated content.
|
|
141
|
+
*
|
|
142
|
+
* **When to use:**
|
|
143
|
+
* - Use `safeYamlDump` for all YAML serialization in feature-agent nodes,
|
|
144
|
+
* use cases, and CLI output to ensure consistency and reliability.
|
|
145
|
+
* - Do NOT use `yaml.dump` directly unless you have a specific need for
|
|
146
|
+
* unquoted strings (e.g., human-edited configuration files).
|
|
147
|
+
*
|
|
148
|
+
* **Options applied:**
|
|
149
|
+
* - `indent: 2` — 2-space indentation (codebase standard)
|
|
150
|
+
* - `lineWidth: -1` — Disable line wrapping to preserve formatting and reduce diff noise
|
|
151
|
+
* - `quotingType: '"'` — Use double quotes for all quoted strings
|
|
152
|
+
* - `forceQuotes: true` — Quote all string values, even those without special characters
|
|
153
|
+
*
|
|
154
|
+
* @param data - The data to serialize (objects, arrays, primitives)
|
|
155
|
+
* @returns YAML string with all strings double-quoted
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* const yaml = safeYamlDump({ title: "it's working", description: "say \"hello\"" });
|
|
160
|
+
* // Output:
|
|
161
|
+
* // title: "it's working"
|
|
162
|
+
* // description: "say \"hello\""
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
export function safeYamlDump(data) {
|
|
166
|
+
return yaml.dump(data, SAFE_YAML_DUMP_OPTIONS);
|
|
167
|
+
}
|
|
122
168
|
/**
|
|
123
169
|
* Determine whether the current node should trigger an interrupt
|
|
124
170
|
* for human approval given the configured approval gates.
|
|
@@ -230,7 +276,7 @@ export function clearCompletedPhase(specDir, phaseId, log) {
|
|
|
230
276
|
? status.completedPhases.filter((p) => p !== phaseId)
|
|
231
277
|
: [];
|
|
232
278
|
data.status = { ...status, completedPhases };
|
|
233
|
-
writeFileSync(join(specDir, 'feature.yaml'),
|
|
279
|
+
writeFileSync(join(specDir, 'feature.yaml'), safeYamlDump(data), 'utf-8');
|
|
234
280
|
}
|
|
235
281
|
catch (err) {
|
|
236
282
|
log?.error(`Failed to clear completed phase: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -264,7 +310,7 @@ export function markPhaseComplete(specDir, phaseId, log) {
|
|
|
264
310
|
completedPhases.push(phaseId);
|
|
265
311
|
}
|
|
266
312
|
data.status = { ...status, completedPhases };
|
|
267
|
-
writeFileSync(join(specDir, 'feature.yaml'),
|
|
313
|
+
writeFileSync(join(specDir, 'feature.yaml'), safeYamlDump(data), 'utf-8');
|
|
268
314
|
}
|
|
269
315
|
catch (err) {
|
|
270
316
|
log?.error(`Failed to mark phase complete: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"analyze.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CA2GnE"}
|
|
@@ -84,6 +84,19 @@ You MUST write the COMPLETE file (not a partial update). Preserve the existing n
|
|
|
84
84
|
|
|
85
85
|
**(S/M/L/XL)** — (justify your estimate with specific reasoning)
|
|
86
86
|
|
|
87
|
+
## YAML Output Rules
|
|
88
|
+
|
|
89
|
+
**CRITICAL:** When writing YAML files, you MUST follow these rules to ensure valid YAML:
|
|
90
|
+
|
|
91
|
+
1. **Wrap all string values in double quotes** — this prevents YAML parsing errors from special characters
|
|
92
|
+
2. **Escape internal double quotes with backslash** — use \\" inside quoted strings
|
|
93
|
+
3. **Use block scalars (\`|\`) for multi-line text** — this avoids escaping complexity
|
|
94
|
+
|
|
95
|
+
**Example (incorrect → correct):**
|
|
96
|
+
- ❌ \`text: it's broken\` → ✅ \`text: "it's broken"\` or \`text: |\\n it's broken\`
|
|
97
|
+
- ❌ \`message: say "hello"\` → ✅ \`message: "say \\"hello\\""\`
|
|
98
|
+
- ❌ \`description: line1\\nline2\` → ✅ \`description: |\\n line1\\n line2\`
|
|
99
|
+
|
|
87
100
|
## Constraints
|
|
88
101
|
|
|
89
102
|
- Write ONLY to ${state.specDir}/spec.yaml
|
|
@@ -11,9 +11,21 @@
|
|
|
11
11
|
* graph state.
|
|
12
12
|
*/
|
|
13
13
|
import type { FeatureAgentState } from '../../state.js';
|
|
14
|
+
import type { ValidationError } from '../evidence-output-parser.js';
|
|
14
15
|
export interface EvidencePromptOptions {
|
|
15
16
|
/** Whether to commit evidence to the worktree / feature branch */
|
|
16
17
|
commitEvidence: boolean;
|
|
17
18
|
}
|
|
18
19
|
export declare function buildEvidencePrompt(state: FeatureAgentState, options?: EvidencePromptOptions): string;
|
|
20
|
+
/**
|
|
21
|
+
* Build a retry prompt for evidence collection that augments the base evidence
|
|
22
|
+
* prompt with structured validation feedback listing specific failures.
|
|
23
|
+
*
|
|
24
|
+
* Follows the repair.node.ts pattern of passing validation errors into the
|
|
25
|
+
* retry prompt so the agent can focus on fixing specific gaps rather than
|
|
26
|
+
* recollecting all evidence blindly.
|
|
27
|
+
*
|
|
28
|
+
* When errors is empty, returns the base prompt without a feedback section.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildEvidenceRetryPrompt(state: FeatureAgentState, errors: ValidationError[], options?: EvidencePromptOptions): string;
|
|
19
31
|
//# sourceMappingURL=evidence-prompts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidence-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"evidence-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,qBAAiD,GACzD,MAAM,CA0MR;AAgCD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,GAAE,qBAAiD,GACzD,MAAM,CAqBR"}
|