@shepai/cli 1.116.3 → 1.117.0-pr376.0b9d7e1
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/AnalyzeRepoTimeouts.yaml +10 -0
- package/apis/json-schema/EnvironmentConfig.yaml +5 -0
- package/apis/json-schema/SdlcLifecycle.yaml +1 -0
- package/apis/json-schema/StageTimeouts.yaml +35 -0
- package/apis/json-schema/TerminalType.yaml +10 -0
- package/apis/json-schema/WorkflowConfig.yaml +6 -0
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +17 -8
- package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +2 -0
- package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.d.ts +25 -0
- package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.js +116 -0
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +7 -1
- package/dist/packages/core/src/domain/generated/output.d.ts +58 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/domain/generated/output.js +9 -0
- package/dist/packages/core/src/domain/lifecycle-gates.d.ts +3 -0
- package/dist/packages/core/src/domain/lifecycle-gates.d.ts.map +1 -1
- package/dist/packages/core/src/domain/lifecycle-gates.js +3 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +5 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +8 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +46 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/035-add-stage-timeout-ms.d.ts +22 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/035-add-stage-timeout-ms.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/035-add-stage-timeout-ms.js +53 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.d.ts +11 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.js +13 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +15 -6
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +18 -2
- package/dist/packages/core/src/infrastructure/services/agents/analyze-repo/analyze-repository-graph.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/analyze-repo/analyze-repository-graph.js +15 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +11 -1
- 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 +42 -3
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +5 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.js +7 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/system-terminal.json +24 -0
- package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/index.js +2 -0
- package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/ls.command.js +3 -0
- package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/new.command.js +9 -1
- package/dist/src/presentation/cli/commands/feat/start.command.d.ts +12 -0
- package/dist/src/presentation/cli/commands/feat/start.command.d.ts.map +1 -0
- package/dist/src/presentation/cli/commands/feat/start.command.js +43 -0
- package/dist/src/presentation/web/app/actions/create-feature.d.ts +2 -0
- package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/create-feature.js +3 -1
- package/dist/src/presentation/web/app/actions/get-available-terminals.d.ts +12 -0
- package/dist/src/presentation/web/app/actions/get-available-terminals.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-available-terminals.js +53 -0
- package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/open-shell.js +47 -3
- package/dist/src/presentation/web/app/actions/start-feature.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/start-feature.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/start-feature.js +16 -0
- package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
- package/dist/src/presentation/web/app/api/agent-events/route.js +1 -0
- package/dist/src/presentation/web/app/settings/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/settings/page.js +6 -2
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +1 -1
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.js +1 -1
- 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 +20 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +2 -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 +6 -2
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +6 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +3 -2
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +13 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.js +12 -3
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +36 -2
- 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 +3 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -0
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +23 -0
- package/dist/src/presentation/web/components/features/settings/environment-settings-section.d.ts +3 -1
- package/dist/src/presentation/web/components/features/settings/environment-settings-section.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/environment-settings-section.js +32 -5
- package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.js +34 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts +3 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.js +120 -15
- package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +23 -0
- package/dist/src/presentation/web/components/features/settings/timeout-slider.d.ts +11 -0
- package/dist/src/presentation/web/components/features/settings/timeout-slider.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/settings/timeout-slider.js +63 -0
- package/dist/src/presentation/web/components/features/settings/timeout-slider.stories.d.ts +10 -0
- package/dist/src/presentation/web/components/features/settings/timeout-slider.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/settings/timeout-slider.stories.js +24 -0
- package/dist/src/presentation/web/components/features/settings/workflow-settings-section.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/workflow-settings-section.js +97 -2
- package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.js +22 -0
- package/dist/src/presentation/web/components/ui/slider.d.ts +5 -0
- package/dist/src/presentation/web/components/ui/slider.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/slider.js +10 -0
- package/dist/src/presentation/web/components/ui/slider.stories.d.ts +7 -0
- package/dist/src/presentation/web/components/ui/slider.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/slider.stories.js +15 -0
- package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/sidebar-features-context.js +1 -0
- package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-graph-state.js +1 -0
- package/dist/src/presentation/web/lib/derive-graph.d.ts +2 -0
- package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/derive-graph.js +5 -0
- 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/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +55 -40
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
- 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 +67 -52
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
- 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 +67 -52
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
- 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 +51 -36
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
- 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 +55 -40
- package/web/.next/server/app/(dashboard)/create/page.js +3 -3
- 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 +67 -52
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
- 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 +67 -52
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
- 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 +51 -36
- package/web/.next/server/app/(dashboard)/page.js +3 -3
- 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 +51 -36
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
- 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/page.js +1 -1
- package/web/.next/server/app/_global-error/page.js.nft.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 +2 -2
- 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/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +25 -10
- package/web/.next/server/app/settings/page.js +3 -3
- 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 +6 -6
- package/web/.next/server/app/skills/page.js +2 -2
- 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 +6 -6
- package/web/.next/server/app/tools/page.js +2 -2
- 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 +2 -2
- 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/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.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_ed372306.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js → [root-of-the-server]__2dddfea9._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js.map → [root-of-the-server]__2dddfea9._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2ff2daf6._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2ff2daf6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__039967e3._.js → [root-of-the-server]__3155add4._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__039967e3._.js.map → [root-of-the-server]__3155add4._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js → [root-of-the-server]__4c7486cb._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js.map → [root-of-the-server]__4c7486cb._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +4 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__11033878._.js.map → [root-of-the-server]__6b17a22d._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7b707feb._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7b707feb._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +4 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__fdc75809._.js.map → [root-of-the-server]__804c006d._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__89e8a5cc._.js → [root-of-the-server]__8763fd7a._.js} +3 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8763fd7a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__e70c5627._.js → [root-of-the-server]__9c56d724._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__cbd8062c._.js.map → [root-of-the-server]__9c56d724._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__2773312c._.js → [root-of-the-server]__cfc116d5._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__2773312c._.js.map → [root-of-the-server]__cfc116d5._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__cbd8062c._.js → [root-of-the-server]__d3841d9e._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__e70c5627._.js.map → [root-of-the-server]__d3841d9e._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__db9afe04._.js +3 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__b1e68e34._.js.map → [root-of-the-server]__db9afe04._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1bb131c4._.js +1 -1
- package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_250a63ae._.js +1 -1
- package/web/.next/server/chunks/ssr/_250a63ae._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_2eea2048._.js +3 -0
- package/web/.next/server/chunks/ssr/{_c5f84841._.js.map → _2eea2048._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_8dacd1e7._.js → _2f6f48b8._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_8dacd1e7._.js.map → _2f6f48b8._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_6f0118a0._.js → _3d260002._.js} +2 -2
- package/web/.next/server/chunks/ssr/_3d260002._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f5a1a9b8._.js +3 -0
- package/web/.next/server/chunks/ssr/_f5a1a9b8._.js.map +1 -0
- 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_0835b28e._.js +5 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +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/chunks/ssr/src_presentation_web_e8034a29._.js +5 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.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 +320 -234
- package/web/.next/static/chunks/{18de73b2f14204d3.js → 09528d327a2bb15a.js} +1 -1
- package/web/.next/static/chunks/{e12f41ac3d49a7b5.js → 261a4f0c60d9e4ba.js} +1 -1
- package/web/.next/static/chunks/304a3dced97f4f68.js +2 -0
- package/web/.next/static/chunks/62a8173911f8f130.css +1 -0
- package/web/.next/static/chunks/{52285fdb39925ad5.js → 6a2f770718cd585d.js} +1 -1
- package/web/.next/static/chunks/{5de387864b89e64c.js → 8748274a8d9400da.js} +2 -2
- package/web/.next/static/chunks/a6d2916a7b4b2633.js +1 -0
- package/web/.next/static/chunks/bba38aefe51cfdfc.js +1 -0
- package/web/.next/static/chunks/bf6bd3385f65bed8.js +1 -0
- package/web/.next/static/chunks/{2babc8e3ae9ba6e8.js → c039476485c8b4e8.js} +1 -1
- package/web/.next/static/chunks/d363520c26e1cd08.js +1 -0
- package/web/.next/static/chunks/{fcde0cbb2976b933.js → e2ef95d904c360f3.js} +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +0 -4
- package/web/.next/server/chunks/ssr/_6f0118a0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_c5f84841._.js +0 -3
- package/web/.next/server/chunks/ssr/_d2e408a9._.js +0 -3
- package/web/.next/server/chunks/ssr/_d2e408a9._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js.map +0 -1
- package/web/.next/static/chunks/0b3ab176958a8286.js +0 -1
- package/web/.next/static/chunks/242446982e8d196e.js +0 -1
- package/web/.next/static/chunks/552e0f129144b54d.js +0 -1
- package/web/.next/static/chunks/57b45edf86522369.css +0 -1
- package/web/.next/static/chunks/7b924c47dd2a5a53.js +0 -2
- package/web/.next/static/chunks/c172f4a6010cb5b5.js +0 -1
- /package/web/.next/static/{CStnC7-QgiTd6U99YUc1N → nIxRprL30XWZ36yCODJqc}/_buildManifest.js +0 -0
- /package/web/.next/static/{CStnC7-QgiTd6U99YUc1N → nIxRprL30XWZ36yCODJqc}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{CStnC7-QgiTd6U99YUc1N → nIxRprL30XWZ36yCODJqc}/_ssgManifest.js +0 -0
package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts
CHANGED
|
@@ -29,6 +29,7 @@ export interface SettingsRow {
|
|
|
29
29
|
user_github_username: string | null;
|
|
30
30
|
env_default_editor: string;
|
|
31
31
|
env_shell_preference: string;
|
|
32
|
+
env_terminal_preference: string;
|
|
32
33
|
sys_auto_update: number;
|
|
33
34
|
sys_log_level: string;
|
|
34
35
|
agent_type: string;
|
|
@@ -52,6 +53,13 @@ export interface SettingsRow {
|
|
|
52
53
|
ci_max_fix_attempts: number | null;
|
|
53
54
|
ci_watch_timeout_ms: number | null;
|
|
54
55
|
ci_log_max_chars: number | null;
|
|
56
|
+
stage_timeout_analyze_ms: number | null;
|
|
57
|
+
stage_timeout_requirements_ms: number | null;
|
|
58
|
+
stage_timeout_research_ms: number | null;
|
|
59
|
+
stage_timeout_plan_ms: number | null;
|
|
60
|
+
stage_timeout_implement_ms: number | null;
|
|
61
|
+
stage_timeout_merge_ms: number | null;
|
|
62
|
+
analyze_repo_timeout_analyze_ms: number | null;
|
|
55
63
|
onboarding_complete: number;
|
|
56
64
|
approval_gate_allow_prd: number;
|
|
57
65
|
approval_gate_allow_plan: number;
|
package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.mapper.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.mapper.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAQvE;;;GAGG;AACH,MAAM,WAAW,WAAW;IAE1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IAInB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IAGtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IAGpC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uBAAuB,EAAE,MAAM,CAAC;IAGhC,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IAGtB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAG3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uBAAuB,EAAE,MAAM,CAAC;IAChC,yBAAyB,EAAE,MAAM,CAAC;IAClC,0BAA0B,EAAE,MAAM,CAAC;IACnC,yBAAyB,EAAE,MAAM,CAAC;IAClC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0BAA0B,EAAE,MAAM,CAAC;IACnC,0BAA0B,EAAE,MAAM,CAAC;IACnC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,4BAA4B,EAAE,MAAM,CAAC;IAGrC,iCAAiC,EAAE,MAAM,CAAC;IAG1C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAGhC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,6BAA6B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,0BAA0B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IAGtC,+BAA+B,EAAE,MAAM,GAAG,IAAI,CAAC;IAG/C,mBAAmB,EAAE,MAAM,CAAC;IAG5B,uBAAuB,EAAE,MAAM,CAAC;IAChC,wBAAwB,EAAE,MAAM,CAAC;IACjC,yBAAyB,EAAE,MAAM,CAAC;IAClC,mCAAmC,EAAE,MAAM,CAAC;IAG5C,wBAAwB,EAAE,MAAM,CAAC;IACjC,wBAAwB,EAAE,MAAM,CAAC;IAGjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,WAAW,CA2F1D;AAsCD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,QAAQ,CAuFvD"}
|
|
@@ -36,6 +36,7 @@ export function toDatabase(settings) {
|
|
|
36
36
|
// EnvironmentConfig
|
|
37
37
|
env_default_editor: settings.environment.defaultEditor,
|
|
38
38
|
env_shell_preference: settings.environment.shellPreference,
|
|
39
|
+
env_terminal_preference: settings.environment.terminalPreference,
|
|
39
40
|
// SystemConfig
|
|
40
41
|
sys_auto_update: settings.system.autoUpdate ? 1 : 0,
|
|
41
42
|
sys_log_level: settings.system.logLevel,
|
|
@@ -64,6 +65,15 @@ export function toDatabase(settings) {
|
|
|
64
65
|
ci_max_fix_attempts: settings.workflow.ciMaxFixAttempts ?? null,
|
|
65
66
|
ci_watch_timeout_ms: settings.workflow.ciWatchTimeoutMs ?? null,
|
|
66
67
|
ci_log_max_chars: settings.workflow.ciLogMaxChars ?? null,
|
|
68
|
+
// WorkflowConfig per-stage timeouts (optional number → INTEGER | null)
|
|
69
|
+
stage_timeout_analyze_ms: settings.workflow.stageTimeouts?.analyzeMs ?? null,
|
|
70
|
+
stage_timeout_requirements_ms: settings.workflow.stageTimeouts?.requirementsMs ?? null,
|
|
71
|
+
stage_timeout_research_ms: settings.workflow.stageTimeouts?.researchMs ?? null,
|
|
72
|
+
stage_timeout_plan_ms: settings.workflow.stageTimeouts?.planMs ?? null,
|
|
73
|
+
stage_timeout_implement_ms: settings.workflow.stageTimeouts?.implementMs ?? null,
|
|
74
|
+
stage_timeout_merge_ms: settings.workflow.stageTimeouts?.mergeMs ?? null,
|
|
75
|
+
// WorkflowConfig analyze-repo timeouts (optional number → INTEGER | null)
|
|
76
|
+
analyze_repo_timeout_analyze_ms: settings.workflow.analyzeRepoTimeouts?.analyzeMs ?? null,
|
|
67
77
|
// WorkflowConfig evidence settings (boolean → INTEGER)
|
|
68
78
|
workflow_enable_evidence: settings.workflow.enableEvidence ? 1 : 0,
|
|
69
79
|
workflow_commit_evidence: settings.workflow.commitEvidence ? 1 : 0,
|
|
@@ -83,6 +93,39 @@ export function toDatabase(settings) {
|
|
|
83
93
|
feature_flag_debug: settings.featureFlags?.debug ? 1 : 0,
|
|
84
94
|
};
|
|
85
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Build the stageTimeouts spread from DB row columns.
|
|
98
|
+
* Returns `{ stageTimeouts: { ... } }` when at least one column is non-null,
|
|
99
|
+
* or an empty object `{}` when all are null (so the field stays undefined).
|
|
100
|
+
*/
|
|
101
|
+
function buildStageTimeoutsFromRow(row) {
|
|
102
|
+
const entries = [];
|
|
103
|
+
if (row.stage_timeout_analyze_ms !== null)
|
|
104
|
+
entries.push(['analyzeMs', row.stage_timeout_analyze_ms]);
|
|
105
|
+
if (row.stage_timeout_requirements_ms !== null)
|
|
106
|
+
entries.push(['requirementsMs', row.stage_timeout_requirements_ms]);
|
|
107
|
+
if (row.stage_timeout_research_ms !== null)
|
|
108
|
+
entries.push(['researchMs', row.stage_timeout_research_ms]);
|
|
109
|
+
if (row.stage_timeout_plan_ms !== null)
|
|
110
|
+
entries.push(['planMs', row.stage_timeout_plan_ms]);
|
|
111
|
+
if (row.stage_timeout_implement_ms !== null)
|
|
112
|
+
entries.push(['implementMs', row.stage_timeout_implement_ms]);
|
|
113
|
+
if (row.stage_timeout_merge_ms !== null)
|
|
114
|
+
entries.push(['mergeMs', row.stage_timeout_merge_ms]);
|
|
115
|
+
if (entries.length === 0)
|
|
116
|
+
return {};
|
|
117
|
+
return { stageTimeouts: Object.fromEntries(entries) };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Build the analyzeRepoTimeouts spread from DB row columns.
|
|
121
|
+
* Returns `{ analyzeRepoTimeouts: { ... } }` when the column is non-null,
|
|
122
|
+
* or an empty object `{}` when null (so the field stays undefined).
|
|
123
|
+
*/
|
|
124
|
+
function buildAnalyzeRepoTimeoutsFromRow(row) {
|
|
125
|
+
if (row.analyze_repo_timeout_analyze_ms === null)
|
|
126
|
+
return {};
|
|
127
|
+
return { analyzeRepoTimeouts: { analyzeMs: row.analyze_repo_timeout_analyze_ms } };
|
|
128
|
+
}
|
|
86
129
|
/**
|
|
87
130
|
* Maps database row to Settings domain object.
|
|
88
131
|
* Reconstructs nested objects and converts types from SQL.
|
|
@@ -110,6 +153,7 @@ export function fromDatabase(row) {
|
|
|
110
153
|
environment: {
|
|
111
154
|
defaultEditor: row.env_default_editor,
|
|
112
155
|
shellPreference: row.env_shell_preference,
|
|
156
|
+
terminalPreference: (row.env_terminal_preference ?? 'system'),
|
|
113
157
|
},
|
|
114
158
|
// SystemConfig (INTEGER → boolean)
|
|
115
159
|
system: {
|
|
@@ -153,6 +197,8 @@ export function fromDatabase(row) {
|
|
|
153
197
|
...(row.ci_max_fix_attempts !== null && { ciMaxFixAttempts: row.ci_max_fix_attempts }),
|
|
154
198
|
...(row.ci_watch_timeout_ms !== null && { ciWatchTimeoutMs: row.ci_watch_timeout_ms }),
|
|
155
199
|
...(row.ci_log_max_chars !== null && { ciLogMaxChars: row.ci_log_max_chars }),
|
|
200
|
+
...buildStageTimeoutsFromRow(row),
|
|
201
|
+
...buildAnalyzeRepoTimeoutsFromRow(row),
|
|
156
202
|
enableEvidence: row.workflow_enable_evidence === 1,
|
|
157
203
|
commitEvidence: row.workflow_commit_evidence === 1,
|
|
158
204
|
},
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration 035: Add per-stage timeout columns to settings table.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the single stage_timeout_ms column with individual per-stage
|
|
5
|
+
* timeout columns. Each is a nullable INTEGER (milliseconds). When NULL,
|
|
6
|
+
* the application falls back to the hardcoded default of 600_000 ms
|
|
7
|
+
* (10 minutes).
|
|
8
|
+
*
|
|
9
|
+
* Columns added:
|
|
10
|
+
* - stage_timeout_analyze_ms
|
|
11
|
+
* - stage_timeout_requirements_ms
|
|
12
|
+
* - stage_timeout_research_ms
|
|
13
|
+
* - stage_timeout_plan_ms
|
|
14
|
+
* - stage_timeout_implement_ms
|
|
15
|
+
* - stage_timeout_merge_ms
|
|
16
|
+
* - analyze_repo_timeout_analyze_ms
|
|
17
|
+
*/
|
|
18
|
+
import type { MigrationParams } from 'umzug';
|
|
19
|
+
import type Database from 'better-sqlite3';
|
|
20
|
+
export declare function up({ context: db }: MigrationParams<Database.Database>): Promise<void>;
|
|
21
|
+
export declare function down({ context: db }: MigrationParams<Database.Database>): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=035-add-stage-timeout-ms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"035-add-stage-timeout-ms.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/migrations/035-add-stage-timeout-ms.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAY3C,wBAAsB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB3F;AAED,wBAAsB,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7F"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration 035: Add per-stage timeout columns to settings table.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the single stage_timeout_ms column with individual per-stage
|
|
5
|
+
* timeout columns. Each is a nullable INTEGER (milliseconds). When NULL,
|
|
6
|
+
* the application falls back to the hardcoded default of 600_000 ms
|
|
7
|
+
* (10 minutes).
|
|
8
|
+
*
|
|
9
|
+
* Columns added:
|
|
10
|
+
* - stage_timeout_analyze_ms
|
|
11
|
+
* - stage_timeout_requirements_ms
|
|
12
|
+
* - stage_timeout_research_ms
|
|
13
|
+
* - stage_timeout_plan_ms
|
|
14
|
+
* - stage_timeout_implement_ms
|
|
15
|
+
* - stage_timeout_merge_ms
|
|
16
|
+
* - analyze_repo_timeout_analyze_ms
|
|
17
|
+
*/
|
|
18
|
+
const STAGE_COLUMNS = [
|
|
19
|
+
'stage_timeout_analyze_ms',
|
|
20
|
+
'stage_timeout_requirements_ms',
|
|
21
|
+
'stage_timeout_research_ms',
|
|
22
|
+
'stage_timeout_plan_ms',
|
|
23
|
+
'stage_timeout_implement_ms',
|
|
24
|
+
'stage_timeout_merge_ms',
|
|
25
|
+
'analyze_repo_timeout_analyze_ms',
|
|
26
|
+
];
|
|
27
|
+
export async function up({ context: db }) {
|
|
28
|
+
const columns = db.pragma('table_info(settings)');
|
|
29
|
+
const existingNames = new Set(columns.map((c) => c.name));
|
|
30
|
+
for (const col of STAGE_COLUMNS) {
|
|
31
|
+
if (!existingNames.has(col)) {
|
|
32
|
+
db.exec(`ALTER TABLE settings ADD COLUMN ${col} INTEGER`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Migrate existing stage_timeout_ms value to all per-stage columns
|
|
36
|
+
if (existingNames.has('stage_timeout_ms')) {
|
|
37
|
+
db.exec(`
|
|
38
|
+
UPDATE settings SET
|
|
39
|
+
stage_timeout_analyze_ms = COALESCE(stage_timeout_analyze_ms, stage_timeout_ms),
|
|
40
|
+
stage_timeout_requirements_ms = COALESCE(stage_timeout_requirements_ms, stage_timeout_ms),
|
|
41
|
+
stage_timeout_research_ms = COALESCE(stage_timeout_research_ms, stage_timeout_ms),
|
|
42
|
+
stage_timeout_plan_ms = COALESCE(stage_timeout_plan_ms, stage_timeout_ms),
|
|
43
|
+
stage_timeout_implement_ms = COALESCE(stage_timeout_implement_ms, stage_timeout_ms),
|
|
44
|
+
stage_timeout_merge_ms = COALESCE(stage_timeout_merge_ms, stage_timeout_ms)
|
|
45
|
+
WHERE stage_timeout_ms IS NOT NULL
|
|
46
|
+
`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export async function down({ context: db }) {
|
|
50
|
+
// SQLite does not support DROP COLUMN before 3.35.0; the columns are
|
|
51
|
+
// nullable and ignored when absent, so this is a no-op.
|
|
52
|
+
void db;
|
|
53
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration 035: Add terminal preference to settings.
|
|
3
|
+
*
|
|
4
|
+
* Adds the env_terminal_preference column to the settings table.
|
|
5
|
+
* Defaults to 'system' (OS default terminal).
|
|
6
|
+
*/
|
|
7
|
+
import type { MigrationParams } from 'umzug';
|
|
8
|
+
import type Database from 'better-sqlite3';
|
|
9
|
+
export declare function up({ context: db }: MigrationParams<Database.Database>): Promise<void>;
|
|
10
|
+
export declare function down({ context: db }: MigrationParams<Database.Database>): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=036-add-terminal-preference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"036-add-terminal-preference.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,wBAAsB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3F;AAED,wBAAsB,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7F"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export async function up({ context: db }) {
|
|
2
|
+
const columns = db.pragma('table_info(settings)');
|
|
3
|
+
if (!columns.some((c) => c.name === 'env_terminal_preference')) {
|
|
4
|
+
db.exec("ALTER TABLE settings ADD COLUMN env_terminal_preference TEXT NOT NULL DEFAULT 'system'");
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export async function down({ context: db }) {
|
|
8
|
+
// SQLite does not support DROP COLUMN before version 3.35.0.
|
|
9
|
+
// For safety we recreate the table without the column.
|
|
10
|
+
// However, since this is a simple addition and we guard with IF NOT EXISTS
|
|
11
|
+
// in `up`, a no-op down is acceptable for this migration.
|
|
12
|
+
void db;
|
|
13
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/persistence/sqlite/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAI3C;;;GAGG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/persistence/sqlite/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAI3C;;;GAGG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAoGxC;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9E"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { readdirSync } from 'node:fs';
|
|
13
13
|
import { dirname, join } from 'node:path';
|
|
14
|
-
import { pathToFileURL } from 'node:url';
|
|
14
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
15
15
|
import { Umzug } from 'umzug';
|
|
16
16
|
import { SQLiteMigrationStorage } from './sqlite-migration-storage.js';
|
|
17
17
|
import { LEGACY_MIGRATIONS, LEGACY_MIGRATION_NAMES } from './legacy-migrations.js';
|
|
@@ -27,7 +27,7 @@ export const LATEST_SCHEMA_VERSION = 34;
|
|
|
27
27
|
function getMigrationsDir() {
|
|
28
28
|
// import.meta.url is available in ESM; fallback to __dirname for CJS
|
|
29
29
|
// The migrations/ directory is a sibling of this file
|
|
30
|
-
return join(dirname(
|
|
30
|
+
return join(dirname(fileURLToPath(import.meta.url)), 'migrations');
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
33
|
* Discovers new migration files (035+) in the migrations/ directory.
|
|
@@ -41,9 +41,18 @@ function getMigrationsDir() {
|
|
|
41
41
|
async function discoverNewMigrations(migrationsDir) {
|
|
42
42
|
let files;
|
|
43
43
|
try {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
const allFiles = readdirSync(migrationsDir);
|
|
45
|
+
// Accept .js (compiled) and .ts (dev via tsx) but exclude .d.ts declaration files
|
|
46
|
+
const candidates = allFiles.filter((f) => (f.endsWith('.js') || f.endsWith('.ts')) && !f.endsWith('.d.ts') && !f.endsWith('.d.js'));
|
|
47
|
+
// Deduplicate: if both .ts and .js exist for the same migration, prefer .js
|
|
48
|
+
const byName = new Map();
|
|
49
|
+
for (const f of candidates) {
|
|
50
|
+
const base = f.replace(/\.(js|ts)$/, '');
|
|
51
|
+
if (!byName.has(base) || f.endsWith('.js')) {
|
|
52
|
+
byName.set(base, f);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
files = [...byName.values()].sort();
|
|
47
56
|
}
|
|
48
57
|
catch {
|
|
49
58
|
// Directory doesn't exist or is unreadable — no new migrations
|
|
@@ -51,8 +60,8 @@ async function discoverNewMigrations(migrationsDir) {
|
|
|
51
60
|
}
|
|
52
61
|
const migrations = [];
|
|
53
62
|
for (const file of files) {
|
|
63
|
+
const name = file.replace(/\.(js|ts)$/, '');
|
|
54
64
|
const filePath = join(migrationsDir, file);
|
|
55
|
-
const name = file.replace(/\.js$/, '');
|
|
56
65
|
const mod = (await import(pathToFileURL(filePath).href));
|
|
57
66
|
migrations.push({
|
|
58
67
|
name,
|
package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-settings.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-settings.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8EAA8E,CAAC;AACxH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAOjE;;;GAGG;AACH,qBACa,wBAAyB,YAAW,mBAAmB;IACtD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAElD;;;;;;OAMG;IACG,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite-settings.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-settings.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8EAA8E,CAAC;AACxH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAOjE;;;GAGG;AACH,qBACa,wBAAyB,YAAW,mBAAmB;IACtD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAElD;;;;;;OAMG;IACG,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAmEnD;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgBtC;;;;;OAKG;IACG,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CA6EhD"}
|
|
@@ -46,7 +46,7 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
|
|
|
46
46
|
id, created_at, updated_at,
|
|
47
47
|
model_analyze, model_requirements, model_plan, model_implement, model_default,
|
|
48
48
|
user_name, user_email, user_github_username,
|
|
49
|
-
env_default_editor, env_shell_preference,
|
|
49
|
+
env_default_editor, env_shell_preference, env_terminal_preference,
|
|
50
50
|
sys_auto_update, sys_log_level,
|
|
51
51
|
agent_type, agent_auth_method, agent_token,
|
|
52
52
|
notif_in_app_enabled, notif_browser_enabled, notif_desktop_enabled,
|
|
@@ -57,6 +57,10 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
|
|
|
57
57
|
notif_evt_pr_blocked, notif_evt_merge_review_ready,
|
|
58
58
|
workflow_open_pr_on_impl_complete,
|
|
59
59
|
ci_max_fix_attempts, ci_watch_timeout_ms, ci_log_max_chars,
|
|
60
|
+
stage_timeout_analyze_ms, stage_timeout_requirements_ms,
|
|
61
|
+
stage_timeout_research_ms, stage_timeout_plan_ms,
|
|
62
|
+
stage_timeout_implement_ms, stage_timeout_merge_ms,
|
|
63
|
+
analyze_repo_timeout_analyze_ms,
|
|
60
64
|
onboarding_complete,
|
|
61
65
|
approval_gate_allow_prd, approval_gate_allow_plan,
|
|
62
66
|
approval_gate_allow_merge, approval_gate_push_on_impl_complete,
|
|
@@ -66,7 +70,7 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
|
|
|
66
70
|
@id, @created_at, @updated_at,
|
|
67
71
|
@model_analyze, @model_requirements, @model_plan, @model_implement, @model_default,
|
|
68
72
|
@user_name, @user_email, @user_github_username,
|
|
69
|
-
@env_default_editor, @env_shell_preference,
|
|
73
|
+
@env_default_editor, @env_shell_preference, @env_terminal_preference,
|
|
70
74
|
@sys_auto_update, @sys_log_level,
|
|
71
75
|
@agent_type, @agent_auth_method, @agent_token,
|
|
72
76
|
@notif_in_app_enabled, @notif_browser_enabled, @notif_desktop_enabled,
|
|
@@ -77,6 +81,10 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
|
|
|
77
81
|
@notif_evt_pr_blocked, @notif_evt_merge_review_ready,
|
|
78
82
|
@workflow_open_pr_on_impl_complete,
|
|
79
83
|
@ci_max_fix_attempts, @ci_watch_timeout_ms, @ci_log_max_chars,
|
|
84
|
+
@stage_timeout_analyze_ms, @stage_timeout_requirements_ms,
|
|
85
|
+
@stage_timeout_research_ms, @stage_timeout_plan_ms,
|
|
86
|
+
@stage_timeout_implement_ms, @stage_timeout_merge_ms,
|
|
87
|
+
@analyze_repo_timeout_analyze_ms,
|
|
80
88
|
@onboarding_complete,
|
|
81
89
|
@approval_gate_allow_prd, @approval_gate_allow_plan,
|
|
82
90
|
@approval_gate_allow_merge, @approval_gate_push_on_impl_complete,
|
|
@@ -133,6 +141,7 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
|
|
|
133
141
|
user_github_username = @user_github_username,
|
|
134
142
|
env_default_editor = @env_default_editor,
|
|
135
143
|
env_shell_preference = @env_shell_preference,
|
|
144
|
+
env_terminal_preference = @env_terminal_preference,
|
|
136
145
|
sys_auto_update = @sys_auto_update,
|
|
137
146
|
sys_log_level = @sys_log_level,
|
|
138
147
|
agent_type = @agent_type,
|
|
@@ -156,6 +165,13 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
|
|
|
156
165
|
ci_max_fix_attempts = @ci_max_fix_attempts,
|
|
157
166
|
ci_watch_timeout_ms = @ci_watch_timeout_ms,
|
|
158
167
|
ci_log_max_chars = @ci_log_max_chars,
|
|
168
|
+
stage_timeout_analyze_ms = @stage_timeout_analyze_ms,
|
|
169
|
+
stage_timeout_requirements_ms = @stage_timeout_requirements_ms,
|
|
170
|
+
stage_timeout_research_ms = @stage_timeout_research_ms,
|
|
171
|
+
stage_timeout_plan_ms = @stage_timeout_plan_ms,
|
|
172
|
+
stage_timeout_implement_ms = @stage_timeout_implement_ms,
|
|
173
|
+
stage_timeout_merge_ms = @stage_timeout_merge_ms,
|
|
174
|
+
analyze_repo_timeout_analyze_ms = @analyze_repo_timeout_analyze_ms,
|
|
159
175
|
onboarding_complete = @onboarding_complete,
|
|
160
176
|
approval_gate_allow_prd = @approval_gate_allow_prd,
|
|
161
177
|
approval_gate_allow_plan = @approval_gate_allow_plan,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-repository-graph.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/analyze-repo/analyze-repository-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;
|
|
1
|
+
{"version":3,"file":"analyze-repository-graph.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/analyze-repo/analyze-repository-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAkBpG;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;EAIjC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,OAAO,sBAAsB,CAAC,KAAK,CAAC;AA0B7E;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,cAAc,EACxB,YAAY,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAQnC"}
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import { Annotation, StateGraph, START, END } from '@langchain/langgraph';
|
|
2
2
|
import { buildAnalyzePrompt } from './prompts/analyze-repository.prompt.js';
|
|
3
|
+
import { hasSettings, getSettings } from '../../../services/settings.service.js';
|
|
4
|
+
/** Default timeout for analyze-repo agent (10 minutes) — prevents infinite hangs. */
|
|
5
|
+
const DEFAULT_ANALYZE_REPO_TIMEOUT_MS = 600_000;
|
|
6
|
+
/**
|
|
7
|
+
* Resolve the timeout for the analyze-repository agent.
|
|
8
|
+
* Reads from settings (workflow.analyzeRepoTimeouts.analyzeMs),
|
|
9
|
+
* falling back to DEFAULT_ANALYZE_REPO_TIMEOUT_MS when not configured.
|
|
10
|
+
*/
|
|
11
|
+
function getAnalyzeRepoTimeoutMs() {
|
|
12
|
+
if (!hasSettings())
|
|
13
|
+
return DEFAULT_ANALYZE_REPO_TIMEOUT_MS;
|
|
14
|
+
const timeouts = getSettings().workflow?.analyzeRepoTimeouts;
|
|
15
|
+
return timeouts?.analyzeMs ?? DEFAULT_ANALYZE_REPO_TIMEOUT_MS;
|
|
16
|
+
}
|
|
3
17
|
/**
|
|
4
18
|
* State annotation for the analyze-repository graph.
|
|
5
19
|
*
|
|
@@ -23,6 +37,7 @@ function createAnalyzeNode(executor) {
|
|
|
23
37
|
const prompt = buildAnalyzePrompt(state.repositoryPath);
|
|
24
38
|
const result = await executor.execute(prompt, {
|
|
25
39
|
cwd: state.repositoryPath,
|
|
40
|
+
timeout: getAnalyzeRepoTimeoutMs(),
|
|
26
41
|
});
|
|
27
42
|
return {
|
|
28
43
|
analysisMarkdown: result.result,
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts
CHANGED
|
@@ -23,10 +23,20 @@ export type NodeLogger = ReturnType<typeof createNodeLogger>;
|
|
|
23
23
|
* Safely read a file from the spec directory. Returns empty string if file doesn't exist.
|
|
24
24
|
*/
|
|
25
25
|
export declare function readSpecFile(specDir: string, filename: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Resolve the timeout for a specific stage.
|
|
28
|
+
* Reads per-stage timeout from settings (workflow.stageTimeouts.<stage>Ms),
|
|
29
|
+
* falling back to DEFAULT_STAGE_TIMEOUT_MS when not configured.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getStageTimeoutMs(nodeName: string): number;
|
|
26
32
|
/**
|
|
27
33
|
* Build executor options with cwd. Each node gets a clean agent context.
|
|
34
|
+
* The timeout is resolved per-stage from settings (workflow.stageTimeouts)
|
|
35
|
+
* with a fallback to DEFAULT_STAGE_TIMEOUT_MS (10 min).
|
|
36
|
+
*
|
|
37
|
+
* When no `nodeName` is provided, the current node from state is used.
|
|
28
38
|
*/
|
|
29
|
-
export declare function buildExecutorOptions(state: FeatureAgentState, overrides?: Partial<Pick<AgentExecutionOptions, 'timeout'
|
|
39
|
+
export declare function buildExecutorOptions(state: FeatureAgentState, overrides?: Partial<Pick<AgentExecutionOptions, 'timeout'>>, nodeName?: string): AgentExecutionOptions;
|
|
30
40
|
/**
|
|
31
41
|
* Parse YAML with automatic sanitization of common AI-generated issues.
|
|
32
42
|
* First attempts normal parsing; on failure, sanitizes unquoted braces
|
|
@@ -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;
|
|
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,CAqB5F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAOhG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAwB1F;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAa5F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,MAAM,CAiCT;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAa3E;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,UAAU,KAAK,MAAM,GACjE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAqHnE"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js
CHANGED
|
@@ -8,6 +8,7 @@ import yaml from 'js-yaml';
|
|
|
8
8
|
import { readFileSync, writeFileSync, renameSync, unlinkSync } from 'node:fs';
|
|
9
9
|
import { join } from 'node:path';
|
|
10
10
|
import { interrupt, isGraphBubbleUp } from '@langchain/langgraph';
|
|
11
|
+
import { hasSettings, getSettings } from '../../../../services/settings.service.js';
|
|
11
12
|
import { reportNodeStart } from '../heartbeat.js';
|
|
12
13
|
import { recordPhaseStart, recordPhaseEnd, recordApprovalWaitStart, } from '../phase-timing-context.js';
|
|
13
14
|
import { updateNodeLifecycle } from '../lifecycle-context.js';
|
|
@@ -44,14 +45,52 @@ export function readSpecFile(specDir, filename) {
|
|
|
44
45
|
return '';
|
|
45
46
|
}
|
|
46
47
|
}
|
|
48
|
+
/** Default timeout per agent call (30 minutes) — prevents infinite hangs. */
|
|
49
|
+
const DEFAULT_STAGE_TIMEOUT_MS = 1_800_000;
|
|
50
|
+
/**
|
|
51
|
+
* Map from node name to the corresponding StageTimeouts field.
|
|
52
|
+
* `fast-implement` reuses the implement timeout; `evidence` also reuses implement.
|
|
53
|
+
*/
|
|
54
|
+
const STAGE_TIMEOUT_KEY = {
|
|
55
|
+
analyze: 'analyzeMs',
|
|
56
|
+
requirements: 'requirementsMs',
|
|
57
|
+
research: 'researchMs',
|
|
58
|
+
plan: 'planMs',
|
|
59
|
+
implement: 'implementMs',
|
|
60
|
+
'fast-implement': 'implementMs',
|
|
61
|
+
evidence: 'implementMs',
|
|
62
|
+
merge: 'mergeMs',
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Resolve the timeout for a specific stage.
|
|
66
|
+
* Reads per-stage timeout from settings (workflow.stageTimeouts.<stage>Ms),
|
|
67
|
+
* falling back to DEFAULT_STAGE_TIMEOUT_MS when not configured.
|
|
68
|
+
*/
|
|
69
|
+
export function getStageTimeoutMs(nodeName) {
|
|
70
|
+
if (!hasSettings())
|
|
71
|
+
return DEFAULT_STAGE_TIMEOUT_MS;
|
|
72
|
+
const timeouts = getSettings().workflow?.stageTimeouts;
|
|
73
|
+
if (!timeouts)
|
|
74
|
+
return DEFAULT_STAGE_TIMEOUT_MS;
|
|
75
|
+
const key = STAGE_TIMEOUT_KEY[nodeName];
|
|
76
|
+
if (!key)
|
|
77
|
+
return DEFAULT_STAGE_TIMEOUT_MS;
|
|
78
|
+
return timeouts[key] ?? DEFAULT_STAGE_TIMEOUT_MS;
|
|
79
|
+
}
|
|
47
80
|
/**
|
|
48
81
|
* Build executor options with cwd. Each node gets a clean agent context.
|
|
82
|
+
* The timeout is resolved per-stage from settings (workflow.stageTimeouts)
|
|
83
|
+
* with a fallback to DEFAULT_STAGE_TIMEOUT_MS (10 min).
|
|
84
|
+
*
|
|
85
|
+
* When no `nodeName` is provided, the current node from state is used.
|
|
49
86
|
*/
|
|
50
|
-
export function buildExecutorOptions(state, overrides) {
|
|
87
|
+
export function buildExecutorOptions(state, overrides, nodeName) {
|
|
88
|
+
const stage = nodeName ?? state.currentNode ?? '';
|
|
89
|
+
const stageTimeout = getStageTimeoutMs(stage);
|
|
51
90
|
return {
|
|
52
91
|
cwd: state.worktreePath || state.repositoryPath,
|
|
53
92
|
maxTurns: 5000,
|
|
54
|
-
timeout:
|
|
93
|
+
timeout: stageTimeout,
|
|
55
94
|
...(state.model ? { model: state.model } : {}),
|
|
56
95
|
...overrides,
|
|
57
96
|
};
|
|
@@ -373,7 +412,7 @@ export function executeNode(nodeName, executor, buildPrompt) {
|
|
|
373
412
|
try {
|
|
374
413
|
const resumePrefix = buildResumeContext(state.resumeReason);
|
|
375
414
|
const prompt = resumePrefix + buildPrompt(state, log);
|
|
376
|
-
const options = buildExecutorOptions(state);
|
|
415
|
+
const options = buildExecutorOptions(state, undefined, nodeName);
|
|
377
416
|
log.info(`Executing agent at cwd=${options.cwd}`);
|
|
378
417
|
log.info(`Prompt length: ${prompt.length} chars`);
|
|
379
418
|
const result = await executor.execute(prompt, options);
|
|
@@ -66,4 +66,9 @@ export declare const TOOL_METADATA: Record<string, ToolMetadata>;
|
|
|
66
66
|
* Each entry is [toolId, metadata].
|
|
67
67
|
*/
|
|
68
68
|
export declare function getIdeEntries(): [string, ToolMetadata][];
|
|
69
|
+
/**
|
|
70
|
+
* Returns entries from TOOL_METADATA tagged as "terminal" that have an
|
|
71
|
+
* `openDirectory` field. Each entry is [toolId, metadata].
|
|
72
|
+
*/
|
|
73
|
+
export declare function getTerminalEntries(): [string, ToolMetadata][];
|
|
69
74
|
//# sourceMappingURL=tool-metadata.d.ts.map
|
package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-metadata.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IAEb,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAEhB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IAEpB,oFAAoF;IACpF,IAAI,EAAE,CAAC,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC;IAEnD,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,iDAAiD;IACjD,SAAS,CAAC,EAAE,CAAC,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;IAE7C,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IAEvB,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAEhB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IAEtB,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;yGAEqG;IACrG,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhD;;iGAE6F;IAC7F,YAAY,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;QACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IAEF;;;;wEAIoE;IACpE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnD;AAmDD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAsB,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAExD"}
|
|
1
|
+
{"version":3,"file":"tool-metadata.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IAEb,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAEhB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IAEpB,oFAAoF;IACpF,IAAI,EAAE,CAAC,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC;IAEnD,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,iDAAiD;IACjD,SAAS,CAAC,EAAE,CAAC,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;IAE7C,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IAEvB,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAEhB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IAEtB,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;yGAEqG;IACrG,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhD;;iGAE6F;IAC7F,YAAY,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;QACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IAEF;;;;wEAIoE;IACpE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnD;AAmDD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAsB,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAExD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAI7D"}
|
|
@@ -63,3 +63,10 @@ export const TOOL_METADATA = loadToolMetadata();
|
|
|
63
63
|
export function getIdeEntries() {
|
|
64
64
|
return Object.entries(TOOL_METADATA).filter(([, meta]) => meta.openDirectory != null);
|
|
65
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Returns entries from TOOL_METADATA tagged as "terminal" that have an
|
|
68
|
+
* `openDirectory` field. Each entry is [toolId, metadata].
|
|
69
|
+
*/
|
|
70
|
+
export function getTerminalEntries() {
|
|
71
|
+
return Object.entries(TOOL_METADATA).filter(([, meta]) => meta.tags.includes('terminal') && meta.openDirectory != null);
|
|
72
|
+
}
|
package/dist/packages/core/src/infrastructure/services/tool-installer/tools/system-terminal.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "System Terminal",
|
|
3
|
+
"summary": "OS default terminal emulator",
|
|
4
|
+
"description": "The default terminal emulator for your operating system: Terminal.app on macOS, x-terminal-emulator on Linux, and PowerShell on Windows.",
|
|
5
|
+
"tags": ["terminal"],
|
|
6
|
+
"author": "System",
|
|
7
|
+
"platforms": ["linux", "darwin", "win32"],
|
|
8
|
+
"binary": {
|
|
9
|
+
"darwin": "open",
|
|
10
|
+
"linux": "x-terminal-emulator",
|
|
11
|
+
"win32": "powershell"
|
|
12
|
+
},
|
|
13
|
+
"packageManager": "system",
|
|
14
|
+
"commands": {},
|
|
15
|
+
"timeout": 5000,
|
|
16
|
+
"documentationUrl": "https://support.apple.com/guide/terminal/welcome/mac",
|
|
17
|
+
"verifyCommand": "true",
|
|
18
|
+
"autoInstall": false,
|
|
19
|
+
"openDirectory": {
|
|
20
|
+
"darwin": "open -a Terminal {dir}",
|
|
21
|
+
"linux": "x-terminal-emulator --working-directory={dir}",
|
|
22
|
+
"win32": "powershell -NoExit -Command \"Set-Location \\\"{dir}\\\"\""
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAa3C"}
|
|
@@ -15,6 +15,7 @@ import { createLsCommand } from './ls.command.js';
|
|
|
15
15
|
import { createShowCommand } from './show.command.js';
|
|
16
16
|
import { createDelCommand } from './del.command.js';
|
|
17
17
|
import { createResumeCommand } from './resume.command.js';
|
|
18
|
+
import { createStartCommand } from './start.command.js';
|
|
18
19
|
import { createReviewCommand } from './review.command.js';
|
|
19
20
|
import { createApproveCommand } from './approve.command.js';
|
|
20
21
|
import { createRejectCommand } from './reject.command.js';
|
|
@@ -30,6 +31,7 @@ export function createFeatCommand() {
|
|
|
30
31
|
.addCommand(createShowCommand())
|
|
31
32
|
.addCommand(createDelCommand())
|
|
32
33
|
.addCommand(createResumeCommand())
|
|
34
|
+
.addCommand(createStartCommand())
|
|
33
35
|
.addCommand(createReviewCommand())
|
|
34
36
|
.addCommand(createApproveCommand())
|
|
35
37
|
.addCommand(createRejectCommand())
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ls.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/ls.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ls.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/ls.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6KpC,wBAAgB,eAAe,IAAI,OAAO,CAsGzC"}
|
|
@@ -54,6 +54,9 @@ function formatStatus(feature, run) {
|
|
|
54
54
|
if (feature.lifecycle === 'Blocked') {
|
|
55
55
|
return `${colors.warning(symbols.dotEmpty)} ${colors.warning('Blocked')}`;
|
|
56
56
|
}
|
|
57
|
+
if (feature.lifecycle === 'Pending') {
|
|
58
|
+
return `${colors.muted(symbols.dotEmpty)} ${colors.muted('Pending')}`;
|
|
59
|
+
}
|
|
57
60
|
if (!run) {
|
|
58
61
|
return `${colors.muted(symbols.dotEmpty)} ${colors.muted(feature.lifecycle)}`;
|
|
59
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/new.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"new.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/new.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6DpC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAmJ1C"}
|