@jonit-dev/night-watch-cli 1.7.10 → 1.7.13
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 +1 -1
- package/dist/commands/dashboard/tab-config.d.ts.map +1 -1
- package/dist/commands/dashboard/tab-config.js +8 -1
- package/dist/commands/dashboard/tab-config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +3 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/review.d.ts +4 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +30 -0
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/run.d.ts +11 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +47 -7
- package/dist/commands/run.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +43 -3
- package/dist/server/index.js.map +1 -1
- package/dist/shared/types.d.ts +223 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +7 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/src/agents/soul-compiler.d.ts +11 -0
- package/dist/src/agents/soul-compiler.d.ts.map +1 -0
- package/dist/src/agents/soul-compiler.js +103 -0
- package/dist/src/agents/soul-compiler.js.map +1 -0
- package/dist/src/board/factory.d.ts +3 -0
- package/dist/src/board/factory.d.ts.map +1 -0
- package/dist/src/board/factory.js +10 -0
- package/dist/src/board/factory.js.map +1 -0
- package/dist/src/board/providers/github-graphql.d.ts +16 -0
- package/dist/src/board/providers/github-graphql.d.ts.map +1 -0
- package/dist/src/board/providers/github-graphql.js +43 -0
- package/dist/src/board/providers/github-graphql.js.map +1 -0
- package/dist/src/board/providers/github-projects.d.ts +51 -0
- package/dist/src/board/providers/github-projects.d.ts.map +1 -0
- package/dist/src/board/providers/github-projects.js +672 -0
- package/dist/src/board/providers/github-projects.js.map +1 -0
- package/dist/src/board/types.d.ts +60 -0
- package/dist/src/board/types.d.ts.map +1 -0
- package/dist/src/board/types.js +4 -0
- package/dist/src/board/types.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +80 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/board.d.ts +9 -0
- package/dist/src/commands/board.d.ts.map +1 -0
- package/dist/src/commands/board.js +294 -0
- package/dist/src/commands/board.js.map +1 -0
- package/dist/src/commands/cancel.d.ts +46 -0
- package/dist/src/commands/cancel.d.ts.map +1 -0
- package/dist/src/commands/cancel.js +241 -0
- package/dist/src/commands/cancel.js.map +1 -0
- package/dist/src/commands/dashboard/tab-actions.d.ts +10 -0
- package/dist/src/commands/dashboard/tab-actions.d.ts.map +1 -0
- package/dist/src/commands/dashboard/tab-actions.js +245 -0
- package/dist/src/commands/dashboard/tab-actions.js.map +1 -0
- package/dist/src/commands/dashboard/tab-config.d.ts +21 -0
- package/dist/src/commands/dashboard/tab-config.d.ts.map +1 -0
- package/dist/src/commands/dashboard/tab-config.js +829 -0
- package/dist/src/commands/dashboard/tab-config.js.map +1 -0
- package/dist/src/commands/dashboard/tab-logs.d.ts +10 -0
- package/dist/src/commands/dashboard/tab-logs.d.ts.map +1 -0
- package/dist/src/commands/dashboard/tab-logs.js +178 -0
- package/dist/src/commands/dashboard/tab-logs.js.map +1 -0
- package/dist/src/commands/dashboard/tab-schedules.d.ts +21 -0
- package/dist/src/commands/dashboard/tab-schedules.d.ts.map +1 -0
- package/dist/src/commands/dashboard/tab-schedules.js +304 -0
- package/dist/src/commands/dashboard/tab-schedules.js.map +1 -0
- package/dist/src/commands/dashboard/tab-status.d.ts +32 -0
- package/dist/src/commands/dashboard/tab-status.d.ts.map +1 -0
- package/dist/src/commands/dashboard/tab-status.js +421 -0
- package/dist/src/commands/dashboard/tab-status.js.map +1 -0
- package/dist/src/commands/dashboard/types.d.ts +43 -0
- package/dist/src/commands/dashboard/types.d.ts.map +1 -0
- package/dist/src/commands/dashboard/types.js +5 -0
- package/dist/src/commands/dashboard/types.js.map +1 -0
- package/dist/src/commands/dashboard.d.ts +11 -0
- package/dist/src/commands/dashboard.d.ts.map +1 -0
- package/dist/src/commands/dashboard.js +239 -0
- package/dist/src/commands/dashboard.js.map +1 -0
- package/dist/src/commands/doctor.d.ts +16 -0
- package/dist/src/commands/doctor.d.ts.map +1 -0
- package/dist/src/commands/doctor.js +202 -0
- package/dist/src/commands/doctor.js.map +1 -0
- package/dist/src/commands/history.d.ts +7 -0
- package/dist/src/commands/history.d.ts.map +1 -0
- package/dist/src/commands/history.js +56 -0
- package/dist/src/commands/history.js.map +1 -0
- package/dist/src/commands/init.d.ts +25 -0
- package/dist/src/commands/init.d.ts.map +1 -0
- package/dist/src/commands/init.js +543 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/install.d.ts +48 -0
- package/dist/src/commands/install.d.ts.map +1 -0
- package/dist/src/commands/install.js +303 -0
- package/dist/src/commands/install.js.map +1 -0
- package/dist/src/commands/logs.d.ts +15 -0
- package/dist/src/commands/logs.d.ts.map +1 -0
- package/dist/src/commands/logs.js +104 -0
- package/dist/src/commands/logs.js.map +1 -0
- package/dist/src/commands/prd-state.d.ts +12 -0
- package/dist/src/commands/prd-state.d.ts.map +1 -0
- package/dist/src/commands/prd-state.js +47 -0
- package/dist/src/commands/prd-state.js.map +1 -0
- package/dist/src/commands/prd.d.ts +24 -0
- package/dist/src/commands/prd.d.ts.map +1 -0
- package/dist/src/commands/prd.js +283 -0
- package/dist/src/commands/prd.js.map +1 -0
- package/dist/src/commands/prds.d.ts +13 -0
- package/dist/src/commands/prds.d.ts.map +1 -0
- package/dist/src/commands/prds.js +196 -0
- package/dist/src/commands/prds.js.map +1 -0
- package/dist/src/commands/prs.d.ts +14 -0
- package/dist/src/commands/prs.d.ts.map +1 -0
- package/dist/src/commands/prs.js +106 -0
- package/dist/src/commands/prs.js.map +1 -0
- package/dist/src/commands/qa.d.ts +30 -0
- package/dist/src/commands/qa.d.ts.map +1 -0
- package/dist/src/commands/qa.js +159 -0
- package/dist/src/commands/qa.js.map +1 -0
- package/dist/src/commands/retry.d.ts +9 -0
- package/dist/src/commands/retry.d.ts.map +1 -0
- package/dist/src/commands/retry.js +72 -0
- package/dist/src/commands/retry.js.map +1 -0
- package/dist/src/commands/review.d.ts +35 -0
- package/dist/src/commands/review.d.ts.map +1 -0
- package/dist/src/commands/review.js +252 -0
- package/dist/src/commands/review.js.map +1 -0
- package/dist/src/commands/run.d.ts +61 -0
- package/dist/src/commands/run.d.ts.map +1 -0
- package/dist/src/commands/run.js +364 -0
- package/dist/src/commands/run.js.map +1 -0
- package/dist/src/commands/serve.d.ts +7 -0
- package/dist/src/commands/serve.d.ts.map +1 -0
- package/dist/src/commands/serve.js +27 -0
- package/dist/src/commands/serve.js.map +1 -0
- package/dist/src/commands/slice.d.ts +26 -0
- package/dist/src/commands/slice.d.ts.map +1 -0
- package/dist/src/commands/slice.js +175 -0
- package/dist/src/commands/slice.js.map +1 -0
- package/dist/src/commands/state.d.ts +8 -0
- package/dist/src/commands/state.d.ts.map +1 -0
- package/dist/src/commands/state.js +56 -0
- package/dist/src/commands/state.js.map +1 -0
- package/dist/src/commands/status.d.ts +14 -0
- package/dist/src/commands/status.d.ts.map +1 -0
- package/dist/src/commands/status.js +147 -0
- package/dist/src/commands/status.js.map +1 -0
- package/dist/src/commands/uninstall.d.ts +25 -0
- package/dist/src/commands/uninstall.d.ts.map +1 -0
- package/dist/src/commands/uninstall.js +141 -0
- package/dist/src/commands/uninstall.js.map +1 -0
- package/dist/src/commands/update.d.ts +21 -0
- package/dist/src/commands/update.d.ts.map +1 -0
- package/dist/src/commands/update.js +87 -0
- package/dist/src/commands/update.js.map +1 -0
- package/dist/src/config.d.ts +23 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +629 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/constants.d.ts +60 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +118 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/server/index.d.ts +23 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +1645 -0
- package/dist/src/server/index.js.map +1 -0
- package/dist/src/slack/channel-manager.d.ts +32 -0
- package/dist/src/slack/channel-manager.d.ts.map +1 -0
- package/dist/src/slack/channel-manager.js +128 -0
- package/dist/src/slack/channel-manager.js.map +1 -0
- package/dist/src/slack/client.d.ts +63 -0
- package/dist/src/slack/client.d.ts.map +1 -0
- package/dist/src/slack/client.js +151 -0
- package/dist/src/slack/client.js.map +1 -0
- package/dist/src/slack/deliberation.d.ts +45 -0
- package/dist/src/slack/deliberation.d.ts.map +1 -0
- package/dist/src/slack/deliberation.js +539 -0
- package/dist/src/slack/deliberation.js.map +1 -0
- package/dist/src/slack/index.d.ts +6 -0
- package/dist/src/slack/index.d.ts.map +1 -0
- package/dist/src/slack/index.js +5 -0
- package/dist/src/slack/index.js.map +1 -0
- package/dist/src/slack/interaction-listener.d.ts +53 -0
- package/dist/src/slack/interaction-listener.d.ts.map +1 -0
- package/dist/src/slack/interaction-listener.js +253 -0
- package/dist/src/slack/interaction-listener.js.map +1 -0
- package/dist/src/storage/json-state-migrator.d.ts +24 -0
- package/dist/src/storage/json-state-migrator.d.ts.map +1 -0
- package/dist/src/storage/json-state-migrator.js +197 -0
- package/dist/src/storage/json-state-migrator.js.map +1 -0
- package/dist/src/storage/repositories/index.d.ts +25 -0
- package/dist/src/storage/repositories/index.d.ts.map +1 -0
- package/dist/src/storage/repositories/index.js +43 -0
- package/dist/src/storage/repositories/index.js.map +1 -0
- package/dist/src/storage/repositories/interfaces.d.ts +59 -0
- package/dist/src/storage/repositories/interfaces.d.ts.map +1 -0
- package/dist/src/storage/repositories/interfaces.js +6 -0
- package/dist/src/storage/repositories/interfaces.js.map +1 -0
- package/dist/src/storage/repositories/sqlite/agent-persona-repository.d.ts +27 -0
- package/dist/src/storage/repositories/sqlite/agent-persona-repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/sqlite/agent-persona-repository.js +569 -0
- package/dist/src/storage/repositories/sqlite/agent-persona-repository.js.map +1 -0
- package/dist/src/storage/repositories/sqlite/execution-history-repository.d.ts +21 -0
- package/dist/src/storage/repositories/sqlite/execution-history-repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/sqlite/execution-history-repository.js +94 -0
- package/dist/src/storage/repositories/sqlite/execution-history-repository.js.map +1 -0
- package/dist/src/storage/repositories/sqlite/prd-state-repository.d.ts +17 -0
- package/dist/src/storage/repositories/sqlite/prd-state-repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/sqlite/prd-state-repository.js +74 -0
- package/dist/src/storage/repositories/sqlite/prd-state-repository.js.map +1 -0
- package/dist/src/storage/repositories/sqlite/project-registry-repository.d.ts +17 -0
- package/dist/src/storage/repositories/sqlite/project-registry-repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/sqlite/project-registry-repository.js +43 -0
- package/dist/src/storage/repositories/sqlite/project-registry-repository.js.map +1 -0
- package/dist/src/storage/repositories/sqlite/roadmap-state-repository.d.ts +14 -0
- package/dist/src/storage/repositories/sqlite/roadmap-state-repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/sqlite/roadmap-state-repository.js +47 -0
- package/dist/src/storage/repositories/sqlite/roadmap-state-repository.js.map +1 -0
- package/dist/src/storage/repositories/sqlite/slack-discussion-repository.d.ts +20 -0
- package/dist/src/storage/repositories/sqlite/slack-discussion-repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/sqlite/slack-discussion-repository.js +88 -0
- package/dist/src/storage/repositories/sqlite/slack-discussion-repository.js.map +1 -0
- package/dist/src/storage/sqlite/client.d.ts +23 -0
- package/dist/src/storage/sqlite/client.d.ts.map +1 -0
- package/dist/src/storage/sqlite/client.js +47 -0
- package/dist/src/storage/sqlite/client.js.map +1 -0
- package/dist/src/storage/sqlite/migrations.d.ts +11 -0
- package/dist/src/storage/sqlite/migrations.d.ts.map +1 -0
- package/dist/src/storage/sqlite/migrations.js +94 -0
- package/dist/src/storage/sqlite/migrations.js.map +1 -0
- package/dist/src/templates/prd-template.d.ts +11 -0
- package/dist/src/templates/prd-template.d.ts.map +1 -0
- package/dist/src/templates/prd-template.js +166 -0
- package/dist/src/templates/prd-template.js.map +1 -0
- package/dist/src/templates/slicer-prompt.d.ts +54 -0
- package/dist/src/templates/slicer-prompt.d.ts.map +1 -0
- package/dist/src/templates/slicer-prompt.js +163 -0
- package/dist/src/templates/slicer-prompt.js.map +1 -0
- package/dist/src/types.d.ts +127 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +5 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/checks.d.ts +55 -0
- package/dist/src/utils/checks.d.ts.map +1 -0
- package/dist/src/utils/checks.js +246 -0
- package/dist/src/utils/checks.js.map +1 -0
- package/dist/src/utils/config-writer.d.ts +16 -0
- package/dist/src/utils/config-writer.d.ts.map +1 -0
- package/dist/src/utils/config-writer.js +45 -0
- package/dist/src/utils/config-writer.js.map +1 -0
- package/dist/src/utils/crontab.d.ts +62 -0
- package/dist/src/utils/crontab.d.ts.map +1 -0
- package/dist/src/utils/crontab.js +168 -0
- package/dist/src/utils/crontab.js.map +1 -0
- package/dist/src/utils/execution-history.d.ts +54 -0
- package/dist/src/utils/execution-history.d.ts.map +1 -0
- package/dist/src/utils/execution-history.js +80 -0
- package/dist/src/utils/execution-history.js.map +1 -0
- package/dist/src/utils/github.d.ts +40 -0
- package/dist/src/utils/github.d.ts.map +1 -0
- package/dist/src/utils/github.js +126 -0
- package/dist/src/utils/github.js.map +1 -0
- package/dist/src/utils/notify.d.ts +63 -0
- package/dist/src/utils/notify.d.ts.map +1 -0
- package/dist/src/utils/notify.js +389 -0
- package/dist/src/utils/notify.js.map +1 -0
- package/dist/src/utils/prd-states.d.ts +16 -0
- package/dist/src/utils/prd-states.d.ts.map +1 -0
- package/dist/src/utils/prd-states.js +28 -0
- package/dist/src/utils/prd-states.js.map +1 -0
- package/dist/src/utils/registry.d.ts +45 -0
- package/dist/src/utils/registry.d.ts.map +1 -0
- package/dist/src/utils/registry.js +86 -0
- package/dist/src/utils/registry.js.map +1 -0
- package/dist/src/utils/roadmap-parser.d.ts +45 -0
- package/dist/src/utils/roadmap-parser.d.ts.map +1 -0
- package/dist/src/utils/roadmap-parser.js +136 -0
- package/dist/src/utils/roadmap-parser.js.map +1 -0
- package/dist/src/utils/roadmap-scanner.d.ts +92 -0
- package/dist/src/utils/roadmap-scanner.d.ts.map +1 -0
- package/dist/src/utils/roadmap-scanner.js +349 -0
- package/dist/src/utils/roadmap-scanner.js.map +1 -0
- package/dist/src/utils/roadmap-state.d.ts +90 -0
- package/dist/src/utils/roadmap-state.d.ts.map +1 -0
- package/dist/src/utils/roadmap-state.js +154 -0
- package/dist/src/utils/roadmap-state.js.map +1 -0
- package/dist/src/utils/script-result.d.ts +12 -0
- package/dist/src/utils/script-result.d.ts.map +1 -0
- package/dist/src/utils/script-result.js +46 -0
- package/dist/src/utils/script-result.js.map +1 -0
- package/dist/src/utils/shell.d.ts +27 -0
- package/dist/src/utils/shell.d.ts.map +1 -0
- package/dist/src/utils/shell.js +64 -0
- package/dist/src/utils/shell.js.map +1 -0
- package/dist/src/utils/status-data.d.ts +148 -0
- package/dist/src/utils/status-data.d.ts.map +1 -0
- package/dist/src/utils/status-data.js +593 -0
- package/dist/src/utils/status-data.js.map +1 -0
- package/dist/src/utils/ui.d.ts +55 -0
- package/dist/src/utils/ui.d.ts.map +1 -0
- package/dist/src/utils/ui.js +121 -0
- package/dist/src/utils/ui.js.map +1 -0
- package/package.json +3 -1
- package/scripts/night-watch-cron.sh +7 -0
- package/scripts/night-watch-helpers.sh +33 -4
- package/scripts/night-watch-pr-reviewer-cron.sh +11 -3
- package/web/dist/assets/index-BtxQU4oX.css +1 -0
- package/web/dist/assets/index-CzAWcldp.js +473 -0
- package/web/dist/index.html +2 -2
- package/web/dist/assets/index-BPW-7_1C.js +0 -380
- package/web/dist/assets/index-DVqjjJEO.css +0 -1
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deliberation Engine for Night Watch.
|
|
3
|
+
* Orchestrates multi-agent Slack discussions when trigger events occur.
|
|
4
|
+
* Agents discuss in threads, reach consensus, and drive PR actions.
|
|
5
|
+
*/
|
|
6
|
+
import { compileSoul } from "../agents/soul-compiler.js";
|
|
7
|
+
import { getRepositories } from "../storage/repositories/index.js";
|
|
8
|
+
const MAX_ROUNDS = 3;
|
|
9
|
+
const MESSAGE_DELAY_MS = 1500; // Rate limit: 1.5s between posts
|
|
10
|
+
const DISCUSSION_RESUME_DELAY_MS = 60_000;
|
|
11
|
+
const DISCUSSION_REPLAY_GUARD_MS = 30 * 60_000;
|
|
12
|
+
const inFlightDiscussionStarts = new Map();
|
|
13
|
+
function discussionStartKey(trigger) {
|
|
14
|
+
return `${trigger.projectPath}:${trigger.type}:${trigger.ref}`;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Wait for the specified milliseconds
|
|
18
|
+
*/
|
|
19
|
+
function sleep(ms) {
|
|
20
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Determine which Slack channel to use for a trigger type
|
|
24
|
+
*/
|
|
25
|
+
function getChannelForTrigger(trigger, config) {
|
|
26
|
+
const slack = config.slack;
|
|
27
|
+
if (!slack)
|
|
28
|
+
return '';
|
|
29
|
+
// Use explicitly provided channelId if given (e.g., for project-specific channels)
|
|
30
|
+
if (trigger.channelId)
|
|
31
|
+
return trigger.channelId;
|
|
32
|
+
switch (trigger.type) {
|
|
33
|
+
case 'pr_review':
|
|
34
|
+
return slack.channels.prs;
|
|
35
|
+
case 'build_failure':
|
|
36
|
+
return slack.channels.incidents;
|
|
37
|
+
case 'prd_kickoff':
|
|
38
|
+
return slack.channels.eng; // Callers should populate trigger.channelId with proj channel
|
|
39
|
+
default:
|
|
40
|
+
return slack.channels.eng;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Find a persona by explicit name first, then by role keyword.
|
|
45
|
+
*/
|
|
46
|
+
function findPersona(personas, names, roleKeywords) {
|
|
47
|
+
const byName = personas.find((p) => names.some((name) => p.name.toLowerCase() === name.toLowerCase()));
|
|
48
|
+
if (byName)
|
|
49
|
+
return byName;
|
|
50
|
+
return (personas.find((p) => {
|
|
51
|
+
const role = p.role.toLowerCase();
|
|
52
|
+
return roleKeywords.some((keyword) => role.includes(keyword.toLowerCase()));
|
|
53
|
+
}) ?? null);
|
|
54
|
+
}
|
|
55
|
+
function findDev(personas) {
|
|
56
|
+
return findPersona(personas, ["Dev"], ["implementer", "executor", "developer"]);
|
|
57
|
+
}
|
|
58
|
+
function findCarlos(personas) {
|
|
59
|
+
return findPersona(personas, ["Carlos"], ["tech lead", "architect", "lead"]);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Determine which personas should participate based on trigger type.
|
|
63
|
+
* Uses role-based fallback so renamed personas still participate.
|
|
64
|
+
*/
|
|
65
|
+
function getParticipatingPersonas(triggerType, personas) {
|
|
66
|
+
const dev = findDev(personas);
|
|
67
|
+
const carlos = findCarlos(personas);
|
|
68
|
+
const maya = findPersona(personas, ["Maya"], ["security reviewer", "security"]);
|
|
69
|
+
const priya = findPersona(personas, ["Priya"], ["qa", "quality assurance", "test"]);
|
|
70
|
+
const set = new Map();
|
|
71
|
+
const add = (persona) => {
|
|
72
|
+
if (persona)
|
|
73
|
+
set.set(persona.id, persona);
|
|
74
|
+
};
|
|
75
|
+
switch (triggerType) {
|
|
76
|
+
case 'pr_review':
|
|
77
|
+
add(dev);
|
|
78
|
+
add(carlos);
|
|
79
|
+
add(maya);
|
|
80
|
+
add(priya);
|
|
81
|
+
break;
|
|
82
|
+
case 'build_failure':
|
|
83
|
+
add(dev);
|
|
84
|
+
add(carlos);
|
|
85
|
+
break;
|
|
86
|
+
case 'prd_kickoff':
|
|
87
|
+
add(dev);
|
|
88
|
+
add(carlos);
|
|
89
|
+
break;
|
|
90
|
+
default:
|
|
91
|
+
add(carlos);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
if (set.size === 0 && personas[0]) {
|
|
95
|
+
set.set(personas[0].id, personas[0]);
|
|
96
|
+
}
|
|
97
|
+
return Array.from(set.values());
|
|
98
|
+
}
|
|
99
|
+
function joinBaseUrl(baseUrl, route) {
|
|
100
|
+
return `${baseUrl.replace(/\/+$/, '')}${route}`;
|
|
101
|
+
}
|
|
102
|
+
function resolveGlobalAIConfig(config) {
|
|
103
|
+
const globalEnv = config.providerEnv ?? {};
|
|
104
|
+
if (config.provider === 'claude') {
|
|
105
|
+
return {
|
|
106
|
+
provider: 'anthropic',
|
|
107
|
+
model: config.claudeModel === 'opus' ? 'claude-opus-4-6' : 'claude-sonnet-4-6',
|
|
108
|
+
baseUrl: globalEnv.ANTHROPIC_BASE_URL ?? process.env.ANTHROPIC_BASE_URL ?? 'https://api.anthropic.com',
|
|
109
|
+
envVars: globalEnv,
|
|
110
|
+
maxTokens: 256,
|
|
111
|
+
temperature: 0.8,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
provider: 'openai',
|
|
116
|
+
model: globalEnv.OPENAI_MODEL ?? process.env.OPENAI_MODEL ?? 'gpt-4o',
|
|
117
|
+
baseUrl: globalEnv.OPENAI_BASE_URL ?? process.env.OPENAI_BASE_URL ?? 'https://api.openai.com',
|
|
118
|
+
envVars: globalEnv,
|
|
119
|
+
maxTokens: 256,
|
|
120
|
+
temperature: 0.8,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function resolvePersonaAIConfig(persona, config) {
|
|
124
|
+
const modelConfig = persona.modelConfig;
|
|
125
|
+
if (!modelConfig) {
|
|
126
|
+
return resolveGlobalAIConfig(config);
|
|
127
|
+
}
|
|
128
|
+
const globalEnv = config.providerEnv ?? {};
|
|
129
|
+
const envVars = { ...globalEnv, ...(modelConfig.envVars ?? {}) };
|
|
130
|
+
const isAnthropic = modelConfig.provider === 'anthropic';
|
|
131
|
+
return {
|
|
132
|
+
provider: isAnthropic ? 'anthropic' : 'openai',
|
|
133
|
+
model: modelConfig.model,
|
|
134
|
+
baseUrl: isAnthropic
|
|
135
|
+
? modelConfig.baseUrl ?? globalEnv.ANTHROPIC_BASE_URL ?? process.env.ANTHROPIC_BASE_URL ?? 'https://api.anthropic.com'
|
|
136
|
+
: modelConfig.baseUrl ?? globalEnv.OPENAI_BASE_URL ?? process.env.OPENAI_BASE_URL ?? 'https://api.openai.com',
|
|
137
|
+
envVars,
|
|
138
|
+
maxTokens: modelConfig.maxTokens ?? 256,
|
|
139
|
+
temperature: modelConfig.temperature ?? 0.8,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Generate the opening message text for a discussion
|
|
144
|
+
*/
|
|
145
|
+
function buildOpeningMessage(trigger) {
|
|
146
|
+
switch (trigger.type) {
|
|
147
|
+
case 'pr_review':
|
|
148
|
+
return `Just opened a PR — ${trigger.ref}${trigger.prUrl ? ` ${trigger.prUrl}` : ''}. Ready for review. 🔨`;
|
|
149
|
+
case 'build_failure':
|
|
150
|
+
return `Build failure on ${trigger.ref}. Looking into it now 🔍\n\n${trigger.context.slice(0, 500)}`;
|
|
151
|
+
case 'prd_kickoff':
|
|
152
|
+
return `Picking up PRD: ${trigger.ref}. Starting implementation. 🚀`;
|
|
153
|
+
default:
|
|
154
|
+
return trigger.context.slice(0, 500);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Build the contribution prompt for an agent's AI call.
|
|
159
|
+
* This is what gets sent to the AI provider to generate the agent's message.
|
|
160
|
+
*/
|
|
161
|
+
function buildContributionPrompt(persona, trigger, threadHistory, round) {
|
|
162
|
+
return `You are ${persona.name}, ${persona.role}, participating in a Slack thread with your team.
|
|
163
|
+
|
|
164
|
+
## Thread Context
|
|
165
|
+
Trigger: ${trigger.type} — ${trigger.ref}
|
|
166
|
+
Round: ${round} of ${MAX_ROUNDS}
|
|
167
|
+
|
|
168
|
+
## Context
|
|
169
|
+
${trigger.context.slice(0, 2000)}
|
|
170
|
+
|
|
171
|
+
## Thread So Far
|
|
172
|
+
${threadHistory || '(No messages yet)'}
|
|
173
|
+
|
|
174
|
+
## Your Task
|
|
175
|
+
Review the above from your specific expertise angle. Post a SHORT Slack message (2-3 sentences max).
|
|
176
|
+
- This is Slack chat, not a document. Be concise.
|
|
177
|
+
- Speak only to your domain — don't repeat what others said.
|
|
178
|
+
- Use your natural emoji style.
|
|
179
|
+
- If everything looks fine from your angle, just say so briefly.
|
|
180
|
+
- If you have a concern, state it clearly with a specific fix suggestion.
|
|
181
|
+
- If you have no concerns and others seem satisfied, you can just react positively.
|
|
182
|
+
|
|
183
|
+
Write ONLY your message, nothing else. Do not include your name or any prefix.`;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Call the AI provider to generate an agent contribution.
|
|
187
|
+
* Uses the persona's model config or falls back to global config.
|
|
188
|
+
* Returns the generated text.
|
|
189
|
+
*/
|
|
190
|
+
async function callAIForContribution(persona, config, contributionPrompt) {
|
|
191
|
+
const soulPrompt = compileSoul(persona);
|
|
192
|
+
const resolved = resolvePersonaAIConfig(persona, config);
|
|
193
|
+
if (resolved.provider === 'anthropic') {
|
|
194
|
+
const apiKey = resolved.envVars['ANTHROPIC_API_KEY'] ?? process.env.ANTHROPIC_API_KEY ?? '';
|
|
195
|
+
const response = await fetch(joinBaseUrl(resolved.baseUrl, '/v1/messages'), {
|
|
196
|
+
method: 'POST',
|
|
197
|
+
headers: {
|
|
198
|
+
'Content-Type': 'application/json',
|
|
199
|
+
'x-api-key': apiKey,
|
|
200
|
+
'anthropic-version': '2023-06-01',
|
|
201
|
+
},
|
|
202
|
+
body: JSON.stringify({
|
|
203
|
+
model: resolved.model,
|
|
204
|
+
max_tokens: resolved.maxTokens,
|
|
205
|
+
system: soulPrompt,
|
|
206
|
+
messages: [{ role: 'user', content: contributionPrompt }],
|
|
207
|
+
}),
|
|
208
|
+
});
|
|
209
|
+
if (!response.ok) {
|
|
210
|
+
const error = await response.text();
|
|
211
|
+
throw new Error(`Anthropic API error: ${response.status} ${error}`);
|
|
212
|
+
}
|
|
213
|
+
const data = await response.json();
|
|
214
|
+
return data.content[0]?.text?.trim() ?? '';
|
|
215
|
+
}
|
|
216
|
+
else if (resolved.provider === 'openai') {
|
|
217
|
+
const apiKey = resolved.envVars['OPENAI_API_KEY'] ?? process.env.OPENAI_API_KEY ?? '';
|
|
218
|
+
const response = await fetch(joinBaseUrl(resolved.baseUrl, '/v1/chat/completions'), {
|
|
219
|
+
method: 'POST',
|
|
220
|
+
headers: {
|
|
221
|
+
'Content-Type': 'application/json',
|
|
222
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
223
|
+
},
|
|
224
|
+
body: JSON.stringify({
|
|
225
|
+
model: resolved.model,
|
|
226
|
+
max_tokens: resolved.maxTokens,
|
|
227
|
+
temperature: resolved.temperature,
|
|
228
|
+
messages: [
|
|
229
|
+
{ role: 'system', content: soulPrompt },
|
|
230
|
+
{ role: 'user', content: contributionPrompt },
|
|
231
|
+
],
|
|
232
|
+
}),
|
|
233
|
+
});
|
|
234
|
+
if (!response.ok) {
|
|
235
|
+
const error = await response.text();
|
|
236
|
+
throw new Error(`OpenAI API error: ${response.status} ${error}`);
|
|
237
|
+
}
|
|
238
|
+
const data = await response.json();
|
|
239
|
+
return data.choices[0]?.message?.content?.trim() ?? '';
|
|
240
|
+
}
|
|
241
|
+
return `[${persona.name}: No AI provider configured]`;
|
|
242
|
+
}
|
|
243
|
+
export class DeliberationEngine {
|
|
244
|
+
_slackClient;
|
|
245
|
+
_config;
|
|
246
|
+
_humanResumeTimers = new Map();
|
|
247
|
+
constructor(slackClient, config) {
|
|
248
|
+
this._slackClient = slackClient;
|
|
249
|
+
this._config = config;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Start a new discussion thread for a trigger event.
|
|
253
|
+
* Posts the opening message and kicks off the first round of contributions.
|
|
254
|
+
*/
|
|
255
|
+
async startDiscussion(trigger) {
|
|
256
|
+
const key = discussionStartKey(trigger);
|
|
257
|
+
const existingInFlight = inFlightDiscussionStarts.get(key);
|
|
258
|
+
if (existingInFlight) {
|
|
259
|
+
return existingInFlight;
|
|
260
|
+
}
|
|
261
|
+
const startPromise = this._startDiscussionInternal(trigger);
|
|
262
|
+
inFlightDiscussionStarts.set(key, startPromise);
|
|
263
|
+
try {
|
|
264
|
+
return await startPromise;
|
|
265
|
+
}
|
|
266
|
+
finally {
|
|
267
|
+
if (inFlightDiscussionStarts.get(key) === startPromise) {
|
|
268
|
+
inFlightDiscussionStarts.delete(key);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
async _startDiscussionInternal(trigger) {
|
|
273
|
+
const repos = getRepositories();
|
|
274
|
+
const latest = repos
|
|
275
|
+
.slackDiscussion
|
|
276
|
+
.getLatestByTrigger(trigger.projectPath, trigger.type, trigger.ref);
|
|
277
|
+
if (latest) {
|
|
278
|
+
if (latest.status === 'active') {
|
|
279
|
+
return latest;
|
|
280
|
+
}
|
|
281
|
+
if (Date.now() - latest.updatedAt < DISCUSSION_REPLAY_GUARD_MS) {
|
|
282
|
+
return latest;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const personas = repos.agentPersona.getActive();
|
|
286
|
+
const participants = getParticipatingPersonas(trigger.type, personas);
|
|
287
|
+
// Resolve project channel for prd_kickoff
|
|
288
|
+
const resolvedTrigger = { ...trigger };
|
|
289
|
+
if (trigger.type === 'prd_kickoff' && !trigger.channelId) {
|
|
290
|
+
const projects = repos.projectRegistry.getAll();
|
|
291
|
+
const project = projects.find(p => p.path === trigger.projectPath);
|
|
292
|
+
if (project?.slackChannelId) {
|
|
293
|
+
resolvedTrigger.channelId = project.slackChannelId;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
const channel = getChannelForTrigger(resolvedTrigger, this._config);
|
|
297
|
+
if (!channel) {
|
|
298
|
+
throw new Error(`No Slack channel configured for trigger type: ${trigger.type}`);
|
|
299
|
+
}
|
|
300
|
+
// Find the dev persona to open the thread
|
|
301
|
+
const devPersona = findDev(participants) ?? participants[0];
|
|
302
|
+
if (!devPersona) {
|
|
303
|
+
throw new Error('No active agent personas found');
|
|
304
|
+
}
|
|
305
|
+
// Post opening message to start the thread
|
|
306
|
+
const openingText = buildOpeningMessage(trigger);
|
|
307
|
+
const openingMsg = await this._slackClient.postAsAgent(channel, openingText, devPersona);
|
|
308
|
+
await sleep(MESSAGE_DELAY_MS);
|
|
309
|
+
// Create discussion record
|
|
310
|
+
const discussion = repos.slackDiscussion.create({
|
|
311
|
+
projectPath: trigger.projectPath,
|
|
312
|
+
triggerType: trigger.type,
|
|
313
|
+
triggerRef: trigger.ref,
|
|
314
|
+
channelId: channel,
|
|
315
|
+
threadTs: openingMsg.ts,
|
|
316
|
+
status: 'active',
|
|
317
|
+
round: 1,
|
|
318
|
+
participants: [devPersona.id],
|
|
319
|
+
consensusResult: null,
|
|
320
|
+
});
|
|
321
|
+
// Run first round of contributions (excluding Dev who already posted)
|
|
322
|
+
const reviewers = participants.filter((p) => p.id !== devPersona.id);
|
|
323
|
+
await this._runContributionRound(discussion.id, reviewers, trigger, openingText);
|
|
324
|
+
// Check consensus after first round
|
|
325
|
+
await this._evaluateConsensus(discussion.id, trigger);
|
|
326
|
+
return repos.slackDiscussion.getById(discussion.id);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Have a specific agent contribute to an existing discussion.
|
|
330
|
+
*/
|
|
331
|
+
async contributeAsAgent(discussionId, persona) {
|
|
332
|
+
const repos = getRepositories();
|
|
333
|
+
const discussion = repos.slackDiscussion.getById(discussionId);
|
|
334
|
+
if (!discussion || discussion.status !== 'active')
|
|
335
|
+
return;
|
|
336
|
+
// Get thread history for context
|
|
337
|
+
const history = await this._slackClient.getChannelHistory(discussion.channelId, discussion.threadTs, 10);
|
|
338
|
+
const historyText = history.map(m => m.text).join('\n---\n');
|
|
339
|
+
// Rebuild trigger context from discussion record
|
|
340
|
+
const trigger = {
|
|
341
|
+
type: discussion.triggerType,
|
|
342
|
+
projectPath: discussion.projectPath,
|
|
343
|
+
ref: discussion.triggerRef,
|
|
344
|
+
context: historyText,
|
|
345
|
+
};
|
|
346
|
+
const contributionPrompt = buildContributionPrompt(persona, trigger, historyText, discussion.round);
|
|
347
|
+
let message;
|
|
348
|
+
try {
|
|
349
|
+
message = await callAIForContribution(persona, this._config, contributionPrompt);
|
|
350
|
+
}
|
|
351
|
+
catch (_err) {
|
|
352
|
+
message = `[Contribution from ${persona.name} unavailable — AI provider not configured]`;
|
|
353
|
+
}
|
|
354
|
+
if (message) {
|
|
355
|
+
await this._slackClient.postAsAgent(discussion.channelId, message, persona, discussion.threadTs);
|
|
356
|
+
repos.slackDiscussion.addParticipant(discussionId, persona.id);
|
|
357
|
+
await sleep(MESSAGE_DELAY_MS);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Handle a human message posted in a discussion thread.
|
|
362
|
+
* Pauses agent contributions; lead summarizes after silence.
|
|
363
|
+
*/
|
|
364
|
+
async handleHumanMessage(channel, threadTs, _message, _userId) {
|
|
365
|
+
// Find the discussion by threadTs
|
|
366
|
+
const repos = getRepositories();
|
|
367
|
+
const activeDiscussions = repos.slackDiscussion.getActive('');
|
|
368
|
+
const discussion = activeDiscussions.find(d => d.channelId === channel && d.threadTs === threadTs);
|
|
369
|
+
if (!discussion)
|
|
370
|
+
return;
|
|
371
|
+
const existingTimer = this._humanResumeTimers.get(discussion.id);
|
|
372
|
+
if (existingTimer) {
|
|
373
|
+
clearTimeout(existingTimer);
|
|
374
|
+
}
|
|
375
|
+
// Human is involved — debounce for a short pause before the lead summarizes.
|
|
376
|
+
const timer = setTimeout(() => {
|
|
377
|
+
void (async () => {
|
|
378
|
+
const innerRepos = getRepositories();
|
|
379
|
+
const personas = innerRepos.agentPersona.getActive();
|
|
380
|
+
const carlos = findCarlos(personas) ?? personas[0];
|
|
381
|
+
if (!carlos)
|
|
382
|
+
return;
|
|
383
|
+
const updated = innerRepos.slackDiscussion.getById(discussion.id);
|
|
384
|
+
if (!updated || updated.status !== 'active')
|
|
385
|
+
return;
|
|
386
|
+
await this._slackClient.postAsAgent(channel, "Picking back up — let me summarize where we are and continue. 🏗️", carlos, threadTs);
|
|
387
|
+
await sleep(MESSAGE_DELAY_MS);
|
|
388
|
+
await this._evaluateConsensus(discussion.id, {
|
|
389
|
+
type: discussion.triggerType,
|
|
390
|
+
projectPath: discussion.projectPath,
|
|
391
|
+
ref: discussion.triggerRef,
|
|
392
|
+
context: '',
|
|
393
|
+
});
|
|
394
|
+
})().finally(() => {
|
|
395
|
+
this._humanResumeTimers.delete(discussion.id);
|
|
396
|
+
});
|
|
397
|
+
}, DISCUSSION_RESUME_DELAY_MS);
|
|
398
|
+
this._humanResumeTimers.set(discussion.id, timer);
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Run a round of contributions from the given personas.
|
|
402
|
+
*/
|
|
403
|
+
async _runContributionRound(discussionId, personas, trigger, currentContext) {
|
|
404
|
+
const repos = getRepositories();
|
|
405
|
+
const discussion = repos.slackDiscussion.getById(discussionId);
|
|
406
|
+
if (!discussion)
|
|
407
|
+
return;
|
|
408
|
+
// Get current thread history
|
|
409
|
+
const history = await this._slackClient.getChannelHistory(discussion.channelId, discussion.threadTs, 10);
|
|
410
|
+
let historyText = history.map(m => m.text).join('\n---\n') || currentContext;
|
|
411
|
+
for (const persona of personas) {
|
|
412
|
+
const updatedDiscussion = repos.slackDiscussion.getById(discussionId);
|
|
413
|
+
if (!updatedDiscussion || updatedDiscussion.status !== 'active')
|
|
414
|
+
break;
|
|
415
|
+
const contributionPrompt = buildContributionPrompt(persona, trigger, historyText, updatedDiscussion.round);
|
|
416
|
+
let message;
|
|
417
|
+
try {
|
|
418
|
+
message = await callAIForContribution(persona, this._config, contributionPrompt);
|
|
419
|
+
}
|
|
420
|
+
catch (_err) {
|
|
421
|
+
message = '';
|
|
422
|
+
}
|
|
423
|
+
if (message) {
|
|
424
|
+
await this._slackClient.postAsAgent(discussion.channelId, message, persona, discussion.threadTs);
|
|
425
|
+
repos.slackDiscussion.addParticipant(discussionId, persona.id);
|
|
426
|
+
historyText = historyText ? `${historyText}\n---\n${message}` : message;
|
|
427
|
+
await sleep(MESSAGE_DELAY_MS);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Evaluate whether consensus has been reached.
|
|
433
|
+
* Lead agent (Carlos) decides: approve, request changes, or escalate.
|
|
434
|
+
* Uses an iterative loop for multi-round handling (no recursion).
|
|
435
|
+
*/
|
|
436
|
+
async _evaluateConsensus(discussionId, trigger) {
|
|
437
|
+
const repos = getRepositories();
|
|
438
|
+
// Re-check state each round; stop when consensus/blocked or discussion disappears.
|
|
439
|
+
while (true) {
|
|
440
|
+
const discussion = repos.slackDiscussion.getById(discussionId);
|
|
441
|
+
if (!discussion || discussion.status !== 'active')
|
|
442
|
+
return;
|
|
443
|
+
const personas = repos.agentPersona.getActive();
|
|
444
|
+
const carlos = findCarlos(personas);
|
|
445
|
+
if (!carlos) {
|
|
446
|
+
repos.slackDiscussion.updateStatus(discussionId, 'consensus', 'approved');
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
// Get thread history and let Carlos evaluate
|
|
450
|
+
const history = await this._slackClient.getChannelHistory(discussion.channelId, discussion.threadTs, 20);
|
|
451
|
+
const historyText = history.map(m => m.text).join('\n---\n');
|
|
452
|
+
const consensusPrompt = `You are ${carlos.name}, ${carlos.role}.
|
|
453
|
+
|
|
454
|
+
Review this discussion thread and decide: are we ready to ship, do we need another round of review, or do we need a human?
|
|
455
|
+
|
|
456
|
+
Thread:
|
|
457
|
+
${historyText}
|
|
458
|
+
|
|
459
|
+
Round: ${discussion.round} of ${MAX_ROUNDS}
|
|
460
|
+
|
|
461
|
+
Respond with ONLY one of:
|
|
462
|
+
- APPROVE: [your short closing message, e.g., "LGTM 👍 Ship it 🚀"]
|
|
463
|
+
- CHANGES: [summary of what still needs to change — be specific]
|
|
464
|
+
- HUMAN: [why you need a human decision]`;
|
|
465
|
+
let decision;
|
|
466
|
+
try {
|
|
467
|
+
decision = await callAIForContribution(carlos, this._config, consensusPrompt);
|
|
468
|
+
}
|
|
469
|
+
catch (_err) {
|
|
470
|
+
decision = 'HUMAN: AI evaluation failed — needs manual review';
|
|
471
|
+
}
|
|
472
|
+
if (decision.startsWith('APPROVE')) {
|
|
473
|
+
const message = decision.replace(/^APPROVE:\s*/, '').trim() || 'Ship it 🚀';
|
|
474
|
+
await this._slackClient.postAsAgent(discussion.channelId, message, carlos, discussion.threadTs);
|
|
475
|
+
repos.slackDiscussion.updateStatus(discussionId, 'consensus', 'approved');
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
if (decision.startsWith('CHANGES') && discussion.round < MAX_ROUNDS) {
|
|
479
|
+
const changes = decision.replace(/^CHANGES:\s*/, '').trim();
|
|
480
|
+
await this._slackClient.postAsAgent(discussion.channelId, `One more pass needed:\n${changes}`, carlos, discussion.threadTs);
|
|
481
|
+
await sleep(MESSAGE_DELAY_MS);
|
|
482
|
+
// Increment round and start another contribution round, then loop back.
|
|
483
|
+
const nextRound = discussion.round + 1;
|
|
484
|
+
repos.slackDiscussion.updateRound(discussionId, nextRound);
|
|
485
|
+
const participants = getParticipatingPersonas(trigger.type, personas);
|
|
486
|
+
const devPersona = findDev(personas);
|
|
487
|
+
const reviewers = participants.filter((p) => !devPersona || p.id !== devPersona.id);
|
|
488
|
+
await this._runContributionRound(discussionId, reviewers, trigger, changes);
|
|
489
|
+
continue;
|
|
490
|
+
}
|
|
491
|
+
if (decision.startsWith('CHANGES') && discussion.round >= MAX_ROUNDS) {
|
|
492
|
+
// Max rounds reached — set changes_requested and optionally trigger PR refinement
|
|
493
|
+
const changesSummary = decision.replace(/^CHANGES:\s*/, '').trim();
|
|
494
|
+
await this._slackClient.postAsAgent(discussion.channelId, "3 rounds in — shipping what we have. Ship it 🚀", carlos, discussion.threadTs);
|
|
495
|
+
repos.slackDiscussion.updateStatus(discussionId, 'consensus', 'changes_requested');
|
|
496
|
+
if (discussion.triggerType === 'pr_review') {
|
|
497
|
+
await this.triggerPRRefinement(discussionId, changesSummary, discussion.triggerRef).catch(e => console.warn('PR refinement trigger failed:', e));
|
|
498
|
+
}
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
// HUMAN or fallback
|
|
502
|
+
await this._slackClient.postAsAgent(discussion.channelId, "This one needs a human call. Flagging for review. 🚩", carlos, discussion.threadTs);
|
|
503
|
+
repos.slackDiscussion.updateStatus(discussionId, 'blocked', 'human_needed');
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Trigger the Night Watch reviewer agent with Slack discussion feedback.
|
|
509
|
+
* Sets NW_SLACK_FEEDBACK env var with the changes summary.
|
|
510
|
+
*/
|
|
511
|
+
async triggerPRRefinement(discussionId, changesSummary, prNumber) {
|
|
512
|
+
const repos = getRepositories();
|
|
513
|
+
const discussion = repos.slackDiscussion.getById(discussionId);
|
|
514
|
+
if (!discussion)
|
|
515
|
+
return;
|
|
516
|
+
const personas = repos.agentPersona.getActive();
|
|
517
|
+
const carlos = findCarlos(personas) ?? personas[0];
|
|
518
|
+
const dev = findDev(personas) ?? personas[0];
|
|
519
|
+
if (carlos) {
|
|
520
|
+
await this._slackClient.postAsAgent(discussion.channelId, `Sending feedback to the reviewer agent. Changes needed:\n${changesSummary}`, carlos, discussion.threadTs);
|
|
521
|
+
await sleep(MESSAGE_DELAY_MS);
|
|
522
|
+
}
|
|
523
|
+
// Set NW_SLACK_FEEDBACK and trigger reviewer
|
|
524
|
+
const feedback = JSON.stringify({ discussionId, prNumber, changes: changesSummary });
|
|
525
|
+
// Spawn the reviewer as a detached process
|
|
526
|
+
const { spawn } = await import('child_process');
|
|
527
|
+
const reviewer = spawn(process.execPath, [process.argv[1], 'review', '--pr', prNumber], {
|
|
528
|
+
detached: true,
|
|
529
|
+
stdio: 'ignore',
|
|
530
|
+
env: { ...process.env, NW_SLACK_FEEDBACK: feedback },
|
|
531
|
+
});
|
|
532
|
+
reviewer.unref();
|
|
533
|
+
// Post update
|
|
534
|
+
if (dev) {
|
|
535
|
+
await this._slackClient.postAsAgent(discussion.channelId, `Reviewer agent kicked off for PR #${prNumber} 🔨 Will post back when done.`, dev, discussion.threadTs);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
//# sourceMappingURL=deliberation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deliberation.js","sourceRoot":"","sources":["../../../src/slack/deliberation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { SlackClient } from './client.js';
|
|
2
|
+
export type { ISlackMessage, ISlackChannel } from './client.js';
|
|
3
|
+
export { ChannelManager } from './channel-manager.js';
|
|
4
|
+
export { DeliberationEngine } from './deliberation.js';
|
|
5
|
+
export { SlackInteractionListener, extractMentionHandles, resolveMentionedPersonas, shouldIgnoreInboundSlackEvent, } from './interaction-listener.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/slack/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { SlackClient } from './client.js';
|
|
2
|
+
export { ChannelManager } from './channel-manager.js';
|
|
3
|
+
export { DeliberationEngine } from './deliberation.js';
|
|
4
|
+
export { SlackInteractionListener, extractMentionHandles, resolveMentionedPersonas, shouldIgnoreInboundSlackEvent, } from './interaction-listener.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/slack/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack interaction listener.
|
|
3
|
+
* Listens to human messages (Socket Mode), routes @persona mentions,
|
|
4
|
+
* and applies loop-protection safeguards.
|
|
5
|
+
*/
|
|
6
|
+
import { IAgentPersona } from '../../shared/types.js';
|
|
7
|
+
import { INightWatchConfig } from '../types.js';
|
|
8
|
+
interface IInboundSlackEvent {
|
|
9
|
+
type?: string;
|
|
10
|
+
subtype?: string;
|
|
11
|
+
bot_id?: string;
|
|
12
|
+
user?: string;
|
|
13
|
+
text?: string;
|
|
14
|
+
channel?: string;
|
|
15
|
+
ts?: string;
|
|
16
|
+
thread_ts?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Extract @handle mentions from raw Slack text.
|
|
20
|
+
* Example: "@maya please check this" -> ["maya"]
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractMentionHandles(text: string): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Resolve mention handles to active personas by display name.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveMentionedPersonas(text: string, personas: IAgentPersona[]): IAgentPersona[];
|
|
27
|
+
export declare function shouldIgnoreInboundSlackEvent(event: IInboundSlackEvent, botUserId: string | null): boolean;
|
|
28
|
+
export declare class SlackInteractionListener {
|
|
29
|
+
private readonly _config;
|
|
30
|
+
private readonly _slackClient;
|
|
31
|
+
private readonly _engine;
|
|
32
|
+
private _socketClient;
|
|
33
|
+
private _botUserId;
|
|
34
|
+
private readonly _processedMessageKeys;
|
|
35
|
+
private readonly _processedMessageOrder;
|
|
36
|
+
private readonly _lastPersonaReplyAt;
|
|
37
|
+
constructor(config: INightWatchConfig);
|
|
38
|
+
start(): Promise<void>;
|
|
39
|
+
stop(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Post a self-introduction message for each active persona that hasn't
|
|
42
|
+
* introduced themselves to the eng channel yet. Tracked persistently in
|
|
43
|
+
* schema_meta so it only fires once per persona across restarts.
|
|
44
|
+
*/
|
|
45
|
+
private _postPersonaIntros;
|
|
46
|
+
private _handleEventsApi;
|
|
47
|
+
private _rememberMessageKey;
|
|
48
|
+
private _isPersonaOnCooldown;
|
|
49
|
+
private _markPersonaReply;
|
|
50
|
+
private _handleInboundMessage;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=interaction-listener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction-listener.d.ts","sourceRoot":"","sources":["../../../src/slack/interaction-listener.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAOhD,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAWD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAe5D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,EAAE,GACxB,aAAa,EAAE,CAsBjB;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,kBAAkB,EACzB,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAOT;AAED,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAqB;IAC3D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAgB;IACvD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA6B;gBAErD,MAAM,EAAE,iBAAiB;IAO/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0CtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB3B;;;;OAIG;YACW,kBAAkB;YAqClB,gBAAgB;IAmB9B,OAAO,CAAC,mBAAmB;IAkB3B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,iBAAiB;YASX,qBAAqB;CAiDpC"}
|