maestro-flow 0.3.9 → 0.3.11
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/.claude/agents/workflow-collab-planner.md +1 -1
- package/.claude/agents/workflow-executor.md +1 -1
- package/.claude/agents/workflow-plan-checker.md +1 -1
- package/.claude/agents/workflow-planner.md +1 -1
- package/.claude/commands/learn-decompose.md +176 -176
- package/.claude/commands/learn-follow.md +167 -167
- package/.claude/commands/learn-retro.md +1 -1
- package/.claude/commands/maestro-analyze.md +46 -3
- package/.claude/commands/maestro-coordinate.md +1 -3
- package/.claude/commands/maestro-execute.md +14 -0
- package/.claude/commands/maestro-plan.md +16 -0
- package/.claude/commands/manage-harvest.md +131 -131
- package/.claude/commands/manage-issue-discover.md +2 -2
- package/.claude/commands/manage-issue.md +5 -5
- package/.claude/commands/spec-add.md +67 -56
- package/.claude/commands/spec-load.md +66 -64
- package/.claude/commands/spec-setup.md +5 -9
- package/.codex/skills/learn-decompose/SKILL.md +119 -0
- package/.codex/skills/learn-follow/SKILL.md +83 -0
- package/.codex/skills/learn-investigate/SKILL.md +83 -0
- package/.codex/skills/learn-retro/SKILL.md +83 -0
- package/.codex/skills/learn-second-opinion/SKILL.md +86 -0
- package/.codex/skills/maestro/SKILL.md +335 -0
- package/.codex/skills/maestro-analyze/SKILL.md +84 -75
- package/.codex/skills/maestro-brainstorm/SKILL.md +452 -463
- package/.codex/skills/maestro-chain/SKILL.md +233 -0
- package/.codex/skills/maestro-coordinate/SKILL.md +167 -278
- package/.codex/skills/maestro-execute/SKILL.md +435 -438
- package/.codex/skills/maestro-fork/SKILL.md +68 -0
- package/.codex/skills/maestro-init/SKILL.md +171 -167
- package/.codex/skills/maestro-learn/SKILL.md +80 -0
- package/.codex/skills/maestro-link-coordinate/SKILL.md +224 -220
- package/.codex/skills/maestro-merge/SKILL.md +62 -0
- package/.codex/skills/maestro-milestone-audit/SKILL.md +108 -103
- package/.codex/skills/maestro-milestone-complete/SKILL.md +155 -149
- package/.codex/skills/maestro-milestone-release/SKILL.md +70 -0
- package/.codex/skills/maestro-overlay/SKILL.md +188 -185
- package/.codex/skills/maestro-plan/SKILL.md +66 -69
- package/.codex/skills/maestro-quick/SKILL.md +26 -23
- package/.codex/skills/maestro-roadmap/SKILL.md +65 -73
- package/.codex/skills/maestro-spec-generate/SKILL.md +66 -74
- package/.codex/skills/maestro-ui-design/SKILL.md +34 -31
- package/.codex/skills/maestro-verify/SKILL.md +556 -566
- package/.codex/skills/manage-codebase-rebuild/SKILL.md +397 -405
- package/.codex/skills/manage-codebase-refresh/SKILL.md +93 -82
- package/.codex/skills/manage-harvest/SKILL.md +82 -0
- package/.codex/skills/manage-issue/SKILL.md +80 -65
- package/.codex/skills/manage-issue-discover/SKILL.md +491 -503
- package/.codex/skills/manage-learn/SKILL.md +190 -186
- package/.codex/skills/manage-memory/SKILL.md +95 -72
- package/.codex/skills/manage-memory-capture/SKILL.md +99 -86
- package/.codex/skills/manage-status/SKILL.md +102 -89
- package/.codex/skills/quality-business-test/SKILL.md +228 -223
- package/.codex/skills/quality-debug/SKILL.md +54 -66
- package/.codex/skills/quality-integration-test/SKILL.md +532 -544
- package/.codex/skills/quality-refactor/SKILL.md +197 -191
- package/.codex/skills/quality-retrospective/SKILL.md +512 -505
- package/.codex/skills/quality-review/SKILL.md +93 -105
- package/.codex/skills/quality-sync/SKILL.md +101 -89
- package/.codex/skills/quality-test/SKILL.md +202 -198
- package/.codex/skills/quality-test-gen/SKILL.md +93 -104
- package/.codex/skills/spec-add/SKILL.md +58 -39
- package/.codex/skills/spec-load/SKILL.md +45 -40
- package/.codex/skills/spec-map/SKILL.md +180 -182
- package/.codex/skills/spec-setup/SKILL.md +94 -76
- package/.codex/skills/team-coordinate/SKILL.md +346 -357
- package/.codex/skills/team-executor/SKILL.md +70 -112
- package/.codex/skills/team-lifecycle-v4/SKILL.md +311 -299
- package/.codex/skills/team-quality-assurance/SKILL.md +234 -227
- package/.codex/skills/team-review/SKILL.md +232 -225
- package/.codex/skills/team-tech-debt/SKILL.md +78 -100
- package/.codex/skills/team-testing/SKILL.md +242 -235
- package/.codex/skills/wiki-connect/SKILL.md +75 -0
- package/.codex/skills/wiki-digest/SKILL.md +87 -0
- package/README.md +14 -11
- package/README.zh-CN.md +14 -11
- package/chains/issue-lifecycle.json +13 -13
- package/chains/singles/issue-analyze.json +3 -3
- package/chains/singles/issue-execute.json +3 -3
- package/chains/singles/issue-plan.json +3 -3
- package/dashboard/dist-server/dashboard/src/server/commander/commander-agent.js +2 -2
- package/dashboard/dist-server/dashboard/src/server/commander/commander-agent.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.js +3 -3
- package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/issues.js +34 -0
- package/dashboard/dist-server/dashboard/src/server/routes/issues.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/specs.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/specs.js +75 -30
- package/dashboard/dist-server/dashboard/src/server/routes/specs.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.d.ts +5 -0
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.js +5 -0
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/execution-handler.js +2 -3
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/execution-handler.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/constants.js +5 -0
- package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/issue-types.d.ts +5 -0
- package/dashboard/dist-server/dashboard/src/shared/issue-types.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/normalize-task.d.ts +2 -0
- package/dashboard/dist-server/dashboard/src/shared/normalize-task.js +75 -0
- package/dashboard/dist-server/dashboard/src/shared/normalize-task.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/shared/team-types.d.ts +21 -0
- package/dashboard/dist-server/dashboard/src/shared/team-types.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/types.d.ts +3 -2
- package/dashboard/dist-server/dashboard/src/shared/ws-protocol.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/shared/ws-protocol.js.map +1 -1
- package/dashboard/dist-server/src/hooks/constants.d.ts +92 -12
- package/dashboard/dist-server/src/hooks/constants.js +151 -16
- package/dashboard/dist-server/src/hooks/constants.js.map +1 -1
- package/dashboard/dist-server/src/types/index.d.ts +5 -0
- package/dist/src/commands/collab.d.ts +1 -34
- package/dist/src/commands/collab.d.ts.map +1 -1
- package/dist/src/commands/collab.js +8 -76
- package/dist/src/commands/collab.js.map +1 -1
- package/dist/src/commands/hooks.d.ts +5 -1
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +115 -10
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/install-ui/InstallConfirm.d.ts +3 -1
- package/dist/src/commands/install-ui/InstallConfirm.d.ts.map +1 -1
- package/dist/src/commands/install-ui/InstallConfirm.js +3 -1
- package/dist/src/commands/install-ui/InstallConfirm.js.map +1 -1
- package/dist/src/commands/install-ui/InstallExecution.d.ts.map +1 -1
- package/dist/src/commands/install-ui/InstallExecution.js +5 -1
- package/dist/src/commands/install-ui/InstallExecution.js.map +1 -1
- package/dist/src/commands/install-ui/InstallFlow.d.ts.map +1 -1
- package/dist/src/commands/install-ui/InstallFlow.js +7 -3
- package/dist/src/commands/install-ui/InstallFlow.js.map +1 -1
- package/dist/src/commands/install-ui/StatuslineConfig.d.ts +6 -1
- package/dist/src/commands/install-ui/StatuslineConfig.d.ts.map +1 -1
- package/dist/src/commands/install-ui/StatuslineConfig.js +27 -5
- package/dist/src/commands/install-ui/StatuslineConfig.js.map +1 -1
- package/dist/src/commands/spec.d.ts.map +1 -1
- package/dist/src/commands/spec.js +7 -2
- package/dist/src/commands/spec.js.map +1 -1
- package/dist/src/hooks/__tests__/statusline-visual-test.d.ts +7 -0
- package/dist/src/hooks/__tests__/statusline-visual-test.d.ts.map +1 -0
- package/dist/src/hooks/__tests__/statusline-visual-test.js +236 -0
- package/dist/src/hooks/__tests__/statusline-visual-test.js.map +1 -0
- package/dist/src/hooks/constants.d.ts +92 -12
- package/dist/src/hooks/constants.d.ts.map +1 -1
- package/dist/src/hooks/constants.js +151 -16
- package/dist/src/hooks/constants.js.map +1 -1
- package/dist/src/hooks/guards/index.d.ts +2 -0
- package/dist/src/hooks/guards/index.d.ts.map +1 -1
- package/dist/src/hooks/guards/index.js +2 -0
- package/dist/src/hooks/guards/index.js.map +1 -1
- package/dist/src/hooks/guards/preflight-guard.d.ts +29 -0
- package/dist/src/hooks/guards/preflight-guard.d.ts.map +1 -0
- package/dist/src/hooks/guards/preflight-guard.js +95 -0
- package/dist/src/hooks/guards/preflight-guard.js.map +1 -0
- package/dist/src/hooks/guards/spec-validator.d.ts +25 -0
- package/dist/src/hooks/guards/spec-validator.d.ts.map +1 -0
- package/dist/src/hooks/guards/spec-validator.js +66 -0
- package/dist/src/hooks/guards/spec-validator.js.map +1 -0
- package/dist/src/hooks/index.d.ts +1 -0
- package/dist/src/hooks/index.d.ts.map +1 -1
- package/dist/src/hooks/index.js +1 -0
- package/dist/src/hooks/index.js.map +1 -1
- package/dist/src/hooks/keyword-spec-injector.d.ts +21 -0
- package/dist/src/hooks/keyword-spec-injector.d.ts.map +1 -0
- package/dist/src/hooks/keyword-spec-injector.js +96 -0
- package/dist/src/hooks/keyword-spec-injector.js.map +1 -0
- package/dist/src/hooks/plugins/spec-injection-plugin.d.ts +2 -1
- package/dist/src/hooks/plugins/spec-injection-plugin.d.ts.map +1 -1
- package/dist/src/hooks/plugins/spec-injection-plugin.js +21 -12
- package/dist/src/hooks/plugins/spec-injection-plugin.js.map +1 -1
- package/dist/src/hooks/preflight-core.d.ts +37 -0
- package/dist/src/hooks/preflight-core.d.ts.map +1 -0
- package/dist/src/hooks/preflight-core.js +86 -0
- package/dist/src/hooks/preflight-core.js.map +1 -0
- package/dist/src/hooks/spec-bridge.d.ts +40 -0
- package/dist/src/hooks/spec-bridge.d.ts.map +1 -0
- package/dist/src/hooks/spec-bridge.js +97 -0
- package/dist/src/hooks/spec-bridge.js.map +1 -0
- package/dist/src/hooks/spec-injector.d.ts.map +1 -1
- package/dist/src/hooks/spec-injector.js +18 -12
- package/dist/src/hooks/spec-injector.js.map +1 -1
- package/dist/src/hooks/statusline.d.ts +8 -17
- package/dist/src/hooks/statusline.d.ts.map +1 -1
- package/dist/src/hooks/statusline.js +269 -112
- package/dist/src/hooks/statusline.js.map +1 -1
- package/dist/src/i18n/locales/en.d.ts.map +1 -1
- package/dist/src/i18n/locales/en.js +5 -0
- package/dist/src/i18n/locales/en.js.map +1 -1
- package/dist/src/i18n/locales/zh.d.ts.map +1 -1
- package/dist/src/i18n/locales/zh.js +5 -0
- package/dist/src/i18n/locales/zh.js.map +1 -1
- package/dist/src/i18n/types.d.ts +5 -0
- package/dist/src/i18n/types.d.ts.map +1 -1
- package/dist/src/team/phase-orchestrator.d.ts +52 -0
- package/dist/src/team/phase-orchestrator.d.ts.map +1 -0
- package/dist/src/team/phase-orchestrator.js +165 -0
- package/dist/src/team/phase-orchestrator.js.map +1 -0
- package/dist/src/team/phase-types.d.ts +51 -0
- package/dist/src/team/phase-types.d.ts.map +1 -0
- package/dist/src/team/phase-types.js +41 -0
- package/dist/src/team/phase-types.js.map +1 -0
- package/dist/src/tools/collab-adapter.d.ts +17 -0
- package/dist/src/tools/collab-adapter.d.ts.map +1 -1
- package/dist/src/tools/collab-adapter.js +138 -0
- package/dist/src/tools/collab-adapter.js.map +1 -1
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +6 -0
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/merge-validator.d.ts +24 -0
- package/dist/src/tools/merge-validator.d.ts.map +1 -0
- package/dist/src/tools/merge-validator.js +220 -0
- package/dist/src/tools/merge-validator.js.map +1 -0
- package/dist/src/tools/spec-entry-parser.d.ts +56 -0
- package/dist/src/tools/spec-entry-parser.d.ts.map +1 -0
- package/dist/src/tools/spec-entry-parser.js +196 -0
- package/dist/src/tools/spec-entry-parser.js.map +1 -0
- package/dist/src/tools/spec-init.d.ts.map +1 -1
- package/dist/src/tools/spec-init.js +66 -92
- package/dist/src/tools/spec-init.js.map +1 -1
- package/dist/src/tools/spec-keyword-index.d.ts +30 -0
- package/dist/src/tools/spec-keyword-index.d.ts.map +1 -0
- package/dist/src/tools/spec-keyword-index.js +101 -0
- package/dist/src/tools/spec-keyword-index.js.map +1 -0
- package/dist/src/tools/spec-loader.d.ts +3 -3
- package/dist/src/tools/spec-loader.d.ts.map +1 -1
- package/dist/src/tools/spec-loader.js +49 -23
- package/dist/src/tools/spec-loader.js.map +1 -1
- package/dist/src/tools/team-agents.d.ts +27 -0
- package/dist/src/tools/team-agents.d.ts.map +1 -0
- package/dist/src/tools/team-agents.js +362 -0
- package/dist/src/tools/team-agents.js.map +1 -0
- package/dist/src/tools/team-mailbox.d.ts +40 -0
- package/dist/src/tools/team-mailbox.d.ts.map +1 -0
- package/dist/src/tools/team-mailbox.js +384 -0
- package/dist/src/tools/team-mailbox.js.map +1 -0
- package/dist/src/tools/team-msg.d.ts +17 -8
- package/dist/src/tools/team-msg.d.ts.map +1 -1
- package/dist/src/tools/team-msg.js +110 -13
- package/dist/src/tools/team-msg.js.map +1 -1
- package/dist/src/tools/team-tasks-mcp.d.ts +27 -0
- package/dist/src/tools/team-tasks-mcp.d.ts.map +1 -0
- package/dist/src/tools/team-tasks-mcp.js +408 -0
- package/dist/src/tools/team-tasks-mcp.js.map +1 -0
- package/dist/src/types/index.d.ts +5 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/package.json +2 -1
- package/templates/cli/prompts/workflow-skill-conflict-patterns.txt +3 -3
- package/templates/cli/prompts/workflow-skill-lessons-learned.txt +3 -3
- package/templates/search-tools.md +1 -1
- package/workflows/analyze.md +816 -816
- package/workflows/brainstorm.md +471 -471
- package/workflows/cli-tools-usage.md +44 -27
- package/workflows/codebase-rebuild.md +332 -332
- package/workflows/codebase-refresh.md +240 -240
- package/workflows/delegate-usage.md +3 -3
- package/workflows/execute.md +1 -1
- package/workflows/harvest.md +420 -420
- package/workflows/integration-test.md +343 -343
- package/workflows/issue-analyze.md +6 -2
- package/workflows/issue-discover.md +414 -414
- package/workflows/issue-execute.md +6 -3
- package/workflows/issue-plan.md +5 -2
- package/workflows/maestro-coordinate.codex.md +281 -470
- package/workflows/maestro-coordinate.md +14 -14
- package/workflows/maestro-link-coordinate.md +2 -2
- package/workflows/maestro.codex.md +710 -0
- package/workflows/maestro.md +10 -11
- package/workflows/map.md +111 -111
- package/workflows/milestone-complete.md +176 -176
- package/workflows/plan.md +1 -1
- package/workflows/quick.md +497 -497
- package/workflows/refactor.md +300 -300
- package/workflows/retrospective.md +1 -1
- package/workflows/roadmap.md +335 -335
- package/workflows/spec-generate.md +640 -640
- package/workflows/specs-add.md +46 -81
- package/workflows/specs-load.md +15 -17
- package/workflows/specs-setup.md +40 -161
- package/.claude/commands/manage-issue-analyze.md +0 -62
- package/.claude/commands/manage-issue-execute.md +0 -73
- package/.claude/commands/manage-issue-plan.md +0 -62
- package/.codex/skills/manage-issue-analyze/SKILL.md +0 -207
- package/.codex/skills/manage-issue-execute/SKILL.md +0 -200
- package/.codex/skills/manage-issue-plan/SKILL.md +0 -186
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Mailbox - MCP tools for agent-to-agent messaging with delivery tracking
|
|
3
|
+
*
|
|
4
|
+
* Tools:
|
|
5
|
+
* - team_send_message: Send a message to a team role (persists to JSONL + broker inject)
|
|
6
|
+
* - team_read_mailbox: Read unread messages for a role, mark as delivered
|
|
7
|
+
* - team_mailbox_status: Per-role unread/pending/delivered counts
|
|
8
|
+
*
|
|
9
|
+
* Storage: .workflow/.team/{session-id}/.msg/mailbox.jsonl
|
|
10
|
+
*
|
|
11
|
+
* Integration points for TASK-001 (team-msg dispatch upgrade):
|
|
12
|
+
* - opReadMailbox: reads messages addressed to a role
|
|
13
|
+
* - opGetMailboxStatus: aggregates per-role delivery counts
|
|
14
|
+
* - delivery_method field on opLog messages
|
|
15
|
+
*/
|
|
16
|
+
import { z } from 'zod';
|
|
17
|
+
import { existsSync, mkdirSync, readFileSync, appendFileSync, writeFileSync } from 'fs';
|
|
18
|
+
import { join, dirname } from 'path';
|
|
19
|
+
import { getProjectRoot } from '../utils/path-validator.js';
|
|
20
|
+
import { createDefaultDelegateBroker } from '../async/delegate-broker.js';
|
|
21
|
+
// --- Storage helpers ---
|
|
22
|
+
function getMailboxDir(sessionId) {
|
|
23
|
+
const root = getProjectRoot();
|
|
24
|
+
return join(root, '.workflow', '.team', sessionId, '.msg');
|
|
25
|
+
}
|
|
26
|
+
function getMailboxPath(sessionId) {
|
|
27
|
+
return join(getMailboxDir(sessionId), 'mailbox.jsonl');
|
|
28
|
+
}
|
|
29
|
+
function ensureMailboxFile(sessionId) {
|
|
30
|
+
const mailboxPath = getMailboxPath(sessionId);
|
|
31
|
+
const dir = dirname(mailboxPath);
|
|
32
|
+
if (!existsSync(dir)) {
|
|
33
|
+
mkdirSync(dir, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
if (!existsSync(mailboxPath)) {
|
|
36
|
+
appendFileSync(mailboxPath, '', 'utf-8');
|
|
37
|
+
}
|
|
38
|
+
return mailboxPath;
|
|
39
|
+
}
|
|
40
|
+
function readAllMailboxMessages(sessionId) {
|
|
41
|
+
const mailboxPath = getMailboxPath(sessionId);
|
|
42
|
+
if (!existsSync(mailboxPath))
|
|
43
|
+
return [];
|
|
44
|
+
const content = readFileSync(mailboxPath, 'utf-8').trim();
|
|
45
|
+
if (!content)
|
|
46
|
+
return [];
|
|
47
|
+
return content.split('\n').map(line => {
|
|
48
|
+
try {
|
|
49
|
+
return JSON.parse(line);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}).filter((m) => m !== null);
|
|
55
|
+
}
|
|
56
|
+
function writeAllMailboxMessages(sessionId, messages) {
|
|
57
|
+
const mailboxPath = ensureMailboxFile(sessionId);
|
|
58
|
+
writeFileSync(mailboxPath, messages.map(m => JSON.stringify(m)).join('\n') + (messages.length > 0 ? '\n' : ''), 'utf-8');
|
|
59
|
+
}
|
|
60
|
+
function getNextMailboxId(messages) {
|
|
61
|
+
const maxNum = messages.reduce((max, m) => {
|
|
62
|
+
const match = m.id.match(/^MBX-(\d+)$/);
|
|
63
|
+
return match ? Math.max(max, parseInt(match[1], 10)) : max;
|
|
64
|
+
}, 0);
|
|
65
|
+
return `MBX-${String(maxNum + 1).padStart(3, '0')}`;
|
|
66
|
+
}
|
|
67
|
+
function nowISO() {
|
|
68
|
+
return new Date().toISOString().replace('Z', '+00:00');
|
|
69
|
+
}
|
|
70
|
+
// --- Broker integration ---
|
|
71
|
+
/**
|
|
72
|
+
* Attempt to inject a message into a running delegate agent via the broker.
|
|
73
|
+
* Returns true if injection was attempted (even if the job was not found),
|
|
74
|
+
* false only if broker itself was unavailable.
|
|
75
|
+
*/
|
|
76
|
+
function attemptBrokerInject(jobId, message) {
|
|
77
|
+
try {
|
|
78
|
+
const broker = createDefaultDelegateBroker();
|
|
79
|
+
const job = broker.getJob(jobId);
|
|
80
|
+
if (!job) {
|
|
81
|
+
return { attempted: false, result: `No running job found for: ${jobId}` };
|
|
82
|
+
}
|
|
83
|
+
if (job.status === 'completed' || job.status === 'failed' || job.status === 'cancelled') {
|
|
84
|
+
return { attempted: false, result: `Job ${jobId} is ${job.status}, message persisted for polling` };
|
|
85
|
+
}
|
|
86
|
+
const queued = broker.queueMessage({
|
|
87
|
+
jobId,
|
|
88
|
+
message,
|
|
89
|
+
delivery: 'inject',
|
|
90
|
+
});
|
|
91
|
+
return { attempted: true, result: `Injected into job ${jobId} as ${queued.messageId}` };
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
return { attempted: false, result: `Broker error: ${error.message}` };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// --- Zod Schemas ---
|
|
98
|
+
const SendMessageSchema = z.object({
|
|
99
|
+
session_id: z.string().describe('Session ID that determines mailbox storage path'),
|
|
100
|
+
from: z.string().describe('Sender role name'),
|
|
101
|
+
to: z.string().describe('Recipient role name'),
|
|
102
|
+
message: z.string().describe('Message content to send'),
|
|
103
|
+
type: z.string().optional().describe('Message type (default: "message")'),
|
|
104
|
+
delivery_method: z.enum(['inject', 'poll', 'broadcast']).optional().default('inject').describe('Delivery method (default: "inject")'),
|
|
105
|
+
data: z.record(z.string(), z.unknown()).optional().describe('Structured data payload'),
|
|
106
|
+
});
|
|
107
|
+
const ReadMailboxSchema = z.object({
|
|
108
|
+
session_id: z.string().describe('Session ID that determines mailbox storage path'),
|
|
109
|
+
role: z.string().describe('Role name to read mailbox for'),
|
|
110
|
+
limit: z.number().min(1).max(100).optional().default(50).describe('Max messages to return (default: 50)'),
|
|
111
|
+
mark_delivered: z.boolean().optional().default(true).describe('Mark returned messages as delivered (default: true)'),
|
|
112
|
+
});
|
|
113
|
+
const MailboxStatusSchema = z.object({
|
|
114
|
+
session_id: z.string().describe('Session ID that determines mailbox storage path'),
|
|
115
|
+
});
|
|
116
|
+
// --- Operations ---
|
|
117
|
+
function opSendMessage(params) {
|
|
118
|
+
const { session_id, from, to, message, type, delivery_method, data } = params;
|
|
119
|
+
ensureMailboxFile(session_id);
|
|
120
|
+
const messages = readAllMailboxMessages(session_id);
|
|
121
|
+
const id = getNextMailboxId(messages);
|
|
122
|
+
const ts = nowISO();
|
|
123
|
+
const mailboxMsg = {
|
|
124
|
+
id,
|
|
125
|
+
ts,
|
|
126
|
+
from,
|
|
127
|
+
to,
|
|
128
|
+
type: type || 'message',
|
|
129
|
+
message,
|
|
130
|
+
delivery_method,
|
|
131
|
+
delivery_status: 'pending',
|
|
132
|
+
};
|
|
133
|
+
if (data)
|
|
134
|
+
mailboxMsg.data = data;
|
|
135
|
+
// Persist to JSONL
|
|
136
|
+
const mailboxPath = ensureMailboxFile(session_id);
|
|
137
|
+
appendFileSync(mailboxPath, JSON.stringify(mailboxMsg) + '\n', 'utf-8');
|
|
138
|
+
// Attempt broker injection for 'inject' delivery method
|
|
139
|
+
let injectResult = null;
|
|
140
|
+
if (delivery_method === 'inject') {
|
|
141
|
+
// Derive job ID from role name convention: {session_id}-{role}
|
|
142
|
+
const jobId = `${session_id}-${to}`;
|
|
143
|
+
injectResult = attemptBrokerInject(jobId, message);
|
|
144
|
+
// Update delivery status based on injection result
|
|
145
|
+
if (injectResult.attempted) {
|
|
146
|
+
const allMessages = readAllMailboxMessages(session_id);
|
|
147
|
+
const saved = allMessages.find(m => m.id === id);
|
|
148
|
+
if (saved) {
|
|
149
|
+
saved.delivery_status = 'notified';
|
|
150
|
+
writeAllMailboxMessages(session_id, allMessages);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const statusLine = injectResult
|
|
155
|
+
? ` | inject: ${injectResult.result}`
|
|
156
|
+
: '';
|
|
157
|
+
return {
|
|
158
|
+
success: true,
|
|
159
|
+
result: {
|
|
160
|
+
id,
|
|
161
|
+
message: `Sent ${id}: [${from} -> ${to}] ${message.substring(0, 80)}${message.length > 80 ? '...' : ''}${statusLine}`,
|
|
162
|
+
delivery_method,
|
|
163
|
+
delivery_status: injectResult?.attempted ? 'notified' : 'pending',
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function opReadMailbox(params) {
|
|
168
|
+
const { session_id, role, limit, mark_delivered } = params;
|
|
169
|
+
const allMessages = readAllMailboxMessages(session_id);
|
|
170
|
+
const unread = allMessages.filter(m => m.to === role && m.delivery_status !== 'delivered');
|
|
171
|
+
const toReturn = unread.slice(0, limit || 50);
|
|
172
|
+
if (mark_delivered && toReturn.length > 0) {
|
|
173
|
+
const now = nowISO();
|
|
174
|
+
const deliveredIds = new Set(toReturn.map(m => m.id));
|
|
175
|
+
for (const msg of allMessages) {
|
|
176
|
+
if (deliveredIds.has(msg.id)) {
|
|
177
|
+
msg.delivery_status = 'delivered';
|
|
178
|
+
msg.delivered_at = now;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
writeAllMailboxMessages(session_id, allMessages);
|
|
182
|
+
}
|
|
183
|
+
const formatted = toReturn.map(m => `${m.id} [${m.ts.substring(11, 19)}] ${m.from} -> ${m.to} (${m.type}) ${m.message.substring(0, 100)}`);
|
|
184
|
+
return {
|
|
185
|
+
success: true,
|
|
186
|
+
result: {
|
|
187
|
+
role,
|
|
188
|
+
unread_count: toReturn.length,
|
|
189
|
+
total_pending: unread.length,
|
|
190
|
+
messages: toReturn,
|
|
191
|
+
formatted: formatted.join('\n'),
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
function opMailboxStatus(params) {
|
|
196
|
+
const { session_id } = params;
|
|
197
|
+
const allMessages = readAllMailboxMessages(session_id);
|
|
198
|
+
if (allMessages.length === 0) {
|
|
199
|
+
return {
|
|
200
|
+
success: true,
|
|
201
|
+
result: {
|
|
202
|
+
roles: [],
|
|
203
|
+
total_messages: 0,
|
|
204
|
+
summary: 'No mailbox messages recorded yet.',
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// Aggregate per-role counts
|
|
209
|
+
const roleMap = new Map();
|
|
210
|
+
for (const msg of allMessages) {
|
|
211
|
+
// Count by recipient role
|
|
212
|
+
if (!roleMap.has(msg.to)) {
|
|
213
|
+
roleMap.set(msg.to, { role: msg.to, pending: 0, notified: 0, delivered: 0, failed: 0 });
|
|
214
|
+
}
|
|
215
|
+
const entry = roleMap.get(msg.to);
|
|
216
|
+
switch (msg.delivery_status) {
|
|
217
|
+
case 'pending':
|
|
218
|
+
entry.pending++;
|
|
219
|
+
break;
|
|
220
|
+
case 'notified':
|
|
221
|
+
entry.notified++;
|
|
222
|
+
break;
|
|
223
|
+
case 'delivered':
|
|
224
|
+
entry.delivered++;
|
|
225
|
+
break;
|
|
226
|
+
case 'failed':
|
|
227
|
+
entry.failed++;
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const roles = Array.from(roleMap.values());
|
|
232
|
+
const formatted = roles.map(r => `${r.role.padEnd(12)} | pending: ${r.pending} | notified: ${r.notified} | delivered: ${r.delivered} | failed: ${r.failed}`).join('\n');
|
|
233
|
+
return {
|
|
234
|
+
success: true,
|
|
235
|
+
result: {
|
|
236
|
+
roles,
|
|
237
|
+
total_messages: allMessages.length,
|
|
238
|
+
formatted,
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
// --- Tool Schema ---
|
|
243
|
+
export const schema = {
|
|
244
|
+
name: 'team_mailbox',
|
|
245
|
+
description: `Team mailbox - agent-to-agent messaging with delivery tracking and broker injection.
|
|
246
|
+
|
|
247
|
+
**Storage Location:** .workflow/.team/{session-id}/.msg/mailbox.jsonl
|
|
248
|
+
|
|
249
|
+
**Operations & Required Parameters:**
|
|
250
|
+
|
|
251
|
+
* **send**: Send a message to a team role.
|
|
252
|
+
* **session_id** (string, **REQUIRED**): Session ID.
|
|
253
|
+
* **from** (string, **REQUIRED**): Sender role name.
|
|
254
|
+
* **to** (string, **REQUIRED**): Recipient role name.
|
|
255
|
+
* **message** (string, **REQUIRED**): Message content.
|
|
256
|
+
* *type* (string): Message type (default: "message").
|
|
257
|
+
* *delivery_method* (string): "inject" | "poll" | "broadcast" (default: "inject").
|
|
258
|
+
* *data* (object): Structured data payload.
|
|
259
|
+
|
|
260
|
+
* **read**: Read unread messages for a role and mark as delivered.
|
|
261
|
+
* **session_id** (string, **REQUIRED**): Session ID.
|
|
262
|
+
* **role** (string, **REQUIRED**): Role name to read mailbox for.
|
|
263
|
+
* *limit* (number): Max messages to return (default: 50).
|
|
264
|
+
* *mark_delivered* (boolean): Mark messages as delivered (default: true).
|
|
265
|
+
|
|
266
|
+
* **status**: Per-role unread/delivered counts.
|
|
267
|
+
* **session_id** (string, **REQUIRED**): Session ID.`,
|
|
268
|
+
inputSchema: {
|
|
269
|
+
type: 'object',
|
|
270
|
+
properties: {
|
|
271
|
+
operation: {
|
|
272
|
+
type: 'string',
|
|
273
|
+
enum: ['send', 'read', 'status'],
|
|
274
|
+
description: 'Operation to perform',
|
|
275
|
+
},
|
|
276
|
+
session_id: {
|
|
277
|
+
type: 'string',
|
|
278
|
+
description: 'Session ID (e.g., TLS-my-project-2026-02-27)',
|
|
279
|
+
},
|
|
280
|
+
from: {
|
|
281
|
+
type: 'string',
|
|
282
|
+
description: '[send] Sender role name',
|
|
283
|
+
},
|
|
284
|
+
to: {
|
|
285
|
+
type: 'string',
|
|
286
|
+
description: '[send] Recipient role name',
|
|
287
|
+
},
|
|
288
|
+
message: {
|
|
289
|
+
type: 'string',
|
|
290
|
+
description: '[send] Message content',
|
|
291
|
+
},
|
|
292
|
+
type: {
|
|
293
|
+
type: 'string',
|
|
294
|
+
description: '[send] Message type (default: "message")',
|
|
295
|
+
},
|
|
296
|
+
delivery_method: {
|
|
297
|
+
type: 'string',
|
|
298
|
+
enum: ['inject', 'poll', 'broadcast'],
|
|
299
|
+
description: '[send] Delivery method (default: "inject")',
|
|
300
|
+
},
|
|
301
|
+
data: {
|
|
302
|
+
type: 'object',
|
|
303
|
+
description: '[send] Structured data payload',
|
|
304
|
+
},
|
|
305
|
+
role: {
|
|
306
|
+
type: 'string',
|
|
307
|
+
description: '[read] Role name to read mailbox for',
|
|
308
|
+
},
|
|
309
|
+
limit: {
|
|
310
|
+
type: 'number',
|
|
311
|
+
description: '[read] Max messages to return (default: 50)',
|
|
312
|
+
minimum: 1,
|
|
313
|
+
maximum: 100,
|
|
314
|
+
},
|
|
315
|
+
mark_delivered: {
|
|
316
|
+
type: 'boolean',
|
|
317
|
+
description: '[read] Mark returned messages as delivered (default: true)',
|
|
318
|
+
},
|
|
319
|
+
},
|
|
320
|
+
required: ['operation'],
|
|
321
|
+
},
|
|
322
|
+
};
|
|
323
|
+
// --- Unified Params Schema for dispatch ---
|
|
324
|
+
const DispatchParamsSchema = z.object({
|
|
325
|
+
operation: z.enum(['send', 'read', 'status']),
|
|
326
|
+
// send params
|
|
327
|
+
session_id: z.string().optional(),
|
|
328
|
+
from: z.string().optional(),
|
|
329
|
+
to: z.string().optional(),
|
|
330
|
+
message: z.string().optional(),
|
|
331
|
+
type: z.string().optional(),
|
|
332
|
+
delivery_method: z.enum(['inject', 'poll', 'broadcast']).optional(),
|
|
333
|
+
data: z.record(z.string(), z.unknown()).optional(),
|
|
334
|
+
// read params
|
|
335
|
+
role: z.string().optional(),
|
|
336
|
+
limit: z.number().min(1).max(100).optional(),
|
|
337
|
+
mark_delivered: z.boolean().optional(),
|
|
338
|
+
});
|
|
339
|
+
// --- Handler ---
|
|
340
|
+
export async function handler(params) {
|
|
341
|
+
const parsed = DispatchParamsSchema.safeParse(params);
|
|
342
|
+
if (!parsed.success) {
|
|
343
|
+
return { success: false, error: `Invalid params: ${parsed.error.message}` };
|
|
344
|
+
}
|
|
345
|
+
const p = parsed.data;
|
|
346
|
+
if (!p.session_id) {
|
|
347
|
+
return { success: false, error: 'Missing required parameter: session_id' };
|
|
348
|
+
}
|
|
349
|
+
switch (p.operation) {
|
|
350
|
+
case 'send': {
|
|
351
|
+
if (!p.from)
|
|
352
|
+
return { success: false, error: 'send requires "from"' };
|
|
353
|
+
if (!p.to)
|
|
354
|
+
return { success: false, error: 'send requires "to"' };
|
|
355
|
+
if (!p.message)
|
|
356
|
+
return { success: false, error: 'send requires "message"' };
|
|
357
|
+
return opSendMessage({
|
|
358
|
+
session_id: p.session_id,
|
|
359
|
+
from: p.from,
|
|
360
|
+
to: p.to,
|
|
361
|
+
message: p.message,
|
|
362
|
+
type: p.type || 'message',
|
|
363
|
+
delivery_method: p.delivery_method || 'inject',
|
|
364
|
+
data: p.data,
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
case 'read': {
|
|
368
|
+
if (!p.role)
|
|
369
|
+
return { success: false, error: 'read requires "role"' };
|
|
370
|
+
return opReadMailbox({
|
|
371
|
+
session_id: p.session_id,
|
|
372
|
+
role: p.role,
|
|
373
|
+
limit: p.limit || 50,
|
|
374
|
+
mark_delivered: p.mark_delivered !== false,
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
case 'status': {
|
|
378
|
+
return opMailboxStatus({ session_id: p.session_id });
|
|
379
|
+
}
|
|
380
|
+
default:
|
|
381
|
+
return { success: false, error: `Unknown operation: ${p.operation}` };
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
//# sourceMappingURL=team-mailbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-mailbox.js","sourceRoot":"","sources":["../../../src/tools/team-mailbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,14 +2,16 @@
|
|
|
2
2
|
* Team Message Bus - JSONL-based persistent message log for Agent Teams
|
|
3
3
|
*
|
|
4
4
|
* Operations:
|
|
5
|
-
* - log:
|
|
6
|
-
* - read:
|
|
7
|
-
* - list:
|
|
8
|
-
* - status:
|
|
9
|
-
* - delete:
|
|
10
|
-
* - clear:
|
|
11
|
-
* - broadcast:
|
|
12
|
-
* - get_state:
|
|
5
|
+
* - log: Append a message (to defaults to "coordinator", summary auto-generated if omitted)
|
|
6
|
+
* - read: Read message(s) by ID
|
|
7
|
+
* - list: List recent messages with optional filters (from/to/type/last N)
|
|
8
|
+
* - status: Summarize team member activity from message history
|
|
9
|
+
* - delete: Delete a specific message by ID
|
|
10
|
+
* - clear: Clear all messages for a team
|
|
11
|
+
* - broadcast: Log a message with to="all"
|
|
12
|
+
* - get_state: Read role state from meta.json
|
|
13
|
+
* - read_mailbox: Read unread messages for a role and mark them as delivered
|
|
14
|
+
* - mailbox_status: Return counts of pending/notified/delivered/failed per role
|
|
13
15
|
*/
|
|
14
16
|
import type { ToolSchema, CcwToolResult } from '../types/tool-schema.js';
|
|
15
17
|
export interface TeamMeta {
|
|
@@ -29,6 +31,8 @@ export declare function readTeamMeta(team: string): TeamMeta | null;
|
|
|
29
31
|
export declare function writeTeamMeta(team: string, meta: TeamMeta): void;
|
|
30
32
|
export declare function inferTeamStatus(team: string): TeamMeta['status'];
|
|
31
33
|
export declare function getEffectiveTeamMeta(team: string): TeamMeta;
|
|
34
|
+
/** Dispatch status lifecycle: pending -> notified -> delivered (or failed) */
|
|
35
|
+
export type DispatchStatus = 'pending' | 'notified' | 'delivered' | 'failed';
|
|
32
36
|
export interface TeamMessage {
|
|
33
37
|
id: string;
|
|
34
38
|
ts: string;
|
|
@@ -37,6 +41,11 @@ export interface TeamMessage {
|
|
|
37
41
|
type: string;
|
|
38
42
|
summary: string;
|
|
39
43
|
data?: Record<string, unknown>;
|
|
44
|
+
dispatch_status?: DispatchStatus;
|
|
45
|
+
delivery_method?: string;
|
|
46
|
+
notified_at?: string;
|
|
47
|
+
delivered_at?: string;
|
|
48
|
+
failed_at?: string;
|
|
40
49
|
}
|
|
41
50
|
export interface StatusEntry {
|
|
42
51
|
member: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-msg.d.ts","sourceRoot":"","sources":["../../../src/tools/team-msg.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"team-msg.d.ts","sourceRoot":"","sources":["../../../src/tools/team-msg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAOzE,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAQ1D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAMhE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAKhE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CA4C3D;AA+CD,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE7E,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AA6BD,eAAO,MAAM,MAAM,EAAE,UA4EpB,CAAC;AAIF,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAO/D;AAkBD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,CAc7D;AAqSD,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CA2BrF"}
|
|
@@ -2,14 +2,16 @@
|
|
|
2
2
|
* Team Message Bus - JSONL-based persistent message log for Agent Teams
|
|
3
3
|
*
|
|
4
4
|
* Operations:
|
|
5
|
-
* - log:
|
|
6
|
-
* - read:
|
|
7
|
-
* - list:
|
|
8
|
-
* - status:
|
|
9
|
-
* - delete:
|
|
10
|
-
* - clear:
|
|
11
|
-
* - broadcast:
|
|
12
|
-
* - get_state:
|
|
5
|
+
* - log: Append a message (to defaults to "coordinator", summary auto-generated if omitted)
|
|
6
|
+
* - read: Read message(s) by ID
|
|
7
|
+
* - list: List recent messages with optional filters (from/to/type/last N)
|
|
8
|
+
* - status: Summarize team member activity from message history
|
|
9
|
+
* - delete: Delete a specific message by ID
|
|
10
|
+
* - clear: Clear all messages for a team
|
|
11
|
+
* - broadcast: Log a message with to="all"
|
|
12
|
+
* - get_state: Read role state from meta.json
|
|
13
|
+
* - read_mailbox: Read unread messages for a role and mark them as delivered
|
|
14
|
+
* - mailbox_status: Return counts of pending/notified/delivered/failed per role
|
|
13
15
|
*/
|
|
14
16
|
import { z } from 'zod';
|
|
15
17
|
import { existsSync, mkdirSync, readFileSync, appendFileSync, writeFileSync, rmSync, statSync } from 'fs';
|
|
@@ -136,7 +138,7 @@ function readLegacyFiles(team) {
|
|
|
136
138
|
}
|
|
137
139
|
// --- Zod Schema ---
|
|
138
140
|
const ParamsSchema = z.object({
|
|
139
|
-
operation: z.enum(['log', 'read', 'list', 'status', 'delete', 'clear', 'broadcast', 'get_state']).describe('Operation to perform'),
|
|
141
|
+
operation: z.enum(['log', 'read', 'list', 'status', 'delete', 'clear', 'broadcast', 'get_state', 'read_mailbox', 'mailbox_status']).describe('Operation to perform'),
|
|
140
142
|
session_id: z.string().optional().describe('Session ID that determines message storage path'),
|
|
141
143
|
team_session_id: z.string().optional().describe('[deprecated] Use session_id'),
|
|
142
144
|
team: z.string().optional().describe('[deprecated] Use session_id'),
|
|
@@ -147,8 +149,9 @@ const ParamsSchema = z.object({
|
|
|
147
149
|
data: z.record(z.string(), z.unknown()).optional().describe('[log/broadcast] Structured data payload'),
|
|
148
150
|
id: z.string().optional().describe('[read/delete] Message ID'),
|
|
149
151
|
last: z.number().min(1).max(100).optional().describe('[list] Return last N messages'),
|
|
150
|
-
role: z.string().optional().describe('[get_state] Role name to query'),
|
|
152
|
+
role: z.string().optional().describe('[get_state/read_mailbox] Role name to query'),
|
|
151
153
|
ref: z.string().optional().describe('[deprecated] Use data.ref instead'),
|
|
154
|
+
delivery_method: z.string().optional().describe('[log] Delivery method for dispatch tracking'),
|
|
152
155
|
});
|
|
153
156
|
function resolveTeamId(params) {
|
|
154
157
|
return params.session_id || params.team_session_id || params.team || null;
|
|
@@ -169,6 +172,7 @@ export const schema = {
|
|
|
169
172
|
* *type* (string): Message type (default: "message").
|
|
170
173
|
* *summary* (string): One-line summary (auto-generated if omitted).
|
|
171
174
|
* *data* (object): Structured data payload.
|
|
175
|
+
* *delivery_method* (string): Delivery method for dispatch tracking.
|
|
172
176
|
|
|
173
177
|
* **broadcast**: Send message to all team members.
|
|
174
178
|
* **session_id** (string, **REQUIRED**): Session ID.
|
|
@@ -189,6 +193,13 @@ export const schema = {
|
|
|
189
193
|
* **session_id** (string, **REQUIRED**): Session ID.
|
|
190
194
|
* *role* (string): Role name to query.
|
|
191
195
|
|
|
196
|
+
* **read_mailbox**: Read unread messages for a role and mark them delivered.
|
|
197
|
+
* **session_id** (string, **REQUIRED**): Session ID.
|
|
198
|
+
* **role** (string, **REQUIRED**): Role name whose mailbox to read.
|
|
199
|
+
|
|
200
|
+
* **mailbox_status**: Return dispatch status counts per role.
|
|
201
|
+
* **session_id** (string, **REQUIRED**): Session ID.
|
|
202
|
+
|
|
192
203
|
* **delete**: Delete a message by ID.
|
|
193
204
|
* **session_id** (string, **REQUIRED**): Session ID.
|
|
194
205
|
* **id** (string, **REQUIRED**): Message ID.
|
|
@@ -200,7 +211,7 @@ export const schema = {
|
|
|
200
211
|
properties: {
|
|
201
212
|
operation: {
|
|
202
213
|
type: 'string',
|
|
203
|
-
enum: ['log', 'read', 'list', 'status', 'delete', 'clear', 'broadcast', 'get_state'],
|
|
214
|
+
enum: ['log', 'read', 'list', 'status', 'delete', 'clear', 'broadcast', 'get_state', 'read_mailbox', 'mailbox_status'],
|
|
204
215
|
description: 'Operation to perform',
|
|
205
216
|
},
|
|
206
217
|
session_id: {
|
|
@@ -214,7 +225,8 @@ export const schema = {
|
|
|
214
225
|
data: { type: 'object', description: '[log/broadcast] Structured data' },
|
|
215
226
|
id: { type: 'string', description: '[read/delete] Message ID' },
|
|
216
227
|
last: { type: 'number', description: '[list] Last N messages', minimum: 1, maximum: 100 },
|
|
217
|
-
role: { type: 'string', description: '[get_state] Role name to query' },
|
|
228
|
+
role: { type: 'string', description: '[get_state/read_mailbox] Role name to query' },
|
|
229
|
+
delivery_method: { type: 'string', description: '[log] Delivery method for dispatch tracking' },
|
|
218
230
|
team_session_id: { type: 'string', description: '[deprecated] Use session_id' },
|
|
219
231
|
team: { type: 'string', description: '[deprecated] Use session_id' },
|
|
220
232
|
ref: { type: 'string', description: '[deprecated] Use data.ref instead' },
|
|
@@ -290,16 +302,27 @@ function opLog(params, teamId) {
|
|
|
290
302
|
const logPath = ensureLogFile(teamId);
|
|
291
303
|
const messages = readAllMessages(teamId);
|
|
292
304
|
const id = getNextId(messages);
|
|
305
|
+
const now = nowISO();
|
|
306
|
+
// When delivery_method is provided, the message starts as 'pending' (explicit delivery).
|
|
307
|
+
// When no delivery_method, it's a legacy direct message and defaults to 'delivered'.
|
|
308
|
+
const dispatchStatus = params.delivery_method ? 'pending' : 'delivered';
|
|
293
309
|
const msg = {
|
|
294
310
|
id,
|
|
295
|
-
ts:
|
|
311
|
+
ts: now,
|
|
296
312
|
from: params.from,
|
|
297
313
|
to,
|
|
298
314
|
type: params.type || 'message',
|
|
299
315
|
summary,
|
|
316
|
+
dispatch_status: dispatchStatus,
|
|
300
317
|
};
|
|
301
318
|
if (params.data)
|
|
302
319
|
msg.data = params.data;
|
|
320
|
+
if (params.delivery_method)
|
|
321
|
+
msg.delivery_method = params.delivery_method;
|
|
322
|
+
// Set delivered_at for legacy messages (backward compat)
|
|
323
|
+
if (dispatchStatus === 'delivered') {
|
|
324
|
+
msg.delivered_at = now;
|
|
325
|
+
}
|
|
303
326
|
appendFileSync(logPath, JSON.stringify(msg) + '\n', 'utf-8');
|
|
304
327
|
if (params.type === 'state_update' && params.data) {
|
|
305
328
|
const meta = getEffectiveTeamMeta(teamId);
|
|
@@ -422,6 +445,78 @@ function opClear(params, teamId) {
|
|
|
422
445
|
rmSync(dir, { recursive: true, force: true });
|
|
423
446
|
return { success: true, result: { cleared: count, message: `Cleared ${count} messages for team "${teamId}".` } };
|
|
424
447
|
}
|
|
448
|
+
/** Rewrite all messages to the JSONL file (used for batch status updates). */
|
|
449
|
+
function writeAllMessages(teamId, messages) {
|
|
450
|
+
const logPath = ensureLogFile(teamId);
|
|
451
|
+
writeFileSync(logPath, messages.map(m => JSON.stringify(m)).join('\n') + (messages.length > 0 ? '\n' : ''), 'utf-8');
|
|
452
|
+
}
|
|
453
|
+
function opReadMailbox(params, teamId) {
|
|
454
|
+
if (!params.role)
|
|
455
|
+
return { success: false, error: 'read_mailbox requires "role"' };
|
|
456
|
+
const messages = readAllMessages(teamId);
|
|
457
|
+
const now = nowISO();
|
|
458
|
+
// Find messages addressed to this role that are pending or notified (unread)
|
|
459
|
+
const unreadStatuses = ['pending', 'notified'];
|
|
460
|
+
const unreadIndices = [];
|
|
461
|
+
const unreadMessages = [];
|
|
462
|
+
for (let i = 0; i < messages.length; i++) {
|
|
463
|
+
const m = messages[i];
|
|
464
|
+
if (m.to === params.role && unreadStatuses.includes(m.dispatch_status ?? 'delivered')) {
|
|
465
|
+
unreadIndices.push(i);
|
|
466
|
+
unreadMessages.push(m);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
// Batch-update dispatch_status to 'delivered' with delivered_at timestamp
|
|
470
|
+
if (unreadIndices.length > 0) {
|
|
471
|
+
for (const idx of unreadIndices) {
|
|
472
|
+
messages[idx] = {
|
|
473
|
+
...messages[idx],
|
|
474
|
+
dispatch_status: 'delivered',
|
|
475
|
+
delivered_at: now,
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
writeAllMessages(teamId, messages);
|
|
479
|
+
}
|
|
480
|
+
return {
|
|
481
|
+
success: true,
|
|
482
|
+
result: {
|
|
483
|
+
role: params.role,
|
|
484
|
+
count: unreadMessages.length,
|
|
485
|
+
messages: unreadMessages,
|
|
486
|
+
formatted: unreadMessages.length > 0
|
|
487
|
+
? unreadMessages.map(m => `${m.id} [${m.ts.substring(11, 19)}] ${m.from} → ${m.to} (${m.type}) ${m.summary}`).join('\n')
|
|
488
|
+
: `No unread messages for role "${params.role}".`,
|
|
489
|
+
},
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
function opMailboxStatus(params, teamId) {
|
|
493
|
+
const messages = readAllMessages(teamId);
|
|
494
|
+
// Group dispatch counts by role (using the "to" field)
|
|
495
|
+
const counts = {};
|
|
496
|
+
for (const msg of messages) {
|
|
497
|
+
const role = msg.to;
|
|
498
|
+
if (!counts[role]) {
|
|
499
|
+
counts[role] = { pending: 0, notified: 0, delivered: 0, failed: 0 };
|
|
500
|
+
}
|
|
501
|
+
// Backward compat: messages without dispatch_status default to 'delivered'
|
|
502
|
+
const status = msg.dispatch_status ?? 'delivered';
|
|
503
|
+
counts[role][status]++;
|
|
504
|
+
}
|
|
505
|
+
// Format as a summary table
|
|
506
|
+
const roles = Object.keys(counts).sort();
|
|
507
|
+
const formatted = roles.map(role => {
|
|
508
|
+
const c = counts[role];
|
|
509
|
+
return `${role.padEnd(12)} | pending: ${c.pending} | notified: ${c.notified} | delivered: ${c.delivered} | failed: ${c.failed}`;
|
|
510
|
+
}).join('\n');
|
|
511
|
+
return {
|
|
512
|
+
success: true,
|
|
513
|
+
result: {
|
|
514
|
+
roles: counts,
|
|
515
|
+
total_messages: messages.length,
|
|
516
|
+
formatted: formatted || 'No messages recorded yet.',
|
|
517
|
+
},
|
|
518
|
+
};
|
|
519
|
+
}
|
|
425
520
|
// --- Handler ---
|
|
426
521
|
export async function handler(params) {
|
|
427
522
|
const parsed = ParamsSchema.safeParse(params);
|
|
@@ -442,6 +537,8 @@ export async function handler(params) {
|
|
|
442
537
|
case 'clear': return opClear(p, teamId);
|
|
443
538
|
case 'broadcast': return opBroadcast(p, teamId);
|
|
444
539
|
case 'get_state': return opGetState(p, teamId);
|
|
540
|
+
case 'read_mailbox': return opReadMailbox(p, teamId);
|
|
541
|
+
case 'mailbox_status': return opMailboxStatus(p, teamId);
|
|
445
542
|
default:
|
|
446
543
|
return { success: false, error: `Unknown operation: ${p.operation}` };
|
|
447
544
|
}
|