verbolab 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +71 -0
- package/dist/bin/verbo.d.ts +3 -0
- package/dist/bin/verbo.d.ts.map +1 -0
- package/dist/bin/verbo.js +1156 -0
- package/dist/bin/verbo.js.map +1 -0
- package/dist/relay/index.d.ts +2 -0
- package/dist/relay/index.d.ts.map +1 -0
- package/dist/relay/index.js +15 -0
- package/dist/relay/index.js.map +1 -0
- package/dist/src/agent/agent-launcher.d.ts +64 -0
- package/dist/src/agent/agent-launcher.d.ts.map +1 -0
- package/dist/src/agent/agent-launcher.js +326 -0
- package/dist/src/agent/agent-launcher.js.map +1 -0
- package/dist/src/agent/agent-monitor.d.ts +16 -0
- package/dist/src/agent/agent-monitor.d.ts.map +1 -0
- package/dist/src/agent/agent-monitor.js +41 -0
- package/dist/src/agent/agent-monitor.js.map +1 -0
- package/dist/src/agent/fun-names.d.ts +9 -0
- package/dist/src/agent/fun-names.d.ts.map +1 -0
- package/dist/src/agent/fun-names.js +118 -0
- package/dist/src/agent/fun-names.js.map +1 -0
- package/dist/src/agent/mcp-shim.d.ts +45 -0
- package/dist/src/agent/mcp-shim.d.ts.map +1 -0
- package/dist/src/agent/mcp-shim.js +192 -0
- package/dist/src/agent/mcp-shim.js.map +1 -0
- package/dist/src/agent/personas.d.ts +47 -0
- package/dist/src/agent/personas.d.ts.map +1 -0
- package/dist/src/agent/personas.js +86 -0
- package/dist/src/agent/personas.js.map +1 -0
- package/dist/src/agent/provider-detection.d.ts +21 -0
- package/dist/src/agent/provider-detection.d.ts.map +1 -0
- package/dist/src/agent/provider-detection.js +47 -0
- package/dist/src/agent/provider-detection.js.map +1 -0
- package/dist/src/agent/providers/claude-provider.d.ts +3 -0
- package/dist/src/agent/providers/claude-provider.d.ts.map +1 -0
- package/dist/src/agent/providers/claude-provider.js +119 -0
- package/dist/src/agent/providers/claude-provider.js.map +1 -0
- package/dist/src/agent/providers/gemini-provider.d.ts +13 -0
- package/dist/src/agent/providers/gemini-provider.d.ts.map +1 -0
- package/dist/src/agent/providers/gemini-provider.js +143 -0
- package/dist/src/agent/providers/gemini-provider.js.map +1 -0
- package/dist/src/agent/providers/openai-provider.d.ts +3 -0
- package/dist/src/agent/providers/openai-provider.d.ts.map +1 -0
- package/dist/src/agent/providers/openai-provider.js +127 -0
- package/dist/src/agent/providers/openai-provider.js.map +1 -0
- package/dist/src/agent/providers/registry.d.ts +19 -0
- package/dist/src/agent/providers/registry.d.ts.map +1 -0
- package/dist/src/agent/providers/registry.js +30 -0
- package/dist/src/agent/providers/registry.js.map +1 -0
- package/dist/src/agent/providers/types.d.ts +118 -0
- package/dist/src/agent/providers/types.d.ts.map +1 -0
- package/dist/src/agent/providers/types.js +2 -0
- package/dist/src/agent/providers/types.js.map +1 -0
- package/dist/src/approval/approval-server.d.ts +17 -0
- package/dist/src/approval/approval-server.d.ts.map +1 -0
- package/dist/src/approval/approval-server.js +90 -0
- package/dist/src/approval/approval-server.js.map +1 -0
- package/dist/src/approval/approval-store.d.ts +29 -0
- package/dist/src/approval/approval-store.d.ts.map +1 -0
- package/dist/src/approval/approval-store.js +94 -0
- package/dist/src/approval/approval-store.js.map +1 -0
- package/dist/src/auth/auth-store.d.ts +18 -0
- package/dist/src/auth/auth-store.d.ts.map +1 -0
- package/dist/src/auth/auth-store.js +34 -0
- package/dist/src/auth/auth-store.js.map +1 -0
- package/dist/src/auth/device-code-client.d.ts +32 -0
- package/dist/src/auth/device-code-client.d.ts.map +1 -0
- package/dist/src/auth/device-code-client.js +41 -0
- package/dist/src/auth/device-code-client.js.map +1 -0
- package/dist/src/auth/plan-enforcer.d.ts +8 -0
- package/dist/src/auth/plan-enforcer.d.ts.map +1 -0
- package/dist/src/auth/plan-enforcer.js +14 -0
- package/dist/src/auth/plan-enforcer.js.map +1 -0
- package/dist/src/commands/audit.d.ts +7 -0
- package/dist/src/commands/audit.d.ts.map +1 -0
- package/dist/src/commands/audit.js +92 -0
- package/dist/src/commands/audit.js.map +1 -0
- package/dist/src/commands/team.d.ts +48 -0
- package/dist/src/commands/team.d.ts.map +1 -0
- package/dist/src/commands/team.js +175 -0
- package/dist/src/commands/team.js.map +1 -0
- package/dist/src/config/verbo-config.d.ts +43 -0
- package/dist/src/config/verbo-config.d.ts.map +1 -0
- package/dist/src/config/verbo-config.js +111 -0
- package/dist/src/config/verbo-config.js.map +1 -0
- package/dist/src/core/agent-session-store.d.ts +69 -0
- package/dist/src/core/agent-session-store.d.ts.map +1 -0
- package/dist/src/core/agent-session-store.js +168 -0
- package/dist/src/core/agent-session-store.js.map +1 -0
- package/dist/src/core/audit-log-store.d.ts +33 -0
- package/dist/src/core/audit-log-store.d.ts.map +1 -0
- package/dist/src/core/audit-log-store.js +104 -0
- package/dist/src/core/audit-log-store.js.map +1 -0
- package/dist/src/core/compliance.d.ts +50 -0
- package/dist/src/core/compliance.d.ts.map +1 -0
- package/dist/src/core/compliance.js +59 -0
- package/dist/src/core/compliance.js.map +1 -0
- package/dist/src/core/conflict-detector.d.ts +19 -0
- package/dist/src/core/conflict-detector.d.ts.map +1 -0
- package/dist/src/core/conflict-detector.js +87 -0
- package/dist/src/core/conflict-detector.js.map +1 -0
- package/dist/src/core/conflict-enforcer.d.ts +37 -0
- package/dist/src/core/conflict-enforcer.d.ts.map +1 -0
- package/dist/src/core/conflict-enforcer.js +139 -0
- package/dist/src/core/conflict-enforcer.js.map +1 -0
- package/dist/src/core/cost-store.d.ts +55 -0
- package/dist/src/core/cost-store.d.ts.map +1 -0
- package/dist/src/core/cost-store.js +140 -0
- package/dist/src/core/cost-store.js.map +1 -0
- package/dist/src/core/hot-files.d.ts +19 -0
- package/dist/src/core/hot-files.d.ts.map +1 -0
- package/dist/src/core/hot-files.js +64 -0
- package/dist/src/core/hot-files.js.map +1 -0
- package/dist/src/core/human-action-store.d.ts +33 -0
- package/dist/src/core/human-action-store.d.ts.map +1 -0
- package/dist/src/core/human-action-store.js +92 -0
- package/dist/src/core/human-action-store.js.map +1 -0
- package/dist/src/core/learning-store.d.ts +32 -0
- package/dist/src/core/learning-store.d.ts.map +1 -0
- package/dist/src/core/learning-store.js +95 -0
- package/dist/src/core/learning-store.js.map +1 -0
- package/dist/src/core/merge-queue.d.ts +28 -0
- package/dist/src/core/merge-queue.d.ts.map +1 -0
- package/dist/src/core/merge-queue.js +92 -0
- package/dist/src/core/merge-queue.js.map +1 -0
- package/dist/src/core/notification-service.d.ts +13 -0
- package/dist/src/core/notification-service.d.ts.map +1 -0
- package/dist/src/core/notification-service.js +126 -0
- package/dist/src/core/notification-service.js.map +1 -0
- package/dist/src/core/notifications.d.ts +10 -0
- package/dist/src/core/notifications.d.ts.map +1 -0
- package/dist/src/core/notifications.js +33 -0
- package/dist/src/core/notifications.js.map +1 -0
- package/dist/src/core/orchestrator-store.d.ts +44 -0
- package/dist/src/core/orchestrator-store.d.ts.map +1 -0
- package/dist/src/core/orchestrator-store.js +69 -0
- package/dist/src/core/orchestrator-store.js.map +1 -0
- package/dist/src/core/parallelizer.d.ts +47 -0
- package/dist/src/core/parallelizer.d.ts.map +1 -0
- package/dist/src/core/parallelizer.js +224 -0
- package/dist/src/core/parallelizer.js.map +1 -0
- package/dist/src/core/pipeline-rollback.d.ts +29 -0
- package/dist/src/core/pipeline-rollback.d.ts.map +1 -0
- package/dist/src/core/pipeline-rollback.js +84 -0
- package/dist/src/core/pipeline-rollback.js.map +1 -0
- package/dist/src/core/pipeline-runner.d.ts +73 -0
- package/dist/src/core/pipeline-runner.d.ts.map +1 -0
- package/dist/src/core/pipeline-runner.js +165 -0
- package/dist/src/core/pipeline-runner.js.map +1 -0
- package/dist/src/core/pr-creator.d.ts +22 -0
- package/dist/src/core/pr-creator.d.ts.map +1 -0
- package/dist/src/core/pr-creator.js +55 -0
- package/dist/src/core/pr-creator.js.map +1 -0
- package/dist/src/core/rbac.d.ts +27 -0
- package/dist/src/core/rbac.d.ts.map +1 -0
- package/dist/src/core/rbac.js +76 -0
- package/dist/src/core/rbac.js.map +1 -0
- package/dist/src/core/startup-cleanup.d.ts +47 -0
- package/dist/src/core/startup-cleanup.d.ts.map +1 -0
- package/dist/src/core/startup-cleanup.js +150 -0
- package/dist/src/core/startup-cleanup.js.map +1 -0
- package/dist/src/core/task-store.d.ts +96 -0
- package/dist/src/core/task-store.d.ts.map +1 -0
- package/dist/src/core/task-store.js +309 -0
- package/dist/src/core/task-store.js.map +1 -0
- package/dist/src/core/verbo-config-editor.d.ts +44 -0
- package/dist/src/core/verbo-config-editor.d.ts.map +1 -0
- package/dist/src/core/verbo-config-editor.js +204 -0
- package/dist/src/core/verbo-config-editor.js.map +1 -0
- package/dist/src/core/verbo-config.d.ts +35 -0
- package/dist/src/core/verbo-config.d.ts.map +1 -0
- package/dist/src/core/verbo-config.js +55 -0
- package/dist/src/core/verbo-config.js.map +1 -0
- package/dist/src/core/verbo-md.d.ts +96 -0
- package/dist/src/core/verbo-md.d.ts.map +1 -0
- package/dist/src/core/verbo-md.js +410 -0
- package/dist/src/core/verbo-md.js.map +1 -0
- package/dist/src/db/database.d.ts +9 -0
- package/dist/src/db/database.d.ts.map +1 -0
- package/dist/src/db/database.js +37 -0
- package/dist/src/db/database.js.map +1 -0
- package/dist/src/db/migrations/001-personas-subtasks.d.ts +10 -0
- package/dist/src/db/migrations/001-personas-subtasks.d.ts.map +1 -0
- package/dist/src/db/migrations/001-personas-subtasks.js +32 -0
- package/dist/src/db/migrations/001-personas-subtasks.js.map +1 -0
- package/dist/src/db/migrations/002-rbac.d.ts +9 -0
- package/dist/src/db/migrations/002-rbac.d.ts.map +1 -0
- package/dist/src/db/migrations/002-rbac.js +31 -0
- package/dist/src/db/migrations/002-rbac.js.map +1 -0
- package/dist/src/db/migrations/003-provider-column.d.ts +8 -0
- package/dist/src/db/migrations/003-provider-column.d.ts.map +1 -0
- package/dist/src/db/migrations/003-provider-column.js +12 -0
- package/dist/src/db/migrations/003-provider-column.js.map +1 -0
- package/dist/src/db/migrations/004-pipeline-cost.d.ts +8 -0
- package/dist/src/db/migrations/004-pipeline-cost.d.ts.map +1 -0
- package/dist/src/db/migrations/004-pipeline-cost.js +23 -0
- package/dist/src/db/migrations/004-pipeline-cost.js.map +1 -0
- package/dist/src/db/migrations/005-audit-log-timestamp.d.ts +10 -0
- package/dist/src/db/migrations/005-audit-log-timestamp.d.ts.map +1 -0
- package/dist/src/db/migrations/005-audit-log-timestamp.js +39 -0
- package/dist/src/db/migrations/005-audit-log-timestamp.js.map +1 -0
- package/dist/src/db/migrations/006-human-action-type.d.ts +9 -0
- package/dist/src/db/migrations/006-human-action-type.d.ts.map +1 -0
- package/dist/src/db/migrations/006-human-action-type.js +16 -0
- package/dist/src/db/migrations/006-human-action-type.js.map +1 -0
- package/dist/src/db/schema.d.ts +6 -0
- package/dist/src/db/schema.d.ts.map +1 -0
- package/dist/src/db/schema.js +255 -0
- package/dist/src/db/schema.js.map +1 -0
- package/dist/src/deps/dependabot-generator.d.ts +22 -0
- package/dist/src/deps/dependabot-generator.d.ts.map +1 -0
- package/dist/src/deps/dependabot-generator.js +83 -0
- package/dist/src/deps/dependabot-generator.js.map +1 -0
- package/dist/src/deps/dependabot-monitor.d.ts +22 -0
- package/dist/src/deps/dependabot-monitor.d.ts.map +1 -0
- package/dist/src/deps/dependabot-monitor.js +28 -0
- package/dist/src/deps/dependabot-monitor.js.map +1 -0
- package/dist/src/deps/package-auditor.d.ts +24 -0
- package/dist/src/deps/package-auditor.d.ts.map +1 -0
- package/dist/src/deps/package-auditor.js +118 -0
- package/dist/src/deps/package-auditor.js.map +1 -0
- package/dist/src/init/ensure-init.d.ts +6 -0
- package/dist/src/init/ensure-init.d.ts.map +1 -0
- package/dist/src/init/ensure-init.js +27 -0
- package/dist/src/init/ensure-init.js.map +1 -0
- package/dist/src/init/project-detector.d.ts +11 -0
- package/dist/src/init/project-detector.d.ts.map +1 -0
- package/dist/src/init/project-detector.js +117 -0
- package/dist/src/init/project-detector.js.map +1 -0
- package/dist/src/init/questionnaire.d.ts +5 -0
- package/dist/src/init/questionnaire.d.ts.map +1 -0
- package/dist/src/init/questionnaire.js +112 -0
- package/dist/src/init/questionnaire.js.map +1 -0
- package/dist/src/init/template.d.ts +17 -0
- package/dist/src/init/template.d.ts.map +1 -0
- package/dist/src/init/template.js +46 -0
- package/dist/src/init/template.js.map +1 -0
- package/dist/src/intelligence/claude-client.d.ts +3 -0
- package/dist/src/intelligence/claude-client.d.ts.map +1 -0
- package/dist/src/intelligence/claude-client.js +12 -0
- package/dist/src/intelligence/claude-client.js.map +1 -0
- package/dist/src/intelligence/conflict-mediator.d.ts +17 -0
- package/dist/src/intelligence/conflict-mediator.d.ts.map +1 -0
- package/dist/src/intelligence/conflict-mediator.js +83 -0
- package/dist/src/intelligence/conflict-mediator.js.map +1 -0
- package/dist/src/intelligence/github-orchestrator.d.ts +30 -0
- package/dist/src/intelligence/github-orchestrator.d.ts.map +1 -0
- package/dist/src/intelligence/github-orchestrator.js +270 -0
- package/dist/src/intelligence/github-orchestrator.js.map +1 -0
- package/dist/src/intelligence/kill-switch.d.ts +10 -0
- package/dist/src/intelligence/kill-switch.d.ts.map +1 -0
- package/dist/src/intelligence/kill-switch.js +12 -0
- package/dist/src/intelligence/kill-switch.js.map +1 -0
- package/dist/src/intelligence/learnings-extractor.d.ts +13 -0
- package/dist/src/intelligence/learnings-extractor.d.ts.map +1 -0
- package/dist/src/intelligence/learnings-extractor.js +74 -0
- package/dist/src/intelligence/learnings-extractor.js.map +1 -0
- package/dist/src/intelligence/project-scanner.d.ts +2 -0
- package/dist/src/intelligence/project-scanner.d.ts.map +1 -0
- package/dist/src/intelligence/project-scanner.js +28 -0
- package/dist/src/intelligence/project-scanner.js.map +1 -0
- package/dist/src/intelligence/task-decomposer.d.ts +14 -0
- package/dist/src/intelligence/task-decomposer.d.ts.map +1 -0
- package/dist/src/intelligence/task-decomposer.js +97 -0
- package/dist/src/intelligence/task-decomposer.js.map +1 -0
- package/dist/src/intelligence/types.d.ts +14 -0
- package/dist/src/intelligence/types.d.ts.map +1 -0
- package/dist/src/intelligence/types.js +2 -0
- package/dist/src/intelligence/types.js.map +1 -0
- package/dist/src/mcp/server.d.ts +63 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +537 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/stdio-entry.d.ts +2 -0
- package/dist/src/mcp/stdio-entry.d.ts.map +1 -0
- package/dist/src/mcp/stdio-entry.js +124 -0
- package/dist/src/mcp/stdio-entry.js.map +1 -0
- package/dist/src/mcp/subtask-handlers.d.ts +7 -0
- package/dist/src/mcp/subtask-handlers.d.ts.map +1 -0
- package/dist/src/mcp/subtask-handlers.js +50 -0
- package/dist/src/mcp/subtask-handlers.js.map +1 -0
- package/dist/src/security/network-proxy.d.ts +20 -0
- package/dist/src/security/network-proxy.d.ts.map +1 -0
- package/dist/src/security/network-proxy.js +125 -0
- package/dist/src/security/network-proxy.js.map +1 -0
- package/dist/src/security/network-sandbox.d.ts +19 -0
- package/dist/src/security/network-sandbox.d.ts.map +1 -0
- package/dist/src/security/network-sandbox.js +100 -0
- package/dist/src/security/network-sandbox.js.map +1 -0
- package/dist/src/security/sanitize.d.ts +13 -0
- package/dist/src/security/sanitize.d.ts.map +1 -0
- package/dist/src/security/sanitize.js +19 -0
- package/dist/src/security/sanitize.js.map +1 -0
- package/dist/src/security/secrets-patterns.d.ts +29 -0
- package/dist/src/security/secrets-patterns.d.ts.map +1 -0
- package/dist/src/security/secrets-patterns.js +430 -0
- package/dist/src/security/secrets-patterns.js.map +1 -0
- package/dist/src/security/secrets-scanner.d.ts +26 -0
- package/dist/src/security/secrets-scanner.d.ts.map +1 -0
- package/dist/src/security/secrets-scanner.js +62 -0
- package/dist/src/security/secrets-scanner.js.map +1 -0
- package/dist/src/skills/classifier.d.ts +9 -0
- package/dist/src/skills/classifier.d.ts.map +1 -0
- package/dist/src/skills/classifier.js +41 -0
- package/dist/src/skills/classifier.js.map +1 -0
- package/dist/src/skills/registry.d.ts +16 -0
- package/dist/src/skills/registry.d.ts.map +1 -0
- package/dist/src/skills/registry.js +61 -0
- package/dist/src/skills/registry.js.map +1 -0
- package/dist/src/sync/events.d.ts +9 -0
- package/dist/src/sync/events.d.ts.map +1 -0
- package/dist/src/sync/events.js +2 -0
- package/dist/src/sync/events.js.map +1 -0
- package/dist/src/sync/relay-server.d.ts +18 -0
- package/dist/src/sync/relay-server.d.ts.map +1 -0
- package/dist/src/sync/relay-server.js +131 -0
- package/dist/src/sync/relay-server.js.map +1 -0
- package/dist/src/sync/sync-client.d.ts +31 -0
- package/dist/src/sync/sync-client.d.ts.map +1 -0
- package/dist/src/sync/sync-client.js +314 -0
- package/dist/src/sync/sync-client.js.map +1 -0
- package/dist/src/tui/app.d.ts +35 -0
- package/dist/src/tui/app.d.ts.map +1 -0
- package/dist/src/tui/app.js +676 -0
- package/dist/src/tui/app.js.map +1 -0
- package/dist/src/tui/components/activity-feed.d.ts +12 -0
- package/dist/src/tui/components/activity-feed.d.ts.map +1 -0
- package/dist/src/tui/components/activity-feed.js +82 -0
- package/dist/src/tui/components/activity-feed.js.map +1 -0
- package/dist/src/tui/components/agent-list.d.ts +19 -0
- package/dist/src/tui/components/agent-list.d.ts.map +1 -0
- package/dist/src/tui/components/agent-list.js +33 -0
- package/dist/src/tui/components/agent-list.js.map +1 -0
- package/dist/src/tui/components/agent-row.d.ts +12 -0
- package/dist/src/tui/components/agent-row.d.ts.map +1 -0
- package/dist/src/tui/components/agent-row.js +37 -0
- package/dist/src/tui/components/agent-row.js.map +1 -0
- package/dist/src/tui/components/approval-terminal.d.ts +13 -0
- package/dist/src/tui/components/approval-terminal.d.ts.map +1 -0
- package/dist/src/tui/components/approval-terminal.js +34 -0
- package/dist/src/tui/components/approval-terminal.js.map +1 -0
- package/dist/src/tui/components/audit-viewer.d.ts +16 -0
- package/dist/src/tui/components/audit-viewer.d.ts.map +1 -0
- package/dist/src/tui/components/audit-viewer.js +46 -0
- package/dist/src/tui/components/audit-viewer.js.map +1 -0
- package/dist/src/tui/components/auth-gate.d.ts +9 -0
- package/dist/src/tui/components/auth-gate.d.ts.map +1 -0
- package/dist/src/tui/components/auth-gate.js +112 -0
- package/dist/src/tui/components/auth-gate.js.map +1 -0
- package/dist/src/tui/components/command-palette.d.ts +12 -0
- package/dist/src/tui/components/command-palette.d.ts.map +1 -0
- package/dist/src/tui/components/command-palette.js +51 -0
- package/dist/src/tui/components/command-palette.js.map +1 -0
- package/dist/src/tui/components/compliance-badge.d.ts +11 -0
- package/dist/src/tui/components/compliance-badge.d.ts.map +1 -0
- package/dist/src/tui/components/compliance-badge.js +12 -0
- package/dist/src/tui/components/compliance-badge.js.map +1 -0
- package/dist/src/tui/components/decomposition-review.d.ts +10 -0
- package/dist/src/tui/components/decomposition-review.d.ts.map +1 -0
- package/dist/src/tui/components/decomposition-review.js +19 -0
- package/dist/src/tui/components/decomposition-review.js.map +1 -0
- package/dist/src/tui/components/dependency-graph.d.ts +13 -0
- package/dist/src/tui/components/dependency-graph.d.ts.map +1 -0
- package/dist/src/tui/components/dependency-graph.js +143 -0
- package/dist/src/tui/components/dependency-graph.js.map +1 -0
- package/dist/src/tui/components/diff-viewer.d.ts +11 -0
- package/dist/src/tui/components/diff-viewer.d.ts.map +1 -0
- package/dist/src/tui/components/diff-viewer.js +82 -0
- package/dist/src/tui/components/diff-viewer.js.map +1 -0
- package/dist/src/tui/components/edit-task-input.d.ts +10 -0
- package/dist/src/tui/components/edit-task-input.d.ts.map +1 -0
- package/dist/src/tui/components/edit-task-input.js +20 -0
- package/dist/src/tui/components/edit-task-input.js.map +1 -0
- package/dist/src/tui/components/footer.d.ts +12 -0
- package/dist/src/tui/components/footer.d.ts.map +1 -0
- package/dist/src/tui/components/footer.js +41 -0
- package/dist/src/tui/components/footer.js.map +1 -0
- package/dist/src/tui/components/header.d.ts +8 -0
- package/dist/src/tui/components/header.d.ts.map +1 -0
- package/dist/src/tui/components/header.js +20 -0
- package/dist/src/tui/components/header.js.map +1 -0
- package/dist/src/tui/components/human-actions.d.ts +14 -0
- package/dist/src/tui/components/human-actions.d.ts.map +1 -0
- package/dist/src/tui/components/human-actions.js +43 -0
- package/dist/src/tui/components/human-actions.js.map +1 -0
- package/dist/src/tui/components/log-panel.d.ts +10 -0
- package/dist/src/tui/components/log-panel.d.ts.map +1 -0
- package/dist/src/tui/components/log-panel.js +38 -0
- package/dist/src/tui/components/log-panel.js.map +1 -0
- package/dist/src/tui/components/memory-viewer.d.ts +10 -0
- package/dist/src/tui/components/memory-viewer.d.ts.map +1 -0
- package/dist/src/tui/components/memory-viewer.js +44 -0
- package/dist/src/tui/components/memory-viewer.js.map +1 -0
- package/dist/src/tui/components/new-task-input.d.ts +9 -0
- package/dist/src/tui/components/new-task-input.d.ts.map +1 -0
- package/dist/src/tui/components/new-task-input.js +21 -0
- package/dist/src/tui/components/new-task-input.js.map +1 -0
- package/dist/src/tui/components/orchestrator-status.d.ts +9 -0
- package/dist/src/tui/components/orchestrator-status.d.ts.map +1 -0
- package/dist/src/tui/components/orchestrator-status.js +15 -0
- package/dist/src/tui/components/orchestrator-status.js.map +1 -0
- package/dist/src/tui/components/parallelize-banner.d.ts +8 -0
- package/dist/src/tui/components/parallelize-banner.d.ts.map +1 -0
- package/dist/src/tui/components/parallelize-banner.js +9 -0
- package/dist/src/tui/components/parallelize-banner.js.map +1 -0
- package/dist/src/tui/components/progress-bar.d.ts +9 -0
- package/dist/src/tui/components/progress-bar.d.ts.map +1 -0
- package/dist/src/tui/components/progress-bar.js +15 -0
- package/dist/src/tui/components/progress-bar.js.map +1 -0
- package/dist/src/tui/components/review-queue.d.ts +13 -0
- package/dist/src/tui/components/review-queue.d.ts.map +1 -0
- package/dist/src/tui/components/review-queue.js +78 -0
- package/dist/src/tui/components/review-queue.js.map +1 -0
- package/dist/src/tui/components/rich-header.d.ts +11 -0
- package/dist/src/tui/components/rich-header.d.ts.map +1 -0
- package/dist/src/tui/components/rich-header.js +25 -0
- package/dist/src/tui/components/rich-header.js.map +1 -0
- package/dist/src/tui/components/spinner.d.ts +7 -0
- package/dist/src/tui/components/spinner.d.ts.map +1 -0
- package/dist/src/tui/components/spinner.js +8 -0
- package/dist/src/tui/components/spinner.js.map +1 -0
- package/dist/src/tui/components/status-bar.d.ts +23 -0
- package/dist/src/tui/components/status-bar.d.ts.map +1 -0
- package/dist/src/tui/components/status-bar.js +28 -0
- package/dist/src/tui/components/status-bar.js.map +1 -0
- package/dist/src/tui/components/task-queue.d.ts +11 -0
- package/dist/src/tui/components/task-queue.d.ts.map +1 -0
- package/dist/src/tui/components/task-queue.js +30 -0
- package/dist/src/tui/components/task-queue.js.map +1 -0
- package/dist/src/tui/components/team-view.d.ts +13 -0
- package/dist/src/tui/components/team-view.d.ts.map +1 -0
- package/dist/src/tui/components/team-view.js +12 -0
- package/dist/src/tui/components/team-view.js.map +1 -0
- package/dist/src/tui/graph-renderer.d.ts +11 -0
- package/dist/src/tui/graph-renderer.d.ts.map +1 -0
- package/dist/src/tui/graph-renderer.js +296 -0
- package/dist/src/tui/graph-renderer.js.map +1 -0
- package/dist/src/tui/hooks/use-bell.d.ts +21 -0
- package/dist/src/tui/hooks/use-bell.d.ts.map +1 -0
- package/dist/src/tui/hooks/use-bell.js +38 -0
- package/dist/src/tui/hooks/use-bell.js.map +1 -0
- package/dist/src/tui/hooks/use-ci-status.d.ts +16 -0
- package/dist/src/tui/hooks/use-ci-status.d.ts.map +1 -0
- package/dist/src/tui/hooks/use-ci-status.js +97 -0
- package/dist/src/tui/hooks/use-ci-status.js.map +1 -0
- package/dist/src/tui/hooks/use-command-palette.d.ts +37 -0
- package/dist/src/tui/hooks/use-command-palette.d.ts.map +1 -0
- package/dist/src/tui/hooks/use-command-palette.js +108 -0
- package/dist/src/tui/hooks/use-command-palette.js.map +1 -0
- package/dist/src/tui/hooks/use-diff-view.d.ts +16 -0
- package/dist/src/tui/hooks/use-diff-view.d.ts.map +1 -0
- package/dist/src/tui/hooks/use-diff-view.js +75 -0
- package/dist/src/tui/hooks/use-diff-view.js.map +1 -0
- package/dist/src/tui/hooks/use-keyboard.d.ts +3 -0
- package/dist/src/tui/hooks/use-keyboard.d.ts.map +1 -0
- package/dist/src/tui/hooks/use-keyboard.js +70 -0
- package/dist/src/tui/hooks/use-keyboard.js.map +1 -0
- package/dist/src/tui/hooks/use-log-stream.d.ts +25 -0
- package/dist/src/tui/hooks/use-log-stream.d.ts.map +1 -0
- package/dist/src/tui/hooks/use-log-stream.js +83 -0
- package/dist/src/tui/hooks/use-log-stream.js.map +1 -0
- package/dist/src/tui/hooks/use-spinner.d.ts +3 -0
- package/dist/src/tui/hooks/use-spinner.d.ts.map +1 -0
- package/dist/src/tui/hooks/use-spinner.js +13 -0
- package/dist/src/tui/hooks/use-spinner.js.map +1 -0
- package/dist/src/tui/hooks/use-store.d.ts +33 -0
- package/dist/src/tui/hooks/use-store.d.ts.map +1 -0
- package/dist/src/tui/hooks/use-store.js +21 -0
- package/dist/src/tui/hooks/use-store.js.map +1 -0
- package/dist/src/tui/lib/diff-parser.d.ts +24 -0
- package/dist/src/tui/lib/diff-parser.d.ts.map +1 -0
- package/dist/src/tui/lib/diff-parser.js +115 -0
- package/dist/src/tui/lib/diff-parser.js.map +1 -0
- package/dist/src/tui/lib/palette-commands.d.ts +14 -0
- package/dist/src/tui/lib/palette-commands.d.ts.map +1 -0
- package/dist/src/tui/lib/palette-commands.js +101 -0
- package/dist/src/tui/lib/palette-commands.js.map +1 -0
- package/dist/src/tui/tui.d.ts +8 -0
- package/dist/src/tui/tui.d.ts.map +1 -0
- package/dist/src/tui/tui.js +8 -0
- package/dist/src/tui/tui.js.map +1 -0
- package/package.json +66 -0
- package/skills/api-design.md +84 -0
- package/skills/backend-typescript.md +76 -0
- package/skills/data-modeling.md +73 -0
- package/skills/devops-ci.md +82 -0
- package/skills/frontend-design.md +69 -0
- package/skills/observability.md +73 -0
- package/skills/react-nextjs.md +76 -0
- package/skills/refactoring.md +77 -0
- package/skills/security.md +75 -0
- package/skills/testing.md +69 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { NotificationConfig } from './verbo-md.js';
|
|
2
|
+
export type NotificationEventType = 'task_completed' | 'agent_blocked' | 'pr_created' | 'budget_alert' | 'pipeline_step_failed' | 'pipeline_completed' | 'pipeline_rolled_back';
|
|
3
|
+
export interface NotificationEvent {
|
|
4
|
+
type: NotificationEventType;
|
|
5
|
+
title: string;
|
|
6
|
+
message: string;
|
|
7
|
+
metadata?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export interface NotificationService {
|
|
10
|
+
send(event: NotificationEvent): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare function createNotificationService(config: NotificationConfig): NotificationService;
|
|
13
|
+
//# sourceMappingURL=notification-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-service.d.ts","sourceRoot":"","sources":["../../../src/core/notification-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIxD,MAAM,MAAM,qBAAqB,GAC7B,gBAAgB,GAChB,eAAe,GACf,YAAY,GACZ,cAAc,GACd,sBAAsB,GACtB,oBAAoB,GACpB,sBAAsB,CAAC;AAE3B,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AA0BD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,kBAAkB,GAAG,mBAAmB,CA+BzF"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// ---- Color palette per event type ----
|
|
2
|
+
const EVENT_COLORS = {
|
|
3
|
+
task_completed: 0x2ecc71, // green
|
|
4
|
+
agent_blocked: 0xe74c3c, // red
|
|
5
|
+
pr_created: 0x3498db, // blue
|
|
6
|
+
budget_alert: 0xe67e22, // orange
|
|
7
|
+
pipeline_step_failed: 0xe74c3c, // red
|
|
8
|
+
pipeline_completed: 0x2ecc71, // green
|
|
9
|
+
pipeline_rolled_back: 0x9b59b6, // purple
|
|
10
|
+
};
|
|
11
|
+
const EVENT_EMOJI = {
|
|
12
|
+
task_completed: '\u2705',
|
|
13
|
+
agent_blocked: '\ud83d\udea8',
|
|
14
|
+
pr_created: '\ud83d\udd17',
|
|
15
|
+
budget_alert: '\ud83d\udcb0',
|
|
16
|
+
pipeline_step_failed: '\u274c',
|
|
17
|
+
pipeline_completed: '\ud83c\udf89',
|
|
18
|
+
pipeline_rolled_back: '\u23ea',
|
|
19
|
+
};
|
|
20
|
+
// ---- Factory ----
|
|
21
|
+
export function createNotificationService(config) {
|
|
22
|
+
async function send(event) {
|
|
23
|
+
// Event filtering
|
|
24
|
+
if (config.events.length > 0 && !config.events.includes(event.type)) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Quiet hours check
|
|
28
|
+
if (config.quietHours && isQuietHour(config.quietHours)) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Dispatch to all configured webhooks concurrently; never throw
|
|
32
|
+
const dispatches = [];
|
|
33
|
+
if (config.slackWebhookUrl) {
|
|
34
|
+
dispatches.push(postJSON(config.slackWebhookUrl, buildSlackPayload(event)).catch(() => { }));
|
|
35
|
+
}
|
|
36
|
+
if (config.discordWebhookUrl) {
|
|
37
|
+
dispatches.push(postJSON(config.discordWebhookUrl, buildDiscordPayload(event)).catch(() => { }));
|
|
38
|
+
}
|
|
39
|
+
await Promise.all(dispatches);
|
|
40
|
+
}
|
|
41
|
+
return { send };
|
|
42
|
+
}
|
|
43
|
+
// ---- Slack Block Kit ----
|
|
44
|
+
function buildSlackPayload(event) {
|
|
45
|
+
const emoji = EVENT_EMOJI[event.type] ?? '\ud83d\udd14';
|
|
46
|
+
const blocks = [
|
|
47
|
+
{
|
|
48
|
+
type: 'header',
|
|
49
|
+
text: { type: 'plain_text', text: `${emoji} ${event.title}`, emoji: true },
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
type: 'section',
|
|
53
|
+
text: { type: 'mrkdwn', text: event.message },
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
// Metadata fields
|
|
57
|
+
if (event.metadata && Object.keys(event.metadata).length > 0) {
|
|
58
|
+
blocks.push({
|
|
59
|
+
type: 'section',
|
|
60
|
+
fields: Object.entries(event.metadata).map(([key, value]) => ({
|
|
61
|
+
type: 'mrkdwn',
|
|
62
|
+
text: `*${key}:*\n${value}`,
|
|
63
|
+
})),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
// Context footer with event type
|
|
67
|
+
blocks.push({
|
|
68
|
+
type: 'context',
|
|
69
|
+
elements: [
|
|
70
|
+
{ type: 'mrkdwn', text: `Event: \`${event.type}\` | Verbo Orchestra` },
|
|
71
|
+
],
|
|
72
|
+
});
|
|
73
|
+
return { blocks };
|
|
74
|
+
}
|
|
75
|
+
// ---- Discord Embeds ----
|
|
76
|
+
function buildDiscordPayload(event) {
|
|
77
|
+
const emoji = EVENT_EMOJI[event.type] ?? '\ud83d\udd14';
|
|
78
|
+
const color = EVENT_COLORS[event.type] ?? 0x95a5a6;
|
|
79
|
+
const embed = {
|
|
80
|
+
title: event.title,
|
|
81
|
+
description: `${emoji} ${event.message}`,
|
|
82
|
+
color,
|
|
83
|
+
footer: { text: `Event: ${event.type} | Verbo Orchestra` },
|
|
84
|
+
timestamp: new Date().toISOString(),
|
|
85
|
+
};
|
|
86
|
+
if (event.metadata && Object.keys(event.metadata).length > 0) {
|
|
87
|
+
embed.fields = Object.entries(event.metadata).map(([name, value]) => ({
|
|
88
|
+
name,
|
|
89
|
+
value,
|
|
90
|
+
inline: true,
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
return { embeds: [embed] };
|
|
94
|
+
}
|
|
95
|
+
// ---- Quiet hours ----
|
|
96
|
+
function isQuietHour(quietHours) {
|
|
97
|
+
const match = quietHours.match(/^(\d{1,2}):(\d{2})\s*-\s*(\d{1,2}):(\d{2})$/);
|
|
98
|
+
if (!match)
|
|
99
|
+
return false;
|
|
100
|
+
const startHour = parseInt(match[1], 10);
|
|
101
|
+
const startMin = parseInt(match[2], 10);
|
|
102
|
+
const endHour = parseInt(match[3], 10);
|
|
103
|
+
const endMin = parseInt(match[4], 10);
|
|
104
|
+
const now = new Date();
|
|
105
|
+
const currentMinutes = now.getUTCHours() * 60 + now.getUTCMinutes();
|
|
106
|
+
const startMinutes = startHour * 60 + startMin;
|
|
107
|
+
const endMinutes = endHour * 60 + endMin;
|
|
108
|
+
if (startMinutes <= endMinutes) {
|
|
109
|
+
// Same-day range: e.g. 09:00-17:00
|
|
110
|
+
return currentMinutes >= startMinutes && currentMinutes < endMinutes;
|
|
111
|
+
}
|
|
112
|
+
// Spans midnight: e.g. 22:00-06:00
|
|
113
|
+
return currentMinutes >= startMinutes || currentMinutes < endMinutes;
|
|
114
|
+
}
|
|
115
|
+
// ---- HTTP helper ----
|
|
116
|
+
async function postJSON(url, body) {
|
|
117
|
+
const response = await fetch(url, {
|
|
118
|
+
method: 'POST',
|
|
119
|
+
headers: { 'Content-Type': 'application/json' },
|
|
120
|
+
body: JSON.stringify(body),
|
|
121
|
+
});
|
|
122
|
+
if (!response.ok) {
|
|
123
|
+
throw new Error(`Webhook POST to ${url} failed: ${response.status}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=notification-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-service.js","sourceRoot":"","sources":["../../../src/core/notification-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { NotificationConfig } from './verbo-md.js';
|
|
2
|
+
export interface Notifications {
|
|
3
|
+
/**
|
|
4
|
+
* Send a notification for the given event.
|
|
5
|
+
* Emits a terminal bell and optionally dispatches to configured webhooks.
|
|
6
|
+
*/
|
|
7
|
+
send(event: string, message: string): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export declare function createNotifications(config?: NotificationConfig): Notifications;
|
|
10
|
+
//# sourceMappingURL=notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../../src/core/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIxD,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD;AAID,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,kBAAmC,GAAG,aAAa,CA4B9F"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// ---- Factory ----
|
|
2
|
+
export function createNotifications(config = { events: [] }) {
|
|
3
|
+
async function send(event, message) {
|
|
4
|
+
// Always emit terminal bell for local audible feedback
|
|
5
|
+
process.stderr.write('\x07');
|
|
6
|
+
// Only dispatch webhooks if this event is in the configured events list
|
|
7
|
+
// (empty events list = no webhook filtering, send all events)
|
|
8
|
+
const shouldDispatch = config.events.length === 0 || config.events.includes(event);
|
|
9
|
+
if (!shouldDispatch)
|
|
10
|
+
return;
|
|
11
|
+
// Dispatch to Slack webhook if configured
|
|
12
|
+
if (config.slackWebhookUrl) {
|
|
13
|
+
await sendWebhook(config.slackWebhookUrl, { text: `[verbo] ${event}: ${message}` }).catch(() => { });
|
|
14
|
+
}
|
|
15
|
+
// Dispatch to Discord webhook if configured
|
|
16
|
+
if (config.discordWebhookUrl) {
|
|
17
|
+
await sendWebhook(config.discordWebhookUrl, { content: `[verbo] ${event}: ${message}` }).catch(() => { });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return { send };
|
|
21
|
+
}
|
|
22
|
+
// ---- Helpers ----
|
|
23
|
+
async function sendWebhook(url, body) {
|
|
24
|
+
const response = await fetch(url, {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
headers: { 'Content-Type': 'application/json' },
|
|
27
|
+
body: JSON.stringify(body),
|
|
28
|
+
});
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
throw new Error(`Webhook POST to ${url} failed: ${response.status}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../../src/core/notifications.ts"],"names":[],"mappings":"AAYA,oBAAoB;AAEpB,MAAM,UAAU,mBAAmB,CAAC,SAA6B,EAAE,MAAM,EAAE,EAAE,EAAE;IAC7E,KAAK,UAAU,IAAI,CAAC,KAAa,EAAE,OAAe;QAChD,uDAAuD;QACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE7B,wEAAwE;QACxE,8DAA8D;QAC9D,MAAM,cAAc,GAClB,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE9D,IAAI,CAAC,cAAc;YAAE,OAAO;QAE5B,0CAA0C;QAC1C,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,MAAM,WAAW,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,WAAW,KAAK,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CACvF,GAAG,EAAE,GAA+D,CAAC,CACtE,CAAC;QACJ,CAAC;QAED,4CAA4C;QAC5C,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7B,MAAM,WAAW,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,WAAW,KAAK,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAC5F,GAAG,EAAE,GAAiB,CAAC,CACxB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC;AAED,oBAAoB;AAEpB,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,IAA4B;IAClE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,YAAY,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export type ReviewLevel = 'BLOCKING' | 'WARNING' | 'SUGGESTION';
|
|
2
|
+
export interface ReviewComment {
|
|
3
|
+
level: ReviewLevel;
|
|
4
|
+
message: string;
|
|
5
|
+
file?: string;
|
|
6
|
+
line?: number;
|
|
7
|
+
}
|
|
8
|
+
export type PushStatus = 'pending' | 'pushed' | 'blocked' | 'failed' | 'skipped';
|
|
9
|
+
export interface OrchestratorState {
|
|
10
|
+
id: string;
|
|
11
|
+
taskId: string;
|
|
12
|
+
taskTitle: string;
|
|
13
|
+
summary: string;
|
|
14
|
+
branch: string;
|
|
15
|
+
baseBranch: string;
|
|
16
|
+
worktreePath: string;
|
|
17
|
+
pushStatus: PushStatus;
|
|
18
|
+
reviewComments: ReviewComment[];
|
|
19
|
+
humanActionId?: string;
|
|
20
|
+
prUrl?: string;
|
|
21
|
+
pushedAt?: string;
|
|
22
|
+
createdAt: string;
|
|
23
|
+
updatedAt: string;
|
|
24
|
+
}
|
|
25
|
+
export interface CreateOrchestratorStateInput {
|
|
26
|
+
taskId: string;
|
|
27
|
+
taskTitle: string;
|
|
28
|
+
summary: string;
|
|
29
|
+
branch: string;
|
|
30
|
+
baseBranch: string;
|
|
31
|
+
worktreePath: string;
|
|
32
|
+
}
|
|
33
|
+
export interface OrchestratorStore {
|
|
34
|
+
create(input: CreateOrchestratorStateInput): OrchestratorState;
|
|
35
|
+
get(taskId: string): OrchestratorState | null;
|
|
36
|
+
update(taskId: string, changes: Partial<Omit<OrchestratorState, 'id' | 'taskId' | 'createdAt'>>): OrchestratorState | null;
|
|
37
|
+
delete(taskId: string): void;
|
|
38
|
+
listBlocked(): OrchestratorState[];
|
|
39
|
+
list(): OrchestratorState[];
|
|
40
|
+
}
|
|
41
|
+
export declare function createOrchestratorStore(): OrchestratorStore;
|
|
42
|
+
/** Returns the number of orchestrator states with pushStatus 'pushed' and pushedAt today (local date). */
|
|
43
|
+
export declare function countPrsToday(states: OrchestratorState[]): number;
|
|
44
|
+
//# sourceMappingURL=orchestrator-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-store.d.ts","sourceRoot":"","sources":["../../../src/core/orchestrator-store.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,KAAK,EAAE,4BAA4B,GAAG,iBAAiB,CAAC;IAC/D,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAAC;IAC9C,MAAM,CACJ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,QAAQ,GAAG,WAAW,CAAC,CAAC,GACvE,iBAAiB,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,IAAI,iBAAiB,EAAE,CAAC;IACnC,IAAI,IAAI,iBAAiB,EAAE,CAAC;CAC7B;AAID,wBAAgB,uBAAuB,IAAI,iBAAiB,CAsE3D;AAED,0GAA0G;AAC1G,wBAAgB,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAQjE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { ulid } from 'ulid';
|
|
2
|
+
// ---- Factory ----
|
|
3
|
+
export function createOrchestratorStore() {
|
|
4
|
+
const store = new Map();
|
|
5
|
+
function create(input) {
|
|
6
|
+
const now = new Date().toISOString();
|
|
7
|
+
const state = {
|
|
8
|
+
id: ulid(),
|
|
9
|
+
taskId: input.taskId,
|
|
10
|
+
taskTitle: input.taskTitle,
|
|
11
|
+
summary: input.summary,
|
|
12
|
+
branch: input.branch,
|
|
13
|
+
baseBranch: input.baseBranch,
|
|
14
|
+
worktreePath: input.worktreePath,
|
|
15
|
+
pushStatus: 'pending',
|
|
16
|
+
reviewComments: [],
|
|
17
|
+
createdAt: now,
|
|
18
|
+
updatedAt: now,
|
|
19
|
+
};
|
|
20
|
+
store.set(input.taskId, state);
|
|
21
|
+
return { ...state };
|
|
22
|
+
}
|
|
23
|
+
function get(taskId) {
|
|
24
|
+
const state = store.get(taskId);
|
|
25
|
+
return state ? { ...state } : null;
|
|
26
|
+
}
|
|
27
|
+
function update(taskId, changes) {
|
|
28
|
+
const existing = store.get(taskId);
|
|
29
|
+
if (!existing)
|
|
30
|
+
return null;
|
|
31
|
+
const now = new Date().toISOString();
|
|
32
|
+
const pushedAt = changes.pushStatus === 'pushed' && !existing.pushedAt ? now : undefined;
|
|
33
|
+
const updated = {
|
|
34
|
+
...existing,
|
|
35
|
+
...changes,
|
|
36
|
+
...(pushedAt ? { pushedAt } : {}),
|
|
37
|
+
updatedAt: now,
|
|
38
|
+
};
|
|
39
|
+
store.set(taskId, updated);
|
|
40
|
+
return { ...updated };
|
|
41
|
+
}
|
|
42
|
+
function deleteState(taskId) {
|
|
43
|
+
store.delete(taskId);
|
|
44
|
+
}
|
|
45
|
+
function listBlocked() {
|
|
46
|
+
return Array.from(store.values())
|
|
47
|
+
.filter((s) => s.pushStatus === 'blocked')
|
|
48
|
+
.map((s) => ({ ...s }));
|
|
49
|
+
}
|
|
50
|
+
function list() {
|
|
51
|
+
return Array.from(store.values()).map((s) => ({ ...s }));
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
create,
|
|
55
|
+
get,
|
|
56
|
+
update,
|
|
57
|
+
delete: deleteState,
|
|
58
|
+
listBlocked,
|
|
59
|
+
list,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** Returns the number of orchestrator states with pushStatus 'pushed' and pushedAt today (local date). */
|
|
63
|
+
export function countPrsToday(states) {
|
|
64
|
+
const today = new Date().toLocaleDateString();
|
|
65
|
+
return states.filter((s) => s.pushStatus === 'pushed' &&
|
|
66
|
+
s.pushedAt !== undefined &&
|
|
67
|
+
new Date(s.pushedAt).toLocaleDateString() === today).length;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=orchestrator-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-store.js","sourceRoot":"","sources":["../../../src/core/orchestrator-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Task, TaskStore } from './task-store.js';
|
|
2
|
+
export interface ParallelizerOptions {
|
|
3
|
+
maxAgents: number;
|
|
4
|
+
}
|
|
5
|
+
export interface ConflictInfo {
|
|
6
|
+
candidateTask: Task;
|
|
7
|
+
conflictingTask: Task;
|
|
8
|
+
file: string;
|
|
9
|
+
}
|
|
10
|
+
export interface MergeOrderSuggestion {
|
|
11
|
+
task: Task;
|
|
12
|
+
/** 1-based merge position (lower = merge first) */
|
|
13
|
+
position: number;
|
|
14
|
+
/** Human-readable reason for this position */
|
|
15
|
+
reason: string;
|
|
16
|
+
/** Task IDs that should be merged before this one */
|
|
17
|
+
mergeAfter: string[];
|
|
18
|
+
/** Number of done tasks whose files overlap with this task's files */
|
|
19
|
+
overlapCount: number;
|
|
20
|
+
}
|
|
21
|
+
export interface Parallelizer {
|
|
22
|
+
/** Compute a safe batch of tasks that can run concurrently. */
|
|
23
|
+
findSafeBatch(): Task[];
|
|
24
|
+
/**
|
|
25
|
+
* Find the first non-conflicting todo task starting from startIndex.
|
|
26
|
+
* Returns the task to launch plus any skip info, or null if all conflict.
|
|
27
|
+
*/
|
|
28
|
+
findLaunchable(todoTasks: Task[], startIndex: number): {
|
|
29
|
+
task: Task;
|
|
30
|
+
index: number;
|
|
31
|
+
skipped: ConflictInfo[];
|
|
32
|
+
} | null;
|
|
33
|
+
/**
|
|
34
|
+
* Suggest an optimal merge order for all done tasks based on
|
|
35
|
+
* dependency graph (topological sort) and file overlap (fewer overlaps first).
|
|
36
|
+
*/
|
|
37
|
+
suggestMergeOrder(): MergeOrderSuggestion[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Returns true if any file path in filesA overlaps with any file path in filesB.
|
|
41
|
+
* Overlap means identical paths or one is a glob pattern that matches the other.
|
|
42
|
+
*/
|
|
43
|
+
export declare function hasFileOverlap(filesA: string[], filesB: string[]): boolean;
|
|
44
|
+
export declare function createParallelizer(tasks: TaskStore, options: ParallelizerOptions, hotFiles?: {
|
|
45
|
+
isHot(filePath: string): boolean;
|
|
46
|
+
}): Parallelizer;
|
|
47
|
+
//# sourceMappingURL=parallelizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallelizer.d.ts","sourceRoot":"","sources":["../../../src/core/parallelizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIvD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,IAAI,CAAC;IACpB,eAAe,EAAE,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,IAAI,CAAC;IACX,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,aAAa,IAAI,IAAI,EAAE,CAAC;IAExB;;;OAGG;IACH,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG;QACrD,IAAI,EAAE,IAAI,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,YAAY,EAAE,CAAC;KACzB,GAAG,IAAI,CAAC;IAET;;;OAGG;IACH,iBAAiB,IAAI,oBAAoB,EAAE,CAAC;CAC7C;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAS1E;AAID,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,CAAC,EAAE;IAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAC9C,YAAY,CAwOd"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { minimatch } from 'minimatch';
|
|
2
|
+
// ---- Helper ----
|
|
3
|
+
/**
|
|
4
|
+
* Returns true if any file path in filesA overlaps with any file path in filesB.
|
|
5
|
+
* Overlap means identical paths or one is a glob pattern that matches the other.
|
|
6
|
+
*/
|
|
7
|
+
export function hasFileOverlap(filesA, filesB) {
|
|
8
|
+
for (const pathA of filesA) {
|
|
9
|
+
for (const pathB of filesB) {
|
|
10
|
+
if (pathA === pathB)
|
|
11
|
+
return true;
|
|
12
|
+
if (minimatch(pathA, pathB))
|
|
13
|
+
return true;
|
|
14
|
+
if (minimatch(pathB, pathA))
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
// ---- Factory ----
|
|
21
|
+
export function createParallelizer(tasks, options, hotFiles) {
|
|
22
|
+
function findSafeBatch() {
|
|
23
|
+
// Step 1: Get all tasks, separate active (in_progress) and candidates (todo)
|
|
24
|
+
const allTasks = tasks.list();
|
|
25
|
+
const activeTasks = allTasks.filter((t) => t.status === 'in_progress');
|
|
26
|
+
let candidates = allTasks.filter((t) => t.status === 'todo' && !t.title.startsWith('HUMANO:'));
|
|
27
|
+
// Step 2: Sort candidates by priority (p0 < p1 < p2 < p3 lexicographically)
|
|
28
|
+
candidates = candidates.sort((a, b) => a.priority.localeCompare(b.priority));
|
|
29
|
+
// Step 3: Filter out candidates with unmet dependencies
|
|
30
|
+
// (deps where dep.status !== 'done')
|
|
31
|
+
const taskById = new Map(allTasks.map((t) => [t.id, t]));
|
|
32
|
+
candidates = candidates.filter((candidate) => {
|
|
33
|
+
for (const depId of candidate.dependencies) {
|
|
34
|
+
const dep = taskById.get(depId);
|
|
35
|
+
if (!dep || dep.status !== 'done') {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
});
|
|
41
|
+
// Step 4: Collect all files from active tasks (already being worked on)
|
|
42
|
+
const activeFiles = activeTasks.flatMap((t) => t.filePaths);
|
|
43
|
+
// Step 5: Build the batch greedily in priority order
|
|
44
|
+
const batch = [];
|
|
45
|
+
const batchFiles = [];
|
|
46
|
+
for (const candidate of candidates) {
|
|
47
|
+
// Respect max agents limit
|
|
48
|
+
if (batch.length >= options.maxAgents)
|
|
49
|
+
break;
|
|
50
|
+
// Skip tasks with no declared filePaths — can't verify safety
|
|
51
|
+
if (candidate.filePaths.length === 0)
|
|
52
|
+
continue;
|
|
53
|
+
// Skip if file overlap with active tasks
|
|
54
|
+
if (activeFiles.length > 0 && hasFileOverlap(candidate.filePaths, activeFiles)) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// Skip if file overlap with other batch members
|
|
58
|
+
if (batchFiles.length > 0 && hasFileOverlap(candidate.filePaths, batchFiles)) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
// Skip if candidate touches a hot file that an active task also touches
|
|
62
|
+
if (hotFiles) {
|
|
63
|
+
const candidateHotFiles = candidate.filePaths.filter((f) => hotFiles.isHot(f));
|
|
64
|
+
if (candidateHotFiles.length > 0) {
|
|
65
|
+
const activeHotFiles = activeFiles.filter((f) => hotFiles.isHot(f));
|
|
66
|
+
if (hasFileOverlap(candidateHotFiles, activeHotFiles)) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Safe to add
|
|
72
|
+
batch.push(candidate);
|
|
73
|
+
batchFiles.push(...candidate.filePaths);
|
|
74
|
+
}
|
|
75
|
+
// Step 6: Return the batch
|
|
76
|
+
return batch;
|
|
77
|
+
}
|
|
78
|
+
function findLaunchable(todoTasks, startIndex) {
|
|
79
|
+
const allTasks = tasks.list();
|
|
80
|
+
const activeTasks = allTasks.filter((t) => t.status === 'in_progress');
|
|
81
|
+
const activeFiles = activeTasks.flatMap((t) => t.filePaths);
|
|
82
|
+
const skipped = [];
|
|
83
|
+
const clampedStart = Math.min(startIndex, todoTasks.length - 1);
|
|
84
|
+
for (let offset = 0; offset < todoTasks.length; offset++) {
|
|
85
|
+
const idx = (clampedStart + offset) % todoTasks.length;
|
|
86
|
+
const candidate = todoTasks[idx];
|
|
87
|
+
// Check for file overlap with active tasks
|
|
88
|
+
if (activeFiles.length > 0 && candidate.filePaths.length > 0) {
|
|
89
|
+
let foundConflict = null;
|
|
90
|
+
for (const activeTask of activeTasks) {
|
|
91
|
+
for (const candidateFile of candidate.filePaths) {
|
|
92
|
+
for (const activeFile of activeTask.filePaths) {
|
|
93
|
+
if (candidateFile === activeFile ||
|
|
94
|
+
minimatch(candidateFile, activeFile) ||
|
|
95
|
+
minimatch(activeFile, candidateFile)) {
|
|
96
|
+
foundConflict = {
|
|
97
|
+
candidateTask: candidate,
|
|
98
|
+
conflictingTask: activeTask,
|
|
99
|
+
file: candidateFile,
|
|
100
|
+
};
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (foundConflict)
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
if (foundConflict)
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
if (foundConflict) {
|
|
111
|
+
skipped.push(foundConflict);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// No conflict — this task is safe to launch
|
|
116
|
+
return { task: candidate, index: idx, skipped };
|
|
117
|
+
}
|
|
118
|
+
// All todo tasks conflict
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
function suggestMergeOrder() {
|
|
122
|
+
const allTasks = tasks.list();
|
|
123
|
+
const doneTasks = allTasks.filter((t) => t.status === 'done');
|
|
124
|
+
if (doneTasks.length === 0)
|
|
125
|
+
return [];
|
|
126
|
+
const doneIds = new Set(doneTasks.map((t) => t.id));
|
|
127
|
+
const taskById = new Map(doneTasks.map((t) => [t.id, t]));
|
|
128
|
+
// Build overlap counts between done tasks
|
|
129
|
+
const overlapCounts = new Map();
|
|
130
|
+
for (const t of doneTasks) {
|
|
131
|
+
let count = 0;
|
|
132
|
+
for (const other of doneTasks) {
|
|
133
|
+
if (other.id === t.id)
|
|
134
|
+
continue;
|
|
135
|
+
if (t.filePaths.length > 0 && other.filePaths.length > 0 &&
|
|
136
|
+
hasFileOverlap(t.filePaths, other.filePaths)) {
|
|
137
|
+
count++;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
overlapCounts.set(t.id, count);
|
|
141
|
+
}
|
|
142
|
+
// Topological sort (Kahn's algorithm) respecting only deps within done tasks
|
|
143
|
+
// Build in-degree map and adjacency list
|
|
144
|
+
const inDegree = new Map();
|
|
145
|
+
const dependents = new Map(); // depId -> [tasks that depend on it]
|
|
146
|
+
for (const t of doneTasks) {
|
|
147
|
+
if (!inDegree.has(t.id))
|
|
148
|
+
inDegree.set(t.id, 0);
|
|
149
|
+
if (!dependents.has(t.id))
|
|
150
|
+
dependents.set(t.id, []);
|
|
151
|
+
for (const depId of t.dependencies) {
|
|
152
|
+
if (doneIds.has(depId)) {
|
|
153
|
+
inDegree.set(t.id, (inDegree.get(t.id) ?? 0) + 1);
|
|
154
|
+
if (!dependents.has(depId))
|
|
155
|
+
dependents.set(depId, []);
|
|
156
|
+
dependents.get(depId).push(t.id);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Process in topological layers
|
|
161
|
+
const result = [];
|
|
162
|
+
const merged = new Set();
|
|
163
|
+
// Collect nodes with zero in-degree
|
|
164
|
+
let queue = doneTasks
|
|
165
|
+
.filter((t) => (inDegree.get(t.id) ?? 0) === 0)
|
|
166
|
+
.sort((a, b) => (overlapCounts.get(a.id) ?? 0) - (overlapCounts.get(b.id) ?? 0));
|
|
167
|
+
while (queue.length > 0) {
|
|
168
|
+
const nextQueue = [];
|
|
169
|
+
for (const task of queue) {
|
|
170
|
+
// Determine which done dependencies this task must merge after
|
|
171
|
+
const mergeAfter = task.dependencies.filter((depId) => doneIds.has(depId));
|
|
172
|
+
let reason;
|
|
173
|
+
if (mergeAfter.length > 0) {
|
|
174
|
+
const depTitles = mergeAfter
|
|
175
|
+
.map((id) => taskById.get(id)?.title ?? id)
|
|
176
|
+
.join(', ');
|
|
177
|
+
reason = `Depends on: ${depTitles}`;
|
|
178
|
+
}
|
|
179
|
+
else if ((overlapCounts.get(task.id) ?? 0) === 0) {
|
|
180
|
+
reason = 'No dependencies or file overlaps — safe to merge at any time';
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
reason = `${overlapCounts.get(task.id)} file overlap(s) with other done tasks`;
|
|
184
|
+
}
|
|
185
|
+
result.push({
|
|
186
|
+
task,
|
|
187
|
+
position: result.length + 1,
|
|
188
|
+
reason,
|
|
189
|
+
mergeAfter,
|
|
190
|
+
overlapCount: overlapCounts.get(task.id) ?? 0,
|
|
191
|
+
});
|
|
192
|
+
merged.add(task.id);
|
|
193
|
+
// Reduce in-degree of dependents
|
|
194
|
+
for (const depId of dependents.get(task.id) ?? []) {
|
|
195
|
+
const newDegree = (inDegree.get(depId) ?? 1) - 1;
|
|
196
|
+
inDegree.set(depId, newDegree);
|
|
197
|
+
if (newDegree === 0) {
|
|
198
|
+
const depTask = taskById.get(depId);
|
|
199
|
+
if (depTask)
|
|
200
|
+
nextQueue.push(depTask);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Sort next layer by overlap count (fewer overlaps first)
|
|
205
|
+
queue = nextQueue.sort((a, b) => (overlapCounts.get(a.id) ?? 0) - (overlapCounts.get(b.id) ?? 0));
|
|
206
|
+
}
|
|
207
|
+
// Handle any tasks not reached (e.g. dependency on a non-done task — still include them)
|
|
208
|
+
for (const t of doneTasks) {
|
|
209
|
+
if (!merged.has(t.id)) {
|
|
210
|
+
const mergeAfter = t.dependencies.filter((depId) => doneIds.has(depId));
|
|
211
|
+
result.push({
|
|
212
|
+
task: t,
|
|
213
|
+
position: result.length + 1,
|
|
214
|
+
reason: 'Has unresolved dependencies outside done tasks',
|
|
215
|
+
mergeAfter,
|
|
216
|
+
overlapCount: overlapCounts.get(t.id) ?? 0,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
return { findSafeBatch, findLaunchable, suggestMergeOrder };
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=parallelizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallelizer.js","sourceRoot":"","sources":["../../../src/core/parallelizer.ts"],"names":[],"mappings":"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"}
|